{"version":3,"file":"1173.a5030327bdb403b00878.js","mappings":"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BAA8BA,KAGjC,MAAM34G,EAAYvvE,GAAyB,yFAGxBA,EAAM+C,OAAOolL,uBAAuBnoL,EAAM+C,OAAOqlL,gLAMpE,SAASnjH,EAAoBjlE,GAClC,MAAO,CACL2lE,QAAS,OACTlB,UAAY,QAIT,SAASI,EAAe7kE,GAC7B,MAAO,CACL2lE,QAAS,yBACT8B,cAAe,MACfhD,UAAY,aAAYzkE,EAAM+C,OAAOsX,WAAWC,uBAAuBta,EAAM+C,OAAOyY,QAAQI,OAC5F8kF,yBAA2B,iCAC3BD,mBAAoB,OACpBD,mBAAoB,uCAKjB,MAAMvD,EAA6Bj9F,GAA0B,wCAEpDA,EAAM+C,OAAOsX,WAAWoB,6BACxBzb,EAAMsjE,QAAQ1lD,wCAEjB5d,EAAMoe,QAAQ,yBACRpe,EAAMojE,MAAMplD,+BAClBhe,EAAMkrB,OAAOK,2ECrEnB,SAASo+C,EACd0+G,GAEA,OAAOzhG,EAAAA,EAAAA,GAAWyhG,kCCgCb,IAAKt/D,4BAAAA,GAAAA,EAAAA,WAAAA,cAAAA,IAAAA,EAAAA,8LCpCL,MAAMu/D,EAAoB,IAC/B,CACE,SACA,oBACA,qBACA,kBACA,aACA,aACA,cACA,WACA,OACA,QACA,aACA,mBACA,aACA,eACA,cACA,WACA,WACA,WACA,WACA,OACA,OACA,aACA,OACA,OACA,WACA,YACA,iBACA,WACA,MACA,WACA,iBACA,eACA,SACA,UACA,cACA,aACA,QACA,eACA,SACA,gBACA,aACA,QACA,iBACA,eACA,cACA,MACA,UACA,cACA,sBACA,oBACA,eACA,UACA,OACA,cACA,OACA,YACA,WACA,gBACA,eACA,gBACA,OACA,aACA,WACA,eACA,uBACA,qBACA,oBACA,MACA,YACA,aACA,gBACA,WACA,WACA,aACA,gBACA,SACA,SACA,OACA,OACA,cACA,cACA,gBACA,UACA,yBACA,0BACA,0BACA,UACA,0BACA,0BACA,8BACA,+BACA,eACA,mBACA,UACA,cACA,UACA,YACA,QACA,cACA,UACA,OACA,WACA,0BACA,wBACA,yBACA,YACA,SACA,OACA,cACA,mBACA,WACA,cACA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","sources":["webpack://grafana/./packages/grafana-data/src/dataframe/ArrayDataFrame.ts","webpack://grafana/./packages/grafana-data/src/dataframe/DataFrameJSON.ts","webpack://grafana/./packages/grafana-data/src/dataframe/DataFrameView.ts","webpack://grafana/./packages/grafana-data/src/dataframe/MutableDataFrame.ts","webpack://grafana/./packages/grafana-data/src/dataframe/dimensions.ts","webpack://grafana/./packages/grafana-data/src/dataframe/frameComparisons.ts","webpack://grafana/./packages/grafana-data/src/dataframe/FieldCache.ts","webpack://grafana/./packages/grafana-data/src/dataframe/CircularDataFrame.ts","webpack://grafana/./packages/grafana-data/src/dataframe/processDataFrame.ts","webpack://grafana/./packages/grafana-data/src/dataframe/utils.ts","webpack://grafana/./packages/grafana-data/src/datetime/common.ts","webpack://grafana/./packages/grafana-data/src/datetime/datemath.ts","webpack://grafana/./packages/grafana-data/src/datetime/formats.ts","webpack://grafana/./packages/grafana-data/src/datetime/formatter.ts","webpack://grafana/./packages/grafana-data/src/datetime/timezones.ts","webpack://grafana/./packages/grafana-data/src/datetime/durationutil.ts","webpack://grafana/./packages/grafana-data/src/datetime/moment_wrapper.ts","webpack://grafana/./packages/grafana-data/src/datetime/rangeutil.ts","webpack://grafana/./packages/grafana-data/src/field/displayProcessor.ts","webpack://grafana/./packages/grafana-data/src/field/fieldColor.ts","webpack://grafana/./packages/grafana-data/src/field/templateProxies.ts","webpack://grafana/./packages/grafana-data/src/field/fieldOverrides.ts","webpack://grafana/./packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts","webpack://grafana/./packages/grafana-data/src/field/fieldDisplay.ts","webpack://grafana/./packages/grafana-data/src/field/overrides/processors.ts","webpack://grafana/./packages/grafana-data/src/field/scale.ts","webpack://grafana/./packages/grafana-data/src/field/standardFieldConfigEditorRegistry.ts","webpack://grafana/./packages/grafana-data/src/field/thresholds.ts","webpack://grafana/./packages/grafana-data/src/events/EventBus.ts","webpack://grafana/./packages/grafana-data/src/events/common.ts","webpack://grafana/./packages/grafana-data/src/monaco/languageRegistry.ts","webpack://grafana/./packages/grafana-data/src/geo/layer.ts","webpack://grafana/./packages/grafana-data/src/types/layout.ts","webpack://grafana/./packages/grafana-data/src/panel/registryFactories.ts","webpack://grafana/./packages/grafana-data/src/panel/PanelPlugin.ts","webpack://grafana/./packages/grafana-data/src/text/markdown.ts","webpack://grafana/./packages/grafana-data/src/text/index.ts","webpack://grafana/./packages/grafana-data/src/text/string.ts","webpack://grafana/./packages/grafana-data/src/text/text.ts","webpack://grafana/./packages/grafana-data/src/themes/breakpoints.ts","webpack://grafana/./packages/grafana-data/src/themes/colorManipulator.ts","webpack://grafana/./packages/grafana-data/src/themes/createColors.ts","webpack://grafana/./packages/grafana-data/src/themes/createShadows.ts","webpack://grafana/./packages/grafana-data/src/themes/createShape.ts","webpack://grafana/./packages/grafana-data/src/themes/createSpacing.ts","webpack://grafana/./packages/grafana-data/src/themes/createTransitions.ts","webpack://grafana/./packages/grafana-data/src/themes/createTypography.ts","webpack://grafana/./packages/grafana-data/src/themes/createVisualizationColors.ts","webpack://grafana/./packages/grafana-data/src/themes/zIndex.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/convertFieldType.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/renameByRegex.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers.ts","webpack://grafana/./packages/grafana-data/src/transformations/standardTransformersRegistry.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformDataFrame.ts","webpack://grafana/./packages/grafana-data/src/transformations/matchers.ts","webpack://grafana/./packages/grafana-data/src/transformations/matchers/nameMatcher.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/calculateField.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/concat.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/filterByValue.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/groupBy.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/histogram.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/joinDataFrames.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/labelsToFields.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/order.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/reduce.ts","webpack://grafana/./packages/grafana-data/src/types/config.ts","webpack://grafana/./packages/grafana-data/src/types/constants.ts","webpack://grafana/./packages/grafana-data/src/types/data.ts","webpack://grafana/./packages/grafana-data/src/types/dataFrameTypes.ts","webpack://grafana/./packages/grafana-data/src/types/dataLink.ts","webpack://grafana/./packages/grafana-data/src/types/dashboard.ts","webpack://grafana/./packages/grafana-data/src/types/query.ts","webpack://grafana/./packages/grafana-data/src/types/annotations.ts","webpack://grafana/./packages/grafana-data/src/types/navModel.ts","webpack://grafana/./packages/grafana-data/src/types/fieldOverrides.ts","webpack://grafana/./packages/grafana-data/src/types/plugin.ts","webpack://grafana/./packages/grafana-data/src/types/app.ts","webpack://grafana/./packages/grafana-data/src/types/datasource.ts","webpack://grafana/./packages/grafana-data/src/types/panel.ts","webpack://grafana/./packages/grafana-data/src/types/orgs.ts","webpack://grafana/./packages/grafana-data/src/types/legacyEvents.ts","webpack://grafana/./packages/grafana-data/src/types/live.ts","webpack://grafana/./packages/grafana-data/src/types/variables.ts","webpack://grafana/./packages/grafana-data/src/types/pluginSignature.ts","webpack://grafana/./packages/grafana-data/src/types/alerts.ts","webpack://grafana/./packages/grafana-data/src/types/logs.ts","webpack://grafana/./packages/grafana-data/src/types/logsVolume.ts","webpack://grafana/./packages/grafana-data/src/types/time.ts","webpack://grafana/./packages/grafana-data/src/types/OptionsUIRegistryBuilder.ts","webpack://grafana/./packages/grafana-data/src/utils/OptionsUIBuilders.ts","webpack://grafana/./packages/grafana-data/src/utils/dataLinks.ts","webpack://grafana/./packages/grafana-data/src/utils/arrayUtils.ts","webpack://grafana/./packages/grafana-data/src/utils/datasource.ts","webpack://grafana/./packages/grafana-data/src/utils/deprecationWarning.ts","webpack://grafana/./packages/grafana-data/src/utils/csv.ts","webpack://grafana/./packages/grafana-data/src/utils/logs.ts","webpack://grafana/./packages/grafana-data/src/utils/nodeGraph.ts","webpack://grafana/./packages/grafana-data/src/utils/flotPairs.ts","webpack://grafana/./packages/grafana-data/src/utils/docs.ts","webpack://grafana/./packages/grafana-data/src/utils/labels.ts","webpack://grafana/./packages/grafana-data/src/utils/location.ts","webpack://grafana/./packages/grafana-data/src/utils/namedColorsPalette.ts","webpack://grafana/./packages/grafana-data/src/utils/numbers.ts","webpack://grafana/./packages/grafana-data/src/utils/object.ts","webpack://grafana/./packages/grafana-data/src/utils/selectUtils.ts","webpack://grafana/./packages/grafana-data/src/utils/series.ts","webpack://grafana/./packages/grafana-data/src/utils/url.ts","webpack://grafana/./packages/grafana-data/src/utils/valueMappings.ts","webpack://grafana/./packages/grafana-data/src/utils/withLoadingIndicator.ts","webpack://grafana/./packages/grafana-data/src/valueFormats/valueFormats.ts","webpack://grafana/./packages/grafana-data/src/vector/AppendedVectors.ts","webpack://grafana/./packages/grafana-data/src/vector/CircularVector.ts","webpack://grafana/./packages/grafana-data/src/vector/FunctionalVector.ts","webpack://grafana/./packages/grafana-data/src/vector/FormattedVector.ts","webpack://grafana/./packages/grafana-data/src/vector/IndexVector.ts","webpack://grafana/./packages/grafana-e2e-selectors/src/selectors/components.ts","webpack://grafana/./packages/grafana-e2e-selectors/src/selectors/index.ts","webpack://grafana/./packages/grafana-e2e-selectors/src/selectors/pages.ts","webpack://grafana/./packages/grafana-runtime/src/components/PanelDataErrorView.tsx","webpack://grafana/./packages/grafana-runtime/src/components/PanelRenderer.tsx","webpack://grafana/./packages/grafana-runtime/src/config.ts","webpack://grafana/./packages/grafana-runtime/src/types/analytics.ts","webpack://grafana/./packages/grafana-runtime/src/utils/plugin.ts","webpack://grafana/./packages/grafana-runtime/src/utils/analytics.ts","webpack://grafana/./packages/grafana-runtime/src/utils/licensing.ts","webpack://grafana/./packages/grafana-runtime/src/utils/logging.ts","webpack://grafana/./packages/grafana-runtime/src/services/QueryRunner.ts","webpack://grafana/./packages/grafana-runtime/src/components/DataSourcePicker.tsx","webpack://grafana/./packages/grafana-runtime/src/services/EchoSrv.ts","webpack://grafana/./packages/grafana-runtime/src/services/dataSourceSrv.ts","webpack://grafana/./packages/grafana-runtime/src/services/backendSrv.ts","webpack://grafana/./packages/grafana-runtime/src/services/AngularLoader.ts","webpack://grafana/./packages/grafana-runtime/src/services/LocationSrv.ts","webpack://grafana/./packages/grafana-runtime/src/services/templateSrv.ts","webpack://grafana/./packages/grafana-runtime/src/services/legacyAngularInjector.ts","webpack://grafana/./packages/grafana-runtime/src/services/LocationService.ts","webpack://grafana/./packages/grafana-runtime/src/services/appEvents.ts","webpack://grafana/./packages/grafana-runtime/src/services/live.ts","webpack://grafana/./packages/grafana-runtime/src/utils/DataSourceWithBackend.ts","webpack://grafana/./packages/grafana-runtime/src/utils/queryResponse.ts","webpack://grafana/./packages/grafana-schema/src/schema/mudball.gen.ts","webpack://grafana/./packages/grafana-ui/src/components/Alert/Alert.tsx","webpack://grafana/./packages/grafana-ui/src/components/Button/Button.tsx","webpack://grafana/./packages/grafana-ui/src/components/Button/ButtonGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/ClickOutsideWrapper/ClickOutsideWrapper.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/ColorSwatch.tsx","webpack://grafana/./packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Field.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/FieldValidationMessage.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Label.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legacy/Input/Input.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legacy/Select/IndicatorsContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/commonStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/GraphNG/GraphNG.tsx","webpack://grafana/./packages/grafana-ui/src/components/GraphNG/nullInsertThreshold.ts","webpack://grafana/./packages/grafana-ui/src/components/GraphNG/nullToValue.ts","webpack://grafana/./packages/grafana-ui/src/components/GraphNG/nullToUndefThreshold.ts","webpack://grafana/./packages/grafana-ui/src/components/GraphNG/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Icon/iconBundle.ts","webpack://grafana/./packages/grafana-ui/src/components/Icon/Icon.tsx","webpack://grafana/./packages/grafana-ui/src/components/Icon/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/IconButton/IconButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/Input/Input.tsx","webpack://grafana/./packages/grafana-ui/src/components/Layout/Layout.tsx","webpack://grafana/./packages/grafana-ui/src/components/List/AbstractList.tsx","webpack://grafana/./packages/grafana-ui/src/components/List/List.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogMessageAnsi.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogRowContext.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogRowMessage.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/getLogRowStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/FieldNamePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Modal/getModalStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/PanelChrome/LoadingIndicator.tsx","webpack://grafana/./packages/grafana-ui/src/components/PanelChrome/PanelContext.ts","webpack://grafana/./packages/grafana-ui/src/components/Portal/Portal.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/DropdownIndicator.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/IndicatorsContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/InputControl.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/MultiValue.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/SelectContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/SelectMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/ValueContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Select/SelectBase.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/Select.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/SelectOptionGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/SingleValue.tsx","webpack://grafana/./packages/grafana-ui/src/utils/useDelayedSwitch.ts","webpack://grafana/./packages/grafana-ui/src/components/Select/getSelectStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/Select/resetSelectStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/Slider/styles.ts","webpack://grafana/./packages/grafana-ui/src/components/Spinner/Spinner.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/TableCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/styles.ts","webpack://grafana/./packages/grafana-ui/src/components/Table/types.ts","webpack://grafana/./packages/grafana-ui/src/components/Tabs/Counter.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tabs/Tab.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tooltip/PopoverController.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tooltip/Tooltip.tsx","webpack://grafana/./packages/grafana-ui/src/components/Typeahead/PartialHighlighter.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLayout/VizLayout.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/SeriesIcon.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/VizTooltipContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/VizTooltip.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/SeriesTable.tsx","webpack://grafana/./packages/grafana-ui/src/components/FormLabel/FormLabel.tsx","webpack://grafana/./packages/grafana-ui/src/components/FormField/FormField.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legacy/Switch/Switch.tsx","webpack://grafana/./packages/grafana-ui/src/components/SecretFormField/SecretFormField.tsx","webpack://grafana/./packages/grafana-ui/src/components/ConfirmButton/ConfirmButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/ConfirmButton/DeleteButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tooltip/Popover.tsx","webpack://grafana/./packages/grafana-ui/src/components/TabbedContainer/TabbedContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/InlineToast/InlineToast.tsx","webpack://grafana/./packages/grafana-ui/src/components/ClipboardButton/ClipboardButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/Cascader/optionMappings.ts","webpack://grafana/./packages/grafana-ui/src/components/Cascader/Cascader.tsx","webpack://grafana/./packages/grafana-ui/src/components/ButtonCascader/ButtonCascader.tsx","webpack://grafana/./packages/grafana-ui/src/components/LoadingPlaceholder/LoadingPlaceholder.tsx","webpack://grafana/./packages/grafana-ui/src/utils/reverseMap.ts","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/NamedColorsGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/NamedColorsPalette.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/ColorInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/SpectrumPalette.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/ColorPickerPopover.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/SeriesColorPickerPopover.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/ColorPickerInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/EmptySearchResult/EmptySearchResult.tsx","webpack://grafana/./packages/grafana-ui/src/components/UnitPicker/UnitPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/StatsPicker/StatsPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/MenuDivider.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/MenuGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/hooks.ts","webpack://grafana/./packages/grafana-ui/src/components/Menu/SubMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Menu/MenuItem.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/Menu.tsx","webpack://grafana/./packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/ToolbarButton/ToolbarButtonRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx","webpack://grafana/./packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOffset.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneDescription.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneTitle.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOption.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/options.ts","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerTitle.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarBody.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarFooter.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarHeader.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerCalendar.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimeRangeForm.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimeRangeOption.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimeRangeList.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/mapper.ts","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerContent.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeOfDayPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/WeekStartPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/DatePickerWithInput/DatePickerWithInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/TagsInput/TagItem.tsx","webpack://grafana/./packages/grafana-ui/src/components/TagsInput/TagsInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/Pagination/Pagination.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tags/Tag.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tags/TagList.tsx","webpack://grafana/./packages/grafana-ui/src/components/FilterPill/FilterPill.tsx","webpack://grafana/./packages/grafana-ui/src/components/Modal/ModalHeader.tsx","webpack://grafana/./packages/grafana-ui/src/components/Modal/Modal.tsx","webpack://grafana/./packages/grafana-ui/src/components/ConfirmModal/ConfirmModal.tsx","webpack://grafana/./packages/grafana-ui/src/components/QueryField/QueryField.tsx","webpack://grafana/./packages/grafana-ui/src/components/Monaco/ReactMonacoEditorLazy.tsx","webpack://grafana/./packages/grafana-ui/src/utils/useAsyncDependency.ts","webpack://grafana/./packages/grafana-ui/src/components/Monaco/types.ts","webpack://grafana/./packages/grafana-ui/src/components/Monaco/suggestions.ts","webpack://grafana/./packages/grafana-ui/src/components/Monaco/CodeEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/Monaco/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Tabs/TabsBar.tsx","webpack://grafana/./packages/grafana-ui/src/components/Modal/ModalTabsHeader.tsx","webpack://grafana/./packages/grafana-ui/src/components/Modal/ModalTabContent.tsx","webpack://grafana/./packages/grafana-ui/src/components/Modal/ModalsContext.tsx","webpack://grafana/./packages/grafana-ui/src/components/PageLayout/PageToolbar.tsx","webpack://grafana/./packages/grafana-ui/src/components/SetInterval/SetInterval.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/FooterCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/FooterRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/FilterList.tsx","webpack://grafana/./packages/grafana-ui/src/components/FormattedValueDisplay/FormattedValueDisplay.tsx","webpack://grafana/./packages/grafana-ui/src/components/BarGauge/BarGauge.tsx","webpack://grafana/./packages/grafana-ui/src/components/ContextMenu/ContextMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/ContextMenu/WithContextMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinksContextMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/BarGaugeCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/TableCellInspectModal.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/CellActions.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/DefaultCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/GeoCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/ImageCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/JSONViewCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Table/FilterPopup.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/Filter.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/HeaderRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/Table.tsx","webpack://grafana/./packages/grafana-ui/src/components/TextArea/TextArea.tsx","webpack://grafana/./packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tabs/VerticalTab.tsx","webpack://grafana/./packages/grafana-ui/src/components/Tabs/TabContent.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config/gradientFills.ts","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config/UPlotSeriesBuilder.ts","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config/UPlotConfigBuilder.ts","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config/UPlotThresholds.ts","webpack://grafana/./packages/grafana-ui/src/components/Sparkline/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Sparkline/Sparkline.tsx","webpack://grafana/./packages/grafana-ui/src/components/BigValue/BigValueLayout.tsx","webpack://grafana/./packages/grafana-ui/src/components/BigValue/BigValue.tsx","webpack://grafana/./packages/grafana-ui/src/components/Gauge/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Gauge/Gauge.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphContextMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphTooltip/MultiModeGraphTooltip.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphTooltip/SingleModeGraphTooltip.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphTooltip/GraphTooltip.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/Graph.tsx","webpack://grafana/./packages/grafana-ui/src/components/PanelChrome/ErrorIndicator.tsx","webpack://grafana/./packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx","webpack://grafana/./packages/grafana-ui/src/components/PanelChrome/types.ts","webpack://grafana/./packages/grafana-ui/src/components/PanelChrome/index.ts","webpack://grafana/./packages/grafana-ui/src/components/List/InlineList.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/VizLegendSeriesIcon.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/VizLegendStatsList.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/VizLegendListItem.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/VizLegendList.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/VizLegendTableItem.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/VizLegendTable.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/types.ts","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/VizLegend.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphWithLegend.tsx","webpack://grafana/./packages/grafana-ui/src/utils/squares.ts","webpack://grafana/./packages/grafana-ui/src/components/VizRepeater/VizRepeater.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphSeriesToggler.tsx","webpack://grafana/./packages/grafana-ui/src/components/Collapse/Collapse.tsx","webpack://grafana/./packages/grafana-ui/src/components/Collapse/CollapsableSection.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogLabels.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinkButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogLabelStatsRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogLabelStats.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogDetailsRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/logParser.ts","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogDetails.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogRowContextProvider.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogRowMessageDetectedFields.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogRows.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/FieldLinkList.tsx","webpack://grafana/./packages/grafana-ui/src/components/Button/FullWidthButtonContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/SingleStatShared/SingleStatBaseOptions.ts","webpack://grafana/./packages/grafana-ui/src/components/CallToActionCard/CallToActionCard.tsx","webpack://grafana/./packages/grafana-ui/src/components/Switch/Switch.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinkSuggestions.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/SelectionReference.ts","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinkInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinkEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinkEditorModalContent.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksListItem.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinksInlineEditor/DataLinksInlineEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/InfoBox/InfoBox.tsx","webpack://grafana/./packages/grafana-ui/src/components/Badge/Badge.tsx","webpack://grafana/./packages/grafana-ui/src/components/InfoBox/FeatureInfoBox.tsx","webpack://grafana/./packages/grafana-ui/src/components/JSONFormatter/json_explorer/helpers.ts","webpack://grafana/./packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts","webpack://grafana/./packages/grafana-ui/src/components/JSONFormatter/JSONFormatter.tsx","webpack://grafana/./packages/grafana-ui/src/components/ErrorBoundary/ErrorWithStack.tsx","webpack://grafana/./packages/grafana-ui/src/components/ErrorBoundary/ErrorBoundary.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/InlineLabel.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/InlineField.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/BasicAuthSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/CustomHeadersSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/InlineFieldRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/CertificationKey.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/TLSAuthSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/AlertingSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/Segment/styles.ts","webpack://grafana/./packages/grafana-ui/src/components/Segment/Segment.tsx","webpack://grafana/./packages/grafana-ui/src/components/Segment/SegmentSelect.tsx","webpack://grafana/./packages/grafana-ui/src/components/Segment/SegmentAsync.tsx","webpack://grafana/./packages/grafana-ui/src/components/Segment/SegmentInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/Segment/SegmentSection.tsx","webpack://grafana/./packages/grafana-ui/src/components/Segment/useExpandableLabel.tsx","webpack://grafana/./packages/grafana-ui/src/components/Drawer/Drawer.tsx","webpack://grafana/./packages/grafana-ui/src/components/Slider/Slider.tsx","webpack://grafana/./packages/grafana-ui/src/components/Slider/RangeSlider.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Form.tsx","webpack://grafana/./packages/grafana-ui/src/components/InputControl.tsx","webpack://grafana/./packages/grafana-ui/src/components/ValuePicker/ValuePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/FieldNameByRegexMatcherEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/FieldNameMatcherEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/FieldNamesMatcherEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/FieldTypeMatcherEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/FieldsByFrameRefIdMatcher.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/fieldMatchersUI.ts","webpack://grafana/./packages/grafana-ui/src/components/Link/Link.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legend.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/FieldSet.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/InlineSegmentGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/FieldArray.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/RadioButtonList/RadioButtonDot.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/RadioButtonList/RadioButtonList.tsx","webpack://grafana/./packages/grafana-ui/src/components/Input/AutoSizeInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/FilterInput/FilterInput.tsx","webpack://grafana/./packages/grafana-ui/src/utils/useCombinedRefs.ts","webpack://grafana/./packages/grafana-ui/src/components/SecretInput/SecretInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/SecretTextArea/SecretTextArea.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Checkbox.tsx","webpack://grafana/./packages/grafana-ui/src/utils/file.ts","webpack://grafana/./packages/grafana-ui/src/components/FileUpload/FileUpload.tsx","webpack://grafana/./packages/grafana-ui/src/components/FileDropzone/FileListItem.tsx","webpack://grafana/./packages/grafana-ui/src/components/FileDropzone/FileDropzone.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/Card/CardContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/Card/Card.tsx","webpack://grafana/./packages/grafana-ui/src/components/Dropdown/Dropdown.tsx","webpack://grafana/./packages/grafana-ui/src/components/PluginSignatureBadge/PluginSignatureBadge.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config.ts","webpack://grafana/./packages/grafana-ui/src/components/uPlot/PlotLegend.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/geometries/Marker.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/geometries/XYCanvas.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/geometries/EventsCanvas.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/plugins/ZoomPlugin.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/plugins/KeyboardPlugin.tsx","webpack://grafana/./packages/grafana-ui/src/components/TimeSeries/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/TimeSeries/TimeSeries.tsx","webpack://grafana/./packages/grafana-ui/src/components/GraphNG/hooks.ts","webpack://grafana/./packages/grafana-ui/src/components/ThemeDemos/EmotionPerfTest.tsx","webpack://grafana/./packages/grafana-ui/src/components/BrowserLabel/Label.tsx","webpack://grafana/./packages/grafana-ui/src/components/PanelContainer/PanelContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/index.ts","webpack://grafana/./packages/grafana-ui/src/components/transitions/FadeTransition.tsx","webpack://grafana/./packages/grafana-ui/src/components/transitions/SlideOutTransition.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/Plot.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config/UPlotAxisBuilder.ts","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config/UPlotScaleBuilder.ts","webpack://grafana/./packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/types.ts","webpack://grafana/./packages/grafana-ui/src/components/uPlot/utils.ts","webpack://grafana/./packages/grafana-ui/src/options/builder/axis.tsx","webpack://grafana/./packages/grafana-ui/src/options/builder/hideSeries.tsx","webpack://grafana/./packages/grafana-ui/src/options/builder/legend.tsx","webpack://grafana/./packages/grafana-ui/src/options/builder/tooltip.tsx","webpack://grafana/./packages/grafana-ui/src/options/builder/text.tsx","webpack://grafana/./packages/grafana-ui/src/options/builder/stacking.tsx","webpack://grafana/./packages/grafana-ui/src/slate-plugins/braces.ts","webpack://grafana/./packages/grafana-ui/src/slate-plugins/clear.ts","webpack://grafana/./packages/grafana-ui/src/slate-plugins/clipboard.ts","webpack://grafana/./packages/grafana-ui/src/slate-plugins/indentation.ts","webpack://grafana/./packages/grafana-ui/src/slate-plugins/newline.ts","webpack://grafana/./packages/grafana-ui/src/slate-plugins/runner.ts","webpack://grafana/./packages/grafana-ui/src/slate-plugins/selection_shortcuts.ts","webpack://grafana/./packages/grafana-ui/src/utils/typeahead.ts","webpack://grafana/./packages/grafana-ui/src/components/Typeahead/TypeaheadInfo.tsx","webpack://grafana/./packages/grafana-ui/src/components/Typeahead/TypeaheadItem.tsx","webpack://grafana/./packages/grafana-ui/src/components/Typeahead/Typeahead.tsx","webpack://grafana/./packages/grafana-ui/src/slate-plugins/suggestions.tsx","webpack://grafana/./packages/grafana-ui/src/slate-plugins/slate-prism/TOKEN_MARK.ts","webpack://grafana/./packages/grafana-ui/src/slate-plugins/slate-prism/options.tsx","webpack://grafana/./packages/grafana-ui/src/slate-plugins/slate-prism/index.ts","webpack://grafana/./packages/grafana-ui/src/themes/ThemeContext.tsx","webpack://grafana/./packages/grafana-ui/src/themes/getTheme.ts","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/angularPanelStyles.ts","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/card.ts","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/elements.ts","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/page.ts","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/GlobalStyles.tsx","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/markdownStyles.ts","webpack://grafana/./packages/grafana-ui/src/themes/mixins.ts","webpack://grafana/./packages/grafana-ui/src/themes/stylesFactory.ts","webpack://grafana/./packages/grafana-ui/src/types/completion.ts","webpack://grafana/./packages/grafana-ui/src/types/icon.ts","webpack://grafana/./packages/grafana-ui/src/utils/closePopover.ts","webpack://grafana/./packages/grafana-ui/src/utils/dataLinks.ts","webpack://grafana/./packages/grafana-ui/src/utils/fuzzy.ts","webpack://grafana/./packages/grafana-ui/src/utils/dom.ts","webpack://grafana/./packages/grafana-ui/src/utils/colors.ts","webpack://grafana/./packages/grafana-ui/src/utils/validate.ts","webpack://grafana/./packages/grafana-ui/src/utils/tags.ts","webpack://grafana/./packages/grafana-ui/src/utils/scrollbar.ts","webpack://grafana/./packages/grafana-ui/src/utils/table.ts","webpack://grafana/./packages/grafana-ui/src/utils/useForceUpdate.ts","webpack://grafana/./packages/grafana-ui/src/utils/debug.ts","webpack://grafana/./packages/grafana-ui/src/utils/nodeGraph.ts","webpack://grafana/./packages/grafana-ui/src/utils/logger.ts","webpack://grafana/./packages/grafana-ui/src/utils/measureText.ts","webpack://grafana/./packages/grafana-ui/src/utils/reactUtils.ts","webpack://grafana/./packages/grafana-ui/src/utils/searchFunctions.ts","webpack://grafana/./packages/grafana-ui/src/utils/slate.ts","webpack://grafana/./packages/jaeger-ui-components/src/Theme.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/UiFindInput.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/TracePageSearchBar.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/Ticks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ListView/Positions.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/ListView/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/Popover.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/CopyIcon.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianKeyValues.markers.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanBar.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanLinks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/span-ancestor-ids.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanTreeOffset.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanBarRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/Divider.tsx","webpack://grafana/./packages/jaeger-ui-components/src/url/ReferenceLink.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/TextList.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/AccordianText.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetailRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/VirtualizedTraceView.tsx","webpack://grafana/./packages/jaeger-ui-components/src/constants/tag-keys.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/utils.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/LabeledList.tsx","webpack://grafana/./packages/jaeger-ui-components/src/keyboard-mappings.tsx","webpack://grafana/./packages/jaeger-ui-components/src/keyboard-shortcuts.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineCollapser.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/DraggableManager/EUpdateTypes.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/DraggableManager/DraggableManager.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineColumnResizer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineViewingLayer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/TimelineHeaderRow/TimelineHeaderRow.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/NewWindowIcon.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/ExternalLinks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/constants/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/BreakableText.tsx","webpack://grafana/./packages/jaeger-ui-components/src/common/TraceName.tsx","webpack://grafana/./packages/jaeger-ui-components/src/constants/default-config.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/config/get-config.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/span.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/link-patterns.tsx","webpack://grafana/./packages/jaeger-ui-components/src/model/trace-viewer.ts","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/CanvasSpanGraph.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/render-into-canvas.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/TickLabels.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/GraphTicks.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/Scrubber.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/ViewingLayer.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/SpanGraph/index.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TracePageHeader/TracePageHeader.tsx","webpack://grafana/./packages/jaeger-ui-components/src/TraceTimelineViewer/SpanDetail/DetailState.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/TreeNode.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/process.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/span.js","webpack://grafana/./packages/jaeger-ui-components/src/selectors/trace.js","webpack://grafana/./packages/jaeger-ui-components/src/utils/sort.js","webpack://grafana/./packages/jaeger-ui-components/src/model/transform-trace-data.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/filter-spans.tsx","webpack://grafana/./packages/jaeger-ui-components/src/settings/SpanBarSettings.tsx","webpack://grafana/./packages/jaeger-ui-components/src/uberUtilityStyles.ts","webpack://grafana/./packages/jaeger-ui-components/src/utils/color-generator.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/date.tsx","webpack://grafana/./packages/jaeger-ui-components/src/utils/number.tsx","webpack://grafana/./public/app/core/actions/cleanUp.ts","webpack://grafana/./public/app/core/app_events.ts","webpack://grafana/./public/app/core/components/AccessControl/types.ts","webpack://grafana/./public/app/core/components/AccessControl/AddPermission.tsx","webpack://grafana/./public/app/core/components/AccessControl/PermissionListItem.tsx","webpack://grafana/./public/app/core/components/AccessControl/PermissionList.tsx","webpack://grafana/./public/app/core/components/AccessControl/Permissions.tsx","webpack://grafana/./public/app/core/components/Animations/SlideDown.tsx","webpack://grafana/./public/app/core/components/AppChrome/AppChromeUpdate.tsx","webpack://grafana/./public/app/core/components/AppChrome/NavToolbarSeparator.tsx","webpack://grafana/./public/app/core/components/Branding/Branding.tsx","webpack://grafana/./public/app/core/components/CardButton.tsx","webpack://grafana/./public/app/core/components/CloseButton/CloseButton.tsx","webpack://grafana/./public/app/core/components/EmptyListCTA/EmptyListCTA.tsx","webpack://grafana/./public/app/core/components/Footer/Footer.tsx","webpack://grafana/./public/app/core/components/ForgottenPassword/ChangePassword.tsx","webpack://grafana/./public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx","webpack://grafana/./public/app/core/components/Login/LoginCtrl.tsx","webpack://grafana/./public/app/core/components/Login/LoginForm.tsx","webpack://grafana/./public/app/core/components/Login/LoginLayout.tsx","webpack://grafana/./public/app/core/components/OptionsUI/NumberInput.tsx","webpack://grafana/./public/app/core/components/OptionsUI/color.tsx","webpack://grafana/./public/app/core/components/OptionsUI/number.tsx","webpack://grafana/./public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx","webpack://grafana/./public/app/features/dimensions/editors/ThresholdsEditor/thresholds.tsx","webpack://grafana/./public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingEditRow.tsx","webpack://grafana/./public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditorModal.tsx","webpack://grafana/./public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditor.tsx","webpack://grafana/./public/app/core/components/OptionsUI/DashboardPicker.tsx","webpack://grafana/./public/app/core/components/OptionsUI/fieldColor.tsx","webpack://grafana/./public/app/core/components/OptionsUI/links.tsx","webpack://grafana/./public/app/core/components/OptionsUI/multiSelect.tsx","webpack://grafana/./public/app/core/components/OptionsUI/select.tsx","webpack://grafana/./public/app/core/components/OptionsUI/stats.tsx","webpack://grafana/./public/app/core/components/OptionsUI/strings.tsx","webpack://grafana/./public/app/core/components/OptionsUI/units.tsx","webpack://grafana/./public/app/core/components/OptionsUI/registry.tsx","webpack://grafana/./public/app/core/components/OptionsUI/slider.tsx","webpack://grafana/./public/app/core/components/OptionsUI/string.tsx","webpack://grafana/./public/app/core/components/Page/usePageNav.ts","webpack://grafana/./public/app/core/components/Page/usePageTitle.ts","webpack://grafana/./public/app/core/components/PageNew/PageHeader.tsx","webpack://grafana/./public/app/core/components/PageNew/PageTabs.tsx","webpack://grafana/./public/app/core/components/PageNew/SectionNav.tsx","webpack://grafana/./public/app/core/components/PageNew/Page.tsx","webpack://grafana/./public/app/core/components/PageNew/PageContents.tsx","webpack://grafana/./public/app/core/components/Page/Page.tsx","webpack://grafana/./public/app/core/components/Page/PageContents.tsx","webpack://grafana/./public/app/core/components/Page/OldNavOnly.tsx","webpack://grafana/./public/app/core/components/Page/types.ts","webpack://grafana/./public/app/core/components/PageHeader/PageHeader.tsx","webpack://grafana/./public/app/core/components/PageLoader/PageLoader.tsx","webpack://grafana/./public/app/core/components/PasswordField/PasswordField.tsx","webpack://grafana/./public/app/core/components/PermissionList/AddPermission.tsx","webpack://grafana/./public/app/core/components/PermissionList/DisabledPermissionListItem.tsx","webpack://grafana/./public/app/core/components/PermissionList/PermissionListItem.tsx","webpack://grafana/./public/app/core/components/PermissionList/PermissionList.tsx","webpack://grafana/./public/app/core/components/PermissionList/PermissionsInfo.tsx","webpack://grafana/./public/app/core/components/QueryOperationRow/OperationRowHelp.tsx","webpack://grafana/./public/app/core/components/QueryOperationRow/QueryOperationAction.tsx","webpack://grafana/./public/app/core/components/QueryOperationRow/QueryOperationRowHeader.tsx","webpack://grafana/./public/app/core/components/QueryOperationRow/QueryOperationRow.tsx","webpack://grafana/./public/app/core/components/RolePicker/ValueContainer.tsx","webpack://grafana/./public/app/core/components/RolePicker/RolePickerInput.tsx","webpack://grafana/./public/app/core/components/RolePicker/constants.ts","webpack://grafana/./public/app/core/components/RolePicker/RolePickerMenu.tsx","webpack://grafana/./public/app/core/components/RolePicker/RolePicker.tsx","webpack://grafana/./public/app/core/components/RolePicker/UserRolePicker.tsx","webpack://grafana/./public/app/core/components/RolePicker/api.ts","webpack://grafana/./public/app/core/components/Select/DashboardPicker.tsx","webpack://grafana/./public/app/core/components/Select/FolderPicker.tsx","webpack://grafana/./public/app/core/components/Select/SortPicker.tsx","webpack://grafana/./public/app/core/components/Select/TeamPicker.tsx","webpack://grafana/./public/app/core/components/Select/UserPicker.tsx","webpack://grafana/./public/app/core/components/TagFilter/TagBadge.tsx","webpack://grafana/./public/app/core/components/TagFilter/TagOption.tsx","webpack://grafana/./public/app/core/components/TagFilter/TagFilter.tsx","webpack://grafana/./public/app/core/components/TimePicker/TimePickerWithHistory.tsx","webpack://grafana/./public/app/core/components/Upgrade/ProBadge.tsx","webpack://grafana/./public/app/core/components/help/HelpModal.tsx","webpack://grafana/./public/app/core/config.ts","webpack://grafana/./public/app/core/constants.ts","webpack://grafana/./public/app/core/context/GrafanaContext.ts","webpack://grafana/./public/app/core/copy/appNotification.ts","webpack://grafana/./public/app/core/history/localStorageConverter.ts","webpack://grafana/./public/app/core/history/RichHistoryLocalStorage.ts","webpack://grafana/./public/app/core/history/remoteStorageConverter.ts","webpack://grafana/./public/app/core/history/RichHistoryRemoteStorage.ts","webpack://grafana/./public/app/core/history/RichHistoryStorage.ts","webpack://grafana/./public/app/core/history/richHistoryLocalStorageUtils.ts","webpack://grafana/./public/app/core/history/richHistoryStorageProvider.ts","webpack://grafana/./public/app/core/hooks/useQueryParams.ts","webpack://grafana/./public/app/core/internationalization/constants.ts","webpack://grafana/./public/app/core/logsModel.ts","webpack://grafana/./public/app/core/utils/colors.ts","webpack://grafana/./public/app/core/navigation/hooks.ts","webpack://grafana/./public/app/core/navigation/kiosk.ts","webpack://grafana/./public/app/core/profiler.ts","webpack://grafana/./public/app/core/reducers/appNotification.ts","webpack://grafana/./public/app/core/reducers/navBarTree.ts","webpack://grafana/./public/app/core/reducers/navModel.ts","webpack://grafana/./public/app/core/selectors/navModel.ts","webpack://grafana/./public/app/core/services/PreferencesService.ts","webpack://grafana/./public/app/features/users/TokenRevokedModal.tsx","webpack://grafana/./public/app/core/services/FetchQueue.ts","webpack://grafana/./public/app/core/services/FetchQueueWorker.ts","webpack://grafana/./public/app/core/services/ResponseQueue.ts","webpack://grafana/./public/app/core/services/backend_srv.ts","webpack://grafana/./public/app/core/services/context_srv.ts","webpack://grafana/./public/app/core/services/impression_srv.ts","webpack://grafana/./public/app/core/services/toggleTheme.ts","webpack://grafana/./public/app/core/services/keybindingSrv.ts","webpack://grafana/./public/app/core/services/withFocusedPanelId.ts","webpack://grafana/./public/app/core/services/search_srv.ts","webpack://grafana/./public/app/core/store.ts","webpack://grafana/./public/app/core/table_model.ts","webpack://grafana/./public/app/core/time_series2.ts","webpack://grafana/./public/app/core/utils/ConfigProvider.tsx","webpack://grafana/./public/app/core/utils/CorsWorker.ts","webpack://grafana/./public/app/core/utils/accessControl.ts","webpack://grafana/./public/app/core/utils/acl.ts","webpack://grafana/./public/app/core/utils/arrayMove.ts","webpack://grafana/./public/app/core/utils/errors.ts","webpack://grafana/./public/app/core/utils/explore.ts","webpack://grafana/./public/app/core/utils/fetch.ts","webpack://grafana/./public/app/core/utils/flatten.ts","webpack://grafana/./public/app/core/utils/kbn.ts","webpack://grafana/./public/app/core/utils/query.ts","webpack://grafana/./public/app/core/utils/richHistory.ts","webpack://grafana/./public/app/core/utils/richHistoryTypes.ts","webpack://grafana/./public/app/core/utils/shortLinks.ts","webpack://grafana/./public/app/core/utils/ticks.ts","webpack://grafana/./public/app/core/utils/timePicker.ts","webpack://grafana/./public/app/features/admin/OrgRolePicker.tsx","webpack://grafana/./public/app/features/admin/state/actions.ts","webpack://grafana/./public/app/features/admin/state/reducers.ts","webpack://grafana/./public/app/features/alerting/state/alertDef.ts","webpack://grafana/./public/app/features/alerting/state/query_part.ts","webpack://grafana/./public/app/features/alerting/unified/state/reducers.ts","webpack://grafana/./public/app/features/alerting/state/reducers.ts","webpack://grafana/./public/app/features/alerting/unified/api/buildInfo.ts","webpack://grafana/./public/app/features/alerting/unified/api/prometheus.ts","webpack://grafana/./public/app/features/alerting/unified/api/ruler.ts","webpack://grafana/./public/app/features/alerting/unified/components/AlertLabel.tsx","webpack://grafana/./public/app/features/alerting/unified/components/AlertLabels.tsx","webpack://grafana/./public/app/features/alerting/unified/components/AlertManagerPicker.tsx","webpack://grafana/./public/app/features/alerting/unified/components/AnnotationDetailsField.tsx","webpack://grafana/./public/app/features/alerting/unified/components/CollapseToggle.tsx","webpack://grafana/./public/app/features/alerting/unified/components/DetailsField.tsx","webpack://grafana/./public/app/features/alerting/unified/components/DynamicTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/StateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/components/HoverCard.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Tokenize.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Well.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/AlertGroupHeader.tsx","webpack://grafana/./public/app/features/alerting/unified/components/receivers/editor/language.ts","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertInstanceDetails.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertInstancesTable.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertStateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/usePagination.ts","webpack://grafana/./public/app/features/alerting/unified/hooks/useUnifiedAlertingSelector.ts","webpack://grafana/./public/app/features/alerting/unified/api/alertmanager.ts","webpack://grafana/./public/app/features/alerting/unified/api/annotations.ts","webpack://grafana/./public/app/features/alerting/unified/utils/rulerClient.ts","webpack://grafana/./public/app/features/alerting/unified/state/actions.ts","webpack://grafana/./public/app/features/alerting/unified/api/grafana.ts","webpack://grafana/./public/app/features/alerting/unified/styles/notifications.ts","webpack://grafana/./public/app/features/alerting/unified/styles/pagination.ts","webpack://grafana/./public/app/features/alerting/unified/types/rule-form.ts","webpack://grafana/./public/app/features/alerting/unified/utils/access-control.ts","webpack://grafana/./public/app/features/alerting/unified/utils/alertmanager.ts","webpack://grafana/./public/app/features/alerting/unified/utils/config.ts","webpack://grafana/./public/app/features/alerting/unified/utils/constants.ts","webpack://grafana/./public/app/features/alerting/unified/utils/datasource.ts","webpack://grafana/./public/app/features/alerting/unified/utils/matchers.ts","webpack://grafana/./public/app/features/alerting/unified/utils/misc.ts","webpack://grafana/./public/app/features/alerting/unified/utils/redux.ts","webpack://grafana/./public/app/features/alerting/unified/utils/rule-form.ts","webpack://grafana/./public/app/features/alerting/unified/utils/rule-id.ts","webpack://grafana/./public/app/features/alerting/unified/utils/rules.ts","webpack://grafana/./public/app/features/alerting/unified/types/time.ts","webpack://grafana/./public/app/features/alerting/unified/utils/time.ts","webpack://grafana/./public/app/features/annotations/api.ts","webpack://grafana/./public/app/features/annotations/executeAnnotationQuery.ts","webpack://grafana/./public/app/features/annotations/standardAnnotationSupport.ts","webpack://grafana/./public/app/features/api-keys/state/reducers.ts","webpack://grafana/./public/app/features/comments/Comment.tsx","webpack://grafana/./public/app/features/comments/CommentView.tsx","webpack://grafana/./public/app/features/comments/CommentManager.tsx","webpack://grafana/./public/app/features/dashboard/components/DashExportModal/DashboardExporter.ts","webpack://grafana/./public/app/features/dashboard/components/DashNav/DashNavButton.tsx","webpack://grafana/./public/app/features/dashboard/components/DashNav/DashNavTimeControls.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardComments/DashboardCommentsModal.tsx","webpack://grafana/./public/app/features/dashboard/components/DashNav/DashNav.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/AutoRefreshIntervals.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/TimePickerSettings.tsx","webpack://grafana/./public/app/features/variables/inspect/NetworkGraph.tsx","webpack://grafana/./public/app/features/variables/inspect/NetworkGraphModal.tsx","webpack://grafana/./public/app/features/variables/inspect/VariablesDependenciesButton.tsx","webpack://grafana/./public/app/features/variables/inspect/VariablesUnknownButton.tsx","webpack://grafana/./public/app/features/variables/inspect/VariablesUnknownTable.tsx","webpack://grafana/./public/app/features/variables/editor/VariableHideSelect.tsx","webpack://grafana/./public/app/features/variables/editor/VariableTypeSelect.tsx","webpack://grafana/./public/app/features/variables/editor/VariableValuesPreview.tsx","webpack://grafana/./public/app/features/variables/editor/actions.ts","webpack://grafana/./public/app/features/variables/editor/VariableEditorEditor.tsx","webpack://grafana/./public/app/features/variables/inspect/VariableUsagesButton.tsx","webpack://grafana/./public/app/features/variables/editor/VariableEditorListRow.tsx","webpack://grafana/./public/app/features/variables/editor/VariableEditorList.tsx","webpack://grafana/./public/app/features/variables/editor/VariableEditorContainer.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardPermissions/AccessControlDashboardPermissions.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardPermissions/DashboardPermissions.tsx","webpack://grafana/./public/app/features/annotations/components/AnnotationResultMapper.tsx","webpack://grafana/./public/app/features/annotations/components/StandardAnnotationQueryEditor.tsx","webpack://grafana/./public/app/features/dashboard/components/AnnotationSettings/AngularEditorLoader.tsx","webpack://grafana/./public/app/features/dashboard/components/AnnotationSettings/AnnotationSettingsEdit.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/ListNewButton.tsx","webpack://grafana/./public/app/features/dashboard/components/AnnotationSettings/AnnotationSettingsList.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/DashboardSettingsHeader.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/AnnotationsSettings.tsx","webpack://grafana/./public/app/features/dashboard/components/DeleteDashboard/DeleteDashboardModal.tsx","webpack://grafana/./public/app/features/dashboard/components/DeleteDashboard/useDashboardDelete.tsx","webpack://grafana/./public/app/features/dashboard/components/DeleteDashboard/DeleteDashboardButton.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/PreviewSettings.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/GeneralSettings.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/JsonEditorSettings.tsx","webpack://grafana/./public/app/features/dashboard/components/LinksSettings/LinkSettingsList.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/LinksSettings.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/VersionsSettings.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardSettings/DashboardSettings.tsx","webpack://grafana/./public/app/features/dashboard/components/LinksSettings/LinkSettingsEdit.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/OptionsPaneCategory.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/OptionsPaneItemOverrides.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/state/getOptionOverrides.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/state/reducers.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/types.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/utils.ts","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardButton.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardDiff.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardAsForm.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardForm.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/forms/SaveProvisionedDashboardForm.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/forms/SaveToStorageForm.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardDrawer.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareEmbed.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ViewJsonModal.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareExport.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareLibraryPanel.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareLink.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/SharePublicDashboardUtils.ts","webpack://grafana/./public/app/features/dashboard/components/ShareModal/SharePublicDashboard.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareModal.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/utils.ts","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/DiffValues.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/DiffTitle.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/DiffGroup.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/DiffViewer.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/HistorySrv.ts","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/useDashboardRestore.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/RevertDashboardModal.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/VersionHistoryTable.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/VersionHistoryHeader.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/VersionHistoryButtons.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/VersionHistoryComparison.tsx","webpack://grafana/./public/app/features/dashboard/components/VersionHistory/utils.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuItem.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/liveTimer.ts","webpack://grafana/./public/app/features/dashboard/services/DashboardLoaderSrv.ts","webpack://grafana/./public/app/features/dashboard/services/DashboardSrv.ts","webpack://grafana/./public/app/features/dashboard/services/TimeSrv.ts","webpack://grafana/./public/app/features/dashboard/utils/getRefreshFromUrl.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/migrations/dashboardMigrations.ts","webpack://grafana/./public/app/features/dashboard/state/DashboardMigrator.ts","webpack://grafana/./public/app/core/utils/factors.ts","webpack://grafana/./public/app/core/utils/object.ts","webpack://grafana/./public/app/features/dashboard/utils/panelMerge.ts","webpack://grafana/./public/app/features/dashboard/state/DashboardModel.ts","webpack://grafana/./public/app/features/dashboard/state/utils.ts","webpack://grafana/./public/app/features/dashboard/state/PanelModel.ts","webpack://grafana/./public/app/features/dashboard/state/actions.ts","webpack://grafana/./public/app/features/dashboard/state/getPanelOptionsWithDefaults.ts","webpack://grafana/./public/app/features/dashboard/state/reducers.ts","webpack://grafana/./public/app/features/dashboard/utils/panel.ts","webpack://grafana/./public/app/features/data-connections/constants.ts","webpack://grafana/./public/app/features/datasources/constants.ts","webpack://grafana/./public/app/features/datasources/state/reducers.ts","webpack://grafana/./public/app/features/dimensions/editors/ColorDimensionEditor.tsx","webpack://grafana/./public/app/features/dimensions/editors/FileUploader.tsx","webpack://grafana/./public/app/features/dimensions/editors/ResourceCards.tsx","webpack://grafana/./public/app/features/dimensions/editors/FolderPickerTab.tsx","webpack://grafana/./public/app/features/dimensions/editors/URLPickerTab.tsx","webpack://grafana/./public/app/features/dimensions/editors/ResourcePickerPopover.tsx","webpack://grafana/./public/app/features/dimensions/editors/ResourcePicker.tsx","webpack://grafana/./public/app/features/dimensions/editors/TextDimensionEditor.tsx","webpack://grafana/./public/app/features/dimensions/editors/ResourceDimensionEditor.tsx","webpack://grafana/./public/app/features/dimensions/editors/ScaleDimensionEditor.tsx","webpack://grafana/./public/app/features/dimensions/editors/ScalarDimensionEditor.tsx","webpack://grafana/./public/app/features/dimensions/color.ts","webpack://grafana/./public/app/features/dimensions/text.ts","webpack://grafana/./public/app/features/dimensions/resource.ts","webpack://grafana/./public/app/features/dimensions/scalar.ts","webpack://grafana/./public/app/features/dimensions/scale.ts","webpack://grafana/./public/app/features/dimensions/types.ts","webpack://grafana/./public/app/features/dimensions/utils.ts","webpack://grafana/./public/app/features/explore/TraceView/createSpanLink.tsx","webpack://grafana/./public/app/features/explore/TraceView/useChildrenState.ts","webpack://grafana/./public/app/features/explore/TraceView/useDetailState.ts","webpack://grafana/./public/app/features/explore/TraceView/TraceView.tsx","webpack://grafana/./public/app/features/explore/TraceView/useHoverIndentGuide.ts","webpack://grafana/./public/app/features/explore/TraceView/useViewRange.ts","webpack://grafana/./public/app/features/explore/TraceView/useSearch.ts","webpack://grafana/./public/app/features/explore/TraceView/utils/transform.ts","webpack://grafana/./public/app/features/explore/state/datasource.ts","webpack://grafana/./public/app/features/explore/state/explorePane.ts","webpack://grafana/./public/app/features/explore/state/history.ts","webpack://grafana/./public/app/features/explore/state/main.ts","webpack://grafana/./public/app/features/explore/utils/decorators.ts","webpack://grafana/./public/app/features/explore/state/query.ts","webpack://grafana/./public/app/features/explore/state/time.ts","webpack://grafana/./public/app/features/explore/utils/time.ts","webpack://grafana/./public/app/features/explore/state/utils.ts","webpack://grafana/./public/app/features/explore/utils/links.ts","webpack://grafana/./public/app/features/expressions/components/Condition.tsx","webpack://grafana/./public/app/features/expressions/components/ClassicConditions.tsx","webpack://grafana/./public/app/features/expressions/components/Math.tsx","webpack://grafana/./public/app/features/expressions/components/Reduce.tsx","webpack://grafana/./public/app/features/expressions/components/Resample.tsx","webpack://grafana/./public/app/features/expressions/ExpressionDatasource.ts","webpack://grafana/./public/app/features/expressions/ExpressionQueryEditor.tsx","webpack://grafana/./public/app/features/expressions/types.ts","webpack://grafana/./public/app/features/expressions/utils/expressionTypes.ts","webpack://grafana/./public/app/features/folders/state/actions.ts","webpack://grafana/./public/app/features/folders/state/navModel.ts","webpack://grafana/./public/app/features/folders/state/reducers.ts","webpack://grafana/./public/app/features/geo/editor/GazetteerPathEditor.tsx","webpack://grafana/./public/app/features/geo/editor/locationEditor.ts","webpack://grafana/./public/app/features/geo/format/geohash.ts","webpack://grafana/./public/app/features/geo/format/utils.ts","webpack://grafana/./public/app/features/geo/format/geojson.ts","webpack://grafana/./public/app/features/geo/gazetteer/gazetteer.ts","webpack://grafana/./public/app/features/geo/gazetteer/worldmap.ts","webpack://grafana/./public/app/features/geo/utils/location.ts","webpack://grafana/./public/app/features/invites/state/actions.ts","webpack://grafana/./public/app/features/invites/state/reducers.ts","webpack://grafana/./public/app/features/library-panels/components/AddLibraryPanelModal/AddLibraryPanelModal.tsx","webpack://grafana/./public/app/features/library-panels/components/UnlinkModal/UnlinkModal.tsx","webpack://grafana/./public/app/features/library-panels/guard.ts","webpack://grafana/./public/app/features/library-panels/state/api.ts","webpack://grafana/./public/app/features/library-panels/types.ts","webpack://grafana/./public/app/features/library-panels/utils.ts","webpack://grafana/./public/app/features/library-panels/utils/usePanelSave.ts","webpack://grafana/./public/app/features/live/dashboard/types.ts","webpack://grafana/./public/app/features/live/dashboard/DashboardChangedModal.tsx","webpack://grafana/./public/app/features/live/dashboard/dashboardWatcher.ts","webpack://grafana/./public/app/features/live/data/StreamingDataFrame.ts","webpack://grafana/./public/app/features/live/data/utils.ts","webpack://grafana/./public/app/features/live/centrifuge/remoteObservable.ts","webpack://grafana/./public/app/features/live/centrifuge/serviceWorkerProxy.ts","webpack://grafana/./public/app/features/live/centrifuge/createCentrifugeServiceWorker.ts","webpack://grafana/./public/app/features/live/live.ts","webpack://grafana/./public/app/features/live/index.ts","webpack://grafana/./public/app/features/manage-dashboards/services/ValidationSrv.ts","webpack://grafana/./public/app/features/manage-dashboards/state/actions.ts","webpack://grafana/./public/app/features/manage-dashboards/state/reducers.ts","webpack://grafana/./public/app/features/org/state/reducers.ts","webpack://grafana/./public/app/features/panel/components/PanelDataErrorView.tsx","webpack://grafana/./public/app/features/panel/components/PanelPluginError.tsx","webpack://grafana/./public/app/features/panel/components/PanelRenderer.tsx","webpack://grafana/./public/app/features/panel/panellinks/link_srv.ts","webpack://grafana/./public/app/features/panel/state/actions.ts","webpack://grafana/./public/app/features/panel/state/reducers.ts","webpack://grafana/./public/app/features/playlist/PlaylistSrv.ts","webpack://grafana/./public/app/features/plugins/admin/api.ts","webpack://grafana/./public/app/features/plugins/admin/constants.ts","webpack://grafana/./public/app/features/plugins/admin/helpers.ts","webpack://grafana/./public/app/features/plugins/admin/permissions.ts","webpack://grafana/./public/app/features/plugins/admin/state/actions.ts","webpack://grafana/./public/app/features/plugins/admin/state/reducer.ts","webpack://grafana/./public/app/features/plugins/admin/types.ts","webpack://grafana/./public/app/features/plugins/datasource_srv.ts","webpack://grafana/./public/app/features/plugins/importPanelPlugin.ts","webpack://grafana/./public/app/features/plugins/pluginCacheBuster.ts","webpack://grafana/./public/app/features/plugins/pluginSettings.ts","webpack://grafana/./public/app/plugins/panel/alertGroups/AlertGroup.tsx","webpack://grafana/./public/app/plugins/panel/alertGroups/module.tsx","webpack://grafana/./public/app/plugins/panel/alertGroups/AlertGroupsPanel.tsx","webpack://grafana/./public/app/plugins/panel/alertGroups/useFilteredGroups.ts","webpack://grafana/./public/app/core/components/Select/ReadonlyFolderPicker/api.ts","webpack://grafana/./public/app/core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/AlertList.tsx","webpack://grafana/./public/app/types/unified-alerting.ts","webpack://grafana/./public/app/plugins/panel/alertlist/util.ts","webpack://grafana/./public/app/plugins/panel/alertlist/GroupByWithLoading.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/AlertInstances.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/unified-alerting/GroupedView.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/UnifiedAlertList.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/module.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/AlertListMigrationHandler.ts","webpack://grafana/./public/app/plugins/panel/alertlist/suggestions.ts","webpack://grafana/./public/app/plugins/panel/annolist/AnnotationListItem.tsx","webpack://grafana/./public/app/plugins/panel/annolist/AnnoListPanel.tsx","webpack://grafana/./public/app/plugins/panel/annolist/models.gen.ts","webpack://grafana/./public/app/plugins/panel/annolist/module.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/config/addTooltipSupport.ts","webpack://grafana/./public/app/plugins/panel/barchart/bars.ts","webpack://grafana/./public/app/plugins/panel/barchart/models.gen.ts","webpack://grafana/./public/app/plugins/panel/barchart/utils.ts","webpack://grafana/./public/app/plugins/panel/barchart/BarChartPanel.tsx","webpack://grafana/./public/app/plugins/panel/barchart/TickSpacingEditor.tsx","webpack://grafana/./public/app/plugins/panel/barchart/module.tsx","webpack://grafana/./public/app/plugins/panel/barchart/suggestions.ts","webpack://grafana/./public/app/plugins/panel/bargauge/models.gen.ts","webpack://grafana/./public/app/plugins/panel/bargauge/module.tsx","webpack://grafana/./public/app/plugins/panel/bargauge/BarGaugeMigrations.ts","webpack://grafana/./public/app/plugins/panel/bargauge/suggestions.ts","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/styles.ts","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/annotations/AnnotationEditorForm.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/annotations/AnnotationEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/AnnotationEditorPlugin.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/annotations/AnnotationTooltip.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/annotations/AnnotationMarker.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/ContextMenuPlugin.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/utils.ts","webpack://grafana/./public/app/plugins/panel/candlestick/models.gen.ts","webpack://grafana/./public/app/plugins/panel/candlestick/fields.ts","webpack://grafana/./public/app/plugins/panel/candlestick/utils.ts","webpack://grafana/./public/app/plugins/panel/candlestick/module.tsx","webpack://grafana/./public/app/plugins/panel/candlestick/CandlestickPanel.tsx","webpack://grafana/./public/app/plugins/panel/candlestick/suggestions.ts","webpack://grafana/./public/app/plugins/panel/dashlist/models.gen.ts","webpack://grafana/./public/app/plugins/panel/dashlist/styles.ts","webpack://grafana/./public/app/plugins/panel/dashlist/DashList.tsx","webpack://grafana/./public/app/plugins/panel/dashlist/module.tsx","webpack://grafana/./public/app/plugins/panel/debug/CursorView.tsx","webpack://grafana/./public/app/plugins/panel/debug/EventBusLogger.tsx","webpack://grafana/./public/app/plugins/panel/debug/RenderInfoViewer.tsx","webpack://grafana/./public/app/plugins/panel/debug/StateView.tsx","webpack://grafana/./public/app/plugins/panel/debug/types.ts","webpack://grafana/./public/app/plugins/panel/debug/DebugPanel.tsx","webpack://grafana/./public/app/plugins/panel/debug/module.tsx","webpack://grafana/./public/app/plugins/panel/gettingstarted/components/sharedStyles.ts","webpack://grafana/./public/app/plugins/panel/gettingstarted/components/DocsCard.tsx","webpack://grafana/./public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx","webpack://grafana/./public/app/plugins/panel/gettingstarted/components/Step.tsx","webpack://grafana/./public/app/plugins/panel/gettingstarted/steps.ts","webpack://grafana/./public/app/plugins/panel/gettingstarted/GettingStarted.tsx","webpack://grafana/./public/app/plugins/panel/gettingstarted/module.ts","webpack://grafana/./public/app/plugins/panel/histogram/Histogram.tsx","webpack://grafana/./public/app/plugins/panel/histogram/models.gen.ts","webpack://grafana/./public/app/plugins/panel/histogram/HistogramPanel.tsx","webpack://grafana/./public/app/plugins/panel/histogram/utils.ts","webpack://grafana/./public/app/plugins/panel/histogram/module.tsx","webpack://grafana/./public/app/plugins/panel/live/LiveChannelEditor.tsx","webpack://grafana/./public/app/plugins/panel/table/footer.ts","webpack://grafana/./public/app/plugins/panel/table/TablePanel.tsx","webpack://grafana/./public/app/plugins/panel/live/types.ts","webpack://grafana/./public/app/plugins/panel/live/LivePanel.tsx","webpack://grafana/./public/app/plugins/panel/live/module.tsx","webpack://grafana/./public/app/plugins/panel/logs/LogsPanel.tsx","webpack://grafana/./public/app/plugins/panel/logs/module.tsx","webpack://grafana/./public/app/plugins/panel/logs/suggestions.ts","webpack://grafana/./public/app/plugins/panel/news/constants.ts","webpack://grafana/./public/app/plugins/panel/news/feed.ts","webpack://grafana/./public/app/plugins/panel/news/atom.ts","webpack://grafana/./public/app/plugins/panel/news/rss.ts","webpack://grafana/./public/app/plugins/panel/news/NewsPanel.tsx","webpack://grafana/./public/app/plugins/panel/news/utils.ts","webpack://grafana/./public/app/plugins/panel/news/models.gen.ts","webpack://grafana/./public/app/plugins/panel/news/module.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/module.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx","webpack://grafana/./packages/grafana-ui/src/utils/useComponetInstanceId.ts","webpack://grafana/./public/app/plugins/panel/piechart/types.ts","webpack://grafana/./public/app/plugins/panel/piechart/utils.ts","webpack://grafana/./public/app/plugins/panel/piechart/PieChart.tsx","webpack://grafana/./public/app/plugins/panel/piechart/PieChartPanel.tsx","webpack://grafana/./public/app/plugins/panel/piechart/module.tsx","webpack://grafana/./public/app/plugins/panel/piechart/migrations.ts","webpack://grafana/./public/app/plugins/panel/piechart/suggestions.ts","webpack://grafana/./public/app/plugins/panel/state-timeline/StateTimelineTooltip.tsx","webpack://grafana/./public/app/plugins/panel/state-timeline/TimelineChart.tsx","webpack://grafana/./public/app/plugins/panel/state-timeline/module.tsx","webpack://grafana/./public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx","webpack://grafana/./public/app/plugins/panel/state-timeline/migrations.ts","webpack://grafana/./public/app/plugins/panel/state-timeline/suggestions.ts","webpack://grafana/./public/app/plugins/panel/status-history/StatusHistoryTooltip.tsx","webpack://grafana/./public/app/plugins/panel/status-history/types.ts","webpack://grafana/./public/app/plugins/panel/status-history/module.tsx","webpack://grafana/./public/app/plugins/panel/status-history/StatusHistoryPanel.tsx","webpack://grafana/./public/app/plugins/panel/status-history/suggestions.ts","webpack://grafana/./public/app/plugins/panel/table/PaginationEditor.tsx","webpack://grafana/./public/app/plugins/panel/table/migrations.ts","webpack://grafana/./public/app/plugins/panel/table/models.gen.ts","webpack://grafana/./public/app/plugins/panel/table/module.tsx","webpack://grafana/./public/app/plugins/panel/table/suggestions.ts","webpack://grafana/./public/app/plugins/panel/text/models.gen.ts","webpack://grafana/./public/app/plugins/panel/text/TextPanel.tsx","webpack://grafana/./public/app/plugins/panel/text/TextPanelEditor.tsx","webpack://grafana/./public/app/plugins/panel/text/module.tsx","webpack://grafana/./public/app/plugins/panel/text/textPanelMigrationHandler.ts","webpack://grafana/./public/app/plugins/panel/timeseries/TimezonesEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/migrations.ts","webpack://grafana/./public/app/plugins/panel/timeseries/module.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/suggestions.ts","webpack://grafana/./public/app/plugins/panel/traces/TracesPanel.tsx","webpack://grafana/./public/app/plugins/panel/traces/module.tsx","webpack://grafana/./public/app/plugins/panel/welcome/Welcome.tsx","webpack://grafana/./public/app/plugins/panel/welcome/module.ts","webpack://grafana/./public/app/plugins/panel/xychart/TooltipView.tsx","webpack://grafana/./public/app/plugins/panel/xychart/dims.ts","webpack://grafana/./public/app/plugins/panel/xychart/models.gen.ts","webpack://grafana/./public/app/plugins/panel/xychart/scatter.ts","webpack://grafana/./public/app/plugins/panel/xychart/XYChartPanel2.tsx","webpack://grafana/./public/app/plugins/panel/xychart/XYDimsEditor.tsx","webpack://grafana/./public/app/plugins/panel/xychart/config.ts","webpack://grafana/./public/app/plugins/panel/xychart/module.tsx","webpack://grafana/./public/app/features/plugins/built_in_plugins.ts","webpack://grafana/./public/app/features/plugins/plugin_loader.ts","webpack://grafana/./public/app/features/profile/api.ts","webpack://grafana/./public/app/features/profile/state/reducers.ts","webpack://grafana/./public/app/features/profile/state/selectors.ts","webpack://grafana/./public/app/features/query/components/QueryActionComponent.ts","webpack://grafana/./public/app/features/query/components/QueryEditorRowHeader.tsx","webpack://grafana/./public/app/features/query/components/QueryErrorAlert.tsx","webpack://grafana/./public/app/features/query/components/QueryEditorRow.tsx","webpack://grafana/./public/app/features/annotations/events_processing.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/AlertStatesWorker.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/AnnotationsQueryRunner.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/LegacyAnnotationQueryRunner.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/AnnotationsWorker.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/UnifiedAlertStatesWorker.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/DashboardQueryRunner.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/SnapshotWorker.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/utils.ts","webpack://grafana/./public/app/features/dashboard/services/PublicDashboardDataSource.ts","webpack://grafana/./public/app/features/query/state/PanelQueryRunner.ts","webpack://grafana/./public/app/features/query/state/mergePanelAndDashData.ts","webpack://grafana/./public/app/features/query/state/processing/canceler.ts","webpack://grafana/./public/app/features/query/state/processing/revision.ts","webpack://grafana/./public/app/features/query/state/runRequest.ts","webpack://grafana/./public/app/features/query/state/queryAnalytics.ts","webpack://grafana/./public/app/features/search/components/SearchCardExpanded.tsx","webpack://grafana/./public/app/features/search/components/SearchCard.tsx","webpack://grafana/./public/app/features/search/components/SearchCheckbox.tsx","webpack://grafana/./public/app/features/search/components/SearchItem.tsx","webpack://grafana/./public/app/features/search/constants.ts","webpack://grafana/./public/app/features/search/hooks/useSearchKeyboardSelection.ts","webpack://grafana/./public/app/features/search/hooks/useSearchQuery.ts","webpack://grafana/./public/app/features/search/components/DashboardSearch.tsx","webpack://grafana/./public/app/features/search/components/SearchWrapper.tsx","webpack://grafana/./public/app/features/search/page/components/ExplainScorePopup.tsx","webpack://grafana/./public/app/features/search/page/components/columns.tsx","webpack://grafana/./public/app/features/search/page/components/SearchResultsTable.tsx","webpack://grafana/./public/app/features/search/components/PreviewsSystemRequirements.tsx","webpack://grafana/./public/app/features/search/page/reporting.ts","webpack://grafana/./public/app/features/search/page/components/ActionRow.tsx","webpack://grafana/./public/app/features/search/page/components/FolderSection.tsx","webpack://grafana/./public/app/features/search/page/components/FolderView.tsx","webpack://grafana/./public/app/features/search/page/components/ConfirmDeleteModal.tsx","webpack://grafana/./public/app/features/search/page/components/MoveToFolderModal.tsx","webpack://grafana/./public/app/features/search/page/components/ManageActions.tsx","webpack://grafana/./public/app/features/search/page/components/SearchResultsCards.tsx","webpack://grafana/./public/app/features/search/page/components/SearchResultsGrid.tsx","webpack://grafana/./public/app/features/search/page/components/SearchView.tsx","webpack://grafana/./public/app/features/search/page/selection.ts","webpack://grafana/./public/app/features/search/reducers/actionTypes.ts","webpack://grafana/./public/app/features/search/reducers/searchQueryReducer.ts","webpack://grafana/./public/app/features/search/service/utils.ts","webpack://grafana/./public/app/features/search/service/bluge.ts","webpack://grafana/./public/app/features/search/service/sql.ts","webpack://grafana/./public/app/features/search/service/searcher.ts","webpack://grafana/./public/app/features/search/types.ts","webpack://grafana/./public/app/features/search/utils.ts","webpack://grafana/./public/app/features/serviceaccounts/components/CreateTokenModal.tsx","webpack://grafana/./public/app/features/serviceaccounts/constants.ts","webpack://grafana/./public/app/features/serviceaccounts/state/actions.ts","webpack://grafana/./public/app/features/serviceaccounts/state/reducers.ts","webpack://grafana/./public/app/features/storage/storage.ts","webpack://grafana/./public/app/features/storage/types.ts","webpack://grafana/./public/app/features/teams/state/reducers.ts","webpack://grafana/./public/app/features/templating/formatRegistry.ts","webpack://grafana/./public/app/features/templating/template_srv.ts","webpack://grafana/./public/app/features/transformers/calculateHeatmap/editor/AxisEditor.tsx","webpack://grafana/./public/app/features/transformers/calculateHeatmap/editor/helper.ts","webpack://grafana/./public/app/features/transformers/calculateHeatmap/utils.ts","webpack://grafana/./public/app/features/transformers/calculateHeatmap/heatmap.ts","webpack://grafana/./public/app/features/transformers/calculateHeatmap/models.gen.ts","webpack://grafana/./public/app/features/transformers/spatial/models.gen.ts","webpack://grafana/./public/app/features/transformers/spatial/utils.ts","webpack://grafana/./public/app/features/users/state/reducers.ts","webpack://grafana/./public/app/features/variables/adapters.ts","webpack://grafana/./public/app/features/variables/adhoc/actions.ts","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocFilterKey.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocFilterValue.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/OperatorSegment.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocFilterRenderer.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocFilterBuilder.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/ConditionSegment.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocFilter.tsx","webpack://grafana/./public/app/features/variables/adhoc/reducer.ts","webpack://grafana/./public/app/features/variables/constants.ts","webpack://grafana/./public/app/features/variables/editor/LegacyVariableQueryEditor.tsx","webpack://grafana/./public/app/features/variables/editor/VariableSectionHeader.tsx","webpack://grafana/./public/app/features/variables/editor/VariableSelectField.tsx","webpack://grafana/./public/app/features/variables/editor/VariableTextAreaField.tsx","webpack://grafana/./public/app/features/variables/editor/VariableTextField.tsx","webpack://grafana/./public/app/features/variables/editor/reducer.ts","webpack://grafana/./public/app/features/variables/editor/selectors.ts","webpack://grafana/./public/app/features/variables/getAllVariableValuesForUrl.ts","webpack://grafana/./public/app/features/variables/guard.ts","webpack://grafana/./public/app/features/variables/inspect/reducer.ts","webpack://grafana/./public/app/features/variables/inspect/utils.ts","webpack://grafana/./public/app/core/utils/set.ts","webpack://grafana/./public/app/core/utils/applyStateChanges.ts","webpack://grafana/./public/app/features/variables/pickers/OptionsPicker/reducer.ts","webpack://grafana/./public/app/features/variables/shared/formatVariable.ts","webpack://grafana/./public/app/features/variables/shared/multiOptions.ts","webpack://grafana/./public/app/core/utils/dag.ts","webpack://grafana/./public/app/features/variables/state/actions.ts","webpack://grafana/./public/app/features/variables/state/keyedVariablesReducer.ts","webpack://grafana/./public/app/features/variables/state/reducers.ts","webpack://grafana/./public/app/features/variables/state/selectors.ts","webpack://grafana/./public/app/features/variables/state/sharedReducer.ts","webpack://grafana/./public/app/features/variables/state/transactionReducer.ts","webpack://grafana/./public/app/features/variables/state/types.ts","webpack://grafana/./public/app/features/variables/state/variablesReducer.ts","webpack://grafana/./public/app/features/variables/types.ts","webpack://grafana/./public/app/features/variables/utils.ts","webpack://grafana/./public/app/features/transformers/FilterByValueTransformer/ValueMatchers/utils.ts","webpack://grafana/./public/app/features/transformers/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx","webpack://grafana/./public/app/features/transformers/FilterByValueTransformer/ValueMatchers/NoopMatcherEditor.tsx","webpack://grafana/./public/app/features/transformers/FilterByValueTransformer/ValueMatchers/RangeMatcherEditor.tsx","webpack://grafana/./public/app/features/transformers/FilterByValueTransformer/ValueMatchers/valueMatchersUI.ts","webpack://grafana/./public/app/features/transformers/FilterByValueTransformer/FilterByValueFilterEditor.tsx","webpack://grafana/./public/app/features/transformers/FilterByValueTransformer/FilterByValueTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/spatial/optionsHelper.tsx","webpack://grafana/./public/app/features/transformers/calculateHeatmap/HeatmapTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/fieldToConfigMapping/fieldToConfigMapping.ts","webpack://grafana/./public/app/features/transformers/fieldToConfigMapping/FieldToConfigMappingEditor.tsx","webpack://grafana/./public/app/features/transformers/configFromQuery/configFromQuery.ts","webpack://grafana/./public/app/features/transformers/configFromQuery/ConfigFromQueryTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/CalculateFieldTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/ConcatenateTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/FilterByNameTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/FilterByRefIdTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/utils.ts","webpack://grafana/./public/app/features/transformers/editors/GroupByTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/HistogramTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/LabelsToFieldsTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/LimitTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/MergeTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/OrganizeFieldsTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/ReduceTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/RenameByRegexTransformer.tsx","webpack://grafana/./public/app/features/transformers/editors/SeriesToFieldsTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/SeriesToRowsTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/editors/SortByTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/extractFields/fieldExtractors.ts","webpack://grafana/./public/app/features/transformers/extractFields/extractFields.ts","webpack://grafana/./public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/joinByLabels/joinByLabels.ts","webpack://grafana/./public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/lookupGazetteer/fieldLookup.ts","webpack://grafana/./public/app/features/transformers/lookupGazetteer/FieldLookupTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/prepareTimeSeries/prepareTimeSeries.ts","webpack://grafana/./public/app/features/transformers/prepareTimeSeries/PrepareTimeSeriesEditor.tsx","webpack://grafana/./public/app/features/transformers/rowsToFields/rowsToFields.ts","webpack://grafana/./public/app/features/transformers/rowsToFields/RowsToFieldsTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/spatial/spatialTransformer.ts","webpack://grafana/./public/app/features/transformers/spatial/SpatialTransformerEditor.tsx","webpack://grafana/./public/app/features/transformers/standardTransformers.ts","webpack://grafana/./public/lib/monaco-languages/kusto.ts","webpack://grafana/./public/lib/monaco-languages/index.ts","webpack://grafana/./public/app/core/components/ErrorPage/ErrorPage.tsx","webpack://grafana/./public/app/core/components/Login/LoginServiceButtons.tsx","webpack://grafana/./public/app/core/components/Login/UserSignup.tsx","webpack://grafana/./public/app/core/components/Login/LoginPage.tsx","webpack://grafana/./public/app/features/admin/UserLdapSyncInfo.tsx","webpack://grafana/./public/app/core/components/Select/OrgPicker.tsx","webpack://grafana/./public/app/features/admin/UserOrgs.tsx","webpack://grafana/./public/app/features/admin/UserPermissions.tsx","webpack://grafana/./public/app/features/admin/UserProfile.tsx","webpack://grafana/./public/app/features/admin/UserSessions.tsx","webpack://grafana/./public/app/features/admin/UserAdminPage.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapConnectionStatus.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapSyncInfo.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapUserGroups.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapUserMappingInfo.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapUserPermissions.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapUserTeams.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapUserInfo.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapPage.tsx","webpack://grafana/./public/app/core/components/DynamicImports/ErrorLoadingChunk.tsx","webpack://grafana/./public/app/core/components/DynamicImports/LoadingChunkPlaceHolder.tsx","webpack://grafana/./public/app/core/components/DynamicImports/SafeDynamicImport.tsx","webpack://grafana/./public/app/features/alerting/routes.tsx","webpack://grafana/./public/app/features/live/pages/routes.ts","webpack://grafana/./public/app/features/plugins/admin/routes.ts","webpack://grafana/./public/app/features/profile/routes.tsx","webpack://grafana/./public/app/features/serviceaccounts/ServiceAccountPermissions.tsx","webpack://grafana/./public/app/features/serviceaccounts/components/ServiceAccountProfileRow.tsx","webpack://grafana/./public/app/features/serviceaccounts/components/ServiceAccountRoleRow.tsx","webpack://grafana/./public/app/features/serviceaccounts/components/ServiceAccountProfile.tsx","webpack://grafana/./public/app/features/serviceaccounts/components/ServiceAccountTokensTable.tsx","webpack://grafana/./public/app/features/serviceaccounts/state/actionsServiceAccountPage.ts","webpack://grafana/./public/app/features/serviceaccounts/ServiceAccountPage.tsx","webpack://grafana/./public/app/routes/routes.tsx","webpack://grafana/./public/app/angular/AngularRoot.tsx","webpack://grafana/./public/app/core/components/NavBar/utils.ts","webpack://grafana/./public/app/core/components/AppChrome/types.ts","webpack://grafana/./public/app/core/components/NavBar/NavFeatureHighlight.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarItemWithoutMenu.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarMenuItem.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarToggle.tsx","webpack://grafana/./public/app/core/components/NavBar/navBarItem-translations.ts","webpack://grafana/./public/app/core/components/NavBar/NavBarMenu.tsx","webpack://grafana/./public/app/core/components/MegaMenu/NavBarMenu.tsx","webpack://grafana/./public/app/core/components/MegaMenu/MegaMenu.tsx","webpack://grafana/./public/app/core/components/AppChrome/Breadcrumbs.tsx","webpack://grafana/./public/app/core/components/AppChrome/NavToolbar.tsx","webpack://grafana/./public/app/core/components/AppChrome/TopSearchBar.tsx","webpack://grafana/./public/app/core/components/AppChrome/AppChrome.tsx","webpack://grafana/./public/app/core/components/AppNotifications/AppNotificationItem.tsx","webpack://grafana/./public/app/core/components/AppNotifications/AppNotificationList.tsx","webpack://grafana/./public/app/core/components/OrgSwitcher.tsx","webpack://grafana/./public/app/core/components/NavBar/context.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarItemMenuItem.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarScrollContainer.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarItemMenu.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarMenuPortalContainer.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarItemMenuTrigger.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarItem.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBar.tsx","webpack://grafana/./public/app/core/internationalization/index.tsx","webpack://grafana/./public/app/core/navigation/GrafanaRoute.tsx","webpack://grafana/./public/app/features/commandPalette/ResultItem.tsx","webpack://grafana/./public/app/features/commandPalette/actions/dashboard.nav.actions.ts","webpack://grafana/./public/app/features/commandPalette/actions/alerting.static.actions.ts","webpack://grafana/./public/app/features/commandPalette/CommandPalette.tsx","webpack://grafana/./public/app/features/commandPalette/actions/global.static.actions.ts","webpack://grafana/./public/app/features/live/LiveConnectionWarning.tsx","webpack://grafana/./public/app/AppWrapper.tsx","webpack://grafana/./public/app/angular/loadAndInitAngularIfEnabled.ts","webpack://grafana/./public/app/features/dashboard/routes.ts","webpack://grafana/./public/app/features/data-connections/routes.tsx","webpack://grafana/./public/app/core/components/AppChrome/AppChromeService.tsx","webpack://grafana/./public/app/core/utils/isShallowEqual.ts","webpack://grafana/./public/app/core/navigation/patch/interceptLinkClicks.ts","webpack://grafana/./public/app/core/components/modals/AngularModalProxy.tsx","webpack://grafana/./public/app/core/utils/connectWithReduxStore.tsx","webpack://grafana/./public/app/core/services/ModalManager.ts","webpack://grafana/./public/app/core/services/echo/utils.ts","webpack://grafana/./public/app/core/services/echo/Echo.ts","webpack://grafana/./public/app/core/services/echo/EchoSrv.ts","webpack://grafana/./public/app/core/services/echo/backends/PerformanceBackend.ts","webpack://grafana/./public/app/core/services/echo/backends/analytics/ApplicationInsightsBackend.ts","webpack://grafana/./public/app/core/services/echo/backends/analytics/GABackend.ts","webpack://grafana/./public/app/core/services/echo/backends/analytics/RudderstackBackend.ts","webpack://grafana/./public/app/core/services/echo/backends/grafana-javascript-agent/EchoSrvTransport.ts","webpack://grafana/./public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.ts","webpack://grafana/./public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.ts","webpack://grafana/./public/app/core/services/echo/backends/sentry/transports/EchoSrvTransport.ts","webpack://grafana/./public/app/core/services/echo/backends/sentry/SentryBackend.ts","webpack://grafana/./public/app/features/plugins/pluginPreloader.ts","webpack://grafana/./public/app/features/query/state/QueryRunner.ts","webpack://grafana/./public/app/features/variables/adhoc/AdHocVariableEditor.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocPicker.tsx","webpack://grafana/./public/app/features/variables/adhoc/urlParser.ts","webpack://grafana/./public/app/features/variables/adhoc/adapter.ts","webpack://grafana/./public/app/features/variables/query/reducer.ts","webpack://grafana/./public/app/features/variables/query/operators.ts","webpack://grafana/./public/app/features/variables/query/queryRunners.ts","webpack://grafana/./public/app/features/variables/query/VariableQueryRunner.ts","webpack://grafana/./public/app/features/variables/pickers/types.ts","webpack://grafana/./public/app/features/variables/pickers/shared/VariableInput.tsx","webpack://grafana/./public/app/features/variables/pickers/shared/VariableLink.tsx","webpack://grafana/./public/app/features/variables/pickers/shared/VariableOptions.tsx","webpack://grafana/./public/app/features/variables/pickers/OptionsPicker/actions.ts","webpack://grafana/./public/app/features/variables/pickers/OptionsPicker/OptionsPicker.tsx","webpack://grafana/./public/app/features/variables/constant/ConstantVariableEditor.tsx","webpack://grafana/./public/app/features/variables/constant/reducer.ts","webpack://grafana/./public/app/features/variables/constant/adapter.ts","webpack://grafana/./public/app/features/variables/constant/actions.ts","webpack://grafana/./public/app/features/variables/editor/VariableSwitchField.tsx","webpack://grafana/./public/app/features/variables/editor/SelectionOptionsEditor.tsx","webpack://grafana/./public/app/features/variables/custom/CustomVariableEditor.tsx","webpack://grafana/./public/app/features/variables/custom/reducer.ts","webpack://grafana/./public/app/features/variables/custom/adapter.ts","webpack://grafana/./public/app/features/variables/custom/actions.ts","webpack://grafana/./public/app/features/variables/datasource/reducer.ts","webpack://grafana/./public/app/features/variables/datasource/DataSourceVariableEditor.tsx","webpack://grafana/./public/app/features/variables/datasource/actions.ts","webpack://grafana/./public/app/features/variables/datasource/adapter.ts","webpack://grafana/./public/app/features/variables/interval/IntervalVariableEditor.tsx","webpack://grafana/./public/app/features/variables/interval/reducer.ts","webpack://grafana/./public/app/features/variables/interval/actions.ts","webpack://grafana/./public/app/features/variables/interval/adapter.ts","webpack://grafana/./public/app/features/variables/query/QueryVariableRefreshSelect.tsx","webpack://grafana/./public/app/features/variables/query/QueryVariableSortSelect.tsx","webpack://grafana/./public/app/features/variables/editor/getVariableQueryEditor.tsx","webpack://grafana/./public/app/features/variables/query/actions.ts","webpack://grafana/./public/app/features/variables/query/variableQueryObserver.ts","webpack://grafana/./public/app/features/variables/query/QueryVariableEditor.tsx","webpack://grafana/./public/app/features/variables/query/adapter.ts","webpack://grafana/./public/app/features/variables/textbox/TextBoxVariableEditor.tsx","webpack://grafana/./public/app/features/variables/textbox/TextBoxVariablePicker.tsx","webpack://grafana/./public/app/features/variables/textbox/reducer.ts","webpack://grafana/./public/app/features/variables/textbox/adapter.ts","webpack://grafana/./public/app/features/variables/textbox/actions.ts","webpack://grafana/./public/app/core/reducers/index.ts","webpack://grafana/./public/app/core/reducers/root.ts","webpack://grafana/./public/app/app.ts","webpack://grafana/./public/app/store/configureStore.ts","webpack://grafana/./public/app/features/variables/system/adapter.ts","webpack://grafana/./public/app/features/runtime/init.ts","webpack://grafana/./public/app/index.ts","webpack://grafana/./public/app/plugins/datasource/alertmanager/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/types.ts","webpack://grafana/./public/app/plugins/datasource/dashboard/types.ts","webpack://grafana/./public/app/plugins/datasource/dashboard/runSharedRequest.ts","webpack://grafana/./public/app/plugins/datasource/dashboard/DashboardQueryRow.tsx","webpack://grafana/./public/app/plugins/datasource/dashboard/DashboardQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/utils/messageFromError.ts","webpack://grafana/./public/app/plugins/datasource/grafana/components/AnnotationQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/grafana/datasource.ts","webpack://grafana/./public/app/plugins/datasource/grafana/types.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/useUniqueId.ts","webpack://grafana/./public/app/plugins/datasource/mixed/MixedDataSource.ts","webpack://grafana/./public/app/plugins/panel/alertlist/types.ts","webpack://grafana/./public/app/plugins/panel/barchart/distribute.ts","webpack://grafana/./public/app/plugins/panel/barchart/quadtree.ts","webpack://grafana/./public/app/plugins/panel/bargauge/BarGaugePanel.tsx","webpack://grafana/./public/app/plugins/panel/gauge/GaugePanel.tsx","webpack://grafana/./public/app/plugins/panel/gauge/models.gen.ts","webpack://grafana/./public/app/plugins/panel/gauge/module.tsx","webpack://grafana/./public/app/plugins/panel/gauge/GaugeMigrations.ts","webpack://grafana/./public/app/plugins/panel/gauge/suggestions.ts","webpack://grafana/./public/app/plugins/panel/geomap/components/DataHoverView.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/Edge.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/EdgeArrowMarker.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/EdgeLabel.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/Legend.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/Marker.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/Node.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/ViewControls.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/useNodeLimit.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/layout.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/createLayoutWorker.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/useContextMenu.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/usePanning.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/useZoom.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/NodeGraph.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/useFocusPositionOnLayout.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/useHighlight.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/useCategorizeFrames.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/utils.ts","webpack://grafana/./public/app/plugins/panel/stat/common.ts","webpack://grafana/./public/app/plugins/panel/stat/StatPanel.tsx","webpack://grafana/./public/app/plugins/panel/stat/models.gen.ts","webpack://grafana/./public/app/plugins/panel/stat/module.tsx","webpack://grafana/./public/app/plugins/panel/stat/StatMigrations.ts","webpack://grafana/./public/app/plugins/panel/stat/suggestions.ts","webpack://grafana/./public/app/plugins/panel/state-timeline/types.ts","webpack://grafana/./public/app/plugins/panel/state-timeline/timeline.ts","webpack://grafana/./public/app/plugins/panel/state-timeline/utils.ts","webpack://grafana/./public/app/plugins/panel/timeseries/LineStyleEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/SpanNullsEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/FillBelowToEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/ThresholdsStyleEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/config.ts","webpack://grafana/./public/app/polyfills/old-mediaquerylist.ts","webpack://grafana/./public/app/store/store.ts","webpack://grafana/./public/app/types/acl.ts","webpack://grafana/./public/app/types/events.ts","webpack://grafana/./public/app/types/explore.ts","webpack://grafana/./public/app/types/dashboard.ts","webpack://grafana/./public/app/types/serviceaccount.ts","webpack://grafana/./public/app/types/appNotifications.ts","webpack://grafana/./public/app/types/store.ts","webpack://grafana/./public/app/types/accessControl.ts","webpack://grafana/./public/app/types/suggestions.ts","webpack://grafana/./public/app/types/unified-alerting-dto.ts","webpack://grafana/./public/locales/en-US/messages.js","webpack://grafana/./public/vendor/flot/jquery.flot.crosshair.js","webpack://grafana/./public/vendor/flot/jquery.flot.dashes.js","webpack://grafana/./public/vendor/flot/jquery.flot.fillbelow.js","webpack://grafana/./public/vendor/flot/jquery.flot.gauge.js","webpack://grafana/./public/vendor/flot/jquery.flot.js","webpack://grafana/./public/vendor/flot/jquery.flot.selection.js","webpack://grafana/./public/vendor/flot/jquery.flot.stack.js","webpack://grafana/./public/vendor/flot/jquery.flot.stackpercent.js","webpack://grafana/./public/vendor/flot/jquery.flot.time.js"],"sourcesContent":["import { Vector, QueryResultMeta } from '../types';\nimport { Field, FieldType, DataFrame } from '../types/dataFrame';\nimport { FunctionalVector } from '../vector/FunctionalVector';\nimport { vectorToArray } from '../vector/vectorToArray';\n\nimport { guessFieldTypeFromNameAndValue, toDataFrameDTO } from './processDataFrame';\n\n/** @public */\nexport type ValueConverter<T = any> = (val: any) => T;\n\nconst NOOP: ValueConverter = (v) => v;\n\nclass ArrayPropertyVector<T = any> implements Vector<T> {\n converter = NOOP;\n\n constructor(private source: any[], private prop: string) {}\n\n get length(): number {\n return this.source.length;\n }\n\n get(index: number): T {\n return this.converter(this.source[index][this.prop]);\n }\n\n toArray(): T[] {\n return vectorToArray(this);\n }\n\n toJSON(): T[] {\n return vectorToArray(this);\n }\n}\n\n/**\n * The ArrayDataFrame takes an array of objects and presents it as a DataFrame\n *\n * @alpha\n */\nexport class ArrayDataFrame<T = any> extends FunctionalVector<T> implements DataFrame {\n name?: string;\n refId?: string;\n meta?: QueryResultMeta;\n\n fields: Field[] = [];\n length = 0;\n\n constructor(private source: T[], names?: string[]) {\n super();\n\n this.length = source.length;\n const first: any = source.length ? source[0] : {};\n if (names) {\n this.fields = names.map((name) => {\n return {\n name,\n type: guessFieldTypeFromNameAndValue(name, first[name]),\n config: {},\n values: new ArrayPropertyVector(source, name),\n };\n });\n } else {\n this.setFieldsFromObject(first);\n }\n }\n\n /**\n * Add a field for each property in the object. This will guess the type\n */\n setFieldsFromObject(obj: any) {\n this.fields = Object.keys(obj).map((name) => {\n return {\n name,\n type: guessFieldTypeFromNameAndValue(name, obj[name]),\n config: {},\n values: new ArrayPropertyVector(this.source, name),\n };\n });\n }\n\n /**\n * Configure how the object property is passed to the data frame\n */\n setFieldType(name: string, type: FieldType, converter?: ValueConverter): Field {\n let field = this.fields.find((f) => f.name === name);\n if (field) {\n field.type = type;\n } else {\n field = {\n name,\n type,\n config: {},\n values: new ArrayPropertyVector(this.source, name),\n };\n this.fields.push(field);\n }\n (field.values as any).converter = converter ?? NOOP;\n return field;\n }\n\n /**\n * Get an object with a property for each field in the DataFrame\n */\n get(idx: number): T {\n return this.source[idx];\n }\n\n /**\n * The simplified JSON values used in JSON.stringify()\n */\n toJSON() {\n return toDataFrameDTO(this);\n }\n}\n","import { DataFrame, FieldType, FieldConfig, Labels, QueryResultMeta } from '../types';\nimport { ArrayVector } from '../vector';\n\nimport { guessFieldTypeFromNameAndValue } from './processDataFrame';\n\n/**\n * The JSON transfer object for DataFrames. Values are stored in simple JSON\n *\n * @alpha\n */\nexport interface DataFrameJSON {\n /**\n * The schema defines the field type and configuration.\n */\n schema?: DataFrameSchema;\n\n /**\n * The field data\n */\n data?: DataFrameData;\n}\n\n/**\n * @alpha\n */\nexport interface DataFrameData {\n /**\n * A columnar store that matches fields defined by schema.\n */\n values: any[][];\n\n /**\n * Since JSON cannot encode NaN, Inf, -Inf, and undefined, these entities\n * are decoded after JSON.parse() using this struct\n */\n entities?: Array<FieldValueEntityLookup | null>;\n\n /**\n * Holds value bases per field so we can encode numbers from fixed points\n * e.g. [1612900958, 1612900959, 1612900960] -> 1612900958 + [0, 1, 2]\n */\n bases?: number[];\n\n /**\n * Holds value multipliers per field so we can encode large numbers concisely\n * e.g. [4900000000, 35000000000] -> 1e9 + [4.9, 35]\n */\n factors?: number[];\n\n /**\n * Holds enums per field so we can encode recurring values as ints\n * e.g. [\"foo\", \"foo\", \"baz\", \"foo\"] -> [\"foo\", \"baz\"] + [0,0,1,0]\n */\n enums?: any[][];\n}\n\n/**\n * The JSON transfer object for DataFrames. Values are stored in simple JSON\n *\n * @alpha\n */\nexport interface DataFrameSchema {\n /**\n * Matches the query target refId\n */\n refId?: string;\n\n /**\n * Initial response global metadata\n */\n meta?: QueryResultMeta;\n\n /**\n * Frame name\n */\n name?: string;\n\n /**\n * Field definition without any metadata\n */\n fields: FieldSchema[];\n}\n\n/**\n * Field object passed over JSON\n *\n * @alpha\n */\nexport interface FieldSchema {\n name: string; // The column name\n type?: FieldType;\n config?: FieldConfig;\n labels?: Labels;\n}\n\n/**\n * Since JSON cannot encode NaN, Inf, -Inf, and undefined, the locations\n * of these entities in field value arrays are stored here for restoration\n * after JSON.parse()\n *\n * @alpha\n */\nexport interface FieldValueEntityLookup {\n NaN?: number[];\n Undef?: number[]; // Missing because of absence or join\n Inf?: number[];\n NegInf?: number[];\n}\n\nconst ENTITY_MAP: Record<keyof FieldValueEntityLookup, any> = {\n Inf: Infinity,\n NegInf: -Infinity,\n Undef: undefined,\n NaN: NaN,\n};\n\n/**\n * @internal use locally\n */\nexport function decodeFieldValueEntities(lookup: FieldValueEntityLookup, values: any[]) {\n if (!lookup || !values) {\n return;\n }\n for (const key in lookup) {\n const repl = ENTITY_MAP[key as keyof FieldValueEntityLookup];\n for (const idx of lookup[key as keyof FieldValueEntityLookup]!) {\n if (idx < values.length) {\n values[idx] = repl;\n }\n }\n }\n}\n\nfunction guessFieldType(name: string, values: any[]): FieldType {\n for (const v of values) {\n if (v != null) {\n return guessFieldTypeFromNameAndValue(name, v);\n }\n }\n return FieldType.other;\n}\n\n/**\n * NOTE: dto.data.values will be mutated and decoded/inflated using entities,bases,factors,enums\n *\n * @alpha\n */\nexport function dataFrameFromJSON(dto: DataFrameJSON): DataFrame {\n const { schema, data } = dto;\n\n if (!schema || !schema.fields) {\n throw new Error('JSON needs a fields definition');\n }\n\n // Find the longest field length\n const length = data ? data.values.reduce((max, vals) => Math.max(max, vals.length), 0) : 0;\n const fields = schema.fields.map((f, index) => {\n let buffer = data ? data.values[index] : [];\n let origLen = buffer.length;\n\n if (origLen !== length) {\n buffer.length = length;\n // avoid sparse arrays\n buffer.fill(undefined, origLen);\n }\n\n let entities: FieldValueEntityLookup | undefined | null;\n\n if ((entities = data && data.entities && data.entities[index])) {\n decodeFieldValueEntities(entities, buffer);\n }\n\n // TODO: expand arrays further using bases,factors,enums\n\n return {\n ...f,\n type: f.type ?? guessFieldType(f.name, buffer),\n config: f.config ?? {},\n values: new ArrayVector(buffer),\n // the presence of this prop is an optimization signal & lookup for consumers\n entities: entities ?? {},\n };\n });\n\n return {\n ...schema,\n fields,\n length,\n };\n}\n\n/**\n * This converts DataFrame to a json representation with distinct schema+data\n *\n * @alpha\n */\nexport function dataFrameToJSON(frame: DataFrame): DataFrameJSON {\n const data: DataFrameData = {\n values: [],\n };\n const schema: DataFrameSchema = {\n refId: frame.refId,\n meta: frame.meta,\n name: frame.name,\n fields: frame.fields.map((f) => {\n const { values, state, display, ...sfield } = f;\n delete (sfield as any).entities;\n data.values.push(values.toArray());\n return sfield;\n }),\n };\n\n return {\n schema,\n data,\n };\n}\n","import { DisplayProcessor } from '../types';\nimport { DataFrame, Field } from '../types/dataFrame';\nimport { FunctionalVector } from '../vector/FunctionalVector';\n\n/**\n * This abstraction will present the contents of a DataFrame as if\n * it were a well typed javascript object Vector.\n *\n * @remarks\n * The {@link DataFrameView.get} is optimized for use in a loop and will return same object.\n * See function for more details.\n *\n * @typeParam T - Type of object stored in the DataFrame.\n * @beta\n */\nexport class DataFrameView<T = any> extends FunctionalVector<T> {\n private index = 0;\n private obj: T;\n readonly fields: {\n readonly [Property in keyof T]: Field<T[Property]>;\n };\n\n constructor(private data: DataFrame) {\n super();\n const obj = {} as unknown as T;\n const fields = {} as any;\n\n for (let i = 0; i < data.fields.length; i++) {\n const field = data.fields[i];\n if (!field.name) {\n continue; // unsupported\n }\n\n fields[field.name] = field;\n const getter = () => field.values.get(this.index);\n\n if (!(obj as any).hasOwnProperty(field.name)) {\n Object.defineProperty(obj, field.name, {\n enumerable: true, // Shows up as enumerable property\n get: getter,\n });\n }\n\n if (!(obj as any).hasOwnProperty(i.toString())) {\n Object.defineProperty(obj, i, {\n enumerable: false, // Don't enumerate array index\n get: getter,\n });\n }\n }\n\n this.obj = obj;\n this.fields = fields;\n }\n\n get dataFrame() {\n return this.data;\n }\n\n get length() {\n return this.data.length;\n }\n\n /**\n * Helper function to return the {@link DisplayProcessor} for a given field column.\n * @param colIndex - the field column index for the data frame.\n */\n getFieldDisplayProcessor(colIndex: number): DisplayProcessor | undefined {\n if (!this.dataFrame || !this.dataFrame.fields) {\n return undefined;\n }\n\n const field = this.dataFrame.fields[colIndex];\n\n if (!field || !field.display) {\n return undefined;\n }\n\n return field.display;\n }\n\n /**\n * The contents of the object returned from this function\n * are optimized for use in a loop. All calls return the same object\n * but the index has changed.\n *\n * @example\n * ```typescript\n * // `first`, `second` and `third` will all point to the same contents at index 2:\n * const first = view.get(0);\n * const second = view.get(1);\n * const third = view.get(2);\n *\n * // If you need three different objects, consider something like:\n * const first = { ...view.get(0) };\n * const second = { ...view.get(1) };\n * const third = { ...view.get(2) };\n * ```\n * @param idx - The index of the object you currently are inspecting\n */\n get(idx: number) {\n this.index = idx;\n return this.obj;\n }\n\n toArray(): T[] {\n return new Array(this.data.length)\n .fill(0) // Needs to make a full copy\n .map((_, i) => ({ ...this.get(i) }));\n }\n}\n","import { isString } from 'lodash';\n\nimport { QueryResultMeta } from '../types/data';\nimport { Field, DataFrame, DataFrameDTO, FieldDTO, FieldType } from '../types/dataFrame';\nimport { MutableVector, Vector } from '../types/vector';\nimport { makeFieldParser } from '../utils/fieldParser';\nimport { ArrayVector } from '../vector/ArrayVector';\nimport { FunctionalVector } from '../vector/FunctionalVector';\n\nimport { guessFieldTypeFromValue, guessFieldTypeForField, toDataFrameDTO } from './processDataFrame';\n\nexport type MutableField<T = any> = Field<T, MutableVector<T>>;\n\ntype MutableVectorCreator = (buffer?: any[]) => MutableVector;\n\nexport const MISSING_VALUE: any = undefined; // Treated as connected in new graph panel\n\nexport class MutableDataFrame<T = any> extends FunctionalVector<T> implements DataFrame, MutableVector<T> {\n name?: string;\n refId?: string;\n meta?: QueryResultMeta;\n fields: MutableField[] = [];\n\n private first: Vector = new ArrayVector();\n private creator: MutableVectorCreator;\n\n constructor(source?: DataFrame | DataFrameDTO, creator?: MutableVectorCreator) {\n super();\n\n // This creates the underlying storage buffers\n this.creator = creator\n ? creator\n : (buffer?: any[]) => {\n return new ArrayVector(buffer);\n };\n\n // Copy values from\n if (source) {\n const { name, refId, meta, fields } = source;\n if (name) {\n this.name = name;\n }\n if (refId) {\n this.refId = refId;\n }\n if (meta) {\n this.meta = meta;\n }\n if (fields) {\n for (const f of fields) {\n this.addField(f);\n }\n }\n }\n\n // Get Length to show up if you use spread\n Object.defineProperty(this, 'length', {\n enumerable: true,\n get: () => {\n return this.first.length;\n },\n });\n }\n\n // Defined for Vector interface\n get length() {\n return this.first.length;\n }\n\n addFieldFor(value: any, name?: string): MutableField {\n return this.addField({\n name: name || '', // Will be filled in\n type: guessFieldTypeFromValue(value),\n });\n }\n\n addField(f: Field | FieldDTO, startLength?: number): MutableField {\n let buffer: any[] | undefined = undefined;\n\n if (f.values) {\n if (Array.isArray(f.values)) {\n buffer = f.values as any[];\n } else {\n buffer = (f.values as Vector).toArray();\n }\n }\n\n let type = f.type;\n\n if (!type && ('time' === f.name || 'Time' === f.name)) {\n type = FieldType.time;\n } else {\n if (!type && buffer && buffer.length) {\n type = guessFieldTypeFromValue(buffer[0]);\n }\n if (!type) {\n type = FieldType.other;\n }\n }\n\n // Make sure it has a name\n let name = f.name;\n if (!name) {\n name = `Field ${this.fields.length + 1}`;\n }\n\n const field: MutableField = {\n ...f,\n name,\n type,\n config: f.config || {},\n values: this.creator(buffer),\n };\n\n if (type === FieldType.other) {\n type = guessFieldTypeForField(field);\n if (type) {\n field.type = type;\n }\n }\n\n this.fields.push(field);\n this.first = this.fields[0].values;\n\n // Make sure the field starts with a given length\n if (startLength) {\n while (field.values.length < startLength) {\n field.values.add(MISSING_VALUE);\n }\n } else {\n this.validate();\n }\n\n return field;\n }\n\n validate() {\n // Make sure all arrays are the same length\n const length = this.fields.reduce((v: number, f) => {\n return Math.max(v, f.values.length);\n }, 0);\n\n // Add empty elements until everything matches\n for (const field of this.fields) {\n while (field.values.length !== length) {\n field.values.add(MISSING_VALUE);\n }\n }\n }\n\n /**\n * Reverse all values\n */\n reverse() {\n for (const f of this.fields) {\n f.values.reverse();\n }\n }\n\n private parsers: Map<Field, (v: string) => any> | undefined = undefined;\n\n /**\n * @deprecated unclear if this is actually used\n */\n setParser(field: Field, parser: (v: string) => any) {\n if (!this.parsers) {\n this.parsers = new Map<Field, (v: string) => any>();\n }\n this.parsers.set(field, parser);\n return parser;\n }\n\n private parseValue(field: Field, v: any): any {\n let p = this.parsers?.get(field);\n if (!p) {\n p = this.setParser(field, makeFieldParser(v, field));\n }\n return p(v);\n }\n\n /**\n * This will add each value to the corresponding column\n */\n appendRow(row: any[]) {\n // Add any extra columns\n for (let i = this.fields.length; i < row.length; i++) {\n this.addField({\n name: `Field ${i + 1}`,\n type: guessFieldTypeFromValue(row[i]),\n });\n }\n\n // The first line may change the field types\n if (this.length < 1) {\n for (let i = 0; i < this.fields.length; i++) {\n const f = this.fields[i];\n if (!f.type || f.type === FieldType.other) {\n f.type = guessFieldTypeFromValue(row[i]);\n }\n }\n }\n\n for (let i = 0; i < this.fields.length; i++) {\n const f = this.fields[i];\n let v = row[i];\n if (f.type !== FieldType.string && isString(v)) {\n v = this.parseValue(f, v);\n }\n f.values.add(v);\n }\n }\n\n /**\n * Add values from an object to corresponding fields. Similar to appendRow but does not create new fields.\n */\n add(value: T) {\n // Will add one value for every field\n const obj = value as any;\n for (const field of this.fields) {\n let val = obj[field.name];\n\n if (field.type !== FieldType.string && isString(val)) {\n val = this.parseValue(field, val);\n }\n\n if (val === undefined) {\n val = MISSING_VALUE;\n }\n\n field.values.add(val);\n }\n }\n\n set(index: number, value: T) {\n if (index > this.length) {\n throw new Error('Unable ot set value beyond current length');\n }\n\n const obj = (value as any) || {};\n for (const field of this.fields) {\n field.values.set(index, obj[field.name]);\n }\n }\n\n /**\n * Get an object with a property for each field in the DataFrame\n */\n get(idx: number): T {\n const v: any = {};\n for (const field of this.fields) {\n v[field.name] = field.values.get(idx);\n }\n return v as T;\n }\n\n /**\n * The simplified JSON values used in JSON.stringify()\n */\n toJSON() {\n return toDataFrameDTO(this);\n }\n}\n","import { KeyValue } from '../types/data';\nimport { Field } from '../types/dataFrame';\n\nexport interface Dimension<T = any> {\n // Name of the dimension\n name: string;\n // Collection of fields representing dimension\n // I.e. in 2d graph we have two dimension- X and Y axes. Both dimensions can represent\n // multiple fields being drawn on the graph.\n // For instance y-axis dimension is a collection of series value fields,\n // and x-axis dimension is a collection of corresponding time fields\n columns: Array<Field<T>>;\n}\n\nexport type Dimensions = KeyValue<Dimension>;\n\nexport const createDimension = (name: string, columns: Field[]): Dimension => {\n return {\n name,\n columns,\n };\n};\n\nexport const getColumnsFromDimension = (dimension: Dimension) => {\n return dimension.columns;\n};\nexport const getColumnFromDimension = (dimension: Dimension, column: number) => {\n return dimension.columns[column];\n};\n\nexport const getValueFromDimension = (dimension: Dimension, column: number, row: number) => {\n return dimension.columns[column].values.get(row);\n};\n\nexport const getAllValuesFromDimension = (dimension: Dimension, column: number, row: number) => {\n return dimension.columns.map((c) => c.values.get(row));\n};\n\nexport const getDimensionByName = (dimensions: Dimensions, name: string) => dimensions[name];\n","import { DataFrame } from '../types/dataFrame';\n\n/**\n * Returns true if both frames have the same name, fields, labels and configs.\n *\n * @example\n * To compare multiple frames use:\n * ```\n * compareArrayValues(a, b, framesHaveSameStructure);\n * ```\n * NOTE: this does a shallow check on the FieldConfig properties, when using the query\n * editor, this should be sufficient, however if applications are mutating properties\n * deep in the FieldConfig this will not recognize a change\n *\n * @beta\n */\nexport function compareDataFrameStructures(a: DataFrame, b: DataFrame, skipConfig?: boolean): boolean {\n if (a === b) {\n return true;\n }\n\n if (a?.fields?.length !== b?.fields?.length) {\n return false;\n }\n\n if (a.name !== b.name) {\n return false;\n }\n\n for (let i = 0; i < a.fields.length; i++) {\n const fA = a.fields[i];\n const fB = b.fields[i];\n\n if (fA.type !== fB.type || fA.name !== fB.name) {\n return false;\n }\n\n // Do not check the config fields\n if (skipConfig) {\n continue;\n }\n\n // Check if labels are different\n if (fA.labels && fB.labels && !shallowCompare(fA.labels, fB.labels)) {\n return false;\n }\n\n const cfgA = fA.config as any;\n const cfgB = fB.config as any;\n\n let aKeys = Object.keys(cfgA);\n let bKeys = Object.keys(cfgB);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (const key of aKeys) {\n if (!(key in cfgB)) {\n return false;\n }\n\n if (key === 'interval') {\n continue;\n }\n if (key === 'custom') {\n if (!shallowCompare(cfgA[key], cfgB[key])) {\n return false;\n }\n } else if (cfgA[key] !== cfgB[key]) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * Check if all values in two arrays match the compare funciton\n *\n * @beta\n */\nexport function compareArrayValues<T>(a: T[], b: T[], cmp: (a: T, b: T) => boolean) {\n if (a === b) {\n return true;\n }\n if (a?.length !== b?.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!cmp(a[i], b[i])) {\n return false;\n }\n }\n return true;\n}\n\ntype Cmp = (valA: any, valB: any) => boolean;\n\nconst defaultCmp: Cmp = (a, b) => a === b;\n\n/**\n * Checks if two objects are equal shallowly\n *\n * @beta\n */\nexport function shallowCompare<T extends {}>(a: T, b: T, cmp: Cmp = defaultCmp) {\n if (a === b) {\n return true;\n }\n\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n\n for (let key of aKeys) {\n //@ts-ignore\n if (!cmp(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import { Field, DataFrame, FieldType, guessFieldTypeForField } from '../index';\n\nexport interface FieldWithIndex extends Field {\n index: number;\n}\n\nexport class FieldCache {\n fields: FieldWithIndex[] = [];\n\n private fieldByName: { [key: string]: FieldWithIndex } = {};\n private fieldByType: { [key: string]: FieldWithIndex[] } = {};\n\n constructor(data: DataFrame) {\n this.fields = data.fields.map((field, idx) => ({\n ...field,\n index: idx,\n }));\n\n for (let i = 0; i < data.fields.length; i++) {\n const field = data.fields[i];\n // Make sure it has a type\n if (field.type === FieldType.other) {\n const t = guessFieldTypeForField(field);\n if (t) {\n field.type = t;\n }\n }\n if (!this.fieldByType[field.type]) {\n this.fieldByType[field.type] = [];\n }\n this.fieldByType[field.type].push({\n ...field,\n index: i,\n });\n\n if (this.fieldByName[field.name]) {\n console.warn('Duplicate field names in DataFrame: ', field.name);\n } else {\n this.fieldByName[field.name] = { ...field, index: i };\n }\n }\n }\n\n getFields(type?: FieldType): FieldWithIndex[] {\n if (!type) {\n return [...this.fields]; // All fields\n }\n const fields = this.fieldByType[type];\n if (fields) {\n return [...fields];\n }\n return [];\n }\n\n hasFieldOfType(type: FieldType): boolean {\n const types = this.fieldByType[type];\n return types && types.length > 0;\n }\n\n getFirstFieldOfType(type: FieldType, includeHidden = false): FieldWithIndex | undefined {\n const fields = this.fieldByType[type];\n const firstField = fields.find((field) => includeHidden || !field.config.custom?.hidden);\n return firstField;\n }\n\n hasFieldNamed(name: string): boolean {\n return !!this.fieldByName[name];\n }\n\n hasFieldWithNameAndType(name: string, type: FieldType): boolean {\n return !!this.fieldByName[name] && this.fieldByType[type].filter((field) => field.name === name).length > 0;\n }\n\n /**\n * Returns the first field with the given name.\n */\n getFieldByName(name: string): FieldWithIndex | undefined {\n return this.fieldByName[name];\n }\n\n /**\n * Returns the fields with the given label.\n */\n getFieldsByLabel(label: string, value: string): FieldWithIndex[] {\n return Object.values(this.fieldByName).filter((f) => {\n return f.labels && f.labels[label] === value;\n });\n }\n}\n","import { CircularVector } from '../vector/CircularVector';\n\nimport { MutableDataFrame } from './MutableDataFrame';\n\ninterface CircularOptions {\n append?: 'head' | 'tail';\n capacity?: number;\n}\n\n/**\n * This dataframe can have values constantly added, and will never\n * exceed the given capacity\n */\nexport class CircularDataFrame<T = any> extends MutableDataFrame<T> {\n constructor(options: CircularOptions) {\n super(undefined, (buffer?: any[]) => {\n return new CircularVector({\n ...options,\n buffer,\n });\n });\n }\n}\n","// Libraries\nimport { isArray, isBoolean, isNumber, isString } from 'lodash';\n\n// Types\nimport { isDateTime } from '../datetime/moment_wrapper';\nimport { fieldIndexComparer } from '../field/fieldComparers';\nimport { getFieldDisplayName } from '../field/fieldState';\nimport {\n DataFrame,\n Field,\n FieldConfig,\n TimeSeries,\n FieldType,\n TableData,\n Column,\n GraphSeriesXY,\n TimeSeriesValue,\n FieldDTO,\n DataFrameDTO,\n TIME_SERIES_VALUE_FIELD_NAME,\n TIME_SERIES_TIME_FIELD_NAME,\n} from '../types/index';\nimport { ArrayVector } from '../vector/ArrayVector';\nimport { SortedVector } from '../vector/SortedVector';\nimport { vectorToArray } from '../vector/vectorToArray';\n\nimport { ArrayDataFrame } from './ArrayDataFrame';\nimport { dataFrameFromJSON } from './DataFrameJSON';\nimport { MutableDataFrame } from './MutableDataFrame';\n\nfunction convertTableToDataFrame(table: TableData): DataFrame {\n const fields = table.columns.map((c) => {\n // TODO: should be Column but type does not exists there so not sure whats up here.\n const { text, type, ...disp } = c as any;\n return {\n name: text?.length ? text : c, // rename 'text' to the 'name' field\n config: (disp || {}) as FieldConfig,\n values: new ArrayVector(),\n type: type && Object.values(FieldType).includes(type as FieldType) ? (type as FieldType) : FieldType.other,\n };\n });\n\n if (!isArray(table.rows)) {\n throw new Error(`Expected table rows to be array, got ${typeof table.rows}.`);\n }\n\n for (const row of table.rows) {\n for (let i = 0; i < fields.length; i++) {\n fields[i].values.buffer.push(row[i]);\n }\n }\n\n for (const f of fields) {\n if (f.type === FieldType.other) {\n const t = guessFieldTypeForField(f);\n if (t) {\n f.type = t;\n }\n }\n }\n\n return {\n fields,\n refId: table.refId,\n meta: table.meta,\n name: table.name,\n length: table.rows.length,\n };\n}\n\nfunction convertTimeSeriesToDataFrame(timeSeries: TimeSeries): DataFrame {\n const times: number[] = [];\n const values: TimeSeriesValue[] = [];\n\n // Sometimes the points are sent as datapoints\n const points = timeSeries.datapoints || (timeSeries as any).points;\n for (const point of points) {\n values.push(point[0]);\n times.push(point[1] as number);\n }\n\n const fields = [\n {\n name: TIME_SERIES_TIME_FIELD_NAME,\n type: FieldType.time,\n config: {},\n values: new ArrayVector<number>(times),\n },\n {\n name: TIME_SERIES_VALUE_FIELD_NAME,\n type: FieldType.number,\n config: {\n unit: timeSeries.unit,\n },\n values: new ArrayVector<TimeSeriesValue>(values),\n labels: timeSeries.tags,\n },\n ];\n\n if (timeSeries.title) {\n (fields[1].config as FieldConfig).displayNameFromDS = timeSeries.title;\n }\n\n return {\n name: timeSeries.target || (timeSeries as any).name,\n refId: timeSeries.refId,\n meta: timeSeries.meta,\n fields,\n length: values.length,\n };\n}\n\n/**\n * This is added temporarily while we convert the LogsModel\n * to DataFrame. See: https://github.com/grafana/grafana/issues/18528\n */\nfunction convertGraphSeriesToDataFrame(graphSeries: GraphSeriesXY): DataFrame {\n const x = new ArrayVector();\n const y = new ArrayVector();\n\n for (let i = 0; i < graphSeries.data.length; i++) {\n const row = graphSeries.data[i];\n x.buffer.push(row[1]);\n y.buffer.push(row[0]);\n }\n\n return {\n name: graphSeries.label,\n fields: [\n {\n name: graphSeries.label || TIME_SERIES_VALUE_FIELD_NAME,\n type: FieldType.number,\n config: {},\n values: x,\n },\n {\n name: TIME_SERIES_TIME_FIELD_NAME,\n type: FieldType.time,\n config: {\n unit: 'dateTimeAsIso',\n },\n values: y,\n },\n ],\n length: x.buffer.length,\n };\n}\n\nfunction convertJSONDocumentDataToDataFrame(timeSeries: TimeSeries): DataFrame {\n const fields = [\n {\n name: timeSeries.target,\n type: FieldType.other,\n labels: timeSeries.tags,\n config: {\n unit: timeSeries.unit,\n filterable: (timeSeries as any).filterable,\n },\n values: new ArrayVector(),\n },\n ];\n\n for (const point of timeSeries.datapoints) {\n fields[0].values.buffer.push(point);\n }\n\n return {\n name: timeSeries.target,\n refId: timeSeries.target,\n meta: { json: true },\n fields,\n length: timeSeries.datapoints.length,\n };\n}\n\n// PapaParse Dynamic Typing regex:\n// https://github.com/mholt/PapaParse/blob/master/papaparse.js#L998\nconst NUMBER = /^\\s*(-?(\\d*\\.?\\d+|\\d+\\.?\\d*)(e[-+]?\\d+)?|NAN)\\s*$/i;\n\n/**\n * Given a name and value, this will pick a reasonable field type\n */\nexport function guessFieldTypeFromNameAndValue(name: string, v: any): FieldType {\n if (name) {\n name = name.toLowerCase();\n if (name === 'date' || name === 'time') {\n return FieldType.time;\n }\n }\n return guessFieldTypeFromValue(v);\n}\n\n/**\n * Check the field type to see what the contents are\n */\nexport function getFieldTypeFromValue(v: any): FieldType {\n if (v instanceof Date || isDateTime(v)) {\n return FieldType.time;\n }\n\n if (isNumber(v)) {\n return FieldType.number;\n }\n\n if (isString(v)) {\n return FieldType.string;\n }\n\n if (isBoolean(v)) {\n return FieldType.boolean;\n }\n\n return FieldType.other;\n}\n\n/**\n * Given a value this will guess the best column type\n *\n * NOTE: this is will try to see if string values can be mapped to other types (like number)\n */\nexport function guessFieldTypeFromValue(v: any): FieldType {\n if (v instanceof Date || isDateTime(v)) {\n return FieldType.time;\n }\n\n if (isNumber(v)) {\n return FieldType.number;\n }\n\n if (isString(v)) {\n if (NUMBER.test(v)) {\n return FieldType.number;\n }\n\n if (v === 'true' || v === 'TRUE' || v === 'True' || v === 'false' || v === 'FALSE' || v === 'False') {\n return FieldType.boolean;\n }\n\n return FieldType.string;\n }\n\n if (isBoolean(v)) {\n return FieldType.boolean;\n }\n\n return FieldType.other;\n}\n\n/**\n * Looks at the data to guess the column type. This ignores any existing setting\n */\nexport function guessFieldTypeForField(field: Field): FieldType | undefined {\n // 1. Use the column name to guess\n if (field.name) {\n const name = field.name.toLowerCase();\n if (name === 'date' || name === 'time') {\n return FieldType.time;\n }\n }\n\n // 2. Check the first non-null value\n for (let i = 0; i < field.values.length; i++) {\n const v = field.values.get(i);\n if (v != null) {\n return guessFieldTypeFromValue(v);\n }\n }\n\n // Could not find anything\n return undefined;\n}\n\n/**\n * @returns A copy of the series with the best guess for each field type.\n * If the series already has field types defined, they will be used, unless `guessDefined` is true.\n * @param series The DataFrame whose field's types should be guessed\n * @param guessDefined Whether to guess types of fields with already defined types\n */\nexport const guessFieldTypes = (series: DataFrame, guessDefined = false): DataFrame => {\n for (const field of series.fields) {\n if (!field.type || field.type === FieldType.other || guessDefined) {\n // Something is missing a type, return a modified copy\n return {\n ...series,\n fields: series.fields.map((field) => {\n if (field.type && field.type !== FieldType.other && !guessDefined) {\n return field;\n }\n // Calculate a reasonable schema value\n return {\n ...field,\n type: guessFieldTypeForField(field) || FieldType.other,\n };\n }),\n };\n }\n }\n // No changes necessary\n return series;\n};\n\nexport const isTableData = (data: any): data is DataFrame => data && data.hasOwnProperty('columns');\n\nexport const isDataFrame = (data: any): data is DataFrame => data && data.hasOwnProperty('fields');\n\n/**\n * Inspect any object and return the results as a DataFrame\n */\nexport function toDataFrame(data: any): DataFrame {\n if ('fields' in data) {\n // DataFrameDTO does not have length\n if ('length' in data && data.fields[0]?.values?.get) {\n return data as DataFrame;\n }\n\n // This will convert the array values into Vectors\n return new MutableDataFrame(data as DataFrameDTO);\n }\n\n // Handle legacy docs/json type\n if (data.hasOwnProperty('type') && data.type === 'docs') {\n return convertJSONDocumentDataToDataFrame(data);\n }\n\n if (data.hasOwnProperty('datapoints') || data.hasOwnProperty('points')) {\n return convertTimeSeriesToDataFrame(data);\n }\n\n if (data.hasOwnProperty('data')) {\n if (data.hasOwnProperty('schema')) {\n return dataFrameFromJSON(data);\n }\n return convertGraphSeriesToDataFrame(data);\n }\n\n if (data.hasOwnProperty('columns')) {\n return convertTableToDataFrame(data);\n }\n\n if (Array.isArray(data)) {\n return new ArrayDataFrame(data);\n }\n\n console.warn('Can not convert', data);\n throw new Error('Unsupported data format');\n}\n\nexport const toLegacyResponseData = (frame: DataFrame): TimeSeries | TableData => {\n const { fields } = frame;\n\n const rowCount = frame.length;\n const rows: any[][] = [];\n\n if (fields.length === 2) {\n const { timeField, timeIndex } = getTimeField(frame);\n if (timeField) {\n const valueIndex = timeIndex === 0 ? 1 : 0;\n const valueField = fields[valueIndex];\n const timeField = fields[timeIndex!];\n\n // Make sure it is [value,time]\n for (let i = 0; i < rowCount; i++) {\n rows.push([\n valueField.values.get(i), // value\n timeField.values.get(i), // time\n ]);\n }\n\n return {\n alias: frame.name,\n target: getFieldDisplayName(valueField, frame),\n datapoints: rows,\n unit: fields[0].config ? fields[0].config.unit : undefined,\n refId: frame.refId,\n meta: frame.meta,\n } as TimeSeries;\n }\n }\n\n for (let i = 0; i < rowCount; i++) {\n const row: any[] = [];\n for (let j = 0; j < fields.length; j++) {\n row.push(fields[j].values.get(i));\n }\n rows.push(row);\n }\n\n if (frame.meta && frame.meta.json) {\n return {\n alias: fields[0].name || frame.name,\n target: fields[0].name || frame.name,\n datapoints: fields[0].values.toArray(),\n filterable: fields[0].config ? fields[0].config.filterable : undefined,\n type: 'docs',\n } as TimeSeries;\n }\n\n return {\n columns: fields.map((f) => {\n const { name, config } = f;\n if (config) {\n // keep unit etc\n const { ...column } = config;\n (column as Column).text = name;\n return column as Column;\n }\n return { text: name };\n }),\n type: 'table',\n refId: frame.refId,\n meta: frame.meta,\n rows,\n };\n};\n\nexport function sortDataFrame(data: DataFrame, sortIndex?: number, reverse = false): DataFrame {\n const field = data.fields[sortIndex!];\n if (!field) {\n return data;\n }\n\n // Natural order\n const index: number[] = [];\n for (let i = 0; i < data.length; i++) {\n index.push(i);\n }\n\n const fieldComparer = fieldIndexComparer(field, reverse);\n index.sort(fieldComparer);\n\n return {\n ...data,\n fields: data.fields.map((f) => {\n return {\n ...f,\n values: new SortedVector(f.values, index),\n };\n }),\n };\n}\n\n/**\n * Returns a copy with all values reversed\n */\nexport function reverseDataFrame(data: DataFrame): DataFrame {\n return {\n ...data,\n fields: data.fields.map((f) => {\n const copy = [...f.values.toArray()];\n copy.reverse();\n return {\n ...f,\n values: new ArrayVector(copy),\n };\n }),\n };\n}\n\n/**\n * Wrapper to get an array from each field value\n */\nexport function getDataFrameRow(data: DataFrame, row: number): any[] {\n const values: any[] = [];\n for (const field of data.fields) {\n values.push(field.values.get(row));\n }\n return values;\n}\n\n/**\n * Returns a copy that does not include functions\n */\nexport function toDataFrameDTO(data: DataFrame): DataFrameDTO {\n return toFilteredDataFrameDTO(data);\n}\n\nexport function toFilteredDataFrameDTO(data: DataFrame, fieldPredicate?: (f: Field) => boolean): DataFrameDTO {\n const filteredFields = fieldPredicate ? data.fields.filter(fieldPredicate) : data.fields;\n const fields: FieldDTO[] = filteredFields.map((f) => {\n let values = f.values.toArray();\n // The byte buffers serialize like objects\n if (values instanceof Float64Array) {\n values = vectorToArray(f.values);\n }\n return {\n name: f.name,\n type: f.type,\n config: f.config,\n values,\n labels: f.labels,\n };\n });\n\n return {\n fields,\n refId: data.refId,\n meta: data.meta,\n name: data.name,\n };\n}\n\nexport const getTimeField = (series: DataFrame): { timeField?: Field; timeIndex?: number } => {\n for (let i = 0; i < series.fields.length; i++) {\n if (series.fields[i].type === FieldType.time) {\n return {\n timeField: series.fields[i],\n timeIndex: i,\n };\n }\n }\n return {};\n};\n","import { DataFrame, FieldType } from '../types/dataFrame';\n\nimport { getTimeField } from './processDataFrame';\n\nexport function isTimeSerie(frame: DataFrame) {\n if (frame.fields.length > 2) {\n return false;\n }\n return Boolean(frame.fields.find((field) => field.type === FieldType.time));\n}\n\nexport function isTimeSeries(data: DataFrame[]) {\n return !data.find((frame) => !isTimeSerie(frame));\n}\n\n/**\n * Indicates if there is any time field in the array of data frames\n * @param data\n */\nexport function anySeriesWithTimeField(data: DataFrame[]) {\n for (let i = 0; i < data.length; i++) {\n const timeField = getTimeField(data[i]);\n if (timeField.timeField !== undefined && timeField.timeIndex !== undefined) {\n return true;\n }\n }\n return false;\n}\n","import { TimeZone, DefaultTimeZone } from '../types/time';\n\n/**\n * Used for helper functions handling time zones.\n *\n * @public\n */\nexport interface TimeZoneOptions {\n /**\n * Specify this if you want to override the timeZone used when parsing or formatting\n * a date and time value. If no timeZone is set, the default timeZone for the current\n * user is used.\n */\n timeZone?: TimeZone;\n}\n\n/**\n * The type describing date and time options. Used for all the helper functions\n * available to parse or format date and time values.\n *\n * @public\n */\nexport interface DateTimeOptions extends TimeZoneOptions {\n /**\n * Specify a {@link https://momentjs.com/docs/#/displaying/format | momentjs} format to\n * use a custom formatting pattern or parsing pattern. If no format is set,\n * then system configured default format is used.\n */\n format?: string;\n}\n\n/**\n * The type to describe the time zone resolver function that will be used to access\n * the default time zone of a user.\n *\n * @public\n */\nexport type TimeZoneResolver = () => TimeZone | undefined;\n\nlet defaultTimeZoneResolver: TimeZoneResolver = () => DefaultTimeZone;\n\n/**\n * Used by Grafana internals to set the {@link TimeZoneResolver} to access the current\n * user timeZone.\n *\n * @internal\n */\nexport const setTimeZoneResolver = (resolver: TimeZoneResolver) => {\n defaultTimeZoneResolver = resolver ?? defaultTimeZoneResolver;\n};\n\n/**\n * Used to get the current selected time zone. If a valid time zone is passed in the\n * options it will be returned. If no valid time zone is passed either the time zone\n * configured for the user account will be returned or the default for Grafana.\n *\n * @public\n */\nexport const getTimeZone = <T extends TimeZoneOptions>(options?: T): TimeZone => {\n return options?.timeZone ?? defaultTimeZoneResolver() ?? DefaultTimeZone;\n};\n","import { includes, isDate } from 'lodash';\n\nimport { TimeZone } from '../types/index';\n\nimport { DateTime, dateTime, dateTimeForTimeZone, DurationUnit, isDateTime, ISO_8601 } from './moment_wrapper';\n\nconst units: DurationUnit[] = ['y', 'M', 'w', 'd', 'h', 'm', 's', 'Q'];\n\n/**\n * Determine if a string contains a relative date time.\n * @param text\n */\nexport function isMathString(text: string | DateTime | Date): boolean {\n if (!text) {\n return false;\n }\n\n if (typeof text === 'string' && (text.substring(0, 3) === 'now' || text.includes('||'))) {\n return true;\n } else {\n return false;\n }\n}\n\n/**\n * Parses different types input to a moment instance. There is a specific formatting language that can be used\n * if text arg is string. See unit tests for examples.\n * @param text\n * @param roundUp See parseDateMath function.\n * @param timezone Only string 'utc' is acceptable here, for anything else, local timezone is used.\n */\nexport function parse(\n text?: string | DateTime | Date | null,\n roundUp?: boolean,\n timezone?: TimeZone,\n fiscalYearStartMonth?: number\n): DateTime | undefined {\n if (!text) {\n return undefined;\n }\n\n if (typeof text !== 'string') {\n if (isDateTime(text)) {\n return text;\n }\n if (isDate(text)) {\n return dateTime(text);\n }\n // We got some non string which is not a moment nor Date. TS should be able to check for that but not always.\n return undefined;\n } else {\n let time;\n let mathString = '';\n let index;\n let parseString;\n\n if (text.substring(0, 3) === 'now') {\n time = dateTimeForTimeZone(timezone);\n mathString = text.substring('now'.length);\n } else {\n index = text.indexOf('||');\n if (index === -1) {\n parseString = text;\n mathString = ''; // nothing else\n } else {\n parseString = text.substring(0, index);\n mathString = text.substring(index + 2);\n }\n // We're going to just require ISO8601 timestamps, k?\n time = dateTime(parseString, ISO_8601);\n }\n\n if (!mathString.length) {\n return time;\n }\n\n return parseDateMath(mathString, time, roundUp, fiscalYearStartMonth);\n }\n}\n\n/**\n * Checks if text is a valid date which in this context means that it is either a Moment instance or it can be parsed\n * by parse function. See parse function to see what is considered acceptable.\n * @param text\n */\nexport function isValid(text: string | DateTime): boolean {\n const date = parse(text);\n if (!date) {\n return false;\n }\n\n if (isDateTime(date)) {\n return date.isValid();\n }\n\n return false;\n}\n\n/**\n * Parses math part of the time string and shifts supplied time according to that math. See unit tests for examples.\n * @param mathString\n * @param time\n * @param roundUp If true it will round the time to endOf time unit, otherwise to startOf time unit.\n */\n// TODO: Had to revert Andrejs `time: moment.Moment` to `time: any`\nexport function parseDateMath(\n mathString: string,\n time: any,\n roundUp?: boolean,\n fiscalYearStartMonth = 0\n): DateTime | undefined {\n const strippedMathString = mathString.replace(/\\s/g, '');\n const dateTime = time;\n let i = 0;\n const len = strippedMathString.length;\n\n while (i < len) {\n const c = strippedMathString.charAt(i++);\n let type;\n let num;\n let unit;\n let isFiscal = false;\n\n if (c === '/') {\n type = 0;\n } else if (c === '+') {\n type = 1;\n } else if (c === '-') {\n type = 2;\n } else {\n return undefined;\n }\n\n if (isNaN(parseInt(strippedMathString.charAt(i), 10))) {\n num = 1;\n } else if (strippedMathString.length === 2) {\n num = parseInt(strippedMathString.charAt(i), 10);\n } else {\n const numFrom = i;\n while (!isNaN(parseInt(strippedMathString.charAt(i), 10))) {\n i++;\n if (i > 10) {\n return undefined;\n }\n }\n num = parseInt(strippedMathString.substring(numFrom, i), 10);\n }\n\n if (type === 0) {\n // rounding is only allowed on whole, single, units (eg M or 1M, not 0.5M or 2M)\n if (num !== 1) {\n return undefined;\n }\n }\n unit = strippedMathString.charAt(i++);\n\n if (unit === 'f') {\n unit = strippedMathString.charAt(i++);\n isFiscal = true;\n }\n\n if (!includes(units, unit)) {\n return undefined;\n } else {\n if (type === 0) {\n if (roundUp) {\n if (isFiscal) {\n roundToFiscal(fiscalYearStartMonth, dateTime, unit, roundUp);\n } else {\n dateTime.endOf(unit);\n }\n } else {\n if (isFiscal) {\n roundToFiscal(fiscalYearStartMonth, dateTime, unit, roundUp);\n } else {\n dateTime.startOf(unit);\n }\n }\n } else if (type === 1) {\n dateTime.add(num, unit);\n } else if (type === 2) {\n dateTime.subtract(num, unit);\n }\n }\n }\n return dateTime;\n}\n\nexport function roundToFiscal(fyStartMonth: number, dateTime: any, unit: string, roundUp: boolean | undefined) {\n switch (unit) {\n case 'y':\n if (roundUp) {\n roundToFiscal(fyStartMonth, dateTime, unit, false).add(11, 'M').endOf('M');\n } else {\n dateTime.subtract((dateTime.month() - fyStartMonth + 12) % 12, 'M').startOf('M');\n }\n return dateTime;\n case 'Q':\n if (roundUp) {\n roundToFiscal(fyStartMonth, dateTime, unit, false).add(2, 'M').endOf('M');\n } else {\n dateTime.subtract((dateTime.month() - fyStartMonth + 3) % 3, 'M').startOf('M');\n }\n return dateTime;\n default:\n return undefined;\n }\n}\n","export interface SystemDateFormatSettings {\n fullDate: string;\n interval: {\n millisecond: string;\n second: string;\n minute: string;\n hour: string;\n day: string;\n month: string;\n year: string;\n };\n useBrowserLocale: boolean;\n}\n\nconst DEFAULT_SYSTEM_DATE_FORMAT = 'YYYY-MM-DD HH:mm:ss';\nconst DEFAULT_SYSTEM_DATE_MS_FORMAT = 'YYYY-MM-DD HH:mm:ss.SSS';\n\nexport class SystemDateFormatsState {\n fullDate = DEFAULT_SYSTEM_DATE_FORMAT;\n fullDateMS = DEFAULT_SYSTEM_DATE_MS_FORMAT;\n interval = {\n millisecond: 'HH:mm:ss.SSS',\n second: 'HH:mm:ss',\n minute: 'HH:mm',\n hour: 'MM/DD HH:mm',\n day: 'MM/DD',\n month: 'YYYY-MM',\n year: 'YYYY',\n };\n\n update(settings: SystemDateFormatSettings) {\n this.fullDate = settings.fullDate;\n this.interval = settings.interval;\n\n if (settings.useBrowserLocale) {\n this.useBrowserLocale();\n }\n }\n\n useBrowserLocale() {\n this.fullDate = localTimeFormat({\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n\n // ES5 doesn't support `DateTimeFormatOptions.fractionalSecondDigits` so we have to use\n // a hack with string replacement.\n this.fullDateMS = this.fullDate.replace('ss', 'ss.SSS');\n\n this.interval.millisecond = localTimeFormat(\n { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false },\n null,\n this.interval.second\n ).replace('ss', 'ss.SSS');\n this.interval.second = localTimeFormat(\n { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false },\n null,\n this.interval.second\n );\n this.interval.minute = localTimeFormat(\n { hour: '2-digit', minute: '2-digit', hour12: false },\n null,\n this.interval.minute\n );\n this.interval.hour = localTimeFormat(\n { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false },\n null,\n this.interval.hour\n );\n this.interval.day = localTimeFormat({ month: '2-digit', day: '2-digit', hour12: false }, null, this.interval.day);\n this.interval.month = localTimeFormat(\n { year: 'numeric', month: '2-digit', hour12: false },\n null,\n this.interval.month\n );\n }\n\n getTimeFieldUnit(useMsResolution?: boolean) {\n return `time:${useMsResolution ? this.fullDateMS : this.fullDate}`;\n }\n}\n\n/**\n * localTimeFormat helps to generate date formats for momentjs based on browser's locale\n *\n * @param locale browser locale, or default\n * @param options DateTimeFormatOptions to format date\n * @param fallback default format if Intl API is not present\n */\nexport function localTimeFormat(\n options: Intl.DateTimeFormatOptions,\n locale?: string | string[] | null,\n fallback?: string\n): string {\n if (missingIntlDateTimeFormatSupport()) {\n return fallback ?? DEFAULT_SYSTEM_DATE_FORMAT;\n }\n\n if (!locale && navigator) {\n locale = [...navigator.languages];\n }\n\n // https://momentjs.com/docs/#/displaying/format/\n const dateTimeFormat = new Intl.DateTimeFormat(locale || undefined, options);\n const parts = dateTimeFormat.formatToParts(new Date());\n const hour12 = dateTimeFormat.resolvedOptions().hour12;\n\n const mapping: { [key: string]: string } = {\n year: 'YYYY',\n month: 'MM',\n day: 'DD',\n hour: hour12 ? 'hh' : 'HH',\n minute: 'mm',\n second: 'ss',\n weekday: 'ddd',\n era: 'N',\n dayPeriod: 'A',\n timeZoneName: 'Z',\n };\n\n return parts.map((part) => mapping[part.type] || part.value).join('');\n}\n\nexport const systemDateFormats = new SystemDateFormatsState();\n\nconst missingIntlDateTimeFormatSupport = (): boolean => {\n return !('DateTimeFormat' in Intl) || !('formatToParts' in Intl.DateTimeFormat.prototype);\n};\n","/* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */\nimport moment, { MomentInput, Moment } from 'moment-timezone';\n\nimport { TimeZone } from '../types';\n\nimport { DateTimeOptions, getTimeZone } from './common';\nimport { systemDateFormats } from './formats';\nimport { DateTimeInput } from './moment_wrapper';\n\n/**\n * The type describing the options that can be passed to the {@link dateTimeFormat}\n * helper function to control how the date and time value passed to the function is\n * formatted.\n *\n * @public\n */\nexport interface DateTimeOptionsWithFormat extends DateTimeOptions {\n /**\n * Set this value to `true` if you want to include milliseconds when formatting date and time\n */\n defaultWithMS?: boolean;\n}\n\ntype DateTimeFormatter<T extends DateTimeOptions = DateTimeOptions> = (dateInUtc: DateTimeInput, options?: T) => string;\n\n/**\n * Helper function to format date and time according to the specified options. If no options\n * are supplied, then default values are used. For more details, see {@link DateTimeOptionsWithFormat}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormat: DateTimeFormatter<DateTimeOptionsWithFormat> = (dateInUtc, options?) =>\n toTz(dateInUtc, getTimeZone(options)).format(getFormat(options));\n\n/**\n * Helper function to format date and time according to the standard ISO format e.g. 2013-02-04T22:44:30.652Z.\n * If no options are supplied, then default values are used. For more details, see {@link DateTimeOptionsWithFormat}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormatISO: DateTimeFormatter = (dateInUtc, options?) =>\n toTz(dateInUtc, getTimeZone(options)).format();\n\n/**\n * Helper function to return elapsed time since passed date. The returned value will be formatted\n * in a human readable format e.g. 4 years ago. If no options are supplied, then default values are used.\n * For more details, see {@link DateTimeOptions}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormatTimeAgo: DateTimeFormatter = (dateInUtc, options?) =>\n toTz(dateInUtc, getTimeZone(options)).fromNow();\n\n/**\n * Helper function to format date and time according to the Grafana default formatting, but it\n * also appends the time zone abbreviation at the end e.g. 2020-05-20 13:37:00 CET. If no options\n * are supplied, then default values are used. For more details please see {@link DateTimeOptions}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const dateTimeFormatWithAbbrevation: DateTimeFormatter = (dateInUtc, options?) =>\n toTz(dateInUtc, getTimeZone(options)).format(`${systemDateFormats.fullDate} z`);\n\n/**\n * Helper function to return only the time zone abbreviation for a given date and time value. If no options\n * are supplied, then default values are used. For more details please see {@link DateTimeOptions}.\n *\n * @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.\n * @param options\n *\n * @public\n */\nexport const timeZoneAbbrevation: DateTimeFormatter = (dateInUtc, options?) =>\n toTz(dateInUtc, getTimeZone(options)).format('z');\n\nconst getFormat = <T extends DateTimeOptionsWithFormat>(options?: T): string => {\n if (options?.defaultWithMS) {\n return options?.format ?? systemDateFormats.fullDateMS;\n }\n return options?.format ?? systemDateFormats.fullDate;\n};\n\nconst toTz = (dateInUtc: DateTimeInput, timeZone: TimeZone): Moment => {\n const date = dateInUtc as MomentInput;\n const zone = moment.tz.zone(timeZone);\n\n if (zone && zone.name) {\n return moment.utc(date).tz(zone.name);\n }\n\n switch (timeZone) {\n case 'utc':\n return moment.utc(date);\n default:\n return moment.utc(date).local();\n }\n};\n","import { memoize } from 'lodash';\nimport moment from 'moment-timezone';\n\nimport { TimeZone } from '../types';\n\nimport { getTimeZone } from './common';\n\nexport enum InternalTimeZones {\n default = '',\n localBrowserTime = 'browser',\n utc = 'utc',\n}\n\nexport const timeZoneFormatUserFriendly = (timeZone: TimeZone | undefined) => {\n switch (getTimeZone({ timeZone })) {\n case 'browser':\n return 'Local browser time';\n case 'utc':\n return 'UTC';\n default:\n return timeZone;\n }\n};\n\nexport interface TimeZoneCountry {\n code: string;\n name: string;\n}\nexport interface TimeZoneInfo {\n name: string;\n zone: string;\n countries: TimeZoneCountry[];\n abbreviation: string;\n offsetInMins: number;\n ianaName: string;\n}\n\nexport interface GroupedTimeZones {\n name: string;\n zones: TimeZone[];\n}\n\nexport const getTimeZoneInfo = (zone: string, timestamp: number): TimeZoneInfo | undefined => {\n const internal = mapInternal(zone, timestamp);\n\n if (internal) {\n return internal;\n }\n\n return mapToInfo(zone, timestamp);\n};\n\nexport const getTimeZones = memoize((includeInternal: boolean | InternalTimeZones[] = false): TimeZone[] => {\n const initial: TimeZone[] = [];\n\n if (includeInternal === true) {\n initial.push(InternalTimeZones.default, InternalTimeZones.localBrowserTime, InternalTimeZones.utc);\n } else if (includeInternal) {\n initial.push(...includeInternal);\n }\n\n return moment.tz.names().reduce((zones: TimeZone[], zone: string) => {\n const countriesForZone = countriesByTimeZone[zone];\n\n if (!Array.isArray(countriesForZone) || countriesForZone.length === 0) {\n return zones;\n }\n\n zones.push(zone);\n return zones;\n }, initial);\n});\n\nexport const getTimeZoneGroups = memoize(\n (includeInternal: boolean | InternalTimeZones[] = false): GroupedTimeZones[] => {\n const timeZones = getTimeZones(includeInternal);\n\n const groups = timeZones.reduce((groups: Record<string, TimeZone[]>, zone: TimeZone) => {\n const delimiter = zone.indexOf('/');\n\n if (delimiter === -1) {\n const group = '';\n groups[group] = groups[group] ?? [];\n groups[group].push(zone);\n\n return groups;\n }\n\n const group = zone.slice(0, delimiter);\n groups[group] = groups[group] ?? [];\n groups[group].push(zone);\n\n return groups;\n }, {});\n\n return Object.keys(groups).map((name) => ({\n name,\n zones: groups[name],\n }));\n }\n);\n\nconst mapInternal = (zone: string, timestamp: number): TimeZoneInfo | undefined => {\n switch (zone) {\n case InternalTimeZones.utc: {\n return {\n name: 'Coordinated Universal Time',\n ianaName: 'UTC',\n zone,\n countries: [],\n abbreviation: 'UTC, GMT',\n offsetInMins: 0,\n };\n }\n\n case InternalTimeZones.default: {\n const tz = getTimeZone();\n const isInternal = tz === 'browser' || tz === 'utc';\n const info = (isInternal ? mapInternal(tz, timestamp) : mapToInfo(tz, timestamp)) ?? {};\n\n return {\n countries: countriesByTimeZone[tz] ?? [],\n abbreviation: '',\n offsetInMins: 0,\n ...info,\n ianaName: (info as TimeZoneInfo).ianaName,\n name: 'Default',\n zone,\n };\n }\n\n case InternalTimeZones.localBrowserTime: {\n const tz = moment.tz.guess(true);\n const info = mapToInfo(tz, timestamp) ?? {};\n\n return {\n countries: countriesByTimeZone[tz] ?? [],\n abbreviation: 'Your local time',\n offsetInMins: new Date().getTimezoneOffset(),\n ...info,\n name: 'Browser Time',\n ianaName: (info as TimeZoneInfo).ianaName,\n zone,\n };\n }\n\n default:\n return undefined;\n }\n};\n\nconst abbrevationWithoutOffset = (abbrevation: string): string => {\n if (/^(\\+|\\-).+/.test(abbrevation)) {\n return '';\n }\n return abbrevation;\n};\n\nconst mapToInfo = (timeZone: TimeZone, timestamp: number): TimeZoneInfo | undefined => {\n const momentTz = moment.tz.zone(timeZone);\n if (!momentTz) {\n return undefined;\n }\n\n return {\n name: timeZone,\n ianaName: momentTz.name,\n zone: timeZone,\n countries: countriesByTimeZone[timeZone] ?? [],\n abbreviation: abbrevationWithoutOffset(momentTz.abbr(timestamp)),\n offsetInMins: momentTz.utcOffset(timestamp),\n };\n};\n\n// Country names by ISO 3166-1-alpha-2 code\nconst countryByCode: Record<string, string> = {\n AF: 'Afghanistan',\n AX: 'Aland Islands',\n AL: 'Albania',\n DZ: 'Algeria',\n AS: 'American Samoa',\n AD: 'Andorra',\n AO: 'Angola',\n AI: 'Anguilla',\n AQ: 'Antarctica',\n AG: 'Antigua And Barbuda',\n AR: 'Argentina',\n AM: 'Armenia',\n AW: 'Aruba',\n AU: 'Australia',\n AT: 'Austria',\n AZ: 'Azerbaijan',\n BS: 'Bahamas',\n BH: 'Bahrain',\n BD: 'Bangladesh',\n BB: 'Barbados',\n BY: 'Belarus',\n BE: 'Belgium',\n BZ: 'Belize',\n BJ: 'Benin',\n BM: 'Bermuda',\n BT: 'Bhutan',\n BO: 'Bolivia',\n BA: 'Bosnia And Herzegovina',\n BW: 'Botswana',\n BV: 'Bouvet Island',\n BR: 'Brazil',\n IO: 'British Indian Ocean Territory',\n BN: 'Brunei Darussalam',\n BG: 'Bulgaria',\n BF: 'Burkina Faso',\n BI: 'Burundi',\n KH: 'Cambodia',\n CM: 'Cameroon',\n CA: 'Canada',\n CV: 'Cape Verde',\n KY: 'Cayman Islands',\n CF: 'Central African Republic',\n TD: 'Chad',\n CL: 'Chile',\n CN: 'China',\n CX: 'Christmas Island',\n CC: 'Cocos (Keeling) Islands',\n CO: 'Colombia',\n KM: 'Comoros',\n CG: 'Congo',\n CD: 'Congo, Democratic Republic',\n CK: 'Cook Islands',\n CR: 'Costa Rica',\n CI: \"Cote D'Ivoire\",\n HR: 'Croatia',\n CU: 'Cuba',\n CY: 'Cyprus',\n CZ: 'Czech Republic',\n DK: 'Denmark',\n DJ: 'Djibouti',\n DM: 'Dominica',\n DO: 'Dominican Republic',\n EC: 'Ecuador',\n EG: 'Egypt',\n SV: 'El Salvador',\n GQ: 'Equatorial Guinea',\n ER: 'Eritrea',\n EE: 'Estonia',\n ET: 'Ethiopia',\n FK: 'Falkland Islands (Malvinas)',\n FO: 'Faroe Islands',\n FJ: 'Fiji',\n FI: 'Finland',\n FR: 'France',\n GF: 'French Guiana',\n PF: 'French Polynesia',\n TF: 'French Southern Territories',\n GA: 'Gabon',\n GM: 'Gambia',\n GE: 'Georgia',\n DE: 'Germany',\n GH: 'Ghana',\n GI: 'Gibraltar',\n GR: 'Greece',\n GL: 'Greenland',\n GD: 'Grenada',\n GP: 'Guadeloupe',\n GU: 'Guam',\n GT: 'Guatemala',\n GG: 'Guernsey',\n GN: 'Guinea',\n GW: 'Guinea-Bissau',\n GY: 'Guyana',\n HT: 'Haiti',\n HM: 'Heard Island & Mcdonald Islands',\n VA: 'Holy See (Vatican City State)',\n HN: 'Honduras',\n HK: 'Hong Kong',\n HU: 'Hungary',\n IS: 'Iceland',\n IN: 'India',\n ID: 'Indonesia',\n IR: 'Iran (Islamic Republic Of)',\n IQ: 'Iraq',\n IE: 'Ireland',\n IM: 'Isle Of Man',\n IL: 'Israel',\n IT: 'Italy',\n JM: 'Jamaica',\n JP: 'Japan',\n JE: 'Jersey',\n JO: 'Jordan',\n KZ: 'Kazakhstan',\n KE: 'Kenya',\n KI: 'Kiribati',\n KR: 'Korea',\n KW: 'Kuwait',\n KG: 'Kyrgyzstan',\n LA: \"Lao People's Democratic Republic\",\n LV: 'Latvia',\n LB: 'Lebanon',\n LS: 'Lesotho',\n LR: 'Liberia',\n LY: 'Libyan Arab Jamahiriya',\n LI: 'Liechtenstein',\n LT: 'Lithuania',\n LU: 'Luxembourg',\n MO: 'Macao',\n MK: 'Macedonia',\n MG: 'Madagascar',\n MW: 'Malawi',\n MY: 'Malaysia',\n MV: 'Maldives',\n ML: 'Mali',\n MT: 'Malta',\n MH: 'Marshall Islands',\n MQ: 'Martinique',\n MR: 'Mauritania',\n MU: 'Mauritius',\n YT: 'Mayotte',\n MX: 'Mexico',\n FM: 'Micronesia (Federated States Of)',\n MD: 'Moldova',\n MC: 'Monaco',\n MN: 'Mongolia',\n ME: 'Montenegro',\n MS: 'Montserrat',\n MA: 'Morocco',\n MZ: 'Mozambique',\n MM: 'Myanmar',\n NA: 'Namibia',\n NR: 'Nauru',\n NP: 'Nepal',\n NL: 'Netherlands',\n AN: 'Netherlands Antilles',\n NC: 'New Caledonia',\n NZ: 'New Zealand',\n NI: 'Nicaragua',\n NE: 'Niger',\n NG: 'Nigeria',\n NU: 'Niue',\n NF: 'Norfolk Island',\n MP: 'Northern Mariana Islands',\n NO: 'Norway',\n OM: 'Oman',\n PK: 'Pakistan',\n PW: 'Palau',\n PS: 'Palestine, State of',\n PA: 'Panama',\n PG: 'Papua New Guinea',\n PY: 'Paraguay',\n PE: 'Peru',\n PH: 'Philippines',\n PN: 'Pitcairn',\n PL: 'Poland',\n PT: 'Portugal',\n PR: 'Puerto Rico',\n QA: 'Qatar',\n RE: 'Reunion',\n RO: 'Romania',\n RU: 'Russian Federation',\n RW: 'Rwanda',\n BL: 'Saint Barthelemy',\n SH: 'Saint Helena',\n KN: 'Saint Kitts And Nevis',\n LC: 'Saint Lucia',\n MF: 'Saint Martin',\n PM: 'Saint Pierre And Miquelon',\n VC: 'Saint Vincent And Grenadines',\n WS: 'Samoa',\n SM: 'San Marino',\n ST: 'Sao Tome And Principe',\n SA: 'Saudi Arabia',\n SN: 'Senegal',\n RS: 'Serbia',\n SC: 'Seychelles',\n SL: 'Sierra Leone',\n SG: 'Singapore',\n SK: 'Slovakia',\n SI: 'Slovenia',\n SB: 'Solomon Islands',\n SO: 'Somalia',\n ZA: 'South Africa',\n GS: 'South Georgia And Sandwich Isl.',\n ES: 'Spain',\n LK: 'Sri Lanka',\n SD: 'Sudan',\n SR: 'Suriname',\n SJ: 'Svalbard And Jan Mayen',\n SZ: 'Swaziland',\n SE: 'Sweden',\n CH: 'Switzerland',\n SY: 'Syrian Arab Republic',\n TW: 'Taiwan',\n TJ: 'Tajikistan',\n TZ: 'Tanzania',\n TH: 'Thailand',\n TL: 'Timor-Leste',\n TG: 'Togo',\n TK: 'Tokelau',\n TO: 'Tonga',\n TT: 'Trinidad And Tobago',\n TN: 'Tunisia',\n TR: 'Turkey',\n TM: 'Turkmenistan',\n TC: 'Turks And Caicos Islands',\n TV: 'Tuvalu',\n UG: 'Uganda',\n UA: 'Ukraine',\n AE: 'United Arab Emirates',\n GB: 'United Kingdom',\n US: 'United States',\n UM: 'United States Outlying Islands',\n UY: 'Uruguay',\n UZ: 'Uzbekistan',\n VU: 'Vanuatu',\n VE: 'Venezuela',\n VN: 'Viet Nam',\n VG: 'Virgin Islands, British',\n VI: 'Virgin Islands, U.S.',\n WF: 'Wallis And Futuna',\n EH: 'Western Sahara',\n YE: 'Yemen',\n ZM: 'Zambia',\n ZW: 'Zimbabwe',\n};\n\nconst countriesByTimeZone = ((): Record<string, TimeZoneCountry[]> => {\n return moment.tz.countries().reduce((all: Record<string, TimeZoneCountry[]>, code) => {\n const timeZones = moment.tz.zonesForCountry(code);\n return timeZones.reduce((all: Record<string, TimeZoneCountry[]>, timeZone) => {\n if (!all[timeZone]) {\n all[timeZone] = [];\n }\n\n const name = countryByCode[code];\n\n if (!name) {\n return all;\n }\n\n all[timeZone].push({ code, name });\n return all;\n }, all);\n }, {});\n})();\n","import { Duration, Interval } from 'date-fns';\nimport add from 'date-fns/add';\nimport intervalToDuration from 'date-fns/intervalToDuration';\n\nconst durationMap: { [key in Required<keyof Duration>]: string[] } = {\n years: ['y', 'Y', 'years'],\n months: ['M', 'months'],\n weeks: ['w', 'W', 'weeks'],\n days: ['d', 'D', 'days'],\n hours: ['h', 'H', 'hours'],\n minutes: ['m', 'minutes'],\n seconds: ['s', 'S', 'seconds'],\n};\n\n/**\n * intervalToAbbreviatedDurationString converts interval to readable duration string\n *\n * @param interval - interval to convert\n * @param includeSeconds - optional, default true. If false, will not include seconds unless interval is less than 1 minute\n *\n * @public\n */\nexport function intervalToAbbreviatedDurationString(interval: Interval, includeSeconds = true): string {\n const duration = intervalToDuration(interval);\n return (Object.entries(duration) as Array<[keyof Duration, number | undefined]>).reduce((str, [unit, value]) => {\n if (value && value !== 0 && !(unit === 'seconds' && !includeSeconds && str)) {\n const padding = str !== '' ? ' ' : '';\n return str + `${padding}${value}${durationMap[unit][0]}`;\n }\n\n return str;\n }, '');\n}\n\n/**\n * parseDuration parses duration string into datefns Duration object\n *\n * @param durationString - string to convert. For example '2m', '5h 20s'\n *\n * @public\n */\nexport function parseDuration(durationString: string): Duration {\n return durationString.split(' ').reduce<Duration>((acc, value) => {\n const match = value.match(/(\\d+)(.+)/);\n\n const rawLength = match?.[1];\n const unit = match?.[2];\n\n if (!(rawLength && unit)) {\n return acc;\n }\n\n const mapping = Object.entries(durationMap).find(([_, abbreviations]) => abbreviations?.includes(match[2]));\n const length = parseInt(rawLength, 10);\n\n return mapping ? { ...acc, [mapping[0]]: length } : acc;\n }, {});\n}\n\n/**\n * addDurationToDate adds given duration to given date and returns a new Date object\n *\n * @param date - date to add to. Can be either Date object or a number (milliseconds since epoch)\n * @param duration - duration to add. For example '2m', '5h 20s'\n *\n * @public\n */\nexport function addDurationToDate(date: Date | number, duration: Duration): Date {\n return add(date, duration);\n}\n\n/**\n * durationToMilliseconds convert a duration object to milliseconds\n *\n * @param duration - datefns Duration object\n *\n * @public\n */\nexport function durationToMilliseconds(duration: Duration): number {\n const now = new Date();\n return addDurationToDate(now, duration).getTime() - now.getTime();\n}\n\n/**\n * isValidDate returns true if given string can be parsed into valid Date object, false otherwise\n *\n * @param dateString - string representation of a date\n *\n * @public\n */\nexport function isValidDate(dateString: string): boolean {\n return !isNaN(Date.parse(dateString));\n}\n\n/**\n * isValidDuration returns true if the given string can be parsed into a valid Duration object, false otherwise\n *\n * @param durationString - string representation of a duration\n *\n * @public\n */\nexport function isValidDuration(durationString: string): boolean {\n for (const value of durationString.trim().split(' ')) {\n const match = value.match(/(\\d+)(.+)/);\n if (match === null || match.length !== 3) {\n return false;\n }\n\n const key = Object.entries(durationMap).find(([_, abbreviations]) => abbreviations?.includes(match[2]))?.[0];\n if (!key) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * isValidGoDuration returns true if the given string can be parsed into a valid Duration object based on\n * Go's time.parseDuration, false otherwise.\n *\n * Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n *\n * Go docs: https://pkg.go.dev/time#ParseDuration\n *\n * @param durationString - string representation of a duration\n *\n * @internal\n */\nexport function isValidGoDuration(durationString: string): boolean {\n const timeUnits = ['h', 'm', 's', 'ms', 'us', 'µs', 'ns'];\n for (const value of durationString.trim().split(' ')) {\n const match = value.match(/([0-9]*[.]?[0-9]+)(.+)/);\n if (match === null || match.length !== 3) {\n return false;\n }\n\n const isValidUnit = timeUnits.includes(match[2]);\n if (!isValidUnit) {\n return false;\n }\n }\n\n return true;\n}\n","import moment, { Moment, MomentInput, DurationInputArg1, DurationInputArg2 } from 'moment';\n\nimport { TimeZone } from '../types/time';\n/* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */\nexport interface DateTimeBuiltinFormat {\n __momentBuiltinFormatBrand: any;\n}\nexport const ISO_8601: DateTimeBuiltinFormat = moment.ISO_8601;\nexport type DateTimeInput = Date | string | number | Array<string | number> | DateTime | null; // | undefined;\nexport type FormatInput = string | DateTimeBuiltinFormat | undefined;\nexport type DurationInput = string | number | DateTimeDuration;\nexport type DurationUnit =\n | 'year'\n | 'years'\n | 'y'\n | 'month'\n | 'months'\n | 'M'\n | 'week'\n | 'weeks'\n | 'isoWeek'\n | 'w'\n | 'day'\n | 'days'\n | 'd'\n | 'hour'\n | 'hours'\n | 'h'\n | 'minute'\n | 'minutes'\n | 'm'\n | 'second'\n | 'seconds'\n | 's'\n | 'millisecond'\n | 'milliseconds'\n | 'ms'\n | 'quarter'\n | 'quarters'\n | 'Q';\n\nexport interface DateTimeLocale {\n firstDayOfWeek: () => number;\n}\n\nexport interface DateTimeDuration {\n asHours: () => number;\n hours: () => number;\n minutes: () => number;\n seconds: () => number;\n asSeconds: () => number;\n}\n\nexport interface DateTime extends Object {\n add: (amount?: DateTimeInput, unit?: DurationUnit) => DateTime;\n set: (unit: DurationUnit, amount: DateTimeInput) => void;\n diff: (amount: DateTimeInput, unit?: DurationUnit, truncate?: boolean) => number;\n endOf: (unitOfTime: DurationUnit) => DateTime;\n format: (formatInput?: FormatInput) => string;\n fromNow: (withoutSuffix?: boolean) => string;\n from: (formaInput: DateTimeInput) => string;\n isSame: (input?: DateTimeInput, granularity?: DurationUnit) => boolean;\n isBefore: (input?: DateTimeInput) => boolean;\n isValid: () => boolean;\n local: () => DateTime;\n locale: (locale: string) => DateTime;\n startOf: (unitOfTime: DurationUnit) => DateTime;\n subtract: (amount?: DateTimeInput, unit?: DurationUnit) => DateTime;\n toDate: () => Date;\n toISOString: () => string;\n isoWeekday: (day?: number | string) => number | string;\n valueOf: () => number;\n unix: () => number;\n utc: () => DateTime;\n utcOffset: () => number;\n hour?: () => number;\n minute?: () => number;\n}\n\nexport const setLocale = (language: string) => {\n moment.locale(language);\n};\n\nexport const getLocale = () => {\n return moment.locale();\n};\n\nexport const getLocaleData = (): DateTimeLocale => {\n return moment.localeData();\n};\n\nexport const isDateTime = (value: any): value is DateTime => {\n return moment.isMoment(value);\n};\n\nexport const toUtc = (input?: DateTimeInput, formatInput?: FormatInput): DateTime => {\n return moment.utc(input as MomentInput, formatInput) as DateTime;\n};\n\nexport const toDuration = (input?: DurationInput, unit?: DurationUnit): DateTimeDuration => {\n // moment built-in types are a bit flaky, for example `isoWeek` is not in the type definition but it's present in the js source.\n return moment.duration(input as DurationInputArg1, unit as DurationInputArg2) as DateTimeDuration;\n};\n\nexport const dateTime = (input?: DateTimeInput, formatInput?: FormatInput): DateTime => {\n return moment(input as MomentInput, formatInput) as DateTime;\n};\n\nexport const dateTimeAsMoment = (input?: DateTimeInput) => {\n return dateTime(input) as Moment;\n};\n\nexport const dateTimeForTimeZone = (\n timezone?: TimeZone,\n input?: DateTimeInput,\n formatInput?: FormatInput\n): DateTime => {\n if (timezone === 'utc') {\n return toUtc(input, formatInput);\n }\n\n return dateTime(input, formatInput);\n};\n\nexport const getWeekdayIndex = (day: string) => {\n return moment.weekdays().findIndex((wd) => wd.toLowerCase() === day.toLowerCase());\n};\n\nexport const getWeekdayIndexByEnglishName = (day: string) =>\n ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'].findIndex(\n (wd) => wd.toLowerCase() === day.toLowerCase()\n );\n\nexport const setWeekStart = (weekStart?: string) => {\n const suffix = '-weekStart';\n const language = getLocale().replace(suffix, '');\n const dow = weekStart ? getWeekdayIndexByEnglishName(weekStart) : -1;\n if (dow !== -1) {\n moment.locale(language + suffix, {\n parentLocale: language,\n week: {\n dow,\n },\n });\n } else {\n setLocale(language);\n }\n};\n","import { each, has } from 'lodash';\n\nimport { RawTimeRange, TimeRange, TimeZone, IntervalValues, RelativeTimeRange, TimeOption } from '../types/time';\n\nimport * as dateMath from './datemath';\nimport { timeZoneAbbrevation, dateTimeFormat, dateTimeFormatTimeAgo } from './formatter';\nimport { isDateTime, DateTime, dateTime } from './moment_wrapper';\nimport { dateTimeParse } from './parser';\n\nconst spans: { [key: string]: { display: string; section?: number } } = {\n s: { display: 'second' },\n m: { display: 'minute' },\n h: { display: 'hour' },\n d: { display: 'day' },\n w: { display: 'week' },\n M: { display: 'month' },\n y: { display: 'year' },\n};\n\nconst rangeOptions: TimeOption[] = [\n { from: 'now/d', to: 'now/d', display: 'Today' },\n { from: 'now/d', to: 'now', display: 'Today so far' },\n { from: 'now/w', to: 'now/w', display: 'This week' },\n { from: 'now/w', to: 'now', display: 'This week so far' },\n { from: 'now/M', to: 'now/M', display: 'This month' },\n { from: 'now/M', to: 'now', display: 'This month so far' },\n { from: 'now/y', to: 'now/y', display: 'This year' },\n { from: 'now/y', to: 'now', display: 'This year so far' },\n\n { from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday' },\n {\n from: 'now-2d/d',\n to: 'now-2d/d',\n display: 'Day before yesterday',\n },\n {\n from: 'now-7d/d',\n to: 'now-7d/d',\n display: 'This day last week',\n },\n { from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week' },\n { from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month' },\n { from: 'now-1Q/fQ', to: 'now-1Q/fQ', display: 'Previous fiscal quarter' },\n { from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year' },\n { from: 'now-1y/fy', to: 'now-1y/fy', display: 'Previous fiscal year' },\n\n { from: 'now-5m', to: 'now', display: 'Last 5 minutes' },\n { from: 'now-15m', to: 'now', display: 'Last 15 minutes' },\n { from: 'now-30m', to: 'now', display: 'Last 30 minutes' },\n { from: 'now-1h', to: 'now', display: 'Last 1 hour' },\n { from: 'now-3h', to: 'now', display: 'Last 3 hours' },\n { from: 'now-6h', to: 'now', display: 'Last 6 hours' },\n { from: 'now-12h', to: 'now', display: 'Last 12 hours' },\n { from: 'now-24h', to: 'now', display: 'Last 24 hours' },\n { from: 'now-2d', to: 'now', display: 'Last 2 days' },\n { from: 'now-7d', to: 'now', display: 'Last 7 days' },\n { from: 'now-30d', to: 'now', display: 'Last 30 days' },\n { from: 'now-90d', to: 'now', display: 'Last 90 days' },\n { from: 'now-6M', to: 'now', display: 'Last 6 months' },\n { from: 'now-1y', to: 'now', display: 'Last 1 year' },\n { from: 'now-2y', to: 'now', display: 'Last 2 years' },\n { from: 'now-5y', to: 'now', display: 'Last 5 years' },\n { from: 'now/fQ', to: 'now', display: 'This fiscal quarter so far' },\n { from: 'now/fQ', to: 'now/fQ', display: 'This fiscal quarter' },\n { from: 'now/fy', to: 'now', display: 'This fiscal year so far' },\n { from: 'now/fy', to: 'now/fy', display: 'This fiscal year' },\n];\n\nconst hiddenRangeOptions: TimeOption[] = [\n { from: 'now', to: 'now+1m', display: 'Next minute' },\n { from: 'now', to: 'now+5m', display: 'Next 5 minutes' },\n { from: 'now', to: 'now+15m', display: 'Next 15 minutes' },\n { from: 'now', to: 'now+30m', display: 'Next 30 minutes' },\n { from: 'now', to: 'now+1h', display: 'Next hour' },\n { from: 'now', to: 'now+3h', display: 'Next 3 hours' },\n { from: 'now', to: 'now+6h', display: 'Next 6 hours' },\n { from: 'now', to: 'now+12h', display: 'Next 12 hours' },\n { from: 'now', to: 'now+24h', display: 'Next 24 hours' },\n { from: 'now', to: 'now+2d', display: 'Next 2 days' },\n { from: 'now', to: 'now+7d', display: 'Next 7 days' },\n { from: 'now', to: 'now+30d', display: 'Next 30 days' },\n { from: 'now', to: 'now+90d', display: 'Next 90 days' },\n { from: 'now', to: 'now+6M', display: 'Next 6 months' },\n { from: 'now', to: 'now+1y', display: 'Next year' },\n { from: 'now', to: 'now+2y', display: 'Next 2 years' },\n { from: 'now', to: 'now+5y', display: 'Next 5 years' },\n];\n\nconst rangeIndex: any = {};\neach(rangeOptions, (frame: any) => {\n rangeIndex[frame.from + ' to ' + frame.to] = frame;\n});\neach(hiddenRangeOptions, (frame: any) => {\n rangeIndex[frame.from + ' to ' + frame.to] = frame;\n});\n\n// handles expressions like\n// 5m\n// 5m to now/d\n// now/d to now\n// now/d\n// if no to <expr> then to now is assumed\nexport function describeTextRange(expr: any) {\n const isLast = expr.indexOf('+') !== 0;\n if (expr.indexOf('now') === -1) {\n expr = (isLast ? 'now-' : 'now') + expr;\n }\n\n let opt = rangeIndex[expr + ' to now'];\n if (opt) {\n return opt;\n }\n\n if (isLast) {\n opt = { from: expr, to: 'now' };\n } else {\n opt = { from: 'now', to: expr };\n }\n\n const parts = /^now([-+])(\\d+)(\\w)/.exec(expr);\n if (parts) {\n const unit = parts[3];\n const amount = parseInt(parts[2], 10);\n const span = spans[unit];\n if (span) {\n opt.display = isLast ? 'Last ' : 'Next ';\n opt.display += amount + ' ' + span.display;\n opt.section = span.section;\n if (amount > 1) {\n opt.display += 's';\n }\n }\n } else {\n opt.display = opt.from + ' to ' + opt.to;\n opt.invalid = true;\n }\n\n return opt;\n}\n\n/**\n * Use this function to get a properly formatted string representation of a {@link @grafana/data:RawTimeRange | range}.\n *\n * @example\n * ```\n * // Prints \"2\":\n * console.log(add(1,1));\n * ```\n * @category TimeUtils\n * @param range - a time range (usually specified by the TimePicker)\n * @alpha\n */\nexport function describeTimeRange(range: RawTimeRange, timeZone?: TimeZone): string {\n const option = rangeIndex[range.from.toString() + ' to ' + range.to.toString()];\n\n if (option) {\n return option.display;\n }\n\n const options = { timeZone };\n\n if (isDateTime(range.from) && isDateTime(range.to)) {\n return dateTimeFormat(range.from, options) + ' to ' + dateTimeFormat(range.to, options);\n }\n\n if (isDateTime(range.from)) {\n const parsed = dateMath.parse(range.to, true, 'utc');\n return parsed ? dateTimeFormat(range.from, options) + ' to ' + dateTimeFormatTimeAgo(parsed, options) : '';\n }\n\n if (isDateTime(range.to)) {\n const parsed = dateMath.parse(range.from, false, 'utc');\n return parsed ? dateTimeFormatTimeAgo(parsed, options) + ' to ' + dateTimeFormat(range.to, options) : '';\n }\n\n if (range.to.toString() === 'now') {\n const res = describeTextRange(range.from);\n return res.display;\n }\n\n return range.from.toString() + ' to ' + range.to.toString();\n}\n\nexport const isValidTimeSpan = (value: string) => {\n if (value.indexOf('$') === 0 || value.indexOf('+$') === 0) {\n return true;\n }\n\n const info = describeTextRange(value);\n return info.invalid !== true;\n};\n\nexport const describeTimeRangeAbbreviation = (range: TimeRange, timeZone?: TimeZone) => {\n if (isDateTime(range.from)) {\n return timeZoneAbbrevation(range.from, { timeZone });\n }\n const parsed = dateMath.parse(range.from, true);\n return parsed ? timeZoneAbbrevation(parsed, { timeZone }) : '';\n};\n\nexport const convertRawToRange = (raw: RawTimeRange, timeZone?: TimeZone, fiscalYearStartMonth?: number): TimeRange => {\n const from = dateTimeParse(raw.from, { roundUp: false, timeZone, fiscalYearStartMonth });\n const to = dateTimeParse(raw.to, { roundUp: true, timeZone, fiscalYearStartMonth });\n\n if (dateMath.isMathString(raw.from) || dateMath.isMathString(raw.to)) {\n return { from, to, raw };\n }\n\n return { from, to, raw: { from, to } };\n};\n\nfunction isRelativeTime(v: DateTime | string) {\n if (typeof v === 'string') {\n return (v as string).indexOf('now') >= 0;\n }\n return false;\n}\n\nexport function isFiscal(timeRange: TimeRange) {\n if (typeof timeRange.raw.from === 'string' && timeRange.raw.from.indexOf('f') > 0) {\n return true;\n } else if (typeof timeRange.raw.to === 'string' && timeRange.raw.to.indexOf('f') > 0) {\n return true;\n }\n return false;\n}\n\nexport function isRelativeTimeRange(raw: RawTimeRange): boolean {\n return isRelativeTime(raw.from) || isRelativeTime(raw.to);\n}\n\nexport function secondsToHms(seconds: number): string {\n const numYears = Math.floor(seconds / 31536000);\n if (numYears) {\n return numYears + 'y';\n }\n const numDays = Math.floor((seconds % 31536000) / 86400);\n if (numDays) {\n return numDays + 'd';\n }\n const numHours = Math.floor(((seconds % 31536000) % 86400) / 3600);\n if (numHours) {\n return numHours + 'h';\n }\n const numMinutes = Math.floor((((seconds % 31536000) % 86400) % 3600) / 60);\n if (numMinutes) {\n return numMinutes + 'm';\n }\n const numSeconds = Math.floor((((seconds % 31536000) % 86400) % 3600) % 60);\n if (numSeconds) {\n return numSeconds + 's';\n }\n const numMilliseconds = Math.floor(seconds * 1000.0);\n if (numMilliseconds) {\n return numMilliseconds + 'ms';\n }\n\n return 'less than a millisecond'; //'just now' //or other string you like;\n}\n\n// Format timeSpan (in sec) to string used in log's meta info\nexport function msRangeToTimeString(rangeMs: number): string {\n const rangeSec = Number((rangeMs / 1000).toFixed());\n\n const h = Math.floor(rangeSec / 60 / 60);\n const m = Math.floor(rangeSec / 60) - h * 60;\n const s = Number((rangeSec % 60).toFixed());\n let formattedH = h ? h + 'h' : '';\n let formattedM = m ? m + 'min' : '';\n let formattedS = s ? s + 'sec' : '';\n\n formattedH && formattedM ? (formattedH = formattedH + ' ') : (formattedH = formattedH);\n (formattedM || formattedH) && formattedS ? (formattedM = formattedM + ' ') : (formattedM = formattedM);\n\n return formattedH + formattedM + formattedS || 'less than 1sec';\n}\n\nexport function calculateInterval(range: TimeRange, resolution: number, lowLimitInterval?: string): IntervalValues {\n let lowLimitMs = 1; // 1 millisecond default low limit\n if (lowLimitInterval) {\n lowLimitMs = intervalToMs(lowLimitInterval);\n }\n\n let intervalMs = roundInterval((range.to.valueOf() - range.from.valueOf()) / resolution);\n if (lowLimitMs > intervalMs) {\n intervalMs = lowLimitMs;\n }\n return {\n intervalMs: intervalMs,\n interval: secondsToHms(intervalMs / 1000),\n };\n}\n\nconst interval_regex = /(-?\\d+(?:\\.\\d+)?)(ms|[Mwdhmsy])/;\n// histogram & trends\nconst intervals_in_seconds = {\n y: 31536000,\n M: 2592000,\n w: 604800,\n d: 86400,\n h: 3600,\n m: 60,\n s: 1,\n ms: 0.001,\n};\n\nexport function describeInterval(str: string) {\n // Default to seconds if no unit is provided\n if (Number(str)) {\n return {\n sec: intervals_in_seconds.s,\n type: 's',\n count: parseInt(str, 10),\n };\n }\n\n const matches = str.match(interval_regex);\n if (!matches || !has(intervals_in_seconds, matches[2])) {\n throw new Error(\n `Invalid interval string, has to be either unit-less or end with one of the following units: \"${Object.keys(\n intervals_in_seconds\n ).join(', ')}\"`\n );\n }\n return {\n sec: (intervals_in_seconds as any)[matches[2]] as number,\n type: matches[2],\n count: parseInt(matches[1], 10),\n };\n}\n\nexport function intervalToSeconds(str: string): number {\n const info = describeInterval(str);\n return info.sec * info.count;\n}\n\nexport function intervalToMs(str: string): number {\n const info = describeInterval(str);\n return info.sec * 1000 * info.count;\n}\n\nexport function roundInterval(interval: number) {\n switch (true) {\n // 0.01s\n case interval < 10:\n return 1; // 0.001s\n // 0.015s\n case interval < 15:\n return 10; // 0.01s\n // 0.035s\n case interval < 35:\n return 20; // 0.02s\n // 0.075s\n case interval < 75:\n return 50; // 0.05s\n // 0.15s\n case interval < 150:\n return 100; // 0.1s\n // 0.35s\n case interval < 350:\n return 200; // 0.2s\n // 0.75s\n case interval < 750:\n return 500; // 0.5s\n // 1.5s\n case interval < 1500:\n return 1000; // 1s\n // 3.5s\n case interval < 3500:\n return 2000; // 2s\n // 7.5s\n case interval < 7500:\n return 5000; // 5s\n // 12.5s\n case interval < 12500:\n return 10000; // 10s\n // 17.5s\n case interval < 17500:\n return 15000; // 15s\n // 25s\n case interval < 25000:\n return 20000; // 20s\n // 45s\n case interval < 45000:\n return 30000; // 30s\n // 1.5m\n case interval < 90000:\n return 60000; // 1m\n // 3.5m\n case interval < 210000:\n return 120000; // 2m\n // 7.5m\n case interval < 450000:\n return 300000; // 5m\n // 12.5m\n case interval < 750000:\n return 600000; // 10m\n // 17.5m\n case interval < 1050000:\n return 900000; // 15m\n // 25m\n case interval < 1500000:\n return 1200000; // 20m\n // 45m\n case interval < 2700000:\n return 1800000; // 30m\n // 1.5h\n case interval < 5400000:\n return 3600000; // 1h\n // 2.5h\n case interval < 9000000:\n return 7200000; // 2h\n // 4.5h\n case interval < 16200000:\n return 10800000; // 3h\n // 9h\n case interval < 32400000:\n return 21600000; // 6h\n // 1d\n case interval < 86400000:\n return 43200000; // 12h\n // 1w\n case interval < 604800000:\n return 86400000; // 1d\n // 3w\n case interval < 1814400000:\n return 604800000; // 1w\n // 6w\n case interval < 3628800000:\n return 2592000000; // 30d\n default:\n return 31536000000; // 1y\n }\n}\n\n/**\n * Converts a TimeRange to a RelativeTimeRange that can be used in\n * e.g. alerting queries/rules.\n *\n * @internal\n */\nexport function timeRangeToRelative(timeRange: TimeRange, now: DateTime = dateTime()): RelativeTimeRange {\n const from = now.unix() - timeRange.from.unix();\n const to = now.unix() - timeRange.to.unix();\n\n return {\n from,\n to,\n };\n}\n\n/**\n * Converts a RelativeTimeRange to a TimeRange\n *\n * @internal\n */\nexport function relativeToTimeRange(relativeTimeRange: RelativeTimeRange, now: DateTime = dateTime()): TimeRange {\n const from = dateTime(now).subtract(relativeTimeRange.from, 's');\n const to = relativeTimeRange.to === 0 ? dateTime(now) : dateTime(now).subtract(relativeTimeRange.to, 's');\n\n return {\n from,\n to,\n raw: { from, to },\n };\n}\n","// Libraries\nimport { toString, toNumber as _toNumber, isEmpty, isBoolean, isArray, join } from 'lodash';\n\n// Types\nimport { getFieldTypeFromValue } from '../dataframe/processDataFrame';\nimport { toUtc, dateTimeParse } from '../datetime';\nimport { GrafanaTheme2 } from '../themes/types';\nimport { KeyValue, TimeZone } from '../types';\nimport { Field, FieldType } from '../types/dataFrame';\nimport { DecimalCount, DisplayProcessor, DisplayValue } from '../types/displayValue';\nimport { anyToNumber } from '../utils/anyToNumber';\nimport { getValueMappingResult } from '../utils/valueMappings';\nimport { getValueFormat, isBooleanUnit } from '../valueFormats/valueFormats';\n\nimport { getScaleCalculator } from './scale';\n\ninterface DisplayProcessorOptions {\n field: Partial<Field>;\n /**\n * Will pick browser timezone if not defined\n */\n timeZone?: TimeZone;\n /**\n * Will pick 'dark' if not defined\n */\n theme: GrafanaTheme2;\n}\n\n// Reasonable units for time\nconst timeFormats: KeyValue<boolean> = {\n dateTimeAsIso: true,\n dateTimeAsIsoNoDateIfToday: true,\n dateTimeAsUS: true,\n dateTimeAsUSNoDateIfToday: true,\n dateTimeAsLocal: true,\n dateTimeAsLocalNoDateIfToday: true,\n dateTimeFromNow: true,\n};\n\nexport function getDisplayProcessor(options?: DisplayProcessorOptions): DisplayProcessor {\n if (!options || isEmpty(options) || !options.field) {\n return toStringProcessor;\n }\n\n const field = options.field as Field;\n const config = field.config ?? {};\n\n let unit = config.unit;\n let hasDateUnit = unit && (timeFormats[unit] || unit.startsWith('time:'));\n let showMs = false;\n\n if (field.type === FieldType.time && !hasDateUnit) {\n unit = `dateTimeAsSystem`;\n hasDateUnit = true;\n if (field.values && field.values.length > 1) {\n let start = field.values.get(0);\n let end = field.values.get(field.values.length - 1);\n if (typeof start === 'string') {\n start = dateTimeParse(start).unix();\n end = dateTimeParse(end).unix();\n } else {\n start /= 1e3;\n end /= 1e3;\n }\n showMs = end - start < 60; //show ms when minute or less\n }\n } else if (field.type === FieldType.boolean) {\n if (!isBooleanUnit(unit)) {\n unit = 'bool';\n }\n } else if (!unit && field.type === FieldType.string) {\n unit = 'string';\n }\n\n const formatFunc = getValueFormat(unit || 'none');\n const scaleFunc = getScaleCalculator(field, options.theme);\n\n return (value: any, decimals?: DecimalCount) => {\n const { mappings } = config;\n const isStringUnit = unit === 'string';\n\n if (hasDateUnit && typeof value === 'string') {\n value = toUtc(value).valueOf();\n }\n\n let numeric = isStringUnit ? NaN : anyToNumber(value);\n let text: string | undefined;\n let prefix: string | undefined;\n let suffix: string | undefined;\n let color: string | undefined;\n let icon: string | undefined;\n let percent: number | undefined;\n\n if (mappings && mappings.length > 0) {\n const mappingResult = getValueMappingResult(mappings, value);\n\n if (mappingResult) {\n if (mappingResult.text != null) {\n text = mappingResult.text;\n }\n\n if (mappingResult.color != null) {\n color = options.theme.visualization.getColorByName(mappingResult.color);\n }\n\n if (mappingResult.icon != null) {\n icon = mappingResult.icon;\n }\n }\n }\n\n if (!isNaN(numeric)) {\n if (text == null && !isBoolean(value)) {\n const v = formatFunc(numeric, decimals ?? config.decimals, null, options.timeZone, showMs);\n text = v.text;\n suffix = v.suffix;\n prefix = v.prefix;\n }\n\n // Return the value along with scale info\n if (color == null) {\n const scaleResult = scaleFunc(numeric);\n color = scaleResult.color;\n percent = scaleResult.percent;\n }\n }\n\n if (text == null && isArray(value)) {\n text = join(value, ', ');\n }\n\n if (text == null) {\n text = toString(value);\n if (!text) {\n if (config.noValue) {\n text = config.noValue;\n } else {\n text = ''; // No data?\n }\n }\n }\n\n if (!color) {\n const scaleResult = scaleFunc(-Infinity);\n color = scaleResult.color;\n percent = scaleResult.percent;\n }\n\n const display: DisplayValue = {\n text,\n numeric,\n prefix,\n suffix,\n color,\n };\n\n if (icon != null) {\n display.icon = icon;\n }\n\n if (percent != null) {\n display.percent = percent;\n }\n\n return display;\n };\n}\n\nfunction toStringProcessor(value: any): DisplayValue {\n return { text: toString(value), numeric: anyToNumber(value) };\n}\n\nexport function getRawDisplayProcessor(): DisplayProcessor {\n return (value: any) => ({\n text: getFieldTypeFromValue(value) === 'other' ? `${JSON.stringify(value, getCircularReplacer())}` : `${value}`,\n numeric: null as unknown as number,\n });\n}\n\nconst getCircularReplacer = () => {\n const seen = new WeakSet();\n return (_key: any, value: object | null) => {\n if (typeof value === 'object' && value !== null) {\n if (seen.has(value)) {\n return;\n }\n seen.add(value);\n }\n return value;\n };\n};\n","import { interpolateRgbBasis } from 'd3-interpolate';\n\nimport { GrafanaTheme2 } from '../themes/types';\nimport { reduceField } from '../transformations/fieldReducer';\nimport { FALLBACK_COLOR, Field, FieldColorModeId, Threshold } from '../types';\nimport { RegistryItem } from '../utils';\nimport { Registry } from '../utils/Registry';\n\nimport { getScaleCalculator, ColorScaleValue } from './scale';\nimport { fallBackTreshold } from './thresholds';\n\n/** @beta */\nexport type FieldValueColorCalculator = (value: number, percent: number, Threshold?: Threshold) => string;\n\n/** @beta */\nexport interface FieldColorMode extends RegistryItem {\n getCalculator: (field: Field, theme: GrafanaTheme2) => FieldValueColorCalculator;\n getColors?: (theme: GrafanaTheme2) => string[];\n isContinuous?: boolean;\n isByValue?: boolean;\n}\n\n/** @internal */\nexport const fieldColorModeRegistry = new Registry<FieldColorMode>(() => {\n return [\n {\n id: FieldColorModeId.Fixed,\n name: 'Single color',\n description: 'Set a specific color',\n getCalculator: getFixedColor,\n },\n {\n id: FieldColorModeId.Thresholds,\n name: 'From thresholds',\n isByValue: true,\n description: 'Derive colors from thresholds',\n getCalculator: (_field, theme) => {\n return (_value, _percent, threshold) => {\n const thresholdSafe = threshold ?? fallBackTreshold;\n return theme.visualization.getColorByName(thresholdSafe.color);\n };\n },\n },\n new FieldColorSchemeMode({\n id: FieldColorModeId.PaletteClassic,\n name: 'Classic palette',\n isContinuous: false,\n isByValue: false,\n getColors: (theme: GrafanaTheme2) => {\n return theme.visualization.palette;\n },\n }),\n new FieldColorSchemeMode({\n id: 'continuous-GrYlRd',\n name: 'Green-Yellow-Red',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['green', 'yellow', 'red'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-RdYlGr',\n name: 'Red-Yellow-Green',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['red', 'yellow', 'green'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-BlYlRd',\n name: 'Blue-Yellow-Red',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['dark-blue', 'super-light-yellow', 'dark-red'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-YlRd',\n name: 'Yellow-Red',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['super-light-yellow', 'dark-red'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-BlPu',\n name: 'Blue-Purple',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['blue', 'purple'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-YlBl',\n name: 'Yellow-Blue',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['super-light-yellow', 'dark-blue'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-blues',\n name: 'Blues',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-blue'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-reds',\n name: 'Reds',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-red'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-greens',\n name: 'Greens',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-green'],\n }),\n new FieldColorSchemeMode({\n id: 'continuous-purples',\n name: 'Purples',\n isContinuous: true,\n isByValue: true,\n getColors: (theme: GrafanaTheme2) => ['panel-bg', 'dark-purple'],\n }),\n ];\n});\n\ninterface FieldColorSchemeModeOptions {\n id: string;\n name: string;\n description?: string;\n getColors: (theme: GrafanaTheme2) => string[];\n isContinuous: boolean;\n isByValue: boolean;\n}\n\nexport class FieldColorSchemeMode implements FieldColorMode {\n id: string;\n name: string;\n description?: string;\n isContinuous: boolean;\n isByValue: boolean;\n colorCache?: string[];\n colorCacheTheme?: GrafanaTheme2;\n interpolator?: (value: number) => string;\n getNamedColors?: (theme: GrafanaTheme2) => string[];\n\n constructor(options: FieldColorSchemeModeOptions) {\n this.id = options.id;\n this.name = options.name;\n this.description = options.description;\n this.getNamedColors = options.getColors;\n this.isContinuous = options.isContinuous;\n this.isByValue = options.isByValue;\n }\n\n getColors(theme: GrafanaTheme2): string[] {\n if (!this.getNamedColors) {\n return [];\n }\n\n if (this.colorCache && this.colorCacheTheme === theme) {\n return this.colorCache;\n }\n\n this.colorCache = this.getNamedColors(theme).map(theme.visualization.getColorByName);\n this.colorCacheTheme = theme;\n\n return this.colorCache;\n }\n\n private getInterpolator() {\n if (!this.interpolator) {\n this.interpolator = interpolateRgbBasis(this.colorCache!);\n }\n\n return this.interpolator;\n }\n\n getCalculator(field: Field, theme: GrafanaTheme2) {\n const colors = this.getColors(theme);\n\n if (this.isByValue) {\n if (this.isContinuous) {\n return (_: number, percent: number, _threshold?: Threshold) => {\n return this.getInterpolator()(percent);\n };\n } else {\n return (_: number, percent: number, _threshold?: Threshold) => {\n return colors[percent * (colors.length - 1)];\n };\n }\n } else {\n return (_: number, _percent: number, _threshold?: Threshold) => {\n const seriesIndex = field.state?.seriesIndex ?? 0;\n return colors[seriesIndex % colors.length];\n };\n }\n }\n}\n\n/** @beta */\nexport function getFieldColorModeForField(field: Field): FieldColorMode {\n return fieldColorModeRegistry.get(field.config.color?.mode ?? FieldColorModeId.Thresholds);\n}\n\n/** @beta */\nexport function getFieldColorMode(mode?: FieldColorModeId | string): FieldColorMode {\n return fieldColorModeRegistry.get(mode ?? FieldColorModeId.Thresholds);\n}\n\n/**\n * @alpha\n * Function that will return a series color for any given color mode. If the color mode is a by value color\n * mode it will use the field.config.color.seriesBy property to figure out which value to use\n */\nexport function getFieldSeriesColor(field: Field, theme: GrafanaTheme2): ColorScaleValue {\n const mode = getFieldColorModeForField(field);\n\n if (!mode.isByValue) {\n return {\n color: mode.getCalculator(field, theme)(0, 0),\n threshold: fallBackTreshold,\n percent: 1,\n };\n }\n\n const scale = getScaleCalculator(field, theme);\n const stat = field.config.color?.seriesBy ?? 'last';\n const calcs = reduceField({ field, reducers: [stat] });\n const value = calcs[stat] ?? 0;\n\n return scale(value);\n}\n\nfunction getFixedColor(field: Field, theme: GrafanaTheme2) {\n return () => {\n return theme.visualization.getColorByName(field.config.color?.fixedColor ?? FALLBACK_COLOR);\n };\n}\n","import { DataFrame, Field } from '../types';\nimport { formatLabels } from '../utils/labels';\n\nimport { getFieldDisplayName } from './fieldState';\n\n/**\n * This object is created often, and only used when tmplates exist. Using a proxy lets us delay\n * calculations of the more complex structures (label names) until they are actually used\n */\nexport function getTemplateProxyForField(field: Field, frame?: DataFrame, frames?: DataFrame[]): any {\n return new Proxy(\n {} as any, // This object shows up in test snapshots\n {\n get: (obj: Field, key: string, reciever: any) => {\n if (key === 'name') {\n return field.name;\n }\n\n if (key === 'displayName') {\n return getFieldDisplayName(field, frame, frames);\n }\n\n if (key === 'labels' || key === 'formattedLabels') {\n // formattedLabels deprecated\n if (!field.labels) {\n return '';\n }\n return {\n ...field.labels,\n __values: Object.values(field.labels).sort().join(', '),\n toString: () => {\n return formatLabels(field.labels!, '', true);\n },\n };\n }\n return undefined; // (field as any)[key]; // any property?\n },\n }\n );\n}\n","import { isNumber, set, unset, get, cloneDeep } from 'lodash';\n\nimport { guessFieldTypeForField } from '../dataframe';\nimport { getTimeField } from '../dataframe/processDataFrame';\nimport { asHexString } from '../themes/colorManipulator';\nimport { fieldMatchers, reduceField, ReducerID } from '../transformations';\nimport {\n ApplyFieldOverrideOptions,\n DataFrame,\n DataLink,\n DecimalCount,\n DisplayProcessor,\n DisplayValue,\n DynamicConfigValue,\n Field,\n FieldColorModeId,\n FieldConfig,\n FieldConfigPropertyItem,\n FieldOverrideContext,\n FieldType,\n InterpolateFunction,\n LinkModel,\n NumericRange,\n ScopedVars,\n TimeZone,\n ValueLinkConfig,\n} from '../types';\nimport { FieldMatcher } from '../types/transformations';\nimport { DataLinkBuiltInVars, locationUtil } from '../utils';\nimport { mapInternalLinkToExplore } from '../utils/dataLinks';\nimport { formattedValueToString } from '../valueFormats';\n\nimport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\nimport { getDisplayProcessor, getRawDisplayProcessor } from './displayProcessor';\nimport { getFrameDisplayName } from './fieldState';\nimport { getFieldDisplayValuesProxy } from './getFieldDisplayValuesProxy';\nimport { standardFieldConfigEditorRegistry } from './standardFieldConfigEditorRegistry';\nimport { getTemplateProxyForField } from './templateProxies';\n\ninterface OverrideProps {\n match: FieldMatcher;\n properties: DynamicConfigValue[];\n}\n\nexport function findNumericFieldMinMax(data: DataFrame[]): NumericRange {\n let min: number | null = null;\n let max: number | null = null;\n\n const reducers = [ReducerID.min, ReducerID.max];\n\n for (const frame of data) {\n for (const field of frame.fields) {\n if (field.type === FieldType.number) {\n const stats = reduceField({ field, reducers });\n const statsMin = stats[ReducerID.min];\n const statsMax = stats[ReducerID.max];\n\n if (min === null || statsMin < min) {\n min = statsMin;\n }\n\n if (max === null || statsMax > max) {\n max = statsMax;\n }\n }\n }\n }\n\n return { min, max, delta: (max ?? 0) - (min ?? 0) };\n}\n\n/**\n * Return a copy of the DataFrame with all rules applied\n */\nexport function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFrame[] {\n if (!options.data) {\n return [];\n }\n\n const source = options.fieldConfig;\n if (!source) {\n return options.data;\n }\n\n const fieldConfigRegistry = options.fieldConfigRegistry ?? standardFieldConfigEditorRegistry;\n\n let seriesIndex = 0;\n let globalRange: NumericRange | undefined = undefined;\n\n // Prepare the Matchers\n const override: OverrideProps[] = [];\n if (source.overrides) {\n for (const rule of source.overrides) {\n const info = fieldMatchers.get(rule.matcher.id);\n if (info) {\n override.push({\n match: info.get(rule.matcher.options),\n properties: rule.properties,\n });\n }\n }\n }\n\n return options.data.map((originalFrame, index) => {\n // Need to define this new frame here as it's passed to the getLinkSupplier function inside the fields loop\n const newFrame: DataFrame = { ...originalFrame };\n // Copy fields\n newFrame.fields = newFrame.fields.map((field) => {\n return {\n ...field,\n config: cloneDeep(field.config),\n state: {\n ...field.state,\n },\n };\n });\n\n const scopedVars: ScopedVars = {\n __series: { text: 'Series', value: { name: getFrameDisplayName(newFrame, index) } }, // might be missing\n };\n\n for (const field of newFrame.fields) {\n const config = field.config;\n\n field.state!.scopedVars = {\n ...scopedVars,\n __field: {\n text: 'Field',\n value: getTemplateProxyForField(field, newFrame, options.data),\n },\n };\n\n const context = {\n field: field,\n data: options.data!,\n dataFrameIndex: index,\n replaceVariables: options.replaceVariables,\n fieldConfigRegistry: fieldConfigRegistry,\n };\n\n // Anything in the field config that's not set by the datasource\n // will be filled in by panel's field configuration\n setFieldConfigDefaults(config, source.defaults, context);\n\n // Find any matching rules and then override\n for (const rule of override) {\n if (rule.match(field, newFrame, options.data!)) {\n for (const prop of rule.properties) {\n // config.scopedVars is set already here\n setDynamicConfigValue(config, prop, context);\n }\n }\n }\n\n // Try harder to set a real value that is not 'other'\n let type = field.type;\n if (!type || type === FieldType.other) {\n const t = guessFieldTypeForField(field);\n if (t) {\n type = t;\n }\n }\n\n // Set the Min/Max value automatically\n let range: NumericRange | undefined = undefined;\n if (field.type === FieldType.number) {\n if (!globalRange && (!isNumber(config.min) || !isNumber(config.max))) {\n globalRange = findNumericFieldMinMax(options.data!);\n }\n const min = config.min ?? globalRange!.min;\n const max = config.max ?? globalRange!.max;\n range = { min, max, delta: max! - min! };\n }\n\n field.state!.seriesIndex = seriesIndex;\n field.state!.range = range;\n field.type = type;\n\n // Some color modes needs series index to assign field color so we count\n // up series index here but ignore time fields\n if (field.type !== FieldType.time) {\n seriesIndex++;\n }\n\n // and set the display processor using it\n field.display = getDisplayProcessor({\n field: field,\n theme: options.theme,\n timeZone: options.timeZone,\n });\n\n // Wrap the display with a cache to avoid double calls\n if (field.config.unit !== 'dateTimeFromNow') {\n field.display = cachingDisplayProcessor(field.display, 2500);\n }\n\n // Attach data links supplier\n field.getLinks = getLinksSupplier(\n newFrame,\n field,\n field.state!.scopedVars,\n context.replaceVariables,\n options.timeZone\n );\n }\n\n return newFrame;\n });\n}\n\n// this is a significant optimization for streaming, where we currently re-process all values in the buffer on ech update\n// via field.display(value). this can potentially be removed once we...\n// 1. process data packets incrementally and/if cache the results in the streaming datafame (maybe by buffer index)\n// 2. have the ability to selectively get display color or text (but not always both, which are each quite expensive)\n// 3. sufficently optimize text formatting and threshold color determinitation\nfunction cachingDisplayProcessor(disp: DisplayProcessor, maxCacheSize = 2500): DisplayProcessor {\n type dispCache = Map<any, DisplayValue>;\n // decimals -> cache mapping, -1 is unspecified decimals\n const caches = new Map<number, dispCache>();\n\n // pre-init caches for up to 15 decimals\n for (let i = -1; i <= 15; i++) {\n caches.set(i, new Map());\n }\n\n return (value: any, decimals?: DecimalCount) => {\n let cache = caches.get(decimals ?? -1)!;\n\n let v = cache.get(value);\n\n if (!v) {\n // Don't grow too big\n if (cache.size === maxCacheSize) {\n cache.clear();\n }\n\n v = disp(value, decimals);\n\n // convert to hex6 or hex8 so downstream we can cheaply test for alpha (and set new alpha)\n // via a simple length check (in colorManipulator) rather using slow parsing via tinycolor\n if (v.color) {\n v.color = asHexString(v.color);\n }\n\n cache.set(value, v);\n }\n\n return v;\n };\n}\n\nexport interface FieldOverrideEnv extends FieldOverrideContext {\n fieldConfigRegistry: FieldConfigOptionsRegistry;\n}\n\nexport function setDynamicConfigValue(config: FieldConfig, value: DynamicConfigValue, context: FieldOverrideEnv) {\n const reg = context.fieldConfigRegistry;\n const item = reg.getIfExists(value.id);\n\n if (!item) {\n return;\n }\n\n const val = item.process(value.value, context, item.settings);\n\n const remove = val === undefined || val === null;\n\n if (remove) {\n if (item.isCustom && config.custom) {\n unset(config.custom, item.path);\n } else {\n unset(config, item.path);\n }\n } else {\n if (item.isCustom) {\n if (!config.custom) {\n config.custom = {};\n }\n set(config.custom, item.path, val);\n } else {\n set(config, item.path, val);\n }\n }\n}\n\n// config -> from DS\n// defaults -> from Panel config\nexport function setFieldConfigDefaults(config: FieldConfig, defaults: FieldConfig, context: FieldOverrideEnv) {\n for (const fieldConfigProperty of context.fieldConfigRegistry.list()) {\n if (fieldConfigProperty.isCustom && !config.custom) {\n config.custom = {};\n }\n processFieldConfigValue(\n fieldConfigProperty.isCustom ? config.custom : config,\n fieldConfigProperty.isCustom ? defaults.custom : defaults,\n fieldConfigProperty,\n context\n );\n }\n\n validateFieldConfig(config);\n}\n\nfunction processFieldConfigValue(\n destination: Record<string, any>, // it's mutable\n source: Record<string, any>,\n fieldConfigProperty: FieldConfigPropertyItem,\n context: FieldOverrideEnv\n) {\n const currentConfig = get(destination, fieldConfigProperty.path);\n if (currentConfig === null || currentConfig === undefined) {\n const item = context.fieldConfigRegistry.getIfExists(fieldConfigProperty.id);\n if (!item) {\n return;\n }\n\n if (item && item.shouldApply(context.field!)) {\n const val = item.process(get(source, item.path), context, item.settings);\n if (val !== undefined && val !== null) {\n set(destination, item.path, val);\n }\n }\n }\n}\n\n/**\n * This checks that all options on FieldConfig make sense. It mutates any value that needs\n * fixed. In particular this makes sure that the first threshold value is -Infinity (not valid in JSON)\n */\nexport function validateFieldConfig(config: FieldConfig) {\n const { thresholds } = config;\n\n if (!config.color) {\n if (thresholds) {\n config.color = {\n mode: FieldColorModeId.Thresholds,\n };\n }\n // No Color settings\n } else if (!config.color.mode) {\n // Without a mode, skip color altogether\n delete config.color;\n }\n\n // Verify that max > min (swap if necessary)\n if (config.hasOwnProperty('min') && config.hasOwnProperty('max') && config.min! > config.max!) {\n const tmp = config.max;\n config.max = config.min;\n config.min = tmp;\n }\n}\n\nexport const getLinksSupplier =\n (\n frame: DataFrame,\n field: Field,\n fieldScopedVars: ScopedVars,\n replaceVariables: InterpolateFunction,\n timeZone?: TimeZone\n ) =>\n (config: ValueLinkConfig): Array<LinkModel<Field>> => {\n if (!field.config.links || field.config.links.length === 0) {\n return [];\n }\n const timeRangeUrl = locationUtil.getTimeRangeUrlParams();\n const { timeField } = getTimeField(frame);\n\n return field.config.links.map((link: DataLink) => {\n const variablesQuery = locationUtil.getVariablesUrlParams();\n let dataFrameVars = {};\n let valueVars = {};\n\n // We are not displaying reduction result\n if (config.valueRowIndex !== undefined && !isNaN(config.valueRowIndex)) {\n const fieldsProxy = getFieldDisplayValuesProxy({\n frame,\n rowIndex: config.valueRowIndex,\n timeZone: timeZone,\n });\n\n valueVars = {\n raw: field.values.get(config.valueRowIndex),\n numeric: fieldsProxy[field.name].numeric,\n text: fieldsProxy[field.name].text,\n time: timeField ? timeField.values.get(config.valueRowIndex) : undefined,\n };\n\n dataFrameVars = {\n __data: {\n value: {\n name: frame.name,\n refId: frame.refId,\n fields: fieldsProxy,\n },\n text: 'Data',\n },\n };\n } else {\n if (config.calculatedValue) {\n valueVars = {\n raw: config.calculatedValue.numeric,\n numeric: config.calculatedValue.numeric,\n text: formattedValueToString(config.calculatedValue),\n };\n }\n }\n\n const variables = {\n ...fieldScopedVars,\n __value: {\n text: 'Value',\n value: valueVars,\n },\n ...dataFrameVars,\n [DataLinkBuiltInVars.keepTime]: {\n text: timeRangeUrl,\n value: timeRangeUrl,\n },\n [DataLinkBuiltInVars.includeVars]: {\n text: variablesQuery,\n value: variablesQuery,\n },\n };\n\n if (link.onClick) {\n return {\n href: link.url,\n title: replaceVariables(link.title || '', variables),\n target: link.targetBlank ? '_blank' : undefined,\n onClick: (evt, origin) => {\n link.onClick!({\n origin: origin ?? field,\n e: evt,\n replaceVariables: (v) => replaceVariables(v, variables),\n });\n },\n origin: field,\n };\n }\n\n if (link.internal) {\n // For internal links at the moment only destination is Explore.\n return mapInternalLinkToExplore({\n link,\n internalLink: link.internal,\n scopedVars: variables,\n field,\n range: {} as any,\n replaceVariables,\n });\n }\n\n let href = locationUtil.assureBaseUrl(link.url.replace(/\\n/g, ''));\n href = replaceVariables(href, variables);\n href = locationUtil.processUrl(href);\n\n const info: LinkModel<Field> = {\n href,\n title: replaceVariables(link.title || '', variables),\n target: link.targetBlank ? '_blank' : undefined,\n origin: field,\n };\n return info;\n });\n };\n\n/**\n * Return a copy of the DataFrame with raw data\n */\nexport function applyRawFieldOverrides(data: DataFrame[]): DataFrame[] {\n if (!data || data.length === 0) {\n return [];\n }\n\n const newData = [...data];\n const processor = getRawDisplayProcessor();\n\n for (let frameIndex = 0; frameIndex < newData.length; frameIndex++) {\n const newFrame = { ...newData[frameIndex] };\n const newFields = [...newFrame.fields];\n\n for (let fieldIndex = 0; fieldIndex < newFields.length; fieldIndex++) {\n newFields[fieldIndex] = {\n ...newFields[fieldIndex],\n display: processor,\n };\n }\n\n newData[frameIndex] = {\n ...newFrame,\n fields: newFields,\n };\n }\n\n return newData;\n}\n","import { toNumber } from 'lodash';\n\nimport { DataFrame, DisplayValue, TimeZone } from '../types';\nimport { formattedValueToString } from '../valueFormats';\n\nimport { getDisplayProcessor } from './displayProcessor';\n\n/**\n * Creates a proxy object that allows accessing fields on dataFrame through various means and then returns it's\n * display value. This is mainly useful for example in data links interpolation where you can easily create a scoped\n * variable that will allow you to access dataFrame data with ${__data.fields.fieldName}.\n * Allows accessing fields by name, index, displayName or 'name' label\n *\n * @param options\n * @internal\n */\nexport function getFieldDisplayValuesProxy(options: {\n frame: DataFrame;\n rowIndex: number;\n timeZone?: TimeZone;\n}): Record<string, DisplayValue> {\n return new Proxy({} as Record<string, DisplayValue>, {\n get: (obj: any, key: string): DisplayValue | undefined => {\n // 1. Match the name\n let field = options.frame.fields.find((f) => key === f.name);\n if (!field) {\n // 2. Match the array index\n const k = toNumber(key);\n field = options.frame.fields[k];\n }\n if (!field) {\n // 3. Match the config displayName\n field = options.frame.fields.find((f) => key === f.config.displayName);\n }\n if (!field) {\n // 4. Match the name label\n field = options.frame.fields.find((f) => {\n if (f.labels) {\n return key === f.labels.name;\n }\n return false;\n });\n }\n if (!field) {\n return undefined;\n }\n // TODO: we could supply the field here for the getDisplayProcessor fallback but we would also need theme which\n // we do not have access to here\n const displayProcessor = field.display ?? getDisplayProcessor();\n const raw = field.values.get(options.rowIndex);\n const disp = displayProcessor(raw);\n disp.toString = () => formattedValueToString(disp);\n return disp;\n },\n });\n}\n","import { toString, isEmpty } from 'lodash';\n\nimport { DataFrameView } from '../dataframe/DataFrameView';\nimport { getTimeField } from '../dataframe/processDataFrame';\nimport { GrafanaTheme2 } from '../themes';\nimport { getFieldMatcher } from '../transformations';\nimport { reduceField, ReducerID } from '../transformations/fieldReducer';\nimport { FieldMatcherID } from '../transformations/matchers/ids';\nimport {\n DataFrame,\n DisplayValue,\n DisplayValueAlignmentFactors,\n Field,\n FieldConfig,\n FieldConfigSource,\n FieldType,\n InterpolateFunction,\n LinkModel,\n TimeRange,\n TimeZone,\n} from '../types';\nimport { ScopedVars } from '../types/ScopedVars';\n\nimport { getDisplayProcessor } from './displayProcessor';\nimport { getFieldDisplayName } from './fieldState';\n\n/**\n * Options for how to turn DataFrames into an array of display values\n */\nexport interface ReduceDataOptions {\n /* If true show each row value */\n values?: boolean;\n /** if showing all values limit */\n limit?: number;\n /** When !values, pick one value for the whole field */\n calcs: string[];\n /** Which fields to show. By default this is only numeric fields */\n fields?: string;\n}\n\n// TODO: use built in variables, same as for data links?\nexport const VAR_SERIES_NAME = '__series.name';\nexport const VAR_FIELD_NAME = '__field.displayName'; // Includes the rendered tags and naming strategy\nexport const VAR_FIELD_LABELS = '__field.labels';\nexport const VAR_CALC = '__calc';\nexport const VAR_CELL_PREFIX = '__cell_'; // consistent with existing table templates\n\nexport interface FieldSparkline {\n y: Field; // Y values\n x?: Field; // if this does not exist, use the index\n timeRange?: TimeRange; // Optionally force an absolute time\n highlightIndex?: number;\n}\n\nexport interface FieldDisplay {\n name: string; // The field name (title is in display)\n field: FieldConfig;\n display: DisplayValue;\n sparkline?: FieldSparkline;\n\n // Expose to the original values for delayed inspection (DataLinks etc)\n view?: DataFrameView;\n colIndex?: number; // The field column index\n rowIndex?: number; // only filled in when the value is from a row (ie, not a reduction)\n getLinks?: () => LinkModel[];\n hasLinks: boolean;\n}\n\nexport interface GetFieldDisplayValuesOptions {\n data?: DataFrame[];\n reduceOptions: ReduceDataOptions;\n fieldConfig: FieldConfigSource;\n replaceVariables: InterpolateFunction;\n sparkline?: boolean; // Calculate the sparkline\n theme: GrafanaTheme2;\n timeZone?: TimeZone;\n}\n\nexport const DEFAULT_FIELD_DISPLAY_VALUES_LIMIT = 25;\n\nexport const getFieldDisplayValues = (options: GetFieldDisplayValuesOptions): FieldDisplay[] => {\n const { replaceVariables, reduceOptions, timeZone, theme } = options;\n const calcs = reduceOptions.calcs.length ? reduceOptions.calcs : [ReducerID.last];\n\n const values: FieldDisplay[] = [];\n const fieldMatcher = getFieldMatcher(\n reduceOptions.fields\n ? {\n id: FieldMatcherID.byRegexp,\n options: reduceOptions.fields,\n }\n : {\n id: FieldMatcherID.numeric,\n }\n );\n\n const data = options.data ?? [];\n const limit = reduceOptions.limit ? reduceOptions.limit : DEFAULT_FIELD_DISPLAY_VALUES_LIMIT;\n const scopedVars: ScopedVars = {};\n\n let hitLimit = false;\n\n for (let s = 0; s < data.length && !hitLimit; s++) {\n const dataFrame = data[s]; // Name is already set\n\n const { timeField } = getTimeField(dataFrame);\n const view = new DataFrameView(dataFrame);\n\n for (let i = 0; i < dataFrame.fields.length && !hitLimit; i++) {\n const field = dataFrame.fields[i];\n const fieldLinksSupplier = field.getLinks;\n\n // To filter out time field, need an option for this\n if (!fieldMatcher(field, dataFrame, data)) {\n continue;\n }\n\n let config = field.config; // already set by the prepare task\n\n if (field.state?.range) {\n // Us the global min/max values\n config = {\n ...config,\n ...field.state?.range,\n };\n }\n\n const displayName = field.config.displayName ?? '';\n\n const display =\n field.display ??\n getDisplayProcessor({\n field,\n theme: options.theme,\n timeZone,\n });\n\n // Show all rows\n if (reduceOptions.values) {\n const usesCellValues = displayName.indexOf(VAR_CELL_PREFIX) >= 0;\n\n for (let j = 0; j < field.values.length; j++) {\n // Add all the row variables\n if (usesCellValues) {\n for (let k = 0; k < dataFrame.fields.length; k++) {\n const f = dataFrame.fields[k];\n const v = f.values.get(j);\n scopedVars[VAR_CELL_PREFIX + k] = {\n value: v,\n text: toString(v),\n };\n }\n }\n\n field.state = setIndexForPaletteColor(field, values.length);\n\n const displayValue = display(field.values.get(j));\n const rowName = getSmartDisplayNameForRow(dataFrame, field, j, replaceVariables, scopedVars);\n const overrideColor = lookupRowColorFromOverride(rowName, options.fieldConfig, theme);\n\n values.push({\n name: '',\n field: config,\n display: {\n ...displayValue,\n title: rowName,\n color: overrideColor ?? displayValue.color,\n },\n view,\n colIndex: i,\n rowIndex: j,\n getLinks: fieldLinksSupplier\n ? () =>\n fieldLinksSupplier({\n valueRowIndex: j,\n })\n : () => [],\n hasLinks: hasLinks(field),\n });\n\n if (values.length >= limit) {\n hitLimit = true;\n break;\n }\n }\n } else {\n const results = reduceField({\n field,\n reducers: calcs, // The stats to calculate\n });\n\n for (const calc of calcs) {\n scopedVars[VAR_CALC] = { value: calc, text: calc };\n const displayValue = display(results[calc]);\n\n if (displayName !== '') {\n displayValue.title = replaceVariables(displayName, {\n ...field.state?.scopedVars, // series and field scoped vars\n ...scopedVars,\n });\n } else {\n displayValue.title = getFieldDisplayName(field, dataFrame, data);\n }\n\n let sparkline: FieldSparkline | undefined = undefined;\n if (options.sparkline) {\n sparkline = {\n y: dataFrame.fields[i],\n x: timeField,\n };\n if (calc === ReducerID.last) {\n sparkline.highlightIndex = sparkline.y.values.length - 1;\n } else if (calc === ReducerID.first) {\n sparkline.highlightIndex = 0;\n }\n }\n\n values.push({\n name: calc,\n field: config,\n display: displayValue,\n sparkline,\n view,\n colIndex: i,\n getLinks: fieldLinksSupplier\n ? () =>\n fieldLinksSupplier({\n calculatedValue: displayValue,\n })\n : () => [],\n hasLinks: hasLinks(field),\n });\n }\n }\n }\n }\n\n if (values.length === 0) {\n values.push(createNoValuesFieldDisplay(options));\n }\n\n return values;\n};\n\nfunction getSmartDisplayNameForRow(\n frame: DataFrame,\n field: Field,\n rowIndex: number,\n replaceVariables: InterpolateFunction,\n scopedVars: ScopedVars\n): string {\n let parts: string[] = [];\n let otherNumericFields = 0;\n\n if (field.config.displayName) {\n return replaceVariables(field.config.displayName, {\n ...field.state?.scopedVars, // series and field scoped vars\n ...scopedVars,\n });\n }\n\n for (const otherField of frame.fields) {\n if (otherField === field) {\n continue;\n }\n\n if (otherField.type === FieldType.string) {\n const value = otherField.values.get(rowIndex) ?? '';\n const mappedValue = otherField.display ? otherField.display(value).text : value;\n if (mappedValue.length > 0) {\n parts.push(mappedValue);\n }\n } else if (otherField.type === FieldType.number) {\n otherNumericFields++;\n }\n }\n\n if (otherNumericFields || parts.length === 0) {\n parts.push(getFieldDisplayName(field, frame));\n }\n\n return parts.join(' ');\n}\n\n/**\n * Palette color modes use series index (field index) which does not work for when displaing rows\n * So updating seriesIndex here makes the palette color modes work in \"All values\" mode\n */\nfunction setIndexForPaletteColor(field: Field, currentLength: number) {\n return {\n ...field.state,\n seriesIndex: currentLength,\n };\n}\n\n/**\n * This function makes overrides that set color work for row values\n */\nfunction lookupRowColorFromOverride(displayName: string, fieldConfig: FieldConfigSource, theme: GrafanaTheme2) {\n for (const override of fieldConfig.overrides) {\n if (override.matcher.id === 'byName' && override.matcher.options === displayName) {\n for (const prop of override.properties) {\n if (prop.id === 'color' && prop.value) {\n return theme.visualization.getColorByName(prop.value.fixedColor);\n }\n }\n }\n }\n\n return null;\n}\n\nexport function hasLinks(field: Field): boolean {\n return field.config?.links?.length ? field.config.links.length > 0 : false;\n}\n\nexport function getDisplayValueAlignmentFactors(values: FieldDisplay[]): DisplayValueAlignmentFactors {\n const info: DisplayValueAlignmentFactors = {\n title: '',\n text: '',\n };\n\n let prefixLength = 0;\n let suffixLength = 0;\n\n for (let i = 0; i < values.length; i++) {\n const v = values[i].display;\n\n if (v.text && v.text.length > info.text.length) {\n info.text = v.text;\n }\n\n if (v.title && v.title.length > info.title.length) {\n info.title = v.title;\n }\n\n if (v.prefix && v.prefix.length > prefixLength) {\n info.prefix = v.prefix;\n prefixLength = v.prefix.length;\n }\n\n if (v.suffix && v.suffix.length > suffixLength) {\n info.suffix = v.suffix;\n suffixLength = v.suffix.length;\n }\n }\n return info;\n}\n\nfunction createNoValuesFieldDisplay(options: GetFieldDisplayValuesOptions): FieldDisplay {\n const displayName = 'No data';\n const { fieldConfig, timeZone } = options;\n const { defaults } = fieldConfig;\n\n const displayProcessor = getDisplayProcessor({\n field: {\n type: FieldType.other,\n config: defaults,\n },\n theme: options.theme,\n timeZone,\n });\n\n const display = displayProcessor(null);\n const text = getDisplayText(display, displayName);\n\n return {\n name: displayName,\n field: {\n ...defaults,\n max: defaults.max ?? 0,\n min: defaults.min ?? 0,\n },\n display: {\n text,\n numeric: 0,\n color: display.color,\n },\n hasLinks: false,\n };\n}\n\nfunction getDisplayText(display: DisplayValue, fallback: string): string {\n if (!display || isEmpty(display.text)) {\n return fallback;\n }\n return display.text;\n}\n","import {\n DataLink,\n Field,\n FieldOverrideContext,\n SelectableValue,\n SliderMarks,\n ThresholdsConfig,\n ValueMapping,\n} from '../../types';\n\nexport const identityOverrideProcessor = <T>(value: T, _context: FieldOverrideContext, _settings: any) => {\n return value;\n};\n\nexport interface NumberFieldConfigSettings {\n placeholder?: string;\n integer?: boolean;\n min?: number;\n max?: number;\n step?: number;\n}\n\nexport const numberOverrideProcessor = (\n value: any,\n context: FieldOverrideContext,\n settings?: NumberFieldConfigSettings\n) => {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n return parseFloat(value);\n};\n\nexport const displayNameOverrideProcessor = (\n value: any,\n context: FieldOverrideContext,\n settings?: StringFieldConfigSettings\n) => {\n // clear the cached display name\n delete context.field?.state?.displayName;\n return stringOverrideProcessor(value, context, settings);\n};\n\nexport interface SliderFieldConfigSettings {\n min: number;\n max: number;\n step?: number;\n included?: boolean;\n marks?: SliderMarks;\n ariaLabelForHandle?: string;\n}\n\nexport interface DataLinksFieldConfigSettings {}\n\nexport const dataLinksOverrideProcessor = (\n value: any,\n _context: FieldOverrideContext,\n _settings?: DataLinksFieldConfigSettings\n) => {\n return value as DataLink[];\n};\n\nexport interface ValueMappingFieldConfigSettings {}\n\nexport const valueMappingsOverrideProcessor = (\n value: any,\n _context: FieldOverrideContext,\n _settings?: ValueMappingFieldConfigSettings\n) => {\n return value as ValueMapping[]; // !!!! likely not !!!!\n};\n\nexport interface SelectFieldConfigSettings<T> {\n allowCustomValue?: boolean;\n\n isClearable?: boolean;\n\n /** The default options */\n options: Array<SelectableValue<T>>;\n\n /** Optionally use the context to define the options */\n getOptions?: (context: FieldOverrideContext) => Promise<Array<SelectableValue<T>>>;\n}\n\nexport const selectOverrideProcessor = (\n value: any,\n _context: FieldOverrideContext,\n _settings?: SelectFieldConfigSettings<any>\n) => {\n return value;\n};\n\nexport interface StringFieldConfigSettings {\n placeholder?: string;\n maxLength?: number;\n expandTemplateVars?: boolean;\n useTextarea?: boolean;\n rows?: number;\n}\n\nexport const stringOverrideProcessor = (\n value: any,\n context: FieldOverrideContext,\n settings?: StringFieldConfigSettings\n) => {\n if (value === null || value === undefined) {\n return value;\n }\n if (settings && settings.expandTemplateVars && context.replaceVariables) {\n return context.replaceVariables(value, context.field!.state!.scopedVars);\n }\n return `${value}`;\n};\n\nexport interface ThresholdsFieldConfigSettings {\n // Anything?\n}\n\nexport const thresholdsOverrideProcessor = (\n value: any,\n _context: FieldOverrideContext,\n _settings?: ThresholdsFieldConfigSettings\n) => {\n return value as ThresholdsConfig; // !!!! likely not !!!!\n};\n\nexport interface UnitFieldConfigSettings {\n isClearable?: boolean;\n}\n\nexport const unitOverrideProcessor = (\n value: boolean,\n _context: FieldOverrideContext,\n _settings?: UnitFieldConfigSettings\n) => {\n return value;\n};\n\nexport const booleanOverrideProcessor = (\n value: boolean,\n _context: FieldOverrideContext,\n _settings?: ThresholdsFieldConfigSettings\n) => {\n return value; // !!!! likely not !!!!\n};\n\nexport interface FieldColorConfigSettings {\n /**\n * When switching to a visualization that does not support by value coloring then Grafana will\n * switch to a by series palette based color mode\n */\n byValueSupport?: boolean;\n /**\n * When switching to a visualization that has this set to true then Grafana will change color mode\n * to from thresholds if it was set to a by series palette\n */\n preferThresholdsMode?: boolean;\n /**\n * Set to true if the visualization supports both by value and by series\n * This will enable the Color by series UI option that sets the `color.seriesBy` option.\n */\n bySeriesSupport?: boolean;\n}\n\nexport interface StatsPickerConfigSettings {\n /**\n * Enable multi-selection in the stats picker\n */\n allowMultiple: boolean;\n /**\n * Default stats to be use in the stats picker\n */\n defaultStat?: string;\n}\n\nexport interface FieldNamePickerConfigSettings {\n /**\n * Function is a predicate, to test each element of the array.\n * Return a value that coerces to true to keep the field, or to false otherwise.\n */\n filter?: (field: Field) => boolean;\n\n /**\n * Show this text when no values are found\n */\n noFieldsMessage?: string;\n\n /**addFieldNamePicker\n * Sets the width to a pixel value.\n */\n width?: number;\n\n /**\n * Placeholder text to display when nothing is selected.\n */\n placeholderText?: string;\n}\n","import { isNumber } from 'lodash';\n\nimport { GrafanaTheme2 } from '../themes/types';\nimport { reduceField, ReducerID } from '../transformations/fieldReducer';\nimport { Field, FieldConfig, FieldType, NumericRange, Threshold } from '../types';\n\nimport { getFieldColorModeForField } from './fieldColor';\nimport { getActiveThresholdForValue } from './thresholds';\n\nexport interface ColorScaleValue {\n percent: number; // 0-1\n threshold: Threshold;\n color: string;\n}\n\nexport type ScaleCalculator = (value: number) => ColorScaleValue;\n\nexport function getScaleCalculator(field: Field, theme: GrafanaTheme2): ScaleCalculator {\n if (field.type === FieldType.boolean) {\n return getBooleanScaleCalculator(field, theme);\n }\n\n const mode = getFieldColorModeForField(field);\n const getColor = mode.getCalculator(field, theme);\n const info = field.state?.range ?? getMinMaxAndDelta(field);\n\n return (value: number) => {\n let percent = 0;\n\n if (value !== -Infinity) {\n percent = (value - info.min!) / info.delta;\n\n if (Number.isNaN(percent)) {\n percent = 0;\n }\n }\n\n const threshold = getActiveThresholdForValue(field, value, percent);\n\n return {\n percent,\n threshold,\n color: getColor(value, percent, threshold),\n };\n };\n}\n\nfunction getBooleanScaleCalculator(field: Field, theme: GrafanaTheme2): ScaleCalculator {\n const trueValue: ColorScaleValue = {\n color: theme.visualization.getColorByName('green'),\n percent: 1,\n threshold: undefined as unknown as Threshold,\n };\n\n const falseValue: ColorScaleValue = {\n color: theme.visualization.getColorByName('red'),\n percent: 0,\n threshold: undefined as unknown as Threshold,\n };\n\n const mode = getFieldColorModeForField(field);\n if (mode.isContinuous && mode.getColors) {\n const colors = mode.getColors(theme);\n trueValue.color = colors[colors.length - 1];\n falseValue.color = colors[0];\n }\n\n return (value: number) => {\n return Boolean(value) ? trueValue : falseValue;\n };\n}\n\nexport function getMinMaxAndDelta(field: Field): NumericRange {\n if (field.type !== FieldType.number) {\n return { min: 0, max: 100, delta: 100 };\n }\n\n // Calculate min/max if required\n let min = field.config.min;\n let max = field.config.max;\n\n if (!isNumber(min) || !isNumber(max)) {\n if (field.values && field.values.length) {\n const stats = reduceField({ field, reducers: [ReducerID.min, ReducerID.max] });\n if (!isNumber(min)) {\n min = stats[ReducerID.min];\n }\n if (!isNumber(max)) {\n max = stats[ReducerID.max];\n }\n } else {\n min = 0;\n max = 100;\n }\n }\n\n return {\n min,\n max,\n delta: max! - min!,\n };\n}\n\n/**\n * @internal\n */\nexport function getFieldConfigWithMinMax(field: Field, local?: boolean): FieldConfig {\n const { config } = field;\n let { min, max } = config;\n\n if (isNumber(min) && isNumber(max)) {\n return config;\n }\n\n if (local || !field.state?.range) {\n return { ...config, ...getMinMaxAndDelta(field) };\n }\n\n return { ...config, ...field.state.range };\n}\n","import { ComponentType } from 'react';\n\nimport { EventBus } from '../events';\nimport { DataFrame, InterpolateFunction, VariableSuggestionsScope, VariableSuggestion } from '../types';\nimport { Registry, RegistryItem } from '../utils/Registry';\n\nimport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\n\nexport interface StandardEditorContext<TOptions, TState = any> {\n data: DataFrame[]; // All results\n replaceVariables?: InterpolateFunction;\n eventBus?: EventBus;\n getSuggestions?: (scope?: VariableSuggestionsScope) => VariableSuggestion[];\n options?: TOptions;\n instanceState?: TState;\n isOverride?: boolean;\n}\n\nexport interface StandardEditorProps<TValue = any, TSettings = any, TOptions = any, TState = any> {\n value: TValue;\n onChange: (value?: TValue) => void;\n item: StandardEditorsRegistryItem<TValue, TSettings>;\n context: StandardEditorContext<TOptions, TState>;\n id?: string;\n}\nexport interface StandardEditorsRegistryItem<TValue = any, TSettings = any> extends RegistryItem {\n editor: ComponentType<StandardEditorProps<TValue, TSettings>>;\n settings?: TSettings;\n}\nexport const standardFieldConfigEditorRegistry = new FieldConfigOptionsRegistry();\n\nexport const standardEditorsRegistry = new Registry<StandardEditorsRegistryItem<any>>();\n","import { Threshold, FALLBACK_COLOR, Field, ThresholdsMode } from '../types';\n\nexport const fallBackTreshold: Threshold = { value: 0, color: FALLBACK_COLOR };\n\nexport function getActiveThreshold(value: number, thresholds: Threshold[] | undefined): Threshold {\n if (!thresholds || thresholds.length === 0) {\n return fallBackTreshold;\n }\n\n let active = thresholds[0];\n\n for (const threshold of thresholds) {\n if (value >= threshold.value) {\n active = threshold;\n } else {\n break;\n }\n }\n\n return active;\n}\n\nexport function getActiveThresholdForValue(field: Field, value: number, percent: number): Threshold {\n const { thresholds } = field.config;\n\n if (thresholds?.mode === ThresholdsMode.Percentage) {\n return getActiveThreshold(percent * 100, thresholds?.steps);\n }\n\n return getActiveThreshold(value, thresholds?.steps);\n}\n\n/**\n * Sorts the thresholds\n */\nexport function sortThresholds(thresholds: Threshold[]) {\n return thresholds.sort((t1, t2) => t1.value - t2.value);\n}\n","import EventEmitter from 'eventemitter3';\nimport { Unsubscribable, Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nimport {\n EventBus,\n LegacyEmitter,\n BusEventHandler,\n BusEventType,\n LegacyEventHandler,\n BusEvent,\n AppEvent,\n EventFilterOptions,\n} from './types';\n\n/**\n * @alpha\n */\nexport class EventBusSrv implements EventBus, LegacyEmitter {\n private emitter: EventEmitter;\n\n constructor() {\n this.emitter = new EventEmitter();\n }\n\n publish<T extends BusEvent>(event: T): void {\n this.emitter.emit(event.type, event);\n }\n\n subscribe<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n return this.getStream(typeFilter).subscribe({ next: handler });\n }\n\n getStream<T extends BusEvent>(eventType: BusEventType<T>): Observable<T> {\n return new Observable<T>((observer) => {\n const handler = (event: T) => {\n observer.next(event);\n };\n\n this.emitter.on(eventType.type, handler);\n\n return () => {\n this.emitter.off(eventType.type, handler);\n };\n });\n }\n\n newScopedBus(key: string, filter?: EventFilterOptions): EventBus {\n return new ScopedEventBus([key], this, filter);\n }\n\n /**\n * Legacy functions\n */\n emit<T>(event: AppEvent<T> | string, payload?: T | any): void {\n // console.log(`Deprecated emitter function used (emit), use $emit`);\n\n if (typeof event === 'string') {\n this.emitter.emit(event, { type: event, payload });\n } else {\n this.emitter.emit(event.name, { type: event.name, payload });\n }\n }\n\n on<T>(event: AppEvent<T> | string, handler: LegacyEventHandler<T>, scope?: any) {\n // console.log(`Deprecated emitter function used (on), use $on`);\n\n // need this wrapper to make old events compatible with old handlers\n handler.wrapper = (emittedEvent: BusEvent) => {\n handler(emittedEvent.payload);\n };\n\n if (typeof event === 'string') {\n this.emitter.on(event, handler.wrapper);\n } else {\n this.emitter.on(event.name, handler.wrapper);\n }\n\n if (scope) {\n const unbind = scope.$on('$destroy', () => {\n this.off(event, handler);\n unbind();\n });\n }\n }\n\n off<T>(event: AppEvent<T> | string, handler: LegacyEventHandler<T>) {\n if (typeof event === 'string') {\n this.emitter.off(event, handler.wrapper);\n return;\n }\n\n this.emitter.off(event.name, handler.wrapper);\n }\n\n removeAllListeners() {\n this.emitter.removeAllListeners();\n }\n}\n\n/**\n * Wraps EventBus and adds a source to help with identifying if a subscriber should react to the event or not.\n */\nclass ScopedEventBus implements EventBus {\n // will be mutated by panel runners\n filterConfig: EventFilterOptions;\n\n // The path is not yet exposed, but can be used to indicate nested groups and support faster filtering\n constructor(public path: string[], private eventBus: EventBus, filter?: EventFilterOptions) {\n this.filterConfig = filter ?? { onlyLocal: false };\n }\n\n publish<T extends BusEvent>(event: T): void {\n if (!event.origin) {\n (event as any).origin = this;\n }\n this.eventBus.publish(event);\n }\n\n filter = (event: BusEvent) => {\n if (this.filterConfig.onlyLocal) {\n return event.origin === this;\n }\n return true;\n };\n\n getStream<T extends BusEvent>(eventType: BusEventType<T>): Observable<T> {\n return this.eventBus.getStream(eventType).pipe(filter(this.filter)) as Observable<T>;\n }\n\n // syntax sugar\n subscribe<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n return this.getStream(typeFilter).subscribe({ next: handler });\n }\n\n removeAllListeners(): void {\n this.eventBus.removeAllListeners();\n }\n\n /**\n * Creates a nested event bus structure\n */\n newScopedBus(key: string, filter: EventFilterOptions): EventBus {\n return new ScopedEventBus([...this.path, key], this, filter);\n }\n}\n","import { AnnotationEvent, DataFrame } from '../types';\n\nimport { BusEventBase, BusEventWithPayload } from './types';\n\n/**\n * When hovering over an element this will identify\n *\n * For performance reasons, this object will usually be mutated between updates. This\n * will avoid creating new objects for events that fire frequently (ie each mouse pixel)\n *\n * @alpha\n */\nexport interface DataHoverPayload {\n data?: DataFrame; // source data\n rowIndex?: number; // the hover row\n columnIndex?: number; // the hover column\n dataId?: string; // identifying string to correlate data between publishers and subscribers\n\n // When dragging, this will capture the point when the mouse was down\n point: Record<string, any>; // { time: 5678, lengthft: 456 } // each axis|scale gets a value\n down?: Record<string, any>;\n}\n\n/** @alpha */\nexport class DataHoverEvent extends BusEventWithPayload<DataHoverPayload> {\n static type = 'data-hover';\n}\n\n/** @alpha */\nexport class DataHoverClearEvent extends BusEventBase {\n static type = 'data-hover-clear';\n}\n\n/** @alpha */\nexport class DataSelectEvent extends BusEventWithPayload<DataHoverPayload> {\n static type = 'data-select';\n}\n\n/** @alpha */\nexport class AnnotationChangeEvent extends BusEventWithPayload<Partial<AnnotationEvent>> {\n static type = 'annotation-event';\n}\n\n// Loaded the first time a dashboard is loaded (not on every render)\nexport type DashboardLoadedEventPayload<T> = {\n dashboardId: string;\n orgId?: number;\n userId?: number;\n grafanaVersion?: string;\n queries: Record<string, T[]>;\n};\n\n/** @alpha */\nexport class DashboardLoadedEvent<T> extends BusEventWithPayload<DashboardLoadedEventPayload<T>> {\n static type = 'dashboard-loaded';\n}\n","import { Registry, RegistryItem } from '../utils/Registry';\n\n/**\n * @alpha\n */\nexport interface MonacoLanguageRegistryItem extends RegistryItem {\n init: () => Promise<void>;\n}\n\n/**\n * @alpha\n */\nexport const monacoLanguageRegistry = new Registry<MonacoLanguageRegistryItem>();\n","import { PluggableMap } from 'ol';\nimport BaseLayer from 'ol/layer/Base';\nimport { ReactNode } from 'react';\n\nimport { EventBus } from '../events';\nimport { GrafanaTheme2 } from '../themes';\nimport { MatcherConfig, PanelData } from '../types';\nimport { PanelOptionsEditorBuilder } from '../utils';\nimport { RegistryItemWithOptions } from '../utils/Registry';\n\n/**\n * @alpha\n */\nexport enum FrameGeometrySourceMode {\n Auto = 'auto', // Will scan fields and find best match\n Geohash = 'geohash',\n Coords = 'coords', // lon field, lat field\n Lookup = 'lookup', // keys > location\n // H3 = 'h3',\n // WKT = 'wkt,\n // geojson? geometry text\n}\n\n/**\n * @alpha\n */\nexport interface FrameGeometrySource {\n mode: FrameGeometrySourceMode;\n\n // Field mappings\n geohash?: string;\n latitude?: string;\n longitude?: string;\n h3?: string;\n wkt?: string;\n lookup?: string;\n\n // Path to Gazetteer\n gazetteer?: string;\n}\n\n/**\n * This gets saved in panel json\n *\n * depending on the type, it may have additional config\n *\n * This exists in `grafana/data` so the types are well known and extendable but the\n * layout/frame is control by the map panel\n *\n * @alpha\n */\nexport interface MapLayerOptions<TConfig = any> {\n type: string;\n name: string; // configured unique display name\n\n // Custom options depending on the type\n config?: TConfig;\n\n // Common method to define geometry fields\n location?: FrameGeometrySource;\n\n // Defines which data query refId is associated with the layer\n filterData?: MatcherConfig;\n\n // Common properties:\n // https://openlayers.org/en/latest/apidoc/module-ol_layer_Base-BaseLayer.html\n // Layer opacity (0-1)\n opacity?: number;\n\n // Check tooltip (defaults to true)\n tooltip?: boolean;\n}\n\n/**\n * @alpha\n */\nexport interface MapLayerHandler<TConfig = any> {\n init: () => BaseLayer;\n /**\n * The update function should only be implemented if the layer type makes use of query data\n */\n update?: (data: PanelData) => void;\n\n /** Optional callback to cleaup before getting removed */\n dispose?: () => void;\n\n /** return react node for the legend */\n legend?: ReactNode;\n\n /**\n * Show custom elements in the panel edit UI\n */\n registerOptionsUI?: (builder: PanelOptionsEditorBuilder<MapLayerOptions<TConfig>>) => void;\n}\n\n/**\n * Map layer configuration\n *\n * @alpha\n */\nexport interface MapLayerRegistryItem<TConfig = MapLayerOptions> extends RegistryItemWithOptions {\n /**\n * This layer can be used as a background\n */\n isBaseMap?: boolean;\n\n /**\n * Show location controls\n */\n showLocation?: boolean;\n\n /**\n * Hide transparency controls in UI\n */\n hideOpacity?: boolean;\n\n /**\n * Function that configures transformation and returns a transformer\n * @param options\n */\n create: (\n map: PluggableMap,\n options: MapLayerOptions<TConfig>,\n eventBus: EventBus,\n theme: GrafanaTheme2\n ) => Promise<MapLayerHandler>;\n}\n","export type LayoutMode = LayoutModes.Grid | LayoutModes.List;\n\nexport enum LayoutModes {\n Grid = 'grid',\n List = 'list',\n}\n","import { FieldConfigOptionsRegistry } from '../field/FieldConfigOptionsRegistry';\nimport { standardFieldConfigEditorRegistry } from '../field/standardFieldConfigEditorRegistry';\nimport { FieldConfigProperty, FieldConfigPropertyItem } from '../types/fieldOverrides';\nimport { FieldConfigEditorBuilder } from '../utils/OptionsUIBuilders';\n\nimport { SetFieldConfigOptionsArgs } from './PanelPlugin';\n\n/**\n * Helper functionality to create a field config registry.\n *\n * @param config - configuration to base the registry on.\n * @param pluginName - name of the plugin that will use the registry.\n * @internal\n */\nexport function createFieldConfigRegistry<TFieldConfigOptions>(\n config: SetFieldConfigOptionsArgs<TFieldConfigOptions> = {},\n pluginName: string\n): FieldConfigOptionsRegistry {\n const registry = new FieldConfigOptionsRegistry();\n const standardConfigs = standardFieldConfigEditorRegistry.list();\n const standardOptionsExtensions: Record<string, FieldConfigPropertyItem[]> = {};\n\n // Add custom options\n if (config.useCustomConfig) {\n const builder = new FieldConfigEditorBuilder<TFieldConfigOptions>();\n config.useCustomConfig(builder);\n\n for (const customProp of builder.getRegistry().list()) {\n customProp.isCustom = true;\n // need to do something to make the custom items not conflict with standard ones\n // problem is id (registry index) is used as property path\n // so sort of need a property path on the FieldPropertyEditorItem\n customProp.id = 'custom.' + customProp.id;\n\n if (isStandardConfigExtension(customProp, standardConfigs)) {\n const currentExtensions = standardOptionsExtensions[customProp.category![0]] ?? [];\n currentExtensions.push(customProp);\n standardOptionsExtensions[customProp.category![0]] = currentExtensions;\n } else {\n registry.register(customProp);\n }\n }\n }\n\n for (let fieldConfigProp of standardConfigs) {\n if (config.disableStandardOptions) {\n const isDisabled = config.disableStandardOptions.indexOf(fieldConfigProp.id as FieldConfigProperty) > -1;\n if (isDisabled) {\n continue;\n }\n }\n if (config.standardOptions) {\n const customDefault: any = config.standardOptions[fieldConfigProp.id as FieldConfigProperty]?.defaultValue;\n const customSettings: any = config.standardOptions[fieldConfigProp.id as FieldConfigProperty]?.settings;\n if (customDefault) {\n fieldConfigProp = {\n ...fieldConfigProp,\n defaultValue: customDefault,\n };\n }\n\n if (customSettings) {\n fieldConfigProp = {\n ...fieldConfigProp,\n settings: fieldConfigProp.settings ? { ...fieldConfigProp.settings, ...customSettings } : customSettings,\n };\n }\n }\n\n registry.register(fieldConfigProp);\n\n if (fieldConfigProp.category && standardOptionsExtensions[fieldConfigProp.category[0]]) {\n for (let extensionProperty of standardOptionsExtensions[fieldConfigProp.category[0]]) {\n registry.register(extensionProperty);\n }\n }\n }\n\n // assert that field configs do not use array path syntax\n for (const item of registry.list()) {\n if (item.path.indexOf('[') > 0) {\n throw new Error(`[${pluginName}] Field config paths do not support arrays: ${item.id}`);\n }\n }\n\n return registry;\n}\n\nfunction isStandardConfigExtension(property: FieldConfigPropertyItem, standardProperties: FieldConfigPropertyItem[]) {\n return Boolean(\n standardProperties.find((p) => property.category && p.category && property.category[0] === p.category[0])\n );\n}\n","import { set } from 'lodash';\nimport { ComponentClass, ComponentType } from 'react';\n\nimport { FieldConfigOptionsRegistry, StandardEditorContext } from '../field';\nimport {\n FieldConfigSource,\n GrafanaPlugin,\n PanelEditorProps,\n PanelMigrationHandler,\n PanelPluginMeta,\n PanelProps,\n PanelTypeChangedHandler,\n FieldConfigProperty,\n PanelPluginDataSupport,\n VisualizationSuggestionsSupplier,\n} from '../types';\nimport { deprecationWarning } from '../utils';\nimport { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders';\n\nimport { createFieldConfigRegistry } from './registryFactories';\n\n/** @beta */\nexport type StandardOptionConfig = {\n defaultValue?: any;\n settings?: any;\n};\n\n/** @beta */\nexport interface SetFieldConfigOptionsArgs<TFieldConfigOptions = any> {\n /**\n * Configuration object of the standard field config properites\n *\n * @example\n * ```typescript\n * {\n * standardOptions: {\n * [FieldConfigProperty.Decimals]: {\n * defaultValue: 3\n * }\n * }\n * }\n * ```\n */\n standardOptions?: Partial<Record<FieldConfigProperty, StandardOptionConfig>>;\n\n /**\n * Array of standard field config properties that should not be available in the panel\n * @example\n * ```typescript\n * {\n * disableStandardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max, FieldConfigProperty.Unit]\n * }\n * ```\n */\n disableStandardOptions?: FieldConfigProperty[];\n\n /**\n * Function that allows custom field config properties definition.\n *\n * @param builder\n *\n * @example\n * ```typescript\n * useCustomConfig: builder => {\n * builder\n * .addNumberInput({\n * id: 'shapeBorderWidth',\n * name: 'Border width',\n * description: 'Border width of the shape',\n * settings: {\n * min: 1,\n * max: 5,\n * },\n * })\n * .addSelect({\n * id: 'displayMode',\n * name: 'Display mode',\n * description: 'How the shape shout be rendered'\n * settings: {\n * options: [{value: 'fill', label: 'Fill' }, {value: 'transparent', label: 'Transparent }]\n * },\n * })\n * }\n * ```\n */\n useCustomConfig?: (builder: FieldConfigEditorBuilder<TFieldConfigOptions>) => void;\n}\n\nexport type PanelOptionsSupplier<TOptions> = (\n builder: PanelOptionsEditorBuilder<TOptions>,\n context: StandardEditorContext<TOptions>\n) => void;\n\nexport class PanelPlugin<\n TOptions = any,\n TFieldConfigOptions extends object = any\n> extends GrafanaPlugin<PanelPluginMeta> {\n private _defaults?: TOptions;\n private _fieldConfigDefaults: FieldConfigSource<TFieldConfigOptions> = {\n defaults: {},\n overrides: [],\n };\n\n private _fieldConfigRegistry?: FieldConfigOptionsRegistry;\n private _initConfigRegistry = () => {\n return new FieldConfigOptionsRegistry();\n };\n\n private optionsSupplier?: PanelOptionsSupplier<TOptions>;\n private suggestionsSupplier?: VisualizationSuggestionsSupplier;\n\n panel: ComponentType<PanelProps<TOptions>> | null;\n editor?: ComponentClass<PanelEditorProps<TOptions>>;\n onPanelMigration?: PanelMigrationHandler<TOptions>;\n onPanelTypeChanged?: PanelTypeChangedHandler<TOptions>;\n noPadding?: boolean;\n dataSupport: PanelPluginDataSupport = {\n annotations: false,\n alertStates: false,\n };\n\n /**\n * Legacy angular ctrl. If this exists it will be used instead of the panel\n */\n angularPanelCtrl?: any;\n\n constructor(panel: ComponentType<PanelProps<TOptions>> | null) {\n super();\n this.panel = panel;\n }\n\n get defaults() {\n let result = this._defaults || {};\n\n if (!this._defaults && this.optionsSupplier) {\n const builder = new PanelOptionsEditorBuilder<TOptions>();\n this.optionsSupplier(builder, { data: [] });\n for (const item of builder.getItems()) {\n if (item.defaultValue != null) {\n set(result, item.path, item.defaultValue);\n }\n }\n }\n\n return result;\n }\n\n get fieldConfigDefaults(): FieldConfigSource<TFieldConfigOptions> {\n const configDefaults = this._fieldConfigDefaults.defaults;\n configDefaults.custom = {} as TFieldConfigOptions;\n\n for (const option of this.fieldConfigRegistry.list()) {\n if (option.defaultValue === undefined) {\n continue;\n }\n\n set(configDefaults, option.id, option.defaultValue);\n }\n\n return {\n defaults: {\n ...configDefaults,\n },\n overrides: this._fieldConfigDefaults.overrides,\n };\n }\n\n /**\n * @deprecated setDefaults is deprecated in favor of setPanelOptions\n */\n setDefaults(defaults: TOptions) {\n deprecationWarning('PanelPlugin', 'setDefaults', 'setPanelOptions');\n this._defaults = defaults;\n return this;\n }\n\n get fieldConfigRegistry() {\n if (!this._fieldConfigRegistry) {\n this._fieldConfigRegistry = this._initConfigRegistry();\n }\n\n return this._fieldConfigRegistry;\n }\n\n /**\n * @deprecated setEditor is deprecated in favor of setPanelOptions\n */\n setEditor(editor: ComponentClass<PanelEditorProps<TOptions>>) {\n deprecationWarning('PanelPlugin', 'setEditor', 'setPanelOptions');\n this.editor = editor;\n return this;\n }\n\n setNoPadding() {\n this.noPadding = true;\n return this;\n }\n\n /**\n * This function is called before the panel first loads if\n * the current version is different than the version that was saved.\n *\n * This is a good place to support any changes to the options model\n */\n setMigrationHandler(handler: PanelMigrationHandler<TOptions>) {\n this.onPanelMigration = handler;\n return this;\n }\n\n /**\n * This function is called when the visualization was changed. This\n * passes in the panel model for previous visualisation options inspection\n * and panel model updates.\n *\n * This is useful for supporting PanelModel API updates when changing\n * between Angular and React panels.\n */\n setPanelChangeHandler(handler: PanelTypeChangedHandler) {\n this.onPanelTypeChanged = handler;\n return this;\n }\n\n /**\n * Enables panel options editor creation\n *\n * @example\n * ```typescript\n *\n * import { ShapePanel } from './ShapePanel';\n *\n * interface ShapePanelOptions {}\n *\n * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n * .setPanelOptions(builder => {\n * builder\n * .addSelect({\n * id: 'shape',\n * name: 'Shape',\n * description: 'Select shape to render'\n * settings: {\n * options: [\n * {value: 'circle', label: 'Circle' },\n * {value: 'square', label: 'Square },\n * {value: 'triangle', label: 'Triangle }\n * ]\n * },\n * })\n * })\n * ```\n *\n * @public\n **/\n setPanelOptions(builder: PanelOptionsSupplier<TOptions>) {\n // builder is applied lazily when options UI is created\n this.optionsSupplier = builder;\n return this;\n }\n\n /**\n * This is used while building the panel options editor.\n *\n * @internal\n */\n getPanelOptionsSupplier(): PanelOptionsSupplier<TOptions> {\n return this.optionsSupplier ?? ((() => {}) as PanelOptionsSupplier<TOptions>);\n }\n\n /**\n * Tells Grafana if the plugin should subscribe to annotation and alertState results.\n *\n * @example\n * ```typescript\n *\n * import { ShapePanel } from './ShapePanel';\n *\n * interface ShapePanelOptions {}\n *\n * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n * .useFieldConfig({})\n * ...\n * ...\n * .setDataSupport({\n * annotations: true,\n * alertStates: true,\n * });\n * ```\n *\n * @public\n **/\n setDataSupport(support: Partial<PanelPluginDataSupport>) {\n this.dataSupport = { ...this.dataSupport, ...support };\n return this;\n }\n\n /**\n * Allows specifying which standard field config options panel should use and defining default values\n *\n * @example\n * ```typescript\n *\n * import { ShapePanel } from './ShapePanel';\n *\n * interface ShapePanelOptions {}\n *\n * // when plugin should use all standard options\n * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n * .useFieldConfig();\n *\n * // when plugin should only display specific standard options\n * // note, that options will be displayed in the order they are provided\n * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n * .useFieldConfig({\n * standardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max]\n * });\n *\n * // when standard option's default value needs to be provided\n * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n * .useFieldConfig({\n * standardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max],\n * standardOptionsDefaults: {\n * [FieldConfigProperty.Min]: 20,\n * [FieldConfigProperty.Max]: 100\n * }\n * });\n *\n * // when custom field config options needs to be provided\n * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n * .useFieldConfig({\n * useCustomConfig: builder => {\n * builder\n * .addNumberInput({\n * id: 'shapeBorderWidth',\n * name: 'Border width',\n * description: 'Border width of the shape',\n * settings: {\n * min: 1,\n * max: 5,\n * },\n * })\n * .addSelect({\n * id: 'displayMode',\n * name: 'Display mode',\n * description: 'How the shape shout be rendered'\n * settings: {\n * options: [{value: 'fill', label: 'Fill' }, {value: 'transparent', label: 'Transparent }]\n * },\n * })\n * },\n * });\n *\n * ```\n *\n * @public\n */\n useFieldConfig(config: SetFieldConfigOptionsArgs<TFieldConfigOptions> = {}) {\n // builder is applied lazily when custom field configs are accessed\n this._initConfigRegistry = () => createFieldConfigRegistry(config, this.meta.name);\n\n return this;\n }\n\n /**\n * Sets function that can return visualization examples and suggestions.\n * @alpha\n */\n setSuggestionsSupplier(supplier: VisualizationSuggestionsSupplier) {\n this.suggestionsSupplier = supplier;\n return this;\n }\n\n /**\n * Returns the suggestions supplier\n * @alpha\n */\n getSuggestionsSupplier(): VisualizationSuggestionsSupplier | undefined {\n return this.suggestionsSupplier;\n }\n\n hasPluginId(pluginId: string) {\n return this.meta.id === pluginId;\n }\n}\n","import { marked } from 'marked';\n\nimport { sanitize, sanitizeTextPanelContent } from './sanitize';\n\nlet hasInitialized = false;\n\nexport interface RenderMarkdownOptions {\n noSanitize?: boolean;\n breaks?: boolean;\n}\n\nconst markdownOptions = {\n pedantic: false,\n gfm: true,\n smartLists: true,\n smartypants: false,\n xhtml: false,\n breaks: false,\n};\n\nexport function renderMarkdown(str?: string, options?: RenderMarkdownOptions): string {\n if (!hasInitialized) {\n marked.setOptions({ ...markdownOptions });\n hasInitialized = true;\n }\n\n let opts = undefined;\n if (options?.breaks) {\n opts = {\n ...markdownOptions,\n breaks: true,\n };\n }\n const html = marked(str || '', opts);\n\n if (options?.noSanitize) {\n return html;\n }\n\n return sanitize(html);\n}\n\nexport function renderTextPanelMarkdown(str?: string, options?: RenderMarkdownOptions): string {\n if (!hasInitialized) {\n marked.setOptions({ ...markdownOptions });\n hasInitialized = true;\n }\n\n const html = marked(str || '');\n if (options?.noSanitize) {\n return html;\n }\n\n return sanitizeTextPanelContent(html);\n}\n","export * from './string';\nexport * from './markdown';\nexport * from './text';\nimport { escapeHtml, hasAnsiCodes, sanitize, sanitizeUrl, sanitizeTextPanelContent } from './sanitize';\n\nexport const textUtil = {\n escapeHtml,\n hasAnsiCodes,\n sanitize,\n sanitizeTextPanelContent,\n sanitizeUrl,\n};\n","import { camelCase } from 'lodash';\n\nconst specialChars = ['(', '[', '{', '}', ']', ')', '\\\\', '|', '*', '+', '-', '.', '?', '<', '>', '#', '&', '^', '$'];\nconst specialMatcher = '([\\\\' + specialChars.join('\\\\') + '])';\nconst specialCharEscape = new RegExp(specialMatcher, 'g');\nconst specialCharUnescape = new RegExp('(\\\\\\\\)' + specialMatcher, 'g');\n\nexport const escapeStringForRegex = (value: string) => {\n if (!value) {\n return value;\n }\n\n return value.replace(specialCharEscape, '\\\\$1');\n};\n\nexport const unEscapeStringFromRegex = (value: string) => {\n if (!value) {\n return value;\n }\n\n return value.replace(specialCharUnescape, '$2');\n};\n\nexport function stringStartsAsRegEx(str: string): boolean {\n if (!str) {\n return false;\n }\n\n return str[0] === '/';\n}\n\nexport function stringToJsRegex(str: string): RegExp {\n if (!stringStartsAsRegEx(str)) {\n return new RegExp(`^${str}$`);\n }\n\n const match = str.match(new RegExp('^/(.*?)/(g?i?m?y?s?)$'));\n\n if (!match) {\n throw new Error(`'${str}' is not a valid regular expression.`);\n }\n\n return new RegExp(match[1], match[2]);\n}\n\nexport function stringToMs(str: string): number {\n if (!str) {\n return 0;\n }\n\n const nr = parseInt(str, 10);\n const unit = str.slice(String(nr).length);\n const s = 1000;\n const m = s * 60;\n const h = m * 60;\n const d = h * 24;\n\n switch (unit) {\n case 's':\n return nr * s;\n case 'm':\n return nr * m;\n case 'h':\n return nr * h;\n case 'd':\n return nr * d;\n default:\n if (!unit) {\n return isNaN(nr) ? 0 : nr;\n }\n throw new Error('Not supported unit: ' + unit);\n }\n}\n\nexport function toNumberString(value: number | undefined | null): string {\n if (value !== null && value !== undefined && Number.isFinite(value as number)) {\n return value.toString();\n }\n return '';\n}\n\nexport function toIntegerOrUndefined(value: string): number | undefined {\n if (!value) {\n return undefined;\n }\n const v = parseInt(value, 10);\n return isNaN(v) ? undefined : v;\n}\n\nexport function toFloatOrUndefined(value: string): number | undefined {\n if (!value) {\n return undefined;\n }\n const v = parseFloat(value);\n return isNaN(v) ? undefined : v;\n}\n\nexport const toPascalCase = (string: string) => {\n const str = camelCase(string);\n return str.charAt(0).toUpperCase() + str.substring(1);\n};\n","export interface TextMatch {\n text: string;\n start: number;\n length: number;\n end: number;\n}\n\n/**\n * Adapt findMatchesInText for react-highlight-words findChunks handler.\n * See https://github.com/bvaughn/react-highlight-words#props\n */\nexport function findHighlightChunksInText({\n searchWords,\n textToHighlight,\n}: {\n searchWords: Array<string | RegExp>;\n textToHighlight: string;\n}) {\n const chunks: TextMatch[] = [];\n for (const term of searchWords) {\n chunks.push(...findMatchesInText(textToHighlight, term as string));\n }\n return chunks;\n}\n\nconst cleanNeedle = (needle: string): string => {\n return needle.replace(/[[{(][\\w,.-?:*+]+$/, '');\n};\n\n/**\n * Returns a list of substring regexp matches.\n */\nexport function findMatchesInText(haystack: string, needle: string): TextMatch[] {\n // Empty search can send re.exec() into infinite loop, exit early\n if (!haystack || !needle) {\n return [];\n }\n const matches: TextMatch[] = [];\n const { cleaned, flags } = parseFlags(cleanNeedle(needle));\n let regexp: RegExp;\n try {\n regexp = new RegExp(`(?:${cleaned})`, flags);\n } catch (error) {\n return matches;\n }\n haystack.replace(regexp, (substring, ...rest) => {\n if (substring) {\n const offset = rest[rest.length - 2];\n matches.push({\n text: substring,\n start: offset,\n length: substring.length,\n end: offset + substring.length,\n });\n }\n return '';\n });\n return matches;\n}\n\nconst CLEAR_FLAG = '-';\nconst FLAGS_REGEXP = /\\(\\?([ims-]+)\\)/g;\n\n/**\n * Converts any mode modifiers in the text to the Javascript equivalent flag\n */\nexport function parseFlags(text: string): { cleaned: string; flags: string } {\n const flags: Set<string> = new Set(['g']);\n\n const cleaned = text.replace(FLAGS_REGEXP, (str, group) => {\n const clearAll = group.startsWith(CLEAR_FLAG);\n\n for (let i = 0; i < group.length; ++i) {\n const flag = group.charAt(i);\n if (clearAll || group.charAt(i - 1) === CLEAR_FLAG) {\n flags.delete(flag);\n } else if (flag !== CLEAR_FLAG) {\n flags.add(flag);\n }\n }\n return ''; // Remove flag from text\n });\n\n return {\n cleaned: cleaned,\n flags: Array.from(flags).join(''),\n };\n}\n","/** @beta */\nexport interface ThemeBreakpointValues {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n xl: number;\n xxl: number;\n}\n\n/** @beta */\nexport type ThemeBreakpointsKey = keyof ThemeBreakpointValues;\n\n/** @beta */\nexport interface ThemeBreakpoints {\n values: ThemeBreakpointValues;\n keys: string[];\n unit: string;\n up: (key: ThemeBreakpointsKey) => string;\n down: (key: ThemeBreakpointsKey) => string;\n}\n\n/** @internal */\nexport function createBreakpoints(): ThemeBreakpoints {\n const step = 5;\n const keys = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'];\n const unit = 'px';\n const values: ThemeBreakpointValues = {\n xs: 0,\n sm: 544,\n md: 769, // 1 more than regular ipad in portrait\n lg: 992,\n xl: 1200,\n xxl: 1440,\n };\n\n function up(key: ThemeBreakpointsKey | number) {\n const value = typeof key === 'number' ? key : values[key];\n return `@media (min-width:${value}${unit})`;\n }\n\n function down(key: ThemeBreakpointsKey | number) {\n const value = typeof key === 'number' ? key : values[key];\n return `@media (max-width:${value - step / 100}${unit})`;\n }\n\n // TODO add functions for between and only\n\n return {\n values,\n up,\n down,\n keys,\n unit,\n };\n}\n","// Code based on Material-UI\n// https://github.com/mui-org/material-ui/blob/1b096070faf102281f8e3c4f9b2bf50acf91f412/packages/material-ui/src/styles/colorManipulator.js#L97\n// MIT License Copyright (c) 2014 Call-Em-All\n\nimport tinycolor from 'tinycolor2';\n\n/**\n * Returns a number whose value is limited to the given range.\n * @param value The value to be clamped\n * @param min The lower boundary of the output range\n * @param max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @beta\n */\nfunction clamp(value: number, min = 0, max = 1) {\n if (process.env.NODE_ENV !== 'production') {\n if (value < min || value > max) {\n console.error(`The value provided ${value} is out of range [${min}, ${max}].`);\n }\n }\n\n return Math.min(Math.max(min, value), max);\n}\n\n/**\n * Converts a color from CSS hex format to CSS rgb format.\n * @param color - Hex color, i.e. #nnn or #nnnnnn\n * @returns A CSS rgb color string\n * @beta\n */\nexport function hexToRgb(color: string) {\n color = color.slice(1);\n\n const re = new RegExp(`.{1,${color.length >= 6 ? 2 : 1}}`, 'g');\n let colors = color.match(re);\n\n if (colors && colors[0].length === 1) {\n colors = colors.map((n) => n + n);\n }\n\n return colors\n ? `rgb${colors.length === 4 ? 'a' : ''}(${colors\n .map((n, index) => {\n return index < 3 ? parseInt(n, 16) : Math.round((parseInt(n, 16) / 255) * 1000) / 1000;\n })\n .join(', ')})`\n : '';\n}\n\nfunction intToHex(int: number) {\n const hex = int.toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n}\n\n/**\n * Converts a color from CSS rgb format to CSS hex format.\n * @param color - RGB color, i.e. rgb(n, n, n)\n * @returns A CSS rgb color string, i.e. #nnnnnn\n * @beta\n */\nexport function rgbToHex(color: string) {\n // Idempotent\n if (color.indexOf('#') === 0) {\n return color;\n }\n\n const { values } = decomposeColor(color);\n return `#${values.map((n: number) => intToHex(n)).join('')}`;\n}\n\n/**\n * Converts a color to hex6 format if there is no alpha, hex8 if there is.\n * @param color - Hex, RGB, HSL color\n * @returns A hex color string, i.e. #ff0000 or #ff0000ff\n */\nexport function asHexString(color: string): string {\n if (color[0] === '#') {\n return color;\n }\n const tColor = tinycolor(color);\n return tColor.getAlpha() === 1 ? tColor.toHexString() : tColor.toHex8String();\n}\n\n/**\n * Converts a color to rgb string\n */\nexport function asRgbString(color: string) {\n if (color.startsWith('rgb')) {\n return color;\n }\n\n return tinycolor(color).toRgbString();\n}\n\n/**\n * Converts a color from hsl format to rgb format.\n * @param color - HSL color values\n * @returns rgb color values\n * @beta\n */\nexport function hslToRgb(color: string | DecomposeColor) {\n const parts = decomposeColor(color);\n const { values } = parts;\n const h = values[0];\n const s = values[1] / 100;\n const l = values[2] / 100;\n const a = s * Math.min(l, 1 - l);\n const f = (n: number, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\n let type = 'rgb';\n const rgb = [Math.round(f(0) * 255), Math.round(f(8) * 255), Math.round(f(4) * 255)];\n\n if (parts.type === 'hsla') {\n type += 'a';\n rgb.push(values[3]);\n }\n\n return recomposeColor({ type, values: rgb });\n}\n\n/**\n * Returns an object with the type and values of a color.\n *\n * Note: Does not support rgb % values.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @returns {object} - A MUI color object: {type: string, values: number[]}\n * @beta\n */\nexport function decomposeColor(color: string | DecomposeColor): DecomposeColor {\n // Idempotent\n if (typeof color !== 'string') {\n return color;\n }\n\n if (color.charAt(0) === '#') {\n return decomposeColor(hexToRgb(color));\n }\n\n const marker = color.indexOf('(');\n const type = color.substring(0, marker);\n\n if (['rgb', 'rgba', 'hsl', 'hsla', 'color'].indexOf(type) === -1) {\n throw new Error(\n `Unsupported '${color}' color. The following formats are supported: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()`\n );\n }\n\n let values: any = color.substring(marker + 1, color.length - 1);\n let colorSpace;\n\n if (type === 'color') {\n values = values.split(' ');\n colorSpace = values.shift();\n if (values.length === 4 && values[3].charAt(0) === '/') {\n values[3] = values[3].slice(1);\n }\n if (['srgb', 'display-p3', 'a98-rgb', 'prophoto-rgb', 'rec-2020'].indexOf(colorSpace) === -1) {\n throw new Error(\n `Unsupported ${colorSpace} color space. The following color spaces are supported: srgb, display-p3, a98-rgb, prophoto-rgb, rec-2020.`\n );\n }\n } else {\n values = values.split(',');\n }\n\n values = values.map((value: string) => parseFloat(value));\n return { type, values, colorSpace };\n}\n\n/**\n * Converts a color object with type and values to a string.\n * @param {object} color - Decomposed color\n * @param color.type - One of: 'rgb', 'rgba', 'hsl', 'hsla'\n * @param {array} color.values - [n,n,n] or [n,n,n,n]\n * @returns A CSS color string\n * @beta\n */\nexport function recomposeColor(color: DecomposeColor) {\n const { type, colorSpace } = color;\n let values: any = color.values;\n\n if (type.indexOf('rgb') !== -1) {\n // Only convert the first 3 values to int (i.e. not alpha)\n values = values.map((n: string, i: number) => (i < 3 ? parseInt(n, 10) : n));\n } else if (type.indexOf('hsl') !== -1) {\n values[1] = `${values[1]}%`;\n values[2] = `${values[2]}%`;\n }\n if (type.indexOf('color') !== -1) {\n values = `${colorSpace} ${values.join(' ')}`;\n } else {\n values = `${values.join(', ')}`;\n }\n\n return `${type}(${values})`;\n}\n\n/**\n * Calculates the contrast ratio between two colors.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param foreground - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param background - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla()\n * @param canvas - A CSS color that alpha based backgrounds blends into\n * @returns A contrast ratio value in the range 0 - 21.\n * @beta\n */\nexport function getContrastRatio(foreground: string, background: string, canvas?: string) {\n const lumA = getLuminance(foreground);\n const lumB = getLuminance(background, canvas);\n return (Math.max(lumA, lumB) + 0.05) / (Math.min(lumA, lumB) + 0.05);\n}\n\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param background - CSS color that needs to be take in to account to calculate luminance for colors with opacity\n * @returns The relative brightness of the color in the range 0 - 1\n * @beta\n */\nexport function getLuminance(color: string, background?: string) {\n const parts = decomposeColor(color);\n\n let rgb = parts.type === 'hsl' ? decomposeColor(hslToRgb(color)).values : parts.values;\n\n if (background && parts.type === 'rgba') {\n const backgroundParts = decomposeColor(background);\n const alpha = rgb[3];\n rgb[0] = rgb[0] * alpha + backgroundParts.values[0] * (1 - alpha);\n rgb[1] = rgb[1] * alpha + backgroundParts.values[1] * (1 - alpha);\n rgb[2] = rgb[2] * alpha + backgroundParts.values[2] * (1 - alpha);\n }\n\n const rgbNumbers = rgb.map((val: any) => {\n if (parts.type !== 'color') {\n val /= 255; // normalized\n }\n return val <= 0.03928 ? val / 12.92 : ((val + 0.055) / 1.055) ** 2.4;\n });\n\n // Truncate at 3 digits\n return Number((0.2126 * rgbNumbers[0] + 0.7152 * rgbNumbers[1] + 0.0722 * rgbNumbers[2]).toFixed(3));\n}\n\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param coefficient=0.15 - multiplier in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function emphasize(color: string, coefficient = 0.15) {\n return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);\n}\n\n/**\n * Set the absolute transparency of a color.\n * Any existing alpha values are overwritten.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param value - value to set the alpha channel to in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function alpha(color: string, value: number) {\n if (color === '') {\n return '#000000';\n }\n\n value = clamp(value);\n\n // hex 3, hex 4 (w/alpha), hex 6, hex 8 (w/alpha)\n if (color[0] === '#') {\n if (color.length === 9) {\n color = color.substring(0, 7);\n } else if (color.length <= 5) {\n let c = '#';\n for (let i = 1; i < 4; i++) {\n c += color[i] + color[i];\n }\n color = c;\n }\n\n return (\n color +\n Math.round(value * 255)\n .toString(16)\n .padStart(2, '0')\n );\n }\n // rgb(, hsl(\n else if (color[3] === '(') {\n // rgb() and hsl() do not require the \"a\" suffix to accept alpha values in modern browsers:\n // https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/rgb()#accepts_alpha_value\n return color.replace(')', `, ${value})`);\n }\n // rgba(, hsla(\n else if (color[4] === '(') {\n return color.substring(0, color.lastIndexOf(',')) + `, ${value})`;\n }\n\n const parts = decomposeColor(color);\n\n if (parts.type === 'color') {\n parts.values[3] = `/${value}`;\n } else {\n parts.values[3] = value;\n }\n\n return recomposeColor(parts);\n}\n\n/**\n * Darkens a color.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param coefficient - multiplier in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function darken(color: string, coefficient: number) {\n const parts = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (parts.type.indexOf('hsl') !== -1) {\n parts.values[2] *= 1 - coefficient;\n } else if (parts.type.indexOf('rgb') !== -1 || parts.type.indexOf('color') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n parts.values[i] *= 1 - coefficient;\n }\n }\n return recomposeColor(parts);\n}\n\n/**\n * Lightens a color.\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(), hsl(), hsla(), color()\n * @param coefficient - multiplier in the range 0 - 1\n * @returns A CSS color string. Hex input values are returned as rgb\n * @beta\n */\nexport function lighten(color: string, coefficient: number) {\n const parts = decomposeColor(color);\n coefficient = clamp(coefficient);\n\n if (parts.type.indexOf('hsl') !== -1) {\n parts.values[2] += (100 - parts.values[2]) * coefficient;\n } else if (parts.type.indexOf('rgb') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n parts.values[i] += (255 - parts.values[i]) * coefficient;\n }\n } else if (parts.type.indexOf('color') !== -1) {\n for (let i = 0; i < 3; i += 1) {\n parts.values[i] += (1 - parts.values[i]) * coefficient;\n }\n }\n\n return recomposeColor(parts);\n}\n\ninterface DecomposeColor {\n type: string;\n values: any;\n colorSpace?: string;\n}\n","import { merge } from 'lodash';\n\nimport { alpha, darken, emphasize, getContrastRatio, lighten } from './colorManipulator';\nimport { palette } from './palette';\nimport { DeepPartial, ThemeRichColor } from './types';\n\n/** @internal */\nexport type ThemeColorsMode = 'light' | 'dark';\n\n/** @internal */\nexport interface ThemeColorsBase<TColor> {\n mode: ThemeColorsMode;\n\n primary: TColor;\n secondary: TColor;\n info: TColor;\n error: TColor;\n success: TColor;\n warning: TColor;\n\n text: {\n primary: string;\n secondary: string;\n disabled: string;\n link: string;\n /** Used for auto white or dark text on colored backgrounds */\n maxContrast: string;\n };\n\n background: {\n /** Dashboard and body background */\n canvas: string;\n /** Primary content pane background (panels etc) */\n primary: string;\n /** Cards and elements that need to stand out on the primary background */\n secondary: string;\n };\n\n border: {\n weak: string;\n medium: string;\n strong: string;\n };\n\n gradients: {\n brandVertical: string;\n brandHorizontal: string;\n };\n\n action: {\n /** Used for selected menu item / select option */\n selected: string;\n /** Used for hovered menu item / select option */\n hover: string;\n /** Used for button/colored background hover opacity */\n hoverOpacity: number;\n /** Used focused menu item / select option */\n focus: string;\n /** Used for disabled buttons and inputs */\n disabledBackground: string;\n /** Disabled text */\n disabledText: string;\n /** Disablerd opacity */\n disabledOpacity: number;\n };\n\n hoverFactor: number;\n contrastThreshold: number;\n tonalOffset: number;\n}\n\nexport interface ThemeHoverStrengh {}\n\n/** @beta */\nexport interface ThemeColors extends ThemeColorsBase<ThemeRichColor> {\n /** Returns a text color for the background */\n getContrastText(background: string, threshold?: number): string;\n /* Brighten or darken a color by specified factor (0-1) */\n emphasize(color: string, amount?: number): string;\n}\n\n/** @internal */\nexport type ThemeColorsInput = DeepPartial<ThemeColorsBase<ThemeRichColor>>;\n\nclass DarkColors implements ThemeColorsBase<Partial<ThemeRichColor>> {\n mode: ThemeColorsMode = 'dark';\n\n // Used to get more white opacity colors\n whiteBase = '204, 204, 220';\n\n border = {\n weak: `rgba(${this.whiteBase}, 0.07)`,\n medium: `rgba(${this.whiteBase}, 0.15)`,\n strong: `rgba(${this.whiteBase}, 0.25)`,\n };\n\n text = {\n primary: `rgb(${this.whiteBase})`,\n secondary: `rgba(${this.whiteBase}, 0.65)`,\n disabled: `rgba(${this.whiteBase}, 0.6)`,\n link: palette.blueDarkText,\n maxContrast: palette.white,\n };\n\n primary = {\n main: palette.blueDarkMain,\n text: palette.blueDarkText,\n border: palette.blueDarkText,\n };\n\n secondary = {\n main: `rgba(${this.whiteBase}, 0.16)`,\n shade: `rgba(${this.whiteBase}, 0.20)`,\n text: this.text.primary,\n contrastText: `rgb(${this.whiteBase})`,\n border: this.border.strong,\n };\n\n info = this.primary;\n\n error = {\n main: palette.redDarkMain,\n text: palette.redDarkText,\n };\n\n success = {\n main: palette.greenDarkMain,\n text: palette.greenDarkText,\n };\n\n warning = {\n main: palette.orangeDarkMain,\n text: palette.orangeDarkText,\n };\n\n background = {\n canvas: palette.gray05,\n primary: palette.gray10,\n secondary: palette.gray15,\n };\n\n action = {\n hover: `rgba(${this.whiteBase}, 0.16)`,\n selected: `rgba(${this.whiteBase}, 0.12)`,\n focus: `rgba(${this.whiteBase}, 0.16)`,\n hoverOpacity: 0.08,\n disabledText: this.text.disabled,\n disabledBackground: `rgba(${this.whiteBase}, 0.04)`,\n disabledOpacity: 0.38,\n };\n\n gradients = {\n brandHorizontal: 'linear-gradient(270deg, #F55F3E 0%, #FF8833 100%)',\n brandVertical: 'linear-gradient(0.01deg, #F55F3E 0.01%, #FF8833 99.99%)',\n };\n\n contrastThreshold = 3;\n hoverFactor = 0.03;\n tonalOffset = 0.15;\n}\n\nclass LightColors implements ThemeColorsBase<Partial<ThemeRichColor>> {\n mode: ThemeColorsMode = 'light';\n\n blackBase = '36, 41, 46';\n\n primary = {\n main: palette.blueLightMain,\n border: palette.blueLightText,\n text: palette.blueLightText,\n };\n\n text = {\n primary: `rgba(${this.blackBase}, 1)`,\n secondary: `rgba(${this.blackBase}, 0.75)`,\n disabled: `rgba(${this.blackBase}, 0.50)`,\n link: this.primary.text,\n maxContrast: palette.black,\n };\n\n border = {\n weak: `rgba(${this.blackBase}, 0.12)`,\n medium: `rgba(${this.blackBase}, 0.30)`,\n strong: `rgba(${this.blackBase}, 0.40)`,\n };\n\n secondary = {\n main: `rgba(${this.blackBase}, 0.16)`,\n shade: `rgba(${this.blackBase}, 0.20)`,\n contrastText: `rgba(${this.blackBase}, 1)`,\n text: this.text.primary,\n border: this.border.strong,\n };\n\n info = {\n main: palette.blueLightMain,\n text: palette.blueLightText,\n };\n\n error = {\n main: palette.redLightMain,\n text: palette.redLightText,\n border: palette.redLightText,\n };\n\n success = {\n main: palette.greenLightMain,\n text: palette.greenLightText,\n };\n\n warning = {\n main: palette.orangeLightMain,\n text: palette.orangeLightText,\n };\n\n background = {\n canvas: palette.gray90,\n primary: palette.white,\n secondary: palette.gray100,\n };\n\n action = {\n hover: `rgba(${this.blackBase}, 0.12)`,\n selected: `rgba(${this.blackBase}, 0.08)`,\n hoverOpacity: 0.08,\n focus: `rgba(${this.blackBase}, 0.12)`,\n disabledBackground: `rgba(${this.blackBase}, 0.04)`,\n disabledText: this.text.disabled,\n disabledOpacity: 0.38,\n };\n\n gradients = {\n brandHorizontal: 'linear-gradient(90deg, #FF8833 0%, #F53E4C 100%)',\n brandVertical: 'linear-gradient(0.01deg, #F53E4C -31.2%, #FF8833 113.07%)',\n };\n\n contrastThreshold = 3;\n hoverFactor = 0.03;\n tonalOffset = 0.2;\n}\n\nexport function createColors(colors: ThemeColorsInput): ThemeColors {\n const dark = new DarkColors();\n const light = new LightColors();\n const base = (colors.mode ?? 'dark') === 'dark' ? dark : light;\n const {\n primary = base.primary,\n secondary = base.secondary,\n info = base.info,\n warning = base.warning,\n success = base.success,\n error = base.error,\n tonalOffset = base.tonalOffset,\n hoverFactor = base.hoverFactor,\n contrastThreshold = base.contrastThreshold,\n ...other\n } = colors;\n\n function getContrastText(background: string, threshold: number = contrastThreshold) {\n const contrastText =\n getContrastRatio(dark.text.maxContrast, background, base.background.primary) >= threshold\n ? dark.text.maxContrast\n : light.text.maxContrast;\n // todo, need color framework\n return contrastText;\n }\n\n const getRichColor = ({ color, name }: GetRichColorProps): ThemeRichColor => {\n color = { ...color, name };\n if (!color.main) {\n throw new Error(`Missing main color for ${name}`);\n }\n if (!color.text) {\n color.text = color.main;\n }\n if (!color.border) {\n color.border = color.text;\n }\n if (!color.shade) {\n color.shade = base.mode === 'light' ? darken(color.main, tonalOffset) : lighten(color.main, tonalOffset);\n }\n if (!color.transparent) {\n color.transparent = base.mode === 'light' ? alpha(color.main, 0.08) : alpha(color.main, 0.15);\n }\n if (!color.contrastText) {\n color.contrastText = getContrastText(color.main);\n }\n return color as ThemeRichColor;\n };\n\n return merge(\n {\n ...base,\n primary: getRichColor({ color: primary, name: 'primary' }),\n secondary: getRichColor({ color: secondary, name: 'secondary' }),\n info: getRichColor({ color: info, name: 'info' }),\n error: getRichColor({ color: error, name: 'error' }),\n success: getRichColor({ color: success, name: 'success' }),\n warning: getRichColor({ color: warning, name: 'warning' }),\n getContrastText,\n emphasize: (color: string, factor?: number) => {\n return emphasize(color, factor ?? hoverFactor);\n },\n },\n other\n );\n}\n\ninterface GetRichColorProps {\n color: Partial<ThemeRichColor>;\n name: string;\n}\n","import { ThemeColors } from './createColors';\n\n/** @beta */\nexport interface ThemeShadows {\n z1: string;\n z2: string;\n z3: string;\n}\n\n/** @alpha */\nexport function createShadows(colors: ThemeColors): ThemeShadows {\n if (colors.mode === 'dark') {\n return {\n z1: '0px 1px 2px rgba(24, 26, 27, 0.75)',\n z2: '0px 4px 8px rgba(24, 26, 27, 0.75)',\n z3: '0px 8px 24px rgb(1,4,9)',\n };\n }\n\n return {\n z1: '0px 1px 2px rgba(24, 26, 27, 0.2)',\n z2: '0px 4px 8px rgba(24, 26, 27, 0.2)',\n z3: '0px 13px 20px 1px rgba(24, 26, 27, 0.18)',\n };\n}\n","/** @beta */\nexport interface ThemeShape {\n borderRadius: (amount?: number) => string;\n}\n\n/** @internal */\nexport interface ThemeShapeInput {\n borderRadius?: number;\n}\n\nexport function createShape(options: ThemeShapeInput): ThemeShape {\n const baseBorderRadius = options.borderRadius ?? 2;\n\n const borderRadius = (amount?: number) => {\n const value = (amount ?? 1) * baseBorderRadius;\n return `${value}px`;\n };\n\n return {\n borderRadius,\n };\n}\n","// Code based on Material UI\n// The MIT License (MIT)\n// Copyright (c) 2014 Call-Em-All\n\n/** @internal */\nexport type ThemeSpacingOptions = {\n gridSize?: number;\n};\n\n/** @internal */\nexport type ThemeSpacingArgument = number | string;\n\n/**\n * @beta\n * The different signatures imply different meaning for their arguments that can't be expressed structurally.\n * We express the difference with variable names.\n * tslint:disable:unified-signatures */\nexport interface ThemeSpacing {\n (): string;\n (value: ThemeSpacingArgument): string;\n (topBottom: ThemeSpacingArgument, rightLeft: ThemeSpacingArgument): string;\n (top: ThemeSpacingArgument, rightLeft: ThemeSpacingArgument, bottom: ThemeSpacingArgument): string;\n (\n top: ThemeSpacingArgument,\n right: ThemeSpacingArgument,\n bottom: ThemeSpacingArgument,\n left: ThemeSpacingArgument\n ): string;\n gridSize: number;\n}\n\n/** @internal */\nexport function createSpacing(options: ThemeSpacingOptions = {}): ThemeSpacing {\n const { gridSize = 8 } = options;\n\n const transform = (value: ThemeSpacingArgument) => {\n if (typeof value === 'string') {\n return value;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof value !== 'number') {\n console.error(`Expected spacing argument to be a number or a string, got ${value}.`);\n }\n }\n return value * gridSize;\n };\n\n const spacing = (...args: Array<number | string>): string => {\n if (process.env.NODE_ENV !== 'production') {\n if (!(args.length <= 4)) {\n console.error(`Too many arguments provided, expected between 0 and 4, got ${args.length}`);\n }\n }\n\n if (args.length === 0) {\n args[0] = 1;\n }\n\n return args\n .map((argument) => {\n const output = transform(argument);\n return typeof output === 'number' ? `${output}px` : output;\n })\n .join(' ');\n };\n\n spacing.gridSize = gridSize;\n\n return spacing;\n}\n","// Code based on Material UI\n// The MIT License (MIT)\n// Copyright (c) 2014 Call-Em-All\n\n// Follow https://material.google.com/motion/duration-easing.html#duration-easing-natural-easing-curves\n// to learn the context in which each easing should be used.\nconst easing = {\n // This is the most common easing curve.\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n // Objects enter the screen at full velocity from off-screen and\n // slowly decelerate to a resting point.\n easeOut: 'cubic-bezier(0.0, 0, 0.2, 1)',\n // Objects leave the screen at full velocity. They do not decelerate when off-screen.\n easeIn: 'cubic-bezier(0.4, 0, 1, 1)',\n // The sharp curve is used by objects that may return to the screen at any time.\n sharp: 'cubic-bezier(0.4, 0, 0.6, 1)',\n};\n\n// Follow https://material.io/guidelines/motion/duration-easing.html#duration-easing-common-durations\n// to learn when use what timing\nconst duration = {\n shortest: 150,\n shorter: 200,\n short: 250,\n // most basic recommended timing\n standard: 300,\n // this is to be used in complex animations\n complex: 375,\n // recommended when something is entering screen\n enteringScreen: 225,\n // recommended when something is leaving screen\n leavingScreen: 195,\n};\n\n/** @alpha */\nexport interface CreateTransitionOptions {\n duration?: number | string;\n easing?: string;\n delay?: number | string;\n}\n\n/** @alpha */\nexport function create(props: string | string[] = ['all'], options: CreateTransitionOptions = {}) {\n const { duration: durationOption = duration.standard, easing: easingOption = easing.easeInOut, delay = 0 } = options;\n\n return (Array.isArray(props) ? props : [props])\n .map(\n (animatedProp) =>\n `${animatedProp} ${\n typeof durationOption === 'string' ? durationOption : formatMs(durationOption)\n } ${easingOption} ${typeof delay === 'string' ? delay : formatMs(delay)}`\n )\n .join(',');\n}\n\nexport function getAutoHeightDuration(height: number) {\n if (!height) {\n return 0;\n }\n\n const constant = height / 36;\n\n // https://www.wolframalpha.com/input/?i=(4+%2B+15+*+(x+%2F+36+)+**+0.25+%2B+(x+%2F+36)+%2F+5)+*+10\n return Math.round((4 + 15 * constant ** 0.25 + constant / 5) * 10);\n}\n\nfunction formatMs(milliseconds: number) {\n return `${Math.round(milliseconds)}ms`;\n}\n\n/** @alpha */\nexport interface ThemeTransitions {\n create: typeof create;\n duration: typeof duration;\n easing: typeof easing;\n getAutoHeightDuration: typeof getAutoHeightDuration;\n}\n\n/** @internal */\nexport function createTransitions(): ThemeTransitions {\n return {\n create,\n duration,\n easing,\n getAutoHeightDuration,\n };\n}\n","// Code based on Material UI\n// The MIT License (MIT)\n// Copyright (c) 2014 Call-Em-All\n\nimport { ThemeColors } from './createColors';\n\n/** @beta */\nexport interface ThemeTypography {\n fontFamily: string;\n fontFamilyMonospace: string;\n fontSize: number;\n fontWeightLight: number;\n fontWeightRegular: number;\n fontWeightMedium: number;\n fontWeightBold: number;\n\n // The font-size on the html element.\n htmlFontSize?: number;\n\n h1: ThemeTypographyVariant;\n h2: ThemeTypographyVariant;\n h3: ThemeTypographyVariant;\n h4: ThemeTypographyVariant;\n h5: ThemeTypographyVariant;\n h6: ThemeTypographyVariant;\n\n body: ThemeTypographyVariant;\n bodySmall: ThemeTypographyVariant;\n\n /**\n * @deprecated\n * from legacy old theme\n * */\n size: {\n base: string;\n xs: string;\n sm: string;\n md: string;\n lg: string;\n };\n\n pxToRem: (px: number) => string;\n}\n\nexport interface ThemeTypographyVariant {\n fontSize: string;\n fontWeight: number;\n lineHeight: number;\n fontFamily: string;\n letterSpacing?: string;\n}\n\nexport interface ThemeTypographyInput {\n fontFamily?: string;\n fontFamilyMonospace?: string;\n fontSize?: number;\n fontWeightLight?: number;\n fontWeightRegular?: number;\n fontWeightMedium?: number;\n fontWeightBold?: number;\n // hat's the font-size on the html element.\n // 16px is the default font-size used by browsers.\n htmlFontSize?: number;\n}\n\nconst defaultFontFamily = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\nconst defaultFontFamilyMonospace = \"'Roboto Mono', monospace\";\n\nexport function createTypography(colors: ThemeColors, typographyInput: ThemeTypographyInput = {}): ThemeTypography {\n const {\n fontFamily = defaultFontFamily,\n fontFamilyMonospace = defaultFontFamilyMonospace,\n // The default font size of the Material Specification.\n fontSize = 14, // px\n fontWeightLight = 300,\n fontWeightRegular = 400,\n fontWeightMedium = 500,\n fontWeightBold = 500,\n // Tell Grafana-UI what's the font-size on the html element.\n // 16px is the default font-size used by browsers.\n htmlFontSize = 14,\n } = typographyInput;\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof fontSize !== 'number') {\n console.error('Grafana-UI: `fontSize` is required to be a number.');\n }\n\n if (typeof htmlFontSize !== 'number') {\n console.error('Grafana-UI: `htmlFontSize` is required to be a number.');\n }\n }\n\n const coef = fontSize / 14;\n const pxToRem = (size: number) => `${(size / htmlFontSize) * coef}rem`;\n const buildVariant = (\n fontWeight: number,\n size: number,\n lineHeight: number,\n letterSpacing: number,\n casing?: object\n ): ThemeTypographyVariant => ({\n fontFamily,\n fontWeight,\n fontSize: pxToRem(size),\n lineHeight,\n ...(fontFamily === defaultFontFamily ? { letterSpacing: `${round(letterSpacing / size)}em` } : {}),\n ...casing,\n });\n\n const variants = {\n h1: buildVariant(fontWeightLight, 28, 1.167, -0.25),\n h2: buildVariant(fontWeightLight, 24, 1.2, 0),\n h3: buildVariant(fontWeightRegular, 21, 1.167, 0),\n h4: buildVariant(fontWeightRegular, 18, 1.235, 0.25),\n h5: buildVariant(fontWeightRegular, 16, 1.334, 0),\n h6: buildVariant(fontWeightMedium, 14, 1.6, 0.15),\n body: buildVariant(fontWeightRegular, 14, 1.5, 0.15),\n bodySmall: buildVariant(fontWeightRegular, 12, 1.5, 0.15),\n };\n\n const size = {\n base: '14px',\n xs: '10px',\n sm: '12px',\n md: '14px',\n lg: '18px',\n };\n\n return {\n htmlFontSize,\n pxToRem,\n fontFamily,\n fontFamilyMonospace,\n fontSize,\n fontWeightLight,\n fontWeightRegular,\n fontWeightMedium,\n fontWeightBold,\n size,\n ...variants,\n };\n}\n\nfunction round(value: number) {\n return Math.round(value * 1e5) / 1e5;\n}\n","import { FALLBACK_COLOR } from '../types';\n\nimport { ThemeColors } from './createColors';\n\n/**\n * @alpha\n */\nexport interface ThemeVisualizationColors {\n /** Only for internal use by color schemes */\n palette: string[];\n /** Lookup the real color given the name */\n getColorByName: (color: string) => string;\n /** Colors organized by hue */\n hues: ThemeVizHue[];\n}\n\n/**\n * @alpha\n */\nexport interface ThemeVizColor {\n color: string;\n name: string;\n aliases?: string[];\n primary?: boolean;\n}\n\n/**\n * @alpha\n */\nexport interface ThemeVizHue {\n name: string;\n shades: ThemeVizColor[];\n}\n\n/**\n * @internal\n */\nexport function createVisualizationColors(colors: ThemeColors): ThemeVisualizationColors {\n let hues: ThemeVizHue[] = [];\n\n if (colors.mode === 'dark') {\n hues = getDarkHues();\n } else if (colors.mode === 'light') {\n hues = getLightHues();\n }\n\n const byNameIndex: Record<string, string> = {};\n\n for (const hue of hues) {\n for (const shade of hue.shades) {\n byNameIndex[shade.name] = shade.color;\n if (shade.aliases) {\n for (const alias of shade.aliases) {\n byNameIndex[alias] = shade.color;\n }\n }\n }\n }\n\n // special colors\n byNameIndex['transparent'] = 'rgba(0,0,0,0)';\n byNameIndex['panel-bg'] = colors.background.primary;\n byNameIndex['text'] = colors.text.primary;\n\n const getColorByName = (colorName: string) => {\n if (!colorName) {\n return FALLBACK_COLOR;\n }\n\n const realColor = byNameIndex[colorName];\n if (realColor) {\n return realColor;\n }\n\n if (colorName[0] === '#') {\n return colorName;\n }\n\n if (colorName.indexOf('rgb') > -1) {\n return colorName;\n }\n\n const nativeColor = nativeColorNames[colorName.toLowerCase()];\n if (nativeColor) {\n byNameIndex[colorName] = nativeColor;\n return nativeColor;\n }\n\n return colorName;\n };\n\n const palette = getClassicPalette();\n\n return {\n hues,\n palette,\n getColorByName,\n };\n}\n\nfunction getDarkHues(): ThemeVizHue[] {\n return [\n {\n name: 'red',\n shades: [\n { color: '#FFA6B0', name: 'super-light-red' },\n { color: '#FF7383', name: 'light-red' },\n { color: '#F2495C', name: 'red', primary: true },\n { color: '#E02F44', name: 'semi-dark-red' },\n { color: '#C4162A', name: 'dark-red' },\n ],\n },\n {\n name: 'orange',\n shades: [\n { color: '#FFCB7D', name: 'super-light-orange', aliases: [] },\n { color: '#FFB357', name: 'light-orange', aliases: [] },\n { color: '#FF9830', name: 'orange', aliases: [], primary: true },\n { color: '#FF780A', name: 'semi-dark-orange', aliases: [] },\n { color: '#FA6400', name: 'dark-orange', aliases: [] },\n ],\n },\n {\n name: 'yellow',\n shades: [\n { color: '#FFF899', name: 'super-light-yellow', aliases: [] },\n { color: '#FFEE52', name: 'light-yellow', aliases: [] },\n { color: '#FADE2A', name: 'yellow', aliases: [], primary: true },\n { color: '#F2CC0C', name: 'semi-dark-yellow', aliases: [] },\n { color: '#E0B400', name: 'dark-yellow', aliases: [] },\n ],\n },\n {\n name: 'green',\n shades: [\n { color: '#C8F2C2', name: 'super-light-green', aliases: [] },\n { color: '#96D98D', name: 'light-green', aliases: [] },\n { color: '#73BF69', name: 'green', aliases: [], primary: true },\n { color: '#56A64B', name: 'semi-dark-green', aliases: [] },\n { color: '#37872D', name: 'dark-green', aliases: [] },\n ],\n },\n {\n name: 'blue',\n shades: [\n { color: '#C0D8FF', name: 'super-light-blue', aliases: [] },\n { color: '#8AB8FF', name: 'light-blue', aliases: [] },\n { color: '#5794F2', name: 'blue', aliases: [], primary: true },\n { color: '#3274D9', name: 'semi-dark-blue', aliases: [] },\n { color: '#1F60C4', name: 'dark-blue', aliases: [] },\n ],\n },\n {\n name: 'purple',\n shades: [\n { color: '#DEB6F2', name: 'super-light-purple', aliases: [] },\n { color: '#CA95E5', name: 'light-purple', aliases: [] },\n { color: '#B877D9', name: 'purple', aliases: [], primary: true },\n { color: '#A352CC', name: 'semi-dark-purple', aliases: [] },\n { color: '#8F3BB8', name: 'dark-purple', aliases: [] },\n ],\n },\n ];\n}\n\nfunction getLightHues(): ThemeVizHue[] {\n return [\n {\n name: 'red',\n shades: [\n { color: '#FF7383', name: 'super-light-red' },\n { color: '#F2495C', name: 'light-red' },\n { color: '#E02F44', name: 'red', primary: true },\n { color: '#C4162A', name: 'semi-dark-red' },\n { color: '#AD0317', name: 'dark-red' },\n ],\n },\n {\n name: 'orange',\n shades: [\n { color: '#FFB357', name: 'super-light-orange', aliases: [] },\n { color: '#FF9830', name: 'light-orange', aliases: [] },\n { color: '#FF780A', name: 'orange', aliases: [], primary: true },\n { color: '#FA6400', name: 'semi-dark-orange', aliases: [] },\n { color: '#E55400', name: 'dark-orange', aliases: [] },\n ],\n },\n {\n name: 'yellow',\n shades: [\n { color: '#FFEE52', name: 'super-light-yellow', aliases: [] },\n { color: '#FADE2A', name: 'light-yellow', aliases: [] },\n { color: '#F2CC0C', name: 'yellow', aliases: [], primary: true },\n { color: '#E0B400', name: 'semi-dark-yellow', aliases: [] },\n { color: '#CC9D00', name: 'dark-yellow', aliases: [] },\n ],\n },\n {\n name: 'green',\n shades: [\n { color: '#96D98D', name: 'super-light-green', aliases: [] },\n { color: '#73BF69', name: 'light-green', aliases: [] },\n { color: '#56A64B', name: 'green', aliases: [], primary: true },\n { color: '#37872D', name: 'semi-dark-green', aliases: [] },\n { color: '#19730E', name: 'dark-green', aliases: [] },\n ],\n },\n {\n name: 'blue',\n shades: [\n { color: '#8AB8FF', name: 'super-light-blue', aliases: [] },\n { color: '#5794F2', name: 'light-blue', aliases: [] },\n { color: '#3274D9', name: 'blue', aliases: [], primary: true },\n { color: '#1F60C4', name: 'semi-dark-blue', aliases: [] },\n { color: '#1250B0', name: 'dark-blue', aliases: [] },\n ],\n },\n {\n name: 'purple',\n shades: [\n { color: '#CA95E5', name: 'super-light-purple', aliases: [] },\n { color: '#B877D9', name: 'light-purple', aliases: [] },\n { color: '#A352CC', name: 'purple', aliases: [], primary: true },\n { color: '#8F3BB8', name: 'semi-dark-purple', aliases: [] },\n { color: '#7C2EA3', name: 'dark-purple', aliases: [] },\n ],\n },\n ];\n}\n\nfunction getClassicPalette() {\n // Todo replace these with named colors (as many as possible)\n\n return [\n 'green', // '#7EB26D', // 0: pale green\n 'semi-dark-yellow', // '#EAB839', // 1: mustard\n 'light-blue', // #6ED0E0', // 2: light blue\n 'semi-dark-orange', // '#EF843C', // 3: orange\n 'red', // '#E24D42', // 4: red\n 'blue', // #1F78C1', // 5: ocean\n 'purple', // '#BA43A9', // 6: purple\n '#705DA0', // 7: violet\n 'dark-green', // '#508642', // 8: dark green\n 'yellow', //'#CCA300', // 9: dark sand\n '#447EBC',\n '#C15C17',\n '#890F02',\n '#0A437C',\n '#6D1F62',\n '#584477',\n '#B7DBAB',\n '#F4D598',\n '#70DBED',\n '#F9BA8F',\n '#F29191',\n '#82B5D8',\n '#E5A8E2',\n '#AEA2E0',\n '#629E51',\n '#E5AC0E',\n '#64B0C8',\n '#E0752D',\n '#BF1B00',\n '#0A50A1',\n '#962D82',\n '#614D93',\n '#9AC48A',\n '#F2C96D',\n '#65C5DB',\n '#F9934E',\n '#EA6460',\n '#5195CE',\n '#D683CE',\n '#806EB7',\n '#3F6833',\n '#967302',\n '#2F575E',\n '#99440A',\n '#58140C',\n '#052B51',\n '#511749',\n '#3F2B5B',\n '#E0F9D7',\n '#FCEACA',\n '#CFFAFF',\n '#F9E2D2',\n '#FCE2DE',\n '#BADFF4',\n '#F9D9F9',\n '#DEDAF7',\n ];\n}\n\n// Old hues\n// function getDarkHues(): ThemeVizHue[] {\n// return [\n// {\n// name: 'red',\n// shades: [\n// { name: 'red1', color: '#FFC2D4', aliases: ['super-light-red'] },\n// { name: 'red2', color: '#FFA8C2', aliases: ['light-red'] },\n// { name: 'red3', color: '#FF85A9', aliases: ['red'], primary: true },\n// { name: 'red4', color: '#FF5286', aliases: ['semi-dark-red'] },\n// { name: 'red5', color: '#E0226E', aliases: ['dark-red'] },\n// ],\n// },\n// {\n// name: 'orange',\n// shades: [\n// { name: 'orange1', color: '#FFC0AD', aliases: ['super-light-orange'] },\n// { name: 'orange2', color: '#FFA98F', aliases: ['light-orange'] },\n// { name: 'orange3', color: '#FF825C', aliases: ['orange'], primary: true },\n// { name: 'orange4', color: '#FF5F2E', aliases: ['semi-dark-orange'] },\n// { name: 'orange5', color: '#E73903', aliases: ['dark-orange'] },\n// ],\n// },\n// {\n// name: 'yellow',\n// shades: [\n// { name: 'yellow1', color: '#FFE68F', aliases: ['super-light-yellow'] },\n// { name: 'yellow2', color: '#FAD34A', aliases: ['light-yellow'] },\n// { name: 'yellow3', color: '#ECBB09', aliases: ['yellow'], primary: true },\n// { name: 'yellow4', color: '#CFA302', aliases: ['semi-dark-yellow'] },\n// { name: 'yellow5', color: '#AD8800', aliases: ['dark-yellow'] },\n// ],\n// },\n// {\n// name: 'green',\n// shades: [\n// { name: 'green1', color: '#93ECCB', aliases: ['super-light-green'] },\n// { name: 'green2', color: '#65DCB1', aliases: ['light-green'] },\n// { name: 'green3', color: '#2DC88F', aliases: ['green'], primary: true },\n// { name: 'green4', color: '#25A777', aliases: ['semi-dark-green'] },\n// { name: 'green5', color: '#1B855E', aliases: ['dark-green'] },\n// ],\n// },\n// {\n// name: 'teal',\n// shades: [\n// { name: 'teal1', color: '#73E7F7' },\n// { name: 'teal2', color: '#2BD6EE' },\n// { name: 'teal3', color: '#11BDD4', primary: true },\n// { name: 'teal4', color: '#0EA0B4' },\n// { name: 'teal5', color: '#077D8D' },\n// ],\n// },\n// {\n// name: 'blue',\n// shades: [\n// { name: 'blue1', color: '#C2D7FF', aliases: ['super-light-blue'] },\n// { name: 'blue2', color: '#A3C2FF', aliases: ['light-blue'] },\n// { name: 'blue3', color: '#83ACFC', aliases: ['blue'], primary: true },\n// { name: 'blue4', color: '#5D8FEF', aliases: ['semi-dark-blue'] },\n// { name: 'blue5', color: '#3871DC', aliases: ['dark-blue'] },\n// ],\n// },\n// {\n// name: 'violet',\n// shades: [\n// { name: 'violet1', color: '#DACCFF' },\n// { name: 'violet2', color: '#C7B2FF' },\n// { name: 'violet3', color: '#B094FF', primary: true },\n// { name: 'violet4', color: '#9271EF' },\n// { name: 'violet5', color: '#7E63CA' },\n// ],\n// },\n// {\n// name: 'purple',\n// shades: [\n// { name: 'purple1', color: '#FFBDFF', aliases: ['super-light-purple'] },\n// { name: 'purple2', color: '#F5A3F5', aliases: ['light-purple'] },\n// { name: 'purple3', color: '#E48BE4', aliases: ['purple'], primary: true },\n// { name: 'purple4', color: '#CA68CA', aliases: ['semi-dark-purple'] },\n// { name: 'purple5', color: '#B545B5', aliases: ['dark-purple'] },\n// ],\n// },\n// ];\n// }\n\nconst nativeColorNames: Record<string, string> = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n gold: '#ffd700',\n goldenrod: '#daa520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n 'indianred ': '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavender: '#e6e6fa',\n lavenderblush: '#fff0f5',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgrey: '#d3d3d3',\n lightgreen: '#90ee90',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370d8',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#d87093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n};\n","// We need to centralize the zIndex definitions as they work\n// like global values in the browser.\nexport const zIndex = {\n navbarFixed: 1000,\n sidemenu: 1020,\n dropdown: 1030,\n typeahead: 1030,\n tooltip: 1040,\n modalBackdrop: 1050,\n modal: 1060,\n portal: 1061,\n};\n\n/** @beta */\nexport type ThemeZIndices = typeof zIndex;\n","import { map } from 'rxjs/operators';\n\nimport { dateTimeParse } from '../../datetime';\nimport { SynchronousDataTransformerInfo } from '../../types';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { ArrayVector } from '../../vector';\nimport { fieldMatchers } from '../matchers';\nimport { FieldMatcherID } from '../matchers/ids';\n\nimport { DataTransformerID } from './ids';\n\nexport interface ConvertFieldTypeTransformerOptions {\n conversions: ConvertFieldTypeOptions[];\n}\n\nexport interface ConvertFieldTypeOptions {\n /**\n * The field to convert field type\n */\n targetField?: string;\n /**\n * The field type to convert to\n */\n destinationType?: FieldType;\n /**\n * Date format to parse a string datetime\n */\n dateFormat?: string;\n}\n\nexport const convertFieldTypeTransformer: SynchronousDataTransformerInfo<ConvertFieldTypeTransformerOptions> = {\n id: DataTransformerID.convertFieldType,\n name: 'Convert field type',\n description: 'Convert a field to a specified field type',\n defaultOptions: {\n fields: {},\n conversions: [{ targetField: undefined, destinationType: undefined, dateFormat: undefined }],\n },\n\n operator: (options) => (source) => source.pipe(map((data) => convertFieldTypeTransformer.transformer(options)(data))),\n\n transformer: (options: ConvertFieldTypeTransformerOptions) => (data: DataFrame[]) => {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n const timeParsed = convertFieldTypes(options, data);\n if (!timeParsed) {\n return [];\n }\n return timeParsed;\n },\n};\n\n/**\n * Convert field types for dataframe(s)\n * @param options - field type conversion options\n * @param frames - dataframe(s) with field types to convert\n * @returns dataframe(s) with converted field types\n */\nexport function convertFieldTypes(options: ConvertFieldTypeTransformerOptions, frames: DataFrame[]): DataFrame[] {\n if (!options.conversions.length) {\n return frames;\n }\n\n const framesCopy = frames.map((frame) => ({ ...frame }));\n\n for (const conversion of options.conversions) {\n if (!conversion.targetField) {\n continue;\n }\n const matches = fieldMatchers.get(FieldMatcherID.byName).get(conversion.targetField);\n for (const frame of framesCopy) {\n frame.fields = frame.fields.map((field) => {\n if (matches(field, frame, framesCopy)) {\n return convertFieldType(field, conversion);\n }\n return field;\n });\n }\n }\n\n return framesCopy;\n}\n\n/**\n * Convert a single field type to specified field type.\n * @param field - field to convert\n * @param opts - field conversion options\n * @returns converted field\n *\n * @internal\n */\nexport function convertFieldType(field: Field, opts: ConvertFieldTypeOptions): Field {\n switch (opts.destinationType) {\n case FieldType.time:\n return ensureTimeField(field, opts.dateFormat);\n case FieldType.number:\n return fieldToNumberField(field);\n case FieldType.string:\n return fieldToStringField(field);\n case FieldType.boolean:\n return fieldToBooleanField(field);\n case FieldType.other:\n return fieldToComplexField(field);\n default:\n return field;\n }\n}\n\n// matches ISO 8601, e.g. 2021-11-11T19:45:00.000Z (float portion optional)\nconst iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/;\n\n/**\n * @internal\n */\nexport function fieldToTimeField(field: Field, dateFormat?: string): Field {\n let opts = dateFormat ? { format: dateFormat } : undefined;\n\n const timeValues = field.values.toArray().slice();\n\n let firstDefined = timeValues.find((v) => v != null);\n\n let isISO8601 = typeof firstDefined === 'string' && iso8601Regex.test(firstDefined);\n\n for (let t = 0; t < timeValues.length; t++) {\n if (timeValues[t]) {\n let parsed = isISO8601 ? Date.parse(timeValues[t]) : dateTimeParse(timeValues[t], opts).valueOf();\n timeValues[t] = Number.isFinite(parsed) ? parsed : null;\n } else {\n timeValues[t] = null;\n }\n }\n\n return {\n ...field,\n type: FieldType.time,\n values: new ArrayVector(timeValues),\n };\n}\n\nfunction fieldToNumberField(field: Field): Field {\n const numValues = field.values.toArray().slice();\n\n for (let n = 0; n < numValues.length; n++) {\n const number = +numValues[n];\n numValues[n] = Number.isFinite(number) ? number : null;\n }\n\n return {\n ...field,\n type: FieldType.number,\n values: new ArrayVector(numValues),\n };\n}\n\nfunction fieldToBooleanField(field: Field): Field {\n const booleanValues = field.values.toArray().slice();\n\n for (let b = 0; b < booleanValues.length; b++) {\n booleanValues[b] = Boolean(!!booleanValues[b]);\n }\n\n return {\n ...field,\n type: FieldType.boolean,\n values: new ArrayVector(booleanValues),\n };\n}\n\nfunction fieldToStringField(field: Field): Field {\n const stringValues = field.values.toArray().slice();\n\n for (let s = 0; s < stringValues.length; s++) {\n stringValues[s] = `${stringValues[s]}`;\n }\n\n return {\n ...field,\n type: FieldType.string,\n values: new ArrayVector(stringValues),\n };\n}\n\nfunction fieldToComplexField(field: Field): Field {\n const complexValues = field.values.toArray().slice();\n\n for (let s = 0; s < complexValues.length; s++) {\n try {\n complexValues[s] = JSON.parse(complexValues[s]);\n } catch {\n complexValues[s] = null;\n }\n }\n\n return {\n ...field,\n type: FieldType.other,\n values: new ArrayVector(complexValues),\n };\n}\n\n/**\n * Checks the first value. Assumes any number should be time fieldtype. Otherwise attempts to make the fieldtype time.\n * @param field - field to ensure is a time fieldtype\n * @param dateFormat - date format used to parse a string datetime\n * @returns field as time\n *\n * @public\n */\nexport function ensureTimeField(field: Field, dateFormat?: string): Field {\n const firstValueTypeIsNumber = typeof field.values.get(0) === 'number';\n if (field.type === FieldType.time && firstValueTypeIsNumber) {\n return field; //already time\n }\n if (firstValueTypeIsNumber) {\n return {\n ...field,\n type: FieldType.time, //assumes it should be time\n };\n }\n return fieldToTimeField(field, dateFormat);\n}\n","import { map } from 'rxjs/operators';\n\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { stringToJsRegex } from '../../text/string';\nimport { DataFrame } from '../../types/dataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\n\nimport { DataTransformerID } from './ids';\n\n/**\n * Options for renameByRegexTransformer\n *\n * @public\n */\nexport interface RenameByRegexTransformerOptions {\n regex: string;\n renamePattern: string;\n}\n\n/**\n * Replaces the displayName of a field by applying a regular expression\n * to match the name and a pattern for the replacement.\n *\n * @public\n */\nexport const renameByRegexTransformer: DataTransformerInfo<RenameByRegexTransformerOptions> = {\n id: DataTransformerID.renameByRegex,\n name: 'Rename fields by regex',\n description: 'Rename fields based on regular expression by users.',\n defaultOptions: {\n regex: '(.*)',\n renamePattern: '$1',\n },\n\n /**\n * Return a modified copy of the series. If the transform is not or should not\n * be applied, just return the input series\n */\n operator: (options) => (source) =>\n source.pipe(\n map((data) => {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n return data.map(renameFieldsByRegex(options));\n })\n ),\n};\n\nconst renameFieldsByRegex = (options: RenameByRegexTransformerOptions) => (frame: DataFrame) => {\n const regex = stringToJsRegex(options.regex);\n const fields = frame.fields.map((field) => {\n const displayName = getFieldDisplayName(field, frame);\n if (!regex.test(displayName)) {\n return field;\n }\n const newDisplayName = displayName.replace(regex, options.renamePattern);\n return {\n ...field,\n config: { ...field.config, displayName: newDisplayName },\n state: { ...field.state, displayName: newDisplayName },\n };\n });\n return { ...frame, fields };\n};\n","import { calculateFieldTransformer } from './transformers/calculateField';\nimport { concatenateTransformer } from './transformers/concat';\nimport { convertFieldTypeTransformer } from './transformers/convertFieldType';\nimport { ensureColumnsTransformer } from './transformers/ensureColumns';\nimport { filterFieldsTransformer, filterFramesTransformer } from './transformers/filter';\nimport { filterFieldsByNameTransformer } from './transformers/filterByName';\nimport { filterFramesByRefIdTransformer } from './transformers/filterByRefId';\nimport { filterByValueTransformer } from './transformers/filterByValue';\nimport { groupByTransformer } from './transformers/groupBy';\nimport { groupingToMatrixTransformer } from './transformers/groupingToMatrix';\nimport { histogramTransformer } from './transformers/histogram';\nimport { labelsToFieldsTransformer } from './transformers/labelsToFields';\nimport { limitTransformer } from './transformers/limit';\nimport { mergeTransformer } from './transformers/merge';\nimport { noopTransformer } from './transformers/noop';\nimport { orderFieldsTransformer } from './transformers/order';\nimport { organizeFieldsTransformer } from './transformers/organize';\nimport { reduceTransformer } from './transformers/reduce';\nimport { renameFieldsTransformer } from './transformers/rename';\nimport { renameByRegexTransformer } from './transformers/renameByRegex';\nimport { seriesToColumnsTransformer } from './transformers/seriesToColumns';\nimport { seriesToRowsTransformer } from './transformers/seriesToRows';\nimport { sortByTransformer } from './transformers/sortBy';\n\nexport const standardTransformers = {\n noopTransformer,\n filterFieldsTransformer,\n filterFieldsByNameTransformer,\n filterFramesTransformer,\n filterFramesByRefIdTransformer,\n filterByValueTransformer,\n orderFieldsTransformer,\n organizeFieldsTransformer,\n reduceTransformer,\n concatenateTransformer,\n calculateFieldTransformer,\n seriesToColumnsTransformer,\n seriesToRowsTransformer,\n renameFieldsTransformer,\n labelsToFieldsTransformer,\n ensureColumnsTransformer,\n groupByTransformer,\n sortByTransformer,\n mergeTransformer,\n renameByRegexTransformer,\n histogramTransformer,\n convertFieldTypeTransformer,\n groupingToMatrixTransformer,\n limitTransformer,\n};\n","import React from 'react';\n\nimport { DataFrame, DataTransformerInfo } from '../types';\nimport { Registry, RegistryItem } from '../utils/Registry';\n\nexport interface TransformerUIProps<T> {\n /**\n * Transformer configuration, persisted on panel's model\n */\n options: T;\n /**\n * Pre-transform data frames\n */\n input: DataFrame[];\n onChange: (options: T) => void;\n}\n\nexport interface TransformerRegistryItem<TOptions> extends RegistryItem {\n /**\n * Object describing transformer configuration\n */\n transformation: DataTransformerInfo<TOptions>;\n\n /** Markdown with more detailed description and help */\n help?: string;\n\n /**\n * React component used as UI for the transformer\n */\n editor: React.ComponentType<TransformerUIProps<TOptions>>;\n}\n\n/**\n * Registry of transformation options that can be driven by\n * stored configuration files.\n */\nexport const standardTransformersRegistry = new Registry<TransformerRegistryItem<any>>();\n","import { MonoTypeOperatorFunction, Observable, of } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport { DataFrame, DataTransformerConfig } from '../types';\n\nimport { standardTransformersRegistry, TransformerRegistryItem } from './standardTransformersRegistry';\n\nconst getOperator =\n (config: DataTransformerConfig): MonoTypeOperatorFunction<DataFrame[]> =>\n (source) => {\n const info = standardTransformersRegistry.get(config.id);\n\n if (!info) {\n return source;\n }\n\n const defaultOptions = info.transformation.defaultOptions ?? {};\n const options = { ...defaultOptions, ...config.options };\n\n return source.pipe(\n mergeMap((before) =>\n of(before).pipe(info.transformation.operator(options, config.replace), postProcessTransform(before, info))\n )\n );\n };\n\nconst postProcessTransform =\n (before: DataFrame[], info: TransformerRegistryItem<any>): MonoTypeOperatorFunction<DataFrame[]> =>\n (source) =>\n source.pipe(\n map((after) => {\n if (after === before) {\n return after;\n }\n\n // Add a key to the metadata if the data changed\n for (const series of after) {\n if (!series.meta) {\n series.meta = {};\n }\n\n if (!series.meta.transformations) {\n series.meta.transformations = [info.id];\n } else {\n series.meta.transformations = [...series.meta.transformations, info.id];\n }\n }\n\n return after;\n })\n );\n\n/**\n * Apply configured transformations to the input data\n */\nexport function transformDataFrame(options: DataTransformerConfig[], data: DataFrame[]): Observable<DataFrame[]> {\n const stream = of<DataFrame[]>(data);\n\n if (!options.length) {\n return stream;\n }\n\n const operators: Array<MonoTypeOperatorFunction<DataFrame[]>> = [];\n\n for (let index = 0; index < options.length; index++) {\n const config = options[index];\n\n if (config.disabled) {\n continue;\n }\n\n operators.push(getOperator(config));\n }\n\n // @ts-ignore TypeScript has a hard time understanding this construct\n return stream.pipe.apply(stream, operators);\n}\n","// Load the Builtin matchers\nimport {\n FieldMatcherInfo,\n MatcherConfig,\n FrameMatcherInfo,\n FieldMatcher,\n FrameMatcher,\n ValueMatcherInfo,\n ValueMatcher,\n} from '../types/transformations';\nimport { Registry } from '../utils/Registry';\n\nimport { getFieldTypeMatchers } from './matchers/fieldTypeMatcher';\nimport { getFieldNameMatchers, getFrameNameMatchers } from './matchers/nameMatcher';\nimport { getFieldPredicateMatchers, getFramePredicateMatchers } from './matchers/predicates';\nimport { getRefIdMatchers } from './matchers/refIdMatcher';\nimport { getSimpleFieldMatchers } from './matchers/simpleFieldMatcher';\nimport { getEqualValueMatchers } from './matchers/valueMatchers/equalMatchers';\nimport { getNullValueMatchers } from './matchers/valueMatchers/nullMatchers';\nimport { getNumericValueMatchers } from './matchers/valueMatchers/numericMatchers';\nimport { getRangeValueMatchers } from './matchers/valueMatchers/rangeMatchers';\nimport { getRegexValueMatcher } from './matchers/valueMatchers/regexMatchers';\n\n/**\n * Registry that contains all of the built in field matchers.\n * @public\n */\nexport const fieldMatchers = new Registry<FieldMatcherInfo>(() => {\n return [\n ...getFieldPredicateMatchers(), // Predicates\n ...getFieldTypeMatchers(), // by type\n ...getFieldNameMatchers(), // by name\n ...getSimpleFieldMatchers(), // first\n ];\n});\n\n/**\n * Registry that contains all of the built in frame matchers.\n * @public\n */\nexport const frameMatchers = new Registry<FrameMatcherInfo>(() => {\n return [\n ...getFramePredicateMatchers(), // Predicates\n ...getFrameNameMatchers(), // by name\n ...getRefIdMatchers(), // by query refId\n ];\n});\n\n/**\n * Registry that contains all of the built in value matchers.\n * @public\n */\nexport const valueMatchers = new Registry<ValueMatcherInfo>(() => {\n return [\n ...getNullValueMatchers(),\n ...getNumericValueMatchers(),\n ...getEqualValueMatchers(),\n ...getRangeValueMatchers(),\n ...getRegexValueMatcher(),\n ];\n});\n\n/**\n * Resolves a field matcher from the registry for given config.\n * Will throw an error if matcher can not be resolved.\n * @public\n */\nexport function getFieldMatcher(config: MatcherConfig): FieldMatcher {\n const info = fieldMatchers.get(config.id);\n if (!info) {\n throw new Error('Unknown field matcher: ' + config.id);\n }\n return info.get(config.options);\n}\n\n/**\n * Resolves a frame matcher from the registry for given config.\n * Will throw an error if matcher can not be resolved.\n * @public\n */\nexport function getFrameMatchers(config: MatcherConfig): FrameMatcher {\n const info = frameMatchers.get(config.id);\n if (!info) {\n throw new Error('Unknown frame matcher: ' + config.id);\n }\n return info.get(config.options);\n}\n\n/**\n * Resolves a value matcher from the registry for given config.\n * Will throw an error if matcher can not be resolved.\n * @public\n */\nexport function getValueMatcher(config: MatcherConfig): ValueMatcher {\n const info = valueMatchers.get(config.id);\n if (!info) {\n throw new Error('Unknown value matcher: ' + config.id);\n }\n return info.get(config.options);\n}\n","import { getFieldDisplayName } from '../../field/fieldState';\nimport { stringToJsRegex } from '../../text/string';\nimport { Field, DataFrame } from '../../types/dataFrame';\nimport { FieldMatcherInfo, FrameMatcherInfo, FieldMatcher } from '../../types/transformations';\n\nimport { FieldMatcherID, FrameMatcherID } from './ids';\n\nexport interface RegexpOrNamesMatcherOptions {\n pattern?: string;\n names?: string[];\n}\n\n/**\n * Mode to be able to toggle if the names matcher should match fields in provided\n * list or all except provided names.\n * @public\n */\nexport enum ByNamesMatcherMode {\n exclude = 'exclude',\n include = 'include',\n}\n\n/**\n * Options to instruct the by names matcher to either match all fields in given list\n * or all except the fields in the list.\n * @public\n */\nexport interface ByNamesMatcherOptions {\n mode?: ByNamesMatcherMode;\n names?: string[];\n readOnly?: boolean;\n prefix?: string;\n}\n\n// General Field matcher\nconst fieldNameMatcher: FieldMatcherInfo<string> = {\n id: FieldMatcherID.byName,\n name: 'Field Name',\n description: 'match the field name',\n defaultOptions: '',\n\n get: (name: string): FieldMatcher => {\n return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n return name === field.name || getFieldDisplayName(field, frame, allFrames) === name;\n };\n },\n\n getOptionsDisplayText: (name: string) => {\n return `Field name: ${name}`;\n },\n};\n\nconst multipleFieldNamesMatcher: FieldMatcherInfo<ByNamesMatcherOptions> = {\n id: FieldMatcherID.byNames,\n name: 'Field Names',\n description: 'match any of the given the field names',\n defaultOptions: {\n mode: ByNamesMatcherMode.include,\n names: [],\n },\n\n get: (options: ByNamesMatcherOptions): FieldMatcher => {\n const { names, mode = ByNamesMatcherMode.include } = options;\n const uniqueNames = new Set<string>(names ?? []);\n\n const matcher = (field: Field, frame: DataFrame, frames: DataFrame[]) => {\n return uniqueNames.has(field.name) || uniqueNames.has(getFieldDisplayName(field, frame, frames));\n };\n\n if (mode === ByNamesMatcherMode.exclude) {\n return (field: Field, frame: DataFrame, frames: DataFrame[]) => {\n return !matcher(field, frame, frames);\n };\n }\n return matcher;\n },\n\n getOptionsDisplayText: (options: ByNamesMatcherOptions): string => {\n const { names, mode } = options;\n const displayText = (names ?? []).join(', ');\n if (mode === ByNamesMatcherMode.exclude) {\n return `All except: ${displayText}`;\n }\n return `All of: ${displayText}`;\n },\n};\n\nconst regexpFieldNameMatcher: FieldMatcherInfo<string> = {\n id: FieldMatcherID.byRegexp,\n name: 'Field Name by Regexp',\n description: 'match the field name by a given regexp pattern',\n defaultOptions: '/.*/',\n\n get: (pattern: string): FieldMatcher => {\n const regexp = patternToRegex(pattern);\n\n return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n const displayName = getFieldDisplayName(field, frame, allFrames);\n return !!regexp && regexp.test(displayName);\n };\n },\n\n getOptionsDisplayText: (pattern: string): string => {\n return `Field name by pattern: ${pattern}`;\n },\n};\n\n/**\n * Field matcher that will match all fields that exists in a\n * data frame with configured refId.\n * @public\n */\nconst fieldsInFrameMatcher: FieldMatcherInfo<string> = {\n id: FieldMatcherID.byFrameRefID,\n name: 'Fields by frame refId',\n description: 'match all fields returned in data frame with refId.',\n defaultOptions: '',\n\n get: (refId: string): FieldMatcher => {\n return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n return frame.refId === refId;\n };\n },\n\n getOptionsDisplayText: (refId: string): string => {\n return `Math all fields returned by query with reference ID: ${refId}`;\n },\n};\n\nconst regexpOrMultipleNamesMatcher: FieldMatcherInfo<RegexpOrNamesMatcherOptions> = {\n id: FieldMatcherID.byRegexpOrNames,\n name: 'Field Name by Regexp or Names',\n description: 'match the field name by a given regexp pattern or given names',\n defaultOptions: {\n pattern: '/.*/',\n names: [],\n },\n\n get: (options: RegexpOrNamesMatcherOptions): FieldMatcher => {\n const regexpMatcher = regexpFieldNameMatcher.get(options?.pattern || '');\n const namesMatcher = multipleFieldNamesMatcher.get({\n mode: ByNamesMatcherMode.include,\n names: options?.names ?? [],\n });\n\n return (field: Field, frame: DataFrame, allFrames: DataFrame[]) => {\n return namesMatcher(field, frame, allFrames) || regexpMatcher(field, frame, allFrames);\n };\n },\n\n getOptionsDisplayText: (options: RegexpOrNamesMatcherOptions): string => {\n const pattern = options?.pattern ?? '';\n const names = options?.names?.join(',') ?? '';\n return `Field name by pattern: ${pattern} or names: ${names}`;\n },\n};\n\nconst patternToRegex = (pattern?: string): RegExp | undefined => {\n if (!pattern) {\n return undefined;\n }\n\n try {\n return stringToJsRegex(pattern);\n } catch (error) {\n console.error(error);\n return undefined;\n }\n};\n\n// General Frame matcher\nconst frameNameMatcher: FrameMatcherInfo<string> = {\n id: FrameMatcherID.byName,\n name: 'Frame Name',\n description: 'match the frame name',\n defaultOptions: '/.*/',\n\n get: (pattern: string) => {\n const regex = stringToJsRegex(pattern);\n return (frame: DataFrame) => {\n return regex.test(frame.name || '');\n };\n },\n\n getOptionsDisplayText: (pattern: string) => {\n return `Frame name: ${pattern}`;\n },\n};\n\n/**\n * Registry Initialization\n */\nexport function getFieldNameMatchers(): FieldMatcherInfo[] {\n return [\n fieldNameMatcher,\n regexpFieldNameMatcher,\n multipleFieldNamesMatcher,\n regexpOrMultipleNamesMatcher,\n fieldsInFrameMatcher,\n ];\n}\n\nexport function getFrameNameMatchers(): FrameMatcherInfo[] {\n return [frameNameMatcher];\n}\n","import { defaults } from 'lodash';\nimport { map } from 'rxjs/operators';\n\nimport { getTimeField } from '../../dataframe/processDataFrame';\nimport { getFieldDisplayName } from '../../field';\nimport { DataFrame, DataTransformerInfo, Field, FieldType, NullValueMode, Vector } from '../../types';\nimport { BinaryOperationID, binaryOperators } from '../../utils/binaryOperators';\nimport { ArrayVector, BinaryOperationVector, ConstantVector } from '../../vector';\nimport { AsNumberVector } from '../../vector/AsNumberVector';\nimport { RowVector } from '../../vector/RowVector';\nimport { doStandardCalcs, fieldReducers, ReducerID } from '../fieldReducer';\nimport { getFieldMatcher } from '../matchers';\nimport { FieldMatcherID } from '../matchers/ids';\n\nimport { ensureColumnsTransformer } from './ensureColumns';\nimport { DataTransformerID } from './ids';\nimport { noopTransformer } from './noop';\n\nexport enum CalculateFieldMode {\n ReduceRow = 'reduceRow',\n BinaryOperation = 'binary',\n}\n\nexport interface ReduceOptions {\n include?: string[]; // Assume all fields\n reducer: ReducerID;\n nullValueMode?: NullValueMode;\n}\n\nexport interface BinaryOptions {\n left: string;\n operator: BinaryOperationID;\n right: string;\n}\n\nconst defaultReduceOptions: ReduceOptions = {\n reducer: ReducerID.sum,\n};\n\nconst defaultBinaryOptions: BinaryOptions = {\n left: '',\n operator: BinaryOperationID.Add,\n right: '',\n};\n\nexport interface CalculateFieldTransformerOptions {\n // True/False or auto\n timeSeries?: boolean;\n mode: CalculateFieldMode; // defaults to 'reduce'\n\n // Only one should be filled\n reduce?: ReduceOptions;\n binary?: BinaryOptions;\n\n // Remove other fields\n replaceFields?: boolean;\n\n // Output field properties\n alias?: string; // The output field name\n // TODO: config?: FieldConfig; or maybe field overrides? since the UI exists\n}\n\ntype ValuesCreator = (data: DataFrame) => Vector;\n\nexport const calculateFieldTransformer: DataTransformerInfo<CalculateFieldTransformerOptions> = {\n id: DataTransformerID.calculateField,\n name: 'Add field from calculation',\n description: 'Use the row values to calculate a new field',\n defaultOptions: {\n mode: CalculateFieldMode.ReduceRow,\n reduce: {\n reducer: ReducerID.sum,\n },\n },\n operator: (options, replace) => (outerSource) => {\n const operator =\n options && options.timeSeries !== false ? ensureColumnsTransformer.operator(null) : noopTransformer.operator({});\n\n options.alias = replace ? replace(options.alias) : options.alias;\n\n return outerSource.pipe(\n operator,\n map((data) => {\n const mode = options.mode ?? CalculateFieldMode.ReduceRow;\n let creator: ValuesCreator | undefined = undefined;\n\n if (mode === CalculateFieldMode.ReduceRow) {\n creator = getReduceRowCreator(defaults(options.reduce, defaultReduceOptions), data);\n } else if (mode === CalculateFieldMode.BinaryOperation) {\n const binaryOptions = replace\n ? {\n ...options.binary,\n left: replace ? replace(options.binary?.left) : options.binary?.left,\n right: replace ? replace(options.binary?.right) : options.binary?.right,\n }\n : options.binary;\n creator = getBinaryCreator(defaults(binaryOptions, defaultBinaryOptions), data);\n }\n\n // Nothing configured\n if (!creator) {\n return data;\n }\n\n return data.map((frame) => {\n // delegate field creation to the specific function\n const values = creator!(frame);\n if (!values) {\n return frame;\n }\n\n const field = {\n name: getNameFromOptions(options),\n type: FieldType.number,\n config: {},\n values,\n };\n let fields: Field[] = [];\n\n // Replace all fields with the single field\n if (options.replaceFields) {\n const { timeField } = getTimeField(frame);\n if (timeField && options.timeSeries !== false) {\n fields = [timeField, field];\n } else {\n fields = [field];\n }\n } else {\n fields = [...frame.fields, field];\n }\n return {\n ...frame,\n fields,\n };\n });\n })\n );\n },\n};\n\nfunction getReduceRowCreator(options: ReduceOptions, allFrames: DataFrame[]): ValuesCreator {\n let matcher = getFieldMatcher({\n id: FieldMatcherID.numeric,\n });\n\n if (options.include && options.include.length) {\n matcher = getFieldMatcher({\n id: FieldMatcherID.byNames,\n options: {\n names: options.include,\n },\n });\n }\n\n const info = fieldReducers.get(options.reducer);\n\n if (!info) {\n throw new Error(`Unknown reducer: ${options.reducer}`);\n }\n\n const reducer = info.reduce ?? doStandardCalcs;\n const ignoreNulls = options.nullValueMode === NullValueMode.Ignore;\n const nullAsZero = options.nullValueMode === NullValueMode.AsZero;\n\n return (frame: DataFrame) => {\n // Find the columns that should be examined\n const columns: Vector[] = [];\n for (const field of frame.fields) {\n if (matcher(field, frame, allFrames)) {\n columns.push(field.values);\n }\n }\n\n // Prepare a \"fake\" field for the row\n const iter = new RowVector(columns);\n const row: Field = {\n name: 'temp',\n values: iter,\n type: FieldType.number,\n config: {},\n };\n const vals: number[] = [];\n\n for (let i = 0; i < frame.length; i++) {\n iter.rowIndex = i;\n const val = reducer(row, ignoreNulls, nullAsZero)[options.reducer];\n vals.push(val);\n }\n\n return new ArrayVector(vals);\n };\n}\n\nfunction findFieldValuesWithNameOrConstant(frame: DataFrame, name: string, allFrames: DataFrame[]): Vector | undefined {\n if (!name) {\n return undefined;\n }\n\n for (const f of frame.fields) {\n if (name === getFieldDisplayName(f, frame, allFrames)) {\n if (f.type === FieldType.boolean) {\n return new AsNumberVector(f.values);\n }\n return f.values;\n }\n }\n\n const v = parseFloat(name);\n if (!isNaN(v)) {\n return new ConstantVector(v, frame.length);\n }\n\n return undefined;\n}\n\nfunction getBinaryCreator(options: BinaryOptions, allFrames: DataFrame[]): ValuesCreator {\n const operator = binaryOperators.getIfExists(options.operator);\n\n return (frame: DataFrame) => {\n const left = findFieldValuesWithNameOrConstant(frame, options.left, allFrames);\n const right = findFieldValuesWithNameOrConstant(frame, options.right, allFrames);\n if (!left || !right || !operator) {\n return undefined as unknown as Vector;\n }\n\n return new BinaryOperationVector(left, right, operator.operation);\n };\n}\n\nexport function getNameFromOptions(options: CalculateFieldTransformerOptions) {\n if (options.alias?.length) {\n return options.alias;\n }\n\n if (options.mode === CalculateFieldMode.BinaryOperation) {\n const { binary } = options;\n return `${binary?.left ?? ''} ${binary?.operator ?? ''} ${binary?.right ?? ''}`;\n }\n\n if (options.mode === CalculateFieldMode.ReduceRow) {\n const r = fieldReducers.getIfExists(options.reduce?.reducer);\n if (r) {\n return r.name;\n }\n }\n\n return 'math';\n}\n","import { map } from 'rxjs/operators';\n\nimport { DataFrame, Field, TIME_SERIES_VALUE_FIELD_NAME } from '../../types/dataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { ArrayVector } from '../../vector';\n\nimport { DataTransformerID } from './ids';\n\nexport enum ConcatenateFrameNameMode {\n /**\n * Ignore the source frame name when moving to the destination\n */\n Drop = 'drop',\n\n /**\n * Copy the source frame name to the destination field. The final field will contain\n * both the frame and field name\n */\n FieldName = 'field',\n\n /**\n * Copy the source frame name to a label on the field. The label key is controlled\n * by frameNameLabel\n */\n Label = 'label',\n}\n\nexport interface ConcatenateTransformerOptions {\n frameNameMode?: ConcatenateFrameNameMode;\n frameNameLabel?: string;\n}\n\nexport const concatenateTransformer: DataTransformerInfo<ConcatenateTransformerOptions> = {\n id: DataTransformerID.concatenate,\n name: 'Concatenate fields',\n description:\n 'Combine all fields into a single frame. Values will be appended with undefined values if not the same length.',\n defaultOptions: {\n frameNameMode: ConcatenateFrameNameMode.FieldName,\n frameNameLabel: 'frame',\n },\n operator: (options) => (source) =>\n source.pipe(\n map((dataFrames) => {\n if (!Array.isArray(dataFrames) || dataFrames.length < 2) {\n return dataFrames; // noop with single frame\n }\n return [concatenateFields(dataFrames, options)];\n })\n ),\n};\n\n/**\n * @internal only exported for tests\n */\nexport function concatenateFields(data: DataFrame[], opts: ConcatenateTransformerOptions): DataFrame {\n let sameLength = true;\n let maxLength = data[0].length;\n const frameNameLabel = opts.frameNameLabel ?? 'frame';\n let fields: Field[] = [];\n\n for (const frame of data) {\n if (maxLength !== frame.length) {\n sameLength = false;\n maxLength = Math.max(maxLength, frame.length);\n }\n\n for (const f of frame.fields) {\n const copy = { ...f };\n copy.state = undefined;\n if (frame.name) {\n if (opts.frameNameMode === ConcatenateFrameNameMode.Drop) {\n // nothing -- skip the name\n } else if (opts.frameNameMode === ConcatenateFrameNameMode.Label) {\n copy.labels = { ...f.labels };\n copy.labels[frameNameLabel] = frame.name;\n } else if (!copy.name || copy.name === TIME_SERIES_VALUE_FIELD_NAME) {\n copy.name = frame.name;\n } else {\n copy.name = `${frame.name} · ${f.name}`;\n }\n }\n fields.push(copy);\n }\n }\n\n // Make sure all fields have the same length\n if (!sameLength) {\n fields = fields.map((f) => {\n if (f.values.length === maxLength) {\n return f;\n }\n const values = f.values.toArray();\n values.length = maxLength;\n return {\n ...f,\n values: new ArrayVector(values),\n };\n });\n }\n\n return {\n fields,\n length: maxLength,\n };\n}\n","import { map } from 'rxjs/operators';\n\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { DataFrame, Field } from '../../types/dataFrame';\nimport { DataTransformerInfo, MatcherConfig } from '../../types/transformations';\nimport { ArrayVector } from '../../vector/ArrayVector';\nimport { getValueMatcher } from '../matchers';\n\nimport { DataTransformerID } from './ids';\nimport { noopTransformer } from './noop';\n\nexport enum FilterByValueType {\n exclude = 'exclude',\n include = 'include',\n}\n\nexport enum FilterByValueMatch {\n all = 'all',\n any = 'any',\n}\n\nexport interface FilterByValueFilter {\n fieldName: string;\n config: MatcherConfig;\n}\n\nexport interface FilterByValueTransformerOptions {\n filters: FilterByValueFilter[];\n type: FilterByValueType;\n match: FilterByValueMatch;\n}\n\nexport const filterByValueTransformer: DataTransformerInfo<FilterByValueTransformerOptions> = {\n id: DataTransformerID.filterByValue,\n name: 'Filter data by values',\n description: 'select a subset of results based on values',\n defaultOptions: {\n filters: [],\n type: FilterByValueType.include,\n match: FilterByValueMatch.any,\n },\n\n operator: (options) => (source) => {\n const filters = options.filters;\n const matchAll = options.match === FilterByValueMatch.all;\n const include = options.type === FilterByValueType.include;\n\n if (!Array.isArray(filters) || filters.length === 0) {\n return source.pipe(noopTransformer.operator({}));\n }\n\n return source.pipe(\n map((data) => {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n\n const rows = new Set<number>();\n\n for (const frame of data) {\n const fieldIndexByName = groupFieldIndexByName(frame, data);\n const matchers = createFilterValueMatchers(filters, fieldIndexByName);\n\n for (let index = 0; index < frame.length; index++) {\n if (rows.has(index)) {\n continue;\n }\n\n let matching = true;\n\n for (const matcher of matchers) {\n const match = matcher(index, frame, data);\n\n if (!matchAll && match) {\n matching = true;\n break;\n }\n\n if (matchAll && !match) {\n matching = false;\n break;\n }\n\n matching = match;\n }\n\n if (matching) {\n rows.add(index);\n }\n }\n }\n\n const processed: DataFrame[] = [];\n const frameLength = include ? rows.size : data[0].length - rows.size;\n\n for (const frame of data) {\n const fields: Field[] = [];\n\n for (const field of frame.fields) {\n const buffer = [];\n\n for (let index = 0; index < frame.length; index++) {\n if (include && rows.has(index)) {\n buffer.push(field.values.get(index));\n continue;\n }\n\n if (!include && !rows.has(index)) {\n buffer.push(field.values.get(index));\n continue;\n }\n }\n\n // We keep field config, but clean the state as it's being recalculated when the field overrides are applied\n fields.push({\n ...field,\n values: new ArrayVector(buffer),\n state: {},\n });\n }\n\n processed.push({\n ...frame,\n fields: fields,\n length: frameLength,\n });\n }\n\n return processed;\n })\n );\n },\n};\n\nconst createFilterValueMatchers = (\n filters: FilterByValueFilter[],\n fieldIndexByName: Record<string, number>\n): Array<(index: number, frame: DataFrame, data: DataFrame[]) => boolean> => {\n const noop = () => false;\n\n return filters.map((filter) => {\n const fieldIndex = fieldIndexByName[filter.fieldName] ?? -1;\n\n if (fieldIndex < 0) {\n console.warn(`[FilterByValue] Could not find index for field name: ${filter.fieldName}`);\n return noop;\n }\n\n const matcher = getValueMatcher(filter.config);\n return (index, frame, data) => matcher(index, frame.fields[fieldIndex], frame, data);\n });\n};\n\nconst groupFieldIndexByName = (frame: DataFrame, data: DataFrame[]): Record<string, number> => {\n return frame.fields.reduce((all: Record<string, number>, field, fieldIndex) => {\n const fieldName = getFieldDisplayName(field, frame, data);\n all[fieldName] = fieldIndex;\n return all;\n }, {});\n};\n","import { map } from 'rxjs/operators';\n\nimport { MutableField } from '../../dataframe/MutableDataFrame';\nimport { guessFieldTypeForField } from '../../dataframe/processDataFrame';\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { ArrayVector } from '../../vector/ArrayVector';\nimport { reduceField, ReducerID } from '../fieldReducer';\n\nimport { DataTransformerID } from './ids';\n\nexport enum GroupByOperationID {\n aggregate = 'aggregate',\n groupBy = 'groupby',\n}\n\nexport interface GroupByFieldOptions {\n aggregations: ReducerID[];\n operation: GroupByOperationID | null;\n}\n\nexport interface GroupByTransformerOptions {\n fields: Record<string, GroupByFieldOptions>;\n}\n\nexport const groupByTransformer: DataTransformerInfo<GroupByTransformerOptions> = {\n id: DataTransformerID.groupBy,\n name: 'Group by',\n description: 'Group the data by a field values then process calculations for each group',\n defaultOptions: {\n fields: {},\n },\n\n /**\n * Return a modified copy of the series. If the transform is not or should not\n * be applied, just return the input series\n */\n operator: (options) => (source) =>\n source.pipe(\n map((data) => {\n const hasValidConfig = Object.keys(options.fields).find(\n (name) => options.fields[name].operation === GroupByOperationID.groupBy\n );\n\n if (!hasValidConfig) {\n return data;\n }\n\n const processed: DataFrame[] = [];\n\n for (const frame of data) {\n const groupByFields: Field[] = [];\n\n for (const field of frame.fields) {\n if (shouldGroupOnField(field, options)) {\n groupByFields.push(field);\n }\n }\n\n if (groupByFields.length === 0) {\n continue; // No group by field in this frame, ignore the frame\n }\n\n // Group the values by fields and groups so we can get all values for a\n // group for a given field.\n const valuesByGroupKey = new Map<string, Record<string, MutableField>>();\n for (let rowIndex = 0; rowIndex < frame.length; rowIndex++) {\n const groupKey = String(groupByFields.map((field) => field.values.get(rowIndex)));\n const valuesByField = valuesByGroupKey.get(groupKey) ?? {};\n\n if (!valuesByGroupKey.has(groupKey)) {\n valuesByGroupKey.set(groupKey, valuesByField);\n }\n\n for (let field of frame.fields) {\n const fieldName = getFieldDisplayName(field);\n\n if (!valuesByField[fieldName]) {\n valuesByField[fieldName] = {\n name: fieldName,\n type: field.type,\n config: { ...field.config },\n values: new ArrayVector(),\n };\n }\n\n valuesByField[fieldName].values.add(field.values.get(rowIndex));\n }\n }\n\n const fields: Field[] = [];\n\n for (const field of groupByFields) {\n const values = new ArrayVector();\n const fieldName = getFieldDisplayName(field);\n\n valuesByGroupKey.forEach((value) => {\n values.add(value[fieldName].values.get(0));\n });\n\n fields.push({\n name: field.name,\n type: field.type,\n config: {\n ...field.config,\n },\n values: values,\n });\n }\n\n // Then for each calculations configured, compute and add a new field (column)\n for (const field of frame.fields) {\n if (!shouldCalculateField(field, options)) {\n continue;\n }\n\n const fieldName = getFieldDisplayName(field);\n const aggregations = options.fields[fieldName].aggregations;\n const valuesByAggregation: Record<string, any[]> = {};\n\n valuesByGroupKey.forEach((value) => {\n const fieldWithValuesForGroup = value[fieldName];\n const results = reduceField({\n field: fieldWithValuesForGroup,\n reducers: aggregations,\n });\n\n for (const aggregation of aggregations) {\n if (!Array.isArray(valuesByAggregation[aggregation])) {\n valuesByAggregation[aggregation] = [];\n }\n valuesByAggregation[aggregation].push(results[aggregation]);\n }\n });\n\n for (const aggregation of aggregations) {\n const aggregationField: Field = {\n name: `${fieldName} (${aggregation})`,\n values: new ArrayVector(valuesByAggregation[aggregation]),\n type: FieldType.other,\n config: {},\n };\n\n aggregationField.type = detectFieldType(aggregation, field, aggregationField);\n fields.push(aggregationField);\n }\n }\n\n processed.push({\n fields,\n length: valuesByGroupKey.size,\n });\n }\n\n return processed;\n })\n ),\n};\n\nconst shouldGroupOnField = (field: Field, options: GroupByTransformerOptions): boolean => {\n const fieldName = getFieldDisplayName(field);\n return options?.fields[fieldName]?.operation === GroupByOperationID.groupBy;\n};\n\nconst shouldCalculateField = (field: Field, options: GroupByTransformerOptions): boolean => {\n const fieldName = getFieldDisplayName(field);\n return (\n options?.fields[fieldName]?.operation === GroupByOperationID.aggregate &&\n Array.isArray(options?.fields[fieldName].aggregations) &&\n options?.fields[fieldName].aggregations.length > 0\n );\n};\n\nconst detectFieldType = (aggregation: string, sourceField: Field, targetField: Field): FieldType => {\n switch (aggregation) {\n case ReducerID.allIsNull:\n return FieldType.boolean;\n case ReducerID.last:\n case ReducerID.lastNotNull:\n case ReducerID.first:\n case ReducerID.firstNotNull:\n return sourceField.type;\n default:\n return guessFieldTypeForField(targetField) ?? FieldType.string;\n }\n};\n","import { map } from 'rxjs/operators';\n\nimport { MutableDataFrame } from '../../dataframe';\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { DataFrame, DataTransformerInfo, Field, FieldType, Vector } from '../../types';\n\nimport { DataTransformerID } from './ids';\n\nexport interface GroupingToMatrixTransformerOptions {\n columnField?: string;\n rowField?: string;\n valueField?: string;\n}\n\nconst DEFAULT_COLUMN_FIELD = 'Time';\nconst DEFAULT_ROW_FIELD = 'Time';\nconst DEFAULT_VALUE_FIELD = 'Value';\n\nexport const groupingToMatrixTransformer: DataTransformerInfo<GroupingToMatrixTransformerOptions> = {\n id: DataTransformerID.groupingToMatrix,\n name: 'Grouping to Matrix',\n description: 'Groups series by field and return a matrix visualisation',\n defaultOptions: {\n columnField: DEFAULT_COLUMN_FIELD,\n rowField: DEFAULT_ROW_FIELD,\n valueField: DEFAULT_VALUE_FIELD,\n },\n\n operator: (options) => (source) =>\n source.pipe(\n map((data) => {\n const columnFieldMatch = options.columnField || DEFAULT_COLUMN_FIELD;\n const rowFieldMatch = options.rowField || DEFAULT_ROW_FIELD;\n const valueFieldMatch = options.valueField || DEFAULT_VALUE_FIELD;\n\n // Accept only single queries\n if (data.length !== 1) {\n return data;\n }\n\n const frame = data[0];\n const keyColumnField = findKeyField(frame, columnFieldMatch);\n const keyRowField = findKeyField(frame, rowFieldMatch);\n const valueField = findKeyField(frame, valueFieldMatch);\n const rowColumnField = `${rowFieldMatch}\\\\${columnFieldMatch}`;\n\n if (!keyColumnField || !keyRowField || !valueField) {\n return data;\n }\n\n const columnValues = uniqueValues(keyColumnField.values);\n const rowValues = uniqueValues(keyRowField.values);\n\n const matrixValues: { [key: string]: { [key: string]: any } } = {};\n\n for (let index = 0; index < valueField.values.length; index++) {\n const columnName = keyColumnField.values.get(index);\n const rowName = keyRowField.values.get(index);\n const value = valueField.values.get(index);\n\n if (!matrixValues[columnName]) {\n matrixValues[columnName] = {};\n }\n\n matrixValues[columnName][rowName] = value;\n }\n\n const resultFrame = new MutableDataFrame();\n\n resultFrame.addField({\n name: rowColumnField,\n values: rowValues,\n type: FieldType.string,\n });\n\n for (const columnName of columnValues) {\n let values = [];\n for (const rowName of rowValues) {\n const value = matrixValues[columnName][rowName] ?? '';\n values.push(value);\n }\n\n resultFrame.addField({\n name: columnName.toString(),\n values: values,\n config: valueField.config,\n type: valueField.type,\n });\n }\n\n return [resultFrame];\n })\n ),\n};\n\nfunction uniqueValues(values: Vector): any[] {\n const unique = new Set();\n\n for (let index = 0; index < values.length; index++) {\n unique.add(values.get(index));\n }\n\n return Array.from(unique);\n}\n\nfunction findKeyField(frame: DataFrame, matchTitle: string): Field | null {\n for (let fieldIndex = 0; fieldIndex < frame.fields.length; fieldIndex++) {\n const field = frame.fields[fieldIndex];\n\n if (matchTitle === getFieldDisplayName(field)) {\n return field;\n }\n }\n\n return null;\n}\n","import { map } from 'rxjs/operators';\n\nimport { getDisplayProcessor } from '../../field';\nimport { createTheme, GrafanaTheme2 } from '../../themes';\nimport { SynchronousDataTransformerInfo } from '../../types';\nimport { DataFrame, Field, FieldConfig, FieldType } from '../../types/dataFrame';\nimport { ArrayVector } from '../../vector/ArrayVector';\n\nimport { DataTransformerID } from './ids';\nimport { AlignedData, join } from './joinDataFrames';\n\n/**\n * @internal\n */\n/* eslint-disable */\n// prettier-ignore\nexport const histogramBucketSizes = [\n 1e-9, 2e-9, 2.5e-9, 4e-9, 5e-9,\n 1e-8, 2e-8, 2.5e-8, 4e-8, 5e-8,\n 1e-7, 2e-7, 2.5e-7, 4e-7, 5e-7,\n 1e-6, 2e-6, 2.5e-6, 4e-6, 5e-6,\n 1e-5, 2e-5, 2.5e-5, 4e-5, 5e-5,\n 1e-4, 2e-4, 2.5e-4, 4e-4, 5e-4,\n 1e-3, 2e-3, 2.5e-3, 4e-3, 5e-3,\n 1e-2, 2e-2, 2.5e-2, 4e-2, 5e-2,\n 1e-1, 2e-1, 2.5e-1, 4e-1, 5e-1,\n 1, 2, 4, 5,\n 1e+1, 2e+1, 2.5e+1, 4e+1, 5e+1,\n 1e+2, 2e+2, 2.5e+2, 4e+2, 5e+2,\n 1e+3, 2e+3, 2.5e+3, 4e+3, 5e+3,\n 1e+4, 2e+4, 2.5e+4, 4e+4, 5e+4,\n 1e+5, 2e+5, 2.5e+5, 4e+5, 5e+5,\n 1e+6, 2e+6, 2.5e+6, 4e+6, 5e+6,\n 1e+7, 2e+7, 2.5e+7, 4e+7, 5e+7,\n 1e+8, 2e+8, 2.5e+8, 4e+8, 5e+8,\n 1e+9, 2e+9, 2.5e+9, 4e+9, 5e+9,\n];\n/* eslint-enable */\n\nconst histFilter = [null];\nconst histSort = (a: number, b: number) => a - b;\n\n/**\n * @alpha\n */\nexport interface HistogramTransformerOptions {\n bucketSize?: number; // 0 is auto\n bucketOffset?: number;\n // xMin?: number;\n // xMax?: number;\n combine?: boolean; // if multiple series are input, join them into one\n}\n\n/**\n * This is a helper class to use the same text in both a panel and transformer UI\n *\n * @internal\n */\nexport const histogramFieldInfo = {\n bucketSize: {\n name: 'Bucket size',\n description: undefined,\n },\n bucketOffset: {\n name: 'Bucket offset',\n description: 'for non-zero-based buckets',\n },\n combine: {\n name: 'Combine series',\n description: 'combine all series into a single histogram',\n },\n};\n\n/**\n * @alpha\n */\nexport const histogramTransformer: SynchronousDataTransformerInfo<HistogramTransformerOptions> = {\n id: DataTransformerID.histogram,\n name: 'Histogram',\n description: 'Calculate a histogram from input data',\n defaultOptions: {\n fields: {},\n },\n\n operator: (options) => (source) => source.pipe(map((data) => histogramTransformer.transformer(options)(data))),\n\n transformer: (options: HistogramTransformerOptions) => (data: DataFrame[]) => {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n const hist = buildHistogram(data, options);\n if (hist == null) {\n return [];\n }\n return [histogramFieldsToFrame(hist)];\n },\n};\n\n/**\n * @internal\n */\nexport const histogramFrameBucketMinFieldName = 'BucketMin';\n\n/**\n * @internal\n */\nexport const histogramFrameBucketMaxFieldName = 'BucketMax';\n\n/**\n * @alpha\n */\nexport interface HistogramFields {\n bucketMin: Field;\n bucketMax: Field;\n counts: Field[]; // frequency\n}\n\n/**\n * Given a frame, find the explicit histogram fields\n *\n * @alpha\n */\nexport function getHistogramFields(frame: DataFrame): HistogramFields | undefined {\n let bucketMin: Field | undefined = undefined;\n let bucketMax: Field | undefined = undefined;\n const counts: Field[] = [];\n for (const field of frame.fields) {\n if (field.name === histogramFrameBucketMinFieldName) {\n bucketMin = field;\n } else if (field.name === histogramFrameBucketMaxFieldName) {\n bucketMax = field;\n } else if (field.type === FieldType.number) {\n counts.push(field);\n }\n }\n if (bucketMin && bucketMax && counts.length) {\n return {\n bucketMin,\n bucketMax,\n counts,\n };\n }\n return undefined;\n}\n\nconst APPROX_BUCKETS = 20;\n\n/**\n * @alpha\n */\nexport function buildHistogram(frames: DataFrame[], options?: HistogramTransformerOptions): HistogramFields | null {\n let bucketSize = options?.bucketSize;\n let bucketOffset = options?.bucketOffset ?? 0;\n\n // if bucket size is auto, try to calc from all numeric fields\n if (!bucketSize || bucketSize < 0) {\n let allValues: number[] = [];\n\n // TODO: include field configs!\n for (const frame of frames) {\n for (const field of frame.fields) {\n if (field.type === FieldType.number) {\n allValues = allValues.concat(field.values.toArray());\n }\n }\n }\n\n allValues = allValues.filter((v) => v != null);\n\n allValues.sort((a, b) => a - b);\n\n let smallestDelta = Infinity;\n\n // TODO: case of 1 value needs work\n if (allValues.length === 1) {\n smallestDelta = 1;\n } else {\n for (let i = 1; i < allValues.length; i++) {\n let delta = allValues[i] - allValues[i - 1];\n\n if (delta !== 0) {\n smallestDelta = Math.min(smallestDelta, delta);\n }\n }\n }\n\n let min = allValues[0];\n let max = allValues[allValues.length - 1];\n\n let range = max - min;\n\n const targetSize = range / APPROX_BUCKETS;\n\n // choose bucket\n for (let i = 0; i < histogramBucketSizes.length; i++) {\n let _bucketSize = histogramBucketSizes[i];\n\n if (targetSize < _bucketSize && _bucketSize >= smallestDelta) {\n bucketSize = _bucketSize;\n break;\n }\n }\n }\n\n const getBucket = (v: number) => incrRoundDn(v - bucketOffset, bucketSize!) + bucketOffset;\n\n // guess number of decimals\n let bucketDecimals = (('' + bucketSize).match(/\\.\\d+$/) ?? ['.'])[0].length - 1;\n\n let histograms: AlignedData[] = [];\n let counts: Field[] = [];\n let config: FieldConfig | undefined = undefined;\n\n for (const frame of frames) {\n for (const field of frame.fields) {\n if (field.type === FieldType.number) {\n let fieldHist = histogram(field.values.toArray(), getBucket, histFilter, histSort) as AlignedData;\n histograms.push(fieldHist);\n counts.push({\n ...field,\n config: {\n ...field.config,\n unit: undefined,\n },\n });\n if (!config && field.config.unit) {\n config = field.config;\n }\n }\n }\n }\n\n // Quit early for empty a\n if (!counts.length) {\n return null;\n }\n\n // align histograms\n let joinedHists = join(histograms);\n\n // zero-fill all undefined values (missing buckets -> 0 counts)\n for (let histIdx = 1; histIdx < joinedHists.length; histIdx++) {\n let hist = joinedHists[histIdx];\n\n for (let bucketIdx = 0; bucketIdx < hist.length; bucketIdx++) {\n if (hist[bucketIdx] == null) {\n hist[bucketIdx] = 0;\n }\n }\n }\n\n const bucketMin: Field = {\n name: histogramFrameBucketMinFieldName,\n values: new ArrayVector(joinedHists[0]),\n type: FieldType.number,\n state: undefined,\n config:\n bucketDecimals === 0\n ? config ?? {}\n : {\n ...config,\n decimals: bucketDecimals,\n },\n };\n const bucketMax = {\n ...bucketMin,\n name: histogramFrameBucketMaxFieldName,\n values: new ArrayVector(joinedHists[0].map((v) => v + bucketSize!)),\n };\n\n if (options?.combine) {\n const vals = new Array(joinedHists[0].length).fill(0);\n for (let i = 1; i < joinedHists.length; i++) {\n for (let j = 0; j < vals.length; j++) {\n vals[j] += joinedHists[i][j];\n }\n }\n counts = [\n {\n ...counts[0],\n name: 'Count',\n values: new ArrayVector(vals),\n type: FieldType.number,\n state: undefined,\n },\n ];\n } else {\n counts.forEach((field, i) => {\n field.values = new ArrayVector(joinedHists[i + 1]);\n });\n }\n\n return {\n bucketMin,\n bucketMax,\n counts,\n };\n}\n\n/**\n * @internal\n */\nexport function incrRound(num: number, incr: number) {\n return Math.round(num / incr) * incr;\n}\n\n/**\n * @internal\n */\nexport function incrRoundUp(num: number, incr: number) {\n return Math.ceil(num / incr) * incr;\n}\n\n/**\n * @internal\n */\nexport function incrRoundDn(num: number, incr: number) {\n return Math.floor(num / incr) * incr;\n}\n\nfunction histogram(\n vals: number[],\n getBucket: (v: number) => number,\n filterOut?: any[] | null,\n sort?: ((a: any, b: any) => number) | null\n) {\n let hist = new Map();\n\n for (let i = 0; i < vals.length; i++) {\n let v = vals[i];\n\n if (v != null) {\n v = getBucket(v);\n }\n\n let entry = hist.get(v);\n\n if (entry) {\n entry.count++;\n } else {\n hist.set(v, { value: v, count: 1 });\n }\n }\n\n filterOut && filterOut.forEach((v) => hist.delete(v));\n\n let bins = [...hist.values()];\n\n sort && bins.sort((a, b) => sort(a.value, b.value));\n\n let values = Array(bins.length);\n let counts = Array(bins.length);\n\n for (let i = 0; i < bins.length; i++) {\n values[i] = bins[i].value;\n counts[i] = bins[i].count;\n }\n\n return [values, counts];\n}\n\n/**\n * @internal\n */\nexport function histogramFieldsToFrame(info: HistogramFields, theme?: GrafanaTheme2): DataFrame {\n if (!info.bucketMin.display) {\n const display = getDisplayProcessor({\n field: info.bucketMin,\n theme: theme ?? createTheme(),\n });\n info.bucketMin.display = display;\n info.bucketMax.display = display;\n }\n return {\n fields: [info.bucketMin, info.bucketMax, ...info.counts],\n length: info.bucketMin.values.length,\n };\n}\n","import { getTimeField, sortDataFrame } from '../../dataframe';\nimport { DataFrame, Field, FieldMatcher, FieldType, Vector } from '../../types';\nimport { ArrayVector } from '../../vector';\nimport { fieldMatchers } from '../matchers';\nimport { FieldMatcherID } from '../matchers/ids';\n\nexport function pickBestJoinField(data: DataFrame[]): FieldMatcher {\n const { timeField } = getTimeField(data[0]);\n if (timeField) {\n return fieldMatchers.get(FieldMatcherID.firstTimeField).get({});\n }\n let common: string[] = [];\n for (const f of data[0].fields) {\n if (f.type === FieldType.number) {\n common.push(f.name);\n }\n }\n\n for (let i = 1; i < data.length; i++) {\n const names: string[] = [];\n for (const f of data[0].fields) {\n if (f.type === FieldType.number) {\n names.push(f.name);\n }\n }\n common = common.filter((v) => !names.includes(v));\n }\n\n return fieldMatchers.get(FieldMatcherID.byName).get(common[0]);\n}\n\n/**\n * @alpha\n */\nexport interface JoinOptions {\n /**\n * The input fields\n */\n frames: DataFrame[];\n\n /**\n * The field to join -- frames that do not have this field will be droppped\n */\n joinBy?: FieldMatcher;\n\n /**\n * Optionally filter the non-join fields\n */\n keep?: FieldMatcher;\n\n /**\n * @internal -- used when we need to keep a reference to the original frame/field index\n */\n keepOriginIndices?: boolean;\n}\n\nfunction getJoinMatcher(options: JoinOptions): FieldMatcher {\n return options.joinBy ?? pickBestJoinField(options.frames);\n}\n\n/**\n * @internal\n */\nexport function maybeSortFrame(frame: DataFrame, fieldIdx: number) {\n if (fieldIdx >= 0) {\n let sortByField = frame.fields[fieldIdx];\n\n if (sortByField.type !== FieldType.string && !isLikelyAscendingVector(sortByField.values)) {\n frame = sortDataFrame(frame, fieldIdx);\n }\n }\n\n return frame;\n}\n\n/**\n * This will return a single frame joined by the first matching field. When a join field is not specified,\n * the default will use the first time field\n */\nexport function outerJoinDataFrames(options: JoinOptions): DataFrame | undefined {\n if (!options.frames?.length) {\n return;\n }\n\n if (options.frames.length === 1) {\n let frame = options.frames[0];\n let frameCopy = frame;\n\n const joinFieldMatcher = getJoinMatcher(options);\n let joinIndex = frameCopy.fields.findIndex((f) => joinFieldMatcher(f, frameCopy, options.frames));\n\n if (options.keepOriginIndices) {\n frameCopy = {\n ...frame,\n fields: frame.fields.map((f, fieldIndex) => {\n const copy = { ...f };\n const origin = {\n frameIndex: 0,\n fieldIndex,\n };\n if (copy.state) {\n copy.state.origin = origin;\n } else {\n copy.state = { origin };\n }\n return copy;\n }),\n };\n\n // Make sure the join field is first\n if (joinIndex > 0) {\n const joinField = frameCopy.fields[joinIndex];\n const fields = frameCopy.fields.filter((f, idx) => idx !== joinIndex);\n fields.unshift(joinField);\n frameCopy.fields = fields;\n joinIndex = 0;\n }\n }\n\n if (joinIndex >= 0) {\n frameCopy = maybeSortFrame(frameCopy, joinIndex);\n }\n\n if (options.keep) {\n let fields = frameCopy.fields.filter(\n (f, fieldIdx) => fieldIdx === joinIndex || options.keep!(f, frameCopy, options.frames)\n );\n\n // mutate already copied frame\n if (frame !== frameCopy) {\n frameCopy.fields = fields;\n } else {\n frameCopy = {\n ...frame,\n fields,\n };\n }\n }\n\n return frameCopy;\n }\n\n const nullModes: JoinNullMode[][] = [];\n const allData: AlignedData[] = [];\n const originalFields: Field[] = [];\n const joinFieldMatcher = getJoinMatcher(options);\n\n for (let frameIndex = 0; frameIndex < options.frames.length; frameIndex++) {\n const frame = options.frames[frameIndex];\n\n if (!frame || !frame.fields?.length) {\n continue; // skip the frame\n }\n\n const nullModesFrame: JoinNullMode[] = [NULL_REMOVE];\n let join: Field | undefined = undefined;\n let fields: Field[] = [];\n\n for (let fieldIndex = 0; fieldIndex < frame.fields.length; fieldIndex++) {\n const field = frame.fields[fieldIndex];\n field.state = field.state || {};\n\n if (!join && joinFieldMatcher(field, frame, options.frames)) {\n join = field;\n } else {\n if (options.keep && !options.keep(field, frame, options.frames)) {\n continue; // skip field\n }\n\n // Support the standard graph span nulls field config\n let spanNulls = field.config.custom?.spanNulls;\n nullModesFrame.push(spanNulls === true ? NULL_REMOVE : spanNulls === -1 ? NULL_RETAIN : NULL_EXPAND);\n\n let labels = field.labels ?? {};\n if (frame.name) {\n labels = { ...labels, name: frame.name };\n }\n\n fields.push({\n ...field,\n labels, // add the name label from frame\n });\n }\n\n if (options.keepOriginIndices) {\n field.state.origin = {\n frameIndex,\n fieldIndex,\n };\n }\n }\n\n if (!join) {\n continue; // skip the frame\n }\n\n if (originalFields.length === 0) {\n originalFields.push(join); // first join field\n }\n\n nullModes.push(nullModesFrame);\n const a: AlignedData = [join.values.toArray()]; //\n\n for (const field of fields) {\n a.push(field.values.toArray());\n originalFields.push(field);\n // clear field displayName state\n delete field.state?.displayName;\n }\n\n allData.push(a);\n }\n\n const joined = join(allData, nullModes);\n\n return {\n // ...options.data[0], // keep name, meta?\n length: joined[0].length,\n fields: originalFields.map((f, index) => ({\n ...f,\n values: new ArrayVector(joined[index]),\n })),\n };\n}\n\n//--------------------------------------------------------------------------------\n// Below here is copied from uplot (MIT License)\n// https://github.com/leeoniya/uPlot/blob/master/src/utils.js#L325\n// This avoids needing to import uplot into the data package\n//--------------------------------------------------------------------------------\n\n// Copied from uplot\nexport type TypedArray =\n | Int8Array\n | Uint8Array\n | Int16Array\n | Uint16Array\n | Int32Array\n | Uint32Array\n | Uint8ClampedArray\n | Float32Array\n | Float64Array;\n\nexport type AlignedData =\n | TypedArray[]\n | [xValues: number[] | TypedArray, ...yValues: Array<Array<number | null | undefined> | TypedArray>];\n\n// nullModes\nconst NULL_REMOVE = 0; // nulls are converted to undefined (e.g. for spanGaps: true)\nconst NULL_RETAIN = 1; // nulls are retained, with alignment artifacts set to undefined (default)\nconst NULL_EXPAND = 2; // nulls are expanded to include any adjacent alignment artifacts\n\ntype JoinNullMode = number; // NULL_IGNORE | NULL_RETAIN | NULL_EXPAND;\n\n// sets undefined values to nulls when adjacent to existing nulls (minesweeper)\nfunction nullExpand(yVals: Array<number | null>, nullIdxs: number[], alignedLen: number) {\n for (let i = 0, xi, lastNullIdx = -1; i < nullIdxs.length; i++) {\n let nullIdx = nullIdxs[i];\n\n if (nullIdx > lastNullIdx) {\n xi = nullIdx - 1;\n while (xi >= 0 && yVals[xi] == null) {\n yVals[xi--] = null;\n }\n\n xi = nullIdx + 1;\n while (xi < alignedLen && yVals[xi] == null) {\n yVals[(lastNullIdx = xi++)] = null;\n }\n }\n }\n}\n\n// nullModes is a tables-matched array indicating how to treat nulls in each series\nexport function join(tables: AlignedData[], nullModes?: number[][]) {\n const xVals = new Set<number>();\n\n for (let ti = 0; ti < tables.length; ti++) {\n let t = tables[ti];\n let xs = t[0];\n let len = xs.length;\n\n for (let i = 0; i < len; i++) {\n xVals.add(xs[i]);\n }\n }\n\n let data = [Array.from(xVals).sort((a, b) => a - b)];\n\n let alignedLen = data[0].length;\n\n let xIdxs = new Map();\n\n for (let i = 0; i < alignedLen; i++) {\n xIdxs.set(data[0][i], i);\n }\n\n for (let ti = 0; ti < tables.length; ti++) {\n let t = tables[ti];\n let xs = t[0];\n\n for (let si = 1; si < t.length; si++) {\n let ys = t[si];\n\n let yVals = Array(alignedLen).fill(undefined);\n\n let nullMode = nullModes ? nullModes[ti][si] : NULL_RETAIN;\n\n let nullIdxs = [];\n\n for (let i = 0; i < ys.length; i++) {\n let yVal = ys[i];\n let alignedIdx = xIdxs.get(xs[i]);\n\n if (yVal === null) {\n if (nullMode !== NULL_REMOVE) {\n yVals[alignedIdx] = yVal;\n\n if (nullMode === NULL_EXPAND) {\n nullIdxs.push(alignedIdx);\n }\n }\n } else {\n yVals[alignedIdx] = yVal;\n }\n }\n\n nullExpand(yVals, nullIdxs, alignedLen);\n\n data.push(yVals);\n }\n }\n\n return data;\n}\n\n// Test a few samples to see if the values are ascending\n// Only exported for tests\nexport function isLikelyAscendingVector(data: Vector, samples = 50) {\n const len = data.length;\n\n // empty or single value\n if (len <= 1) {\n return true;\n }\n\n // skip leading & trailing nullish\n let firstIdx = 0;\n let lastIdx = len - 1;\n\n while (firstIdx <= lastIdx && data.get(firstIdx) == null) {\n firstIdx++;\n }\n\n while (lastIdx >= firstIdx && data.get(lastIdx) == null) {\n lastIdx--;\n }\n\n // all nullish or one value surrounded by nullish\n if (lastIdx <= firstIdx) {\n return true;\n }\n\n const stride = Math.max(1, Math.floor((lastIdx - firstIdx + 1) / samples));\n\n for (let prevVal = data.get(firstIdx), i = firstIdx + stride; i <= lastIdx; i += stride) {\n const v = data.get(i);\n\n if (v != null) {\n if (v <= prevVal) {\n return false;\n }\n\n prevVal = v;\n }\n }\n\n return true;\n}\n","import { map } from 'rxjs/operators';\n\nimport { getFieldDisplayName } from '../..';\nimport { DataFrame, Field, FieldType, SynchronousDataTransformerInfo } from '../../types';\nimport { ArrayVector } from '../../vector';\n\nimport { DataTransformerID } from './ids';\n\nexport enum LabelsToFieldsMode {\n Columns = 'columns', // default mode\n Rows = 'rows',\n}\nexport interface LabelsToFieldsOptions {\n mode?: LabelsToFieldsMode;\n\n /** When empty, this will keep all labels, otherise it will keep only labels matching the value */\n keepLabels?: string[];\n\n /**\n * When in column mode and if set this will use this label's value as the value field name.\n */\n valueLabel?: string;\n}\n\nexport const labelsToFieldsTransformer: SynchronousDataTransformerInfo<LabelsToFieldsOptions> = {\n id: DataTransformerID.labelsToFields,\n name: 'Labels to fields',\n description: 'Extract time series labels to fields (columns or rows)',\n defaultOptions: {},\n\n operator: (options) => (source) => source.pipe(map((data) => labelsToFieldsTransformer.transformer(options)(data))),\n\n transformer: (options: LabelsToFieldsOptions) => (data: DataFrame[]) => {\n // Show each label as a field row\n if (options.mode === LabelsToFieldsMode.Rows) {\n return convertLabelsToRows(data, options.keepLabels);\n }\n\n const result: DataFrame[] = [];\n const keepLabels = options.keepLabels?.length ? new Set(options.keepLabels) : undefined;\n\n for (const frame of data) {\n const newFields: Field[] = [];\n const uniqueLabels: Record<string, Set<string>> = {};\n for (const field of frame.fields) {\n if (!field.labels) {\n newFields.push(field);\n continue;\n }\n\n const sansLabels = {\n ...field,\n config: {\n ...field.config,\n // we need to clear thes for this transform as these can contain label names that we no longer want\n displayName: undefined,\n displayNameFromDS: undefined,\n },\n labels: undefined,\n };\n newFields.push(sansLabels);\n\n for (const labelName of Object.keys(field.labels)) {\n if (keepLabels && !keepLabels.has(labelName)) {\n continue;\n }\n\n // if we should use this label as the value field name store it and skip adding this as a separate field\n if (options.valueLabel === labelName) {\n sansLabels.name = field.labels[labelName];\n continue;\n }\n\n const uniqueValues = uniqueLabels[labelName] ?? (uniqueLabels[labelName] = new Set()); // (Safari 13.1 lacks ??= support)\n uniqueValues.add(field.labels[labelName]);\n }\n }\n\n for (const name in uniqueLabels) {\n for (const value of uniqueLabels[name]) {\n const values = new Array(frame.length).fill(value);\n newFields.push({\n name: name,\n type: FieldType.string,\n values: new ArrayVector(values),\n config: {},\n });\n }\n }\n\n result.push({\n fields: newFields,\n length: frame.length,\n });\n }\n\n return result;\n },\n};\n\nfunction convertLabelsToRows(data: DataFrame[], keepLabels?: string[]): DataFrame[] {\n const result: DataFrame[] = [];\n for (const frame of data) {\n for (const field of frame.fields) {\n if (field.labels) {\n const keys: string[] = [];\n const vals: string[] = [];\n if (keepLabels) {\n for (const key of keepLabels) {\n keys.push(key);\n vals.push(field.labels[key]);\n }\n } else {\n for (const [key, val] of Object.entries(field.labels)) {\n keys.push(key);\n vals.push(val);\n }\n }\n if (vals.length) {\n result.push({\n ...frame,\n name: getFieldDisplayName(field, frame, data),\n fields: [\n { name: 'label', type: FieldType.string, config: {}, values: new ArrayVector(keys) },\n { name: 'value', type: FieldType.string, config: {}, values: new ArrayVector(vals) },\n ],\n length: vals.length,\n });\n }\n }\n }\n }\n return result;\n}\n","import { map } from 'rxjs/operators';\n\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { DataFrame, Field } from '../../types';\nimport { DataTransformerInfo } from '../../types/transformations';\n\nimport { DataTransformerID } from './ids';\n\nexport interface OrderFieldsTransformerOptions {\n indexByName: Record<string, number>;\n}\n\nexport const orderFieldsTransformer: DataTransformerInfo<OrderFieldsTransformerOptions> = {\n id: DataTransformerID.order,\n name: 'Order fields by name',\n description: 'Order fields based on configuration given by user',\n defaultOptions: {\n indexByName: {},\n },\n\n /**\n * Return a modified copy of the series. If the transform is not or should not\n * be applied, just return the input series\n */\n operator: (options) => (source) =>\n source.pipe(\n map((data) => {\n const orderer = createFieldsOrderer(options.indexByName);\n\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n\n return data.map((frame) => ({\n ...frame,\n fields: orderer(frame.fields, data, frame),\n }));\n })\n ),\n};\n\nexport const createOrderFieldsComparer = (indexByName: Record<string, number>) => (a: string, b: string) => {\n return indexOfField(a, indexByName) - indexOfField(b, indexByName);\n};\n\nconst createFieldsOrderer =\n (indexByName: Record<string, number>) => (fields: Field[], data: DataFrame[], frame: DataFrame) => {\n if (!Array.isArray(fields) || fields.length === 0) {\n return fields;\n }\n if (!indexByName || Object.keys(indexByName).length === 0) {\n return fields;\n }\n const comparer = createOrderFieldsComparer(indexByName);\n return fields.sort((a, b) => comparer(getFieldDisplayName(a, frame, data), getFieldDisplayName(b, frame, data)));\n };\n\nconst indexOfField = (fieldName: string, indexByName: Record<string, number>) => {\n if (Number.isInteger(indexByName[fieldName])) {\n return indexByName[fieldName];\n }\n return Number.MAX_SAFE_INTEGER;\n};\n","import { map } from 'rxjs/operators';\n\nimport { guessFieldTypeForField } from '../../dataframe/processDataFrame';\nimport { getFieldDisplayName } from '../../field';\nimport { KeyValue } from '../../types/data';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { DataTransformerInfo, FieldMatcher, MatcherConfig } from '../../types/transformations';\nimport { ArrayVector } from '../../vector/ArrayVector';\nimport { fieldReducers, reduceField, ReducerID } from '../fieldReducer';\nimport { getFieldMatcher } from '../matchers';\nimport { alwaysFieldMatcher, notTimeFieldMatcher } from '../matchers/predicates';\n\nimport { DataTransformerID } from './ids';\n\nexport enum ReduceTransformerMode {\n SeriesToRows = 'seriesToRows', // default\n ReduceFields = 'reduceFields', // same structure, add additional row for each type\n}\nexport interface ReduceTransformerOptions {\n reducers: ReducerID[];\n fields?: MatcherConfig; // Assume all fields\n mode?: ReduceTransformerMode;\n includeTimeField?: boolean;\n labelsToFields?: boolean;\n}\n\nexport const reduceTransformer: DataTransformerInfo<ReduceTransformerOptions> = {\n id: DataTransformerID.reduce,\n name: 'Reduce',\n description: 'Reduce all rows or data points to a single value using a function like max, min, mean or last',\n defaultOptions: {\n reducers: [ReducerID.max],\n },\n\n /**\n * Return a modified copy of the series. If the transform is not or should not\n * be applied, just return the input series\n */\n operator: (options) => (source) =>\n source.pipe(\n map((data) => {\n if (!options?.reducers?.length) {\n return data; // nothing selected\n }\n\n const matcher = options.fields\n ? getFieldMatcher(options.fields)\n : options.includeTimeField && options.mode === ReduceTransformerMode.ReduceFields\n ? alwaysFieldMatcher\n : notTimeFieldMatcher;\n\n // Collapse all matching fields into a single row\n if (options.mode === ReduceTransformerMode.ReduceFields) {\n return reduceFields(data, matcher, options.reducers);\n }\n\n // Add a row for each series\n const res = reduceSeriesToRows(data, matcher, options.reducers, options.labelsToFields);\n return res ? [res] : [];\n })\n ),\n};\n\n/**\n * @internal only exported for testing\n */\nexport function reduceSeriesToRows(\n data: DataFrame[],\n matcher: FieldMatcher,\n reducerId: ReducerID[],\n labelsToFields?: boolean\n): DataFrame | undefined {\n const calculators = fieldReducers.list(reducerId);\n const reducers = calculators.map((c) => c.id);\n const processed: DataFrame[] = [];\n const distinctLabels = labelsToFields ? getDistinctLabelKeys(data) : [];\n\n for (const series of data) {\n const source = series.fields.filter((f) => matcher(f, series, data));\n\n const size = source.length;\n const fields: Field[] = [];\n const names = new ArrayVector<string>(new Array(size));\n fields.push({\n name: 'Field',\n type: FieldType.string,\n values: names,\n config: {},\n });\n\n const labels: KeyValue<ArrayVector> = {};\n if (labelsToFields) {\n for (const key of distinctLabels) {\n labels[key] = new ArrayVector<string>(new Array(size));\n fields.push({\n name: key,\n type: FieldType.string,\n values: labels[key],\n config: {},\n });\n }\n }\n\n const calcs: KeyValue<ArrayVector> = {};\n for (const info of calculators) {\n calcs[info.id] = new ArrayVector(new Array(size));\n fields.push({\n name: info.name,\n type: FieldType.other, // UNKNOWN until after we call the functions\n values: calcs[info.id],\n config: {},\n });\n }\n\n for (let i = 0; i < source.length; i++) {\n const field = source[i];\n const results = reduceField({\n field,\n reducers,\n });\n\n if (labelsToFields) {\n names.buffer[i] = field.name;\n if (field.labels) {\n for (const key of Object.keys(field.labels)) {\n labels[key].set(i, field.labels[key]);\n }\n }\n } else {\n names.buffer[i] = getFieldDisplayName(field, series, data);\n }\n\n for (const info of calculators) {\n const v = results[info.id];\n calcs[info.id].buffer[i] = v;\n }\n }\n\n // For reduced fields, we don't know the type until we see the value\n for (const f of fields) {\n if (f.type === FieldType.other) {\n const t = guessFieldTypeForField(f);\n if (t) {\n f.type = t;\n }\n }\n }\n\n processed.push({\n ...series, // Same properties, different fields\n fields,\n length: size,\n });\n }\n\n return mergeResults(processed);\n}\n\nexport function getDistinctLabelKeys(frames: DataFrame[]): string[] {\n const keys = new Set<string>();\n for (const frame of frames) {\n for (const field of frame.fields) {\n if (field.labels) {\n for (const k of Object.keys(field.labels)) {\n keys.add(k);\n }\n }\n }\n }\n return [...keys];\n}\n\n/**\n * @internal only exported for testing\n */\nexport function mergeResults(data: DataFrame[]): DataFrame | undefined {\n if (!data?.length) {\n return undefined;\n }\n\n const baseFrame = data[0];\n\n for (let seriesIndex = 1; seriesIndex < data.length; seriesIndex++) {\n const series = data[seriesIndex];\n\n for (let baseIndex = 0; baseIndex < baseFrame.fields.length; baseIndex++) {\n const baseField = baseFrame.fields[baseIndex];\n for (let fieldIndex = 0; fieldIndex < series.fields.length; fieldIndex++) {\n const field = series.fields[fieldIndex];\n const isFirstField = baseIndex === 0 && fieldIndex === 0;\n const isSameField = baseField.type === field.type && baseField.name === field.name;\n\n if (isFirstField || isSameField) {\n const baseValues: any[] = baseField.values.toArray();\n const values: any[] = field.values.toArray();\n (baseField.values as unknown as ArrayVector).buffer = baseValues.concat(values);\n }\n }\n }\n }\n\n baseFrame.name = undefined;\n baseFrame.length = baseFrame.fields[0].values.length;\n return baseFrame;\n}\n\n/**\n * @internal -- only exported for testing\n */\nexport function reduceFields(data: DataFrame[], matcher: FieldMatcher, reducerId: ReducerID[]): DataFrame[] {\n const calculators = fieldReducers.list(reducerId);\n const reducers = calculators.map((c) => c.id);\n const processed: DataFrame[] = [];\n\n for (const series of data) {\n const fields: Field[] = [];\n for (const field of series.fields) {\n if (matcher(field, series, data)) {\n const results = reduceField({\n field,\n reducers,\n });\n for (const reducer of reducers) {\n const value = results[reducer];\n const copy = {\n ...field,\n values: new ArrayVector([value]),\n };\n copy.state = undefined;\n if (reducers.length > 1) {\n if (!copy.labels) {\n copy.labels = {};\n }\n copy.labels['reducer'] = fieldReducers.get(reducer).name;\n }\n fields.push(copy);\n }\n }\n }\n if (fields.length) {\n processed.push({\n ...series,\n fields,\n length: 1, // always one row\n });\n }\n }\n\n return processed;\n}\n","import { SystemDateFormatSettings } from '../datetime';\nimport { MapLayerOptions } from '../geo/layer';\nimport { GrafanaTheme2 } from '../themes';\n\nimport { DataSourceInstanceSettings } from './datasource';\nimport { FeatureToggles } from './featureToggles.gen';\nimport { PanelPluginMeta } from './panel';\nimport { GrafanaTheme } from './theme';\n\nimport { NavLinkDTO, OrgRole } from '.';\n\n/**\n * Describes the build information that will be available via the Grafana configuration.\n *\n * @public\n */\nexport interface BuildInfo {\n version: string;\n commit: string;\n env: string;\n edition: GrafanaEdition;\n latestVersion: string;\n hasUpdate: boolean;\n hideVersion: boolean;\n}\n\n/**\n * @internal\n */\nexport enum GrafanaEdition {\n OpenSource = 'Open Source',\n Pro = 'Pro',\n Enterprise = 'Enterprise',\n}\n\n/**\n * Describes the license information about the current running instance of Grafana.\n *\n * @public\n */\nexport interface LicenseInfo {\n expiry: number;\n licenseUrl: string;\n stateInfo: string;\n edition: GrafanaEdition;\n enabledFeatures: { [key: string]: boolean };\n trialExpiry?: number;\n}\n\n/**\n * Describes Sentry integration config\n *\n * @public\n */\nexport interface SentryConfig {\n enabled: boolean;\n dsn: string;\n customEndpoint: string;\n sampleRate: number;\n}\n\n/**\n * Describes GrafanaJavascriptAgentConfig integration config\n *\n * @public\n */\nexport interface GrafanaJavascriptAgentConfig {\n enabled: boolean;\n customEndpoint: string;\n errorInstrumentalizationEnabled: boolean;\n consoleInstrumentalizationEnabled: boolean;\n webVitalsInstrumentalizationEnabled: boolean;\n apiKey: string;\n}\n\nexport interface UnifiedAlertingConfig {\n minInterval: string;\n}\n\n/**\n * Describes the plugins that should be preloaded prior to start Grafana.\n *\n * @public\n */\nexport type PreloadPlugin = {\n path: string;\n version: string;\n};\n\n/** Supported OAuth services\n *\n * @public\n */\nexport type OAuth =\n | 'github'\n | 'gitlab'\n | 'google'\n | 'generic_oauth'\n // | 'grafananet' Deprecated. Key always changed to \"grafana_com\"\n | 'grafana_com'\n | 'azuread'\n | 'okta';\n\n/** Map of enabled OAuth services and their respective names\n *\n * @public\n */\nexport type OAuthSettings = Partial<Record<OAuth, { name: string; icon?: string }>>;\n\n/** Current user info included in bootData\n *\n * @internal\n */\nexport interface CurrentUserDTO {\n isSignedIn: boolean;\n id: number;\n externalUserId: string;\n login: string;\n email: string;\n name: string;\n lightTheme: boolean;\n orgCount: number;\n orgId: number;\n orgName: string;\n orgRole: OrgRole | '';\n isGrafanaAdmin: boolean;\n gravatarUrl: string;\n timezone: string;\n weekStart: string;\n locale: string;\n permissions?: Record<string, boolean>;\n}\n\n/** Contains essential user and config info\n *\n * @internal\n */\nexport interface BootData {\n user: CurrentUserDTO;\n settings: GrafanaConfig;\n navTree: NavLinkDTO[];\n themePaths: {\n light: string;\n dark: string;\n };\n}\n\n/**\n * Describes all the different Grafana configuration values available for an instance.\n *\n * @internal\n */\nexport interface GrafanaConfig {\n isPublicDashboardView: boolean;\n datasources: { [str: string]: DataSourceInstanceSettings };\n panels: { [key: string]: PanelPluginMeta };\n minRefreshInterval: string;\n appSubUrl: string;\n windowTitlePrefix: string;\n buildInfo: BuildInfo;\n newPanelTitle: string;\n bootData: BootData;\n externalUserMngLinkUrl: string;\n externalUserMngLinkName: string;\n externalUserMngInfo: string;\n allowOrgCreate: boolean;\n disableLoginForm: boolean;\n defaultDatasource: string;\n alertingEnabled: boolean;\n alertingErrorOrTimeout: string;\n alertingNoDataOrNullValues: string;\n alertingMinInterval: number;\n authProxyEnabled: boolean;\n exploreEnabled: boolean;\n queryHistoryEnabled: boolean;\n helpEnabled: boolean;\n profileEnabled: boolean;\n ldapEnabled: boolean;\n sigV4AuthEnabled: boolean;\n azureAuthEnabled: boolean;\n samlEnabled: boolean;\n autoAssignOrg: boolean;\n verifyEmailEnabled: boolean;\n oauth: OAuthSettings;\n rbacEnabled: boolean;\n rbacBuiltInRoleAssignmentEnabled: boolean;\n disableUserSignUp: boolean;\n loginHint: string;\n passwordHint: string;\n loginError?: string;\n navTree: any;\n viewersCanEdit: boolean;\n editorsCanAdmin: boolean;\n disableSanitizeHtml: boolean;\n liveEnabled: boolean;\n theme: GrafanaTheme;\n theme2: GrafanaTheme2;\n pluginsToPreload: PreloadPlugin[];\n featureToggles: FeatureToggles;\n licenseInfo: LicenseInfo;\n http2Enabled: boolean;\n dateFormats?: SystemDateFormatSettings;\n sentry: SentryConfig;\n grafanaJavascriptAgent: GrafanaJavascriptAgentConfig;\n customTheme?: any;\n geomapDefaultBaseLayer?: MapLayerOptions;\n geomapDisableCustomBaseLayer?: boolean;\n unifiedAlertingEnabled: boolean;\n unifiedAlerting: UnifiedAlertingConfig;\n angularSupportEnabled: boolean;\n feedbackLinksEnabled: boolean;\n secretsManagerPluginEnabled: boolean;\n googleAnalyticsId: string | undefined;\n rudderstackWriteKey: string | undefined;\n rudderstackDataPlaneUrl: string | undefined;\n rudderstackSdkUrl: string | undefined;\n rudderstackConfigUrl: string | undefined;\n}\n","export const GAUGE_DEFAULT_MINIMUM = 0;\nexport const GAUGE_DEFAULT_MAXIMUM = 100;\nexport const DEFAULT_SAML_NAME = 'SAML';\n","import { DataFrameDTO, FieldConfig } from './dataFrame';\nimport { DataFrameType } from './dataFrameTypes';\nimport { ApplyFieldOverrideOptions } from './fieldOverrides';\nimport { DataTopic } from './query';\nimport { DataTransformerConfig } from './transformations';\n\nimport { PanelPluginDataSupport } from '.';\n\nexport type KeyValue<T = any> = Record<string, T>;\n\n/**\n * Represent panel data loading state.\n * @public\n */\nexport enum LoadingState {\n NotStarted = 'NotStarted',\n Loading = 'Loading',\n Streaming = 'Streaming',\n Done = 'Done',\n Error = 'Error',\n}\n\n// Should be kept in sync with grafana-plugin-sdk-go/data/frame_meta.go\nexport const preferredVisualizationTypes = ['graph', 'table', 'logs', 'trace', 'nodeGraph'] as const;\nexport type PreferredVisualisationType = typeof preferredVisualizationTypes[number];\n\n/**\n * @public\n */\nexport interface QueryResultMeta {\n type?: DataFrameType;\n\n /** DatasSource Specific Values */\n custom?: Record<string, any>;\n\n /** Stats */\n stats?: QueryResultMetaStat[];\n\n /** Meta Notices */\n notices?: QueryResultMetaNotice[];\n\n /** Used to track transformation ids that where part of the processing */\n transformations?: string[];\n\n /** Currently used to show results in Explore only in preferred visualisation option */\n preferredVisualisationType?: PreferredVisualisationType;\n\n /** The path for live stream updates for this frame */\n channel?: string;\n\n /** Did the query response come from the cache */\n isCachedResponse?: boolean;\n\n /**\n * Optionally identify which topic the frame should be assigned to.\n * A value specified in the response will override what the request asked for.\n */\n dataTopic?: DataTopic;\n\n /**\n * This is the raw query sent to the underlying system. All macros and templating\n * as been applied. When metadata contains this value, it will be shown in the query inspector\n */\n executedQueryString?: string;\n\n /**\n * A browsable path on the datasource\n */\n path?: string;\n\n /**\n * defaults to '/'\n */\n pathSeparator?: string;\n\n /**\n * Legacy data source specific, should be moved to custom\n * */\n alignmentPeriod?: number; // used by cloud monitoring\n searchWords?: string[]; // used by log models and loki\n limit?: number; // used by log models and loki\n json?: boolean; // used to keep track of old json doc values\n instant?: boolean;\n}\n\nexport interface QueryResultMetaStat extends FieldConfig {\n displayName: string;\n value: number;\n}\n\n/**\n * QueryResultMetaNotice is a structure that provides user notices for query result data\n * @public\n */\nexport interface QueryResultMetaNotice {\n /**\n * Specify the notice severity\n */\n severity: 'info' | 'warning' | 'error';\n\n /**\n * Notice descriptive text\n */\n text: string;\n\n /**\n * An optional link that may be displayed in the UI.\n * This value may be an absolute URL or relative to grafana root\n */\n link?: string;\n\n /**\n * Optionally suggest an appropriate tab for the panel inspector\n */\n inspect?: 'meta' | 'error' | 'data' | 'stats';\n}\n\n/**\n * @public\n */\nexport interface QueryResultBase {\n /**\n * Matches the query target refId\n */\n refId?: string;\n\n /**\n * Used by some backend data sources to communicate back info about the execution (generated sql, timing)\n */\n meta?: QueryResultMeta;\n}\n\nexport interface Labels {\n [key: string]: string;\n}\nexport interface Column {\n text: string; // For a Column, the 'text' is the field name\n filterable?: boolean;\n unit?: string;\n custom?: Record<string, any>;\n}\n\nexport interface TableData extends QueryResultBase {\n name?: string;\n columns: Column[];\n rows: any[][];\n type?: string;\n}\n\nexport type TimeSeriesValue = number | null;\n\nexport type TimeSeriesPoints = TimeSeriesValue[][];\n\nexport interface TimeSeries extends QueryResultBase {\n target: string;\n /**\n * If name is manually configured via an alias / legend pattern\n */\n title?: string;\n datapoints: TimeSeriesPoints;\n unit?: string;\n tags?: Labels;\n}\n\nexport enum NullValueMode {\n Null = 'null',\n Ignore = 'connected',\n AsZero = 'null as zero',\n}\n\n/**\n * Describes and API for exposing panel specific data configurations.\n */\nexport interface DataConfigSource {\n configRev?: number;\n getDataSupport: () => PanelPluginDataSupport;\n getTransformations: () => DataTransformerConfig[] | undefined;\n getFieldOverrideOptions: () => ApplyFieldOverrideOptions | undefined;\n snapshotData?: DataFrameDTO[];\n}\n","/**\n * See also:\n * https://github.com/grafana/grafana-plugin-sdk-go/blob/main/data/frame_type.go\n *\n * @public\n */\nexport enum DataFrameType {\n TimeSeriesWide = 'timeseries-wide',\n TimeSeriesLong = 'timeseries-long',\n TimeSeriesMany = 'timeseries-many',\n\n /** Directory listing */\n DirectoryListing = 'directory-listing',\n\n /**\n * First field is X, the rest are ordinal values used as rows in the heatmap\n */\n HeatmapRows = 'heatmap-rows',\n\n /**\n * Explicit fields for:\n * xMin, yMin, count, ...\n *\n * All values in the grid exist and have regular spacing\n *\n * If the y value is actually ordinal, use `meta.custom` to specify the bucket lookup values\n */\n HeatmapCells = 'heatmap-cells',\n}\n","import { ExplorePanelsState } from './explore';\nimport { InterpolateFunction } from './panel';\nimport { DataQuery } from './query';\n\n/**\n * Callback info for DataLink click events\n */\nexport interface DataLinkClickEvent<T = any> {\n origin: T;\n replaceVariables: InterpolateFunction | undefined;\n e?: any; // mouse|react event\n}\n\n/**\n * Link configuration. The values may contain variables that need to be\n * processed before showing the link to user.\n *\n * TODO: <T extends DataQuery> is not strictly true for internal links as we do not need refId for example but all\n * data source defined queries extend this so this is more for documentation.\n */\nexport interface DataLink<T extends DataQuery = any> {\n title: string;\n targetBlank?: boolean;\n\n // 3: The URL if others did not set it first\n url: string;\n\n // 2: If exists, use this to construct the URL\n // Not saved in JSON/DTO\n onBuildUrl?: (event: DataLinkClickEvent) => string;\n\n // 1: If exists, handle click directly\n // Not saved in JSON/DTO\n onClick?: (event: DataLinkClickEvent) => void;\n\n // If dataLink represents internal link this has to be filled. Internal link is defined as a query in a particular\n // data source that we want to show to the user. Usually this results in a link to explore but can also lead to\n // more custom onClick behaviour if needed.\n // @internal and subject to change in future releases\n internal?: InternalDataLink<T>;\n}\n\n/** @internal */\nexport interface InternalDataLink<T extends DataQuery = any> {\n query: T;\n datasourceUid: string;\n datasourceName: string; // used as a title if `DataLink.title` is empty\n panelsState?: ExplorePanelsState;\n}\n\nexport type LinkTarget = '_blank' | '_self' | undefined;\n\n/**\n * Processed Link Model. The values are ready to use\n */\nexport interface LinkModel<T = any> {\n href: string;\n title: string;\n target: LinkTarget;\n origin: T;\n\n // When a click callback exists, this is passed the raw mouse|react event\n onClick?: (e: any, origin?: any) => void;\n}\n\n/**\n * Provides a way to produce links on demand\n *\n * TODO: ScopedVars in in GrafanaUI package!\n */\nexport interface LinkModelSupplier<T extends object> {\n getLinks(replaceVariables?: InterpolateFunction): Array<LinkModel<T>>;\n}\n\nexport enum VariableOrigin {\n Series = 'series',\n Field = 'field',\n Fields = 'fields',\n Value = 'value',\n BuiltIn = 'built-in',\n Template = 'template',\n}\n\nexport interface VariableSuggestion {\n value: string;\n label: string;\n documentation?: string;\n origin: VariableOrigin;\n}\n\nexport enum VariableSuggestionsScope {\n Values = 'values',\n}\n","import { FieldConfigSource } from './fieldOverrides';\nimport { DataQuery, DataSourceRef } from './query';\n\nexport enum DashboardCursorSync {\n Off,\n Crosshair,\n Tooltip,\n}\n\n/**\n * @public\n */\nexport interface PanelModel<TOptions = any, TCustomFieldConfig = any> {\n /** ID of the panel within the current dashboard */\n id: number;\n\n /** Panel title */\n title?: string;\n\n /** Description */\n description?: string;\n\n /** Panel options */\n options: TOptions;\n\n /** Field options configuration */\n fieldConfig: FieldConfigSource<TCustomFieldConfig>;\n\n /** Version of the panel plugin */\n pluginVersion?: string;\n\n /** The datasource used in all targets */\n datasource?: DataSourceRef | null;\n\n /** The queries in a panel */\n targets?: DataQuery[];\n\n /** alerting v1 object */\n alert?: any;\n}\n","/**\n * Attached to query results (not persisted)\n *\n * @public\n */\nexport enum DataTopic {\n Annotations = 'annotations',\n}\n\n/**\n * @public\n */\nexport interface DataSourceRef {\n /** The plugin type-id */\n type?: string;\n\n /** Specific datasource instance */\n uid?: string;\n}\n\n/**\n * These are the common properties available to all queries in all datasources\n * Specific implementations will *extend* this interface adding the required properties\n * for the given context\n *\n * @public\n */\nexport interface DataQuery {\n /**\n * A - Z\n */\n refId: string;\n\n /**\n * true if query is disabled (ie should not be returned to the dashboard)\n */\n hide?: boolean;\n\n /**\n * Unique, guid like, string used in explore mode\n */\n key?: string;\n\n /**\n * Specify the query flavor\n */\n queryType?: string;\n\n /**\n * For mixed data sources the selected datasource is on the query level.\n * For non mixed scenarios this is undefined.\n */\n datasource?: DataSourceRef | null;\n}\n\n/**\n * Abstract representation of any label-based query\n * @internal\n */\nexport interface AbstractQuery extends DataQuery {\n labelMatchers: AbstractLabelMatcher[];\n}\n\n/**\n * @internal\n */\nexport enum AbstractLabelOperator {\n Equal = 'Equal',\n NotEqual = 'NotEqual',\n EqualRegEx = 'EqualRegEx',\n NotEqualRegEx = 'NotEqualRegEx',\n}\n\n/**\n * @internal\n */\nexport type AbstractLabelMatcher = {\n name: string;\n value: string;\n operator: AbstractLabelOperator;\n};\n\n/**\n * @internal\n */\nexport interface DataSourceWithQueryImportSupport<TQuery extends DataQuery> {\n importFromAbstractQueries(labelBasedQuery: AbstractQuery[]): Promise<TQuery[]>;\n}\n\n/**\n * @internal\n */\nexport interface DataSourceWithQueryExportSupport<TQuery extends DataQuery> {\n exportToAbstractQueries(query: TQuery[]): Promise<AbstractQuery[]>;\n}\n\n/**\n * @internal\n */\nexport const hasQueryImportSupport = <TQuery extends DataQuery>(\n datasource: any\n): datasource is DataSourceWithQueryImportSupport<TQuery> => {\n return (datasource as DataSourceWithQueryImportSupport<TQuery>).importFromAbstractQueries !== undefined;\n};\n\n/**\n * @internal\n */\nexport const hasQueryExportSupport = <TQuery extends DataQuery>(\n datasource: any\n): datasource is DataSourceWithQueryExportSupport<TQuery> => {\n return (datasource as DataSourceWithQueryExportSupport<TQuery>).exportToAbstractQueries !== undefined;\n};\n","import { ComponentType } from 'react';\nimport { Observable } from 'rxjs';\n\nimport { DataFrame } from './dataFrame';\nimport { QueryEditorProps } from './datasource';\nimport { DataQuery, DataSourceRef } from './query';\n\n/**\n * This JSON object is stored in the dashboard json model.\n */\nexport interface AnnotationQuery<TQuery extends DataQuery = DataQuery> {\n datasource?: DataSourceRef | null;\n\n enable: boolean;\n name: string;\n iconColor: string;\n hide?: boolean;\n builtIn?: number;\n type?: string;\n snapshotData?: any;\n\n // Standard datasource query\n target?: TQuery;\n\n // Convert a dataframe to an AnnotationEvent\n mappings?: AnnotationEventMappings;\n\n // Sadly plugins can set any property directly on the main object\n [key: string]: any;\n}\n\nexport interface AnnotationEvent {\n id?: string;\n annotation?: any;\n dashboardId?: number;\n dashboardUID?: string;\n panelId?: number;\n userId?: number;\n login?: string;\n email?: string;\n avatarUrl?: string;\n time?: number;\n timeEnd?: number;\n isRegion?: boolean;\n title?: string;\n text?: string;\n type?: string;\n tags?: string[];\n color?: string;\n alertId?: number;\n newState?: string;\n\n // Currently used to merge annotations from alerts and dashboard\n source?: any; // source.type === 'dashboard'\n}\n\nexport interface AnnotationEventUIModel {\n id?: string;\n from: number;\n to: number;\n tags: string[];\n description: string;\n}\n\n/**\n * @alpha -- any value other than `field` is experimental\n */\nexport enum AnnotationEventFieldSource {\n Field = 'field', // Default -- find the value with a matching key\n Text = 'text', // Write a constant string into the value\n Skip = 'skip', // Do not include the field\n}\n\nexport interface AnnotationEventFieldMapping {\n source?: AnnotationEventFieldSource; // defaults to 'field'\n value?: string;\n regex?: string;\n}\n\nexport type AnnotationEventMappings = Partial<Record<keyof AnnotationEvent, AnnotationEventFieldMapping>>;\ntype AnnotationQueryEditorProps<TQuery extends DataQuery> = QueryEditorProps<any, TQuery> & {\n // Needs to be optional otherwise component not using these cannot be used, even though they are passed on and can be\n // just ignored if not used.\n annotation?: AnnotationQuery<TQuery>;\n onAnnotationChange?: (annotation: AnnotationQuery<TQuery>) => void;\n};\n\n/**\n * Since Grafana 7.2\n *\n * This offers a generic approach to annotation processing\n */\nexport interface AnnotationSupport<TQuery extends DataQuery = DataQuery, TAnno = AnnotationQuery<TQuery>> {\n /**\n * This hook lets you manipulate any existing stored values before running them though the processor.\n * This is particularly helpful when dealing with migrating old formats. ie query as a string vs object.\n */\n prepareAnnotation?(json: any): TAnno;\n\n /**\n * Convert the stored JSON model to a standard datasource query object.\n * This query will be executed in the datasource and the results converted into events.\n * Returning an undefined result will quietly skip query execution\n */\n prepareQuery?(anno: TAnno): TQuery | undefined;\n\n /**\n * When the standard frame > event processing is insufficient, this allows explicit control of the mappings\n */\n processEvents?(anno: TAnno, data: DataFrame[]): Observable<AnnotationEvent[] | undefined>;\n\n /**\n * Specify a custom QueryEditor for the annotation page. If not specified, the standard one will be used\n */\n QueryEditor?: ComponentType<AnnotationQueryEditorProps<TQuery>>;\n}\n","import { ComponentType } from 'react';\n\nexport interface NavLinkDTO {\n id?: string;\n text: string;\n description?: string;\n section?: NavSection;\n subTitle?: string;\n icon?: string;\n img?: string;\n url?: string;\n target?: string;\n sortWeight?: number;\n divider?: boolean;\n hideFromMenu?: boolean;\n hideFromTabs?: boolean;\n children?: NavLinkDTO[];\n highlightText?: string;\n emptyMessageId?: string;\n}\n\nexport interface NavModelItem extends NavLinkDTO {\n children?: NavModelItem[];\n active?: boolean;\n breadcrumbs?: NavModelBreadcrumb[];\n parentItem?: NavModelItem;\n showOrgSwitcher?: boolean;\n onClick?: () => void;\n menuItemType?: NavMenuItemType;\n highlightText?: string;\n highlightId?: string;\n tabSuffix?: ComponentType<{ className?: string }>;\n showIconInNavbar?: boolean;\n}\n\nexport enum NavSection {\n Core = 'core',\n Plugin = 'plugin',\n Config = 'config',\n}\n\nexport enum NavMenuItemType {\n Section = 'section',\n Item = 'item',\n}\n\n/**\n * Interface used to describe different kinds of page titles and page navigation. Navmodels are usually generated in the backend and stored in Redux.\n */\nexport interface NavModel {\n /**\n * Main page. that wraps the navigation. Generate the `children` property generate tabs when used with the Page component.\n */\n main: NavModelItem;\n /**\n * This is the current active tab/navigation.\n */\n node: NavModelItem;\n}\n\nexport interface NavModelBreadcrumb {\n title: string;\n url?: string;\n}\n\nexport type NavIndex = { [s: string]: NavModelItem };\n","import { ComponentType } from 'react';\n\nimport { StandardEditorProps, FieldConfigOptionsRegistry, StandardEditorContext } from '../field';\nimport { GrafanaTheme2 } from '../themes';\nimport { MatcherConfig, FieldConfig, Field, DataFrame, TimeZone } from '../types';\n\nimport { OptionsEditorItem } from './OptionsUIRegistryBuilder';\nimport { OptionEditorConfig } from './options';\nimport { InterpolateFunction } from './panel';\n\nexport interface DynamicConfigValue {\n id: string;\n value?: any;\n}\n\nexport interface ConfigOverrideRule {\n matcher: MatcherConfig;\n properties: DynamicConfigValue[];\n}\n\n/**\n * Describes config override rules created when interacting with Grafana.\n *\n * @internal\n */\nexport interface SystemConfigOverrideRule extends ConfigOverrideRule {\n __systemRef: string;\n}\n\n/**\n * Guard functionality to check if an override rule is of type {@link SystemConfigOverrideRule}.\n * It will only return true if the {@link SystemConfigOverrideRule} has the passed systemRef.\n *\n * @param ref system override reference\n * @internal\n */\nexport function isSystemOverrideWithRef<T extends SystemConfigOverrideRule>(ref: string) {\n return (override: ConfigOverrideRule): override is T => {\n const overrideAs = override as T;\n return overrideAs.__systemRef === ref;\n };\n}\n\n/**\n * Guard functionality to check if an override rule is of type {@link SystemConfigOverrideRule}.\n * It will return true if the {@link SystemConfigOverrideRule} has any systemRef set.\n *\n * @internal\n */\nexport const isSystemOverride = (override: ConfigOverrideRule): override is SystemConfigOverrideRule => {\n return typeof (override as SystemConfigOverrideRule)?.__systemRef === 'string';\n};\n\nexport interface FieldConfigSource<TOptions = any> {\n // Defaults applied to all numeric fields\n defaults: FieldConfig<TOptions>;\n\n // Rules to override individual values\n overrides: ConfigOverrideRule[];\n}\n\nexport interface FieldOverrideContext extends StandardEditorContext<any, any> {\n field?: Field;\n dataFrameIndex?: number; // The index for the selected field frame\n}\nexport interface FieldConfigEditorProps<TValue, TSettings>\n extends Omit<StandardEditorProps<TValue, TSettings>, 'item'> {\n item: FieldConfigPropertyItem<any, TValue, TSettings>; // The property info\n value: TValue;\n context: FieldOverrideContext;\n onChange: (value?: TValue) => void;\n}\n\nexport interface FieldOverrideEditorProps<TValue, TSettings> extends Omit<StandardEditorProps<TValue>, 'item'> {\n item: FieldConfigPropertyItem<TValue, TSettings>;\n context: FieldOverrideContext;\n}\n\nexport interface FieldConfigEditorConfig<TOptions, TSettings = any, TValue = any>\n extends OptionEditorConfig<TOptions, TSettings, TValue> {\n /**\n * Function that allows specifying whether or not this field config should apply to a given field.\n * @param field\n */\n shouldApply?: (field: Field) => boolean;\n\n /** Indicates that option shoukd not be available in the Field config tab */\n hideFromDefaults?: boolean;\n\n /** Indicates that option should not be available for the overrides */\n hideFromOverrides?: boolean;\n}\n\nexport interface FieldConfigPropertyItem<TOptions = any, TValue = any, TSettings extends {} = any>\n extends OptionsEditorItem<TOptions, TSettings, FieldConfigEditorProps<TValue, TSettings>, TValue> {\n // An editor that can be filled in with context info (template variables etc)\n override: ComponentType<FieldOverrideEditorProps<TValue, TSettings>>;\n\n /** true for plugin field config properties */\n isCustom?: boolean;\n\n /** Hides option from the Field config tab */\n hideFromDefaults?: boolean;\n\n /** Indicates that option should not be available for the overrides */\n hideFromOverrides?: boolean;\n\n /** Convert the override value to a well typed value */\n process: (value: any, context: FieldOverrideContext, settings?: TSettings) => TValue | undefined | null;\n\n /** Checks if field should be processed */\n shouldApply: (field: Field) => boolean;\n}\n\nexport interface ApplyFieldOverrideOptions {\n data?: DataFrame[];\n fieldConfig: FieldConfigSource;\n fieldConfigRegistry?: FieldConfigOptionsRegistry;\n replaceVariables: InterpolateFunction;\n theme: GrafanaTheme2;\n timeZone?: TimeZone;\n}\n\nexport enum FieldConfigProperty {\n Unit = 'unit',\n Min = 'min',\n Max = 'max',\n Decimals = 'decimals',\n DisplayName = 'displayName',\n NoValue = 'noValue',\n Thresholds = 'thresholds',\n Mappings = 'mappings',\n Links = 'links',\n Color = 'color',\n}\n","import { ComponentType } from 'react';\n\nimport { KeyValue } from './data';\n\n/** Describes plugins life cycle status */\nexport enum PluginState {\n alpha = 'alpha', // Only included if `enable_alpha` config option is true\n beta = 'beta', // Will show a warning banner\n stable = 'stable', // Will not show anything\n deprecated = 'deprecated', // Will continue to work -- but not show up in the options to add\n}\n\n/** Describes {@link https://grafana.com/docs/grafana/latest/plugins | type of plugin} */\nexport enum PluginType {\n panel = 'panel',\n datasource = 'datasource',\n app = 'app',\n renderer = 'renderer',\n secretsmanager = 'secretsmanager',\n}\n\n/** Describes status of {@link https://grafana.com/docs/grafana/latest/plugins/plugin-signatures/ | plugin signature} */\nexport enum PluginSignatureStatus {\n internal = 'internal', // core plugin, no signature\n valid = 'valid', // signed and accurate MANIFEST\n invalid = 'invalid', // invalid signature\n modified = 'modified', // valid signature, but content mismatch\n missing = 'missing', // missing signature file\n}\n\n/** Describes level of {@link https://grafana.com/docs/grafana/latest/plugins/plugin-signatures/#plugin-signature-levels/ | plugin signature level} */\nexport enum PluginSignatureType {\n grafana = 'grafana',\n commercial = 'commercial',\n community = 'community',\n private = 'private',\n core = 'core',\n}\n\n/** Describes error code returned from Grafana plugins API call */\nexport enum PluginErrorCode {\n missingSignature = 'signatureMissing',\n invalidSignature = 'signatureInvalid',\n modifiedSignature = 'signatureModified',\n}\n\n/** Describes error returned from Grafana plugins API call */\nexport interface PluginError {\n errorCode: PluginErrorCode;\n pluginId: string;\n}\n\nexport interface PluginMeta<T extends KeyValue = {}> {\n id: string;\n name: string;\n type: PluginType;\n info: PluginMetaInfo;\n includes?: PluginInclude[];\n state?: PluginState;\n\n // System.load & relative URLS\n module: string;\n baseUrl: string;\n\n // Define plugin requirements\n dependencies?: PluginDependencies;\n\n // Filled in by the backend\n jsonData?: T;\n secureJsonData?: KeyValue;\n enabled?: boolean;\n defaultNavUrl?: string;\n hasUpdate?: boolean;\n enterprise?: boolean;\n latestVersion?: string;\n pinned?: boolean;\n signature?: PluginSignatureStatus;\n signatureType?: PluginSignatureType;\n signatureOrg?: string;\n live?: boolean;\n}\n\ninterface PluginDependencyInfo {\n id: string;\n name: string;\n version: string;\n type: PluginType;\n}\n\nexport interface PluginDependencies {\n grafanaDependency?: string;\n grafanaVersion: string;\n plugins: PluginDependencyInfo[];\n}\n\nexport enum PluginIncludeType {\n dashboard = 'dashboard',\n page = 'page',\n\n // Only valid for apps\n panel = 'panel',\n datasource = 'datasource',\n}\n\nexport interface PluginInclude {\n type: PluginIncludeType;\n name: string;\n path?: string;\n icon?: string;\n\n role?: string; // \"Viewer\", Admin, editor???\n addToNav?: boolean; // Show in the sidebar... only if type=page?\n\n // Angular app pages\n component?: string;\n}\n\ninterface PluginMetaInfoLink {\n name: string;\n url: string;\n}\n\nexport interface PluginBuildInfo {\n time?: number;\n repo?: string;\n branch?: string;\n hash?: string;\n number?: number;\n pr?: number;\n}\n\nexport interface ScreenshotInfo {\n name: string;\n path: string;\n}\n\nexport interface PluginMetaInfo {\n author: {\n name: string;\n url?: string;\n };\n description: string;\n links: PluginMetaInfoLink[];\n logos: {\n large: string;\n small: string;\n };\n build?: PluginBuildInfo;\n screenshots: ScreenshotInfo[];\n updated: string;\n version: string;\n}\n\nexport interface PluginConfigPageProps<T extends PluginMeta> {\n plugin: GrafanaPlugin<T>;\n query: KeyValue; // The URL query parameters\n}\n\nexport interface PluginConfigPage<T extends PluginMeta> {\n title: string; // Display\n icon?: string;\n id: string; // Unique, in URL\n\n body: ComponentType<PluginConfigPageProps<T>>;\n}\n\nexport class GrafanaPlugin<T extends PluginMeta = PluginMeta> {\n // Meta is filled in by the plugin loading system\n meta: T;\n\n // This is set if the plugin system had errors loading the plugin\n loadError?: boolean;\n\n // Config control (app/datasource)\n angularConfigCtrl?: any;\n\n // Show configuration tabs on the plugin page\n configPages?: Array<PluginConfigPage<T>>;\n\n // Tabs on the plugin page\n addConfigPage(tab: PluginConfigPage<T>) {\n if (!this.configPages) {\n this.configPages = [];\n }\n this.configPages.push(tab);\n return this;\n }\n\n /**\n * @deprecated -- this is no longer necessary and will be removed\n */\n setChannelSupport(support: any) {\n console.warn('[deprecation] plugin is using ignored option: setChannelSupport', this.meta);\n return this;\n }\n\n constructor() {\n this.meta = {} as T;\n }\n}\n","import { ComponentType } from 'react';\n\nimport { KeyValue } from './data';\nimport { NavModel } from './navModel';\nimport { PluginMeta, GrafanaPlugin, PluginIncludeType } from './plugin';\n\n/**\n * @public\n * The app container that is loading another plugin (panel or query editor)\n * */\nexport enum CoreApp {\n CloudAlerting = 'cloud-alerting',\n UnifiedAlerting = 'unified-alerting',\n Dashboard = 'dashboard',\n Explore = 'explore',\n Unknown = 'unknown',\n PanelEditor = 'panel-editor',\n PanelViewer = 'panel-viewer',\n}\n\nexport interface AppRootProps<T = KeyValue> {\n meta: AppPluginMeta<T>;\n /**\n * base URL segment for an app, /app/pluginId\n */\n basename: string; // The URL path to this page\n\n /**\n * Pass the nav model to the container... is there a better way?\n */\n onNavChanged: (nav: NavModel) => void;\n\n /**\n * The URL query parameters\n * @deprecated Use react-router instead\n */\n query: KeyValue;\n\n /**\n * The URL path to this page\n * @deprecated Use react-router instead\n */\n path: string;\n}\n\nexport interface AppPluginMeta<T = KeyValue> extends PluginMeta<T> {\n // TODO anything specific to apps?\n}\n\nexport class AppPlugin<T = KeyValue> extends GrafanaPlugin<AppPluginMeta<T>> {\n // Content under: /a/${plugin-id}/*\n root?: ComponentType<AppRootProps<T>>;\n rootNav?: NavModel; // Initial navigation model\n\n /**\n * Called after the module has loaded, and before the app is used.\n * This function may be called multiple times on the same instance.\n * The first time, `this.meta` will be undefined\n */\n init(meta: AppPluginMeta) {}\n\n /**\n * Set the component displayed under:\n * /a/${plugin-id}/*\n *\n * If the NavModel is configured, the page will have a managed frame, otheriwse it has full control.\n *\n * NOTE: this structure will change in 7.2+ so that it is managed with a normal react router\n */\n setRootPage(root: ComponentType<AppRootProps<T>>, rootNav?: NavModel) {\n this.root = root;\n this.rootNav = rootNav;\n return this;\n }\n\n setComponentsFromLegacyExports(pluginExports: any) {\n if (pluginExports.ConfigCtrl) {\n this.angularConfigCtrl = pluginExports.ConfigCtrl;\n }\n\n if (this.meta && this.meta.includes) {\n for (const include of this.meta.includes) {\n if (include.type === PluginIncludeType.page && include.component) {\n const exp = pluginExports[include.component];\n\n if (!exp) {\n console.warn('App Page uses unknown component: ', include.component, this.meta);\n continue;\n }\n }\n }\n }\n }\n}\n\n/**\n * Defines life cycle of a feature\n * @internal\n */\nexport enum FeatureState {\n alpha = 'alpha',\n beta = 'beta',\n}\n","import { ComponentType } from 'react';\nimport { Observable } from 'rxjs';\n\nimport { makeClassES5Compatible } from '../utils/makeClassES5Compatible';\n\nimport { ScopedVars } from './ScopedVars';\nimport { AnnotationEvent, AnnotationQuery, AnnotationSupport } from './annotations';\nimport { CoreApp } from './app';\nimport { KeyValue, LoadingState, TableData, TimeSeries } from './data';\nimport { DataFrame, DataFrameDTO } from './dataFrame';\nimport { PanelData } from './panel';\nimport { GrafanaPlugin, PluginMeta } from './plugin';\nimport { DataQuery } from './query';\nimport { RawTimeRange, TimeRange } from './time';\nimport { CustomVariableSupport, DataSourceVariableSupport, StandardVariableSupport } from './variables';\n\nimport { DataSourceRef, WithAccessControlMetadata } from '.';\n\nexport interface DataSourcePluginOptionsEditorProps<JSONData = DataSourceJsonData, SecureJSONData = {}> {\n options: DataSourceSettings<JSONData, SecureJSONData>;\n onOptionsChange: (options: DataSourceSettings<JSONData, SecureJSONData>) => void;\n}\n\n// Utility type to extract the query type TQuery from a class extending DataSourceApi<TQuery, TOptions>\nexport type DataSourceQueryType<DSType> = DSType extends DataSourceApi<infer TQuery, any> ? TQuery : never;\n\n// Utility type to extract the options type TOptions from a class extending DataSourceApi<TQuery, TOptions>\nexport type DataSourceOptionsType<DSType> = DSType extends DataSourceApi<any, infer TOptions> ? TOptions : never;\n\nexport class DataSourcePlugin<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataSourceQueryType<DSType>,\n TOptions extends DataSourceJsonData = DataSourceOptionsType<DSType>,\n TSecureOptions = {}\n> extends GrafanaPlugin<DataSourcePluginMeta<TOptions>> {\n components: DataSourcePluginComponents<DSType, TQuery, TOptions, TSecureOptions> = {};\n\n constructor(public DataSourceClass: DataSourceConstructor<DSType, TQuery, TOptions>) {\n super();\n }\n\n setConfigEditor(editor: ComponentType<DataSourcePluginOptionsEditorProps<TOptions, TSecureOptions>>) {\n this.components.ConfigEditor = editor;\n return this;\n }\n\n setConfigCtrl(ConfigCtrl: any) {\n this.angularConfigCtrl = ConfigCtrl;\n return this;\n }\n\n setQueryCtrl(QueryCtrl: any) {\n this.components.QueryCtrl = QueryCtrl;\n return this;\n }\n\n setAnnotationQueryCtrl(AnnotationsQueryCtrl: any) {\n this.components.AnnotationsQueryCtrl = AnnotationsQueryCtrl;\n return this;\n }\n\n setQueryEditor(QueryEditor: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>) {\n this.components.QueryEditor = QueryEditor;\n return this;\n }\n\n /** @deprecated Use `setQueryEditor` instead. When using Explore `props.app` is equal to `CoreApp.Explore` */\n setExploreQueryField(ExploreQueryField: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>) {\n this.components.ExploreQueryField = ExploreQueryField;\n return this;\n }\n\n /** @deprecated Use `setQueryEditor` instead. */\n setExploreMetricsQueryField(ExploreQueryField: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>) {\n this.components.ExploreMetricsQueryField = ExploreQueryField;\n return this;\n }\n\n /** @deprecated Use `setQueryEditor` instead. */\n setExploreLogsQueryField(ExploreQueryField: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>) {\n this.components.ExploreLogsQueryField = ExploreQueryField;\n return this;\n }\n\n setQueryEditorHelp(QueryEditorHelp: ComponentType<QueryEditorHelpProps<TQuery>>) {\n this.components.QueryEditorHelp = QueryEditorHelp;\n return this;\n }\n\n /**\n * @deprecated prefer using `setQueryEditorHelp`\n */\n setExploreStartPage(ExploreStartPage: ComponentType<QueryEditorHelpProps<TQuery>>) {\n return this.setQueryEditorHelp(ExploreStartPage);\n }\n\n /**\n * @deprecated -- prefer using {@link StandardVariableSupport} or {@link CustomVariableSupport} or {@link DataSourceVariableSupport} in data source instead\n */\n setVariableQueryEditor(VariableQueryEditor: any) {\n this.components.VariableQueryEditor = VariableQueryEditor;\n return this;\n }\n\n setMetadataInspector(MetadataInspector: ComponentType<MetadataInspectorProps<DSType, TQuery, TOptions>>) {\n this.components.MetadataInspector = MetadataInspector;\n return this;\n }\n\n setComponentsFromLegacyExports(pluginExports: any) {\n this.angularConfigCtrl = pluginExports.ConfigCtrl;\n\n this.components.QueryCtrl = pluginExports.QueryCtrl;\n this.components.AnnotationsQueryCtrl = pluginExports.AnnotationsQueryCtrl;\n this.components.ExploreQueryField = pluginExports.ExploreQueryField;\n this.components.QueryEditor = pluginExports.QueryEditor;\n this.components.QueryEditorHelp = pluginExports.QueryEditorHelp;\n this.components.VariableQueryEditor = pluginExports.VariableQueryEditor;\n }\n}\n\nexport interface DataSourcePluginMeta<T extends KeyValue = {}> extends PluginMeta<T> {\n builtIn?: boolean; // Is this for all\n metrics?: boolean;\n logs?: boolean;\n annotations?: boolean;\n alerting?: boolean;\n tracing?: boolean;\n mixed?: boolean;\n hasQueryHelp?: boolean;\n category?: string;\n queryOptions?: PluginMetaQueryOptions;\n sort?: number;\n streaming?: boolean;\n unlicensed?: boolean;\n backend?: boolean;\n isBackend?: boolean;\n}\n\ninterface PluginMetaQueryOptions {\n cacheTimeout?: boolean;\n maxDataPoints?: boolean;\n minInterval?: boolean;\n}\n\nexport interface DataSourcePluginComponents<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData,\n TSecureOptions = {}\n> {\n QueryCtrl?: any;\n AnnotationsQueryCtrl?: any;\n VariableQueryEditor?: any;\n QueryEditor?: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>;\n /** @deprecated it will be removed in a future release and `QueryEditor` will be used instead. */\n ExploreQueryField?: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>;\n /** @deprecated it will be removed in a future release and `QueryEditor` will be used instead. */\n ExploreMetricsQueryField?: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>;\n /** @deprecated it will be removed in a future release and `QueryEditor` will be used instead. */\n ExploreLogsQueryField?: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>;\n QueryEditorHelp?: ComponentType<QueryEditorHelpProps<TQuery>>;\n ConfigEditor?: ComponentType<DataSourcePluginOptionsEditorProps<TOptions, TSecureOptions>>;\n MetadataInspector?: ComponentType<MetadataInspectorProps<DSType, TQuery, TOptions>>;\n}\n\n// Only exported for tests\nexport interface DataSourceConstructor<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n new (instanceSettings: DataSourceInstanceSettings<TOptions>, ...args: any[]): DSType;\n}\n\n/**\n * The main data source abstraction interface, represents an instance of a data source\n *\n * Although this is a class, datasource implementations do not *yet* need to extend it.\n * As such, we can not yet add functions with default implementations.\n */\nabstract class DataSourceApi<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData,\n TQueryImportConfiguration extends Record<string, object> = {}\n> {\n /**\n * Set in constructor\n */\n readonly name: string;\n\n /**\n * Set in constructor\n */\n readonly id: number;\n\n /**\n * Set in constructor\n */\n readonly type: string;\n\n /**\n * Set in constructor\n */\n readonly uid: string;\n\n /**\n * min interval range\n */\n interval?: string;\n\n constructor(instanceSettings: DataSourceInstanceSettings<TOptions>) {\n this.name = instanceSettings.name;\n this.id = instanceSettings.id;\n this.type = instanceSettings.type;\n this.meta = instanceSettings.meta;\n this.uid = instanceSettings.uid;\n }\n\n /**\n * @deprecated use DataSourceWithQueryImportSupport and DataSourceWithQueryExportSupport\n */\n async importQueries?(queries: DataQuery[], originDataSource: DataSourceApi<DataQuery>): Promise<TQuery[]>;\n\n /**\n * Returns configuration for importing queries from other data sources\n */\n getImportQueryConfiguration?(): TQueryImportConfiguration;\n\n /**\n * Initializes a datasource after instantiation\n */\n init?: () => void;\n\n /**\n * Query for data, and optionally stream results\n */\n abstract query(request: DataQueryRequest<TQuery>): Promise<DataQueryResponse> | Observable<DataQueryResponse>;\n\n /**\n * Test & verify datasource settings & connection details (returning TestingStatus)\n *\n * When verification fails - errors specific to the data source should be handled here and converted to\n * a TestingStatus object. Unknown errors and HTTP errors can be re-thrown and will be handled here:\n * public/app/features/datasources/state/actions.ts\n */\n abstract testDatasource(): Promise<any>;\n\n /**\n * Override to skip executing a query\n *\n * @returns false if the query should be skipped\n *\n * @virtual\n */\n filterQuery?(query: TQuery): boolean;\n\n /**\n * Get hints for query improvements\n */\n getQueryHints?(query: TQuery, results: any[], ...rest: any): QueryHint[];\n\n /**\n * Convert a query to a simple text string\n */\n getQueryDisplayText?(query: TQuery): string;\n\n /**\n * Variable query action.\n */\n metricFindQuery?(query: any, options?: any): Promise<MetricFindValue[]>;\n\n /**\n * Get tag keys for adhoc filters\n */\n getTagKeys?(options?: any): Promise<MetricFindValue[]>;\n\n /**\n * Get tag values for adhoc filters\n */\n getTagValues?(options: any): Promise<MetricFindValue[]>;\n\n /**\n * Set after constructor call, as the data source instance is the most common thing to pass around\n * we attach the components to this instance for easy access\n */\n components?: DataSourcePluginComponents<DataSourceApi<TQuery, TOptions>, TQuery, TOptions>;\n\n /**\n * static information about the datasource\n */\n meta: DataSourcePluginMeta;\n\n /**\n * Used by alerting to check if query contains template variables\n */\n targetContainsTemplate?(query: TQuery): boolean;\n\n /**\n * Used in explore\n */\n modifyQuery?(query: TQuery, action: QueryFixAction): TQuery;\n\n /**\n * @deprecated since version 8.2.0\n * Not used anymore.\n */\n getHighlighterExpression?(query: TQuery): string[];\n\n /** Get an identifier object for this datasource instance */\n getRef(): DataSourceRef {\n return { type: this.type, uid: this.uid };\n }\n\n /**\n * Used in explore\n */\n languageProvider?: any;\n\n getVersion?(optionalOptions?: any): Promise<string>;\n\n interpolateVariablesInQueries?(queries: TQuery[], scopedVars: ScopedVars | {}): TQuery[];\n\n /**\n * An annotation processor allows explicit control for how annotations are managed.\n *\n * It is only necessary to configure an annotation processor if the default behavior is not desirable\n */\n annotations?: AnnotationSupport<TQuery>;\n\n /**\n * Can be optionally implemented to allow datasource to be a source of annotations for dashboard.\n * This function will only be called if an angular {@link AnnotationsQueryCtrl} is configured and\n * the {@link annotations} is undefined\n *\n * @deprecated -- prefer using {@link AnnotationSupport}\n */\n annotationQuery?(options: AnnotationQueryRequest<TQuery>): Promise<AnnotationEvent[]>;\n\n /**\n * Defines new variable support\n * @alpha -- experimental\n */\n variables?:\n | StandardVariableSupport<DataSourceApi<TQuery, TOptions>>\n | CustomVariableSupport<DataSourceApi<TQuery, TOptions>>\n | DataSourceVariableSupport<DataSourceApi<TQuery, TOptions>>;\n\n /*\n * Optionally, use this method to set default values for a query\n * @alpha -- experimental\n */\n getDefaultQuery?(app: CoreApp): Partial<TQuery>;\n}\n\nexport interface MetadataInspectorProps<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n datasource: DSType;\n\n // All Data from this DataSource\n data: DataFrame[];\n}\n\nexport interface QueryEditorProps<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData,\n TVQuery extends DataQuery = TQuery\n> {\n datasource: DSType;\n query: TVQuery;\n onRunQuery: () => void;\n onChange: (value: TVQuery) => void;\n onBlur?: () => void;\n /**\n * Contains query response filtered by refId of QueryResultBase and possible query error\n */\n data?: PanelData;\n range?: TimeRange;\n exploreId?: any;\n history?: Array<HistoryItem<TQuery>>;\n queries?: DataQuery[];\n app?: CoreApp;\n}\n\n// TODO: not really needed but used as type in some data sources and in DataQueryRequest\nexport enum ExploreMode {\n Logs = 'Logs',\n Metrics = 'Metrics',\n Tracing = 'Tracing',\n}\n\n/**\n * @deprecated use QueryEditorProps instead\n */\nexport type ExploreQueryFieldProps<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> = QueryEditorProps<DSType, TQuery, TOptions>;\n\nexport interface QueryEditorHelpProps<TQuery extends DataQuery = DataQuery> {\n datasource: DataSourceApi<TQuery>;\n query: TQuery;\n onClickExample: (query: TQuery) => void;\n exploreId?: any;\n}\n\n/**\n * Starting in v6.2 DataFrame can represent both TimeSeries and TableData\n */\nexport type LegacyResponseData = TimeSeries | TableData | any;\n\nexport type DataQueryResponseData = DataFrame | DataFrameDTO | LegacyResponseData;\n\nexport interface DataQueryResponse {\n /**\n * The response data. When streaming, this may be empty\n * or a partial result set\n */\n data: DataQueryResponseData[];\n\n /**\n * When returning multiple partial responses or streams\n * Use this key to inform Grafana how to combine the partial responses\n * Multiple responses with same key are replaced (latest used)\n */\n key?: string;\n\n /**\n * Optionally include error info along with the response data\n */\n error?: DataQueryError;\n\n /**\n * Use this to control which state the response should have\n * Defaults to LoadingState.Done if state is not defined\n */\n state?: LoadingState;\n}\n\nexport enum DataQueryErrorType {\n Cancelled = 'cancelled',\n Timeout = 'timeout',\n Unknown = 'unknown',\n}\n\nexport interface DataQueryError {\n data?: {\n /**\n * Short information about the error\n */\n message?: string;\n /**\n * Detailed information about the error. Only returned when app_mode is development.\n */\n error?: string;\n };\n message?: string;\n status?: number;\n statusText?: string;\n refId?: string;\n type?: DataQueryErrorType;\n}\n\nexport interface DataQueryRequest<TQuery extends DataQuery = DataQuery> {\n requestId: string; // Used to identify results and optionally cancel the request in backendSrv\n\n interval: string;\n intervalMs: number;\n maxDataPoints?: number;\n range: TimeRange;\n scopedVars: ScopedVars;\n targets: TQuery[];\n timezone: string;\n app: CoreApp | string;\n\n cacheTimeout?: string | null;\n rangeRaw?: RawTimeRange;\n timeInfo?: string; // The query time description (blue text in the upper right)\n panelId?: number;\n dashboardId?: number;\n publicDashboardAccessToken?: string;\n\n // Request Timing\n startTime: number;\n endTime?: number;\n\n // Explore state used by various datasources\n liveStreaming?: boolean;\n}\n\nexport interface DataQueryTimings {\n dataProcessingTime: number;\n}\n\nexport interface QueryFix {\n label: string;\n action?: QueryFixAction;\n}\n\nexport interface QueryFixAction {\n type: string;\n query?: string;\n preventSubmit?: boolean;\n options?: KeyValue<string>;\n}\n\nexport interface QueryHint {\n type: string;\n label: string;\n fix?: QueryFix;\n}\n\nexport interface MetricFindValue {\n text: string;\n value?: string | number;\n expandable?: boolean;\n}\n\nexport interface DataSourceJsonData {\n authType?: string;\n defaultRegion?: string;\n profile?: string;\n manageAlerts?: boolean;\n alertmanagerUid?: string;\n}\n\n/**\n * Data Source instance edit model. This is returned from:\n * /api/datasources\n */\nexport interface DataSourceSettings<T extends DataSourceJsonData = DataSourceJsonData, S = {}>\n extends WithAccessControlMetadata {\n id: number;\n uid: string;\n orgId: number;\n name: string;\n typeLogoUrl: string;\n type: string;\n typeName: string;\n access: string;\n url: string;\n user: string;\n database: string;\n basicAuth: boolean;\n basicAuthUser: string;\n isDefault: boolean;\n jsonData: T;\n secureJsonData?: S;\n secureJsonFields: KeyValue<boolean>;\n readOnly: boolean;\n withCredentials: boolean;\n version?: number;\n}\n\n/**\n * Frontend settings model that is passed to Datasource constructor. This differs a bit from the model above\n * as this data model is available to every user who has access to a data source (Viewers+). This is loaded\n * in bootData (on page load), or from: /api/frontend/settings\n */\nexport interface DataSourceInstanceSettings<T extends DataSourceJsonData = DataSourceJsonData> {\n id: number;\n uid: string;\n type: string;\n name: string;\n meta: DataSourcePluginMeta;\n url?: string;\n jsonData: T;\n username?: string;\n password?: string; // when access is direct, for some legacy datasources\n database?: string;\n isDefault?: boolean;\n access: 'direct' | 'proxy'; // Currently we support 2 options - direct (browser) and proxy (server)\n\n /**\n * This is the full Authorization header if basic auth is enabled.\n * Only available here when access is Browser (direct), when access is Server (proxy)\n * The basic auth header, username & password is never exposed to browser/Frontend\n * so this will be empty then.\n */\n basicAuth?: string;\n withCredentials?: boolean;\n\n /** When the name+uid are based on template variables, maintain access to the real values */\n rawRef?: DataSourceRef;\n}\n\n/**\n * @deprecated -- use {@link DataSourceInstanceSettings} instead\n */\nexport interface DataSourceSelectItem {\n name: string;\n value: string | null;\n meta: DataSourcePluginMeta;\n}\n\n/**\n * Options passed to the datasource.annotationQuery method. See docs/plugins/developing/datasource.md\n *\n * @deprecated -- use {@link AnnotationSupport}\n */\nexport interface AnnotationQueryRequest<MoreOptions = {}> {\n range: TimeRange;\n rangeRaw: RawTimeRange;\n // Should be DataModel but cannot import that here from the main app. Needs to be moved to package first.\n dashboard: any;\n annotation: AnnotationQuery;\n}\n\nexport interface HistoryItem<TQuery extends DataQuery = DataQuery> {\n ts: number;\n query: TQuery;\n}\n\nabstract class LanguageProvider {\n abstract datasource: DataSourceApi<any, any>;\n abstract request: (url: string, params?: any) => Promise<any>;\n\n /**\n * Returns startTask that resolves with a task list when main syntax is loaded.\n * Task list consists of secondary promises that load more detailed language features.\n */\n abstract start: () => Promise<Array<Promise<any>>>;\n startTask?: Promise<any[]>;\n}\n\n//@ts-ignore\nLanguageProvider = makeClassES5Compatible(LanguageProvider);\nexport { LanguageProvider };\n\n//@ts-ignore\nDataSourceApi = makeClassES5Compatible(DataSourceApi);\n\nexport { DataSourceApi };\n","import { defaultsDeep } from 'lodash';\n\nimport { EventBus } from '../events';\nimport { StandardEditorProps } from '../field';\nimport { Registry } from '../utils';\n\nimport { OptionsEditorItem } from './OptionsUIRegistryBuilder';\nimport { ScopedVars } from './ScopedVars';\nimport { AlertStateInfo } from './alerts';\nimport { PanelModel } from './dashboard';\nimport { LoadingState, PreferredVisualisationType } from './data';\nimport { DataFrame, FieldType } from './dataFrame';\nimport { DataQueryError, DataQueryRequest, DataQueryTimings } from './datasource';\nimport { FieldConfigSource } from './fieldOverrides';\nimport { OptionEditorConfig } from './options';\nimport { PluginMeta } from './plugin';\nimport { AbsoluteTimeRange, TimeRange, TimeZone } from './time';\nimport { DataTransformerConfig } from './transformations';\n\nexport type InterpolateFunction = (value: string, scopedVars?: ScopedVars, format?: string | Function) => string;\n\nexport interface PanelPluginMeta extends PluginMeta {\n /** Indicates that panel does not issue queries */\n skipDataQuery?: boolean;\n /** Indicates that panel should not be available in visualisation picker */\n hideFromList?: boolean;\n /** Sort order */\n sort: number;\n}\n\nexport interface PanelData {\n /** State of the data (loading, done, error, streaming) */\n state: LoadingState;\n\n /** Contains data frames with field overrides applied */\n series: DataFrame[];\n\n /**\n * This is a key that will change when the DataFrame[] structure changes.\n * The revision is a useful way to know if only data has changed or data+structure\n */\n structureRev?: number;\n\n /** A list of annotation items */\n annotations?: DataFrame[];\n\n /**\n * @internal\n */\n alertState?: AlertStateInfo;\n\n /** Request contains the queries and properties sent to the datasource */\n request?: DataQueryRequest;\n\n /** Timing measurements */\n timings?: DataQueryTimings;\n\n /** Any query errors */\n error?: DataQueryError;\n\n /** Contains the range from the request or a shifted time range if a request uses relative time */\n timeRange: TimeRange;\n}\n\nexport interface PanelProps<T = any> {\n /** ID of the panel within the current dashboard */\n id: number;\n\n /** Result set of panel queries */\n data: PanelData;\n\n /** Time range of the current dashboard */\n timeRange: TimeRange;\n\n /** Time zone of the current dashboard */\n timeZone: TimeZone;\n\n /** Panel options */\n options: T;\n\n /** Indicates whether or not panel should be rendered transparent */\n transparent: boolean;\n\n /** Current width of the panel */\n width: number;\n\n /** Current height of the panel */\n height: number;\n\n /** Field options configuration */\n fieldConfig: FieldConfigSource;\n\n /** @internal */\n renderCounter: number;\n\n /** Panel title */\n title: string;\n\n /** EventBus */\n eventBus: EventBus;\n\n /** Panel options change handler */\n onOptionsChange: (options: T) => void;\n\n /** Field config change handler */\n onFieldConfigChange: (config: FieldConfigSource) => void;\n\n /** Template variables interpolation function */\n replaceVariables: InterpolateFunction;\n\n /** Time range change handler */\n onChangeTimeRange: (timeRange: AbsoluteTimeRange) => void;\n}\n\nexport interface PanelEditorProps<T = any> {\n /** Panel options */\n options: T;\n /** Panel options change handler */\n onOptionsChange: (\n options: T,\n // callback can be used to run something right after update.\n callback?: () => void\n ) => void;\n /** Result set of panel queries */\n data?: PanelData;\n}\n\n/**\n * Called when a panel is first loaded with current panel model\n */\nexport type PanelMigrationHandler<TOptions = any> = (panel: PanelModel<TOptions>) => Partial<TOptions>;\n\n/**\n * Called before a panel is initialized. Allows panel inspection for any updates before changing the panel type.\n */\nexport type PanelTypeChangedHandler<TOptions = any> = (\n panel: PanelModel<TOptions>,\n prevPluginId: string,\n prevOptions: Record<string, any>,\n prevFieldConfig: FieldConfigSource\n) => Partial<TOptions>;\n\nexport type PanelOptionEditorsRegistry = Registry<PanelOptionsEditorItem>;\n\nexport interface PanelOptionsEditorProps<TValue> extends StandardEditorProps<TValue> {}\n\nexport interface PanelOptionsEditorItem<TOptions = any, TValue = any, TSettings = any>\n extends OptionsEditorItem<TOptions, TSettings, PanelOptionsEditorProps<TValue>, TValue> {}\n\nexport interface PanelOptionsEditorConfig<TOptions, TSettings = any, TValue = any>\n extends OptionEditorConfig<TOptions, TSettings, TValue> {}\n\n/**\n * @internal\n */\nexport interface PanelMenuItem {\n type?: 'submenu' | 'divider';\n text: string;\n iconClassName?: string;\n onClick?: (event: React.MouseEvent<any>) => void;\n shortcut?: string;\n href?: string;\n subMenu?: PanelMenuItem[];\n}\n\n/**\n * @internal\n */\nexport interface AngularPanelMenuItem {\n click: Function;\n icon: string;\n href: string;\n divider: boolean;\n text: string;\n shortcut: string;\n submenu: any[];\n}\n\nexport enum VizOrientation {\n Auto = 'auto',\n Vertical = 'vertical',\n Horizontal = 'horizontal',\n}\n\nexport interface PanelPluginDataSupport {\n annotations: boolean;\n alertStates: boolean;\n}\n\n/**\n * @alpha\n */\nexport interface VisualizationSuggestion<TOptions = any, TFieldConfig = any> {\n /** Name of suggestion */\n name: string;\n /** Description */\n description?: string;\n /** Panel plugin id */\n pluginId: string;\n /** Panel plugin options */\n options?: Partial<TOptions>;\n /** Panel plugin field options */\n fieldConfig?: FieldConfigSource<Partial<TFieldConfig>>;\n /** Data transformations */\n transformations?: DataTransformerConfig[];\n /** Options for how to render suggestion card */\n cardOptions?: {\n /** Tweak for small preview */\n previewModifier?: (suggestion: VisualizationSuggestion) => void;\n icon?: string;\n imgSrc?: string;\n };\n /** A value between 0-100 how suitable suggestion is */\n score?: VisualizationSuggestionScore;\n}\n\n/**\n * @alpha\n */\nexport enum VisualizationSuggestionScore {\n /** We are pretty sure this is the best possible option */\n Best = 100,\n /** Should be a really good option */\n Good = 70,\n /** Can be visualized but there are likely better options. If no score is set this score is assumed */\n OK = 50,\n}\n\n/**\n * @alpha\n */\nexport interface PanelDataSummary {\n hasData?: boolean;\n rowCountTotal: number;\n rowCountMax: number;\n frameCount: number;\n fieldCount: number;\n numberFieldCount: number;\n timeFieldCount: number;\n stringFieldCount: number;\n hasNumberField?: boolean;\n hasTimeField?: boolean;\n hasStringField?: boolean;\n /** The first frame that set's this value */\n preferredVisualisationType?: PreferredVisualisationType;\n}\n\n/**\n * @alpha\n */\nexport class VisualizationSuggestionsBuilder {\n /** Current data */\n data?: PanelData;\n /** Current panel & options */\n panel?: PanelModel;\n /** Summary stats for current data */\n dataSummary: PanelDataSummary;\n\n private list: VisualizationSuggestion[] = [];\n\n constructor(data?: PanelData, panel?: PanelModel) {\n this.data = data;\n this.panel = panel;\n this.dataSummary = this.computeDataSummary();\n }\n\n getListAppender<TOptions, TFieldConfig>(defaults: VisualizationSuggestion<TOptions, TFieldConfig>) {\n return new VisualizationSuggestionsListAppender<TOptions, TFieldConfig>(this.list, defaults);\n }\n\n private computeDataSummary() {\n const frames = this.data?.series || [];\n\n let numberFieldCount = 0;\n let timeFieldCount = 0;\n let stringFieldCount = 0;\n let rowCountTotal = 0;\n let rowCountMax = 0;\n let fieldCount = 0;\n let preferredVisualisationType: PreferredVisualisationType | undefined;\n\n for (const frame of frames) {\n rowCountTotal += frame.length;\n\n if (frame.meta?.preferredVisualisationType) {\n preferredVisualisationType = frame.meta.preferredVisualisationType;\n }\n\n for (const field of frame.fields) {\n fieldCount++;\n\n switch (field.type) {\n case FieldType.number:\n numberFieldCount += 1;\n break;\n case FieldType.time:\n timeFieldCount += 1;\n break;\n case FieldType.string:\n stringFieldCount += 1;\n break;\n }\n }\n\n if (frame.length > rowCountMax) {\n rowCountMax = frame.length;\n }\n }\n\n return {\n numberFieldCount,\n timeFieldCount,\n stringFieldCount,\n rowCountTotal,\n rowCountMax,\n fieldCount,\n preferredVisualisationType,\n frameCount: frames.length,\n hasData: rowCountTotal > 0,\n hasTimeField: timeFieldCount > 0,\n hasNumberField: numberFieldCount > 0,\n hasStringField: stringFieldCount > 0,\n };\n }\n\n getList() {\n return this.list;\n }\n}\n\n/**\n * @alpha\n */\nexport type VisualizationSuggestionsSupplier = {\n /**\n * Adds good suitable suggestions for the current data\n */\n getSuggestionsForData: (builder: VisualizationSuggestionsBuilder) => void;\n};\n\n/**\n * Helps with typings and defaults\n * @alpha\n */\nexport class VisualizationSuggestionsListAppender<TOptions, TFieldConfig> {\n constructor(\n private list: VisualizationSuggestion[],\n private defaults: VisualizationSuggestion<TOptions, TFieldConfig>\n ) {}\n\n append(overrides: Partial<VisualizationSuggestion<TOptions, TFieldConfig>>) {\n this.list.push(defaultsDeep(overrides, this.defaults));\n }\n}\n","export interface UserOrgDTO {\n orgId: number;\n name: string;\n role: OrgRole;\n}\n\nexport enum OrgRole {\n Admin = 'Admin',\n Editor = 'Editor',\n Viewer = 'Viewer',\n}\n","import { DataHoverPayload } from '../events';\nimport { eventFactory } from '../events/eventFactory';\nimport { BusEventBase, BusEventWithPayload } from '../events/types';\n\nimport { DataFrame } from './dataFrame';\nimport { DataQueryError, DataQueryResponseData } from './datasource';\nimport { AngularPanelMenuItem } from './panel';\n\nexport type AlertPayload = [string, string?, string?];\nexport type AlertErrorPayload = [string, (string | Error)?, string?];\n\nexport const AppEvents = {\n alertSuccess: eventFactory<AlertPayload>('alert-success'),\n alertWarning: eventFactory<AlertPayload>('alert-warning'),\n alertError: eventFactory<AlertErrorPayload>('alert-error'),\n};\n\nexport const PanelEvents = {\n refresh: eventFactory('refresh'),\n componentDidMount: eventFactory('component-did-mount'),\n dataReceived: eventFactory<DataQueryResponseData[]>('data-received'),\n dataError: eventFactory<DataQueryError>('data-error'),\n dataFramesReceived: eventFactory<DataFrame[]>('data-frames-received'),\n dataSnapshotLoad: eventFactory<DataQueryResponseData[]>('data-snapshot-load'),\n editModeInitialized: eventFactory('init-edit-mode'),\n initPanelActions: eventFactory<AngularPanelMenuItem[]>('init-panel-actions'),\n initialized: eventFactory('panel-initialized'),\n panelTeardown: eventFactory('panel-teardown'),\n render: eventFactory<any>('render'),\n};\n\n/** @public */\nexport interface LegacyGraphHoverEventPayload extends DataHoverPayload {\n pos: any;\n panel: {\n id: number;\n };\n}\n\n/** @alpha */\nexport class LegacyGraphHoverEvent extends BusEventWithPayload<LegacyGraphHoverEventPayload> {\n static type = 'graph-hover';\n}\n\n/** @alpha */\nexport class LegacyGraphHoverClearEvent extends BusEventBase {\n static type = 'graph-hover-clear';\n payload: DataHoverPayload = { point: {} };\n}\n","/**\n * The channel id is defined as:\n *\n * ${scope}/${namespace}/${path}\n *\n * The scope drives how the namespace is used and controlled\n *\n * @alpha\n */\nexport enum LiveChannelScope {\n DataSource = 'ds', // namespace = data source ID\n Plugin = 'plugin', // namespace = plugin name (singleton works for apps too)\n Grafana = 'grafana', // namespace = feature\n Stream = 'stream', // namespace = id for the managed data stream\n}\n\n/**\n * The type of data to expect in a given channel\n *\n * @alpha\n */\nexport enum LiveChannelType {\n DataStream = 'stream', // each message contains a batch of rows that will be appened to previous values\n DataFrame = 'frame', // each message is an entire data frame and should *replace* previous content\n JSON = 'json', // arbitray json message\n}\n\nexport enum LiveChannelConnectionState {\n /** The connection is not yet established */\n Pending = 'pending',\n /** Connected to the channel */\n Connected = 'connected',\n /** Disconnected from the channel. The channel will reconnect when possible */\n Disconnected = 'disconnected',\n /** Was at some point connected, and will not try to reconnect */\n Shutdown = 'shutdown',\n /** Channel configuraiton was invalid and will not connect */\n Invalid = 'invalid',\n}\n\nexport enum LiveChannelEventType {\n Status = 'status',\n Join = 'join',\n Leave = 'leave',\n Message = 'message',\n}\n\n/**\n * @alpha -- experimental\n */\nexport interface LiveChannelStatusEvent {\n type: LiveChannelEventType.Status;\n\n /**\n * {scope}/{namespace}/{path}\n */\n id: string;\n\n /**\n * unix millies timestamp for the last status change\n */\n timestamp: number;\n\n /**\n * flag if the channel is actively connected to the channel.\n * This may be false while the connections get established or if the network is lost\n * As long as the `shutdown` flag is not set, the connection will try to reestablish\n */\n state: LiveChannelConnectionState;\n\n /**\n * When joining a channel, there may be an initial packet in the subscribe method\n */\n message?: any;\n\n /**\n * The last error.\n *\n * This will remain in the status until a new message is successfully received from the channel\n */\n error?: any;\n}\n\nexport interface LiveChannelJoinEvent {\n type: LiveChannelEventType.Join;\n user: any; // @alpha -- experimental -- will be filled in when we improve the UI\n}\n\nexport interface LiveChannelLeaveEvent {\n type: LiveChannelEventType.Leave;\n user: any; // @alpha -- experimental -- will be filled in when we improve the UI\n}\n\nexport interface LiveChannelMessageEvent<T> {\n type: LiveChannelEventType.Message;\n message: T;\n}\n\nexport type LiveChannelEvent<T = any> =\n | LiveChannelStatusEvent\n | LiveChannelJoinEvent\n | LiveChannelLeaveEvent\n | LiveChannelMessageEvent<T>;\n\nexport function isLiveChannelStatusEvent<T>(evt: LiveChannelEvent<T>): evt is LiveChannelStatusEvent {\n return evt.type === LiveChannelEventType.Status;\n}\n\nexport function isLiveChannelJoinEvent<T>(evt: LiveChannelEvent<T>): evt is LiveChannelJoinEvent {\n return evt.type === LiveChannelEventType.Join;\n}\n\nexport function isLiveChannelLeaveEvent<T>(evt: LiveChannelEvent<T>): evt is LiveChannelLeaveEvent {\n return evt.type === LiveChannelEventType.Leave;\n}\n\nexport function isLiveChannelMessageEvent<T>(evt: LiveChannelEvent<T>): evt is LiveChannelMessageEvent<T> {\n return evt.type === LiveChannelEventType.Message;\n}\n\n/**\n * @alpha -- experimental\n */\nexport interface LiveChannelPresenceStatus {\n users: any; // @alpha -- experimental -- will be filled in when we improve the UI\n}\n\n/**\n * @alpha -- experimental\n */\nexport type LiveChannelId = string;\n\n/**\n * @alpha -- experimental\n */\nexport interface LiveChannelAddress {\n scope: LiveChannelScope;\n namespace: string; // depends on the scope\n path: string;\n\n /**\n * Additional metadata passed to a channel. The backend will propigate this JSON object to\n * each OnSubscribe and RunStream calls. This value should be constant across multiple requests\n * to the same channel path\n */\n data?: any;\n}\n\n/**\n * Return an address from a string\n *\n * @alpha -- experimental\n */\nexport function parseLiveChannelAddress(id?: string): LiveChannelAddress | undefined {\n if (id?.length) {\n let parts = id.trim().split('/');\n if (parts.length >= 3) {\n return {\n scope: parts[0] as LiveChannelScope,\n namespace: parts[1],\n path: parts.slice(2).join('/'),\n };\n }\n }\n return undefined;\n}\n\n/**\n * Check if the address has a scope, namespace, and path\n *\n * @alpha -- experimental\n */\nexport function isValidLiveChannelAddress(addr?: LiveChannelAddress): addr is LiveChannelAddress {\n return !!(addr?.path && addr.namespace && addr.scope);\n}\n\n/**\n * Convert the address to an explicit channel path\n *\n * @alpha -- experimental\n */\nexport function toLiveChannelId(addr: LiveChannelAddress): LiveChannelId {\n if (!addr.scope) {\n return '';\n }\n let id = addr.scope as string;\n if (!addr.namespace) {\n return id;\n }\n id += '/' + addr.namespace;\n if (!addr.path) {\n return id;\n }\n return id + '/' + addr.path;\n}\n","import { ComponentType } from 'react';\nimport { Observable } from 'rxjs';\n\nimport {\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceJsonData,\n DataSourceOptionsType,\n DataSourceQueryType,\n QueryEditorProps,\n} from './datasource';\nimport { DataQuery } from './query';\n\n/**\n * Enum with the different variable support types\n *\n * @alpha -- experimental\n */\nexport enum VariableSupportType {\n Legacy = 'legacy',\n Standard = 'standard',\n Custom = 'custom',\n Datasource = 'datasource',\n}\n\n/**\n * Base class for VariableSupport classes\n *\n * @alpha -- experimental\n */\nexport abstract class VariableSupportBase<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataSourceQueryType<DSType>,\n TOptions extends DataSourceJsonData = DataSourceOptionsType<DSType>\n> {\n abstract getType(): VariableSupportType;\n}\n\n/**\n * Extend this class in a data source plugin to use the standard query editor for Query variables\n *\n * @alpha -- experimental\n */\nexport abstract class StandardVariableSupport<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataSourceQueryType<DSType>,\n TOptions extends DataSourceJsonData = DataSourceOptionsType<DSType>\n> extends VariableSupportBase<DSType, TQuery, TOptions> {\n getType(): VariableSupportType {\n return VariableSupportType.Standard;\n }\n\n abstract toDataQuery(query: StandardVariableQuery): TQuery;\n query?(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse>;\n}\n\n/**\n * Extend this class in a data source plugin to use a customized query editor for Query variables\n *\n * @alpha -- experimental\n */\nexport abstract class CustomVariableSupport<\n DSType extends DataSourceApi<TQuery, TOptions>,\n VariableQuery extends DataQuery = any,\n TQuery extends DataQuery = DataSourceQueryType<DSType>,\n TOptions extends DataSourceJsonData = DataSourceOptionsType<DSType>\n> extends VariableSupportBase<DSType, TQuery, TOptions> {\n getType(): VariableSupportType {\n return VariableSupportType.Custom;\n }\n\n abstract editor: ComponentType<QueryEditorProps<DSType, TQuery, TOptions, VariableQuery>>;\n abstract query(request: DataQueryRequest<VariableQuery>): Observable<DataQueryResponse>;\n}\n\n/**\n * Extend this class in a data source plugin to use the query editor in the data source plugin for Query variables\n *\n * @alpha -- experimental\n */\nexport abstract class DataSourceVariableSupport<\n DSType extends DataSourceApi<TQuery, TOptions>,\n TQuery extends DataQuery = DataSourceQueryType<DSType>,\n TOptions extends DataSourceJsonData = DataSourceOptionsType<DSType>\n> extends VariableSupportBase<DSType, TQuery, TOptions> {\n getType(): VariableSupportType {\n return VariableSupportType.Datasource;\n }\n}\n\n/**\n * Defines the standard DatQuery used by data source plugins that implement StandardVariableSupport\n *\n * @alpha -- experimental\n */\nexport interface StandardVariableQuery extends DataQuery {\n query: string;\n}\n","import { PluginSignatureStatus } from './plugin';\n\n/**\n * Utility function to check if a plugin is unsigned.\n *\n * @param signature - the plugin meta signature\n * @internal\n */\nexport function isUnsignedPluginSignature(signature?: PluginSignatureStatus) {\n return signature && signature !== PluginSignatureStatus.valid && signature !== PluginSignatureStatus.internal;\n}\n","/**\n * @internal\n */\nexport enum AlertState {\n NoData = 'no_data',\n Paused = 'paused',\n Alerting = 'alerting',\n OK = 'ok',\n Pending = 'pending',\n Unknown = 'unknown',\n}\n\n/**\n * @internal\n */\nexport interface AlertStateInfo {\n id: number;\n dashboardId: number;\n panelId: number;\n state: AlertState;\n}\n","import { Labels } from './data';\nimport { DataFrame } from './dataFrame';\nimport { DataQueryResponse } from './datasource';\nimport { DataQuery } from './query';\nimport { AbsoluteTimeRange } from './time';\n\n/**\n * Mapping of log level abbreviation to canonical log level.\n * Supported levels are reduce to limit color variation.\n */\nexport enum LogLevel {\n emerg = 'critical',\n fatal = 'critical',\n alert = 'critical',\n crit = 'critical',\n critical = 'critical',\n warn = 'warning',\n warning = 'warning',\n err = 'error',\n eror = 'error',\n error = 'error',\n info = 'info',\n information = 'info',\n informational = 'info',\n notice = 'info',\n dbug = 'debug',\n debug = 'debug',\n trace = 'trace',\n unknown = 'unknown',\n}\n\n// Used for meta information such as common labels or returned log rows in logs view in Explore\nexport enum LogsMetaKind {\n Number,\n String,\n LabelsMap,\n Error,\n}\n\nexport enum LogsSortOrder {\n Descending = 'Descending',\n Ascending = 'Ascending',\n}\n\nexport interface LogsMetaItem {\n label: string;\n value: string | number | Labels;\n kind: LogsMetaKind;\n}\n\nexport interface LogRowModel {\n // Index of the field from which the entry has been created so that we do not show it later in log row details.\n entryFieldIndex: number;\n\n // Index of the row in the dataframe. As log rows can be stitched from multiple dataFrames, this does not have to be\n // the same as rows final index when rendered.\n rowIndex: number;\n\n // Full DataFrame from which we parsed this log.\n // TODO: refactor this so we do not need to pass whole dataframes in addition to also parsed data.\n dataFrame: DataFrame;\n duplicates?: number;\n\n // Actual log line\n entry: string;\n hasAnsi: boolean;\n hasUnescapedContent: boolean;\n labels: Labels;\n logLevel: LogLevel;\n raw: string;\n searchWords?: string[];\n timeFromNow: string;\n timeEpochMs: number;\n // timeEpochNs stores time with nanosecond-level precision,\n // as millisecond-level precision is usually not enough for proper sorting of logs\n timeEpochNs: string;\n timeLocal: string;\n timeUtc: string;\n uid: string;\n uniqueLabels?: Labels;\n}\n\nexport interface LogsModel {\n hasUniqueLabels: boolean;\n meta?: LogsMetaItem[];\n rows: LogRowModel[];\n series?: DataFrame[];\n // visibleRange is time range for histogram created from log results\n visibleRange?: AbsoluteTimeRange;\n queries?: DataQuery[];\n}\n\nexport interface LogSearchMatch {\n start: number;\n length: number;\n text: string;\n}\n\nexport interface LogLabelStatsModel {\n active?: boolean;\n count: number;\n proportion: number;\n value: string;\n}\n\nexport enum LogsDedupStrategy {\n none = 'none',\n exact = 'exact',\n numbers = 'numbers',\n signature = 'signature',\n}\n\nexport interface LogsParser {\n /**\n * Value-agnostic matcher for a field label.\n * Used to filter rows, and first capture group contains the value.\n */\n buildMatcher: (label: string) => RegExp;\n\n /**\n * Returns all parsable substrings from a line, used for highlighting\n */\n getFields: (line: string) => string[];\n\n /**\n * Gets the label name from a parsable substring of a line\n */\n getLabelFromField: (field: string) => string;\n\n /**\n * Gets the label value from a parsable substring of a line\n */\n getValueFromField: (field: string) => string;\n /**\n * Function to verify if this is a valid parser for the given line.\n * The parser accepts the line if it returns true.\n */\n test: (line: string) => boolean;\n}\n\nexport enum LogsDedupDescription {\n none = 'No de-duplication',\n exact = 'De-duplication of successive lines that are identical, ignoring ISO datetimes.',\n numbers = 'De-duplication of successive lines that are identical when ignoring numbers, e.g., IP addresses, latencies.',\n signature = 'De-duplication of successive lines that have identical punctuation and whitespace.',\n}\n\n/**\n * Data sources that allow showing context rows around the provided LowRowModel should implement this method.\n * This will enable \"context\" button in Logs Panel.\n */\nexport interface DataSourceWithLogsContextSupport<TQuery extends DataQuery = DataQuery> {\n /**\n * Retrieve context for a given log row\n */\n getLogRowContext: <TContextQueryOptions extends {}>(\n row: LogRowModel,\n options?: TContextQueryOptions,\n query?: TQuery\n ) => Promise<DataQueryResponse>;\n\n /**\n * This method can be used to show \"context\" button based on runtime conditions (for example row model data or plugin settings, etc.)\n */\n showContextToggle(row?: LogRowModel): boolean;\n}\n\nexport const hasLogsContextSupport = (datasource: any): datasource is DataSourceWithLogsContextSupport => {\n if (!datasource) {\n return false;\n }\n\n const withLogsSupport = datasource as DataSourceWithLogsContextSupport;\n\n return withLogsSupport.getLogRowContext !== undefined && withLogsSupport.showContextToggle !== undefined;\n};\n","import { Observable } from 'rxjs';\n\nimport { DataQueryRequest, DataQueryResponse } from './datasource';\nimport { DataQuery } from './query';\n\n/**\n * TODO: This should be added to ./logs.ts but because of cross reference between ./datasource.ts and ./logs.ts it can\n * be done only after decoupling \"logs\" from \"datasource\" (https://github.com/grafana/grafana/pull/39536)\n *\n * @internal\n */\nexport interface DataSourceWithLogsVolumeSupport<TQuery extends DataQuery> {\n getLogsVolumeDataProvider(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> | undefined;\n}\n\n/**\n * @internal\n */\nexport const hasLogsVolumeSupport = <TQuery extends DataQuery>(\n datasource: any\n): datasource is DataSourceWithLogsVolumeSupport<TQuery> => {\n return (datasource as DataSourceWithLogsVolumeSupport<TQuery>).getLogsVolumeDataProvider !== undefined;\n};\n","import { dateTime, DateTime } from '../datetime/moment_wrapper';\n\nexport interface RawTimeRange {\n from: DateTime | string;\n to: DateTime | string;\n}\n\nexport interface TimeRange {\n from: DateTime;\n to: DateTime;\n raw: RawTimeRange;\n}\n\n/**\n * Type to describe relative time to now in seconds.\n * @internal\n */\nexport interface RelativeTimeRange {\n from: number;\n to: number;\n}\n\nexport interface AbsoluteTimeRange {\n from: number;\n to: number;\n}\n\nexport interface IntervalValues {\n interval: string; // 10s,5m\n intervalMs: number;\n}\n\nexport type TimeZoneUtc = 'utc';\nexport type TimeZoneBrowser = 'browser';\nexport type TimeZone = TimeZoneBrowser | TimeZoneUtc | string;\n\nexport const DefaultTimeZone: TimeZone = 'browser';\n\nexport interface TimeOption {\n from: string;\n to: string;\n display: string;\n}\n\nexport interface TimeOptions {\n [key: string]: TimeOption[];\n}\n\nexport type TimeFragment = string | DateTime;\n\nexport const TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';\n\nexport function getDefaultTimeRange(): TimeRange {\n const now = dateTime();\n\n return {\n from: dateTime(now).subtract(6, 'hour'),\n to: now,\n raw: { from: 'now-6h', to: 'now' },\n };\n}\n\n/**\n * Returns the default realtive time range.\n *\n * @public\n */\nexport function getDefaultRelativeTimeRange(): RelativeTimeRange {\n return {\n from: 600,\n to: 0,\n };\n}\n","import { ComponentType } from 'react';\n\nimport {\n NumberFieldConfigSettings,\n SliderFieldConfigSettings,\n SelectFieldConfigSettings,\n StringFieldConfigSettings,\n} from '../field';\nimport { RegistryItem, Registry } from '../utils/Registry';\n\nimport { OptionEditorConfig } from './options';\n\n/**\n * Option editor registry item\n */\nexport interface OptionsEditorItem<TOptions, TSettings, TEditorProps, TValue>\n extends RegistryItem,\n OptionEditorConfig<TOptions, TSettings, TValue> {\n /**\n * React component used to edit the options property\n */\n editor: ComponentType<TEditorProps>;\n\n /*\n * @param value\n */\n getItemsCount?: (value?: TValue) => number;\n}\n\n/**\n * Describes an API for option editors UI builder\n */\nexport interface OptionsUIRegistryBuilderAPI<\n TOptions,\n TEditorProps,\n T extends OptionsEditorItem<TOptions, any, TEditorProps, any>\n> {\n addNumberInput?<TSettings extends NumberFieldConfigSettings = NumberFieldConfigSettings>(\n config: OptionEditorConfig<TOptions, TSettings, number>\n ): this;\n\n addSliderInput?<TSettings extends SliderFieldConfigSettings = SliderFieldConfigSettings>(\n config: OptionEditorConfig<TOptions, TSettings, number>\n ): this;\n\n addTextInput?<TSettings extends StringFieldConfigSettings = StringFieldConfigSettings>(\n config: OptionEditorConfig<TOptions, TSettings, string>\n ): this;\n\n addStringArray?<TSettings extends StringFieldConfigSettings = StringFieldConfigSettings>(\n config: OptionEditorConfig<TOptions, TSettings, string[]>\n ): this;\n\n addSelect?<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n config: OptionEditorConfig<TOptions, TSettings, TOption>\n ): this;\n\n addRadio?<TOption, TSettings extends SelectFieldConfigSettings<TOption> = SelectFieldConfigSettings<TOption>>(\n config: OptionEditorConfig<TOptions, TSettings, TOption>\n ): this;\n\n addBooleanSwitch?<TSettings = any>(config: OptionEditorConfig<TOptions, TSettings, boolean>): this;\n\n addUnitPicker?<TSettings = any>(config: OptionEditorConfig<TOptions, TSettings, string>): this;\n\n addColorPicker?<TSettings = any>(config: OptionEditorConfig<TOptions, TSettings, string>): this;\n\n /**\n * Enables custom editor definition\n * @param config\n */\n addCustomEditor<TSettings, TValue>(config: OptionsEditorItem<TOptions, TSettings, TEditorProps, TValue>): this;\n\n /**\n * Returns registry of option editors\n */\n getRegistry: () => Registry<T>;\n}\n\nexport abstract class OptionsUIRegistryBuilder<\n TOptions,\n TEditorProps,\n T extends OptionsEditorItem<TOptions, any, TEditorProps, any>\n> implements OptionsUIRegistryBuilderAPI<TOptions, TEditorProps, T>\n{\n private properties: T[] = [];\n\n addCustomEditor<TSettings, TValue>(config: T & OptionsEditorItem<TOptions, TSettings, TEditorProps, TValue>): this {\n this.properties.push(config);\n return this;\n }\n\n getRegistry() {\n return new Registry(() => {\n return this.properties;\n });\n }\n\n getItems() {\n return this.properties;\n }\n}\n","import {\n numberOverrideProcessor,\n selectOverrideProcessor,\n stringOverrideProcessor,\n booleanOverrideProcessor,\n standardEditorsRegistry,\n SelectFieldConfigSettings,\n StandardEditorProps,\n StringFieldConfigSettings,\n NumberFieldConfigSettings,\n SliderFieldConfigSettings,\n identityOverrideProcessor,\n UnitFieldConfigSettings,\n unitOverrideProcessor,\n FieldNamePickerConfigSettings,\n StandardEditorContext,\n} from '../field';\nimport { PanelOptionsSupplier } from '../panel/PanelPlugin';\nimport { OptionsEditorItem, OptionsUIRegistryBuilder } from '../types/OptionsUIRegistryBuilder';\nimport { FieldConfigEditorProps, FieldConfigPropertyItem, FieldConfigEditorConfig } from '../types/fieldOverrides';\nimport { PanelOptionsEditorConfig, PanelOptionsEditorItem } from '../types/panel';\n\n/**\n * Fluent API for declarative creation of field config option editors\n */\nexport class FieldConfigEditorBuilder<TOptions> extends OptionsUIRegistryBuilder<\n TOptions,\n FieldConfigEditorProps<any, any>,\n FieldConfigPropertyItem<TOptions>\n> {\n addNumberInput<TSettings>(config: FieldConfigEditorConfig<TOptions, TSettings & NumberFieldConfigSettings, number>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n override: standardEditorsRegistry.get('number').editor as any,\n editor: standardEditorsRegistry.get('number').editor as any,\n process: numberOverrideProcessor,\n shouldApply: config.shouldApply ?? (() => true),\n settings: config.settings || {},\n });\n }\n\n addSliderInput<TSettings>(config: FieldConfigEditorConfig<TOptions, TSettings & SliderFieldConfigSettings, number>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n override: standardEditorsRegistry.get('slider').editor as any,\n editor: standardEditorsRegistry.get('slider').editor as any,\n process: numberOverrideProcessor,\n shouldApply: config.shouldApply ?? (() => true),\n settings: config.settings || {},\n });\n }\n\n addTextInput<TSettings>(config: FieldConfigEditorConfig<TOptions, TSettings & StringFieldConfigSettings, string>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n override: standardEditorsRegistry.get('text').editor as any,\n editor: standardEditorsRegistry.get('text').editor as any,\n process: stringOverrideProcessor,\n shouldApply: config.shouldApply ?? (() => true),\n settings: config.settings || {},\n });\n }\n\n addSelect<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n config: FieldConfigEditorConfig<TOptions, TSettings, TOption>\n ) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n override: standardEditorsRegistry.get('select').editor as any,\n editor: standardEditorsRegistry.get('select').editor as any,\n process: selectOverrideProcessor,\n // ???\n shouldApply: config.shouldApply ? config.shouldApply : () => true,\n settings: config.settings || { options: [] },\n });\n }\n\n addRadio<TOption, TSettings = any>(config: FieldConfigEditorConfig<TOptions, TSettings, TOption>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n override: standardEditorsRegistry.get('radio').editor as any,\n editor: standardEditorsRegistry.get('radio').editor as any,\n process: selectOverrideProcessor,\n // ???\n shouldApply: config.shouldApply ? config.shouldApply : () => true,\n settings: config.settings || { options: [] },\n });\n }\n\n addBooleanSwitch<TSettings = any>(config: FieldConfigEditorConfig<TOptions, TSettings, boolean>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('boolean').editor as any,\n override: standardEditorsRegistry.get('boolean').editor as any,\n process: booleanOverrideProcessor,\n shouldApply: config.shouldApply ? config.shouldApply : () => true,\n settings: config.settings || {},\n });\n }\n\n addColorPicker<TSettings = any>(config: FieldConfigEditorConfig<TOptions, TSettings, string>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('color').editor as any,\n override: standardEditorsRegistry.get('color').editor as any,\n process: identityOverrideProcessor,\n shouldApply: config.shouldApply ? config.shouldApply : () => true,\n settings: config.settings || {},\n });\n }\n\n addUnitPicker<TSettings = any>(\n config: FieldConfigEditorConfig<TOptions, TSettings & UnitFieldConfigSettings, string>\n ) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('unit').editor as any,\n override: standardEditorsRegistry.get('unit').editor as any,\n process: unitOverrideProcessor,\n shouldApply: config.shouldApply ? config.shouldApply : () => true,\n settings: config.settings || {},\n });\n }\n}\n\nexport interface NestedValueAccess {\n getValue: (path: string) => any;\n onChange: (path: string, value: any) => void;\n getContext?: (parent: StandardEditorContext<any, any>) => StandardEditorContext<any, any>;\n}\nexport interface NestedPanelOptions<TSub = any> {\n path: string;\n category?: string[];\n defaultValue?: TSub;\n build: PanelOptionsSupplier<TSub>;\n values?: (parent: NestedValueAccess) => NestedValueAccess;\n}\n\nexport class NestedPanelOptionsBuilder<TSub = any> implements OptionsEditorItem<TSub, any, any, any> {\n path = '';\n category?: string[];\n defaultValue?: TSub;\n id = 'nested-panel-options';\n name = 'nested';\n editor = () => null;\n\n constructor(public cfg: NestedPanelOptions<TSub>) {\n this.path = cfg.path;\n this.category = cfg.category;\n this.defaultValue = cfg.defaultValue;\n }\n\n getBuilder = () => {\n return this.cfg.build;\n };\n\n getNestedValueAccess = (parent: NestedValueAccess) => {\n const values = this.cfg.values;\n if (values) {\n return values(parent);\n }\n // by default prefix the path\n return {\n getValue: (path: string) => parent.getValue(`${this.path}.${path}`),\n onChange: (path: string, value: any) => parent.onChange(`${this.path}.${path}`, value),\n };\n };\n}\n\nexport function isNestedPanelOptions(item: any): item is NestedPanelOptionsBuilder {\n return item.id === 'nested-panel-options';\n}\n\n/**\n * Fluent API for declarative creation of panel options\n */\nexport class PanelOptionsEditorBuilder<TOptions> extends OptionsUIRegistryBuilder<\n TOptions,\n StandardEditorProps,\n PanelOptionsEditorItem<TOptions>\n> {\n addNestedOptions<Sub>(opts: NestedPanelOptions<Sub>) {\n const s = new NestedPanelOptionsBuilder<Sub>(opts);\n return this.addCustomEditor(s);\n }\n\n addNumberInput<TSettings>(config: PanelOptionsEditorConfig<TOptions, TSettings & NumberFieldConfigSettings, number>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('number').editor as any,\n });\n }\n\n addSliderInput<TSettings>(config: PanelOptionsEditorConfig<TOptions, TSettings & SliderFieldConfigSettings, number>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('slider').editor as any,\n });\n }\n\n addTextInput<TSettings>(config: PanelOptionsEditorConfig<TOptions, TSettings & StringFieldConfigSettings, string>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('text').editor as any,\n });\n }\n\n addStringArray<TSettings>(\n config: PanelOptionsEditorConfig<TOptions, TSettings & StringFieldConfigSettings, string[]>\n ) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('strings').editor as any,\n });\n }\n\n addSelect<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n config: PanelOptionsEditorConfig<TOptions, TSettings, TOption>\n ) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('select').editor as any,\n });\n }\n\n addMultiSelect<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n config: PanelOptionsEditorConfig<TOptions, TSettings, TOption>\n ) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('multi-select').editor as any,\n });\n }\n\n addRadio<TOption, TSettings extends SelectFieldConfigSettings<TOption>>(\n config: PanelOptionsEditorConfig<TOptions, TSettings, TOption>\n ) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('radio').editor as any,\n });\n }\n\n addBooleanSwitch<TSettings = any>(config: PanelOptionsEditorConfig<TOptions, TSettings, boolean>) {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('boolean').editor as any,\n });\n }\n\n addColorPicker<TSettings = any>(config: PanelOptionsEditorConfig<TOptions, TSettings, string>): this {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('color').editor as any,\n settings: config.settings || {},\n });\n }\n\n addTimeZonePicker<TSettings = any>(config: PanelOptionsEditorConfig<TOptions, TSettings, string>): this {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('timezone').editor as any,\n settings: config.settings || {},\n });\n }\n\n addUnitPicker<TSettings = any>(\n config: PanelOptionsEditorConfig<TOptions, TSettings & UnitFieldConfigSettings, string>\n ): this {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('unit').editor as any,\n });\n }\n\n addFieldNamePicker<TSettings = any>(\n config: PanelOptionsEditorConfig<TOptions, TSettings & FieldNamePickerConfigSettings, string>\n ): this {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('field-name').editor as any,\n });\n }\n\n addDashboardPicker<TSettings = any>(\n config: PanelOptionsEditorConfig<TOptions, TSettings & FieldNamePickerConfigSettings, string>\n ): this {\n return this.addCustomEditor({\n ...config,\n id: config.path,\n editor: standardEditorsRegistry.get('dashboard-uid').editor as any, // added at runtime\n });\n }\n}\n","import {\n DataLink,\n DataQuery,\n ExplorePanelsState,\n Field,\n InternalDataLink,\n InterpolateFunction,\n LinkModel,\n ScopedVars,\n SplitOpen,\n TimeRange,\n} from '../types';\n\nimport { locationUtil } from './location';\nimport { serializeStateToUrlParam } from './url';\n\nexport const DataLinkBuiltInVars = {\n keepTime: '__url_time_range',\n timeRangeFrom: '__from',\n timeRangeTo: '__to',\n includeVars: '__all_variables',\n seriesName: '__series.name',\n fieldName: '__field.name',\n valueTime: '__value.time',\n valueNumeric: '__value.numeric',\n valueText: '__value.text',\n valueRaw: '__value.raw',\n // name of the calculation represented by the value\n valueCalc: '__value.calc',\n};\n\n// We inject these because we cannot import them directly as they reside inside grafana main package.\nexport type LinkToExploreOptions = {\n link: DataLink;\n scopedVars: ScopedVars;\n range: TimeRange;\n field: Field;\n internalLink: InternalDataLink;\n onClickFn?: SplitOpen;\n replaceVariables: InterpolateFunction;\n};\n\nexport function mapInternalLinkToExplore(options: LinkToExploreOptions): LinkModel<Field> {\n const { onClickFn, replaceVariables, link, scopedVars, range, field, internalLink } = options;\n\n const interpolatedQuery = interpolateObject(link.internal?.query, scopedVars, replaceVariables);\n const interpolatedPanelsState = interpolateObject(link.internal?.panelsState, scopedVars, replaceVariables);\n const title = link.title ? link.title : internalLink.datasourceName;\n\n return {\n title: replaceVariables(title, scopedVars),\n // In this case this is meant to be internal link (opens split view by default) the href will also points\n // to explore but this way you can open it in new tab.\n href: generateInternalHref(internalLink.datasourceUid, interpolatedQuery, range, interpolatedPanelsState),\n onClick: onClickFn\n ? () => {\n onClickFn({\n datasourceUid: internalLink.datasourceUid,\n query: interpolatedQuery,\n panelsState: interpolatedPanelsState,\n range,\n });\n }\n : undefined,\n target: '_self',\n origin: field,\n };\n}\n\n/**\n * Generates href for internal derived field link.\n */\nfunction generateInternalHref<T extends DataQuery = any>(\n datasourceUid: string,\n query: T,\n range: TimeRange,\n panelsState?: ExplorePanelsState\n): string {\n return locationUtil.assureBaseUrl(\n `/explore?left=${encodeURIComponent(\n serializeStateToUrlParam({\n range: range.raw,\n datasource: datasourceUid,\n queries: [query],\n panelsState: panelsState,\n })\n )}`\n );\n}\n\nfunction interpolateObject<T extends object>(\n object: T | undefined,\n scopedVars: ScopedVars,\n replaceVariables: InterpolateFunction\n): T {\n let stringifiedQuery = '';\n try {\n stringifiedQuery = JSON.stringify(object || {});\n } catch (err) {\n // should not happen and not much to do about this, possibly something non stringifiable in the query\n console.error(err);\n }\n\n // Replace any variables inside the query. This may not be the safest as it can also replace keys etc so may not\n // actually work with every datasource query right now.\n stringifiedQuery = replaceVariables(stringifiedQuery, scopedVars);\n\n let replacedQuery = {} as T;\n try {\n replacedQuery = JSON.parse(stringifiedQuery);\n } catch (err) {\n // again should not happen and not much to do about this, probably some issue with how we replaced the variables.\n console.error(stringifiedQuery, err);\n }\n\n return replacedQuery;\n}\n","import { SortOrder } from '@grafana/schema';\n\n/** @internal */\nexport function moveItemImmutably<T>(arr: T[], from: number, to: number) {\n const clone = [...arr];\n Array.prototype.splice.call(clone, to, 0, Array.prototype.splice.call(clone, from, 1)[0]);\n return clone;\n}\n\n/**\n * Given a sort order and a value, return a function that can be used to sort values\n * Null/undefined/empty string values are always sorted to the end regardless of the sort order provided\n */\nconst collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\nconst numericCompare = (a: number, b: number) => a - b;\n\nexport function sortValues(sort: SortOrder.Ascending | SortOrder.Descending) {\n return (a: any, b: any) => {\n if (a === b) {\n return 0;\n }\n\n if (b == null || (typeof b === 'string' && b.trim() === '')) {\n return -1;\n }\n if (a == null || (typeof a === 'string' && a?.trim() === '')) {\n return 1;\n }\n\n let compareFn: (a: any, b: any) => number = collator.compare;\n\n if (typeof a === 'number' && typeof b === 'number') {\n compareFn = numericCompare;\n }\n\n if (sort === SortOrder.Descending) {\n return compareFn(b, a);\n }\n\n return compareFn(a, b);\n };\n}\n","import { isString } from 'lodash';\n\nimport {\n DataSourcePluginOptionsEditorProps,\n SelectableValue,\n KeyValue,\n DataSourceSettings,\n DataSourceInstanceSettings,\n DataSourceRef,\n} from '../types';\n\n/**\n * Convert instance settings to a reference\n *\n * @public\n */\nexport function getDataSourceRef(ds: DataSourceInstanceSettings): DataSourceRef {\n return { uid: ds.uid, type: ds.type };\n}\n\n/**\n * Returns true if the argument is a DataSourceRef\n *\n * @public\n */\nexport function isDataSourceRef(ref: DataSourceRef | string | null | undefined): ref is DataSourceRef {\n return typeof ref === 'object' && typeof ref?.uid === 'string';\n}\n\n/**\n * Get the UID from a string of reference\n *\n * @public\n */\nexport function getDataSourceUID(ref: DataSourceRef | string | null): string | undefined {\n if (isDataSourceRef(ref)) {\n return ref.uid;\n }\n if (isString(ref)) {\n return ref;\n }\n return undefined;\n}\n\nexport const onUpdateDatasourceOption =\n (props: DataSourcePluginOptionsEditorProps, key: keyof DataSourceSettings) =>\n (event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>) => {\n updateDatasourcePluginOption(props, key, event.currentTarget.value);\n };\n\nexport const onUpdateDatasourceJsonDataOption =\n <J, S, K extends keyof J>(props: DataSourcePluginOptionsEditorProps<J, S>, key: K) =>\n (event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>) => {\n updateDatasourcePluginJsonDataOption(props, key, event.currentTarget.value);\n };\n\nexport const onUpdateDatasourceSecureJsonDataOption =\n <J, S extends {} = KeyValue>(props: DataSourcePluginOptionsEditorProps<J, S>, key: string) =>\n (event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>) => {\n updateDatasourcePluginSecureJsonDataOption(props, key, event.currentTarget.value);\n };\n\nexport const onUpdateDatasourceJsonDataOptionSelect =\n <J, S, K extends keyof J>(props: DataSourcePluginOptionsEditorProps<J, S>, key: K) =>\n (selected: SelectableValue) => {\n updateDatasourcePluginJsonDataOption(props, key, selected.value);\n };\n\nexport const onUpdateDatasourceJsonDataOptionChecked =\n <J, S, K extends keyof J>(props: DataSourcePluginOptionsEditorProps<J, S>, key: K) =>\n (event: React.SyntheticEvent<HTMLInputElement>) => {\n updateDatasourcePluginJsonDataOption(props, key, event.currentTarget.checked);\n };\n\nexport const onUpdateDatasourceSecureJsonDataOptionSelect =\n <J, S extends {} = KeyValue>(props: DataSourcePluginOptionsEditorProps<J, S>, key: string) =>\n (selected: SelectableValue) => {\n updateDatasourcePluginSecureJsonDataOption(props, key, selected.value);\n };\n\nexport const onUpdateDatasourceResetOption =\n (props: DataSourcePluginOptionsEditorProps, key: string) =>\n (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n updateDatasourcePluginResetOption(props, key);\n };\n\nexport function updateDatasourcePluginOption<J, S extends {} = KeyValue>(\n props: DataSourcePluginOptionsEditorProps<J, S>,\n key: keyof DataSourceSettings,\n val: any\n) {\n const config = props.options;\n\n props.onOptionsChange({\n ...config,\n [key]: val,\n });\n}\n\nexport const updateDatasourcePluginJsonDataOption = <J, S, K extends keyof J>(\n props: DataSourcePluginOptionsEditorProps<J, S>,\n key: K,\n val: any\n) => {\n const config = props.options;\n\n props.onOptionsChange({\n ...config,\n jsonData: {\n ...config.jsonData,\n [key]: val,\n },\n });\n};\n\nexport const updateDatasourcePluginSecureJsonDataOption = <J, S extends {} = KeyValue>(\n props: DataSourcePluginOptionsEditorProps<J, S>,\n key: string,\n val: any\n) => {\n const config = props.options;\n\n props.onOptionsChange({\n ...config,\n secureJsonData: {\n ...(config.secureJsonData ? config.secureJsonData : ({} as S)),\n [key]: val,\n },\n });\n};\n\nexport const updateDatasourcePluginResetOption = <J, S extends {} = KeyValue>(\n props: DataSourcePluginOptionsEditorProps<J, S>,\n key: string\n) => {\n const config = props.options;\n props.onOptionsChange({\n ...config,\n secureJsonData: {\n ...(config.secureJsonData ? config.secureJsonData : ({} as S)),\n [key]: '',\n },\n secureJsonFields: {\n ...config.secureJsonFields,\n [key]: false,\n },\n });\n};\n","import { KeyValue } from '../types';\n\n// Avoid writing the warning message more than once every 10s\nconst history: KeyValue<number> = {};\n\nexport const deprecationWarning = (file: string, oldName: string, newName?: string) => {\n let message = `[Deprecation warning] ${file}: ${oldName} is deprecated`;\n if (newName) {\n message += `. Use ${newName} instead`;\n }\n const now = Date.now();\n const last = history[message];\n if (!last || now - last > 10000) {\n console.warn(message);\n history[message] = now;\n }\n};\n","// Libraries\nimport { defaults } from 'lodash';\nimport Papa, { ParseConfig, Parser, ParseResult } from 'papaparse';\n\n// Types\nimport { MutableDataFrame } from '../dataframe/MutableDataFrame';\nimport { guessFieldTypeFromValue } from '../dataframe/processDataFrame';\nimport { getFieldDisplayName } from '../field';\nimport { DataFrame, Field, FieldConfig, FieldType } from '../types';\nimport { formattedValueToString } from '../valueFormats';\n\nexport enum CSVHeaderStyle {\n full,\n name,\n none,\n}\n\n// Subset of all parse options\nexport interface CSVConfig {\n delimiter?: string; // default: \",\"\n newline?: string; // default: \"\\r\\n\"\n quoteChar?: string; // default: '\"'\n encoding?: string; // default: \"\",\n useExcelHeader?: boolean; // default: false\n headerStyle?: CSVHeaderStyle;\n}\n\nexport interface CSVParseCallbacks {\n /**\n * Get a callback before any rows are processed\n * This can return a modified table to force any\n * Column configurations\n */\n onHeader: (fields: Field[]) => void;\n\n // Called after each row is read\n onRow: (row: any[]) => void;\n}\n\nexport interface CSVOptions {\n config?: CSVConfig;\n callback?: CSVParseCallbacks;\n}\n\nexport function readCSV(csv: string, options?: CSVOptions): DataFrame[] {\n return new CSVReader(options).readCSV(csv);\n}\n\nenum ParseState {\n Starting,\n InHeader,\n ReadingRows,\n}\n\nexport class CSVReader {\n config: CSVConfig;\n callback?: CSVParseCallbacks;\n\n state: ParseState;\n data: MutableDataFrame[];\n current: MutableDataFrame;\n\n constructor(options?: CSVOptions) {\n if (!options) {\n options = {};\n }\n this.config = options.config || {};\n this.callback = options.callback;\n\n this.current = new MutableDataFrame({ fields: [] });\n this.state = ParseState.Starting;\n this.data = [];\n }\n\n // PapaParse callback on each line\n private chunk = (results: ParseResult<any>, parser: Parser): void => {\n for (let i = 0; i < results.data.length; i++) {\n const line: string[] = results.data[i];\n if (line.length < 1) {\n continue;\n }\n const first = line[0]; // null or value, papaparse does not return ''\n if (first) {\n // Comment or header queue\n if (first.startsWith('#')) {\n // Look for special header column\n // #{columkey}#a,b,c\n const idx = first.indexOf('#', 2);\n if (idx > 0) {\n const k = first.slice(1, idx);\n const isName = 'name' === k;\n\n // Simple object used to check if headers match\n const headerKeys: FieldConfig = {\n unit: '#',\n };\n\n // Check if it is a known/supported column\n if (isName || headerKeys.hasOwnProperty(k)) {\n // Starting a new table after reading rows\n if (this.state === ParseState.ReadingRows) {\n this.current = new MutableDataFrame({ fields: [] });\n this.data.push(this.current);\n }\n\n const v = first.slice(idx + 1);\n if (isName) {\n this.current.addFieldFor(undefined, v);\n for (let j = 1; j < line.length; j++) {\n this.current.addFieldFor(undefined, line[j]);\n }\n } else {\n const { fields } = this.current;\n for (let j = 0; j < fields.length; j++) {\n if (!fields[j].config) {\n fields[j].config = {};\n }\n const disp = fields[j].config as any; // any lets name lookup\n disp[k] = j === 0 ? v : line[j];\n }\n }\n\n this.state = ParseState.InHeader;\n continue;\n }\n } else if (this.state === ParseState.Starting) {\n this.state = ParseState.InHeader;\n continue;\n }\n // Ignore comment lines\n continue;\n }\n\n if (this.state === ParseState.Starting) {\n const type = guessFieldTypeFromValue(first);\n if (type === FieldType.string) {\n for (const s of line) {\n this.current.addFieldFor(undefined, s);\n }\n this.state = ParseState.InHeader;\n continue;\n }\n this.state = ParseState.InHeader; // fall through to read rows\n }\n }\n\n // Add the current results to the data\n if (this.state !== ParseState.ReadingRows) {\n // anything???\n }\n\n this.state = ParseState.ReadingRows;\n\n // Make sure column structure is valid\n if (line.length > this.current.fields.length) {\n const { fields } = this.current;\n for (let f = fields.length; f < line.length; f++) {\n this.current.addFieldFor(line[f]);\n }\n if (this.callback) {\n this.callback.onHeader(this.current.fields);\n }\n }\n\n this.current.appendRow(line);\n if (this.callback) {\n // // Send the header after we guess the type\n // if (this.series.rows.length === 0) {\n // this.callback.onHeader(this.series);\n // }\n this.callback.onRow(line);\n }\n }\n };\n\n readCSV(text: string): MutableDataFrame[] {\n this.current = new MutableDataFrame({ fields: [] });\n this.data = [this.current];\n\n const papacfg = {\n ...this.config,\n dynamicTyping: false,\n skipEmptyLines: true,\n comments: false, // Keep comment lines\n chunk: this.chunk,\n } as ParseConfig;\n\n Papa.parse(text, papacfg);\n\n return this.data;\n }\n}\n\ntype FieldWriter = (value: any) => string;\n\nfunction writeValue(value: any, config: CSVConfig): string {\n const str = value.toString();\n if (str.includes('\"')) {\n // Escape the double quote characters\n return config.quoteChar + str.replace(/\"/gi, '\"\"') + config.quoteChar;\n }\n if (str.includes('\\n') || str.includes(config.delimiter)) {\n return config.quoteChar + str + config.quoteChar;\n }\n return str;\n}\n\nfunction makeFieldWriter(field: Field, config: CSVConfig): FieldWriter {\n if (field.display) {\n return (value: any) => {\n const displayValue = field.display!(value);\n return writeValue(formattedValueToString(displayValue), config);\n };\n }\n\n return (value: any) => writeValue(value, config);\n}\n\nfunction getHeaderLine(key: string, fields: Field[], config: CSVConfig): string {\n const isName = 'name' === key;\n const isType = 'type' === key;\n\n for (const f of fields) {\n const display = f.config;\n if (isName || isType || (display && display.hasOwnProperty(key))) {\n let line = '#' + key + '#';\n for (let i = 0; i < fields.length; i++) {\n if (i > 0) {\n line = line + config.delimiter;\n }\n\n let v: any = fields[i].name;\n if (isType) {\n v = fields[i].type;\n } else if (isName) {\n // already name\n } else {\n v = (fields[i].config as any)[key];\n }\n if (v) {\n line = line + writeValue(v, config);\n }\n }\n return line + config.newline;\n }\n }\n return '';\n}\n\nfunction getLocaleDelimiter(): string {\n const arr = ['x', 'y'];\n if (arr.toLocaleString) {\n return arr.toLocaleString().charAt(1);\n }\n return ',';\n}\n\nexport function toCSV(data: DataFrame[], config?: CSVConfig): string {\n if (!data) {\n return '';\n }\n\n config = defaults(config, {\n delimiter: getLocaleDelimiter(),\n newline: '\\r\\n',\n quoteChar: '\"',\n encoding: '',\n headerStyle: CSVHeaderStyle.name,\n useExcelHeader: false,\n });\n let csv = config.useExcelHeader ? `sep=${config.delimiter}${config.newline}` : '';\n\n for (const series of data) {\n const { fields } = series;\n\n // ignore frames with no fields\n if (fields.length === 0) {\n continue;\n }\n\n if (config.headerStyle === CSVHeaderStyle.full) {\n csv =\n csv +\n getHeaderLine('name', fields, config) +\n getHeaderLine('type', fields, config) +\n getHeaderLine('unit', fields, config) +\n getHeaderLine('dateFormat', fields, config);\n } else if (config.headerStyle === CSVHeaderStyle.name) {\n for (let i = 0; i < fields.length; i++) {\n if (i > 0) {\n csv += config.delimiter;\n }\n csv += `\"${getFieldDisplayName(fields[i], series).replace(/\"/g, '\"\"')}\"`;\n }\n csv += config.newline;\n }\n\n const length = fields[0].values.length;\n\n if (length > 0) {\n const writers = fields.map((field) => makeFieldWriter(field, config!));\n for (let i = 0; i < length; i++) {\n for (let j = 0; j < fields.length; j++) {\n if (j > 0) {\n csv = csv + config.delimiter;\n }\n\n const v = fields[j].values.get(i);\n if (v !== null) {\n csv = csv + writers[j](v);\n }\n }\n csv = csv + config.newline;\n }\n }\n csv = csv + config.newline;\n }\n\n return csv;\n}\n","import { countBy, chain, escapeRegExp } from 'lodash';\n\nimport { DataFrame, FieldType } from '../types/index';\nimport { LogLevel, LogRowModel, LogLabelStatsModel, LogsParser, LogsModel, LogsSortOrder } from '../types/logs';\nimport { ArrayVector } from '../vector/ArrayVector';\n\n// This matches:\n// first a label from start of the string or first white space, then any word chars until \"=\"\n// second either an empty quotes, or anything that starts with quote and ends with unescaped quote,\n// or any non whitespace chars that do not start with quote\nconst LOGFMT_REGEXP = /(?:^|\\s)([\\w\\(\\)\\[\\]\\{\\}]+)=(\"\"|(?:\".*?[^\\\\]\"|[^\"\\s]\\S*))/;\n\n/**\n * Returns the log level of a log line.\n * Parse the line for level words. If no level is found, it returns `LogLevel.unknown`.\n *\n * Example: `getLogLevel('WARN 1999-12-31 this is great') // LogLevel.warn`\n */\nexport function getLogLevel(line: string): LogLevel {\n if (!line) {\n return LogLevel.unknown;\n }\n let level = LogLevel.unknown;\n let currentIndex: number | undefined = undefined;\n\n for (const key of Object.keys(LogLevel)) {\n const regexp = new RegExp(`\\\\b${key}\\\\b`, 'i');\n const result = regexp.exec(line);\n\n if (result) {\n if (currentIndex === undefined || result.index < currentIndex) {\n level = (LogLevel as any)[key];\n currentIndex = result.index;\n }\n }\n }\n return level;\n}\n\nexport function getLogLevelFromKey(key: string | number): LogLevel {\n const level = (LogLevel as any)[key.toString().toLowerCase()];\n if (level) {\n return level;\n }\n\n return LogLevel.unknown;\n}\n\nexport function addLogLevelToSeries(series: DataFrame, lineIndex: number): DataFrame {\n const levels = new ArrayVector<LogLevel>();\n const lines = series.fields[lineIndex];\n for (let i = 0; i < lines.values.length; i++) {\n const line = lines.values.get(lineIndex);\n levels.buffer.push(getLogLevel(line));\n }\n\n return {\n ...series, // Keeps Tags, RefID etc\n fields: [\n ...series.fields,\n {\n name: 'LogLevel',\n type: FieldType.string,\n values: levels,\n config: {},\n },\n ],\n };\n}\n\nexport const LogsParsers: { [name: string]: LogsParser } = {\n JSON: {\n buildMatcher: (label) => new RegExp(`(?:{|,)\\\\s*\"${label}\"\\\\s*:\\\\s*\"?([\\\\d\\\\.]+|[^\"]*)\"?`),\n getFields: (line) => {\n try {\n const parsed = JSON.parse(line);\n return Object.keys(parsed).map((key) => {\n return `\"${key}\":${JSON.stringify(parsed[key])}`;\n });\n } catch {}\n return [];\n },\n getLabelFromField: (field) => (field.match(/^\"([^\"]+)\"\\s*:/) || [])[1],\n getValueFromField: (field) => (field.match(/:\\s*(.*)$/) || [])[1],\n test: (line) => {\n let parsed;\n try {\n parsed = JSON.parse(line);\n } catch (error) {}\n // The JSON parser should only be used for log lines that are valid serialized JSON objects.\n // If it would be used for a string, detected fields would include each letter as a separate field.\n return typeof parsed === 'object';\n },\n },\n\n logfmt: {\n buildMatcher: (label) => new RegExp(`(?:^|\\\\s)${escapeRegExp(label)}=(\"[^\"]*\"|\\\\S+)`),\n getFields: (line) => {\n const fields: string[] = [];\n line.replace(new RegExp(LOGFMT_REGEXP, 'g'), (substring) => {\n fields.push(substring.trim());\n return '';\n });\n return fields;\n },\n getLabelFromField: (field) => (field.match(LOGFMT_REGEXP) || [])[1],\n getValueFromField: (field) => (field.match(LOGFMT_REGEXP) || [])[2],\n test: (line) => LOGFMT_REGEXP.test(line),\n },\n};\n\nexport function calculateFieldStats(rows: LogRowModel[], extractor: RegExp): LogLabelStatsModel[] {\n // Consider only rows that satisfy the matcher\n const rowsWithField = rows.filter((row) => extractor.test(row.entry));\n const rowCount = rowsWithField.length;\n\n // Get field value counts for eligible rows\n const countsByValue = countBy(rowsWithField, (r) => {\n const row: LogRowModel = r;\n const match = row.entry.match(extractor);\n\n return match ? match[1] : null;\n });\n return getSortedCounts(countsByValue, rowCount);\n}\n\nexport function calculateLogsLabelStats(rows: LogRowModel[], label: string): LogLabelStatsModel[] {\n // Consider only rows that have the given label\n const rowsWithLabel = rows.filter((row) => row.labels[label] !== undefined);\n const rowCount = rowsWithLabel.length;\n\n // Get label value counts for eligible rows\n const countsByValue = countBy(rowsWithLabel, (row) => (row as LogRowModel).labels[label]);\n return getSortedCounts(countsByValue, rowCount);\n}\n\nexport function calculateStats(values: any[]): LogLabelStatsModel[] {\n const nonEmptyValues = values.filter((value) => value !== undefined && value !== null);\n const countsByValue = countBy(nonEmptyValues);\n return getSortedCounts(countsByValue, nonEmptyValues.length);\n}\n\nconst getSortedCounts = (countsByValue: { [value: string]: number }, rowCount: number) => {\n return chain(countsByValue)\n .map((count, value) => ({ count, value, proportion: count / rowCount }))\n .sortBy('count')\n .reverse()\n .value();\n};\n\nexport function getParser(line: string): LogsParser | undefined {\n let parser;\n try {\n if (LogsParsers.JSON.test(line)) {\n parser = LogsParsers.JSON;\n }\n } catch (error) {}\n\n if (!parser && LogsParsers.logfmt.test(line)) {\n parser = LogsParsers.logfmt;\n }\n\n return parser;\n}\n\nexport const sortInAscendingOrder = (a: LogRowModel, b: LogRowModel) => {\n // compare milliseconds\n if (a.timeEpochMs < b.timeEpochMs) {\n return -1;\n }\n\n if (a.timeEpochMs > b.timeEpochMs) {\n return 1;\n }\n\n // if milliseconds are equal, compare nanoseconds\n if (a.timeEpochNs < b.timeEpochNs) {\n return -1;\n }\n\n if (a.timeEpochNs > b.timeEpochNs) {\n return 1;\n }\n\n return 0;\n};\n\nexport const sortInDescendingOrder = (a: LogRowModel, b: LogRowModel) => {\n // compare milliseconds\n if (a.timeEpochMs > b.timeEpochMs) {\n return -1;\n }\n\n if (a.timeEpochMs < b.timeEpochMs) {\n return 1;\n }\n\n // if milliseconds are equal, compare nanoseconds\n if (a.timeEpochNs > b.timeEpochNs) {\n return -1;\n }\n\n if (a.timeEpochNs < b.timeEpochNs) {\n return 1;\n }\n\n return 0;\n};\n\nexport const sortLogsResult = (logsResult: LogsModel | null, sortOrder: LogsSortOrder): LogsModel => {\n const rows = logsResult ? sortLogRows(logsResult.rows, sortOrder) : [];\n return logsResult ? { ...logsResult, rows } : { hasUniqueLabels: false, rows };\n};\n\nexport const sortLogRows = (logRows: LogRowModel[], sortOrder: LogsSortOrder) =>\n sortOrder === LogsSortOrder.Ascending ? logRows.sort(sortInAscendingOrder) : logRows.sort(sortInDescendingOrder);\n\n// Currently supports only error condition in Loki logs\nexport const checkLogsError = (logRow: LogRowModel): { hasError: boolean; errorMessage?: string } => {\n if (logRow.labels.__error__) {\n return {\n hasError: true,\n errorMessage: logRow.labels.__error__,\n };\n }\n return {\n hasError: false,\n };\n};\n\nexport const escapeUnescapedString = (string: string) =>\n string.replace(/\\\\r\\\\n|\\\\n|\\\\t|\\\\r/g, (match: string) => (match.slice(1) === 't' ? '\\t' : '\\n'));\n","export enum NodeGraphDataFrameFieldNames {\n id = 'id',\n title = 'title',\n subTitle = 'subtitle',\n mainStat = 'mainstat',\n secondaryStat = 'secondarystat',\n source = 'source',\n target = 'target',\n detail = 'detail__',\n arc = 'arc__',\n color = 'color',\n}\n","import { NullValueMode } from '../types/data';\nimport { Field } from '../types/dataFrame';\nimport { GraphSeriesValue } from '../types/graph';\nimport { TimeRange } from '../types/time';\n\n// Types\n// import { NullValueMode, GraphSeriesValue, Field, TimeRange } from '@grafana/data';\nexport interface FlotPairsOptions {\n xField: Field;\n yField: Field;\n nullValueMode?: NullValueMode;\n}\n\nexport function getFlotPairs({ xField, yField, nullValueMode }: FlotPairsOptions): GraphSeriesValue[][] {\n const vX = xField.values;\n const vY = yField.values;\n const length = vX.length;\n if (vY.length !== length) {\n throw new Error('Unexpected field length');\n }\n\n const ignoreNulls = nullValueMode === NullValueMode.Ignore;\n const nullAsZero = nullValueMode === NullValueMode.AsZero;\n\n const pairs: any[][] = [];\n\n for (let i = 0; i < length; i++) {\n const x = vX.get(i);\n let y = vY.get(i);\n\n if (y === null) {\n if (ignoreNulls) {\n continue;\n }\n if (nullAsZero) {\n y = 0;\n }\n }\n\n // X must be a value\n if (x === null) {\n continue;\n }\n\n pairs.push([x, y]);\n }\n return pairs;\n}\n\n/**\n * Returns a constant series based on the first value from the provide series.\n * @param seriesData Series\n * @param range Start and end time for the constant series\n */\nexport function getFlotPairsConstant(seriesData: GraphSeriesValue[][], range: TimeRange): GraphSeriesValue[][] {\n if (!range.from || !range.to || !seriesData || seriesData.length === 0) {\n return [];\n }\n\n const from = range.from.valueOf();\n const to = range.to.valueOf();\n const value = seriesData[0][1];\n return [\n [from, value],\n [to, value],\n ];\n}\n","/**\n * Enumeration of documentation topics\n * @internal\n */\nexport enum DocsId {\n Transformations,\n FieldConfig,\n FieldConfigOverrides,\n}\n","import { Labels } from '../types/data';\n\n/**\n * Regexp to extract Prometheus-style labels\n */\nconst labelRegexp = /\\b(\\w+)(!?=~?)\"([^\"\\n]*?)\"/g;\n\n/**\n * Returns a map of label keys to value from an input selector string.\n *\n * Example: `parseLabels('{job=\"foo\", instance=\"bar\"}) // {job: \"foo\", instance: \"bar\"}`\n */\nexport function parseLabels(labels: string): Labels {\n const labelsByKey: Labels = {};\n labels.replace(labelRegexp, (_, key, operator, value) => {\n labelsByKey[key] = value;\n return '';\n });\n return labelsByKey;\n}\n\n/**\n * Returns a map labels that are common to the given label sets.\n */\nexport function findCommonLabels(labelsSets: Labels[]): Labels {\n return labelsSets.reduce((acc, labels) => {\n if (!labels) {\n throw new Error('Need parsed labels to find common labels.');\n }\n if (!acc) {\n // Initial set\n acc = { ...labels };\n } else {\n // Remove incoming labels that are missing or not matching in value\n Object.keys(labels).forEach((key) => {\n if (acc[key] === undefined || acc[key] !== labels[key]) {\n delete acc[key];\n }\n });\n // Remove common labels that are missing from incoming label set\n Object.keys(acc).forEach((key) => {\n if (labels[key] === undefined) {\n delete acc[key];\n }\n });\n }\n return acc;\n }, undefined as unknown as Labels);\n}\n\n/**\n * Returns a map of labels that are in `labels`, but not in `commonLabels`.\n */\nexport function findUniqueLabels(labels: Labels | undefined, commonLabels: Labels): Labels {\n const uncommonLabels: Labels = { ...labels };\n Object.keys(commonLabels).forEach((key) => {\n delete uncommonLabels[key];\n });\n return uncommonLabels;\n}\n\n/**\n * Check that all labels exist in another set of labels\n */\nexport function matchAllLabels(expect: Labels, against?: Labels): boolean {\n if (!expect) {\n return true; // nothing to match\n }\n for (const [key, value] of Object.entries(expect)) {\n if (!against || against[key] !== value) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Serializes the given labels to a string.\n */\nexport function formatLabels(labels: Labels, defaultValue = '', withoutBraces?: boolean): string {\n if (!labels || Object.keys(labels).length === 0) {\n return defaultValue;\n }\n const labelKeys = Object.keys(labels).sort();\n const cleanSelector = labelKeys.map((key) => `${key}=\"${labels[key]}\"`).join(', ');\n if (withoutBraces) {\n return cleanSelector;\n }\n return ['{', cleanSelector, '}'].join('');\n}\n","import { Location } from 'history';\n\nimport { textUtil } from '../text';\nimport { GrafanaConfig, RawTimeRange, ScopedVars } from '../types';\n\nimport { UrlQueryMap, urlUtil } from './url';\n\nlet grafanaConfig: GrafanaConfig = { appSubUrl: '' } as any;\nlet getTimeRangeUrlParams: () => RawTimeRange;\nlet getVariablesUrlParams: (scopedVars?: ScopedVars) => UrlQueryMap;\n\nconst maybeParseUrl = (input: string): URL | undefined => {\n try {\n return new URL(input);\n } catch {\n return undefined;\n }\n};\n\n/**\n *\n * @param url\n * @internal\n */\nconst stripBaseFromUrl = (urlOrPath: string): string => {\n // Will only return a URL object if the input is actually a valid URL\n const parsedUrl = maybeParseUrl(urlOrPath);\n if (parsedUrl) {\n // If the input is a URL, and for a different origin that we're on, just bail\n // and return it. There's no need to strip anything from it\n if (parsedUrl.origin !== window.location.origin) {\n return urlOrPath;\n }\n }\n\n const appSubUrl = grafanaConfig.appSubUrl ?? '';\n const stripExtraChars = appSubUrl.endsWith('/') ? 1 : 0;\n const isAbsoluteUrl = urlOrPath.startsWith('http');\n\n let segmentToStrip = appSubUrl;\n\n if (!urlOrPath.startsWith('/') || isAbsoluteUrl) {\n segmentToStrip = `${window.location.origin}${appSubUrl}`;\n }\n\n return urlOrPath.length > 0 && urlOrPath.indexOf(segmentToStrip) === 0\n ? urlOrPath.slice(segmentToStrip.length - stripExtraChars)\n : urlOrPath;\n};\n\n/**\n *\n * @param url\n * @internal\n */\nconst assureBaseUrl = (url: string): string => {\n if (url.startsWith('/')) {\n return `${grafanaConfig.appSubUrl}${stripBaseFromUrl(url)}`;\n }\n return url;\n};\n\n/**\n *\n * @param location\n * @param searchParamsToUpdate\n * @returns\n */\nconst getUrlForPartial = (location: Location<any>, searchParamsToUpdate: Record<string, any>) => {\n const searchParams = urlUtil.parseKeyValue(\n location.search.startsWith('?') ? location.search.substring(1) : location.search\n );\n for (const key of Object.keys(searchParamsToUpdate)) {\n // removing params with null | undefined\n if (searchParamsToUpdate[key] === null || searchParamsToUpdate[key] === undefined) {\n delete searchParams[key];\n } else {\n searchParams[key] = searchParamsToUpdate[key];\n }\n }\n return urlUtil.renderUrl(location.pathname, searchParams);\n};\n\n/**\n * @deprecated use `getUrlForPartial` instead\n * Update URL or search param string `init` with new params `partial`.\n */\nconst updateSearchParams = (init: string, partial: string) => {\n const urlSearchParams = new URLSearchParams(partial);\n\n // Check if full URL\n try {\n const curURL = new URL(init);\n urlSearchParams.forEach((val, key) => curURL.searchParams.set(key, val));\n return curURL.href;\n } catch {\n // assume search params\n const newSearchParams = new URLSearchParams(init);\n urlSearchParams.forEach((v, k) => {\n newSearchParams.set(k, v);\n });\n return '?' + newSearchParams.toString();\n }\n};\n\ninterface LocationUtilDependencies {\n config: GrafanaConfig;\n getTimeRangeForUrl: () => RawTimeRange;\n getVariablesUrlParams: (scopedVars?: ScopedVars) => UrlQueryMap;\n}\n\nexport const locationUtil = {\n /**\n *\n * @param getConfig\n * @param getAllVariableValuesForUrl\n * @param getTimeRangeForUrl\n * @internal\n */\n initialize: (dependencies: LocationUtilDependencies) => {\n grafanaConfig = dependencies.config;\n getTimeRangeUrlParams = dependencies.getTimeRangeForUrl;\n getVariablesUrlParams = dependencies.getVariablesUrlParams;\n },\n stripBaseFromUrl,\n assureBaseUrl,\n updateSearchParams,\n getTimeRangeUrlParams: () => {\n if (!getTimeRangeUrlParams) {\n return null;\n }\n return urlUtil.toUrlParams(getTimeRangeUrlParams());\n },\n getVariablesUrlParams: (scopedVars?: ScopedVars) => {\n if (!getVariablesUrlParams) {\n return null;\n }\n const params = getVariablesUrlParams(scopedVars);\n return urlUtil.toUrlParams(params);\n },\n getUrlForPartial,\n processUrl: (url: string) => {\n return grafanaConfig.disableSanitizeHtml ? url : textUtil.sanitizeUrl(url);\n },\n};\n","export const classicColors = [\n '#7EB26D', // 0: pale green\n '#EAB839', // 1: mustard\n '#6ED0E0', // 2: light blue\n '#EF843C', // 3: orange\n '#E24D42', // 4: red\n '#1F78C1', // 5: ocean\n '#BA43A9', // 6: purple\n '#705DA0', // 7: violet\n '#508642', // 8: dark green\n '#CCA300', // 9: dark sand\n '#447EBC',\n '#C15C17',\n '#890F02',\n '#0A437C',\n '#6D1F62',\n '#584477',\n '#B7DBAB',\n '#F4D598',\n '#70DBED',\n '#F9BA8F',\n '#F29191',\n '#82B5D8',\n '#E5A8E2',\n '#AEA2E0',\n '#629E51',\n '#E5AC0E',\n '#64B0C8',\n '#E0752D',\n '#BF1B00',\n '#0A50A1',\n '#962D82',\n '#614D93',\n '#9AC48A',\n '#F2C96D',\n '#65C5DB',\n '#F9934E',\n '#EA6460',\n '#5195CE',\n '#D683CE',\n '#806EB7',\n '#3F6833',\n '#967302',\n '#2F575E',\n '#99440A',\n '#58140C',\n '#052B51',\n '#511749',\n '#3F2B5B',\n '#E0F9D7',\n '#FCEACA',\n '#CFFAFF',\n '#F9E2D2',\n '#FCE2DE',\n '#BADFF4',\n '#F9D9F9',\n '#DEDAF7',\n];\n","/**\n * Round half away from zero ('commercial' rounding)\n * Uses correction to offset floating-point inaccuracies.\n * Works symmetrically for positive and negative numbers.\n *\n * ref: https://stackoverflow.com/a/48764436\n */\nexport function roundDecimals(val: number, dec = 0) {\n if (Number.isInteger(val)) {\n return val;\n }\n\n let p = 10 ** dec;\n let n = val * p * (1 + Number.EPSILON);\n return Math.round(n) / p;\n}\n\n/**\n * Tries to guess number of decimals needed to format a number\n *\n * used for determining minimum decimals required to uniformly\n * format a numric sequence, e.g. 10, 10.125, 10.25, 10.5\n *\n * good for precisce increments: 0.125 -> 3\n * bad for arbitrary floats: 371.499999999999 -> 12\n */\nexport function guessDecimals(num: number) {\n return (('' + num).split('.')[1] || '').length;\n}\n","export const objRemoveUndefined = (obj: any) => {\n return Object.keys(obj).reduce((acc: any, key) => {\n if (obj[key] !== undefined) {\n acc[key] = obj[key];\n }\n return acc;\n }, {});\n};\n","import { SelectableValue } from '../types';\n\nexport const toOption = (value: string): SelectableValue<string> => ({ label: value, value });\n","import { Field } from '../types/dataFrame';\n\n/**\n * Returns minimal time step from series time field\n * @param timeField\n */\nexport const getSeriesTimeStep = (timeField: Field): number => {\n let previousTime: number | undefined;\n let minTimeStep: number | undefined;\n let returnTimeStep = Number.MAX_VALUE;\n\n for (let i = 0; i < timeField.values.length; i++) {\n const currentTime = timeField.values.get(i);\n\n if (previousTime !== undefined) {\n const timeStep = currentTime - previousTime;\n\n if (minTimeStep === undefined) {\n returnTimeStep = timeStep;\n }\n\n if (timeStep < returnTimeStep) {\n returnTimeStep = timeStep;\n }\n }\n previousTime = currentTime;\n }\n return returnTimeStep;\n};\n\n/**\n * Checks if series time field has ms resolution\n * @param timeField\n */\nexport const hasMsResolution = (timeField: Field) => {\n for (let i = 0; i < timeField.values.length; i++) {\n const value = timeField.values.get(i);\n if (value !== null && value !== undefined) {\n const timestamp = value.toString();\n if (timestamp.length === 13 && timestamp % 1000 !== 0) {\n return true;\n }\n }\n }\n return false;\n};\n","/**\n * @preserve jquery-param (c) 2015 KNOWLEDGECODE | MIT\n */\n\nimport { ExploreUrlState } from '../types/explore';\n\n/**\n * Type to represent the value of a single query variable.\n *\n * @public\n */\nexport type UrlQueryValue = string | number | boolean | string[] | number[] | boolean[] | undefined | null;\n\n/**\n * Type to represent the values parsed from the query string.\n *\n * @public\n */\nexport type UrlQueryMap = Record<string, UrlQueryValue>;\n\nfunction renderUrl(path: string, query: UrlQueryMap | undefined): string {\n if (query && Object.keys(query).length > 0) {\n path += '?' + toUrlParams(query);\n }\n return path;\n}\n\nfunction encodeURIComponentAsAngularJS(val: string, pctEncodeSpaces?: boolean) {\n return encodeURIComponent(val)\n .replace(/%40/gi, '@')\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%3B/gi, ';')\n .replace(/%20/g, pctEncodeSpaces ? '%20' : '+')\n .replace(/[!'()*]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\nfunction toUrlParams(a: any) {\n const s: any[] = [];\n const rbracket = /\\[\\]$/;\n\n const isArray = (obj: any) => {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n\n const add = (k: string, v: any) => {\n v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;\n if (typeof v !== 'boolean') {\n s[s.length] = encodeURIComponentAsAngularJS(k, true) + '=' + encodeURIComponentAsAngularJS(v, true);\n } else {\n const valueQueryPart = v ? '' : '=' + encodeURIComponentAsAngularJS('false', true);\n s[s.length] = encodeURIComponentAsAngularJS(k, true) + valueQueryPart;\n }\n };\n\n const buildParams = (prefix: string, obj: any) => {\n let i, len, key;\n\n if (prefix) {\n if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n if (rbracket.test(prefix)) {\n add(prefix, obj[i]);\n } else {\n buildParams(prefix, obj[i]);\n }\n }\n } else if (obj && String(obj) === '[object Object]') {\n for (key in obj) {\n buildParams(prefix + '[' + key + ']', obj[key]);\n }\n } else {\n add(prefix, obj);\n }\n } else if (isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n add(obj[i].name, obj[i].value);\n }\n } else {\n for (key in obj) {\n buildParams(key, obj[key]);\n }\n }\n return s;\n };\n\n return buildParams('', a).join('&');\n}\n\nfunction appendQueryToUrl(url: string, stringToAppend: string) {\n if (stringToAppend !== undefined && stringToAppend !== null && stringToAppend !== '') {\n const pos = url.indexOf('?');\n if (pos !== -1) {\n if (url.length - pos > 1) {\n url += '&';\n }\n } else {\n url += '?';\n }\n url += stringToAppend;\n }\n\n return url;\n}\n\n/**\n * Return search part (as object) of current url\n */\nfunction getUrlSearchParams(): UrlQueryMap {\n const search = window.location.search.substring(1);\n const searchParamsSegments = search.split('&');\n const params: UrlQueryMap = {};\n for (const p of searchParamsSegments) {\n const keyValuePair = p.split('=');\n if (keyValuePair.length > 1) {\n // key-value param\n const key = decodeURIComponent(keyValuePair[0]);\n const value = decodeURIComponent(keyValuePair[1]);\n if (key in params) {\n params[key] = [...(params[key] as any[]), value];\n } else {\n params[key] = [value];\n }\n } else if (keyValuePair.length === 1) {\n // boolean param\n const key = decodeURIComponent(keyValuePair[0]);\n params[key] = true;\n }\n }\n return params;\n}\n\n/**\n * Parses an escaped url query string into key-value pairs.\n * Attribution: Code dervived from https://github.com/angular/angular.js/master/src/Angular.js#L1396\n * @returns {Object.<string,boolean|Array>}\n */\nexport function parseKeyValue(keyValue: string) {\n var obj: any = {};\n const parts = (keyValue || '').split('&');\n\n for (let keyValue of parts) {\n let splitPoint: number | undefined;\n let key: string | undefined;\n let val: string | undefined | boolean;\n\n if (keyValue) {\n key = keyValue = keyValue.replace(/\\+/g, '%20');\n splitPoint = keyValue.indexOf('=');\n\n if (splitPoint !== -1) {\n key = keyValue.substring(0, splitPoint);\n val = keyValue.substring(splitPoint + 1);\n }\n\n key = tryDecodeURIComponent(key);\n\n if (key !== undefined) {\n val = val !== undefined ? tryDecodeURIComponent(val as string) : true;\n\n let parsedVal: any;\n if (typeof val === 'string' && val !== '') {\n parsedVal = val === 'true' || val === 'false' ? val === 'true' : val;\n } else {\n parsedVal = val;\n }\n\n if (!obj.hasOwnProperty(key)) {\n obj[key] = isNaN(parsedVal) ? val : parsedVal;\n } else if (Array.isArray(obj[key])) {\n obj[key].push(val);\n } else {\n obj[key] = [obj[key], isNaN(parsedVal) ? val : parsedVal];\n }\n }\n }\n }\n\n return obj;\n}\n\nfunction tryDecodeURIComponent(value: string): string | undefined {\n try {\n return decodeURIComponent(value);\n } catch (e) {\n return undefined;\n }\n}\n\nexport const urlUtil = {\n renderUrl,\n toUrlParams,\n appendQueryToUrl,\n getUrlSearchParams,\n parseKeyValue,\n};\n\n/**\n * Create an string that is used in URL to represent the Explore state. This is basically just a stringified json\n * that is that used as a state of a single Explore pane so it does not represent full Explore URL.\n *\n * @param urlState\n * @param compact this parameter is deprecated and will be removed in a future release.\n */\nexport function serializeStateToUrlParam(urlState: ExploreUrlState, compact?: boolean): string {\n if (compact !== undefined) {\n console.warn('`compact` parameter is deprecated and will be removed in a future release');\n }\n return JSON.stringify(urlState);\n}\n","import { getActiveThreshold } from '../field';\nimport { stringToJsRegex } from '../text/string';\nimport {\n MappingType,\n SpecialValueMatch,\n ThresholdsConfig,\n ValueMap,\n ValueMapping,\n ValueMappingResult,\n SpecialValueOptions,\n} from '../types';\n\nexport function getValueMappingResult(valueMappings: ValueMapping[], value: any): ValueMappingResult | null {\n for (const vm of valueMappings) {\n switch (vm.type) {\n case MappingType.ValueToText:\n if (value == null) {\n continue;\n }\n\n const result = vm.options[value];\n if (result) {\n return result;\n }\n\n break;\n\n case MappingType.RangeToText:\n if (value == null) {\n continue;\n }\n\n const valueAsNumber = parseFloat(value as string);\n if (isNaN(valueAsNumber)) {\n continue;\n }\n\n const isNumFrom = !isNaN(vm.options.from!);\n if (isNumFrom && valueAsNumber < vm.options.from!) {\n continue;\n }\n\n const isNumTo = !isNaN(vm.options.to!);\n if (isNumTo && valueAsNumber > vm.options.to!) {\n continue;\n }\n\n return vm.options.result;\n\n case MappingType.RegexToText:\n if (value == null) {\n continue;\n }\n\n if (typeof value !== 'string') {\n continue;\n }\n\n const regex = stringToJsRegex(vm.options.pattern);\n if (value.match(regex)) {\n const res = { ...vm.options.result };\n\n if (res.text != null) {\n res.text = value.replace(regex, vm.options.result.text || '');\n }\n\n return res;\n }\n\n case MappingType.SpecialValue:\n switch ((vm.options as SpecialValueOptions).match) {\n case SpecialValueMatch.Null: {\n if (value == null) {\n return vm.options.result;\n }\n break;\n }\n case SpecialValueMatch.NaN: {\n if (isNaN(value as any)) {\n return vm.options.result;\n }\n break;\n }\n case SpecialValueMatch.NullAndNaN: {\n if (isNaN(value as any) || value == null) {\n return vm.options.result;\n }\n break;\n }\n case SpecialValueMatch.True: {\n if (value === true || value === 'true') {\n return vm.options.result;\n }\n break;\n }\n case SpecialValueMatch.False: {\n if (value === false || value === 'false') {\n return vm.options.result;\n }\n break;\n }\n case SpecialValueMatch.Empty: {\n if (value === '') {\n return vm.options.result;\n }\n break;\n }\n }\n }\n }\n\n return null;\n}\n\n// Ref https://stackoverflow.com/a/58550111\nexport function isNumeric(num: any) {\n return (typeof num === 'number' || (typeof num === 'string' && num.trim() !== '')) && !isNaN(num as number);\n}\n\n/**\n * @deprecated use MappingType instead\n * @internal\n */\nexport enum LegacyMappingType {\n ValueToText = 1,\n RangeToText = 2,\n}\n\n/**\n * @alpha\n * Converts the old Angular value mappings to new react style\n */\nexport function convertOldAngularValueMappings(panel: any, migratedThresholds?: ThresholdsConfig): ValueMapping[] {\n const mappings: ValueMapping[] = [];\n\n // Guess the right type based on options\n let mappingType = panel.mappingType;\n if (!panel.mappingType) {\n if (panel.valueMaps && panel.valueMaps.length) {\n mappingType = 1;\n } else if (panel.rangeMaps && panel.rangeMaps.length) {\n mappingType = 2;\n }\n }\n if (mappingType === 1) {\n for (let i = 0; i < panel.valueMaps.length; i++) {\n const map = panel.valueMaps[i];\n mappings.push(\n upgradeOldAngularValueMapping(\n {\n ...map,\n id: i, // used for order\n type: MappingType.ValueToText,\n },\n panel.fieldConfig?.defaults?.thresholds || migratedThresholds\n )\n );\n }\n } else if (mappingType === 2) {\n for (let i = 0; i < panel.rangeMaps.length; i++) {\n const map = panel.rangeMaps[i];\n mappings.push(\n upgradeOldAngularValueMapping(\n {\n ...map,\n id: i, // used for order\n type: MappingType.RangeToText,\n },\n panel.fieldConfig?.defaults?.thresholds || migratedThresholds\n )\n );\n }\n }\n\n return mappings;\n}\n\nfunction upgradeOldAngularValueMapping(old: any, thresholds?: ThresholdsConfig): ValueMapping {\n const valueMaps: ValueMap = { type: MappingType.ValueToText, options: {} };\n const newMappings: ValueMapping[] = [];\n\n // Use the color we would have picked from thesholds\n let color: string | undefined = undefined;\n const numeric = parseFloat(old.text);\n if (thresholds && !isNaN(numeric)) {\n const level = getActiveThreshold(numeric, thresholds.steps);\n if (level && level.color) {\n color = level.color;\n }\n }\n\n switch (old.type) {\n case LegacyMappingType.ValueToText:\n case MappingType.ValueToText:\n if (old.value != null) {\n if (old.value === 'null') {\n newMappings.push({\n type: MappingType.SpecialValue,\n options: {\n match: SpecialValueMatch.Null,\n result: { text: old.text, color },\n },\n });\n } else {\n valueMaps.options[String(old.value)] = {\n text: old.text,\n color,\n };\n }\n }\n break;\n case LegacyMappingType.RangeToText:\n case MappingType.RangeToText:\n if (old.from === 'null' || old.to === 'null') {\n newMappings.push({\n type: MappingType.SpecialValue,\n options: {\n match: SpecialValueMatch.Null,\n result: { text: old.text, color },\n },\n });\n } else {\n newMappings.push({\n type: MappingType.RangeToText,\n options: {\n from: +old.from,\n to: +old.to,\n result: { text: old.text, color },\n },\n });\n }\n break;\n }\n\n if (Object.keys(valueMaps.options).length > 0) {\n newMappings.unshift(valueMaps);\n }\n\n return newMappings[0];\n}\n","import { merge, Observable, timer } from 'rxjs';\nimport { mapTo, takeUntil } from 'rxjs/operators';\n\n/**\n * @internal\n */\nexport type WithLoadingIndicatorOptions<T> = {\n whileLoading: T;\n source: Observable<T>;\n};\n\n/**\n * @internal\n */\nexport function withLoadingIndicator<T>({ whileLoading, source }: WithLoadingIndicatorOptions<T>): Observable<T> {\n return merge(timer(200).pipe(mapTo(whileLoading), takeUntil(source)), source);\n}\n","import { clamp } from 'lodash';\n\nimport { TimeZone } from '../types';\nimport { DecimalCount } from '../types/displayValue';\n\nimport { getCategories } from './categories';\nimport { toDateTimeValueFormatter } from './dateTimeFormatters';\nimport { getOffsetFromSIPrefix, SIPrefix, currency } from './symbolFormatters';\n\nexport interface FormattedValue {\n text: string;\n prefix?: string;\n suffix?: string;\n}\n\nexport function formattedValueToString(val: FormattedValue): string {\n return `${val.prefix ?? ''}${val.text}${val.suffix ?? ''}`;\n}\n\nexport type ValueFormatter = (\n value: number,\n decimals?: DecimalCount,\n scaledDecimals?: DecimalCount,\n timeZone?: TimeZone,\n showMs?: boolean\n) => FormattedValue;\n\nexport interface ValueFormat {\n name: string;\n id: string;\n fn: ValueFormatter;\n}\n\nexport interface ValueFormatCategory {\n name: string;\n formats: ValueFormat[];\n}\n\nexport interface ValueFormatterIndex {\n [id: string]: ValueFormatter;\n}\n\n// Globals & formats cache\nlet categories: ValueFormatCategory[] = [];\nconst index: ValueFormatterIndex = {};\nlet hasBuiltIndex = false;\n\nexport function toFixed(value: number, decimals?: DecimalCount): string {\n if (value === null) {\n return '';\n }\n\n if (value === Number.NEGATIVE_INFINITY || value === Number.POSITIVE_INFINITY) {\n return value.toLocaleString();\n }\n\n if (decimals === null || decimals === undefined) {\n decimals = getDecimalsForValue(value);\n }\n\n if (value === 0) {\n return value.toFixed(decimals);\n }\n\n const factor = decimals ? Math.pow(10, Math.max(0, decimals)) : 1;\n const formatted = String(Math.round(value * factor) / factor);\n\n // if exponent return directly\n if (formatted.indexOf('e') !== -1 || value === 0) {\n return formatted;\n }\n\n const decimalPos = formatted.indexOf('.');\n const precision = decimalPos === -1 ? 0 : formatted.length - decimalPos - 1;\n if (precision < decimals) {\n return (precision ? formatted : formatted + '.') + String(factor).slice(1, decimals - precision + 1);\n }\n\n return formatted;\n}\n\nfunction getDecimalsForValue(value: number): number {\n const log10 = Math.floor(Math.log(Math.abs(value)) / Math.LN10);\n let dec = -log10 + 1;\n const magn = Math.pow(10, -dec);\n const norm = value / magn; // norm is between 1.0 and 10.0\n\n // special case for 2.5, requires an extra decimal\n if (norm > 2.25) {\n ++dec;\n }\n\n if (value % 1 === 0) {\n dec = 0;\n }\n\n const decimals = Math.max(0, dec);\n return decimals;\n}\n\nexport function toFixedScaled(value: number, decimals: DecimalCount, ext?: string): FormattedValue {\n return {\n text: toFixed(value, decimals),\n suffix: ext,\n };\n}\n\nexport function toFixedUnit(unit: string, asPrefix?: boolean): ValueFormatter {\n return (size: number, decimals?: DecimalCount) => {\n if (size === null) {\n return { text: '' };\n }\n const text = toFixed(size, decimals);\n if (unit) {\n if (asPrefix) {\n return { text, prefix: unit };\n }\n return { text, suffix: ' ' + unit };\n }\n return { text };\n };\n}\n\nexport function isBooleanUnit(unit?: string) {\n return unit && unit.startsWith('bool');\n}\n\nexport function booleanValueFormatter(t: string, f: string): ValueFormatter {\n return (value: any) => {\n return { text: value ? t : f };\n };\n}\n\nconst logb = (b: number, x: number) => Math.log10(x) / Math.log10(b);\n\nexport function scaledUnits(factor: number, extArray: string[], offset = 0): ValueFormatter {\n return (size: number, decimals?: DecimalCount) => {\n if (size === null) {\n return { text: '' };\n }\n\n if (size === Number.NEGATIVE_INFINITY || size === Number.POSITIVE_INFINITY || isNaN(size)) {\n return { text: size.toLocaleString() };\n }\n\n const siIndex = size === 0 ? 0 : Math.floor(logb(factor, Math.abs(size)));\n const suffix = extArray[clamp(offset + siIndex, 0, extArray.length - 1)];\n\n return {\n text: toFixed(size / factor ** clamp(siIndex, -offset, extArray.length - offset - 1), decimals),\n suffix,\n };\n };\n}\n\nexport function locale(value: number, decimals: DecimalCount): FormattedValue {\n if (value == null) {\n return { text: '' };\n }\n return {\n text: value.toLocaleString(undefined, { maximumFractionDigits: decimals as number }),\n };\n}\n\nexport function simpleCountUnit(symbol: string): ValueFormatter {\n const units = ['', 'K', 'M', 'B', 'T'];\n const scaler = scaledUnits(1000, units);\n return (size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount) => {\n if (size === null) {\n return { text: '' };\n }\n const v = scaler(size, decimals, scaledDecimals);\n v.suffix += ' ' + symbol;\n return v;\n };\n}\n\nexport function stringFormater(value: number): FormattedValue {\n return { text: `${value}` };\n}\n\nfunction buildFormats() {\n categories = getCategories();\n\n for (const cat of categories) {\n for (const format of cat.formats) {\n index[format.id] = format.fn;\n }\n }\n\n // Resolve units pointing to old IDs\n [{ from: 'farenheit', to: 'fahrenheit' }].forEach((alias) => {\n const f = index[alias.to];\n if (f) {\n index[alias.from] = f;\n }\n });\n\n hasBuiltIndex = true;\n}\n\nexport function getValueFormat(id?: string | null): ValueFormatter {\n if (!id) {\n return toFixedUnit('');\n }\n\n if (!hasBuiltIndex) {\n buildFormats();\n }\n\n const fmt = index[id];\n\n if (!fmt && id) {\n let idx = id.indexOf(':');\n\n if (idx > 0) {\n const key = id.substring(0, idx);\n const sub = id.substring(idx + 1);\n\n if (key === 'prefix') {\n return toFixedUnit(sub, true);\n }\n\n if (key === 'suffix') {\n return toFixedUnit(sub, false);\n }\n\n if (key === 'time') {\n return toDateTimeValueFormatter(sub);\n }\n\n if (key === 'si') {\n const offset = getOffsetFromSIPrefix(sub.charAt(0));\n const unit = offset === 0 ? sub : sub.substring(1);\n return SIPrefix(unit, offset);\n }\n\n if (key === 'count') {\n return simpleCountUnit(sub);\n }\n\n if (key === 'currency') {\n return currency(sub);\n }\n\n if (key === 'bool') {\n idx = sub.indexOf('/');\n if (idx >= 0) {\n const t = sub.substring(0, idx);\n const f = sub.substring(idx + 1);\n return booleanValueFormatter(t, f);\n }\n return booleanValueFormatter(sub, '-');\n }\n }\n\n return toFixedUnit(id);\n }\n\n return fmt;\n}\n\nexport function getValueFormatterIndex(): ValueFormatterIndex {\n if (!hasBuiltIndex) {\n buildFormats();\n }\n\n return index;\n}\n\nexport function getValueFormats() {\n if (!hasBuiltIndex) {\n buildFormats();\n }\n\n return categories.map((cat) => {\n return {\n text: cat.name,\n submenu: cat.formats.map((format) => {\n return {\n text: format.name,\n value: format.id,\n };\n }),\n };\n });\n}\n","import { Vector } from '../types/vector';\n\nimport { vectorToArray } from './vectorToArray';\n\ninterface AppendedVectorInfo<T> {\n start: number;\n end: number;\n values: Vector<T>;\n}\n\n/**\n * This may be more trouble than it is worth. This trades some computation time for\n * RAM -- rather than allocate a new array the size of all previous arrays, this just\n * points the correct index to their original array values\n */\nexport class AppendedVectors<T = any> implements Vector<T> {\n length = 0;\n source: Array<AppendedVectorInfo<T>> = [];\n\n constructor(startAt = 0) {\n this.length = startAt;\n }\n\n /**\n * Make the vector look like it is this long\n */\n setLength(length: number) {\n if (length > this.length) {\n // make the vector longer (filling with undefined)\n this.length = length;\n } else if (length < this.length) {\n // make the array shorter\n const sources: Array<AppendedVectorInfo<T>> = [];\n for (const src of this.source) {\n sources.push(src);\n if (src.end > length) {\n src.end = length;\n break;\n }\n }\n this.source = sources;\n this.length = length;\n }\n }\n\n append(v: Vector<T>): AppendedVectorInfo<T> {\n const info = {\n start: this.length,\n end: this.length + v.length,\n values: v,\n };\n this.length = info.end;\n this.source.push(info);\n return info;\n }\n\n get(index: number): T {\n for (let i = 0; i < this.source.length; i++) {\n const src = this.source[i];\n if (index >= src.start && index < src.end) {\n return src.values.get(index - src.start);\n }\n }\n return undefined as unknown as T;\n }\n\n toArray(): T[] {\n return vectorToArray(this);\n }\n\n toJSON(): T[] {\n return vectorToArray(this);\n }\n}\n","import { MutableVector } from '../types/vector';\n\nimport { FunctionalVector } from './FunctionalVector';\nimport { vectorToArray } from './vectorToArray';\n\ninterface CircularOptions<T> {\n buffer?: T[];\n append?: 'head' | 'tail';\n capacity?: number;\n}\n\n/**\n * Circular vector uses a single buffer to capture a stream of values\n * overwriting the oldest value on add.\n *\n * This supports adding to the 'head' or 'tail' and will grow the buffer\n * to match a configured capacity.\n *\n * @public\n */\nexport class CircularVector<T = any> extends FunctionalVector<T> implements MutableVector<T> {\n private buffer: T[];\n private index: number;\n private capacity: number;\n private tail: boolean;\n\n constructor(options: CircularOptions<T>) {\n super();\n\n this.buffer = options.buffer || [];\n this.capacity = this.buffer.length;\n this.tail = 'head' !== options.append;\n this.index = 0;\n\n this.add = this.getAddFunction();\n if (options.capacity) {\n this.setCapacity(options.capacity);\n }\n }\n\n /**\n * This gets the appropriate add function depending on the buffer state:\n * * head vs tail\n * * growing buffer vs overwriting values\n */\n private getAddFunction() {\n // When we are not at capacity, it should actually modify the buffer\n if (this.capacity > this.buffer.length) {\n if (this.tail) {\n return (value: T) => {\n this.buffer.push(value);\n if (this.buffer.length >= this.capacity) {\n this.add = this.getAddFunction();\n }\n };\n } else {\n return (value: T) => {\n this.buffer.unshift(value);\n if (this.buffer.length >= this.capacity) {\n this.add = this.getAddFunction();\n }\n };\n }\n }\n\n if (this.tail) {\n return (value: T) => {\n this.buffer[this.index] = value;\n this.index = (this.index + 1) % this.buffer.length;\n };\n }\n\n // Append values to the head\n return (value: T) => {\n let idx = this.index - 1;\n if (idx < 0) {\n idx = this.buffer.length - 1;\n }\n this.buffer[idx] = value;\n this.index = idx;\n };\n }\n\n setCapacity(v: number) {\n if (this.capacity === v) {\n return;\n }\n // Make a copy so it is in order and new additions can be at the head or tail\n const copy = this.toArray();\n if (v > this.length) {\n this.buffer = copy;\n } else if (v < this.capacity) {\n // Shrink the buffer\n const delta = this.length - v;\n if (this.tail) {\n this.buffer = copy.slice(delta, copy.length); // Keep last items\n } else {\n this.buffer = copy.slice(0, copy.length - delta); // Keep first items\n }\n }\n this.capacity = v;\n this.index = 0;\n this.add = this.getAddFunction();\n }\n\n setAppendMode(mode: 'head' | 'tail') {\n const tail = 'head' !== mode;\n if (tail !== this.tail) {\n this.buffer = this.toArray().reverse();\n this.index = 0;\n this.tail = tail;\n this.add = this.getAddFunction();\n }\n }\n\n reverse() {\n this.buffer.reverse();\n }\n\n /**\n * Add the value to the buffer\n */\n add: (value: T) => void;\n\n get(index: number) {\n return this.buffer[(index + this.index) % this.buffer.length];\n }\n\n set(index: number, value: T) {\n this.buffer[(index + this.index) % this.buffer.length] = value;\n }\n\n get length() {\n return this.buffer.length;\n }\n\n toArray(): T[] {\n return vectorToArray(this);\n }\n\n toJSON(): T[] {\n return vectorToArray(this);\n }\n}\n","import { Vector } from '../types';\n\nimport { vectorToArray } from './vectorToArray';\n\n/** @public */\nexport abstract class FunctionalVector<T = any> implements Vector<T>, Iterable<T> {\n abstract get length(): number;\n\n abstract get(index: number): T;\n\n // Implement \"iterator protocol\"\n *iterator() {\n for (let i = 0; i < this.length; i++) {\n yield this.get(i);\n }\n }\n\n // Implement \"iterable protocol\"\n [Symbol.iterator]() {\n return this.iterator();\n }\n\n forEach(iterator: (row: T) => void) {\n return vectorator(this).forEach(iterator);\n }\n\n map<V>(transform: (item: T, index: number) => V) {\n return vectorator(this).map(transform);\n }\n\n filter(predicate: (item: T) => boolean): T[] {\n return vectorator(this).filter(predicate);\n }\n\n toArray(): T[] {\n return vectorToArray(this);\n }\n\n toJSON(): any {\n return this.toArray();\n }\n}\n\n/**\n * Use functional programming with your vector\n */\nexport function vectorator<T>(vector: Vector<T>) {\n return {\n *[Symbol.iterator]() {\n for (let i = 0; i < vector.length; i++) {\n yield vector.get(i);\n }\n },\n\n forEach(iterator: (row: T) => void) {\n for (let i = 0; i < vector.length; i++) {\n iterator(vector.get(i));\n }\n },\n\n map<V>(transform: (item: T, index: number) => V) {\n const result: V[] = [];\n for (let i = 0; i < vector.length; i++) {\n result.push(transform(vector.get(i), i));\n }\n return result;\n },\n\n /** Add a predicate where you return true if it should *keep* the value */\n filter(predicate: (item: T) => boolean): T[] {\n const result: T[] = [];\n for (const val of this) {\n if (predicate(val)) {\n result.push(val);\n }\n }\n return result;\n },\n };\n}\n","import { DisplayProcessor } from '../types';\nimport { Vector } from '../types/vector';\nimport { formattedValueToString } from '../valueFormats';\n\nimport { FunctionalVector } from './FunctionalVector';\n\n/**\n * @public\n */\nexport class FormattedVector<T = any> extends FunctionalVector<string> {\n constructor(private source: Vector<T>, private formatter: DisplayProcessor) {\n super();\n }\n\n get length() {\n return this.source.length;\n }\n\n get(index: number): string {\n const v = this.source.get(index);\n return formattedValueToString(this.formatter(v));\n }\n}\n","import { Field, FieldType } from '../types';\n\nimport { FunctionalVector } from './FunctionalVector';\n\n/**\n * IndexVector is a simple vector implementation that returns the index value\n * for each element in the vector. It is functionally equivolant a vector backed\n * by an array with values: `[0,1,2,...,length-1]`\n */\nexport class IndexVector extends FunctionalVector<number> {\n constructor(private len: number) {\n super();\n }\n\n get length() {\n return this.len;\n }\n\n get(index: number): number {\n return index;\n }\n\n /**\n * Returns a field representing the range [0 ... length-1]\n */\n static newField(len: number): Field<number> {\n return {\n name: '',\n values: new IndexVector(len),\n type: FieldType.number,\n config: {\n min: 0,\n max: len - 1,\n },\n };\n }\n}\n","// NOTE: by default Component string selectors are set up to be aria-labels,\n// however there are many cases where your component may not need an aria-label\n// (a <button> with clear text, for example, does not need an aria-label as it's already labeled)\n// but you still might need to select it for testing,\n// in that case please add the attribute data-test-id={selector} in the component and\n// prefix your selector string with 'data-test-id' so that when create the selectors we know to search for it on the right attribute\n/**\n * Selectors grouped/defined in Components\n *\n * @alpha\n */\nexport const Components = {\n TimePicker: {\n openButton: 'data-testid TimePicker Open Button',\n fromField: 'Time Range from field',\n toField: 'Time Range to field',\n applyTimeRange: 'data-testid TimePicker submit button',\n calendar: {\n label: 'Time Range calendar',\n openButton: 'Open time range calendar',\n closeButton: 'Close time range Calendar',\n },\n absoluteTimeRangeTitle: 'data-testid-absolute-time-range-narrow',\n },\n DataSource: {\n TestData: {\n QueryTab: {\n scenarioSelectContainer: 'Test Data Query scenario select container',\n scenarioSelect: 'Test Data Query scenario select',\n max: 'TestData max',\n min: 'TestData min',\n noise: 'TestData noise',\n seriesCount: 'TestData series count',\n spread: 'TestData spread',\n startValue: 'TestData start value',\n drop: 'TestData drop values',\n },\n },\n DataSourceHttpSettings: {\n urlInput: 'Datasource HTTP settings url',\n },\n Jaeger: {\n traceIDInput: 'Trace ID',\n },\n Prometheus: {\n configPage: {\n exemplarsAddButton: 'Add exemplar config button',\n internalLinkSwitch: 'Internal link switch',\n },\n exemplarMarker: 'Exemplar marker',\n },\n },\n Menu: {\n MenuComponent: (title: string) => `${title} menu`,\n MenuGroup: (title: string) => `${title} menu group`,\n MenuItem: (title: string) => `${title} menu item`,\n SubMenu: {\n container: 'SubMenu container',\n icon: 'SubMenu icon',\n },\n },\n Panels: {\n Panel: {\n title: (title: string) => `data-testid Panel header ${title}`,\n headerItems: (item: string) => `Panel header item ${item}`,\n containerByTitle: (title: string) => `${title} panel`,\n headerCornerInfo: (mode: string) => `Panel header ${mode}`,\n },\n Visualization: {\n Graph: {\n VisualizationTab: {\n legendSection: 'Legend section',\n },\n Legend: {\n legendItemAlias: (name: string) => `gpl alias ${name}`,\n showLegendSwitch: 'gpl show legend',\n },\n xAxis: {\n labels: () => 'div.flot-x-axis > div.flot-tick-label',\n },\n },\n BarGauge: {\n /**\n * @deprecated use valueV2 from Grafana 8.3 instead\n */\n value: 'Bar gauge value',\n valueV2: 'data-testid Bar gauge value',\n },\n PieChart: {\n svgSlice: 'Pie Chart Slice',\n },\n Text: {\n container: () => '.markdown-html',\n },\n Table: {\n header: 'table header',\n footer: 'table-footer',\n },\n },\n },\n VizLegend: {\n seriesName: (name: string) => `VizLegend series ${name}`,\n },\n Drawer: {\n General: {\n title: (title: string) => `Drawer title ${title}`,\n expand: 'Drawer expand',\n contract: 'Drawer contract',\n close: 'Drawer close',\n rcContentWrapper: () => '.drawer-content-wrapper',\n },\n },\n PanelEditor: {\n General: {\n content: 'Panel editor content',\n },\n OptionsPane: {\n content: 'Panel editor option pane content',\n select: 'Panel editor option pane select',\n fieldLabel: (type: string) => `${type} field property editor`,\n },\n // not sure about the naming *DataPane*\n DataPane: {\n content: 'Panel editor data pane content',\n },\n applyButton: 'panel editor apply',\n toggleVizPicker: 'toggle-viz-picker',\n toggleVizOptions: 'toggle-viz-options',\n toggleTableView: 'toggle-table-view',\n },\n PanelInspector: {\n Data: {\n content: 'Panel inspector Data content',\n },\n Stats: {\n content: 'Panel inspector Stats content',\n },\n Json: {\n content: 'Panel inspector Json content',\n },\n Query: {\n content: 'Panel inspector Query content',\n refreshButton: 'Panel inspector Query refresh button',\n jsonObjectKeys: () => '.json-formatter-key',\n },\n },\n Tab: {\n title: (title: string) => `Tab ${title}`,\n active: () => '[class*=\"-activeTabStyle\"]',\n },\n RefreshPicker: {\n /**\n * @deprecated use runButtonV2 from Grafana 8.3 instead\n */\n runButton: 'RefreshPicker run button',\n /**\n * @deprecated use intervalButtonV2 from Grafana 8.3 instead\n */\n intervalButton: 'RefreshPicker interval button',\n runButtonV2: 'data-testid RefreshPicker run button',\n intervalButtonV2: 'data-testid RefreshPicker interval button',\n },\n QueryTab: {\n content: 'Query editor tab content',\n queryInspectorButton: 'Query inspector button',\n queryHistoryButton: 'Rich history button',\n addQuery: 'Query editor add query button',\n },\n QueryHistory: {\n queryText: 'Query text',\n },\n QueryEditorRows: {\n rows: 'Query editor row',\n },\n QueryEditorRow: {\n actionButton: (title: string) => `${title} query operation action`,\n title: (refId: string) => `Query editor row title ${refId}`,\n container: (refId: string) => `Query editor row ${refId}`,\n },\n AlertTab: {\n content: 'Alert editor tab content',\n },\n Alert: {\n /**\n * @deprecated use alertV2 from Grafana 8.3 instead\n */\n alert: (severity: string) => `Alert ${severity}`,\n alertV2: (severity: string) => `data-testid Alert ${severity}`,\n },\n TransformTab: {\n content: 'Transform editor tab content',\n newTransform: (name: string) => `New transform ${name}`,\n transformationEditor: (name: string) => `Transformation editor ${name}`,\n transformationEditorDebugger: (name: string) => `Transformation editor debugger ${name}`,\n },\n Transforms: {\n card: (name: string) => `New transform ${name}`,\n Reduce: {\n modeLabel: 'Transform mode label',\n calculationsLabel: 'Transform calculations label',\n },\n searchInput: 'search transformations',\n },\n PageToolbar: {\n container: () => '.page-toolbar',\n item: (tooltip: string) => `${tooltip}`,\n },\n QueryEditorToolbarItem: {\n button: (title: string) => `QueryEditor toolbar item button ${title}`,\n },\n BackButton: {\n backArrow: 'Go Back',\n },\n OptionsGroup: {\n group: (title?: string) => (title ? `Options group ${title}` : 'Options group'),\n toggle: (title?: string) => (title ? `Options group ${title} toggle` : 'Options group toggle'),\n },\n PluginVisualization: {\n item: (title: string) => `Plugin visualization item ${title}`,\n current: () => '[class*=\"-currentVisualizationItem\"]',\n },\n Select: {\n option: 'Select option',\n input: () => 'input[id*=\"time-options-input\"]',\n singleValue: () => 'div[class*=\"-singleValue\"]',\n },\n FieldConfigEditor: {\n content: 'Field config editor content',\n },\n OverridesConfigEditor: {\n content: 'Field overrides editor content',\n },\n FolderPicker: {\n /**\n * @deprecated use containerV2 from Grafana 8.3 instead\n */\n container: 'Folder picker select container',\n containerV2: 'data-testid Folder picker select container',\n input: 'Select a folder',\n },\n ReadonlyFolderPicker: {\n container: 'data-testid Readonly folder picker select container',\n },\n DataSourcePicker: {\n container: 'Data source picker select container',\n /**\n * @deprecated use inputV2 instead\n */\n input: () => 'input[id=\"data-source-picker\"]',\n inputV2: 'Select a data source',\n },\n TimeZonePicker: {\n /**\n * @deprecated use TimeZonePicker.containerV2 from Grafana 8.3 instead\n */\n container: 'Time zone picker select container',\n containerV2: 'data-testid Time zone picker select container',\n },\n WeekStartPicker: {\n /**\n * @deprecated use WeekStartPicker.containerV2 from Grafana 8.3 instead\n */\n container: 'Choose starting day of the week',\n containerV2: 'data-testid Choose starting day of the week',\n placeholder: 'Choose starting day of the week',\n },\n TraceViewer: {\n spanBar: 'data-testid SpanBar--wrapper',\n },\n QueryField: { container: 'Query field' },\n QueryBuilder: {\n queryPatterns: 'Query patterns',\n labelSelect: 'Select label',\n valueSelect: 'Select value',\n matchOperatorSelect: 'Select match operator',\n },\n ValuePicker: {\n button: (name: string) => `Value picker button ${name}`,\n select: (name: string) => `Value picker select ${name}`,\n },\n Search: {\n /**\n * @deprecated use sectionV2 from Grafana 8.3 instead\n */\n section: 'Search section',\n sectionV2: 'data-testid Search section',\n /**\n * @deprecated use itemsV2 from Grafana 8.3 instead\n */\n items: 'Search items',\n itemsV2: 'data-testid Search items',\n cards: 'data-testid Search cards',\n collapseFolder: (sectionId: string) => `data-testid Collapse folder ${sectionId}`,\n expandFolder: (sectionId: string) => `data-testid Expand folder ${sectionId}`,\n dashboardItem: (item: string) => `${Components.Search.dashboardItems} ${item}`,\n dashboardCard: (item: string) => `data-testid Search card ${item}`,\n dashboardItems: 'data-testid Dashboard search item',\n },\n DashboardLinks: {\n container: 'data-testid Dashboard link container',\n dropDown: 'data-testid Dashboard link dropdown',\n link: 'data-testid Dashboard link',\n },\n LoadingIndicator: {\n icon: 'Loading indicator',\n },\n CallToActionCard: {\n /**\n * @deprecated use buttonV2 from Grafana 8.3 instead\n */\n button: (name: string) => `Call to action button ${name}`,\n buttonV2: (name: string) => `data-testid Call to action button ${name}`,\n },\n DataLinksContextMenu: {\n singleLink: 'Data link',\n },\n CodeEditor: {\n container: 'Code editor container',\n },\n DashboardImportPage: {\n textarea: 'data-testid-import-dashboard-textarea',\n submit: 'data-testid-load-dashboard',\n },\n ImportDashboardForm: {\n name: 'data-testid-import-dashboard-title',\n submit: 'data-testid-import-dashboard-submit',\n },\n PanelAlertTabContent: {\n content: 'Unified alert editor tab content',\n },\n VisualizationPreview: {\n card: (name: string) => `data-testid suggestion-${name}`,\n },\n ColorSwatch: {\n name: `data-testid-colorswatch`,\n },\n DashboardRow: {\n title: (title: string) => `data-testid dashboard-row-title-${title}`,\n },\n UserProfile: {\n profileSaveButton: 'data-testid-user-profile-save',\n preferencesSaveButton: 'data-testid-shared-prefs-save',\n orgsTable: 'data-testid-user-orgs-table',\n sessionsTable: 'data-testid-user-sessions-table',\n },\n FileUpload: {\n inputField: 'data-testid-file-upload-input-field',\n fileNameSpan: 'data-testid-file-upload-file-name',\n },\n};\n","import { E2ESelectors } from '../types';\n\nimport { Components } from './components';\nimport { Pages } from './pages';\n\n/**\n * Exposes selectors in package for easy use in e2e tests and in production code\n *\n * @alpha\n */\nexport const selectors: { pages: E2ESelectors<typeof Pages>; components: E2ESelectors<typeof Components> } = {\n pages: Pages,\n components: Components,\n};\n\n/**\n * Exposes Pages, Component selectors and E2ESelectors type in package for easy use in e2e tests and in production code\n *\n * @alpha\n */\nexport { Pages, Components, E2ESelectors };\n","import { Components } from './components';\n\n/**\n * Selectors grouped/defined in Pages\n *\n * @alpha\n */\nexport const Pages = {\n Login: {\n url: '/login',\n username: 'Username input field',\n password: 'Password input field',\n submit: 'Login button',\n skip: 'Skip change password button',\n },\n Home: {\n url: '/',\n },\n DataSource: {\n name: 'Data source settings page name input field',\n delete: 'Data source settings page Delete button',\n readOnly: 'Data source settings page read only message',\n saveAndTest: 'Data source settings page Save and Test button',\n alert: 'Data source settings page Alert',\n },\n DataSources: {\n url: '/datasources',\n dataSources: (dataSourceName: string) => `Data source list item ${dataSourceName}`,\n },\n AddDataSource: {\n url: '/datasources/new',\n /** @deprecated Use dataSourcePluginsV2 */\n dataSourcePlugins: (pluginName: string) => `Data source plugin item ${pluginName}`,\n dataSourcePluginsV2: (pluginName: string) => `Add data source ${pluginName}`,\n },\n ConfirmModal: {\n delete: 'Confirm Modal Danger Button',\n },\n AddDashboard: {\n url: '/dashboard/new',\n addNewPanel: 'Add new panel',\n addNewRow: 'Add new row',\n addNewPanelLibrary: 'Add new panel from panel library',\n },\n Dashboard: {\n url: (uid: string) => `/d/${uid}`,\n DashNav: {\n /**\n * @deprecated use navV2 from Grafana 8.3 instead\n */\n nav: 'Dashboard navigation',\n navV2: 'data-testid Dashboard navigation',\n publicDashboardTag: 'data-testid public dashboard tag',\n },\n SubMenu: {\n submenu: 'Dashboard submenu',\n submenuItem: 'data-testid template variable',\n submenuItemLabels: (item: string) => `data-testid Dashboard template variables submenu Label ${item}`,\n submenuItemValueDropDownValueLinkTexts: (item: string) =>\n `data-testid Dashboard template variables Variable Value DropDown value link text ${item}`,\n submenuItemValueDropDownDropDown: 'Variable options',\n submenuItemValueDropDownOptionTexts: (item: string) =>\n `data-testid Dashboard template variables Variable Value DropDown option text ${item}`,\n },\n Settings: {\n General: {\n deleteDashBoard: 'Dashboard settings page delete dashboard button',\n sectionItems: (item: string) => `Dashboard settings section item ${item}`,\n saveDashBoard: 'Dashboard settings aside actions Save button',\n saveAsDashBoard: 'Dashboard settings aside actions Save As button',\n /**\n * @deprecated use components.TimeZonePicker.containerV2 from Grafana 8.3 instead\n */\n timezone: 'Time zone picker select container',\n title: 'Dashboard settings page title',\n },\n Annotations: {\n List: {\n /**\n * @deprecated use addAnnotationCTAV2 from Grafana 8.3 instead\n */\n addAnnotationCTA: Components.CallToActionCard.button('Add annotation query'),\n addAnnotationCTAV2: Components.CallToActionCard.buttonV2('Add annotation query'),\n },\n Settings: {\n name: 'Annotations settings name input',\n },\n },\n Variables: {\n List: {\n /**\n * @deprecated use addVariableCTAV2 from Grafana 8.3 instead\n */\n addVariableCTA: Components.CallToActionCard.button('Add variable'),\n addVariableCTAV2: Components.CallToActionCard.buttonV2('Add variable'),\n newButton: 'Variable editor New variable button',\n table: 'Variable editor Table',\n tableRowNameFields: (variableName: string) => `Variable editor Table Name field ${variableName}`,\n tableRowDefinitionFields: (variableName: string) => `Variable editor Table Definition field ${variableName}`,\n tableRowArrowUpButtons: (variableName: string) => `Variable editor Table ArrowUp button ${variableName}`,\n tableRowArrowDownButtons: (variableName: string) => `Variable editor Table ArrowDown button ${variableName}`,\n tableRowDuplicateButtons: (variableName: string) => `Variable editor Table Duplicate button ${variableName}`,\n tableRowRemoveButtons: (variableName: string) => `Variable editor Table Remove button ${variableName}`,\n },\n Edit: {\n General: {\n headerLink: 'Variable editor Header link',\n modeLabelNew: 'Variable editor Header mode New',\n /**\n * @deprecated\n */\n modeLabelEdit: 'Variable editor Header mode Edit',\n generalNameInput: 'Variable editor Form Name field',\n generalNameInputV2: 'data-testid Variable editor Form Name field',\n generalTypeSelect: 'Variable editor Form Type select',\n generalTypeSelectV2: 'data-testid Variable editor Form Type select',\n generalLabelInput: 'Variable editor Form Label field',\n generalLabelInputV2: 'data-testid Variable editor Form Label field',\n generalHideSelect: 'Variable editor Form Hide select',\n generalHideSelectV2: 'data-testid Variable editor Form Hide select',\n selectionOptionsMultiSwitch: 'Variable editor Form Multi switch',\n selectionOptionsIncludeAllSwitch: 'Variable editor Form IncludeAll switch',\n selectionOptionsCustomAllInput: 'Variable editor Form IncludeAll field',\n selectionOptionsCustomAllInputV2: 'data-testid Variable editor Form IncludeAll field',\n previewOfValuesOption: 'Variable editor Preview of Values option',\n submitButton: 'Variable editor Submit button',\n },\n QueryVariable: {\n queryOptionsDataSourceSelect: Components.DataSourcePicker.container,\n queryOptionsRefreshSelect: 'Variable editor Form Query Refresh select',\n queryOptionsRefreshSelectV2: 'data-testid Variable editor Form Query Refresh select',\n queryOptionsRegExInput: 'Variable editor Form Query RegEx field',\n queryOptionsRegExInputV2: 'data-testid Variable editor Form Query RegEx field',\n queryOptionsSortSelect: 'Variable editor Form Query Sort select',\n queryOptionsSortSelectV2: 'data-testid Variable editor Form Query Sort select',\n queryOptionsQueryInput: 'Variable editor Form Default Variable Query Editor textarea',\n valueGroupsTagsEnabledSwitch: 'Variable editor Form Query UseTags switch',\n valueGroupsTagsTagsQueryInput: 'Variable editor Form Query TagsQuery field',\n valueGroupsTagsTagsValuesQueryInput: 'Variable editor Form Query TagsValuesQuery field',\n },\n ConstantVariable: {\n constantOptionsQueryInput: 'Variable editor Form Constant Query field',\n constantOptionsQueryInputV2: 'data-testid Variable editor Form Constant Query field',\n },\n DatasourceVariable: {\n datasourceSelect: 'data-testid datasource variable datasource type',\n },\n TextBoxVariable: {\n textBoxOptionsQueryInput: 'Variable editor Form TextBox Query field',\n textBoxOptionsQueryInputV2: 'data-testid Variable editor Form TextBox Query field',\n },\n CustomVariable: {\n customValueInput: 'data-testid custom-variable-input',\n },\n IntervalVariable: {\n intervalsValueInput: 'data-testid interval variable intervals input',\n },\n },\n },\n },\n },\n Dashboards: {\n url: '/dashboards',\n /**\n * @deprecated use components.Search.dashboardItem from Grafana 8.3 instead\n */\n dashboards: (title: string) => `Dashboard search item ${title}`,\n },\n SaveDashboardAsModal: {\n newName: 'Save dashboard title field',\n save: 'Save dashboard button',\n },\n SaveDashboardModal: {\n save: 'Dashboard settings Save Dashboard Modal Save button',\n saveVariables: 'Dashboard settings Save Dashboard Modal Save variables checkbox',\n saveTimerange: 'Dashboard settings Save Dashboard Modal Save timerange checkbox',\n },\n SharePanelModal: {\n linkToRenderedImage: 'Link to rendered image',\n },\n ShareDashboardModal: {\n shareButton: 'Share dashboard or panel',\n PublicDashboard: {\n Tab: 'Tab Public Dashboard',\n WillBePublicCheckbox: 'data-testid public dashboard will be public checkbox',\n LimitedDSCheckbox: 'data-testid public dashboard limited datasources checkbox',\n CostIncreaseCheckbox: 'data-testid public dashboard cost may increase checkbox',\n EnableSwitch: 'data-testid public dashboard on off switch',\n SaveConfigButton: 'data-testid public dashboard save config button',\n CopyUrlInput: 'data-testid public dashboard copy url input',\n CopyUrlButton: 'data-testid public dashboard copy url button',\n TemplateVariablesWarningAlert: 'data-testid public dashboard disabled template variables alert',\n },\n },\n Explore: {\n url: '/explore',\n General: {\n container: 'data-testid Explore',\n graph: 'Explore Graph',\n table: 'Explore Table',\n scrollView: 'data-testid explorer scroll view',\n },\n },\n SoloPanel: {\n url: (page: string) => `/d-solo/${page}`,\n },\n PluginsList: {\n page: 'Plugins list page',\n list: 'Plugins list',\n listItem: 'Plugins list item',\n signatureErrorNotice: 'Unsigned plugins notice',\n },\n PluginPage: {\n page: 'Plugin page',\n signatureInfo: 'Plugin signature info',\n disabledInfo: 'Plugin disabled info',\n },\n PlaylistForm: {\n name: 'Playlist name',\n interval: 'Playlist interval',\n itemRow: 'Playlist item row',\n itemIdType: 'Playlist item dashboard by ID type',\n itemTagType: 'Playlist item dashboard by Tag type',\n itemMoveUp: 'Move playlist item order up',\n itemMoveDown: 'Move playlist item order down',\n itemDelete: 'Delete playlist item',\n },\n};\n","import React from 'react';\n\nimport { FieldConfigSource, PanelData } from '@grafana/data';\n\n/**\n * Describes the properties that can be passed to the PanelDataErrorView.\n *\n * @alpha\n */\nexport interface PanelDataErrorViewProps {\n message?: string;\n panelId: number;\n data: PanelData;\n fieldConfig?: FieldConfigSource;\n needsTimeField?: boolean;\n needsNumberField?: boolean;\n needsStringField?: boolean;\n // suggestions?: VisualizationSuggestion[]; <<< for sure optional\n}\n\n/**\n * Simplified type with defaults that describes the PanelDataErrorView.\n *\n * @internal\n */\nexport type PanelDataErrorViewType = React.ComponentType<PanelDataErrorViewProps>;\n\n/**\n * PanelDataErrorView allows panels to show a consistent error message when\n * the result structure does not meet expected criteria\n *\n * @alpha\n */\nexport let PanelDataErrorView: PanelDataErrorViewType = ({ message }) => {\n return <div>Unable to render data: {message}.</div>;\n};\n\n/**\n * Used to bootstrap the PanelDataErrorView during application start so the\n * PanelDataErrorView is exposed via runtime.\n *\n * @internal\n */\nexport function setPanelDataErrorView(renderer: PanelDataErrorViewType) {\n PanelDataErrorView = renderer;\n}\n","import React from 'react';\n\nimport { AbsoluteTimeRange, FieldConfigSource, PanelData } from '@grafana/data';\n\n/**\n * Describes the properties that can be passed to the PanelRenderer.\n *\n * @typeParam P - Panel options type for the panel being rendered.\n * @typeParam F - Field options type for the panel being rendered.\n *\n * @internal\n */\nexport interface PanelRendererProps<P extends object = any, F extends object = any> {\n data?: PanelData;\n pluginId: string;\n title: string;\n options?: Partial<P>;\n onOptionsChange?: (options: P) => void;\n onFieldConfigChange?: (config: FieldConfigSource<F>) => void;\n onChangeTimeRange?: (timeRange: AbsoluteTimeRange) => void;\n fieldConfig?: FieldConfigSource<Partial<F>>;\n timeZone?: string;\n width: number;\n height: number;\n}\n\n/**\n * Simplified type with defaults that describes the PanelRenderer.\n *\n * @internal\n */\nexport type PanelRendererType<P extends object = any, F extends object = any> = React.ComponentType<\n PanelRendererProps<P, F>\n>;\n\n/**\n * PanelRenderer component that will be set via the {@link setPanelRenderer} function\n * when Grafana starts. The implementation being used during runtime lives in Grafana\n * core.\n *\n * @internal\n */\nexport let PanelRenderer: PanelRendererType = () => {\n return <div>PanelRenderer can only be used after Grafana instance has been started.</div>;\n};\n\n/**\n * Used to bootstrap the PanelRenderer during application start so the PanelRenderer\n * is exposed via runtime.\n *\n * @internal\n */\nexport function setPanelRenderer(renderer: PanelRendererType) {\n PanelRenderer = renderer;\n}\n","import { merge } from 'lodash';\n\nimport {\n BootData,\n BuildInfo,\n createTheme,\n DataSourceInstanceSettings,\n FeatureToggles,\n GrafanaConfig,\n GrafanaTheme,\n GrafanaTheme2,\n LicenseInfo,\n MapLayerOptions,\n OAuthSettings,\n PanelPluginMeta,\n PreloadPlugin,\n systemDateFormats,\n SystemDateFormatSettings,\n} from '@grafana/data';\n\nexport interface AzureSettings {\n cloud?: string;\n managedIdentityEnabled: boolean;\n}\n\nexport class GrafanaBootConfig implements GrafanaConfig {\n isPublicDashboardView: boolean;\n datasources: { [str: string]: DataSourceInstanceSettings } = {};\n panels: { [key: string]: PanelPluginMeta } = {};\n minRefreshInterval = '';\n appUrl = '';\n appSubUrl = '';\n windowTitlePrefix = '';\n buildInfo: BuildInfo;\n newPanelTitle = '';\n bootData: BootData;\n externalUserMngLinkUrl = '';\n externalUserMngLinkName = '';\n externalUserMngInfo = '';\n allowOrgCreate = false;\n feedbackLinksEnabled = true;\n disableLoginForm = false;\n defaultDatasource = ''; // UID\n alertingEnabled = false;\n alertingErrorOrTimeout = '';\n alertingNoDataOrNullValues = '';\n alertingMinInterval = 1;\n angularSupportEnabled = false;\n authProxyEnabled = false;\n exploreEnabled = false;\n queryHistoryEnabled = false;\n helpEnabled = false;\n profileEnabled = false;\n ldapEnabled = false;\n jwtHeaderName = '';\n jwtUrlLogin = false;\n sigV4AuthEnabled = false;\n azureAuthEnabled = false;\n samlEnabled = false;\n samlName = '';\n autoAssignOrg = true;\n verifyEmailEnabled = false;\n oauth: OAuthSettings = {};\n rbacEnabled = true;\n rbacBuiltInRoleAssignmentEnabled = false;\n disableUserSignUp = false;\n loginHint = '';\n passwordHint = '';\n loginError = undefined;\n navTree: any;\n viewersCanEdit = false;\n editorsCanAdmin = false;\n disableSanitizeHtml = false;\n liveEnabled = true;\n theme: GrafanaTheme;\n theme2: GrafanaTheme2;\n pluginsToPreload: PreloadPlugin[] = [];\n featureToggles: FeatureToggles = {};\n licenseInfo: LicenseInfo = {} as LicenseInfo;\n rendererAvailable = false;\n dashboardPreviews: {\n systemRequirements: {\n met: boolean;\n requiredImageRendererPluginVersion: string;\n };\n thumbnailsExist: boolean;\n } = { systemRequirements: { met: false, requiredImageRendererPluginVersion: '' }, thumbnailsExist: false };\n rendererVersion = '';\n secretsManagerPluginEnabled = false;\n http2Enabled = false;\n dateFormats?: SystemDateFormatSettings;\n sentry = {\n enabled: false,\n dsn: '',\n customEndpoint: '',\n sampleRate: 1,\n };\n grafanaJavascriptAgent = {\n enabled: false,\n customEndpoint: '',\n apiKey: '',\n errorInstrumentalizationEnabled: true,\n consoleInstrumentalizationEnabled: false,\n webVitalsInstrumentalizationEnabled: false,\n };\n pluginCatalogURL = 'https://grafana.com/grafana/plugins/';\n pluginAdminEnabled = true;\n pluginAdminExternalManageEnabled = false;\n pluginCatalogHiddenPlugins: string[] = [];\n expressionsEnabled = false;\n customTheme?: any;\n awsAllowedAuthProviders: string[] = [];\n awsAssumeRoleEnabled = false;\n azure: AzureSettings = {\n managedIdentityEnabled: false,\n };\n caching = {\n enabled: false,\n };\n geomapDefaultBaseLayerConfig?: MapLayerOptions;\n geomapDisableCustomBaseLayer?: boolean;\n unifiedAlertingEnabled = false;\n unifiedAlerting = { minInterval: '' };\n applicationInsightsConnectionString?: string;\n applicationInsightsEndpointUrl?: string;\n recordedQueries = {\n enabled: true,\n };\n featureHighlights = {\n enabled: false,\n };\n reporting = {\n enabled: true,\n };\n googleAnalyticsId: undefined;\n rudderstackWriteKey: undefined;\n rudderstackDataPlaneUrl: undefined;\n rudderstackSdkUrl: undefined;\n rudderstackConfigUrl: undefined;\n\n constructor(options: GrafanaBootConfig) {\n const mode = options.bootData.user.lightTheme ? 'light' : 'dark';\n this.theme2 = createTheme({ colors: { mode } });\n this.theme = this.theme2.v1;\n this.bootData = options.bootData;\n this.isPublicDashboardView = options.bootData.settings.isPublicDashboardView;\n\n const defaults = {\n datasources: {},\n windowTitlePrefix: 'Grafana - ',\n panels: {},\n newPanelTitle: 'Panel Title',\n playlist_timespan: '1m',\n unsaved_changes_warning: true,\n appUrl: '',\n appSubUrl: '',\n buildInfo: {\n version: '1.0',\n commit: '1',\n env: 'production',\n },\n viewersCanEdit: false,\n editorsCanAdmin: false,\n disableSanitizeHtml: false,\n };\n\n merge(this, defaults, options);\n\n this.buildInfo = options.buildInfo || defaults.buildInfo;\n\n if (this.dateFormats) {\n systemDateFormats.update(this.dateFormats);\n }\n\n overrideFeatureTogglesFromUrl(this);\n\n // Special feature toggle that impact theme/component looks\n this.theme2.flags.topnav = this.featureToggles.topnav;\n }\n}\n\nfunction overrideFeatureTogglesFromUrl(config: GrafanaBootConfig) {\n if (window.location.href.indexOf('__feature') === -1) {\n return;\n }\n\n const params = new URLSearchParams(window.location.search);\n params.forEach((value, key) => {\n if (key.startsWith('__feature.')) {\n const featureName = key.substring(10);\n const toggleState = value === 'true';\n if (toggleState !== config.featureToggles[key]) {\n config.featureToggles[featureName] = toggleState;\n console.log(`Setting feature toggle ${featureName} = ${toggleState}`);\n }\n }\n });\n}\n\nconst bootData = (window as any).grafanaBootData || {\n settings: {},\n user: {},\n navTree: [],\n};\n\nconst options = bootData.settings;\noptions.bootData = bootData;\n\n/**\n * Use this to access the {@link GrafanaBootConfig} for the current running Grafana instance.\n *\n * @public\n */\nexport const config = new GrafanaBootConfig(options);\n","import { EchoEvent, EchoEventType } from '../services/EchoSrv';\n\n/**\n * Describes the basic dashboard information that can be passed as the meta\n * analytics payload.\n *\n * @public\n */\nexport interface DashboardInfo {\n dashboardId: number;\n dashboardUid: string;\n dashboardName: string;\n folderName?: string;\n}\n\n/**\n * Describes the data request information passed as the meta analytics payload.\n *\n * @public\n */\nexport interface DataRequestInfo extends Partial<DashboardInfo> {\n datasourceName: string;\n datasourceId: number;\n datasourceType: string;\n panelId?: number;\n panelName?: string;\n duration: number;\n error?: string;\n dataSize?: number;\n}\n\n/**\n * The meta analytics events that can be added to the echo service.\n *\n * @public\n */\nexport enum MetaAnalyticsEventName {\n DashboardView = 'dashboard-view',\n DataRequest = 'data-request',\n}\n\n/**\n * Describes the payload of a dashboard view event.\n *\n * @public\n */\nexport interface DashboardViewEventPayload extends DashboardInfo {\n eventName: MetaAnalyticsEventName.DashboardView;\n}\n\n/**\n * Describes the payload of a data request event.\n *\n * @public\n */\nexport interface DataRequestEventPayload extends DataRequestInfo {\n eventName: MetaAnalyticsEventName.DataRequest;\n totalQueries?: number;\n cachedQueries?: number;\n}\n\n/**\n * Describes the meta analytics payload passed with the {@link MetaAnalyticsEvent}\n *\n * @public\n */\nexport type MetaAnalyticsEventPayload = DashboardViewEventPayload | DataRequestEventPayload;\n\n/**\n * Describes meta analytics event with predefined {@link EchoEventType.EchoEventType} type.\n *\n * @public\n */\nexport interface MetaAnalyticsEvent extends EchoEvent<EchoEventType.MetaAnalytics, MetaAnalyticsEventPayload> {}\n\n/**\n * Describes the payload of a pageview event.\n *\n * @public\n */\nexport interface PageviewEchoEventPayload {\n page: string;\n}\n\n/**\n * Describes pageview event with predefined {@link EchoEventType.EchoEventType} type.\n *\n * @public\n */\nexport type PageviewEchoEvent = EchoEvent<EchoEventType.Pageview, PageviewEchoEventPayload>;\n\n/**\n * Describes the payload of a user interaction event.\n *\n * @public\n */\nexport interface InteractionEchoEventPayload {\n interactionName: string;\n properties?: Record<string, any>;\n}\n\n/**\n * Describes interaction event with predefined {@link EchoEventType.EchoEventType} type.\n *\n * @public\n */\nexport type InteractionEchoEvent = EchoEvent<EchoEventType.Interaction, InteractionEchoEventPayload>;\n\n/**\n * Describes the payload of an experimentview event.\n *\n * @public\n */\nexport interface ExperimentViewEchoEventPayload {\n experimentId: string;\n experimentGroup: string;\n experimentVariant: string;\n}\n\n/**\n * Describes experimentview event with predefined {@link EchoEventType.EchoEventType} type.\n *\n * @public\n */\nexport type ExperimentViewEchoEvent = EchoEvent<EchoEventType.ExperimentView, ExperimentViewEchoEventPayload>;\n\n/**\n * Pageview event typeguard.\n *\n * @public\n */\nexport const isPageviewEvent = (event: EchoEvent): event is PageviewEchoEvent => {\n return Boolean(event.payload.page);\n};\n\n/**\n * Interaction event typeguard.\n *\n * @public\n */\nexport const isInteractionEvent = (event: EchoEvent): event is InteractionEchoEvent => {\n return Boolean(event.payload.interactionName);\n};\n\n/**\n * Experimentview event typeguard.\n *\n * @public\n */\nexport const isExperimentViewEvent = (event: EchoEvent): event is ExperimentViewEchoEvent => {\n return Boolean(event.payload.experimentId);\n};\n","// @ts-ignore\nimport System from 'systemjs/dist/system.js';\n\nimport { config } from '../config';\n\n// @ts-ignore\n\n/**\n * Option to specify a plugin css that should be applied for the dark\n * and the light theme.\n *\n * @public\n */\nexport interface PluginCssOptions {\n light: string;\n dark: string;\n}\n\n/**\n * @internal\n */\nexport const SystemJS = System;\n\n/**\n * Use this to load css for a Grafana plugin by specifying a {@link PluginCssOptions}\n * containing styling for the dark and the light theme.\n *\n * @param options - plugin styling for light and dark theme.\n * @public\n */\nexport function loadPluginCss(options: PluginCssOptions): Promise<any> {\n const theme = config.bootData.user.lightTheme ? options.light : options.dark;\n return SystemJS.import(`${theme}!css`);\n}\n","import { config } from '../config';\nimport { locationService } from '../services';\nimport { getEchoSrv, EchoEventType } from '../services/EchoSrv';\nimport {\n ExperimentViewEchoEvent,\n InteractionEchoEvent,\n MetaAnalyticsEvent,\n MetaAnalyticsEventPayload,\n PageviewEchoEvent,\n} from '../types/analytics';\n\n/**\n * Helper function to report meta analytics to the {@link EchoSrv}.\n *\n * @public\n */\nexport const reportMetaAnalytics = (payload: MetaAnalyticsEventPayload) => {\n getEchoSrv().addEvent<MetaAnalyticsEvent>({\n type: EchoEventType.MetaAnalytics,\n payload,\n });\n};\n\n/**\n * Helper function to report pageview events to the {@link EchoSrv}.\n *\n * @public\n */\nexport const reportPageview = () => {\n const location = locationService.getLocation();\n const page = `${config.appSubUrl ?? ''}${location.pathname}${location.search}${location.hash}`;\n getEchoSrv().addEvent<PageviewEchoEvent>({\n type: EchoEventType.Pageview,\n payload: {\n page,\n },\n });\n};\n\n/**\n * Helper function to report interaction events to the {@link EchoSrv}.\n *\n * @public\n */\nexport const reportInteraction = (interactionName: string, properties?: Record<string, any>) => {\n getEchoSrv().addEvent<InteractionEchoEvent>({\n type: EchoEventType.Interaction,\n payload: {\n interactionName,\n properties,\n },\n });\n};\n\n/**\n * Helper function to report experimentview events to the {@link EchoSrv}.\n *\n * @public\n */\nexport const reportExperimentView = (id: string, group: string, variant: string) => {\n getEchoSrv().addEvent<ExperimentViewEchoEvent>({\n type: EchoEventType.ExperimentView,\n payload: {\n experimentId: id,\n experimentGroup: group,\n experimentVariant: variant,\n },\n });\n};\n","import { config } from '../config';\n\nexport const featureEnabled = (feature: string): boolean => {\n const { enabledFeatures } = config.licenseInfo;\n return enabledFeatures && enabledFeatures[feature];\n};\n","import { captureMessage, captureException, Severity as LogLevel } from '@sentry/browser';\n\nimport { agent, LogLevel as GrafanaLogLevel } from '@grafana/agent-web';\n\nimport { config } from '../config';\n\nexport { LogLevel };\n\n// a bit stricter than what Sentry allows\ntype Contexts = Record<string, Record<string, number | string | Record<string, string | number>>>;\n\n/**\n * Log a message at INFO level. Depending on configuration might be forwarded to backend and logged to stdout or sent to Sentry\n *\n * @public\n */\nexport function logInfo(message: string, contexts?: Contexts) {\n if (config.grafanaJavascriptAgent.enabled) {\n agent.api.pushLog([message], {\n level: GrafanaLogLevel.INFO,\n context: contexts,\n });\n }\n if (config.sentry.enabled) {\n captureMessage(message, {\n level: LogLevel.Info,\n contexts,\n });\n }\n}\n\n/**\n * Log a message at WARNING level. Depending on configuration might be forwarded to backend and logged to stdout or sent to Sentry\n *\n * @public\n */\nexport function logWarning(message: string, contexts?: Contexts) {\n if (config.grafanaJavascriptAgent.enabled) {\n agent.api.pushLog([message], {\n level: GrafanaLogLevel.WARN,\n context: contexts,\n });\n }\n if (config.sentry.enabled) {\n captureMessage(message, {\n level: LogLevel.Warning,\n contexts,\n });\n }\n}\n\n/**\n * Log a message at DEBUG level. Depending on configuration might be forwarded to backend and logged to stdout or sent to Sentry\n *\n * @public\n */\nexport function logDebug(message: string, contexts?: Contexts) {\n if (config.grafanaJavascriptAgent.enabled) {\n agent.api.pushLog([message], {\n level: GrafanaLogLevel.DEBUG,\n context: contexts,\n });\n }\n if (config.sentry.enabled) {\n captureMessage(message, {\n level: LogLevel.Debug,\n contexts,\n });\n }\n}\n\n/**\n * Log an error. Depending on configuration might be forwarded to backend and logged to stdout or sent to Sentry\n *\n * @public\n */\nexport function logError(err: Error, contexts?: Contexts) {\n if (config.grafanaJavascriptAgent.enabled) {\n agent.api.pushLog([err.message], {\n level: GrafanaLogLevel.ERROR,\n context: contexts,\n });\n }\n if (config.sentry.enabled) {\n captureException(err, { contexts });\n }\n}\n","import { QueryRunner } from '@grafana/data';\n\nlet factory: QueryRunnerFactory | undefined;\n\n/**\n * @internal\n */\nexport type QueryRunnerFactory = () => QueryRunner;\n\n/**\n * Used to bootstrap the {@link createQueryRunner} during application start.\n *\n * @internal\n */\nexport const setQueryRunnerFactory = (instance: QueryRunnerFactory): void => {\n if (factory) {\n throw new Error('Runner should only be set when Grafana is starting.');\n }\n factory = instance;\n};\n\n/**\n * Used to create QueryRunner instances from outside the core Grafana application.\n * This is helpful to be able to create a QueryRunner to execute queries in e.g. an app plugin.\n *\n * @internal\n */\nexport const createQueryRunner = (): QueryRunner => {\n if (!factory) {\n throw new Error('`createQueryRunner` can only be used after Grafana instance has started.');\n }\n return factory();\n};\n","// Libraries\nimport React, { PureComponent } from 'react';\n\n// Components\nimport {\n DataSourceInstanceSettings,\n DataSourceRef,\n getDataSourceUID,\n isUnsignedPluginSignature,\n SelectableValue,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { ActionMeta, HorizontalGroup, PluginSignatureBadge, Select } from '@grafana/ui';\n\nimport { getDataSourceSrv } from '../services/dataSourceSrv';\n\nimport { ExpressionDatasourceRef } from './../utils/DataSourceWithBackend';\n\n/**\n * Component props description for the {@link DataSourcePicker}\n *\n * @internal\n */\nexport interface DataSourcePickerProps {\n onChange: (ds: DataSourceInstanceSettings) => void;\n current: DataSourceRef | string | null; // uid\n hideTextValue?: boolean;\n onBlur?: () => void;\n autoFocus?: boolean;\n openMenuOnFocus?: boolean;\n placeholder?: string;\n tracing?: boolean;\n mixed?: boolean;\n dashboard?: boolean;\n metrics?: boolean;\n type?: string | string[];\n annotations?: boolean;\n variables?: boolean;\n alerting?: boolean;\n pluginId?: string;\n /** If true,we show only DSs with logs; and if true, pluginId shouldnt be passed in */\n logs?: boolean;\n // If set to true and there is no value select will be empty, otherwise it will preselect default data source\n noDefault?: boolean;\n width?: number;\n inputId?: string;\n filter?: (dataSource: DataSourceInstanceSettings) => boolean;\n onClear?: () => void;\n}\n\n/**\n * Component state description for the {@link DataSourcePicker}\n *\n * @internal\n */\nexport interface DataSourcePickerState {\n error?: string;\n}\n\n/**\n * Component to be able to select a datasource from the list of installed and enabled\n * datasources in the current Grafana instance.\n *\n * @internal\n */\nexport class DataSourcePicker extends PureComponent<DataSourcePickerProps, DataSourcePickerState> {\n dataSourceSrv = getDataSourceSrv();\n\n static defaultProps: Partial<DataSourcePickerProps> = {\n autoFocus: false,\n openMenuOnFocus: false,\n placeholder: 'Select data source',\n };\n\n state: DataSourcePickerState = {};\n\n constructor(props: DataSourcePickerProps) {\n super(props);\n }\n\n componentDidMount() {\n const { current } = this.props;\n const dsSettings = this.dataSourceSrv.getInstanceSettings(current);\n if (!dsSettings) {\n this.setState({ error: 'Could not find data source ' + current });\n }\n }\n\n onChange = (item: SelectableValue<string>, actionMeta: ActionMeta) => {\n if (actionMeta.action === 'clear' && this.props.onClear) {\n this.props.onClear();\n return;\n }\n\n const dsSettings = this.dataSourceSrv.getInstanceSettings(item.value);\n\n if (dsSettings) {\n this.props.onChange(dsSettings);\n this.setState({ error: undefined });\n }\n };\n\n private getCurrentValue(): SelectableValue<string> | undefined {\n const { current, hideTextValue, noDefault } = this.props;\n if (!current && noDefault) {\n return;\n }\n\n const ds = this.dataSourceSrv.getInstanceSettings(current);\n\n if (ds) {\n return {\n label: ds.name.slice(0, 37),\n value: ds.uid,\n imgUrl: ds.meta.info.logos.small,\n hideText: hideTextValue,\n meta: ds.meta,\n };\n }\n\n const uid = getDataSourceUID(current);\n\n if (uid === ExpressionDatasourceRef.uid || uid === ExpressionDatasourceRef.name) {\n return { label: uid, value: uid, hideText: hideTextValue };\n }\n\n return {\n label: (uid ?? 'no name') + ' - not found',\n value: uid ?? undefined,\n imgUrl: '',\n hideText: hideTextValue,\n };\n }\n\n getDataSourceOptions() {\n const { alerting, tracing, metrics, mixed, dashboard, variables, annotations, pluginId, type, filter, logs } =\n this.props;\n\n const options = this.dataSourceSrv\n .getList({\n alerting,\n tracing,\n metrics,\n logs,\n dashboard,\n mixed,\n variables,\n annotations,\n pluginId,\n filter,\n type,\n })\n .map((ds) => ({\n value: ds.name,\n label: `${ds.name}${ds.isDefault ? ' (default)' : ''}`,\n imgUrl: ds.meta.info.logos.small,\n meta: ds.meta,\n }));\n\n return options;\n }\n\n render() {\n const { autoFocus, onBlur, onClear, openMenuOnFocus, placeholder, width, inputId } = this.props;\n const { error } = this.state;\n const options = this.getDataSourceOptions();\n const value = this.getCurrentValue();\n const isClearable = typeof onClear === 'function';\n\n return (\n <div aria-label={selectors.components.DataSourcePicker.container}>\n <Select\n aria-label={selectors.components.DataSourcePicker.inputV2}\n inputId={inputId || 'data-source-picker'}\n className=\"ds-picker select-container\"\n isMulti={false}\n isClearable={isClearable}\n backspaceRemovesValue={false}\n onChange={this.onChange}\n options={options}\n autoFocus={autoFocus}\n onBlur={onBlur}\n width={width}\n openMenuOnFocus={openMenuOnFocus}\n maxMenuHeight={500}\n placeholder={placeholder}\n noOptionsMessage=\"No datasources found\"\n value={value ?? null}\n invalid={!!error}\n getOptionLabel={(o) => {\n if (o.meta && isUnsignedPluginSignature(o.meta.signature) && o !== value) {\n return (\n <HorizontalGroup align=\"center\" justify=\"space-between\">\n <span>{o.label}</span> <PluginSignatureBadge status={o.meta.signature} />\n </HorizontalGroup>\n );\n }\n return o.label || '';\n }}\n />\n </div>\n );\n }\n}\n","/**\n * Describes a size with width/height\n *\n * @public\n */\nexport interface SizeMeta {\n width: number;\n height: number;\n}\n\n/**\n * Describes the meta information that are sent together with each event.\n *\n * @public\n */\nexport interface EchoMeta {\n screenSize: SizeMeta;\n windowSize: SizeMeta;\n userAgent: string;\n url?: string;\n /**\n * A unique browser session\n */\n sessionId: string;\n /**\n * The current users username used to login into Grafana e.g. email.\n */\n userLogin: string;\n /**\n * The current users unique identifier.\n */\n userId: number;\n /**\n * True when user is logged in into Grafana.\n */\n userSignedIn: boolean;\n /**\n * A millisecond epoch\n */\n ts: number;\n /**\n * A highres timestamp since navigation start\n */\n timeSinceNavigationStart: number;\n}\n\n/**\n * Describes echo backends that can be registered to receive of events.\n *\n * @public\n */\nexport interface EchoBackend<T extends EchoEvent = any, O = any> {\n options: O;\n supportedEvents: EchoEventType[];\n flush: () => void;\n addEvent: (event: T) => void;\n}\n\n/**\n * Describes an echo event.\n *\n * @public\n */\nexport interface EchoEvent<T extends EchoEventType = any, P = any> {\n type: EchoEventType;\n /**\n * Event payload containing event specific data.\n */\n payload: P;\n meta: EchoMeta;\n}\n\n/**\n * Supported echo event types that can be sent via the {@link EchoSrv}.\n *\n * @public\n */\nexport enum EchoEventType {\n Performance = 'performance',\n MetaAnalytics = 'meta-analytics',\n Sentry = 'sentry',\n Pageview = 'pageview',\n Interaction = 'interaction',\n ExperimentView = 'experimentview',\n GrafanaJavascriptAgent = 'grafana-javascript-agent',\n}\n\n/**\n * Used to send events to all the registered backends. This should be accessed via the\n * {@link getEchoSrv} function. Will, by default, flush events to the backends every\n * 10s or when the flush function is triggered.\n *\n * @public\n */\nexport interface EchoSrv {\n /**\n * Call this to flush current events to the echo backends.\n */\n flush(): void;\n /**\n * Add a new echo backend to the list of backends that will receive events.\n */\n addBackend(backend: EchoBackend): void;\n /**\n * Call this to add event that will be sent to the echo backends upon next\n * flush.\n *\n * @param event - Object containing event information.\n * @param meta - Object that will extend/override the default meta object.\n */\n addEvent<T extends EchoEvent>(event: Omit<T, 'meta'>, meta?: {}): void;\n}\n\nlet singletonInstance: EchoSrv;\n\n/**\n * Used during startup by Grafana to set the EchoSrv so it is available\n * via the {@link getEchoSrv} to the rest of the application.\n *\n * @internal\n */\nexport function setEchoSrv(instance: EchoSrv) {\n singletonInstance = instance;\n}\n\n/**\n * Used to retrieve the {@link EchoSrv} that can be used to report events to registered\n * echo backends.\n *\n * @public\n */\nexport function getEchoSrv(): EchoSrv {\n return singletonInstance;\n}\n\n/**\n * Used to register echo backends that will receive Grafana echo events during application\n * runtime.\n *\n * @public\n */\nexport const registerEchoBackend = (backend: EchoBackend) => {\n getEchoSrv().addBackend(backend);\n};\n","import { ScopedVars, DataSourceApi, DataSourceInstanceSettings, DataSourceRef } from '@grafana/data';\n\n/**\n * This is the entry point for communicating with a datasource that is added as\n * a plugin (both external and internal). Via this service you will get access\n * to the {@link @grafana/data#DataSourceApi | DataSourceApi} that have a rich API for\n * communicating with the datasource.\n *\n * @public\n */\nexport interface DataSourceSrv {\n /**\n * Returns the requested dataSource. If it cannot be found it rejects the promise.\n * @param ref - The datasource identifier, typically an object with UID and type,\n * @param scopedVars - variables used to interpolate a templated passed as name.\n */\n get(ref?: DataSourceRef | string | null, scopedVars?: ScopedVars): Promise<DataSourceApi>;\n\n /**\n * Get a list of data sources\n */\n getList(filters?: GetDataSourceListFilters): DataSourceInstanceSettings[];\n\n /**\n * Get settings and plugin metadata by name or uid\n */\n getInstanceSettings(\n ref?: DataSourceRef | string | null,\n scopedVars?: ScopedVars\n ): DataSourceInstanceSettings | undefined;\n\n /**\n * Reloads the DataSourceSrv\n */\n reload(): void;\n}\n\n/** @public */\nexport interface GetDataSourceListFilters {\n /** Include mixed data source by setting this to true */\n mixed?: boolean;\n\n /** Only return data sources that support metrics response */\n metrics?: boolean;\n\n /** Only return data sources that support tracing response */\n tracing?: boolean;\n\n /** Only return data sources that support logging response */\n logs?: boolean;\n\n /** Only return data sources that support annotations */\n annotations?: boolean;\n\n /** Only filter data sources that support alerting */\n alerting?: boolean;\n\n /**\n * By default only data sources that can be queried will be returned. Meaning they have tracing,\n * metrics, logs or annotations flag set in plugin.json file\n * */\n all?: boolean;\n\n /** Set to true to return dashboard data source */\n dashboard?: boolean;\n\n /** Set to true to return data source variables */\n variables?: boolean;\n\n /** filter list by plugin */\n pluginId?: string;\n\n /** apply a function to filter */\n filter?: (dataSource: DataSourceInstanceSettings) => boolean;\n\n /** Only returns datasources matching the specified types (ie. Loki, Prometheus) */\n type?: string | string[];\n}\n\nlet singletonInstance: DataSourceSrv;\n\n/**\n * Used during startup by Grafana to set the DataSourceSrv so it is available\n * via the {@link getDataSourceSrv} to the rest of the application.\n *\n * @internal\n */\nexport function setDataSourceSrv(instance: DataSourceSrv) {\n singletonInstance = instance;\n}\n\n/**\n * Used to retrieve the {@link DataSourceSrv} that is the entry point for communicating with\n * a datasource that is added as a plugin (both external and internal).\n *\n * @public\n */\nexport function getDataSourceSrv(): DataSourceSrv {\n return singletonInstance;\n}\n","import { Observable } from 'rxjs';\n\n/**\n * Used to initiate a remote call via the {@link BackendSrv}\n *\n * @public\n */\nexport type BackendSrvRequest = {\n /**\n * Request URL\n */\n url: string;\n\n /**\n * Number of times to retry the remote call if it fails.\n */\n retry?: number;\n\n /**\n * HTTP headers that should be passed along with the remote call.\n * Please have a look at {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API | Fetch API}\n * for supported headers.\n */\n headers?: Record<string, any>;\n\n /**\n * HTTP verb to perform in the remote call GET, POST, PUT etc.\n */\n method?: string;\n\n /**\n * Set to false an success application alert box will not be shown for successful PUT, DELETE, POST requests\n */\n showSuccessAlert?: boolean;\n\n /**\n * Set to false to not show an application alert box for request errors\n */\n showErrorAlert?: boolean;\n\n /**\n * Provided by the initiator to identify a particular remote call. An example\n * of this is when a datasource plugin triggers a query. If the request id already\n * exist the backendSrv will try to cancel and replace the previous call with the\n * new one.\n */\n requestId?: string;\n\n /**\n * Set to to true to not include call in query inspector\n */\n hideFromInspector?: boolean;\n\n /**\n * The data to send\n */\n data?: any;\n\n /**\n * Query params\n */\n params?: Record<string, any>;\n\n /**\n * Define how the response object should be parsed. See:\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Sending_and_Receiving_Binary_Data\n *\n * By default values are json parsed from text\n */\n responseType?: 'json' | 'text' | 'arraybuffer' | 'blob';\n\n /**\n * The credentials read-only property of the Request interface indicates whether the user agent should send cookies from the other domain in the case of cross-origin requests.\n */\n credentials?: RequestCredentials;\n\n /**\n * @deprecated withCredentials is deprecated in favor of credentials\n */\n withCredentials?: boolean;\n};\n\n/**\n * Response for fetch function in {@link BackendSrv}\n *\n * @public\n */\nexport interface FetchResponse<T = any> {\n data: T;\n readonly status: number;\n readonly statusText: string;\n readonly ok: boolean;\n readonly headers: Headers;\n readonly redirected: boolean;\n readonly type: ResponseType;\n readonly url: string;\n readonly config: BackendSrvRequest;\n}\n\n/**\n * Error type for fetch function in {@link BackendSrv}\n *\n * @public\n */\nexport interface FetchErrorDataProps {\n message?: string;\n status?: string;\n error?: string | any;\n}\n\n/**\n * Error type for fetch function in {@link BackendSrv}\n *\n * @public\n */\nexport interface FetchError<T = any> {\n status: number;\n statusText?: string;\n data: T;\n cancelled?: boolean;\n isHandled?: boolean;\n config: BackendSrvRequest;\n}\n\nexport function isFetchError(e: unknown): e is FetchError {\n return typeof e === 'object' && e !== null && 'status' in e && 'data' in e;\n}\n\n/**\n * Used to communicate via http(s) to a remote backend such as the Grafana backend,\n * a datasource etc. The BackendSrv is using the {@link https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API | Fetch API}\n * under the hood to handle all the communication.\n *\n * The request function can be used to perform a remote call by specifying a {@link BackendSrvRequest}.\n * To make the BackendSrv a bit easier to use we have added a couple of shorthand functions that will\n * use default values executing the request.\n *\n * @remarks\n * By default, Grafana displays an error message alert if the remote call fails. To prevent this from\n * happening `showErrorAlert = true` on the options object.\n *\n * @public\n */\nexport interface BackendSrv {\n get<T = any>(url: string, params?: any, requestId?: string): Promise<T>;\n delete<T = any>(url: string, data?: any): Promise<T>;\n post<T = any>(url: string, data?: any): Promise<T>;\n patch<T = any>(url: string, data?: any): Promise<T>;\n put<T = any>(url: string, data?: any): Promise<T>;\n\n /**\n * @deprecated Use the fetch function instead. If you prefer to work with a promise\n * wrap the Observable returned by fetch with the lastValueFrom function.\n */\n request<T = any>(options: BackendSrvRequest): Promise<T>;\n\n /**\n * Special function used to communicate with datasources that will emit core\n * events that the Grafana QueryInspector and QueryEditor is listening for to be able\n * to display datasource query information. Can be skipped by adding `option.silent`\n * when initializing the request.\n *\n * @deprecated Use the fetch function instead\n */\n datasourceRequest<T = any>(options: BackendSrvRequest): Promise<FetchResponse<T>>;\n\n /**\n * Observable http request interface\n */\n fetch<T>(options: BackendSrvRequest): Observable<FetchResponse<T>>;\n}\n\nlet singletonInstance: BackendSrv;\n\n/**\n * Used during startup by Grafana to set the BackendSrv so it is available\n * via the {@link getBackendSrv} to the rest of the application.\n *\n * @internal\n */\nexport const setBackendSrv = (instance: BackendSrv) => {\n singletonInstance = instance;\n};\n\n/**\n * Used to retrieve the {@link BackendSrv} that can be used to communicate\n * via http(s) to a remote backend such as the Grafana backend, a datasource etc.\n *\n * @public\n */\nexport const getBackendSrv = (): BackendSrv => singletonInstance;\n","/**\n * Used to enable rendering of Angular components within a\n * React component without losing proper typings.\n *\n * @example\n * ```typescript\n * class Component extends PureComponent<Props> {\n * element: HTMLElement;\n * angularComponent: AngularComponent;\n *\n * componentDidMount() {\n * const template = '<angular-component />' // angular template here;\n * const scopeProps = { ctrl: angularController }; // angular scope properties here\n * const loader = getAngularLoader();\n * this.angularComponent = loader.load(this.element, scopeProps, template);\n * }\n *\n * componentWillUnmount() {\n * if (this.angularComponent) {\n * this.angularComponent.destroy();\n * }\n * }\n *\n * render() {\n * return (\n * <div ref={element => (this.element = element)} />\n * );\n * }\n * }\n * ```\n *\n * @public\n */\nexport interface AngularComponent {\n /**\n * Should be called when the React component will unmount.\n */\n destroy(): void;\n /**\n * Can be used to trigger a re-render of the Angular component.\n */\n digest(): void;\n /**\n * Used to access the Angular scope from the React component.\n */\n getScope(): any;\n}\n\n/**\n * Used to load an Angular component from the context of a React component.\n * Please see the {@link AngularComponent} for a proper example.\n *\n * @public\n */\nexport interface AngularLoader {\n /**\n *\n * @param elem - the element that the Angular component will be loaded into.\n * @param scopeProps - values that will be accessed via the Angular scope.\n * @param template - template used by the Angular component.\n */\n load(elem: any, scopeProps: any, template: string): AngularComponent;\n}\n\nlet instance: AngularLoader;\n\n/**\n * Used during startup by Grafana to set the AngularLoader so it is available\n * via the {@link getAngularLoader} to the rest of the application.\n *\n * @internal\n */\nexport function setAngularLoader(v: AngularLoader) {\n instance = v;\n}\n\n/**\n * Used to retrieve the {@link AngularLoader} that enables the use of Angular\n * components within a React component.\n *\n * Please see the {@link AngularComponent} for a proper example.\n *\n * @public\n */\nexport function getAngularLoader(): AngularLoader {\n return instance;\n}\n","import { UrlQueryMap } from '@grafana/data';\n\n/**\n * @public\n * @deprecated in favor of {@link locationService} and will be removed in Grafana 9\n */\nexport interface LocationUpdate {\n /**\n * Target path where you automatically wants to navigate the user.\n */\n path?: string;\n\n /**\n * Specify this value if you want to add values to the query string of the URL.\n */\n query?: UrlQueryMap;\n\n /**\n * If set to true, the query argument will be added to the existing URL.\n */\n partial?: boolean;\n\n /**\n * Used internally to sync the Redux state from Angular to make sure that the Redux location\n * state is in sync when navigating using the Angular router.\n *\n * @remarks\n * Do not change this unless you are the Angular router.\n *\n * @internal\n */\n routeParams?: UrlQueryMap;\n\n /*\n * If set to true, this will replace URL state (ie. cause no new browser history).\n */\n replace?: boolean;\n}\n\n/**\n * If you need to automatically navigate the user to a new place in the application this should\n * be done via the LocationSrv and it will make sure to update the application state accordingly.\n *\n * @public\n * @deprecated in favor of {@link locationService} and will be removed in Grafana 9\n */\nexport interface LocationSrv {\n update(options: LocationUpdate): void;\n}\n\nlet singletonInstance: LocationSrv;\n\n/**\n * Used during startup by Grafana to set the LocationSrv so it is available\n * via the {@link getLocationSrv} to the rest of the application.\n *\n * @internal\n */\nexport function setLocationSrv(instance: LocationSrv) {\n singletonInstance = instance;\n}\n\n/**\n * Used to retrieve the {@link LocationSrv} that can be used to automatically navigate\n * the user to a new place in Grafana.\n *\n * @public\n * @deprecated in favor of {@link locationService} and will be removed in Grafana 9\n */\nexport function getLocationSrv(): LocationSrv {\n return singletonInstance;\n}\n","import { VariableModel, ScopedVars, TimeRange } from '@grafana/data';\n\n/**\n * Via the TemplateSrv consumers get access to all the available template variables\n * that can be used within the current active dashboard.\n *\n * For a more in-depth description visit: https://grafana.com/docs/grafana/latest/reference/templating\n * @public\n */\nexport interface TemplateSrv {\n /**\n * List the dashboard variables\n */\n getVariables(): VariableModel[];\n\n /**\n * Replace the values within the target string. See also {@link InterpolateFunction}\n */\n replace(target?: string, scopedVars?: ScopedVars, format?: string | Function): string;\n\n /**\n * Checks if a target contains template variables.\n */\n containsTemplate(target?: string): boolean;\n\n /**\n * Update the current time range to be used when interpolating __from / __to variables.\n */\n updateTimeRange(timeRange: TimeRange): void;\n}\n\nlet singletonInstance: TemplateSrv;\n\n/**\n * Used during startup by Grafana to set the TemplateSrv so it is available\n * via the {@link getTemplateSrv} to the rest of the application.\n *\n * @internal\n */\nexport const setTemplateSrv = (instance: TemplateSrv) => {\n singletonInstance = instance;\n};\n\n/**\n * Used to retrieve the {@link TemplateSrv} that can be used to fetch available\n * template variables.\n *\n * @public\n */\nexport const getTemplateSrv = (): TemplateSrv => singletonInstance;\n","import { auto } from 'angular';\n\nlet singleton: auto.IInjectorService;\n\n/**\n * Used during startup by Grafana to temporarily expose the angular injector to\n * pure javascript plugins using {@link getLegacyAngularInjector}.\n *\n * @internal\n */\nexport const setLegacyAngularInjector = (instance: auto.IInjectorService) => {\n singleton = instance;\n};\n\n/**\n * WARNING: this function provides a temporary way for plugins to access anything in the\n * angular injector. While the migration from angular to react continues, there are a few\n * options that do not yet have good alternatives. Note that use of this function will\n * be removed in the future.\n *\n * @beta\n */\nexport const getLegacyAngularInjector = (): auto.IInjectorService => singleton;\n","import * as H from 'history';\n\nimport { deprecationWarning, UrlQueryMap, urlUtil } from '@grafana/data';\nimport { attachDebugger, createLogger } from '@grafana/ui';\n\nimport { config } from '../config';\n\nimport { LocationUpdate } from './LocationSrv';\n\n/**\n * @public\n * A wrapper to help work with browser location and history\n */\nexport interface LocationService {\n partial: (query: Record<string, any>, replace?: boolean) => void;\n push: (location: H.Path | H.LocationDescriptor<any>) => void;\n replace: (location: H.Path | H.LocationDescriptor<any>) => void;\n reload: () => void;\n getLocation: () => H.Location;\n getHistory: () => H.History;\n getSearch: () => URLSearchParams;\n getSearchObject: () => UrlQueryMap;\n\n /**\n * This is from the old LocationSrv interface\n * @deprecated use partial, push or replace instead */\n update: (update: LocationUpdate) => void;\n}\n\n/** @internal */\nexport class HistoryWrapper implements LocationService {\n private readonly history: H.History;\n\n constructor(history?: H.History) {\n // If no history passed create an in memory one if being called from test\n this.history =\n history ||\n (process.env.NODE_ENV === 'test'\n ? H.createMemoryHistory({ initialEntries: ['/'] })\n : H.createBrowserHistory({ basename: config.appSubUrl ?? '/' }));\n\n this.partial = this.partial.bind(this);\n this.push = this.push.bind(this);\n this.replace = this.replace.bind(this);\n this.getSearch = this.getSearch.bind(this);\n this.getHistory = this.getHistory.bind(this);\n this.getLocation = this.getLocation.bind(this);\n }\n\n getHistory() {\n return this.history;\n }\n\n getSearch() {\n return new URLSearchParams(this.history.location.search);\n }\n\n partial(query: Record<string, any>, replace?: boolean) {\n const currentLocation = this.history.location;\n const newQuery = this.getSearchObject();\n\n for (const key of Object.keys(query)) {\n // removing params with null | undefined\n if (query[key] === null || query[key] === undefined) {\n delete newQuery[key];\n } else {\n newQuery[key] = query[key];\n }\n }\n\n const updatedUrl = urlUtil.renderUrl(currentLocation.pathname, newQuery);\n\n if (replace) {\n this.history.replace(updatedUrl, this.history.location.state);\n } else {\n this.history.push(updatedUrl, this.history.location.state);\n }\n }\n\n push(location: H.Path | H.LocationDescriptor) {\n this.history.push(location);\n }\n\n replace(location: H.Path | H.LocationDescriptor) {\n this.history.replace(location);\n }\n\n reload() {\n const prevState = (this.history.location.state as any)?.routeReloadCounter;\n this.history.replace({\n ...this.history.location,\n state: { routeReloadCounter: prevState ? prevState + 1 : 1 },\n });\n }\n\n getLocation() {\n return this.history.location;\n }\n\n getSearchObject() {\n return locationSearchToObject(this.history.location.search);\n }\n\n /** @deprecated use partial, push or replace instead */\n update(options: LocationUpdate) {\n deprecationWarning('LocationSrv', 'update', 'partial, push or replace');\n if (options.partial && options.query) {\n this.partial(options.query, options.partial);\n } else {\n const newLocation: H.LocationDescriptor = {\n pathname: options.path,\n };\n if (options.query) {\n newLocation.search = urlUtil.toUrlParams(options.query);\n }\n if (options.replace) {\n this.replace(newLocation);\n } else {\n this.push(newLocation);\n }\n }\n }\n}\n\n/**\n * @public\n * Parses a location search string to an object\n * */\nexport function locationSearchToObject(search: string | number): UrlQueryMap {\n let queryString = typeof search === 'number' ? String(search) : search;\n\n if (queryString.length > 0) {\n if (queryString.startsWith('?')) {\n return urlUtil.parseKeyValue(queryString.substring(1));\n }\n return urlUtil.parseKeyValue(queryString);\n }\n\n return {};\n}\n\n/**\n * @public\n */\nexport let locationService: LocationService = new HistoryWrapper();\n\n/**\n * Used for tests only\n * @internal\n */\nexport const setLocationService = (location: LocationService) => {\n if (process.env.NODE_ENV !== 'test') {\n throw new Error('locationService can be only overriden in test environment');\n }\n locationService = location;\n};\n\nconst navigationLog = createLogger('Router');\n\n/** @internal */\nexport const navigationLogger = navigationLog.logger;\n\n// For debugging purposes the location service is attached to global _debug variable\nattachDebugger('location', locationService, navigationLog);\n","import { BusEventBase, BusEventWithPayload, EventBus, GrafanaTheme2, PanelModel, TimeRange } from '@grafana/data';\n\n/**\n * Called when a dashboard is refreshed\n *\n * @public\n */\nexport class RefreshEvent extends BusEventBase {\n static type = 'refresh';\n}\n\n/**\n * Called when the theme settings change\n *\n * @public\n */\nexport class ThemeChangedEvent extends BusEventWithPayload<GrafanaTheme2> {\n static type = 'theme-changed';\n}\n\n/**\n * Called when time range is updated\n *\n * @public\n */\nexport class TimeRangeUpdatedEvent extends BusEventWithPayload<TimeRange> {\n static type = 'time-range-updated';\n}\n\n/**\n * Called to copy a panel JSON into local storage\n *\n * @public\n */\nexport class CopyPanelEvent extends BusEventWithPayload<PanelModel> {\n static type = 'copy-panel';\n}\n\n// Internal singleton instance\nlet singletonInstance: EventBus;\n\n/**\n * Used during startup by Grafana to set the setAppEvents so it is available\n * via the {@link setAppEvents} to the rest of the application.\n *\n * @internal\n */\nexport function setAppEvents(instance: EventBus) {\n singletonInstance = instance;\n}\n\n/**\n * Used to retrieve an event bus that manages application level events\n *\n * @public\n */\nexport function getAppEvents(): EventBus {\n return singletonInstance;\n}\n","import { Observable } from 'rxjs';\n\nimport {\n DataFrameJSON,\n DataQueryRequest,\n DataQueryResponse,\n LiveChannelAddress,\n LiveChannelEvent,\n LiveChannelPresenceStatus,\n} from '@grafana/data';\n\n/**\n * @alpha -- experimental\n */\nexport interface LiveDataFilter {\n fields?: string[];\n}\n\n/**\n * Indicate if the frame is appened or replace\n *\n * @alpha\n */\nexport enum StreamingFrameAction {\n Append = 'append',\n Replace = 'replace',\n}\n\n/**\n * @alpha\n */\nexport interface StreamingFrameOptions {\n maxLength: number; // 1000\n maxDelta: number; // how long to keep things\n action: StreamingFrameAction; // default will append\n\n /** optionally format field names based on labels */\n displayNameFormat?: string;\n}\n\n/**\n * @alpha\n */\nexport interface LiveDataStreamOptions {\n addr: LiveChannelAddress;\n frame?: DataFrameJSON; // initial results\n key?: string;\n buffer?: Partial<StreamingFrameOptions>;\n filter?: LiveDataFilter;\n}\n\n/**\n * @alpha -- experimental: send a normal query request over websockt\n */\nexport interface LiveQueryDataOptions {\n request: DataQueryRequest;\n body: any; // processed queries, same as sent to `/api/query/ds`\n}\n\n/**\n * @alpha -- experimental\n */\nexport interface GrafanaLiveSrv {\n /**\n * Listen for changes to the main service\n */\n getConnectionState(): Observable<boolean>;\n\n /**\n * Watch for messages in a channel\n */\n getStream<T>(address: LiveChannelAddress): Observable<LiveChannelEvent<T>>;\n\n /**\n * Connect to a channel and return results as DataFrames\n */\n getDataStream(options: LiveDataStreamOptions): Observable<DataQueryResponse>;\n\n /**\n * Execute a query over the live websocket and potentiall subscribe to a live channel.\n *\n * Since the initial request and subscription are on the same socket, this will support HA setups\n *\n * @alpha -- this function requires the feature toggle `queryOverLive` to be set\n */\n getQueryData(options: LiveQueryDataOptions): Observable<DataQueryResponse>;\n\n /**\n * For channels that support presence, this will request the current state from the server.\n *\n * Join and leave messages will be sent to the open stream\n */\n getPresence(address: LiveChannelAddress): Promise<LiveChannelPresenceStatus>;\n\n /**\n * Publish into a channel\n *\n * @alpha -- experimental\n */\n publish(address: LiveChannelAddress, data: any): Promise<any>;\n}\n\nlet singletonInstance: GrafanaLiveSrv;\n\n/**\n * Used during startup by Grafana to set the GrafanaLiveSrv so it is available\n * via the {@link getGrafanaLiveSrv} to the rest of the application.\n *\n * @internal\n */\nexport const setGrafanaLiveSrv = (instance: GrafanaLiveSrv) => {\n singletonInstance = instance;\n};\n\n/**\n * Used to retrieve the GrafanaLiveSrv that allows you to subscribe to\n * server side events and streams\n *\n * @alpha -- experimental\n */\nexport const getGrafanaLiveSrv = (): GrafanaLiveSrv => singletonInstance;\n","import { merge, Observable, of } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\n\nimport {\n DataSourceApi,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataQuery,\n DataSourceJsonData,\n ScopedVars,\n makeClassES5Compatible,\n DataFrame,\n parseLiveChannelAddress,\n getDataSourceRef,\n DataSourceRef,\n dataFrameToJSON,\n} from '@grafana/data';\n\nimport { config } from '../config';\nimport {\n getBackendSrv,\n getDataSourceSrv,\n getGrafanaLiveSrv,\n StreamingFrameOptions,\n StreamingFrameAction,\n} from '../services';\n\nimport { BackendDataSourceResponse, toDataQueryResponse } from './queryResponse';\n\n/**\n * @internal\n */\nexport const ExpressionDatasourceRef = Object.freeze({\n type: '__expr__',\n uid: '__expr__',\n name: 'Expression',\n});\n\n/**\n * @internal\n */\nexport function isExpressionReference(ref?: DataSourceRef | string | null): boolean {\n if (!ref) {\n return false;\n }\n const v = (ref as any).type ?? ref;\n return v === ExpressionDatasourceRef.type || v === '-100'; // -100 was a legacy accident that should be removed\n}\n\nexport class HealthCheckError extends Error {\n details: HealthCheckResultDetails;\n\n constructor(message: string, details: HealthCheckResultDetails) {\n super(message);\n this.details = details;\n this.name = 'HealthCheckError';\n }\n}\n\n/**\n * Describes the current health status of a data source plugin.\n *\n * @public\n */\nexport enum HealthStatus {\n Unknown = 'UNKNOWN',\n OK = 'OK',\n Error = 'ERROR',\n}\n\n/**\n * Describes the details in the payload returned when checking the health of a data source\n * plugin.\n *\n * If the 'message' key exists, this will be displayed in the error message in DataSourceSettingsPage\n * If the 'verboseMessage' key exists, this will be displayed in the expandable details in the error message in DataSourceSettingsPage\n *\n * @public\n */\nexport type HealthCheckResultDetails = Record<string, any> | undefined;\n\n/**\n * Describes the payload returned when checking the health of a data source\n * plugin.\n *\n * @public\n */\nexport interface HealthCheckResult {\n status: HealthStatus;\n message: string;\n details: HealthCheckResultDetails;\n}\n\n/**\n * Extend this class to implement a data source plugin that is depending on the Grafana\n * backend API.\n *\n * @public\n */\nclass DataSourceWithBackend<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n constructor(instanceSettings: DataSourceInstanceSettings<TOptions>) {\n super(instanceSettings);\n }\n\n /**\n * Ideally final -- any other implementation may not work as expected\n */\n query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse> {\n const { intervalMs, maxDataPoints, range, requestId } = request;\n let targets = request.targets;\n\n if (this.filterQuery) {\n targets = targets.filter((q) => this.filterQuery!(q));\n }\n\n const queries = targets.map((q) => {\n let datasource = this.getRef();\n let datasourceId = this.id;\n\n if (isExpressionReference(q.datasource)) {\n return {\n ...q,\n datasource: ExpressionDatasourceRef,\n };\n }\n\n if (q.datasource) {\n const ds = getDataSourceSrv().getInstanceSettings(q.datasource, request.scopedVars);\n\n if (!ds) {\n throw new Error(`Unknown Datasource: ${JSON.stringify(q.datasource)}`);\n }\n\n datasource = ds.rawRef ?? getDataSourceRef(ds);\n datasourceId = ds.id;\n }\n\n return {\n ...this.applyTemplateVariables(q, request.scopedVars),\n datasource,\n datasourceId, // deprecated!\n intervalMs,\n maxDataPoints,\n };\n });\n\n // Return early if no queries exist\n if (!queries.length) {\n return of({ data: [] });\n }\n\n const body: any = { queries };\n\n if (range) {\n body.range = range;\n body.from = range.from.valueOf().toString();\n body.to = range.to.valueOf().toString();\n }\n\n if (config.featureToggles.queryOverLive) {\n return getGrafanaLiveSrv().getQueryData({\n request,\n body,\n });\n }\n\n return getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: '/api/ds/query',\n method: 'POST',\n data: body,\n requestId,\n })\n .pipe(\n switchMap((raw) => {\n const rsp = toDataQueryResponse(raw, queries as DataQuery[]);\n // Check if any response should subscribe to a live stream\n if (rsp.data?.length && rsp.data.find((f: DataFrame) => f.meta?.channel)) {\n return toStreamingDataResponse(rsp, request, this.streamOptionsProvider);\n }\n return of(rsp);\n }),\n catchError((err) => {\n return of(toDataQueryResponse(err));\n })\n );\n }\n\n /**\n * Apply template variables for explore\n */\n interpolateVariablesInQueries(queries: TQuery[], scopedVars: ScopedVars | {}): TQuery[] {\n return queries.map((q) => this.applyTemplateVariables(q, scopedVars) as TQuery);\n }\n\n /**\n * Override to apply template variables. The result is usually also `TQuery`, but sometimes this can\n * be used to modify the query structure before sending to the backend.\n *\n * NOTE: if you do modify the structure or use template variables, alerting queries may not work\n * as expected\n *\n * @virtual\n */\n applyTemplateVariables(query: TQuery, scopedVars: ScopedVars): Record<string, any> {\n return query;\n }\n\n /**\n * Optionally override the streaming behavior\n */\n streamOptionsProvider: StreamOptionsProvider<TQuery> = standardStreamOptionsProvider;\n\n /**\n * Make a GET request to the datasource resource path\n */\n async getResource(path: string, params?: any): Promise<any> {\n return getBackendSrv().get(`/api/datasources/${this.id}/resources/${path}`, params);\n }\n\n /**\n * Send a POST request to the datasource resource path\n */\n async postResource(path: string, body?: any): Promise<any> {\n return getBackendSrv().post(`/api/datasources/${this.id}/resources/${path}`, { ...body });\n }\n\n /**\n * Run the datasource healthcheck\n */\n async callHealthCheck(): Promise<HealthCheckResult> {\n return getBackendSrv()\n .request({ method: 'GET', url: `/api/datasources/${this.id}/health`, showErrorAlert: false })\n .then((v) => {\n return v as HealthCheckResult;\n })\n .catch((err) => {\n return err.data as HealthCheckResult;\n });\n }\n\n /**\n * Checks the plugin health\n * see public/app/features/datasources/state/actions.ts for what needs to be returned here\n */\n async testDatasource(): Promise<any> {\n return this.callHealthCheck().then((res) => {\n if (res.status === HealthStatus.OK) {\n return {\n status: 'success',\n message: res.message,\n };\n }\n\n throw new HealthCheckError(res.message, res.details);\n });\n }\n}\n\n/**\n * @internal exported for tests\n */\nexport function toStreamingDataResponse<TQuery extends DataQuery = DataQuery>(\n rsp: DataQueryResponse,\n req: DataQueryRequest<TQuery>,\n getter: (req: DataQueryRequest<TQuery>, frame: DataFrame) => Partial<StreamingFrameOptions>\n): Observable<DataQueryResponse> {\n const live = getGrafanaLiveSrv();\n if (!live) {\n return of(rsp); // add warning?\n }\n\n const staticdata: DataFrame[] = [];\n const streams: Array<Observable<DataQueryResponse>> = [];\n for (const f of rsp.data) {\n const addr = parseLiveChannelAddress(f.meta?.channel);\n if (addr) {\n const frame = f as DataFrame;\n streams.push(\n live.getDataStream({\n addr,\n buffer: getter(req, frame),\n frame: dataFrameToJSON(f),\n })\n );\n } else {\n staticdata.push(f);\n }\n }\n if (staticdata.length) {\n streams.push(of({ ...rsp, data: staticdata }));\n }\n if (streams.length === 1) {\n return streams[0]; // avoid merge wrapper\n }\n return merge(...streams);\n}\n\n/**\n * This allows data sources to customize the streaming connection query\n *\n * @public\n */\nexport type StreamOptionsProvider<TQuery extends DataQuery = DataQuery> = (\n request: DataQueryRequest<TQuery>,\n frame: DataFrame\n) => Partial<StreamingFrameOptions>;\n\n/**\n * @public\n */\nexport const standardStreamOptionsProvider: StreamOptionsProvider = (request: DataQueryRequest, frame: DataFrame) => {\n const opts: Partial<StreamingFrameOptions> = {\n maxLength: request.maxDataPoints ?? 500,\n action: StreamingFrameAction.Append,\n };\n\n // For recent queries, clamp to the current time range\n if (request.rangeRaw?.to === 'now') {\n opts.maxDelta = request.range.to.valueOf() - request.range.from.valueOf();\n }\n return opts;\n};\n\n//@ts-ignore\nDataSourceWithBackend = makeClassES5Compatible(DataSourceWithBackend);\n\nexport { DataSourceWithBackend };\n","import {\n DataQueryResponse,\n KeyValue,\n LoadingState,\n DataQueryError,\n TimeSeries,\n TableData,\n toDataFrame,\n DataFrame,\n MetricFindValue,\n FieldType,\n DataQuery,\n DataFrameJSON,\n dataFrameFromJSON,\n QueryResultMetaNotice,\n} from '@grafana/data';\n\nimport { FetchError, FetchResponse } from '../services';\n\nimport { toDataQueryError } from './toDataQueryError';\n\nexport const cachedResponseNotice: QueryResultMetaNotice = { severity: 'info', text: 'Cached response' };\n\n/**\n * Single response object from a backend data source. Properties are optional but response should contain at least\n * an error or a some data (but can contain both). Main way to send data is with dataframes attribute as series and\n * tables data attributes are legacy formats.\n *\n * @internal\n */\nexport interface DataResponse {\n error?: string;\n refId?: string;\n frames?: DataFrameJSON[];\n\n // Legacy TSDB format...\n series?: TimeSeries[];\n tables?: TableData[];\n}\n\n/**\n * This is the type of response expected form backend datasource.\n *\n * @internal\n */\nexport interface BackendDataSourceResponse {\n results: KeyValue<DataResponse>;\n}\n\n/**\n * Parse the results from /api/ds/query into a DataQueryResponse\n *\n * @param res - the HTTP response data.\n * @param queries - optional DataQuery array that will order the response based on the order of query refId's.\n *\n * @public\n */\nexport function toDataQueryResponse(\n res:\n | { data: BackendDataSourceResponse | undefined }\n | FetchResponse<BackendDataSourceResponse | undefined>\n | DataQueryError,\n queries?: DataQuery[]\n): DataQueryResponse {\n const rsp: DataQueryResponse = { data: [], state: LoadingState.Done };\n // If the response isn't in a correct shape we just ignore the data and pass empty DataQueryResponse.\n if ((res as FetchResponse).data?.results) {\n const results = (res as FetchResponse).data.results;\n const refIDs = queries?.length ? queries.map((q) => q.refId) : Object.keys(results);\n const cachedResponse = isCachedResponse(res as FetchResponse);\n const data: DataResponse[] = [];\n\n for (const refId of refIDs) {\n const dr = results[refId];\n if (!dr) {\n continue;\n }\n dr.refId = refId;\n data.push(dr);\n }\n\n for (const dr of data) {\n if (dr.error) {\n if (!rsp.error) {\n rsp.error = {\n refId: dr.refId,\n message: dr.error,\n };\n rsp.state = LoadingState.Error;\n }\n }\n\n if (dr.frames?.length) {\n for (let js of dr.frames) {\n if (cachedResponse) {\n js = addCacheNotice(js);\n }\n const df = dataFrameFromJSON(js);\n if (!df.refId) {\n df.refId = dr.refId;\n }\n rsp.data.push(df);\n }\n continue; // the other tests are legacy\n }\n\n if (dr.series?.length) {\n for (const s of dr.series) {\n if (!s.refId) {\n s.refId = dr.refId;\n }\n rsp.data.push(toDataFrame(s));\n }\n }\n\n if (dr.tables?.length) {\n for (const s of dr.tables) {\n if (!s.refId) {\n s.refId = dr.refId;\n }\n rsp.data.push(toDataFrame(s));\n }\n }\n }\n }\n\n // When it is not an OK response, make sure the error gets added\n if ((res as FetchResponse).status && (res as FetchResponse).status !== 200) {\n if (rsp.state !== LoadingState.Error) {\n rsp.state = LoadingState.Error;\n }\n if (!rsp.error) {\n rsp.error = toDataQueryError(res as DataQueryError);\n }\n }\n\n return rsp;\n}\n\nfunction isCachedResponse(res: FetchResponse<BackendDataSourceResponse | undefined>): boolean {\n const headers = res?.headers;\n if (!headers || !headers.get) {\n return false;\n }\n return headers.get('X-Cache') === 'HIT';\n}\n\nfunction addCacheNotice(frame: DataFrameJSON): DataFrameJSON {\n return {\n ...frame,\n schema: {\n ...frame.schema,\n fields: [...(frame.schema?.fields ?? [])],\n meta: {\n ...frame.schema?.meta,\n notices: [...(frame.schema?.meta?.notices ?? []), cachedResponseNotice],\n isCachedResponse: true,\n },\n },\n };\n}\n\n/**\n * Data sources using api/ds/query to test data sources can use this function to\n * handle errors and convert them to TestingStatus object.\n *\n * If possible, this should be avoided in favor of implementing /health endpoint\n * and testing data source with DataSourceWithBackend.testDataSource()\n *\n * Re-thrown errors are handled by testDataSource() in public/app/features/datasources/state/actions.ts\n *\n * @returns {TestingStatus}\n */\nexport function toTestingStatus(err: FetchError): any {\n const queryResponse = toDataQueryResponse(err);\n // POST api/ds/query errors returned as { message: string, error: string } objects\n if (queryResponse.error?.data?.message) {\n return {\n status: 'error',\n message: queryResponse.error.data.message,\n details: queryResponse.error?.data?.error ? { message: queryResponse.error.data.error } : undefined,\n };\n }\n // POST api/ds/query errors returned in results object\n else if (queryResponse.error?.refId && queryResponse.error?.message) {\n return {\n status: 'error',\n message: queryResponse.error.message,\n };\n }\n\n throw err;\n}\n\n/**\n * Return the first string or non-time field as the value\n *\n * @beta\n */\nexport function frameToMetricFindValue(frame: DataFrame): MetricFindValue[] {\n if (!frame || !frame.length) {\n return [];\n }\n\n const values: MetricFindValue[] = [];\n let field = frame.fields.find((f) => f.type === FieldType.string);\n if (!field) {\n field = frame.fields.find((f) => f.type !== FieldType.time);\n }\n if (field) {\n for (let i = 0; i < field.values.length; i++) {\n values.push({ text: '' + field.values.get(i) });\n }\n }\n return values;\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\n\nexport enum AxisPlacement {\n Auto = 'auto',\n Bottom = 'bottom',\n Hidden = 'hidden',\n Left = 'left',\n Right = 'right',\n Top = 'top',\n}\n\nexport enum AxisColorMode {\n Series = 'series',\n Text = 'text',\n}\n\nexport enum VisibilityMode {\n Always = 'always',\n Auto = 'auto',\n Never = 'never',\n}\n\nexport enum GraphDrawStyle {\n Bars = 'bars',\n Line = 'line',\n Points = 'points',\n}\n\nexport enum GraphTransform {\n Constant = 'constant',\n NegativeY = 'negative-Y',\n}\n\nexport enum LineInterpolation {\n Linear = 'linear',\n Smooth = 'smooth',\n StepAfter = 'stepAfter',\n StepBefore = 'stepBefore',\n}\n\nexport enum ScaleDistribution {\n Linear = 'linear',\n Log = 'log',\n Ordinal = 'ordinal',\n}\n\nexport enum GraphGradientMode {\n Hue = 'hue',\n None = 'none',\n Opacity = 'opacity',\n Scheme = 'scheme',\n}\n\nexport enum StackingMode {\n None = 'none',\n Normal = 'normal',\n Percent = 'percent',\n}\n\nexport enum BarAlignment {\n After = 1,\n Before = -1,\n Center = 0,\n}\n\nexport enum ScaleOrientation {\n Horizontal = 0,\n Vertical = 1,\n}\n\nexport enum ScaleDirection {\n Down = -1,\n Left = -1,\n Right = 1,\n Up = 1,\n}\n\nexport interface LineStyle {\n dash?: number[];\n fill?: ('solid' | 'dash' | 'dot' | 'square');\n}\n\nexport const defaultLineStyle: Partial<LineStyle> = {\n dash: [],\n};\n\nexport interface LineConfig {\n lineColor?: string;\n lineInterpolation?: LineInterpolation;\n lineStyle?: LineStyle;\n lineWidth?: number;\n spanNulls?: (boolean | number);\n}\n\nexport interface BarConfig {\n barAlignment?: BarAlignment;\n barMaxWidth?: number;\n barWidthFactor?: number;\n}\n\nexport interface FillConfig {\n fillBelowTo?: string;\n fillColor?: string;\n fillOpacity?: number;\n}\n\nexport interface PointsConfig {\n pointColor?: string;\n pointSize?: number;\n pointSymbol?: string;\n showPoints?: VisibilityMode;\n}\n\nexport interface ScaleDistributionConfig {\n log?: number;\n type: ScaleDistribution;\n}\n\nexport interface AxisConfig {\n axisCenteredZero?: boolean;\n axisColorMode?: AxisColorMode;\n axisGridShow?: boolean;\n axisLabel?: string;\n axisPlacement?: AxisPlacement;\n axisSoftMax?: number;\n axisSoftMin?: number;\n axisWidth?: number;\n scaleDistribution?: ScaleDistributionConfig;\n}\n\nexport interface HideSeriesConfig {\n legend: boolean;\n tooltip: boolean;\n viz: boolean;\n}\n\nexport interface StackingConfig {\n group?: string;\n mode?: StackingMode;\n}\n\nexport interface StackableFieldConfig {\n stacking?: StackingConfig;\n}\n\nexport interface HideableFieldConfig {\n hideFrom?: HideSeriesConfig;\n}\n\nexport enum GraphTresholdsStyleMode {\n Area = 'area',\n Line = 'line',\n LineAndArea = 'line+area',\n Off = 'off',\n Series = 'series',\n}\n\nexport interface GraphThresholdsStyleConfig {\n mode: GraphTresholdsStyleMode;\n}\n\nexport type LegendPlacement = ('bottom' | 'right');\n\nexport enum LegendDisplayMode {\n List = 'list',\n Table = 'table',\n}\n\nexport interface TableSortByFieldState {\n desc?: boolean;\n displayName: string;\n}\n\nexport interface SingleStatBaseOptions extends OptionsWithTextFormatting {\n orientation: VizOrientation;\n reduceOptions: ReduceDataOptions;\n}\n\nexport interface ReduceDataOptions {\n calcs: string[];\n fields?: string;\n limit?: number;\n values?: boolean;\n}\n\nexport const defaultReduceDataOptions: Partial<ReduceDataOptions> = {\n calcs: [],\n};\n\nexport enum VizOrientation {\n Auto = 'auto',\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n}\n\nexport interface OptionsWithTooltip {\n tooltip: VizTooltipOptions;\n}\n\nexport interface OptionsWithLegend {\n legend: VizLegendOptions;\n}\n\nexport interface OptionsWithTimezones {\n timezones?: string[];\n}\n\nexport const defaultOptionsWithTimezones: Partial<OptionsWithTimezones> = {\n timezones: [],\n};\n\nexport interface OptionsWithTextFormatting {\n text?: VizTextDisplayOptions;\n}\n\nexport enum BigValueColorMode {\n Background = 'background',\n None = 'none',\n Value = 'value',\n}\n\nexport enum BigValueGraphMode {\n Area = 'area',\n Line = 'line',\n None = 'none',\n}\n\nexport enum BigValueJustifyMode {\n Auto = 'auto',\n Center = 'center',\n}\n\nexport enum BigValueTextMode {\n Auto = 'auto',\n Name = 'name',\n None = 'none',\n Value = 'value',\n ValueAndName = 'value_and_name',\n}\n\nexport type FieldTextAlignment = ('auto' | 'left' | 'right' | 'center');\n\nexport enum TableCellDisplayMode {\n Auto = 'auto',\n BasicGauge = 'basic',\n ColorBackground = 'color-background',\n ColorBackgroundSolid = 'color-background-solid',\n ColorText = 'color-text',\n GradientGauge = 'gradient-gauge',\n Image = 'image',\n JSONView = 'json-view',\n LcdGauge = 'lcd-gauge',\n}\n\nexport interface VizTextDisplayOptions {\n titleSize?: number;\n valueSize?: number;\n}\n\nexport enum TooltipDisplayMode {\n Multi = 'multi',\n None = 'none',\n Single = 'single',\n}\n\nexport enum SortOrder {\n Ascending = 'asc',\n Descending = 'desc',\n None = 'none',\n}\n\nexport interface GraphFieldConfig extends LineConfig, FillConfig, PointsConfig, AxisConfig, BarConfig, StackableFieldConfig, HideableFieldConfig {\n drawStyle?: GraphDrawStyle;\n gradientMode?: GraphGradientMode;\n thresholdsStyle?: GraphThresholdsStyleConfig;\n transform?: GraphTransform;\n}\n\nexport interface VizLegendOptions {\n asTable?: boolean;\n calcs: string[];\n displayMode: LegendDisplayMode;\n isVisible?: boolean;\n placement: LegendPlacement;\n showLegend: boolean;\n sortBy?: string;\n sortDesc?: boolean;\n width?: number;\n}\n\nexport const defaultVizLegendOptions: Partial<VizLegendOptions> = {\n calcs: [],\n};\n\nexport enum BarGaugeDisplayMode {\n Basic = 'basic',\n Gradient = 'gradient',\n Lcd = 'lcd',\n}\n\nexport interface TableFieldOptions {\n align: FieldTextAlignment;\n displayMode: TableCellDisplayMode;\n filterable?: boolean;\n hidden?: boolean;\n inspect: boolean;\n minWidth?: number;\n width?: number;\n}\n\nexport const defaultTableFieldOptions: Partial<TableFieldOptions> = {\n align: 'auto',\n displayMode: TableCellDisplayMode.Auto,\n inspect: false,\n};\n\nexport interface VizTooltipOptions {\n mode: TooltipDisplayMode;\n sort: SortOrder;\n}\n","import { css, cx } from '@emotion/css';\nimport { useId } from '@react-aria/utils';\nimport React, { HTMLAttributes, ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useTheme2 } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { Button } from '../Button/Button';\nimport { Icon } from '../Icon/Icon';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport type AlertVariant = 'success' | 'warning' | 'error' | 'info';\n\nexport interface Props extends HTMLAttributes<HTMLDivElement> {\n title: string;\n /** On click handler for alert button, mostly used for dismissing the alert */\n onRemove?: (event: React.MouseEvent) => void;\n severity?: AlertVariant;\n children?: ReactNode;\n elevated?: boolean;\n buttonContent?: React.ReactNode | string;\n bottomSpacing?: number;\n topSpacing?: number;\n}\n\nexport function getIconFromSeverity(severity: AlertVariant): string {\n switch (severity) {\n case 'error':\n case 'warning':\n return 'exclamation-triangle';\n case 'info':\n return 'info-circle';\n case 'success':\n return 'check';\n default:\n return '';\n }\n}\n\nexport const Alert = React.forwardRef<HTMLDivElement, Props>(\n (\n {\n title,\n onRemove,\n children,\n buttonContent,\n elevated,\n bottomSpacing,\n topSpacing,\n className,\n severity = 'error',\n ...restProps\n },\n ref\n ) => {\n const theme = useTheme2();\n const styles = getStyles(theme, severity, elevated, bottomSpacing, topSpacing);\n const titleId = useId();\n\n return (\n <div\n ref={ref}\n className={cx(styles.alert, className)}\n data-testid={selectors.components.Alert.alertV2(severity)}\n role=\"alert\"\n aria-labelledby={titleId}\n {...restProps}\n >\n <div className={styles.icon}>\n <Icon size=\"xl\" name={getIconFromSeverity(severity) as IconName} />\n </div>\n <div className={styles.body}>\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n {children && <div className={styles.content}>{children}</div>}\n </div>\n {/* If onRemove is specified, giving preference to onRemove */}\n {onRemove && !buttonContent && (\n <div className={styles.close}>\n <IconButton aria-label=\"Close alert\" name=\"times\" onClick={onRemove} size=\"lg\" type=\"button\" />\n </div>\n )}\n {onRemove && buttonContent && (\n <div className={styles.buttonWrapper}>\n <Button aria-label=\"Close alert\" variant=\"secondary\" onClick={onRemove} type=\"button\">\n {buttonContent}\n </Button>\n </div>\n )}\n </div>\n );\n }\n);\n\nAlert.displayName = 'Alert';\n\nconst getStyles = (\n theme: GrafanaTheme2,\n severity: AlertVariant,\n elevated?: boolean,\n bottomSpacing?: number,\n topSpacing?: number\n) => {\n const color = theme.colors[severity];\n const borderRadius = theme.shape.borderRadius();\n\n return {\n alert: css`\n flex-grow: 1;\n position: relative;\n border-radius: ${borderRadius};\n display: flex;\n flex-direction: row;\n align-items: stretch;\n background: ${theme.colors.background.secondary};\n box-shadow: ${elevated ? theme.shadows.z3 : theme.shadows.z1};\n margin-bottom: ${theme.spacing(bottomSpacing ?? 2)};\n margin-top: ${theme.spacing(topSpacing ?? 0)};\n\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n background: ${theme.colors.background.primary};\n z-index: -1;\n }\n `,\n icon: css`\n padding: ${theme.spacing(2, 3)};\n background: ${color.main};\n border-radius: ${borderRadius} 0 0 ${borderRadius};\n color: ${color.contrastText};\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n title: css`\n font-weight: ${theme.typography.fontWeightMedium};\n color: ${theme.colors.text.primary};\n `,\n body: css`\n color: ${theme.colors.text.secondary};\n padding: ${theme.spacing(2)};\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow-wrap: break-word;\n word-break: break-word;\n `,\n content: css`\n color: ${theme.colors.text.secondary};\n padding-top: ${theme.spacing(1)};\n max-height: 50vh;\n overflow-y: auto;\n `,\n buttonWrapper: css`\n padding: ${theme.spacing(1)};\n background: none;\n display: flex;\n align-items: center;\n `,\n close: css`\n padding: ${theme.spacing(2, 1)};\n background: none;\n display: flex;\n `,\n };\n};\n","import { css, CSSObject, cx } from '@emotion/css';\nimport React, { AnchorHTMLAttributes, ButtonHTMLAttributes } from 'react';\n\nimport { colorManipulator, GrafanaTheme2, ThemeRichColor } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\nimport { IconName } from '../../types/icon';\nimport { ComponentSize } from '../../types/size';\nimport { getPropertiesForButtonSize } from '../Forms/commonStyles';\nimport { Icon } from '../Icon/Icon';\nimport { PopoverContent, Tooltip, TooltipPlacement } from '../Tooltip';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'success';\nexport const allButtonVariants: ButtonVariant[] = ['primary', 'secondary', 'destructive'];\nexport type ButtonFill = 'solid' | 'outline' | 'text';\nexport const allButtonFills: ButtonFill[] = ['solid', 'outline', 'text'];\n\ntype CommonProps = {\n size?: ComponentSize;\n variant?: ButtonVariant;\n fill?: ButtonFill;\n icon?: IconName;\n className?: string;\n children?: React.ReactNode;\n fullWidth?: boolean;\n type?: string;\n /** Tooltip content to display on hover */\n tooltip?: PopoverContent;\n /** Position of the tooltip */\n tooltipPlacement?: TooltipPlacement;\n};\n\nexport type ButtonProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n fill = 'solid',\n icon,\n fullWidth,\n children,\n className,\n type = 'button',\n ...otherProps\n },\n ref\n ) => {\n const theme = useTheme2();\n const styles = getButtonStyles({\n theme,\n size,\n variant,\n fill,\n fullWidth,\n iconOnly: !children,\n });\n\n return (\n <button className={cx(styles.button, className)} type={type} {...otherProps} ref={ref}>\n {icon && <Icon name={icon} size={size} className={styles.icon} />}\n {children && <span className={styles.content}>{children}</span>}\n </button>\n );\n }\n);\n\nButton.displayName = 'Button';\n\ntype ButtonLinkProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement> & AnchorHTMLAttributes<HTMLAnchorElement>;\n\nexport const LinkButton = React.forwardRef<HTMLAnchorElement, ButtonLinkProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n fill = 'solid',\n icon,\n fullWidth,\n children,\n className,\n onBlur,\n onFocus,\n disabled,\n tooltip,\n tooltipPlacement,\n ...otherProps\n },\n ref\n ) => {\n const theme = useTheme2();\n const styles = getButtonStyles({\n theme,\n fullWidth,\n size,\n variant,\n fill,\n iconOnly: !children,\n });\n\n const linkButtonStyles = cx(\n styles.button,\n {\n [css(styles.disabled, {\n pointerEvents: 'none',\n })]: disabled,\n },\n className\n );\n\n const button = (\n <a className={linkButtonStyles} {...otherProps} tabIndex={disabled ? -1 : 0} ref={ref}>\n {icon && <Icon name={icon} size={size} className={styles.icon} />}\n {children && <span className={styles.content}>{children}</span>}\n </a>\n );\n\n if (tooltip) {\n return (\n <Tooltip content={tooltip} placement={tooltipPlacement}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n }\n);\n\nLinkButton.displayName = 'LinkButton';\n\nexport interface StyleProps {\n size: ComponentSize;\n variant: ButtonVariant;\n fill?: ButtonFill;\n iconOnly?: boolean;\n theme: GrafanaTheme2;\n fullWidth?: boolean;\n narrow?: boolean;\n}\n\nexport const getButtonStyles = (props: StyleProps) => {\n const { theme, variant, fill = 'solid', size, iconOnly, fullWidth } = props;\n const { height, padding, fontSize } = getPropertiesForButtonSize(size, theme);\n const variantStyles = getPropertiesForVariant(theme, variant, fill);\n const disabledStyles = getPropertiesForDisabled(theme, variant, fill);\n const focusStyle = getFocusStyles(theme);\n const paddingMinusBorder = theme.spacing.gridSize * padding - 1;\n\n return {\n button: css({\n label: 'button',\n display: 'inline-flex',\n alignItems: 'center',\n fontSize: fontSize,\n fontWeight: theme.typography.fontWeightMedium,\n fontFamily: theme.typography.fontFamily,\n padding: `0 ${paddingMinusBorder}px`,\n height: theme.spacing(height),\n // Deduct border from line-height for perfect vertical centering on windows and linux\n lineHeight: `${theme.spacing.gridSize * height - 2}px`,\n verticalAlign: 'middle',\n cursor: 'pointer',\n borderRadius: theme.shape.borderRadius(1),\n '&:focus': focusStyle,\n '&:focus-visible': focusStyle,\n '&:focus:not(:focus-visible)': getMouseFocusStyles(theme),\n ...(fullWidth && {\n flexGrow: 1,\n justifyContent: 'center',\n }),\n ...variantStyles,\n ':disabled': disabledStyles,\n '&[disabled]': disabledStyles,\n }),\n disabled: css(disabledStyles),\n img: css`\n width: 16px;\n height: 16px;\n margin: ${theme.spacing(0, 1, 0, 0.5)};\n `,\n icon: iconOnly\n ? css({\n // Important not to set margin bottom here as it would override internal icon bottom margin\n marginRight: theme.spacing(-padding / 2),\n marginLeft: theme.spacing(-padding / 2),\n })\n : css({\n marginRight: theme.spacing(padding / 2),\n }),\n content: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n white-space: nowrap;\n height: 100%;\n `,\n };\n};\n\nfunction getButtonVariantStyles(theme: GrafanaTheme2, color: ThemeRichColor, fill: ButtonFill): CSSObject {\n if (fill === 'outline') {\n return {\n background: 'transparent',\n color: color.text,\n border: `1px solid ${color.border}`,\n transition: theme.transitions.create(['background-color', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n '&:hover': {\n background: colorManipulator.alpha(color.main, theme.colors.action.hoverOpacity),\n borderColor: theme.colors.emphasize(color.border, 0.25),\n color: color.text,\n },\n };\n }\n\n if (fill === 'text') {\n return {\n background: 'transparent',\n color: color.text,\n border: '1px solid transparent',\n transition: theme.transitions.create(['background-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n '&:focus': {\n outline: 'none',\n textDecoration: 'none',\n },\n\n '&:hover': {\n background: colorManipulator.alpha(color.shade, theme.colors.action.hoverOpacity),\n textDecoration: 'none',\n },\n };\n }\n\n return {\n background: color.main,\n color: color.contrastText,\n border: `1px solid transparent`,\n transition: theme.transitions.create(['background-color', 'box-shadow', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n '&:hover': {\n background: color.shade,\n color: color.contrastText,\n boxShadow: theme.shadows.z1,\n },\n };\n}\n\nfunction getPropertiesForDisabled(theme: GrafanaTheme2, variant: ButtonVariant, fill: ButtonFill) {\n const disabledStyles: CSSObject = {\n cursor: 'not-allowed',\n boxShadow: 'none',\n color: theme.colors.text.disabled,\n transition: 'none',\n };\n\n if (fill === 'text') {\n return {\n ...disabledStyles,\n background: 'transparent',\n border: `1px solid transparent`,\n };\n }\n\n if (fill === 'outline') {\n return {\n ...disabledStyles,\n background: 'transparent',\n border: `1px solid ${theme.colors.action.disabledText}`,\n };\n }\n\n return {\n ...disabledStyles,\n background: theme.colors.action.disabledBackground,\n border: `1px solid transparent`,\n };\n}\n\nexport function getPropertiesForVariant(theme: GrafanaTheme2, variant: ButtonVariant, fill: ButtonFill) {\n switch (variant) {\n case 'secondary':\n return getButtonVariantStyles(theme, theme.colors.secondary, fill);\n\n case 'destructive':\n return getButtonVariantStyles(theme, theme.colors.error, fill);\n\n case 'success':\n return getButtonVariantStyles(theme, theme.colors.success, fill);\n\n case 'primary':\n default:\n return getButtonVariantStyles(theme, theme.colors.primary, fill);\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React, { forwardRef, HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\nexport interface Props extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n}\n\nexport const ButtonGroup = forwardRef<HTMLDivElement, Props>(({ className, children, ...rest }, ref) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div ref={ref} className={cx('button-group', styles.wrapper, className)} {...rest}>\n {children}\n </div>\n );\n});\n\nButtonGroup.displayName = 'ButtonGroup';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n display: flex;\n\n > .button-group:not(:first-child) > button,\n > button:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n > .button-group:not(:last-child) > button,\n > button:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-right-width: 0;\n }\n `,\n});\n","import React, { PureComponent, createRef } from 'react';\n\nexport interface Props {\n /**\n * Callback to trigger when clicking outside of current element occurs.\n */\n onClick: () => void;\n /**\n * Runs the 'onClick' function when pressing a key outside of the current element. Defaults to true.\n */\n includeButtonPress: boolean;\n /** Object to attach the click event listener to. */\n parent: Window | Document;\n /**\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener. Defaults to false.\n */\n useCapture?: boolean;\n}\n\ninterface State {\n hasEventListener: boolean;\n}\n\nexport class ClickOutsideWrapper extends PureComponent<Props, State> {\n static defaultProps = {\n includeButtonPress: true,\n parent: typeof window !== 'undefined' ? window : null,\n useCapture: false,\n };\n myRef = createRef<HTMLDivElement>();\n state = {\n hasEventListener: false,\n };\n\n componentDidMount() {\n this.props.parent.addEventListener('click', this.onOutsideClick, this.props.useCapture);\n if (this.props.includeButtonPress) {\n // Use keyup since keydown already has an event listener on window\n this.props.parent.addEventListener('keyup', this.onOutsideClick, this.props.useCapture);\n }\n }\n\n componentWillUnmount() {\n this.props.parent.removeEventListener('click', this.onOutsideClick, this.props.useCapture);\n if (this.props.includeButtonPress) {\n this.props.parent.removeEventListener('keyup', this.onOutsideClick, this.props.useCapture);\n }\n }\n\n onOutsideClick = (event: any) => {\n const domNode = this.myRef.current;\n\n if (!domNode || !domNode.contains(event.target)) {\n this.props.onClick();\n }\n };\n\n render() {\n return <div ref={this.myRef}>{this.props.children}</div>;\n }\n}\n","import { css } from '@emotion/css';\nimport { useFocusRing } from '@react-aria/focus';\nimport React from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\n\n/** @internal */\nexport enum ColorSwatchVariant {\n Small = 'small',\n Large = 'large',\n}\n\n/** @internal */\nexport interface Props extends React.HTMLAttributes<HTMLDivElement> {\n color: string;\n label?: string;\n variant?: ColorSwatchVariant;\n isSelected?: boolean;\n}\n\n/** @internal */\nexport const ColorSwatch = React.forwardRef<HTMLDivElement, Props>(\n ({ color, label, variant = ColorSwatchVariant.Small, isSelected, 'aria-label': ariaLabel, ...otherProps }, ref) => {\n const theme = useTheme2();\n const { isFocusVisible, focusProps } = useFocusRing();\n const styles = getStyles(theme, variant, color, isFocusVisible, isSelected);\n const hasLabel = !!label;\n const colorLabel = `${ariaLabel || label} color`;\n\n return (\n <div ref={ref} className={styles.wrapper} data-testid={selectors.components.ColorSwatch.name} {...otherProps}>\n {hasLabel && <span className={styles.label}>{label}</span>}\n <button className={styles.swatch} {...focusProps} aria-label={colorLabel} />\n </div>\n );\n }\n);\n\nconst getStyles = (\n theme: GrafanaTheme2,\n variant: ColorSwatchVariant,\n color: string,\n isFocusVisible: boolean,\n isSelected?: boolean\n) => {\n const tc = tinycolor(color);\n const isSmall = variant === ColorSwatchVariant.Small;\n const swatchSize = isSmall ? '16px' : '32px';\n let border = 'none';\n\n if (tc.getAlpha() < 0.1) {\n border = `2px solid ${theme.colors.border.medium}`;\n }\n\n return {\n wrapper: css({\n display: 'flex',\n alignItems: 'center',\n cursor: 'pointer',\n }),\n label: css({\n marginRight: theme.spacing(1),\n }),\n swatch: css({\n width: swatchSize,\n height: swatchSize,\n background: `${color}`,\n border,\n borderRadius: '50%',\n outlineOffset: '1px',\n outline: isFocusVisible ? `2px solid ${theme.colors.primary.main}` : 'none',\n boxShadow: isSelected\n ? `inset 0 0 0 2px ${color}, inset 0 0 0 4px ${theme.colors.getContrastText(color)}`\n : 'none',\n transition: theme.transitions.create(['transform'], {\n duration: theme.transitions.duration.short,\n }),\n '&:hover': {\n transform: 'scale(1.1)',\n },\n }),\n };\n};\n\nColorSwatch.displayName = 'ColorSwatch';\n","import { css } from '@emotion/css';\nimport classNames from 'classnames';\nimport React, { FC, RefCallback, useCallback, useEffect, useRef } from 'react';\nimport Scrollbars, { positionValues } from 'react-custom-scrollbars-2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\nexport type ScrollbarPosition = positionValues;\n\ninterface Props {\n className?: string;\n testId?: string;\n autoHide?: boolean;\n autoHideTimeout?: number;\n autoHeightMax?: string;\n hideTracksWhenNotNeeded?: boolean;\n hideHorizontalTrack?: boolean;\n hideVerticalTrack?: boolean;\n scrollRefCallback?: RefCallback<HTMLDivElement>;\n scrollTop?: number;\n setScrollTop?: (position: ScrollbarPosition) => void;\n autoHeightMin?: number | string;\n updateAfterMountMs?: number;\n}\n\n/**\n * Wraps component into <Scrollbars> component from `react-custom-scrollbars`\n */\nexport const CustomScrollbar: FC<Props> = ({\n autoHide = false,\n autoHideTimeout = 200,\n setScrollTop,\n className,\n testId,\n autoHeightMin = '0',\n autoHeightMax = '100%',\n hideTracksWhenNotNeeded = false,\n hideHorizontalTrack,\n hideVerticalTrack,\n scrollRefCallback,\n updateAfterMountMs,\n scrollTop,\n children,\n}) => {\n const ref = useRef<Scrollbars & { view: HTMLDivElement }>(null);\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n if (ref.current && scrollRefCallback) {\n scrollRefCallback(ref.current.view);\n }\n }, [ref, scrollRefCallback]);\n\n useEffect(() => {\n if (ref.current && scrollTop != null) {\n ref.current.scrollTop(scrollTop);\n }\n }, [scrollTop]);\n\n /**\n * Special logic for doing a update a few milliseconds after mount to check for\n * updated height due to dynamic content\n */\n useEffect(() => {\n if (!updateAfterMountMs) {\n return;\n }\n setTimeout(() => {\n const scrollbar = ref.current as any;\n if (scrollbar?.update) {\n scrollbar.update();\n }\n }, updateAfterMountMs);\n }, [updateAfterMountMs]);\n\n function renderTrack(className: string, hideTrack: boolean | undefined, passedProps: any) {\n if (passedProps.style && hideTrack) {\n passedProps.style.display = 'none';\n }\n\n return <div {...passedProps} className={className} />;\n }\n\n const renderTrackHorizontal = useCallback(\n (passedProps: any) => {\n return renderTrack('track-horizontal', hideHorizontalTrack, passedProps);\n },\n [hideHorizontalTrack]\n );\n\n const renderTrackVertical = useCallback(\n (passedProps: any) => {\n return renderTrack('track-vertical', hideVerticalTrack, passedProps);\n },\n [hideVerticalTrack]\n );\n\n const renderThumbHorizontal = useCallback((passedProps: any) => {\n return <div {...passedProps} className=\"thumb-horizontal\" />;\n }, []);\n\n const renderThumbVertical = useCallback((passedProps: any) => {\n return <div {...passedProps} className=\"thumb-vertical\" />;\n }, []);\n\n const renderView = useCallback((passedProps: any) => {\n return <div {...passedProps} className=\"scrollbar-view\" />;\n }, []);\n\n const onScrollStop = useCallback(() => {\n ref.current && setScrollTop && setScrollTop(ref.current.getValues());\n }, [setScrollTop]);\n\n return (\n <Scrollbars\n data-testid={testId}\n ref={ref}\n className={classNames(styles.customScrollbar, className)}\n onScrollStop={onScrollStop}\n autoHeight={true}\n autoHide={autoHide}\n autoHideTimeout={autoHideTimeout}\n hideTracksWhenNotNeeded={hideTracksWhenNotNeeded}\n // These autoHeightMin & autoHeightMax options affect firefox and chrome differently.\n // Before these where set to inherit but that caused problems with cut of legends in firefox\n autoHeightMax={autoHeightMax}\n autoHeightMin={autoHeightMin}\n renderTrackHorizontal={renderTrackHorizontal}\n renderTrackVertical={renderTrackVertical}\n renderThumbHorizontal={renderThumbHorizontal}\n renderThumbVertical={renderThumbVertical}\n renderView={renderView}\n >\n {children}\n </Scrollbars>\n );\n};\n\nexport default CustomScrollbar;\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n customScrollbar: css`\n // Fix for Firefox. For some reason sometimes .view container gets a height of its content, but in order to\n // make scroll working it should fit outer container size (scroll appears only when inner container size is\n // greater than outer one).\n display: flex;\n flex-grow: 1;\n .scrollbar-view {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n }\n .track-vertical {\n border-radius: ${theme.shape.borderRadius(2)};\n width: ${theme.spacing(1)} !important;\n right: 0px;\n bottom: ${theme.spacing(0.25)};\n top: ${theme.spacing(0.25)};\n }\n .track-horizontal {\n border-radius: ${theme.shape.borderRadius(2)};\n height: ${theme.spacing(1)} !important;\n right: ${theme.spacing(0.25)};\n bottom: ${theme.spacing(0.25)};\n left: ${theme.spacing(0.25)};\n }\n .thumb-vertical {\n background: ${theme.colors.action.focus};\n border-radius: ${theme.shape.borderRadius(2)};\n opacity: 0;\n }\n .thumb-horizontal {\n background: ${theme.colors.action.focus};\n border-radius: ${theme.shape.borderRadius(2)};\n opacity: 0;\n }\n &:hover {\n .thumb-vertical,\n .thumb-horizontal {\n opacity: 1;\n transition: opacity 0.3s ease-in-out;\n }\n }\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { getChildId } from '../../utils/reactUtils';\n\nimport { FieldValidationMessage } from './FieldValidationMessage';\nimport { Label } from './Label';\n\nexport interface FieldProps extends HTMLAttributes<HTMLDivElement> {\n /** Form input element, i.e Input or Switch */\n children: React.ReactElement;\n /** Label for the field */\n label?: React.ReactNode;\n /** Description of the field */\n description?: React.ReactNode;\n /** Indicates if field is in invalid state */\n invalid?: boolean;\n /** Indicates if field is in loading state */\n loading?: boolean;\n /** Indicates if field is disabled */\n disabled?: boolean;\n /** Indicates if field is required */\n required?: boolean;\n /** Error message to display */\n error?: React.ReactNode;\n /** Indicates horizontal layout of the field */\n horizontal?: boolean;\n /** make validation message overflow horizontally. Prevents pushing out adjacent inline components */\n validationMessageHorizontalOverflow?: boolean;\n\n className?: string;\n /**\n * A unique id that associates the label of the Field component with the control with the unique id.\n * If the `htmlFor` property is missing the `htmlFor` will be inferred from the `id` or `inputId` property of the first child.\n * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label#attr-for\n */\n htmlFor?: string;\n}\n\nexport const getFieldStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n field: css`\n display: flex;\n flex-direction: column;\n margin-bottom: ${theme.spacing(2)};\n `,\n fieldHorizontal: css`\n flex-direction: row;\n justify-content: space-between;\n flex-wrap: wrap;\n `,\n fieldValidationWrapper: css`\n margin-top: ${theme.spacing(0.5)};\n `,\n fieldValidationWrapperHorizontal: css`\n flex: 1 1 100%;\n `,\n validationMessageHorizontalOverflow: css`\n width: 0;\n overflow-x: visible;\n\n & > * {\n white-space: nowrap;\n }\n `,\n };\n});\n\nexport const Field: React.FC<FieldProps> = ({\n label,\n description,\n horizontal,\n invalid,\n loading,\n disabled,\n required,\n error,\n children,\n className,\n validationMessageHorizontalOverflow,\n htmlFor,\n ...otherProps\n}) => {\n const theme = useTheme2();\n const styles = getFieldStyles(theme);\n const inputId = htmlFor ?? getChildId(children);\n\n const labelElement =\n typeof label === 'string' ? (\n <Label htmlFor={inputId} description={description}>\n {`${label}${required ? ' *' : ''}`}\n </Label>\n ) : (\n label\n );\n\n const childProps = deleteUndefinedProps({ invalid, disabled, loading });\n return (\n <div className={cx(styles.field, horizontal && styles.fieldHorizontal, className)} {...otherProps}>\n {labelElement}\n <div>\n {React.cloneElement(children, childProps)}\n {invalid && error && !horizontal && (\n <div\n className={cx(styles.fieldValidationWrapper, {\n [styles.validationMessageHorizontalOverflow]: !!validationMessageHorizontalOverflow,\n })}\n >\n <FieldValidationMessage>{error}</FieldValidationMessage>\n </div>\n )}\n </div>\n\n {invalid && error && horizontal && (\n <div\n className={cx(styles.fieldValidationWrapper, styles.fieldValidationWrapperHorizontal, {\n [styles.validationMessageHorizontalOverflow]: !!validationMessageHorizontalOverflow,\n })}\n >\n <FieldValidationMessage>{error}</FieldValidationMessage>\n </div>\n )}\n </div>\n );\n};\n\nfunction deleteUndefinedProps<T extends Object>(obj: T): Partial<T> {\n for (const key in obj) {\n if (obj[key] === undefined) {\n delete obj[key];\n }\n }\n\n return obj;\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\nexport interface FieldValidationMessageProps {\n /** Override component style */\n className?: string;\n horizontal?: boolean;\n}\n\nexport const getFieldValidationMessageStyles = stylesFactory((theme: GrafanaTheme2) => {\n const baseStyle = `\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.fontWeightMedium};\n padding: ${theme.spacing(0.5, 1)};\n color: ${theme.colors.error.contrastText};\n background: ${theme.colors.error.main};\n border-radius: ${theme.shape.borderRadius()};\n position: relative;\n display: inline-block;\n\n a {\n color: ${theme.colors.error.contrastText};\n text-decoration: underline;\n }\n\n a:hover {\n text-decoration: none;\n }\n `;\n\n return {\n vertical: css`\n ${baseStyle}\n margin: ${theme.spacing(0.5, 0, 0, 0)};\n\n &:before {\n content: '';\n position: absolute;\n left: 9px;\n top: -5px;\n width: 0;\n height: 0;\n border-width: 0 4px 5px 4px;\n border-color: transparent transparent ${theme.colors.error.main} transparent;\n border-style: solid;\n }\n `,\n horizontal: css`\n ${baseStyle}\n margin-left: 10px;\n\n &:before {\n content: '';\n position: absolute;\n left: -5px;\n top: 9px;\n width: 0;\n height: 0;\n border-width: 4px 5px 4px 0;\n border-color: transparent #e02f44 transparent transparent;\n border-style: solid;\n }\n `,\n fieldValidationMessageIcon: css`\n margin-right: ${theme.spacing()};\n `,\n };\n});\n\nexport const FieldValidationMessage: React.FC<FieldValidationMessageProps> = ({ children, horizontal, className }) => {\n const theme = useTheme2();\n const styles = getFieldValidationMessageStyles(theme);\n const cssName = cx(horizontal ? styles.horizontal : styles.vertical, className);\n\n return (\n <div role=\"alert\" className={cssName}>\n <Icon className={styles.fieldValidationMessageIcon} name=\"exclamation-triangle\" />\n {children}\n </div>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useTheme2, stylesFactory } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n children: React.ReactNode;\n description?: React.ReactNode;\n category?: React.ReactNode[];\n}\n\nexport const getLabelStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n label: css`\n label: Label;\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.fontWeightMedium};\n line-height: 1.25;\n margin-bottom: ${theme.spacing(0.5)};\n color: ${theme.colors.text.primary};\n max-width: 480px;\n `,\n labelContent: css`\n display: flex;\n align-items: center;\n `,\n description: css`\n label: Label-description;\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.fontWeightRegular};\n margin-top: ${theme.spacing(0.25)};\n display: block;\n `,\n categories: css`\n label: Label-categories;\n display: inline-flex;\n align-items: center;\n `,\n chevron: css`\n margin: 0 ${theme.spacing(0.25)};\n `,\n };\n});\n\nexport const Label: React.FC<LabelProps> = ({ children, description, className, category, ...labelProps }) => {\n const theme = useTheme2();\n const styles = getLabelStyles(theme);\n const categories = category?.map((c, i) => {\n return (\n <span className={styles.categories} key={`${c}/${i}`}>\n <span>{c}</span>\n <Icon name=\"angle-right\" className={styles.chevron} />\n </span>\n );\n });\n\n return (\n <div className={cx(styles.label, className)}>\n <label {...labelProps}>\n <div className={styles.labelContent}>\n {categories}\n {children}\n </div>\n {description && <span className={styles.description}>{description}</span>}\n </label>\n </div>\n );\n};\n","import classNames from 'classnames';\nimport React, { PureComponent, ChangeEvent } from 'react';\n\nimport { ValidationEvents, ValidationRule } from '../../../../types';\nimport { validate, EventsWithValidation, hasValidationEvent } from '../../../../utils';\n\nexport enum LegacyInputStatus {\n Invalid = 'invalid',\n Valid = 'valid',\n}\n\nexport interface Props extends React.HTMLProps<HTMLInputElement> {\n validationEvents?: ValidationEvents;\n hideErrorMessage?: boolean;\n inputRef?: React.LegacyRef<HTMLInputElement>;\n\n // Override event props and append status as argument\n onBlur?: (event: React.FocusEvent<HTMLInputElement>, status?: LegacyInputStatus) => void;\n onFocus?: (event: React.FocusEvent<HTMLInputElement>, status?: LegacyInputStatus) => void;\n onChange?: (event: React.ChangeEvent<HTMLInputElement>, status?: LegacyInputStatus) => void;\n}\n\ninterface State {\n error: string | null;\n}\n\nexport class Input extends PureComponent<Props, State> {\n static defaultProps = {\n className: '',\n };\n\n state: State = {\n error: null,\n };\n\n get status() {\n return this.state.error ? LegacyInputStatus.Invalid : LegacyInputStatus.Valid;\n }\n\n get isInvalid() {\n return this.status === LegacyInputStatus.Invalid;\n }\n\n validatorAsync = (validationRules: ValidationRule[]) => {\n return (evt: ChangeEvent<HTMLInputElement>) => {\n const errors = validate(evt.target.value, validationRules);\n this.setState((prevState) => {\n return { ...prevState, error: errors ? errors[0] : null };\n });\n };\n };\n\n populateEventPropsWithStatus = (restProps: any, validationEvents: ValidationEvents | undefined) => {\n const inputElementProps = { ...restProps };\n if (!validationEvents) {\n return inputElementProps;\n }\n Object.keys(EventsWithValidation).forEach((eventName) => {\n if (hasValidationEvent(eventName as EventsWithValidation, validationEvents) || restProps[eventName]) {\n inputElementProps[eventName] = async (evt: ChangeEvent<HTMLInputElement>) => {\n evt.persist(); // Needed for async. https://reactjs.org/docs/events.html#event-pooling\n if (hasValidationEvent(eventName as EventsWithValidation, validationEvents)) {\n await this.validatorAsync(validationEvents[eventName]).apply(this, [evt]);\n }\n if (restProps[eventName]) {\n restProps[eventName].apply(null, [evt, this.status]);\n }\n };\n }\n });\n return inputElementProps;\n };\n\n render() {\n const { validationEvents, className, hideErrorMessage, inputRef, ...restProps } = this.props;\n const { error } = this.state;\n const inputClassName = classNames('gf-form-input', { invalid: this.isInvalid }, className);\n const inputElementProps = this.populateEventPropsWithStatus(restProps, validationEvents);\n\n return (\n <div style={{ flexGrow: 1 }}>\n <input {...inputElementProps} ref={inputRef} className={inputClassName} />\n {error && !hideErrorMessage && <span>{error}</span>}\n </div>\n );\n }\n}\n","import React from 'react';\nimport { components } from 'react-select';\n\nimport { Icon } from '../../../Icon/Icon';\n\nexport const IndicatorsContainer = (props: any) => {\n const isOpen = props.selectProps.menuIsOpen;\n return (\n <components.IndicatorsContainer {...props}>\n <Icon name={isOpen ? 'angle-up' : 'angle-down'} style={{ marginTop: '7px' }} />\n </components.IndicatorsContainer>\n );\n};\n\nexport default IndicatorsContainer;\n","import React from 'react';\nimport { components, NoticeProps, GroupBase } from 'react-select';\n\nimport { SelectableValue } from '@grafana/data';\n\nexport type Props<T> = NoticeProps<SelectableValue<T>, boolean, GroupBase<SelectableValue<T>>>;\n\nexport const NoOptionsMessage = <T extends unknown>(props: Props<T>) => {\n const { children } = props;\n return (\n <components.NoOptionsMessage {...props}>\n <div className=\"gf-form-select-box__desc-option\">\n <div className=\"gf-form-select-box__desc-option__body\">{children}</div>\n </div>\n </components.NoOptionsMessage>\n );\n};\n\nexport default NoOptionsMessage;\n","import React from 'react';\nimport { components, OptionProps } from 'react-select';\n\nimport { Icon } from '../../../Icon/Icon';\n\n// https://github.com/JedWatson/react-select/issues/3038\nexport interface ExtendedOptionProps extends OptionProps<any, any> {\n data: {\n description?: string;\n imgUrl?: string;\n };\n}\n\nexport const SelectOption = (props: ExtendedOptionProps) => {\n const { children, isSelected, data } = props;\n\n return (\n <components.Option {...props}>\n <div className=\"gf-form-select-box__desc-option\">\n {data.imgUrl && <img className=\"gf-form-select-box__desc-option__img\" src={data.imgUrl} />}\n <div className=\"gf-form-select-box__desc-option__body\">\n <div>{children}</div>\n {data.description && <div className=\"gf-form-select-box__desc-option__desc\">{data.description}</div>}\n </div>\n {isSelected && <Icon name=\"check\" aria-hidden=\"true\" />}\n </div>\n </components.Option>\n );\n};\n\nexport default SelectOption;\n","// Libraries\nimport classNames from 'classnames';\nimport React, { PureComponent } from 'react';\nimport { default as ReactSelect, components } from 'react-select';\nimport { default as ReactAsyncSelect } from 'react-select/async';\nimport Creatable from 'react-select/creatable';\n\n// Components\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { ThemeContext } from '../../../../themes';\nimport { CustomScrollbar } from '../../../CustomScrollbar/CustomScrollbar';\nimport { SelectOptionGroup } from '../../../Select/SelectOptionGroup';\nimport { SingleValue } from '../../../Select/SingleValue';\nimport resetSelectStyles from '../../../Select/resetSelectStyles';\nimport { SelectCommonProps, SelectAsyncProps } from '../../../Select/types';\nimport { Tooltip, PopoverContent } from '../../../Tooltip';\n\nimport IndicatorsContainer from './IndicatorsContainer';\nimport NoOptionsMessage from './NoOptionsMessage';\nimport { SelectOption } from './SelectOption';\n\n/**\n * Changes in new selects:\n * - noOptionsMessage & loadingMessage is of string type\n * - isDisabled is renamed to disabled\n */\ntype LegacyCommonProps<T> = Omit<SelectCommonProps<T>, 'noOptionsMessage' | 'disabled' | 'value' | 'loadingMessage'>;\n\ninterface AsyncProps<T> extends LegacyCommonProps<T>, Omit<SelectAsyncProps<T>, 'loadingMessage'> {\n loadingMessage?: () => string;\n noOptionsMessage?: () => string;\n tooltipContent?: PopoverContent;\n isDisabled?: boolean;\n value?: SelectableValue<T>;\n}\n\nexport interface LegacySelectProps<T> extends LegacyCommonProps<T> {\n tooltipContent?: PopoverContent;\n noOptionsMessage?: () => string;\n isDisabled?: boolean;\n value?: SelectableValue<T>;\n}\n\nexport const MenuList = (props: any) => {\n return (\n <components.MenuList {...props}>\n <CustomScrollbar autoHide={false} autoHeightMax=\"inherit\">\n {props.children}\n </CustomScrollbar>\n </components.MenuList>\n );\n};\nexport class Select<T> extends PureComponent<LegacySelectProps<T>> {\n static contextType = ThemeContext;\n\n static defaultProps: Partial<LegacySelectProps<any>> = {\n className: '',\n isDisabled: false,\n isSearchable: true,\n isClearable: false,\n isMulti: false,\n openMenuOnFocus: false,\n autoFocus: false,\n isLoading: false,\n backspaceRemovesValue: true,\n maxMenuHeight: 300,\n tabSelectsValue: true,\n allowCustomValue: false,\n components: {\n Option: SelectOption,\n SingleValue,\n IndicatorsContainer,\n MenuList,\n Group: SelectOptionGroup,\n },\n };\n\n render() {\n const {\n defaultValue,\n getOptionLabel,\n getOptionValue,\n onChange,\n options,\n placeholder,\n width,\n value,\n className,\n isDisabled,\n isLoading,\n isSearchable,\n isClearable,\n backspaceRemovesValue,\n isMulti,\n autoFocus,\n openMenuOnFocus,\n onBlur,\n maxMenuHeight,\n noOptionsMessage,\n isOpen,\n components,\n tooltipContent,\n tabSelectsValue,\n onCloseMenu,\n onOpenMenu,\n allowCustomValue,\n formatCreateLabel,\n 'aria-label': ariaLabel,\n } = this.props;\n\n let widthClass = '';\n if (width) {\n widthClass = 'width-' + width;\n }\n\n let SelectComponent = ReactSelect;\n const creatableOptions: any = {};\n\n if (allowCustomValue) {\n SelectComponent = Creatable as any;\n creatableOptions.formatCreateLabel = formatCreateLabel ?? ((input: string) => input);\n }\n\n const selectClassNames = classNames('gf-form-input', 'gf-form-input--form-dropdown', widthClass, className);\n const selectComponents = { ...Select.defaultProps.components, ...components };\n return (\n <WrapInTooltip onCloseMenu={onCloseMenu} onOpenMenu={onOpenMenu} tooltipContent={tooltipContent} isOpen={isOpen}>\n {(onOpenMenuInternal, onCloseMenuInternal) => {\n return (\n <SelectComponent\n captureMenuScroll={false}\n classNamePrefix=\"gf-form-select-box\"\n className={selectClassNames}\n components={selectComponents}\n defaultValue={defaultValue}\n value={value}\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n menuShouldScrollIntoView={false}\n isSearchable={isSearchable}\n onChange={onChange}\n options={options}\n placeholder={placeholder || 'Choose'}\n styles={resetSelectStyles(this.context as GrafanaTheme2)}\n isDisabled={isDisabled}\n isLoading={isLoading}\n isClearable={isClearable}\n autoFocus={autoFocus}\n onBlur={onBlur}\n openMenuOnFocus={openMenuOnFocus}\n maxMenuHeight={maxMenuHeight}\n noOptionsMessage={noOptionsMessage}\n isMulti={isMulti}\n backspaceRemovesValue={backspaceRemovesValue}\n menuIsOpen={isOpen}\n onMenuOpen={onOpenMenuInternal}\n onMenuClose={onCloseMenuInternal}\n tabSelectsValue={tabSelectsValue}\n aria-label={ariaLabel}\n {...creatableOptions}\n />\n );\n }}\n </WrapInTooltip>\n );\n }\n}\n\nexport class AsyncSelect<T> extends PureComponent<AsyncProps<T>> {\n static defaultProps: Partial<AsyncProps<any>> = {\n className: '',\n components: {},\n loadingMessage: () => 'Loading...',\n isDisabled: false,\n isClearable: false,\n isMulti: false,\n isSearchable: true,\n backspaceRemovesValue: true,\n autoFocus: false,\n openMenuOnFocus: false,\n maxMenuHeight: 300,\n };\n\n render() {\n const {\n defaultValue,\n getOptionLabel,\n getOptionValue,\n onChange,\n placeholder,\n width,\n value,\n className,\n loadOptions,\n defaultOptions,\n isLoading,\n loadingMessage,\n noOptionsMessage,\n isDisabled,\n isSearchable,\n isClearable,\n backspaceRemovesValue,\n autoFocus,\n onBlur,\n openMenuOnFocus,\n maxMenuHeight,\n isMulti,\n tooltipContent,\n onCloseMenu,\n onOpenMenu,\n isOpen,\n } = this.props;\n\n let widthClass = '';\n if (width) {\n widthClass = 'width-' + width;\n }\n\n const selectClassNames = classNames('gf-form-input', 'gf-form-input--form-dropdown', widthClass, className);\n\n return (\n <WrapInTooltip onCloseMenu={onCloseMenu} onOpenMenu={onOpenMenu} tooltipContent={tooltipContent} isOpen={isOpen}>\n {(onOpenMenuInternal, onCloseMenuInternal) => {\n return (\n <ReactAsyncSelect\n captureMenuScroll={false}\n classNamePrefix=\"gf-form-select-box\"\n className={selectClassNames}\n components={{\n Option: SelectOption,\n SingleValue,\n IndicatorsContainer,\n NoOptionsMessage,\n }}\n defaultValue={defaultValue}\n value={value}\n //@ts-expect-error\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n menuShouldScrollIntoView={false}\n onChange={onChange}\n loadOptions={loadOptions}\n isLoading={isLoading}\n defaultOptions={defaultOptions}\n placeholder={placeholder || 'Choose'}\n //@ts-expect-error\n styles={resetSelectStyles()}\n loadingMessage={() => loadingMessage}\n noOptionsMessage={noOptionsMessage}\n isDisabled={isDisabled}\n isSearchable={isSearchable}\n isClearable={isClearable}\n autoFocus={autoFocus}\n onBlur={onBlur}\n openMenuOnFocus={openMenuOnFocus}\n maxMenuHeight={maxMenuHeight}\n isMulti={isMulti}\n backspaceRemovesValue={backspaceRemovesValue}\n />\n );\n }}\n </WrapInTooltip>\n );\n }\n}\n\nexport interface TooltipWrapperProps {\n children: (onOpenMenu: () => void, onCloseMenu: () => void) => React.ReactNode;\n onOpenMenu?: () => void;\n onCloseMenu?: () => void;\n isOpen?: boolean;\n tooltipContent?: PopoverContent;\n}\n\nexport interface TooltipWrapperState {\n isOpenInternal: boolean;\n}\n\nexport class WrapInTooltip extends PureComponent<TooltipWrapperProps, TooltipWrapperState> {\n state: TooltipWrapperState = {\n isOpenInternal: false,\n };\n\n onOpenMenu = () => {\n const { onOpenMenu } = this.props;\n if (onOpenMenu) {\n onOpenMenu();\n }\n this.setState({ isOpenInternal: true });\n };\n\n onCloseMenu = () => {\n const { onCloseMenu } = this.props;\n if (onCloseMenu) {\n onCloseMenu();\n }\n this.setState({ isOpenInternal: false });\n };\n\n render() {\n const { children, isOpen, tooltipContent } = this.props;\n const { isOpenInternal } = this.state;\n\n let showTooltip: boolean | undefined = undefined;\n\n if (isOpenInternal || isOpen) {\n showTooltip = false;\n }\n\n if (tooltipContent) {\n return (\n <Tooltip show={showTooltip} content={tooltipContent} placement=\"bottom\">\n <div>\n {/* div needed for tooltip */}\n {children(this.onOpenMenu, this.onCloseMenu)}\n </div>\n </Tooltip>\n );\n } else {\n return <div>{children(this.onOpenMenu, this.onCloseMenu)}</div>;\n }\n }\n}\n\nexport default Select;\n","import { css, cx } from '@emotion/css';\n\nimport { GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\n\nimport { focusCss } from '../../themes/mixins';\nimport { ComponentSize } from '../../types/size';\n\nexport const getFocusStyle = (theme: GrafanaTheme) => css`\n &:focus {\n ${focusCss(theme)}\n }\n`;\n\nexport const sharedInputStyle = (theme: GrafanaTheme2, invalid = false) => {\n const borderColor = invalid ? theme.colors.error.border : theme.components.input.borderColor;\n const borderColorHover = invalid ? theme.colors.error.shade : theme.components.input.borderHover;\n const background = theme.components.input.background;\n const textColor = theme.components.input.text;\n\n // Cannot use our normal borders for this color for some reason due the alpha values in them.\n // Need to colors without alpha channel\n const autoFillBorder = theme.isDark ? '#2e2f35' : '#bab4ca';\n\n return cx(\n inputPadding(theme),\n css`\n background: ${background};\n line-height: ${theme.typography.body.lineHeight};\n font-size: ${theme.typography.size.md};\n color: ${textColor};\n border: 1px solid ${borderColor};\n\n &:-webkit-autofill,\n &:-webkit-autofill:hover {\n /* Welcome to 2005. This is a HACK to get rid od Chromes default autofill styling */\n box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0), inset 0 0 0 100px ${background}!important;\n -webkit-text-fill-color: ${textColor} !important;\n border-color: ${autoFillBorder};\n }\n\n &:-webkit-autofill:focus {\n /* Welcome to 2005. This is a HACK to get rid od Chromes default autofill styling */\n box-shadow: 0 0 0 2px ${theme.colors.background.primary}, 0 0 0px 4px ${theme.colors.primary.main},\n inset 0 0 0 1px rgba(255, 255, 255, 0), inset 0 0 0 100px ${background}!important;\n -webkit-text-fill-color: ${textColor} !important;\n }\n\n &:hover {\n border-color: ${borderColorHover};\n }\n\n &:focus {\n outline: none;\n }\n\n &:disabled {\n background-color: ${theme.colors.action.disabledBackground};\n color: ${theme.colors.action.disabledText};\n border: 1px solid ${theme.colors.action.disabledBackground};\n\n &:hover {\n border-color: ${borderColor};\n }\n }\n\n &::placeholder {\n color: ${theme.colors.text.disabled};\n opacity: 1;\n }\n `\n );\n};\n\nexport const inputPadding = (theme: GrafanaTheme2) => {\n return css`\n padding: ${theme.spacing(0, 1, 0, 1)};\n `;\n};\n\nexport const inputSizes = () => {\n return {\n sm: css`\n width: ${inputSizesPixels('sm')};\n `,\n md: css`\n width: ${inputSizesPixels('md')};\n `,\n lg: css`\n width: ${inputSizesPixels('lg')};\n `,\n auto: css`\n width: ${inputSizesPixels('auto')};\n `,\n };\n};\n\nexport const inputSizesPixels = (size: string) => {\n switch (size) {\n case 'sm':\n return '200px';\n case 'md':\n return '320px';\n case 'lg':\n return '580px';\n case 'auto':\n default:\n return 'auto';\n }\n};\n\nexport function getPropertiesForButtonSize(size: ComponentSize, theme: GrafanaTheme2) {\n switch (size) {\n case 'sm':\n return {\n padding: 1,\n fontSize: theme.typography.size.sm,\n height: theme.components.height.sm,\n };\n\n case 'lg':\n return {\n padding: 3,\n fontSize: theme.typography.size.lg,\n height: theme.components.height.lg,\n };\n case 'md':\n default:\n return {\n padding: 2,\n fontSize: theme.typography.size.md,\n height: theme.components.height.md,\n };\n }\n}\n","import React from 'react';\nimport { Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\nimport uPlot, { AlignedData } from 'uplot';\n\nimport {\n DataFrame,\n DataHoverClearEvent,\n DataHoverEvent,\n Field,\n FieldMatcherID,\n fieldMatchers,\n LegacyGraphHoverEvent,\n TimeRange,\n TimeZone,\n} from '@grafana/data';\nimport { VizLegendOptions } from '@grafana/schema';\n\nimport { Themeable2 } from '../../types';\nimport { PanelContext, PanelContextRoot } from '../PanelChrome/PanelContext';\nimport { VizLayout } from '../VizLayout/VizLayout';\nimport { UPlotChart } from '../uPlot/Plot';\nimport { AxisProps } from '../uPlot/config/UPlotAxisBuilder';\nimport { Renderers, UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder';\nimport { ScaleProps } from '../uPlot/config/UPlotScaleBuilder';\nimport { findMidPointYPosition, pluginLog } from '../uPlot/utils';\n\nimport { GraphNGLegendEvent, XYFieldMatchers } from './types';\nimport { preparePlotFrame as defaultPreparePlotFrame } from './utils';\n\n/**\n * @internal -- not a public API\n */\nexport const FIXED_UNIT = '__fixed';\n\n/**\n * @internal -- not a public API\n */\nexport type PropDiffFn<T extends any = any> = (prev: T, next: T) => boolean;\n\nexport interface GraphNGProps extends Themeable2 {\n frames: DataFrame[];\n structureRev?: number; // a number that will change when the frames[] structure changes\n width: number;\n height: number;\n timeRange: TimeRange;\n timeZones: TimeZone[] | TimeZone;\n legend: VizLegendOptions;\n fields?: XYFieldMatchers; // default will assume timeseries data\n renderers?: Renderers;\n tweakScale?: (opts: ScaleProps, forField: Field) => ScaleProps;\n tweakAxis?: (opts: AxisProps, forField: Field) => AxisProps;\n onLegendClick?: (event: GraphNGLegendEvent) => void;\n children?: (builder: UPlotConfigBuilder, alignedFrame: DataFrame) => React.ReactNode;\n prepConfig: (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => UPlotConfigBuilder;\n propsToDiff?: Array<string | PropDiffFn>;\n preparePlotFrame?: (frames: DataFrame[], dimFields: XYFieldMatchers) => DataFrame;\n renderLegend: (config: UPlotConfigBuilder) => React.ReactElement | null;\n\n /**\n * needed for propsToDiff to re-init the plot & config\n * this is a generic approach to plot re-init, without having to specify which panel-level options\n * should cause invalidation. we can drop this in favor of something like panelOptionsRev that gets passed in\n * similar to structureRev. then we can drop propsToDiff entirely.\n */\n options?: Record<string, any>;\n}\n\nfunction sameProps(prevProps: any, nextProps: any, propsToDiff: Array<string | PropDiffFn> = []) {\n for (const propName of propsToDiff) {\n if (typeof propName === 'function') {\n if (!propName(prevProps, nextProps)) {\n return false;\n }\n } else if (nextProps[propName] !== prevProps[propName]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * @internal -- not a public API\n */\nexport interface GraphNGState {\n alignedFrame: DataFrame;\n alignedData?: AlignedData;\n config?: UPlotConfigBuilder;\n}\n\n/**\n * \"Time as X\" core component, expects ascending x\n */\nexport class GraphNG extends React.Component<GraphNGProps, GraphNGState> {\n static contextType = PanelContextRoot;\n panelContext: PanelContext = {} as PanelContext;\n private plotInstance: React.RefObject<uPlot>;\n\n private subscription = new Subscription();\n\n constructor(props: GraphNGProps) {\n super(props);\n let state = this.prepState(props);\n state.alignedData = state.config!.prepData!([state.alignedFrame]) as AlignedData;\n this.state = state;\n this.plotInstance = React.createRef();\n }\n\n getTimeRange = () => this.props.timeRange;\n\n prepState(props: GraphNGProps, withConfig = true) {\n let state: GraphNGState = null as any;\n\n const { frames, fields, preparePlotFrame } = props;\n\n const preparePlotFrameFn = preparePlotFrame || defaultPreparePlotFrame;\n\n const alignedFrame = preparePlotFrameFn(\n frames,\n fields || {\n x: fieldMatchers.get(FieldMatcherID.firstTimeField).get({}),\n y: fieldMatchers.get(FieldMatcherID.numeric).get({}),\n },\n props.timeRange\n );\n pluginLog('GraphNG', false, 'data aligned', alignedFrame);\n\n if (alignedFrame) {\n let config = this.state?.config;\n\n if (withConfig) {\n config = props.prepConfig(alignedFrame, this.props.frames, this.getTimeRange);\n pluginLog('GraphNG', false, 'config prepared', config);\n }\n\n state = {\n alignedFrame,\n config,\n };\n\n pluginLog('GraphNG', false, 'data prepared', state.alignedData);\n }\n\n return state;\n }\n\n handleCursorUpdate(evt: DataHoverEvent | LegacyGraphHoverEvent) {\n const time = evt.payload?.point?.time;\n const u = this.plotInstance.current;\n if (u && time) {\n // Try finding left position on time axis\n const left = u.valToPos(time, 'x');\n let top;\n if (left) {\n // find midpoint between points at current idx\n top = findMidPointYPosition(u, u.posToIdx(left));\n }\n\n if (!top || !left) {\n return;\n }\n\n u.setCursor({\n left,\n top,\n });\n }\n }\n\n componentDidMount() {\n this.panelContext = this.context as PanelContext;\n const { eventBus } = this.panelContext;\n\n this.subscription.add(\n eventBus\n .getStream(DataHoverEvent)\n .pipe(throttleTime(50))\n .subscribe({\n next: (evt) => {\n if (eventBus === evt.origin) {\n return;\n }\n this.handleCursorUpdate(evt);\n },\n })\n );\n\n // Legacy events (from flot graph)\n this.subscription.add(\n eventBus\n .getStream(LegacyGraphHoverEvent)\n .pipe(throttleTime(50))\n .subscribe({\n next: (evt) => this.handleCursorUpdate(evt),\n })\n );\n\n this.subscription.add(\n eventBus\n .getStream(DataHoverClearEvent)\n .pipe(throttleTime(50))\n .subscribe({\n next: () => {\n const u = this.plotInstance?.current;\n\n if (u) {\n u.setCursor({\n left: -10,\n top: -10,\n });\n }\n },\n })\n );\n }\n\n componentDidUpdate(prevProps: GraphNGProps) {\n const { frames, structureRev, timeZones, propsToDiff } = this.props;\n\n const propsChanged = !sameProps(prevProps, this.props, propsToDiff);\n\n if (frames !== prevProps.frames || propsChanged || timeZones !== prevProps.timeZones) {\n let newState = this.prepState(this.props, false);\n\n if (newState) {\n const shouldReconfig =\n this.state.config === undefined ||\n timeZones !== prevProps.timeZones ||\n structureRev !== prevProps.structureRev ||\n !structureRev ||\n propsChanged;\n\n if (shouldReconfig) {\n newState.config = this.props.prepConfig(newState.alignedFrame, this.props.frames, this.getTimeRange);\n pluginLog('GraphNG', false, 'config recreated', newState.config);\n }\n\n newState.alignedData = newState.config!.prepData!([newState.alignedFrame]) as AlignedData;\n\n this.setState(newState);\n }\n }\n }\n\n componentWillUnmount() {\n this.subscription.unsubscribe();\n }\n\n render() {\n const { width, height, children, timeRange, renderLegend } = this.props;\n const { config, alignedFrame, alignedData } = this.state;\n\n if (!config) {\n return null;\n }\n\n return (\n <VizLayout width={width} height={height} legend={renderLegend(config)}>\n {(vizWidth: number, vizHeight: number) => (\n <UPlotChart\n config={config}\n data={alignedData!}\n width={vizWidth}\n height={vizHeight}\n timeRange={timeRange}\n plotRef={(u) => ((this.plotInstance as React.MutableRefObject<uPlot>).current = u)}\n >\n {children ? children(config, alignedFrame) : null}\n </UPlotChart>\n )}\n </VizLayout>\n );\n }\n}\n","import { ArrayVector, DataFrame, FieldType, incrRoundDn } from '@grafana/data';\n\ntype InsertMode = (prev: number, next: number, threshold: number) => number;\n\nconst INSERT_MODES = {\n threshold: (prev: number, next: number, threshold: number) => prev + threshold,\n midpoint: (prev: number, next: number, threshold: number) => (prev + next) / 2,\n // previous time + 1ms to prevent StateTimeline from forward-interpolating prior state\n plusone: (prev: number, next: number, threshold: number) => prev + 1,\n};\n\ninterface NullInsertOptions {\n frame: DataFrame;\n refFieldName?: string | null;\n refFieldPseudoMax?: number;\n refFieldPseudoMin?: number;\n insertMode?: InsertMode;\n}\n\nexport function applyNullInsertThreshold(opts: NullInsertOptions): DataFrame {\n if (opts.frame.length === 0) {\n return opts.frame;\n }\n\n let thorough = true;\n let { frame, refFieldName, refFieldPseudoMax, refFieldPseudoMin, insertMode } = opts;\n\n if (!insertMode) {\n insertMode = INSERT_MODES.threshold;\n }\n\n const refField = frame.fields.find((field) => {\n // note: getFieldDisplayName() would require full DF[]\n return refFieldName != null ? field.name === refFieldName : field.type === FieldType.time;\n });\n\n if (refField == null) {\n return frame;\n }\n\n refField.state = {\n ...refField.state,\n nullThresholdApplied: true,\n };\n\n const thresholds = frame.fields.map((field) => field.config.custom?.insertNulls ?? refField.config.interval ?? null);\n\n const uniqueThresholds = new Set<number>(thresholds);\n\n uniqueThresholds.delete(null as any);\n\n if (uniqueThresholds.size === 0) {\n return frame;\n }\n\n if (uniqueThresholds.size === 1) {\n const threshold = uniqueThresholds.values().next().value;\n\n if (threshold <= 0) {\n return frame;\n }\n\n const refValues = refField.values.toArray();\n\n const frameValues = frame.fields.map((field) => field.values.toArray());\n\n const filledFieldValues = nullInsertThreshold(\n refValues,\n frameValues,\n threshold,\n refFieldPseudoMin,\n refFieldPseudoMax,\n insertMode,\n thorough\n );\n\n if (filledFieldValues === frameValues) {\n return frame;\n }\n\n return {\n ...frame,\n length: filledFieldValues[0].length,\n fields: frame.fields.map((field, i) => ({\n ...field,\n values: new ArrayVector(filledFieldValues[i]),\n })),\n };\n }\n\n // TODO: unique threshold-per-field (via overrides) is unimplemented\n // should be done by processing each (refField + thresholdA-field1 + thresholdA-field2...)\n // as a separate nullInsertThreshold() dataset, then re-join into single dataset via join()\n return frame;\n}\n\nfunction nullInsertThreshold(\n refValues: number[],\n frameValues: any[][],\n threshold: number,\n refFieldPseudoMin: number | null = null,\n // will insert a trailing null when refFieldPseudoMax > last datapoint + threshold\n refFieldPseudoMax: number | null = null,\n getInsertValue: InsertMode,\n // will insert the value at every missing interval\n thorough: boolean\n) {\n const len = refValues.length;\n const refValuesNew: number[] = [];\n\n // Continiuously subtract the threshold from the first data\n // point filling in insert values accordingly\n if (refFieldPseudoMin != null && refFieldPseudoMin < refValues[0]) {\n // this will be 0 or 1 threshold increment left of visible range\n let prevSlot = incrRoundDn(refFieldPseudoMin, threshold);\n\n while (prevSlot < refValues[0]) {\n // (prevSlot - threshold) is used to simulate the previous 'real' data point, as getInsertValue expects\n refValuesNew.push(getInsertValue(prevSlot - threshold, prevSlot, threshold));\n prevSlot += threshold;\n }\n }\n\n // Insert initial value\n refValuesNew.push(refValues[0]);\n\n let prevValue: number = refValues[0];\n\n // Fill nulls when a value is greater than\n // the threshold value\n for (let i = 1; i < len; i++) {\n const curValue = refValues[i];\n\n while (curValue - prevValue > threshold) {\n refValuesNew.push(getInsertValue(prevValue, curValue, threshold));\n\n prevValue += threshold;\n\n if (!thorough) {\n break;\n }\n }\n\n refValuesNew.push(curValue);\n\n prevValue = curValue;\n }\n\n // At the end of the sequence\n if (refFieldPseudoMax != null && refFieldPseudoMax > prevValue) {\n while (prevValue + threshold < refFieldPseudoMax) {\n refValuesNew.push(getInsertValue(prevValue, refFieldPseudoMax, threshold));\n prevValue += threshold;\n }\n }\n\n const filledLen = refValuesNew.length;\n\n if (filledLen === len) {\n return frameValues;\n }\n\n const filledFieldValues: any[][] = [];\n\n for (let fieldValues of frameValues) {\n let filledValues;\n\n if (fieldValues !== refValues) {\n filledValues = Array(filledLen);\n\n for (let i = 0, j = 0; i < filledLen; i++) {\n filledValues[i] = refValues[j] === refValuesNew[i] ? fieldValues[j++] : null;\n }\n } else {\n filledValues = refValuesNew;\n }\n\n filledFieldValues.push(filledValues);\n }\n\n return filledFieldValues;\n}\n","import { ArrayVector, DataFrame } from '@grafana/data';\n\nexport function nullToValue(frame: DataFrame) {\n return {\n ...frame,\n fields: frame.fields.map((field) => {\n const noValue = +field.config?.noValue!;\n\n if (!Number.isNaN(noValue)) {\n const transformedVals = field.values.toArray().slice();\n\n for (let i = 0; i < transformedVals.length; i++) {\n if (transformedVals[i] === null) {\n transformedVals[i] = noValue;\n }\n }\n\n return {\n ...field,\n values: new ArrayVector(transformedVals),\n };\n } else {\n return field;\n }\n }),\n };\n}\n","// mutates all nulls -> undefineds in the fieldValues array for value-less refValues ranges below maxThreshold\n// refValues is typically a time array and maxThreshold is the allowable distance between in time\nexport function nullToUndefThreshold(refValues: number[], fieldValues: any[], maxThreshold: number): any[] {\n let prevRef;\n let nullIdx;\n\n for (let i = 0; i < fieldValues.length; i++) {\n let fieldVal = fieldValues[i];\n\n if (fieldVal == null) {\n if (nullIdx == null && prevRef != null) {\n nullIdx = i;\n }\n } else {\n if (nullIdx != null) {\n if (refValues[i] - (prevRef as number) < maxThreshold) {\n while (nullIdx < i) {\n fieldValues[nullIdx++] = undefined;\n }\n }\n\n nullIdx = null;\n }\n\n prevRef = refValues[i];\n }\n }\n\n return fieldValues;\n}\n","import { ArrayVector, DataFrame, Field, FieldConfig, FieldType, outerJoinDataFrames, TimeRange } from '@grafana/data';\nimport {\n AxisPlacement,\n GraphDrawStyle,\n GraphFieldConfig,\n ScaleDistribution,\n ScaleDistributionConfig,\n} from '@grafana/schema';\n\nimport { FIXED_UNIT } from './GraphNG';\nimport { applyNullInsertThreshold } from './nullInsertThreshold';\nimport { nullToUndefThreshold } from './nullToUndefThreshold';\nimport { XYFieldMatchers } from './types';\n\nfunction isVisibleBarField(f: Field) {\n return (\n f.type === FieldType.number && f.config.custom?.drawStyle === GraphDrawStyle.Bars && !f.config.custom?.hideFrom?.viz\n );\n}\n\n// will mutate the DataFrame's fields' values\nfunction applySpanNullsThresholds(frame: DataFrame) {\n let refField = frame.fields.find((field) => field.type === FieldType.time); // this doesnt need to be time, just any numeric/asc join field\n let refValues = refField?.values.toArray() as any[];\n\n for (let i = 0; i < frame.fields.length; i++) {\n let field = frame.fields[i];\n\n if (field === refField || isVisibleBarField(field)) {\n continue;\n }\n\n let spanNulls = field.config.custom?.spanNulls;\n\n if (typeof spanNulls === 'number') {\n if (spanNulls !== -1) {\n field.values = new ArrayVector(nullToUndefThreshold(refValues, field.values.toArray(), spanNulls));\n }\n }\n }\n\n return frame;\n}\n\nexport function preparePlotFrame(frames: DataFrame[], dimFields: XYFieldMatchers, timeRange?: TimeRange | null) {\n // apply null insertions at interval\n frames = frames.map((frame) => {\n if (!frame.fields[0].state?.nullThresholdApplied) {\n return applyNullInsertThreshold({\n frame,\n refFieldName: null,\n refFieldPseudoMin: timeRange?.from.valueOf(),\n refFieldPseudoMax: timeRange?.to.valueOf(),\n });\n } else {\n return frame;\n }\n });\n\n let numBarSeries = 0;\n\n frames.forEach((frame) => {\n frame.fields.forEach((f) => {\n if (isVisibleBarField(f)) {\n // prevent minesweeper-expansion of nulls (gaps) when joining bars\n // since bar width is determined from the minimum distance between non-undefined values\n // (this strategy will still retain any original pre-join nulls, though)\n f.config.custom = {\n ...f.config.custom,\n spanNulls: -1,\n };\n\n numBarSeries++;\n }\n });\n });\n\n // to make bar widths of all series uniform (equal to narrowest bar series), find smallest distance between x points\n let minXDelta = Infinity;\n\n if (numBarSeries > 1) {\n frames.forEach((frame) => {\n if (!frame.fields.some(isVisibleBarField)) {\n return;\n }\n\n const xVals = frame.fields[0].values.toArray();\n\n for (let i = 0; i < xVals.length; i++) {\n if (i > 0) {\n minXDelta = Math.min(minXDelta, xVals[i] - xVals[i - 1]);\n }\n }\n });\n }\n\n let alignedFrame = outerJoinDataFrames({\n frames,\n joinBy: dimFields.x,\n keep: dimFields.y,\n keepOriginIndices: true,\n });\n\n if (alignedFrame) {\n alignedFrame = applySpanNullsThresholds(alignedFrame);\n\n // append 2 null vals at minXDelta to bar series\n if (minXDelta !== Infinity) {\n alignedFrame.fields.forEach((f, fi) => {\n let vals = f.values.toArray();\n\n if (fi === 0) {\n let lastVal = vals[vals.length - 1];\n vals.push(lastVal + minXDelta, lastVal + 2 * minXDelta);\n } else if (isVisibleBarField(f)) {\n vals.push(null, null);\n } else {\n vals.push(undefined, undefined);\n }\n });\n\n alignedFrame.length += 2;\n }\n\n return alignedFrame;\n }\n\n return null;\n}\n\nexport function buildScaleKey(config: FieldConfig<GraphFieldConfig>) {\n const defaultPart = 'na';\n\n const scaleRange = `${config.min !== undefined ? config.min : defaultPart}-${\n config.max !== undefined ? config.max : defaultPart\n }`;\n\n const scaleSoftRange = `${config.custom?.axisSoftMin !== undefined ? config.custom.axisSoftMin : defaultPart}-${\n config.custom?.axisSoftMax !== undefined ? config.custom.axisSoftMax : defaultPart\n }`;\n\n const scalePlacement = `${\n config.custom?.axisPlacement !== undefined ? config.custom?.axisPlacement : AxisPlacement.Auto\n }`;\n\n const scaleUnit = config.unit ?? FIXED_UNIT;\n\n const scaleDistribution = config.custom?.scaleDistribution\n ? getScaleDistributionPart(config.custom.scaleDistribution)\n : ScaleDistribution.Linear;\n\n const scaleLabel = Boolean(config.custom?.axisLabel) ? config.custom!.axisLabel : defaultPart;\n\n const shouldHideFromViz = Boolean(config.custom?.hideFrom?.viz);\n\n return `${scaleUnit}/${scaleRange}/${scaleSoftRange}/${scalePlacement}/${scaleDistribution}/${scaleLabel}/${shouldHideFromViz}`;\n}\n\nfunction getScaleDistributionPart(config: ScaleDistributionConfig) {\n if (config.type === ScaleDistribution.Log) {\n return `${config.type}${config.log}`;\n }\n return config.type;\n}\n","// This file was autogenerated from\n// https://github.com/grafana/icons\n\nimport u1141 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-after.svg';\nimport u1142 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-before.svg';\nimport u1143 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-center.svg';\nimport u1137 from '!!raw-loader!../../../../../public/img/icons/custom/gf-grid.svg';\nimport u1144 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-linear.svg';\nimport u1145 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-smooth.svg';\nimport u1146 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-step-after.svg';\nimport u1147 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-step-before.svg';\nimport u1138 from '!!raw-loader!../../../../../public/img/icons/custom/gf-landscape.svg';\nimport u1139 from '!!raw-loader!../../../../../public/img/icons/custom/gf-layout-simple.svg';\nimport u1148 from '!!raw-loader!../../../../../public/img/icons/custom/gf-logs.svg';\nimport u1140 from '!!raw-loader!../../../../../public/img/icons/custom/gf-portrait.svg';\nimport u1149 from '!!raw-loader!../../../../../public/img/icons/mono/favorite.svg';\nimport u1150 from '!!raw-loader!../../../../../public/img/icons/mono/grafana.svg';\nimport u1152 from '!!raw-loader!../../../../../public/img/icons/mono/heart-break.svg';\nimport u1151 from '!!raw-loader!../../../../../public/img/icons/mono/heart.svg';\nimport u1154 from '!!raw-loader!../../../../../public/img/icons/mono/library-panel.svg';\nimport u1153 from '!!raw-loader!../../../../../public/img/icons/mono/panel-add.svg';\nimport u1001 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-double-down.svg';\nimport u1002 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-double-right.svg';\nimport u1003 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-down.svg';\nimport u1004 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-left.svg';\nimport u1005 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-right.svg';\nimport u1006 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-up.svg';\nimport u1007 from '!!raw-loader!../../../../../public/img/icons/unicons/apps.svg';\nimport u1009 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow-down.svg';\nimport u1010 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow-from-right.svg';\nimport u1011 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow-left.svg';\nimport u1012 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow-random.svg';\nimport u1013 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow-right.svg';\nimport u1014 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow-up.svg';\nimport u1008 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow.svg';\nimport u1015 from '!!raw-loader!../../../../../public/img/icons/unicons/arrows-h.svg';\nimport u1016 from '!!raw-loader!../../../../../public/img/icons/unicons/backward.svg';\nimport u1017 from '!!raw-loader!../../../../../public/img/icons/unicons/bars.svg';\nimport u1019 from '!!raw-loader!../../../../../public/img/icons/unicons/bell-slash.svg';\nimport u1018 from '!!raw-loader!../../../../../public/img/icons/unicons/bell.svg';\nimport u1020 from '!!raw-loader!../../../../../public/img/icons/unicons/bolt.svg';\nimport u1022 from '!!raw-loader!../../../../../public/img/icons/unicons/book-open.svg';\nimport u1021 from '!!raw-loader!../../../../../public/img/icons/unicons/book.svg';\nimport u1023 from '!!raw-loader!../../../../../public/img/icons/unicons/brackets-curly.svg';\nimport u1024 from '!!raw-loader!../../../../../public/img/icons/unicons/bug.svg';\nimport u1025 from '!!raw-loader!../../../../../public/img/icons/unicons/building.svg';\nimport u1026 from '!!raw-loader!../../../../../public/img/icons/unicons/calculator-alt.svg';\nimport u1027 from '!!raw-loader!../../../../../public/img/icons/unicons/calendar-alt.svg';\nimport u1028 from '!!raw-loader!../../../../../public/img/icons/unicons/camera.svg';\nimport u1136 from '!!raw-loader!../../../../../public/img/icons/unicons/capture.svg';\nimport u1029 from '!!raw-loader!../../../../../public/img/icons/unicons/channel-add.svg';\nimport u1030 from '!!raw-loader!../../../../../public/img/icons/unicons/chart-line.svg';\nimport u1032 from '!!raw-loader!../../../../../public/img/icons/unicons/check-circle.svg';\nimport u1031 from '!!raw-loader!../../../../../public/img/icons/unicons/check.svg';\nimport u1033 from '!!raw-loader!../../../../../public/img/icons/unicons/circle.svg';\nimport u1034 from '!!raw-loader!../../../../../public/img/icons/unicons/clipboard-alt.svg';\nimport u1035 from '!!raw-loader!../../../../../public/img/icons/unicons/clock-nine.svg';\nimport u1037 from '!!raw-loader!../../../../../public/img/icons/unicons/cloud-download.svg';\nimport u1122 from '!!raw-loader!../../../../../public/img/icons/unicons/cloud-upload.svg';\nimport u1036 from '!!raw-loader!../../../../../public/img/icons/unicons/cloud.svg';\nimport u1038 from '!!raw-loader!../../../../../public/img/icons/unicons/code-branch.svg';\nimport u1039 from '!!raw-loader!../../../../../public/img/icons/unicons/cog.svg';\nimport u1040 from '!!raw-loader!../../../../../public/img/icons/unicons/columns.svg';\nimport u1042 from '!!raw-loader!../../../../../public/img/icons/unicons/comment-alt-share.svg';\nimport u1041 from '!!raw-loader!../../../../../public/img/icons/unicons/comment-alt.svg';\nimport u1043 from '!!raw-loader!../../../../../public/img/icons/unicons/comments-alt.svg';\nimport u1044 from '!!raw-loader!../../../../../public/img/icons/unicons/compass.svg';\nimport u1045 from '!!raw-loader!../../../../../public/img/icons/unicons/copy.svg';\nimport u1123 from '!!raw-loader!../../../../../public/img/icons/unicons/credit-card.svg';\nimport u1046 from '!!raw-loader!../../../../../public/img/icons/unicons/cube.svg';\nimport u1047 from '!!raw-loader!../../../../../public/img/icons/unicons/dashboard.svg';\nimport u1048 from '!!raw-loader!../../../../../public/img/icons/unicons/database.svg';\nimport u1049 from '!!raw-loader!../../../../../public/img/icons/unicons/document-info.svg';\nimport u1050 from '!!raw-loader!../../../../../public/img/icons/unicons/download-alt.svg';\nimport u1051 from '!!raw-loader!../../../../../public/img/icons/unicons/draggabledots.svg';\nimport u1052 from '!!raw-loader!../../../../../public/img/icons/unicons/edit.svg';\nimport u1053 from '!!raw-loader!../../../../../public/img/icons/unicons/ellipsis-v.svg';\nimport u1054 from '!!raw-loader!../../../../../public/img/icons/unicons/envelope.svg';\nimport u1055 from '!!raw-loader!../../../../../public/img/icons/unicons/exchange-alt.svg';\nimport u1056 from '!!raw-loader!../../../../../public/img/icons/unicons/exclamation-triangle.svg';\nimport u1057 from '!!raw-loader!../../../../../public/img/icons/unicons/external-link-alt.svg';\nimport u1059 from '!!raw-loader!../../../../../public/img/icons/unicons/eye-slash.svg';\nimport u1058 from '!!raw-loader!../../../../../public/img/icons/unicons/eye.svg';\nimport u1060 from '!!raw-loader!../../../../../public/img/icons/unicons/file-alt.svg';\nimport u1061 from '!!raw-loader!../../../../../public/img/icons/unicons/file-blank.svg';\nimport u1124 from '!!raw-loader!../../../../../public/img/icons/unicons/file-copy-alt.svg';\nimport u1062 from '!!raw-loader!../../../../../public/img/icons/unicons/filter.svg';\nimport u1125 from '!!raw-loader!../../../../../public/img/icons/unicons/fire.svg';\nimport u1064 from '!!raw-loader!../../../../../public/img/icons/unicons/folder-open.svg';\nimport u1065 from '!!raw-loader!../../../../../public/img/icons/unicons/folder-plus.svg';\nimport u1066 from '!!raw-loader!../../../../../public/img/icons/unicons/folder-upload.svg';\nimport u1063 from '!!raw-loader!../../../../../public/img/icons/unicons/folder.svg';\nimport u1067 from '!!raw-loader!../../../../../public/img/icons/unicons/forward.svg';\nimport u1068 from '!!raw-loader!../../../../../public/img/icons/unicons/graph-bar.svg';\nimport u1069 from '!!raw-loader!../../../../../public/img/icons/unicons/history.svg';\nimport u1070 from '!!raw-loader!../../../../../public/img/icons/unicons/home-alt.svg';\nimport u1158 from '!!raw-loader!../../../../../public/img/icons/unicons/horizontal-align-center.svg';\nimport u1156 from '!!raw-loader!../../../../../public/img/icons/unicons/horizontal-align-left.svg';\nimport u1157 from '!!raw-loader!../../../../../public/img/icons/unicons/horizontal-align-right.svg';\nimport u1126 from '!!raw-loader!../../../../../public/img/icons/unicons/hourglass.svg';\nimport u1071 from '!!raw-loader!../../../../../public/img/icons/unicons/import.svg';\nimport u1073 from '!!raw-loader!../../../../../public/img/icons/unicons/info-circle.svg';\nimport u1072 from '!!raw-loader!../../../../../public/img/icons/unicons/info.svg';\nimport u1074 from '!!raw-loader!../../../../../public/img/icons/unicons/key-skeleton-alt.svg';\nimport u1075 from '!!raw-loader!../../../../../public/img/icons/unicons/keyboard.svg';\nimport u1127 from '!!raw-loader!../../../../../public/img/icons/unicons/layer-group.svg';\nimport u1128 from '!!raw-loader!../../../../../public/img/icons/unicons/line-alt.svg';\nimport u1076 from '!!raw-loader!../../../../../public/img/icons/unicons/link.svg';\nimport u1129 from '!!raw-loader!../../../../../public/img/icons/unicons/list-ui-alt.svg';\nimport u1077 from '!!raw-loader!../../../../../public/img/icons/unicons/list-ul.svg';\nimport u1078 from '!!raw-loader!../../../../../public/img/icons/unicons/lock.svg';\nimport u1130 from '!!raw-loader!../../../../../public/img/icons/unicons/message.svg';\nimport u1080 from '!!raw-loader!../../../../../public/img/icons/unicons/minus-circle.svg';\nimport u1079 from '!!raw-loader!../../../../../public/img/icons/unicons/minus.svg';\nimport u1081 from '!!raw-loader!../../../../../public/img/icons/unicons/mobile-android.svg';\nimport u1082 from '!!raw-loader!../../../../../public/img/icons/unicons/monitor.svg';\nimport u1131 from '!!raw-loader!../../../../../public/img/icons/unicons/palette.svg';\nimport u1083 from '!!raw-loader!../../../../../public/img/icons/unicons/pause.svg';\nimport u1084 from '!!raw-loader!../../../../../public/img/icons/unicons/pen.svg';\nimport u1132 from '!!raw-loader!../../../../../public/img/icons/unicons/percentage.svg';\nimport u1085 from '!!raw-loader!../../../../../public/img/icons/unicons/play.svg';\nimport u1086 from '!!raw-loader!../../../../../public/img/icons/unicons/plug.svg';\nimport u1088 from '!!raw-loader!../../../../../public/img/icons/unicons/plus-circle.svg';\nimport u1134 from '!!raw-loader!../../../../../public/img/icons/unicons/plus-square.svg';\nimport u1087 from '!!raw-loader!../../../../../public/img/icons/unicons/plus.svg';\nimport u1089 from '!!raw-loader!../../../../../public/img/icons/unicons/power.svg';\nimport u1090 from '!!raw-loader!../../../../../public/img/icons/unicons/presentation-play.svg';\nimport u1091 from '!!raw-loader!../../../../../public/img/icons/unicons/process.svg';\nimport u1092 from '!!raw-loader!../../../../../public/img/icons/unicons/question-circle.svg';\nimport u1155 from '!!raw-loader!../../../../../public/img/icons/unicons/record-audio.svg';\nimport u1093 from '!!raw-loader!../../../../../public/img/icons/unicons/repeat.svg';\nimport u1094 from '!!raw-loader!../../../../../public/img/icons/unicons/rocket.svg';\nimport u1095 from '!!raw-loader!../../../../../public/img/icons/unicons/save.svg';\nimport u1097 from '!!raw-loader!../../../../../public/img/icons/unicons/search-minus.svg';\nimport u1098 from '!!raw-loader!../../../../../public/img/icons/unicons/search-plus.svg';\nimport u1096 from '!!raw-loader!../../../../../public/img/icons/unicons/search.svg';\nimport u1099 from '!!raw-loader!../../../../../public/img/icons/unicons/share-alt.svg';\nimport u1133 from '!!raw-loader!../../../../../public/img/icons/unicons/shield-exclamation.svg';\nimport u1100 from '!!raw-loader!../../../../../public/img/icons/unicons/shield.svg';\nimport u1101 from '!!raw-loader!../../../../../public/img/icons/unicons/signal.svg';\nimport u1102 from '!!raw-loader!../../../../../public/img/icons/unicons/signin.svg';\nimport u1103 from '!!raw-loader!../../../../../public/img/icons/unicons/signout.svg';\nimport u1104 from '!!raw-loader!../../../../../public/img/icons/unicons/sitemap.svg';\nimport u1105 from '!!raw-loader!../../../../../public/img/icons/unicons/slack.svg';\nimport u1106 from '!!raw-loader!../../../../../public/img/icons/unicons/sliders-v-alt.svg';\nimport u1107 from '!!raw-loader!../../../../../public/img/icons/unicons/sort-amount-down.svg';\nimport u1108 from '!!raw-loader!../../../../../public/img/icons/unicons/sort-amount-up.svg';\nimport u1109 from '!!raw-loader!../../../../../public/img/icons/unicons/square-shape.svg';\nimport u1110 from '!!raw-loader!../../../../../public/img/icons/unicons/star.svg';\nimport u1111 from '!!raw-loader!../../../../../public/img/icons/unicons/step-backward.svg';\nimport u1112 from '!!raw-loader!../../../../../public/img/icons/unicons/sync.svg';\nimport u1113 from '!!raw-loader!../../../../../public/img/icons/unicons/table.svg';\nimport u1114 from '!!raw-loader!../../../../../public/img/icons/unicons/tag-alt.svg';\nimport u1115 from '!!raw-loader!../../../../../public/img/icons/unicons/times.svg';\nimport u1116 from '!!raw-loader!../../../../../public/img/icons/unicons/trash-alt.svg';\nimport u1117 from '!!raw-loader!../../../../../public/img/icons/unicons/unlock.svg';\nimport u1118 from '!!raw-loader!../../../../../public/img/icons/unicons/upload.svg';\nimport u1119 from '!!raw-loader!../../../../../public/img/icons/unicons/user.svg';\nimport u1120 from '!!raw-loader!../../../../../public/img/icons/unicons/users-alt.svg';\nimport u1160 from '!!raw-loader!../../../../../public/img/icons/unicons/vertical-align-bottom.svg';\nimport u1161 from '!!raw-loader!../../../../../public/img/icons/unicons/vertical-align-center.svg';\nimport u1159 from '!!raw-loader!../../../../../public/img/icons/unicons/vertical-align-top.svg';\nimport u1121 from '!!raw-loader!../../../../../public/img/icons/unicons/wrap-text.svg';\nimport u1135 from '!!raw-loader!../../../../../public/img/icons/unicons/x.svg';\nimport { cacheStore } from 'react-inlinesvg';\n\nexport let cacheInitialized = false;\nexport let iconRoot = 'public/img/icons';\n\nfunction cacheItem(content: string, path: string) {\n cacheStore[iconRoot + path] = { content, status: 'loaded' };\n}\n\nexport function initIconCache() {\n cacheInitialized = true;\n\n // This function needs to be called after index.js loads to give the\n // application time to modify __webpack_public_path__ with a CDN path\n const grafanaPublicPath = typeof window !== 'undefined' && (window as any).__grafana_public_path__;\n if (grafanaPublicPath) {\n iconRoot = grafanaPublicPath + 'img/icons/';\n }\n cacheItem(u1001, 'unicons/angle-double-down.svg');\n cacheItem(u1002, 'unicons/angle-double-right.svg');\n cacheItem(u1003, 'unicons/angle-down.svg');\n cacheItem(u1004, 'unicons/angle-left.svg');\n cacheItem(u1005, 'unicons/angle-right.svg');\n cacheItem(u1006, 'unicons/angle-up.svg');\n cacheItem(u1007, 'unicons/apps.svg');\n cacheItem(u1008, 'unicons/arrow.svg');\n cacheItem(u1009, 'unicons/arrow-down.svg');\n cacheItem(u1010, 'unicons/arrow-from-right.svg');\n cacheItem(u1011, 'unicons/arrow-left.svg');\n cacheItem(u1012, 'unicons/arrow-random.svg');\n cacheItem(u1013, 'unicons/arrow-right.svg');\n cacheItem(u1014, 'unicons/arrow-up.svg');\n cacheItem(u1015, 'unicons/arrows-h.svg');\n cacheItem(u1016, 'unicons/backward.svg');\n cacheItem(u1017, 'unicons/bars.svg');\n cacheItem(u1018, 'unicons/bell.svg');\n cacheItem(u1019, 'unicons/bell-slash.svg');\n cacheItem(u1020, 'unicons/bolt.svg');\n cacheItem(u1021, 'unicons/book.svg');\n cacheItem(u1022, 'unicons/book-open.svg');\n cacheItem(u1023, 'unicons/brackets-curly.svg');\n cacheItem(u1024, 'unicons/bug.svg');\n cacheItem(u1025, 'unicons/building.svg');\n cacheItem(u1026, 'unicons/calculator-alt.svg');\n cacheItem(u1027, 'unicons/calendar-alt.svg');\n cacheItem(u1028, 'unicons/camera.svg');\n cacheItem(u1029, 'unicons/channel-add.svg');\n cacheItem(u1030, 'unicons/chart-line.svg');\n cacheItem(u1031, 'unicons/check.svg');\n cacheItem(u1032, 'unicons/check-circle.svg');\n cacheItem(u1033, 'unicons/circle.svg');\n cacheItem(u1034, 'unicons/clipboard-alt.svg');\n cacheItem(u1035, 'unicons/clock-nine.svg');\n cacheItem(u1036, 'unicons/cloud.svg');\n cacheItem(u1037, 'unicons/cloud-download.svg');\n cacheItem(u1038, 'unicons/code-branch.svg');\n cacheItem(u1039, 'unicons/cog.svg');\n cacheItem(u1040, 'unicons/columns.svg');\n cacheItem(u1041, 'unicons/comment-alt.svg');\n cacheItem(u1042, 'unicons/comment-alt-share.svg');\n cacheItem(u1043, 'unicons/comments-alt.svg');\n cacheItem(u1044, 'unicons/compass.svg');\n cacheItem(u1045, 'unicons/copy.svg');\n cacheItem(u1046, 'unicons/cube.svg');\n cacheItem(u1047, 'unicons/dashboard.svg');\n cacheItem(u1048, 'unicons/database.svg');\n cacheItem(u1049, 'unicons/document-info.svg');\n cacheItem(u1050, 'unicons/download-alt.svg');\n cacheItem(u1051, 'unicons/draggabledots.svg');\n cacheItem(u1052, 'unicons/edit.svg');\n cacheItem(u1053, 'unicons/ellipsis-v.svg');\n cacheItem(u1054, 'unicons/envelope.svg');\n cacheItem(u1055, 'unicons/exchange-alt.svg');\n cacheItem(u1056, 'unicons/exclamation-triangle.svg');\n cacheItem(u1057, 'unicons/external-link-alt.svg');\n cacheItem(u1058, 'unicons/eye.svg');\n cacheItem(u1059, 'unicons/eye-slash.svg');\n cacheItem(u1060, 'unicons/file-alt.svg');\n cacheItem(u1061, 'unicons/file-blank.svg');\n cacheItem(u1062, 'unicons/filter.svg');\n cacheItem(u1063, 'unicons/folder.svg');\n cacheItem(u1064, 'unicons/folder-open.svg');\n cacheItem(u1065, 'unicons/folder-plus.svg');\n cacheItem(u1066, 'unicons/folder-upload.svg');\n cacheItem(u1067, 'unicons/forward.svg');\n cacheItem(u1068, 'unicons/graph-bar.svg');\n cacheItem(u1069, 'unicons/history.svg');\n cacheItem(u1070, 'unicons/home-alt.svg');\n cacheItem(u1071, 'unicons/import.svg');\n cacheItem(u1072, 'unicons/info.svg');\n cacheItem(u1073, 'unicons/info-circle.svg');\n cacheItem(u1074, 'unicons/key-skeleton-alt.svg');\n cacheItem(u1075, 'unicons/keyboard.svg');\n cacheItem(u1076, 'unicons/link.svg');\n cacheItem(u1077, 'unicons/list-ul.svg');\n cacheItem(u1078, 'unicons/lock.svg');\n cacheItem(u1079, 'unicons/minus.svg');\n cacheItem(u1080, 'unicons/minus-circle.svg');\n cacheItem(u1081, 'unicons/mobile-android.svg');\n cacheItem(u1082, 'unicons/monitor.svg');\n cacheItem(u1083, 'unicons/pause.svg');\n cacheItem(u1084, 'unicons/pen.svg');\n cacheItem(u1085, 'unicons/play.svg');\n cacheItem(u1086, 'unicons/plug.svg');\n cacheItem(u1087, 'unicons/plus.svg');\n cacheItem(u1088, 'unicons/plus-circle.svg');\n cacheItem(u1089, 'unicons/power.svg');\n cacheItem(u1090, 'unicons/presentation-play.svg');\n cacheItem(u1091, 'unicons/process.svg');\n cacheItem(u1092, 'unicons/question-circle.svg');\n cacheItem(u1093, 'unicons/repeat.svg');\n cacheItem(u1094, 'unicons/rocket.svg');\n cacheItem(u1095, 'unicons/save.svg');\n cacheItem(u1096, 'unicons/search.svg');\n cacheItem(u1097, 'unicons/search-minus.svg');\n cacheItem(u1098, 'unicons/search-plus.svg');\n cacheItem(u1099, 'unicons/share-alt.svg');\n cacheItem(u1100, 'unicons/shield.svg');\n cacheItem(u1101, 'unicons/signal.svg');\n cacheItem(u1102, 'unicons/signin.svg');\n cacheItem(u1103, 'unicons/signout.svg');\n cacheItem(u1104, 'unicons/sitemap.svg');\n cacheItem(u1105, 'unicons/slack.svg');\n cacheItem(u1106, 'unicons/sliders-v-alt.svg');\n cacheItem(u1107, 'unicons/sort-amount-down.svg');\n cacheItem(u1108, 'unicons/sort-amount-up.svg');\n cacheItem(u1109, 'unicons/square-shape.svg');\n cacheItem(u1110, 'unicons/star.svg');\n cacheItem(u1111, 'unicons/step-backward.svg');\n cacheItem(u1112, 'unicons/sync.svg');\n cacheItem(u1113, 'unicons/table.svg');\n cacheItem(u1114, 'unicons/tag-alt.svg');\n cacheItem(u1115, 'unicons/times.svg');\n cacheItem(u1116, 'unicons/trash-alt.svg');\n cacheItem(u1117, 'unicons/unlock.svg');\n cacheItem(u1118, 'unicons/upload.svg');\n cacheItem(u1119, 'unicons/user.svg');\n cacheItem(u1120, 'unicons/users-alt.svg');\n cacheItem(u1121, 'unicons/wrap-text.svg');\n cacheItem(u1122, 'unicons/cloud-upload.svg');\n cacheItem(u1123, 'unicons/credit-card.svg');\n cacheItem(u1124, 'unicons/file-copy-alt.svg');\n cacheItem(u1125, 'unicons/fire.svg');\n cacheItem(u1126, 'unicons/hourglass.svg');\n cacheItem(u1127, 'unicons/layer-group.svg');\n cacheItem(u1128, 'unicons/line-alt.svg');\n cacheItem(u1129, 'unicons/list-ui-alt.svg');\n cacheItem(u1130, 'unicons/message.svg');\n cacheItem(u1131, 'unicons/palette.svg');\n cacheItem(u1132, 'unicons/percentage.svg');\n cacheItem(u1133, 'unicons/shield-exclamation.svg');\n cacheItem(u1134, 'unicons/plus-square.svg');\n cacheItem(u1135, 'unicons/x.svg');\n cacheItem(u1136, 'unicons/capture.svg');\n cacheItem(u1137, 'custom/gf-grid.svg');\n cacheItem(u1138, 'custom/gf-landscape.svg');\n cacheItem(u1139, 'custom/gf-layout-simple.svg');\n cacheItem(u1140, 'custom/gf-portrait.svg');\n cacheItem(u1141, 'custom/gf-bar-alignment-after.svg');\n cacheItem(u1142, 'custom/gf-bar-alignment-before.svg');\n cacheItem(u1143, 'custom/gf-bar-alignment-center.svg');\n cacheItem(u1144, 'custom/gf-interpolation-linear.svg');\n cacheItem(u1145, 'custom/gf-interpolation-smooth.svg');\n cacheItem(u1146, 'custom/gf-interpolation-step-after.svg');\n cacheItem(u1147, 'custom/gf-interpolation-step-before.svg');\n cacheItem(u1148, 'custom/gf-logs.svg');\n cacheItem(u1149, 'mono/favorite.svg');\n cacheItem(u1150, 'mono/grafana.svg');\n cacheItem(u1151, 'mono/heart.svg');\n cacheItem(u1152, 'mono/heart-break.svg');\n cacheItem(u1153, 'mono/panel-add.svg');\n cacheItem(u1154, 'mono/library-panel.svg');\n cacheItem(u1155, 'unicons/record-audio.svg');\n cacheItem(u1156, 'unicons/horizontal-align-left.svg');\n cacheItem(u1157, 'unicons/horizontal-align-right.svg');\n cacheItem(u1158, 'unicons/horizontal-align-center.svg');\n cacheItem(u1159, 'unicons/vertical-align-top.svg');\n cacheItem(u1160, 'unicons/vertical-align-bottom.svg');\n cacheItem(u1161, 'unicons/vertical-align-center.svg');\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { IconName, IconType, IconSize } from '../../types/icon';\n\nimport { cacheInitialized, initIconCache, iconRoot } from './iconBundle';\nimport { getIconSubDir, getSvgSize } from './utils';\n\nexport interface IconProps extends React.HTMLAttributes<HTMLDivElement> {\n name: IconName;\n size?: IconSize;\n type?: IconType;\n title?: string;\n}\n\nconst getIconStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n // line-height: 0; is needed for correct icon alignment in Safari\n container: css`\n label: Icon;\n display: inline-block;\n line-height: 0;\n `,\n icon: css`\n vertical-align: middle;\n display: inline-block;\n fill: currentColor;\n `,\n orange: css`\n fill: ${theme.palette.orange};\n `,\n };\n});\n\nexport const Icon = React.forwardRef<HTMLDivElement, IconProps>(\n ({ size = 'md', type = 'default', name, className, style, title = '', ...divElementProps }, ref) => {\n const theme = useTheme();\n\n /* Temporary solution to display also font awesome icons */\n if (name?.startsWith('fa fa-')) {\n return <i className={getFontAwesomeIconStyles(name, className)} {...divElementProps} style={style} />;\n }\n\n if (name === 'panel-add') {\n size = 'xl';\n }\n\n if (!cacheInitialized) {\n initIconCache();\n }\n\n const styles = getIconStyles(theme);\n const svgSize = getSvgSize(size);\n const svgHgt = svgSize;\n const svgWid = name?.startsWith('gf-bar-align') ? 16 : name?.startsWith('gf-interp') ? 30 : svgSize;\n const subDir = getIconSubDir(name, type);\n const svgPath = `${iconRoot}${subDir}/${name}.svg`;\n\n return (\n <div className={styles.container} {...divElementProps} ref={ref}>\n <SVG\n src={svgPath}\n width={svgWid}\n height={svgHgt}\n title={title}\n className={cx(styles.icon, className, type === 'mono' ? { [styles.orange]: name === 'favorite' } : '')}\n style={style}\n />\n </div>\n );\n }\n);\n\nIcon.displayName = 'Icon';\n\nfunction getFontAwesomeIconStyles(iconName: string, className?: string): string {\n return cx(\n iconName,\n {\n 'fa-spin': iconName === 'fa fa-spinner',\n },\n className\n );\n}\n","import { IconName, IconSize } from '../../types/icon';\n\nconst alwaysMonoIcons: IconName[] = ['grafana', 'favorite', 'heart-break', 'heart', 'panel-add', 'library-panel'];\n\nexport function getIconSubDir(name: IconName, type: string): string {\n if (name?.startsWith('gf-')) {\n return 'custom';\n } else if (alwaysMonoIcons.includes(name)) {\n return 'mono';\n } else if (type === 'default') {\n return 'unicons';\n } else if (type === 'solid') {\n return 'solid';\n } else {\n return 'mono';\n }\n}\n\n/* Transform string with px to number and add 2 pxs as path in svg is 2px smaller */\nexport function getSvgSize(size: IconSize) {\n switch (size) {\n case 'xs':\n return 12;\n case 'sm':\n return 14;\n case 'md':\n return 16;\n case 'lg':\n return 18;\n case 'xl':\n return 24;\n case 'xxl':\n return 36;\n case 'xxxl':\n return 48;\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, colorManipulator } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { IconName, IconSize, IconType } from '../../types/icon';\nimport { Icon } from '../Icon/Icon';\nimport { getSvgSize } from '../Icon/utils';\nimport { TooltipPlacement, PopoverContent, Tooltip } from '../Tooltip';\n\nexport type IconButtonVariant = 'primary' | 'secondary' | 'destructive';\n\nexport interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Name of the icon **/\n name: IconName;\n /** Icon size */\n size?: IconSize;\n /** Type od the icon - mono or default */\n iconType?: IconType;\n /** Tooltip content to display on hover */\n tooltip?: PopoverContent;\n /** Position of the tooltip */\n tooltipPlacement?: TooltipPlacement;\n /** Variant to change the color of the Icon */\n variant?: IconButtonVariant;\n /** Text avilable ony for screenscreen readers. Will use tooltip text as fallback. */\n ariaLabel?: string;\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, Props>(\n (\n {\n name,\n size = 'md',\n iconType,\n tooltip,\n tooltipPlacement,\n ariaLabel,\n className,\n variant = 'secondary',\n ...restProps\n },\n ref\n ) => {\n const theme = useTheme2();\n const styles = getStyles(theme, size, variant);\n const tooltipString = typeof tooltip === 'string' ? tooltip : '';\n\n const button = (\n <button ref={ref} aria-label={ariaLabel || tooltipString} {...restProps} className={cx(styles.button, className)}>\n <Icon name={name} size={size} className={styles.icon} type={iconType} />\n </button>\n );\n\n if (tooltip) {\n return (\n <Tooltip content={tooltip} placement={tooltipPlacement}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n }\n);\n\nIconButton.displayName = 'IconButton';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, size: IconSize, variant: IconButtonVariant) => {\n const pixelSize = getSvgSize(size);\n const hoverSize = Math.max(pixelSize / 3, 8);\n let iconColor = theme.colors.text.primary;\n\n if (variant === 'primary') {\n iconColor = theme.colors.primary.text;\n } else if (variant === 'destructive') {\n iconColor = theme.colors.error.text;\n }\n\n return {\n button: css`\n width: ${pixelSize}px;\n height: ${pixelSize}px;\n background: transparent;\n border: none;\n color: ${iconColor};\n padding: 0;\n margin: 0;\n outline: none;\n box-shadow: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n border-radius: ${theme.shape.borderRadius()};\n z-index: 0;\n margin-right: ${theme.spacing(0.5)};\n\n &[disabled],\n &:disabled {\n cursor: not-allowed;\n color: ${theme.colors.action.disabledText};\n opacity: 0.65;\n box-shadow: none;\n }\n\n &:before {\n content: '';\n display: block;\n opacity: 1;\n position: absolute;\n transition-duration: 0.2s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n z-index: -1;\n bottom: -${hoverSize}px;\n left: -${hoverSize}px;\n right: -${hoverSize}px;\n top: -${hoverSize}px;\n background: none;\n border-radius: 50%;\n box-sizing: border-box;\n transform: scale(0);\n transition-property: transform, opacity;\n }\n\n &:focus,\n &:focus-visible {\n ${getFocusStyles(theme)}\n }\n\n &:focus:not(:focus-visible) {\n ${getMouseFocusStyles(theme)}\n }\n\n &:hover {\n color: ${iconColor};\n\n &:before {\n background-color: ${variant === 'secondary'\n ? theme.colors.action.hover\n : colorManipulator.alpha(iconColor, 0.12)};\n border: none;\n box-shadow: none;\n opacity: 1;\n transform: scale(0.8);\n }\n }\n `,\n icon: css`\n vertical-align: baseline;\n display: flex;\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLProps, ReactNode } from 'react';\nimport useMeasure from 'react-use/lib/useMeasure';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { getFocusStyle, sharedInputStyle } from '../Forms/commonStyles';\nimport { Spinner } from '../Spinner/Spinner';\n\nexport interface Props extends Omit<HTMLProps<HTMLInputElement>, 'prefix' | 'size'> {\n /** Sets the width to a multiple of 8px. Should only be used with inline forms. Setting width of the container is preferred in other cases.*/\n width?: number;\n /** Show an invalid state around the input */\n invalid?: boolean;\n /** Show an icon as a prefix in the input */\n prefix?: ReactNode;\n /** Show an icon as a suffix in the input */\n suffix?: ReactNode;\n /** Show a loading indicator as a suffix in the input */\n loading?: boolean;\n /** Add a component as an addon before the input */\n addonBefore?: ReactNode;\n /** Add a component as an addon after the input */\n addonAfter?: ReactNode;\n}\n\ninterface StyleDeps {\n theme: GrafanaTheme2;\n invalid?: boolean;\n width?: number;\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, Props>((props, ref) => {\n const { className, addonAfter, addonBefore, prefix, suffix, invalid, loading, width = 0, ...restProps } = props;\n /**\n * Prefix & suffix are positioned absolutely within inputWrapper. We use client rects below to apply correct padding to the input\n * when prefix/suffix is larger than default (28px = 16px(icon) + 12px(left/right paddings)).\n * Thanks to that prefix/suffix do not overflow the input element itself.\n */\n const [prefixRef, prefixRect] = useMeasure<HTMLDivElement>();\n const [suffixRef, suffixRect] = useMeasure<HTMLDivElement>();\n\n const theme = useTheme2();\n const styles = getInputStyles({ theme, invalid: !!invalid, width });\n\n return (\n <div className={cx(styles.wrapper, className)} data-testid={'input-wrapper'}>\n {!!addonBefore && <div className={styles.addon}>{addonBefore}</div>}\n\n <div className={styles.inputWrapper}>\n {prefix && (\n <div className={styles.prefix} ref={prefixRef}>\n {prefix}\n </div>\n )}\n\n <input\n ref={ref}\n className={styles.input}\n {...restProps}\n style={{\n paddingLeft: prefix ? prefixRect.width + 12 : undefined,\n paddingRight: suffix || loading ? suffixRect.width + 12 : undefined,\n }}\n />\n\n {(suffix || loading) && (\n <div className={styles.suffix} ref={suffixRef}>\n {loading && <Spinner className={styles.loadingIndicator} inline={true} />}\n {suffix}\n </div>\n )}\n </div>\n\n {!!addonAfter && <div className={styles.addon}>{addonAfter}</div>}\n </div>\n );\n});\n\nInput.displayName = 'Input';\n\nexport const getInputStyles = stylesFactory(({ theme, invalid = false, width }: StyleDeps) => {\n const prefixSuffixStaticWidth = '28px';\n const prefixSuffix = css`\n position: absolute;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-grow: 0;\n flex-shrink: 0;\n font-size: ${theme.typography.size.md};\n height: 100%;\n /* Min width specified for prefix/suffix classes used outside React component*/\n min-width: ${prefixSuffixStaticWidth};\n color: ${theme.colors.text.secondary};\n `;\n\n return {\n // Wraps inputWrapper and addons\n wrapper: cx(\n css`\n label: input-wrapper;\n display: flex;\n width: ${width ? `${theme.spacing(width)}` : '100%'};\n height: ${theme.spacing(theme.components.height.md)};\n border-radius: ${theme.shape.borderRadius()};\n &:hover {\n > .prefix,\n .suffix,\n .input {\n border-color: ${invalid ? theme.colors.error.border : theme.colors.primary.border};\n }\n\n // only show number buttons on hover\n input[type='number'] {\n -moz-appearance: number-input;\n -webkit-appearance: number-input;\n appearance: textfield;\n }\n\n input[type='number']::-webkit-inner-spin-button,\n input[type='number']::-webkit-outer-spin-button {\n -webkit-appearance: inner-spin-button !important;\n opacity: 1;\n }\n }\n `\n ),\n // Wraps input and prefix/suffix\n inputWrapper: css`\n label: input-inputWrapper;\n position: relative;\n flex-grow: 1;\n /* we want input to be above addons, especially for focused state */\n z-index: 1;\n\n /* when input rendered with addon before only*/\n &:not(:first-child):last-child {\n > input {\n border-left: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n\n /* when input rendered with addon after only*/\n &:first-child:not(:last-child) {\n > input {\n border-right: none;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n /* when rendered with addon before and after */\n &:not(:first-child):not(:last-child) {\n > input {\n border-right: none;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n\n input {\n /* paddings specified for classes used outside React component */\n &:not(:first-child) {\n padding-left: ${prefixSuffixStaticWidth};\n }\n &:not(:last-child) {\n padding-right: ${prefixSuffixStaticWidth};\n }\n &[readonly] {\n cursor: default;\n }\n }\n `,\n\n input: cx(\n getFocusStyle(theme.v1),\n sharedInputStyle(theme, invalid),\n css`\n label: input-input;\n position: relative;\n z-index: 0;\n flex-grow: 1;\n border-radius: ${theme.shape.borderRadius()};\n height: 100%;\n width: 100%;\n `\n ),\n inputDisabled: css`\n background-color: ${theme.colors.action.disabledBackground};\n color: ${theme.colors.action.disabledText};\n border: 1px solid ${theme.colors.action.disabledBackground};\n &:focus {\n box-shadow: none;\n }\n `,\n addon: css`\n label: input-addon;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-grow: 0;\n flex-shrink: 0;\n position: relative;\n\n &:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n > :last-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n\n &:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n > :first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n }\n > *:focus {\n /* we want anything that has focus and is an addon to be above input */\n z-index: 2;\n }\n `,\n prefix: cx(\n prefixSuffix,\n css`\n label: input-prefix;\n padding-left: ${theme.spacing(1)};\n padding-right: ${theme.spacing(0.5)};\n border-right: none;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n `\n ),\n suffix: cx(\n prefixSuffix,\n css`\n label: input-suffix;\n padding-left: ${theme.spacing(1)};\n padding-right: ${theme.spacing(1)};\n margin-bottom: -2px;\n border-left: none;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n right: 0;\n `\n ),\n loadingIndicator: css`\n & + * {\n margin-left: ${theme.spacing(0.5)};\n }\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLProps } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { stylesFactory, useTheme } from '../../themes';\n\nenum Orientation {\n Horizontal,\n Vertical,\n}\ntype Spacing = 'none' | 'xs' | 'sm' | 'md' | 'lg';\ntype Justify = 'flex-start' | 'flex-end' | 'space-between' | 'center';\ntype Align = 'normal' | 'flex-start' | 'flex-end' | 'center';\n\nexport interface LayoutProps extends Omit<HTMLProps<HTMLDivElement>, 'align' | 'children' | 'wrap'> {\n children: React.ReactNode[] | React.ReactNode;\n orientation?: Orientation;\n spacing?: Spacing;\n justify?: Justify;\n align?: Align;\n width?: string;\n wrap?: boolean;\n}\n\nexport interface ContainerProps {\n padding?: Spacing;\n margin?: Spacing;\n grow?: number;\n shrink?: number;\n}\n\nexport const Layout: React.FC<LayoutProps> = ({\n children,\n orientation = Orientation.Horizontal,\n spacing = 'sm',\n justify = 'flex-start',\n align = 'normal',\n wrap = false,\n width = '100%',\n height = '100%',\n ...rest\n}) => {\n const theme = useTheme();\n const styles = getStyles(theme, orientation, spacing, justify, align, wrap);\n return (\n <div className={styles.layout} style={{ width, height }} {...rest}>\n {React.Children.toArray(children)\n .filter(Boolean)\n .map((child, index) => {\n return (\n <div className={styles.childWrapper} key={index}>\n {child}\n </div>\n );\n })}\n </div>\n );\n};\n\nexport const HorizontalGroup: React.FC<Omit<LayoutProps, 'orientation'>> = ({\n children,\n spacing,\n justify,\n align = 'center',\n wrap,\n width,\n height,\n}) => (\n <Layout\n spacing={spacing}\n justify={justify}\n orientation={Orientation.Horizontal}\n align={align}\n width={width}\n height={height}\n wrap={wrap}\n >\n {children}\n </Layout>\n);\nexport const VerticalGroup: React.FC<Omit<LayoutProps, 'orientation' | 'wrap'>> = ({\n children,\n spacing,\n justify,\n align,\n width,\n height,\n}) => (\n <Layout\n spacing={spacing}\n justify={justify}\n orientation={Orientation.Vertical}\n align={align}\n width={width}\n height={height}\n >\n {children}\n </Layout>\n);\n\nexport const Container: React.FC<ContainerProps> = ({ children, padding, margin, grow, shrink }) => {\n const theme = useTheme();\n const styles = getContainerStyles(theme, padding, margin);\n return (\n <div\n className={cx(\n styles.wrapper,\n grow !== undefined &&\n css`\n flex-grow: ${grow};\n `,\n shrink !== undefined &&\n css`\n flex-shrink: ${shrink};\n `\n )}\n >\n {children}\n </div>\n );\n};\n\nconst getStyles = stylesFactory(\n (theme: GrafanaTheme, orientation: Orientation, spacing: Spacing, justify: Justify, align, wrap) => {\n const finalSpacing = spacing !== 'none' ? theme.spacing[spacing] : 0;\n // compensate for last row margin when wrapped, horizontal layout\n const marginCompensation =\n (orientation === Orientation.Horizontal && !wrap) || orientation === Orientation.Vertical\n ? 0\n : `-${finalSpacing}`;\n\n const label = orientation === Orientation.Vertical ? 'vertical-group' : 'horizontal-group';\n\n return {\n layout: css`\n label: ${label};\n display: flex;\n flex-direction: ${orientation === Orientation.Vertical ? 'column' : 'row'};\n flex-wrap: ${wrap ? 'wrap' : 'nowrap'};\n justify-content: ${justify};\n align-items: ${align};\n height: 100%;\n max-width: 100%;\n // compensate for last row margin when wrapped, horizontal layout\n margin-bottom: ${marginCompensation};\n `,\n childWrapper: css`\n label: layoutChildrenWrapper;\n margin-bottom: ${orientation === Orientation.Horizontal && !wrap ? 0 : finalSpacing};\n margin-right: ${orientation === Orientation.Horizontal ? finalSpacing : 0};\n display: flex;\n align-items: ${align};\n\n &:last-child {\n margin-bottom: ${orientation === Orientation.Vertical && 0};\n margin-right: ${orientation === Orientation.Horizontal && 0};\n }\n `,\n };\n }\n);\n\nconst getContainerStyles = stylesFactory((theme: GrafanaTheme, padding?: Spacing, margin?: Spacing) => {\n const paddingSize = (padding && padding !== 'none' && theme.spacing[padding]) || 0;\n const marginSize = (margin && margin !== 'none' && theme.spacing[margin]) || 0;\n return {\n wrapper: css`\n label: container;\n margin: ${marginSize};\n padding: ${paddingSize};\n `,\n };\n});\n","import { cx, css } from '@emotion/css';\nimport React from 'react';\n\nimport { stylesFactory } from '../../themes';\n\nexport interface ListProps<T> {\n items: T[];\n renderItem: (item: T, index: number) => JSX.Element;\n getItemKey?: (item: T) => string;\n className?: string;\n}\n\ninterface AbstractListProps<T> extends ListProps<T> {\n inline?: boolean;\n}\n\nconst getStyles = stylesFactory((inlineList = false) => ({\n list: css`\n list-style-type: none;\n margin: 0;\n padding: 0;\n `,\n\n item: css`\n display: ${(inlineList && 'inline-block') || 'block'};\n `,\n}));\n\nexport class AbstractList<T> extends React.PureComponent<AbstractListProps<T>> {\n constructor(props: AbstractListProps<T>) {\n super(props);\n }\n\n render() {\n const { items, renderItem, getItemKey, className, inline } = this.props;\n const styles = getStyles(inline);\n\n return (\n <ul className={cx(styles.list, className)}>\n {items.map((item, i) => {\n return (\n <li className={styles.item} key={getItemKey ? getItemKey(item) : i}>\n {renderItem(item, i)}\n </li>\n );\n })}\n </ul>\n );\n }\n}\n","import React from 'react';\n\nimport { ListProps, AbstractList } from './AbstractList';\n\nexport class List<T> extends React.PureComponent<ListProps<T>> {\n render() {\n return <AbstractList {...this.props} />;\n }\n}\n","import ansicolor from 'ansicolor';\nimport React, { PureComponent } from 'react';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\n\nimport { findHighlightChunksInText, GrafanaTheme2 } from '@grafana/data';\n\nimport { withTheme2 } from '../../themes';\nimport { Themeable2 } from '../../types';\n\ninterface Style {\n [key: string]: string;\n}\n\ninterface ParsedChunk {\n style: Style;\n text: string;\n}\n\nfunction convertCSSToStyle(theme: GrafanaTheme2, css: string): Style {\n return css.split(/;\\s*/).reduce<Style>((accumulated, line) => {\n // The ansicolor package returns this color if the chunk has the ANSI dim\n // style (`\\e[2m`), but it is nearly unreadable in the dark theme, so we use\n // GrafanaTheme2 instead to style it in a way that works across all themes.\n if (line === 'color:rgba(0,0,0,0.5)') {\n return { color: theme.colors.text.secondary };\n }\n\n const match = line.match(/([^:\\s]+)\\s*:\\s*(.+)/);\n\n if (match && match[1] && match[2]) {\n const key = match[1].replace(/-([a-z])/g, (_, character) => character.toUpperCase());\n accumulated[key] = match[2];\n }\n\n return accumulated;\n }, {});\n}\n\ninterface Props extends Themeable2 {\n value: string;\n highlight?: {\n searchWords: string[];\n highlightClassName: string;\n };\n}\n\ninterface State {\n chunks: ParsedChunk[];\n prevValue: string;\n}\n\nexport class UnThemedLogMessageAnsi extends PureComponent<Props, State> {\n state: State = {\n chunks: [],\n prevValue: '',\n };\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.value === state.prevValue) {\n return null;\n }\n\n const parsed = ansicolor.parse(props.value);\n\n return {\n chunks: parsed.spans.map((span) => {\n return span.css\n ? {\n style: convertCSSToStyle(props.theme, span.css),\n text: span.text,\n }\n : { text: span.text };\n }),\n prevValue: props.value,\n };\n }\n\n render() {\n const { chunks } = this.state;\n\n return chunks.map((chunk, index) => {\n const chunkText = this.props.highlight?.searchWords ? (\n <Highlighter\n key={index}\n textToHighlight={chunk.text}\n searchWords={this.props.highlight.searchWords}\n findChunks={findHighlightChunksInText}\n highlightClassName={this.props.highlight.highlightClassName}\n />\n ) : (\n chunk.text\n );\n return chunk.style ? (\n <span key={index} style={chunk.style} data-testid=\"ansiLogLine\">\n {chunkText}\n </span>\n ) : (\n chunkText\n );\n });\n }\n}\n\nexport const LogMessageAnsi = withTheme2(UnThemedLogMessageAnsi);\nLogMessageAnsi.displayName = 'LogMessageAnsi';\n","import { css, cx } from '@emotion/css';\nimport React, { useRef, useState, useLayoutEffect, useEffect } from 'react';\n\nimport { GrafanaTheme, DataQueryError, LogRowModel, textUtil } from '@grafana/data';\n\nimport { useStyles, useTheme } from '../../themes/ThemeContext';\nimport { Alert } from '../Alert/Alert';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { List } from '../List/List';\n\nimport { LogMessageAnsi } from './LogMessageAnsi';\nimport { LogRowContextRows, LogRowContextQueryErrors, HasMoreContextRows } from './LogRowContextProvider';\n\ninterface LogRowContextProps {\n row: LogRowModel;\n context: LogRowContextRows;\n wrapLogMessage: boolean;\n errors?: LogRowContextQueryErrors;\n hasMoreContextRows?: HasMoreContextRows;\n onOutsideClick: () => void;\n onLoadMoreContext: () => void;\n}\n\nconst getLogRowContextStyles = (theme: GrafanaTheme, wrapLogMessage?: boolean) => {\n /**\n * This is workaround for displaying uncropped context when we have unwrapping log messages.\n * We are using margins to correctly position context. Because non-wrapped logs have always 1 line of log\n * and 1 line of Show/Hide context switch. Therefore correct position can be reliably achieved by margins.\n * We also adjust width to 75%.\n */\n\n const afterContext = wrapLogMessage\n ? css`\n top: -250px;\n `\n : css`\n margin-top: -250px;\n width: 75%;\n `;\n\n const beforeContext = wrapLogMessage\n ? css`\n top: 100%;\n `\n : css`\n margin-top: 40px;\n width: 75%;\n `;\n return {\n commonStyles: css`\n position: absolute;\n height: 250px;\n z-index: ${theme.zIndex.dropdown};\n overflow: hidden;\n background: ${theme.colors.bg1};\n box-shadow: 0 0 10px ${theme.colors.dropdownShadow};\n border: 1px solid ${theme.colors.bg2};\n border-radius: ${theme.border.radius.md};\n width: 100%;\n `,\n header: css`\n height: 30px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n background: ${theme.colors.bg2};\n `,\n logs: css`\n height: 220px;\n padding: 10px;\n `,\n afterContext,\n beforeContext,\n };\n};\n\ninterface LogRowContextGroupHeaderProps {\n row: LogRowModel;\n rows: Array<string | DataQueryError>;\n onLoadMoreContext: () => void;\n shouldScrollToBottom?: boolean;\n canLoadMoreRows?: boolean;\n}\ninterface LogRowContextGroupProps extends LogRowContextGroupHeaderProps {\n rows: Array<string | DataQueryError>;\n className?: string;\n error?: string;\n}\n\nconst LogRowContextGroupHeader: React.FunctionComponent<LogRowContextGroupHeaderProps> = ({\n row,\n rows,\n onLoadMoreContext,\n canLoadMoreRows,\n}) => {\n const { header } = useStyles(getLogRowContextStyles);\n\n return (\n <div className={header}>\n <span\n className={css`\n opacity: 0.6;\n `}\n >\n Found {rows.length} rows.\n </span>\n {(rows.length >= 10 || (rows.length > 10 && rows.length % 10 !== 0)) && canLoadMoreRows && (\n <span\n className={css`\n margin-left: 10px;\n &:hover {\n text-decoration: underline;\n cursor: pointer;\n }\n `}\n onClick={onLoadMoreContext}\n >\n Load 10 more\n </span>\n )}\n </div>\n );\n};\n\nexport const LogRowContextGroup: React.FunctionComponent<LogRowContextGroupProps> = ({\n row,\n rows,\n error,\n className,\n shouldScrollToBottom,\n canLoadMoreRows,\n onLoadMoreContext,\n}) => {\n const { commonStyles, logs } = useStyles(getLogRowContextStyles);\n const [scrollTop, setScrollTop] = useState(0);\n const listContainerRef = useRef<HTMLDivElement>() as React.RefObject<HTMLDivElement>;\n\n useLayoutEffect(() => {\n // We want to scroll to bottom only when we receive first 10 log lines\n const shouldScrollRows = rows.length > 0 && rows.length <= 10;\n if (shouldScrollToBottom && shouldScrollRows && listContainerRef.current) {\n setScrollTop(listContainerRef.current.offsetHeight);\n }\n }, [shouldScrollToBottom, rows]);\n\n const headerProps = {\n row,\n rows,\n onLoadMoreContext,\n canLoadMoreRows,\n };\n\n return (\n <div className={cx(commonStyles, className)}>\n {/* When displaying \"after\" context */}\n {shouldScrollToBottom && !error && <LogRowContextGroupHeader {...headerProps} />}\n <div className={logs}>\n <CustomScrollbar autoHide scrollTop={scrollTop} autoHeightMin={'210px'}>\n <div ref={listContainerRef}>\n {!error && (\n <List\n items={rows}\n renderItem={(item) => {\n return (\n <div\n className={css`\n padding: 5px 0;\n `}\n >\n {typeof item === 'string' && textUtil.hasAnsiCodes(item) ? <LogMessageAnsi value={item} /> : item}\n </div>\n );\n }}\n />\n )}\n {error && <Alert title={error} />}\n </div>\n </CustomScrollbar>\n </div>\n {/* When displaying \"before\" context */}\n {!shouldScrollToBottom && !error && <LogRowContextGroupHeader {...headerProps} />}\n </div>\n );\n};\n\nexport const LogRowContext: React.FunctionComponent<LogRowContextProps> = ({\n row,\n context,\n errors,\n onOutsideClick,\n onLoadMoreContext,\n hasMoreContextRows,\n wrapLogMessage,\n}) => {\n useEffect(() => {\n const handleEscKeyDown = (e: KeyboardEvent): void => {\n if (e.keyCode === 27) {\n onOutsideClick();\n }\n };\n document.addEventListener('keydown', handleEscKeyDown, false);\n return () => {\n document.removeEventListener('keydown', handleEscKeyDown, false);\n };\n }, [onOutsideClick]);\n const theme = useTheme();\n const { afterContext, beforeContext } = getLogRowContextStyles(theme, wrapLogMessage);\n\n return (\n <ClickOutsideWrapper onClick={onOutsideClick}>\n {/* e.stopPropagation is necessary so the log details doesn't open when clicked on log line in context\n * and/or when context log line is being highlighted */}\n <div onClick={(e) => e.stopPropagation()}>\n {context.after && (\n <LogRowContextGroup\n rows={context.after}\n error={errors && errors.after}\n row={row}\n className={afterContext}\n shouldScrollToBottom\n canLoadMoreRows={hasMoreContextRows ? hasMoreContextRows.after : false}\n onLoadMoreContext={onLoadMoreContext}\n />\n )}\n\n {context.before && (\n <LogRowContextGroup\n onLoadMoreContext={onLoadMoreContext}\n canLoadMoreRows={hasMoreContextRows ? hasMoreContextRows.before : false}\n row={row}\n rows={context.before}\n error={errors && errors.before}\n className={beforeContext}\n />\n )}\n </div>\n </ClickOutsideWrapper>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport memoizeOne from 'memoize-one';\nimport React, { PureComponent } from 'react';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\nimport tinycolor from 'tinycolor2';\n\nimport { LogRowModel, findHighlightChunksInText, GrafanaTheme2 } from '@grafana/data';\n\n// @ts-ignore\n\nimport { withTheme2 } from '../../themes/index';\nimport { Themeable2 } from '../../types/theme';\n\nimport { LogMessageAnsi } from './LogMessageAnsi';\nimport { LogRowContext } from './LogRowContext';\nimport { LogRowContextQueryErrors, HasMoreContextRows, LogRowContextRows } from './LogRowContextProvider';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\n\nexport const MAX_CHARACTERS = 100000;\n\ninterface Props extends Themeable2 {\n row: LogRowModel;\n hasMoreContextRows?: HasMoreContextRows;\n contextIsOpen: boolean;\n wrapLogMessage: boolean;\n prettifyLogMessage: boolean;\n errors?: LogRowContextQueryErrors;\n context?: LogRowContextRows;\n showContextToggle?: (row?: LogRowModel) => boolean;\n getRows: () => LogRowModel[];\n onToggleContext: () => void;\n updateLimit?: () => void;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const outlineColor = tinycolor(theme.components.dashboard.background).setAlpha(0.7).toRgbString();\n\n return {\n positionRelative: css`\n label: positionRelative;\n position: relative;\n `,\n rowWithContext: css`\n label: rowWithContext;\n z-index: 1;\n outline: 9999px solid ${outlineColor};\n `,\n horizontalScroll: css`\n label: verticalScroll;\n white-space: pre;\n `,\n contextNewline: css`\n display: block;\n margin-left: 0px;\n `,\n };\n};\n\nfunction renderLogMessage(\n hasAnsi: boolean,\n entry: string,\n highlights: string[] | undefined,\n highlightClassName: string\n) {\n const needsHighlighter =\n highlights && highlights.length > 0 && highlights[0] && highlights[0].length > 0 && entry.length < MAX_CHARACTERS;\n const searchWords = highlights ?? [];\n if (hasAnsi) {\n const highlight = needsHighlighter ? { searchWords, highlightClassName } : undefined;\n return <LogMessageAnsi value={entry} highlight={highlight} />;\n } else if (needsHighlighter) {\n return (\n <Highlighter\n textToHighlight={entry}\n searchWords={searchWords}\n findChunks={findHighlightChunksInText}\n highlightClassName={highlightClassName}\n />\n );\n } else {\n return entry;\n }\n}\n\nconst restructureLog = memoizeOne((line: string, prettifyLogMessage: boolean): string => {\n if (prettifyLogMessage) {\n try {\n return JSON.stringify(JSON.parse(line), undefined, 2);\n } catch (error) {\n return line;\n }\n }\n return line;\n});\n\nclass UnThemedLogRowMessage extends PureComponent<Props> {\n onContextToggle = (e: React.SyntheticEvent<HTMLElement>) => {\n e.stopPropagation();\n this.props.onToggleContext();\n };\n\n render() {\n const {\n row,\n theme,\n errors,\n hasMoreContextRows,\n updateLimit,\n context,\n contextIsOpen,\n showContextToggle,\n wrapLogMessage,\n prettifyLogMessage,\n onToggleContext,\n } = this.props;\n\n const style = getLogRowStyles(theme, row.logLevel);\n const { hasAnsi, raw } = row;\n const restructuredEntry = restructureLog(raw, prettifyLogMessage);\n const styles = getStyles(theme);\n\n return (\n // When context is open, the position has to be NOT relative.\n // Setting the postion as inline-style to overwrite the more sepecific style definition from `style.logsRowMessage`.\n <td style={contextIsOpen ? { position: 'unset' } : undefined} className={style.logsRowMessage}>\n <div\n className={cx({ [styles.positionRelative]: wrapLogMessage }, { [styles.horizontalScroll]: !wrapLogMessage })}\n >\n {contextIsOpen && context && (\n <LogRowContext\n row={row}\n context={context}\n errors={errors}\n wrapLogMessage={wrapLogMessage}\n hasMoreContextRows={hasMoreContextRows}\n onOutsideClick={onToggleContext}\n onLoadMoreContext={() => {\n if (updateLimit) {\n updateLimit();\n }\n }}\n />\n )}\n <span className={cx(styles.positionRelative, { [styles.rowWithContext]: contextIsOpen })}>\n {renderLogMessage(hasAnsi, restructuredEntry, row.searchWords, style.logsRowMatchHighLight)}\n </span>\n {showContextToggle?.(row) && (\n <span\n onClick={this.onContextToggle}\n className={cx('log-row-context', style.context, { [styles.contextNewline]: !wrapLogMessage })}\n >\n {contextIsOpen ? 'Hide' : 'Show'} context\n </span>\n )}\n </div>\n </td>\n );\n }\n}\n\nexport const LogRowMessage = withTheme2(UnThemedLogRowMessage);\nLogRowMessage.displayName = 'LogRowMessage';\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2, LogLevel } from '@grafana/data';\n\nimport { styleMixins, stylesFactory } from '../../themes';\n\nexport const getLogRowStyles = stylesFactory((theme: GrafanaTheme2, logLevel?: LogLevel) => {\n let logColor = theme.isLight ? theme.v1.palette.gray5 : theme.v1.palette.gray2;\n const hoverBgColor = styleMixins.hoverColor(theme.colors.background.secondary, theme);\n\n switch (logLevel) {\n case LogLevel.crit:\n case LogLevel.critical:\n logColor = '#705da0';\n break;\n case LogLevel.error:\n case LogLevel.err:\n logColor = '#e24d42';\n break;\n case LogLevel.warning:\n case LogLevel.warn:\n logColor = theme.colors.warning.main;\n break;\n case LogLevel.info:\n logColor = '#7eb26d';\n break;\n case LogLevel.debug:\n logColor = '#1f78c1';\n break;\n case LogLevel.trace:\n logColor = '#6ed0e0';\n break;\n }\n\n return {\n logsRowMatchHighLight: css`\n label: logs-row__match-highlight;\n background: inherit;\n padding: inherit;\n color: ${theme.components.textHighlight.text}\n background-color: ${theme.components.textHighlight};\n `,\n logsRowsTable: css`\n label: logs-rows;\n font-family: ${theme.typography.fontFamilyMonospace};\n font-size: ${theme.typography.bodySmall.fontSize};\n width: 100%;\n `,\n context: css`\n label: context;\n visibility: hidden;\n white-space: nowrap;\n position: relative;\n margin-left: 10px;\n `,\n logsRow: css`\n label: logs-row;\n width: 100%;\n cursor: pointer;\n vertical-align: top;\n\n &:hover {\n .log-row-context {\n visibility: visible;\n z-index: 1;\n text-decoration: underline;\n &:hover {\n color: ${theme.colors.warning.main};\n }\n }\n }\n\n td:last-child {\n width: 100%;\n }\n\n > td {\n position: relative;\n padding-right: ${theme.spacing(1)};\n border-top: ${theme.v1.border.width.sm} solid transparent;\n border-bottom: ${theme.v1.border.width.sm} solid transparent;\n height: 100%;\n }\n\n &:hover {\n background: ${hoverBgColor};\n }\n `,\n logsRowDuplicates: css`\n label: logs-row__duplicates;\n text-align: right;\n width: 4em;\n cursor: default;\n `,\n logsRowLevel: css`\n label: logs-row__level;\n max-width: 10px;\n cursor: default;\n &::after {\n content: '';\n display: block;\n position: absolute;\n top: 1px;\n bottom: 1px;\n width: 3px;\n left: 4px;\n background-color: ${logColor};\n }\n `,\n logIconError: css`\n color: ${theme.colors.warning.main};\n `,\n logsRowToggleDetails: css`\n label: logs-row-toggle-details__level;\n font-size: 9px;\n padding-top: 5px;\n max-width: 15px;\n `,\n logsRowLocalTime: css`\n label: logs-row__localtime;\n white-space: nowrap;\n `,\n logsRowLabels: css`\n label: logs-row__labels;\n white-space: nowrap;\n max-width: 22em;\n\n /* This is to make the labels vertical align */\n > span {\n margin-top: 0.75px;\n }\n `,\n logsRowMessage: css`\n label: logs-row__message;\n white-space: pre-wrap;\n word-break: break-all;\n `,\n //Log details specific CSS\n logDetailsContainer: css`\n label: logs-row-details-table;\n border: 1px solid ${theme.colors.border.medium};\n padding: 0 ${theme.spacing(1)} ${theme.spacing(1)};\n border-radius: 3px;\n margin: 20px 8px 20px 16px;\n cursor: default;\n `,\n logDetailsTable: css`\n label: logs-row-details-table;\n line-height: 18px;\n width: 100%;\n td:last-child {\n width: 100%;\n }\n `,\n logsDetailsIcon: css`\n label: logs-row-details__icon;\n position: relative;\n color: ${theme.v1.palette.gray3};\n padding-top: 6px;\n padding-left: 6px;\n `,\n logDetailsLabel: css`\n label: logs-row-details__label;\n max-width: 30em;\n min-width: 20em;\n padding: 0 ${theme.spacing(1)};\n overflow-wrap: break-word;\n `,\n logDetailsHeading: css`\n label: logs-row-details__heading;\n font-weight: ${theme.typography.fontWeightBold};\n padding: ${theme.spacing(1)} 0 ${theme.spacing(0.5)};\n `,\n logDetailsValue: css`\n label: logs-row-details__row;\n position: relative;\n vertical-align: middle;\n cursor: default;\n\n &:hover {\n background-color: ${hoverBgColor};\n }\n `,\n };\n});\n","import React, { useCallback } from 'react';\n\nimport { FieldNamePickerConfigSettings, SelectableValue, StandardEditorProps } from '@grafana/data';\n\nimport { Select } from '../Select/Select';\n\nimport { useFieldDisplayNames, useSelectOptions, frameHasName } from './utils';\n\n// Pick a field name out of the fulds\nexport const FieldNamePicker: React.FC<StandardEditorProps<string, FieldNamePickerConfigSettings>> = ({\n value,\n onChange,\n context,\n item,\n}) => {\n const settings: FieldNamePickerConfigSettings = item.settings ?? {};\n const names = useFieldDisplayNames(context.data, settings?.filter);\n const selectOptions = useSelectOptions(names, value);\n\n const onSelectChange = useCallback(\n (selection?: SelectableValue<string>) => {\n if (selection && !frameHasName(selection.value, names)) {\n return; // can not select name that does not exist?\n }\n return onChange(selection?.value);\n },\n [names, onChange]\n );\n\n const selectedOption = selectOptions.find((v) => v.value === value);\n return (\n <>\n <Select\n value={selectedOption}\n placeholder={settings.placeholderText ?? 'Select field'}\n options={selectOptions}\n onChange={onSelectChange}\n noOptionsMessage={settings.noFieldsMessage}\n width={settings.width}\n isClearable={true}\n />\n </>\n );\n};\n","import { useMemo } from 'react';\n\nimport { DataFrame, Field, getFieldDisplayName, SelectableValue } from '@grafana/data';\n\nimport { getFieldTypeIcon } from '../../types';\n\n/**\n * @internal\n */\nexport interface FrameFieldsDisplayNames {\n // The display names\n display: Set<string>;\n\n // raw field names (that are explicitly not visible)\n raw: Set<string>;\n\n // Field mappings (duplicates are not supported)\n fields: Map<string, Field>;\n}\n\n/**\n * @internal\n */\nexport function frameHasName(name: string | undefined, names: FrameFieldsDisplayNames) {\n if (!name) {\n return false;\n }\n return names.display.has(name) || names.raw.has(name);\n}\n\n/**\n * Retuns the distinct names in a set of frames\n */\nfunction getFrameFieldsDisplayNames(data: DataFrame[], filter?: (field: Field) => boolean): FrameFieldsDisplayNames {\n const names: FrameFieldsDisplayNames = {\n display: new Set<string>(),\n raw: new Set<string>(),\n fields: new Map<string, Field>(),\n };\n\n for (const frame of data) {\n for (const field of frame.fields) {\n if (filter && !filter(field)) {\n continue;\n }\n const disp = getFieldDisplayName(field, frame, data);\n names.display.add(disp);\n names.fields.set(disp, field);\n if (field.name && disp !== field.name) {\n names.raw.add(field.name);\n names.fields.set(field.name, field);\n }\n }\n }\n return names;\n}\n\n/**\n * @internal\n */\nexport function useFieldDisplayNames(data: DataFrame[], filter?: (field: Field) => boolean): FrameFieldsDisplayNames {\n return useMemo(() => {\n return getFrameFieldsDisplayNames(data, filter);\n }, [data, filter]);\n}\n\n/**\n * @internal\n */\nexport function useSelectOptions(\n displayNames: FrameFieldsDisplayNames,\n currentName?: string,\n firstItem?: SelectableValue<string>,\n fieldType?: string\n): Array<SelectableValue<string>> {\n return useMemo(() => {\n let found = false;\n const options: Array<SelectableValue<string>> = [];\n if (firstItem) {\n options.push(firstItem);\n }\n for (const name of displayNames.display) {\n if (!found && name === currentName) {\n found = true;\n }\n const field = displayNames.fields.get(name);\n if (!fieldType || fieldType === field?.type) {\n options.push({\n value: name,\n label: name,\n icon: field ? getFieldTypeIcon(field) : undefined,\n });\n }\n }\n for (const name of displayNames.raw) {\n if (!displayNames.display.has(name)) {\n if (!found && name === currentName) {\n found = true;\n }\n options.push({\n value: name,\n label: `${name} (base field name)`,\n });\n }\n }\n\n if (currentName && !found) {\n options.push({\n value: currentName,\n label: `${currentName} (not found)`,\n });\n }\n return options;\n }, [displayNames, currentName, firstItem, fieldType]);\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\n\nexport const getModalStyles = stylesFactory((theme: GrafanaTheme2) => {\n const borderRadius = theme.shape.borderRadius(1);\n\n return {\n modal: css`\n position: fixed;\n z-index: ${theme.zIndex.modal};\n background: ${theme.colors.background.primary};\n box-shadow: ${theme.shadows.z3};\n border-radius: ${borderRadius};\n border: 1px solid ${theme.colors.border.weak};\n background-clip: padding-box;\n outline: none;\n width: 750px;\n max-width: 100%;\n left: 0;\n right: 0;\n margin-left: auto;\n margin-right: auto;\n top: 10%;\n max-height: 80%;\n display: flex;\n flex-direction: column;\n `,\n modalBackdrop: css`\n position: fixed;\n z-index: ${theme.zIndex.modalBackdrop};\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: ${theme.components.overlay.background};\n backdrop-filter: blur(1px);\n `,\n modalHeader: css`\n label: modalHeader;\n display: flex;\n align-items: center;\n min-height: 42px;\n margin: ${theme.spacing(1, 2, 0, 2)};\n `,\n modalHeaderWithTabs: css`\n border-bottom: 1px solid ${theme.colors.border.weak};\n `,\n modalHeaderTitle: css`\n font-size: ${theme.typography.size.lg};\n margin: ${theme.spacing(0, 4, 0, 1)};\n display: flex;\n align-items: center;\n position: relative;\n top: 2px;\n `,\n modalHeaderIcon: css`\n margin-right: ${theme.spacing(2)};\n font-size: inherit;\n &:before {\n vertical-align: baseline;\n }\n `,\n modalHeaderClose: css`\n height: 100%;\n display: flex;\n align-items: center;\n color: ${theme.colors.text.secondary};\n flex-grow: 1;\n justify-content: flex-end;\n `,\n modalContent: css`\n overflow: auto;\n padding: ${theme.spacing(3)};\n width: 100%;\n `,\n modalButtonRow: css`\n padding-top: ${theme.spacing(3)};\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\n/**\n * @internal\n */\nexport type LoadingIndicatorProps = {\n loading: boolean;\n onCancel: () => void;\n};\n\n/**\n * @internal\n */\nexport const LoadingIndicator: React.FC<LoadingIndicatorProps> = ({ onCancel, loading }) => {\n const styles = useStyles(getStyles);\n\n if (!loading) {\n return null;\n }\n\n return (\n <Tooltip content=\"Cancel query\">\n <Icon\n className={cx('spin-clockwise', { [styles.clickable]: !!onCancel })}\n name=\"sync\"\n size=\"sm\"\n onClick={onCancel}\n aria-label={selectors.components.LoadingIndicator.icon}\n />\n </Tooltip>\n );\n};\n\nconst getStyles = () => {\n return {\n clickable: css`\n cursor: pointer;\n `,\n };\n};\n","import React from 'react';\n\nimport {\n EventBusSrv,\n EventBus,\n DashboardCursorSync,\n AnnotationEventUIModel,\n ThresholdsConfig,\n SplitOpen,\n CoreApp,\n} from '@grafana/data';\n\nimport { SeriesVisibilityChangeMode } from '.';\n\n/** @alpha */\nexport interface PanelContext {\n eventBus: EventBus;\n\n /** Dashboard panels sync */\n sync?: () => DashboardCursorSync;\n\n /** Information on what the outer container is */\n app?: CoreApp | 'string';\n\n /**\n * Called when a component wants to change the color for a series\n *\n * @alpha -- experimental\n */\n onSeriesColorChange?: (label: string, color: string) => void;\n\n onToggleSeriesVisibility?: (label: string, mode: SeriesVisibilityChangeMode) => void;\n\n canAddAnnotations?: () => boolean;\n canEditAnnotations?: (dashboardUID?: string) => boolean;\n canDeleteAnnotations?: (dashboardUID?: string) => boolean;\n onAnnotationCreate?: (annotation: AnnotationEventUIModel) => void;\n onAnnotationUpdate?: (annotation: AnnotationEventUIModel) => void;\n onAnnotationDelete?: (id: string) => void;\n\n /**\n * Enables modifying thresholds directly from the panel\n *\n * @alpha -- experimental\n */\n canEditThresholds?: boolean;\n\n /**\n * Called when a panel wants to change default thresholds configuration\n *\n * @alpha -- experimental\n */\n onThresholdsChange?: (thresholds: ThresholdsConfig) => void;\n\n /**\n * onSplitOpen is used in Explore to open the split view. It can be used in panels which has intercations and used in Explore as well.\n * For example TimeSeries panel.\n */\n onSplitOpen?: SplitOpen;\n\n /** For instance state that can be shared between panel & options UI */\n instanceState?: any;\n\n /** Update instance state, this is only supported in dashboard panel context currently */\n onInstanceStateChange?: (state: any) => void;\n\n /**\n * Called when a panel is changing the sort order of the legends.\n */\n onToggleLegendSort?: (sortBy: string) => void;\n}\n\nexport const PanelContextRoot = React.createContext<PanelContext>({\n eventBus: new EventBusSrv(),\n});\n\n/**\n * @alpha\n */\nexport const PanelContextProvider = PanelContextRoot.Provider;\n\n/**\n * @alpha\n */\nexport const usePanelContext = () => React.useContext(PanelContextRoot);\n","import React, { PropsWithChildren, useLayoutEffect, useRef } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { useTheme2 } from '../../themes';\n\ninterface Props {\n className?: string;\n root?: HTMLElement;\n forwardedRef?: any;\n}\n\nexport function Portal(props: PropsWithChildren<Props>) {\n const { children, className, root, forwardedRef } = props;\n const theme = useTheme2();\n const node = useRef<HTMLDivElement | null>(null);\n const portalRoot = root ?? getPortalContainer();\n\n if (!node.current) {\n node.current = document.createElement('div');\n if (className) {\n node.current.className = className;\n }\n node.current.style.position = 'relative';\n node.current.style.zIndex = `${theme.zIndex.portal}`;\n }\n\n useLayoutEffect(() => {\n if (node.current) {\n portalRoot.appendChild(node.current);\n }\n\n return () => {\n if (node.current) {\n portalRoot.removeChild(node.current);\n }\n };\n }, [portalRoot]);\n\n return ReactDOM.createPortal(<div ref={forwardedRef}>{children}</div>, node.current);\n}\n\n/** @internal */\nexport function getPortalContainer() {\n return window.document.getElementById('grafana-portal-container') ?? document.body;\n}\n\n/** @internal */\nexport function PortalContainer() {\n return <div id=\"grafana-portal-container\" />;\n}\n\nexport const RefForwardingPortal = React.forwardRef<HTMLDivElement, Props>((props, ref) => {\n return <Portal {...props} forwardedRef={ref} />;\n});\n\nRefForwardingPortal.displayName = 'RefForwardingPortal';\n","import React from 'react';\n\nimport { Icon } from '../Icon/Icon';\n\ninterface DropdownIndicatorProps {\n isOpen: boolean;\n}\n\nexport const DropdownIndicator: React.FC<DropdownIndicatorProps> = ({ isOpen }) => {\n const icon = isOpen ? 'search' : 'angle-down';\n const size = isOpen ? 'sm' : 'md';\n return <Icon name={icon} size={size} />;\n};\n","import { cx, css } from '@emotion/css';\nimport React from 'react';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { getInputStyles } from '../Input/Input';\n\nexport const IndicatorsContainer = React.forwardRef<HTMLDivElement, React.PropsWithChildren<any>>((props, ref) => {\n const { children } = props;\n const theme = useTheme2();\n const styles = getInputStyles({ theme, invalid: false });\n\n return (\n <div\n className={cx(\n styles.suffix,\n css`\n position: relative;\n `\n )}\n ref={ref}\n >\n {children}\n </div>\n );\n});\n\nIndicatorsContainer.displayName = 'IndicatorsContainer';\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { inputPadding } from '../Forms/commonStyles';\nimport { getInputStyles } from '../Input/Input';\n\ninterface InputControlProps {\n /** Show an icon as a prefix in the input */\n prefix?: JSX.Element | string | null;\n focused: boolean;\n invalid: boolean;\n disabled: boolean;\n innerProps: any;\n}\n\nconst getInputControlStyles = stylesFactory((theme: GrafanaTheme2, invalid: boolean, withPrefix: boolean) => {\n const styles = getInputStyles({ theme, invalid });\n\n return {\n input: cx(\n inputPadding(theme),\n css`\n width: 100%;\n max-width: 100%;\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-wrap: wrap;\n justify-content: space-between;\n padding-right: 0;\n position: relative;\n box-sizing: border-box;\n `,\n withPrefix &&\n css`\n padding-left: 0;\n `\n ),\n prefix: cx(\n styles.prefix,\n css`\n position: relative;\n `\n ),\n };\n});\n\nexport const InputControl = React.forwardRef<HTMLDivElement, React.PropsWithChildren<InputControlProps>>(\n function InputControl({ focused, invalid, disabled, children, innerProps, prefix, ...otherProps }, ref) {\n const theme = useTheme2();\n const styles = getInputControlStyles(theme, invalid, !!prefix);\n return (\n <div className={styles.input} {...innerProps} ref={ref}>\n {prefix && <div className={cx(styles.prefix)}>{prefix}</div>}\n {children}\n </div>\n );\n }\n);\n","import React from 'react';\n\nimport { useTheme2 } from '../../themes';\nimport { IconButton } from '../IconButton/IconButton';\n\nimport { getSelectStyles } from './getSelectStyles';\n\ninterface MultiValueContainerProps {\n innerProps: any;\n}\n\nexport const MultiValueContainer: React.FC<MultiValueContainerProps> = ({ innerProps, children }) => {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n\n return (\n <div {...innerProps} className={styles.multiValueContainer}>\n {children}\n </div>\n );\n};\n\nexport type MultiValueRemoveProps = {\n innerProps: any;\n};\n\nexport const MultiValueRemove: React.FC<MultiValueRemoveProps> = ({ children, innerProps }) => {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n return <IconButton {...innerProps} name=\"times\" size=\"sm\" className={styles.multiValueRemove} />;\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\nimport { components, ContainerProps as BaseContainerProps, GroupBase } from 'react-select';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { focusCss } from '../../themes/mixins';\nimport { sharedInputStyle } from '../Forms/commonStyles';\nimport { getInputStyles } from '../Input/Input';\n\n// isFocus prop is actually available, but its not in the types for the version we have.\nexport interface SelectContainerProps<Option, isMulti extends boolean, Group extends GroupBase<Option>>\n extends BaseContainerProps<Option, isMulti, Group> {\n isFocused: boolean;\n}\n\nexport const SelectContainer = <Option, isMulti extends boolean, Group extends GroupBase<Option>>(\n props: SelectContainerProps<Option, isMulti, Group>\n) => {\n const { isDisabled, isFocused, children } = props;\n\n const theme = useTheme2();\n const styles = getSelectContainerStyles(theme, isFocused, isDisabled);\n\n return (\n <components.SelectContainer {...props} className={cx(styles.wrapper, props.className)}>\n {children}\n </components.SelectContainer>\n );\n};\n\nconst getSelectContainerStyles = stylesFactory((theme: GrafanaTheme2, focused: boolean, disabled: boolean) => {\n const styles = getInputStyles({ theme, invalid: false });\n\n return {\n wrapper: cx(\n styles.wrapper,\n sharedInputStyle(theme, false),\n focused &&\n css`\n ${focusCss(theme.v1)}\n `,\n disabled && styles.inputDisabled,\n css`\n position: relative;\n box-sizing: border-box;\n /* The display property is set by the styles prop in SelectBase because it's dependant on the width prop */\n flex-direction: row;\n flex-wrap: wrap;\n align-items: stretch;\n justify-content: space-between;\n\n min-height: 32px;\n height: auto;\n max-width: 100%;\n\n /* Input padding is applied to the InputControl so the menu is aligned correctly */\n padding: 0;\n cursor: ${disabled ? 'not-allowed' : 'pointer'};\n `\n ),\n };\n});\n","import { cx } from '@emotion/css';\nimport React, { FC, RefCallback } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { IconName } from '../../types';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { Icon } from '../Icon/Icon';\n\nimport { getSelectStyles } from './getSelectStyles';\n\ninterface SelectMenuProps {\n maxHeight: number;\n innerRef: RefCallback<HTMLDivElement>;\n innerProps: {};\n}\n\nexport const SelectMenu: FC<SelectMenuProps> = ({ children, maxHeight, innerRef, innerProps }) => {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n\n return (\n <div {...innerProps} className={styles.menu} style={{ maxHeight }} aria-label=\"Select options menu\">\n <CustomScrollbar scrollRefCallback={innerRef} autoHide={false} autoHeightMax=\"inherit\" hideHorizontalTrack>\n {children}\n </CustomScrollbar>\n </div>\n );\n};\n\nSelectMenu.displayName = 'SelectMenu';\n\ninterface SelectMenuOptionProps<T> {\n isDisabled: boolean;\n isFocused: boolean;\n isSelected: boolean;\n innerProps: any;\n innerRef: RefCallback<HTMLDivElement>;\n renderOptionLabel?: (value: SelectableValue<T>) => JSX.Element;\n data: SelectableValue<T>;\n}\n\nexport const SelectMenuOptions: FC<SelectMenuOptionProps<any>> = ({\n children,\n data,\n innerProps,\n innerRef,\n isFocused,\n isSelected,\n renderOptionLabel,\n}) => {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n\n return (\n <div\n ref={innerRef}\n className={cx(\n styles.option,\n isFocused && styles.optionFocused,\n isSelected && styles.optionSelected,\n data.isDisabled && styles.optionDisabled\n )}\n {...innerProps}\n aria-label=\"Select option\"\n title={data.title}\n >\n {data.icon && <Icon name={data.icon as IconName} className={styles.optionIcon} />}\n {data.imgUrl && <img className={styles.optionImage} src={data.imgUrl} alt={data.label || data.value} />}\n <div className={styles.optionBody}>\n <span>{renderOptionLabel ? renderOptionLabel(data) : children}</span>\n {data.description && <div className={styles.optionDescription}>{data.description}</div>}\n {data.component && <data.component />}\n </div>\n </div>\n );\n};\n\nSelectMenuOptions.displayName = 'SelectMenuOptions';\n","import { cx } from '@emotion/css';\nimport React, { ReactNode } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { withTheme2 } from '../../themes/ThemeContext';\n\nimport { getSelectStyles } from './getSelectStyles';\n\nclass UnthemedValueContainer extends React.Component<any & { theme: GrafanaTheme }> {\n render() {\n const { children } = this.props;\n const { selectProps } = this.props;\n\n if (\n selectProps &&\n Array.isArray(children) &&\n Array.isArray(children[0]) &&\n selectProps.maxVisibleValues !== undefined &&\n !(selectProps.showAllSelectedWhenOpen && selectProps.menuIsOpen)\n ) {\n const [valueChildren, ...otherChildren] = children;\n const truncatedValues = valueChildren.slice(0, selectProps.maxVisibleValues);\n\n return this.renderContainer([truncatedValues, ...otherChildren]);\n }\n\n return this.renderContainer(children);\n }\n\n renderContainer(children?: ReactNode) {\n const { isMulti, theme } = this.props;\n const styles = getSelectStyles(theme);\n const className = cx(styles.valueContainer, isMulti && styles.valueContainerMulti);\n return <div className={className}>{children}</div>;\n }\n}\n\nexport const ValueContainer = withTheme2(UnthemedValueContainer);\n","import { SelectableValue } from '@grafana/data';\n\nimport { SelectableOptGroup } from './types';\n\n/**\n * Normalize the value format to SelectableValue[] | []. Only used for single select\n */\nexport const cleanValue = (value: any, options: Array<SelectableValue | SelectableOptGroup | SelectableOptGroup[]>) => {\n if (Array.isArray(value)) {\n const filtered = value.filter(Boolean);\n return filtered?.length ? filtered : undefined;\n }\n if (typeof value === 'object') {\n // we want to allow null through into here, so the Select value can be unset\n return [value];\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const selectedValue = findSelectedValue(value, options);\n if (selectedValue) {\n return [selectedValue];\n }\n }\n return undefined;\n};\n\n/**\n * Find the label for a string|number value inside array of options or optgroups\n */\nexport const findSelectedValue = (\n value: string | number,\n options: Array<SelectableValue | SelectableOptGroup | SelectableOptGroup[]>\n): SelectableValue | null => {\n for (const option of options) {\n if ('options' in option) {\n let found = findSelectedValue(value, option.options);\n if (found) {\n return found;\n }\n } else if ('value' in option && option.value === value) {\n return option;\n }\n }\n\n return null;\n};\n","import React, { ComponentProps, useCallback, useEffect, useRef, useState } from 'react';\nimport { default as ReactSelect } from 'react-select';\nimport { default as ReactAsyncSelect } from 'react-select/async';\nimport { default as AsyncCreatable } from 'react-select/async-creatable';\nimport Creatable from 'react-select/creatable';\n\nimport { useTheme2 } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { Spinner } from '../Spinner/Spinner';\n\nimport { DropdownIndicator } from './DropdownIndicator';\nimport { IndicatorsContainer } from './IndicatorsContainer';\nimport { InputControl } from './InputControl';\nimport { MultiValueContainer, MultiValueRemove } from './MultiValue';\nimport { SelectContainer } from './SelectContainer';\nimport { SelectMenu, SelectMenuOptions } from './SelectMenu';\nimport { SelectOptionGroup } from './SelectOptionGroup';\nimport { SingleValue } from './SingleValue';\nimport { ValueContainer } from './ValueContainer';\nimport { getSelectStyles } from './getSelectStyles';\nimport { useCustomSelectStyles } from './resetSelectStyles';\nimport { ActionMeta, SelectBaseProps, SelectValue } from './types';\nimport { cleanValue, findSelectedValue } from './utils';\n\ninterface ExtraValuesIndicatorProps {\n maxVisibleValues?: number | undefined;\n selectedValuesCount: number;\n menuIsOpen: boolean;\n showAllSelectedWhenOpen: boolean;\n}\n\nconst renderExtraValuesIndicator = (props: ExtraValuesIndicatorProps) => {\n const { maxVisibleValues, selectedValuesCount, menuIsOpen, showAllSelectedWhenOpen } = props;\n\n if (\n maxVisibleValues !== undefined &&\n selectedValuesCount > maxVisibleValues &&\n !(showAllSelectedWhenOpen && menuIsOpen)\n ) {\n return (\n <span key=\"excess-values\" id=\"excess-values\">\n (+{selectedValuesCount - maxVisibleValues})\n </span>\n );\n }\n\n return null;\n};\n\nconst CustomControl = (props: any) => {\n const {\n children,\n innerProps,\n selectProps: { menuIsOpen, onMenuClose, onMenuOpen },\n isFocused,\n isMulti,\n getValue,\n innerRef,\n } = props;\n const selectProps = props.selectProps as SelectBaseProps<any>;\n\n if (selectProps.renderControl) {\n return React.createElement(selectProps.renderControl, {\n isOpen: menuIsOpen,\n value: isMulti ? getValue() : getValue()[0],\n ref: innerRef,\n onClick: menuIsOpen ? onMenuClose : onMenuOpen,\n onBlur: onMenuClose,\n disabled: !!selectProps.disabled,\n invalid: !!selectProps.invalid,\n });\n }\n\n return (\n <InputControl\n ref={innerRef}\n innerProps={innerProps}\n prefix={selectProps.prefix}\n focused={isFocused}\n invalid={!!selectProps.invalid}\n disabled={!!selectProps.disabled}\n >\n {children}\n </InputControl>\n );\n};\n\nexport function SelectBase<T>({\n allowCustomValue = false,\n allowCreateWhileLoading = false,\n 'aria-label': ariaLabel,\n autoFocus = false,\n backspaceRemovesValue = true,\n cacheOptions,\n className,\n closeMenuOnSelect = true,\n components,\n defaultOptions,\n defaultValue,\n disabled = false,\n filterOption,\n formatCreateLabel,\n getOptionLabel,\n getOptionValue,\n inputValue,\n invalid,\n isClearable = false,\n id,\n isLoading = false,\n isMulti = false,\n inputId,\n isOpen,\n isOptionDisabled,\n isSearchable = true,\n loadOptions,\n loadingMessage = 'Loading options...',\n maxMenuHeight = 300,\n minMenuHeight,\n maxVisibleValues,\n menuPlacement = 'auto',\n menuPosition,\n menuShouldPortal = true,\n noOptionsMessage = 'No options found',\n onBlur,\n onChange,\n onCloseMenu,\n onCreateOption,\n onInputChange,\n onKeyDown,\n onOpenMenu,\n onFocus,\n openMenuOnFocus = false,\n options = [],\n placeholder = 'Choose',\n prefix,\n renderControl,\n showAllSelectedWhenOpen = true,\n tabSelectsValue = true,\n value,\n width,\n isValidNewOption,\n formatOptionLabel,\n}: SelectBaseProps<T>) {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n\n const reactSelectRef = useRef<{ controlRef: HTMLElement }>(null);\n const [closeToBottom, setCloseToBottom] = useState<boolean>(false);\n const selectStyles = useCustomSelectStyles(theme, width);\n\n // Infer the menu position for asynchronously loaded options. menuPlacement=\"auto\" doesn't work when the menu is\n // automatically opened when the component is created (it happens in SegmentSelect by setting menuIsOpen={true}).\n // We can remove this workaround when the bug in react-select is fixed: https://github.com/JedWatson/react-select/issues/4936\n // Note: we use useEffect instead of hooking into onMenuOpen due to another bug: https://github.com/JedWatson/react-select/issues/3375\n useEffect(() => {\n if (\n loadOptions &&\n isOpen &&\n reactSelectRef.current &&\n reactSelectRef.current.controlRef &&\n menuPlacement === 'auto'\n ) {\n const distance = window.innerHeight - reactSelectRef.current.controlRef.getBoundingClientRect().bottom;\n setCloseToBottom(distance < maxMenuHeight);\n }\n }, [maxMenuHeight, menuPlacement, loadOptions, isOpen]);\n\n const onChangeWithEmpty = useCallback(\n (value: SelectValue<T>, action: ActionMeta) => {\n if (isMulti && (value === undefined || value === null)) {\n return onChange([], action);\n }\n onChange(value, action);\n },\n [isMulti, onChange]\n );\n\n let ReactSelectComponent = ReactSelect;\n\n const creatableProps: ComponentProps<typeof Creatable> = {};\n let asyncSelectProps: any = {};\n let selectedValue;\n if (isMulti && loadOptions) {\n selectedValue = value as any;\n } else {\n // If option is passed as a plain value (value property from SelectableValue property)\n // we are selecting the corresponding value from the options\n if (isMulti && value && Array.isArray(value) && !loadOptions) {\n // @ts-ignore\n selectedValue = value.map((v) => findSelectedValue(v.value ?? v, options));\n } else if (loadOptions) {\n const hasValue = defaultValue || value;\n selectedValue = hasValue ? [hasValue] : [];\n } else {\n selectedValue = cleanValue(value, options);\n }\n }\n\n const commonSelectProps = {\n 'aria-label': ariaLabel,\n autoFocus,\n backspaceRemovesValue,\n captureMenuScroll: false,\n closeMenuOnSelect,\n // We don't want to close if we're actually scrolling the menu\n // So only close if none of the parents are the select menu itself\n defaultValue,\n // Also passing disabled, as this is the new Select API, and I want to use this prop instead of react-select's one\n disabled,\n filterOption,\n getOptionLabel,\n getOptionValue,\n inputValue,\n invalid,\n isClearable,\n id,\n // Passing isDisabled as react-select accepts this prop\n isDisabled: disabled,\n isLoading,\n isMulti,\n inputId,\n isOptionDisabled,\n isSearchable,\n maxMenuHeight,\n minMenuHeight,\n maxVisibleValues,\n menuIsOpen: isOpen,\n menuPlacement: menuPlacement === 'auto' && closeToBottom ? 'top' : menuPlacement,\n menuPosition,\n menuShouldBlockScroll: true,\n menuPortalTarget: menuShouldPortal && typeof document !== 'undefined' ? document.body : undefined,\n menuShouldScrollIntoView: false,\n onBlur,\n onChange: onChangeWithEmpty,\n onInputChange,\n onKeyDown,\n onMenuClose: onCloseMenu,\n onMenuOpen: onOpenMenu,\n onFocus,\n formatOptionLabel,\n openMenuOnFocus,\n options,\n placeholder,\n prefix,\n renderControl,\n showAllSelectedWhenOpen,\n tabSelectsValue,\n value: isMulti ? selectedValue : selectedValue?.[0],\n };\n\n if (allowCustomValue) {\n ReactSelectComponent = Creatable as any;\n creatableProps.allowCreateWhileLoading = allowCreateWhileLoading;\n creatableProps.formatCreateLabel = formatCreateLabel ?? defaultFormatCreateLabel;\n creatableProps.onCreateOption = onCreateOption;\n creatableProps.isValidNewOption = isValidNewOption;\n }\n\n // Instead of having AsyncSelect, as a separate component we render ReactAsyncSelect\n if (loadOptions) {\n ReactSelectComponent = (allowCustomValue ? AsyncCreatable : ReactAsyncSelect) as any;\n asyncSelectProps = {\n loadOptions,\n cacheOptions,\n defaultOptions,\n };\n }\n\n return (\n <>\n <ReactSelectComponent\n ref={reactSelectRef}\n components={{\n MenuList: SelectMenu,\n Group: SelectOptionGroup,\n ValueContainer,\n IndicatorsContainer(props: any) {\n const { selectProps } = props;\n const { value, showAllSelectedWhenOpen, maxVisibleValues, menuIsOpen } = selectProps;\n\n if (maxVisibleValues !== undefined) {\n const selectedValuesCount = value.length;\n const indicatorChildren = [...props.children];\n indicatorChildren.splice(\n -1,\n 0,\n renderExtraValuesIndicator({\n maxVisibleValues,\n selectedValuesCount,\n showAllSelectedWhenOpen,\n menuIsOpen,\n })\n );\n return <IndicatorsContainer {...props}>{indicatorChildren}</IndicatorsContainer>;\n }\n\n return <IndicatorsContainer {...props} />;\n },\n IndicatorSeparator() {\n return <></>;\n },\n Control: CustomControl,\n Option: SelectMenuOptions,\n ClearIndicator(props: any) {\n const { clearValue } = props;\n return (\n <Icon\n name=\"times\"\n role=\"button\"\n aria-label=\"select-clear-value\"\n className={styles.singleValueRemove}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n }}\n />\n );\n },\n LoadingIndicator(props: any) {\n return <Spinner inline={true} />;\n },\n LoadingMessage(props: any) {\n return <div className={styles.loadingMessage}>{loadingMessage}</div>;\n },\n NoOptionsMessage(props: any) {\n return (\n <div className={styles.loadingMessage} aria-label=\"No options provided\">\n {noOptionsMessage}\n </div>\n );\n },\n DropdownIndicator(props: any) {\n return <DropdownIndicator isOpen={props.selectProps.menuIsOpen} />;\n },\n SingleValue(props: any) {\n return <SingleValue {...props} disabled={disabled} />;\n },\n MultiValueContainer: MultiValueContainer,\n MultiValueRemove: MultiValueRemove,\n SelectContainer,\n ...components,\n }}\n styles={selectStyles}\n className={className}\n {...commonSelectProps}\n {...creatableProps}\n {...asyncSelectProps}\n />\n </>\n );\n}\n\nfunction defaultFormatCreateLabel(input: string) {\n return (\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <div>{input}</div>\n <div style={{ flexGrow: 1 }} />\n <div className=\"muted small\" style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n Hit enter to add\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { SelectBase } from './SelectBase';\nimport { SelectContainer, SelectContainerProps } from './SelectContainer';\nimport { SelectCommonProps, MultiSelectCommonProps, SelectAsyncProps } from './types';\n\nexport function Select<T>(props: SelectCommonProps<T>) {\n return <SelectBase {...props} />;\n}\n\nexport function MultiSelect<T>(props: MultiSelectCommonProps<T>) {\n // @ts-ignore\n return <SelectBase {...props} isMulti />;\n}\n\nexport interface AsyncSelectProps<T> extends Omit<SelectCommonProps<T>, 'options'>, SelectAsyncProps<T> {\n // AsyncSelect has options stored internally. We cannot enable plain values as we don't have access to the fetched options\n value?: SelectableValue<T> | null;\n invalid?: boolean;\n}\n\nexport function AsyncSelect<T>(props: AsyncSelectProps<T>) {\n return <SelectBase {...props} />;\n}\n\ninterface AsyncMultiSelectProps<T> extends Omit<MultiSelectCommonProps<T>, 'options'>, SelectAsyncProps<T> {\n // AsyncSelect has options stored internally. We cannot enable plain values as we don't have access to the fetched options\n value?: Array<SelectableValue<T>>;\n}\n\nexport function AsyncMultiSelect<T>(props: AsyncMultiSelectProps<T>) {\n // @ts-ignore\n return <SelectBase {...props} isMulti />;\n}\n\nexport { SelectContainer, SelectContainerProps };\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { GroupProps } from 'react-select';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { stylesFactory, withTheme } from '../../themes';\nimport { Themeable } from '../../types';\nimport { Icon } from '../Icon/Icon';\n\ninterface ExtendedGroupProps extends Omit<GroupProps<any, any>, 'theme'>, Themeable {\n data: {\n label: string;\n expanded: boolean;\n options: any[];\n };\n}\n\ninterface State {\n expanded: boolean;\n}\n\nconst getSelectOptionGroupStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n header: css`\n display: flex;\n align-items: center;\n justify-content: flex-start;\n justify-items: center;\n cursor: pointer;\n padding: 7px 10px;\n width: 100%;\n border-bottom: 1px solid ${theme.colors.bg2};\n\n &:hover {\n color: ${theme.colors.textStrong};\n }\n `,\n label: css`\n flex-grow: 1;\n `,\n icon: css`\n padding-right: 2px;\n `,\n };\n});\n\nclass UnthemedSelectOptionGroup extends PureComponent<ExtendedGroupProps, State> {\n state = {\n expanded: false,\n };\n\n componentDidMount() {\n if (this.props.data.expanded) {\n this.setState({ expanded: true });\n } else if (this.props.selectProps && this.props.selectProps.value) {\n const { value } = this.props.selectProps.value;\n\n if (value && this.props.options.some((option) => option.value === value)) {\n this.setState({ expanded: true });\n }\n }\n }\n\n componentDidUpdate(nextProps: ExtendedGroupProps) {\n if (nextProps.selectProps.inputValue !== '') {\n this.setState({ expanded: true });\n }\n }\n\n onToggleChildren = () => {\n this.setState((prevState) => ({\n expanded: !prevState.expanded,\n }));\n };\n\n render() {\n const { children, label, theme } = this.props;\n const { expanded } = this.state;\n const styles = getSelectOptionGroupStyles(theme);\n\n return (\n <div>\n <div className={styles.header} onClick={this.onToggleChildren}>\n <span className={styles.label}>{label}</span>\n <Icon className={styles.icon} name={expanded ? 'angle-up' : 'angle-down'} />{' '}\n </div>\n {expanded && children}\n </div>\n );\n }\n}\n\nexport const SelectOptionGroup = withTheme(UnthemedSelectOptionGroup);\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\nimport { components, GroupBase, SingleValueProps } from 'react-select';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { useDelayedSwitch } from '../../utils/useDelayedSwitch';\nimport { Spinner } from '../Spinner/Spinner';\nimport { FadeTransition } from '../transitions/FadeTransition';\nimport { SlideOutTransition } from '../transitions/SlideOutTransition';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const singleValue = css`\n label: singleValue;\n color: ${theme.components.input.text};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n max-width: 100%;\n grid-area: 1 / 1 / 2 / 3;\n `;\n\n const spinnerWrapper = css`\n width: 16px;\n height: 16px;\n display: inline-block;\n margin-right: 10px;\n position: relative;\n vertical-align: middle;\n overflow: hidden;\n `;\n\n const spinnerIcon = css`\n width: 100%;\n height: 100%;\n position: absolute;\n `;\n\n const disabled = css`\n color: ${theme.colors.text.disabled};\n `;\n\n const isOpen = css`\n color: ${theme.colors.text.disabled};\n `;\n\n return { singleValue, spinnerWrapper, spinnerIcon, disabled, isOpen };\n};\n\ntype StylesType = ReturnType<typeof getStyles>;\n\nexport type Props<T> = SingleValueProps<SelectableValue<T>, boolean, GroupBase<SelectableValue<T>>>;\n\nexport const SingleValue = <T extends unknown>(props: Props<T>) => {\n const { children, data, isDisabled } = props;\n const styles = useStyles2(getStyles);\n const loading = useDelayedSwitch(data.loading || false, { delay: 250, duration: 750 });\n\n return (\n <components.SingleValue\n {...props}\n className={cx(styles.singleValue, isDisabled && styles.disabled, props.selectProps.menuIsOpen && styles.isOpen)}\n >\n {data.imgUrl ? (\n <FadeWithImage\n loading={loading}\n imgUrl={data.imgUrl}\n styles={styles}\n alt={(data.label ?? data.value) as string}\n />\n ) : (\n <SlideOutTransition horizontal size={16} visible={loading} duration={150}>\n <div className={styles.spinnerWrapper}>\n <Spinner className={styles.spinnerIcon} inline />\n </div>\n </SlideOutTransition>\n )}\n {!data.hideText && children}\n </components.SingleValue>\n );\n};\n\nconst FadeWithImage = (props: { loading: boolean; imgUrl: string; styles: StylesType; alt?: string }) => {\n return (\n <div className={props.styles.spinnerWrapper}>\n <FadeTransition duration={150} visible={props.loading}>\n <Spinner className={props.styles.spinnerIcon} inline />\n </FadeTransition>\n <FadeTransition duration={150} visible={!props.loading}>\n <img className={props.styles.spinnerIcon} src={props.imgUrl} alt={props.alt} />\n </FadeTransition>\n </div>\n );\n};\n","import { useEffect, useRef, useState } from 'react';\n\ntype DelayOptions = {\n // Minimal amount of time the switch will be on.\n duration?: number;\n // Delay after which switch will turn on.\n delay?: number;\n};\n\n/**\n * Hook that delays changing of boolean switch to prevent too much time spent in \"on\" state. It is kind of a throttle\n * but you can specify different time for on and off throttling so this only allows a boolean values and also prefers\n * to stay \"off\" so turning \"on\" is always delayed while turning \"off\" is throttled.\n *\n * This is useful for showing loading elements to prevent it flashing too much in case of quick loading time or\n * prevent it flash if loaded state comes right after switch to loading.\n */\nexport function useDelayedSwitch(value: boolean, options: DelayOptions = {}): boolean {\n const { duration = 250, delay = 250 } = options;\n\n const [delayedValue, setDelayedValue] = useState(value);\n const onStartTime = useRef<Date | undefined>();\n\n useEffect(() => {\n let timeout: number | undefined;\n if (value) {\n // If toggling to \"on\" state we always setTimeout no matter how long we have been \"off\".\n timeout = setTimeout(() => {\n onStartTime.current = new Date();\n setDelayedValue(value);\n }, delay) as any;\n } else {\n // If toggling to \"off\" state we check how much time we were already \"on\".\n const timeSpent = onStartTime.current ? Date.now() - onStartTime.current.valueOf() : 0;\n const turnOff = () => {\n onStartTime.current = undefined;\n setDelayedValue(value);\n };\n if (timeSpent >= duration) {\n // We already spent enough time \"on\" so change right away.\n turnOff();\n } else {\n timeout = setTimeout(turnOff, duration - timeSpent) as any;\n }\n }\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n };\n }, [value, duration, delay]);\n\n return delayedValue;\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes/stylesFactory';\n\nexport const getSelectStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n menu: css`\n label: grafana-select-menu;\n background: ${theme.components.dropdown.background};\n box-shadow: ${theme.shadows.z3};\n position: relative;\n min-width: 100%;\n z-index: 1;\n `,\n option: css`\n label: grafana-select-option;\n padding: 8px;\n display: flex;\n align-items: center;\n flex-direction: row;\n flex-shrink: 0;\n white-space: nowrap;\n cursor: pointer;\n border-left: 2px solid transparent;\n\n &:hover {\n background: ${theme.colors.action.hover};\n }\n `,\n optionIcon: css`\n margin-right: ${theme.spacing(1)};\n `,\n optionImage: css`\n label: grafana-select-option-image;\n width: 16px;\n margin-right: 10px;\n `,\n optionDescription: css`\n label: grafana-select-option-description;\n font-weight: normal;\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.text.secondary};\n white-space: normal;\n line-height: ${theme.typography.body.lineHeight};\n `,\n optionBody: css`\n label: grafana-select-option-body;\n display: flex;\n font-weight: ${theme.typography.fontWeightMedium};\n flex-direction: column;\n flex-grow: 1;\n `,\n optionFocused: css`\n label: grafana-select-option-focused;\n background: ${theme.colors.action.focus};\n `,\n optionSelected: css`\n background: ${theme.colors.action.selected};\n `,\n optionDisabled: css`\n label: grafana-select-option-disabled;\n background-color: ${theme.colors.action.disabledBackground};\n color: ${theme.colors.action.disabledText};\n cursor: not-allowed;\n `,\n singleValue: css`\n label: grafana-select-single-value;\n color: ${theme.components.input.text};\n grid-area: 1 / 1 / 2 / 3;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n box-sizing: border-box;\n max-width: 100%;\n `,\n valueContainer: css`\n label: grafana-select-value-container;\n align-items: center;\n display: grid;\n position: relative;\n box-sizing: border-box;\n flex: 1 1 0%;\n outline: none;\n overflow: hidden;\n `,\n valueContainerMulti: css`\n label: grafana-select-value-container-multi;\n flex-wrap: wrap;\n display: flex;\n `,\n loadingMessage: css`\n label: grafana-select-loading-message;\n padding: ${theme.spacing(1)};\n text-align: center;\n width: 100%;\n `,\n multiValueContainer: css`\n label: grafana-select-multi-value-container;\n display: flex;\n align-items: center;\n line-height: 1;\n background: ${theme.colors.background.secondary};\n border-radius: ${theme.shape.borderRadius()};\n margin: ${theme.spacing(0.25, 1, 0.25, 0)};\n padding: ${theme.spacing(0.25, 0, 0.25, 1)};\n color: ${theme.colors.text.primary};\n font-size: ${theme.typography.size.sm};\n\n &:hover {\n background: ${theme.colors.emphasize(theme.colors.background.secondary)};\n }\n `,\n multiValueRemove: css`\n label: grafana-select-multi-value-remove;\n margin: ${theme.spacing(0, 0.5)};\n cursor: pointer;\n svg {\n margin-bottom: 0;\n }\n `,\n singleValueRemove: css`\n cursor: pointer;\n &:hover {\n color: ${theme.colors.text.primary};\n }\n `,\n };\n});\n","import { useMemo } from 'react';\nimport { CSSObjectWithLabel } from 'react-select';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport default function resetSelectStyles(theme: GrafanaTheme2) {\n return {\n clearIndicator: () => ({}),\n container: () => ({}),\n control: () => ({}),\n dropdownIndicator: () => ({}),\n group: () => ({}),\n groupHeading: () => ({}),\n indicatorsContainer: () => ({}),\n indicatorSeparator: () => ({}),\n input: function (originalStyles: CSSObjectWithLabel) {\n return {\n ...originalStyles,\n color: 'inherit',\n margin: 0,\n padding: 0,\n // Set an explicit z-index here to ensure this element always overlays the singleValue\n zIndex: 1,\n };\n },\n loadingIndicator: () => ({}),\n loadingMessage: () => ({}),\n menu: () => ({}),\n menuList: ({ maxHeight }: { maxHeight: number }) => ({\n maxHeight,\n }),\n multiValue: () => ({}),\n multiValueLabel: () => ({}),\n multiValueRemove: () => ({}),\n noOptionsMessage: () => ({}),\n option: () => ({}),\n placeholder: (originalStyles: CSSObjectWithLabel) => ({\n ...originalStyles,\n color: theme.colors.text.disabled,\n }),\n singleValue: () => ({}),\n valueContainer: () => ({}),\n };\n}\n\nexport function useCustomSelectStyles(theme: GrafanaTheme2, width: number | string | undefined) {\n return useMemo(() => {\n return {\n ...resetSelectStyles(theme),\n menuPortal: (base: any) => {\n // Would like to correct top position when menu is placed bottom, but have props are not sent to this style function.\n // Only state is. https://github.com/JedWatson/react-select/blob/master/packages/react-select/src/components/Menu.tsx#L605\n return {\n ...base,\n zIndex: theme.zIndex.portal,\n };\n },\n //These are required for the menu positioning to function\n menu: ({ top, bottom, position }: any) => {\n return {\n top,\n bottom,\n position,\n minWidth: '100%',\n zIndex: theme.zIndex.dropdown,\n };\n },\n container: () => ({\n width: width ? theme.spacing(width) : '100%',\n display: width === 'auto' ? 'inline-flex' : 'flex',\n }),\n option: (provided: any, state: any) => ({\n ...provided,\n opacity: state.isDisabled ? 0.5 : 1,\n }),\n };\n }, [theme, width]);\n}\n","import { css } from '@emotion/css';\nimport { css as cssCore } from '@emotion/react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2, isHorizontal: boolean, hasMarks = false) => {\n const { spacing } = theme;\n const railColor = theme.colors.border.strong;\n const trackColor = theme.colors.primary.main;\n const handleColor = theme.colors.primary.main;\n const blueOpacity = theme.colors.primary.transparent;\n const hoverSyle = `box-shadow: 0px 0px 0px 6px ${blueOpacity}`;\n\n return {\n container: css`\n width: 100%;\n margin: ${isHorizontal ? 'inherit' : `${spacing(1, 3, 1, 1)}`};\n padding-bottom: ${isHorizontal && hasMarks ? theme.spacing(1) : 'inherit'};\n height: ${isHorizontal ? 'auto' : '100%'};\n `,\n slider: css`\n .rc-slider {\n display: flex;\n flex-grow: 1;\n margin-left: 7px; // half the size of the handle to align handle to the left on 0 value\n }\n .rc-slider-mark {\n top: ${theme.spacing(1.75)};\n }\n .rc-slider-mark-text {\n color: ${theme.colors.text.disabled};\n font-size: ${theme.typography.bodySmall.fontSize};\n }\n .rc-slider-mark-text-active {\n color: ${theme.colors.text.primary};\n }\n .rc-slider-vertical .rc-slider-handle {\n margin-top: -10px;\n }\n .rc-slider-handle {\n border: none;\n background-color: ${handleColor};\n box-shadow: ${theme.shadows.z1};\n cursor: pointer;\n }\n .rc-slider-handle:hover,\n .rc-slider-handle:active,\n .rc-slider-handle:focus,\n .rc-slider-handle-click-focused:focus {\n ${hoverSyle};\n }\n\n .rc-slider-dot,\n .rc-slider-dot-active {\n background-color: ${theme.colors.text.primary};\n border-color: ${theme.colors.text.primary};\n }\n\n .rc-slider-track {\n background-color: ${trackColor};\n }\n .rc-slider-rail {\n background-color: ${railColor};\n cursor: pointer;\n }\n `,\n /** Global component from @emotion/core doesn't accept computed classname string returned from css from emotion.\n * It accepts object containing the computed name and flattened styles returned from css from @emotion/core\n * */\n tooltip: cssCore`\n body {\n .rc-slider-tooltip {\n cursor: grab;\n user-select: none;\n z-index: ${theme.zIndex.tooltip};\n }\n\n .rc-slider-tooltip-inner {\n color: ${theme.colors.text.primary};\n background-color: transparent !important;\n border-radius: 0;\n box-shadow: none;\n }\n\n .rc-slider-tooltip-placement-top .rc-slider-tooltip-arrow {\n display: none;\n }\n\n .rc-slider-tooltip-placement-top {\n padding: 0;\n }\n }\n `,\n sliderInput: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 100%;\n `,\n sliderInputVertical: css`\n flex-direction: column;\n height: 100%;\n\n .rc-slider {\n margin: 0;\n order: 2;\n }\n `,\n sliderInputField: css`\n margin-left: ${theme.spacing(3)};\n width: 60px;\n input {\n text-align: center;\n }\n `,\n sliderInputFieldVertical: css`\n margin: 0 0 ${theme.spacing(3)} 0;\n order: 1;\n `,\n };\n});\n","import { cx, css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { stylesFactory } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\nconst getStyles = stylesFactory((size: number, inline: boolean) => {\n return {\n wrapper: css`\n font-size: ${size}px;\n ${inline\n ? css`\n display: inline-block;\n `\n : ''}\n `,\n };\n});\n\nexport type Props = {\n className?: string;\n style?: React.CSSProperties;\n iconClassName?: string;\n inline?: boolean;\n size?: number;\n};\n\n/**\n * @public\n */\nexport const Spinner: FC<Props> = (props: Props) => {\n const { className, inline = false, iconClassName, style, size = 16 } = props;\n const styles = getStyles(size, inline);\n return (\n <div data-testid=\"Spinner\" style={style} className={cx(styles.wrapper, className)}>\n <Icon className={cx('fa-spin', iconClassName)} name=\"fa fa-spinner\" />\n </div>\n );\n};\n","import React, { FC } from 'react';\nimport { Cell } from 'react-table';\n\nimport { TableStyles } from './styles';\nimport { GrafanaTableColumn, TableFilterActionCallback } from './types';\n\nexport interface Props {\n cell: Cell;\n tableStyles: TableStyles;\n onCellFilterAdded?: TableFilterActionCallback;\n columnIndex: number;\n columnCount: number;\n userProps?: object;\n}\n\nexport const TableCell: FC<Props> = ({ cell, tableStyles, onCellFilterAdded, columnIndex, columnCount, userProps }) => {\n const cellProps = cell.getCellProps();\n const field = (cell.column as any as GrafanaTableColumn).field;\n\n if (!field?.display) {\n return null;\n }\n\n if (cellProps.style) {\n cellProps.style.minWidth = cellProps.style.width;\n cellProps.style.justifyContent = (cell.column as any).justifyContent;\n }\n\n let innerWidth = ((cell.column.width as number) ?? 24) - tableStyles.cellPadding * 2;\n\n // last child sometimes have extra padding if there is a non overlay scrollbar\n if (columnIndex === columnCount - 1) {\n innerWidth -= tableStyles.lastChildExtraPadding;\n }\n\n return cell.render('Cell', {\n field,\n tableStyles,\n onCellFilterAdded,\n cellProps,\n innerWidth,\n userProps,\n }) as React.ReactElement;\n};\n","import { css, CSSObject } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { getScrollbarWidth } from '../../utils';\n\nexport const getTableStyles = (theme: GrafanaTheme2) => {\n const { colors } = theme;\n const headerBg = theme.colors.background.secondary;\n const borderColor = theme.colors.border.weak;\n const resizerColor = theme.colors.primary.border;\n const cellPadding = 6;\n const lineHeight = theme.typography.body.lineHeight;\n const bodyFontSize = 14;\n const cellHeight = cellPadding * 2 + bodyFontSize * lineHeight;\n const rowHoverBg = theme.colors.emphasize(theme.colors.background.primary, 0.03);\n const lastChildExtraPadding = Math.max(getScrollbarWidth(), cellPadding);\n\n const buildCellContainerStyle = (color?: string, background?: string, overflowOnHover?: boolean) => {\n const cellActionsOverflow: CSSObject = {\n margin: theme.spacing(0, -0.5, 0, 0.5),\n };\n const cellActionsNoOverflow: CSSObject = {\n position: 'absolute',\n top: 0,\n right: 0,\n margin: 'auto',\n };\n\n const onHoverOverflow: CSSObject = {\n overflow: 'visible',\n width: 'auto !important',\n boxShadow: `0 0 2px ${theme.colors.primary.main}`,\n background: background ?? rowHoverBg,\n zIndex: 1,\n };\n\n return css`\n label: ${overflowOnHover ? 'cellContainerOverflow' : 'cellContainerNoOverflow'};\n padding: ${cellPadding}px;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n border-right: 1px solid ${borderColor};\n\n ${color ? `color: ${color};` : ''};\n ${background ? `background: ${background};` : ''};\n background-clip: padding-box;\n\n &:last-child:not(:only-child) {\n border-right: none;\n padding-right: ${lastChildExtraPadding}px;\n }\n\n &:hover {\n ${overflowOnHover && onHoverOverflow};\n .cellActions {\n visibility: visible;\n opacity: 1;\n width: auto;\n }\n }\n\n a {\n color: inherit;\n }\n\n .cellActions {\n display: flex;\n ${overflowOnHover ? cellActionsOverflow : cellActionsNoOverflow}\n visibility: hidden;\n opacity: 0;\n width: 0;\n align-items: center;\n height: 100%;\n padding: ${theme.spacing(1, 0.5, 1, 0.5)};\n background: ${background ? 'none' : theme.colors.emphasize(theme.colors.background.primary, 0.03)};\n\n svg {\n color: ${color};\n }\n }\n\n .cellActionsLeft {\n right: auto !important;\n left: 0;\n }\n\n .cellActionsTransparent {\n background: none;\n }\n `;\n };\n\n return {\n theme,\n cellHeight,\n buildCellContainerStyle,\n cellPadding,\n lastChildExtraPadding,\n cellHeightInner: bodyFontSize * lineHeight,\n rowHeight: cellHeight + 2,\n table: css`\n height: 100%;\n width: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n `,\n thead: css`\n label: thead;\n height: ${cellHeight}px;\n overflow-y: auto;\n overflow-x: hidden;\n background: ${headerBg};\n position: relative;\n `,\n tfoot: css`\n label: tfoot;\n height: ${cellHeight}px;\n overflow-y: auto;\n overflow-x: hidden;\n background: ${headerBg};\n position: relative;\n `,\n headerCell: css`\n padding: ${cellPadding}px;\n overflow: hidden;\n white-space: nowrap;\n color: ${colors.primary.text};\n border-right: 1px solid ${theme.colors.border.weak};\n display: flex;\n\n &:last-child {\n border-right: none;\n }\n `,\n headerCellLabel: css`\n border: none;\n padding: 0;\n background: inherit;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: flex;\n margin-right: ${theme.spacing(0.5)};\n `,\n cellContainer: buildCellContainerStyle(undefined, undefined, true),\n cellContainerNoOverflow: buildCellContainerStyle(undefined, undefined, false),\n cellText: css`\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: text;\n white-space: nowrap;\n `,\n cellLink: css`\n cursor: pointer;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: text;\n white-space: nowrap;\n text-decoration: underline;\n `,\n imageCellLink: css`\n cursor: pointer;\n overflow: hidden;\n height: 100%;\n `,\n headerFilter: css`\n label: headerFilter;\n cursor: pointer;\n `,\n paginationWrapper: css`\n display: flex;\n background: ${headerBg};\n height: ${cellHeight}px;\n justify-content: center;\n align-items: center;\n width: 100%;\n border-top: 1px solid ${theme.colors.border.weak};\n li {\n margin-bottom: 0;\n }\n `,\n paginationItem: css`\n flex: 20%;\n `,\n paginationCenterItem: css`\n flex: 100%;\n display: flex;\n justify-content: center;\n `,\n paginationSummary: css`\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.bodySmall.fontSize};\n display: flex;\n justify-content: flex-end;\n flex: 20%;\n padding-right: ${theme.spacing(1)};\n `,\n\n tableContentWrapper: (totalColumnsWidth: number) => {\n const width = totalColumnsWidth !== undefined ? `${totalColumnsWidth}px` : '100%';\n\n return css`\n label: tableContentWrapper;\n width: ${width};\n display: flex;\n flex-direction: column;\n `;\n },\n row: css`\n label: row;\n border-bottom: 1px solid ${borderColor};\n\n &:hover {\n background-color: ${rowHoverBg};\n }\n\n &:last-child {\n border-bottom: 0;\n }\n `,\n imageCell: css`\n height: 100%;\n `,\n resizeHandle: css`\n label: resizeHandle;\n cursor: col-resize !important;\n display: inline-block;\n background: ${resizerColor};\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n width: 8px;\n height: 100%;\n position: absolute;\n right: -4px;\n border-radius: 3px;\n top: 0;\n touch-action: none;\n\n &:hover {\n opacity: 1;\n }\n `,\n typeIcon: css`\n margin-right: ${theme.spacing(1)};\n color: ${theme.colors.text.secondary};\n `,\n noData: css`\n align-items: center;\n display: flex;\n height: 100%;\n justify-content: center;\n width: 100%;\n `,\n };\n};\n\nexport type TableStyles = ReturnType<typeof getTableStyles>;\n","import { Property } from 'csstype';\nimport { FC } from 'react';\nimport { CellProps, Column, Row } from 'react-table';\n\nimport { Field, KeyValue, SelectableValue } from '@grafana/data';\n\nimport { TableStyles } from './styles';\n\nexport { TableFieldOptions, TableCellDisplayMode, FieldTextAlignment } from '@grafana/schema';\n\nexport interface TableRow {\n [x: string]: any;\n}\n\nexport const FILTER_FOR_OPERATOR = '=';\nexport const FILTER_OUT_OPERATOR = '!=';\nexport type FilterOperator = typeof FILTER_FOR_OPERATOR | typeof FILTER_OUT_OPERATOR;\nexport type FilterItem = { key: string; value: string; operator: FilterOperator };\nexport type TableFilterActionCallback = (item: FilterItem) => void;\nexport type TableColumnResizeActionCallback = (fieldDisplayName: string, width: number) => void;\nexport type TableSortByActionCallback = (state: TableSortByFieldState[]) => void;\n\nexport interface TableSortByFieldState {\n displayName: string;\n desc?: boolean;\n}\n\nexport interface TableCellProps extends CellProps<any> {\n tableStyles: TableStyles;\n cellProps: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n field: Field;\n onCellFilterAdded?: TableFilterActionCallback;\n innerWidth: number;\n}\n\nexport type CellComponent = FC<TableCellProps>;\n\nexport type FooterItem = Array<KeyValue<string>> | string | undefined;\n\nexport type GrafanaTableColumn = Column & {\n field: Field;\n sortType: 'number' | 'basic' | 'alphanumeric-insensitive';\n filter: (rows: Row[], id: string, filterValues?: SelectableValue[]) => SelectableValue[];\n justifyContent: Property.JustifyContent;\n minWidth: number;\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2, locale } from '@grafana/data';\n\nimport { stylesFactory, useStyles2 } from '../../themes';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n counter: css`\n label: counter;\n margin-left: ${theme.spacing(1)};\n border-radius: ${theme.spacing(3)};\n background-color: ${theme.colors.action.hover};\n padding: ${theme.spacing(0.25, 1)};\n color: ${theme.colors.text.secondary};\n font-weight: ${theme.typography.fontWeightMedium};\n font-size: ${theme.typography.size.sm};\n `,\n };\n});\n\nexport interface CounterProps {\n value: number;\n}\n\nexport const Counter: FC<CounterProps> = ({ value }) => {\n const styles = useStyles2(getStyles);\n\n return <span className={styles.counter}>{locale(value, 0).text}</span>;\n};\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLProps } from 'react';\n\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\n\nimport { Counter } from './Counter';\n\nexport interface TabProps extends HTMLProps<HTMLAnchorElement> {\n label: string;\n active?: boolean;\n /** When provided, it is possible to use the tab as a hyperlink. Use in cases where the tabs update location. */\n href?: string;\n icon?: IconName;\n onChangeTab?: (event?: React.MouseEvent<HTMLAnchorElement>) => void;\n /** A number rendered next to the text. Usually used to display the number of items in a tab's view. */\n counter?: number | null;\n /** Extra content, displayed after the tab label and counter */\n suffix?: NavModelItem['tabSuffix'];\n}\n\nexport const Tab = React.forwardRef<HTMLAnchorElement, TabProps>(\n ({ label, active, icon, onChangeTab, counter, suffix: Suffix, className, href, ...otherProps }, ref) => {\n const theme = useTheme2();\n const tabsStyles = getTabStyles(theme);\n const content = () => (\n <>\n {icon && <Icon name={icon} />}\n {label}\n {typeof counter === 'number' && <Counter value={counter} />}\n {Suffix && <Suffix className={tabsStyles.suffix} />}\n </>\n );\n\n const linkClass = cx(tabsStyles.link, active ? tabsStyles.activeStyle : tabsStyles.notActive);\n\n return (\n <div className={tabsStyles.item}>\n <a\n href={href}\n className={linkClass}\n {...otherProps}\n onClick={onChangeTab}\n aria-label={otherProps['aria-label'] || selectors.components.Tab.title(label)}\n role=\"tab\"\n aria-selected={active}\n ref={ref}\n >\n {content()}\n </a>\n </div>\n );\n }\n);\n\nTab.displayName = 'Tab';\n\nconst getTabStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n item: css`\n list-style: none;\n position: relative;\n display: flex;\n `,\n link: css`\n color: ${theme.colors.text.secondary};\n padding: ${theme.spacing(1.5, 2, 1)};\n display: block;\n height: 100%;\n svg {\n margin-right: ${theme.spacing(1)};\n }\n\n &:focus-visible {\n+ ${getFocusStyles(theme)}\n }\n `,\n notActive: css`\n a:hover,\n &:hover,\n &:focus {\n color: ${theme.colors.text.primary};\n\n &::before {\n display: block;\n content: ' ';\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n border-radius: 2px;\n bottom: 0px;\n background: ${theme.colors.action.hover};\n }\n }\n `,\n activeStyle: css`\n label: activeTabStyle;\n color: ${theme.colors.text.primary};\n overflow: hidden;\n font-weight: ${theme.typography.fontWeightMedium};\n\n a {\n color: ${theme.colors.text.primary};\n }\n\n &::before {\n display: block;\n content: ' ';\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n border-radius: 2px;\n bottom: 0px;\n background-image: ${theme.colors.gradients.brandHorizontal} !important;\n }\n `,\n suffix: css`\n margin-left: ${theme.spacing(1)};\n `,\n };\n});\n","import { Placement } from '@popperjs/core';\nimport React from 'react';\n\nimport { PopoverContent } from './types';\n\ntype PopperControllerRenderProp = (\n showPopper: () => void,\n hidePopper: () => void,\n popperProps: {\n show: boolean;\n placement: Placement;\n content: PopoverContent;\n }\n) => JSX.Element;\n\ninterface Props {\n placement?: Placement;\n content: PopoverContent;\n className?: string;\n children: PopperControllerRenderProp;\n hideAfter?: number;\n}\n\ninterface State {\n show: boolean;\n}\n\nclass PopoverController extends React.Component<Props, State> {\n private hideTimeout: any;\n state = { show: false };\n\n showPopper = () => {\n clearTimeout(this.hideTimeout);\n this.setState({ show: true });\n };\n\n hidePopper = () => {\n this.hideTimeout = setTimeout(() => {\n this.setState({ show: false });\n }, this.props.hideAfter);\n };\n\n render() {\n const { children, content, placement = 'auto' } = this.props;\n const { show } = this.state;\n\n return children(this.showPopper, this.hidePopper, {\n show,\n placement,\n content,\n });\n }\n}\n\nexport { PopoverController };\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { usePopperTooltip } from 'react-popper-tooltip';\n\nimport { colorManipulator, GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Portal } from '../Portal/Portal';\n\nimport { PopoverContent, TooltipPlacement } from './types';\n\nexport interface TooltipProps {\n theme?: 'info' | 'error' | 'info-alt';\n show?: boolean;\n placement?: TooltipPlacement;\n content: PopoverContent;\n children: JSX.Element;\n /**\n * Set to true if you want the tooltip to stay long enough so the user can move mouse over content to select text or click a link\n */\n interactive?: boolean;\n}\n\nexport const Tooltip = React.memo(({ children, theme, interactive, show, placement, content }: TooltipProps) => {\n const { getArrowProps, getTooltipProps, setTooltipRef, setTriggerRef, visible, update } = usePopperTooltip({\n visible: show,\n placement: placement,\n interactive: interactive,\n delayHide: interactive ? 100 : 0,\n delayShow: 150,\n offset: [0, 8],\n trigger: ['hover', 'focus'],\n });\n\n const styles = useStyles2(getStyles);\n const containerStyle = styles[theme ?? 'info'];\n\n return (\n <>\n {React.cloneElement(children, {\n ref: setTriggerRef,\n })}\n {visible && (\n <Portal>\n <div ref={setTooltipRef} {...getTooltipProps({ className: containerStyle })}>\n <div {...getArrowProps({ className: 'tooltip-arrow' })} />\n {typeof content === 'string' && content}\n {React.isValidElement(content) && React.cloneElement(content)}\n {typeof content === 'function' &&\n content({\n updatePopperPosition: update as any,\n })}\n </div>\n </Portal>\n )}\n </>\n );\n});\n\nTooltip.displayName = 'Tooltip';\n\nfunction getStyles(theme: GrafanaTheme2) {\n function buildTooltipTheme(tooltipBg: string, tooltipBorder: string, tooltipText: string) {\n return css`\n background-color: ${tooltipBg};\n border-radius: 3px;\n border: 1px solid ${tooltipBorder};\n box-shadow: ${theme.shadows.z2};\n color: ${tooltipText};\n font-size: ${theme.typography.bodySmall.fontSize};\n padding: ${theme.spacing(0.5, 1)};\n transition: opacity 0.3s;\n z-index: ${theme.zIndex.tooltip};\n max-width: 400px;\n overflow-wrap: break-word;\n\n &[data-popper-interactive='false'] {\n pointer-events: none;\n }\n\n .tooltip-arrow {\n height: 1rem;\n position: absolute;\n width: 1rem;\n pointer-events: none;\n }\n\n .tooltip-arrow::before {\n border-style: solid;\n content: '';\n display: block;\n height: 0;\n margin: auto;\n width: 0;\n }\n\n .tooltip-arrow::after {\n border-style: solid;\n content: '';\n display: block;\n height: 0;\n margin: auto;\n position: absolute;\n width: 0;\n }\n\n &[data-popper-placement*='bottom'] .tooltip-arrow {\n left: 0;\n margin-top: -10px;\n top: 0;\n }\n\n &[data-popper-placement*='bottom'] .tooltip-arrow::before {\n border-color: transparent transparent ${tooltipBorder} transparent;\n border-width: 0 8px 7px 8px;\n position: absolute;\n top: -1px;\n }\n\n &[data-popper-placement*='bottom'] .tooltip-arrow::after {\n border-color: transparent transparent ${tooltipBg} transparent;\n border-width: 0 8px 7px 8px;\n }\n\n &[data-popper-placement*='top'] .tooltip-arrow {\n bottom: 0;\n left: 0;\n margin-bottom: -11px;\n }\n\n &[data-popper-placement*='top'] .tooltip-arrow::before {\n border-color: ${tooltipBorder} transparent transparent transparent;\n border-width: 7px 8px 0 7px;\n position: absolute;\n top: 1px;\n }\n\n &[data-popper-placement*='top'] .tooltip-arrow::after {\n border-color: ${tooltipBg} transparent transparent transparent;\n border-width: 7px 8px 0 7px;\n }\n\n &[data-popper-placement*='right'] .tooltip-arrow {\n left: 0;\n margin-left: -11px;\n }\n\n &[data-popper-placement*='right'] .tooltip-arrow::before {\n border-color: transparent ${tooltipBorder} transparent transparent;\n border-width: 7px 6px 7px 0;\n }\n\n &[data-popper-placement*='right'] .tooltip-arrow::after {\n border-color: transparent ${tooltipBg} transparent transparent;\n border-width: 6px 7px 7px 0;\n left: 2px;\n top: 1px;\n }\n\n &[data-popper-placement*='left'] .tooltip-arrow {\n margin-right: -10px;\n right: 0;\n }\n\n &[data-popper-placement*='left'] .tooltip-arrow::before {\n border-color: transparent transparent transparent ${tooltipBorder};\n border-width: 7px 0px 6px 7px;\n }\n\n &[data-popper-placement*='left'] .tooltip-arrow::after {\n border-color: transparent transparent transparent ${tooltipBg};\n border-width: 6px 0 5px 5px;\n left: 1px;\n top: 1px;\n }\n\n code {\n border: none;\n display: inline;\n background: ${colorManipulator.darken(tooltipBg, 0.1)};\n color: ${tooltipText};\n }\n\n pre {\n background: ${colorManipulator.darken(tooltipBg, 0.1)};\n color: ${tooltipText};\n }\n\n a {\n color: ${tooltipText};\n text-decoration: underline;\n }\n\n a:hover {\n text-decoration: none;\n }\n `;\n }\n\n const info = buildTooltipTheme(\n theme.components.tooltip.background,\n theme.components.tooltip.background,\n theme.components.tooltip.text\n );\n const error = buildTooltipTheme(theme.colors.error.main, theme.colors.error.main, theme.colors.error.contrastText);\n\n return {\n info: info,\n ['info-alt']: info,\n error,\n };\n}\n","import React, { createElement } from 'react';\n\nimport { HighlightPart } from '../../types';\n\ninterface Props {\n text: string;\n highlightParts: HighlightPart[];\n highlightClassName: string;\n}\n\n/**\n * Flattens parts into a list of indices pointing to the index where a part\n * (highlighted or not highlighted) starts. Adds extra indices if needed\n * at the beginning or the end to ensure the entire text is covered.\n */\nfunction getStartIndices(parts: HighlightPart[], length: number): number[] {\n const indices: number[] = [];\n parts.forEach((part) => {\n indices.push(part.start, part.end + 1);\n });\n if (indices[0] !== 0) {\n indices.unshift(0);\n }\n if (indices[indices.length - 1] !== length) {\n indices.push(length);\n }\n return indices;\n}\n\nexport const PartialHighlighter: React.FC<Props> = (props: Props) => {\n let { highlightParts, text, highlightClassName } = props;\n\n if (!highlightParts?.length) {\n return null;\n }\n\n let children = [];\n let indices = getStartIndices(highlightParts, text.length);\n let highlighted = highlightParts[0].start === 0;\n\n for (let i = 1; i < indices.length; i++) {\n let start = indices[i - 1];\n let end = indices[i];\n\n children.push(\n createElement(\n highlighted ? 'mark' : 'span',\n {\n key: i - 1,\n className: highlighted ? highlightClassName : undefined,\n },\n text.substring(start, end)\n )\n );\n highlighted = !highlighted;\n }\n\n return <div>{children}</div>;\n};\n","import { css } from '@emotion/css';\nimport React, { FC, CSSProperties, ComponentType } from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { LegendPlacement } from '@grafana/schema';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\n\n/**\n * @beta\n */\nexport interface VizLayoutProps {\n width: number;\n height: number;\n legend?: React.ReactElement<VizLayoutLegendProps> | null;\n children: (width: number, height: number) => React.ReactNode;\n}\n\n/**\n * @beta\n */\nexport interface VizLayoutComponentType extends FC<VizLayoutProps> {\n Legend: ComponentType<VizLayoutLegendProps>;\n}\n\n/**\n * @beta\n */\nexport const VizLayout: VizLayoutComponentType = ({ width, height, legend, children }) => {\n const styles = useStyles2(getVizStyles);\n const containerStyle: CSSProperties = {\n display: 'flex',\n width: `${width}px`,\n height: `${height}px`,\n };\n const [legendRef, legendMeasure] = useMeasure<HTMLDivElement>();\n\n if (!legend) {\n return (\n <div tabIndex={0} style={containerStyle} className={styles.viz}>\n {children(width, height)}\n </div>\n );\n }\n\n const { placement, maxHeight = '35%', maxWidth = '60%' } = legend.props;\n\n let size: VizSize | null = null;\n\n const legendStyle: CSSProperties = {};\n\n switch (placement) {\n case 'bottom':\n containerStyle.flexDirection = 'column';\n legendStyle.maxHeight = maxHeight;\n\n if (legendMeasure) {\n size = { width, height: height - legendMeasure.height };\n }\n break;\n case 'right':\n containerStyle.flexDirection = 'row';\n legendStyle.maxWidth = maxWidth;\n\n if (legendMeasure) {\n size = { width: width - legendMeasure.width, height };\n }\n\n if (legend.props.width) {\n legendStyle.width = legend.props.width;\n size = { width: width - legend.props.width, height };\n }\n break;\n }\n\n // This happens when position is switched from bottom to right\n // Then we preserve old with for one render cycle until legend is measured in it's new position\n if (size?.width === 0) {\n size.width = width;\n }\n\n if (size?.height === 0) {\n size.height = height;\n }\n\n return (\n <div style={containerStyle}>\n <div tabIndex={0} className={styles.viz}>\n {size && children(size.width, size.height)}\n </div>\n <div style={legendStyle} ref={legendRef}>\n <CustomScrollbar hideHorizontalTrack>{legend}</CustomScrollbar>\n </div>\n </div>\n );\n};\n\nexport const getVizStyles = (theme: GrafanaTheme2) => {\n return {\n viz: css({\n flexGrow: 2,\n borderRadius: theme.shape.borderRadius(1),\n '&:focus-visible': getFocusStyles(theme),\n }),\n };\n};\ninterface VizSize {\n width: number;\n height: number;\n}\n\n/**\n * @beta\n */\nexport interface VizLayoutLegendProps {\n placement: LegendPlacement;\n children: React.ReactNode;\n maxHeight?: string;\n maxWidth?: string;\n width?: number;\n}\n\n/**\n * @beta\n */\nexport const VizLayoutLegend: FC<VizLayoutLegendProps> = ({ children }) => {\n return <>{children}</>;\n};\n\nVizLayout.Legend = VizLayoutLegend;\n","import React, { CSSProperties } from 'react';\n\nimport { fieldColorModeRegistry } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes';\n\nexport interface Props extends React.HTMLAttributes<HTMLDivElement> {\n color?: string;\n gradient?: string;\n}\n\nexport const SeriesIcon = React.forwardRef<HTMLDivElement, Props>(\n ({ color, className, gradient, ...restProps }, ref) => {\n const theme = useTheme2();\n let cssColor: string;\n\n if (gradient) {\n const colors = fieldColorModeRegistry.get(gradient).getColors?.(theme);\n if (colors?.length) {\n cssColor = `linear-gradient(90deg, ${colors.join(', ')})`;\n } else {\n // Not sure what to default to, this will return gray, this should not happen though.\n cssColor = theme.visualization.getColorByName('');\n }\n } else {\n cssColor = color!;\n }\n\n const styles: CSSProperties = {\n background: cssColor,\n width: '14px',\n height: '4px',\n borderRadius: '1px',\n display: 'inline-block',\n marginRight: '8px',\n };\n\n return <div ref={ref} className={className} style={styles} {...restProps} />;\n }\n);\n\nSeriesIcon.displayName = 'SeriesIcon';\n","import { css, cx } from '@emotion/css';\nimport React, { useState, HTMLAttributes, useMemo, useRef, useLayoutEffect } from 'react';\nimport { useWindowSize } from 'react-use';\n\nimport { Dimensions2D, GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { getTooltipContainerStyles } from '../../themes/mixins';\n\nimport { calculateTooltipPosition } from './utils';\n\n/**\n * @public\n */\nexport interface VizTooltipContainerProps extends HTMLAttributes<HTMLDivElement> {\n position: { x: number; y: number };\n offset: { x: number; y: number };\n children?: React.ReactNode;\n allowPointerEvents?: boolean;\n}\n\n/**\n * @public\n */\nexport const VizTooltipContainer: React.FC<VizTooltipContainerProps> = ({\n position: { x: positionX, y: positionY },\n offset: { x: offsetX, y: offsetY },\n children,\n allowPointerEvents = false,\n className,\n ...otherProps\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [tooltipMeasurement, setTooltipMeasurement] = useState<Dimensions2D>({ width: 0, height: 0 });\n const { width, height } = useWindowSize();\n const [placement, setPlacement] = useState({\n x: positionX + offsetX,\n y: positionY + offsetY,\n });\n\n const resizeObserver = useMemo(\n () =>\n // TS has hard time playing games with @types/resize-observer-browser, hence the ignore\n // @ts-ignore\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n const tW = Math.floor(entry.contentRect.width + 2 * 8); // adding padding until Safari supports borderBoxSize\n const tH = Math.floor(entry.contentRect.height + 2 * 8);\n if (tooltipMeasurement.width !== tW || tooltipMeasurement.height !== tH) {\n setTooltipMeasurement({\n width: Math.min(tW, width),\n height: Math.min(tH, height),\n });\n }\n }\n }),\n [tooltipMeasurement, width, height]\n );\n\n useLayoutEffect(() => {\n if (tooltipRef.current) {\n resizeObserver.observe(tooltipRef.current);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [resizeObserver]);\n\n // Make sure tooltip does not overflow window\n useLayoutEffect(() => {\n if (tooltipRef && tooltipRef.current) {\n const { x, y } = calculateTooltipPosition(\n positionX,\n positionY,\n tooltipMeasurement.width,\n tooltipMeasurement.height,\n offsetX,\n offsetY,\n width,\n height\n );\n\n setPlacement({ x, y });\n }\n }, [width, height, positionX, offsetX, positionY, offsetY, tooltipMeasurement]);\n\n const styles = useStyles2(getStyles);\n\n return (\n <div\n ref={tooltipRef}\n style={{\n position: 'fixed',\n left: 0,\n // disabling pointer-events is to prevent the tooltip from flickering when moving left to right\n // see e.g. https://github.com/grafana/grafana/pull/33609\n pointerEvents: allowPointerEvents ? 'auto' : 'none',\n top: 0,\n transform: `translate(${placement.x}px, ${placement.y}px)`,\n transition: 'transform ease-out 0.1s',\n }}\n {...otherProps}\n className={cx(styles.wrapper, className)}\n >\n {children}\n </div>\n );\n};\n\nVizTooltipContainer.displayName = 'VizTooltipContainer';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n ${getTooltipContainerStyles(theme)}\n `,\n});\n","export const calculateTooltipPosition = (\n xPos = 0,\n yPos = 0,\n tooltipWidth = 0,\n tooltipHeight = 0,\n xOffset = 0,\n yOffset = 0,\n windowWidth = 0,\n windowHeight = 0\n) => {\n let x = xPos;\n let y = yPos;\n\n const overflowRight = Math.max(xPos + xOffset + tooltipWidth - (windowWidth - xOffset), 0);\n const overflowLeft = Math.abs(Math.min(xPos - xOffset - tooltipWidth - xOffset, 0));\n const wouldOverflowRight = overflowRight > 0;\n const wouldOverflowLeft = overflowLeft > 0;\n\n const overflowBelow = Math.max(yPos + yOffset + tooltipHeight - (windowHeight - yOffset), 0);\n const overflowAbove = Math.abs(Math.min(yPos - yOffset - tooltipHeight - yOffset, 0));\n const wouldOverflowBelow = overflowBelow > 0;\n const wouldOverflowAbove = overflowAbove > 0;\n\n if (wouldOverflowRight && wouldOverflowLeft) {\n x = overflowRight > overflowLeft ? xOffset : windowWidth - xOffset - tooltipWidth;\n } else if (wouldOverflowRight) {\n x = xPos - xOffset - tooltipWidth;\n } else {\n x = xPos + xOffset;\n }\n\n if (wouldOverflowBelow && wouldOverflowAbove) {\n y = overflowBelow > overflowAbove ? yOffset : windowHeight - yOffset - tooltipHeight;\n } else if (wouldOverflowBelow) {\n y = yPos - yOffset - tooltipHeight;\n } else {\n y = yPos + yOffset;\n }\n return { x, y };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Dimensions, TimeZone } from '@grafana/data';\nimport { TooltipDisplayMode } from '@grafana/schema';\n\nimport { useStyles } from '../../themes';\nimport { FlotPosition } from '../Graph/types';\nimport { Portal } from '../Portal/Portal';\n\nimport { VizTooltipContainer } from './VizTooltipContainer';\n\n// Describes active dimensions user interacts with\n// It's a key-value pair where:\n// - key is the name of the dimension\n// - value is a tuple addressing which column and row from given dimension is active.\n// If row is undefined, it means that we are not hovering over a datapoint\nexport type ActiveDimensions<T extends Dimensions = any> = { [key in keyof T]: [number, number | undefined] | null };\n\nexport interface VizTooltipContentProps<T extends Dimensions = any> {\n // Each dimension is described by array of fields representing it\n // I.e. for graph there are two dimensions: x and y axis:\n // { xAxis: [<array of time fields>], yAxis: [<array of value fields>]}\n // TODO: type this better, no good idea how yet\n dimensions: T; // Dimension[]\n activeDimensions?: ActiveDimensions<T>;\n timeZone?: TimeZone;\n pos: FlotPosition;\n mode: TooltipDisplayMode;\n}\n\nexport interface VizTooltipProps {\n /** Element used as tooltips content */\n content?: React.ReactElement<any>;\n\n /** Optional component to be used as a tooltip content */\n tooltipComponent?: React.ComponentType<VizTooltipContentProps>;\n\n /** x/y position relative to the window */\n position?: { x: number; y: number };\n\n /** x/y offset relative to tooltip origin element, i.e. graph's datapoint */\n offset?: { x: number; y: number };\n\n // Mode in which tooltip works\n // - single - display single series info\n // - multi - display all series info\n mode?: TooltipDisplayMode;\n}\n\n/**\n * @public\n */\nexport const VizTooltip: React.FC<VizTooltipProps> = ({ content, position, offset }) => {\n const styles = useStyles(getStyles);\n if (position) {\n return (\n <Portal className={styles.portal}>\n <VizTooltipContainer position={position} offset={offset || { x: 0, y: 0 }}>\n {content}\n </VizTooltipContainer>\n </Portal>\n );\n }\n return null;\n};\n\nVizTooltip.displayName = 'VizTooltip';\n\nconst getStyles = () => {\n return {\n portal: css`\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n width: 100%;\n height: 100%;\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, GraphSeriesValue } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { SeriesIcon } from '../VizLegend/SeriesIcon';\n\n/**\n * @public\n */\nexport interface SeriesTableRowProps {\n color?: string;\n label?: React.ReactNode;\n value?: string | GraphSeriesValue;\n isActive?: boolean;\n}\n\nconst getSeriesTableRowStyles = (theme: GrafanaTheme2) => {\n return {\n icon: css`\n margin-right: ${theme.spacing(1)};\n vertical-align: middle;\n `,\n seriesTable: css`\n display: table;\n `,\n seriesTableRow: css`\n display: table-row;\n font-size: ${theme.typography.bodySmall.fontSize};\n `,\n seriesTableCell: css`\n display: table-cell;\n `,\n label: css`\n word-break: break-all;\n `,\n value: css`\n padding-left: ${theme.spacing(2)};\n `,\n activeSeries: css`\n font-weight: ${theme.typography.fontWeightBold};\n color: ${theme.colors.text.maxContrast};\n `,\n timestamp: css`\n font-weight: ${theme.typography.fontWeightBold};\n font-size: ${theme.typography.bodySmall.fontSize};\n `,\n };\n};\n\n/**\n * @public\n */\nexport const SeriesTableRow: React.FC<SeriesTableRowProps> = ({ color, label, value, isActive }) => {\n const styles = useStyles2(getSeriesTableRowStyles);\n\n return (\n <div data-testid=\"SeriesTableRow\" className={cx(styles.seriesTableRow, isActive && styles.activeSeries)}>\n {color && (\n <div className={styles.seriesTableCell}>\n <SeriesIcon color={color} className={styles.icon} />\n </div>\n )}\n {label && <div className={cx(styles.seriesTableCell, styles.label)}>{label}</div>}\n {value && <div className={cx(styles.seriesTableCell, styles.value)}>{value}</div>}\n </div>\n );\n};\n\n/**\n * @public\n */\nexport interface SeriesTableProps {\n timestamp?: string | GraphSeriesValue;\n series: SeriesTableRowProps[];\n}\n\n/**\n * @public\n */\nexport const SeriesTable: React.FC<SeriesTableProps> = ({ timestamp, series }) => {\n const styles = useStyles2(getSeriesTableRowStyles);\n\n return (\n <>\n {timestamp && (\n <div className={styles.timestamp} aria-label=\"Timestamp\">\n {timestamp}\n </div>\n )}\n {series.map((s, i) => {\n return (\n <SeriesTableRow\n isActive={s.isActive}\n label={s.label}\n color={s.color}\n value={s.value}\n key={`${s.label}-${i}`}\n />\n );\n })}\n </>\n );\n};\n","import classNames from 'classnames';\nimport React, { FunctionComponent, ReactNode } from 'react';\n\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip, PopoverContent } from '../Tooltip';\n\ninterface Props {\n children: ReactNode;\n className?: string;\n htmlFor?: string;\n isFocused?: boolean;\n isInvalid?: boolean;\n tooltip?: PopoverContent;\n width?: number | 'auto';\n}\n\nexport const FormLabel: FunctionComponent<Props> = ({\n children,\n isFocused,\n isInvalid,\n className,\n htmlFor,\n tooltip,\n width,\n ...rest\n}) => {\n const classes = classNames(className, `gf-form-label width-${width ? width : '10'}`, {\n 'gf-form-label--is-focused': isFocused,\n 'gf-form-label--is-invalid': isInvalid,\n });\n\n return (\n <label className={classes} {...rest} htmlFor={htmlFor}>\n {children}\n {tooltip && (\n <Tooltip placement=\"top\" content={tooltip} theme={'info'}>\n <div className=\"gf-form-help-icon gf-form-help-icon--right-normal\">\n <Icon name=\"info-circle\" size=\"sm\" style={{ marginLeft: '10px' }} />\n </div>\n </Tooltip>\n )}\n </label>\n );\n};\n\nexport const InlineFormLabel = FormLabel;\n","import { css, cx } from '@emotion/css';\nimport React, { InputHTMLAttributes, FunctionComponent } from 'react';\n\nimport { InlineFormLabel } from '../FormLabel/FormLabel';\nimport { PopoverContent } from '../Tooltip';\n\nexport interface Props extends InputHTMLAttributes<HTMLInputElement> {\n label: string;\n tooltip?: PopoverContent;\n labelWidth?: number;\n // If null no width will be specified not even default one\n inputWidth?: number | null;\n inputEl?: React.ReactNode;\n}\n\nconst defaultProps = {\n labelWidth: 6,\n inputWidth: 12,\n};\n\n/**\n * Default form field including label used in Grafana UI. Default input element is simple <input />. You can also pass\n * custom inputEl if required in which case inputWidth and inputProps are ignored.\n */\nexport const FormField: FunctionComponent<Props> = ({\n label,\n tooltip,\n labelWidth,\n inputWidth,\n inputEl,\n className,\n ...inputProps\n}) => {\n const styles = getStyles();\n return (\n <div className={cx(styles.formField, className)}>\n <InlineFormLabel width={labelWidth} tooltip={tooltip}>\n {label}\n </InlineFormLabel>\n {inputEl || (\n <input type=\"text\" className={`gf-form-input ${inputWidth ? `width-${inputWidth}` : ''}`} {...inputProps} />\n )}\n </div>\n );\n};\n\nFormField.displayName = 'FormField';\nFormField.defaultProps = defaultProps;\n\nconst getStyles = () => {\n return {\n formField: css`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n text-align: left;\n position: relative;\n `,\n };\n};\n","import { Placement } from '@popperjs/core';\nimport { uniqueId } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport { Icon } from '../../..';\nimport { Tooltip } from '../../../Tooltip/Tooltip';\n\nexport interface Props {\n label: string;\n checked: boolean;\n className?: string;\n labelClass?: string;\n switchClass?: string;\n tooltip?: string;\n tooltipPlacement?: Placement;\n transparent?: boolean;\n onChange: (event: React.SyntheticEvent<HTMLInputElement>) => void;\n}\n\nexport interface State {\n id: string;\n}\n\nexport class Switch extends PureComponent<Props, State> {\n state = {\n id: uniqueId(),\n };\n\n internalOnChange = (event: React.FormEvent<HTMLInputElement>) => {\n event.stopPropagation();\n this.props.onChange(event);\n };\n\n render() {\n const {\n labelClass = '',\n switchClass = '',\n label,\n checked,\n transparent,\n className,\n tooltip,\n tooltipPlacement,\n } = this.props;\n\n const labelId = this.state.id;\n const labelClassName = `gf-form-label ${labelClass} ${transparent ? 'gf-form-label--transparent' : ''} pointer`;\n const switchClassName = `gf-form-switch ${switchClass} ${transparent ? 'gf-form-switch--transparent' : ''}`;\n\n return (\n <div className=\"gf-form-switch-container-react\">\n <label htmlFor={labelId} className={`gf-form gf-form-switch-container ${className || ''}`}>\n {label && (\n <div className={labelClassName}>\n {label}\n {tooltip && (\n <Tooltip placement={tooltipPlacement ? tooltipPlacement : 'auto'} content={tooltip} theme={'info'}>\n <div className=\"gf-form-help-icon gf-form-help-icon--right-normal\">\n <Icon name=\"info-circle\" size=\"sm\" style={{ marginLeft: '10px' }} />\n </div>\n </Tooltip>\n )}\n </div>\n )}\n <div className={switchClassName}>\n <input id={labelId} type=\"checkbox\" checked={checked} onChange={this.internalOnChange} />\n <span className=\"gf-form-switch__slider\" />\n </div>\n </label>\n </div>\n );\n }\n}\n","import { css, cx } from '@emotion/css';\nimport { omit } from 'lodash';\nimport React, { InputHTMLAttributes, FunctionComponent } from 'react';\n\nimport { Button } from '../Button/Button';\nimport { FormField } from '../FormField/FormField';\nimport { PopoverContent } from '../Tooltip';\n\nexport interface Props extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onReset'> {\n // Function to use when reset is clicked. Means you have to reset the input value yourself as this is uncontrolled\n // component (or do something else if required).\n onReset: (event: React.SyntheticEvent<HTMLButtonElement>) => void;\n isConfigured: boolean;\n\n label?: string;\n tooltip?: PopoverContent;\n labelWidth?: number;\n inputWidth?: number;\n // Placeholder of the input field when in non configured state.\n placeholder?: string;\n}\n\nconst getSecretFormFieldStyles = () => {\n return {\n noRadiusInput: css`\n border-bottom-right-radius: 0 !important;\n border-top-right-radius: 0 !important;\n `,\n noRadiusButton: css`\n border-bottom-left-radius: 0 !important;\n border-top-left-radius: 0 !important;\n `,\n };\n};\n/**\n * Form field that has 2 states configured and not configured. If configured it will not show its contents and adds\n * a reset button that will clear the input and makes it accessible. In non configured state it behaves like normal\n * form field. This is used for passwords or anything that is encrypted on the server and is later returned encrypted\n * to the user (like datasource passwords).\n */\nexport const SecretFormField: FunctionComponent<Props> = ({\n label = 'Password',\n labelWidth,\n inputWidth = 12,\n onReset,\n isConfigured,\n tooltip,\n placeholder = 'Password',\n ...inputProps\n}: Props) => {\n const styles = getSecretFormFieldStyles();\n return (\n <FormField\n label={label!}\n tooltip={tooltip}\n labelWidth={labelWidth}\n inputEl={\n isConfigured ? (\n <>\n <input\n type=\"text\"\n className={cx(`gf-form-input width-${inputWidth}`, styles.noRadiusInput)}\n disabled={true}\n value=\"configured\"\n {...omit(inputProps, 'value')}\n />\n <Button onClick={onReset} variant=\"secondary\" type=\"button\">\n Reset\n </Button>\n </>\n ) : (\n <input\n type=\"password\"\n className={`gf-form-input width-${inputWidth}`}\n placeholder={placeholder}\n {...inputProps}\n />\n )\n }\n />\n );\n};\n\nSecretFormField.displayName = 'SecretFormField';\n","import { cx, css } from '@emotion/css';\nimport React, { PureComponent, SyntheticEvent } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { stylesFactory, withTheme } from '../../themes';\nimport { Themeable } from '../../types';\nimport { ComponentSize } from '../../types/size';\nimport { Button, ButtonVariant } from '../Button';\n\nexport interface Props extends Themeable {\n /** Confirm action callback */\n onConfirm(): void;\n /** Custom button styles */\n className?: string;\n /** Button size */\n size?: ComponentSize;\n /** Text for the Confirm button */\n confirmText?: string;\n /** Disable button click action */\n disabled?: boolean;\n /** Variant of the Confirm button */\n confirmVariant?: ButtonVariant;\n /** Hide confirm actions when after of them is clicked */\n closeOnConfirm?: boolean;\n /** Move focus to button when mounted */\n autoFocus?: boolean;\n\n /** Optional on click handler for the original button */\n onClick?(): void;\n /** Callback for the cancel action */\n onCancel?(): void;\n}\n\ninterface State {\n showConfirm: boolean;\n}\n\nclass UnThemedConfirmButton extends PureComponent<Props, State> {\n mainButtonRef = React.createRef<HTMLButtonElement>();\n confirmButtonRef = React.createRef<HTMLButtonElement>();\n state: State = {\n showConfirm: false,\n };\n\n onClickButton = (event: SyntheticEvent) => {\n if (event) {\n event.preventDefault();\n }\n\n this.setState(\n {\n showConfirm: true,\n },\n () => {\n if (this.props.autoFocus && this.confirmButtonRef.current) {\n this.confirmButtonRef.current.focus();\n }\n }\n );\n\n if (this.props.onClick) {\n this.props.onClick();\n }\n };\n\n onClickCancel = (event: SyntheticEvent) => {\n if (event) {\n event.preventDefault();\n }\n this.setState(\n {\n showConfirm: false,\n },\n () => {\n this.mainButtonRef.current?.focus();\n }\n );\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n };\n onConfirm = (event: SyntheticEvent) => {\n if (event) {\n event.preventDefault();\n }\n this.props.onConfirm();\n if (this.props.closeOnConfirm) {\n this.setState({\n showConfirm: false,\n });\n }\n };\n\n render() {\n const {\n theme,\n className,\n size,\n disabled,\n confirmText,\n confirmVariant: confirmButtonVariant,\n children,\n } = this.props;\n const styles = getStyles(theme);\n const buttonClass = cx(\n className,\n this.state.showConfirm ? styles.buttonHide : styles.buttonShow,\n disabled && styles.buttonDisabled\n );\n const confirmButtonClass = cx(\n styles.confirmButton,\n this.state.showConfirm ? styles.confirmButtonShow : styles.confirmButtonHide\n );\n\n const onClick = disabled ? () => {} : this.onClickButton;\n\n return (\n <span className={styles.buttonContainer}>\n <div className={cx(disabled && styles.disabled)}>\n {typeof children === 'string' ? (\n <span className={buttonClass}>\n <Button size={size} fill=\"text\" onClick={onClick} ref={this.mainButtonRef}>\n {children}\n </Button>\n </span>\n ) : (\n <span className={buttonClass} onClick={onClick}>\n {children}\n </span>\n )}\n </div>\n <span className={confirmButtonClass}>\n <Button size={size} variant={confirmButtonVariant} onClick={this.onConfirm} ref={this.confirmButtonRef}>\n {confirmText}\n </Button>\n <Button size={size} fill=\"text\" onClick={this.onClickCancel}>\n Cancel\n </Button>\n </span>\n </span>\n );\n }\n}\n\nexport const ConfirmButton = withTheme(UnThemedConfirmButton);\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n buttonContainer: css`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n `,\n buttonDisabled: css`\n text-decoration: none;\n color: ${theme.colors.text};\n opacity: 0.65;\n pointer-events: none;\n `,\n buttonShow: css`\n opacity: 1;\n transition: opacity 0.1s ease;\n z-index: 2;\n `,\n buttonHide: css`\n opacity: 0;\n transition: opacity 0.1s ease, visibility 0 0.1s;\n visibility: hidden;\n z-index: 0;\n `,\n confirmButton: css`\n align-items: flex-start;\n background: ${theme.colors.bg1};\n display: flex;\n position: absolute;\n pointer-events: none;\n `,\n confirmButtonShow: css`\n z-index: 1;\n opacity: 1;\n transition: opacity 0.08s ease-out, transform 0.1s ease-out;\n transform: translateX(0);\n pointer-events: all;\n `,\n confirmButtonHide: css`\n opacity: 0;\n visibility: hidden;\n transition: opacity 0.12s ease-in, transform 0.14s ease-in, visibility 0s 0.12s;\n transform: translateX(100px);\n `,\n disabled: css`\n cursor: not-allowed;\n `,\n };\n});\n\n// Declare defaultProps directly on the themed component so they are displayed\n// in the props table\nConfirmButton.defaultProps = {\n size: 'md',\n confirmText: 'Save',\n disabled: false,\n confirmVariant: 'primary',\n};\nConfirmButton.displayName = 'ConfirmButton';\n","import React, { FC } from 'react';\n\nimport { ComponentSize } from '../../types/size';\nimport { Button } from '../Button';\n\nimport { ConfirmButton } from './ConfirmButton';\n\nexport interface Props {\n /** Confirm action callback */\n onConfirm(): void;\n /** Button size */\n size?: ComponentSize;\n /** Disable button click action */\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport const DeleteButton: FC<Props> = ({ size, disabled, onConfirm, 'aria-label': ariaLabel }) => {\n return (\n <ConfirmButton\n confirmText=\"Delete\"\n confirmVariant=\"destructive\"\n size={size || 'md'}\n disabled={disabled}\n onConfirm={onConfirm}\n >\n <Button aria-label={ariaLabel} variant=\"destructive\" icon=\"times\" size={size || 'sm'} />\n </ConfirmButton>\n );\n};\n","import { Placement, VirtualElement } from '@popperjs/core';\nimport React, { PureComponent } from 'react';\nimport { Manager, Popper as ReactPopper, PopperArrowProps } from 'react-popper';\nimport Transition from 'react-transition-group/Transition';\n\nimport { Portal } from '../Portal/Portal';\n\nimport { PopoverContent } from './types';\n\nconst defaultTransitionStyles = {\n transitionProperty: 'opacity',\n transitionDuration: '200ms',\n transitionTimingFunction: 'linear',\n opacity: 0,\n};\n\nconst transitionStyles: { [key: string]: object } = {\n exited: { opacity: 0 },\n entering: { opacity: 0 },\n entered: { opacity: 1, transitionDelay: '0s' },\n exiting: { opacity: 0, transitionDelay: '500ms' },\n};\n\nexport type RenderPopperArrowFn = (props: { arrowProps: PopperArrowProps; placement: string }) => JSX.Element;\n\ninterface Props extends React.HTMLAttributes<HTMLDivElement> {\n show: boolean;\n placement?: Placement;\n content: PopoverContent;\n referenceElement: HTMLElement | VirtualElement;\n wrapperClassName?: string;\n renderArrow?: RenderPopperArrowFn;\n}\n\nclass Popover extends PureComponent<Props> {\n render() {\n const {\n content,\n show,\n placement,\n onMouseEnter,\n onMouseLeave,\n className,\n wrapperClassName,\n renderArrow,\n referenceElement,\n onKeyDown,\n } = this.props;\n\n return (\n <Manager>\n <Transition in={show} timeout={100} mountOnEnter={true} unmountOnExit={true}>\n {(transitionState) => {\n return (\n <Portal>\n <ReactPopper\n placement={placement}\n referenceElement={referenceElement}\n modifiers={[\n { name: 'preventOverflow', enabled: true, options: { rootBoundary: 'viewport' } },\n {\n name: 'eventListeners',\n options: { scroll: true, resize: true },\n },\n ]}\n >\n {({ ref, style, placement, arrowProps, update }) => {\n return (\n <div\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onKeyDown={onKeyDown}\n ref={ref}\n style={{\n ...style,\n ...defaultTransitionStyles,\n ...transitionStyles[transitionState],\n }}\n data-placement={placement}\n className={`${wrapperClassName}`}\n >\n <div className={className}>\n {typeof content === 'string' && content}\n {React.isValidElement(content) && React.cloneElement(content)}\n {typeof content === 'function' &&\n content({\n updatePopperPosition: update,\n })}\n {renderArrow &&\n renderArrow({\n arrowProps,\n placement,\n })}\n </div>\n </div>\n );\n }}\n </ReactPopper>\n </Portal>\n );\n }}\n </Transition>\n </Manager>\n );\n }\n}\n\nexport { Popover };\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { SelectableValue, GrafanaTheme2 } from '@grafana/data';\n\nimport { IconName, TabsBar, Tab, IconButton, CustomScrollbar, TabContent } from '../..';\nimport { stylesFactory, useTheme2 } from '../../themes';\n\nexport interface TabConfig {\n label: string;\n value: string;\n content: React.ReactNode;\n icon: IconName;\n}\n\nexport interface TabbedContainerProps {\n tabs: TabConfig[];\n defaultTab?: string;\n closeIconTooltip?: string;\n onClose: () => void;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n container: css`\n height: 100%;\n `,\n tabContent: css`\n padding: ${theme.spacing(2)};\n background-color: ${theme.colors.background.primary};\n height: calc(100% - ${theme.components.menuTabs.height}px);\n `,\n close: css`\n position: absolute;\n right: 16px;\n top: 5px;\n cursor: pointer;\n font-size: ${theme.typography.size.lg};\n `,\n tabs: css`\n padding-top: ${theme.spacing(1)};\n border-color: ${theme.colors.border.weak};\n ul {\n margin-left: ${theme.spacing(2)};\n }\n `,\n };\n});\n\nexport function TabbedContainer(props: TabbedContainerProps) {\n const [activeTab, setActiveTab] = useState(\n props.tabs.some((tab) => tab.value === props.defaultTab) ? props.defaultTab : props.tabs?.[0].value\n );\n\n const onSelectTab = (item: SelectableValue<string>) => {\n setActiveTab(item.value!);\n };\n\n const { tabs, onClose, closeIconTooltip } = props;\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <div className={styles.container}>\n <TabsBar className={styles.tabs}>\n {tabs.map((t) => (\n <Tab\n key={t.value}\n label={t.label}\n active={t.value === activeTab}\n onChangeTab={() => onSelectTab(t)}\n icon={t.icon}\n />\n ))}\n <IconButton className={styles.close} onClick={onClose} name=\"times\" title={closeIconTooltip ?? 'Close'} />\n </TabsBar>\n <CustomScrollbar autoHeightMin=\"100%\">\n <TabContent className={styles.tabContent}>{tabs.find((t) => t.value === activeTab)?.content}</TabContent>\n </CustomScrollbar>\n </div>\n );\n}\n","import { css, cx, keyframes } from '@emotion/css';\nimport { BasePlacement } from '@popperjs/core';\nimport React, { useState } from 'react';\nimport { usePopper } from 'react-popper';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\nimport { Portal } from '../Portal/Portal';\n\nexport interface InlineToastProps {\n children: React.ReactNode;\n suffixIcon?: IconName;\n referenceElement: HTMLElement | null;\n placement: BasePlacement;\n}\n\nexport function InlineToast({ referenceElement, children, suffixIcon, placement }: InlineToastProps) {\n const [indicatorElement, setIndicatorElement] = useState<HTMLElement | null>(null);\n const popper = usePopper(referenceElement, indicatorElement, { placement });\n const styles = useStyles2(getStyles);\n const placementStyles = useStyles2(getPlacementStyles);\n\n return (\n <Portal>\n <div\n style={{ display: 'inline-block', ...popper.styles.popper }}\n {...popper.attributes.popper}\n ref={setIndicatorElement}\n >\n <span className={cx(styles.root, placementStyles[placement])}>\n {children && <span>{children}</span>}\n {suffixIcon && <Icon name={suffixIcon} />}\n </span>\n </div>\n </Portal>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n root: css({\n ...theme.typography.bodySmall,\n willChange: 'transform',\n background: theme.components.tooltip.background,\n color: theme.components.tooltip.text,\n padding: theme.spacing(0.5, 1.5), // get's an extra .5 of vertical padding to account for the rounded corners\n borderRadius: 100, // just a sufficiently large value to ensure ends are completely rounded\n display: 'inline-flex',\n gap: theme.spacing(0.5),\n alignItems: 'center',\n }),\n };\n};\n\nconst createAnimation = (fromX: string | number, fromY: string | number) =>\n keyframes({\n from: {\n opacity: 0,\n transform: `translate(${fromX}, ${fromY})`,\n },\n\n to: {\n opacity: 1,\n transform: 'translate(0, 0px)',\n },\n });\n\nconst getPlacementStyles = (theme: GrafanaTheme2): Record<InlineToastProps['placement'], string> => {\n const gap = 1;\n\n const placementTopAnimation = createAnimation(0, theme.spacing(gap));\n const placementBottomAnimation = createAnimation(0, theme.spacing(gap * -1));\n const placementLeftAnimation = createAnimation(theme.spacing(gap), 0);\n const placementRightAnimation = createAnimation(theme.spacing(gap * -1), 0);\n\n return {\n top: css({\n marginBottom: theme.spacing(gap),\n animation: `${placementTopAnimation} ease-out 100ms`,\n }),\n bottom: css({\n marginTop: theme.spacing(gap),\n animation: `${placementBottomAnimation} ease-out 100ms`,\n }),\n left: css({\n marginRight: theme.spacing(gap),\n animation: `${placementLeftAnimation} ease-out 100ms`,\n }),\n right: css({\n marginLeft: theme.spacing(gap),\n animation: `${placementRightAnimation} ease-out 100ms`,\n }),\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useCallback, useRef, useState, useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { Button, ButtonProps } from '../Button';\nimport { Icon } from '../Icon/Icon';\nimport { InlineToast } from '../InlineToast/InlineToast';\n\nexport interface Props extends ButtonProps {\n /** A function that returns text to be copied */\n getText(): string;\n /** Callback when the text has been successfully copied */\n onClipboardCopy?(copiedText: string): void;\n /** Callback when there was an error copying the text */\n onClipboardError?(copiedText: string, error: unknown): void;\n}\n\nconst SHOW_SUCCESS_DURATION = 2 * 1000;\n\nexport function ClipboardButton({\n onClipboardCopy,\n onClipboardError,\n children,\n getText,\n icon,\n variant,\n ...buttonProps\n}: Props) {\n const styles = useStyles2(getStyles);\n const [showCopySuccess, setShowCopySuccess] = useState(false);\n\n useEffect(() => {\n let timeoutId: NodeJS.Timeout;\n\n if (showCopySuccess) {\n timeoutId = setTimeout(() => {\n setShowCopySuccess(false);\n }, SHOW_SUCCESS_DURATION);\n }\n\n return () => {\n window.clearTimeout(timeoutId);\n };\n }, [showCopySuccess]);\n\n const buttonRef = useRef<null | HTMLButtonElement>(null);\n const copyTextCallback = useCallback(async () => {\n const textToCopy = getText();\n\n try {\n await copyText(textToCopy, buttonRef);\n setShowCopySuccess(true);\n onClipboardCopy?.(textToCopy);\n } catch (e) {\n onClipboardError?.(textToCopy, e);\n }\n }, [getText, onClipboardCopy, onClipboardError]);\n\n return (\n <>\n {showCopySuccess && (\n <InlineToast placement=\"top\" referenceElement={buttonRef.current}>\n Copied\n </InlineToast>\n )}\n\n <Button\n onClick={copyTextCallback}\n icon={icon}\n variant={showCopySuccess ? 'success' : variant}\n aria-label={showCopySuccess ? 'Copied' : undefined}\n {...buttonProps}\n className={cx(styles.button, showCopySuccess && styles.successButton)}\n ref={buttonRef}\n >\n {children}\n\n {showCopySuccess && (\n <div className={styles.successOverlay}>\n <Icon name=\"check\" />\n </div>\n )}\n </Button>\n </>\n );\n}\n\nconst copyText = async (text: string, buttonRef: React.MutableRefObject<HTMLButtonElement | null>) => {\n if (navigator.clipboard && window.isSecureContext) {\n return navigator.clipboard.writeText(text);\n } else {\n // Use a fallback method for browsers/contexts that don't support the Clipboard API.\n // See https://web.dev/async-clipboard/#feature-detection.\n const input = document.createElement('input');\n // Normally we'd append this to the body. However if we're inside a focus manager\n // from react-aria, we can't focus anything outside of the managed area.\n // Instead, let's append it to the button. Then we're guaranteed to be able to focus + copy.\n buttonRef.current?.appendChild(input);\n input.value = text;\n input.focus();\n input.select();\n document.execCommand('copy');\n input.remove();\n }\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n button: css({\n position: 'relative',\n }),\n successButton: css({\n '> *': css({\n visibility: 'hidden',\n }),\n }),\n successOverlay: css({\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n visibility: 'visible', // re-visible the overlay\n }),\n };\n};\n","import { SingleValueType, BaseOptionType as RCCascaderOption } from 'rc-cascader/lib/Cascader';\n\nimport { CascaderOption } from './Cascader';\n\ntype onChangeType = ((values: string[], options: CascaderOption[]) => void) | undefined;\n\nexport const onChangeCascader = (onChanged: onChangeType) => (values: SingleValueType, options: RCCascaderOption[]) => {\n if (onChanged) {\n // map values to strings for backwards compatibility with Cascader components\n onChanged(\n values.map((value) => String(value)),\n fromRCOptions(options)\n );\n }\n};\n\ntype onLoadDataType = ((options: CascaderOption[]) => void) | undefined;\n\nexport const onLoadDataCascader = (onLoadData: onLoadDataType) => (options: RCCascaderOption[]) => {\n if (onLoadData) {\n onLoadData(fromRCOptions(options));\n }\n};\n\nconst fromRCOptions = (options: RCCascaderOption[]): CascaderOption[] => {\n return options.map(fromRCOption);\n};\n\nconst fromRCOption = (option: RCCascaderOption): CascaderOption => {\n return {\n value: option.value ?? '',\n label: option.label as unknown as string,\n };\n};\n","import { css } from '@emotion/css';\nimport memoizeOne from 'memoize-one';\nimport RCCascader from 'rc-cascader';\nimport React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { Icon } from '../Icon/Icon';\nimport { Input } from '../Input/Input';\nimport { Select } from '../Select/Select';\n\nimport { onChangeCascader } from './optionMappings';\n\nexport interface CascaderProps {\n /** The separator between levels in the search */\n separator?: string;\n placeholder?: string;\n options: CascaderOption[];\n /** Changes the value for every selection, including branch nodes. Defaults to true. */\n changeOnSelect?: boolean;\n onSelect(val: string): void;\n /** Sets the width to a multiple of 8px. Should only be used with inline forms. Setting width of the container is preferred in other cases.*/\n width?: number;\n initialValue?: string;\n allowCustomValue?: boolean;\n /** A function for formatting the message for custom value creation. Only applies when allowCustomValue is set to true*/\n formatCreateLabel?: (val: string) => string;\n /** If true all levels are shown in the input by simple concatenating the labels */\n displayAllSelectedLevels?: boolean;\n onBlur?: () => void;\n /** When mounted focus automatically on the input */\n autoFocus?: boolean;\n /** Keep the dropdown open all the time, useful in case whole cascader visibility is controlled by the parent */\n alwaysOpen?: boolean;\n /** Don't show what is selected in the cascader input/search. Useful when input is used just as search and the\n cascader is hidden after selection. */\n hideActiveLevelLabel?: boolean;\n}\n\ninterface CascaderState {\n isSearching: boolean;\n focusCascade: boolean;\n //Array for cascade navigation\n rcValue: SelectableValue<string[]>;\n activeLabel: string;\n}\n\nexport interface CascaderOption {\n /**\n * The value used under the hood\n */\n value: any;\n /**\n * The label to display in the UI\n */\n label: string;\n /** Items will be just flattened into the main list of items recursively. */\n items?: CascaderOption[];\n disabled?: boolean;\n /** Avoid using */\n title?: string;\n /** Children will be shown in a submenu. Use 'items' instead, as 'children' exist to ensure backwards compatibility.*/\n children?: CascaderOption[];\n}\n\nconst disableDivFocus = css(`\n&:focus{\n outline: none;\n}\n`);\n\nconst DEFAULT_SEPARATOR = '/';\n\nexport class Cascader extends React.PureComponent<CascaderProps, CascaderState> {\n constructor(props: CascaderProps) {\n super(props);\n const searchableOptions = this.getSearchableOptions(props.options);\n const { rcValue, activeLabel } = this.setInitialValue(searchableOptions, props.initialValue);\n this.state = {\n isSearching: false,\n focusCascade: false,\n rcValue,\n activeLabel,\n };\n }\n\n static defaultProps = { changeOnSelect: true };\n\n flattenOptions = (options: CascaderOption[], optionPath: CascaderOption[] = []) => {\n let selectOptions: Array<SelectableValue<string[]>> = [];\n for (const option of options) {\n const cpy = [...optionPath];\n cpy.push(option);\n if (!option.items) {\n selectOptions.push({\n singleLabel: cpy[cpy.length - 1].label,\n label: cpy.map((o) => o.label).join(this.props.separator || ` ${DEFAULT_SEPARATOR} `),\n value: cpy.map((o) => o.value),\n });\n } else {\n selectOptions = [...selectOptions, ...this.flattenOptions(option.items, cpy)];\n }\n }\n return selectOptions;\n };\n\n getSearchableOptions = memoizeOne((options: CascaderOption[]) => this.flattenOptions(options));\n\n setInitialValue(searchableOptions: Array<SelectableValue<string[]>>, initValue?: string) {\n if (!initValue) {\n return { rcValue: [], activeLabel: '' };\n }\n for (const option of searchableOptions) {\n const optionPath = option.value || [];\n\n if (optionPath.indexOf(initValue) === optionPath.length - 1) {\n return {\n rcValue: optionPath,\n activeLabel: this.props.displayAllSelectedLevels ? option.label : option.singleLabel || '',\n };\n }\n }\n if (this.props.allowCustomValue) {\n return { rcValue: [], activeLabel: initValue };\n }\n return { rcValue: [], activeLabel: '' };\n }\n\n //For rc-cascader\n onChange = (value: string[], selectedOptions: CascaderOption[]) => {\n const activeLabel = this.props.hideActiveLevelLabel\n ? ''\n : this.props.displayAllSelectedLevels\n ? selectedOptions.map((option) => option.label).join(this.props.separator || DEFAULT_SEPARATOR)\n : selectedOptions[selectedOptions.length - 1].label;\n this.setState({\n rcValue: value,\n focusCascade: true,\n activeLabel,\n });\n\n this.props.onSelect(selectedOptions[selectedOptions.length - 1].value);\n };\n\n //For select\n onSelect = (obj: SelectableValue<string[]>) => {\n const valueArray = obj.value || [];\n this.setState({\n activeLabel: this.props.displayAllSelectedLevels ? obj.label : obj.singleLabel || '',\n rcValue: valueArray,\n isSearching: false,\n });\n this.props.onSelect(valueArray[valueArray.length - 1]);\n };\n\n onCreateOption = (value: string) => {\n this.setState({\n activeLabel: value,\n rcValue: [],\n isSearching: false,\n });\n this.props.onSelect(value);\n };\n\n onBlur = () => {\n this.setState({\n isSearching: false,\n focusCascade: false,\n });\n\n if (this.state.activeLabel === '') {\n this.setState({\n rcValue: [],\n });\n }\n this.props.onBlur?.();\n };\n\n onBlurCascade = () => {\n this.setState({\n focusCascade: false,\n });\n\n this.props.onBlur?.();\n };\n\n onInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (['ArrowDown', 'ArrowUp', 'Enter', 'ArrowLeft', 'ArrowRight', 'Backspace'].includes(e.key)) {\n return;\n }\n this.setState({\n focusCascade: false,\n isSearching: true,\n });\n };\n\n onSelectInputChange = (value: string) => {\n if (value === '') {\n this.setState({\n isSearching: false,\n });\n }\n };\n\n render() {\n const { allowCustomValue, formatCreateLabel, placeholder, width, changeOnSelect, options } = this.props;\n const { focusCascade, isSearching, rcValue, activeLabel } = this.state;\n\n const searchableOptions = this.getSearchableOptions(options);\n\n return (\n <div>\n {isSearching ? (\n <Select\n allowCustomValue={allowCustomValue}\n placeholder={placeholder}\n autoFocus={!focusCascade}\n onChange={this.onSelect}\n onBlur={this.onBlur}\n options={searchableOptions}\n onCreateOption={this.onCreateOption}\n formatCreateLabel={formatCreateLabel}\n width={width}\n onInputChange={this.onSelectInputChange}\n />\n ) : (\n <RCCascader\n onChange={onChangeCascader(this.onChange)}\n options={options}\n changeOnSelect={changeOnSelect}\n value={rcValue.value}\n fieldNames={{ label: 'label', value: 'value', children: 'items' }}\n expandIcon={null}\n open={this.props.alwaysOpen}\n >\n <div className={disableDivFocus}>\n <Input\n autoFocus={this.props.autoFocus}\n width={width}\n placeholder={placeholder}\n onBlur={this.onBlurCascade}\n value={activeLabel}\n onKeyDown={this.onInputKeyDown}\n onChange={() => {}}\n suffix={\n focusCascade ? (\n <Icon name=\"angle-up\" />\n ) : (\n <Icon name=\"angle-down\" style={{ marginBottom: 0, marginLeft: '4px' }} />\n )\n }\n />\n </div>\n </RCCascader>\n )}\n </div>\n );\n }\n}\n","import { css } from '@emotion/css';\nimport RCCascader from 'rc-cascader';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { Button, ButtonProps } from '../Button';\nimport { CascaderOption } from '../Cascader/Cascader';\nimport { onChangeCascader, onLoadDataCascader } from '../Cascader/optionMappings';\nimport { Icon } from '../Icon/Icon';\n\nexport interface ButtonCascaderProps {\n options: CascaderOption[];\n children?: string;\n icon?: IconName;\n disabled?: boolean;\n value?: string[];\n fieldNames?: { label: string; value: string; children: string };\n loadData?: (selectedOptions: CascaderOption[]) => void;\n onChange?: (value: string[], selectedOptions: CascaderOption[]) => void;\n onPopupVisibleChange?: (visible: boolean) => void;\n className?: string;\n variant?: ButtonProps['variant'];\n buttonProps?: ButtonProps;\n hideDownIcon?: boolean;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n popup: css`\n label: popup;\n z-index: ${theme.zIndex.dropdown};\n `,\n icons: {\n right: css`\n margin: 1px 0 0 4px;\n `,\n left: css`\n margin: -1px 4px 0 0;\n `,\n },\n };\n});\n\nexport const ButtonCascader: React.FC<ButtonCascaderProps> = (props) => {\n const { onChange, className, loadData, icon, buttonProps, hideDownIcon, variant, disabled, ...rest } = props;\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n // Weird way to do this bit it goes around a styling issue in Button where even null/undefined child triggers\n // styling change which messes up the look if there is only single icon content.\n let content: any = props.children;\n if (!hideDownIcon) {\n content = [props.children, <Icon key={'down-icon'} name=\"angle-down\" className={styles.icons.right} />];\n }\n\n return (\n <RCCascader\n onChange={onChangeCascader(onChange)}\n loadData={onLoadDataCascader(loadData)}\n dropdownClassName={styles.popup}\n {...rest}\n expandIcon={null}\n >\n <Button icon={icon} disabled={disabled} variant={variant} {...(buttonProps ?? {})}>\n {content}\n </Button>\n </RCCascader>\n );\n};\n\nButtonCascader.displayName = 'ButtonCascader';\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes, SFC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useStyles } from '../../themes';\nimport { Spinner } from '../Spinner/Spinner';\n\n/**\n * @public\n */\nexport interface LoadingPlaceholderProps extends HTMLAttributes<HTMLDivElement> {\n text: React.ReactNode;\n}\n\n/**\n * @public\n */\nexport const LoadingPlaceholder: SFC<LoadingPlaceholderProps> = ({ text, className, ...rest }) => {\n const styles = useStyles(getStyles);\n return (\n <div className={cx(styles.container, className)} {...rest}>\n {text} <Spinner inline={true} />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n return {\n container: css`\n margin-bottom: ${theme.spacing.xl};\n `,\n };\n};\n","export function reverseMap<T, Q>(arr: ArrayLike<T>, callbackfn: (value: T, index: number, array: ArrayLike<T>) => Q) {\n const reversedAndMapped = new Array<Q>(arr.length);\n for (let i = 0; i < arr.length; i++) {\n const reverseIndex = arr.length - 1 - i;\n reversedAndMapped[i] = callbackfn(arr[reverseIndex], reverseIndex, arr);\n }\n\n return reversedAndMapped;\n}\n","import { css } from '@emotion/css';\nimport { Property } from 'csstype';\nimport { upperFirst } from 'lodash';\nimport React, { FunctionComponent } from 'react';\n\nimport { GrafanaTheme2, ThemeVizHue } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { reverseMap } from '../../utils/reverseMap';\n\nimport { ColorSwatch, ColorSwatchVariant } from './ColorSwatch';\n\ninterface NamedColorsGroupProps {\n hue: ThemeVizHue;\n selectedColor?: Property.Color;\n onColorSelect: (colorName: string) => void;\n key?: string;\n}\n\nconst NamedColorsGroup: FunctionComponent<NamedColorsGroupProps> = ({\n hue,\n selectedColor,\n onColorSelect,\n ...otherProps\n}) => {\n const label = upperFirst(hue.name);\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.colorRow}>\n <div className={styles.colorLabel}>{label}</div>\n <div {...otherProps} className={styles.swatchRow}>\n {reverseMap(hue.shades, (shade) => (\n <ColorSwatch\n key={shade.name}\n aria-label={shade.name}\n variant={shade.primary ? ColorSwatchVariant.Large : ColorSwatchVariant.Small}\n isSelected={shade.name === selectedColor}\n color={shade.color}\n onClick={() => onColorSelect(shade.name)}\n />\n ))}\n </div>\n </div>\n );\n};\n\nexport default NamedColorsGroup;\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n colorRow: css`\n display: grid;\n grid-template-columns: 25% 1fr;\n grid-column-gap: ${theme.spacing(2)};\n padding: ${theme.spacing(0.5, 0)};\n\n &:hover {\n background: ${theme.colors.background.secondary};\n }\n `,\n colorLabel: css`\n padding-left: ${theme.spacing(2)};\n display: flex;\n align-items: center;\n `,\n swatchRow: css`\n display: flex;\n gap: ${theme.spacing(1)};\n align-items: center;\n justify-content: space-around;\n flex-direction: row;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2, useTheme2 } from '../../themes/ThemeContext';\n\nimport { ColorSwatch } from './ColorSwatch';\nimport NamedColorsGroup from './NamedColorsGroup';\n\nexport interface NamedColorsPaletteProps {\n color?: string;\n onChange: (colorName: string) => void;\n}\n\nexport const NamedColorsPalette = ({ color, onChange }: NamedColorsPaletteProps) => {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n\n const swatches: JSX.Element[] = [];\n for (const hue of theme.visualization.hues) {\n swatches.push(<NamedColorsGroup key={hue.name} selectedColor={color} hue={hue} onColorSelect={onChange} />);\n }\n\n return (\n <>\n <div className={styles.swatches}>{swatches}</div>\n <div className={styles.extraColors}>\n <ColorSwatch\n isSelected={color === 'transparent'}\n color={'rgba(0,0,0,0)'}\n label=\"Transparent\"\n onClick={() => onChange('transparent')}\n />\n <ColorSwatch\n isSelected={color === 'text'}\n color={theme.colors.text.primary}\n label=\"Text color\"\n onClick={() => onChange('text')}\n />\n </div>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n display: flex;\n flex-direction: column;\n `,\n extraColors: css`\n display: flex;\n align-items: center;\n justify-content: space-around;\n gap: ${theme.spacing(1)};\n padding: ${theme.spacing(1, 0)};\n `,\n swatches: css`\n display: grid;\n flex-grow: 1;\n `,\n };\n};\n","import { cx, css } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport React, { forwardRef, useState, useEffect, useMemo } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { Input, Props as InputProps } from '../Input/Input';\n\nimport { ColorPickerProps } from './ColorPickerPopover';\n\ninterface ColorInputProps extends ColorPickerProps, Omit<InputProps, 'color' | 'onChange'> {\n isClearable?: boolean;\n}\n\nconst ColorInput = forwardRef<HTMLInputElement, ColorInputProps>(\n ({ color, onChange, isClearable = false, ...inputProps }, ref) => {\n const [value, setValue] = useState(color);\n const [previousColor, setPreviousColor] = useState(color);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const updateColor = useMemo(() => debounce(onChange, 100), []);\n\n useEffect(() => {\n const newColor = tinycolor(color);\n if (newColor.isValid() && color !== previousColor) {\n setValue(newColor.toString());\n setPreviousColor(color);\n }\n }, [color, previousColor]);\n\n const onChangeColor = (event: React.SyntheticEvent<HTMLInputElement>) => {\n const { value: colorValue } = event.currentTarget;\n\n setValue(colorValue);\n if (colorValue === '' && isClearable) {\n updateColor(colorValue);\n return;\n }\n const newColor = tinycolor(colorValue);\n\n if (newColor.isValid()) {\n updateColor(newColor.toString());\n }\n };\n\n const onBlur = () => {\n const newColor = tinycolor(value);\n\n if (!newColor.isValid()) {\n setValue(color);\n }\n };\n\n return (\n <Input\n {...inputProps}\n value={value}\n onChange={onChangeColor}\n onBlur={onBlur}\n addonBefore={<ColorPreview color={color} />}\n ref={ref}\n />\n );\n }\n);\n\nColorInput.displayName = 'ColorInput';\n\nexport default ColorInput;\n\ninterface ColorPreviewProps {\n color: string;\n}\n\nconst ColorPreview = ({ color }: ColorPreviewProps) => {\n const styles = useStyles2(getColorPreviewStyles);\n\n return (\n <div\n className={cx(\n styles,\n css`\n background-color: ${color};\n `\n )}\n />\n );\n};\n\nconst getColorPreviewStyles = (theme: GrafanaTheme2) => css`\n height: 100%;\n width: ${theme.spacing.gridSize * 4}px;\n border-radius: ${theme.shape.borderRadius()} 0 0 ${theme.shape.borderRadius()};\n border: 1px solid ${theme.colors.border.medium};\n`;\n","import { css } from '@emotion/css';\nimport React, { useMemo, useState } from 'react';\nimport { RgbaStringColorPicker } from 'react-colorful';\nimport { useThrottleFn } from 'react-use';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2, colorManipulator } from '@grafana/data';\n\nimport { useStyles2, useTheme2 } from '../../themes';\n\nimport ColorInput from './ColorInput';\n\nexport interface SpectrumPaletteProps {\n color: string;\n onChange: (color: string) => void;\n}\n\nconst SpectrumPalette: React.FunctionComponent<SpectrumPaletteProps> = ({ color, onChange }) => {\n const [currentColor, setColor] = useState(color);\n\n useThrottleFn(\n (c) => {\n onChange(colorManipulator.asHexString(theme.visualization.getColorByName(c)));\n },\n 500,\n [currentColor]\n );\n\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n\n const rgbaString = useMemo(() => {\n return currentColor.startsWith('rgba')\n ? currentColor\n : tinycolor(theme.visualization.getColorByName(color)).toRgbString();\n }, [currentColor, theme, color]);\n\n return (\n <div className={styles.wrapper}>\n <RgbaStringColorPicker className={styles.root} color={rgbaString} onChange={setColor} />\n <ColorInput theme={theme} color={rgbaString} onChange={setColor} className={styles.colorInput} />\n </div>\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n flex-grow: 1;\n `,\n root: css`\n &.react-colorful {\n width: auto;\n }\n\n .react-colorful {\n &__saturation {\n border-radius: ${theme.v1.border.radius.sm} ${theme.v1.border.radius.sm} 0 0;\n }\n &__alpha {\n border-radius: 0 0 ${theme.v1.border.radius.sm} ${theme.v1.border.radius.sm};\n }\n &__alpha,\n &__hue {\n height: ${theme.spacing(2)};\n position: relative;\n }\n &__pointer {\n height: ${theme.spacing(2)};\n width: ${theme.spacing(2)};\n }\n }\n `,\n colorInput: css`\n margin-top: ${theme.spacing(2)};\n `,\n});\n\nexport default SpectrumPalette;\n","import { css } from '@emotion/css';\nimport { FocusScope } from '@react-aria/focus';\nimport React from 'react';\n\nimport { GrafanaTheme2, colorManipulator } from '@grafana/data';\n\nimport { stylesFactory, withTheme2 } from '../../themes';\nimport { Themeable2 } from '../../types/theme';\nimport { PopoverContentProps } from '../Tooltip';\n\nimport { NamedColorsPalette } from './NamedColorsPalette';\nimport SpectrumPalette from './SpectrumPalette';\n\nexport type ColorPickerChangeHandler = (color: string) => void;\n\nexport interface ColorPickerProps extends Themeable2 {\n color: string;\n onChange: ColorPickerChangeHandler;\n\n enableNamedColors?: boolean;\n}\n\nexport interface Props<T> extends ColorPickerProps, PopoverContentProps {\n customPickers?: T;\n}\n\ntype PickerType = 'palette' | 'spectrum';\n\nexport interface CustomPickersDescriptor {\n [key: string]: {\n tabComponent: React.ComponentType<ColorPickerProps>;\n name: string;\n };\n}\n\ninterface State<T> {\n activePicker: PickerType | keyof T;\n}\n\nclass UnThemedColorPickerPopover<T extends CustomPickersDescriptor> extends React.Component<Props<T>, State<T>> {\n constructor(props: Props<T>) {\n super(props);\n this.state = {\n activePicker: 'palette',\n };\n }\n\n getTabClassName = (tabName: PickerType | keyof T) => {\n const { activePicker } = this.state;\n return `ColorPickerPopover__tab ${activePicker === tabName && 'ColorPickerPopover__tab--active'}`;\n };\n\n handleChange = (color: any) => {\n const { onChange, enableNamedColors, theme } = this.props;\n if (enableNamedColors) {\n return onChange(color);\n }\n onChange(colorManipulator.asHexString(theme.visualization.getColorByName(color)));\n };\n\n onTabChange = (tab: PickerType | keyof T) => {\n return () => this.setState({ activePicker: tab });\n };\n\n renderPicker = () => {\n const { activePicker } = this.state;\n const { color } = this.props;\n\n switch (activePicker) {\n case 'spectrum':\n return <SpectrumPalette color={color} onChange={this.handleChange} />;\n case 'palette':\n return <NamedColorsPalette color={color} onChange={this.handleChange} />;\n default:\n return this.renderCustomPicker(activePicker);\n }\n };\n\n renderCustomPicker = (tabKey: keyof T) => {\n const { customPickers, color, theme } = this.props;\n if (!customPickers) {\n return null;\n }\n\n return React.createElement(customPickers[tabKey].tabComponent, {\n color,\n theme,\n onChange: this.handleChange,\n });\n };\n\n renderCustomPickerTabs = () => {\n const { customPickers } = this.props;\n\n if (!customPickers) {\n return null;\n }\n\n return (\n <>\n {Object.keys(customPickers).map((key) => {\n return (\n <button className={this.getTabClassName(key)} onClick={this.onTabChange(key)} key={key}>\n {customPickers[key].name}\n </button>\n );\n })}\n </>\n );\n };\n\n render() {\n const { theme } = this.props;\n const styles = getStyles(theme);\n return (\n <FocusScope contain restoreFocus autoFocus>\n {/*\n tabIndex=-1 is needed here to support highlighting text within the picker when using FocusScope\n see https://github.com/adobe/react-spectrum/issues/1604#issuecomment-781574668\n */}\n <div tabIndex={-1} className={styles.colorPickerPopover}>\n <div className={styles.colorPickerPopoverTabs}>\n <button className={this.getTabClassName('palette')} onClick={this.onTabChange('palette')}>\n Colors\n </button>\n <button className={this.getTabClassName('spectrum')} onClick={this.onTabChange('spectrum')}>\n Custom\n </button>\n {this.renderCustomPickerTabs()}\n </div>\n <div className={styles.colorPickerPopoverContent}>{this.renderPicker()}</div>\n </div>\n </FocusScope>\n );\n }\n}\n\nexport const ColorPickerPopover = withTheme2(UnThemedColorPickerPopover);\nColorPickerPopover.displayName = 'ColorPickerPopover';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n colorPickerPopover: css`\n border-radius: ${theme.shape.borderRadius()};\n box-shadow: ${theme.shadows.z3};\n background: ${theme.colors.background.primary};\n border: 1px solid ${theme.colors.border.medium};\n\n .ColorPickerPopover__tab {\n width: 50%;\n text-align: center;\n padding: ${theme.spacing(1, 0)};\n background: ${theme.colors.background.secondary};\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.bodySmall.fontSize};\n cursor: pointer;\n border: none;\n\n &:focus:not(:focus-visible) {\n outline: none;\n box-shadow: none;\n }\n\n :focus-visible {\n position: relative;\n }\n }\n\n .ColorPickerPopover__tab--active {\n color: ${theme.colors.text.primary};\n font-weight: ${theme.typography.fontWeightMedium};\n background: ${theme.colors.background.primary};\n }\n `,\n colorPickerPopoverContent: css`\n width: 246px;\n font-size: ${theme.typography.bodySmall.fontSize};\n min-height: 184px;\n padding: ${theme.spacing(1)};\n display: flex;\n flex-direction: column;\n `,\n colorPickerPopoverTabs: css`\n display: flex;\n width: 100%;\n border-radius: ${theme.shape.borderRadius()} ${theme.shape.borderRadius()} 0 0;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { FunctionComponent } from 'react';\n\nimport { withTheme2, useStyles } from '../../themes';\nimport { Button } from '../Button';\nimport { Switch } from '../Forms/Legacy/Switch/Switch';\nimport { PopoverContentProps } from '../Tooltip';\n\nimport { ColorPickerPopover, ColorPickerProps } from './ColorPickerPopover';\n\nexport interface SeriesColorPickerPopoverProps extends ColorPickerProps, PopoverContentProps {\n yaxis?: number;\n onToggleAxis?: () => void;\n}\n\nexport const SeriesColorPickerPopover: FunctionComponent<SeriesColorPickerPopoverProps> = (props) => {\n const styles = useStyles(getStyles);\n const { yaxis, onToggleAxis, color, ...colorPickerProps } = props;\n\n const customPickers = onToggleAxis\n ? {\n yaxis: {\n name: 'Y-Axis',\n tabComponent() {\n return (\n <Switch\n key=\"yaxisSwitch\"\n label=\"Use right y-axis\"\n className={styles.colorPickerAxisSwitch}\n labelClass={styles.colorPickerAxisSwitchLabel}\n checked={yaxis === 2}\n onChange={() => {\n if (onToggleAxis) {\n onToggleAxis();\n }\n }}\n />\n );\n },\n },\n }\n : undefined;\n return <ColorPickerPopover {...colorPickerProps} color={color || '#000000'} customPickers={customPickers} />;\n};\n\ninterface AxisSelectorProps {\n yaxis: number;\n onToggleAxis?: () => void;\n}\n\ninterface AxisSelectorState {\n yaxis: number;\n}\n\nexport class AxisSelector extends React.PureComponent<AxisSelectorProps, AxisSelectorState> {\n constructor(props: AxisSelectorProps) {\n super(props);\n this.state = {\n yaxis: this.props.yaxis,\n };\n this.onToggleAxis = this.onToggleAxis.bind(this);\n }\n\n onToggleAxis() {\n this.setState({\n yaxis: this.state.yaxis === 2 ? 1 : 2,\n });\n\n if (this.props.onToggleAxis) {\n this.props.onToggleAxis();\n }\n }\n\n render() {\n const leftButtonVariant = this.state.yaxis === 1 ? 'primary' : 'secondary';\n const rightButtonVariant = this.state.yaxis === 2 ? 'primary' : 'secondary';\n\n return (\n <div className=\"p-b-1\">\n <label className=\"small p-r-1\">Y Axis:</label>\n <Button onClick={this.onToggleAxis} size=\"sm\" variant={leftButtonVariant}>\n Left\n </Button>\n <Button onClick={this.onToggleAxis} size=\"sm\" variant={rightButtonVariant}>\n Right\n </Button>\n </div>\n );\n }\n}\n\n// This component is to enable SeriesColorPickerPopover usage via series-color-picker-popover directive\nexport const SeriesColorPickerPopoverWithTheme = withTheme2(SeriesColorPickerPopover);\n\nconst getStyles = () => {\n return {\n colorPickerAxisSwitch: css`\n width: 100%;\n `,\n colorPickerAxisSwitchLabel: css`\n display: flex;\n flex-grow: 1;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { Component, createRef } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { withTheme2, stylesFactory } from '../../themes';\nimport { closePopover } from '../../utils/closePopover';\nimport { Popover } from '../Tooltip/Popover';\nimport { PopoverController } from '../Tooltip/PopoverController';\n\nimport { ColorPickerPopover, ColorPickerProps } from './ColorPickerPopover';\nimport { ColorSwatch } from './ColorSwatch';\nimport { SeriesColorPickerPopover } from './SeriesColorPickerPopover';\n\n/**\n * If you need custom trigger for the color picker you can do that with a render prop pattern and supply a function\n * as a child. You will get show/hide function which you can map to desired interaction (like onClick or onMouseLeave)\n * and a ref which needs to be passed to an HTMLElement for correct positioning. If you want to use class or functional\n * component as a custom trigger you will need to forward the reference to first HTMLElement child.\n */\ntype ColorPickerTriggerRenderer = (props: {\n // This should be a React.RefObject<HTMLElement> but due to how object refs are defined you cannot downcast from that\n // to a specific type like React.RefObject<HTMLDivElement> even though it would be fine in runtime.\n ref: React.RefObject<any>;\n showColorPicker: () => void;\n hideColorPicker: () => void;\n}) => React.ReactNode;\n\nexport const colorPickerFactory = <T extends ColorPickerProps>(\n popover: React.ComponentType<T>,\n displayName = 'ColorPicker'\n) => {\n return class ColorPicker extends Component<T & { children?: ColorPickerTriggerRenderer }, any> {\n static displayName = displayName;\n pickerTriggerRef = createRef<any>();\n\n render() {\n const { theme, children, onChange } = this.props;\n const styles = getStyles(theme);\n const popoverElement = React.createElement(popover, {\n ...{ ...this.props, children: null },\n onChange,\n });\n\n return (\n <PopoverController content={popoverElement} hideAfter={300}>\n {(showPopper, hidePopper, popperProps) => {\n return (\n <>\n {this.pickerTriggerRef.current && (\n <Popover\n {...popperProps}\n referenceElement={this.pickerTriggerRef.current}\n wrapperClassName={styles.colorPicker}\n onMouseLeave={hidePopper}\n onMouseEnter={showPopper}\n onKeyDown={(event) => closePopover(event, hidePopper)}\n />\n )}\n\n {children ? (\n // Children have a bit weird type due to intersection used in the definition so we need to cast here,\n // but the definition is correct and should not allow to pass a children that does not conform to\n // ColorPickerTriggerRenderer type.\n (children as ColorPickerTriggerRenderer)({\n ref: this.pickerTriggerRef,\n showColorPicker: showPopper,\n hideColorPicker: hidePopper,\n })\n ) : (\n <ColorSwatch\n ref={this.pickerTriggerRef}\n onClick={showPopper}\n onMouseLeave={hidePopper}\n color={theme.visualization.getColorByName(this.props.color || '#000000')}\n />\n )}\n </>\n );\n }}\n </PopoverController>\n );\n }\n };\n};\n\nexport const ColorPicker = withTheme2(colorPickerFactory(ColorPickerPopover, 'ColorPicker'));\nexport const SeriesColorPicker = withTheme2(colorPickerFactory(SeriesColorPickerPopover, 'SeriesColorPicker'));\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n colorPicker: css`\n position: absolute;\n z-index: ${theme.zIndex.tooltip};\n color: ${theme.colors.text.primary};\n max-width: 400px;\n font-size: ${theme.typography.size.sm};\n // !important because these styles are also provided to popper via .popper classes from Tooltip component\n // hope to get rid of those soon\n padding: 15px !important;\n & [data-placement^='top'] {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n & [data-placement^='bottom'] {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n & [data-placement^='left'] {\n padding-top: 0 !important;\n }\n & [data-placement^='right'] {\n padding-top: 0 !important;\n }\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React, { useState, forwardRef } from 'react';\nimport { RgbaStringColorPicker } from 'react-colorful';\nimport { useThrottleFn } from 'react-use';\n\nimport { colorManipulator, GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { Props as InputProps } from '../Input/Input';\n\nimport ColorInput from './ColorInput';\nimport { getStyles as getPaletteStyles } from './SpectrumPalette';\n\nexport interface ColorPickerInputProps extends Omit<InputProps, 'value' | 'onChange'> {\n value?: string;\n onChange: (color: string) => void;\n /** Format for returning the color in onChange callback, defaults to 'rgb' */\n returnColorAs?: 'rgb' | 'hex';\n}\n\nexport const ColorPickerInput = forwardRef<HTMLInputElement, ColorPickerInputProps>(\n ({ value = '', onChange, returnColorAs = 'rgb', ...inputProps }, ref) => {\n const [currentColor, setColor] = useState(value);\n const [isOpen, setIsOpen] = useState(false);\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n const paletteStyles = useStyles2(getPaletteStyles);\n\n useThrottleFn(\n (c) => {\n if (c === value) {\n return;\n }\n // Default to an empty string if no color value is available\n if (!c) {\n onChange('');\n return;\n }\n const color = theme.visualization.getColorByName(c);\n if (returnColorAs === 'rgb') {\n onChange(colorManipulator.asRgbString(color));\n } else {\n onChange(colorManipulator.asHexString(color));\n }\n },\n 500,\n [currentColor]\n );\n\n return (\n <ClickOutsideWrapper onClick={() => setIsOpen(false)}>\n <div className={styles.wrapper}>\n {isOpen && (\n <RgbaStringColorPicker\n data-testid={'color-popover'}\n color={currentColor}\n onChange={setColor}\n className={cx(paletteStyles.root, styles.picker)}\n />\n )}\n <div onClick={() => setIsOpen(true)}>\n <ColorInput {...inputProps} theme={theme} color={currentColor} onChange={setColor} ref={ref} isClearable />\n </div>\n </div>\n </ClickOutsideWrapper>\n );\n }\n);\n\nColorPickerInput.displayName = 'ColorPickerInput';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n position: relative;\n `,\n picker: css`\n &.react-colorful {\n position: absolute;\n width: 100%;\n z-index: 11;\n bottom: 36px;\n }\n `,\n inner: css`\n position: absolute;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\nexport interface Props {\n children: JSX.Element | string;\n}\n\nconst EmptySearchResult: FC<Props> = ({ children }) => {\n const styles = useStyles2(getStyles);\n return <div className={styles.container}>{children}</div>;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n border-left: 3px solid ${theme.colors.info.main};\n background-color: ${theme.colors.background.secondary};\n padding: ${theme.spacing(2)};\n min-width: 350px;\n border-radius: ${theme.shape.borderRadius(2)};\n margin-bottom: ${theme.spacing(4)};\n `,\n };\n};\nexport { EmptySearchResult };\n","import React, { PureComponent } from 'react';\n\nimport { getValueFormats, SelectableValue } from '@grafana/data';\n\nimport { Cascader, CascaderOption } from '../Cascader/Cascader';\n\ninterface Props {\n onChange: (item?: string) => void;\n value?: string;\n width?: number;\n}\n\nfunction formatCreateLabel(input: string) {\n return `Custom unit: ${input}`;\n}\n\nexport class UnitPicker extends PureComponent<Props> {\n onChange = (value: SelectableValue<string>) => {\n this.props.onChange(value.value);\n };\n\n render() {\n const { value, width } = this.props;\n\n // Set the current selection\n let current: SelectableValue<string> | undefined = undefined;\n\n // All units\n const unitGroups = getValueFormats();\n\n // Need to transform the data structure to work well with Select\n const groupOptions = unitGroups.map((group) => {\n const options = group.submenu.map((unit) => {\n const sel = {\n label: unit.text,\n value: unit.value,\n };\n if (unit.value === value) {\n current = sel;\n }\n return sel;\n });\n\n return {\n label: group.text,\n value: group.text,\n items: options,\n };\n });\n\n // Show the custom unit\n if (value && !current) {\n current = { value, label: value };\n }\n\n return (\n <Cascader\n width={width}\n initialValue={current && current.label}\n allowCustomValue\n changeOnSelect={false}\n formatCreateLabel={formatCreateLabel}\n options={groupOptions as CascaderOption[]}\n placeholder=\"Choose\"\n onSelect={this.props.onChange}\n />\n );\n }\n}\n","import { difference } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport { fieldReducers, SelectableValue } from '@grafana/data';\n\nimport { Select } from '../Select/Select';\n\nexport interface Props {\n placeholder?: string;\n onChange: (stats: string[]) => void;\n stats: string[];\n allowMultiple?: boolean;\n defaultStat?: string;\n className?: string;\n width?: number;\n menuPlacement?: 'auto' | 'bottom' | 'top';\n inputId?: string;\n}\n\nexport class StatsPicker extends PureComponent<Props> {\n static defaultProps: Partial<Props> = {\n allowMultiple: false,\n };\n\n componentDidMount() {\n this.checkInput();\n }\n\n componentDidUpdate(prevProps: Props) {\n this.checkInput();\n }\n\n checkInput = () => {\n const { stats, allowMultiple, defaultStat, onChange } = this.props;\n\n const current = fieldReducers.list(stats);\n if (current.length !== stats.length) {\n const found = current.map((v) => v.id);\n const notFound = difference(stats, found);\n console.warn('Unknown stats', notFound, stats);\n onChange(current.map((stat) => stat.id));\n }\n\n // Make sure there is only one\n if (!allowMultiple && stats.length > 1) {\n console.warn('Removing extra stat', stats);\n onChange([stats[0]]);\n }\n\n // Set the reducer from callback\n if (defaultStat && stats.length < 1) {\n onChange([defaultStat]);\n }\n };\n\n onSelectionChange = (item: SelectableValue<string>) => {\n const { onChange } = this.props;\n if (Array.isArray(item)) {\n onChange(item.map((v) => v.value));\n } else {\n onChange(item && item.value ? [item.value] : []);\n }\n };\n\n render() {\n const { stats, allowMultiple, defaultStat, placeholder, className, menuPlacement, width, inputId } = this.props;\n\n const select = fieldReducers.selectOptions(stats);\n return (\n <Select\n value={select.current}\n className={className}\n isClearable={!defaultStat}\n isMulti={allowMultiple}\n width={width}\n isSearchable={true}\n options={select.options}\n placeholder={placeholder}\n onChange={this.onSelectionChange}\n menuPlacement={menuPlacement}\n inputId={inputId}\n />\n );\n }\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\nexport function MenuDivider() {\n const styles = useStyles2(getStyles);\n return <div className={styles.divider} />;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n divider: css({\n height: 1,\n backgroundColor: theme.colors.border.weak,\n margin: theme.spacing(0.5, 0),\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\nimport { MenuItemProps } from './MenuItem';\n\n/** @internal */\nexport interface MenuItemsGroup<T = any> {\n /** Label for the menu items group */\n label?: string;\n /** Aria label for accessibility support */\n ariaLabel?: string;\n /** Items of the group */\n items: Array<MenuItemProps<T>>;\n}\n\n/** @internal */\nexport interface MenuGroupProps extends Partial<MenuItemsGroup> {\n /** special children prop to pass children elements */\n children: React.ReactNode;\n}\n\n/** @internal */\nexport const MenuGroup: React.FC<MenuGroupProps> = ({ label, ariaLabel, children }) => {\n const styles = useStyles2(getStyles);\n const labelID = `group-label-${uniqueId()}`;\n\n return (\n <div role=\"group\" aria-labelledby={!ariaLabel && label ? labelID : undefined} aria-label={ariaLabel}>\n {label && (\n <label id={labelID} className={styles.groupLabel} aria-hidden>\n {label}\n </label>\n )}\n {children}\n </div>\n );\n};\nMenuGroup.displayName = 'MenuGroup';\n\n/** @internal */\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n groupLabel: css`\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.size.sm};\n padding: ${theme.spacing(0.5, 1)};\n `,\n };\n};\n","import { RefObject, useEffect, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { MenuItemElement } from './MenuItem';\n\nconst modulo = (a: number, n: number) => ((a % n) + n) % n;\nconst UNFOCUSED = -1;\n\n/** @internal */\nexport interface UseMenuFocusProps {\n localRef: RefObject<HTMLDivElement>;\n isMenuOpen?: boolean;\n openedWithArrow?: boolean;\n setOpenedWithArrow?: (openedWithArrow: boolean) => void;\n close?: () => void;\n onOpen?: (focusOnItem: (itemId: number) => void) => void;\n onClose?: () => void;\n onKeyDown?: React.KeyboardEventHandler;\n}\n\n/** @internal */\nexport type UseMenuFocusReturn = [(event: React.KeyboardEvent) => void, () => void];\n\n/** @internal */\nexport const useMenuFocus = ({\n localRef,\n isMenuOpen,\n openedWithArrow,\n setOpenedWithArrow,\n close,\n onOpen,\n onClose,\n onKeyDown,\n}: UseMenuFocusProps): UseMenuFocusReturn => {\n const [focusedItem, setFocusedItem] = useState(UNFOCUSED);\n\n useEffect(() => {\n if (isMenuOpen && openedWithArrow) {\n setFocusedItem(0);\n setOpenedWithArrow?.(false);\n }\n }, [isMenuOpen, openedWithArrow, setOpenedWithArrow]);\n\n useEffect(() => {\n const menuItems = localRef?.current?.querySelectorAll(`[data-role=\"menuitem\"]`);\n (menuItems?.[focusedItem] as MenuItemElement)?.focus();\n menuItems?.forEach((menuItem, i) => {\n (menuItem as MenuItemElement).tabIndex = i === focusedItem ? 0 : -1;\n });\n }, [localRef, focusedItem]);\n\n useEffectOnce(() => {\n const firstMenuItem = localRef?.current?.querySelector(`[data-role=\"menuitem\"]`) as MenuItemElement | null;\n if (firstMenuItem) {\n firstMenuItem.tabIndex = 0;\n }\n onOpen?.(setFocusedItem);\n });\n\n const handleKeys = (event: React.KeyboardEvent) => {\n const menuItems = localRef?.current?.querySelectorAll(`[data-role=\"menuitem\"]`);\n const menuItemsCount = menuItems?.length ?? 0;\n\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n event.stopPropagation();\n setFocusedItem(modulo(focusedItem - 1, menuItemsCount));\n break;\n case 'ArrowDown':\n event.preventDefault();\n event.stopPropagation();\n setFocusedItem(modulo(focusedItem + 1, menuItemsCount));\n break;\n case 'ArrowLeft':\n event.preventDefault();\n event.stopPropagation();\n setFocusedItem(UNFOCUSED);\n close?.();\n break;\n case 'Home':\n event.preventDefault();\n event.stopPropagation();\n setFocusedItem(0);\n break;\n case 'End':\n event.preventDefault();\n event.stopPropagation();\n setFocusedItem(menuItemsCount - 1);\n break;\n case 'Enter':\n event.preventDefault();\n event.stopPropagation();\n (menuItems?.[focusedItem] as MenuItemElement)?.click();\n break;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n onClose?.();\n break;\n case 'Tab':\n onClose?.();\n break;\n default:\n break;\n }\n\n // Forward event to parent\n onKeyDown?.(event);\n };\n\n const handleFocus = () => {\n if (focusedItem === UNFOCUSED) {\n setFocusedItem(0);\n }\n };\n\n return [handleKeys, handleFocus];\n};\n","import { css } from '@emotion/css';\nimport React, { ReactElement, useRef } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2 } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\nimport { MenuItemProps } from './MenuItem';\nimport { useMenuFocus } from './hooks';\nimport { getPosition } from './utils';\n\n/** @internal */\nexport interface SubMenuProps {\n /** List of menu items of the subMenu */\n items?: Array<ReactElement<MenuItemProps>>;\n /** Open */\n isOpen: boolean;\n /** Marks whether subMenu was opened with arrow */\n openedWithArrow: boolean;\n /** Changes value of openedWithArrow */\n setOpenedWithArrow: (openedWithArrow: boolean) => void;\n /** Closes the subMenu */\n close: () => void;\n}\n\n/** @internal */\nexport const SubMenu: React.FC<SubMenuProps> = React.memo(\n ({ items, isOpen, openedWithArrow, setOpenedWithArrow, close }) => {\n const styles = useStyles2(getStyles);\n const localRef = useRef<HTMLDivElement>(null);\n const [handleKeys] = useMenuFocus({\n localRef,\n isMenuOpen: isOpen,\n openedWithArrow,\n setOpenedWithArrow,\n close,\n });\n\n return (\n <>\n <div className={styles.iconWrapper} aria-label={selectors.components.Menu.SubMenu.icon}>\n <Icon name=\"angle-right\" className={styles.icon} aria-hidden />\n </div>\n {isOpen && (\n <div\n ref={localRef}\n className={styles.subMenu(localRef.current)}\n aria-label={selectors.components.Menu.SubMenu.container}\n >\n <div className={styles.itemsWrapper} role=\"menu\" onKeyDown={handleKeys}>\n {items}\n </div>\n </div>\n )}\n </>\n );\n }\n);\n\nSubMenu.displayName = 'SubMenu';\n\n/** @internal */\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n iconWrapper: css`\n display: flex;\n flex: 1;\n justify-content: end;\n `,\n icon: css`\n opacity: 0.7;\n margin-left: ${theme.spacing(2)};\n color: ${theme.colors.text.secondary};\n `,\n itemsWrapper: css`\n background: ${theme.colors.background.primary};\n box-shadow: ${theme.shadows.z3};\n display: inline-block;\n border-radius: ${theme.shape.borderRadius()};\n `,\n subMenu: (element: HTMLElement | null) => css`\n position: absolute;\n top: 0;\n z-index: ${theme.zIndex.dropdown};\n ${getPosition(element)}: 100%;\n `,\n };\n};\n","/**\n * Returns where the subMenu should be positioned (left or right)\n *\n * @param element HTMLElement for the subMenu wrapper\n */\nexport const getPosition = (element: HTMLElement | null) => {\n if (!element) {\n return 'left';\n }\n\n const wrapperPos = element.parentElement!.getBoundingClientRect();\n const pos = element.getBoundingClientRect();\n\n if (pos.width === 0) {\n return 'left';\n }\n\n if (wrapperPos.right + pos.width + 10 > window.innerWidth) {\n return 'right';\n } else {\n return 'left';\n }\n};\n","import { css, cx } from '@emotion/css';\nimport React, { ReactElement, useCallback, useState, useRef, useImperativeHandle } from 'react';\n\nimport { GrafanaTheme2, LinkTarget } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\n\nimport { SubMenu } from './SubMenu';\n\n/** @internal */\nexport type MenuItemElement = HTMLAnchorElement & HTMLButtonElement & HTMLDivElement;\n\n/** @internal */\nexport interface MenuItemProps<T = any> {\n /** Label of the menu item */\n label: string;\n /** Aria label for accessibility support */\n ariaLabel?: string;\n /** Aria checked for accessibility support */\n ariaChecked?: boolean;\n /** Target of the menu item (i.e. new window) */\n target?: LinkTarget;\n /** Icon of the menu item */\n icon?: IconName;\n /** Role of the menu item */\n role?: string;\n /** Url of the menu item */\n url?: string;\n /** Handler for the click behaviour */\n onClick?: (event?: React.SyntheticEvent<HTMLElement>, payload?: T) => void;\n /** Custom MenuItem styles*/\n className?: string;\n /** Active */\n active?: boolean;\n /** Show in destructive style (error color) */\n destructive?: boolean;\n tabIndex?: number;\n /** List of menu items for the subMenu */\n childItems?: Array<ReactElement<MenuItemProps>>;\n}\n\n/** @internal */\nexport const MenuItem = React.memo(\n React.forwardRef<MenuItemElement, MenuItemProps>((props, ref) => {\n const {\n url,\n icon,\n label,\n ariaLabel,\n ariaChecked,\n target,\n onClick,\n className,\n active,\n destructive,\n childItems,\n role = 'menuitem',\n tabIndex = -1,\n } = props;\n const styles = useStyles2(getStyles);\n const [isActive, setIsActive] = useState(active);\n const [isSubMenuOpen, setIsSubMenuOpen] = useState(false);\n const [openedWithArrow, setOpenedWithArrow] = useState(false);\n const onMouseEnter = useCallback(() => {\n setIsSubMenuOpen(true);\n setIsActive(true);\n }, []);\n const onMouseLeave = useCallback(() => {\n setIsSubMenuOpen(false);\n setIsActive(false);\n }, []);\n\n const hasSubMenu = childItems && childItems.length > 0;\n const ItemElement = hasSubMenu ? 'div' : url === undefined ? 'button' : 'a';\n const itemStyle = cx(\n {\n [styles.item]: true,\n [styles.active]: isActive,\n [styles.destructive]: destructive,\n },\n className\n );\n\n const localRef = useRef<MenuItemElement>(null);\n useImperativeHandle(ref, () => localRef.current!);\n\n const handleKeys = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n event.stopPropagation();\n if (hasSubMenu) {\n setIsSubMenuOpen(true);\n setOpenedWithArrow(true);\n setIsActive(true);\n }\n break;\n default:\n break;\n }\n };\n\n const closeSubMenu = () => {\n setIsSubMenuOpen(false);\n setIsActive(false);\n localRef?.current?.focus();\n };\n\n return (\n <ItemElement\n target={target}\n className={itemStyle}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n href={url}\n onClick={\n onClick\n ? (event) => {\n if (!(event.ctrlKey || event.metaKey || event.shiftKey) && onClick) {\n event.preventDefault();\n event.stopPropagation();\n onClick(event);\n }\n }\n : undefined\n }\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onKeyDown={handleKeys}\n role={url === undefined ? role : undefined}\n data-role=\"menuitem\" // used to identify menuitem in Menu.tsx\n ref={localRef}\n aria-label={ariaLabel}\n aria-checked={ariaChecked}\n tabIndex={tabIndex}\n >\n {icon && <Icon name={icon} className={styles.icon} aria-hidden />}\n {label}\n {hasSubMenu && (\n <SubMenu\n items={childItems}\n isOpen={isSubMenuOpen}\n openedWithArrow={openedWithArrow}\n setOpenedWithArrow={setOpenedWithArrow}\n close={closeSubMenu}\n />\n )}\n </ItemElement>\n );\n })\n);\n\nMenuItem.displayName = 'MenuItem';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n item: css`\n background: none;\n cursor: pointer;\n white-space: nowrap;\n color: ${theme.colors.text.primary};\n display: flex;\n align-items: center;\n padding: ${theme.spacing(0.5, 2)};\n min-height: ${theme.spacing(4)};\n margin: 0;\n border: none;\n width: 100%;\n position: relative;\n\n &:hover,\n &:focus,\n &:focus-visible {\n background: ${theme.colors.action.hover};\n color: ${theme.colors.text.primary};\n text-decoration: none;\n }\n\n &:focus-visible {\n ${getFocusStyles(theme)}\n }\n `,\n active: css`\n background: ${theme.colors.action.hover};\n `,\n destructive: css`\n color: ${theme.colors.error.text};\n\n svg {\n color: ${theme.colors.error.text};\n }\n\n &:hover,\n &:focus,\n &:focus-visible {\n background: ${theme.colors.error.main};\n color: ${theme.colors.error.contrastText};\n\n svg {\n color: ${theme.colors.error.contrastText};\n }\n }\n `,\n icon: css`\n opacity: 0.7;\n margin-right: 10px;\n margin-left: -4px;\n color: ${theme.colors.text.secondary};\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { useImperativeHandle, useRef } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\nimport { MenuDivider } from './MenuDivider';\nimport { MenuGroup } from './MenuGroup';\nimport { MenuItem } from './MenuItem';\nimport { useMenuFocus } from './hooks';\n\nexport interface MenuProps extends React.HTMLAttributes<HTMLDivElement> {\n /** React element rendered at the top of the menu */\n header?: React.ReactNode;\n children: React.ReactNode;\n ariaLabel?: string;\n onOpen?: (focusOnItem: (itemId: number) => void) => void;\n onClose?: () => void;\n onKeyDown?: React.KeyboardEventHandler;\n}\n\nconst MenuComp = React.forwardRef<HTMLDivElement, MenuProps>(\n ({ header, children, ariaLabel, onOpen, onClose, onKeyDown, ...otherProps }, forwardedRef) => {\n const styles = useStyles2(getStyles);\n\n const localRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(forwardedRef, () => localRef.current!);\n\n const [handleKeys, handleFocus] = useMenuFocus({ localRef, onOpen, onClose, onKeyDown });\n\n return (\n <div\n {...otherProps}\n ref={localRef}\n className={styles.wrapper}\n role=\"menu\"\n aria-label={ariaLabel}\n onKeyDown={handleKeys}\n onFocus={handleFocus}\n >\n {header && <div className={styles.header}>{header}</div>}\n {children}\n </div>\n );\n }\n);\n\nMenuComp.displayName = 'Menu';\n\nexport const Menu = Object.assign(MenuComp, {\n Item: MenuItem,\n Divider: MenuDivider,\n Group: MenuGroup,\n});\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css`\n padding: ${theme.spacing(0.5, 0.5, 1, 0.5)};\n border-bottom: 1px solid ${theme.colors.border.weak};\n `,\n wrapper: css`\n background: ${theme.colors.background.primary};\n box-shadow: ${theme.shadows.z3};\n display: inline-block;\n border-radius: ${theme.shape.borderRadius()};\n padding: ${theme.spacing(0.5, 0)};\n `,\n };\n};\n","import { cx, css } from '@emotion/css';\nimport { isString } from 'lodash';\nimport React, { forwardRef, ButtonHTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { styleMixins, useStyles2 } from '../../themes';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\nimport { IconName } from '../../types/icon';\nimport { getPropertiesForVariant } from '../Button';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\ntype CommonProps = {\n /** Icon name */\n icon?: IconName | React.ReactNode;\n /** Tooltip */\n tooltip?: string;\n /** For image icons */\n imgSrc?: string;\n /** Alt text for imgSrc */\n imgAlt?: string;\n /** if true or false will show angle-down/up */\n isOpen?: boolean;\n /** Controls flex-grow: 1 */\n fullWidth?: boolean;\n /** reduces padding to xs */\n narrow?: boolean;\n /** variant */\n variant?: ToolbarButtonVariant;\n /** Hide any children and only show icon */\n iconOnly?: boolean;\n /** Show highlight dot */\n isHighlighted?: boolean;\n};\n\nexport type ToolbarButtonProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport type ToolbarButtonVariant = 'default' | 'primary' | 'destructive' | 'active';\n\nexport const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n (\n {\n tooltip,\n icon,\n className,\n children,\n imgSrc,\n imgAlt,\n fullWidth,\n isOpen,\n narrow,\n variant = 'default',\n iconOnly,\n 'aria-label': ariaLabel,\n isHighlighted,\n ...rest\n },\n ref\n ) => {\n const styles = useStyles2(getStyles);\n\n const buttonStyles = cx(\n 'toolbar-button',\n {\n [styles.button]: true,\n [styles.buttonFullWidth]: fullWidth,\n [styles.narrow]: narrow,\n },\n (styles as any)[variant],\n className\n );\n\n const contentStyles = cx({\n [styles.content]: true,\n [styles.contentWithIcon]: !!icon,\n [styles.contentWithRightIcon]: isOpen !== undefined,\n });\n\n const body = (\n <button\n ref={ref}\n className={buttonStyles}\n aria-label={getButtonAriaLabel(ariaLabel, tooltip)}\n aria-expanded={isOpen}\n {...rest}\n >\n {renderIcon(icon)}\n {imgSrc && <img className={styles.img} src={imgSrc} alt={imgAlt ?? ''} />}\n {children && !iconOnly && <div className={contentStyles}>{children}</div>}\n {isOpen === false && <Icon name=\"angle-down\" />}\n {isOpen === true && <Icon name=\"angle-up\" />}\n {isHighlighted && <div className={styles.highlight} />}\n </button>\n );\n\n return tooltip ? (\n <Tooltip content={tooltip} placement=\"bottom\">\n {body}\n </Tooltip>\n ) : (\n body\n );\n }\n);\n\nToolbarButton.displayName = 'ToolbarButton';\n\nfunction getButtonAriaLabel(ariaLabel: string | undefined, tooltip: string | undefined) {\n return ariaLabel ? ariaLabel : tooltip ? selectors.components.PageToolbar.item(tooltip) : undefined;\n}\n\nfunction renderIcon(icon: IconName | React.ReactNode) {\n if (!icon) {\n return null;\n }\n\n if (isString(icon)) {\n return <Icon name={icon as IconName} size={'lg'} />;\n }\n\n return icon;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const primaryVariant = getPropertiesForVariant(theme, 'primary', 'solid');\n const destructiveVariant = getPropertiesForVariant(theme, 'destructive', 'solid');\n\n const defaultOld = css`\n color: ${theme.colors.text.secondary};\n background-color: ${theme.colors.background.primary};\n\n &:hover {\n color: ${theme.colors.text.primary};\n background: ${theme.colors.background.secondary};\n }\n `;\n\n const defaultTopNav = css`\n color: ${theme.colors.text.secondary};\n background-color: transparent;\n border: none;\n\n &:hover {\n color: ${theme.colors.text.primary};\n background: ${theme.colors.background.secondary};\n }\n `;\n\n return {\n button: css`\n label: toolbar-button;\n position: relative;\n display: flex;\n align-items: center;\n height: ${theme.spacing(theme.components.height.md)};\n padding: ${theme.spacing(0, 1)};\n border-radius: ${theme.shape.borderRadius()};\n line-height: ${theme.components.height.md * theme.spacing.gridSize - 2}px;\n font-weight: ${theme.typography.fontWeightMedium};\n border: 1px solid ${theme.colors.border.weak};\n white-space: nowrap;\n transition: ${theme.transitions.create(['background', 'box-shadow', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n })};\n\n &:focus,\n &:focus-visible {\n ${getFocusStyles(theme)}\n z-index: 1;\n }\n\n &:focus:not(:focus-visible) {\n ${getMouseFocusStyles(theme)}\n }\n\n &:hover {\n box-shadow: ${theme.shadows.z1};\n }\n\n &[disabled],\n &:disabled {\n cursor: not-allowed;\n opacity: ${theme.colors.action.disabledOpacity};\n background: ${theme.colors.action.disabledBackground};\n box-shadow: none;\n\n &:hover {\n color: ${theme.colors.text.disabled};\n background: ${theme.colors.action.disabledBackground};\n box-shadow: none;\n }\n }\n `,\n default: theme.flags.topnav ? defaultTopNav : defaultOld,\n active: css`\n color: ${theme.v1.palette.orangeDark};\n border-color: ${theme.v1.palette.orangeDark};\n background-color: transparent;\n\n &:hover {\n color: ${theme.colors.text.primary};\n background: ${theme.colors.emphasize(theme.colors.background.canvas, 0.03)};\n }\n `,\n primary: css(primaryVariant),\n destructive: css(destructiveVariant),\n narrow: css`\n padding: 0 ${theme.spacing(0.5)};\n `,\n img: css`\n width: 16px;\n height: 16px;\n margin-right: ${theme.spacing(1)};\n `,\n buttonFullWidth: css`\n flex-grow: 1;\n `,\n content: css`\n flex-grow: 1;\n `,\n contentWithIcon: css`\n display: none;\n padding-left: ${theme.spacing(1)};\n\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.md)} {\n display: block;\n }\n `,\n contentWithRightIcon: css`\n padding-right: ${theme.spacing(0.5)};\n `,\n highlight: css`\n background-color: ${theme.colors.success.main};\n border-radius: 50%;\n width: 6px;\n height: 6px;\n position: absolute;\n top: -3px;\n right: -3px;\n z-index: 1;\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { forwardRef, HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\nexport interface Props extends HTMLAttributes<HTMLDivElement> {\n className?: string;\n}\n\nexport const ToolbarButtonRow = forwardRef<HTMLDivElement, Props>(({ className, children, ...rest }, ref) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div ref={ref} className={cx(styles.wrapper, className)} {...rest}>\n {children}\n </div>\n );\n});\n\nToolbarButtonRow.displayName = 'ToolbarButtonRow';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n display: flex;\n\n > .button-group,\n > .toolbar-button {\n margin-left: ${theme.spacing(1)};\n\n &:first-child {\n margin-left: 0;\n }\n }\n `,\n});\n","import { css } from '@emotion/css';\nimport { useButton } from '@react-aria/button';\nimport { FocusScope } from '@react-aria/focus';\nimport { useMenuTrigger } from '@react-aria/menu';\nimport { useMenuTriggerState } from '@react-stately/menu';\nimport React, { HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { ButtonGroup } from '../Button';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { Menu } from '../Menu/Menu';\nimport { MenuItem } from '../Menu/MenuItem';\nimport { ToolbarButton, ToolbarButtonVariant } from '../ToolbarButton';\nimport { PopoverContent } from '../Tooltip';\n\nexport interface Props<T> extends HTMLAttributes<HTMLButtonElement> {\n className?: string;\n options: Array<SelectableValue<T>>;\n value?: SelectableValue<T>;\n onChange: (item: SelectableValue<T>) => void;\n tooltipContent?: PopoverContent;\n narrow?: boolean;\n variant?: ToolbarButtonVariant;\n}\n\n/**\n * @internal\n * A temporary component until we have a proper dropdown component\n */\nconst ButtonSelectComponent = <T,>(props: Props<T>) => {\n const { className, options, value, onChange, narrow, variant, ...restProps } = props;\n const styles = useStyles2(getStyles);\n const state = useMenuTriggerState({});\n\n const ref = React.useRef(null);\n const { menuTriggerProps, menuProps } = useMenuTrigger({}, state, ref);\n const { buttonProps } = useButton(menuTriggerProps, ref);\n\n const onChangeInternal = (item: SelectableValue<T>) => {\n onChange(item);\n state.close();\n };\n\n return (\n <ButtonGroup className={styles.wrapper}>\n <ToolbarButton\n className={className}\n isOpen={state.isOpen}\n narrow={narrow}\n variant={variant}\n ref={ref}\n {...buttonProps}\n {...restProps}\n >\n {value?.label || value?.value}\n </ToolbarButton>\n {state.isOpen && (\n <div className={styles.menuWrapper}>\n <ClickOutsideWrapper onClick={state.close} parent={document} includeButtonPress={false}>\n <FocusScope contain autoFocus restoreFocus>\n {/*\n tabIndex=-1 is needed here to support highlighting text within the menu when using FocusScope\n see https://github.com/adobe/react-spectrum/issues/1604#issuecomment-781574668\n */}\n <Menu tabIndex={-1} onClose={state.close} {...menuProps}>\n {options.map((item) => (\n <MenuItem\n key={`${item.value}`}\n label={(item.label || item.value) as string}\n onClick={() => onChangeInternal(item)}\n active={item.value === value?.value}\n ariaChecked={item.value === value?.value}\n ariaLabel={item.ariaLabel || item.label}\n role=\"menuitemradio\"\n />\n ))}\n </Menu>\n </FocusScope>\n </ClickOutsideWrapper>\n </div>\n )}\n </ButtonGroup>\n );\n};\n\nButtonSelectComponent.displayName = 'ButtonSelect';\n\nexport const ButtonSelect = React.memo(ButtonSelectComponent) as typeof ButtonSelectComponent;\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n position: relative;\n display: inline-flex;\n `,\n menuWrapper: css`\n position: absolute;\n z-index: ${theme.zIndex.dropdown};\n top: ${theme.spacing(4)};\n right: 0;\n `,\n };\n};\n","import formatDuration from 'date-fns/formatDuration';\nimport React, { PureComponent } from 'react';\n\nimport { SelectableValue, parseDuration } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { ButtonGroup } from '../Button';\nimport { ButtonSelect } from '../Dropdown/ButtonSelect';\nimport { ToolbarButtonVariant, ToolbarButton } from '../ToolbarButton';\n\n// Default intervals used in the refresh picker component\nexport const defaultIntervals = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\n\nexport interface Props {\n intervals?: string[];\n onRefresh?: () => any;\n onIntervalChanged: (interval: string) => void;\n value?: string;\n tooltip?: string;\n isLoading?: boolean;\n isLive?: boolean;\n text?: string;\n noIntervalPicker?: boolean;\n width?: string;\n primary?: boolean;\n // These props are used to translate the component\n offOptionLabelMsg?: string;\n offOptionAriaLabelMsg?: string;\n offDescriptionAriaLabelMsg?: string;\n onDescriptionAriaLabelMsg?: (durationAriaLabel: string | undefined) => string;\n}\n\nexport class RefreshPicker extends PureComponent<Props> {\n static offOption = {\n label: 'Off',\n value: '',\n ariaLabel: 'Turn off auto refresh',\n };\n static liveOption = {\n label: 'Live',\n value: 'LIVE',\n ariaLabel: 'Turn on live streaming',\n };\n static isLive = (refreshInterval?: string): boolean => refreshInterval === RefreshPicker.liveOption.value;\n\n constructor(props: Props) {\n super(props);\n }\n\n onChangeSelect = (item: SelectableValue<string>) => {\n const { onIntervalChanged } = this.props;\n if (onIntervalChanged) {\n // @ts-ignore\n onIntervalChanged(item.value);\n }\n };\n\n getVariant(): ToolbarButtonVariant {\n if (this.props.isLive) {\n return 'primary';\n }\n if (this.props.isLoading) {\n return 'destructive';\n }\n if (this.props.primary) {\n return 'primary';\n }\n return 'default';\n }\n\n render() {\n const {\n onRefresh,\n intervals,\n tooltip,\n value,\n text,\n isLoading,\n noIntervalPicker,\n width,\n offOptionLabelMsg,\n offOptionAriaLabelMsg,\n offDescriptionAriaLabelMsg,\n onDescriptionAriaLabelMsg,\n } = this.props;\n\n const currentValue = value || '';\n const variant = this.getVariant();\n const translatedOffOption = {\n value: RefreshPicker.offOption.value,\n label: offOptionLabelMsg || RefreshPicker.offOption.label,\n ariaLabel: offOptionAriaLabelMsg || RefreshPicker.offOption.ariaLabel,\n };\n const options = intervalsToOptions({ intervals, offOption: translatedOffOption });\n const option = options.find(({ value }) => value === currentValue);\n let selectedValue = option || translatedOffOption;\n\n if (selectedValue.label === translatedOffOption.label) {\n selectedValue = { value: '' };\n }\n\n const durationAriaLabel = selectedValue.ariaLabel;\n const ariaLabel =\n selectedValue.value === ''\n ? offDescriptionAriaLabelMsg || 'Auto refresh turned off. Choose refresh time interval'\n : onDescriptionAriaLabelMsg?.(durationAriaLabel) ||\n `Choose refresh time interval with current interval ${durationAriaLabel} selected`;\n\n return (\n <ButtonGroup className=\"refresh-picker\">\n <ToolbarButton\n aria-label={text}\n tooltip={tooltip}\n onClick={onRefresh}\n variant={variant}\n icon={isLoading ? 'fa fa-spinner' : 'sync'}\n style={width ? { width } : undefined}\n data-testid={selectors.components.RefreshPicker.runButtonV2}\n >\n {text}\n </ToolbarButton>\n {!noIntervalPicker && (\n <ButtonSelect\n value={selectedValue}\n options={options}\n onChange={this.onChangeSelect as any}\n variant={variant}\n data-testid={selectors.components.RefreshPicker.intervalButtonV2}\n aria-label={ariaLabel}\n />\n )}\n </ButtonGroup>\n );\n }\n}\n\nexport function intervalsToOptions({\n intervals = defaultIntervals,\n offOption = RefreshPicker.offOption,\n}: { intervals?: string[]; offOption?: SelectableValue<string> } = {}): Array<SelectableValue<string>> {\n const options: Array<SelectableValue<string>> = intervals.map((interval) => {\n const duration = parseDuration(interval);\n const ariaLabel = formatDuration(duration);\n\n return {\n label: interval,\n value: interval,\n ariaLabel: ariaLabel,\n };\n });\n\n options.unshift(offOption);\n return options;\n}\n","import { css } from '@emotion/css';\nimport React, { PropsWithChildren } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme, stylesFactory } from '../../../themes';\n\ninterface Props {\n label: string | undefined;\n}\n\nconst stopPropagation = (event: React.MouseEvent) => event.stopPropagation();\n\nexport const TimeZoneGroup: React.FC<PropsWithChildren<Props>> = (props) => {\n const theme = useTheme();\n const { children, label } = props;\n const styles = getStyles(theme);\n\n if (!label) {\n return <div onClick={stopPropagation}>{children}</div>;\n }\n\n return (\n <div onClick={stopPropagation}>\n <div className={styles.header}>\n <span className={styles.label}>{label}</span>\n </div>\n {children}\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n header: css`\n padding: 7px 10px;\n width: 100%;\n border-top: 1px solid ${theme.colors.border1};\n text-transform: capitalize;\n `,\n label: css`\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.textWeak};\n font-weight: ${theme.typography.weight.semibold};\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport { isString } from 'lodash';\nimport React, { PropsWithChildren } from 'react';\n\nimport { GrafanaTheme, TimeZone, dateTimeFormat } from '@grafana/data';\n\nimport { useTheme, stylesFactory } from '../../../themes';\n\ninterface Props {\n timestamp: number;\n timeZone: TimeZone | undefined;\n className?: string;\n}\n\nexport const TimeZoneOffset: React.FC<PropsWithChildren<Props>> = (props) => {\n const theme = useTheme();\n const { timestamp, timeZone, className } = props;\n const styles = getStyles(theme);\n\n if (!isString(timeZone)) {\n return null;\n }\n\n return (\n <>\n <span className={cx(styles.offset, className)}>{formatUtcOffset(timestamp, timeZone)}</span>\n </>\n );\n};\n\nexport const formatUtcOffset = (timestamp: number, timeZone: TimeZone): string => {\n const offset = dateTimeFormat(timestamp, {\n timeZone,\n format: 'Z',\n });\n\n if (offset === '+00:00') {\n return 'UTC';\n }\n return `UTC${offset}`;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n const textBase = css`\n font-weight: normal;\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.textWeak};\n white-space: normal;\n `;\n\n return {\n offset: css`\n ${textBase};\n color: ${theme.colors.text};\n background: ${theme.colors.bg2};\n padding: 2px 5px;\n border-radius: 2px;\n margin-left: 4px;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { PropsWithChildren, useMemo } from 'react';\n\nimport { GrafanaTheme, TimeZoneInfo } from '@grafana/data';\n\nimport { useTheme, stylesFactory } from '../../../themes';\n\ninterface Props {\n info?: TimeZoneInfo;\n}\n\nexport const TimeZoneDescription: React.FC<PropsWithChildren<Props>> = ({ info }) => {\n const theme = useTheme();\n const styles = getStyles(theme);\n const description = useDescription(info);\n\n if (!info) {\n return null;\n }\n\n return <div className={styles.description}>{description}</div>;\n};\n\nconst useDescription = (info?: TimeZoneInfo): string => {\n return useMemo(() => {\n const parts: string[] = [];\n\n if (!info) {\n return '';\n }\n\n if (info.countries.length > 0) {\n const country = info.countries[0];\n parts.push(country.name);\n }\n\n if (info.abbreviation) {\n parts.push(info.abbreviation);\n }\n\n return parts.join(', ');\n }, [info]);\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n description: css`\n font-weight: normal;\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.textWeak};\n white-space: normal;\n text-overflow: ellipsis;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { ReactNode } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme, stylesFactory } from '../../../themes';\n\ninterface Props {\n title: string | ReactNode;\n}\n\nexport const TimeZoneTitle: React.FC<Props> = ({ title }) => {\n const theme = useTheme();\n const styles = getStyles(theme);\n\n if (!title) {\n return null;\n }\n\n return <span className={styles.title}>{title}</span>;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n title: css`\n font-weight: ${theme.typography.weight.regular};\n text-overflow: ellipsis;\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport { isString } from 'lodash';\nimport React, { PropsWithChildren } from 'react';\n\nimport { GrafanaTheme2, SelectableValue, getTimeZoneInfo } from '@grafana/data';\n\nimport { useTheme2 } from '../../../themes/ThemeContext';\nimport { stylesFactory } from '../../../themes/stylesFactory';\nimport { Icon } from '../../Icon/Icon';\n\nimport { TimeZoneDescription } from './TimeZoneDescription';\nimport { TimeZoneOffset } from './TimeZoneOffset';\nimport { TimeZoneTitle } from './TimeZoneTitle';\n\ninterface Props {\n isFocused: boolean;\n isSelected: boolean;\n innerProps: any;\n data: SelectableZone;\n}\n\nconst offsetClassName = 'tz-utc-offset';\n\nexport interface SelectableZone extends SelectableValue<string> {\n searchIndex: string;\n}\n\nexport const WideTimeZoneOption: React.FC<PropsWithChildren<Props>> = (props, ref) => {\n const { children, innerProps, data, isSelected, isFocused } = props;\n const theme = useTheme2();\n const styles = getStyles(theme);\n const timestamp = Date.now();\n const containerStyles = cx(styles.container, isFocused && styles.containerFocused);\n\n if (!isString(data.value)) {\n return null;\n }\n\n const timeZoneInfo = getTimeZoneInfo(data.value, timestamp);\n\n return (\n <div className={containerStyles} {...innerProps} aria-label=\"Select option\">\n <div className={cx(styles.leftColumn, styles.row)}>\n <div className={cx(styles.leftColumn, styles.wideRow)}>\n <TimeZoneTitle title={children} />\n <div className={styles.spacer} />\n <TimeZoneDescription info={timeZoneInfo} />\n </div>\n <div className={styles.rightColumn}>\n <TimeZoneOffset\n /* Use the timeZoneInfo to pass the correct timeZone name,\n as 'Default' has value '' which defaults to browser timezone */\n timeZone={timeZoneInfo?.ianaName || data.value}\n timestamp={timestamp}\n className={offsetClassName}\n />\n {isSelected && (\n <span>\n <Icon name=\"check\" />\n </span>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport const CompactTimeZoneOption: React.FC<PropsWithChildren<Props>> = (props, ref) => {\n const { children, innerProps, data, isSelected, isFocused } = props;\n const theme = useTheme2();\n const styles = getStyles(theme);\n const timestamp = Date.now();\n const containerStyles = cx(styles.container, isFocused && styles.containerFocused);\n\n if (!isString(data.value)) {\n return null;\n }\n\n const timeZoneInfo = getTimeZoneInfo(data.value, timestamp);\n\n return (\n <div className={containerStyles} {...innerProps} aria-label=\"Select option\">\n <div className={styles.body}>\n <div className={styles.row}>\n <div className={styles.leftColumn}>\n <TimeZoneTitle title={children} />\n </div>\n <div className={styles.rightColumn}>\n {isSelected && (\n <span>\n <Icon name=\"check\" />\n </span>\n )}\n </div>\n </div>\n <div className={styles.row}>\n <div className={styles.leftColumn}>\n <TimeZoneDescription info={timeZoneInfo} />\n </div>\n <div className={styles.rightColumn}>\n <TimeZoneOffset\n timestamp={timestamp}\n /* Use the timeZoneInfo to pass the correct timeZone name,\n as 'Default' has value '' which defaults to browser timezone */\n timeZone={timeZoneInfo?.ianaName || data.value}\n className={offsetClassName}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n container: css`\n display: flex;\n align-items: center;\n flex-direction: row;\n flex-shrink: 0;\n white-space: nowrap;\n cursor: pointer;\n padding: 6px 8px 4px;\n\n &:hover {\n background: ${theme.colors.action.hover};\n }\n `,\n containerFocused: css`\n background: ${theme.colors.action.hover};\n `,\n body: css`\n display: flex;\n font-weight: ${theme.typography.fontWeightMedium};\n flex-direction: column;\n flex-grow: 1;\n `,\n row: css`\n display: flex;\n flex-direction: row;\n `,\n leftColumn: css`\n flex-grow: 1;\n text-overflow: ellipsis;\n `,\n rightColumn: css`\n justify-content: flex-end;\n align-items: center;\n `,\n wideRow: css`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n `,\n spacer: css`\n margin-left: 6px;\n `,\n };\n});\n","import { toLower, isEmpty, isString } from 'lodash';\nimport React, { useMemo, useCallback } from 'react';\n\nimport {\n SelectableValue,\n getTimeZoneInfo,\n TimeZoneInfo,\n getTimeZoneGroups,\n GroupedTimeZones,\n TimeZone,\n InternalTimeZones,\n} from '@grafana/data';\n\nimport { Select } from '../Select/Select';\n\nimport { TimeZoneGroup } from './TimeZonePicker/TimeZoneGroup';\nimport { formatUtcOffset } from './TimeZonePicker/TimeZoneOffset';\nimport { CompactTimeZoneOption, WideTimeZoneOption, SelectableZone } from './TimeZonePicker/TimeZoneOption';\n\nexport interface Props {\n onChange: (timeZone?: TimeZone) => void;\n value?: TimeZone;\n width?: number;\n autoFocus?: boolean;\n onBlur?: () => void;\n includeInternal?: boolean | InternalTimeZones[];\n disabled?: boolean;\n inputId?: string;\n}\n\nexport const TimeZonePicker: React.FC<Props> = (props) => {\n const {\n onChange,\n width,\n autoFocus = false,\n onBlur,\n value,\n includeInternal = false,\n disabled = false,\n inputId,\n } = props;\n const groupedTimeZones = useTimeZones(includeInternal);\n const selected = useSelectedTimeZone(groupedTimeZones, value);\n const filterBySearchIndex = useFilterBySearchIndex();\n const TimeZoneOption = width && width <= 45 ? CompactTimeZoneOption : WideTimeZoneOption;\n\n const onChangeTz = useCallback(\n (selectable: SelectableValue<string>) => {\n if (!selectable || !isString(selectable.value)) {\n return onChange(value);\n }\n onChange(selectable.value);\n },\n [onChange, value]\n );\n\n return (\n <Select\n inputId={inputId}\n value={selected}\n placeholder=\"Type to search (country, city, abbreviation)\"\n autoFocus={autoFocus}\n menuShouldPortal={false}\n openMenuOnFocus={true}\n width={width}\n filterOption={filterBySearchIndex}\n options={groupedTimeZones}\n onChange={onChangeTz}\n onBlur={onBlur}\n components={{ Option: TimeZoneOption, Group: TimeZoneGroup }}\n disabled={disabled}\n aria-label={'Time zone picker'}\n />\n );\n};\n\ninterface SelectableZoneGroup extends SelectableValue<string> {\n options: SelectableZone[];\n}\n\nconst useTimeZones = (includeInternal: boolean | InternalTimeZones[]): SelectableZoneGroup[] => {\n const now = Date.now();\n\n const timeZoneGroups = getTimeZoneGroups(includeInternal).map((group: GroupedTimeZones) => {\n const options = group.zones.reduce((options: SelectableZone[], zone) => {\n const info = getTimeZoneInfo(zone, now);\n\n if (!info) {\n return options;\n }\n\n options.push({\n label: info.name,\n value: info.zone,\n searchIndex: getSearchIndex(info, now),\n });\n\n return options;\n }, []);\n\n return {\n label: group.name,\n options,\n };\n });\n return timeZoneGroups;\n};\n\nconst useSelectedTimeZone = (\n groups: SelectableZoneGroup[],\n timeZone: TimeZone | undefined\n): SelectableZone | undefined => {\n return useMemo(() => {\n if (timeZone === undefined) {\n return undefined;\n }\n\n const tz = toLower(timeZone);\n\n const group = groups.find((group) => {\n if (!group.label) {\n return isInternal(tz);\n }\n return tz.startsWith(toLower(group.label));\n });\n\n return group?.options.find((option) => {\n if (isEmpty(tz)) {\n return option.value === InternalTimeZones.default;\n }\n return toLower(option.value) === tz;\n });\n }, [groups, timeZone]);\n};\n\nconst isInternal = (timeZone: TimeZone): boolean => {\n switch (timeZone) {\n case InternalTimeZones.default:\n case InternalTimeZones.localBrowserTime:\n case InternalTimeZones.utc:\n return true;\n\n default:\n return false;\n }\n};\n\nconst useFilterBySearchIndex = () => {\n return useCallback((option: SelectableValue, searchQuery: string) => {\n if (!searchQuery || !option.data || !option.data.searchIndex) {\n return true;\n }\n return option.data.searchIndex.indexOf(toLower(searchQuery)) > -1;\n }, []);\n};\n\nconst getSearchIndex = (info: TimeZoneInfo, timestamp: number): string => {\n const parts: string[] = [\n toLower(info.name),\n toLower(info.abbreviation),\n toLower(formatUtcOffset(timestamp, info.zone)),\n ];\n\n for (const country of info.countries) {\n parts.push(toLower(country.name));\n parts.push(toLower(country.code));\n }\n\n return parts.join('|');\n};\n","import { SelectableValue, TimeOption } from '@grafana/data';\n\nexport const quickOptions: TimeOption[] = [\n { from: 'now-5m', to: 'now', display: 'Last 5 minutes' },\n { from: 'now-15m', to: 'now', display: 'Last 15 minutes' },\n { from: 'now-30m', to: 'now', display: 'Last 30 minutes' },\n { from: 'now-1h', to: 'now', display: 'Last 1 hour' },\n { from: 'now-3h', to: 'now', display: 'Last 3 hours' },\n { from: 'now-6h', to: 'now', display: 'Last 6 hours' },\n { from: 'now-12h', to: 'now', display: 'Last 12 hours' },\n { from: 'now-24h', to: 'now', display: 'Last 24 hours' },\n { from: 'now-2d', to: 'now', display: 'Last 2 days' },\n { from: 'now-7d', to: 'now', display: 'Last 7 days' },\n { from: 'now-30d', to: 'now', display: 'Last 30 days' },\n { from: 'now-90d', to: 'now', display: 'Last 90 days' },\n { from: 'now-6M', to: 'now', display: 'Last 6 months' },\n { from: 'now-1y', to: 'now', display: 'Last 1 year' },\n { from: 'now-2y', to: 'now', display: 'Last 2 years' },\n { from: 'now-5y', to: 'now', display: 'Last 5 years' },\n { from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday' },\n { from: 'now-2d/d', to: 'now-2d/d', display: 'Day before yesterday' },\n { from: 'now-7d/d', to: 'now-7d/d', display: 'This day last week' },\n { from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week' },\n { from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month' },\n { from: 'now-1Q/fQ', to: 'now-1Q/fQ', display: 'Previous fiscal quarter' },\n { from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year' },\n { from: 'now-1y/fy', to: 'now-1y/fy', display: 'Previous fiscal year' },\n { from: 'now/d', to: 'now/d', display: 'Today' },\n { from: 'now/d', to: 'now', display: 'Today so far' },\n { from: 'now/w', to: 'now/w', display: 'This week' },\n { from: 'now/w', to: 'now', display: 'This week so far' },\n { from: 'now/M', to: 'now/M', display: 'This month' },\n { from: 'now/M', to: 'now', display: 'This month so far' },\n { from: 'now/y', to: 'now/y', display: 'This year' },\n { from: 'now/y', to: 'now', display: 'This year so far' },\n { from: 'now/fQ', to: 'now', display: 'This fiscal quarter so far' },\n { from: 'now/fQ', to: 'now/fQ', display: 'This fiscal quarter' },\n { from: 'now/fy', to: 'now', display: 'This fiscal year so far' },\n { from: 'now/fy', to: 'now/fy', display: 'This fiscal year' },\n];\n\nexport const monthOptions: Array<SelectableValue<number>> = [\n { label: 'January', value: 0 },\n { label: 'February', value: 1 },\n { label: 'March', value: 2 },\n { label: 'April', value: 3 },\n { label: 'May', value: 4 },\n { label: 'June', value: 5 },\n { label: 'July', value: 6 },\n { label: 'August', value: 7 },\n { label: 'September', value: 8 },\n { label: 'October', value: 9 },\n { label: 'November', value: 10 },\n { label: 'December', value: 11 },\n];\n","import { css, cx } from '@emotion/css';\nimport { isString } from 'lodash';\nimport React, { FC, useCallback, useState } from 'react';\n\nimport { getTimeZoneInfo, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { Field, RadioButtonGroup, Select } from '../..';\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { Button } from '../../Button';\nimport { TimeZonePicker } from '../TimeZonePicker';\nimport { TimeZoneDescription } from '../TimeZonePicker/TimeZoneDescription';\nimport { TimeZoneOffset } from '../TimeZonePicker/TimeZoneOffset';\nimport { TimeZoneTitle } from '../TimeZonePicker/TimeZoneTitle';\nimport { monthOptions } from '../options';\n\ninterface Props {\n timeZone?: TimeZone;\n fiscalYearStartMonth?: number;\n timestamp?: number;\n onChangeTimeZone: (timeZone: TimeZone) => void;\n onChangeFiscalYearStartMonth?: (month: number) => void;\n}\n\nexport const TimePickerFooter: FC<Props> = (props) => {\n const {\n timeZone,\n fiscalYearStartMonth,\n timestamp = Date.now(),\n onChangeTimeZone,\n onChangeFiscalYearStartMonth,\n } = props;\n const [isEditing, setEditing] = useState(false);\n const [editMode, setEditMode] = useState('tz');\n\n const onToggleChangeTimeSettings = useCallback(\n (event?: React.MouseEvent) => {\n if (event) {\n event.stopPropagation();\n }\n setEditing(!isEditing);\n },\n [isEditing, setEditing]\n );\n\n const theme = useTheme2();\n const style = getStyle(theme);\n\n if (!isString(timeZone)) {\n return null;\n }\n\n const info = getTimeZoneInfo(timeZone, timestamp);\n\n if (!info) {\n return null;\n }\n\n return (\n <div>\n <section aria-label=\"Time zone selection\" className={style.container}>\n <div className={style.timeZoneContainer}>\n <div className={style.timeZone}>\n <TimeZoneTitle title={info.name} />\n <div className={style.spacer} />\n <TimeZoneDescription info={info} />\n </div>\n <TimeZoneOffset timeZone={timeZone} timestamp={timestamp} />\n </div>\n <div className={style.spacer} />\n <Button variant=\"secondary\" onClick={onToggleChangeTimeSettings} size=\"sm\">\n Change time settings\n </Button>\n </section>\n {isEditing ? (\n <div className={style.editContainer}>\n <div>\n <RadioButtonGroup\n value={editMode}\n options={[\n { label: 'Time zone', value: 'tz' },\n { label: 'Fiscal year', value: 'fy' },\n ]}\n onChange={setEditMode}\n ></RadioButtonGroup>\n </div>\n {editMode === 'tz' ? (\n <section\n data-testid={selectors.components.TimeZonePicker.containerV2}\n className={cx(style.timeZoneContainer, style.timeSettingContainer)}\n >\n <TimeZonePicker\n includeInternal={true}\n onChange={(timeZone) => {\n onToggleChangeTimeSettings();\n\n if (isString(timeZone)) {\n onChangeTimeZone(timeZone);\n }\n }}\n onBlur={onToggleChangeTimeSettings}\n />\n </section>\n ) : (\n <section\n aria-label={selectors.components.TimeZonePicker.containerV2}\n className={cx(style.timeZoneContainer, style.timeSettingContainer)}\n >\n <Field className={style.fiscalYearField} label={'Fiscal year start month'}>\n <Select\n value={fiscalYearStartMonth}\n menuShouldPortal={false}\n options={monthOptions}\n onChange={(value) => {\n if (onChangeFiscalYearStartMonth) {\n onChangeFiscalYearStartMonth(value.value ?? 0);\n }\n }}\n />\n </Field>\n </section>\n )}\n </div>\n ) : null}\n </div>\n );\n};\n\nconst getStyle = stylesFactory((theme: GrafanaTheme2) => {\n return {\n container: css`\n border-top: 1px solid ${theme.colors.border.weak};\n padding: 11px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n `,\n editContainer: css`\n border-top: 1px solid ${theme.colors.border.weak};\n padding: 11px;\n justify-content: space-between;\n align-items: center;\n padding: 7px;\n `,\n spacer: css`\n margin-left: 7px;\n `,\n timeSettingContainer: css`\n padding-top: ${theme.spacing(1)};\n `,\n fiscalYearField: css`\n margin-bottom: 0px;\n `,\n timeZoneContainer: css`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n flex-grow: 1;\n `,\n timeZone: css`\n display: flex;\n flex-direction: row;\n align-items: baseline;\n flex-grow: 1;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { memo, PropsWithChildren } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme, stylesFactory } from '../../../themes';\n\nconst getStyle = stylesFactory((theme: GrafanaTheme) => {\n return {\n text: css`\n font-size: ${theme.typography.size.md};\n font-weight: ${theme.typography.weight.semibold};\n color: ${theme.colors.formLabel};\n margin: 0;\n display: flex;\n `,\n };\n});\n\nexport const TimePickerTitle = memo<PropsWithChildren<{}>>(({ children }) => {\n const theme = useTheme();\n const styles = getStyle(theme);\n\n return <h3 className={styles.text}>{children}</h3>;\n});\n\nTimePickerTitle.displayName = 'TimePickerTitle';\n","import { css } from '@emotion/css';\nimport React, { useCallback } from 'react';\nimport Calendar from 'react-calendar';\n\nimport { GrafanaTheme2, dateTime, dateTimeParse, DateTime, TimeZone } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\nimport { Icon } from '../../Icon/Icon';\n\nimport { TimePickerCalendarProps } from './TimePickerCalendar';\n\nexport function Body({ onChange, from, to, timeZone }: TimePickerCalendarProps) {\n const value = inputToValue(from, to);\n const onCalendarChange = useOnCalendarChange(onChange, timeZone);\n const styles = useStyles2(getBodyStyles);\n\n return (\n <Calendar\n selectRange={true}\n next2Label={null}\n prev2Label={null}\n className={styles.body}\n tileClassName={styles.title}\n value={value}\n nextLabel={<Icon name=\"angle-right\" />}\n prevLabel={<Icon name=\"angle-left\" />}\n onChange={onCalendarChange}\n locale=\"en\"\n />\n );\n}\n\nBody.displayName = 'Body';\n\nexport function inputToValue(from: DateTime, to: DateTime, invalidDateDefault: Date = new Date()): [Date, Date] {\n const fromAsDate = from.toDate();\n const toAsDate = to.toDate();\n const fromAsValidDate = dateTime(fromAsDate).isValid() ? fromAsDate : invalidDateDefault;\n const toAsValidDate = dateTime(toAsDate).isValid() ? toAsDate : invalidDateDefault;\n\n if (fromAsValidDate > toAsValidDate) {\n return [toAsValidDate, fromAsValidDate];\n }\n return [fromAsValidDate, toAsValidDate];\n}\n\nfunction useOnCalendarChange(onChange: (from: DateTime, to: DateTime) => void, timeZone?: TimeZone) {\n return useCallback(\n (value: Date | Date[]) => {\n if (!Array.isArray(value)) {\n return console.error('onCalendarChange: should be run in selectRange={true}');\n }\n\n const from = dateTimeParse(dateInfo(value[0]), { timeZone });\n const to = dateTimeParse(dateInfo(value[1]), { timeZone });\n\n onChange(from, to);\n },\n [onChange, timeZone]\n );\n}\n\nfunction dateInfo(date: Date): number[] {\n return [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()];\n}\n\nexport const getBodyStyles = (theme: GrafanaTheme2) => {\n return {\n title: css`\n color: ${theme.colors.text};\n background-color: ${theme.colors.background.primary};\n font-size: ${theme.typography.size.md};\n border: 1px solid transparent;\n\n &:hover {\n position: relative;\n }\n `,\n body: css`\n z-index: ${theme.zIndex.modal};\n background-color: ${theme.colors.background.primary};\n width: 268px;\n\n .react-calendar__navigation {\n display: flex;\n }\n\n .react-calendar__navigation__label,\n .react-calendar__navigation__arrow,\n .react-calendar__navigation {\n padding-top: 4px;\n background-color: inherit;\n color: ${theme.colors.text};\n border: 0;\n font-weight: ${theme.typography.fontWeightMedium};\n }\n\n .react-calendar__month-view__weekdays {\n background-color: inherit;\n text-align: center;\n color: ${theme.colors.primary.text};\n\n abbr {\n border: 0;\n text-decoration: none;\n cursor: default;\n display: block;\n padding: 4px 0 4px 0;\n }\n }\n\n .react-calendar__month-view__days {\n background-color: inherit;\n }\n\n .react-calendar__tile,\n .react-calendar__tile--now {\n margin-bottom: 4px;\n background-color: inherit;\n height: 26px;\n }\n\n .react-calendar__navigation__label,\n .react-calendar__navigation > button:focus,\n .time-picker-calendar-tile:focus {\n outline: 0;\n }\n\n .react-calendar__tile--active,\n .react-calendar__tile--active:hover {\n color: ${theme.colors.primary.contrastText};\n font-weight: ${theme.typography.fontWeightMedium};\n background: ${theme.colors.primary.main};\n box-shadow: none;\n border: 0px;\n }\n\n .react-calendar__tile--rangeEnd,\n .react-calendar__tile--rangeStart {\n padding: 0;\n border: 0px;\n color: ${theme.colors.primary.contrastText};\n font-weight: ${theme.typography.fontWeightMedium};\n background: ${theme.colors.primary.main};\n\n abbr {\n background-color: ${theme.colors.primary.main};\n border-radius: 100px;\n display: block;\n padding-top: 2px;\n height: 26px;\n }\n }\n\n .react-calendar__tile--rangeStart {\n border-top-left-radius: 20px;\n border-bottom-left-radius: 20px;\n }\n\n .react-calendar__tile--rangeEnd {\n border-top-right-radius: 20px;\n border-bottom-right-radius: 20px;\n }\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\nimport { Button } from '../../Button';\n\nimport { TimePickerCalendarProps } from './TimePickerCalendar';\n\nexport function Footer({ onClose, onApply }: TimePickerCalendarProps) {\n const styles = useStyles2(getFooterStyles);\n\n return (\n <div className={styles.container}>\n <Button className={styles.apply} onClick={onApply}>\n Apply time range\n </Button>\n <Button variant=\"secondary\" onClick={onClose}>\n Cancel\n </Button>\n </div>\n );\n}\n\nFooter.displayName = 'Footer';\n\nconst getFooterStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n background-color: ${theme.colors.background.primary};\n display: flex;\n justify-content: center;\n padding: 10px;\n align-items: stretch;\n `,\n apply: css`\n margin-right: 4px;\n width: 100%;\n justify-content: center;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2 } from '../../../themes';\nimport { Button } from '../../Button';\n\nimport { TimePickerCalendarProps } from './TimePickerCalendar';\nimport { TimePickerTitle } from './TimePickerTitle';\n\nexport function Header({ onClose }: TimePickerCalendarProps) {\n const styles = useStyles2(getHeaderStyles);\n\n return (\n <div className={styles.container}>\n <TimePickerTitle>Select a time range</TimePickerTitle>\n <Button\n aria-label={selectors.components.TimePicker.calendar.closeButton}\n icon=\"times\"\n variant=\"secondary\"\n onClick={onClose}\n />\n </div>\n );\n}\n\nHeader.displayName = 'Header';\n\nconst getHeaderStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n background-color: ${theme.colors.background.primary};\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 7px;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { OverlayContainer, useOverlay } from '@react-aria/overlays';\nimport React, { FormEvent, memo } from 'react';\n\nimport { DateTime, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useTheme2 } from '../../../themes';\n\nimport { Body } from './CalendarBody';\nimport { Footer } from './CalendarFooter';\nimport { Header } from './CalendarHeader';\n\nexport const getStyles = (theme: GrafanaTheme2, isReversed = false) => {\n return {\n container: css`\n top: -1px;\n position: absolute;\n ${isReversed ? 'left' : 'right'}: 544px;\n box-shadow: ${theme.shadows.z3};\n background-color: ${theme.colors.background.primary};\n z-index: -1;\n border: 1px solid ${theme.colors.border.weak};\n border-radius: 2px 0 0 2px;\n\n &:after {\n display: block;\n background-color: ${theme.colors.background.primary};\n width: 19px;\n height: 100%;\n content: ${!isReversed ? ' ' : ''};\n position: absolute;\n top: 0;\n right: -19px;\n border-left: 1px solid ${theme.colors.border.weak};\n }\n `,\n modal: css`\n position: fixed;\n top: 20%;\n width: 100%;\n z-index: ${theme.zIndex.modal};\n `,\n content: css`\n margin: 0 auto;\n width: 268px;\n `,\n backdrop: css`\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background: #202226;\n opacity: 0.7;\n z-index: ${theme.zIndex.modalBackdrop};\n text-align: center;\n `,\n };\n};\n\nexport interface TimePickerCalendarProps {\n isOpen: boolean;\n from: DateTime;\n to: DateTime;\n onClose: () => void;\n onApply: (e: FormEvent<HTMLButtonElement>) => void;\n onChange: (from: DateTime, to: DateTime) => void;\n isFullscreen: boolean;\n timeZone?: TimeZone;\n isReversed?: boolean;\n}\n\nconst stopPropagation = (event: React.MouseEvent<HTMLDivElement>) => event.stopPropagation();\n\nfunction TimePickerCalendar(props: TimePickerCalendarProps) {\n const theme = useTheme2();\n const styles = getStyles(theme, props.isReversed);\n const { isOpen, isFullscreen, onClose } = props;\n const ref = React.createRef<HTMLElement>();\n const { dialogProps } = useDialog(\n {\n 'aria-label': selectors.components.TimePicker.calendar.label,\n },\n ref\n );\n const { overlayProps } = useOverlay(\n {\n isDismissable: true,\n isOpen,\n onClose,\n },\n ref\n );\n\n if (!isOpen) {\n return null;\n }\n\n if (isFullscreen) {\n return (\n <FocusScope contain restoreFocus autoFocus>\n <section className={styles.container} onClick={stopPropagation} ref={ref} {...overlayProps} {...dialogProps}>\n <Header {...props} />\n <Body {...props} />\n </section>\n </FocusScope>\n );\n }\n\n return (\n <OverlayContainer>\n <FocusScope contain autoFocus restoreFocus>\n <section className={styles.modal} onClick={stopPropagation} ref={ref} {...overlayProps} {...dialogProps}>\n <div className={styles.content} aria-label={selectors.components.TimePicker.calendar.label}>\n <Header {...props} />\n <Body {...props} />\n <Footer {...props} />\n </div>\n </section>\n </FocusScope>\n <div className={styles.backdrop} onClick={stopPropagation} />\n </OverlayContainer>\n );\n}\nexport default memo(TimePickerCalendar);\nTimePickerCalendar.displayName = 'TimePickerCalendar';\n","import { css } from '@emotion/css';\nimport React, { FormEvent, useCallback, useEffect, useState } from 'react';\n\nimport {\n dateMath,\n DateTime,\n dateTimeFormat,\n dateTimeParse,\n GrafanaTheme2,\n isDateTime,\n rangeUtil,\n RawTimeRange,\n TimeRange,\n TimeZone,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { Icon, Tooltip } from '../..';\nimport { useStyles2 } from '../../..';\nimport { Button } from '../../Button';\nimport { Field } from '../../Forms/Field';\nimport { Input } from '../../Input/Input';\n\nimport TimePickerCalendar from './TimePickerCalendar';\n\ninterface Props {\n isFullscreen: boolean;\n value: TimeRange;\n onApply: (range: TimeRange) => void;\n timeZone?: TimeZone;\n fiscalYearStartMonth?: number;\n roundup?: boolean;\n isReversed?: boolean;\n}\n\ninterface InputState {\n value: string;\n invalid: boolean;\n errorMessage: string;\n}\n\nconst ERROR_MESSAGES = {\n default: 'Please enter a past date or \"now\"',\n range: '\"From\" can\\'t be after \"To\"',\n};\n\nexport const TimeRangeForm: React.FC<Props> = (props) => {\n const { value, isFullscreen = false, timeZone, onApply: onApplyFromProps, isReversed, fiscalYearStartMonth } = props;\n const [fromValue, toValue] = valueToState(value.raw.from, value.raw.to, timeZone);\n const style = useStyles2(getStyles);\n\n const [from, setFrom] = useState<InputState>(fromValue);\n const [to, setTo] = useState<InputState>(toValue);\n const [isOpen, setOpen] = useState(false);\n\n // Synchronize internal state with external value\n useEffect(() => {\n const [fromValue, toValue] = valueToState(value.raw.from, value.raw.to, timeZone);\n setFrom(fromValue);\n setTo(toValue);\n }, [value.raw.from, value.raw.to, timeZone]);\n\n const onOpen = useCallback(\n (event: FormEvent<HTMLElement>) => {\n event.preventDefault();\n setOpen(true);\n },\n [setOpen]\n );\n\n const onApply = useCallback(\n (e: FormEvent<HTMLButtonElement>) => {\n e.preventDefault();\n if (to.invalid || from.invalid) {\n return;\n }\n\n const raw: RawTimeRange = { from: from.value, to: to.value };\n const timeRange = rangeUtil.convertRawToRange(raw, timeZone, fiscalYearStartMonth);\n\n onApplyFromProps(timeRange);\n },\n [from.invalid, from.value, onApplyFromProps, timeZone, to.invalid, to.value, fiscalYearStartMonth]\n );\n\n const onChange = useCallback(\n (from: DateTime | string, to: DateTime | string) => {\n const [fromValue, toValue] = valueToState(from, to, timeZone);\n setFrom(fromValue);\n setTo(toValue);\n },\n [timeZone]\n );\n\n const fiscalYear = rangeUtil.convertRawToRange({ from: 'now/fy', to: 'now/fy' }, timeZone, fiscalYearStartMonth);\n\n const fyTooltip = (\n <div className={style.tooltip}>\n {rangeUtil.isFiscal(value) ? (\n <Tooltip content={`Fiscal year: ${fiscalYear.from.format('MMM-DD')} - ${fiscalYear.to.format('MMM-DD')}`}>\n <Icon name=\"info-circle\" />\n </Tooltip>\n ) : null}\n </div>\n );\n\n const icon = (\n <Button\n aria-label={selectors.components.TimePicker.calendar.openButton}\n icon=\"calendar-alt\"\n variant=\"secondary\"\n onClick={onOpen}\n />\n );\n\n return (\n <div>\n <div className={style.fieldContainer}>\n <Field label=\"From\" invalid={from.invalid} error={from.errorMessage}>\n <Input\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => onChange(event.currentTarget.value, to.value)}\n addonAfter={icon}\n aria-label={selectors.components.TimePicker.fromField}\n value={from.value}\n />\n </Field>\n {fyTooltip}\n </div>\n <div className={style.fieldContainer}>\n <Field label=\"To\" invalid={to.invalid} error={to.errorMessage}>\n <Input\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => onChange(from.value, event.currentTarget.value)}\n addonAfter={icon}\n aria-label={selectors.components.TimePicker.toField}\n value={to.value}\n />\n </Field>\n {fyTooltip}\n </div>\n <Button data-testid={selectors.components.TimePicker.applyTimeRange} onClick={onApply}>\n Apply time range\n </Button>\n\n <TimePickerCalendar\n isFullscreen={isFullscreen}\n isOpen={isOpen}\n from={dateTimeParse(from.value)}\n to={dateTimeParse(to.value)}\n onApply={onApply}\n onClose={() => setOpen(false)}\n onChange={onChange}\n timeZone={timeZone}\n isReversed={isReversed}\n />\n </div>\n );\n};\n\nfunction isRangeInvalid(from: string, to: string, timezone?: string): boolean {\n const raw: RawTimeRange = { from, to };\n const timeRange = rangeUtil.convertRawToRange(raw, timezone);\n const valid = timeRange.from.isSame(timeRange.to) || timeRange.from.isBefore(timeRange.to);\n\n return !valid;\n}\n\nfunction valueToState(\n rawFrom: DateTime | string,\n rawTo: DateTime | string,\n timeZone?: TimeZone\n): [InputState, InputState] {\n const fromValue = valueAsString(rawFrom, timeZone);\n const toValue = valueAsString(rawTo, timeZone);\n const fromInvalid = !isValid(fromValue, false, timeZone);\n const toInvalid = !isValid(toValue, true, timeZone);\n // If \"To\" is invalid, we should not check the range anyways\n const rangeInvalid = isRangeInvalid(fromValue, toValue, timeZone) && !toInvalid;\n\n return [\n {\n value: fromValue,\n invalid: fromInvalid || rangeInvalid,\n errorMessage: rangeInvalid && !fromInvalid ? ERROR_MESSAGES.range : ERROR_MESSAGES.default,\n },\n { value: toValue, invalid: toInvalid, errorMessage: ERROR_MESSAGES.default },\n ];\n}\n\nfunction valueAsString(value: DateTime | string, timeZone?: TimeZone): string {\n if (isDateTime(value)) {\n return dateTimeFormat(value, { timeZone });\n }\n return value;\n}\n\nfunction isValid(value: string, roundUp?: boolean, timeZone?: TimeZone): boolean {\n if (isDateTime(value)) {\n return value.isValid();\n }\n\n if (dateMath.isMathString(value)) {\n return dateMath.isValid(value);\n }\n\n const parsed = dateTimeParse(value, { roundUp, timeZone });\n return parsed.isValid();\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n fieldContainer: css`\n display: flex;\n `,\n tooltip: css`\n padding-left: ${theme.spacing(1)};\n padding-top: ${theme.spacing(3)};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport React, { memo } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { GrafanaTheme2, TimeOption } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { getFocusStyles } from '../../../themes/mixins';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n display: flex;\n align-items: center;\n flex-direction: row-reverse;\n justify-content: space-between;\n padding: 7px 9px 7px 9px;\n\n &:hover {\n background: ${theme.colors.action.hover};\n cursor: pointer;\n }\n `,\n selected: css`\n background: ${theme.colors.action.selected};\n font-weight: ${theme.typography.fontWeightMedium};\n `,\n radio: css`\n opacity: 0;\n\n &:focus-visible + label {\n ${getFocusStyles(theme)};\n }\n `,\n label: css`\n cursor: pointer;\n `,\n };\n};\n\ninterface Props {\n value: TimeOption;\n selected?: boolean;\n onSelect: (option: TimeOption) => void;\n /**\n * Input identifier. This should be the same for all options in a group.\n */\n name: string;\n}\n\nexport const TimeRangeOption = memo<Props>(({ value, onSelect, selected = false, name }) => {\n const styles = useStyles2(getStyles);\n // In case there are more of the same timerange in the list\n const id = uuidv4();\n\n return (\n <li onClick={() => onSelect(value)} className={cx(styles.container, selected && styles.selected)}>\n <input\n className={styles.radio}\n checked={selected}\n name={name}\n type=\"checkbox\"\n id={id}\n onChange={() => onSelect(value)}\n />\n <label className={styles.label} htmlFor={id}>\n {value.display}\n </label>\n </li>\n );\n});\n\nTimeRangeOption.displayName = 'TimeRangeOption';\n","import { css } from '@emotion/css';\nimport React, { ReactNode } from 'react';\n\nimport { TimeOption } from '@grafana/data';\n\nimport { stylesFactory } from '../../../themes';\n\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { TimeRangeOption } from './TimeRangeOption';\n\nconst getStyles = stylesFactory(() => {\n return {\n title: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 16px 5px 9px;\n `,\n };\n});\n\nconst getOptionsStyles = stylesFactory(() => {\n return {\n grow: css`\n flex-grow: 1;\n align-items: flex-start;\n `,\n };\n});\n\ninterface Props {\n title?: string;\n options: TimeOption[];\n value?: TimeOption;\n onChange: (option: TimeOption) => void;\n placeholderEmpty?: ReactNode;\n}\n\nexport const TimeRangeList: React.FC<Props> = (props) => {\n const styles = getStyles();\n const { title, options, placeholderEmpty } = props;\n\n if (typeof placeholderEmpty !== 'undefined' && options.length <= 0) {\n return <>{placeholderEmpty}</>;\n }\n\n if (!title) {\n return <Options {...props} />;\n }\n\n return (\n <section aria-label={title}>\n <fieldset>\n <div className={styles.title}>\n <TimePickerTitle>{title}</TimePickerTitle>\n </div>\n <Options {...props} />\n </fieldset>\n </section>\n );\n};\n\nconst Options: React.FC<Props> = ({ options, value, onChange, title }) => {\n const styles = getOptionsStyles();\n\n return (\n <>\n <ul aria-roledescription=\"Time range selection\">\n {options.map((option, index) => (\n <TimeRangeOption\n key={keyForOption(option, index)}\n value={option}\n selected={isEqual(option, value)}\n onSelect={onChange}\n name={title ?? 'Time ranges'}\n />\n ))}\n </ul>\n <div className={styles.grow} />\n </>\n );\n};\n\nfunction keyForOption(option: TimeOption, index: number): string {\n return `${option.from}-${option.to}-${index}`;\n}\n\nfunction isEqual(x: TimeOption, y?: TimeOption): boolean {\n if (!y || !x) {\n return false;\n }\n return y.from === x.from && y.to === x.to;\n}\n","import { TimeOption, TimeRange, TimeZone, rangeUtil, dateTimeFormat } from '@grafana/data';\n\nexport const mapOptionToTimeRange = (option: TimeOption, timeZone?: TimeZone): TimeRange => {\n return rangeUtil.convertRawToRange({ from: option.from, to: option.to }, timeZone);\n};\n\nexport const mapRangeToTimeOption = (range: TimeRange, timeZone?: TimeZone): TimeOption => {\n const from = dateTimeFormat(range.from, { timeZone });\n const to = dateTimeFormat(range.to, { timeZone });\n\n return {\n from,\n to,\n display: `${from} to ${to}`,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { memo, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, isDateTime, rangeUtil, RawTimeRange, TimeOption, TimeRange, TimeZone } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { FilterInput } from '../..';\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { getFocusStyles } from '../../../themes/mixins';\nimport { CustomScrollbar } from '../../CustomScrollbar/CustomScrollbar';\nimport { Icon } from '../../Icon/Icon';\n\nimport { TimePickerFooter } from './TimePickerFooter';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { TimeRangeForm } from './TimeRangeForm';\nimport { TimeRangeList } from './TimeRangeList';\nimport { mapOptionToTimeRange, mapRangeToTimeOption } from './mapper';\n\ninterface Props {\n value: TimeRange;\n onChange: (timeRange: TimeRange) => void;\n onChangeTimeZone: (timeZone: TimeZone) => void;\n onChangeFiscalYearStartMonth?: (month: number) => void;\n timeZone?: TimeZone;\n fiscalYearStartMonth?: number;\n quickOptions?: TimeOption[];\n history?: TimeRange[];\n showHistory?: boolean;\n className?: string;\n hideTimeZone?: boolean;\n /** Reverse the order of relative and absolute range pickers. Used to left align the picker in forms */\n isReversed?: boolean;\n hideQuickRanges?: boolean;\n widthOverride?: number;\n}\n\nexport interface PropsWithScreenSize extends Props {\n isFullscreen: boolean;\n}\n\ninterface FormProps extends Omit<Props, 'history'> {\n historyOptions?: TimeOption[];\n}\n\nexport const TimePickerContentWithScreenSize: React.FC<PropsWithScreenSize> = (props) => {\n const {\n quickOptions = [],\n isReversed,\n isFullscreen,\n hideQuickRanges,\n timeZone,\n fiscalYearStartMonth,\n value,\n onChange,\n history,\n showHistory,\n className,\n hideTimeZone,\n onChangeTimeZone,\n onChangeFiscalYearStartMonth,\n } = props;\n const isHistoryEmpty = !history?.length;\n const isContainerTall =\n (isFullscreen && showHistory) || (!isFullscreen && ((showHistory && !isHistoryEmpty) || !hideQuickRanges));\n const theme = useTheme2();\n const styles = getStyles(theme, isReversed, hideQuickRanges, isContainerTall, isFullscreen);\n const historyOptions = mapToHistoryOptions(history, timeZone);\n const timeOption = useTimeOption(value.raw, quickOptions);\n const [searchTerm, setSearchQuery] = useState('');\n\n const filteredQuickOptions = quickOptions.filter((o) => o.display.toLowerCase().includes(searchTerm.toLowerCase()));\n\n const onChangeTimeOption = (timeOption: TimeOption) => {\n return onChange(mapOptionToTimeRange(timeOption));\n };\n\n return (\n <div id=\"TimePickerContent\" className={cx(styles.container, className)}>\n <div className={styles.body}>\n {(!isFullscreen || !hideQuickRanges) && (\n <div className={styles.rightSide}>\n <div className={styles.timeRangeFilter}>\n <FilterInput\n width={0}\n autoFocus={true}\n value={searchTerm}\n onChange={setSearchQuery}\n placeholder={'Search quick ranges'}\n />\n </div>\n <CustomScrollbar>\n {!isFullscreen && <NarrowScreenForm {...props} historyOptions={historyOptions} />}\n {!hideQuickRanges && (\n <TimeRangeList options={filteredQuickOptions} onChange={onChangeTimeOption} value={timeOption} />\n )}\n </CustomScrollbar>\n </div>\n )}\n {isFullscreen && (\n <div className={styles.leftSide}>\n <FullScreenForm {...props} historyOptions={historyOptions} />\n </div>\n )}\n </div>\n {!hideTimeZone && isFullscreen && (\n <TimePickerFooter\n timeZone={timeZone}\n fiscalYearStartMonth={fiscalYearStartMonth}\n onChangeTimeZone={onChangeTimeZone}\n onChangeFiscalYearStartMonth={onChangeFiscalYearStartMonth}\n />\n )}\n </div>\n );\n};\n\nexport const TimePickerContent: React.FC<Props> = (props) => {\n const { widthOverride } = props;\n const theme = useTheme2();\n const isFullscreen = (widthOverride || window.innerWidth) >= theme.breakpoints.values.lg;\n return <TimePickerContentWithScreenSize {...props} isFullscreen={isFullscreen} />;\n};\n\nconst NarrowScreenForm: React.FC<FormProps> = (props) => {\n const { value, hideQuickRanges, onChange, timeZone, historyOptions = [], showHistory } = props;\n const theme = useTheme2();\n const styles = getNarrowScreenStyles(theme);\n const isAbsolute = isDateTime(value.raw.from) || isDateTime(value.raw.to);\n const [collapsedFlag, setCollapsedFlag] = useState(!isAbsolute);\n const collapsed = hideQuickRanges ? false : collapsedFlag;\n\n const onChangeTimeOption = (timeOption: TimeOption) => {\n return onChange(mapOptionToTimeRange(timeOption));\n };\n\n return (\n <fieldset>\n <div className={styles.header}>\n <button\n type={'button'}\n className={styles.expandButton}\n onClick={() => {\n if (!hideQuickRanges) {\n setCollapsedFlag(!collapsed);\n }\n }}\n data-testid={selectors.components.TimePicker.absoluteTimeRangeTitle}\n aria-expanded={!collapsed}\n aria-controls=\"expanded-timerange\"\n >\n <TimePickerTitle>Absolute time range</TimePickerTitle>\n {!hideQuickRanges && <Icon name={!collapsed ? 'angle-up' : 'angle-down'} />}\n </button>\n </div>\n {!collapsed && (\n <div className={styles.body} id=\"expanded-timerange\">\n <div className={styles.form}>\n <TimeRangeForm value={value} onApply={onChange} timeZone={timeZone} isFullscreen={false} />\n </div>\n {showHistory && (\n <TimeRangeList\n title=\"Recently used absolute ranges\"\n options={historyOptions}\n onChange={onChangeTimeOption}\n placeholderEmpty={null}\n />\n )}\n </div>\n )}\n </fieldset>\n );\n};\n\nconst FullScreenForm: React.FC<FormProps> = (props) => {\n const { onChange, value, timeZone, fiscalYearStartMonth, isReversed, historyOptions } = props;\n const theme = useTheme2();\n const styles = getFullScreenStyles(theme, props.hideQuickRanges);\n const onChangeTimeOption = (timeOption: TimeOption) => {\n return onChange(mapOptionToTimeRange(timeOption));\n };\n\n return (\n <>\n <div className={styles.container}>\n <div className={styles.title} data-testid={selectors.components.TimePicker.absoluteTimeRangeTitle}>\n <TimePickerTitle>Absolute time range</TimePickerTitle>\n </div>\n <TimeRangeForm\n value={value}\n timeZone={timeZone}\n fiscalYearStartMonth={fiscalYearStartMonth}\n onApply={onChange}\n isFullscreen={true}\n isReversed={isReversed}\n />\n </div>\n {props.showHistory && (\n <div className={styles.recent}>\n <TimeRangeList\n title=\"Recently used absolute ranges\"\n options={historyOptions || []}\n onChange={onChangeTimeOption}\n placeholderEmpty={<EmptyRecentList />}\n />\n </div>\n )}\n </>\n );\n};\n\nconst EmptyRecentList = memo(() => {\n const theme = useTheme2();\n const styles = getEmptyListStyles(theme);\n\n return (\n <div className={styles.container}>\n <div>\n <span>\n It looks like you haven't used this time picker before. As soon as you enter some time intervals,\n recently used intervals will appear here.\n </span>\n </div>\n <div>\n <a\n className={styles.link}\n href=\"https://grafana.com/docs/grafana/latest/dashboards/time-range-controls\"\n target=\"_new\"\n >\n Read the documentation\n </a>\n <span> to find out more about how to enter custom time ranges.</span>\n </div>\n </div>\n );\n});\n\nfunction mapToHistoryOptions(ranges?: TimeRange[], timeZone?: TimeZone): TimeOption[] {\n if (!Array.isArray(ranges) || ranges.length === 0) {\n return [];\n }\n return ranges.slice(ranges.length - 4).map((range) => mapRangeToTimeOption(range, timeZone));\n}\n\nEmptyRecentList.displayName = 'EmptyRecentList';\n\nconst useTimeOption = (raw: RawTimeRange, quickOptions: TimeOption[]): TimeOption | undefined => {\n return useMemo(() => {\n if (!rangeUtil.isRelativeTimeRange(raw)) {\n return;\n }\n return quickOptions.find((option) => {\n return option.from === raw.from && option.to === raw.to;\n });\n }, [raw, quickOptions]);\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, isReversed, hideQuickRanges, isContainerTall, isFullscreen) => {\n return {\n container: css`\n background: ${theme.colors.background.primary};\n box-shadow: ${theme.shadows.z3};\n position: absolute;\n z-index: ${theme.zIndex.dropdown};\n width: ${isFullscreen ? '546px' : '262px'};\n top: 116%;\n border-radius: 2px;\n border: 1px solid ${theme.colors.border.weak};\n ${isReversed ? 'left' : 'right'}: 0;\n `,\n body: css`\n display: flex;\n flex-direction: row-reverse;\n height: ${isContainerTall ? '381px' : '217px'};\n `,\n leftSide: css`\n display: flex;\n flex-direction: column;\n border-right: ${isReversed ? 'none' : `1px solid ${theme.colors.border.weak}`};\n width: ${!hideQuickRanges ? '60%' : '100%'};\n overflow: hidden;\n order: ${isReversed ? 1 : 0};\n `,\n rightSide: css`\n width: ${isFullscreen ? '40%' : '100%'}; !important;\n border-right: ${isReversed ? `1px solid ${theme.colors.border.weak}` : 'none'};\n display: flex;\n flex-direction: column;\n `,\n timeRangeFilter: css`\n padding: ${theme.spacing(1)};\n `,\n spacing: css`\n margin-top: 16px;\n `,\n };\n});\n\nconst getNarrowScreenStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n header: css`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid ${theme.colors.border.weak};\n padding: 7px 9px 7px 9px;\n `,\n expandButton: css`\n background-color: transparent;\n border: none;\n display: flex;\n width: 100%;\n\n &:focus-visible {\n ${getFocusStyles(theme)}\n }\n `,\n body: css`\n border-bottom: 1px solid ${theme.colors.border.weak};\n `,\n form: css`\n padding: 7px 9px 7px 9px;\n `,\n };\n});\n\nconst getFullScreenStyles = stylesFactory((theme: GrafanaTheme2, hideQuickRanges?: boolean) => {\n return {\n container: css`\n padding-top: 9px;\n padding-left: 11px;\n padding-right: ${!hideQuickRanges ? '20%' : '11px'};\n `,\n title: css`\n margin-bottom: 11px;\n `,\n recent: css`\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n padding-top: ${theme.spacing(1)};\n `,\n };\n});\n\nconst getEmptyListStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n container: css`\n padding: 12px;\n margin: 12px;\n\n a,\n span {\n font-size: 13px;\n }\n `,\n link: css`\n color: ${theme.colors.text.link};\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport React, { memo, FormEvent, createRef, useState, ReactElement } from 'react';\n\nimport {\n isDateTime,\n rangeUtil,\n GrafanaTheme,\n dateTimeFormat,\n timeZoneFormatUserFriendly,\n TimeRange,\n TimeZone,\n dateMath,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { withTheme, useTheme } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { Themeable } from '../../types';\nimport { ButtonGroup } from '../Button';\nimport { ToolbarButton } from '../ToolbarButton';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nimport { TimePickerContent } from './TimeRangePicker/TimePickerContent';\nimport { quickOptions } from './options';\n\n/** @public */\nexport interface TimeRangePickerProps extends Themeable {\n hideText?: boolean;\n value: TimeRange;\n timeZone?: TimeZone;\n fiscalYearStartMonth?: number;\n timeSyncButton?: JSX.Element;\n isSynced?: boolean;\n onChange: (timeRange: TimeRange) => void;\n onChangeTimeZone: (timeZone: TimeZone) => void;\n onChangeFiscalYearStartMonth?: (month: number) => void;\n onMoveBackward: () => void;\n onMoveForward: () => void;\n onZoom: () => void;\n history?: TimeRange[];\n hideQuickRanges?: boolean;\n widthOverride?: number;\n}\n\nexport interface State {\n isOpen: boolean;\n}\n\nexport function UnthemedTimeRangePicker(props: TimeRangePickerProps): ReactElement {\n const [isOpen, setOpen] = useState(false);\n\n const {\n value,\n onMoveBackward,\n onMoveForward,\n onZoom,\n timeZone,\n fiscalYearStartMonth,\n timeSyncButton,\n isSynced,\n theme,\n history,\n onChangeTimeZone,\n onChangeFiscalYearStartMonth,\n hideQuickRanges,\n widthOverride,\n } = props;\n\n const onChange = (timeRange: TimeRange) => {\n props.onChange(timeRange);\n setOpen(false);\n };\n\n const onOpen = (event: FormEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n event.preventDefault();\n setOpen(!isOpen);\n };\n\n const onClose = () => {\n setOpen(false);\n };\n\n const ref = createRef<HTMLElement>();\n const { overlayProps } = useOverlay({ onClose, isDismissable: true, isOpen }, ref);\n const { dialogProps } = useDialog({}, ref);\n\n const styles = getStyles(theme);\n const hasAbsolute = isDateTime(value.raw.from) || isDateTime(value.raw.to);\n const variant = isSynced ? 'active' : 'default';\n\n return (\n <ButtonGroup className={styles.container}>\n {hasAbsolute && (\n <ToolbarButton\n aria-label=\"Move time range backwards\"\n variant={variant}\n onClick={onMoveBackward}\n icon=\"angle-left\"\n narrow\n />\n )}\n\n <Tooltip content={<TimePickerTooltip timeRange={value} timeZone={timeZone} />} placement=\"bottom\" interactive>\n <ToolbarButton\n data-testid={selectors.components.TimePicker.openButton}\n aria-label={`Time range picker with current time range ${formattedRange(value, timeZone)} selected`}\n aria-controls=\"TimePickerContent\"\n onClick={onOpen}\n icon=\"clock-nine\"\n isOpen={isOpen}\n variant={variant}\n >\n <TimePickerButtonLabel {...props} />\n </ToolbarButton>\n </Tooltip>\n {isOpen && (\n <FocusScope contain autoFocus>\n <section ref={ref} {...overlayProps} {...dialogProps}>\n <TimePickerContent\n timeZone={timeZone}\n fiscalYearStartMonth={fiscalYearStartMonth}\n value={value}\n onChange={onChange}\n quickOptions={quickOptions}\n history={history}\n showHistory\n widthOverride={widthOverride}\n onChangeTimeZone={onChangeTimeZone}\n onChangeFiscalYearStartMonth={onChangeFiscalYearStartMonth}\n hideQuickRanges={hideQuickRanges}\n />\n </section>\n </FocusScope>\n )}\n\n {timeSyncButton}\n\n {hasAbsolute && (\n <ToolbarButton\n aria-label=\"Move time range forwards\"\n onClick={onMoveForward}\n icon=\"angle-right\"\n narrow\n variant={variant}\n />\n )}\n\n <Tooltip content={ZoomOutTooltip} placement=\"bottom\">\n <ToolbarButton aria-label=\"Zoom out time range\" onClick={onZoom} icon=\"search-minus\" variant={variant} />\n </Tooltip>\n </ButtonGroup>\n );\n}\n\nconst ZoomOutTooltip = () => (\n <>\n Time range zoom out <br /> CTRL+Z\n </>\n);\n\nconst TimePickerTooltip = ({ timeRange, timeZone }: { timeRange: TimeRange; timeZone?: TimeZone }) => {\n const theme = useTheme();\n const styles = getLabelStyles(theme);\n\n return (\n <>\n {dateTimeFormat(timeRange.from, { timeZone })}\n <div className=\"text-center\">to</div>\n {dateTimeFormat(timeRange.to, { timeZone })}\n <div className=\"text-center\">\n <span className={styles.utc}>{timeZoneFormatUserFriendly(timeZone)}</span>\n </div>\n </>\n );\n};\n\ntype LabelProps = Pick<TimeRangePickerProps, 'hideText' | 'value' | 'timeZone'>;\n\nexport const TimePickerButtonLabel = memo<LabelProps>(({ hideText, value, timeZone }) => {\n const theme = useTheme();\n const styles = getLabelStyles(theme);\n\n if (hideText) {\n return null;\n }\n\n return (\n <span className={styles.container}>\n <span>{formattedRange(value, timeZone)}</span>\n <span className={styles.utc}>{rangeUtil.describeTimeRangeAbbreviation(value, timeZone)}</span>\n </span>\n );\n});\n\nTimePickerButtonLabel.displayName = 'TimePickerButtonLabel';\n\nconst formattedRange = (value: TimeRange, timeZone?: TimeZone) => {\n const adjustedTimeRange = {\n to: dateMath.isMathString(value.raw.to) ? value.raw.to : value.to,\n from: dateMath.isMathString(value.raw.from) ? value.raw.from : value.from,\n };\n return rangeUtil.describeTimeRange(adjustedTimeRange, timeZone);\n};\n\n/** @public */\nexport const TimeRangePicker = withTheme(UnthemedTimeRangePicker);\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n container: css`\n position: relative;\n display: flex;\n vertical-align: middle;\n `,\n };\n});\n\nconst getLabelStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n container: css`\n display: flex;\n align-items: center;\n white-space: nowrap;\n `,\n utc: css`\n color: ${theme.palette.orange};\n font-size: ${theme.typography.size.sm};\n padding-left: 6px;\n line-height: 28px;\n vertical-align: bottom;\n font-weight: ${theme.typography.weight.semibold};\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport RcTimePicker from 'rc-time-picker';\nimport React, { FC } from 'react';\n\nimport { dateTime, DateTime, dateTimeAsMoment, GrafanaTheme } from '@grafana/data';\n\nimport { Icon, useStyles } from '../../index';\nimport { stylesFactory } from '../../themes';\nimport { focusCss } from '../../themes/mixins';\nimport { inputSizes } from '../Forms/commonStyles';\nimport { FormInputSize } from '../Forms/types';\n\nexport interface Props {\n onChange: (value: DateTime) => void;\n value?: DateTime;\n showHour?: boolean;\n showSeconds?: boolean;\n minuteStep?: number;\n size?: FormInputSize;\n disabled?: boolean;\n}\n\nexport const TimeOfDayPicker: FC<Props> = ({\n minuteStep = 1,\n showHour = true,\n showSeconds = false,\n onChange,\n value,\n size = 'auto',\n disabled,\n}) => {\n const styles = useStyles(getStyles);\n\n return (\n <RcTimePicker\n className={cx(inputSizes()[size], styles.input)}\n popupClassName={styles.picker}\n defaultValue={dateTimeAsMoment()}\n onChange={(value: any) => onChange(dateTime(value))}\n allowEmpty={false}\n showSecond={showSeconds}\n value={dateTimeAsMoment(value)}\n showHour={showHour}\n minuteStep={minuteStep}\n inputIcon={<Caret wrapperStyle={styles.caretWrapper} />}\n disabled={disabled}\n />\n );\n};\n\ninterface CaretProps {\n wrapperStyle?: string;\n}\n\nconst Caret: FC<CaretProps> = ({ wrapperStyle = '' }) => {\n return (\n <div className={wrapperStyle}>\n <Icon name=\"angle-down\" />\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n const bgColor = theme.colors.formInputBg;\n const menuShadowColor = theme.colors.dropdownShadow;\n const optionBgHover = theme.colors.dropdownOptionHoverBg;\n const borderRadius = theme.border.radius.sm;\n const borderColor = theme.colors.formInputBorder;\n return {\n caretWrapper: css`\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n display: inline-block;\n text-align: right;\n color: ${theme.colors.textWeak};\n `,\n picker: css`\n .rc-time-picker-panel-select {\n font-size: 14px;\n background-color: ${bgColor};\n border-color: ${borderColor};\n li {\n outline-width: 2px;\n &.rc-time-picker-panel-select-option-selected {\n background-color: inherit;\n border: 1px solid ${theme.palette.orange};\n border-radius: ${borderRadius};\n }\n\n &:hover {\n background: ${optionBgHover};\n }\n }\n }\n\n .rc-time-picker-panel-inner {\n box-shadow: 0px 4px 4px ${menuShadowColor};\n background-color: ${bgColor};\n border-color: ${borderColor};\n border-radius: ${borderRadius};\n margin-top: 3px;\n\n .rc-time-picker-panel-input-wrap {\n margin-right: 2px;\n\n &,\n .rc-time-picker-panel-input {\n background-color: ${bgColor};\n padding-top: 2px;\n }\n }\n\n .rc-time-picker-panel-combobox {\n display: flex;\n }\n }\n `,\n input: css`\n .rc-time-picker-input {\n background-color: ${bgColor};\n border-radius: ${borderRadius};\n border-color: ${borderColor};\n height: ${theme.spacing.formInputHeight}px;\n\n &:focus {\n ${focusCss(theme)}\n }\n\n &:disabled {\n background-color: ${theme.colors.formInputBgDisabled};\n color: ${theme.colors.formInputDisabledText};\n border: 1px solid ${theme.colors.formInputBgDisabled};\n &:focus {\n box-shadow: none;\n }\n }\n }\n `,\n };\n});\n","import React, { useCallback } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { Select } from '../Select/Select';\n\nexport interface Props {\n onChange: (weekStart: string) => void;\n value: string;\n width?: number;\n autoFocus?: boolean;\n onBlur?: () => void;\n includeInternal?: boolean;\n disabled?: boolean;\n inputId?: string;\n}\n\nconst weekStarts: Array<SelectableValue<string>> = [\n { value: '', label: 'Default' },\n { value: 'saturday', label: 'Saturday' },\n { value: 'sunday', label: 'Sunday' },\n { value: 'monday', label: 'Monday' },\n];\n\nexport const WeekStartPicker: React.FC<Props> = (props) => {\n const { onChange, width, autoFocus = false, onBlur, value, disabled = false, inputId } = props;\n\n const onChangeWeekStart = useCallback(\n (selectable: SelectableValue<string>) => {\n if (selectable.value !== undefined) {\n onChange(selectable.value);\n }\n },\n [onChange]\n );\n\n return (\n <Select\n inputId={inputId}\n value={weekStarts.find((item) => item.value === value)?.value}\n placeholder={selectors.components.WeekStartPicker.placeholder}\n autoFocus={autoFocus}\n openMenuOnFocus={true}\n width={width}\n options={weekStarts}\n onChange={onChangeWeekStart}\n onBlur={onBlur}\n disabled={disabled}\n />\n );\n};\n","import { css } from '@emotion/css';\nimport React, { memo } from 'react';\nimport Calendar from 'react-calendar';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\nimport { ClickOutsideWrapper } from '../../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { Icon } from '../../Icon/Icon';\nimport { getBodyStyles } from '../TimeRangePicker/CalendarBody';\n\n/** @public */\nexport interface DatePickerProps {\n isOpen?: boolean;\n onClose: () => void;\n onChange: (value: Date) => void;\n value?: Date;\n minDate?: Date;\n}\n\n/** @public */\nexport const DatePicker = memo<DatePickerProps>((props) => {\n const styles = useStyles2(getStyles);\n const { isOpen, onClose } = props;\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <ClickOutsideWrapper useCapture={true} includeButtonPress={false} onClick={onClose}>\n <div className={styles.modal} data-testid=\"date-picker\">\n <Body {...props} />\n </div>\n </ClickOutsideWrapper>\n );\n});\n\nDatePicker.displayName = 'DatePicker';\n\nconst Body = memo<DatePickerProps>(({ value, minDate, onChange }) => {\n const styles = useStyles2(getBodyStyles);\n\n return (\n <Calendar\n className={styles.body}\n tileClassName={styles.title}\n value={value || new Date()}\n minDate={minDate}\n nextLabel={<Icon name=\"angle-right\" />}\n prevLabel={<Icon name=\"angle-left\" />}\n onChange={(ev: Date | Date[]) => {\n if (!Array.isArray(ev)) {\n onChange(ev);\n }\n }}\n locale=\"en\"\n />\n );\n});\n\nBody.displayName = 'Body';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n modal: css`\n z-index: ${theme.zIndex.modal};\n position: absolute;\n box-shadow: ${theme.shadows.z3};\n background-color: ${theme.colors.background.primary};\n border: 1px solid ${theme.colors.border.weak};\n border-radius: 2px 0 0 2px;\n\n button:disabled {\n color: ${theme.colors.text.disabled};\n }\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { ChangeEvent } from 'react';\n\nimport { dateTime } from '@grafana/data';\n\nimport { useStyles } from '../../../themes';\nimport { Props as InputProps, Input } from '../../Input/Input';\nimport { DatePicker } from '../DatePicker/DatePicker';\n\nexport const formatDate = (date: Date | string) => dateTime(date).format('L');\n\n/** @public */\nexport interface DatePickerWithInputProps extends Omit<InputProps, 'ref' | 'value' | 'onChange'> {\n value?: Date | string;\n minDate?: Date;\n onChange: (value: Date | string) => void;\n /** Hide the calendar when date is selected */\n closeOnSelect?: boolean;\n placeholder?: string;\n}\n\n/** @public */\nexport const DatePickerWithInput = ({\n value,\n minDate,\n onChange,\n closeOnSelect,\n placeholder = 'Date',\n ...rest\n}: DatePickerWithInputProps) => {\n const [open, setOpen] = React.useState(false);\n const styles = useStyles(getStyles);\n\n return (\n <div className={styles.container}>\n <Input\n type=\"text\"\n autoComplete={'off'}\n placeholder={placeholder}\n value={value ? formatDate(value) : value}\n onClick={() => setOpen(true)}\n onChange={(ev: ChangeEvent<HTMLInputElement>) => {\n // Allow resetting the date\n if (ev.target.value === '') {\n onChange('');\n }\n }}\n className={styles.input}\n {...rest}\n />\n <DatePicker\n isOpen={open}\n value={value && typeof value !== 'string' ? value : dateTime().toDate()}\n minDate={minDate}\n onChange={(ev) => {\n onChange(ev);\n if (closeOnSelect) {\n setOpen(false);\n }\n }}\n onClose={() => setOpen(false)}\n />\n </div>\n );\n};\n\nconst getStyles = () => {\n return {\n container: css`\n position: relative;\n `,\n input: css`\n /* hides the native Calendar picker icon given when using type=date */\n input[type='date']::-webkit-inner-spin-button,\n input[type='date']::-webkit-calendar-picker-indicator {\n display: none;\n -webkit-appearance: none;\n `,\n };\n};\n","import { dateMath, dateTimeParse, isDateTime, TimeZone } from '@grafana/data';\n\nexport function isValid(value: string, roundUp?: boolean, timeZone?: TimeZone): boolean {\n if (isDateTime(value)) {\n return value.isValid();\n }\n\n if (dateMath.isMathString(value)) {\n return dateMath.isValid(value);\n }\n\n const parsed = dateTimeParse(value, { roundUp, timeZone });\n return parsed.isValid();\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC, FormEvent, ReactNode, useCallback, useEffect, useState } from 'react';\nimport Calendar from 'react-calendar';\nimport { useMedia } from 'react-use';\n\nimport { dateTimeFormat, DateTime, dateTime, GrafanaTheme2, isDateTime } from '@grafana/data';\n\nimport { Button, ClickOutsideWrapper, HorizontalGroup, Icon, InlineField, Input, Portal } from '../..';\nimport { useStyles2, useTheme2 } from '../../../themes';\nimport { TimeOfDayPicker } from '../TimeOfDayPicker';\nimport { getBodyStyles } from '../TimeRangePicker/CalendarBody';\nimport { getStyles as getCalendarStyles } from '../TimeRangePicker/TimePickerCalendar';\nimport { isValid } from '../utils';\n\nexport interface Props {\n /** Input date for the component */\n date?: DateTime;\n /** Callback for returning the selected date */\n onChange: (date: DateTime) => void;\n /** label for the input field */\n label?: ReactNode;\n /** Set the latest selectable date */\n maxDate?: Date;\n}\n\nconst stopPropagation = (event: React.MouseEvent<HTMLDivElement>) => event.stopPropagation();\n\nexport const DateTimePicker: FC<Props> = ({ date, maxDate, label, onChange }) => {\n const [isOpen, setOpen] = useState(false);\n\n const theme = useTheme2();\n const isFullscreen = useMedia(`(min-width: ${theme.breakpoints.values.lg}px)`);\n const containerStyles = useStyles2(getCalendarStyles);\n const styles = useStyles2(getStyles);\n\n const onApply = useCallback(\n (date: DateTime) => {\n setOpen(false);\n onChange(date);\n },\n [onChange]\n );\n\n const onOpen = useCallback(\n (event: FormEvent<HTMLElement>) => {\n event.preventDefault();\n setOpen(true);\n },\n [setOpen]\n );\n\n return (\n <div data-testid=\"date-time-picker\" style={{ position: 'relative' }}>\n <DateTimeInput date={date} onChange={onChange} isFullscreen={isFullscreen} onOpen={onOpen} label={label} />\n {isOpen ? (\n isFullscreen ? (\n <ClickOutsideWrapper onClick={() => setOpen(false)}>\n <DateTimeCalendar\n date={date}\n onChange={onApply}\n isFullscreen={true}\n onClose={() => setOpen(false)}\n maxDate={maxDate}\n />\n </ClickOutsideWrapper>\n ) : (\n <Portal>\n <ClickOutsideWrapper onClick={() => setOpen(false)}>\n <div className={styles.modal} onClick={stopPropagation}>\n <DateTimeCalendar date={date} onChange={onApply} isFullscreen={false} onClose={() => setOpen(false)} />\n </div>\n <div className={containerStyles.backdrop} onClick={stopPropagation} />\n </ClickOutsideWrapper>\n </Portal>\n )\n ) : null}\n </div>\n );\n};\n\ninterface DateTimeCalendarProps {\n date?: DateTime;\n onChange: (date: DateTime) => void;\n onClose: () => void;\n isFullscreen: boolean;\n maxDate?: Date;\n}\n\ninterface InputProps {\n label?: ReactNode;\n date?: DateTime;\n isFullscreen: boolean;\n onChange: (date: DateTime) => void;\n onOpen: (event: FormEvent<HTMLElement>) => void;\n}\n\ntype InputState = {\n value: string;\n invalid: boolean;\n};\n\nconst DateTimeInput: FC<InputProps> = ({ date, label, onChange, isFullscreen, onOpen }) => {\n const [internalDate, setInternalDate] = useState<InputState>(() => {\n return { value: date ? dateTimeFormat(date) : dateTimeFormat(dateTime()), invalid: false };\n });\n\n useEffect(() => {\n if (date) {\n setInternalDate({\n invalid: !isValid(dateTimeFormat(date)),\n value: isDateTime(date) ? dateTimeFormat(date) : date,\n });\n }\n }, [date]);\n\n const onChangeDate = useCallback((event: FormEvent<HTMLInputElement>) => {\n const isInvalid = !isValid(event.currentTarget.value);\n setInternalDate({\n value: event.currentTarget.value,\n invalid: isInvalid,\n });\n }, []);\n\n const onFocus = useCallback(\n (event: FormEvent<HTMLElement>) => {\n if (!isFullscreen) {\n return;\n }\n onOpen(event);\n },\n [isFullscreen, onOpen]\n );\n\n const onBlur = useCallback(() => {\n if (isDateTime(internalDate.value)) {\n onChange(dateTime(internalDate.value));\n }\n }, [internalDate.value, onChange]);\n\n const icon = <Button aria-label=\"Time picker\" icon=\"calendar-alt\" variant=\"secondary\" onClick={onOpen} />;\n return (\n <InlineField\n label={label}\n onClick={stopPropagation}\n invalid={!!(internalDate.value && internalDate.invalid)}\n className={css`\n margin-bottom: 0;\n `}\n >\n <Input\n onClick={stopPropagation}\n onChange={onChangeDate}\n addonAfter={icon}\n value={internalDate.value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid=\"date-time-input\"\n placeholder=\"Select date/time\"\n />\n </InlineField>\n );\n};\n\nconst DateTimeCalendar: FC<DateTimeCalendarProps> = ({ date, onClose, onChange, isFullscreen, maxDate }) => {\n const calendarStyles = useStyles2(getBodyStyles);\n const styles = useStyles2(getStyles);\n const [internalDate, setInternalDate] = useState<Date>(() => {\n if (date && date.isValid()) {\n return date.toDate();\n }\n\n return new Date();\n });\n\n const onChangeDate = useCallback((date: Date | Date[]) => {\n if (!Array.isArray(date)) {\n setInternalDate((prevState) => {\n // If we don't use time from prevState\n // the time will be reset to 00:00:00\n date.setHours(prevState.getHours());\n date.setMinutes(prevState.getMinutes());\n date.setSeconds(prevState.getSeconds());\n\n return date;\n });\n }\n }, []);\n\n const onChangeTime = useCallback((date: DateTime) => {\n setInternalDate(date.toDate());\n }, []);\n\n return (\n <div className={cx(styles.container, { [styles.fullScreen]: isFullscreen })} onClick={stopPropagation}>\n <Calendar\n next2Label={null}\n prev2Label={null}\n value={internalDate}\n nextLabel={<Icon name=\"angle-right\" />}\n nextAriaLabel=\"Next month\"\n prevLabel={<Icon name=\"angle-left\" />}\n prevAriaLabel=\"Previous month\"\n onChange={onChangeDate}\n locale=\"en\"\n className={calendarStyles.body}\n tileClassName={calendarStyles.title}\n maxDate={maxDate}\n />\n <div className={styles.time}>\n <TimeOfDayPicker showSeconds={true} onChange={onChangeTime} value={dateTime(internalDate)} />\n </div>\n <HorizontalGroup>\n <Button type=\"button\" onClick={() => onChange(dateTime(internalDate))}>\n Apply\n </Button>\n <Button variant=\"secondary\" type=\"button\" onClick={onClose}>\n Cancel\n </Button>\n </HorizontalGroup>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css`\n padding: ${theme.spacing(1)};\n border: 1px ${theme.colors.border.weak} solid;\n border-radius: ${theme.shape.borderRadius(1)};\n background-color: ${theme.colors.background.primary};\n z-index: ${theme.zIndex.modal};\n `,\n fullScreen: css`\n position: absolute;\n `,\n time: css`\n margin-bottom: ${theme.spacing(2)};\n `,\n modal: css`\n position: fixed;\n top: 25%;\n left: 25%;\n width: 100%;\n z-index: ${theme.zIndex.modal};\n max-width: 280px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { stylesFactory, useTheme } from '../../themes';\nimport { getTagColorsFromName } from '../../utils';\nimport { IconButton } from '../IconButton/IconButton';\n\ninterface Props {\n name: string;\n disabled?: boolean;\n onRemove: (tag: string) => void;\n}\n\nconst getStyles = stylesFactory(({ theme, name }: { theme: GrafanaTheme; name: string }) => {\n const { color, borderColor } = getTagColorsFromName(name);\n const height = theme.spacing.formInputHeight - 8;\n\n return {\n itemStyle: css`\n display: flex;\n align-items: center;\n height: ${height}px;\n line-height: ${height - 2}px;\n background-color: ${color};\n color: ${theme.palette.white};\n border: 1px solid ${borderColor};\n border-radius: 3px;\n padding: 0 ${theme.spacing.xs};\n margin-right: 3px;\n white-space: nowrap;\n text-shadow: none;\n font-weight: 500;\n font-size: ${theme.typography.size.sm};\n `,\n\n nameStyle: css`\n margin-right: 3px;\n `,\n\n buttonStyles: css`\n margin: 0;\n &:hover::before {\n display: none;\n }\n `,\n };\n});\n\n/**\n * @internal\n * Only used internally by TagsInput\n * */\nexport const TagItem: FC<Props> = ({ name, disabled, onRemove }) => {\n const theme = useTheme();\n const styles = getStyles({ theme, name });\n\n return (\n <div className={styles.itemStyle}>\n <span className={styles.nameStyle}>{name}</span>\n <IconButton\n name=\"times\"\n size=\"lg\"\n disabled={disabled}\n ariaLabel={`Remove ${name}`}\n onClick={() => onRemove(name)}\n type=\"button\"\n className={styles.buttonStyles}\n />\n </div>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { ChangeEvent, KeyboardEvent, FC, useState } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useStyles, useTheme2 } from '../../themes/ThemeContext';\nimport { Button } from '../Button';\nimport { Input } from '../Input/Input';\n\nimport { TagItem } from './TagItem';\n\nexport interface Props {\n placeholder?: string;\n /** Array of selected tags */\n tags?: string[];\n onChange: (tags: string[]) => void;\n width?: number;\n id?: string;\n className?: string;\n /** Toggle disabled state */\n disabled?: boolean;\n /** Enable adding new tags when input loses focus */\n addOnBlur?: boolean;\n /** Toggle invalid state */\n invalid?: boolean;\n}\n\nexport const TagsInput: FC<Props> = ({\n placeholder = 'New tag (enter key to add)',\n tags = [],\n onChange,\n width,\n className,\n disabled,\n addOnBlur,\n invalid,\n id,\n}) => {\n const [newTagName, setNewName] = useState('');\n const styles = useStyles(getStyles);\n const theme = useTheme2();\n\n const onNameChange = (event: ChangeEvent<HTMLInputElement>) => {\n setNewName(event.target.value);\n };\n\n const onRemove = (tagToRemove: string) => {\n onChange(tags.filter((x) => x !== tagToRemove));\n };\n\n const onAdd = (event?: React.MouseEvent) => {\n event?.preventDefault();\n if (!tags.includes(newTagName)) {\n onChange(tags.concat(newTagName));\n }\n setNewName('');\n };\n\n const onBlur = () => {\n if (addOnBlur && newTagName) {\n onAdd();\n }\n };\n\n const onKeyboardAdd = (event: KeyboardEvent) => {\n event.preventDefault();\n if (event.key === 'Enter' && newTagName !== '') {\n onChange(tags.concat(newTagName));\n setNewName('');\n }\n };\n\n return (\n <div className={cx(styles.wrapper, className, width ? css({ width: theme.spacing(width) }) : '')}>\n <div className={tags?.length ? styles.tags : undefined}>\n {tags?.map((tag: string, index: number) => {\n return <TagItem key={`${tag}-${index}`} name={tag} onRemove={onRemove} disabled={disabled} />;\n })}\n </div>\n <div>\n <Input\n id={id}\n disabled={disabled}\n placeholder={placeholder}\n onChange={onNameChange}\n value={newTagName}\n onKeyUp={onKeyboardAdd}\n onKeyDown={(e) => {\n // onKeyDown is triggered before onKeyUp, triggering submit behaviour on Enter press if this component\n // is used inside forms. Moving onKeyboardAdd callback here doesn't work since text input is not captured in onKeyDown\n if (e.key === 'Enter') {\n e.preventDefault();\n }\n }}\n onBlur={onBlur}\n invalid={invalid}\n suffix={\n newTagName.length > 0 && (\n <Button fill=\"text\" className={styles.addButtonStyle} onClick={onAdd} size=\"md\">\n Add\n </Button>\n )\n }\n />\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n wrapper: css`\n min-height: ${theme.spacing.formInputHeight}px;\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n `,\n tags: css`\n display: flex;\n justify-content: flex-start;\n flex-wrap: wrap;\n margin-right: ${theme.spacing.xs};\n `,\n addButtonStyle: css`\n margin: 0 -${theme.spacing.sm};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { useStyles2 } from '../../themes';\nimport { Button, ButtonVariant } from '../Button';\nimport { Icon } from '../Icon/Icon';\n\nexport interface Props {\n /** The current page index being shown. */\n currentPage: number;\n /** Number of total pages. */\n numberOfPages: number;\n /** Callback function for fetching the selected page. */\n onNavigate: (toPage: number) => void;\n /** When set to true and the pagination result is only one page it will not render the pagination at all. */\n hideWhenSinglePage?: boolean;\n /** Small version only shows the current page and the navigation buttons. */\n showSmallVersion?: boolean;\n className?: string;\n}\n\nexport const Pagination: React.FC<Props> = ({\n currentPage,\n numberOfPages,\n onNavigate,\n hideWhenSinglePage,\n showSmallVersion,\n className,\n}) => {\n const styles = useStyles2(getStyles);\n const pageLengthToCondense = showSmallVersion ? 1 : 8;\n\n const pageButtons = useMemo(() => {\n const pages = [...new Array(numberOfPages).keys()];\n\n const condensePages = numberOfPages > pageLengthToCondense;\n const getListItem = (page: number, variant: 'primary' | 'secondary') => (\n <li key={page} className={styles.item}>\n <Button size=\"sm\" variant={variant} onClick={() => onNavigate(page)}>\n {page}\n </Button>\n </li>\n );\n\n return pages.reduce<JSX.Element[]>((pagesToRender, pageIndex) => {\n const page = pageIndex + 1;\n const variant: ButtonVariant = page === currentPage ? 'primary' : 'secondary';\n\n // The indexes at which to start and stop condensing pages\n const lowerBoundIndex = pageLengthToCondense;\n const upperBoundIndex = numberOfPages - pageLengthToCondense + 1;\n // When the indexes overlap one another this number is negative\n const differenceOfBounds = upperBoundIndex - lowerBoundIndex;\n\n const isFirstOrLastPage = page === 1 || page === numberOfPages;\n // This handles when the lowerBoundIndex < currentPage < upperBoundIndex\n const currentPageIsBetweenBounds =\n differenceOfBounds > -1 && currentPage >= lowerBoundIndex && currentPage <= upperBoundIndex;\n\n // Show ellipsis after that many pages\n const ellipsisOffset = showSmallVersion ? 1 : 3;\n\n // The offset to show more pages when currentPageIsBetweenBounds\n const pageOffset = showSmallVersion ? 0 : 2;\n\n if (condensePages) {\n if (\n isFirstOrLastPage ||\n (currentPage < lowerBoundIndex && page < lowerBoundIndex) ||\n (differenceOfBounds >= 0 && currentPage > upperBoundIndex && page > upperBoundIndex) ||\n (differenceOfBounds < 0 && currentPage >= lowerBoundIndex && page > upperBoundIndex) ||\n (currentPageIsBetweenBounds && page >= currentPage - pageOffset && page <= currentPage + pageOffset)\n ) {\n // Renders a button for the page\n pagesToRender.push(getListItem(page, variant));\n } else if (\n (page === lowerBoundIndex && currentPage < lowerBoundIndex) ||\n (page === upperBoundIndex && currentPage > upperBoundIndex) ||\n (currentPageIsBetweenBounds &&\n (page === currentPage - ellipsisOffset || page === currentPage + ellipsisOffset))\n ) {\n // Renders and ellipsis to represent condensed pages\n pagesToRender.push(\n <li key={page} className={styles.item}>\n <Icon className={styles.ellipsis} name=\"ellipsis-v\" />\n </li>\n );\n }\n } else {\n pagesToRender.push(getListItem(page, variant));\n }\n return pagesToRender;\n }, []);\n }, [currentPage, numberOfPages, onNavigate, pageLengthToCondense, showSmallVersion, styles.ellipsis, styles.item]);\n\n if (hideWhenSinglePage && numberOfPages <= 1) {\n return null;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <ol>\n <li className={styles.item}>\n <Button\n aria-label=\"previous\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => onNavigate(currentPage - 1)}\n disabled={currentPage === 1}\n >\n <Icon name=\"angle-left\" />\n </Button>\n </li>\n {pageButtons}\n <li className={styles.item}>\n <Button\n aria-label=\"next\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={() => onNavigate(currentPage + 1)}\n disabled={currentPage === numberOfPages}\n >\n <Icon name=\"angle-right\" />\n </Button>\n </li>\n </ol>\n </div>\n );\n};\n\nconst getStyles = () => {\n return {\n container: css`\n float: right;\n `,\n item: css`\n display: inline-block;\n padding-left: 10px;\n margin-bottom: 5px;\n `,\n ellipsis: css`\n transform: rotate(90deg);\n `,\n };\n};\n","import { cx, css } from '@emotion/css';\nimport React, { forwardRef, HTMLAttributes } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { getTagColor, getTagColorsFromName } from '../../utils';\nimport { Icon } from '../Icon/Icon';\n\n/**\n * @public\n */\nexport type OnTagClick = (name: string, event: React.MouseEvent<HTMLElement>) => any;\n\nexport interface Props extends Omit<HTMLAttributes<HTMLElement>, 'onClick'> {\n /** Name of the tag to display */\n name: string;\n icon?: IconName;\n /** Use constant color from TAG_COLORS. Using index instead of color directly so we can match other styling. */\n colorIndex?: number;\n onClick?: OnTagClick;\n}\n\nexport const Tag = forwardRef<HTMLElement, Props>(({ name, onClick, icon, className, colorIndex, ...rest }, ref) => {\n const theme = useTheme();\n const styles = getTagStyles(theme, name, colorIndex);\n\n const onTagClick = (event: React.MouseEvent<HTMLElement>) => {\n event.preventDefault();\n event.stopPropagation();\n\n onClick?.(name, event);\n };\n\n const classes = cx(styles.wrapper, className, { [styles.hover]: onClick !== undefined });\n\n return onClick ? (\n <button {...rest} className={classes} onClick={onTagClick} ref={ref as React.ForwardedRef<HTMLButtonElement>}>\n {icon && <Icon name={icon} />}\n {name}\n </button>\n ) : (\n <span {...rest} className={classes} ref={ref}>\n {icon && <Icon name={icon} />}\n {name}\n </span>\n );\n});\n\nTag.displayName = 'Tag';\n\nconst getTagStyles = (theme: GrafanaTheme, name: string, colorIndex?: number) => {\n let colors;\n if (colorIndex === undefined) {\n colors = getTagColorsFromName(name);\n } else {\n colors = getTagColor(colorIndex);\n }\n return {\n wrapper: css`\n appearance: none;\n border-style: none;\n font-weight: ${theme.typography.weight.semibold};\n font-size: ${theme.typography.size.sm};\n line-height: ${theme.typography.lineHeight.xs};\n vertical-align: baseline;\n background-color: ${colors.color};\n color: ${theme.palette.gray98};\n white-space: nowrap;\n text-shadow: none;\n padding: 3px 6px;\n border-radius: ${theme.border.radius.md};\n `,\n hover: css`\n &:hover {\n opacity: 0.85;\n cursor: pointer;\n }\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { forwardRef, memo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes';\nimport { IconName } from '../../types/icon';\n\nimport { OnTagClick, Tag } from './Tag';\n\nexport interface Props {\n /** Maximum number of the tags to display */\n displayMax?: number;\n /** Names of the tags to display */\n tags: string[];\n /** Callback when the tag is clicked */\n onClick?: OnTagClick;\n /** Custom styles for the wrapper component */\n className?: string;\n /** aria-label for the `i`-th Tag component */\n getAriaLabel?: (name: string, i: number) => string;\n /** Icon to show next to tag label */\n icon?: IconName;\n}\n\nexport const TagList = memo(\n forwardRef<HTMLUListElement, Props>(({ displayMax, tags, icon, onClick, className, getAriaLabel }, ref) => {\n const theme = useTheme2();\n const styles = getStyles(theme, Boolean(displayMax && displayMax > 0));\n const numTags = tags.length;\n const tagsToDisplay = displayMax ? tags.slice(0, displayMax) : tags;\n return (\n <ul className={cx(styles.wrapper, className)} aria-label=\"Tags\" ref={ref}>\n {tagsToDisplay.map((tag, i) => (\n <li className={styles.li} key={tag}>\n <Tag name={tag} icon={icon} onClick={onClick} aria-label={getAriaLabel?.(tag, i)} data-tag-id={i} />\n </li>\n ))}\n {displayMax && displayMax > 0 && numTags - displayMax > 0 && (\n <span className={styles.moreTagsLabel}>+ {numTags - displayMax}</span>\n )}\n </ul>\n );\n })\n);\n\nTagList.displayName = 'TagList';\n\nconst getStyles = (theme: GrafanaTheme2, isTruncated: boolean) => {\n return {\n wrapper: css`\n position: relative;\n align-items: ${isTruncated ? 'center' : 'unset'};\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n flex-shrink: ${isTruncated ? 0 : 1};\n justify-content: flex-end;\n gap: 6px;\n `,\n moreTagsLabel: css`\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.size.sm};\n `,\n li: css({\n listStyle: 'none',\n }),\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\n\nexport interface FilterPillProps {\n selected: boolean;\n label: string;\n onClick: React.MouseEventHandler<HTMLElement>;\n icon?: IconName;\n}\n\nexport const FilterPill: React.FC<FilterPillProps> = ({ label, selected, onClick, icon = 'check' }) => {\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles.wrapper, selected && styles.selected)} onClick={onClick}>\n <span>{label}</span>\n {selected && <Icon name={icon} className={styles.icon} />}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n padding: ${theme.spacing(0.25)} ${theme.spacing(1)};\n background: ${theme.colors.background.secondary};\n border-radius: ${theme.shape.borderRadius(8)};\n padding: ${theme.spacing(0, 2)};\n font-weight: ${theme.typography.fontWeightMedium};\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.text.secondary};\n display: flex;\n align-items: center;\n height: 32px;\n cursor: pointer;\n\n &:hover {\n background: ${theme.colors.action.hover};\n color: ${theme.colors.text.primary};\n }\n `,\n selected: css`\n color: ${theme.colors.text.primary};\n background: ${theme.colors.action.selected};\n\n &:hover {\n background: ${theme.colors.action.focus};\n }\n `,\n icon: css`\n margin-left: ${theme.spacing(0.5)};\n `,\n };\n};\n","import React from 'react';\n\nimport { useStyles2 } from '../../themes';\nimport { IconName } from '../../types';\n\nimport { getModalStyles } from './getModalStyles';\n\ninterface Props {\n title: string;\n id?: string;\n /** @deprecated */\n icon?: IconName;\n /** @deprecated */\n iconTooltip?: string;\n}\n\n/** @internal */\nexport const ModalHeader: React.FC<Props> = ({ icon, iconTooltip, title, children, id }) => {\n const styles = useStyles2(getModalStyles);\n\n return (\n <>\n <h2 className={styles.modalHeaderTitle} id={id}>\n {title}\n </h2>\n {children}\n </>\n );\n};\n","import { cx } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { OverlayContainer, useOverlay } from '@react-aria/overlays';\nimport React, { PropsWithChildren, useRef } from 'react';\n\nimport { useTheme2 } from '../../themes';\nimport { IconName } from '../../types';\nimport { IconButton } from '../IconButton/IconButton';\nimport { HorizontalGroup } from '../Layout/Layout';\n\nimport { ModalHeader } from './ModalHeader';\nimport { getModalStyles } from './getModalStyles';\n\nexport interface Props {\n /** @deprecated no longer used */\n icon?: IconName;\n /** @deprecated no longer used */\n iconTooltip?: string;\n /** Title for the modal or custom header element */\n title: string | JSX.Element;\n className?: string;\n contentClassName?: string;\n closeOnEscape?: boolean;\n closeOnBackdropClick?: boolean;\n trapFocus?: boolean;\n\n isOpen?: boolean;\n onDismiss?: () => void;\n\n /** If not set will call onDismiss if that is set. */\n onClickBackdrop?: () => void;\n}\n\nexport function Modal(props: PropsWithChildren<Props>) {\n const {\n title,\n children,\n isOpen = false,\n closeOnEscape = true,\n closeOnBackdropClick = true,\n className,\n contentClassName,\n onDismiss,\n onClickBackdrop,\n trapFocus = true,\n } = props;\n const theme = useTheme2();\n const styles = getModalStyles(theme);\n\n const ref = useRef<HTMLDivElement>(null);\n\n // Handle interacting outside the dialog and pressing\n // the Escape key to close the modal.\n const { overlayProps, underlayProps } = useOverlay(\n { isKeyboardDismissDisabled: !closeOnEscape, isOpen, onClose: onDismiss },\n ref\n );\n\n // Get props for the dialog and its title\n const { dialogProps, titleProps } = useDialog({}, ref);\n\n if (!isOpen) {\n return null;\n }\n\n const headerClass = cx(styles.modalHeader, typeof title !== 'string' && styles.modalHeaderWithTabs);\n\n return (\n <OverlayContainer>\n <div\n className={styles.modalBackdrop}\n onClick={onClickBackdrop || (closeOnBackdropClick ? onDismiss : undefined)}\n {...underlayProps}\n />\n <FocusScope contain={trapFocus} autoFocus restoreFocus>\n <div className={cx(styles.modal, className)} ref={ref} {...overlayProps} {...dialogProps}>\n <div className={headerClass}>\n {typeof title === 'string' && <DefaultModalHeader {...props} title={title} id={titleProps.id} />}\n {\n // FIXME: custom title components won't get an accessible title.\n // Do we really want to support them or shall we just limit this ModalTabsHeader?\n typeof title !== 'string' && title\n }\n <div className={styles.modalHeaderClose}>\n <IconButton aria-label=\"Close dialogue\" name=\"times\" size=\"xl\" onClick={onDismiss} />\n </div>\n </div>\n <div className={cx(styles.modalContent, contentClassName)}>{children}</div>\n </div>\n </FocusScope>\n </OverlayContainer>\n );\n}\n\nfunction ModalButtonRow({ leftItems, children }: { leftItems?: React.ReactNode; children: React.ReactNode }) {\n const theme = useTheme2();\n const styles = getModalStyles(theme);\n\n if (leftItems) {\n return (\n <div className={styles.modalButtonRow}>\n <HorizontalGroup justify=\"space-between\">\n <HorizontalGroup justify=\"flex-start\" spacing=\"md\">\n {leftItems}\n </HorizontalGroup>\n <HorizontalGroup justify=\"flex-end\" spacing=\"md\">\n {children}\n </HorizontalGroup>\n </HorizontalGroup>\n </div>\n );\n }\n\n return (\n <div className={styles.modalButtonRow}>\n <HorizontalGroup justify=\"flex-end\" spacing=\"md\">\n {children}\n </HorizontalGroup>\n </div>\n );\n}\n\nModal.ButtonRow = ModalButtonRow;\n\ninterface DefaultModalHeaderProps {\n id?: string;\n title: string;\n icon?: IconName;\n iconTooltip?: string;\n}\n\nfunction DefaultModalHeader({ icon, iconTooltip, title, id }: DefaultModalHeaderProps): JSX.Element {\n return <ModalHeader icon={icon} iconTooltip={iconTooltip} title={title} id={id} />;\n}\n","import { css } from '@emotion/css';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { HorizontalGroup, Input } from '..';\nimport { useStyles2 } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { Button } from '../Button';\nimport { Modal } from '../Modal/Modal';\n\nexport interface ConfirmModalProps {\n /** Toggle modal's open/closed state */\n isOpen: boolean;\n /** Title for the modal header */\n title: string;\n /** Modal content */\n body: React.ReactNode;\n /** Modal description */\n description?: React.ReactNode;\n /** Text for confirm button */\n confirmText: string;\n /** Text for dismiss button */\n dismissText?: string;\n /** Icon for the modal header */\n icon?: IconName;\n /** Text user needs to fill in before confirming */\n confirmationText?: string;\n /** Text for alternative button */\n alternativeText?: string;\n /** Confirm action callback */\n onConfirm(): void;\n /** Dismiss action callback */\n onDismiss(): void;\n /** Alternative action callback */\n onAlternative?(): void;\n}\n\nexport const ConfirmModal = ({\n isOpen,\n title,\n body,\n description,\n confirmText,\n confirmationText,\n dismissText = 'Cancel',\n alternativeText,\n icon = 'exclamation-triangle',\n onConfirm,\n onDismiss,\n onAlternative,\n}: ConfirmModalProps): JSX.Element => {\n const [disabled, setDisabled] = useState(Boolean(confirmationText));\n const styles = useStyles2(getStyles);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const onConfirmationTextChange = (event: React.FormEvent<HTMLInputElement>) => {\n setDisabled(confirmationText?.localeCompare(event.currentTarget.value) !== 0);\n };\n\n useEffect(() => {\n // for some reason autoFocus property did no work on this button, but this does\n if (isOpen) {\n buttonRef.current?.focus();\n }\n }, [isOpen]);\n\n return (\n <Modal className={styles.modal} title={title} icon={icon} isOpen={isOpen} onDismiss={onDismiss}>\n <div className={styles.modalText}>\n {body}\n {description ? <div className={styles.modalDescription}>{description}</div> : null}\n {confirmationText ? (\n <div className={styles.modalConfirmationInput}>\n <HorizontalGroup>\n <Input placeholder={`Type ${confirmationText} to confirm`} onChange={onConfirmationTextChange} />\n </HorizontalGroup>\n </div>\n ) : null}\n </div>\n <Modal.ButtonRow>\n <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n {dismissText}\n </Button>\n <Button\n variant=\"destructive\"\n onClick={onConfirm}\n disabled={disabled}\n ref={buttonRef}\n aria-label={selectors.pages.ConfirmModal.delete}\n >\n {confirmText}\n </Button>\n {onAlternative ? (\n <Button variant=\"primary\" onClick={onAlternative}>\n {alternativeText}\n </Button>\n ) : null}\n </Modal.ButtonRow>\n </Modal>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n modal: css`\n width: 500px;\n `,\n modalText: css({\n fontSize: theme.typography.h5.fontSize,\n color: theme.colors.text.primary,\n }),\n modalDescription: css({\n fontSize: theme.typography.body.fontSize,\n }),\n modalConfirmationInput: css({\n paddingTop: theme.spacing(1),\n }),\n});\n","import { css, cx } from '@emotion/css';\nimport classnames from 'classnames';\nimport { debounce } from 'lodash';\nimport React, { Context } from 'react';\nimport { Value, Editor as CoreEditor } from 'slate';\nimport Plain from 'slate-plain-serializer';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Editor, Plugin } from '@grafana/slate-react';\n\nimport {\n makeValue,\n SCHEMA,\n CompletionItemGroup,\n TypeaheadOutput,\n TypeaheadInput,\n SuggestionsState,\n Themeable2,\n} from '../..';\nimport {\n ClearPlugin,\n NewlinePlugin,\n SelectionShortcutsPlugin,\n IndentationPlugin,\n ClipboardPlugin,\n RunnerPlugin,\n SuggestionsPlugin,\n} from '../../slate-plugins';\nimport { withTheme2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\n\nexport interface QueryFieldProps extends Themeable2 {\n additionalPlugins?: Plugin[];\n cleanText?: (text: string) => string;\n disabled?: boolean;\n // We have both value and local state. This is usually an antipattern but we need to keep local state\n // for perf reasons and also have outside value in for example in Explore redux that is mutable from logs\n // creating a two way binding.\n query?: string | null;\n onRunQuery?: () => void;\n onBlur?: () => void;\n onChange?: (value: string) => void;\n onRichValueChange?: (value: Value) => void;\n onClick?: (event: Event, editor: CoreEditor, next: () => any) => any;\n onTypeahead?: (typeahead: TypeaheadInput) => Promise<TypeaheadOutput>;\n onWillApplySuggestion?: (suggestion: string, state: SuggestionsState) => string;\n placeholder?: string;\n portalOrigin: string;\n syntax?: string;\n syntaxLoaded?: boolean;\n theme: GrafanaTheme2;\n}\n\nexport interface QueryFieldState {\n suggestions: CompletionItemGroup[];\n typeaheadContext: string | null;\n typeaheadPrefix: string;\n typeaheadText: string;\n value: Value;\n}\n\n/**\n * Renders an editor field.\n * Pass initial value as initialQuery and listen to changes in props.onValueChanged.\n * This component can only process strings. Internally it uses Slate Value.\n * Implement props.onTypeahead to use suggestions, see PromQueryField.tsx as an example.\n */\nexport class UnThemedQueryField extends React.PureComponent<QueryFieldProps, QueryFieldState> {\n plugins: Plugin[];\n runOnChangeDebounced: Function;\n lastExecutedValue: Value | null = null;\n mounted = false;\n editor: Editor | null = null;\n\n constructor(props: QueryFieldProps, context: Context<any>) {\n super(props, context);\n\n this.runOnChangeDebounced = debounce(this.runOnChange, 500);\n\n const { onTypeahead, cleanText, portalOrigin, onWillApplySuggestion } = props;\n\n // Base plugins\n this.plugins = [\n // SuggestionsPlugin and RunnerPlugin need to be before NewlinePlugin\n // because they override Enter behavior\n SuggestionsPlugin({ onTypeahead, cleanText, portalOrigin, onWillApplySuggestion }),\n RunnerPlugin({ handler: this.runOnChangeAndRunQuery }),\n NewlinePlugin(),\n ClearPlugin(),\n SelectionShortcutsPlugin(),\n IndentationPlugin(),\n ClipboardPlugin(),\n ...(props.additionalPlugins || []),\n ].filter((p) => p);\n\n this.state = {\n suggestions: [],\n typeaheadContext: null,\n typeaheadPrefix: '',\n typeaheadText: '',\n value: makeValue(props.query || '', props.syntax),\n };\n }\n\n componentDidMount() {\n this.mounted = true;\n }\n\n componentWillUnmount() {\n this.mounted = false;\n }\n\n componentDidUpdate(prevProps: QueryFieldProps, prevState: QueryFieldState) {\n const { query, syntax, syntaxLoaded } = this.props;\n\n if (!prevProps.syntaxLoaded && syntaxLoaded && this.editor) {\n // Need a bogus edit to re-render the editor after syntax has fully loaded\n const editor = this.editor.insertText(' ').deleteBackward(1);\n this.onChange(editor.value, true);\n }\n const { value } = this.state;\n\n // Handle two way binging between local state and outside prop.\n // if query changed from the outside\n if (query !== prevProps.query) {\n // and we have a version that differs\n if (query !== Plain.serialize(value)) {\n this.setState({ value: makeValue(query || '', syntax) });\n }\n }\n }\n\n /**\n * Update local state, propagate change upstream and optionally run the query afterwards.\n */\n onChange = (value: Value, runQuery?: boolean) => {\n const documentChanged = value.document !== this.state.value.document;\n const prevValue = this.state.value;\n if (this.props.onRichValueChange) {\n this.props.onRichValueChange(value);\n }\n\n // Update local state with new value and optionally change value upstream.\n this.setState({ value }, () => {\n // The diff is needed because the actual value of editor have much more metadata (for example text selection)\n // that is not passed upstream so every change of editor value does not mean change of the query text.\n if (documentChanged) {\n const textChanged = Plain.serialize(prevValue) !== Plain.serialize(value);\n if (textChanged && runQuery) {\n this.runOnChangeAndRunQuery();\n }\n if (textChanged && !runQuery) {\n // Debounce change propagation by default for perf reasons.\n this.runOnChangeDebounced();\n }\n }\n });\n };\n\n runOnChange = () => {\n const { onChange } = this.props;\n const value = Plain.serialize(this.state.value);\n if (onChange) {\n onChange(this.cleanText(value));\n }\n };\n\n runOnRunQuery = () => {\n const { onRunQuery } = this.props;\n\n if (onRunQuery) {\n onRunQuery();\n this.lastExecutedValue = this.state.value;\n }\n };\n\n runOnChangeAndRunQuery = () => {\n // onRunQuery executes query from Redux in Explore so it needs to be updated sync in case we want to run\n // the query.\n this.runOnChange();\n this.runOnRunQuery();\n };\n\n /**\n * We need to handle blur events here mainly because of dashboard panels which expect to have query executed on blur.\n */\n handleBlur = (event: Event, editor: CoreEditor, next: Function) => {\n const { onBlur } = this.props;\n\n if (onBlur) {\n onBlur();\n } else {\n // Run query by default on blur\n const previousValue = this.lastExecutedValue ? Plain.serialize(this.lastExecutedValue) : null;\n const currentValue = Plain.serialize(editor.value);\n\n if (previousValue !== currentValue) {\n this.runOnChangeAndRunQuery();\n }\n }\n return next();\n };\n\n cleanText(text: string) {\n // RegExp with invisible characters we want to remove - currently only carriage return (newlines are visible)\n const newText = text.replace(/[\\r]/g, '');\n return newText;\n }\n\n render() {\n const { disabled, theme } = this.props;\n const wrapperClassName = classnames('slate-query-field__wrapper', {\n 'slate-query-field__wrapper--disabled': disabled,\n });\n const styles = getStyles(theme);\n\n return (\n <div className={cx(wrapperClassName, styles.wrapper)}>\n <div className=\"slate-query-field\" aria-label={selectors.components.QueryField.container}>\n <Editor\n ref={(editor) => (this.editor = editor!)}\n schema={SCHEMA}\n autoCorrect={false}\n readOnly={this.props.disabled}\n onBlur={this.handleBlur}\n onClick={this.props.onClick}\n // onKeyDown={this.onKeyDown}\n onChange={(change: { value: Value }) => {\n this.onChange(change.value, false);\n }}\n placeholder={this.props.placeholder}\n plugins={this.plugins}\n spellCheck={false}\n value={this.state.value}\n />\n </div>\n </div>\n );\n }\n}\n\nexport const QueryField = withTheme2(UnThemedQueryField);\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const focusStyles = getFocusStyles(theme);\n return {\n wrapper: css`\n &:focus-within {\n ${focusStyles}\n }\n `,\n };\n};\n","import React from 'react';\n\nimport { ErrorWithStack, LoadingPlaceholder } from '..';\nimport { useAsyncDependency } from '../../utils/useAsyncDependency';\n\n// we only use import type so it will not be included in the bundle\nimport type { ReactMonacoEditorProps } from './types';\n\n/**\n * @internal\n * Experimental export\n **/\nexport const ReactMonacoEditorLazy = (props: ReactMonacoEditorProps) => {\n const { loading, error, dependency } = useAsyncDependency(\n import(/* webpackChunkName: \"react-monaco-editor\" */ './ReactMonacoEditor')\n );\n\n if (loading) {\n return <LoadingPlaceholder text={''} />;\n }\n\n if (error) {\n return (\n <ErrorWithStack\n title=\"React Monaco Editor failed to load\"\n error={error}\n errorInfo={{ componentStack: error?.stack || '' }}\n />\n );\n }\n\n const ReactMonacoEditor = dependency.ReactMonacoEditor;\n return <ReactMonacoEditor {...props} />;\n};\n","import { useAsync } from 'react-use';\n\n// Allows simple dynamic imports in the components\nexport const useAsyncDependency = (importStatement: Promise<any>) => {\n const state = useAsync(async () => {\n return await importStatement;\n });\n\n return {\n ...state,\n dependency: state.value,\n };\n};\n","// We use `import type` to guarantee it'll be erased from the JS and it doesnt accidently bundle monaco\nimport type { EditorProps } from '@monaco-editor/react';\nimport type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\n// we do not allow customizing the theme.\n// (theme is complicated in Monaco, right now there is\n// a limitation where all monaco editors must have\n// the same theme, see\n// https://github.com/microsoft/monaco-editor/issues/338#issuecomment-274837186\n// )\nexport type ReactMonacoEditorProps = Omit<EditorProps, 'theme'>;\n\nexport type CodeEditorChangeHandler = (value: string) => void;\nexport type CodeEditorSuggestionProvider = () => CodeEditorSuggestionItem[];\n\nexport type { monacoType as monacoTypes };\nexport type Monaco = typeof monacoType;\nexport type MonacoEditor = monacoType.editor.IStandaloneCodeEditor;\nexport type MonacoOptions = MonacoOptionsWithGrafanaDefaults;\n\nexport interface CodeEditorProps {\n value: string;\n language: string;\n width?: number | string;\n height?: number | string;\n\n readOnly?: boolean;\n showMiniMap?: boolean;\n showLineNumbers?: boolean;\n monacoOptions?: MonacoOptions;\n\n /**\n * Callback before the editor has mounted that gives you raw access to monaco\n */\n onBeforeEditorMount?: (monaco: Monaco) => void;\n\n /**\n * Callback after the editor has mounted that gives you raw access to monaco\n */\n onEditorDidMount?: (editor: MonacoEditor, monaco: Monaco) => void;\n\n /** Handler to be performed when editor is blurred */\n onBlur?: CodeEditorChangeHandler;\n\n /** Handler to be performed when Cmd/Ctrl+S is pressed */\n onSave?: CodeEditorChangeHandler;\n\n /**\n * Language agnostic suggestion completions -- typically for template variables\n */\n getSuggestions?: CodeEditorSuggestionProvider;\n\n containerStyles?: string;\n}\n\n/**\n * @alpha\n */\nexport enum CodeEditorSuggestionItemKind {\n Method = 'method',\n Field = 'field',\n Property = 'property',\n Constant = 'constant',\n Text = 'text',\n}\n\n/**\n * @alpha\n */\nexport interface CodeEditorSuggestionItem {\n /**\n * The label of this completion item. By default\n * this is also the text that is inserted when selecting\n * this completion.\n */\n label: string;\n\n /**\n * The kind of this completion item. An icon is chosen\n * by the editor based on the kind.\n */\n kind?: CodeEditorSuggestionItemKind;\n\n /**\n * A human-readable string with additional information\n * about this item, like type or symbol information.\n */\n detail?: string;\n\n /**\n * A human-readable string that represents a doc-comment.\n */\n documentation?: string; // | IMarkdownString;\n\n /**\n * A string or snippet that should be inserted in a document when selecting\n * this completion. When `falsy` the `label` is used.\n */\n insertText?: string;\n}\n\n/**\n * This interface will extend the original Monaco editor options interface\n * but changing the code comments to contain the proper default values to\n * prevent the consumer of the CodeEditor to get incorrect documentation in editor.\n */\nexport interface MonacoOptionsWithGrafanaDefaults extends monacoType.editor.IStandaloneEditorConstructionOptions {\n /**\n * Enable custom contextmenu.\n * Defaults to false.\n */\n contextmenu?: boolean;\n /**\n * The number of spaces a tab is equal to.\n * This setting is overridden based on the file contents when `detectIndentation` is on.\n * Defaults to 4.\n */\n tabSize?: number;\n /**\n * Show code lens\n * Defaults to false.\n */\n codeLens?: boolean;\n /**\n * Control the width of line numbers, by reserving horizontal space for rendering at least an amount of digits.\n * Defaults to 4.\n */\n lineNumbersMinChars?: number;\n /**\n * The width reserved for line decorations (in px).\n * Line decorations are placed between line numbers and the editor content.\n * You can pass in a string in the format floating point followed by \"ch\". e.g. 1.3ch.\n * Defaults to 1 * theme.spacing.gridSize.\n */\n lineDecorationsWidth?: number | string;\n /**\n * Controls if a border should be drawn around the overview ruler.\n * Defaults to `false`.\n */\n overviewRulerBorder?: boolean;\n /**\n * Enable that the editor will install an interval to check if its container dom node size has changed.\n * Enabling this might have a severe performance impact.\n * Defaults to true.\n */\n automaticLayout?: boolean;\n}\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\nimport { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind, CodeEditorSuggestionProvider, Monaco } from './types';\n\n/**\n * @internal -- only exported for tests\n */\nexport function findInsertIndex(line: string): { index: number; prefix: string } {\n for (let i = line.length - 1; i > 0; i--) {\n const ch = line.charAt(i);\n if (ch === '$') {\n return {\n index: i,\n prefix: line.substring(i),\n };\n }\n\n // Keep these seperators\n if (ch === ' ' || ch === '\\t' || ch === '\"' || ch === \"'\") {\n return {\n index: i + 1,\n prefix: line.substring(i + 1),\n };\n }\n }\n return {\n index: 0,\n prefix: line,\n };\n}\n\nfunction getCompletionItems(\n monaco: Monaco,\n prefix: string,\n suggestions: CodeEditorSuggestionItem[],\n range: monacoType.IRange\n): monacoType.languages.CompletionItem[] {\n const items: monacoType.languages.CompletionItem[] = [];\n for (const suggestion of suggestions) {\n if (prefix && !suggestion.label.startsWith(prefix)) {\n continue; // skip non-matching suggestions\n }\n\n items.push({\n ...suggestion,\n kind: mapKinds(monaco, suggestion.kind),\n range,\n insertText: suggestion.insertText ?? suggestion.label,\n });\n }\n return items;\n}\n\nfunction mapKinds(monaco: Monaco, sug?: CodeEditorSuggestionItemKind): monacoType.languages.CompletionItemKind {\n switch (sug) {\n case CodeEditorSuggestionItemKind.Method:\n return monaco.languages.CompletionItemKind.Method;\n case CodeEditorSuggestionItemKind.Field:\n return monaco.languages.CompletionItemKind.Field;\n case CodeEditorSuggestionItemKind.Property:\n return monaco.languages.CompletionItemKind.Property;\n case CodeEditorSuggestionItemKind.Constant:\n return monaco.languages.CompletionItemKind.Constant;\n case CodeEditorSuggestionItemKind.Text:\n return monaco.languages.CompletionItemKind.Text;\n }\n return monaco.languages.CompletionItemKind.Text;\n}\n\n/**\n * @alpha\n */\nexport function registerSuggestions(\n monaco: Monaco,\n language: string,\n getSuggestions: CodeEditorSuggestionProvider\n): monacoType.IDisposable | undefined {\n if (!language || !getSuggestions) {\n return undefined;\n }\n return monaco.languages.registerCompletionItemProvider(language, {\n triggerCharacters: ['$'],\n\n provideCompletionItems: (model, position, context) => {\n const range = {\n startLineNumber: position.lineNumber,\n endLineNumber: position.lineNumber,\n startColumn: position.column,\n endColumn: position.column,\n };\n\n // Simple check if this was triggered by pressing `$`\n if (context.triggerCharacter === '$') {\n range.startColumn = position.column - 1;\n return {\n suggestions: getCompletionItems(monaco, '$', getSuggestions(), range),\n };\n }\n\n // Find the replacement region\n const currentLine = model.getValueInRange({\n startLineNumber: position.lineNumber,\n startColumn: 1,\n endLineNumber: position.lineNumber,\n endColumn: position.column,\n });\n\n const { index, prefix } = findInsertIndex(currentLine);\n range.startColumn = index + 1;\n\n const suggestions = getCompletionItems(monaco, prefix, getSuggestions(), range);\n if (suggestions.length) {\n // NOTE, this will replace any language provided suggestions\n return { suggestions };\n }\n\n // Default language suggestions\n return undefined;\n },\n });\n}\n","import { css } from '@emotion/css';\nimport type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport React from 'react';\n\nimport { GrafanaTheme2, monacoLanguageRegistry } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { withTheme2 } from '../../themes';\nimport { Themeable2 } from '../../types';\n\nimport { ReactMonacoEditorLazy } from './ReactMonacoEditorLazy';\nimport { registerSuggestions } from './suggestions';\nimport { CodeEditorProps, Monaco, MonacoEditor as MonacoEditorType, MonacoOptions } from './types';\n\ntype Props = CodeEditorProps & Themeable2;\n\nclass UnthemedCodeEditor extends React.PureComponent<Props> {\n completionCancel?: monacoType.IDisposable;\n monaco?: Monaco;\n\n constructor(props: Props) {\n super(props);\n }\n\n componentWillUnmount() {\n if (this.completionCancel) {\n this.completionCancel.dispose();\n }\n }\n\n componentDidUpdate(oldProps: Props) {\n const { getSuggestions, language } = this.props;\n\n const newLanguage = oldProps.language !== language;\n const newGetSuggestions = oldProps.getSuggestions !== getSuggestions;\n\n if (newGetSuggestions || newLanguage) {\n if (this.completionCancel) {\n this.completionCancel.dispose();\n }\n\n if (!this.monaco) {\n console.warn('Monaco instance not loaded yet');\n return;\n }\n\n if (getSuggestions) {\n this.completionCancel = registerSuggestions(this.monaco, language, getSuggestions);\n }\n }\n\n if (newLanguage) {\n this.loadCustomLanguage();\n }\n }\n\n loadCustomLanguage = () => {\n const { language } = this.props;\n\n const customLanguage = monacoLanguageRegistry.getIfExists(language);\n\n if (customLanguage) {\n return customLanguage.init();\n }\n\n return Promise.resolve();\n };\n\n // This is replaced with a real function when the actual editor mounts\n getEditorValue = () => '';\n\n onBlur = () => {\n const { onBlur } = this.props;\n if (onBlur) {\n onBlur(this.getEditorValue());\n }\n };\n\n onSave = () => {\n const { onSave } = this.props;\n if (onSave) {\n onSave(this.getEditorValue());\n }\n };\n\n handleBeforeMount = (monaco: Monaco) => {\n this.monaco = monaco;\n const { language, getSuggestions, onBeforeEditorMount } = this.props;\n\n if (getSuggestions) {\n this.completionCancel = registerSuggestions(monaco, language, getSuggestions);\n }\n\n onBeforeEditorMount?.(monaco);\n };\n\n handleOnMount = (editor: MonacoEditorType, monaco: Monaco) => {\n const { onEditorDidMount } = this.props;\n this.getEditorValue = () => editor.getValue();\n\n editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS, this.onSave);\n const languagePromise = this.loadCustomLanguage();\n\n if (onEditorDidMount) {\n languagePromise.then(() => onEditorDidMount(editor, monaco));\n }\n };\n\n render() {\n const { theme, language, width, height, showMiniMap, showLineNumbers, readOnly, monacoOptions } = this.props;\n const value = this.props.value ?? '';\n const longText = value.length > 100;\n\n const containerStyles = this.props.containerStyles ?? getStyles(theme).container;\n\n const options: MonacoOptions = {\n wordWrap: 'off',\n tabSize: 2,\n codeLens: false,\n contextmenu: false,\n minimap: {\n enabled: longText && showMiniMap,\n renderCharacters: false,\n },\n\n readOnly,\n lineNumbersMinChars: 4,\n lineDecorationsWidth: 1 * theme.spacing.gridSize,\n overviewRulerBorder: false,\n automaticLayout: true,\n padding: {\n top: 0.5 * theme.spacing.gridSize,\n bottom: 0.5 * theme.spacing.gridSize,\n },\n fixedOverflowWidgets: true, // Ensures suggestions menu is drawn on top\n };\n\n if (!showLineNumbers) {\n options.glyphMargin = false;\n options.folding = false;\n options.lineNumbers = 'off';\n options.lineNumbersMinChars = 0;\n }\n\n return (\n <div className={containerStyles} onBlur={this.onBlur} aria-label={selectors.components.CodeEditor.container}>\n <ReactMonacoEditorLazy\n width={width}\n height={height}\n language={language}\n value={value}\n options={{\n ...options,\n ...(monacoOptions ?? {}),\n }}\n beforeMount={this.handleBeforeMount}\n onMount={this.handleOnMount}\n />\n </div>\n );\n }\n}\n\nexport const CodeEditor = withTheme2(UnthemedCodeEditor);\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n border-radius: ${theme.shape.borderRadius()};\n border: 1px solid ${theme.components.input.borderColor};\n `,\n };\n};\n","import { VariableSuggestion } from '@grafana/data';\n\nimport { CodeEditorSuggestionItem, CodeEditorSuggestionItemKind } from './types';\n\n/**\n * @alpha\n */\nexport function variableSuggestionToCodeEditorSuggestion(sug: VariableSuggestion): CodeEditorSuggestionItem {\n const label = '${' + sug.value + '}';\n const detail = sug.value === sug.label ? sug.origin : `${sug.label} / ${sug.origin}`;\n\n return {\n label,\n kind: CodeEditorSuggestionItemKind.Property,\n detail,\n documentation: sug.documentation,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport React, { ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\n\nexport interface Props {\n /** Children should be a single <Tab /> or an array of <Tab /> */\n children: ReactNode;\n className?: string;\n /** For hiding the bottom border (on PageHeader for example) */\n hideBorder?: boolean;\n}\n\nconst getTabsBarStyles = stylesFactory((theme: GrafanaTheme2, hideBorder = false) => {\n return {\n tabsWrapper:\n !hideBorder &&\n css`\n border-bottom: 1px solid ${theme.colors.border.weak};\n `,\n tabs: css`\n position: relative;\n display: flex;\n height: ${theme.components.menuTabs.height}px;\n `,\n };\n});\n\nexport const TabsBar = React.forwardRef<HTMLDivElement, Props>(({ children, className, hideBorder }, ref) => {\n const theme = useTheme2();\n const tabsStyles = getTabsBarStyles(theme, hideBorder);\n\n return (\n <div className={cx(tabsStyles.tabsWrapper, className)} ref={ref}>\n <div className={tabsStyles.tabs} role=\"tablist\">\n {children}\n </div>\n </div>\n );\n});\n\nTabsBar.displayName = 'TabsBar';\n","import React from 'react';\n\nimport { NavModelItem } from '@grafana/data';\n\nimport { IconName } from '../../types';\nimport { Tab } from '../Tabs/Tab';\nimport { TabsBar } from '../Tabs/TabsBar';\n\nimport { ModalHeader } from './ModalHeader';\n\ninterface ModalTab {\n value: string;\n label: string;\n icon?: IconName;\n tabSuffix?: NavModelItem['tabSuffix'];\n}\n\ninterface Props {\n icon: IconName;\n title: string;\n tabs: ModalTab[];\n activeTab: string;\n onChangeTab(tab: ModalTab): void;\n}\n\nexport const ModalTabsHeader: React.FC<Props> = ({ icon, title, tabs, activeTab, onChangeTab }) => {\n return (\n <ModalHeader icon={icon} title={title}>\n <TabsBar hideBorder={true}>\n {tabs.map((t, index) => {\n return (\n <Tab\n key={`${t.value}-${index}`}\n label={t.label}\n icon={t.icon}\n suffix={t.tabSuffix}\n active={t.value === activeTab}\n onChangeTab={() => onChangeTab(t)}\n />\n );\n })}\n </TabsBar>\n </ModalHeader>\n );\n};\n","import React from 'react';\n\nimport { IconName } from '../../types';\n\ninterface Props {\n /** @deprecated */\n icon?: IconName;\n /** @deprecated */\n iconClass?: string;\n}\n\n/** @internal */\nexport const ModalTabContent: React.FC<Props> = ({ children }) => {\n return (\n <div className=\"share-modal-body\">\n <div className=\"share-modal-header\">\n <div className=\"share-modal-content\">{children}</div>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\ninterface ModalsContextState {\n component: React.ComponentType<any> | null;\n props: any;\n showModal: <T>(component: React.ComponentType<T>, props: T) => void;\n hideModal: () => void;\n}\n\nexport const ModalsContext = React.createContext<ModalsContextState>({\n component: null,\n props: {},\n showModal: () => {},\n hideModal: () => {},\n});\n\ninterface ModalsProviderProps {\n children: React.ReactNode;\n /** Set default component to render as modal. Useful when rendering modals from Angular */\n component?: React.ComponentType<any> | null;\n /** Set default component props. Useful when rendering modals from Angular */\n props?: any;\n}\n\nexport class ModalsProvider extends React.Component<ModalsProviderProps, ModalsContextState> {\n constructor(props: ModalsProviderProps) {\n super(props);\n this.state = {\n component: props.component || null,\n props: props.props || {},\n showModal: this.showModal,\n hideModal: this.hideModal,\n };\n }\n\n showModal = (component: React.ComponentType<any>, props: any) => {\n this.setState({\n component,\n props,\n });\n };\n\n hideModal = () => {\n this.setState({\n component: null,\n props: {},\n });\n };\n\n render() {\n return <ModalsContext.Provider value={this.state}>{this.props.children}</ModalsContext.Provider>;\n }\n}\n\nexport const ModalRoot = () => (\n <ModalsContext.Consumer>\n {({ component: Component, props }) => {\n return Component ? <Component {...props} /> : null;\n }}\n </ModalsContext.Consumer>\n);\n\nexport const ModalsController = ModalsContext.Consumer;\n","import { css, cx } from '@emotion/css';\nimport React, { FC, ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { Link } from '..';\nimport { styleMixins } from '../../themes';\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport interface Props {\n pageIcon?: IconName;\n title?: string;\n section?: string;\n parent?: string;\n onGoBack?: () => void;\n titleHref?: string;\n parentHref?: string;\n leftItems?: ReactNode[];\n children?: ReactNode;\n className?: string;\n isFullscreen?: boolean;\n 'aria-label'?: string;\n}\n\n/** @alpha */\nexport const PageToolbar: FC<Props> = React.memo(\n ({\n title,\n section,\n parent,\n pageIcon,\n onGoBack,\n children,\n titleHref,\n parentHref,\n leftItems,\n isFullscreen,\n className,\n /** main nav-container aria-label **/\n 'aria-label': ariaLabel,\n }) => {\n const styles = useStyles2(getStyles);\n\n /**\n * .page-toolbar css class is used for some legacy css view modes (TV/Kiosk) and\n * media queries for mobile view when toolbar needs left padding to make room\n * for mobile menu icon. This logic hopefylly can be changed when we move to a full react\n * app and change how the app side menu & mobile menu is rendered.\n */\n const mainStyle = cx(\n 'page-toolbar',\n styles.toolbar,\n {\n ['page-toolbar--fullscreen']: isFullscreen,\n },\n className\n );\n\n const titleEl = (\n <>\n <span className={styles.noLinkTitle}>{title}</span>\n {section && <span className={styles.pre}> / {section}</span>}\n </>\n );\n\n return (\n <nav className={mainStyle} aria-label={ariaLabel}>\n <div className={styles.leftWrapper}>\n {pageIcon && !onGoBack && (\n <div className={styles.pageIcon}>\n <Icon name={pageIcon} size=\"lg\" aria-hidden />\n </div>\n )}\n {onGoBack && (\n <div className={styles.pageIcon}>\n <IconButton\n name=\"arrow-left\"\n tooltip=\"Go back (Esc)\"\n tooltipPlacement=\"bottom\"\n size=\"xxl\"\n aria-label={selectors.components.BackButton.backArrow}\n onClick={onGoBack}\n />\n </div>\n )}\n <nav aria-label=\"Search links\" className={styles.navElement}>\n {parent && parentHref && (\n <>\n <Link\n aria-label={`Search dashboard in the ${parent} folder`}\n className={cx(styles.titleText, styles.parentLink, styles.titleLink)}\n href={parentHref}\n >\n {parent} <span className={styles.parentIcon}></span>\n </Link>\n {titleHref && (\n <span className={cx(styles.titleText, styles.titleDivider, styles.parentLink)} aria-hidden>\n /\n </span>\n )}\n </>\n )}\n\n {(title || leftItems?.length) && (\n <div className={styles.titleWrapper}>\n {title && (\n <h1 className={styles.h1Styles}>\n {titleHref ? (\n <Link\n aria-label=\"Search dashboard by name\"\n className={cx(styles.titleText, styles.titleLink)}\n href={titleHref}\n >\n {titleEl}\n </Link>\n ) : (\n <div className={styles.titleText}>{titleEl}</div>\n )}\n </h1>\n )}\n\n {leftItems?.map((child, index) => (\n <div className={styles.leftActionItem} key={index}>\n {child}\n </div>\n ))}\n </div>\n )}\n </nav>\n </div>\n {React.Children.toArray(children)\n .filter(Boolean)\n .map((child, index) => {\n return (\n <div className={styles.actionWrapper} key={index}>\n {child}\n </div>\n );\n })}\n </nav>\n );\n }\n);\n\nPageToolbar.displayName = 'PageToolbar';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const { spacing, typography } = theme;\n\n const focusStyle = getFocusStyles(theme);\n\n return {\n pre: css`\n white-space: pre;\n `,\n toolbar: css`\n align-items: center;\n background: ${theme.colors.background.canvas};\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n padding: ${theme.spacing(1.5, 2)};\n `,\n leftWrapper: css`\n display: flex;\n flex-wrap: nowrap;\n flex-grow: 1;\n `,\n pageIcon: css`\n display: none;\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.md)} {\n display: flex;\n padding-right: ${theme.spacing(1)};\n align-items: center;\n }\n `,\n noLinkTitle: css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n titleWrapper: css`\n display: flex;\n flex-grow: 1;\n margin: 0;\n `,\n navElement: css`\n display: flex;\n flex-grow: 1;\n align-items: center;\n max-width: calc(100vw - 78px);\n `,\n h1Styles: css`\n margin: 0;\n line-height: inherit;\n width: 300px;\n max-width: min-content;\n flex-grow: 1;\n `,\n parentIcon: css`\n margin-left: ${theme.spacing(0.5)};\n `,\n titleText: css`\n display: flex;\n font-size: ${typography.size.lg};\n margin: 0;\n border-radius: 2px;\n `,\n titleLink: css`\n &:focus-visible {\n ${focusStyle}\n }\n `,\n titleDivider: css`\n padding: ${spacing(0, 0.5, 0, 0.5)};\n `,\n parentLink: css`\n display: none;\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.md)} {\n display: unset;\n }\n `,\n actionWrapper: css`\n padding: ${spacing(0.5, 0, 0.5, 1)};\n `,\n leftActionItem: css`\n display: none;\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.md)} {\n align-items: center;\n display: flex;\n padding-left: ${spacing(0.5)};\n }\n `,\n };\n};\n","import { isEqual } from 'lodash';\nimport { PureComponent } from 'react';\nimport { interval, Subscription, Subject, of, NEVER } from 'rxjs';\nimport { tap, switchMap } from 'rxjs/operators';\n\nimport { stringToMs, SelectableValue } from '@grafana/data';\n\nimport { RefreshPicker } from '../RefreshPicker/RefreshPicker';\n\nexport function getIntervalFromString(strInterval: string): SelectableValue<number> {\n return {\n label: strInterval,\n value: stringToMs(strInterval),\n };\n}\n\ninterface Props {\n func: () => any; // TODO\n loading: boolean;\n interval: string;\n}\n\nexport class SetInterval extends PureComponent<Props> {\n private propsSubject: Subject<Props>;\n private subscription: Subscription | null;\n\n constructor(props: Props) {\n super(props);\n this.propsSubject = new Subject<Props>();\n this.subscription = null;\n }\n\n componentDidMount() {\n // Creating a subscription to propsSubject. This subject pushes values every time\n // SetInterval's props change\n this.subscription = this.propsSubject\n .pipe(\n // switchMap creates a new observables based on the input stream,\n // which becomes part of the propsSubject stream\n switchMap((props) => {\n // If the query is live, empty value is emitted. `of` creates single value,\n // which is merged to propsSubject stream\n if (RefreshPicker.isLive(props.interval)) {\n return of({});\n }\n\n // When query is loading, a new stream is merged. But it's a stream that emits no values(NEVER),\n // hence next call of this function will happen when query changes, and new props are passed into this component\n // When query is NOT loading, a new value is emitted, this time it's an interval value,\n // which makes tap function below execute on that interval basis.\n return props.loading ? NEVER : interval(stringToMs(props.interval));\n }),\n // tap will execute function passed via func prop\n // * on value from `of` stream merged if query is live\n // * on specified interval (triggered by values emitted by interval)\n tap(() => this.props.func())\n )\n .subscribe();\n\n // When component has mounted, propsSubject emits it's first value\n this.propsSubject.next(this.props);\n }\n\n componentDidUpdate(prevProps: Props) {\n if (\n (RefreshPicker.isLive(prevProps.interval) && RefreshPicker.isLive(this.props.interval)) ||\n isEqual(prevProps, this.props)\n ) {\n return;\n }\n // if props changed, a new value is emitted from propsSubject\n this.propsSubject.next(this.props);\n }\n\n componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n this.propsSubject.unsubscribe();\n }\n\n render(): null {\n return null;\n }\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { KeyValue } from '@grafana/data';\n\nimport { FooterItem } from './types';\n\nexport interface FooterProps {\n value: FooterItem;\n}\n\nexport const FooterCell = (props: FooterProps) => {\n const cell = css`\n width: 100%;\n list-style: none;\n `;\n\n const list = css`\n width: 100%;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n `;\n\n if (props.value && !Array.isArray(props.value)) {\n return <span>{props.value}</span>;\n }\n if (props.value && Array.isArray(props.value) && props.value.length > 0) {\n return (\n <ul className={cell}>\n {props.value.map((v: KeyValue<string>, i) => {\n const key = Object.keys(v)[0];\n return (\n <li className={list} key={i}>\n <span>{key}:</span>\n <span>{v[key]}</span>\n </li>\n );\n })}\n </ul>\n );\n }\n return EmptyCell;\n};\n\nexport const EmptyCell = (props: any) => {\n return <span> </span>;\n};\n","import React from 'react';\nimport { ColumnInstance, HeaderGroup } from 'react-table';\n\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2 } from '../../themes';\n\nimport { EmptyCell, FooterCell } from './FooterCell';\nimport { getTableStyles, TableStyles } from './styles';\nimport { FooterItem } from './types';\n\nexport interface FooterRowProps {\n totalColumnsWidth: number;\n footerGroups: HeaderGroup[];\n footerValues: FooterItem[];\n isPaginationVisible: boolean;\n height: number;\n}\n\nexport const FooterRow = (props: FooterRowProps) => {\n const { totalColumnsWidth, footerGroups, height, isPaginationVisible } = props;\n const e2eSelectorsTable = selectors.components.Panels.Visualization.Table;\n const tableStyles = useStyles2(getTableStyles);\n\n return (\n <table\n style={{\n position: isPaginationVisible ? 'relative' : 'absolute',\n width: totalColumnsWidth ? `${totalColumnsWidth}px` : '100%',\n bottom: '0px',\n }}\n >\n {footerGroups.map((footerGroup: HeaderGroup) => {\n const { key, ...footerGroupProps } = footerGroup.getFooterGroupProps();\n return (\n <tfoot\n className={tableStyles.tfoot}\n {...footerGroupProps}\n key={key}\n data-testid={e2eSelectorsTable.footer}\n style={height ? { height: `${height}px` } : undefined}\n >\n <tr>\n {footerGroup.headers.map((column: ColumnInstance, index: number) =>\n renderFooterCell(column, tableStyles, height)\n )}\n </tr>\n </tfoot>\n );\n })}\n </table>\n );\n};\n\nfunction renderFooterCell(column: ColumnInstance, tableStyles: TableStyles, height?: number) {\n const footerProps = column.getHeaderProps();\n\n if (!footerProps) {\n return null;\n }\n\n footerProps.style = footerProps.style ?? {};\n footerProps.style.position = 'absolute';\n footerProps.style.justifyContent = (column as any).justifyContent;\n if (height) {\n footerProps.style.height = height;\n }\n\n return (\n <th className={tableStyles.headerCell} {...footerProps}>\n {column.render('Footer')}\n </th>\n );\n}\n\nexport function getFooterValue(index: number, footerValues?: FooterItem[]) {\n if (footerValues === undefined) {\n return EmptyCell;\n }\n\n return FooterCell({ value: footerValues[index] });\n}\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback, useMemo, useState } from 'react';\nimport { FixedSizeList as List } from 'react-window';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { Checkbox, FilterInput, Label, VerticalGroup } from '..';\nimport { stylesFactory, useTheme2 } from '../../themes';\n\ninterface Props {\n values: SelectableValue[];\n options: SelectableValue[];\n onChange: (options: SelectableValue[]) => void;\n caseSensitive?: boolean;\n}\n\nconst ITEM_HEIGHT = 28;\nconst MIN_HEIGHT = ITEM_HEIGHT * 5;\n\nexport const FilterList: FC<Props> = ({ options, values, caseSensitive, onChange }) => {\n const theme = useTheme2();\n const styles = getStyles(theme);\n const [searchFilter, setSearchFilter] = useState('');\n const regex = useMemo(() => new RegExp(searchFilter, caseSensitive ? undefined : 'i'), [searchFilter, caseSensitive]);\n const items = useMemo(\n () =>\n options.filter((option) => {\n if (option.label === undefined) {\n return false;\n }\n return regex.test(option.label);\n }),\n [options, regex]\n );\n const gutter = theme.spacing.gridSize;\n const height = useMemo(() => Math.min(items.length * ITEM_HEIGHT, MIN_HEIGHT) + gutter, [gutter, items.length]);\n\n const onInputChange = useCallback(\n (v: string) => {\n setSearchFilter(v);\n },\n [setSearchFilter]\n );\n\n const onCheckedChanged = useCallback(\n (option: SelectableValue) => (event: React.FormEvent<HTMLInputElement>) => {\n const newValues = event.currentTarget.checked\n ? values.concat(option)\n : values.filter((c) => c.value !== option.value);\n\n onChange(newValues);\n },\n [onChange, values]\n );\n\n return (\n <VerticalGroup spacing=\"md\">\n <FilterInput placeholder=\"Filter values\" onChange={onInputChange} value={searchFilter} />\n {!items.length && <Label>No values</Label>}\n {items.length && (\n <List\n height={height}\n itemCount={items.length}\n itemSize={ITEM_HEIGHT}\n width=\"100%\"\n className={styles.filterList}\n >\n {({ index, style }) => {\n const option = items[index];\n const { value, label } = option;\n const isChecked = values.find((s) => s.value === value) !== undefined;\n\n return (\n <div className={styles.filterListRow} style={style} title={label}>\n <Checkbox value={isChecked} label={label} onChange={onCheckedChanged(option)} />\n </div>\n );\n }}\n </List>\n )}\n </VerticalGroup>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n filterList: css`\n label: filterList;\n `,\n filterListRow: css`\n label: filterListRow;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding: ${theme.spacing(0.5)};\n\n :hover {\n background-color: ${theme.colors.action.hover};\n }\n `,\n}));\n","import React, { FC, CSSProperties, HTMLProps } from 'react';\n\nimport { FormattedValue } from '@grafana/data';\n\nexport interface Props extends Omit<HTMLProps<HTMLDivElement>, 'className' | 'value' | 'style'> {\n value: FormattedValue;\n className?: string;\n style?: CSSProperties;\n}\n\nfunction fontSizeReductionFactor(fontSize: number) {\n if (fontSize < 20) {\n return 0.9;\n }\n if (fontSize < 26) {\n return 0.8;\n }\n return 0.6;\n}\n\nexport const FormattedValueDisplay: FC<Props> = ({ value, className, style, ...htmlProps }) => {\n const hasPrefix = (value.prefix ?? '').length > 0;\n const hasSuffix = (value.suffix ?? '').length > 0;\n let suffixStyle;\n\n if (style && style.fontSize) {\n const fontSize = style?.fontSize as number;\n const reductionFactor = fontSizeReductionFactor(fontSize);\n suffixStyle = { fontSize: fontSize * reductionFactor };\n }\n\n return (\n <div className={className} style={style} {...htmlProps}>\n <div>\n {hasPrefix && <span>{value.prefix}</span>}\n <span>{value.text}</span>\n {hasSuffix && <span style={suffixStyle}>{value.suffix}</span>}\n </div>\n </div>\n );\n};\n\nFormattedValueDisplay.displayName = 'FormattedDisplayValue';\n","// Library\nimport React, { CSSProperties, PureComponent, ReactNode } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport {\n DisplayProcessor,\n DisplayValue,\n DisplayValueAlignmentFactors,\n FALLBACK_COLOR,\n FieldColorModeId,\n FieldConfig,\n FormattedValue,\n formattedValueToString,\n GAUGE_DEFAULT_MAXIMUM,\n GAUGE_DEFAULT_MINIMUM,\n getFieldColorMode,\n ThresholdsMode,\n TimeSeriesValue,\n VizOrientation,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { VizTextDisplayOptions } from '@grafana/schema';\n\nimport { Themeable2 } from '../../types';\nimport { calculateFontSize, measureText } from '../../utils/measureText';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\n\nconst MIN_VALUE_HEIGHT = 18;\nconst MAX_VALUE_HEIGHT = 50;\nconst MAX_VALUE_WIDTH = 150;\nconst TITLE_LINE_HEIGHT = 1.5;\nconst VALUE_LINE_HEIGHT = 1;\nconst VALUE_LEFT_PADDING = 10;\n\nexport interface Props extends Themeable2 {\n height: number;\n width: number;\n field: FieldConfig;\n display?: DisplayProcessor;\n value: DisplayValue;\n orientation: VizOrientation;\n text?: VizTextDisplayOptions;\n itemSpacing?: number;\n lcdCellWidth?: number;\n displayMode: BarGaugeDisplayMode;\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n showUnfilled?: boolean;\n alignmentFactors?: DisplayValueAlignmentFactors;\n}\n\nexport enum BarGaugeDisplayMode {\n Basic = 'basic',\n Lcd = 'lcd',\n Gradient = 'gradient',\n}\n\nexport class BarGauge extends PureComponent<Props> {\n static defaultProps: Partial<Props> = {\n lcdCellWidth: 12,\n value: {\n text: '100',\n numeric: 100,\n },\n displayMode: BarGaugeDisplayMode.Gradient,\n orientation: VizOrientation.Horizontal,\n field: {\n min: 0,\n max: 100,\n thresholds: {\n mode: ThresholdsMode.Absolute,\n steps: [],\n },\n },\n itemSpacing: 8,\n showUnfilled: true,\n };\n\n render() {\n const { onClick, className } = this.props;\n const { title } = this.props.value;\n const styles = getTitleStyles(this.props);\n\n if (!title) {\n return (\n <div style={styles.wrapper} onClick={onClick} className={className}>\n {this.renderBarAndValue()}\n </div>\n );\n }\n\n return (\n <div style={styles.wrapper} onClick={onClick} className={className}>\n <div style={styles.title}>{title}</div>\n {this.renderBarAndValue()}\n </div>\n );\n }\n\n renderBarAndValue() {\n switch (this.props.displayMode) {\n case 'lcd':\n return this.renderRetroBars();\n case 'basic':\n case 'gradient':\n default:\n return this.renderBasicAndGradientBars();\n }\n }\n\n renderBasicAndGradientBars(): ReactNode {\n const { value, showUnfilled } = this.props;\n\n const styles = getBasicAndGradientStyles(this.props);\n\n return (\n <div style={styles.wrapper}>\n <FormattedValueDisplay\n data-testid={selectors.components.Panels.Visualization.BarGauge.valueV2}\n value={value}\n style={styles.value}\n />\n {showUnfilled && <div style={styles.emptyBar} />}\n <div style={styles.bar} />\n </div>\n );\n }\n\n renderRetroBars(): ReactNode {\n const { display, field, value, itemSpacing, alignmentFactors, orientation, lcdCellWidth, text } = this.props;\n const { valueHeight, valueWidth, maxBarHeight, maxBarWidth, wrapperWidth, wrapperHeight } =\n calculateBarAndValueDimensions(this.props);\n const minValue = field.min ?? GAUGE_DEFAULT_MINIMUM;\n const maxValue = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n\n const isVert = isVertical(orientation);\n const valueRange = maxValue - minValue;\n const maxSize = isVert ? maxBarHeight : maxBarWidth;\n const cellSpacing = itemSpacing!;\n const cellCount = Math.floor(maxSize / lcdCellWidth!);\n const cellSize = Math.floor((maxSize - cellSpacing * cellCount) / cellCount);\n const valueColor = getValueColor(this.props);\n\n const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n const valueStyles = getValueStyles(valueToBaseSizeOn, valueColor, valueWidth, valueHeight, orientation, text);\n\n const containerStyles: CSSProperties = {\n width: `${wrapperWidth}px`,\n height: `${wrapperHeight}px`,\n display: 'flex',\n };\n\n if (isVert) {\n containerStyles.flexDirection = 'column-reverse';\n containerStyles.alignItems = 'center';\n } else {\n containerStyles.flexDirection = 'row';\n containerStyles.alignItems = 'center';\n valueStyles.justifyContent = 'flex-end';\n }\n\n const cells: JSX.Element[] = [];\n\n for (let i = 0; i < cellCount; i++) {\n const currentValue = minValue + (valueRange / cellCount) * i;\n const cellColor = getCellColor(currentValue, value, display);\n const cellStyles: CSSProperties = {\n borderRadius: '2px',\n };\n\n if (cellColor.isLit) {\n cellStyles.backgroundImage = `radial-gradient(${cellColor.background} 10%, ${cellColor.backgroundShade})`;\n } else {\n cellStyles.backgroundColor = cellColor.background;\n }\n\n if (isVert) {\n cellStyles.height = `${cellSize}px`;\n cellStyles.width = `${maxBarWidth}px`;\n cellStyles.marginTop = `${cellSpacing}px`;\n } else {\n cellStyles.width = `${cellSize}px`;\n cellStyles.height = `${maxBarHeight}px`;\n cellStyles.marginRight = `${cellSpacing}px`;\n }\n\n cells.push(<div key={i.toString()} style={cellStyles} />);\n }\n\n return (\n <div style={containerStyles}>\n {cells}\n <FormattedValueDisplay\n data-testid={selectors.components.Panels.Visualization.BarGauge.valueV2}\n value={value}\n style={valueStyles}\n />\n </div>\n );\n }\n}\n\ninterface CellColors {\n background: string;\n backgroundShade?: string;\n border: string;\n isLit?: boolean;\n}\n\ninterface TitleDimensions {\n fontSize: number;\n placement: 'above' | 'left' | 'below';\n width: number;\n height: number;\n}\n\nfunction isVertical(orientation: VizOrientation) {\n return orientation === VizOrientation.Vertical;\n}\n\nfunction calculateTitleDimensions(props: Props): TitleDimensions {\n const { height, width, alignmentFactors, orientation, text } = props;\n const title = alignmentFactors ? alignmentFactors.title : props.value.title;\n\n if (!title) {\n return { fontSize: 0, width: 0, height: 0, placement: 'above' };\n }\n\n if (isVertical(orientation)) {\n const fontSize = text?.titleSize ?? 14;\n return {\n fontSize: fontSize,\n width: width,\n height: fontSize * TITLE_LINE_HEIGHT,\n placement: 'below',\n };\n }\n\n // if height above 40 put text to above bar\n if (height > 40) {\n if (text?.titleSize) {\n return {\n fontSize: text?.titleSize,\n width: 0,\n height: text.titleSize * TITLE_LINE_HEIGHT,\n placement: 'above',\n };\n }\n\n const maxTitleHeightRatio = 0.45;\n const titleHeight = Math.max(Math.min(height * maxTitleHeightRatio, MAX_VALUE_HEIGHT), 17);\n\n return {\n fontSize: titleHeight / TITLE_LINE_HEIGHT,\n width: 0,\n height: titleHeight,\n placement: 'above',\n };\n }\n\n // title to left of bar scenario\n const maxTitleHeightRatio = 0.6;\n const titleHeight = Math.max(height * maxTitleHeightRatio, MIN_VALUE_HEIGHT);\n const titleFontSize = titleHeight / TITLE_LINE_HEIGHT;\n const textSize = measureText(title, titleFontSize);\n\n // Do not allow title to take up more than 40% width\n const textWidth = Math.min(textSize.width + 15, width * 0.4);\n\n return {\n fontSize: text?.titleSize ?? titleFontSize,\n height: 0,\n width: textWidth,\n placement: 'left',\n };\n}\n\nexport function getTitleStyles(props: Props): { wrapper: CSSProperties; title: CSSProperties } {\n const wrapperStyles: CSSProperties = {\n display: 'flex',\n overflow: 'hidden',\n width: '100%',\n };\n\n const titleDim = calculateTitleDimensions(props);\n\n const titleStyles: CSSProperties = {\n fontSize: `${titleDim.fontSize}px`,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n width: '100%',\n alignItems: 'center',\n alignSelf: 'center',\n };\n\n if (isVertical(props.orientation)) {\n wrapperStyles.flexDirection = 'column-reverse';\n titleStyles.textAlign = 'center';\n } else {\n if (titleDim.placement === 'above') {\n wrapperStyles.flexDirection = 'column';\n } else {\n wrapperStyles.flexDirection = 'row';\n\n titleStyles.width = `${titleDim.width}px`;\n titleStyles.textAlign = 'right';\n titleStyles.paddingRight = '10px';\n }\n }\n\n return {\n wrapper: wrapperStyles,\n title: titleStyles,\n };\n}\n\ninterface BasicAndGradientStyles {\n wrapper: CSSProperties;\n bar: CSSProperties;\n emptyBar: CSSProperties;\n value: CSSProperties;\n}\n\ninterface BarAndValueDimensions {\n valueWidth: number;\n valueHeight: number;\n maxBarWidth: number;\n maxBarHeight: number;\n wrapperHeight: number;\n wrapperWidth: number;\n}\n\n/**\n * @internal\n * Only exported for unit tests\n **/\nexport function calculateBarAndValueDimensions(props: Props): BarAndValueDimensions {\n const { height, width, orientation, text, alignmentFactors } = props;\n const titleDim = calculateTitleDimensions(props);\n const value = alignmentFactors ?? props.value;\n const valueString = formattedValueToString(value);\n\n let maxBarHeight = 0;\n let maxBarWidth = 0;\n let valueHeight = 0;\n let valueWidth = 0;\n let wrapperWidth = 0;\n let wrapperHeight = 0;\n\n // measure text with title font size or min 14px\n const fontSizeToMeasureWith = text?.valueSize ?? Math.max(titleDim.fontSize, 12);\n const realTextSize = measureText(valueString, fontSizeToMeasureWith);\n const realValueWidth = realTextSize.width + VALUE_LEFT_PADDING * 2;\n\n if (isVertical(orientation)) {\n if (text?.valueSize) {\n valueHeight = text.valueSize * VALUE_LINE_HEIGHT;\n } else {\n valueHeight = Math.min(Math.max(height * 0.1, MIN_VALUE_HEIGHT), MAX_VALUE_HEIGHT);\n }\n\n valueWidth = width;\n maxBarHeight = height - (titleDim.height + valueHeight);\n maxBarWidth = width;\n wrapperWidth = width;\n wrapperHeight = height - titleDim.height;\n } else {\n valueHeight = height - titleDim.height;\n valueWidth = Math.max(Math.min(width * 0.2, MAX_VALUE_WIDTH), realValueWidth);\n\n maxBarHeight = height - titleDim.height;\n maxBarWidth = width - valueWidth - titleDim.width;\n\n if (titleDim.placement === 'above') {\n wrapperWidth = width;\n wrapperHeight = height - titleDim.height;\n } else {\n wrapperWidth = width - titleDim.width;\n wrapperHeight = height;\n }\n }\n\n return {\n valueWidth,\n valueHeight,\n maxBarWidth,\n maxBarHeight,\n wrapperHeight,\n wrapperWidth,\n };\n}\n\nexport function getCellColor(\n positionValue: TimeSeriesValue,\n value: Props['value'],\n display: Props['display']\n): CellColors {\n if (positionValue === null) {\n return {\n background: FALLBACK_COLOR,\n border: FALLBACK_COLOR,\n };\n }\n\n const color = display ? display(positionValue).color : null;\n\n if (color) {\n // if we are past real value the cell is not \"on\"\n if (value === null || isNaN(value.numeric) || (positionValue !== null && positionValue > value.numeric)) {\n return {\n background: tinycolor(color).setAlpha(0.18).toRgbString(),\n border: 'transparent',\n isLit: false,\n };\n } else {\n return {\n background: tinycolor(color).setAlpha(0.95).toRgbString(),\n backgroundShade: tinycolor(color).setAlpha(0.55).toRgbString(),\n border: tinycolor(color).setAlpha(0.9).toRgbString(),\n isLit: true,\n };\n }\n }\n\n return {\n background: FALLBACK_COLOR,\n border: FALLBACK_COLOR,\n };\n}\n\nexport function getValuePercent(value: number, minValue: number, maxValue: number): number {\n // Need special logic for when minValue === maxValue === value to prevent returning NaN\n const valueRatio = Math.min((value - minValue) / (maxValue - minValue), 1);\n return isNaN(valueRatio) ? 0 : valueRatio;\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBasicAndGradientStyles(props: Props): BasicAndGradientStyles {\n const { displayMode, field, value, alignmentFactors, orientation, theme, text } = props;\n const { valueWidth, valueHeight, maxBarHeight, maxBarWidth } = calculateBarAndValueDimensions(props);\n\n const minValue = field.min ?? GAUGE_DEFAULT_MINIMUM;\n const maxValue = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n const valuePercent = getValuePercent(value.numeric, minValue, maxValue);\n const valueColor = getValueColor(props);\n\n const valueToBaseSizeOn = alignmentFactors ? alignmentFactors : value;\n const valueStyles = getValueStyles(valueToBaseSizeOn, valueColor, valueWidth, valueHeight, orientation, text);\n\n const isBasic = displayMode === 'basic';\n const wrapperStyles: CSSProperties = {\n display: 'flex',\n flexGrow: 1,\n };\n\n const barStyles: CSSProperties = {\n borderRadius: '3px',\n position: 'relative',\n zIndex: 1,\n };\n\n const emptyBar: CSSProperties = {\n background: `rgba(${theme.isDark ? '255,255,255' : '0,0,0'}, 0.07)`,\n flexGrow: 1,\n display: 'flex',\n borderRadius: '3px',\n position: 'relative',\n };\n\n if (isVertical(orientation)) {\n const barHeight = Math.max(valuePercent * maxBarHeight, 1);\n\n // vertical styles\n wrapperStyles.flexDirection = 'column';\n wrapperStyles.justifyContent = 'flex-end';\n\n barStyles.transition = 'height 1s';\n barStyles.height = `${barHeight}px`;\n barStyles.width = `${maxBarWidth}px`;\n\n // adjust so that filled in bar is at the bottom\n emptyBar.bottom = '-3px';\n\n //adjust empty region to always have same width as colored bar\n emptyBar.width = `${valueWidth}px`;\n\n if (isBasic) {\n // Basic styles\n barStyles.background = `${tinycolor(valueColor).setAlpha(0.35).toRgbString()}`;\n barStyles.borderTop = `2px solid ${valueColor}`;\n } else {\n // Gradient styles\n barStyles.background = getBarGradient(props, maxBarHeight);\n }\n } else {\n const barWidth = Math.max(valuePercent * maxBarWidth, 1);\n\n // Custom styles for horizontal orientation\n wrapperStyles.flexDirection = 'row-reverse';\n wrapperStyles.justifyContent = 'flex-end';\n wrapperStyles.alignItems = 'stretch';\n\n barStyles.transition = 'width 1s';\n barStyles.height = `${maxBarHeight}px`;\n barStyles.width = `${barWidth}px`;\n\n // shift empty region back to fill gaps due to border radius\n emptyBar.left = '-3px';\n\n //adjust empty region to always have same height as colored bar\n emptyBar.height = `${valueHeight}px`;\n\n if (isBasic) {\n // Basic styles\n barStyles.background = `${tinycolor(valueColor).setAlpha(0.35).toRgbString()}`;\n barStyles.borderRight = `2px solid ${valueColor}`;\n } else {\n // Gradient styles\n barStyles.background = getBarGradient(props, maxBarWidth);\n }\n }\n\n return {\n wrapper: wrapperStyles,\n bar: barStyles,\n value: valueStyles,\n emptyBar,\n };\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getBarGradient(props: Props, maxSize: number): string {\n const { field, value, orientation, theme } = props;\n const cssDirection = isVertical(orientation) ? '0deg' : '90deg';\n const minValue = field.min!;\n const maxValue = field.max!;\n\n let gradient = '';\n let lastpos = 0;\n let mode = getFieldColorMode(field.color?.mode);\n\n if (mode.id === FieldColorModeId.Thresholds) {\n const thresholds = field.thresholds!;\n\n for (let i = 0; i < thresholds.steps.length; i++) {\n const threshold = thresholds.steps[i];\n const color = props.theme.visualization.getColorByName(threshold.color);\n const valuePercent =\n thresholds.mode === ThresholdsMode.Percentage\n ? threshold.value / 100\n : getValuePercent(threshold.value, minValue, maxValue);\n const pos = valuePercent * maxSize;\n const offset = Math.round(pos - (pos - lastpos) / 2);\n const thresholdValue =\n thresholds.mode === ThresholdsMode.Percentage\n ? minValue + (maxValue - minValue) * valuePercent\n : threshold.value;\n if (gradient === '') {\n gradient = `linear-gradient(${cssDirection}, ${color}, ${color}`;\n } else if (value.numeric < thresholdValue) {\n break;\n } else {\n lastpos = pos;\n gradient += ` ${offset}px, ${color}`;\n }\n }\n\n return gradient + ')';\n }\n\n if (mode.isContinuous && mode.getColors) {\n const scheme = mode.getColors(theme);\n\n for (let i = 0; i < scheme.length; i++) {\n const color = scheme[i];\n\n if (gradient === '') {\n gradient = `linear-gradient(${cssDirection}, ${color} 0px`;\n } else {\n const valuePercent = i / (scheme.length - 1);\n const pos = valuePercent * maxSize;\n gradient += `, ${color} ${pos}px`;\n }\n }\n return gradient + ')';\n }\n\n return value.color ?? FALLBACK_COLOR;\n}\n\n/**\n * Only exported to for unit test\n */\nexport function getValueColor(props: Props): string {\n const { value } = props;\n if (value.color) {\n return value.color;\n }\n\n return FALLBACK_COLOR;\n}\n\nfunction getValueStyles(\n value: FormattedValue,\n color: string,\n width: number,\n height: number,\n orientation: VizOrientation,\n text?: VizTextDisplayOptions\n): CSSProperties {\n const styles: CSSProperties = {\n color,\n height: `${height}px`,\n width: `${width}px`,\n display: 'flex',\n alignItems: 'center',\n lineHeight: VALUE_LINE_HEIGHT,\n };\n\n // how many pixels in wide can the text be?\n let textWidth = width;\n const formattedValueString = formattedValueToString(value);\n\n if (isVertical(orientation)) {\n styles.fontSize = text?.valueSize ?? calculateFontSize(formattedValueString, textWidth, height, VALUE_LINE_HEIGHT);\n styles.justifyContent = `center`;\n } else {\n styles.fontSize =\n text?.valueSize ??\n calculateFontSize(formattedValueString, textWidth - VALUE_LEFT_PADDING * 2, height, VALUE_LINE_HEIGHT);\n styles.justifyContent = `flex-end`;\n styles.paddingLeft = `${VALUE_LEFT_PADDING}px`;\n styles.paddingRight = `${VALUE_LEFT_PADDING}px`;\n // Need to remove the left padding from the text width constraints\n textWidth -= VALUE_LEFT_PADDING;\n }\n\n return styles;\n}\n","import React, { useRef, useState, useLayoutEffect } from 'react';\nimport { useClickAway } from 'react-use';\n\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { Menu } from '../Menu/Menu';\nimport { Portal } from '../Portal/Portal';\n\nexport interface ContextMenuProps {\n /** Starting horizontal position for the menu */\n x: number;\n /** Starting vertical position for the menu */\n y: number;\n /** Callback for closing the menu */\n onClose?: () => void;\n /** On menu open focus the first element */\n focusOnOpen?: boolean;\n /** RenderProp function that returns menu items to display */\n renderMenuItems?: () => React.ReactNode;\n /** A function that returns header element */\n renderHeader?: () => React.ReactNode;\n}\n\nexport const ContextMenu: React.FC<ContextMenuProps> = React.memo(\n ({ x, y, onClose, focusOnOpen = true, renderMenuItems, renderHeader }) => {\n const menuRef = useRef<HTMLDivElement>(null);\n const [positionStyles, setPositionStyles] = useState({});\n\n useLayoutEffect(() => {\n const menuElement = menuRef.current;\n if (menuElement) {\n const rect = menuElement.getBoundingClientRect();\n const OFFSET = 5;\n const collisions = {\n right: window.innerWidth < x + rect.width,\n bottom: window.innerHeight < rect.bottom + rect.height + OFFSET,\n };\n\n setPositionStyles({\n position: 'fixed',\n left: collisions.right ? x - rect.width - OFFSET : x - OFFSET,\n top: collisions.bottom ? y - rect.height - OFFSET : y + OFFSET,\n });\n }\n }, [x, y]);\n\n useClickAway(menuRef, () => {\n onClose?.();\n });\n const header = renderHeader?.();\n const menuItems = renderMenuItems?.();\n const onOpen = (setFocusedItem: (a: number) => void) => {\n if (focusOnOpen) {\n setFocusedItem(0);\n }\n };\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n onClose?.();\n }\n };\n\n return (\n <Portal>\n <Menu\n header={header}\n ref={menuRef}\n style={positionStyles}\n ariaLabel={selectors.components.Menu.MenuComponent('Context')}\n onOpen={onOpen}\n onClick={onClose}\n onKeyDown={onKeyDown}\n >\n {menuItems}\n </Menu>\n </Portal>\n );\n }\n);\n\nContextMenu.displayName = 'ContextMenu';\n","import React, { useState } from 'react';\n\nimport { ContextMenu } from '../ContextMenu/ContextMenu';\n\ninterface WithContextMenuProps {\n /** Menu item trigger that accepts openMenu prop */\n children: (props: { openMenu: React.MouseEventHandler<HTMLElement> }) => JSX.Element;\n /** A function that returns an array of menu items */\n renderMenuItems: () => React.ReactNode;\n /** On menu open focus the first element */\n focusOnOpen?: boolean;\n}\n\nexport const WithContextMenu: React.FC<WithContextMenuProps> = ({ children, renderMenuItems, focusOnOpen = true }) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });\n return (\n <>\n {children({\n openMenu: (e) => {\n setIsMenuOpen(true);\n setMenuPosition({\n x: e.pageX,\n y: e.pageY,\n });\n },\n })}\n\n {isMenuOpen && (\n <ContextMenu\n onClose={() => setIsMenuOpen(false)}\n x={menuPosition.x}\n y={menuPosition.y}\n renderMenuItems={renderMenuItems}\n focusOnOpen={focusOnOpen}\n />\n )}\n </>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { CSSProperties } from 'react';\n\nimport { LinkModel } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { linkModelToContextMenuItems } from '../../utils/dataLinks';\nimport { WithContextMenu } from '../ContextMenu/WithContextMenu';\nimport { MenuGroup, MenuItemsGroup } from '../Menu/MenuGroup';\nimport { MenuItem } from '../Menu/MenuItem';\n\ninterface DataLinksContextMenuProps {\n children: (props: DataLinksContextMenuApi) => JSX.Element;\n links: () => LinkModel[];\n style?: CSSProperties;\n}\n\nexport interface DataLinksContextMenuApi {\n openMenu?: React.MouseEventHandler<HTMLOrSVGElement>;\n targetClassName?: string;\n}\n\nexport const DataLinksContextMenu: React.FC<DataLinksContextMenuProps> = ({ children, links, style }) => {\n const itemsGroup: MenuItemsGroup[] = [{ items: linkModelToContextMenuItems(links), label: 'Data links' }];\n const linksCounter = itemsGroup[0].items.length;\n const renderMenuGroupItems = () => {\n return itemsGroup.map((group, index) => (\n <MenuGroup key={`${group.label}${index}`} label={group.label}>\n {(group.items || []).map((item) => (\n <MenuItem\n key={item.label}\n url={item.url}\n label={item.label}\n target={item.target}\n icon={item.icon}\n active={item.active}\n onClick={item.onClick}\n />\n ))}\n </MenuGroup>\n ));\n };\n\n // Use this class name (exposed via render prop) to add context menu indicator to the click target of the visualization\n const targetClassName = css`\n cursor: context-menu;\n `;\n\n if (linksCounter > 1) {\n return (\n <WithContextMenu renderMenuItems={renderMenuGroupItems}>\n {({ openMenu }) => {\n return children({ openMenu, targetClassName });\n }}\n </WithContextMenu>\n );\n } else {\n const linkModel = links()[0];\n return (\n <a\n href={linkModel.href}\n onClick={linkModel.onClick}\n target={linkModel.target}\n title={linkModel.title}\n style={{ ...style, overflow: 'hidden' }}\n aria-label={selectors.components.DataLinksContextMenu.singleLink}\n >\n {children({})}\n </a>\n );\n }\n};\n","import { isFunction } from 'lodash';\nimport React, { FC } from 'react';\n\nimport { ThresholdsConfig, ThresholdsMode, VizOrientation, getFieldConfigWithMinMax, LinkModel } from '@grafana/data';\n\nimport { BarGauge, BarGaugeDisplayMode } from '../BarGauge/BarGauge';\nimport { DataLinksContextMenu, DataLinksContextMenuApi } from '../DataLinks/DataLinksContextMenu';\n\nimport { TableCellProps, TableCellDisplayMode } from './types';\n\nconst defaultScale: ThresholdsConfig = {\n mode: ThresholdsMode.Absolute,\n steps: [\n {\n color: 'blue',\n value: -Infinity,\n },\n {\n color: 'green',\n value: 20,\n },\n ],\n};\n\nexport const BarGaugeCell: FC<TableCellProps> = (props) => {\n const { field, innerWidth, tableStyles, cell, cellProps, row } = props;\n\n let config = getFieldConfigWithMinMax(field, false);\n if (!config.thresholds) {\n config = {\n ...config,\n thresholds: defaultScale,\n };\n }\n\n const displayValue = field.display!(cell.value);\n let barGaugeMode = BarGaugeDisplayMode.Gradient;\n\n if (field.config.custom && field.config.custom.displayMode === TableCellDisplayMode.LcdGauge) {\n barGaugeMode = BarGaugeDisplayMode.Lcd;\n } else if (field.config.custom && field.config.custom.displayMode === TableCellDisplayMode.BasicGauge) {\n barGaugeMode = BarGaugeDisplayMode.Basic;\n }\n\n const getLinks = () => {\n if (!isFunction(field.getLinks)) {\n return [] as LinkModel[];\n }\n\n return field.getLinks({ valueRowIndex: row.index });\n };\n\n const hasLinks = Boolean(getLinks().length);\n\n const renderComponent = (menuProps: DataLinksContextMenuApi) => {\n const { openMenu, targetClassName } = menuProps;\n\n return (\n <BarGauge\n width={innerWidth}\n height={tableStyles.cellHeightInner}\n field={config}\n display={field.display}\n text={{ valueSize: 14 }}\n value={displayValue}\n orientation={VizOrientation.Horizontal}\n theme={tableStyles.theme}\n onClick={openMenu}\n className={targetClassName}\n itemSpacing={1}\n lcdCellWidth={8}\n displayMode={barGaugeMode}\n />\n );\n };\n\n return (\n <div {...cellProps} className={tableStyles.cellContainer}>\n {hasLinks && (\n <DataLinksContextMenu links={getLinks} style={{ display: 'flex', width: '100%' }}>\n {(api) => renderComponent(api)}\n </DataLinksContextMenu>\n )}\n {!hasLinks && (\n <BarGauge\n width={innerWidth}\n height={tableStyles.cellHeightInner}\n field={config}\n display={field.display}\n text={{ valueSize: 14 }}\n value={displayValue}\n orientation={VizOrientation.Horizontal}\n theme={tableStyles.theme}\n itemSpacing={1}\n lcdCellWidth={8}\n displayMode={barGaugeMode}\n />\n )}\n </div>\n );\n};\n","import { isString } from 'lodash';\nimport React from 'react';\n\nimport { ClipboardButton } from '../ClipboardButton/ClipboardButton';\nimport { Modal } from '../Modal/Modal';\nimport { CodeEditor } from '../Monaco/CodeEditor';\n\ninterface TableCellInspectModalProps {\n value: any;\n onDismiss: () => void;\n mode: 'code' | 'text';\n}\n\nexport function TableCellInspectModal({ value, onDismiss, mode }: TableCellInspectModalProps) {\n let displayValue = value;\n if (isString(value)) {\n try {\n value = JSON.parse(value);\n } catch {} // ignore errors\n } else {\n displayValue = JSON.stringify(value, null, ' ');\n }\n let text = displayValue;\n\n if (mode === 'code') {\n text = JSON.stringify(value, null, ' ');\n }\n\n return (\n <Modal onDismiss={onDismiss} isOpen={true} title=\"Inspect value\">\n {mode === 'code' ? (\n <CodeEditor\n width=\"100%\"\n height={500}\n language=\"json\"\n showLineNumbers={true}\n showMiniMap={(text && text.length) > 100}\n value={text}\n readOnly={true}\n />\n ) : (\n <pre>{text}</pre>\n )}\n <Modal.ButtonRow>\n <ClipboardButton icon=\"copy\" getText={() => text}>\n Copy to Clipboard\n </ClipboardButton>\n </Modal.ButtonRow>\n </Modal>\n );\n}\n","import React, { useCallback, useState } from 'react';\n\nimport { IconSize } from '../../types/icon';\nimport { IconButton } from '../IconButton/IconButton';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { TooltipPlacement } from '../Tooltip';\n\nimport { TableCellInspectModal } from './TableCellInspectModal';\nimport { FILTER_FOR_OPERATOR, FILTER_OUT_OPERATOR, TableCellProps, TableFieldOptions } from './types';\nimport { getTextAlign } from './utils';\n\ninterface CellActionProps extends TableCellProps {\n previewMode: 'text' | 'code';\n}\n\nexport function CellActions({ field, cell, previewMode, onCellFilterAdded }: CellActionProps) {\n const [isInspecting, setIsInspecting] = useState(false);\n\n const isRightAligned = getTextAlign(field) === 'flex-end';\n const showFilters = Boolean(field.config.filterable) && cell.value !== undefined;\n const inspectEnabled = Boolean((field.config.custom as TableFieldOptions)?.inspect);\n const commonButtonProps = {\n size: 'sm' as IconSize,\n tooltipPlacement: 'top' as TooltipPlacement,\n };\n\n const onFilterFor = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (onCellFilterAdded) {\n onCellFilterAdded({ key: field.name, operator: FILTER_FOR_OPERATOR, value: cell.value });\n }\n },\n [cell, field, onCellFilterAdded]\n );\n const onFilterOut = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n if (onCellFilterAdded) {\n onCellFilterAdded({ key: field.name, operator: FILTER_OUT_OPERATOR, value: cell.value });\n }\n },\n [cell, field, onCellFilterAdded]\n );\n\n return (\n <>\n <div className={`cellActions ${isRightAligned ? 'cellActionsLeft' : ''}`}>\n <HorizontalGroup spacing=\"xs\">\n {inspectEnabled && (\n <IconButton\n name=\"eye\"\n tooltip=\"Inspect value\"\n onClick={() => {\n setIsInspecting(true);\n }}\n {...commonButtonProps}\n />\n )}\n {showFilters && (\n <IconButton name={'search-plus'} onClick={onFilterFor} tooltip=\"Filter for value\" {...commonButtonProps} />\n )}\n {showFilters && (\n <IconButton name={'search-minus'} onClick={onFilterOut} tooltip=\"Filter out value\" {...commonButtonProps} />\n )}\n </HorizontalGroup>\n </div>\n\n {isInspecting && (\n <TableCellInspectModal\n mode={previewMode}\n value={cell.value}\n onDismiss={() => {\n setIsInspecting(false);\n }}\n />\n )}\n </>\n );\n}\n","import { cx } from '@emotion/css';\nimport React, { FC, ReactElement } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { DisplayValue, Field, formattedValueToString } from '@grafana/data';\n\nimport { getTextColorForBackground, getCellLinks } from '../../utils';\nimport { DataLinksContextMenu } from '../DataLinks/DataLinksContextMenu';\n\nimport { CellActions } from './CellActions';\nimport { TableStyles } from './styles';\nimport { TableCellDisplayMode, TableCellProps, TableFieldOptions } from './types';\n\nexport const DefaultCell: FC<TableCellProps> = (props) => {\n const { field, cell, tableStyles, row, cellProps } = props;\n\n const inspectEnabled = Boolean((field.config.custom as TableFieldOptions)?.inspect);\n const displayValue = field.display!(cell.value);\n\n let value: string | ReactElement;\n if (React.isValidElement(cell.value)) {\n value = cell.value;\n } else {\n value = formattedValueToString(displayValue);\n }\n\n const showFilters = field.config.filterable;\n const showActions = (showFilters && cell.value !== undefined) || inspectEnabled;\n const cellStyle = getCellStyle(tableStyles, field, displayValue, inspectEnabled);\n\n const hasLinks = Boolean(getCellLinks(field, row)?.length);\n\n return (\n <div {...cellProps} className={cellStyle}>\n {!hasLinks && <div className={tableStyles.cellText}>{value}</div>}\n\n {hasLinks && (\n <DataLinksContextMenu links={() => getCellLinks(field, row) || []}>\n {(api) => {\n return (\n <div onClick={api.openMenu} className={cx(tableStyles.cellLink, api.targetClassName)}>\n {value}\n </div>\n );\n }}\n </DataLinksContextMenu>\n )}\n\n {showActions && <CellActions {...props} previewMode=\"text\" />}\n </div>\n );\n};\n\nfunction getCellStyle(\n tableStyles: TableStyles,\n field: Field,\n displayValue: DisplayValue,\n disableOverflowOnHover = false\n) {\n if (field.config.custom?.displayMode === TableCellDisplayMode.ColorText) {\n return tableStyles.buildCellContainerStyle(displayValue.color, undefined, !disableOverflowOnHover);\n }\n\n if (field.config.custom?.displayMode === TableCellDisplayMode.ColorBackgroundSolid) {\n const bgColor = tinycolor(displayValue.color);\n const textColor = getTextColorForBackground(displayValue.color!);\n return tableStyles.buildCellContainerStyle(textColor, bgColor.toRgbString(), !disableOverflowOnHover);\n }\n\n if (field.config.custom?.displayMode === TableCellDisplayMode.ColorBackground) {\n const themeFactor = tableStyles.theme.isDark ? 1 : -0.7;\n const bgColor2 = tinycolor(displayValue.color)\n .darken(10 * themeFactor)\n .spin(5)\n .toRgbString();\n\n const textColor = getTextColorForBackground(displayValue.color!);\n\n return tableStyles.buildCellContainerStyle(\n textColor,\n `linear-gradient(120deg, ${bgColor2}, ${displayValue.color})`,\n !disableOverflowOnHover\n );\n }\n\n return disableOverflowOnHover ? tableStyles.cellContainerNoOverflow : tableStyles.cellContainer;\n}\n","import WKT from 'ol/format/WKT';\nimport { Geometry } from 'ol/geom';\nimport React from 'react';\n\nimport { TableCellProps } from './types';\n\nexport function GeoCell(props: TableCellProps): JSX.Element {\n const { cell, tableStyles, cellProps } = props;\n\n let disp = '';\n\n if (cell.value instanceof Geometry) {\n disp = new WKT().writeGeometry(cell.value, {\n featureProjection: 'EPSG:3857',\n dataProjection: 'EPSG:4326',\n });\n } else if (cell.value != null) {\n disp = `${cell.value}`;\n }\n\n return (\n <div {...cellProps} className={tableStyles.cellContainer}>\n <div className={tableStyles.cellText} style={{ fontFamily: 'monospace' }}>\n {disp}\n </div>\n </div>\n );\n}\n","import { cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { getCellLinks } from '../../utils';\nimport { DataLinksContextMenu } from '../DataLinks/DataLinksContextMenu';\n\nimport { TableCellProps } from './types';\n\nexport const ImageCell: FC<TableCellProps> = (props) => {\n const { field, cell, tableStyles, row, cellProps } = props;\n\n const displayValue = field.display!(cell.value);\n\n const hasLinks = Boolean(getCellLinks(field, row)?.length);\n\n return (\n <div {...cellProps} className={tableStyles.cellContainer}>\n {!hasLinks && <img src={displayValue.text} className={tableStyles.imageCell} />}\n {hasLinks && (\n <DataLinksContextMenu links={() => getCellLinks(field, row) || []}>\n {(api) => {\n return (\n <div onClick={api.openMenu} className={cx(tableStyles.imageCellLink, api.targetClassName)}>\n <img src={displayValue.text} className={tableStyles.imageCell} />\n </div>\n );\n }}\n </DataLinksContextMenu>\n )}\n </div>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport { isString } from 'lodash';\nimport React from 'react';\n\nimport { getCellLinks } from '../../utils';\nimport { DataLinksContextMenu } from '../DataLinks/DataLinksContextMenu';\n\nimport { CellActions } from './CellActions';\nimport { TableCellProps, TableFieldOptions } from './types';\n\nexport function JSONViewCell(props: TableCellProps): JSX.Element {\n const { cell, tableStyles, cellProps, field, row } = props;\n const inspectEnabled = Boolean((field.config.custom as TableFieldOptions)?.inspect);\n const txt = css`\n cursor: pointer;\n font-family: monospace;\n `;\n\n let value = cell.value;\n let displayValue = value;\n\n if (isString(value)) {\n try {\n value = JSON.parse(value);\n } catch {} // ignore errors\n } else {\n displayValue = JSON.stringify(value, null, ' ');\n }\n\n const hasLinks = Boolean(getCellLinks(field, row)?.length);\n\n return (\n <div {...cellProps} className={inspectEnabled ? tableStyles.cellContainerNoOverflow : tableStyles.cellContainer}>\n <div className={cx(tableStyles.cellText, txt)}>\n {!hasLinks && <div className={tableStyles.cellText}>{displayValue}</div>}\n {hasLinks && (\n <DataLinksContextMenu links={() => getCellLinks(field, row) || []}>\n {(api) => {\n return (\n <div onClick={api.openMenu} className={api.targetClassName}>\n {displayValue}\n </div>\n );\n }}\n </DataLinksContextMenu>\n )}\n </div>\n {inspectEnabled && <CellActions {...props} previewMode=\"code\" />}\n </div>\n );\n}\n","import { Property } from 'csstype';\nimport memoizeOne from 'memoize-one';\nimport { Row } from 'react-table';\n\nimport {\n DataFrame,\n Field,\n FieldType,\n formattedValueToString,\n getFieldDisplayName,\n SelectableValue,\n} from '@grafana/data';\n\nimport { BarGaugeCell } from './BarGaugeCell';\nimport { DefaultCell } from './DefaultCell';\nimport { getFooterValue } from './FooterRow';\nimport { GeoCell } from './GeoCell';\nimport { ImageCell } from './ImageCell';\nimport { JSONViewCell } from './JSONViewCell';\nimport { CellComponent, TableCellDisplayMode, TableFieldOptions, FooterItem, GrafanaTableColumn } from './types';\n\nexport function getTextAlign(field?: Field): Property.JustifyContent {\n if (!field) {\n return 'flex-start';\n }\n\n if (field.config.custom) {\n const custom = field.config.custom as TableFieldOptions;\n\n switch (custom.align) {\n case 'right':\n return 'flex-end';\n case 'left':\n return 'flex-start';\n case 'center':\n return 'center';\n }\n }\n\n if (field.type === FieldType.number) {\n return 'flex-end';\n }\n\n return 'flex-start';\n}\n\nexport function getColumns(\n data: DataFrame,\n availableWidth: number,\n columnMinWidth: number,\n footerValues?: FooterItem[]\n): GrafanaTableColumn[] {\n const columns: GrafanaTableColumn[] = [];\n let fieldCountWithoutWidth = 0;\n\n for (const [fieldIndex, field] of data.fields.entries()) {\n const fieldTableOptions = (field.config.custom || {}) as TableFieldOptions;\n\n if (fieldTableOptions.hidden) {\n continue;\n }\n\n if (fieldTableOptions.width) {\n availableWidth -= fieldTableOptions.width;\n } else {\n fieldCountWithoutWidth++;\n }\n\n const selectSortType = (type: FieldType) => {\n switch (type) {\n case FieldType.number:\n return 'number';\n case FieldType.time:\n return 'basic';\n default:\n return 'alphanumeric-insensitive';\n }\n };\n\n const Cell = getCellComponent(fieldTableOptions.displayMode, field);\n columns.push({\n Cell,\n id: fieldIndex.toString(),\n field: field,\n Header: getFieldDisplayName(field, data),\n accessor: (row: any, i: number) => {\n return field.values.get(i);\n },\n sortType: selectSortType(field.type),\n width: fieldTableOptions.width,\n minWidth: fieldTableOptions.minWidth ?? columnMinWidth,\n filter: memoizeOne(filterByValue(field)),\n justifyContent: getTextAlign(field),\n Footer: getFooterValue(fieldIndex, footerValues),\n });\n }\n\n // set columns that are at minimum width\n let sharedWidth = availableWidth / fieldCountWithoutWidth;\n for (let i = fieldCountWithoutWidth; i > 0; i--) {\n for (const column of columns) {\n if (!column.width && column.minWidth > sharedWidth) {\n column.width = column.minWidth;\n availableWidth -= column.width;\n fieldCountWithoutWidth -= 1;\n sharedWidth = availableWidth / fieldCountWithoutWidth;\n }\n }\n }\n\n // divide up the rest of the space\n for (const column of columns) {\n if (!column.width) {\n column.width = sharedWidth;\n }\n column.minWidth = 50;\n }\n\n return columns;\n}\n\nexport function getCellComponent(displayMode: TableCellDisplayMode, field: Field): CellComponent {\n switch (displayMode) {\n case TableCellDisplayMode.ColorText:\n case TableCellDisplayMode.ColorBackground:\n return DefaultCell;\n case TableCellDisplayMode.Image:\n return ImageCell;\n case TableCellDisplayMode.LcdGauge:\n case TableCellDisplayMode.BasicGauge:\n case TableCellDisplayMode.GradientGauge:\n return BarGaugeCell;\n case TableCellDisplayMode.JSONView:\n return JSONViewCell;\n }\n\n if (field.type === FieldType.geo) {\n return GeoCell;\n }\n\n // Default or Auto\n if (field.type === FieldType.other) {\n return JSONViewCell;\n }\n return DefaultCell;\n}\n\nexport function filterByValue(field?: Field) {\n return function (rows: Row[], id: string, filterValues?: SelectableValue[]) {\n if (rows.length === 0) {\n return rows;\n }\n\n if (!filterValues) {\n return rows;\n }\n\n if (!field) {\n return rows;\n }\n\n return rows.filter((row) => {\n if (!row.values.hasOwnProperty(id)) {\n return false;\n }\n const value = rowToFieldValue(row, field);\n return filterValues.find((filter) => filter.value === value) !== undefined;\n });\n };\n}\n\nexport function calculateUniqueFieldValues(rows: any[], field?: Field) {\n if (!field || rows.length === 0) {\n return {};\n }\n\n const set: Record<string, any> = {};\n\n for (let index = 0; index < rows.length; index++) {\n const value = rowToFieldValue(rows[index], field);\n set[value || '(Blanks)'] = value;\n }\n\n return set;\n}\n\nexport function rowToFieldValue(row: any, field?: Field): string {\n if (!field || !row) {\n return '';\n }\n\n const fieldValue = field.values.get(row.index);\n const displayValue = field.display ? field.display(fieldValue) : fieldValue;\n const value = field.display ? formattedValueToString(displayValue) : displayValue;\n\n return value;\n}\n\nexport function valuesToOptions(unique: Record<string, any>): SelectableValue[] {\n return Object.keys(unique)\n .reduce((all, key) => all.concat({ value: unique[key], label: key }), [] as SelectableValue[])\n .sort(sortOptions);\n}\n\nexport function sortOptions(a: SelectableValue, b: SelectableValue): number {\n if (a.label === undefined && b.label === undefined) {\n return 0;\n }\n\n if (a.label === undefined && b.label !== undefined) {\n return -1;\n }\n\n if (a.label !== undefined && b.label === undefined) {\n return 1;\n }\n\n if (a.label! < b.label!) {\n return -1;\n }\n\n if (a.label! > b.label!) {\n return 1;\n }\n\n return 0;\n}\n\nexport function getFilteredOptions(options: SelectableValue[], filterValues?: SelectableValue[]): SelectableValue[] {\n if (!filterValues) {\n return [];\n }\n\n return options.filter((option) => filterValues.some((filtered) => filtered.value === option.value));\n}\n\nexport function sortCaseInsensitive(a: Row<any>, b: Row<any>, id: string) {\n return String(a.values[id]).localeCompare(String(b.values[id]), undefined, { sensitivity: 'base' });\n}\n\n// sortNumber needs to have great performance as it is called a lot\nexport function sortNumber(rowA: Row<any>, rowB: Row<any>, id: string) {\n const a = toNumber(rowA.values[id]);\n const b = toNumber(rowB.values[id]);\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction toNumber(value: any): number {\n if (value === null || value === undefined || value === '' || isNaN(value)) {\n return Number.NEGATIVE_INFINITY;\n }\n\n if (typeof value === 'number') {\n return value;\n }\n\n return Number(value);\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC, useCallback, useMemo, useState } from 'react';\n\nimport { Field, GrafanaTheme, SelectableValue } from '@grafana/data';\n\nimport { Button, ClickOutsideWrapper, HorizontalGroup, IconButton, Label, VerticalGroup } from '..';\nimport { stylesFactory, useStyles, useTheme2 } from '../../themes';\n\nimport { FilterList } from './FilterList';\nimport { TableStyles } from './styles';\nimport { calculateUniqueFieldValues, getFilteredOptions, valuesToOptions } from './utils';\n\ninterface Props {\n column: any;\n tableStyles: TableStyles;\n onClose: () => void;\n field?: Field;\n}\n\nexport const FilterPopup: FC<Props> = ({ column: { preFilteredRows, filterValue, setFilter }, onClose, field }) => {\n const theme = useTheme2();\n const uniqueValues = useMemo(() => calculateUniqueFieldValues(preFilteredRows, field), [preFilteredRows, field]);\n const options = useMemo(() => valuesToOptions(uniqueValues), [uniqueValues]);\n const filteredOptions = useMemo(() => getFilteredOptions(options, filterValue), [options, filterValue]);\n const [values, setValues] = useState<SelectableValue[]>(filteredOptions);\n const [matchCase, setMatchCase] = useState(false);\n\n const onCancel = useCallback((event?: React.MouseEvent) => onClose(), [onClose]);\n\n const onFilter = useCallback(\n (event: React.MouseEvent) => {\n const filtered = values.length ? values : undefined;\n\n setFilter(filtered);\n onClose();\n },\n [setFilter, values, onClose]\n );\n\n const onClearFilter = useCallback(\n (event: React.MouseEvent) => {\n setFilter(undefined);\n onClose();\n },\n [setFilter, onClose]\n );\n\n const clearFilterVisible = useMemo(() => filterValue !== undefined, [filterValue]);\n const styles = useStyles(getStyles);\n\n return (\n <ClickOutsideWrapper onClick={onCancel} useCapture={true}>\n <div className={cx(styles.filterContainer)} onClick={stopPropagation}>\n <VerticalGroup spacing=\"lg\">\n <VerticalGroup spacing=\"xs\">\n <HorizontalGroup justify=\"space-between\" align=\"center\">\n <Label className={styles.label}>Filter by values:</Label>\n <IconButton\n name=\"text-fields\"\n tooltip=\"Match case\"\n style={{ color: matchCase ? theme.colors.text.link : theme.colors.text.disabled }}\n onClick={() => {\n setMatchCase((s) => !s);\n }}\n />\n </HorizontalGroup>\n <div className={cx(styles.listDivider)} />\n <FilterList onChange={setValues} values={values} options={options} caseSensitive={matchCase} />\n </VerticalGroup>\n <HorizontalGroup spacing=\"lg\">\n <HorizontalGroup>\n <Button size=\"sm\" onClick={onFilter}>\n Ok\n </Button>\n <Button size=\"sm\" variant=\"secondary\" onClick={onCancel}>\n Cancel\n </Button>\n </HorizontalGroup>\n {clearFilterVisible && (\n <HorizontalGroup>\n <Button fill=\"text\" size=\"sm\" onClick={onClearFilter}>\n Clear filter\n </Button>\n </HorizontalGroup>\n )}\n </HorizontalGroup>\n </VerticalGroup>\n </div>\n </ClickOutsideWrapper>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n filterContainer: css`\n label: filterContainer;\n width: 100%;\n min-width: 250px;\n height: 100%;\n max-height: 400px;\n background-color: ${theme.colors.bg1};\n border: ${theme.border.width.sm} solid ${theme.colors.border2};\n padding: ${theme.spacing.md};\n margin: ${theme.spacing.sm} 0;\n box-shadow: 0px 0px 20px ${theme.colors.dropdownShadow};\n border-radius: ${theme.spacing.xs};\n `,\n listDivider: css`\n label: listDivider;\n width: 100%;\n border-top: ${theme.border.width.sm} solid ${theme.colors.border2};\n padding: ${theme.spacing.xs} ${theme.spacing.md};\n `,\n label: css`\n margin-bottom: 0;\n `,\n}));\n\nconst stopPropagation = (event: React.MouseEvent) => {\n event.stopPropagation();\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC, useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Field, GrafanaTheme } from '@grafana/data';\n\nimport { Popover } from '..';\nimport { stylesFactory, useStyles } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\nimport { FilterPopup } from './FilterPopup';\nimport { TableStyles } from './styles';\n\ninterface Props {\n column: any;\n tableStyles: TableStyles;\n field?: Field;\n}\n\nexport const Filter: FC<Props> = ({ column, field, tableStyles }) => {\n const ref = useRef<HTMLDivElement>(null);\n const [isPopoverVisible, setPopoverVisible] = useState<boolean>(false);\n const styles = useStyles(getStyles);\n const filterEnabled = useMemo(() => Boolean(column.filterValue), [column.filterValue]);\n const onShowPopover = useCallback(() => setPopoverVisible(true), [setPopoverVisible]);\n const onClosePopover = useCallback(() => setPopoverVisible(false), [setPopoverVisible]);\n\n if (!field || !field.config.custom?.filterable) {\n return null;\n }\n\n return (\n <span\n className={cx(tableStyles.headerFilter, filterEnabled ? styles.filterIconEnabled : styles.filterIconDisabled)}\n ref={ref}\n role=\"filterIcon\"\n onClick={onShowPopover}\n >\n <Icon name=\"filter\" />\n {isPopoverVisible && ref.current && (\n <Popover\n content={<FilterPopup column={column} tableStyles={tableStyles} field={field} onClose={onClosePopover} />}\n placement=\"bottom-start\"\n referenceElement={ref.current}\n show\n />\n )}\n </span>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n filterIconEnabled: css`\n label: filterIconEnabled;\n color: ${theme.colors.textBlue};\n `,\n filterIconDisabled: css`\n label: filterIconDisabled;\n color: ${theme.colors.textFaint};\n `,\n}));\n","import React from 'react';\nimport { HeaderGroup, Column } from 'react-table';\n\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2 } from '../../themes';\nimport { getFieldTypeIcon } from '../../types';\nimport { Icon } from '../Icon/Icon';\n\nimport { Filter } from './Filter';\nimport { getTableStyles, TableStyles } from './styles';\n\nexport interface HeaderRowProps {\n headerGroups: HeaderGroup[];\n showTypeIcons?: boolean;\n}\n\nexport const HeaderRow = (props: HeaderRowProps) => {\n const { headerGroups, showTypeIcons } = props;\n const e2eSelectorsTable = selectors.components.Panels.Visualization.Table;\n const tableStyles = useStyles2(getTableStyles);\n\n return (\n <div role=\"rowgroup\">\n {headerGroups.map((headerGroup: HeaderGroup) => {\n const { key, ...headerGroupProps } = headerGroup.getHeaderGroupProps();\n return (\n <div\n className={tableStyles.thead}\n {...headerGroupProps}\n key={key}\n aria-label={e2eSelectorsTable.header}\n role=\"row\"\n >\n {headerGroup.headers.map((column: Column, index: number) =>\n renderHeaderCell(column, tableStyles, showTypeIcons)\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\nfunction renderHeaderCell(column: any, tableStyles: TableStyles, showTypeIcons?: boolean) {\n const headerProps = column.getHeaderProps();\n const field = column.field ?? null;\n\n if (column.canResize) {\n headerProps.style.userSelect = column.isResizing ? 'none' : 'auto'; // disables selecting text while resizing\n }\n\n headerProps.style.position = 'absolute';\n headerProps.style.justifyContent = (column as any).justifyContent;\n\n return (\n <div className={tableStyles.headerCell} {...headerProps} role=\"columnheader\">\n {column.canSort && (\n <>\n <button {...column.getSortByToggleProps()} className={tableStyles.headerCellLabel}>\n {showTypeIcons && (\n <Icon name={getFieldTypeIcon(field)} title={field?.type} size=\"sm\" className={tableStyles.typeIcon} />\n )}\n <div>{column.render('Header')}</div>\n <div>\n {column.isSorted && (column.isSortedDesc ? <Icon name=\"arrow-down\" /> : <Icon name=\"arrow-up\" />)}\n </div>\n </button>\n {column.canFilter && <Filter column={column} tableStyles={tableStyles} field={field} />}\n </>\n )}\n {!column.canSort && column.render('Header')}\n {!column.canSort && column.canFilter && <Filter column={column} tableStyles={tableStyles} field={field} />}\n {column.canResize && <div {...column.getResizerProps()} className={tableStyles.resizeHandle} />}\n </div>\n );\n}\n","import React, { FC, memo, useCallback, useEffect, useMemo } from 'react';\nimport {\n Cell,\n Column,\n TableState,\n useAbsoluteLayout,\n useFilters,\n usePagination,\n useResizeColumns,\n useSortBy,\n useTable,\n} from 'react-table';\nimport { FixedSizeList } from 'react-window';\n\nimport { DataFrame, getFieldDisplayName } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { Pagination } from '../Pagination/Pagination';\n\nimport { FooterRow } from './FooterRow';\nimport { HeaderRow } from './HeaderRow';\nimport { TableCell } from './TableCell';\nimport { getTableStyles } from './styles';\nimport {\n TableColumnResizeActionCallback,\n TableFilterActionCallback,\n FooterItem,\n TableSortByActionCallback,\n TableSortByFieldState,\n} from './types';\nimport { getColumns, sortCaseInsensitive, sortNumber } from './utils';\n\nconst COLUMN_MIN_WIDTH = 150;\n\nexport interface Props {\n ariaLabel?: string;\n data: DataFrame;\n width: number;\n height: number;\n /** Minimal column width specified in pixels */\n columnMinWidth?: number;\n noHeader?: boolean;\n showTypeIcons?: boolean;\n resizable?: boolean;\n initialSortBy?: TableSortByFieldState[];\n onColumnResize?: TableColumnResizeActionCallback;\n onSortByChange?: TableSortByActionCallback;\n onCellFilterAdded?: TableFilterActionCallback;\n footerValues?: FooterItem[];\n enablePagination?: boolean;\n}\n\nfunction useTableStateReducer({ onColumnResize, onSortByChange, data }: Props) {\n return useCallback(\n (newState: TableState, action: any) => {\n switch (action.type) {\n case 'columnDoneResizing':\n if (onColumnResize) {\n const info = (newState.columnResizing.headerIdWidths as any)[0];\n const columnIdString = info[0];\n const fieldIndex = parseInt(columnIdString, 10);\n const width = Math.round(newState.columnResizing.columnWidths[columnIdString] as number);\n\n const field = data.fields[fieldIndex];\n if (!field) {\n return newState;\n }\n\n const fieldDisplayName = getFieldDisplayName(field, data);\n onColumnResize(fieldDisplayName, width);\n }\n case 'toggleSortBy':\n if (onSortByChange) {\n const sortByFields: TableSortByFieldState[] = [];\n\n for (const sortItem of newState.sortBy) {\n const field = data.fields[parseInt(sortItem.id, 10)];\n if (!field) {\n continue;\n }\n\n sortByFields.push({\n displayName: getFieldDisplayName(field, data),\n desc: sortItem.desc,\n });\n }\n\n onSortByChange(sortByFields);\n }\n break;\n }\n\n return newState;\n },\n [data, onColumnResize, onSortByChange]\n );\n}\n\nfunction getInitialState(initialSortBy: Props['initialSortBy'], columns: Column[]): Partial<TableState> {\n const state: Partial<TableState> = {};\n\n if (initialSortBy) {\n state.sortBy = [];\n\n for (const sortBy of initialSortBy) {\n for (const col of columns) {\n if (col.Header === sortBy.displayName) {\n state.sortBy.push({ id: col.id as string, desc: sortBy.desc });\n }\n }\n }\n }\n\n return state;\n}\n\nexport const Table: FC<Props> = memo((props: Props) => {\n const {\n ariaLabel,\n data,\n height,\n onCellFilterAdded,\n width,\n columnMinWidth = COLUMN_MIN_WIDTH,\n noHeader,\n resizable = true,\n initialSortBy,\n footerValues,\n showTypeIcons,\n enablePagination,\n } = props;\n\n const tableStyles = useStyles2(getTableStyles);\n const headerHeight = noHeader ? 0 : tableStyles.cellHeight;\n\n const footerHeight = useMemo(() => {\n const EXTENDED_ROW_HEIGHT = 33;\n let length = 0;\n\n if (!footerValues) {\n return 0;\n }\n\n for (const fv of footerValues) {\n if (Array.isArray(fv) && fv.length > length) {\n length = fv.length;\n }\n }\n\n if (length > 1) {\n return EXTENDED_ROW_HEIGHT * length;\n }\n\n return EXTENDED_ROW_HEIGHT;\n }, [footerValues]);\n\n // React table data array. This data acts just like a dummy array to let react-table know how many rows exist\n // The cells use the field to look up values\n const memoizedData = useMemo(() => {\n if (!data.fields.length) {\n return [];\n }\n // as we only use this to fake the length of our data set for react-table we need to make sure we always return an array\n // filled with values at each index otherwise we'll end up trying to call accessRow for null|undefined value in\n // https://github.com/tannerlinsley/react-table/blob/7be2fc9d8b5e223fc998af88865ae86a88792fdb/src/hooks/useTable.js#L585\n return Array(data.length).fill(0);\n }, [data]);\n\n // React-table column definitions\n const memoizedColumns = useMemo(\n () => getColumns(data, width, columnMinWidth, footerValues),\n [data, width, columnMinWidth, footerValues]\n );\n\n // Internal react table state reducer\n const stateReducer = useTableStateReducer(props);\n\n const options: any = useMemo(\n () => ({\n columns: memoizedColumns,\n data: memoizedData,\n disableResizing: !resizable,\n stateReducer: stateReducer,\n initialState: getInitialState(initialSortBy, memoizedColumns),\n autoResetFilters: false,\n sortTypes: {\n number: sortNumber, // the builtin number type on react-table does not handle NaN values\n 'alphanumeric-insensitive': sortCaseInsensitive, // should be replace with the builtin string when react-table is upgraded, see https://github.com/tannerlinsley/react-table/pull/3235\n },\n }),\n [initialSortBy, memoizedColumns, memoizedData, resizable, stateReducer]\n );\n\n const {\n getTableProps,\n headerGroups,\n rows,\n prepareRow,\n totalColumnsWidth,\n footerGroups,\n page,\n state,\n gotoPage,\n setPageSize,\n pageOptions,\n } = useTable(options, useFilters, useSortBy, usePagination, useAbsoluteLayout, useResizeColumns);\n\n let listHeight = height - (headerHeight + footerHeight);\n if (enablePagination) {\n listHeight -= tableStyles.cellHeight;\n }\n const pageSize = Math.round(listHeight / tableStyles.cellHeight) - 1;\n\n useEffect(() => {\n // Don't update the page size if it is less than 1\n if (pageSize <= 0) {\n return;\n }\n setPageSize(pageSize);\n }, [pageSize, setPageSize]);\n\n const RenderRow = React.useCallback(\n ({ index: rowIndex, style }) => {\n let row = rows[rowIndex];\n if (enablePagination) {\n row = page[rowIndex];\n }\n prepareRow(row);\n return (\n <div {...row.getRowProps({ style })} className={tableStyles.row}>\n {row.cells.map((cell: Cell, index: number) => (\n <TableCell\n key={index}\n tableStyles={tableStyles}\n cell={cell}\n onCellFilterAdded={onCellFilterAdded}\n columnIndex={index}\n columnCount={row.cells.length}\n />\n ))}\n </div>\n );\n },\n [onCellFilterAdded, page, enablePagination, prepareRow, rows, tableStyles]\n );\n\n const onNavigate = useCallback(\n (toPage: number) => {\n gotoPage(toPage - 1);\n },\n [gotoPage]\n );\n\n const itemCount = enablePagination ? page.length : rows.length;\n let paginationEl = null;\n if (enablePagination) {\n const itemsRangeStart = state.pageIndex * state.pageSize + 1;\n let itemsRangeEnd = itemsRangeStart + state.pageSize - 1;\n const isSmall = width < 550;\n if (itemsRangeEnd > data.length) {\n itemsRangeEnd = data.length;\n }\n paginationEl = (\n <div className={tableStyles.paginationWrapper}>\n {isSmall ? null : <div className={tableStyles.paginationItem} />}\n <div className={tableStyles.paginationCenterItem}>\n <Pagination\n currentPage={state.pageIndex + 1}\n numberOfPages={pageOptions.length}\n showSmallVersion={isSmall}\n onNavigate={onNavigate}\n />\n </div>\n {isSmall ? null : (\n <div className={tableStyles.paginationSummary}>\n {itemsRangeStart} - {itemsRangeEnd} of {data.length} rows\n </div>\n )}\n </div>\n );\n }\n return (\n <div {...getTableProps()} className={tableStyles.table} aria-label={ariaLabel} role=\"table\">\n <CustomScrollbar hideVerticalTrack={true}>\n <div className={tableStyles.tableContentWrapper(totalColumnsWidth)}>\n {!noHeader && <HeaderRow headerGroups={headerGroups} showTypeIcons={showTypeIcons} />}\n {itemCount > 0 ? (\n <FixedSizeList\n height={listHeight}\n itemCount={itemCount}\n itemSize={tableStyles.rowHeight}\n width={'100%'}\n style={{ overflow: 'hidden auto' }}\n >\n {RenderRow}\n </FixedSizeList>\n ) : (\n <div style={{ height: height - headerHeight }} className={tableStyles.noData}>\n No data\n </div>\n )}\n {footerValues && (\n <FooterRow\n height={footerHeight}\n isPaginationVisible={Boolean(enablePagination)}\n footerValues={footerValues}\n footerGroups={footerGroups}\n totalColumnsWidth={totalColumnsWidth}\n />\n )}\n </div>\n </CustomScrollbar>\n {paginationEl}\n </div>\n );\n});\n\nTable.displayName = 'Table';\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLProps } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { getFocusStyle, sharedInputStyle } from '../Forms/commonStyles';\n\nexport interface Props extends Omit<HTMLProps<HTMLTextAreaElement>, 'size'> {\n /** Show an invalid state around the input */\n invalid?: boolean;\n}\n\nexport const TextArea = React.forwardRef<HTMLTextAreaElement, Props>(({ invalid, className, ...props }, ref) => {\n const theme = useTheme2();\n const styles = getTextAreaStyle(theme, invalid);\n\n return <textarea {...props} className={cx(styles.textarea, className)} ref={ref} />;\n});\n\nconst getTextAreaStyle = stylesFactory((theme: GrafanaTheme2, invalid = false) => {\n return {\n textarea: cx(\n sharedInputStyle(theme),\n getFocusStyle(theme.v1),\n css`\n border-radius: ${theme.shape.borderRadius()};\n padding: ${theme.spacing.gridSize / 4}px ${theme.spacing.gridSize}px;\n width: 100%;\n border-color: ${invalid ? theme.colors.error.border : theme.components.input.borderColor};\n `\n ),\n };\n});\n\nTextArea.displayName = 'TextArea';\n","import { css } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme, DataFrame, CSVConfig, readCSV } from '@grafana/data';\n\nimport { stylesFactory, withTheme } from '../../themes';\nimport { Themeable } from '../../types/theme';\nimport { Icon } from '../Icon/Icon';\nimport { TextArea } from '../TextArea/TextArea';\n\ninterface Props extends Themeable {\n config?: CSVConfig;\n text: string;\n width: string | number;\n height: string | number;\n onSeriesParsed: (data: DataFrame[], text: string) => void;\n}\n\ninterface State {\n text: string;\n data: DataFrame[];\n}\n\n/**\n * Expects the container div to have size set and will fill it 100%\n */\nexport class UnThemedTableInputCSV extends React.PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n const { text, config } = props;\n this.state = {\n text,\n data: readCSV(text, { config }),\n };\n }\n\n readCSV: any = debounce(() => {\n const { config } = this.props;\n const { text } = this.state;\n\n this.setState({ data: readCSV(text, { config }) });\n }, 150);\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n const { text } = this.state;\n\n if (text !== prevState.text || this.props.config !== prevProps.config) {\n this.readCSV();\n }\n\n // If the props text has changed, replace our local version\n if (this.props.text !== prevProps.text && this.props.text !== text) {\n this.setState({ text: this.props.text });\n }\n\n if (this.state.data !== prevState.data) {\n this.props.onSeriesParsed(this.state.data, this.state.text);\n }\n }\n\n onTextChange = (event: any) => {\n this.setState({ text: event.target.value });\n };\n\n render() {\n const { width, height, theme } = this.props;\n const { data } = this.state;\n const styles = getStyles(theme);\n return (\n <div className={styles.tableInputCsv}>\n <TextArea\n style={{ width, height }}\n placeholder=\"Enter CSV here...\"\n value={this.state.text}\n onChange={this.onTextChange}\n className={styles.textarea}\n />\n {data && (\n <footer className={styles.footer}>\n {data.map((frame, index) => {\n return (\n <span key={index}>\n Rows:{frame.length}, Columns:{frame.fields.length} \n <Icon name=\"check-circle\" />\n </span>\n );\n })}\n </footer>\n )}\n </div>\n );\n }\n}\n\nexport const TableInputCSV = withTheme(UnThemedTableInputCSV);\nTableInputCSV.displayName = 'TableInputCSV';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n tableInputCsv: css`\n position: relative;\n `,\n textarea: css`\n height: 100%;\n width: 100%;\n `,\n footer: css`\n position: absolute;\n bottom: 15px;\n right: 15px;\n border: 1px solid #222;\n background: ${theme.palette.online};\n padding: 1px ${theme.spacing.xs};\n font-size: 80%;\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\n\nimport { Counter } from './Counter';\nimport { TabProps } from './Tab';\n\nexport const VerticalTab = React.forwardRef<HTMLAnchorElement, TabProps>(\n ({ label, active, icon, counter, className, suffix: Suffix, onChangeTab, href, ...otherProps }, ref) => {\n const tabsStyles = useStyles2(getTabStyles);\n const content = () => (\n <>\n {icon && <Icon name={icon} />}\n {label}\n {typeof counter === 'number' && <Counter value={counter} />}\n {Suffix && <Suffix className={tabsStyles.suffix} />}\n </>\n );\n\n const linkClass = cx(tabsStyles.link, active && tabsStyles.activeStyle);\n\n return (\n <li className={tabsStyles.item}>\n <a\n href={href}\n className={linkClass}\n {...otherProps}\n onClick={onChangeTab}\n aria-label={otherProps['aria-label'] || selectors.components.Tab.title(label)}\n role=\"tab\"\n aria-selected={active}\n ref={ref}\n >\n {content()}\n </a>\n </li>\n );\n }\n);\n\nVerticalTab.displayName = 'Tab';\n\nconst getTabStyles = (theme: GrafanaTheme2) => {\n return {\n item: css`\n list-style: none;\n margin-right: ${theme.spacing(2)};\n position: relative;\n display: block;\n `,\n link: css`\n padding: 6px 12px;\n display: block;\n height: 100%;\n cursor: pointer;\n\n color: ${theme.colors.text.primary};\n\n svg {\n margin-right: ${theme.spacing(1)};\n }\n\n &:hover,\n &:focus {\n text-decoration: underline;\n }\n `,\n activeStyle: css`\n label: activeTabStyle;\n color: ${theme.colors.text.maxContrast};\n font-weight: 500;\n overflow: hidden;\n\n &::before {\n display: block;\n content: ' ';\n position: absolute;\n left: 0;\n width: 4px;\n bottom: 2px;\n top: 2px;\n border-radius: 2px;\n background-image: linear-gradient(0deg, #f05a28 30%, #fbca0a 99%);\n }\n `,\n suffix: css`\n margin-left: ${theme.spacing(1)};\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC, HTMLAttributes, ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nconst getTabContentStyle = stylesFactory((theme: GrafanaTheme2) => {\n return {\n tabContent: css`\n background: ${theme.colors.background.primary};\n `,\n };\n});\n\nexport const TabContent: FC<Props> = ({ children, className, ...restProps }) => {\n const theme = useTheme2();\n const styles = getTabContentStyle(theme);\n\n return (\n <div {...restProps} className={cx(styles.tabContent, className)}>\n {children}\n </div>\n );\n};\n","import tinycolor from 'tinycolor2';\nimport uPlot from 'uplot';\n\nimport {\n colorManipulator,\n FieldColorMode,\n FieldColorModeId,\n GrafanaTheme2,\n ThresholdsConfig,\n ThresholdsMode,\n} from '@grafana/data';\nimport { ScaleOrientation } from '@grafana/schema';\n\nimport { getCanvasContext } from '../../../utils/measureText';\n\nfunction makeDirectionalGradient(direction: GradientDirection, bbox: uPlot.BBox, ctx: CanvasRenderingContext2D) {\n let x0 = 0,\n y0 = 0,\n x1 = 0,\n y1 = 0;\n\n if (direction === GradientDirection.Down) {\n y0 = bbox.top;\n y1 = bbox.top + bbox.height;\n } else if (direction === GradientDirection.Left) {\n x0 = bbox.left + bbox.width;\n x1 = bbox.left;\n } else if (direction === GradientDirection.Up) {\n y0 = bbox.top + bbox.height;\n y1 = bbox.top;\n } else if (direction === GradientDirection.Right) {\n x0 = bbox.left;\n x1 = bbox.left + bbox.width;\n }\n\n return ctx.createLinearGradient(x0, y0, x1, y1);\n}\n\nexport function getOpacityGradientFn(\n color: string,\n opacity: number\n): (self: uPlot, seriesIdx: number) => CanvasGradient {\n return (plot: uPlot, seriesIdx: number) => {\n const ctx = getCanvasContext();\n const gradient = makeDirectionalGradient(\n plot.scales.x!.ori === ScaleOrientation.Horizontal ? GradientDirection.Down : GradientDirection.Left,\n plot.bbox,\n ctx\n );\n\n gradient.addColorStop(0, colorManipulator.alpha(color, opacity));\n gradient.addColorStop(1, colorManipulator.alpha(color, 0));\n\n return gradient;\n };\n}\n\nexport function getHueGradientFn(\n color: string,\n opacity: number,\n theme: GrafanaTheme2\n): (self: uPlot, seriesIdx: number) => CanvasGradient {\n return (plot: uPlot, seriesIdx: number) => {\n const ctx = getCanvasContext();\n const gradient = makeDirectionalGradient(\n plot.scales.x!.ori === ScaleOrientation.Horizontal ? GradientDirection.Down : GradientDirection.Left,\n plot.bbox,\n ctx\n );\n\n const color1 = tinycolor(color).spin(-15);\n const color2 = tinycolor(color).spin(15);\n\n if (theme.isDark) {\n gradient.addColorStop(0, color2.lighten(10).setAlpha(opacity).toString());\n gradient.addColorStop(1, color1.darken(10).setAlpha(opacity).toString());\n } else {\n gradient.addColorStop(0, color2.lighten(10).setAlpha(opacity).toString());\n gradient.addColorStop(1, color1.setAlpha(opacity).toString());\n }\n\n return gradient;\n };\n}\n\nexport enum GradientDirection {\n Right = 0,\n Up = 1,\n Left = 2,\n Down = 3,\n}\n\ntype ValueStop = [value: number, color: string];\n\ntype ScaleValueStops = ValueStop[];\n\nexport function scaleGradient(u: uPlot, scaleKey: string, scaleStops: ScaleValueStops, discrete = false) {\n let scale = u.scales[scaleKey];\n\n // we want the stop below or at the scaleMax\n // and the stop below or at the scaleMin, else the stop above scaleMin\n let minStopIdx: number | null = null;\n let maxStopIdx: number | null = null;\n\n for (let i = 0; i < scaleStops.length; i++) {\n let stopVal = scaleStops[i][0];\n\n if (stopVal <= scale.min! || minStopIdx == null) {\n minStopIdx = i;\n }\n\n maxStopIdx = i;\n\n if (stopVal >= scale.max!) {\n break;\n }\n }\n\n if (minStopIdx === maxStopIdx) {\n return scaleStops[minStopIdx!][1];\n }\n\n let minStopVal = scaleStops[minStopIdx!][0];\n let maxStopVal = scaleStops[maxStopIdx!][0];\n\n if (minStopVal === -Infinity) {\n minStopVal = scale.min!;\n }\n\n if (maxStopVal === Infinity) {\n maxStopVal = scale.max!;\n }\n\n let minStopPos = Math.round(u.valToPos(minStopVal, scaleKey, true));\n let maxStopPos = Math.round(u.valToPos(maxStopVal, scaleKey, true));\n\n let range = minStopPos - maxStopPos;\n\n if (range === 0) {\n return scaleStops[maxStopIdx!][1];\n }\n\n let x0, y0, x1, y1;\n\n if (u.scales.x!.ori === ScaleOrientation.Horizontal) {\n x0 = x1 = 0;\n y0 = minStopPos;\n y1 = maxStopPos;\n } else {\n y0 = y1 = 0;\n x0 = minStopPos;\n x1 = maxStopPos;\n }\n\n let ctx = getCanvasContext();\n\n let grd = ctx.createLinearGradient(x0, y0, x1, y1);\n\n let prevColor: string;\n\n for (let i = minStopIdx!; i <= maxStopIdx!; i++) {\n let s = scaleStops[i];\n\n let stopPos =\n i === minStopIdx ? minStopPos : i === maxStopIdx ? maxStopPos : Math.round(u.valToPos(s[0], scaleKey, true));\n\n let pct = (minStopPos - stopPos) / range;\n\n if (discrete && i > minStopIdx!) {\n grd.addColorStop(pct, prevColor!);\n }\n\n grd.addColorStop(pct, (prevColor = s[1]));\n }\n\n return grd;\n}\n\nexport function getDataRange(plot: uPlot, scaleKey: string) {\n let sc = plot.scales[scaleKey];\n\n let min = Infinity;\n let max = -Infinity;\n\n plot.series.forEach((ser, seriesIdx) => {\n if (ser.show && ser.scale === scaleKey) {\n // uPlot skips finding data min/max when a scale has a pre-defined range\n if (ser.min == null) {\n let data = plot.data[seriesIdx];\n for (let i = 0; i < data.length; i++) {\n if (data[i] != null) {\n min = Math.min(min, data[i]!);\n max = Math.max(max, data[i]!);\n }\n }\n } else {\n min = Math.min(min, ser.min!);\n max = Math.max(max, ser.max!);\n }\n }\n });\n\n if (max === min) {\n min = sc.min!;\n max = sc.max!;\n }\n\n return [min, max];\n}\n\nexport function getGradientRange(\n u: uPlot,\n scaleKey: string,\n hardMin?: number | null,\n hardMax?: number | null,\n softMin?: number | null,\n softMax?: number | null\n) {\n let min = hardMin ?? softMin ?? null;\n let max = hardMax ?? softMax ?? null;\n\n if (min == null || max == null) {\n let [dataMin, dataMax] = getDataRange(u, scaleKey);\n\n min = min ?? dataMin ?? 0;\n max = max ?? dataMax ?? 100;\n }\n\n return [min, max];\n}\n\nexport function getScaleGradientFn(\n opacity: number,\n theme: GrafanaTheme2,\n colorMode?: FieldColorMode,\n thresholds?: ThresholdsConfig,\n hardMin?: number | null,\n hardMax?: number | null,\n softMin?: number | null,\n softMax?: number | null\n): (self: uPlot, seriesIdx: number) => CanvasGradient | string {\n if (!colorMode) {\n throw Error('Missing colorMode required for color scheme gradients');\n }\n\n if (!thresholds) {\n throw Error('Missing thresholds required for color scheme gradients');\n }\n\n return (plot: uPlot, seriesIdx: number) => {\n let scaleKey = plot.series[seriesIdx].scale!;\n\n let gradient: CanvasGradient | string = '';\n\n if (colorMode.id === FieldColorModeId.Thresholds) {\n if (thresholds.mode === ThresholdsMode.Absolute) {\n const valueStops = thresholds.steps.map(\n (step) =>\n [step.value, colorManipulator.alpha(theme.visualization.getColorByName(step.color), opacity)] as ValueStop\n );\n gradient = scaleGradient(plot, scaleKey, valueStops, true);\n } else {\n const [min, max] = getGradientRange(plot, scaleKey, hardMin, hardMax, softMin, softMax);\n const range = max - min;\n const valueStops = thresholds.steps.map(\n (step) =>\n [\n min + range * (step.value / 100),\n colorManipulator.alpha(theme.visualization.getColorByName(step.color), opacity),\n ] as ValueStop\n );\n gradient = scaleGradient(plot, scaleKey, valueStops, true);\n }\n } else if (colorMode.getColors) {\n const colors = colorMode.getColors(theme);\n const [min, max] = getGradientRange(plot, scaleKey, hardMin, hardMax, softMin, softMax);\n const range = max - min;\n const valueStops = colors.map(\n (color, i) =>\n [\n min + range * (i / (colors.length - 1)),\n colorManipulator.alpha(theme.visualization.getColorByName(color), opacity),\n ] as ValueStop\n );\n gradient = scaleGradient(plot, scaleKey, valueStops, false);\n }\n\n return gradient;\n };\n}\n","import uPlot, { Series } from 'uplot';\n\nimport {\n colorManipulator,\n DataFrameFieldIndex,\n FALLBACK_COLOR,\n FieldColorMode,\n FieldColorModeId,\n GrafanaTheme2,\n ThresholdsConfig,\n} from '@grafana/data';\nimport {\n BarAlignment,\n BarConfig,\n GraphDrawStyle,\n FillConfig,\n GraphGradientMode,\n LineConfig,\n LineInterpolation,\n PointsConfig,\n VisibilityMode,\n} from '@grafana/schema';\n\nimport { PlotConfigBuilder } from '../types';\n\nimport { getHueGradientFn, getOpacityGradientFn, getScaleGradientFn } from './gradientFills';\n\nexport interface SeriesProps extends LineConfig, BarConfig, FillConfig, PointsConfig {\n scaleKey: string;\n pxAlign?: boolean;\n gradientMode?: GraphGradientMode;\n dynamicSeriesColor?: (seriesIdx: number) => string | undefined;\n\n facets?: uPlot.Series.Facet[];\n\n /** Used when gradientMode is set to Scheme */\n thresholds?: ThresholdsConfig;\n colorMode?: FieldColorMode;\n hardMin?: number | null;\n hardMax?: number | null;\n softMin?: number | null;\n softMax?: number | null;\n\n drawStyle?: GraphDrawStyle;\n pathBuilder?: Series.PathBuilder | null;\n pointsFilter?: Series.Points.Filter | null;\n pointsBuilder?: Series.Points.Show | null;\n show?: boolean;\n dataFrameFieldIndex?: DataFrameFieldIndex;\n theme: GrafanaTheme2;\n value?: uPlot.Series.Value;\n}\n\nexport class UPlotSeriesBuilder extends PlotConfigBuilder<SeriesProps, Series> {\n getConfig() {\n const {\n facets,\n drawStyle,\n pathBuilder,\n pointsBuilder,\n pointsFilter,\n lineInterpolation,\n lineWidth,\n lineStyle,\n barAlignment,\n barWidthFactor,\n barMaxWidth,\n showPoints,\n pointSize,\n scaleKey,\n pxAlign,\n spanNulls,\n show = true,\n } = this.props;\n\n let lineConfig: Partial<Series> = {};\n\n let lineColor = this.getLineColor();\n\n // GraphDrawStyle.Points mode also needs this for fill/stroke sharing & re-use in series.points. see getColor() below.\n lineConfig.stroke = lineColor;\n\n if (pathBuilder != null) {\n lineConfig.paths = pathBuilder;\n lineConfig.width = lineWidth;\n } else if (drawStyle === GraphDrawStyle.Points) {\n lineConfig.paths = () => null;\n } else if (drawStyle != null) {\n lineConfig.width = lineWidth;\n if (lineStyle && lineStyle.fill !== 'solid') {\n if (lineStyle.fill === 'dot') {\n lineConfig.cap = 'round';\n }\n lineConfig.dash = lineStyle.dash ?? [10, 10];\n }\n lineConfig.paths = (self: uPlot, seriesIdx: number, idx0: number, idx1: number) => {\n let pathsBuilder = mapDrawStyleToPathBuilder(\n drawStyle,\n lineInterpolation,\n barAlignment,\n barWidthFactor,\n barMaxWidth\n );\n return pathsBuilder(self, seriesIdx, idx0, idx1);\n };\n }\n\n const useColor: uPlot.Series.Stroke =\n // @ts-ignore\n typeof lineColor === 'string' ? lineColor : (u, seriesIdx) => u.series[seriesIdx]._stroke;\n\n const pointsConfig: Partial<Series> = {\n points: {\n stroke: useColor,\n fill: useColor,\n size: !pointSize || pointSize < lineWidth! ? undefined : pointSize,\n filter: pointsFilter,\n },\n };\n\n if (pointsBuilder != null) {\n pointsConfig.points!.show = pointsBuilder;\n } else {\n // we cannot set points.show property above (even to undefined) as that will clear uPlot's default auto behavior\n if (drawStyle === GraphDrawStyle.Points) {\n pointsConfig.points!.show = true;\n } else {\n if (showPoints === VisibilityMode.Auto) {\n if (drawStyle === GraphDrawStyle.Bars) {\n pointsConfig.points!.show = false;\n }\n } else if (showPoints === VisibilityMode.Never) {\n pointsConfig.points!.show = false;\n } else if (showPoints === VisibilityMode.Always) {\n pointsConfig.points!.show = true;\n }\n }\n }\n\n return {\n scale: scaleKey,\n facets,\n spanGaps: typeof spanNulls === 'number' ? false : spanNulls,\n value: () => '',\n pxAlign,\n show,\n fill: this.getFill(),\n ...lineConfig,\n ...pointsConfig,\n };\n }\n\n private getLineColor(): Series.Stroke {\n const {\n lineColor,\n gradientMode,\n colorMode,\n thresholds,\n theme,\n hardMin,\n hardMax,\n softMin,\n softMax,\n dynamicSeriesColor,\n } = this.props;\n\n if (gradientMode === GraphGradientMode.None && dynamicSeriesColor) {\n return (plot: uPlot, seriesIdx: number) => dynamicSeriesColor(seriesIdx) ?? lineColor ?? FALLBACK_COLOR;\n }\n\n if (gradientMode === GraphGradientMode.Scheme && colorMode?.id !== FieldColorModeId.Fixed) {\n return getScaleGradientFn(1, theme, colorMode, thresholds, hardMin, hardMax, softMin, softMax);\n }\n\n return lineColor ?? FALLBACK_COLOR;\n }\n\n private getFill(): Series.Fill | undefined {\n const {\n lineColor,\n fillColor,\n gradientMode,\n fillOpacity,\n colorMode,\n thresholds,\n theme,\n hardMin,\n hardMax,\n softMin,\n softMax,\n dynamicSeriesColor,\n } = this.props;\n\n if (fillColor) {\n return fillColor;\n }\n\n const mode = gradientMode ?? GraphGradientMode.None;\n const opacityPercent = (fillOpacity ?? 0) / 100;\n\n if (mode === GraphGradientMode.None && dynamicSeriesColor && opacityPercent > 0) {\n return (u: uPlot, seriesIdx: number) => {\n // @ts-ignore\n let lineColor = u.series[seriesIdx]._stroke; // cache\n return colorManipulator.alpha(lineColor ?? '', opacityPercent);\n };\n }\n\n switch (mode) {\n case GraphGradientMode.Opacity:\n return getOpacityGradientFn((fillColor ?? lineColor)!, opacityPercent);\n case GraphGradientMode.Hue:\n return getHueGradientFn((fillColor ?? lineColor)!, opacityPercent, theme);\n case GraphGradientMode.Scheme:\n if (colorMode?.id !== FieldColorModeId.Fixed) {\n return getScaleGradientFn(opacityPercent, theme, colorMode, thresholds, hardMin, hardMax, softMin, softMax);\n }\n // intentional fall-through to handle Scheme with Fixed color\n default:\n if (opacityPercent > 0) {\n return colorManipulator.alpha(lineColor ?? '', opacityPercent);\n }\n }\n\n return undefined;\n }\n}\n\ninterface PathBuilders {\n linear: Series.PathBuilder;\n smooth: Series.PathBuilder;\n stepBefore: Series.PathBuilder;\n stepAfter: Series.PathBuilder;\n [key: string]: Series.PathBuilder;\n}\n\nlet builders: PathBuilders | undefined = undefined;\n\nfunction mapDrawStyleToPathBuilder(\n style: GraphDrawStyle,\n lineInterpolation?: LineInterpolation,\n barAlignment = 0,\n barWidthFactor = 0.6,\n barMaxWidth = 200\n): Series.PathBuilder {\n const pathBuilders = uPlot.paths;\n\n if (!builders) {\n // This should be global static, but Jest initalization was failing so we lazy load to avoid the issue\n builders = {\n linear: pathBuilders.linear!(),\n smooth: pathBuilders.spline!(),\n stepBefore: pathBuilders.stepped!({ align: -1 }),\n stepAfter: pathBuilders.stepped!({ align: 1 }),\n };\n }\n\n if (style === GraphDrawStyle.Bars) {\n // each bars pathBuilder is lazy-initialized and globally cached by a key composed of its options\n let barsCfgKey = `bars|${barAlignment}|${barWidthFactor}|${barMaxWidth}`;\n\n if (!builders[barsCfgKey]) {\n builders[barsCfgKey] = pathBuilders.bars!({\n size: [barWidthFactor, barMaxWidth],\n align: barAlignment as BarAlignment,\n });\n }\n\n return builders[barsCfgKey];\n } else if (style === GraphDrawStyle.Line) {\n if (lineInterpolation === LineInterpolation.StepBefore) {\n return builders.stepBefore;\n }\n if (lineInterpolation === LineInterpolation.StepAfter) {\n return builders.stepAfter;\n }\n if (lineInterpolation === LineInterpolation.Smooth) {\n return builders.smooth;\n }\n }\n\n return builders.linear; // the default\n}\n","import { merge } from 'lodash';\nimport uPlot, { Cursor, Band, Hooks, Select, AlignedData, Padding, Series } from 'uplot';\n\nimport {\n DataFrame,\n DefaultTimeZone,\n EventBus,\n Field,\n getTimeZoneInfo,\n GrafanaTheme2,\n TimeRange,\n TimeZone,\n} from '@grafana/data';\nimport { AxisPlacement } from '@grafana/schema';\n\nimport { FacetedData, PlotConfig, PlotTooltipInterpolator } from '../types';\nimport { getStackingBands, pluginLog, StackingGroup } from '../utils';\n\nimport { AxisProps, UPlotAxisBuilder } from './UPlotAxisBuilder';\nimport { ScaleProps, UPlotScaleBuilder } from './UPlotScaleBuilder';\nimport { SeriesProps, UPlotSeriesBuilder } from './UPlotSeriesBuilder';\nimport { getThresholdsDrawHook, UPlotThresholdOptions } from './UPlotThresholds';\n\nconst cursorDefaults: Cursor = {\n // prevent client-side zoom from triggering at the end of a selection\n drag: { setScale: false },\n points: {\n /*@ts-ignore*/\n size: (u, seriesIdx) => u.series[seriesIdx].points.size * 2,\n /*@ts-ignore*/\n width: (u, seriesIdx, size) => size / 4,\n },\n focus: {\n prox: 30,\n },\n};\n\ntype PrepData = (frames: DataFrame[]) => AlignedData | FacetedData;\ntype PreDataStacked = (frames: DataFrame[], stackingGroups: StackingGroup[]) => AlignedData | FacetedData;\n\nexport class UPlotConfigBuilder {\n private series: UPlotSeriesBuilder[] = [];\n private axes: Record<string, UPlotAxisBuilder> = {};\n private scales: UPlotScaleBuilder[] = [];\n private bands: Band[] = [];\n private stackingGroups: StackingGroup[] = [];\n private cursor: Cursor | undefined;\n private select: uPlot.Select | undefined;\n private hasLeftAxis = false;\n private hooks: Hooks.Arrays = {};\n private tz: string | undefined = undefined;\n private sync = false;\n private mode: uPlot.Mode = 1;\n private frames: DataFrame[] | undefined = undefined;\n // to prevent more than one threshold per scale\n private thresholds: Record<string, UPlotThresholdOptions> = {};\n // Custom handler for closest datapoint and series lookup\n private tooltipInterpolator: PlotTooltipInterpolator | undefined = undefined;\n private padding?: Padding = undefined;\n\n prepData: PrepData | undefined = undefined;\n\n constructor(timeZone: TimeZone = DefaultTimeZone) {\n this.tz = getTimeZoneInfo(timeZone, Date.now())?.ianaName;\n }\n\n // Exposed to let the container know the primary scale keys\n scaleKeys: [string, string] = ['', ''];\n\n addHook<T extends keyof Hooks.Defs>(type: T, hook: Hooks.Defs[T]) {\n pluginLog('UPlotConfigBuilder', false, 'addHook', type);\n\n if (!this.hooks[type]) {\n this.hooks[type] = [];\n }\n\n this.hooks[type]!.push(hook as any);\n }\n\n addThresholds(options: UPlotThresholdOptions) {\n if (!this.thresholds[options.scaleKey]) {\n this.thresholds[options.scaleKey] = options;\n this.addHook('drawClear', getThresholdsDrawHook(options));\n }\n }\n\n addAxis(props: AxisProps) {\n props.placement = props.placement ?? AxisPlacement.Auto;\n props.grid = props.grid ?? {};\n let scaleKey = props.scaleKey;\n\n if (scaleKey === 'x') {\n scaleKey += props.timeZone ?? '';\n }\n\n if (this.axes[scaleKey]) {\n this.axes[scaleKey].merge(props);\n return;\n }\n\n // Handle auto placement logic\n if (props.placement === AxisPlacement.Auto) {\n props.placement = this.hasLeftAxis ? AxisPlacement.Right : AxisPlacement.Left;\n }\n\n if (props.placement === AxisPlacement.Left) {\n this.hasLeftAxis = true;\n }\n\n if (props.placement === AxisPlacement.Hidden) {\n props.grid.show = false;\n props.size = 0;\n }\n\n this.axes[scaleKey] = new UPlotAxisBuilder(props);\n }\n\n getAxisPlacement(scaleKey: string): AxisPlacement {\n const axis = this.axes[scaleKey];\n return axis?.props.placement! ?? AxisPlacement.Left;\n }\n\n setCursor(cursor?: Cursor) {\n this.cursor = merge({}, this.cursor, cursor);\n }\n\n setMode(mode: uPlot.Mode) {\n this.mode = mode;\n }\n\n setSelect(select: Select) {\n this.select = select;\n }\n\n addSeries(props: SeriesProps) {\n this.series.push(new UPlotSeriesBuilder(props));\n }\n\n getSeries() {\n return this.series;\n }\n\n /** Add or update the scale with the scale key */\n addScale(props: ScaleProps) {\n const current = this.scales.find((v) => v.props.scaleKey === props.scaleKey);\n if (current) {\n current.merge(props);\n return;\n }\n this.scales.push(new UPlotScaleBuilder(props));\n }\n\n addBand(band: Band) {\n this.bands.push(band);\n }\n\n setStackingGroups(groups: StackingGroup[]) {\n this.stackingGroups = groups;\n }\n\n getStackingGroups() {\n return this.stackingGroups;\n }\n\n setTooltipInterpolator(interpolator: PlotTooltipInterpolator) {\n this.tooltipInterpolator = interpolator;\n }\n\n getTooltipInterpolator() {\n return this.tooltipInterpolator;\n }\n\n setPrepData(prepData: PreDataStacked) {\n this.prepData = (frames) => {\n this.frames = frames;\n return prepData(frames, this.getStackingGroups());\n };\n }\n\n setSync() {\n this.sync = true;\n }\n\n hasSync() {\n return this.sync;\n }\n\n setPadding(padding: Padding) {\n this.padding = padding;\n }\n\n getConfig() {\n const config: PlotConfig = {\n mode: this.mode,\n series: [\n this.mode === 2\n ? (null as unknown as Series)\n : {\n value: () => '',\n },\n ],\n };\n config.axes = this.ensureNonOverlappingAxes(Object.values(this.axes)).map((a) => a.getConfig());\n config.series = [...config.series, ...this.series.map((s) => s.getConfig())];\n config.scales = this.scales.reduce((acc, s) => {\n return { ...acc, ...s.getConfig() };\n }, {});\n\n config.hooks = this.hooks;\n\n config.select = this.select;\n\n const pointColorFn =\n (alphaHex = '') =>\n (u: uPlot, seriesIdx: number) => {\n /*@ts-ignore*/\n let s = u.series[seriesIdx].points._stroke;\n\n // interpolate for gradients/thresholds\n if (typeof s !== 'string') {\n let field = this.frames![0].fields[seriesIdx];\n s = field.display!(field.values.get(u.cursor.idxs![seriesIdx]!)).color!;\n }\n\n return s + alphaHex;\n };\n\n config.cursor = merge(\n {},\n cursorDefaults,\n {\n points: {\n stroke: pointColorFn('80'),\n fill: pointColorFn(),\n },\n },\n this.cursor\n );\n\n config.tzDate = this.tzDate;\n config.padding = this.padding;\n\n if (this.stackingGroups.length) {\n this.stackingGroups.forEach((group) => {\n getStackingBands(group).forEach((band) => {\n this.addBand(band);\n });\n });\n }\n\n if (this.bands.length) {\n config.bands = this.bands;\n }\n\n return config;\n }\n\n private tzDate = (ts: number) => {\n let date = new Date(ts);\n\n return this.tz ? uPlot.tzDate(date, this.tz) : date;\n };\n\n private ensureNonOverlappingAxes(axes: UPlotAxisBuilder[]): UPlotAxisBuilder[] {\n const xAxis = axes.find((a) => a.props.scaleKey === 'x');\n const axesWithoutGridSet = axes.filter((a) => a.props.grid?.show === undefined);\n const firstValueAxisIdx = axesWithoutGridSet.findIndex(\n (a) => a.props.placement === AxisPlacement.Left || (a.props.placement === AxisPlacement.Bottom && a !== xAxis)\n );\n\n // For all axes with no grid set, set the grid automatically (grid only for first left axis )\n for (let i = 0; i < axesWithoutGridSet.length; i++) {\n if (axesWithoutGridSet[i] === xAxis || i === firstValueAxisIdx) {\n axesWithoutGridSet[i].props.grid!.show = true;\n } else {\n axesWithoutGridSet[i].props.grid!.show = false;\n }\n }\n\n return axes;\n }\n}\n\nexport type Renderers = Array<{\n fieldMap: Record<string, string>;\n indicesOnly: string[];\n init: (config: UPlotConfigBuilder, fieldIndices: Record<string, number>) => void;\n}>;\n\n/** @alpha */\ntype UPlotConfigPrepOpts<T extends Record<string, any> = {}> = {\n frame: DataFrame;\n theme: GrafanaTheme2;\n timeZones: TimeZone[];\n getTimeRange: () => TimeRange;\n eventBus: EventBus;\n allFrames: DataFrame[];\n renderers?: Renderers;\n tweakScale?: (opts: ScaleProps, forField: Field) => ScaleProps;\n tweakAxis?: (opts: AxisProps, forField: Field) => AxisProps;\n} & T;\n\n/** @alpha */\nexport type UPlotConfigPrepFn<T extends {} = {}> = (opts: UPlotConfigPrepOpts<T>) => UPlotConfigBuilder;\n","import tinycolor from 'tinycolor2';\nimport uPlot from 'uplot';\n\nimport { GrafanaTheme2, Threshold, ThresholdsConfig, ThresholdsMode } from '@grafana/data';\nimport { GraphThresholdsStyleConfig, GraphTresholdsStyleMode } from '@grafana/schema';\n\nimport { getGradientRange, scaleGradient } from './gradientFills';\n\nexport interface UPlotThresholdOptions {\n scaleKey: string;\n thresholds: ThresholdsConfig;\n config: GraphThresholdsStyleConfig;\n theme: GrafanaTheme2;\n hardMin?: number | null;\n hardMax?: number | null;\n softMin?: number | null;\n softMax?: number | null;\n}\n\nexport function getThresholdsDrawHook(options: UPlotThresholdOptions) {\n function addLines(u: uPlot, steps: Threshold[], theme: GrafanaTheme2, xMin: number, xMax: number, yScaleKey: string) {\n let ctx = u.ctx;\n\n // Thresholds below a transparent threshold is treated like \"less than\", and line drawn previous threshold\n let transparentIndex = 0;\n\n for (let idx = 0; idx < steps.length; idx++) {\n const step = steps[idx];\n if (step.color === 'transparent') {\n transparentIndex = idx;\n break;\n }\n }\n\n ctx.lineWidth = 2;\n\n // Ignore the base -Infinity threshold by always starting on index 1\n for (let idx = 1; idx < steps.length; idx++) {\n const step = steps[idx];\n let color: tinycolor.Instance;\n\n // if we are below a transparent index treat this a less then threshold, use previous thresholds color\n if (transparentIndex >= idx && idx > 0) {\n color = tinycolor(theme.visualization.getColorByName(steps[idx - 1].color));\n } else {\n color = tinycolor(theme.visualization.getColorByName(step.color));\n }\n\n // Unless alpha specififed set to default value\n if (color.getAlpha() === 1) {\n color.setAlpha(0.7);\n }\n\n let x0 = Math.round(u.valToPos(xMin!, 'x', true));\n let y0 = Math.round(u.valToPos(step.value, yScaleKey, true));\n let x1 = Math.round(u.valToPos(xMax!, 'x', true));\n let y1 = Math.round(u.valToPos(step.value, yScaleKey, true));\n\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n\n ctx.strokeStyle = color.toString();\n ctx.stroke();\n }\n }\n\n function addAreas(u: uPlot, steps: Threshold[], theme: GrafanaTheme2) {\n let ctx = u.ctx;\n\n let grd = scaleGradient(\n u,\n u.series[1].scale!,\n steps.map((step) => {\n let color = tinycolor(theme.visualization.getColorByName(step.color));\n\n if (color.getAlpha() === 1) {\n color.setAlpha(0.15);\n }\n\n return [step.value, color.toString()];\n }),\n true\n );\n\n ctx.fillStyle = grd;\n ctx.fillRect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n }\n\n const { scaleKey, thresholds, theme, config, hardMin, hardMax, softMin, softMax } = options;\n\n return (u: uPlot) => {\n const ctx = u.ctx;\n const { min: xMin, max: xMax } = u.scales.x;\n const { min: yMin, max: yMax } = u.scales[scaleKey];\n\n if (xMin == null || xMax == null || yMin == null || yMax == null) {\n return;\n }\n\n let { steps, mode } = thresholds;\n\n if (mode === ThresholdsMode.Percentage) {\n let [min, max] = getGradientRange(u, scaleKey, hardMin, hardMax, softMin, softMax);\n let range = max - min;\n\n steps = steps.map((step) => ({\n ...step,\n value: min + range * (step.value / 100),\n }));\n }\n\n ctx.save();\n\n switch (config.mode) {\n case GraphTresholdsStyleMode.Line:\n addLines(u, steps, theme, xMin, xMax, scaleKey);\n break;\n case GraphTresholdsStyleMode.Area:\n addAreas(u, steps, theme);\n break;\n case GraphTresholdsStyleMode.LineAndArea:\n addAreas(u, steps, theme);\n addLines(u, steps, theme, xMin, xMax, scaleKey);\n }\n\n ctx.restore();\n };\n}\n","import { DataFrame, FieldConfig, FieldSparkline, IndexVector } from '@grafana/data';\nimport { GraphFieldConfig } from '@grafana/schema';\n\nimport { applyNullInsertThreshold } from '../GraphNG/nullInsertThreshold';\n\n/** @internal\n * Given a sparkline config returns a DataFrame ready to be turned into Plot data set\n **/\nexport function preparePlotFrame(sparkline: FieldSparkline, config?: FieldConfig<GraphFieldConfig>): DataFrame {\n const length = sparkline.y.values.length;\n const yFieldConfig = {\n ...sparkline.y.config,\n ...config,\n };\n\n return applyNullInsertThreshold({\n frame: {\n refId: 'sparkline',\n fields: [\n sparkline.x ?? IndexVector.newField(length),\n {\n ...sparkline.y,\n config: yFieldConfig,\n },\n ],\n length,\n },\n });\n}\n","import { isEqual } from 'lodash';\nimport React, { PureComponent } from 'react';\nimport { AlignedData, Range } from 'uplot';\n\nimport {\n compareDataFrameStructures,\n DataFrame,\n Field,\n FieldConfig,\n FieldSparkline,\n FieldType,\n getFieldColorModeForField,\n} from '@grafana/data';\nimport {\n AxisPlacement,\n GraphDrawStyle,\n GraphFieldConfig,\n VisibilityMode,\n ScaleDirection,\n ScaleOrientation,\n} from '@grafana/schema';\n\nimport { Themeable2 } from '../../types';\nimport { UPlotChart } from '../uPlot/Plot';\nimport { UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder';\nimport { preparePlotData2, getStackingGroups } from '../uPlot/utils';\n\nimport { preparePlotFrame } from './utils';\n\nexport interface SparklineProps extends Themeable2 {\n width: number;\n height: number;\n config?: FieldConfig<GraphFieldConfig>;\n sparkline: FieldSparkline;\n}\n\ninterface State {\n data: AlignedData;\n alignedDataFrame: DataFrame;\n configBuilder: UPlotConfigBuilder;\n}\n\nconst defaultConfig: GraphFieldConfig = {\n drawStyle: GraphDrawStyle.Line,\n showPoints: VisibilityMode.Auto,\n axisPlacement: AxisPlacement.Hidden,\n};\n\n/** @internal */\nexport class Sparkline extends PureComponent<SparklineProps, State> {\n constructor(props: SparklineProps) {\n super(props);\n\n const alignedDataFrame = preparePlotFrame(props.sparkline, props.config);\n\n this.state = {\n data: preparePlotData2(alignedDataFrame, getStackingGroups(alignedDataFrame)),\n alignedDataFrame,\n configBuilder: this.prepareConfig(alignedDataFrame),\n };\n }\n\n static getDerivedStateFromProps(props: SparklineProps, state: State) {\n const frame = preparePlotFrame(props.sparkline, props.config);\n if (!frame) {\n return { ...state };\n }\n\n return {\n ...state,\n data: preparePlotData2(frame, getStackingGroups(frame)),\n alignedDataFrame: frame,\n };\n }\n\n componentDidUpdate(prevProps: SparklineProps, prevState: State) {\n const { alignedDataFrame } = this.state;\n\n if (!alignedDataFrame) {\n return;\n }\n\n let rebuildConfig = false;\n\n if (prevProps.sparkline !== this.props.sparkline) {\n rebuildConfig = !compareDataFrameStructures(this.state.alignedDataFrame, prevState.alignedDataFrame);\n } else {\n rebuildConfig = !isEqual(prevProps.config, this.props.config);\n }\n\n if (rebuildConfig) {\n this.setState({ configBuilder: this.prepareConfig(alignedDataFrame) });\n }\n }\n\n getYRange(field: Field) {\n let { min, max } = this.state.alignedDataFrame.fields[1].state?.range!;\n\n if (min === max) {\n if (min === 0) {\n max = 100;\n } else {\n min = 0;\n max! *= 2;\n }\n }\n\n return [\n Math.max(min!, field.config.min ?? -Infinity),\n Math.min(max!, field.config.max ?? Infinity),\n ] as Range.MinMax;\n }\n\n prepareConfig(data: DataFrame) {\n const { theme } = this.props;\n const builder = new UPlotConfigBuilder();\n\n builder.setCursor({\n show: false,\n x: false, // no crosshairs\n y: false,\n });\n\n // X is the first field in the alligned frame\n const xField = data.fields[0];\n builder.addScale({\n scaleKey: 'x',\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n isTime: false, //xField.type === FieldType.time,\n range: () => {\n const { sparkline } = this.props;\n if (sparkline.x) {\n if (sparkline.timeRange && sparkline.x.type === FieldType.time) {\n return [sparkline.timeRange.from.valueOf(), sparkline.timeRange.to.valueOf()];\n }\n const vals = sparkline.x.values;\n return [vals.get(0), vals.get(vals.length - 1)];\n }\n return [0, sparkline.y.values.length - 1];\n },\n });\n\n builder.addAxis({\n scaleKey: 'x',\n theme,\n placement: AxisPlacement.Hidden,\n });\n\n for (let i = 0; i < data.fields.length; i++) {\n const field = data.fields[i];\n const config = field.config as FieldConfig<GraphFieldConfig>;\n const customConfig: GraphFieldConfig = {\n ...defaultConfig,\n ...config.custom,\n };\n\n if (field === xField || field.type !== FieldType.number) {\n continue;\n }\n\n const scaleKey = config.unit || '__fixed';\n builder.addScale({\n scaleKey,\n orientation: ScaleOrientation.Vertical,\n direction: ScaleDirection.Up,\n range: () => this.getYRange(field),\n });\n\n builder.addAxis({\n scaleKey,\n theme,\n placement: AxisPlacement.Hidden,\n });\n\n const colorMode = getFieldColorModeForField(field);\n const seriesColor = colorMode.getCalculator(field, theme)(0, 0);\n const pointsMode =\n customConfig.drawStyle === GraphDrawStyle.Points ? VisibilityMode.Always : customConfig.showPoints;\n\n builder.addSeries({\n pxAlign: false,\n scaleKey,\n theme,\n drawStyle: customConfig.drawStyle!,\n lineColor: customConfig.lineColor ?? seriesColor,\n lineWidth: customConfig.lineWidth,\n lineInterpolation: customConfig.lineInterpolation,\n showPoints: pointsMode,\n pointSize: customConfig.pointSize,\n fillOpacity: customConfig.fillOpacity,\n fillColor: customConfig.fillColor ?? seriesColor,\n });\n }\n\n return builder;\n }\n\n render() {\n const { data, configBuilder } = this.state;\n const { width, height, sparkline } = this.props;\n return (\n <UPlotChart data={data} config={configBuilder} width={width} height={height} timeRange={sparkline.timeRange!} />\n );\n }\n}\n","import React, { CSSProperties } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { formattedValueToString, DisplayValue, FieldConfig, FieldType } from '@grafana/data';\nimport { GraphDrawStyle, GraphFieldConfig } from '@grafana/schema';\n\nimport { getTextColorForBackground } from '../../utils';\nimport { calculateFontSize } from '../../utils/measureText';\nimport { Sparkline } from '../Sparkline/Sparkline';\n\nimport { BigValueColorMode, Props, BigValueJustifyMode, BigValueTextMode } from './BigValue';\n\nconst LINE_HEIGHT = 1.2;\nconst MAX_TITLE_SIZE = 30;\n\nexport abstract class BigValueLayout {\n titleFontSize: number;\n valueFontSize: number;\n chartHeight: number;\n chartWidth: number;\n valueColor: string;\n panelPadding: number;\n justifyCenter: boolean;\n titleToAlignTo?: string;\n valueToAlignTo: string;\n maxTextWidth: number;\n maxTextHeight: number;\n textValues: BigValueTextValues;\n\n constructor(private props: Props) {\n const { width, height, value, text } = props;\n\n this.valueColor = value.color ?? 'gray';\n this.panelPadding = height > 100 ? 12 : 8;\n this.textValues = getTextValues(props);\n this.justifyCenter = shouldJustifyCenter(props.justifyMode, this.textValues.title);\n this.valueToAlignTo = this.textValues.valueToAlignTo;\n this.titleToAlignTo = this.textValues.titleToAlignTo;\n this.titleFontSize = 0;\n this.valueFontSize = 0;\n this.chartHeight = 0;\n this.chartWidth = 0;\n this.maxTextWidth = width - this.panelPadding * 2;\n this.maxTextHeight = height - this.panelPadding * 2;\n\n // Explicit font sizing\n if (text) {\n if (text.titleSize) {\n this.titleFontSize = text.titleSize;\n this.titleToAlignTo = undefined;\n }\n if (text.valueSize) {\n this.valueFontSize = text.valueSize;\n this.valueToAlignTo = '';\n }\n }\n }\n\n getTitleStyles(): CSSProperties {\n const styles: CSSProperties = {\n fontSize: `${this.titleFontSize}px`,\n lineHeight: LINE_HEIGHT,\n };\n\n if (this.props.colorMode === BigValueColorMode.Background) {\n styles.color = getTextColorForBackground(this.valueColor);\n }\n\n return styles;\n }\n\n getValueStyles(): CSSProperties {\n const styles: CSSProperties = {\n fontSize: this.valueFontSize,\n fontWeight: 500,\n lineHeight: LINE_HEIGHT,\n position: 'relative',\n zIndex: 1,\n };\n\n if (this.justifyCenter) {\n styles.textAlign = 'center';\n }\n\n switch (this.props.colorMode) {\n case BigValueColorMode.Value:\n styles.color = this.valueColor;\n break;\n case BigValueColorMode.Background:\n styles.color = getTextColorForBackground(this.valueColor);\n break;\n case BigValueColorMode.None:\n styles.color = this.props.theme.colors.text.primary;\n break;\n }\n\n return styles;\n }\n\n getValueAndTitleContainerStyles() {\n const styles: CSSProperties = {\n display: 'flex',\n };\n\n if (this.justifyCenter) {\n styles.alignItems = 'center';\n styles.justifyContent = 'center';\n styles.flexGrow = 1;\n }\n\n return styles;\n }\n\n getPanelStyles(): CSSProperties {\n const { width, height, theme, colorMode } = this.props;\n\n const panelStyles: CSSProperties = {\n width: `${width}px`,\n height: `${height}px`,\n padding: `${this.panelPadding}px`,\n borderRadius: '3px',\n position: 'relative',\n display: 'flex',\n };\n\n const themeFactor = theme.isDark ? 1 : -0.7;\n\n switch (colorMode) {\n case BigValueColorMode.Background:\n const bgColor2 = tinycolor(this.valueColor)\n .darken(15 * themeFactor)\n .spin(8)\n .toRgbString();\n const bgColor3 = tinycolor(this.valueColor)\n .darken(5 * themeFactor)\n .spin(-8)\n .toRgbString();\n panelStyles.background = `linear-gradient(120deg, ${bgColor2}, ${bgColor3})`;\n break;\n case BigValueColorMode.Value:\n panelStyles.background = `transparent`;\n break;\n }\n\n if (this.justifyCenter) {\n panelStyles.alignItems = 'center';\n panelStyles.flexDirection = 'row';\n }\n\n return panelStyles;\n }\n\n renderChart(): JSX.Element | null {\n const { sparkline, colorMode } = this.props;\n\n if (!sparkline || sparkline.y?.type !== FieldType.number) {\n return null;\n }\n\n let fillColor: string;\n let lineColor: string;\n\n switch (colorMode) {\n case BigValueColorMode.Background:\n fillColor = 'rgba(255,255,255,0.4)';\n lineColor = tinycolor(this.valueColor).brighten(40).toRgbString();\n break;\n case BigValueColorMode.None:\n case BigValueColorMode.Value:\n default:\n lineColor = this.valueColor;\n fillColor = tinycolor(this.valueColor).setAlpha(0.2).toRgbString();\n break;\n }\n\n // The graph field configuration applied to Y values\n const config: FieldConfig<GraphFieldConfig> = {\n custom: {\n drawStyle: GraphDrawStyle.Line,\n lineWidth: 1,\n fillColor,\n lineColor,\n },\n };\n\n return (\n <div style={this.getChartStyles()}>\n <Sparkline\n height={this.chartHeight}\n width={this.chartWidth}\n sparkline={sparkline}\n config={config}\n theme={this.props.theme}\n />\n </div>\n );\n }\n getChartStyles(): CSSProperties {\n return {\n position: 'absolute',\n right: 0,\n bottom: 0,\n };\n }\n}\n\nexport class WideNoChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const valueWidthPercent = this.titleToAlignTo?.length ? 0.3 : 1.0;\n\n if (this.valueToAlignTo.length) {\n // initial value size\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth * valueWidthPercent,\n this.maxTextHeight,\n LINE_HEIGHT\n );\n }\n\n if (this.titleToAlignTo?.length) {\n // How big can we make the title and still have it fit\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth * 0.6,\n this.maxTextHeight,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n\n // make sure it's a bit smaller than valueFontSize\n this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n }\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'row';\n styles.alignItems = 'center';\n styles.flexGrow = 1;\n\n if (!this.justifyCenter) {\n styles.justifyContent = 'space-between';\n }\n\n return styles;\n }\n\n renderChart(): JSX.Element | null {\n return null;\n }\n\n getPanelStyles() {\n const panelStyles = super.getPanelStyles();\n panelStyles.alignItems = 'center';\n return panelStyles;\n }\n}\n\nexport class WideWithChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const { width, height } = props;\n\n const chartHeightPercent = 0.5;\n const titleWidthPercent = 0.6;\n const valueWidthPercent = 1 - titleWidthPercent;\n const textHeightPercent = 0.4;\n\n this.chartWidth = width;\n this.chartHeight = height * chartHeightPercent;\n\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth * titleWidthPercent,\n this.maxTextHeight * textHeightPercent,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n }\n\n if (this.valueToAlignTo.length) {\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth * valueWidthPercent,\n this.maxTextHeight * chartHeightPercent,\n LINE_HEIGHT\n );\n }\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'row';\n styles.flexGrow = 1;\n\n if (!this.justifyCenter) {\n styles.justifyContent = 'space-between';\n }\n\n return styles;\n }\n\n getPanelStyles() {\n const styles = super.getPanelStyles();\n styles.flexDirection = 'row';\n styles.justifyContent = 'space-between';\n return styles;\n }\n}\n\nexport class StackedWithChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const { width, height } = props;\n const titleHeightPercent = 0.15;\n const chartHeightPercent = 0.25;\n let titleHeight = 0;\n\n this.chartHeight = height * chartHeightPercent;\n this.chartWidth = width;\n\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth,\n height * titleHeightPercent,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n\n titleHeight = this.titleFontSize * LINE_HEIGHT;\n }\n\n if (this.valueToAlignTo.length) {\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth,\n this.maxTextHeight - this.chartHeight - titleHeight,\n LINE_HEIGHT\n );\n }\n\n // make title fontsize it's a bit smaller than valueFontSize\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n }\n\n // make chart take up unused space\n this.chartHeight = height - this.titleFontSize * LINE_HEIGHT - this.valueFontSize * LINE_HEIGHT;\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'column';\n styles.justifyContent = 'center';\n return styles;\n }\n\n getPanelStyles() {\n const styles = super.getPanelStyles();\n styles.flexDirection = 'column';\n return styles;\n }\n}\n\nexport class StackedWithNoChartLayout extends BigValueLayout {\n constructor(props: Props) {\n super(props);\n\n const { height } = props;\n const titleHeightPercent = 0.15;\n let titleHeight = 0;\n\n if (this.titleToAlignTo?.length) {\n this.titleFontSize = calculateFontSize(\n this.titleToAlignTo,\n this.maxTextWidth,\n height * titleHeightPercent,\n LINE_HEIGHT,\n MAX_TITLE_SIZE\n );\n\n titleHeight = this.titleFontSize * LINE_HEIGHT;\n }\n\n if (this.valueToAlignTo.length) {\n this.valueFontSize = calculateFontSize(\n this.valueToAlignTo,\n this.maxTextWidth,\n this.maxTextHeight - titleHeight,\n LINE_HEIGHT\n );\n }\n\n if (this.titleToAlignTo?.length) {\n // make title fontsize it's a bit smaller than valueFontSize\n this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\n }\n }\n\n getValueAndTitleContainerStyles() {\n const styles = super.getValueAndTitleContainerStyles();\n styles.flexDirection = 'column';\n styles.flexGrow = 1;\n return styles;\n }\n\n getPanelStyles() {\n const styles = super.getPanelStyles();\n styles.alignItems = 'center';\n return styles;\n }\n}\n\nexport function buildLayout(props: Props): BigValueLayout {\n const { width, height, sparkline } = props;\n const useWideLayout = width / height > 2.5;\n\n if (useWideLayout) {\n if (height > 50 && !!sparkline && sparkline.y.values.length > 1) {\n return new WideWithChartLayout(props);\n } else {\n return new WideNoChartLayout(props);\n }\n }\n\n // stacked layouts\n if (height > 100 && sparkline && sparkline.y.values.length > 1) {\n return new StackedWithChartLayout(props);\n } else {\n return new StackedWithNoChartLayout(props);\n }\n}\n\nexport function shouldJustifyCenter(justifyMode?: BigValueJustifyMode, title?: string) {\n if (justifyMode === BigValueJustifyMode.Center) {\n return true;\n }\n\n return (title ?? '').length === 0;\n}\n\nexport interface BigValueTextValues extends DisplayValue {\n valueToAlignTo: string;\n titleToAlignTo?: string;\n tooltip?: string;\n}\n\nfunction getTextValues(props: Props): BigValueTextValues {\n const { value, alignmentFactors, count } = props;\n let { textMode } = props;\n\n const titleToAlignTo = alignmentFactors ? alignmentFactors.title : value.title;\n const valueToAlignTo = formattedValueToString(alignmentFactors ? alignmentFactors : value);\n\n // In the auto case we only show title if this big value is part of more panes (count > 1)\n if (textMode === BigValueTextMode.Auto && (count ?? 1) === 1) {\n textMode = BigValueTextMode.Value;\n }\n\n switch (textMode) {\n case BigValueTextMode.Name:\n return {\n ...value,\n title: undefined,\n prefix: undefined,\n suffix: undefined,\n text: value.title || '',\n titleToAlignTo: undefined,\n valueToAlignTo: titleToAlignTo ?? '',\n tooltip: formattedValueToString(value),\n };\n case BigValueTextMode.Value:\n return {\n ...value,\n title: undefined,\n titleToAlignTo: undefined,\n valueToAlignTo,\n tooltip: value.title,\n };\n case BigValueTextMode.None:\n return {\n numeric: value.numeric,\n color: value.color,\n title: undefined,\n text: '',\n titleToAlignTo: undefined,\n valueToAlignTo: '1',\n tooltip: `Name: ${value.title}\\nValue: ${formattedValueToString(value)}`,\n };\n case BigValueTextMode.ValueAndName:\n default:\n return {\n ...value,\n titleToAlignTo,\n valueToAlignTo,\n };\n }\n}\n","import React, { PureComponent } from 'react';\n\nimport { DisplayValue, DisplayValueAlignmentFactors, FieldSparkline } from '@grafana/data';\nimport { VizTextDisplayOptions } from '@grafana/schema';\n\nimport { Themeable2 } from '../../types';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\n\nimport { buildLayout } from './BigValueLayout';\n\nexport enum BigValueColorMode {\n Value = 'value',\n Background = 'background',\n None = 'none',\n}\n\nexport enum BigValueGraphMode {\n None = 'none',\n Line = 'line',\n Area = 'area',\n}\n\nexport enum BigValueJustifyMode {\n Auto = 'auto',\n Center = 'center',\n}\n\n/**\n * Options for how the value & title are to be displayed\n */\nexport enum BigValueTextMode {\n Auto = 'auto',\n Value = 'value',\n ValueAndName = 'value_and_name',\n Name = 'name',\n None = 'none',\n}\n\nexport interface Props extends Themeable2 {\n /** Height of the component */\n height: number;\n /** Width of the component */\n width: number;\n /** Value displayed as Big Value */\n value: DisplayValue;\n /** Sparkline values for showing a graph under/behind the value */\n sparkline?: FieldSparkline;\n /** onClick handler for the value */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** Custom styling */\n className?: string;\n /** Color mode for coloring the value or the background */\n colorMode: BigValueColorMode;\n /** Show a graph behind/under the value */\n graphMode: BigValueGraphMode;\n /** Auto justify value and text or center it */\n justifyMode?: BigValueJustifyMode;\n /** Factors that should influence the positioning of the text */\n alignmentFactors?: DisplayValueAlignmentFactors;\n /** Explicit font size control */\n text?: VizTextDisplayOptions;\n /** Specify which text should be visible in the BigValue */\n textMode?: BigValueTextMode;\n /** If true disables the tooltip */\n hasLinks?: boolean;\n\n /**\n * If part of a series of stat panes, this is the total number.\n * Used by BigValueTextMode.Auto text mode.\n */\n count?: number;\n}\n\nexport class BigValue extends PureComponent<Props> {\n static defaultProps: Partial<Props> = {\n justifyMode: BigValueJustifyMode.Auto,\n };\n\n render() {\n const { onClick, className, hasLinks } = this.props;\n const layout = buildLayout(this.props);\n const panelStyles = layout.getPanelStyles();\n const valueAndTitleContainerStyles = layout.getValueAndTitleContainerStyles();\n const valueStyles = layout.getValueStyles();\n const titleStyles = layout.getTitleStyles();\n const textValues = layout.textValues;\n\n // When there is an outer data link this tooltip will override the outer native tooltip\n const tooltip = hasLinks ? undefined : textValues.tooltip;\n\n return (\n <div className={className} style={panelStyles} onClick={onClick} title={tooltip}>\n <div style={valueAndTitleContainerStyles}>\n {textValues.title && <div style={titleStyles}>{textValues.title}</div>}\n <FormattedValueDisplay value={textValues} style={valueStyles} />\n </div>\n {layout.renderChart()}\n </div>\n );\n }\n}\n","import {\n DisplayValue,\n FALLBACK_COLOR,\n FieldColorModeId,\n FieldConfig,\n GAUGE_DEFAULT_MAXIMUM,\n GAUGE_DEFAULT_MINIMUM,\n getActiveThreshold,\n GrafanaTheme,\n Threshold,\n ThresholdsConfig,\n ThresholdsMode,\n} from '@grafana/data';\n\ninterface GaugeAutoProps {\n titleFontSize: number;\n gaugeHeight: number;\n showLabel: boolean;\n}\n\nexport const DEFAULT_THRESHOLDS: ThresholdsConfig = {\n mode: ThresholdsMode.Absolute,\n steps: [\n { value: -Infinity, color: 'green' },\n { value: 80, color: 'red' },\n ],\n};\n\nexport function calculateGaugeAutoProps(width: number, height: number, title: string | undefined): GaugeAutoProps {\n const showLabel = title !== null && title !== undefined;\n const titleFontSize = Math.min((width * 0.15) / 1.5, 20); // 20% of height * line-height, max 40px\n const titleHeight = titleFontSize * 1.5;\n const availableHeight = showLabel ? height - titleHeight : height;\n const gaugeHeight = Math.min(availableHeight, width);\n\n return {\n showLabel,\n gaugeHeight,\n titleFontSize,\n };\n}\n\nexport function getFormattedThresholds(\n decimals: number,\n field: FieldConfig,\n value: DisplayValue,\n theme: GrafanaTheme\n): Threshold[] {\n if (field.color?.mode !== FieldColorModeId.Thresholds) {\n return [{ value: field.min ?? GAUGE_DEFAULT_MINIMUM, color: value.color ?? FALLBACK_COLOR }];\n }\n\n const thresholds = field.thresholds ?? DEFAULT_THRESHOLDS;\n const isPercent = thresholds.mode === ThresholdsMode.Percentage;\n const steps = thresholds.steps;\n\n let min = field.min ?? GAUGE_DEFAULT_MINIMUM;\n let max = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n\n if (isPercent) {\n min = 0;\n max = 100;\n }\n\n const first = getActiveThreshold(min, steps);\n const last = getActiveThreshold(max, steps);\n const formatted: Threshold[] = [\n { value: +min.toFixed(decimals), color: theme.visualization.getColorByName(first.color) },\n ];\n let skip = true;\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n if (skip) {\n if (first === step) {\n skip = false;\n }\n continue;\n }\n const prev = steps[i - 1];\n formatted.push({ value: step.value, color: theme.visualization.getColorByName(prev.color) });\n if (step === last) {\n break;\n }\n }\n formatted.push({ value: +max.toFixed(decimals), color: theme.visualization.getColorByName(last.color) });\n return formatted;\n}\n","import $ from 'jquery';\nimport React, { PureComponent } from 'react';\n\nimport {\n DisplayValue,\n formattedValueToString,\n FieldConfig,\n ThresholdsMode,\n GAUGE_DEFAULT_MAXIMUM,\n GAUGE_DEFAULT_MINIMUM,\n} from '@grafana/data';\nimport { VizTextDisplayOptions } from '@grafana/schema';\n\nimport { Themeable } from '../../types';\nimport { calculateFontSize } from '../../utils/measureText';\n\nimport { calculateGaugeAutoProps, DEFAULT_THRESHOLDS, getFormattedThresholds } from './utils';\n\nexport interface Props extends Themeable {\n height: number;\n field: FieldConfig;\n showThresholdMarkers: boolean;\n showThresholdLabels: boolean;\n width: number;\n value: DisplayValue;\n text?: VizTextDisplayOptions;\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n}\n\nexport class Gauge extends PureComponent<Props> {\n canvasElement: any;\n\n static defaultProps: Partial<Props> = {\n showThresholdMarkers: true,\n showThresholdLabels: false,\n field: {\n min: 0,\n max: 100,\n thresholds: DEFAULT_THRESHOLDS,\n },\n };\n\n componentDidMount() {\n this.draw();\n }\n\n componentDidUpdate() {\n this.draw();\n }\n\n draw() {\n const { field, showThresholdLabels, showThresholdMarkers, width, height, theme, value } = this.props;\n\n const autoProps = calculateGaugeAutoProps(width, height, value.title);\n const dimension = Math.min(width, autoProps.gaugeHeight);\n const backgroundColor = theme.colors.bg2;\n const gaugeWidthReduceRatio = showThresholdLabels ? 1.5 : 1;\n const gaugeWidth = Math.min(dimension / 5.5, 40) / gaugeWidthReduceRatio;\n const thresholdMarkersWidth = gaugeWidth / 5;\n const text = formattedValueToString(value);\n // This not 100% accurate as I am unsure of flot's calculations here\n const valueWidthBase = Math.min(width, dimension * 1.3) * 0.9;\n // remove gauge & marker width (on left and right side)\n // and 10px is some padding that flot adds to the outer canvas\n const valueWidth =\n valueWidthBase -\n ((gaugeWidth + (showThresholdMarkers ? thresholdMarkersWidth : 0) + (showThresholdLabels ? 10 : 0)) * 2 + 10);\n const fontSize = this.props.text?.valueSize ?? calculateFontSize(text, valueWidth, dimension, 1, gaugeWidth * 1.7);\n const thresholdLabelFontSize = Math.max(fontSize / 2.5, 12);\n\n let min = field.min ?? GAUGE_DEFAULT_MINIMUM;\n let max = field.max ?? GAUGE_DEFAULT_MAXIMUM;\n let numeric = value.numeric;\n\n if (field.thresholds?.mode === ThresholdsMode.Percentage) {\n min = 0;\n max = 100;\n if (value.percent === undefined) {\n numeric = ((numeric - min) / (max - min)) * 100;\n } else {\n numeric = value.percent! * 100;\n }\n }\n\n const decimals = field.decimals === undefined ? 2 : field.decimals!;\n\n if (showThresholdMarkers) {\n min = +min.toFixed(decimals);\n max = +max.toFixed(decimals);\n }\n\n const options: any = {\n series: {\n gauges: {\n gauge: {\n min,\n max,\n background: { color: backgroundColor },\n border: { color: null },\n shadow: { show: false },\n width: gaugeWidth,\n },\n frame: { show: false },\n label: { show: false },\n layout: { margin: 0, thresholdWidth: 0, vMargin: 0 },\n cell: { border: { width: 0 } },\n threshold: {\n values: getFormattedThresholds(decimals, field, value, theme),\n label: {\n show: showThresholdLabels,\n margin: thresholdMarkersWidth + 1,\n font: { size: thresholdLabelFontSize },\n },\n show: showThresholdMarkers,\n width: thresholdMarkersWidth,\n },\n value: {\n color: value.color,\n formatter: () => {\n return text;\n },\n font: { size: fontSize, family: theme.typography.fontFamily.sansSerif },\n },\n show: true,\n },\n },\n };\n\n const plotSeries = {\n data: [[0, numeric]],\n label: value.title,\n };\n\n try {\n $.plot(this.canvasElement, [plotSeries], options);\n } catch (err) {\n console.error('Gauge rendering error', err, options, value);\n }\n }\n\n renderVisualization = () => {\n const { width, value, height, onClick, text } = this.props;\n const autoProps = calculateGaugeAutoProps(width, height, value.title);\n\n return (\n <>\n <div\n style={{ height: `${autoProps.gaugeHeight}px`, width: '100%' }}\n ref={(element) => (this.canvasElement = element)}\n onClick={onClick}\n />\n {autoProps.showLabel && (\n <div\n style={{\n textAlign: 'center',\n fontSize: text?.titleSize ?? autoProps.titleFontSize,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n position: 'relative',\n width: '100%',\n top: '-4px',\n cursor: 'default',\n }}\n >\n {value.title}\n </div>\n )}\n </>\n );\n };\n\n render() {\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n className={this.props.className}\n >\n {this.renderVisualization()}\n </div>\n );\n }\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n FlotDataPoint,\n getValueFromDimension,\n Dimensions,\n dateTimeFormat,\n TimeZone,\n FormattedValue,\n} from '@grafana/data';\n\nimport { useTheme } from '../../themes';\nimport { ContextMenu, ContextMenuProps } from '../ContextMenu/ContextMenu';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { MenuGroup, MenuGroupProps } from '../Menu/MenuGroup';\nimport { MenuItem } from '../Menu/MenuItem';\nimport { SeriesIcon } from '../VizLegend/SeriesIcon';\n\nimport { GraphDimensions } from './GraphTooltip/types';\n\nexport type ContextDimensions<T extends Dimensions = any> = { [key in keyof T]: [number, number | undefined] | null };\n\nexport type GraphContextMenuProps = ContextMenuProps & {\n getContextMenuSource: () => FlotDataPoint | null;\n timeZone?: TimeZone;\n itemsGroup?: MenuGroupProps[];\n dimensions?: GraphDimensions;\n contextDimensions?: ContextDimensions;\n};\n\n/** @internal */\nexport const GraphContextMenu: React.FC<GraphContextMenuProps> = ({\n getContextMenuSource,\n timeZone,\n itemsGroup,\n dimensions,\n contextDimensions,\n ...otherProps\n}) => {\n const source = getContextMenuSource();\n\n // Do not render items that do not have label specified\n const itemsToRender = itemsGroup\n ? itemsGroup.map((group) => ({\n ...group,\n items: group.items?.filter((item) => item.label),\n }))\n : [];\n\n const renderHeader = () => {\n if (!source) {\n return null;\n }\n\n // If dimensions supplied, we can calculate and display value\n let value;\n if (dimensions?.yAxis && contextDimensions?.yAxis?.[1]) {\n const valueFromDimensions = getValueFromDimension(\n dimensions.yAxis,\n contextDimensions.yAxis[0],\n contextDimensions.yAxis[1]\n );\n const display = source.series.valueField.display!;\n value = display(valueFromDimensions);\n }\n\n const formattedValue = dateTimeFormat(source.datapoint[0], {\n defaultWithMS: source.series.hasMsResolution,\n timeZone,\n });\n\n return (\n <GraphContextMenuHeader\n timestamp={formattedValue}\n seriesColor={source.series.color}\n displayName={source.series.alias || source.series.label}\n displayValue={value}\n />\n );\n };\n const renderMenuGroupItems = () => {\n return itemsToRender?.map((group, index) => (\n <MenuGroup key={`${group.label}${index}`} label={group.label}>\n {(group.items || []).map((item) => (\n <MenuItem\n key={`${item.label}`}\n url={item.url}\n label={item.label}\n target={item.target}\n icon={item.icon}\n active={item.active}\n onClick={item.onClick}\n />\n ))}\n </MenuGroup>\n ));\n };\n\n return <ContextMenu {...otherProps} renderMenuItems={renderMenuGroupItems} renderHeader={renderHeader} />;\n};\n\n/** @internal */\nexport const GraphContextMenuHeader = ({\n timestamp,\n seriesColor,\n displayName,\n displayValue,\n}: {\n timestamp: string;\n seriesColor: string;\n displayName: string;\n displayValue: FormattedValue;\n}) => {\n const theme = useTheme();\n\n return (\n <div\n className={css`\n padding: ${theme.spacing.xs} ${theme.spacing.sm};\n font-size: ${theme.typography.size.sm};\n z-index: ${theme.zIndex.tooltip};\n `}\n >\n <strong>{timestamp}</strong>\n <HorizontalGroup>\n <div>\n <SeriesIcon color={seriesColor} />\n <span\n className={css`\n white-space: nowrap;\n padding-left: ${theme.spacing.xs};\n `}\n >\n {displayName}\n </span>\n </div>\n {displayValue && <FormattedValueDisplay value={displayValue} />}\n </HorizontalGroup>\n </div>\n );\n};\n","import {\n GraphSeriesValue,\n Field,\n formattedValueToString,\n getFieldDisplayName,\n TimeZone,\n dateTimeFormat,\n systemDateFormats,\n} from '@grafana/data';\n\n/**\n * Returns index of the closest datapoint BEFORE hover position\n *\n * @param posX\n * @param series\n */\nexport const findHoverIndexFromData = (xAxisDimension: Field, xPos: number) => {\n let lower = 0;\n let upper = xAxisDimension.values.length - 1;\n let middle;\n\n while (true) {\n if (lower > upper) {\n return Math.max(upper, 0);\n }\n middle = Math.floor((lower + upper) / 2);\n const xPosition = xAxisDimension.values.get(middle);\n\n if (xPosition === xPos) {\n return middle;\n } else if (xPosition && xPosition < xPos) {\n lower = middle + 1;\n } else {\n upper = middle - 1;\n }\n }\n};\n\ninterface MultiSeriesHoverInfo {\n value: string;\n time: string;\n datapointIndex: number;\n seriesIndex: number;\n label?: string;\n color?: string;\n}\n\n/**\n * Returns information about closest datapoints when hovering over a Graph\n *\n * @param seriesList list of series visible on the Graph\n * @param pos mouse cursor position, based on jQuery.flot position\n */\nexport const getMultiSeriesGraphHoverInfo = (\n // x and y axis dimensions order is aligned\n yAxisDimensions: Field[],\n xAxisDimensions: Field[],\n /** Well, time basically */\n xAxisPosition: number,\n timeZone?: TimeZone\n): {\n results: MultiSeriesHoverInfo[];\n time?: GraphSeriesValue;\n} => {\n let i, field, hoverIndex, hoverDistance, pointTime;\n\n const results: MultiSeriesHoverInfo[] = [];\n\n let minDistance, minTime;\n\n for (i = 0; i < yAxisDimensions.length; i++) {\n field = yAxisDimensions[i];\n const time = xAxisDimensions[i];\n hoverIndex = findHoverIndexFromData(time, xAxisPosition);\n hoverDistance = xAxisPosition - time.values.get(hoverIndex);\n pointTime = time.values.get(hoverIndex);\n // Take the closest point before the cursor, or if it does not exist, the closest after\n if (\n minDistance === undefined ||\n (hoverDistance >= 0 && (hoverDistance < minDistance || minDistance < 0)) ||\n (hoverDistance < 0 && hoverDistance > minDistance)\n ) {\n minDistance = hoverDistance;\n minTime = time.display ? formattedValueToString(time.display(pointTime)) : pointTime;\n }\n\n const disp = field.display!(field.values.get(hoverIndex));\n\n results.push({\n value: formattedValueToString(disp),\n datapointIndex: hoverIndex,\n seriesIndex: i,\n color: disp.color,\n label: getFieldDisplayName(field),\n time: time.display ? formattedValueToString(time.display(pointTime)) : pointTime,\n });\n }\n\n return {\n results,\n time: minTime,\n };\n};\n\nexport const graphTickFormatter = (epoch: number, axis: any) => {\n return dateTimeFormat(epoch, {\n format: axis?.options?.timeformat,\n timeZone: axis?.options?.timezone,\n });\n};\n\nexport const graphTimeFormat = (ticks: number | null, min: number | null, max: number | null): string => {\n if (min && max && ticks) {\n const range = max - min;\n const secPerTick = range / ticks / 1000;\n // Need have 10 millisecond margin on the day range\n // As sometimes last 24 hour dashboard evaluates to more than 86400000\n const oneDay = 86400010;\n const oneYear = 31536000000;\n\n if (secPerTick <= 10) {\n return systemDateFormats.interval.millisecond;\n }\n if (secPerTick <= 45) {\n return systemDateFormats.interval.second;\n }\n if (range <= oneDay) {\n return systemDateFormats.interval.minute;\n }\n if (secPerTick <= 80000) {\n return systemDateFormats.interval.hour;\n }\n if (range <= oneYear) {\n return systemDateFormats.interval.day;\n }\n if (secPerTick <= 31536000) {\n return systemDateFormats.interval.month;\n }\n return systemDateFormats.interval.year;\n }\n\n return systemDateFormats.interval.minute;\n};\n","import React from 'react';\n\nimport { getValueFromDimension } from '@grafana/data';\n\nimport { SeriesTable } from '../../VizTooltip';\nimport { FlotPosition } from '../types';\nimport { getMultiSeriesGraphHoverInfo } from '../utils';\n\nimport { GraphTooltipContentProps } from './types';\n\nexport const MultiModeGraphTooltip: React.FC<\n GraphTooltipContentProps & {\n // We expect position to figure out correct values when not hovering over a datapoint\n pos: FlotPosition;\n }\n> = ({ dimensions, activeDimensions, pos, timeZone }) => {\n let activeSeriesIndex: number | null = null;\n // when no x-axis provided, skip rendering\n if (activeDimensions.xAxis === null) {\n return null;\n }\n\n if (activeDimensions.yAxis) {\n activeSeriesIndex = activeDimensions.yAxis[0];\n }\n\n // when not hovering over a point, time is undefined, and we use pos.x as time\n const time = activeDimensions.xAxis[1]\n ? getValueFromDimension(dimensions.xAxis, activeDimensions.xAxis[0], activeDimensions.xAxis[1])\n : pos.x;\n\n const hoverInfo = getMultiSeriesGraphHoverInfo(dimensions.yAxis.columns, dimensions.xAxis.columns, time, timeZone);\n const timestamp = hoverInfo.time;\n\n const series = hoverInfo.results.map((s, i) => {\n return {\n color: s.color,\n label: s.label,\n value: s.value,\n isActive: activeSeriesIndex === i,\n };\n });\n\n return <SeriesTable series={series} timestamp={timestamp} />;\n};\n\nMultiModeGraphTooltip.displayName = 'MultiModeGraphTooltip';\n","import React from 'react';\n\nimport {\n getValueFromDimension,\n getColumnFromDimension,\n formattedValueToString,\n getFieldDisplayName,\n} from '@grafana/data';\n\nimport { SeriesTable } from '../../VizTooltip';\n\nimport { GraphTooltipContentProps } from './types';\n\nexport const SingleModeGraphTooltip: React.FC<GraphTooltipContentProps> = ({\n dimensions,\n activeDimensions,\n timeZone,\n}) => {\n // not hovering over a point, skip rendering\n if (\n activeDimensions.yAxis === null ||\n activeDimensions.yAxis[1] === undefined ||\n activeDimensions.xAxis === null ||\n activeDimensions.xAxis[1] === undefined\n ) {\n return null;\n }\n const time = getValueFromDimension(dimensions.xAxis, activeDimensions.xAxis[0], activeDimensions.xAxis[1]);\n const timeField = getColumnFromDimension(dimensions.xAxis, activeDimensions.xAxis[0]);\n const processedTime = timeField.display ? formattedValueToString(timeField.display(time)) : time;\n\n const valueField = getColumnFromDimension(dimensions.yAxis, activeDimensions.yAxis[0]);\n const value = getValueFromDimension(dimensions.yAxis, activeDimensions.yAxis[0], activeDimensions.yAxis[1]);\n const display = valueField.display!;\n const disp = display(value);\n\n return (\n <SeriesTable\n series={[\n {\n color: disp.color,\n label: getFieldDisplayName(valueField),\n value: formattedValueToString(disp),\n },\n ]}\n timestamp={processedTime}\n />\n );\n};\n\nSingleModeGraphTooltip.displayName = 'SingleModeGraphTooltip';\n","import React from 'react';\n\nimport { VizTooltipContentProps } from '../../VizTooltip';\n\nimport { MultiModeGraphTooltip } from './MultiModeGraphTooltip';\nimport { SingleModeGraphTooltip } from './SingleModeGraphTooltip';\nimport { GraphDimensions } from './types';\n\nexport const GraphTooltip: React.FC<VizTooltipContentProps<GraphDimensions>> = ({\n mode = 'single',\n dimensions,\n activeDimensions,\n pos,\n timeZone,\n}) => {\n // When\n // [1] no active dimension or\n // [2] no xAxis position\n // we assume no tooltip should be rendered\n if (!activeDimensions || !activeDimensions.xAxis) {\n return null;\n }\n\n if (mode === 'single') {\n return <SingleModeGraphTooltip dimensions={dimensions} activeDimensions={activeDimensions} timeZone={timeZone} />;\n } else {\n return (\n <MultiModeGraphTooltip\n dimensions={dimensions}\n activeDimensions={activeDimensions}\n pos={pos}\n timeZone={timeZone}\n />\n );\n }\n};\n\nGraphTooltip.displayName = 'GraphTooltip';\n","// Libraries\nimport $ from 'jquery';\nimport { uniqBy } from 'lodash';\nimport React, { PureComponent } from 'react';\n\n// Types\nimport { TimeRange, GraphSeriesXY, TimeZone, createDimension } from '@grafana/data';\nimport { TooltipDisplayMode } from '@grafana/schema';\n\nimport { VizTooltipProps, VizTooltipContentProps, ActiveDimensions, VizTooltip } from '../VizTooltip';\n\nimport { GraphContextMenu, GraphContextMenuProps, ContextDimensions } from './GraphContextMenu';\nimport { GraphTooltip } from './GraphTooltip/GraphTooltip';\nimport { GraphDimensions } from './GraphTooltip/types';\nimport { FlotPosition, FlotItem } from './types';\nimport { graphTimeFormat, graphTickFormatter } from './utils';\n\nexport interface GraphProps {\n ariaLabel?: string;\n children?: JSX.Element | JSX.Element[];\n series: GraphSeriesXY[];\n timeRange: TimeRange; // NOTE: we should aim to make `time` a property of the axis, not force it for all graphs\n timeZone?: TimeZone; // NOTE: we should aim to make `time` a property of the axis, not force it for all graphs\n showLines?: boolean;\n showPoints?: boolean;\n showBars?: boolean;\n width: number;\n height: number;\n isStacked?: boolean;\n lineWidth?: number;\n onHorizontalRegionSelected?: (from: number, to: number) => void;\n}\n\ninterface GraphState {\n pos?: FlotPosition;\n contextPos?: FlotPosition;\n isTooltipVisible: boolean;\n isContextVisible: boolean;\n activeItem?: FlotItem<GraphSeriesXY>;\n contextItem?: FlotItem<GraphSeriesXY>;\n}\n\n/**\n * This is a react wrapper for the angular, flot based graph visualization.\n * Rather than using this component, you should use the `<PanelRender .../> with\n * timeseries panel configs.\n *\n * @deprecated\n */\nexport class Graph extends PureComponent<GraphProps, GraphState> {\n static defaultProps = {\n showLines: true,\n showPoints: false,\n showBars: false,\n isStacked: false,\n lineWidth: 1,\n };\n\n state: GraphState = {\n isTooltipVisible: false,\n isContextVisible: false,\n };\n\n element: HTMLElement | null = null;\n $element: any;\n\n componentDidUpdate(prevProps: GraphProps, prevState: GraphState) {\n if (prevProps !== this.props) {\n this.draw();\n }\n }\n\n componentDidMount() {\n this.draw();\n if (this.element) {\n this.$element = $(this.element);\n this.$element.bind('plotselected', this.onPlotSelected);\n this.$element.bind('plothover', this.onPlotHover);\n this.$element.bind('plotclick', this.onPlotClick);\n }\n }\n\n componentWillUnmount() {\n if (this.$element) {\n this.$element.unbind('plotselected', this.onPlotSelected);\n }\n }\n\n onPlotSelected = (event: JQueryEventObject, ranges: { xaxis: { from: number; to: number } }) => {\n const { onHorizontalRegionSelected } = this.props;\n if (onHorizontalRegionSelected) {\n onHorizontalRegionSelected(ranges.xaxis.from, ranges.xaxis.to);\n }\n };\n\n onPlotHover = (event: JQueryEventObject, pos: FlotPosition, item?: FlotItem<GraphSeriesXY>) => {\n this.setState({\n isTooltipVisible: true,\n activeItem: item,\n pos,\n });\n };\n\n onPlotClick = (event: JQueryEventObject, contextPos: FlotPosition, item?: FlotItem<GraphSeriesXY>) => {\n this.setState({\n isContextVisible: true,\n isTooltipVisible: false,\n contextItem: item,\n contextPos,\n });\n };\n\n getYAxes(series: GraphSeriesXY[]) {\n if (series.length === 0) {\n return [{ show: true, min: -1, max: 1 }];\n }\n return uniqBy(\n series.map((s) => {\n const index = s.yAxis ? s.yAxis.index : 1;\n const min = s.yAxis && !isNaN(s.yAxis.min as number) ? s.yAxis.min : null;\n const tickDecimals = s.yAxis && !isNaN(s.yAxis.tickDecimals as number) ? s.yAxis.tickDecimals : null;\n return {\n show: true,\n index,\n position: index === 1 ? 'left' : 'right',\n min,\n tickDecimals,\n };\n }),\n (yAxisConfig) => yAxisConfig.index\n );\n }\n\n renderTooltip = () => {\n const { children, series, timeZone } = this.props;\n const { pos, activeItem, isTooltipVisible } = this.state;\n let tooltipElement: React.ReactElement<VizTooltipProps> | null = null;\n\n if (!isTooltipVisible || !pos || series.length === 0) {\n return null;\n }\n\n // Find children that indicate tooltip to be rendered\n React.Children.forEach(children, (c) => {\n // We have already found tooltip\n if (tooltipElement) {\n return;\n }\n // @ts-ignore\n const childType = c && c.type && (c.type.displayName || c.type.name);\n\n if (childType === VizTooltip.displayName) {\n tooltipElement = c as React.ReactElement<VizTooltipProps>;\n }\n });\n // If no tooltip provided, skip rendering\n if (!tooltipElement) {\n return null;\n }\n const tooltipElementProps = (tooltipElement as React.ReactElement<VizTooltipProps>).props;\n\n const tooltipMode = tooltipElementProps.mode || 'single';\n\n // If mode is single series and user is not hovering over item, skip rendering\n if (!activeItem && tooltipMode === 'single') {\n return null;\n }\n\n // Check if tooltip needs to be rendered with custom tooltip component, otherwise default to GraphTooltip\n const tooltipContentRenderer = tooltipElementProps.tooltipComponent || GraphTooltip;\n // Indicates column(field) index in y-axis dimension\n const seriesIndex = activeItem ? activeItem.series.seriesIndex : 0;\n // Indicates row index in active field values\n const rowIndex = activeItem ? activeItem.dataIndex : undefined;\n\n const activeDimensions: ActiveDimensions<GraphDimensions> = {\n // Described x-axis active item\n // When hovering over an item - let's take it's dataIndex, otherwise undefined\n // Tooltip itself needs to figure out correct datapoint display information based on pos passed to it\n xAxis: [seriesIndex, rowIndex],\n // Describes y-axis active item\n yAxis: activeItem ? [activeItem.series.seriesIndex, activeItem.dataIndex] : null,\n };\n\n const tooltipContentProps: VizTooltipContentProps<GraphDimensions> = {\n dimensions: {\n // time/value dimension columns are index-aligned - see getGraphSeriesModel\n xAxis: createDimension(\n 'xAxis',\n series.map((s) => s.timeField)\n ),\n yAxis: createDimension(\n 'yAxis',\n series.map((s) => s.valueField)\n ),\n },\n activeDimensions,\n pos,\n mode: tooltipElementProps.mode || TooltipDisplayMode.Single,\n timeZone,\n };\n\n const tooltipContent = React.createElement(tooltipContentRenderer, { ...tooltipContentProps });\n\n return React.cloneElement<VizTooltipProps>(tooltipElement as React.ReactElement<VizTooltipProps>, {\n content: tooltipContent,\n position: { x: pos.pageX, y: pos.pageY },\n offset: { x: 10, y: 10 },\n });\n };\n\n renderContextMenu = () => {\n const { series } = this.props;\n const { contextPos, contextItem, isContextVisible } = this.state;\n\n if (!isContextVisible || !contextPos || !contextItem || series.length === 0) {\n return null;\n }\n\n // Indicates column(field) index in y-axis dimension\n const seriesIndex = contextItem ? contextItem.series.seriesIndex : 0;\n // Indicates row index in context field values\n const rowIndex = contextItem ? contextItem.dataIndex : undefined;\n\n const contextDimensions: ContextDimensions<GraphDimensions> = {\n // Described x-axis context item\n xAxis: [seriesIndex, rowIndex],\n // Describes y-axis context item\n yAxis: contextItem ? [contextItem.series.seriesIndex, contextItem.dataIndex] : null,\n };\n\n const dimensions: GraphDimensions = {\n // time/value dimension columns are index-aligned - see getGraphSeriesModel\n xAxis: createDimension(\n 'xAxis',\n series.map((s) => s.timeField)\n ),\n yAxis: createDimension(\n 'yAxis',\n series.map((s) => s.valueField)\n ),\n };\n\n const closeContext = () => this.setState({ isContextVisible: false });\n\n const getContextMenuSource = () => {\n return {\n datapoint: contextItem.datapoint,\n dataIndex: contextItem.dataIndex,\n series: contextItem.series,\n seriesIndex: contextItem.series.seriesIndex,\n pageX: contextPos.pageX,\n pageY: contextPos.pageY,\n };\n };\n\n const contextContentProps: GraphContextMenuProps = {\n x: contextPos.pageX,\n y: contextPos.pageY,\n onClose: closeContext,\n getContextMenuSource: getContextMenuSource,\n timeZone: this.props.timeZone,\n dimensions,\n contextDimensions,\n };\n\n return <GraphContextMenu {...contextContentProps} />;\n };\n\n getBarWidth = () => {\n const { series } = this.props;\n return Math.min(...series.map((s) => s.timeStep));\n };\n\n draw() {\n if (this.element === null) {\n return;\n }\n\n const {\n width,\n series,\n timeRange,\n showLines,\n showBars,\n showPoints,\n isStacked,\n lineWidth,\n timeZone,\n onHorizontalRegionSelected,\n } = this.props;\n\n if (!width) {\n return;\n }\n\n const ticks = width / 100;\n const min = timeRange.from.valueOf();\n const max = timeRange.to.valueOf();\n const yaxes = this.getYAxes(series);\n\n const flotOptions: any = {\n legend: {\n show: false,\n },\n series: {\n stack: isStacked,\n lines: {\n show: showLines,\n lineWidth: lineWidth,\n zero: false,\n },\n points: {\n show: showPoints,\n fill: 1,\n fillColor: false,\n radius: 2,\n },\n bars: {\n show: showBars,\n fill: 1,\n // Dividig the width by 1.5 to make the bars not touch each other\n barWidth: showBars ? this.getBarWidth() / 1.5 : 1,\n zero: false,\n lineWidth: lineWidth,\n },\n shadowSize: 0,\n },\n xaxis: {\n timezone: timeZone,\n show: true,\n mode: 'time',\n min: min,\n max: max,\n label: 'Datetime',\n ticks: ticks,\n timeformat: graphTimeFormat(ticks, min, max),\n tickFormatter: graphTickFormatter,\n },\n yaxes,\n grid: {\n minBorderMargin: 0,\n markings: [],\n backgroundColor: null,\n borderWidth: 0,\n hoverable: true,\n clickable: true,\n color: '#a1a1a1',\n margin: { left: 0, right: 0 },\n labelMarginX: 0,\n mouseActiveRadius: 30,\n },\n selection: {\n mode: onHorizontalRegionSelected ? 'x' : null,\n color: '#666',\n },\n crosshair: {\n mode: 'x',\n },\n };\n\n try {\n $.plot(\n this.element,\n series.filter((s) => s.isVisible),\n flotOptions\n );\n } catch (err) {\n console.error('Graph rendering error', err, flotOptions, series);\n throw new Error('Error rendering panel');\n }\n }\n\n render() {\n const { ariaLabel, height, width, series } = this.props;\n const noDataToBeDisplayed = series.length === 0;\n const tooltip = this.renderTooltip();\n const context = this.renderContextMenu();\n return (\n <div className=\"graph-panel\" aria-label={ariaLabel}>\n <div\n className=\"graph-panel__chart\"\n ref={(e) => (this.element = e)}\n style={{ height, width }}\n onMouseLeave={() => {\n this.setState({ isTooltipVisible: false });\n }}\n />\n {noDataToBeDisplayed && <div className=\"datapoints-warning\">No data</div>}\n {tooltip}\n {context}\n </div>\n );\n }\n}\n\nexport default Graph;\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useStyles } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\n/**\n * @internal\n */\nexport type ErrorIndicatorProps = {\n error?: string;\n onClick?: () => void;\n};\n\n/**\n * @internal\n */\nexport const ErrorIndicator: React.FC<ErrorIndicatorProps> = ({ error, onClick }) => {\n const styles = useStyles(getStyles);\n\n if (!error) {\n return null;\n }\n\n return (\n <Tooltip theme=\"error\" content={error}>\n <Icon\n onClick={onClick}\n className={cx(styles.icon, { [styles.clickable]: !!onClick })}\n size=\"sm\"\n name=\"exclamation-triangle\"\n />\n </Tooltip>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n return {\n clickable: css`\n cursor: pointer;\n `,\n icon: css`\n color: ${theme.palette.red88};\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { CSSProperties, ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2, useTheme2 } from '../../themes';\n\n/**\n * @internal\n */\nexport interface PanelChromeProps {\n width: number;\n height: number;\n title?: string;\n padding?: PanelPadding;\n leftItems?: React.ReactNode[]; // rightItems will be added later (actions links etc.)\n children: (innerWidth: number, innerHeight: number) => React.ReactNode;\n}\n\n/**\n * @internal\n */\nexport type PanelPadding = 'none' | 'md';\n\n/**\n * @internal\n */\nexport const PanelChrome: React.FC<PanelChromeProps> = ({\n title = '',\n children,\n width,\n height,\n padding = 'md',\n leftItems = [],\n}) => {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n\n const headerHeight = getHeaderHeight(theme, title, leftItems);\n const { contentStyle, innerWidth, innerHeight } = getContentStyle(padding, theme, width, headerHeight, height);\n\n const headerStyles: CSSProperties = {\n height: headerHeight,\n };\n\n const containerStyles: CSSProperties = { width, height };\n\n return (\n <div className={styles.container} style={containerStyles}>\n <div className={styles.header} style={headerStyles}>\n <div className={styles.headerTitle}>{title}</div>\n {itemsRenderer(leftItems, (items) => {\n return <div className={styles.leftItems}>{items}</div>;\n })}\n </div>\n <div className={styles.content} style={contentStyle}>\n {children(innerWidth, innerHeight)}\n </div>\n </div>\n );\n};\n\nconst itemsRenderer = (items: ReactNode[], renderer: (items: ReactNode[]) => ReactNode): ReactNode => {\n const toRender = React.Children.toArray(items).filter(Boolean);\n return toRender.length > 0 ? renderer(toRender) : null;\n};\n\nconst getHeaderHeight = (theme: GrafanaTheme2, title: string, items: ReactNode[]) => {\n if (title.length > 0 || items.length > 0) {\n return theme.spacing.gridSize * theme.components.panel.headerHeight;\n }\n return 0;\n};\n\nconst getContentStyle = (\n padding: string,\n theme: GrafanaTheme2,\n width: number,\n headerHeight: number,\n height: number\n) => {\n const chromePadding = (padding === 'md' ? theme.components.panel.padding : 0) * theme.spacing.gridSize;\n const panelBorder = 1 * 2;\n const innerWidth = width - chromePadding * 2 - panelBorder;\n const innerHeight = height - headerHeight - chromePadding * 2 - panelBorder;\n\n const contentStyle: CSSProperties = {\n padding: chromePadding,\n };\n\n return { contentStyle, innerWidth, innerHeight };\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const { padding, background, borderColor } = theme.components.panel;\n\n return {\n container: css`\n label: panel-container;\n background-color: ${background};\n border: 1px solid ${borderColor};\n position: relative;\n border-radius: 3px;\n height: 100%;\n display: flex;\n flex-direction: column;\n flex: 0 0 0;\n `,\n content: css`\n label: panel-content;\n width: 100%;\n flex-grow: 1;\n `,\n header: css`\n label: panel-header;\n display: flex;\n align-items: center;\n `,\n headerTitle: css`\n label: panel-header;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding-left: ${theme.spacing(padding)};\n flex-grow: 1;\n font-weight: ${theme.typography.fontWeightMedium};\n `,\n leftItems: css`\n display: flex;\n padding-right: ${theme.spacing(padding)};\n `,\n };\n};\n","/**\n * Mode to describe if a legend is isolated/selected or being appended to an existing\n * series selection.\n * @alpha\n */\n\nexport enum SeriesVisibilityChangeMode {\n ToggleSelection = 'select',\n AppendToSelection = 'append',\n}\n","import React from 'react';\n\nimport { ErrorIndicator } from './ErrorIndicator';\nimport { LoadingIndicator } from './LoadingIndicator';\nimport { PanelChrome as PanelChromeComponent, PanelChromeProps } from './PanelChrome';\n\n/**\n * @internal\n */\nexport { PanelChromeProps, PanelPadding } from './PanelChrome';\n\n/**\n * @internal\n */\nexport interface PanelChromeType extends React.FC<PanelChromeProps> {\n LoadingIndicator: typeof LoadingIndicator;\n ErrorIndicator: typeof ErrorIndicator;\n}\n\n/**\n * @internal\n */\nexport const PanelChrome = PanelChromeComponent as PanelChromeType;\nPanelChrome.LoadingIndicator = LoadingIndicator;\nPanelChrome.ErrorIndicator = ErrorIndicator;\n\n/**\n * Exporting the components for extensibility and since it is a good practice\n * according to the api-extractor.\n */\nexport {\n LoadingIndicator as PanelChromeLoadingIndicator,\n LoadingIndicatorProps as PanelChromeLoadingIndicatorProps,\n} from './LoadingIndicator';\n\nexport {\n ErrorIndicator as PanelChromeErrorIndicator,\n ErrorIndicatorProps as PanelChromeErrorIndicatorProps,\n} from './ErrorIndicator';\n\nexport { usePanelContext, PanelContextProvider, PanelContext, PanelContextRoot } from './PanelContext';\n\nexport * from './types';\n","import React from 'react';\n\nimport { ListProps, AbstractList } from './AbstractList';\n\nexport class InlineList<T> extends React.PureComponent<ListProps<T>> {\n render() {\n return <AbstractList inline {...this.props} />;\n }\n}\n","import React, { useCallback } from 'react';\n\nimport { SeriesColorPicker } from '../ColorPicker/ColorPicker';\nimport { usePanelContext } from '../PanelChrome';\n\nimport { SeriesIcon } from './SeriesIcon';\n\ninterface Props {\n seriesName: string;\n color?: string;\n gradient?: string;\n readonly?: boolean;\n}\n\n/**\n * @internal\n */\nexport const VizLegendSeriesIcon: React.FunctionComponent<Props> = ({ seriesName, color, gradient, readonly }) => {\n const { onSeriesColorChange } = usePanelContext();\n const onChange = useCallback(\n (color: string) => {\n return onSeriesColorChange!(seriesName, color);\n },\n [seriesName, onSeriesColorChange]\n );\n\n if (seriesName && onSeriesColorChange && color && !readonly) {\n return (\n <SeriesColorPicker color={color} onChange={onChange} enableNamedColors>\n {({ ref, showColorPicker, hideColorPicker }) => (\n <SeriesIcon\n color={color}\n className=\"pointer\"\n ref={ref}\n onClick={showColorPicker}\n onMouseLeave={hideColorPicker}\n />\n )}\n </SeriesColorPicker>\n );\n }\n return <SeriesIcon color={color} gradient={gradient} />;\n};\n\nVizLegendSeriesIcon.displayName = 'VizLegendSeriesIcon';\n","import { css } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport React from 'react';\n\nimport { DisplayValue, formattedValueToString } from '@grafana/data';\n\nimport { useStyles } from '../../themes/ThemeContext';\nimport { InlineList } from '../List/InlineList';\n\n/**\n * @internal\n */\nexport const VizLegendStatsList: React.FunctionComponent<{ stats: DisplayValue[] }> = ({ stats }) => {\n const styles = useStyles(getStyles);\n\n if (stats.length === 0) {\n return null;\n }\n\n return (\n <InlineList\n className={styles.list}\n items={stats}\n renderItem={(stat) => (\n <div className={styles.item} title={stat.description}>\n {stat.title && `${capitalize(stat.title)}:`} {formattedValueToString(stat)}\n </div>\n )}\n />\n );\n};\n\nconst getStyles = () => ({\n list: css`\n flex-grow: 1;\n text-align: right;\n `,\n item: css`\n margin-left: 8px;\n `,\n});\n\nVizLegendStatsList.displayName = 'VizLegendStatsList';\n","import { css, cx } from '@emotion/css';\nimport React, { useCallback } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles } from '../../themes';\n\nimport { VizLegendSeriesIcon } from './VizLegendSeriesIcon';\nimport { VizLegendStatsList } from './VizLegendStatsList';\nimport { VizLegendItem } from './types';\n\nexport interface Props<T> {\n item: VizLegendItem<T>;\n className?: string;\n onLabelClick?: (item: VizLegendItem<T>, event: React.MouseEvent<HTMLDivElement>) => void;\n onLabelMouseEnter?: (item: VizLegendItem, event: React.MouseEvent<HTMLDivElement>) => void;\n onLabelMouseOut?: (item: VizLegendItem, event: React.MouseEvent<HTMLDivElement>) => void;\n readonly?: boolean;\n}\n\n/**\n * @internal\n */\nexport const VizLegendListItem = <T extends unknown = any>({\n item,\n onLabelClick,\n onLabelMouseEnter,\n onLabelMouseOut,\n className,\n readonly,\n}: Props<T>) => {\n const styles = useStyles(getStyles);\n\n const onMouseEnter = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onLabelMouseEnter) {\n onLabelMouseEnter(item, event);\n }\n },\n [item, onLabelMouseEnter]\n );\n\n const onMouseOut = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onLabelMouseOut) {\n onLabelMouseOut(item, event);\n }\n },\n [item, onLabelMouseOut]\n );\n\n const onClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onLabelClick) {\n onLabelClick(item, event);\n }\n },\n [item, onLabelClick]\n );\n\n return (\n <div\n className={cx(styles.itemWrapper, item.disabled && styles.itemDisabled, className)}\n aria-label={selectors.components.VizLegend.seriesName(item.label)}\n >\n <VizLegendSeriesIcon seriesName={item.label} color={item.color} gradient={item.gradient} readonly={readonly} />\n <div\n onMouseEnter={onMouseEnter}\n onMouseOut={onMouseOut}\n onClick={!readonly ? onClick : undefined}\n className={cx(styles.label, !readonly && styles.clickable)}\n >\n {item.label}\n </div>\n\n {item.getDisplayValues && <VizLegendStatsList stats={item.getDisplayValues()} />}\n </div>\n );\n};\n\nVizLegendListItem.displayName = 'VizLegendListItem';\n\nconst getStyles = (theme: GrafanaTheme) => ({\n label: css`\n label: LegendLabel;\n white-space: nowrap;\n `,\n clickable: css`\n label: LegendClickabel;\n cursor: pointer;\n `,\n itemDisabled: css`\n label: LegendLabelDisabled;\n color: ${theme.colors.linkDisabled};\n `,\n itemWrapper: css`\n label: LegendItemWrapper;\n display: flex;\n white-space: nowrap;\n align-items: center;\n flex-grow: 1;\n `,\n value: css`\n text-align: right;\n `,\n yAxisLabel: css`\n color: ${theme.palette.gray2};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useStyles } from '../../themes';\nimport { InlineList } from '../List/InlineList';\nimport { List } from '../List/List';\n\nimport { VizLegendListItem } from './VizLegendListItem';\nimport { VizLegendBaseProps, VizLegendItem } from './types';\n\nexport interface Props<T> extends VizLegendBaseProps<T> {}\n\n/**\n * @internal\n */\nexport const VizLegendList = <T extends unknown>({\n items,\n itemRenderer,\n onLabelMouseEnter,\n onLabelMouseOut,\n onLabelClick,\n placement,\n className,\n readonly,\n}: Props<T>) => {\n const styles = useStyles(getStyles);\n\n if (!itemRenderer) {\n /* eslint-disable-next-line react/display-name */\n itemRenderer = (item) => (\n <VizLegendListItem\n item={item}\n onLabelClick={onLabelClick}\n onLabelMouseEnter={onLabelMouseEnter}\n onLabelMouseOut={onLabelMouseOut}\n readonly={readonly}\n />\n );\n }\n\n const getItemKey = (item: VizLegendItem<T>) => `${item.getItemKey ? item.getItemKey() : item.label}`;\n\n switch (placement) {\n case 'right': {\n const renderItem = (item: VizLegendItem<T>, index: number) => {\n return <span className={styles.itemRight}>{itemRenderer!(item, index)}</span>;\n };\n\n return (\n <div className={cx(styles.rightWrapper, className)}>\n <List items={items} renderItem={renderItem} getItemKey={getItemKey} />\n </div>\n );\n }\n case 'bottom':\n default: {\n const renderItem = (item: VizLegendItem<T>, index: number) => {\n return <span className={styles.itemBottom}>{itemRenderer!(item, index)}</span>;\n };\n\n return (\n <div className={cx(styles.bottomWrapper, className)}>\n <div className={styles.section}>\n <InlineList\n items={items.filter((item) => item.yAxis === 1)}\n renderItem={renderItem}\n getItemKey={getItemKey}\n />\n </div>\n <div className={cx(styles.section, styles.sectionRight)}>\n <InlineList\n items={items.filter((item) => item.yAxis !== 1)}\n renderItem={renderItem}\n getItemKey={getItemKey}\n />\n </div>\n </div>\n );\n }\n }\n};\n\nVizLegendList.displayName = 'VizLegendList';\n\nconst getStyles = (theme: GrafanaTheme) => {\n const itemStyles = css`\n padding-right: 10px;\n display: flex;\n font-size: ${theme.typography.size.sm};\n white-space: nowrap;\n `;\n\n return {\n itemBottom: itemStyles,\n itemRight: cx(\n itemStyles,\n css`\n margin-bottom: ${theme.spacing.xs};\n `\n ),\n rightWrapper: css`\n padding-left: ${theme.spacing.sm};\n `,\n bottomWrapper: css`\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n width: 100%;\n padding-left: ${theme.spacing.md};\n `,\n section: css`\n display: flex;\n `,\n sectionRight: css`\n justify-content: flex-end;\n flex-grow: 1;\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useCallback } from 'react';\n\nimport { formattedValueToString, GrafanaTheme2 } from '@grafana/data';\n\nimport { styleMixins } from '../../themes';\nimport { useStyles2 } from '../../themes/ThemeContext';\n\nimport { VizLegendSeriesIcon } from './VizLegendSeriesIcon';\nimport { VizLegendItem } from './types';\n\nexport interface Props {\n key?: React.Key;\n item: VizLegendItem;\n className?: string;\n onLabelClick?: (item: VizLegendItem, event: React.MouseEvent<HTMLDivElement>) => void;\n onLabelMouseEnter?: (item: VizLegendItem, event: React.MouseEvent<HTMLDivElement>) => void;\n onLabelMouseOut?: (item: VizLegendItem, event: React.MouseEvent<HTMLDivElement>) => void;\n readonly?: boolean;\n}\n\n/**\n * @internal\n */\nexport const LegendTableItem: React.FunctionComponent<Props> = ({\n item,\n onLabelClick,\n onLabelMouseEnter,\n onLabelMouseOut,\n className,\n readonly,\n}) => {\n const styles = useStyles2(getStyles);\n\n const onMouseEnter = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onLabelMouseEnter) {\n onLabelMouseEnter(item, event);\n }\n },\n [item, onLabelMouseEnter]\n );\n\n const onMouseOut = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onLabelMouseOut) {\n onLabelMouseOut(item, event);\n }\n },\n [item, onLabelMouseOut]\n );\n\n const onClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (onLabelClick) {\n onLabelClick(item, event);\n }\n },\n [item, onLabelClick]\n );\n\n return (\n <tr className={cx(styles.row, className)}>\n <td>\n <span className={styles.itemWrapper}>\n <VizLegendSeriesIcon color={item.color} seriesName={item.label} readonly={readonly} />\n <div\n onMouseEnter={onMouseEnter}\n onMouseOut={onMouseOut}\n onClick={!readonly ? onClick : undefined}\n className={cx(styles.label, item.disabled && styles.labelDisabled, !readonly && styles.clickable)}\n >\n {item.label} {item.yAxis === 2 && <span className={styles.yAxisLabel}>(right y-axis)</span>}\n </div>\n </span>\n </td>\n {item.getDisplayValues &&\n item.getDisplayValues().map((stat, index) => {\n return (\n <td className={styles.value} key={`${stat.title}-${index}`}>\n {formattedValueToString(stat)}\n </td>\n );\n })}\n </tr>\n );\n};\n\nLegendTableItem.displayName = 'LegendTableItem';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const rowHoverBg = styleMixins.hoverColor(theme.colors.background.primary, theme);\n\n return {\n row: css`\n label: LegendRow;\n font-size: ${theme.v1.typography.size.sm};\n border-bottom: 1px solid ${theme.colors.border.weak};\n td {\n padding: ${theme.spacing(0.25, 1)};\n white-space: nowrap;\n }\n\n &:hover {\n background: ${rowHoverBg};\n }\n `,\n label: css`\n label: LegendLabel;\n white-space: nowrap;\n `,\n labelDisabled: css`\n label: LegendLabelDisabled;\n color: ${theme.colors.text.disabled};\n `,\n clickable: css`\n label: LegendClickable;\n cursor: pointer;\n `,\n itemWrapper: css`\n display: flex;\n white-space: nowrap;\n align-items: center;\n `,\n value: css`\n text-align: right;\n `,\n yAxisLabel: css`\n color: ${theme.colors.text.secondary};\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport { orderBy } from 'lodash';\nimport React from 'react';\n\nimport { DisplayValue, GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\n\nimport { LegendTableItem } from './VizLegendTableItem';\nimport { VizLegendTableProps } from './types';\n\n/**\n * @internal\n */\nexport const VizLegendTable = <T extends unknown>({\n items,\n sortBy: sortKey,\n sortDesc,\n itemRenderer,\n className,\n onToggleSort,\n onLabelClick,\n onLabelMouseEnter,\n onLabelMouseOut,\n readonly,\n}: VizLegendTableProps<T>): JSX.Element => {\n const styles = useStyles2(getStyles);\n const stats: Record<string, DisplayValue> = {};\n\n for (const item of items) {\n if (item.getDisplayValues) {\n for (const displayValue of item.getDisplayValues()) {\n stats[displayValue.title ?? '?'] = displayValue;\n }\n }\n }\n\n const sortedItems = sortKey\n ? orderBy(\n items,\n (item) => {\n if (item.getDisplayValues) {\n const stat = item.getDisplayValues().filter((stat) => stat.title === sortKey)[0];\n return stat && stat.numeric;\n }\n return undefined;\n },\n sortDesc ? 'desc' : 'asc'\n )\n : items;\n\n if (!itemRenderer) {\n /* eslint-disable-next-line react/display-name */\n itemRenderer = (item, index) => (\n <LegendTableItem\n key={`${item.label}-${index}`}\n item={item}\n onLabelClick={onLabelClick}\n onLabelMouseEnter={onLabelMouseEnter}\n onLabelMouseOut={onLabelMouseOut}\n readonly={readonly}\n />\n );\n }\n\n return (\n <table className={cx(styles.table, className)}>\n <thead>\n <tr>\n <th></th>\n {Object.keys(stats).map((columnTitle) => {\n const displayValue = stats[columnTitle];\n return (\n <th\n title={displayValue.description}\n key={columnTitle}\n className={cx(styles.header, onToggleSort && styles.headerSortable, {\n [styles.withIcon]: sortKey === columnTitle,\n })}\n onClick={() => {\n if (onToggleSort) {\n onToggleSort(columnTitle);\n }\n }}\n >\n {columnTitle}\n {sortKey === columnTitle && <Icon size=\"xs\" name={sortDesc ? 'angle-down' : 'angle-up'} />}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>{sortedItems.map(itemRenderer!)}</tbody>\n </table>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n table: css`\n width: 100%;\n th:first-child {\n width: 100%;\n border-bottom: 1px solid ${theme.colors.border.weak};\n }\n `,\n header: css`\n color: ${theme.colors.primary.text};\n font-weight: ${theme.typography.fontWeightMedium};\n border-bottom: 1px solid ${theme.colors.border.weak};\n padding: ${theme.spacing(0.25, 1, 0.25, 1)};\n font-size: ${theme.typography.bodySmall.fontSize};\n text-align: right;\n white-space: nowrap;\n `,\n // This needs to be padding-right - icon size(xs==12) to avoid jumping\n withIcon: css`\n padding-right: 4px;\n `,\n headerSortable: css`\n cursor: pointer;\n `,\n});\n","import React from 'react';\n\nimport { DataFrameFieldIndex, DisplayValue } from '@grafana/data';\nimport { LegendDisplayMode, LegendPlacement } from '@grafana/schema';\n\nexport enum SeriesVisibilityChangeBehavior {\n Isolate,\n Hide,\n}\n\nexport interface VizLegendBaseProps<T> {\n placement: LegendPlacement;\n className?: string;\n items: Array<VizLegendItem<T>>;\n seriesVisibilityChangeBehavior?: SeriesVisibilityChangeBehavior;\n onLabelClick?: (item: VizLegendItem<T>, event: React.MouseEvent<HTMLElement>) => void;\n itemRenderer?: (item: VizLegendItem<T>, index: number) => JSX.Element;\n onLabelMouseEnter?: (item: VizLegendItem, event: React.MouseEvent<HTMLElement>) => void;\n onLabelMouseOut?: (item: VizLegendItem, event: React.MouseEvent<HTMLElement>) => void;\n readonly?: boolean;\n}\n\nexport interface VizLegendTableProps<T> extends VizLegendBaseProps<T> {\n sortBy?: string;\n sortDesc?: boolean;\n onToggleSort?: (sortBy: string) => void;\n}\n\nexport interface LegendProps<T = any> extends VizLegendBaseProps<T>, VizLegendTableProps<T> {\n displayMode: LegendDisplayMode;\n}\n\nexport interface VizLegendItem<T = any> {\n getItemKey?: () => string;\n label: string;\n color?: string;\n gradient?: string;\n yAxis: number;\n disabled?: boolean;\n // displayValues?: DisplayValue[];\n getDisplayValues?: () => DisplayValue[];\n fieldIndex?: DataFrameFieldIndex;\n data?: T;\n}\n","import React, { useCallback } from 'react';\n\nimport { DataHoverClearEvent, DataHoverEvent } from '@grafana/data';\nimport { LegendDisplayMode } from '@grafana/schema';\n\nimport { SeriesVisibilityChangeMode, usePanelContext } from '../PanelChrome';\n\nimport { VizLegendList } from './VizLegendList';\nimport { VizLegendTable } from './VizLegendTable';\nimport { LegendProps, SeriesVisibilityChangeBehavior, VizLegendItem } from './types';\nimport { mapMouseEventToMode } from './utils';\n\n/**\n * @public\n */\nexport function VizLegend<T>({\n items,\n displayMode,\n sortBy: sortKey,\n seriesVisibilityChangeBehavior = SeriesVisibilityChangeBehavior.Isolate,\n sortDesc,\n onLabelClick,\n onToggleSort,\n placement,\n className,\n itemRenderer,\n readonly,\n}: LegendProps<T>) {\n const { eventBus, onToggleSeriesVisibility, onToggleLegendSort } = usePanelContext();\n\n const onMouseEnter = useCallback(\n (item: VizLegendItem, event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n eventBus?.publish({\n type: DataHoverEvent.type,\n payload: {\n raw: event,\n x: 0,\n y: 0,\n dataId: item.label,\n },\n });\n },\n [eventBus]\n );\n\n const onMouseOut = useCallback(\n (item: VizLegendItem, event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n eventBus?.publish({\n type: DataHoverClearEvent.type,\n payload: {\n raw: event,\n x: 0,\n y: 0,\n dataId: item.label,\n },\n });\n },\n [eventBus]\n );\n\n const onLegendLabelClick = useCallback(\n (item: VizLegendItem, event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n if (onLabelClick) {\n onLabelClick(item, event);\n }\n if (onToggleSeriesVisibility) {\n onToggleSeriesVisibility(\n item.label,\n seriesVisibilityChangeBehavior === SeriesVisibilityChangeBehavior.Hide\n ? SeriesVisibilityChangeMode.AppendToSelection\n : mapMouseEventToMode(event)\n );\n }\n },\n [onToggleSeriesVisibility, onLabelClick, seriesVisibilityChangeBehavior]\n );\n\n switch (displayMode) {\n case LegendDisplayMode.Table:\n return (\n <VizLegendTable<T>\n className={className}\n items={items}\n placement={placement}\n sortBy={sortKey}\n sortDesc={sortDesc}\n onLabelClick={onLegendLabelClick}\n onToggleSort={onToggleSort || onToggleLegendSort}\n onLabelMouseEnter={onMouseEnter}\n onLabelMouseOut={onMouseOut}\n itemRenderer={itemRenderer}\n readonly={readonly}\n />\n );\n case LegendDisplayMode.List:\n return (\n <VizLegendList<T>\n className={className}\n items={items}\n placement={placement}\n onLabelMouseEnter={onMouseEnter}\n onLabelMouseOut={onMouseOut}\n onLabelClick={onLegendLabelClick}\n itemRenderer={itemRenderer}\n readonly={readonly}\n />\n );\n default:\n return null;\n }\n}\n\nVizLegend.displayName = 'Legend';\n","import { SeriesVisibilityChangeMode } from '..';\n\nexport function mapMouseEventToMode(event: React.MouseEvent): SeriesVisibilityChangeMode {\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n return SeriesVisibilityChangeMode.AppendToSelection;\n }\n return SeriesVisibilityChangeMode.ToggleSelection;\n}\n","// Libraries\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GraphSeriesValue } from '@grafana/data';\nimport { LegendDisplayMode, LegendPlacement } from '@grafana/schema';\n\nimport { stylesFactory } from '../../themes';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { VizLegend } from '../VizLegend/VizLegend';\nimport { VizLegendItem } from '../VizLegend/types';\n\nimport { Graph, GraphProps } from './Graph';\n\nexport interface GraphWithLegendProps extends GraphProps {\n legendDisplayMode: LegendDisplayMode;\n legendVisibility: boolean;\n placement: LegendPlacement;\n hideEmpty?: boolean;\n hideZero?: boolean;\n sortLegendBy?: string;\n sortLegendDesc?: boolean;\n onSeriesToggle?: (label: string, event: React.MouseEvent<HTMLElement>) => void;\n onToggleSort: (sortBy: string) => void;\n}\n\nconst getGraphWithLegendStyles = stylesFactory(({ placement }: GraphWithLegendProps) => ({\n wrapper: css`\n display: flex;\n flex-direction: ${placement === 'bottom' ? 'column' : 'row'};\n `,\n graphContainer: css`\n min-height: 65%;\n flex-grow: 1;\n `,\n legendContainer: css`\n padding: 10px 0;\n max-height: ${placement === 'bottom' ? '35%' : 'none'};\n `,\n}));\n\nconst shouldHideLegendItem = (data: GraphSeriesValue[][], hideEmpty = false, hideZero = false) => {\n const isZeroOnlySeries = data.reduce((acc, current) => acc + (current[1] || 0), 0) === 0;\n const isNullOnlySeries = !data.reduce((acc, current) => acc && current[1] !== null, true);\n\n return (hideEmpty && isNullOnlySeries) || (hideZero && isZeroOnlySeries);\n};\n\nexport const GraphWithLegend: React.FunctionComponent<GraphWithLegendProps> = (props: GraphWithLegendProps) => {\n const {\n series,\n timeRange,\n width,\n height,\n showBars,\n showLines,\n showPoints,\n sortLegendBy,\n sortLegendDesc,\n legendDisplayMode,\n legendVisibility,\n placement,\n onSeriesToggle,\n onToggleSort,\n hideEmpty,\n hideZero,\n isStacked,\n lineWidth,\n onHorizontalRegionSelected,\n timeZone,\n children,\n ariaLabel,\n } = props;\n const { graphContainer, wrapper, legendContainer } = getGraphWithLegendStyles(props);\n\n const legendItems = series.reduce<VizLegendItem[]>((acc, s) => {\n return shouldHideLegendItem(s.data, hideEmpty, hideZero)\n ? acc\n : acc.concat([\n {\n label: s.label,\n color: s.color || '',\n disabled: !s.isVisible,\n yAxis: s.yAxis.index,\n getDisplayValues: () => s.info || [],\n },\n ]);\n }, []);\n\n return (\n <div className={wrapper} aria-label={ariaLabel}>\n <div className={graphContainer}>\n <Graph\n series={series}\n timeRange={timeRange}\n timeZone={timeZone}\n showLines={showLines}\n showPoints={showPoints}\n showBars={showBars}\n width={width}\n height={height}\n isStacked={isStacked}\n lineWidth={lineWidth}\n onHorizontalRegionSelected={onHorizontalRegionSelected}\n >\n {children}\n </Graph>\n </div>\n\n {legendVisibility && (\n <div className={legendContainer}>\n <CustomScrollbar hideHorizontalTrack>\n <VizLegend\n items={legendItems}\n displayMode={legendDisplayMode}\n placement={placement}\n sortBy={sortLegendBy}\n sortDesc={sortLegendDesc}\n onLabelClick={(item, event) => {\n if (onSeriesToggle) {\n onSeriesToggle(item.label, event);\n }\n }}\n onToggleSort={onToggleSort}\n />\n </CustomScrollbar>\n </div>\n )}\n </div>\n );\n};\n","/**\n * This function will calculate how many squares we can fit inside a rectangle.\n * Please have a look at this post for more details about the implementation:\n * https://math.stackexchange.com/questions/466198/algorithm-to-get-the-maximum-size-of-n-squares-that-fit-into-a-rectangle-with-a\n *\n * @param parentWidth width of the parent container\n * @param parentHeight height of the parent container\n * @param numberOfChildren number of children that should fit in the parent container\n */\nexport const calculateGridDimensions = (\n parentWidth: number,\n parentHeight: number,\n itemSpacing: number,\n numberOfChildren: number\n) => {\n const vertical = calculateSizeOfChild(parentWidth, parentHeight, numberOfChildren);\n const horizontal = calculateSizeOfChild(parentHeight, parentWidth, numberOfChildren);\n const square = Math.max(vertical, horizontal);\n let xCount = Math.floor(parentWidth / square);\n let yCount = Math.ceil(numberOfChildren / xCount);\n\n // after yCount update xCount to make split between rows more even\n xCount = Math.ceil(numberOfChildren / yCount);\n\n const itemsOnLastRow = xCount - (xCount * yCount - numberOfChildren);\n const widthOnLastRow = parentWidth / itemsOnLastRow - itemSpacing + itemSpacing / itemsOnLastRow;\n\n return {\n width: parentWidth / xCount - itemSpacing + itemSpacing / xCount,\n height: parentHeight / yCount - itemSpacing + itemSpacing / yCount,\n widthOnLastRow,\n xCount,\n yCount,\n };\n};\n\nfunction calculateSizeOfChild(parentWidth: number, parentHeight: number, numberOfChildren: number): number {\n const parts = Math.ceil(Math.sqrt((numberOfChildren * parentWidth) / parentHeight));\n\n if (Math.floor((parts * parentHeight) / parentWidth) * parts < numberOfChildren) {\n return parentHeight / Math.ceil((parts * parentHeight) / parentWidth);\n }\n\n return parentWidth / parts;\n}\n","import React, { PureComponent, CSSProperties } from 'react';\n\nimport { VizOrientation } from '@grafana/data';\n\nimport { calculateGridDimensions } from '../../utils/squares';\n\ninterface Props<V, D> {\n /**\n * Optionally precalculate dimensions to support consistent behavior between repeated\n * values. Two typical patterns are:\n * 1) Calculate raw values like font size etc and pass them to each vis\n * 2) find the maximum input values and pass that to the vis\n */\n getAlignmentFactors?: (values: V[], width: number, height: number) => D;\n\n /**\n * Render a single value\n */\n renderValue: (props: VizRepeaterRenderValueProps<V, D>) => JSX.Element;\n height: number;\n width: number;\n source: any; // If this changes, new values will be requested\n getValues: () => V[];\n renderCounter: number; // force update of values & render\n orientation: VizOrientation;\n itemSpacing?: number;\n /** When orientation is set to auto layout items in a grid */\n autoGrid?: boolean;\n minVizWidth?: number;\n minVizHeight?: number;\n}\n\nexport interface VizRepeaterRenderValueProps<V, D = {}> {\n value: V;\n width: number;\n height: number;\n orientation: VizOrientation;\n alignmentFactors: D;\n /**\n * Total number of values being shown in repeater\n */\n count: number;\n}\n\ninterface DefaultProps {\n itemSpacing: number;\n}\n\ntype PropsWithDefaults<V, D> = Props<V, D> & DefaultProps;\n\ninterface State<V> {\n values: V[];\n}\n\nexport class VizRepeater<V, D = {}> extends PureComponent<Props<V, D>, State<V>> {\n static defaultProps: DefaultProps = {\n itemSpacing: 8,\n };\n\n constructor(props: Props<V, D>) {\n super(props);\n\n this.state = {\n values: props.getValues(),\n };\n }\n\n componentDidUpdate(prevProps: Props<V, D>) {\n const { renderCounter, source } = this.props;\n if (renderCounter !== prevProps.renderCounter || source !== prevProps.source) {\n this.setState({ values: this.props.getValues() });\n }\n }\n\n getOrientation(): VizOrientation {\n const { orientation, width, height } = this.props;\n\n if (orientation === VizOrientation.Auto) {\n if (width > height) {\n return VizOrientation.Vertical;\n } else {\n return VizOrientation.Horizontal;\n }\n }\n\n return orientation;\n }\n\n renderGrid() {\n const { renderValue, height, width, itemSpacing, getAlignmentFactors, orientation } = this\n .props as PropsWithDefaults<V, D>;\n\n const { values } = this.state;\n const grid = calculateGridDimensions(width, height, itemSpacing, values.length);\n const alignmentFactors = getAlignmentFactors ? getAlignmentFactors(values, grid.width, grid.height) : ({} as D);\n\n let xGrid = 0;\n let yGrid = 0;\n let items: JSX.Element[] = [];\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i];\n const isLastRow = yGrid === grid.yCount - 1;\n\n const itemWidth = isLastRow ? grid.widthOnLastRow : grid.width;\n const itemHeight = grid.height;\n\n const xPos = xGrid * itemWidth + itemSpacing * xGrid;\n const yPos = yGrid * itemHeight + itemSpacing * yGrid;\n\n const itemStyles: CSSProperties = {\n position: 'absolute',\n left: xPos,\n top: yPos,\n width: `${itemWidth}px`,\n height: `${itemHeight}px`,\n };\n\n items.push(\n <div key={i} style={itemStyles}>\n {renderValue({\n value,\n width: itemWidth,\n height: itemHeight,\n alignmentFactors,\n orientation,\n count: values.length,\n })}\n </div>\n );\n\n xGrid++;\n\n if (xGrid === grid.xCount) {\n xGrid = 0;\n yGrid++;\n }\n }\n\n return <div style={{ position: 'relative' }}>{items}</div>;\n }\n\n render() {\n const {\n renderValue,\n height,\n width,\n itemSpacing,\n getAlignmentFactors,\n autoGrid,\n orientation,\n minVizWidth,\n minVizHeight,\n } = this.props as PropsWithDefaults<V, D>;\n const { values } = this.state;\n\n if (autoGrid && orientation === VizOrientation.Auto) {\n return this.renderGrid();\n }\n\n const itemStyles: React.CSSProperties = {\n display: 'flex',\n };\n\n const repeaterStyle: React.CSSProperties = {\n display: 'flex',\n overflow: `${minVizWidth ? 'auto' : 'hidden'} ${minVizHeight ? 'auto' : 'hidden'}`,\n };\n\n let vizHeight = height;\n let vizWidth = width;\n\n let resolvedOrientation = this.getOrientation();\n\n switch (resolvedOrientation) {\n case VizOrientation.Horizontal:\n repeaterStyle.flexDirection = 'column';\n repeaterStyle.height = `${height}px`;\n itemStyles.marginBottom = `${itemSpacing}px`;\n vizWidth = width;\n vizHeight = Math.max(height / values.length - itemSpacing + itemSpacing / values.length, minVizHeight ?? 0);\n break;\n case VizOrientation.Vertical:\n repeaterStyle.flexDirection = 'row';\n repeaterStyle.justifyContent = 'space-between';\n itemStyles.marginRight = `${itemSpacing}px`;\n vizHeight = height;\n vizWidth = Math.max(width / values.length - itemSpacing + itemSpacing / values.length, minVizWidth ?? 0);\n }\n\n itemStyles.width = `${vizWidth}px`;\n itemStyles.height = `${vizHeight}px`;\n\n const alignmentFactors = getAlignmentFactors ? getAlignmentFactors(values, vizWidth, vizHeight) : ({} as D);\n\n return (\n <div style={repeaterStyle}>\n {values.map((value, index) => {\n return (\n <div key={index} style={getItemStylesForIndex(itemStyles, index, values.length)}>\n {renderValue({\n value,\n width: vizWidth,\n height: vizHeight,\n alignmentFactors,\n orientation: resolvedOrientation,\n count: values.length,\n })}\n </div>\n );\n })}\n </div>\n );\n }\n}\n\n/*\n * Removes any padding on the last item\n */\nfunction getItemStylesForIndex(itemStyles: CSSProperties, index: number, length: number): CSSProperties {\n if (index === length - 1) {\n return {\n ...itemStyles,\n marginRight: 0,\n marginBottom: 0,\n };\n }\n return itemStyles;\n}\n","import { difference, isEqual } from 'lodash';\nimport React from 'react';\n\nimport { GraphSeriesXY } from '@grafana/data';\n\nexport interface GraphSeriesTogglerAPI {\n onSeriesToggle: (label: string, event: React.MouseEvent<HTMLElement>) => void;\n toggledSeries: GraphSeriesXY[];\n}\n\nexport interface GraphSeriesTogglerProps {\n children: (api: GraphSeriesTogglerAPI) => JSX.Element;\n series: GraphSeriesXY[];\n onHiddenSeriesChanged?: (hiddenSeries: string[]) => void;\n}\n\nexport interface GraphSeriesTogglerState {\n hiddenSeries: string[];\n toggledSeries: GraphSeriesXY[];\n}\n\nexport class GraphSeriesToggler extends React.Component<GraphSeriesTogglerProps, GraphSeriesTogglerState> {\n constructor(props: GraphSeriesTogglerProps) {\n super(props);\n\n this.onSeriesToggle = this.onSeriesToggle.bind(this);\n\n this.state = {\n hiddenSeries: [],\n toggledSeries: props.series,\n };\n }\n\n componentDidUpdate(prevProps: Readonly<GraphSeriesTogglerProps>) {\n const { series } = this.props;\n if (!isEqual(prevProps.series, series)) {\n this.setState({ hiddenSeries: [], toggledSeries: series });\n }\n }\n\n onSeriesToggle(label: string, event: React.MouseEvent<HTMLElement>) {\n const { series, onHiddenSeriesChanged } = this.props;\n const { hiddenSeries } = this.state;\n\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n // Toggling series with key makes the series itself to toggle\n const newHiddenSeries =\n hiddenSeries.indexOf(label) > -1\n ? hiddenSeries.filter((series) => series !== label)\n : hiddenSeries.concat([label]);\n\n const toggledSeries = series.map((series) => ({\n ...series,\n isVisible: newHiddenSeries.indexOf(series.label) === -1,\n }));\n this.setState({ hiddenSeries: newHiddenSeries, toggledSeries }, () =>\n onHiddenSeriesChanged ? onHiddenSeriesChanged(newHiddenSeries) : undefined\n );\n return;\n }\n\n // Toggling series with out key toggles all the series but the clicked one\n const allSeriesLabels = series.map((series) => series.label);\n const newHiddenSeries =\n hiddenSeries.length + 1 === allSeriesLabels.length ? [] : difference(allSeriesLabels, [label]);\n const toggledSeries = series.map((series) => ({\n ...series,\n isVisible: newHiddenSeries.indexOf(series.label) === -1,\n }));\n\n this.setState({ hiddenSeries: newHiddenSeries, toggledSeries }, () =>\n onHiddenSeriesChanged ? onHiddenSeriesChanged(newHiddenSeries) : undefined\n );\n }\n\n render() {\n const { children } = this.props;\n const { toggledSeries } = this.state;\n\n return children({\n onSeriesToggle: this.onSeriesToggle,\n toggledSeries,\n });\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FunctionComponent, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n collapse: css`\n label: collapse;\n margin-bottom: ${theme.spacing(1)};\n `,\n collapseBody: css`\n label: collapse__body;\n padding: ${theme.spacing(theme.components.panel.padding)};\n padding-top: 0;\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n `,\n bodyContentWrapper: css`\n label: bodyContentWrapper;\n flex: 1;\n overflow: hidden;\n `,\n loader: css`\n label: collapse__loader;\n height: 2px;\n position: relative;\n overflow: hidden;\n background: none;\n margin: ${theme.spacing(0.5)};\n `,\n loaderActive: css`\n label: collapse__loader_active;\n &:after {\n content: ' ';\n display: block;\n width: 25%;\n top: 0;\n top: -50%;\n height: 250%;\n position: absolute;\n animation: loader 2s cubic-bezier(0.17, 0.67, 0.83, 0.67) 500ms;\n animation-iteration-count: 100;\n left: -25%;\n background: ${theme.colors.primary.main};\n }\n @keyframes loader {\n from {\n left: -25%;\n opacity: 0.1;\n }\n to {\n left: 100%;\n opacity: 1;\n }\n }\n `,\n header: css`\n label: collapse__header;\n padding: ${theme.spacing(1, 2, 1, 2)};\n display: flex;\n cursor: inherit;\n transition: all 0.1s linear;\n cursor: pointer;\n `,\n headerCollapsed: css`\n label: collapse__header--collapsed;\n padding: ${theme.spacing(1, 2, 1, 2)};\n `,\n headerLabel: css`\n label: collapse__header-label;\n font-weight: ${theme.typography.fontWeightMedium};\n margin-right: ${theme.spacing(1)};\n font-size: ${theme.typography.size.md};\n `,\n icon: css`\n label: collapse__icon;\n margin: ${theme.spacing(0, 1, 0, -1)};\n `,\n});\n\nexport interface Props {\n /** Expand or collapse te content */\n isOpen?: boolean;\n /** Element or text for the Collapse header */\n label: React.ReactNode;\n /** Indicates loading state of the content */\n loading?: boolean;\n /** Toggle collapsed header icon */\n collapsible?: boolean;\n /** Callback for the toggle functionality */\n onToggle?: (isOpen: boolean) => void;\n /** Additional class name for the root element */\n className?: string;\n}\n\nexport const ControlledCollapse: FunctionComponent<Props> = ({ isOpen, onToggle, ...otherProps }) => {\n const [open, setOpen] = useState(isOpen);\n return (\n <Collapse\n isOpen={open}\n collapsible\n {...otherProps}\n onToggle={() => {\n setOpen(!open);\n if (onToggle) {\n onToggle(!open);\n }\n }}\n />\n );\n};\n\nexport const Collapse: FunctionComponent<Props> = ({\n isOpen,\n label,\n loading,\n collapsible,\n onToggle,\n className,\n children,\n}) => {\n const style = useStyles2(getStyles);\n const onClickToggle = () => {\n if (onToggle) {\n onToggle(!isOpen);\n }\n };\n\n const panelClass = cx([style.collapse, 'panel-container', className]);\n const loaderClass = loading ? cx([style.loader, style.loaderActive]) : cx([style.loader]);\n const headerClass = collapsible ? cx([style.header]) : cx([style.headerCollapsed]);\n\n return (\n <div className={panelClass}>\n <div className={headerClass} onClick={onClickToggle}>\n {collapsible && <Icon className={style.icon} name={isOpen ? 'angle-down' : 'angle-right'} />}\n <div className={cx([style.headerLabel])}>{label}</div>\n </div>\n {isOpen && (\n <div className={cx([style.collapseBody])}>\n <div className={loaderClass} />\n <div className={style.bodyContentWrapper}>{children}</div>\n </div>\n )}\n </div>\n );\n};\n\nCollapse.displayName = 'Collapse';\n","import { css, cx } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport React, { FC, ReactNode, useRef, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { Icon, Spinner } from '..';\nimport { useStyles2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\n\nexport interface Props {\n label: ReactNode;\n isOpen: boolean;\n /** Callback for the toggle functionality */\n onToggle?: (isOpen: boolean) => void;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n loading?: boolean;\n labelId?: string;\n}\n\nexport const CollapsableSection: FC<Props> = ({\n label,\n isOpen,\n onToggle,\n className,\n contentClassName,\n children,\n labelId,\n loading = false,\n}) => {\n const [open, toggleOpen] = useState<boolean>(isOpen);\n const styles = useStyles2(collapsableSectionStyles);\n\n const onClick = (e: React.MouseEvent) => {\n if (e.target instanceof HTMLElement && e.target.tagName === 'A') {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n onToggle?.(!open);\n toggleOpen(!open);\n };\n const { current: id } = useRef(uniqueId());\n\n const buttonLabelId = labelId ?? `collapse-label-${id}`;\n\n return (\n <>\n <div onClick={onClick} className={cx(styles.header, className)}>\n <button\n id={`collapse-button-${id}`}\n className={styles.button}\n onClick={onClick}\n aria-expanded={open && !loading}\n aria-controls={`collapse-content-${id}`}\n aria-labelledby={buttonLabelId}\n >\n {loading ? (\n <Spinner className={styles.spinner} />\n ) : (\n <Icon name={open ? 'angle-up' : 'angle-down'} className={styles.icon} />\n )}\n </button>\n <div className={styles.label} id={`collapse-label-${id}`}>\n {label}\n </div>\n </div>\n {open && (\n <div id={`collapse-content-${id}`} className={cx(styles.content, contentClassName)}>\n {children}\n </div>\n )}\n </>\n );\n};\n\nconst collapsableSectionStyles = (theme: GrafanaTheme2) => ({\n header: css({\n display: 'flex',\n cursor: 'pointer',\n boxSizing: 'border-box',\n flexDirection: 'row-reverse',\n position: 'relative',\n justifyContent: 'space-between',\n fontSize: theme.typography.size.lg,\n padding: `${theme.spacing(0.5)} 0`,\n '&:focus-within': getFocusStyles(theme),\n }),\n button: css({\n all: 'unset',\n '&:focus-visible': {\n outline: 'none',\n outlineOffset: 'unset',\n transition: 'none',\n boxShadow: 'none',\n },\n }),\n icon: css({\n color: theme.colors.text.secondary,\n }),\n content: css({\n padding: `${theme.spacing(2)} 0`,\n }),\n spinner: css({\n display: 'flex',\n alignItems: 'center',\n width: theme.v1.spacing.md,\n }),\n label: css({\n display: 'flex',\n }),\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FunctionComponent } from 'react';\n\nimport { GrafanaTheme, Labels } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\nimport { withTheme } from '../../themes/ThemeContext';\nimport { Themeable } from '../../types/theme';\n\n// Levels are already encoded in color, filename is a Loki-ism\nconst HIDDEN_LABELS = ['level', 'lvl', 'filename'];\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n logsLabels: css`\n display: flex;\n flex-wrap: wrap;\n font-size: ${theme.typography.size.xs};\n `,\n logsLabel: css`\n label: logs-label;\n display: flex;\n padding: 0 2px;\n background-color: ${theme.colors.bg2};\n border-radius: ${theme.border.radius};\n margin: 1px 4px 0 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n `,\n logsLabelValue: css`\n label: logs-label__value;\n display: inline-block;\n max-width: 20em;\n text-overflow: ellipsis;\n overflow: hidden;\n `,\n };\n});\n\ninterface Props extends Themeable {\n labels: Labels;\n}\n\nexport const UnThemedLogLabels: FunctionComponent<Props> = ({ labels, theme }) => {\n const styles = getStyles(theme);\n const displayLabels = Object.keys(labels).filter((label) => !label.startsWith('_') && !HIDDEN_LABELS.includes(label));\n\n if (displayLabels.length === 0) {\n return (\n <span className={cx([styles.logsLabels])}>\n <span className={cx([styles.logsLabel])}>(no unique labels)</span>\n </span>\n );\n }\n\n return (\n <span className={cx([styles.logsLabels])}>\n {displayLabels.sort().map((label) => {\n const value = labels[label];\n if (!value) {\n return;\n }\n const tooltip = `${label}: ${value}`;\n return (\n <span key={label} className={cx([styles.logsLabel])}>\n <span className={cx([styles.logsLabelValue])} title={tooltip}>\n {value}\n </span>\n </span>\n );\n })}\n </span>\n );\n};\n\nexport const LogLabels = withTheme(UnThemedLogLabels);\nLogLabels.displayName = 'LogLabels';\n","import React from 'react';\n\nimport { Field, LinkModel } from '@grafana/data';\n\nimport { ButtonProps, Button } from '../Button';\n\ntype DataLinkButtonProps = {\n link: LinkModel<Field>;\n buttonProps?: ButtonProps;\n};\n\n/**\n * @internal\n */\nexport function DataLinkButton({ link, buttonProps }: DataLinkButtonProps) {\n return (\n <a\n href={link.href}\n target={link.target}\n rel=\"noreferrer\"\n onClick={\n link.onClick\n ? (event) => {\n if (!(event.ctrlKey || event.metaKey || event.shiftKey) && link.onClick) {\n event.preventDefault();\n link.onClick(event);\n }\n }\n : undefined\n }\n >\n <Button icon=\"external-link-alt\" variant=\"primary\" size=\"sm\" {...buttonProps}>\n {link.title}\n </Button>\n </a>\n );\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FunctionComponent } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useStyles } from '../../themes/ThemeContext';\n\nconst getStyles = (theme: GrafanaTheme) => ({\n logsStatsRow: css`\n label: logs-stats-row;\n margin: ${parseInt(theme.spacing.d, 10) / 1.75}px 0;\n `,\n logsStatsRowActive: css`\n label: logs-stats-row--active;\n color: ${theme.colors.textBlue};\n position: relative;\n `,\n logsStatsRowLabel: css`\n label: logs-stats-row__label;\n display: flex;\n margin-bottom: 1px;\n `,\n logsStatsRowValue: css`\n label: logs-stats-row__value;\n flex: 1;\n text-overflow: ellipsis;\n overflow: hidden;\n `,\n logsStatsRowCount: css`\n label: logs-stats-row__count;\n text-align: right;\n margin-left: 0.5em;\n `,\n logsStatsRowPercent: css`\n label: logs-stats-row__percent;\n text-align: right;\n margin-left: 0.5em;\n width: 3em;\n `,\n logsStatsRowBar: css`\n label: logs-stats-row__bar;\n height: 4px;\n overflow: hidden;\n background: ${theme.colors.textFaint};\n `,\n logsStatsRowInnerBar: css`\n label: logs-stats-row__innerbar;\n height: 4px;\n overflow: hidden;\n background: ${theme.colors.bgBlue1};\n `,\n});\n\nexport interface Props {\n active?: boolean;\n count: number;\n proportion: number;\n value?: string;\n}\n\nexport const LogLabelStatsRow: FunctionComponent<Props> = ({ active, count, proportion, value }) => {\n const style = useStyles(getStyles);\n const percent = `${Math.round(proportion * 100)}%`;\n const barStyle = { width: percent };\n const className = active ? cx([style.logsStatsRow, style.logsStatsRowActive]) : cx([style.logsStatsRow]);\n\n return (\n <div className={className}>\n <div className={cx([style.logsStatsRowLabel])}>\n <div className={cx([style.logsStatsRowValue])} title={value}>\n {value}\n </div>\n <div className={cx([style.logsStatsRowCount])}>{count}</div>\n <div className={cx([style.logsStatsRowPercent])}>{percent}</div>\n </div>\n <div className={cx([style.logsStatsRowBar])}>\n <div className={cx([style.logsStatsRowInnerBar])} style={barStyle} />\n </div>\n </div>\n );\n};\n\nLogLabelStatsRow.displayName = 'LogLabelStatsRow';\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { LogLabelStatsModel, GrafanaTheme } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\nimport { withTheme } from '../../themes/index';\nimport { Themeable } from '../../types/theme';\n\n//Components\nimport { LogLabelStatsRow } from './LogLabelStatsRow';\n\nconst STATS_ROW_LIMIT = 5;\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n logsStats: css`\n label: logs-stats;\n background: inherit;\n color: ${theme.colors.text};\n word-break: break-all;\n width: fit-content;\n max-width: 100%;\n `,\n logsStatsHeader: css`\n label: logs-stats__header;\n border-bottom: 1px solid ${theme.colors.border2};\n display: flex;\n `,\n logsStatsTitle: css`\n label: logs-stats__title;\n font-weight: ${theme.typography.weight.semibold};\n padding-right: ${theme.spacing.d};\n display: inline-block;\n white-space: nowrap;\n text-overflow: ellipsis;\n flex-grow: 1;\n `,\n logsStatsClose: css`\n label: logs-stats__close;\n cursor: pointer;\n `,\n logsStatsBody: css`\n label: logs-stats__body;\n padding: 5px 0;\n `,\n };\n});\n\ninterface Props extends Themeable {\n stats: LogLabelStatsModel[];\n label: string;\n value: string;\n rowCount: number;\n isLabel?: boolean;\n}\n\nclass UnThemedLogLabelStats extends PureComponent<Props> {\n render() {\n const { label, rowCount, stats, value, theme, isLabel } = this.props;\n const style = getStyles(theme);\n const topRows = stats.slice(0, STATS_ROW_LIMIT);\n let activeRow = topRows.find((row) => row.value === value);\n let otherRows = stats.slice(STATS_ROW_LIMIT);\n const insertActiveRow = !activeRow;\n\n // Remove active row from other to show extra\n if (insertActiveRow) {\n activeRow = otherRows.find((row) => row.value === value);\n otherRows = otherRows.filter((row) => row.value !== value);\n }\n\n const otherCount = otherRows.reduce((sum, row) => sum + row.count, 0);\n const topCount = topRows.reduce((sum, row) => sum + row.count, 0);\n const total = topCount + otherCount;\n const otherProportion = otherCount / total;\n\n return (\n <div className={style.logsStats} data-testid=\"logLabelStats\">\n <div className={style.logsStatsHeader}>\n <div className={style.logsStatsTitle}>\n {label}: {total} of {rowCount} rows have that {isLabel ? 'label' : 'field'}\n </div>\n </div>\n <div className={style.logsStatsBody}>\n {topRows.map((stat) => (\n <LogLabelStatsRow key={stat.value} {...stat} active={stat.value === value} />\n ))}\n {insertActiveRow && activeRow && <LogLabelStatsRow key={activeRow.value} {...activeRow} active />}\n {otherCount > 0 && (\n <LogLabelStatsRow key=\"__OTHERS__\" count={otherCount} value=\"Other\" proportion={otherProportion} />\n )}\n </div>\n </div>\n );\n }\n}\n\nexport const LogLabelStats = withTheme(UnThemedLogLabelStats);\nLogLabelStats.displayName = 'LogLabelStats';\n","import { css, cx } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { Field, LinkModel, LogLabelStatsModel, GrafanaTheme2 } from '@grafana/data';\n\nimport { withTheme2 } from '../../themes/index';\nimport { Themeable2 } from '../../types/theme';\nimport { ClipboardButton } from '../ClipboardButton/ClipboardButton';\nimport { DataLinkButton } from '../DataLinks/DataLinkButton';\nimport { IconButton } from '../IconButton/IconButton';\n\nimport { LogLabelStats } from './LogLabelStats';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\n\nexport interface Props extends Themeable2 {\n parsedValue: string;\n parsedKey: string;\n wrapLogMessage?: boolean;\n isLabel?: boolean;\n onClickFilterLabel?: (key: string, value: string) => void;\n onClickFilterOutLabel?: (key: string, value: string) => void;\n links?: Array<LinkModel<Field>>;\n getStats: () => LogLabelStatsModel[] | null;\n showDetectedFields?: string[];\n onClickShowDetectedField?: (key: string) => void;\n onClickHideDetectedField?: (key: string) => void;\n}\n\ninterface State {\n showFieldsStats: boolean;\n fieldCount: number;\n fieldStats: LogLabelStatsModel[] | null;\n mouseOver: boolean;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n noHoverBackground: css`\n label: noHoverBackground;\n :hover {\n background-color: transparent;\n }\n `,\n hoverCursor: css`\n label: hoverCursor;\n cursor: pointer;\n `,\n wordBreakAll: css`\n label: wordBreakAll;\n word-break: break-all;\n `,\n showingField: css`\n color: ${theme.colors.primary.text};\n `,\n hoverValueCopy: css`\n margin: ${theme.spacing(0, 0, 0, 1.2)};\n position: absolute;\n top: 0px;\n justify-content: center;\n border-radius: 20px;\n width: 26px;\n height: 26px;\n `,\n wrapLine: css`\n label: wrapLine;\n white-space: pre-wrap;\n `,\n };\n};\nclass UnThemedLogDetailsRow extends PureComponent<Props, State> {\n state: State = {\n showFieldsStats: false,\n fieldCount: 0,\n fieldStats: null,\n mouseOver: false,\n };\n\n showField = () => {\n const { onClickShowDetectedField, parsedKey } = this.props;\n if (onClickShowDetectedField) {\n onClickShowDetectedField(parsedKey);\n }\n };\n\n hideField = () => {\n const { onClickHideDetectedField, parsedKey } = this.props;\n if (onClickHideDetectedField) {\n onClickHideDetectedField(parsedKey);\n }\n };\n\n filterLabel = () => {\n const { onClickFilterLabel, parsedKey, parsedValue } = this.props;\n if (onClickFilterLabel) {\n onClickFilterLabel(parsedKey, parsedValue);\n }\n };\n\n filterOutLabel = () => {\n const { onClickFilterOutLabel, parsedKey, parsedValue } = this.props;\n if (onClickFilterOutLabel) {\n onClickFilterOutLabel(parsedKey, parsedValue);\n }\n };\n\n showStats = () => {\n const { showFieldsStats } = this.state;\n if (!showFieldsStats) {\n const fieldStats = this.props.getStats();\n const fieldCount = fieldStats ? fieldStats.reduce((sum, stat) => sum + stat.count, 0) : 0;\n this.setState({ fieldStats, fieldCount });\n }\n this.toggleFieldsStats();\n };\n\n toggleFieldsStats() {\n this.setState((state) => {\n return {\n showFieldsStats: !state.showFieldsStats,\n };\n });\n }\n\n hoverValueCopy() {\n const mouseOver = !this.state.mouseOver;\n this.setState({ mouseOver });\n }\n\n render() {\n const {\n theme,\n parsedKey,\n parsedValue,\n isLabel,\n links,\n showDetectedFields,\n wrapLogMessage,\n onClickShowDetectedField,\n onClickHideDetectedField,\n onClickFilterLabel,\n onClickFilterOutLabel,\n } = this.props;\n const { showFieldsStats, fieldStats, fieldCount, mouseOver } = this.state;\n const styles = getStyles(theme);\n const style = getLogRowStyles(theme);\n\n const hasDetectedFieldsFunctionality = onClickShowDetectedField && onClickHideDetectedField;\n const hasFilteringFunctionality = onClickFilterLabel && onClickFilterOutLabel;\n\n const toggleFieldButton =\n !isLabel && showDetectedFields && showDetectedFields.includes(parsedKey) ? (\n <IconButton name=\"eye\" className={styles.showingField} title=\"Hide this field\" onClick={this.hideField} />\n ) : (\n <IconButton name=\"eye\" title=\"Show this field instead of the message\" onClick={this.showField} />\n );\n\n return (\n <tr className={cx(style.logDetailsValue, { [styles.noHoverBackground]: showFieldsStats })}>\n {/* Action buttons - show stats/filter results */}\n <td className={style.logsDetailsIcon}>\n <IconButton name=\"signal\" title={'Ad-hoc statistics'} onClick={this.showStats} />\n </td>\n\n {hasFilteringFunctionality && isLabel && (\n <>\n <td className={style.logsDetailsIcon}>\n <IconButton name=\"search-plus\" title=\"Filter for value\" onClick={this.filterLabel} />\n </td>\n <td className={style.logsDetailsIcon}>\n <IconButton name=\"search-minus\" title=\"Filter out value\" onClick={this.filterOutLabel} />\n </td>\n </>\n )}\n\n {hasDetectedFieldsFunctionality && !isLabel && (\n <td className={style.logsDetailsIcon} colSpan={2}>\n {toggleFieldButton}\n </td>\n )}\n\n {/* Key - value columns */}\n <td className={style.logDetailsLabel}>{parsedKey}</td>\n <td\n className={cx(styles.wordBreakAll, wrapLogMessage && styles.wrapLine)}\n onMouseEnter={this.hoverValueCopy.bind(this)}\n onMouseLeave={this.hoverValueCopy.bind(this)}\n >\n {parsedValue}\n {mouseOver && (\n <ClipboardButton\n getText={() => parsedValue}\n title=\"Copy value to clipboard\"\n fill=\"text\"\n variant=\"secondary\"\n icon=\"copy\"\n size=\"sm\"\n className={styles.hoverValueCopy}\n />\n )}\n {links?.map((link) => (\n <span key={link.title}>\n \n <DataLinkButton link={link} />\n </span>\n ))}\n {showFieldsStats && (\n <LogLabelStats\n stats={fieldStats!}\n label={parsedKey}\n value={parsedValue}\n rowCount={fieldCount}\n isLabel={isLabel}\n />\n )}\n </td>\n </tr>\n );\n }\n}\n\nexport const LogDetailsRow = withTheme2(UnThemedLogDetailsRow);\nLogDetailsRow.displayName = 'LogDetailsRow';\n","import memoizeOne from 'memoize-one';\n\nimport { Field, FieldType, getParser, LinkModel, LogRowModel } from '@grafana/data';\n\nimport { MAX_CHARACTERS } from './LogRowMessage';\n\nconst memoizedGetParser = memoizeOne(getParser);\n\ntype FieldDef = {\n key: string;\n value: string;\n links?: Array<LinkModel<Field>>;\n fieldIndex?: number;\n};\n\n/**\n * Returns all fields for log row which consists of fields we parse from the message itself and any derived fields\n * setup in data source config.\n */\nexport const getAllFields = memoizeOne(\n (row: LogRowModel, getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>) => {\n const fields = parseMessage(row.entry);\n const derivedFields = getDerivedFields(row, getFieldLinks);\n const fieldsMap = [...derivedFields, ...fields].reduce((acc, field) => {\n // Strip enclosing quotes for hashing. When values are parsed from log line the quotes are kept, but if same\n // value is in the dataFrame it will be without the quotes. We treat them here as the same value.\n const value = field.value.replace(/(^\")|(\"$)/g, '');\n const fieldHash = `${field.key}=${value}`;\n if (acc[fieldHash]) {\n acc[fieldHash].links = [...(acc[fieldHash].links || []), ...(field.links || [])];\n } else {\n acc[fieldHash] = field;\n }\n return acc;\n }, {} as { [key: string]: FieldDef });\n\n const allFields = Object.values(fieldsMap);\n allFields.sort(sortFieldsLinkFirst);\n\n return allFields;\n }\n);\n\nconst parseMessage = memoizeOne((rowEntry): FieldDef[] => {\n if (rowEntry.length > MAX_CHARACTERS) {\n return [];\n }\n const parser = memoizedGetParser(rowEntry);\n if (!parser) {\n return [];\n }\n // Use parser to highlight detected fields\n const detectedFields = parser.getFields(rowEntry);\n const fields = detectedFields.map((field) => {\n const key = parser.getLabelFromField(field);\n const value = parser.getValueFromField(field);\n return { key, value };\n });\n\n return fields;\n});\n\nconst getDerivedFields = memoizeOne(\n (row: LogRowModel, getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>): FieldDef[] => {\n return row.dataFrame.fields\n .map((field, index) => ({ ...field, index }))\n .filter((field, index) => !shouldRemoveField(field, index, row))\n .map((field) => {\n const links = getFieldLinks ? getFieldLinks(field, row.rowIndex) : [];\n return {\n key: field.name,\n value: field.values.get(row.rowIndex).toString(),\n links: links,\n fieldIndex: field.index,\n };\n });\n }\n);\n\nfunction sortFieldsLinkFirst(fieldA: FieldDef, fieldB: FieldDef) {\n if (fieldA.links?.length && !fieldB.links?.length) {\n return -1;\n }\n if (!fieldA.links?.length && fieldB.links?.length) {\n return 1;\n }\n return fieldA.key > fieldB.key ? 1 : fieldA.key < fieldB.key ? -1 : 0;\n}\n\nfunction shouldRemoveField(field: Field, index: number, row: LogRowModel) {\n // Remove field if it is:\n // \"labels\" field that is in Loki used to store all labels\n if (field.name === 'labels' && field.type === FieldType.other) {\n return true;\n }\n // \"id\" field which we use for react key\n if (field.name === 'id') {\n return true;\n }\n // entry field which we are showing as the log message\n if (row.entryFieldIndex === index) {\n return true;\n }\n // hidden field\n if (field.config.custom?.hidden) {\n return true;\n }\n // field that has empty value (we want to keep 0 or empty string)\n if (field.values.get(row.rowIndex) == null) {\n return true;\n }\n return false;\n}\n","import { css, cx } from '@emotion/css';\nimport memoizeOne from 'memoize-one';\nimport React, { PureComponent } from 'react';\n\nimport {\n calculateFieldStats,\n calculateLogsLabelStats,\n calculateStats,\n Field,\n getParser,\n LinkModel,\n LogRowModel,\n GrafanaTheme2,\n} from '@grafana/data';\n\nimport { withTheme2 } from '../../themes/index';\nimport { Themeable2 } from '../../types/theme';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nimport { LogDetailsRow } from './LogDetailsRow';\nimport { getLogRowStyles } from './getLogRowStyles';\nimport { getAllFields } from './logParser';\n\n//Components\n\nexport interface Props extends Themeable2 {\n row: LogRowModel;\n showDuplicates: boolean;\n getRows: () => LogRowModel[];\n wrapLogMessage: boolean;\n className?: string;\n hasError?: boolean;\n\n onClickFilterLabel?: (key: string, value: string) => void;\n onClickFilterOutLabel?: (key: string, value: string) => void;\n getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n showDetectedFields?: string[];\n onClickShowDetectedField?: (key: string) => void;\n onClickHideDetectedField?: (key: string) => void;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n logsRowLevelDetails: css`\n label: logs-row__level_details;\n &::after {\n top: -3px;\n }\n `,\n logDetails: css`\n label: logDetailsDefaultCursor;\n cursor: default;\n\n &:hover {\n background-color: ${theme.colors.background.primary};\n }\n `,\n };\n};\n\nclass UnThemedLogDetails extends PureComponent<Props> {\n getParser = memoizeOne(getParser);\n\n getStatsForDetectedField = (key: string) => {\n const matcher = this.getParser(this.props.row.entry)!.buildMatcher(key);\n return calculateFieldStats(this.props.getRows(), matcher);\n };\n\n render() {\n const {\n row,\n theme,\n hasError,\n onClickFilterOutLabel,\n onClickFilterLabel,\n getRows,\n showDuplicates,\n className,\n onClickShowDetectedField,\n onClickHideDetectedField,\n showDetectedFields,\n getFieldLinks,\n wrapLogMessage,\n } = this.props;\n const style = getLogRowStyles(theme, row.logLevel);\n const styles = getStyles(theme);\n const labels = row.labels ? row.labels : {};\n const labelsAvailable = Object.keys(labels).length > 0;\n const fields = getAllFields(row, getFieldLinks);\n const detectedFieldsAvailable = fields && fields.length > 0;\n // If logs with error, we are not showing the level color\n const levelClassName = cx(!hasError && [style.logsRowLevel, styles.logsRowLevelDetails]);\n\n return (\n <tr className={cx(className, styles.logDetails)}>\n {showDuplicates && <td />}\n <td className={levelClassName} aria-label=\"Log level\" />\n <td colSpan={4}>\n <div className={style.logDetailsContainer}>\n <table className={style.logDetailsTable}>\n <tbody>\n {labelsAvailable && (\n <tr>\n <td colSpan={5} className={style.logDetailsHeading} aria-label=\"Log labels\">\n Log labels\n </td>\n </tr>\n )}\n {Object.keys(labels)\n .sort()\n .map((key) => {\n const value = labels[key];\n return (\n <LogDetailsRow\n key={`${key}=${value}`}\n parsedKey={key}\n parsedValue={value}\n isLabel={true}\n getStats={() => calculateLogsLabelStats(getRows(), key)}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickFilterLabel={onClickFilterLabel}\n />\n );\n })}\n\n {detectedFieldsAvailable && (\n <tr>\n <td colSpan={5} className={style.logDetailsHeading} aria-label=\"Detected fields\">\n Detected fields\n <Tooltip content=\"Fields that are parsed from log message and detected by Grafana.\">\n <Icon\n name=\"question-circle\"\n size=\"xs\"\n className={css`\n margin-left: 4px;\n `}\n />\n </Tooltip>\n </td>\n </tr>\n )}\n {fields.sort().map((field) => {\n const { key, value, links, fieldIndex } = field;\n return (\n <LogDetailsRow\n key={`${key}=${value}`}\n parsedKey={key}\n parsedValue={value}\n links={links}\n onClickShowDetectedField={onClickShowDetectedField}\n onClickHideDetectedField={onClickHideDetectedField}\n getStats={() =>\n fieldIndex === undefined\n ? this.getStatsForDetectedField(key)\n : calculateStats(row.dataFrame.fields[fieldIndex].values.toArray())\n }\n showDetectedFields={showDetectedFields}\n wrapLogMessage={wrapLogMessage}\n />\n );\n })}\n {!detectedFieldsAvailable && !labelsAvailable && (\n <tr>\n <td colSpan={5} aria-label=\"No details\">\n No details available\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n );\n }\n}\n\nexport const LogDetails = withTheme2(UnThemedLogDetails);\nLogDetails.displayName = 'LogDetails';\n","import React, { useState, useEffect } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\n\nimport {\n LogRowModel,\n toDataFrame,\n Field,\n FieldCache,\n LogsSortOrder,\n DataQueryResponse,\n DataQueryError,\n} from '@grafana/data';\n\nexport interface RowContextOptions {\n direction?: 'BACKWARD' | 'FORWARD';\n limit?: number;\n}\n\nexport interface LogRowContextRows {\n before?: string[];\n after?: string[];\n}\nexport interface LogRowContextQueryErrors {\n before?: string;\n after?: string;\n}\n\nexport interface HasMoreContextRows {\n before: boolean;\n after: boolean;\n}\n\ninterface ResultType {\n data: string[][];\n errors: string[];\n}\n\ninterface LogRowContextProviderProps {\n row: LogRowModel;\n logsSortOrder?: LogsSortOrder | null;\n getRowContext: (row: LogRowModel, options?: RowContextOptions) => Promise<DataQueryResponse>;\n children: (props: {\n result: LogRowContextRows;\n errors: LogRowContextQueryErrors;\n hasMoreContextRows: HasMoreContextRows;\n updateLimit: () => void;\n limit: number;\n }) => JSX.Element;\n}\n\nexport const getRowContexts = async (\n getRowContext: (row: LogRowModel, options?: RowContextOptions) => Promise<DataQueryResponse>,\n row: LogRowModel,\n limit: number,\n logsSortOrder?: LogsSortOrder | null\n) => {\n const promises = [\n getRowContext(row, {\n limit,\n }),\n getRowContext(row, {\n // The start time is inclusive so we will get the one row we are using as context entry\n limit: limit + 1,\n direction: 'FORWARD',\n }),\n ];\n\n const results: Array<DataQueryResponse | DataQueryError> = await Promise.all(promises.map((p) => p.catch((e) => e)));\n\n const data = results.map((result) => {\n const dataResult: DataQueryResponse = result as DataQueryResponse;\n if (!dataResult.data) {\n return [];\n }\n\n const data: any[] = [];\n for (let index = 0; index < dataResult.data.length; index++) {\n const dataFrame = toDataFrame(dataResult.data[index]);\n const fieldCache = new FieldCache(dataFrame);\n const timestampField: Field<string> = fieldCache.getFieldByName('ts')!;\n const idField: Field<string> | undefined = fieldCache.getFieldByName('id');\n\n for (let fieldIndex = 0; fieldIndex < timestampField.values.length; fieldIndex++) {\n // TODO: this filtering is datasource dependant so it will make sense to move it there so the API is\n // to return correct list of lines handling inclusive ranges or how to filter the correct line on the\n // datasource.\n\n // Filter out the row that is the one used as a focal point for the context as we will get it in one of the\n // requests.\n if (idField) {\n // For Loki this means we filter only the one row. Issue is we could have other rows logged at the same\n // ns which came before but they come in the response that search for logs after. This means right now\n // we will show those as if they came after. This is not strictly correct but seems better than losing them\n // and making this correct would mean quite a bit of complexity to shuffle things around and messing up\n //counts.\n if (idField.values.get(fieldIndex) === row.uid) {\n continue;\n }\n } else {\n // Fallback to timestamp. This should not happen right now as this feature is implemented only for loki\n // and that has ID. Later this branch could be used in other DS but mind that this could also filter out\n // logs which were logged in the same timestamp and that can be a problem depending on the precision.\n if (parseInt(timestampField.values.get(fieldIndex), 10) === row.timeEpochMs) {\n continue;\n }\n }\n\n const lineField: Field<string> = dataFrame.fields.filter((field) => field.name === 'line')[0];\n const line = lineField.values.get(fieldIndex); // assuming that both fields have same length\n\n data.push(line);\n }\n }\n\n return logsSortOrder === LogsSortOrder.Ascending ? data.reverse() : data;\n });\n\n const errors = results.map((result) => {\n const errorResult: DataQueryError = result as DataQueryError;\n if (!errorResult.message) {\n return '';\n }\n\n return errorResult.message;\n });\n\n return {\n data: logsSortOrder === LogsSortOrder.Ascending ? data.reverse() : data,\n errors: logsSortOrder === LogsSortOrder.Ascending ? errors.reverse() : errors,\n };\n};\n\nexport const LogRowContextProvider: React.FunctionComponent<LogRowContextProviderProps> = ({\n getRowContext,\n row,\n children,\n logsSortOrder,\n}) => {\n // React Hook that creates a number state value called limit to component state and a setter function called setLimit\n // The initial value for limit is 10\n // Used for the number of rows to retrieve from backend from a specific point in time\n const [limit, setLimit] = useState(10);\n\n // React Hook that creates an object state value called result to component state and a setter function called setResult\n // The initial value for result is null\n // Used for sorting the response from backend\n const [result, setResult] = useState<ResultType>(null as any as ResultType);\n\n // React Hook that creates an object state value called hasMoreContextRows to component state and a setter function called setHasMoreContextRows\n // The initial value for hasMoreContextRows is {before: true, after: true}\n // Used for indicating in UI if there are more rows to load in a given direction\n const [hasMoreContextRows, setHasMoreContextRows] = useState({\n before: true,\n after: true,\n });\n\n // React Hook that resolves two promises every time the limit prop changes\n // First promise fetches limit number of rows backwards in time from a specific point in time\n // Second promise fetches limit number of rows forwards in time from a specific point in time\n const { value } = useAsync(async () => {\n return await getRowContexts(getRowContext, row, limit, logsSortOrder); // Moved it to a separate function for debugging purposes\n }, [limit]);\n\n // React Hook that performs a side effect every time the value (from useAsync hook) prop changes\n // The side effect changes the result state with the response from the useAsync hook\n // The side effect changes the hasMoreContextRows state if there are more context rows before or after the current result\n useEffect(() => {\n if (value) {\n setResult((currentResult: any) => {\n let hasMoreLogsBefore = true,\n hasMoreLogsAfter = true;\n\n const currentResultBefore = currentResult?.data[0];\n const currentResultAfter = currentResult?.data[1];\n const valueBefore = value.data[0];\n const valueAfter = value.data[1];\n\n // checks if there are more log rows in a given direction\n // if after fetching additional rows the length of result is the same,\n // we can assume there are no logs in that direction within a given time range\n if (currentResult && (!valueBefore || currentResultBefore.length === valueBefore.length)) {\n hasMoreLogsBefore = false;\n }\n\n if (currentResult && (!valueAfter || currentResultAfter.length === valueAfter.length)) {\n hasMoreLogsAfter = false;\n }\n\n setHasMoreContextRows({\n before: hasMoreLogsBefore,\n after: hasMoreLogsAfter,\n });\n\n return value;\n });\n }\n }, [value]);\n\n return children({\n result: {\n before: result ? result.data[0] : [],\n after: result ? result.data[1] : [],\n },\n errors: {\n before: result ? result.errors[0] : undefined,\n after: result ? result.errors[1] : undefined,\n },\n hasMoreContextRows,\n updateLimit: () => setLimit(limit + 10),\n limit,\n });\n};\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { LogRowModel, Field, LinkModel } from '@grafana/data';\n\nimport { withTheme } from '../../themes/index';\nimport { Themeable } from '../../types/theme';\n\nimport { getAllFields } from './logParser';\n\nexport interface Props extends Themeable {\n row: LogRowModel;\n showDetectedFields: string[];\n wrapLogMessage: boolean;\n getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n}\n\nclass UnThemedLogRowMessageDetectedFields extends PureComponent<Props> {\n render() {\n const { row, showDetectedFields, getFieldLinks, wrapLogMessage } = this.props;\n const fields = getAllFields(row, getFieldLinks);\n const wrapClassName = wrapLogMessage\n ? ''\n : css`\n white-space: nowrap;\n `;\n\n const line = showDetectedFields\n .map((parsedKey) => {\n const field = fields.find((field) => {\n const { key } = field;\n return key === parsedKey;\n });\n\n if (field) {\n return `${parsedKey}=${field.value}`;\n }\n\n return null;\n })\n .filter((s) => s !== null)\n .join(' ');\n\n return <td className={wrapClassName}>{line}</td>;\n }\n}\n\nexport const LogRowMessageDetectedFields = withTheme(UnThemedLogRowMessageDetectedFields);\nLogRowMessageDetectedFields.displayName = 'LogRowMessageDetectedFields';\n","import { cx, css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport {\n Field,\n LinkModel,\n LogRowModel,\n LogsSortOrder,\n TimeZone,\n DataQueryResponse,\n dateTimeFormat,\n checkLogsError,\n escapeUnescapedString,\n GrafanaTheme2,\n} from '@grafana/data';\n\nimport { styleMixins, withTheme2 } from '../../themes/index';\nimport { Themeable2 } from '../../types/theme';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nimport { LogDetails } from './LogDetails';\nimport { LogLabels } from './LogLabels';\nimport {\n LogRowContextRows,\n LogRowContextQueryErrors,\n HasMoreContextRows,\n LogRowContextProvider,\n RowContextOptions,\n} from './LogRowContextProvider';\nimport { LogRowMessage } from './LogRowMessage';\nimport { LogRowMessageDetectedFields } from './LogRowMessageDetectedFields';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\n\ninterface Props extends Themeable2 {\n row: LogRowModel;\n showDuplicates: boolean;\n showLabels: boolean;\n showTime: boolean;\n wrapLogMessage: boolean;\n prettifyLogMessage: boolean;\n timeZone: TimeZone;\n enableLogDetails: boolean;\n logsSortOrder?: LogsSortOrder | null;\n forceEscape?: boolean;\n showDetectedFields?: string[];\n getRows: () => LogRowModel[];\n onClickFilterLabel?: (key: string, value: string) => void;\n onClickFilterOutLabel?: (key: string, value: string) => void;\n onContextClick?: () => void;\n getRowContext: (row: LogRowModel, options?: RowContextOptions) => Promise<DataQueryResponse>;\n getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n showContextToggle?: (row?: LogRowModel) => boolean;\n onClickShowDetectedField?: (key: string) => void;\n onClickHideDetectedField?: (key: string) => void;\n onLogRowHover?: (row?: LogRowModel) => void;\n}\n\ninterface State {\n showContext: boolean;\n showDetails: boolean;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n topVerticalAlign: css`\n label: topVerticalAlign;\n margin-top: -${theme.spacing(0.9)};\n margin-left: -${theme.spacing(0.25)};\n `,\n detailsOpen: css`\n &:hover {\n background-color: ${styleMixins.hoverColor(theme.colors.background.primary, theme)};\n }\n `,\n errorLogRow: css`\n label: erroredLogRow;\n color: ${theme.colors.text.secondary};\n `,\n };\n};\n/**\n * Renders a log line.\n *\n * When user hovers over it for a certain time, it lazily parses the log line.\n * Once a parser is found, it will determine fields, that will be highlighted.\n * When the user requests stats for a field, they will be calculated and rendered below the row.\n */\nclass UnThemedLogRow extends PureComponent<Props, State> {\n state: State = {\n showContext: false,\n showDetails: false,\n };\n\n toggleContext = () => {\n this.setState((state) => {\n return {\n showContext: !state.showContext,\n };\n });\n };\n\n toggleDetails = () => {\n if (!this.props.enableLogDetails) {\n return;\n }\n this.setState((state) => {\n return {\n showDetails: !state.showDetails,\n };\n });\n };\n\n renderTimeStamp(epochMs: number) {\n return dateTimeFormat(epochMs, {\n timeZone: this.props.timeZone,\n });\n }\n\n renderLogRow(\n context?: LogRowContextRows,\n errors?: LogRowContextQueryErrors,\n hasMoreContextRows?: HasMoreContextRows,\n updateLimit?: () => void\n ) {\n const {\n getRows,\n onClickFilterLabel,\n onClickFilterOutLabel,\n onClickShowDetectedField,\n onClickHideDetectedField,\n enableLogDetails,\n row,\n showDuplicates,\n showContextToggle,\n showLabels,\n showTime,\n showDetectedFields,\n wrapLogMessage,\n prettifyLogMessage,\n theme,\n getFieldLinks,\n forceEscape,\n onLogRowHover,\n } = this.props;\n const { showDetails, showContext } = this.state;\n const style = getLogRowStyles(theme, row.logLevel);\n const styles = getStyles(theme);\n const { errorMessage, hasError } = checkLogsError(row);\n const logRowBackground = cx(style.logsRow, {\n [styles.errorLogRow]: hasError,\n });\n\n const processedRow =\n row.hasUnescapedContent && forceEscape\n ? { ...row, entry: escapeUnescapedString(row.entry), raw: escapeUnescapedString(row.raw) }\n : row;\n\n return (\n <>\n <tr\n className={logRowBackground}\n onClick={this.toggleDetails}\n onMouseEnter={() => {\n onLogRowHover && onLogRowHover(row);\n }}\n onMouseLeave={() => {\n onLogRowHover && onLogRowHover(undefined);\n }}\n >\n {showDuplicates && (\n <td className={style.logsRowDuplicates}>\n {processedRow.duplicates && processedRow.duplicates > 0 ? `${processedRow.duplicates + 1}x` : null}\n </td>\n )}\n <td className={cx({ [style.logsRowLevel]: !hasError })}>\n {hasError && (\n <Tooltip content={`Error: ${errorMessage}`} placement=\"right\" theme=\"error\">\n <Icon className={style.logIconError} name=\"exclamation-triangle\" size=\"xs\" />\n </Tooltip>\n )}\n </td>\n {enableLogDetails && (\n <td title={showDetails ? 'Hide log details' : 'See log details'} className={style.logsRowToggleDetails}>\n <Icon className={styles.topVerticalAlign} name={showDetails ? 'angle-down' : 'angle-right'} />\n </td>\n )}\n {showTime && <td className={style.logsRowLocalTime}>{this.renderTimeStamp(row.timeEpochMs)}</td>}\n {showLabels && processedRow.uniqueLabels && (\n <td className={style.logsRowLabels}>\n <LogLabels labels={processedRow.uniqueLabels} />\n </td>\n )}\n {showDetectedFields && showDetectedFields.length > 0 ? (\n <LogRowMessageDetectedFields\n row={processedRow}\n showDetectedFields={showDetectedFields!}\n getFieldLinks={getFieldLinks}\n wrapLogMessage={wrapLogMessage}\n />\n ) : (\n <LogRowMessage\n row={processedRow}\n getRows={getRows}\n errors={errors}\n hasMoreContextRows={hasMoreContextRows}\n updateLimit={updateLimit}\n context={context}\n contextIsOpen={showContext}\n showContextToggle={showContextToggle}\n wrapLogMessage={wrapLogMessage}\n prettifyLogMessage={prettifyLogMessage}\n onToggleContext={this.toggleContext}\n />\n )}\n </tr>\n {this.state.showDetails && (\n <LogDetails\n className={logRowBackground}\n showDuplicates={showDuplicates}\n getFieldLinks={getFieldLinks}\n onClickFilterLabel={onClickFilterLabel}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickShowDetectedField={onClickShowDetectedField}\n onClickHideDetectedField={onClickHideDetectedField}\n getRows={getRows}\n row={processedRow}\n wrapLogMessage={wrapLogMessage}\n hasError={hasError}\n showDetectedFields={showDetectedFields}\n />\n )}\n </>\n );\n }\n\n render() {\n const { showContext } = this.state;\n const { logsSortOrder, row, getRowContext } = this.props;\n\n if (showContext) {\n return (\n <>\n <LogRowContextProvider row={row} getRowContext={getRowContext} logsSortOrder={logsSortOrder}>\n {({ result, errors, hasMoreContextRows, updateLimit }) => {\n return <>{this.renderLogRow(result, errors, hasMoreContextRows, updateLimit)}</>;\n }}\n </LogRowContextProvider>\n </>\n );\n }\n\n return this.renderLogRow();\n }\n}\n\nexport const LogRow = withTheme2(UnThemedLogRow);\nLogRow.displayName = 'LogRow';\n","import memoizeOne from 'memoize-one';\nimport React, { PureComponent } from 'react';\n\nimport { TimeZone, LogsDedupStrategy, LogRowModel, Field, LinkModel, LogsSortOrder, sortLogRows } from '@grafana/data';\n\nimport { withTheme2 } from '../../themes/index';\nimport { Themeable2 } from '../../types/theme';\n\n//Components\nimport { LogRow } from './LogRow';\nimport { RowContextOptions } from './LogRowContextProvider';\nimport { getLogRowStyles } from './getLogRowStyles';\n\nexport const PREVIEW_LIMIT = 100;\n\nexport interface Props extends Themeable2 {\n logRows?: LogRowModel[];\n deduplicatedRows?: LogRowModel[];\n dedupStrategy: LogsDedupStrategy;\n showLabels: boolean;\n showTime: boolean;\n wrapLogMessage: boolean;\n prettifyLogMessage: boolean;\n timeZone: TimeZone;\n enableLogDetails: boolean;\n logsSortOrder?: LogsSortOrder | null;\n previewLimit?: number;\n forceEscape?: boolean;\n showDetectedFields?: string[];\n showContextToggle?: (row?: LogRowModel) => boolean;\n onClickFilterLabel?: (key: string, value: string) => void;\n onClickFilterOutLabel?: (key: string, value: string) => void;\n getRowContext?: (row: LogRowModel, options?: RowContextOptions) => Promise<any>;\n getFieldLinks?: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n onClickShowDetectedField?: (key: string) => void;\n onClickHideDetectedField?: (key: string) => void;\n onLogRowHover?: (row?: LogRowModel) => void;\n}\n\ninterface State {\n renderAll: boolean;\n}\n\nclass UnThemedLogRows extends PureComponent<Props, State> {\n renderAllTimer: number | null = null;\n\n static defaultProps = {\n previewLimit: PREVIEW_LIMIT,\n };\n\n state: State = {\n renderAll: false,\n };\n\n componentDidMount() {\n // Staged rendering\n const { logRows, previewLimit } = this.props;\n const rowCount = logRows ? logRows.length : 0;\n // Render all right away if not too far over the limit\n const renderAll = rowCount <= previewLimit! * 2;\n if (renderAll) {\n this.setState({ renderAll });\n } else {\n this.renderAllTimer = window.setTimeout(() => this.setState({ renderAll: true }), 2000);\n }\n }\n\n componentWillUnmount() {\n if (this.renderAllTimer) {\n clearTimeout(this.renderAllTimer);\n }\n }\n\n makeGetRows = memoizeOne((orderedRows: LogRowModel[]) => {\n return () => orderedRows;\n });\n\n sortLogs = memoizeOne((logRows: LogRowModel[], logsSortOrder: LogsSortOrder): LogRowModel[] =>\n sortLogRows(logRows, logsSortOrder)\n );\n\n render() {\n const {\n dedupStrategy,\n showContextToggle,\n showLabels,\n showTime,\n wrapLogMessage,\n prettifyLogMessage,\n logRows,\n deduplicatedRows,\n timeZone,\n onClickFilterLabel,\n onClickFilterOutLabel,\n theme,\n enableLogDetails,\n previewLimit,\n getFieldLinks,\n logsSortOrder,\n showDetectedFields,\n onClickShowDetectedField,\n onClickHideDetectedField,\n forceEscape,\n onLogRowHover,\n } = this.props;\n const { renderAll } = this.state;\n const { logsRowsTable } = getLogRowStyles(theme);\n const dedupedRows = deduplicatedRows ? deduplicatedRows : logRows;\n const hasData = logRows && logRows.length > 0;\n const dedupCount = dedupedRows\n ? dedupedRows.reduce((sum, row) => (row.duplicates ? sum + row.duplicates : sum), 0)\n : 0;\n const showDuplicates = dedupStrategy !== LogsDedupStrategy.none && dedupCount > 0;\n // Staged rendering\n const processedRows = dedupedRows ? dedupedRows : [];\n const orderedRows = logsSortOrder ? this.sortLogs(processedRows, logsSortOrder) : processedRows;\n const firstRows = orderedRows.slice(0, previewLimit!);\n const lastRows = orderedRows.slice(previewLimit!, orderedRows.length);\n\n // React profiler becomes unusable if we pass all rows to all rows and their labels, using getter instead\n const getRows = this.makeGetRows(orderedRows);\n const getRowContext = this.props.getRowContext ? this.props.getRowContext : () => Promise.resolve([]);\n\n return (\n <table className={logsRowsTable}>\n <tbody>\n {hasData &&\n firstRows.map((row, index) => (\n <LogRow\n key={row.uid}\n getRows={getRows}\n getRowContext={getRowContext}\n row={row}\n showContextToggle={showContextToggle}\n showDuplicates={showDuplicates}\n showLabels={showLabels}\n showTime={showTime}\n showDetectedFields={showDetectedFields}\n wrapLogMessage={wrapLogMessage}\n prettifyLogMessage={prettifyLogMessage}\n timeZone={timeZone}\n enableLogDetails={enableLogDetails}\n onClickFilterLabel={onClickFilterLabel}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickShowDetectedField={onClickShowDetectedField}\n onClickHideDetectedField={onClickHideDetectedField}\n getFieldLinks={getFieldLinks}\n logsSortOrder={logsSortOrder}\n forceEscape={forceEscape}\n onLogRowHover={onLogRowHover}\n />\n ))}\n {hasData &&\n renderAll &&\n lastRows.map((row, index) => (\n <LogRow\n key={row.uid}\n getRows={getRows}\n getRowContext={getRowContext}\n row={row}\n showContextToggle={showContextToggle}\n showDuplicates={showDuplicates}\n showLabels={showLabels}\n showTime={showTime}\n showDetectedFields={showDetectedFields}\n wrapLogMessage={wrapLogMessage}\n prettifyLogMessage={prettifyLogMessage}\n timeZone={timeZone}\n enableLogDetails={enableLogDetails}\n onClickFilterLabel={onClickFilterLabel}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickShowDetectedField={onClickShowDetectedField}\n onClickHideDetectedField={onClickHideDetectedField}\n getFieldLinks={getFieldLinks}\n logsSortOrder={logsSortOrder}\n forceEscape={forceEscape}\n onLogRowHover={onLogRowHover}\n />\n ))}\n {hasData && !renderAll && (\n <tr>\n <td colSpan={5}>Rendering {orderedRows.length - previewLimit!} rows...</td>\n </tr>\n )}\n </tbody>\n </table>\n );\n }\n}\n\nexport const LogRows = withTheme2(UnThemedLogRows);\nLogRows.displayName = 'LogsRows';\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Field, GrafanaTheme, LinkModel } from '@grafana/data';\n\nimport { useStyles } from '../../themes';\nimport { Icon } from '../Icon/Icon';\n\nimport { DataLinkButton } from './DataLinkButton';\n\ntype Props = {\n links: Array<LinkModel<Field>>;\n};\n\n/**\n * @internal\n */\nexport function FieldLinkList({ links }: Props) {\n const styles = useStyles(getStyles);\n\n if (links.length === 1) {\n return <DataLinkButton link={links[0]} />;\n }\n\n const externalLinks = links.filter((link) => link.target === '_blank');\n const internalLinks = links.filter((link) => link.target === '_self');\n\n return (\n <>\n {internalLinks.map((link, i) => {\n return <DataLinkButton key={i} link={link} />;\n })}\n <div className={styles.wrapper}>\n <p className={styles.externalLinksHeading}>External links</p>\n {externalLinks.map((link, i) => (\n <a key={i} href={link.href} target={link.target} className={styles.externalLink}>\n <Icon name=\"external-link-alt\" />\n {link.title}\n </a>\n ))}\n </div>\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme) => ({\n wrapper: css`\n flex-basis: 150px;\n width: 100px;\n margin-top: ${theme.spacing.sm};\n `,\n externalLinksHeading: css`\n color: ${theme.colors.textWeak};\n font-weight: ${theme.typography.weight.regular};\n font-size: ${theme.typography.size.sm};\n margin: 0;\n `,\n externalLink: css`\n color: ${theme.colors.linkExternal};\n font-weight: ${theme.typography.weight.regular};\n display: block;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:hover {\n text-decoration: underline;\n }\n\n div {\n margin-right: ${theme.spacing.sm};\n }\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { stylesFactory } from '../../themes';\n\nexport interface Props {\n className?: string;\n}\n\nexport const FullWidthButtonContainer: FC<Props> = ({ className, children }) => {\n const styles = getStyles();\n\n return <div className={cx(styles, className)}>{children}</div>;\n};\n\nconst getStyles = stylesFactory(() => {\n return css`\n display: flex;\n\n button {\n flex-grow: 1;\n justify-content: center;\n }\n\n > * {\n flex-grow: 1;\n }\n\n label {\n flex-grow: 1;\n text-align: center;\n }\n `;\n});\n","import { cloneDeep, isNumber, omit } from 'lodash';\n\nimport {\n convertOldAngularValueMappings,\n FieldColorModeId,\n FieldConfig,\n fieldReducers,\n PanelModel,\n ReduceDataOptions,\n ReducerID,\n sortThresholds,\n Threshold,\n ThresholdsConfig,\n ThresholdsMode,\n validateFieldConfig,\n ValueMapping,\n VizOrientation,\n} from '@grafana/data';\nimport { OptionsWithTextFormatting } from '@grafana/schema';\n\nexport interface SingleStatBaseOptions extends OptionsWithTextFormatting {\n reduceOptions: ReduceDataOptions;\n orientation: VizOrientation;\n}\n\nconst optionsToKeep = ['reduceOptions', 'orientation'];\n\nexport function sharedSingleStatPanelChangedHandler(\n panel: PanelModel<Partial<SingleStatBaseOptions>> | any,\n prevPluginId: string,\n prevOptions: any\n) {\n let options = panel.options;\n\n panel.fieldConfig = panel.fieldConfig || {\n defaults: {},\n overrides: [],\n };\n\n // Migrating from angular singlestat\n if (prevPluginId === 'singlestat' && prevOptions.angular) {\n return migrateFromAngularSinglestat(panel, prevOptions);\n }\n\n for (const k of optionsToKeep) {\n if (prevOptions.hasOwnProperty(k)) {\n options[k] = cloneDeep(prevOptions[k]);\n }\n }\n\n return options;\n}\n\nfunction migrateFromAngularSinglestat(panel: PanelModel<Partial<SingleStatBaseOptions>> | any, prevOptions: any) {\n const prevPanel = prevOptions.angular;\n const reducer = fieldReducers.getIfExists(prevPanel.valueName);\n const options = {\n reduceOptions: {\n calcs: [reducer ? reducer.id : ReducerID.mean],\n },\n orientation: VizOrientation.Horizontal,\n } as any;\n\n const defaults: FieldConfig = {};\n\n if (prevPanel.format) {\n defaults.unit = prevPanel.format;\n }\n\n if (prevPanel.tableColumn) {\n options.reduceOptions.fields = `/^${prevPanel.tableColumn}$/`;\n }\n\n if (prevPanel.nullPointMode) {\n defaults.nullValueMode = prevPanel.nullPointMode;\n }\n\n if (prevPanel.nullText) {\n defaults.noValue = prevPanel.nullText;\n }\n\n if (prevPanel.decimals || prevPanel.decimals === 0) {\n defaults.decimals = prevPanel.decimals;\n }\n\n // Convert thresholds and color values\n if (prevPanel.thresholds && prevPanel.colors) {\n const levels = prevPanel.thresholds.split(',').map((strVale: string) => {\n return Number(strVale.trim());\n });\n\n // One more color than threshold\n const thresholds: Threshold[] = [];\n for (const color of prevPanel.colors) {\n const idx = thresholds.length - 1;\n if (idx >= 0) {\n thresholds.push({ value: levels[idx], color });\n } else {\n thresholds.push({ value: -Infinity, color });\n }\n }\n\n defaults.thresholds = {\n mode: ThresholdsMode.Absolute,\n steps: thresholds,\n };\n }\n\n // Convert value mappings\n const mappings = convertOldAngularValueMappings(prevPanel, defaults.thresholds);\n if (mappings && mappings.length) {\n defaults.mappings = mappings;\n }\n\n if (prevPanel.gauge && prevPanel.gauge.show) {\n defaults.min = prevPanel.gauge.minValue;\n defaults.max = prevPanel.gauge.maxValue;\n }\n\n panel.fieldConfig.defaults = defaults;\n\n return options;\n}\n\nexport function sharedSingleStatMigrationHandler(panel: PanelModel<SingleStatBaseOptions>): SingleStatBaseOptions {\n if (!panel.options) {\n // This happens on the first load or when migrating from angular\n return {} as any;\n }\n\n const previousVersion = parseFloat(panel.pluginVersion || '6.1');\n let options = panel.options as any;\n\n if (previousVersion < 6.2) {\n options = migrateFromValueOptions(options);\n }\n\n if (previousVersion < 6.3) {\n options = moveThresholdsAndMappingsToField(options);\n }\n\n const { fieldOptions } = options;\n\n if (previousVersion < 6.6 && fieldOptions) {\n // discard the old `override` options and enter an empty array\n if (fieldOptions && fieldOptions.override) {\n const { override, ...rest } = options.fieldOptions;\n options = {\n ...options,\n fieldOptions: {\n ...rest,\n overrides: [],\n },\n };\n }\n\n // Move thresholds to steps\n let thresholds = fieldOptions?.defaults?.thresholds;\n if (thresholds) {\n delete fieldOptions.defaults.thresholds;\n } else {\n thresholds = fieldOptions?.thresholds;\n delete fieldOptions.thresholds;\n }\n\n if (thresholds) {\n fieldOptions.defaults.thresholds = {\n mode: ThresholdsMode.Absolute,\n steps: thresholds,\n };\n }\n\n // Migrate color from simple string to a mode\n const { defaults } = fieldOptions;\n if (defaults.color && typeof defaults.color === 'string') {\n defaults.color = {\n mode: FieldColorModeId.Fixed,\n fixedColor: defaults.color,\n };\n }\n\n validateFieldConfig(defaults);\n }\n\n if (previousVersion < 7.0) {\n panel.fieldConfig = panel.fieldConfig || { defaults: {}, overrides: [] };\n panel.fieldConfig = {\n defaults:\n fieldOptions && fieldOptions.defaults\n ? { ...panel.fieldConfig.defaults, ...fieldOptions.defaults }\n : panel.fieldConfig.defaults,\n overrides:\n fieldOptions && fieldOptions.overrides\n ? [...panel.fieldConfig.overrides, ...fieldOptions.overrides]\n : panel.fieldConfig.overrides,\n };\n\n if (fieldOptions) {\n options.reduceOptions = {\n values: fieldOptions.values,\n limit: fieldOptions.limit,\n calcs: fieldOptions.calcs,\n };\n }\n\n delete options.fieldOptions;\n }\n\n if (previousVersion < 7.1) {\n // move title to displayName\n const oldTitle = (panel.fieldConfig.defaults as any).title;\n if (oldTitle !== undefined && oldTitle !== null) {\n panel.fieldConfig.defaults.displayName = oldTitle;\n delete (panel.fieldConfig.defaults as any).title;\n }\n }\n\n if (previousVersion < 8.0) {\n // Explicit min/max was removed for percent/percentunit in 8.0\n const config = panel.fieldConfig?.defaults;\n let unit = config?.unit;\n if (unit === 'percent') {\n if (!isNumber(config.min)) {\n config.min = 0;\n }\n if (!isNumber(config.max)) {\n config.max = 100;\n }\n } else if (unit === 'percentunit') {\n if (!isNumber(config.min)) {\n config.min = 0;\n }\n if (!isNumber(config.max)) {\n config.max = 1;\n }\n }\n }\n\n return options as SingleStatBaseOptions;\n}\n\nexport function moveThresholdsAndMappingsToField(old: any) {\n const { fieldOptions } = old;\n\n if (!fieldOptions) {\n return old;\n }\n\n const { mappings, ...rest } = old.fieldOptions;\n\n let thresholds: ThresholdsConfig | undefined = undefined;\n if (old.thresholds) {\n thresholds = {\n mode: ThresholdsMode.Absolute,\n steps: migrateOldThresholds(old.thresholds)!,\n };\n }\n\n return {\n ...old,\n fieldOptions: {\n ...rest,\n defaults: {\n ...fieldOptions.defaults,\n mappings,\n thresholds,\n },\n },\n };\n}\n\n/*\n * Moves valueMappings and thresholds from root to new fieldOptions object\n * Renames valueOptions to to defaults and moves it under fieldOptions\n */\nexport function migrateFromValueOptions(old: any) {\n const { valueOptions } = old;\n if (!valueOptions) {\n return old;\n }\n\n const fieldOptions: any = {};\n const fieldDefaults: any = {};\n\n fieldOptions.mappings = old.valueMappings;\n fieldOptions.thresholds = old.thresholds;\n fieldOptions.defaults = fieldDefaults;\n\n fieldDefaults.unit = valueOptions.unit;\n fieldDefaults.decimals = valueOptions.decimals;\n\n // Make sure the stats have a valid name\n if (valueOptions.stat) {\n const reducer = fieldReducers.get(valueOptions.stat);\n if (reducer) {\n fieldOptions.calcs = [reducer.id];\n }\n }\n\n fieldDefaults.min = old.minValue;\n fieldDefaults.max = old.maxValue;\n\n const newOptions = {\n ...old,\n fieldOptions,\n };\n\n return omit(newOptions, 'valueMappings', 'thresholds', 'valueOptions', 'minValue', 'maxValue');\n}\n\nexport function migrateOldThresholds(thresholds?: any[]): Threshold[] | undefined {\n if (!thresholds || !thresholds.length) {\n return undefined;\n }\n const copy = thresholds.map((t) => {\n return {\n // Drops 'index'\n value: t.value === null ? -Infinity : t.value,\n color: t.color,\n };\n });\n sortThresholds(copy);\n copy[0].value = -Infinity;\n return copy;\n}\n\n/**\n * @deprecated use convertOldAngularValueMappings instead\n * Convert the angular single stat mapping to new react style\n */\nexport function convertOldAngularValueMapping(panel: any): ValueMapping[] {\n return convertOldAngularValueMappings(panel);\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\n\nexport interface CallToActionCardProps {\n message?: string | JSX.Element;\n callToActionElement: JSX.Element;\n footer?: string | JSX.Element;\n className?: string;\n}\n\nexport const CallToActionCard: React.FunctionComponent<CallToActionCardProps> = ({\n message,\n callToActionElement,\n footer,\n className,\n}) => {\n const css = useStyles2(getStyles);\n\n return (\n <div className={cx([css.wrapper, className])}>\n {message && <div className={css.message}>{message}</div>}\n {callToActionElement}\n {footer && <div className={css.footer}>{footer}</div>}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n label: call-to-action-card;\n padding: ${theme.spacing(3)};\n background: ${theme.colors.background.secondary};\n border-radius: ${theme.shape.borderRadius(2)};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex-grow: 1;\n `,\n message: css`\n margin-bottom: ${theme.spacing(3)};\n font-style: italic;\n `,\n footer: css`\n margin-top: ${theme.spacing(3)}};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport React, { HTMLProps, useRef } from 'react';\n\nimport { GrafanaTheme2, deprecationWarning } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\n\nexport interface Props extends Omit<HTMLProps<HTMLInputElement>, 'value'> {\n value?: boolean;\n /** Make switch's background and border transparent */\n transparent?: boolean;\n}\n\nexport const Switch = React.forwardRef<HTMLInputElement, Props>(\n ({ value, checked, disabled, onChange, id, ...inputProps }, ref) => {\n if (checked) {\n deprecationWarning('Switch', 'checked prop', 'value');\n }\n\n const theme = useTheme2();\n const styles = getSwitchStyles(theme);\n const switchIdRef = useRef(id ? id : uniqueId('switch-'));\n\n return (\n <div className={cx(styles.switch)}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={value}\n onChange={(event) => {\n onChange?.(event);\n }}\n id={switchIdRef.current}\n {...inputProps}\n ref={ref}\n />\n <label htmlFor={switchIdRef.current} />\n </div>\n );\n }\n);\n\nSwitch.displayName = 'Switch';\n\nexport interface InlineSwitchProps extends Props {\n showLabel?: boolean;\n}\n\nexport const InlineSwitch = React.forwardRef<HTMLInputElement, InlineSwitchProps>(\n ({ transparent, className, showLabel, label, value, id, ...props }, ref) => {\n const theme = useTheme2();\n const styles = getSwitchStyles(theme, transparent);\n return (\n <div className={cx(styles.inlineContainer, className)}>\n {showLabel && (\n <label\n htmlFor={id}\n className={cx(styles.inlineLabel, value && styles.inlineLabelEnabled, 'inline-switch-label')}\n >\n {label}\n </label>\n )}\n <Switch {...props} id={id} label={label} ref={ref} value={value} />\n </div>\n );\n }\n);\n\nInlineSwitch.displayName = 'Switch';\n\nconst getSwitchStyles = stylesFactory((theme: GrafanaTheme2, transparent?: boolean) => {\n return {\n switch: css`\n width: 32px;\n height: 16px;\n position: relative;\n\n input {\n opacity: 0;\n left: -100vw;\n z-index: -1000;\n position: absolute;\n\n &:disabled + label {\n background: ${theme.colors.action.disabledBackground};\n cursor: not-allowed;\n }\n\n &:checked + label {\n background: ${theme.colors.primary.main};\n border-color: ${theme.colors.primary.main};\n\n &:hover {\n background: ${theme.colors.primary.shade};\n }\n\n &::after {\n transform: translate3d(18px, -50%, 0);\n background: ${theme.colors.primary.contrastText};\n }\n }\n\n &:focus + label,\n &:focus-visible + label {\n ${getFocusStyles(theme)}\n }\n\n &:focus:not(:focus-visible) + label {\n ${getMouseFocusStyles(theme)}\n }\n }\n\n label {\n width: 100%;\n height: 100%;\n cursor: pointer;\n border: none;\n border-radius: 50px;\n background: ${theme.components.input.background};\n border: 1px solid ${theme.components.input.borderColor};\n transition: all 0.3s ease;\n\n &:hover {\n border-color: ${theme.components.input.borderHover};\n }\n\n &::after {\n position: absolute;\n display: block;\n content: '';\n width: 12px;\n height: 12px;\n border-radius: 6px;\n background: ${theme.colors.text.secondary};\n box-shadow: ${theme.shadows.z1};\n top: 50%;\n transform: translate3d(2px, -50%, 0);\n transition: transform 0.2s cubic-bezier(0.19, 1, 0.22, 1);\n }\n }\n `,\n inlineContainer: css`\n padding: ${theme.spacing(0, 1)};\n height: ${theme.spacing(theme.components.height.md)};\n display: inline-flex;\n align-items: center;\n background: ${transparent ? 'transparent' : theme.components.input.background};\n border: 1px solid ${transparent ? 'transparent' : theme.components.input.borderColor};\n border-radius: ${theme.shape.borderRadius()};\n\n &:hover {\n border: 1px solid ${transparent ? 'transparent' : theme.components.input.borderHover};\n\n .inline-switch-label {\n color: ${theme.colors.text.primary};\n }\n }\n `,\n inlineLabel: css`\n cursor: pointer;\n padding-right: ${theme.spacing(1)};\n color: ${theme.colors.text.secondary};\n white-space: nowrap;\n `,\n inlineLabelEnabled: css`\n color: ${theme.colors.text.primary};\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport { groupBy, capitalize } from 'lodash';\nimport React, { useRef, useMemo } from 'react';\nimport useClickAway from 'react-use/lib/useClickAway';\n\nimport { VariableSuggestion, GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { List } from '../index';\n\ninterface DataLinkSuggestionsProps {\n activeRef?: React.RefObject<HTMLDivElement>;\n suggestions: VariableSuggestion[];\n activeIndex: number;\n onSuggestionSelect: (suggestion: VariableSuggestion) => void;\n onClose?: () => void;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n list: css`\n border-bottom: 1px solid ${theme.colors.border.weak};\n &:last-child {\n border: none;\n }\n `,\n wrapper: css`\n background: ${theme.colors.background.primary};\n width: 250px;\n `,\n item: css`\n background: none;\n padding: 2px 8px;\n color: ${theme.colors.text.primary};\n cursor: pointer;\n &:hover {\n background: ${theme.colors.action.hover};\n }\n `,\n label: css`\n color: ${theme.colors.text.secondary};\n `,\n activeItem: css`\n background: ${theme.colors.background.secondary};\n &:hover {\n background: ${theme.colors.background.secondary};\n }\n `,\n itemValue: css`\n font-family: ${theme.typography.fontFamilyMonospace};\n font-size: ${theme.typography.size.sm};\n `,\n };\n};\n\nexport const DataLinkSuggestions: React.FC<DataLinkSuggestionsProps> = ({ suggestions, ...otherProps }) => {\n const ref = useRef(null);\n\n useClickAway(ref, () => {\n if (otherProps.onClose) {\n otherProps.onClose();\n }\n });\n\n const groupedSuggestions = useMemo(() => {\n return groupBy(suggestions, (s) => s.origin);\n }, [suggestions]);\n\n const styles = useStyles2(getStyles);\n\n return (\n <div ref={ref} className={styles.wrapper}>\n {Object.keys(groupedSuggestions).map((key, i) => {\n const indexOffset =\n i === 0\n ? 0\n : Object.keys(groupedSuggestions).reduce((acc, current, index) => {\n if (index >= i) {\n return acc;\n }\n return acc + groupedSuggestions[current].length;\n }, 0);\n\n return (\n <DataLinkSuggestionsList\n {...otherProps}\n suggestions={groupedSuggestions[key]}\n label={`${capitalize(key)}`}\n activeIndex={otherProps.activeIndex}\n activeIndexOffset={indexOffset}\n key={key}\n />\n );\n })}\n </div>\n );\n};\n\nDataLinkSuggestions.displayName = 'DataLinkSuggestions';\n\ninterface DataLinkSuggestionsListProps extends DataLinkSuggestionsProps {\n label: string;\n activeIndexOffset: number;\n activeRef?: React.RefObject<HTMLDivElement>;\n}\n\nconst DataLinkSuggestionsList: React.FC<DataLinkSuggestionsListProps> = React.memo(\n ({ activeIndex, activeIndexOffset, label, onClose, onSuggestionSelect, suggestions, activeRef: selectedRef }) => {\n const styles = useStyles2(getStyles);\n\n return (\n <>\n <List\n className={styles.list}\n items={suggestions}\n renderItem={(item, index) => {\n const isActive = index + activeIndexOffset === activeIndex;\n return (\n <div\n className={cx(styles.item, isActive && styles.activeItem)}\n ref={isActive ? selectedRef : undefined}\n onClick={() => {\n onSuggestionSelect(item);\n }}\n title={item.documentation}\n >\n <span className={styles.itemValue}>\n <span className={styles.label}>{label}</span> {item.label}\n </span>\n </div>\n );\n }}\n />\n </>\n );\n }\n);\n\nDataLinkSuggestionsList.displayName = 'DataLinkSuggestionsList';\n","import { VirtualElement } from '@popperjs/core/lib/types';\n\nexport class SelectionReference implements VirtualElement {\n getBoundingClientRect() {\n const selection = window.getSelection();\n const node = selection && selection.anchorNode;\n\n if (node && node.parentElement) {\n const rect = node.parentElement.getBoundingClientRect();\n return rect;\n }\n\n return {\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n width: 0,\n height: 0,\n } as DOMRect;\n }\n\n get clientWidth() {\n return this.getBoundingClientRect().width;\n }\n\n get clientHeight() {\n return this.getBoundingClientRect().height;\n }\n}\n","import { css, cx } from '@emotion/css';\nimport Prism, { Grammar, LanguageMap } from 'prismjs';\nimport React, { memo, RefObject, useEffect, useMemo, useRef, useState } from 'react';\nimport { Popper as ReactPopper } from 'react-popper';\nimport usePrevious from 'react-use/lib/usePrevious';\nimport { Value } from 'slate';\nimport Plain from 'slate-plain-serializer';\n\nimport { DataLinkBuiltInVars, GrafanaTheme2, VariableOrigin, VariableSuggestion } from '@grafana/data';\nimport { Editor } from '@grafana/slate-react';\n\nimport { makeValue } from '../../index';\nimport { SlatePrism } from '../../slate-plugins';\nimport { useStyles2 } from '../../themes';\nimport { SCHEMA } from '../../utils/slate';\nimport CustomScrollbar from '../CustomScrollbar/CustomScrollbar';\nimport { getInputStyles } from '../Input/Input';\nimport { Portal } from '../index';\n\nimport { DataLinkSuggestions } from './DataLinkSuggestions';\nimport { SelectionReference } from './SelectionReference';\n\nconst modulo = (a: number, n: number) => a - n * Math.floor(a / n);\n\ninterface DataLinkInputProps {\n value: string;\n onChange: (url: string, callback?: () => void) => void;\n suggestions: VariableSuggestion[];\n placeholder?: string;\n}\n\nconst datalinksSyntax: Grammar = {\n builtInVariable: {\n pattern: /(\\${\\S+?})/,\n },\n};\n\nconst plugins = [\n SlatePrism(\n {\n onlyIn: (node: any) => node.type === 'code_block',\n getSyntax: () => 'links',\n },\n { ...(Prism.languages as LanguageMap), links: datalinksSyntax }\n ),\n];\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n input: getInputStyles({ theme, invalid: false }).input,\n editor: css`\n .token.builtInVariable {\n color: ${theme.colors.success.text};\n }\n .token.variable {\n color: ${theme.colors.primary.text};\n }\n `,\n suggestionsWrapper: css`\n box-shadow: ${theme.shadows.z2};\n `,\n // Wrapper with child selector needed.\n // When classnames are applied to the same element as the wrapper, it causes the suggestions to stop working\n wrapperOverrides: css`\n width: 100%;\n > .slate-query-field__wrapper {\n padding: 0;\n background-color: transparent;\n border: none;\n }\n `,\n});\n\n// This memoised also because rerendering the slate editor grabs focus which created problem in some cases this\n// was used and changes to different state were propagated here.\nexport const DataLinkInput: React.FC<DataLinkInputProps> = memo(\n ({ value, onChange, suggestions, placeholder = 'http://your-grafana.com/d/000000010/annotations' }) => {\n const editorRef = useRef<Editor>() as RefObject<Editor>;\n const styles = useStyles2(getStyles);\n const [showingSuggestions, setShowingSuggestions] = useState(false);\n const [suggestionsIndex, setSuggestionsIndex] = useState(0);\n const [linkUrl, setLinkUrl] = useState<Value>(makeValue(value));\n const prevLinkUrl = usePrevious<Value>(linkUrl);\n const [scrollTop, setScrollTop] = useState(0);\n\n // Workaround for https://github.com/ianstormtaylor/slate/issues/2927\n const stateRef = useRef({ showingSuggestions, suggestions, suggestionsIndex, linkUrl, onChange });\n stateRef.current = { showingSuggestions, suggestions, suggestionsIndex, linkUrl, onChange };\n\n // Used to get the height of the suggestion elements in order to scroll to them.\n const activeRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n setScrollTop(getElementPosition(activeRef.current, suggestionsIndex));\n }, [suggestionsIndex]);\n\n // SelectionReference is used to position the variables suggestion relatively to current DOM selection\n const selectionRef = useMemo(() => new SelectionReference(), []);\n\n const onKeyDown = React.useCallback((event: KeyboardEvent, next: () => any) => {\n if (!stateRef.current.showingSuggestions) {\n if (event.key === '=' || event.key === '$' || (event.keyCode === 32 && event.ctrlKey)) {\n return setShowingSuggestions(true);\n }\n return next();\n }\n\n switch (event.key) {\n case 'Backspace':\n case 'Escape':\n setShowingSuggestions(false);\n return setSuggestionsIndex(0);\n\n case 'Enter':\n event.preventDefault();\n return onVariableSelect(stateRef.current.suggestions[stateRef.current.suggestionsIndex]);\n\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n const direction = event.key === 'ArrowDown' ? 1 : -1;\n return setSuggestionsIndex((index) => modulo(index + direction, stateRef.current.suggestions.length));\n default:\n return next();\n }\n }, []);\n\n useEffect(() => {\n // Update the state of the link in the parent. This is basically done on blur but we need to do it after\n // our state have been updated. The duplicity of state is done for perf reasons and also because local\n // state also contains things like selection and formating.\n if (prevLinkUrl && prevLinkUrl.selection.isFocused && !linkUrl.selection.isFocused) {\n stateRef.current.onChange(Plain.serialize(linkUrl));\n }\n }, [linkUrl, prevLinkUrl]);\n\n const onUrlChange = React.useCallback(({ value }: { value: Value }) => {\n setLinkUrl(value);\n }, []);\n\n const onVariableSelect = (item: VariableSuggestion, editor = editorRef.current!) => {\n const includeDollarSign = Plain.serialize(editor.value).slice(-1) !== '$';\n if (item.origin !== VariableOrigin.Template || item.value === DataLinkBuiltInVars.includeVars) {\n editor.insertText(`${includeDollarSign ? '$' : ''}\\{${item.value}}`);\n } else {\n editor.insertText(`\\${${item.value}:queryparam}`);\n }\n\n setLinkUrl(editor.value);\n setShowingSuggestions(false);\n\n setSuggestionsIndex(0);\n stateRef.current.onChange(Plain.serialize(editor.value));\n };\n\n return (\n <div className={styles.wrapperOverrides}>\n <div className=\"slate-query-field__wrapper\">\n <div className=\"slate-query-field\">\n {showingSuggestions && (\n <Portal>\n <ReactPopper\n referenceElement={selectionRef}\n placement=\"bottom-end\"\n modifiers={[\n {\n name: 'preventOverflow',\n enabled: true,\n options: {\n rootBoundary: 'viewport',\n },\n },\n {\n name: 'arrow',\n enabled: false,\n },\n {\n name: 'offset',\n options: {\n offset: [250, 0],\n },\n },\n ]}\n >\n {({ ref, style, placement }) => {\n return (\n <div ref={ref} style={style} data-placement={placement} className={styles.suggestionsWrapper}>\n <CustomScrollbar\n scrollTop={scrollTop}\n autoHeightMax=\"300px\"\n setScrollTop={({ scrollTop }) => setScrollTop(scrollTop)}\n >\n <DataLinkSuggestions\n activeRef={activeRef}\n suggestions={stateRef.current.suggestions}\n onSuggestionSelect={onVariableSelect}\n onClose={() => setShowingSuggestions(false)}\n activeIndex={suggestionsIndex}\n />\n </CustomScrollbar>\n </div>\n );\n }}\n </ReactPopper>\n </Portal>\n )}\n <Editor\n schema={SCHEMA}\n ref={editorRef}\n placeholder={placeholder}\n value={stateRef.current.linkUrl}\n onChange={onUrlChange}\n onKeyDown={(event, _editor, next) => onKeyDown(event as KeyboardEvent, next)}\n plugins={plugins}\n className={cx(\n styles.editor,\n styles.input,\n css`\n padding: 3px 8px;\n `\n )}\n />\n </div>\n </div>\n </div>\n );\n }\n);\n\nDataLinkInput.displayName = 'DataLinkInput';\n\nfunction getElementPosition(suggestionElement: HTMLElement | null, activeIndex: number) {\n return (suggestionElement?.clientHeight ?? 0) * activeIndex;\n}\n","import { css } from '@emotion/css';\nimport React, { ChangeEvent } from 'react';\n\nimport { VariableSuggestion, GrafanaTheme2, DataLink } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/index';\nimport { Field } from '../Forms/Field';\nimport { Input } from '../Input/Input';\nimport { Switch } from '../Switch/Switch';\n\nimport { DataLinkInput } from './DataLinkInput';\n\ninterface DataLinkEditorProps {\n index: number;\n isLast: boolean;\n value: DataLink;\n suggestions: VariableSuggestion[];\n onChange: (index: number, link: DataLink, callback?: () => void) => void;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n listItem: css`\n margin-bottom: ${theme.spacing()};\n `,\n infoText: css`\n padding-bottom: ${theme.spacing(2)};\n margin-left: 66px;\n color: ${theme.colors.text.secondary};\n `,\n});\n\nexport const DataLinkEditor: React.FC<DataLinkEditorProps> = React.memo(\n ({ index, value, onChange, suggestions, isLast }) => {\n const styles = useStyles2(getStyles);\n\n const onUrlChange = (url: string, callback?: () => void) => {\n onChange(index, { ...value, url }, callback);\n };\n const onTitleChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange(index, { ...value, title: event.target.value });\n };\n\n const onOpenInNewTabChanged = () => {\n onChange(index, { ...value, targetBlank: !value.targetBlank });\n };\n\n return (\n <div className={styles.listItem}>\n <Field label=\"Title\">\n <Input value={value.title} onChange={onTitleChange} placeholder=\"Show details\" />\n </Field>\n\n <Field label=\"URL\">\n <DataLinkInput value={value.url} onChange={onUrlChange} suggestions={suggestions} />\n </Field>\n\n <Field label=\"Open in new tab\">\n <Switch value={value.targetBlank || false} onChange={onOpenInNewTabChanged} />\n </Field>\n\n {isLast && (\n <div className={styles.infoText}>\n With data links you can reference data variables like series name, labels and values. Type CMD+Space,\n CTRL+Space, or $ to open variable suggestions.\n </div>\n )}\n </div>\n );\n }\n);\n\nDataLinkEditor.displayName = 'DataLinkEditor';\n","import React, { FC, useState } from 'react';\n\nimport { DataFrame, DataLink, VariableSuggestion } from '@grafana/data';\n\nimport { Button } from '../../Button';\nimport { Modal } from '../../Modal/Modal';\nimport { DataLinkEditor } from '../DataLinkEditor';\n\ninterface DataLinkEditorModalContentProps {\n link: DataLink;\n index: number;\n data: DataFrame[];\n getSuggestions: () => VariableSuggestion[];\n onSave: (index: number, ink: DataLink) => void;\n onCancel: (index: number) => void;\n}\n\nexport const DataLinkEditorModalContent: FC<DataLinkEditorModalContentProps> = ({\n link,\n index,\n getSuggestions,\n onSave,\n onCancel,\n}) => {\n const [dirtyLink, setDirtyLink] = useState(link);\n return (\n <>\n <DataLinkEditor\n value={dirtyLink}\n index={index}\n isLast={false}\n suggestions={getSuggestions()}\n onChange={(index, link) => {\n setDirtyLink(link);\n }}\n />\n <Modal.ButtonRow>\n <Button variant=\"secondary\" onClick={() => onCancel(index)} fill=\"outline\">\n Cancel\n </Button>\n <Button\n onClick={() => {\n onSave(index, dirtyLink);\n }}\n >\n Save\n </Button>\n </Modal.ButtonRow>\n </>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { DataFrame, DataLink, GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { IconButton } from '../../IconButton/IconButton';\nimport { HorizontalGroup, VerticalGroup } from '../../Layout/Layout';\n\nexport interface DataLinksListItemProps {\n index: number;\n link: DataLink;\n data: DataFrame[];\n onChange: (index: number, link: DataLink) => void;\n onEdit: () => void;\n onRemove: () => void;\n isEditing?: boolean;\n}\n\nexport const DataLinksListItem: FC<DataLinksListItemProps> = ({ link, onEdit, onRemove }) => {\n const theme = useTheme2();\n const styles = getDataLinkListItemStyles(theme);\n const { title = '', url = '' } = link;\n\n const hasTitle = title.trim() !== '';\n const hasUrl = url.trim() !== '';\n\n return (\n <div className={styles.wrapper}>\n <VerticalGroup spacing=\"xs\">\n <HorizontalGroup justify=\"space-between\" align=\"flex-start\" width=\"100%\">\n <div className={cx(styles.title, !hasTitle && styles.notConfigured)}>\n {hasTitle ? title : 'Data link title not provided'}\n </div>\n <HorizontalGroup>\n <IconButton name=\"pen\" onClick={onEdit} />\n <IconButton name=\"times\" onClick={onRemove} />\n </HorizontalGroup>\n </HorizontalGroup>\n <div className={cx(styles.url, !hasUrl && styles.notConfigured)} title={url}>\n {hasUrl ? url : 'Data link url not provided'}\n </div>\n </VerticalGroup>\n </div>\n );\n};\n\nconst getDataLinkListItemStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n margin-bottom: ${theme.spacing(2)};\n width: 100%;\n &:last-child {\n margin-bottom: 0;\n }\n `,\n notConfigured: css`\n font-style: italic;\n `,\n title: css`\n color: ${theme.colors.text.primary};\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.fontWeightMedium};\n `,\n url: css`\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.size.sm};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 90%;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport { cloneDeep } from 'lodash';\nimport React, { useState } from 'react';\n\nimport { DataFrame, DataLink, GrafanaTheme2, VariableSuggestion } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { Button } from '../../Button/Button';\nimport { Modal } from '../../Modal/Modal';\n\nimport { DataLinkEditorModalContent } from './DataLinkEditorModalContent';\nimport { DataLinksListItem } from './DataLinksListItem';\n\ninterface DataLinksInlineEditorProps {\n links?: DataLink[];\n onChange: (links: DataLink[]) => void;\n getSuggestions: () => VariableSuggestion[];\n data: DataFrame[];\n}\n\nexport const DataLinksInlineEditor: React.FC<DataLinksInlineEditorProps> = ({\n links,\n onChange,\n getSuggestions,\n data,\n}) => {\n const theme = useTheme2();\n const [editIndex, setEditIndex] = useState<number | null>(null);\n const [isNew, setIsNew] = useState(false);\n\n const styles = getDataLinksInlineEditorStyles(theme);\n const linksSafe: DataLink[] = links ?? [];\n const isEditing = editIndex !== null;\n\n const onDataLinkChange = (index: number, link: DataLink) => {\n if (isNew) {\n if (link.title.trim() === '' && link.url.trim() === '') {\n setIsNew(false);\n setEditIndex(null);\n return;\n } else {\n setEditIndex(null);\n setIsNew(false);\n }\n }\n const update = cloneDeep(linksSafe);\n update[index] = link;\n onChange(update);\n setEditIndex(null);\n };\n\n const onDataLinkAdd = () => {\n let update = cloneDeep(linksSafe);\n setEditIndex(update.length);\n setIsNew(true);\n };\n\n const onDataLinkCancel = (index: number) => {\n if (isNew) {\n setIsNew(false);\n }\n setEditIndex(null);\n };\n\n const onDataLinkRemove = (index: number) => {\n const update = cloneDeep(linksSafe);\n update.splice(index, 1);\n onChange(update);\n };\n\n return (\n <>\n {linksSafe.length > 0 && (\n <div className={styles.wrapper}>\n {linksSafe.map((l, i) => {\n return (\n <DataLinksListItem\n key={`${l.title}/${i}`}\n index={i}\n link={l}\n onChange={onDataLinkChange}\n onEdit={() => setEditIndex(i)}\n onRemove={() => onDataLinkRemove(i)}\n data={data}\n />\n );\n })}\n </div>\n )}\n\n {isEditing && editIndex !== null && (\n <Modal\n title=\"Edit link\"\n isOpen={true}\n closeOnBackdropClick={false}\n onDismiss={() => {\n onDataLinkCancel(editIndex);\n }}\n >\n <DataLinkEditorModalContent\n index={editIndex}\n link={isNew ? { title: '', url: '' } : linksSafe[editIndex]}\n data={data}\n onSave={onDataLinkChange}\n onCancel={onDataLinkCancel}\n getSuggestions={getSuggestions}\n />\n </Modal>\n )}\n\n <Button size=\"sm\" icon=\"plus\" onClick={onDataLinkAdd} variant=\"secondary\">\n Add link\n </Button>\n </>\n );\n};\n\nconst getDataLinksInlineEditorStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n margin-bottom: ${theme.spacing(2)};\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useStyles2 } from '../../themes';\nimport { Alert, AlertVariant } from '../Alert/Alert';\nimport { Icon } from '../Icon/Icon';\n\nexport interface InfoBoxProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n children: React.ReactNode;\n /** Title of the box */\n title?: string | JSX.Element;\n /** Url of the read more link */\n url?: string;\n /** Text of the read more link */\n urlTitle?: string;\n /** Indicates whether or not box should be rendered with Grafana branding background */\n branded?: boolean;\n /** Color variant of the box */\n severity?: AlertVariant;\n /** Call back to be performed when box is dismissed */\n onDismiss?: () => void;\n}\n\n/** @deprecated use Alert with severity info */\nexport const InfoBox = React.memo(\n React.forwardRef<HTMLDivElement, InfoBoxProps>(\n ({ title, className, children, branded, url, urlTitle, onDismiss, severity = 'info', ...otherProps }, ref) => {\n const styles = useStyles2(getStyles);\n\n return (\n <Alert severity={severity} className={className} {...otherProps} ref={ref} title={title as string}>\n <div>{children}</div>\n {url && (\n <a href={url} className={cx('external-link', styles.docsLink)} target=\"_blank\" rel=\"noreferrer\">\n <Icon name=\"book\" /> {urlTitle || 'Read more'}\n </a>\n )}\n </Alert>\n );\n }\n )\n);\n\nInfoBox.displayName = 'InfoBox';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n docsLink: css`\n display: inline-block;\n margin-top: ${theme.spacing(2)};\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nexport type BadgeColor = 'blue' | 'red' | 'green' | 'orange' | 'purple';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLDivElement> {\n text: React.ReactNode;\n color: BadgeColor;\n icon?: IconName;\n tooltip?: string;\n}\n\nexport const Badge = React.memo<BadgeProps>(({ icon, color, text, tooltip, className, ...otherProps }) => {\n const theme = useTheme();\n const styles = getStyles(theme, color);\n const badge = (\n <div className={cx(styles.wrapper, className)} {...otherProps}>\n <HorizontalGroup align=\"center\" spacing=\"xs\">\n {icon && <Icon name={icon} size=\"sm\" />}\n <span>{text}</span>\n </HorizontalGroup>\n </div>\n );\n\n return tooltip ? (\n <Tooltip content={tooltip} placement=\"auto\">\n {badge}\n </Tooltip>\n ) : (\n badge\n );\n});\n\nBadge.displayName = 'Badge';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, color: BadgeColor) => {\n let sourceColor = theme.visualization.getColorByName(color);\n let borderColor = '';\n let bgColor = '';\n let textColor = '';\n\n if (theme.isDark) {\n bgColor = tinycolor(sourceColor).setAlpha(0.15).toString();\n borderColor = tinycolor(sourceColor).darken(30).toString();\n textColor = tinycolor(sourceColor).lighten(15).toString();\n } else {\n bgColor = tinycolor(sourceColor).setAlpha(0.15).toString();\n borderColor = tinycolor(sourceColor).lighten(20).toString();\n textColor = tinycolor(sourceColor).darken(15).toString();\n }\n\n return {\n wrapper: css`\n font-size: ${theme.typography.size.sm};\n display: inline-flex;\n padding: 1px 4px;\n border-radius: 3px;\n background: ${bgColor};\n border: 1px solid ${borderColor};\n color: ${textColor};\n font-weight: ${theme.typography.weight.regular};\n\n > span {\n position: relative;\n top: 1px;\n margin-left: 2px;\n }\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { FeatureState, GrafanaTheme } from '@grafana/data';\n\nimport { stylesFactory, useStyles } from '../../themes';\nimport { Badge, BadgeProps } from '../Badge/Badge';\n\nimport { InfoBox, InfoBoxProps } from './InfoBox';\n\nexport interface FeatureInfoBoxProps extends Omit<InfoBoxProps, 'title' | 'urlTitle'> {\n title: string;\n featureState?: FeatureState;\n}\n\n/** @deprecated use Alert with severity info */\nexport const FeatureInfoBox = React.memo(\n React.forwardRef<HTMLDivElement, FeatureInfoBoxProps>(({ title, featureState, ...otherProps }, ref) => {\n const styles = useStyles(getFeatureInfoBoxStyles);\n\n const titleEl = featureState ? (\n <>\n <div className={styles.badge}>\n <FeatureBadge featureState={featureState} />\n </div>\n <h3>{title}</h3>\n </>\n ) : (\n <h3>{title}</h3>\n );\n return <InfoBox branded title={titleEl} urlTitle=\"Read documentation\" ref={ref} {...otherProps} />;\n })\n);\n\nFeatureInfoBox.displayName = 'FeatureInfoBox';\n\nconst getFeatureInfoBoxStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n badge: css`\n margin-bottom: ${theme.spacing.sm};\n `,\n };\n});\n\ninterface FeatureBadgeProps {\n featureState: FeatureState;\n tooltip?: string;\n}\n\nexport const FeatureBadge: React.FC<FeatureBadgeProps> = ({ featureState, tooltip }) => {\n const display = getPanelStateBadgeDisplayModel(featureState);\n return <Badge text={display.text} color={display.color} icon={display.icon} tooltip={tooltip} />;\n};\n\nfunction getPanelStateBadgeDisplayModel(featureState: FeatureState): BadgeProps {\n switch (featureState) {\n case FeatureState.alpha:\n return {\n text: 'Alpha',\n icon: 'exclamation-triangle',\n color: 'orange',\n };\n }\n\n return {\n text: 'Beta',\n icon: 'rocket',\n color: 'blue',\n };\n}\n","// Based on work https://github.com/mohsen1/json-formatter-js\n// License MIT, Copyright (c) 2015 Mohsen Azimi\n\n/*\n * Escapes `\"` characters from string\n */\nexport function formatString(str: string): string {\n return str.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\n/*\n * Determines if a value is an object\n */\nexport function isObject(value: any): boolean {\n const type = typeof value;\n return !!value && type === 'object';\n}\n\n/*\n * Gets constructor name of an object.\n * From http://stackoverflow.com/a/332429\n *\n */\nexport function getObjectName(object: object): string {\n if (object === undefined) {\n return '';\n }\n if (object === null) {\n return 'Object';\n }\n if (typeof object === 'object' && !object.constructor) {\n return 'Object';\n }\n\n const funcNameRegex = /function ([^(]*)/;\n const results = funcNameRegex.exec(object.constructor.toString());\n if (results && results.length > 1) {\n return results[1];\n } else {\n return '';\n }\n}\n\n/*\n * Gets type of an object. Returns \"null\" for null objects\n */\nexport function getType(object: object): string {\n if (object === null) {\n return 'null';\n }\n return typeof object;\n}\n\n/*\n * Generates inline preview for a JavaScript object based on a value\n */\nexport function getValuePreview(object: object, value: string): string {\n const type = getType(object);\n\n if (type === 'null' || type === 'undefined') {\n return type;\n }\n\n if (type === 'string') {\n value = '\"' + formatString(value) + '\"';\n }\n if (type === 'function') {\n // Remove content of the function\n return (\n object\n .toString()\n .replace(/[\\r\\n]/g, '')\n .replace(/\\{.*\\}/, '') + '{…}'\n );\n }\n return value;\n}\n\n/*\n * Generates inline preview for a JavaScript object\n */\nlet value = '';\nexport function getPreview(obj: object): string {\n if (isObject(obj)) {\n value = getObjectName(obj);\n if (Array.isArray(obj)) {\n value += '[' + obj.length + ']';\n }\n } else {\n value = getValuePreview(obj, obj.toString());\n }\n return value;\n}\n\n/*\n * Generates a prefixed CSS class name\n */\nexport function cssClass(className: string): string {\n return `json-formatter-${className}`;\n}\n\n/*\n * Creates a new DOM element with given type and class\n * TODO: move me to helpers\n */\nexport function createElement(type: string, className?: string, content?: Element | string): Element {\n const el = document.createElement(type);\n if (className) {\n el.classList.add(cssClass(className));\n }\n if (content !== undefined) {\n if (content instanceof Node) {\n el.appendChild(content);\n } else {\n el.appendChild(document.createTextNode(String(content)));\n }\n }\n return el;\n}\n","// Based on work https://github.com/mohsen1/json-formatter-js\n// License MIT, Copyright (c) 2015 Mohsen Azimi\n\nimport { isNumber } from 'lodash';\n\nimport { isObject, getObjectName, getType, getValuePreview, cssClass, createElement } from './helpers';\n\nconst DATE_STRING_REGEX =\n /(^\\d{1,4}[\\.|\\\\/|-]\\d{1,2}[\\.|\\\\/|-]\\d{1,4})(\\s*(?:0?[1-9]:[0-5]|1(?=[012])\\d:[0-5])\\d\\s*[ap]m)?$/;\nconst PARTIAL_DATE_REGEX = /\\d{2}:\\d{2}:\\d{2} GMT-\\d{4}/;\nconst JSON_DATE_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/;\n\n// When toggling, don't animated removal or addition of more than a few items\nconst MAX_ANIMATED_TOGGLE_ITEMS = 10;\n\nconst requestAnimationFrame =\n (typeof window !== 'undefined' && window.requestAnimationFrame) ||\n ((cb: () => void) => {\n cb();\n return 0;\n });\n\nexport interface JsonExplorerConfig {\n animateOpen?: boolean;\n animateClose?: boolean;\n theme?: string;\n}\n\nconst _defaultConfig: JsonExplorerConfig = {\n animateOpen: true,\n animateClose: true,\n};\n\n/**\n * @class JsonExplorer\n *\n * JsonExplorer allows you to render JSON objects in HTML with a\n * **collapsible** navigation.\n */\nexport class JsonExplorer {\n // Hold the open state after the toggler is used\n private _isOpen: boolean | null = null;\n\n // A reference to the element that we render to\n private element: Element | null = null;\n\n private skipChildren = false;\n\n /**\n * @param {object} json The JSON object you want to render. It has to be an\n * object or array. Do NOT pass raw JSON string.\n *\n * @param {number} [open=1] his number indicates up to how many levels the\n * rendered tree should expand. Set it to `0` to make the whole tree collapsed\n * or set it to `Infinity` to expand the tree deeply\n *\n * @param {object} [config=defaultConfig] -\n * defaultConfig = {\n * hoverPreviewEnabled: false,\n * hoverPreviewArrayCount: 100,\n * hoverPreviewFieldCount: 5\n * }\n *\n * Available configurations:\n * #####Hover Preview\n * * `hoverPreviewEnabled`: enable preview on hover\n * * `hoverPreviewArrayCount`: number of array items to show in preview Any\n * array larger than this number will be shown as `Array[XXX]` where `XXX`\n * is length of the array.\n * * `hoverPreviewFieldCount`: number of object properties to show for object\n * preview. Any object with more properties that thin number will be\n * truncated.\n *\n * @param {string} [key=undefined] The key that this object in it's parent\n * context\n */\n constructor(\n public json: any,\n private open = 1,\n private config: JsonExplorerConfig = _defaultConfig,\n private key?: string\n ) {}\n\n /*\n * is formatter open?\n */\n private get isOpen(): boolean {\n if (this._isOpen !== null) {\n return this._isOpen;\n } else {\n return this.open > 0;\n }\n }\n\n /*\n * set open state (from toggler)\n */\n private set isOpen(value: boolean) {\n this._isOpen = value;\n }\n\n /*\n * is this a date string?\n */\n private get isDate(): boolean {\n return (\n this.type === 'string' &&\n (DATE_STRING_REGEX.test(this.json) || JSON_DATE_REGEX.test(this.json) || PARTIAL_DATE_REGEX.test(this.json))\n );\n }\n\n /*\n * is this a URL string?\n */\n private get isUrl(): boolean {\n return this.type === 'string' && this.json.indexOf('http') === 0;\n }\n\n /*\n * is this an array?\n */\n private get isArray(): boolean {\n return Array.isArray(this.json);\n }\n\n /*\n * is this an object?\n * Note: In this context arrays are object as well\n */\n private get isObject(): boolean {\n return isObject(this.json);\n }\n\n /*\n * is this an empty object with no properties?\n */\n private get isEmptyObject(): boolean {\n return !this.keys.length && !this.isArray;\n }\n\n /*\n * is this an empty object or array?\n */\n private get isEmpty(): boolean {\n return this.isEmptyObject || (this.keys && !this.keys.length && this.isArray);\n }\n\n /*\n * did we receive a key argument?\n * This means that the formatter was called as a sub formatter of a parent formatter\n */\n private get hasKey(): boolean {\n return typeof this.key !== 'undefined';\n }\n\n /*\n * if this is an object, get constructor function name\n */\n private get constructorName(): string {\n return getObjectName(this.json);\n }\n\n /*\n * get type of this value\n * Possible values: all JavaScript primitive types plus \"array\" and \"null\"\n */\n private get type(): string {\n return getType(this.json);\n }\n\n /*\n * get object keys\n * If there is an empty key we pad it wit quotes to make it visible\n */\n private get keys(): string[] {\n if (this.isObject) {\n return Object.keys(this.json).map((key) => (key ? key : '\"\"'));\n } else {\n return [];\n }\n }\n\n /**\n * Toggles `isOpen` state\n *\n */\n toggleOpen() {\n this.isOpen = !this.isOpen;\n\n if (this.element) {\n if (this.isOpen) {\n this.appendChildren(this.config.animateOpen);\n } else {\n this.removeChildren(this.config.animateClose);\n }\n this.element.classList.toggle(cssClass('open'));\n }\n }\n\n /**\n * Open all children up to a certain depth.\n * Allows actions such as expand all/collapse all\n *\n */\n openAtDepth(depth = 1) {\n if (depth < 0) {\n return;\n }\n\n this.open = depth;\n this.isOpen = depth !== 0;\n\n if (this.element) {\n this.removeChildren(false);\n\n if (depth === 0) {\n this.element.classList.remove(cssClass('open'));\n } else {\n this.appendChildren(this.config.animateOpen);\n this.element.classList.add(cssClass('open'));\n }\n }\n }\n\n isNumberArray() {\n return this.json.length > 0 && this.json.length < 4 && (isNumber(this.json[0]) || isNumber(this.json[1]));\n }\n\n renderArray() {\n const arrayWrapperSpan = createElement('span');\n arrayWrapperSpan.appendChild(createElement('span', 'bracket', '['));\n\n // some pretty handling of number arrays\n if (this.isNumberArray()) {\n this.json.forEach((val: any, index: number) => {\n if (index > 0) {\n arrayWrapperSpan.appendChild(createElement('span', 'array-comma', ','));\n }\n arrayWrapperSpan.appendChild(createElement('span', 'number', val));\n });\n this.skipChildren = true;\n } else {\n arrayWrapperSpan.appendChild(createElement('span', 'number', this.json.length));\n }\n\n arrayWrapperSpan.appendChild(createElement('span', 'bracket', ']'));\n return arrayWrapperSpan;\n }\n\n /**\n * Renders an HTML element and installs event listeners\n *\n * @returns {HTMLDivElement}\n */\n render(skipRoot = false): HTMLDivElement {\n // construct the root element and assign it to this.element\n this.element = createElement('div', 'row');\n\n // construct the toggler link\n const togglerLink = createElement('a', 'toggler-link');\n const togglerIcon = createElement('span', 'toggler');\n\n // if this is an object we need a wrapper span (toggler)\n if (this.isObject) {\n togglerLink.appendChild(togglerIcon);\n }\n\n // if this is child of a parent formatter we need to append the key\n if (this.hasKey) {\n togglerLink.appendChild(createElement('span', 'key', `${this.key}:`));\n }\n\n // Value for objects and arrays\n if (this.isObject) {\n // construct the value holder element\n const value = createElement('span', 'value');\n\n // we need a wrapper span for objects\n const objectWrapperSpan = createElement('span');\n\n // get constructor name and append it to wrapper span\n const constructorName = createElement('span', 'constructor-name', this.constructorName);\n objectWrapperSpan.appendChild(constructorName);\n\n // if it's an array append the array specific elements like brackets and length\n if (this.isArray) {\n const arrayWrapperSpan = this.renderArray();\n objectWrapperSpan.appendChild(arrayWrapperSpan);\n }\n\n // append object wrapper span to toggler link\n value.appendChild(objectWrapperSpan);\n togglerLink.appendChild(value);\n // Primitive values\n } else {\n // make a value holder element\n const value = this.isUrl ? createElement('a') : createElement('span');\n\n // add type and other type related CSS classes\n value.classList.add(cssClass(this.type));\n if (this.isDate) {\n value.classList.add(cssClass('date'));\n }\n if (this.isUrl) {\n value.classList.add(cssClass('url'));\n value.setAttribute('href', this.json);\n }\n\n // Append value content to value element\n const valuePreview = getValuePreview(this.json, this.json);\n value.appendChild(document.createTextNode(valuePreview));\n\n // append the value element to toggler link\n togglerLink.appendChild(value);\n }\n\n // construct a children element\n const children = createElement('div', 'children');\n\n // set CSS classes for children\n if (this.isObject) {\n children.classList.add(cssClass('object'));\n }\n if (this.isArray) {\n children.classList.add(cssClass('array'));\n }\n if (this.isEmpty) {\n children.classList.add(cssClass('empty'));\n }\n\n // set CSS classes for root element\n if (this.config && this.config.theme) {\n this.element.classList.add(cssClass(this.config.theme));\n }\n if (this.isOpen) {\n this.element.classList.add(cssClass('open'));\n }\n\n // append toggler and children elements to root element\n if (!skipRoot) {\n this.element.appendChild(togglerLink);\n }\n\n if (!this.skipChildren) {\n this.element.appendChild(children);\n } else {\n // remove togglerIcon\n togglerLink.removeChild(togglerIcon);\n }\n\n // if formatter is set to be open call appendChildren\n if (this.isObject && this.isOpen) {\n this.appendChildren();\n }\n\n // add event listener for toggling\n if (this.isObject) {\n togglerLink.addEventListener('click', this.toggleOpen.bind(this));\n }\n\n return this.element as HTMLDivElement;\n }\n\n /**\n * Appends all the children to children element\n * Animated option is used when user triggers this via a click\n */\n appendChildren(animated = false) {\n const children = this.element && this.element.querySelector(`div.${cssClass('children')}`);\n\n if (!children || this.isEmpty) {\n return;\n }\n\n if (animated) {\n let index = 0;\n const addAChild = () => {\n const key = this.keys[index];\n const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n children.appendChild(formatter.render());\n\n index += 1;\n\n if (index < this.keys.length) {\n if (index > MAX_ANIMATED_TOGGLE_ITEMS) {\n addAChild();\n } else {\n requestAnimationFrame(addAChild);\n }\n }\n };\n\n requestAnimationFrame(addAChild);\n } else {\n this.keys.forEach((key) => {\n const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n children.appendChild(formatter.render());\n });\n }\n }\n\n /**\n * Removes all the children from children element\n * Animated option is used when user triggers this via a click\n */\n removeChildren(animated = false) {\n const childrenElement =\n this.element && (this.element.querySelector(`div.${cssClass('children')}`) as HTMLDivElement);\n\n if (animated) {\n let childrenRemoved = 0;\n const removeAChild = () => {\n if (childrenElement && childrenElement.children.length) {\n childrenElement.removeChild(childrenElement.children[0]);\n childrenRemoved += 1;\n if (childrenRemoved > MAX_ANIMATED_TOGGLE_ITEMS) {\n removeAChild();\n } else {\n requestAnimationFrame(removeAChild);\n }\n }\n };\n requestAnimationFrame(removeAChild);\n } else {\n if (childrenElement) {\n childrenElement.innerHTML = '';\n }\n }\n }\n}\n","import React, { PureComponent, createRef } from 'react';\n\nimport { JsonExplorer } from './json_explorer/json_explorer'; // We have made some monkey-patching of json-formatter-js so we can't switch right now\n\ninterface Props {\n className?: string;\n json: {};\n config?: any;\n open?: number;\n onDidRender?: (formattedJson: any) => void;\n}\n\nexport class JSONFormatter extends PureComponent<Props> {\n private wrapperRef = createRef<HTMLDivElement>();\n\n static defaultProps = {\n open: 3,\n config: {\n animateOpen: true,\n },\n };\n\n componentDidMount() {\n this.renderJson();\n }\n\n componentDidUpdate() {\n this.renderJson();\n }\n\n renderJson = () => {\n const { json, config, open, onDidRender } = this.props;\n const wrapperEl = this.wrapperRef.current;\n const formatter = new JsonExplorer(json, open, config);\n // @ts-ignore\n const hasChildren: boolean = wrapperEl.hasChildNodes();\n if (hasChildren) {\n // @ts-ignore\n wrapperEl.replaceChild(formatter.render(), wrapperEl.lastChild);\n } else {\n // @ts-ignore\n wrapperEl.appendChild(formatter.render());\n }\n\n if (onDidRender) {\n onDidRender(formatter.json);\n }\n };\n\n render() {\n const { className } = this.props;\n return <div className={className} ref={this.wrapperRef} />;\n }\n}\n","import { css } from '@emotion/css';\nimport React, { FunctionComponent } from 'react';\n\nimport { stylesFactory } from '../../themes';\n\nimport { ErrorBoundaryApi } from './ErrorBoundary';\n\nconst getStyles = stylesFactory(() => {\n return css`\n width: 500px;\n margin: 64px auto;\n `;\n});\n\nexport interface Props extends ErrorBoundaryApi {\n title: string;\n}\n\nexport const ErrorWithStack: FunctionComponent<Props> = ({ error, errorInfo, title }) => (\n <div className={getStyles()}>\n <h2>{title}</h2>\n <details style={{ whiteSpace: 'pre-wrap' }}>\n {error && error.toString()}\n <br />\n {errorInfo && errorInfo.componentStack}\n </details>\n </div>\n);\n\nErrorWithStack.displayName = 'ErrorWithStack';\n","import { captureException } from '@sentry/browser';\nimport React, { PureComponent, ReactNode, ComponentType } from 'react';\n\nimport { Alert } from '../Alert/Alert';\n\nimport { ErrorWithStack } from './ErrorWithStack';\n\nexport interface ErrorInfo {\n componentStack: string;\n}\n\nexport interface ErrorBoundaryApi {\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\ninterface Props {\n children: (r: ErrorBoundaryApi) => ReactNode;\n /** Will re-render children after error if recover values changes */\n dependencies?: any[];\n /** Callback called on error */\n onError?: (error: Error) => void;\n /** Callback error state is cleared due to recover props change */\n onRecover?: () => void;\n}\n\ninterface State {\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\nexport class ErrorBoundary extends PureComponent<Props, State> {\n readonly state: State = {\n error: null,\n errorInfo: null,\n };\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n captureException(error, { contexts: { react: { componentStack: errorInfo.componentStack } } });\n this.setState({ error, errorInfo });\n\n if (this.props.onError) {\n this.props.onError(error);\n }\n }\n\n componentDidUpdate(prevProps: Props) {\n const { dependencies, onRecover } = this.props;\n\n if (this.state.error) {\n if (dependencies && prevProps.dependencies) {\n for (let i = 0; i < dependencies.length; i++) {\n if (dependencies[i] !== prevProps.dependencies[i]) {\n this.setState({ error: null, errorInfo: null });\n if (onRecover) {\n onRecover();\n }\n break;\n }\n }\n }\n }\n }\n\n render() {\n const { children } = this.props;\n const { error, errorInfo } = this.state;\n\n return children({\n error,\n errorInfo,\n });\n }\n}\n\n/**\n * Props for the ErrorBoundaryAlert component\n *\n * @public\n */\nexport interface ErrorBoundaryAlertProps {\n /** Title for the error boundary alert */\n title?: string;\n\n /** Component to be wrapped with an error boundary */\n children: ReactNode;\n\n /** 'page' will render full page error with stacktrace. 'alertbox' will render an <Alert />. Default 'alertbox' */\n style?: 'page' | 'alertbox';\n\n /** Will re-render children after error if recover values changes */\n dependencies?: any[];\n}\n\nexport class ErrorBoundaryAlert extends PureComponent<ErrorBoundaryAlertProps> {\n static defaultProps: Partial<ErrorBoundaryAlertProps> = {\n title: 'An unexpected error happened',\n style: 'alertbox',\n };\n\n render() {\n const { title, children, style, dependencies } = this.props;\n\n return (\n <ErrorBoundary dependencies={dependencies}>\n {({ error, errorInfo }) => {\n if (!errorInfo) {\n return children;\n }\n\n if (style === 'alertbox') {\n return (\n <Alert title={title || ''}>\n <details style={{ whiteSpace: 'pre-wrap' }}>\n {error && error.toString()}\n <br />\n {errorInfo.componentStack}\n </details>\n </Alert>\n );\n }\n\n return <ErrorWithStack title={title || ''} error={error} errorInfo={errorInfo} />;\n }}\n </ErrorBoundary>\n );\n }\n}\n\n/**\n * HOC for wrapping a component in an error boundary.\n *\n * @param Component - the react component to wrap in error boundary\n * @param errorBoundaryProps - error boundary options\n *\n * @public\n */\nexport function withErrorBoundary<P = {}>(\n Component: ComponentType<P>,\n errorBoundaryProps: Omit<ErrorBoundaryAlertProps, 'children'> = {}\n): ComponentType<P> {\n const comp = (props: P) => (\n <ErrorBoundaryAlert {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundaryAlert>\n );\n comp.displayName = 'WithErrorBoundary';\n\n return comp;\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FunctionComponent } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { PopoverContent, Tooltip } from '../Tooltip';\n\nimport { LabelProps } from './Label';\n\nexport interface Props extends Omit<LabelProps, 'css' | 'description' | 'category'> {\n /** Content for the labels tooltip. If provided, an info icon with the tooltip content\n * will be displayed */\n tooltip?: PopoverContent;\n /** Custom width for the label */\n width?: number | 'auto';\n /** Make labels's background transparent */\n transparent?: boolean;\n /** Make tooltip interactive */\n interactive?: boolean;\n /** @beta */\n /** Controls which element the InlineLabel should be rendered into */\n as?: React.ElementType;\n}\n\nexport const InlineLabel: FunctionComponent<Props> = ({\n children,\n className,\n tooltip,\n width,\n transparent,\n interactive,\n as: Component = 'label',\n ...rest\n}) => {\n const theme = useTheme();\n const styles = getInlineLabelStyles(theme, transparent, width);\n return (\n <Component className={cx(styles.label, className)} {...rest}>\n {children}\n {tooltip && (\n <Tooltip interactive={interactive} placement=\"top\" content={tooltip} theme=\"info\">\n <Icon tabIndex={0} name=\"info-circle\" size=\"sm\" className={styles.icon} />\n </Tooltip>\n )}\n </Component>\n );\n};\n\nexport const getInlineLabelStyles = (theme: GrafanaTheme, transparent = false, width?: number | 'auto') => {\n return {\n label: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n padding: 0 ${theme.spacing.sm};\n font-weight: ${theme.typography.weight.semibold};\n font-size: ${theme.typography.size.sm};\n background-color: ${transparent ? 'transparent' : theme.colors.bg2};\n height: ${theme.height.md}px;\n line-height: ${theme.height.md}px;\n margin-right: ${theme.spacing.xs};\n border-radius: ${theme.border.radius.md};\n border: none;\n width: ${width ? (width !== 'auto' ? `${8 * width}px` : width) : '100%'};\n color: ${theme.colors.textHeading};\n `,\n icon: css`\n color: ${theme.colors.textWeak};\n margin-left: 10px;\n\n :hover {\n color: ${theme.colors.text};\n }\n `,\n };\n};\n","import { cx, css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes';\nimport { getChildId } from '../../utils/reactUtils';\nimport { PopoverContent } from '../Tooltip';\n\nimport { FieldProps } from './Field';\nimport { FieldValidationMessage } from './FieldValidationMessage';\nimport { InlineLabel } from './InlineLabel';\n\nexport interface Props extends Omit<FieldProps, 'css' | 'horizontal' | 'description' | 'error'> {\n /** Content for the label's tooltip */\n tooltip?: PopoverContent;\n /** Custom width for the label as a multiple of 8px */\n labelWidth?: number | 'auto';\n /** Make the field's child to fill the width of the row. Equivalent to setting `flex-grow:1` on the field */\n grow?: boolean;\n /** Make the field's child shrink with width of the row. Equivalent to setting `flex-shrink:1` on the field */\n shrink?: boolean;\n /** Make field's background transparent */\n transparent?: boolean;\n /** Error message to display */\n error?: string | null;\n htmlFor?: string;\n /** Make tooltip interactive */\n interactive?: boolean;\n}\n\nexport const InlineField: FC<Props> = ({\n children,\n label,\n tooltip,\n labelWidth = 'auto',\n invalid,\n loading,\n disabled,\n className,\n htmlFor,\n grow,\n shrink,\n error,\n transparent,\n interactive,\n ...htmlProps\n}) => {\n const theme = useTheme2();\n const styles = getStyles(theme, grow, shrink);\n const inputId = htmlFor ?? getChildId(children);\n\n const labelElement =\n typeof label === 'string' ? (\n <InlineLabel\n interactive={interactive}\n width={labelWidth}\n tooltip={tooltip}\n htmlFor={inputId}\n transparent={transparent}\n >\n {label}\n </InlineLabel>\n ) : (\n label\n );\n\n return (\n <div className={cx(styles.container, className)} {...htmlProps}>\n {labelElement}\n <div className={styles.childContainer}>\n {React.cloneElement(children, { invalid, disabled, loading })}\n {invalid && error && (\n <div className={cx(styles.fieldValidationWrapper)}>\n <FieldValidationMessage>{error}</FieldValidationMessage>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nInlineField.displayName = 'InlineField';\n\nconst getStyles = (theme: GrafanaTheme2, grow?: boolean, shrink?: boolean) => {\n return {\n container: css`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n text-align: left;\n position: relative;\n flex: ${grow ? 1 : 0} ${shrink ? 1 : 0} auto;\n margin: 0 ${theme.spacing(0.5)} ${theme.spacing(0.5)} 0;\n `,\n childContainer: css`\n flex: ${grow ? 1 : 0} ${shrink ? 1 : 0} auto;\n `,\n fieldValidationWrapper: css`\n margin-top: ${theme.spacing(0.5)};\n `,\n };\n};\n","import React from 'react';\n\nimport { InlineField } from '../..';\nimport { FormField } from '../FormField/FormField';\nimport { SecretFormField } from '../SecretFormField/SecretFormField';\n\nimport { HttpSettingsProps } from './types';\n\nexport const BasicAuthSettings: React.FC<HttpSettingsProps> = ({ dataSourceConfig, onChange }) => {\n const password = dataSourceConfig.secureJsonData ? dataSourceConfig.secureJsonData.basicAuthPassword : '';\n\n const onPasswordReset = () => {\n onChange({\n ...dataSourceConfig,\n secureJsonData: {\n ...dataSourceConfig.secureJsonData,\n basicAuthPassword: '',\n },\n secureJsonFields: {\n ...dataSourceConfig.secureJsonFields,\n basicAuthPassword: false,\n },\n });\n };\n\n const onPasswordChange = (event: React.SyntheticEvent<HTMLInputElement>) => {\n onChange({\n ...dataSourceConfig,\n secureJsonData: {\n ...dataSourceConfig.secureJsonData,\n basicAuthPassword: event.currentTarget.value,\n },\n });\n };\n\n return (\n <>\n <InlineField>\n <FormField\n label=\"User\"\n labelWidth={10}\n inputWidth={18}\n placeholder=\"user\"\n value={dataSourceConfig.basicAuthUser}\n onChange={(event) => onChange({ ...dataSourceConfig, basicAuthUser: event.currentTarget.value })}\n />\n </InlineField>\n <InlineField>\n <SecretFormField\n isConfigured={!!(dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.basicAuthPassword)}\n value={password || ''}\n inputWidth={18}\n labelWidth={10}\n onReset={onPasswordReset}\n onChange={onPasswordChange}\n />\n </InlineField>\n </>\n );\n};\n","import { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport { DataSourceSettings } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\nimport { Button } from '../Button';\nimport { FormField } from '../FormField/FormField';\nimport { Icon } from '../Icon/Icon';\nimport { SecretFormField } from '../SecretFormField/SecretFormField';\n\nexport interface CustomHeader {\n id: string;\n name: string;\n value: string;\n configured: boolean;\n}\n\nexport type CustomHeaders = CustomHeader[];\n\nexport interface Props {\n dataSourceConfig: DataSourceSettings<any, any>;\n onChange: (config: DataSourceSettings) => void;\n}\n\nexport interface State {\n headers: CustomHeaders;\n}\n\ninterface CustomHeaderRowProps {\n header: CustomHeader;\n onReset: (id: string) => void;\n onRemove: (id: string) => void;\n onChange: (value: CustomHeader) => void;\n onBlur: () => void;\n}\n\nconst getCustomHeaderRowStyles = stylesFactory(() => {\n return {\n layout: css`\n display: flex;\n align-items: center;\n margin-bottom: 4px;\n > * {\n margin-left: 4px;\n margin-bottom: 0;\n height: 100%;\n &:first-child,\n &:last-child {\n margin-left: 0;\n }\n }\n `,\n };\n});\n\nconst CustomHeaderRow: React.FC<CustomHeaderRowProps> = ({ header, onBlur, onChange, onRemove, onReset }) => {\n const styles = getCustomHeaderRowStyles();\n return (\n <div className={styles.layout}>\n <FormField\n label=\"Header\"\n name=\"name\"\n placeholder=\"X-Custom-Header\"\n labelWidth={5}\n value={header.name || ''}\n onChange={(e) => onChange({ ...header, name: e.target.value })}\n onBlur={onBlur}\n />\n <SecretFormField\n label=\"Value\"\n aria-label=\"Value\"\n name=\"value\"\n isConfigured={header.configured}\n value={header.value}\n labelWidth={5}\n inputWidth={header.configured ? 11 : 12}\n placeholder=\"Header Value\"\n onReset={() => onReset(header.id)}\n onChange={(e) => onChange({ ...header, value: e.target.value })}\n onBlur={onBlur}\n />\n <Button\n type=\"button\"\n aria-label=\"Remove header\"\n variant=\"secondary\"\n size=\"xs\"\n onClick={(_e) => onRemove(header.id)}\n >\n <Icon name=\"trash-alt\" />\n </Button>\n </div>\n );\n};\n\nCustomHeaderRow.displayName = 'CustomHeaderRow';\n\nexport class CustomHeadersSettings extends PureComponent<Props, State> {\n state: State = {\n headers: [],\n };\n\n constructor(props: Props) {\n super(props);\n const { jsonData, secureJsonData, secureJsonFields } = this.props.dataSourceConfig;\n this.state = {\n headers: Object.keys(jsonData)\n .sort()\n .filter((key) => key.startsWith('httpHeaderName'))\n .map((key, index) => {\n return {\n id: uniqueId(),\n name: jsonData[key],\n value: secureJsonData !== undefined ? secureJsonData[key] : '',\n configured: (secureJsonFields && secureJsonFields[`httpHeaderValue${index + 1}`]) || false,\n };\n }),\n };\n }\n\n updateSettings = () => {\n const { headers } = this.state;\n\n // we remove every httpHeaderName* field\n const newJsonData = Object.fromEntries(\n Object.entries(this.props.dataSourceConfig.jsonData).filter(([key, val]) => !key.startsWith('httpHeaderName'))\n );\n\n // we remove every httpHeaderValue* field\n const newSecureJsonData = Object.fromEntries(\n Object.entries(this.props.dataSourceConfig.secureJsonData || {}).filter(\n ([key, val]) => !key.startsWith('httpHeaderValue')\n )\n );\n\n // then we add the current httpHeader-fields\n for (const [index, header] of headers.entries()) {\n newJsonData[`httpHeaderName${index + 1}`] = header.name;\n if (!header.configured) {\n newSecureJsonData[`httpHeaderValue${index + 1}`] = header.value;\n }\n }\n\n this.props.onChange({\n ...this.props.dataSourceConfig,\n jsonData: newJsonData,\n secureJsonData: newSecureJsonData,\n });\n };\n\n onHeaderAdd = () => {\n this.setState((prevState) => {\n return { headers: [...prevState.headers, { id: uniqueId(), name: '', value: '', configured: false }] };\n });\n };\n\n onHeaderChange = (headerIndex: number, value: CustomHeader) => {\n this.setState(({ headers }) => {\n return {\n headers: headers.map((item, index) => {\n if (headerIndex !== index) {\n return item;\n }\n return { ...value };\n }),\n };\n });\n };\n\n onHeaderReset = (headerId: string) => {\n this.setState(({ headers }) => {\n return {\n headers: headers.map((h, i) => {\n if (h.id !== headerId) {\n return h;\n }\n return {\n ...h,\n value: '',\n configured: false,\n };\n }),\n };\n });\n };\n\n onHeaderRemove = (headerId: string) => {\n this.setState(\n ({ headers }) => ({\n headers: headers.filter((h) => h.id !== headerId),\n }),\n this.updateSettings\n );\n };\n\n render() {\n const { headers } = this.state;\n return (\n <div className={'gf-form-group'}>\n <div className=\"gf-form\">\n <h6>Custom HTTP Headers</h6>\n </div>\n <div>\n {headers.map((header, i) => (\n <CustomHeaderRow\n key={header.id}\n header={header}\n onChange={(h) => {\n this.onHeaderChange(i, h);\n }}\n onBlur={this.updateSettings}\n onRemove={this.onHeaderRemove}\n onReset={this.onHeaderReset}\n />\n ))}\n </div>\n <div className=\"gf-form\">\n <Button\n variant=\"secondary\"\n icon=\"plus\"\n type=\"button\"\n onClick={(e) => {\n this.onHeaderAdd();\n }}\n >\n Add header\n </Button>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomHeadersSettings;\n","import React from 'react';\n\nimport { InlineField } from '../Forms/InlineField';\nimport { InlineSwitch } from '../Switch/Switch';\n\nimport { HttpSettingsBaseProps } from './types';\n\nconst LABEL_WIDTH = 26;\n\nexport const HttpProxySettings: React.FC<HttpSettingsBaseProps> = ({\n dataSourceConfig,\n onChange,\n showForwardOAuthIdentityOption = true,\n}) => {\n return (\n <>\n <div className=\"gf-form-inline\">\n <InlineField label=\"TLS Client Auth\" labelWidth={LABEL_WIDTH}>\n <InlineSwitch\n id=\"http-settings-tls-client-auth\"\n value={dataSourceConfig.jsonData.tlsAuth || false}\n onChange={(event) => onChange({ ...dataSourceConfig.jsonData, tlsAuth: event!.currentTarget.checked })}\n />\n </InlineField>\n <InlineField label=\"With CA Cert\" tooltip=\"Needed for verifying self-signed TLS Certs\" labelWidth={LABEL_WIDTH}>\n <InlineSwitch\n id=\"http-settings-ca-cert\"\n value={dataSourceConfig.jsonData.tlsAuthWithCACert || false}\n onChange={(event) =>\n onChange({ ...dataSourceConfig.jsonData, tlsAuthWithCACert: event!.currentTarget.checked })\n }\n />\n </InlineField>\n </div>\n <div className=\"gf-form-inline\">\n <InlineField label=\"Skip TLS Verify\" labelWidth={LABEL_WIDTH}>\n <InlineSwitch\n id=\"http-settings-skip-tls-verify\"\n value={dataSourceConfig.jsonData.tlsSkipVerify || false}\n onChange={(event) =>\n onChange({ ...dataSourceConfig.jsonData, tlsSkipVerify: event!.currentTarget.checked })\n }\n />\n </InlineField>\n </div>\n {showForwardOAuthIdentityOption && (\n <div className=\"gf-form-inline\">\n <InlineField\n label=\"Forward OAuth Identity\"\n tooltip=\"Forward the user's upstream OAuth identity to the data source (Their access token gets passed along).\"\n labelWidth={LABEL_WIDTH}\n >\n <InlineSwitch\n id=\"http-settings-forward-oauth\"\n value={dataSourceConfig.jsonData.oauthPassThru || false}\n onChange={(event) =>\n onChange({ ...dataSourceConfig.jsonData, oauthPassThru: event!.currentTarget.checked })\n }\n />\n </InlineField>\n </div>\n )}\n </>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC, HTMLProps, ReactNode } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useStyles } from '../../themes';\n\nexport interface Props extends Omit<HTMLProps<HTMLDivElement>, 'css'> {\n children: ReactNode | ReactNode[];\n}\n\nexport const InlineFieldRow: FC<Props> = ({ children, className, ...htmlProps }) => {\n const styles = useStyles(getStyles);\n return (\n <div className={cx(styles.container, className)} {...htmlProps}>\n {children}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n return {\n container: css`\n label: InlineFieldRow;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-content: flex-start;\n row-gap: ${theme.spacing.xs};\n `,\n };\n};\n","import React, { ChangeEvent, MouseEvent, FC } from 'react';\n\nimport { Button } from '../Button';\nimport { InlineField } from '../Forms/InlineField';\nimport { InlineFieldRow } from '../Forms/InlineFieldRow';\nimport { Input } from '../Input/Input';\nimport { TextArea } from '../TextArea/TextArea';\n\ninterface Props {\n label: string;\n hasCert: boolean;\n placeholder: string;\n\n onChange: (event: ChangeEvent<HTMLTextAreaElement>) => void;\n onClick: (event: MouseEvent<HTMLButtonElement>) => void;\n}\n\nexport const CertificationKey: FC<Props> = ({ hasCert, label, onChange, onClick, placeholder }) => {\n return (\n <InlineFieldRow>\n <InlineField label={label} labelWidth={14} disabled={hasCert}>\n {hasCert ? (\n <Input type=\"text\" value=\"configured\" width={24} />\n ) : (\n <TextArea rows={7} onChange={onChange} placeholder={placeholder} required />\n )}\n </InlineField>\n {hasCert && (\n <Button variant=\"secondary\" onClick={onClick} style={{ marginLeft: 4 }}>\n Reset\n </Button>\n )}\n </InlineFieldRow>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { KeyValue } from '@grafana/data';\n\nimport { FormField } from '../FormField/FormField';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\n\nimport { CertificationKey } from './CertificationKey';\nimport { HttpSettingsBaseProps } from './types';\n\nexport const TLSAuthSettings: React.FC<HttpSettingsBaseProps> = ({ dataSourceConfig, onChange }) => {\n const hasTLSCACert = dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.tlsCACert;\n const hasTLSClientCert = dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.tlsClientCert;\n const hasTLSClientKey = dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.tlsClientKey;\n const hasServerName = dataSourceConfig.jsonData && dataSourceConfig.jsonData.serverName;\n\n const onResetClickFactory = (field: string) => (event: React.MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n const newSecureJsonFields: KeyValue<boolean> = { ...dataSourceConfig.secureJsonFields };\n newSecureJsonFields[field] = false;\n onChange({\n ...dataSourceConfig,\n secureJsonFields: newSecureJsonFields,\n });\n };\n\n const onCertificateChangeFactory = (field: string) => (event: React.SyntheticEvent<HTMLTextAreaElement>) => {\n const newSecureJsonData = { ...dataSourceConfig.secureJsonData };\n newSecureJsonData[field] = event.currentTarget.value;\n\n onChange({\n ...dataSourceConfig,\n secureJsonData: newSecureJsonData,\n });\n };\n\n const onServerNameLabelChange = (event: React.SyntheticEvent<HTMLInputElement>) => {\n const newJsonData = {\n ...dataSourceConfig.jsonData,\n serverName: event.currentTarget.value,\n };\n\n onChange({\n ...dataSourceConfig,\n jsonData: newJsonData,\n });\n };\n\n return (\n <div className=\"gf-form-group\">\n <div\n className={cx(\n 'gf-form',\n css`\n align-items: baseline;\n `\n )}\n >\n <h6>TLS/SSL Auth Details</h6>\n <Tooltip\n placement=\"right-end\"\n content=\"TLS/SSL Certs are encrypted and stored in the Grafana database.\"\n theme=\"info\"\n >\n <div className=\"gf-form-help-icon gf-form-help-icon--right-normal\">\n <Icon name=\"info-circle\" size=\"xs\" style={{ marginLeft: '10px' }} />\n </div>\n </Tooltip>\n </div>\n <div>\n {dataSourceConfig.jsonData.tlsAuthWithCACert && (\n <CertificationKey\n hasCert={!!hasTLSCACert}\n onChange={onCertificateChangeFactory('tlsCACert')}\n placeholder=\"Begins with -----BEGIN CERTIFICATE-----\"\n label=\"CA Cert\"\n onClick={onResetClickFactory('tlsCACert')}\n />\n )}\n\n {dataSourceConfig.jsonData.tlsAuth && (\n <>\n <div className=\"gf-form\">\n <FormField\n label=\"ServerName\"\n labelWidth={7}\n inputWidth={30}\n placeholder=\"domain.example.com\"\n value={hasServerName && dataSourceConfig.jsonData.serverName}\n onChange={onServerNameLabelChange}\n />\n </div>\n <CertificationKey\n hasCert={!!hasTLSClientCert}\n label=\"Client Cert\"\n onChange={onCertificateChangeFactory('tlsClientCert')}\n placeholder=\"Begins with -----BEGIN CERTIFICATE-----\"\n onClick={onResetClickFactory('tlsClientCert')}\n />\n\n <CertificationKey\n hasCert={!!hasTLSClientKey}\n label=\"Client Key\"\n placeholder=\"Begins with -----BEGIN RSA PRIVATE KEY-----\"\n onChange={onCertificateChangeFactory('tlsClientKey')}\n onClick={onResetClickFactory('tlsClientKey')}\n />\n </>\n )}\n </div>\n </div>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useState, useCallback } from 'react';\n\nimport { DataSourceSettings, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useTheme } from '../../themes';\nimport { FormField } from '../FormField/FormField';\nimport { InlineFormLabel } from '../FormLabel/FormLabel';\nimport { InlineField } from '../Forms/InlineField';\nimport { Input } from '../Forms/Legacy/Input/Input';\nimport { Icon } from '../Icon/Icon';\nimport { Select } from '../Select/Select';\nimport { InlineSwitch } from '../Switch/Switch';\nimport { TagsInput } from '../TagsInput/TagsInput';\n\nimport { BasicAuthSettings } from './BasicAuthSettings';\nimport { CustomHeadersSettings } from './CustomHeadersSettings';\nimport { HttpProxySettings } from './HttpProxySettings';\nimport { TLSAuthSettings } from './TLSAuthSettings';\nimport { HttpSettingsProps } from './types';\n\nconst ACCESS_OPTIONS: Array<SelectableValue<string>> = [\n {\n label: 'Server (default)',\n value: 'proxy',\n },\n {\n label: 'Browser',\n value: 'direct',\n },\n];\n\nconst DEFAULT_ACCESS_OPTION = {\n label: 'Server (default)',\n value: 'proxy',\n};\n\nconst HttpAccessHelp = () => (\n <div className=\"grafana-info-box m-t-2\">\n <p>\n Access mode controls how requests to the data source will be handled.\n <strong>\n <i>Server</i>\n </strong>{' '}\n should be the preferred way if nothing else is stated.\n </p>\n <div className=\"alert-title\">Server access mode (Default):</div>\n <p>\n All requests will be made from the browser to Grafana backend/server which in turn will forward the requests to\n the data source and by that circumvent possible Cross-Origin Resource Sharing (CORS) requirements. The URL needs\n to be accessible from the grafana backend/server if you select this access mode.\n </p>\n <div className=\"alert-title\">Browser access mode:</div>\n <p>\n All requests will be made from the browser directly to the data source and may be subject to Cross-Origin Resource\n Sharing (CORS) requirements. The URL needs to be accessible from the browser if you select this access mode.\n </p>\n </div>\n);\n\nconst LABEL_WIDTH = 26;\n\nexport const DataSourceHttpSettings: React.FC<HttpSettingsProps> = (props) => {\n const {\n defaultUrl,\n dataSourceConfig,\n onChange,\n showAccessOptions,\n sigV4AuthToggleEnabled,\n showForwardOAuthIdentityOption,\n azureAuthSettings,\n renderSigV4Editor,\n } = props;\n let urlTooltip;\n const [isAccessHelpVisible, setIsAccessHelpVisible] = useState(false);\n const theme = useTheme();\n\n const onSettingsChange = useCallback(\n (change: Partial<DataSourceSettings<any, any>>) => {\n onChange({\n ...dataSourceConfig,\n ...change,\n });\n },\n [dataSourceConfig, onChange]\n );\n\n switch (dataSourceConfig.access) {\n case 'direct':\n urlTooltip = (\n <>\n Your access method is <em>Browser</em>, this means the URL needs to be accessible from the browser.\n </>\n );\n break;\n case 'proxy':\n urlTooltip = (\n <>\n Your access method is <em>Server</em>, this means the URL needs to be accessible from the grafana\n backend/server.\n </>\n );\n break;\n default:\n urlTooltip = 'Specify a complete HTTP URL (for example http://your_server:8080)';\n }\n\n const accessSelect = (\n <Select\n aria-label=\"Access\"\n className=\"width-20 gf-form-input\"\n options={ACCESS_OPTIONS}\n value={ACCESS_OPTIONS.filter((o) => o.value === dataSourceConfig.access)[0] || DEFAULT_ACCESS_OPTION}\n onChange={(selectedValue) => onSettingsChange({ access: selectedValue.value })}\n />\n );\n\n const isValidUrl = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/.test(\n dataSourceConfig.url\n );\n\n const notValidStyle = css`\n box-shadow: inset 0 0px 5px ${theme.palette.red};\n `;\n\n const inputStyle = cx({ [`width-20`]: true, [notValidStyle]: !isValidUrl });\n\n const urlInput = (\n <Input\n className={inputStyle}\n placeholder={defaultUrl}\n value={dataSourceConfig.url}\n aria-label={selectors.components.DataSource.DataSourceHttpSettings.urlInput}\n onChange={(event) => onSettingsChange({ url: event.currentTarget.value })}\n />\n );\n\n const azureAuthEnabled: boolean =\n (azureAuthSettings?.azureAuthSupported && azureAuthSettings.getAzureAuthEnabled(dataSourceConfig)) || false;\n\n return (\n <div className=\"gf-form-group\">\n <>\n <h3 className=\"page-heading\">HTTP</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <FormField label=\"URL\" labelWidth={13} tooltip={urlTooltip} inputEl={urlInput} />\n </div>\n\n {showAccessOptions && (\n <>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <FormField label=\"Access\" labelWidth={13} inputWidth={20} inputEl={accessSelect} />\n </div>\n <div className=\"gf-form\">\n <label\n className=\"gf-form-label query-keyword pointer\"\n onClick={() => setIsAccessHelpVisible((isVisible) => !isVisible)}\n >\n Help \n <Icon name={isAccessHelpVisible ? 'angle-down' : 'angle-right'} style={{ marginBottom: 0 }} />\n </label>\n </div>\n </div>\n {isAccessHelpVisible && <HttpAccessHelp />}\n </>\n )}\n {dataSourceConfig.access === 'proxy' && (\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <InlineFormLabel\n width={13}\n tooltip=\"Grafana proxy deletes forwarded cookies by default. Specify cookies by name that should be forwarded to the data source.\"\n >\n Allowed cookies\n </InlineFormLabel>\n <TagsInput\n tags={dataSourceConfig.jsonData.keepCookies}\n width={40}\n onChange={(cookies) =>\n onSettingsChange({ jsonData: { ...dataSourceConfig.jsonData, keepCookies: cookies } })\n }\n />\n </div>\n <div className=\"gf-form\">\n <FormField\n label=\"Timeout\"\n type=\"number\"\n labelWidth={13}\n inputWidth={20}\n tooltip=\"HTTP request timeout in seconds\"\n placeholder=\"Timeout in seconds\"\n aria-label=\"Timeout in seconds\"\n value={dataSourceConfig.jsonData.timeout}\n onChange={(event) => {\n onSettingsChange({\n jsonData: { ...dataSourceConfig.jsonData, timeout: parseInt(event.currentTarget.value, 10) },\n });\n }}\n />\n </div>\n </div>\n )}\n </div>\n </>\n\n <>\n <h3 className=\"page-heading\">Auth</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <InlineField label=\"Basic auth\" labelWidth={LABEL_WIDTH}>\n <InlineSwitch\n id=\"http-settings-basic-auth\"\n value={dataSourceConfig.basicAuth}\n onChange={(event) => {\n onSettingsChange({ basicAuth: event!.currentTarget.checked });\n }}\n />\n </InlineField>\n\n <InlineField\n label=\"With Credentials\"\n tooltip=\"Whether credentials such as cookies or auth headers should be sent with cross-site requests.\"\n labelWidth={LABEL_WIDTH}\n >\n <InlineSwitch\n id=\"http-settings-with-credentials\"\n value={dataSourceConfig.withCredentials}\n onChange={(event) => {\n onSettingsChange({ withCredentials: event!.currentTarget.checked });\n }}\n />\n </InlineField>\n </div>\n\n {azureAuthSettings?.azureAuthSupported && (\n <div className=\"gf-form-inline\">\n <InlineField\n label=\"Azure Authentication\"\n tooltip=\"Use Azure authentication for Azure endpoint.\"\n labelWidth={LABEL_WIDTH}\n >\n <InlineSwitch\n id=\"http-settings-azure-auth\"\n value={azureAuthEnabled}\n onChange={(event) => {\n onSettingsChange(\n azureAuthSettings.setAzureAuthEnabled(dataSourceConfig, event!.currentTarget.checked)\n );\n }}\n />\n </InlineField>\n </div>\n )}\n\n {sigV4AuthToggleEnabled && (\n <div className=\"gf-form-inline\">\n <InlineField label=\"SigV4 auth\" labelWidth={LABEL_WIDTH}>\n <InlineSwitch\n id=\"http-settings-sigv4-auth\"\n value={dataSourceConfig.jsonData.sigV4Auth || false}\n onChange={(event) => {\n onSettingsChange({\n jsonData: { ...dataSourceConfig.jsonData, sigV4Auth: event!.currentTarget.checked },\n });\n }}\n />\n </InlineField>\n </div>\n )}\n\n {dataSourceConfig.access === 'proxy' && (\n <HttpProxySettings\n dataSourceConfig={dataSourceConfig}\n onChange={(jsonData) => onSettingsChange({ jsonData })}\n showForwardOAuthIdentityOption={showForwardOAuthIdentityOption}\n />\n )}\n </div>\n {dataSourceConfig.basicAuth && (\n <>\n <h6>Basic Auth Details</h6>\n <div className=\"gf-form-group\">\n <BasicAuthSettings {...props} />\n </div>\n </>\n )}\n\n {azureAuthSettings?.azureAuthSupported && azureAuthEnabled && azureAuthSettings.azureSettingsUI && (\n <azureAuthSettings.azureSettingsUI dataSourceConfig={dataSourceConfig} onChange={onChange} />\n )}\n\n {dataSourceConfig.jsonData.sigV4Auth && sigV4AuthToggleEnabled && renderSigV4Editor}\n {(dataSourceConfig.jsonData.tlsAuth || dataSourceConfig.jsonData.tlsAuthWithCACert) && (\n <TLSAuthSettings dataSourceConfig={dataSourceConfig} onChange={onChange} />\n )}\n\n {dataSourceConfig.access === 'proxy' && (\n <CustomHeadersSettings dataSourceConfig={dataSourceConfig} onChange={onChange} />\n )}\n </>\n </div>\n );\n};\n","import React, { useMemo } from 'react';\n\nimport { DataSourceInstanceSettings, DataSourceJsonData, DataSourcePluginOptionsEditorProps } from '@grafana/data';\n\nimport { InlineSwitch } from '../../components/Switch/Switch';\nimport { InlineField } from '../Forms/InlineField';\nimport { InlineFieldRow } from '../Forms/InlineFieldRow';\nimport { Select } from '../Select/Select';\n\ninterface Props<T> extends Pick<DataSourcePluginOptionsEditorProps<T>, 'options' | 'onOptionsChange'> {\n alertmanagerDataSources: Array<DataSourceInstanceSettings<DataSourceJsonData>>;\n}\n\ninterface AlertingConfig extends DataSourceJsonData {\n manageAlerts?: boolean;\n}\n\nexport function AlertingSettings<T extends AlertingConfig>({\n alertmanagerDataSources,\n options,\n onOptionsChange,\n}: Props<T>): JSX.Element {\n const alertmanagerOptions = useMemo(\n () =>\n alertmanagerDataSources.map((ds) => ({\n label: ds.name,\n value: ds.uid,\n imgUrl: ds.meta.info.logos.small,\n meta: ds.meta,\n })),\n [alertmanagerDataSources]\n );\n\n return (\n <>\n <h3 className=\"page-heading\">Alerting</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <InlineField labelWidth={26} label=\"Manage alerts via Alerting UI\">\n <InlineSwitch\n value={options.jsonData.manageAlerts !== false}\n onChange={(event) =>\n onOptionsChange({\n ...options,\n jsonData: { ...options.jsonData, manageAlerts: event!.currentTarget.checked },\n })\n }\n />\n </InlineField>\n </div>\n </div>\n <InlineFieldRow>\n <InlineField\n tooltip=\"The alertmanager that manages alerts for this data source\"\n label=\"Alertmanager data source\"\n labelWidth={26}\n >\n <Select\n width={29}\n options={alertmanagerOptions}\n onChange={(value) =>\n onOptionsChange({ ...options, jsonData: { ...options.jsonData, alertmanagerUid: value?.value } })\n }\n value={options.jsonData.alertmanagerUid}\n />\n </InlineField>\n </InlineFieldRow>\n </div>\n </>\n );\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nexport const getSegmentStyles = (theme: GrafanaTheme) => {\n return {\n segment: css`\n cursor: pointer;\n width: auto;\n `,\n\n queryPlaceholder: css`\n color: ${theme.palette.gray2};\n `,\n\n disabled: css`\n cursor: not-allowed;\n opacity: 0.65;\n box-shadow: none;\n `,\n };\n};\n","import { cx } from '@emotion/css';\nimport { isObject } from 'lodash';\nimport React, { HTMLProps } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { useStyles } from '../../themes';\nimport { InlineLabel } from '../Forms/InlineLabel';\n\nimport { getSegmentStyles } from './styles';\n\nimport { SegmentSelect, useExpandableLabel, SegmentProps } from './';\n\nexport interface SegmentSyncProps<T> extends SegmentProps<T>, Omit<HTMLProps<HTMLDivElement>, 'value' | 'onChange'> {\n value?: T | SelectableValue<T>;\n onChange: (item: SelectableValue<T>) => void;\n options: Array<SelectableValue<T>>;\n inputMinWidth?: number;\n}\n\nexport function Segment<T>({\n options,\n value,\n onChange,\n Component,\n className,\n allowCustomValue,\n allowEmptyValue,\n placeholder,\n disabled,\n inputMinWidth,\n inputPlaceholder,\n onExpandedChange,\n autofocus = false,\n ...rest\n}: React.PropsWithChildren<SegmentSyncProps<T>>) {\n const [Label, labelWidth, expanded, setExpanded] = useExpandableLabel(autofocus, onExpandedChange);\n const width = inputMinWidth ? Math.max(inputMinWidth, labelWidth) : labelWidth;\n const styles = useStyles(getSegmentStyles);\n\n if (!expanded) {\n const label = isObject(value) ? value.label : value;\n\n return (\n <Label\n disabled={disabled}\n Component={\n Component || (\n <InlineLabel\n className={cx(\n styles.segment,\n {\n [styles.queryPlaceholder]: placeholder !== undefined && !value,\n [styles.disabled]: disabled,\n },\n className\n )}\n >\n {label || placeholder}\n </InlineLabel>\n )\n }\n />\n );\n }\n\n return (\n <SegmentSelect\n {...rest}\n value={value && !isObject(value) ? { value } : value}\n placeholder={inputPlaceholder}\n options={options}\n width={width}\n onClickOutside={() => setExpanded(false)}\n allowCustomValue={allowCustomValue}\n allowEmptyValue={allowEmptyValue}\n onChange={(item) => {\n setExpanded(false);\n onChange(item);\n }}\n />\n );\n}\n","import React, { HTMLProps, useRef } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { AsyncSelect, Select } from '../Select/Select';\n\n/** @internal\n * Should be used only internally by Segment/SegmentAsync which can guarantee that SegmentSelect is hidden\n * when a value is selected. See comment below on closeMenuOnSelect()\n */\nexport interface Props<T> extends Omit<HTMLProps<HTMLDivElement>, 'value' | 'onChange'> {\n value?: SelectableValue<T>;\n options: Array<SelectableValue<T>>;\n onChange: (item: SelectableValue<T>) => void;\n /**\n * If provided - AsyncSelect will be used allowing to reload options when the value in the input changes\n */\n loadOptions?: (inputValue: string) => Promise<Array<SelectableValue<T>>>;\n onClickOutside: () => void;\n width: number;\n noOptionsMessage?: string;\n allowCustomValue?: boolean;\n /**\n * If true, empty value will be passed to onChange callback otherwise using empty value\n * will work as canceling and using the previous value\n */\n allowEmptyValue?: boolean;\n placeholder?: string;\n}\n\n/** @internal */\nexport function SegmentSelect<T>({\n value,\n placeholder = '',\n options = [],\n onChange,\n onClickOutside,\n loadOptions = undefined,\n width: widthPixels,\n noOptionsMessage = '',\n allowCustomValue = false,\n allowEmptyValue = false,\n ...rest\n}: React.PropsWithChildren<Props<T>>) {\n const ref = useRef<HTMLDivElement>(null);\n const theme = useTheme2();\n\n let width = widthPixels > 0 ? widthPixels / theme.spacing.gridSize : undefined;\n\n let Component;\n let asyncOptions = {};\n if (loadOptions) {\n Component = AsyncSelect;\n asyncOptions = { loadOptions, defaultOptions: true };\n } else {\n Component = Select;\n }\n\n return (\n <div {...rest} ref={ref}>\n <Component\n width={width}\n noOptionsMessage={noOptionsMessage}\n placeholder={placeholder}\n autoFocus={true}\n isOpen={true}\n onChange={onChange}\n options={options}\n value={value}\n // Disable \"close menu on select\" option to avoid calling onChange() in onCloseMenu() when a value is selected.\n // Once the value is selected the Select component (with the menu) will be hidden anyway by the parent component:\n // Segment or SegmentAsync - hence setting this option has no UX effect.\n closeMenuOnSelect={false}\n onCloseMenu={() => {\n if (ref && ref.current) {\n // https://github.com/JedWatson/react-select/issues/188#issuecomment-279240292\n // Unfortunately there's no other way of retrieving the value (not yet) created new option\n const input = ref.current.querySelector('input[id^=\"react-select-\"]') as HTMLInputElement;\n if (input && (input.value || allowEmptyValue)) {\n onChange({ value: input.value as any, label: input.value });\n } else {\n onClickOutside();\n }\n }\n }}\n allowCustomValue={allowCustomValue}\n {...asyncOptions}\n />\n </div>\n );\n}\n","import { cx } from '@emotion/css';\nimport { isObject } from 'lodash';\nimport React, { HTMLProps } from 'react';\nimport { useAsyncFn } from 'react-use';\nimport { AsyncState } from 'react-use/lib/useAsync';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { useStyles } from '../../themes';\nimport { InlineLabel } from '../Forms/InlineLabel';\n\nimport { SegmentSelect } from './SegmentSelect';\nimport { getSegmentStyles } from './styles';\n\nimport { useExpandableLabel, SegmentProps } from '.';\n\nexport interface SegmentAsyncProps<T> extends SegmentProps<T>, Omit<HTMLProps<HTMLDivElement>, 'value' | 'onChange'> {\n value?: T | SelectableValue<T>;\n loadOptions: (query?: string) => Promise<Array<SelectableValue<T>>>;\n /**\n * If true options will be reloaded when user changes the value in the input,\n * otherwise, options will be loaded when the segment is clicked\n */\n reloadOptionsOnChange?: boolean;\n onChange: (item: SelectableValue<T>) => void;\n noOptionMessageHandler?: (state: AsyncState<Array<SelectableValue<T>>>) => string;\n inputMinWidth?: number;\n}\n\nexport function SegmentAsync<T>({\n value,\n onChange,\n loadOptions,\n reloadOptionsOnChange = false,\n Component,\n className,\n allowCustomValue,\n allowEmptyValue,\n disabled,\n placeholder,\n inputMinWidth,\n inputPlaceholder,\n autofocus = false,\n onExpandedChange,\n noOptionMessageHandler = mapStateToNoOptionsMessage,\n ...rest\n}: React.PropsWithChildren<SegmentAsyncProps<T>>) {\n const [state, fetchOptions] = useAsyncFn(loadOptions, [loadOptions]);\n const [Label, labelWidth, expanded, setExpanded] = useExpandableLabel(autofocus, onExpandedChange);\n const width = inputMinWidth ? Math.max(inputMinWidth, labelWidth) : labelWidth;\n const styles = useStyles(getSegmentStyles);\n\n if (!expanded) {\n const label = isObject(value) ? value.label : value;\n\n return (\n <Label\n onClick={reloadOptionsOnChange ? undefined : fetchOptions}\n disabled={disabled}\n Component={\n Component || (\n <InlineLabel\n className={cx(\n styles.segment,\n {\n [styles.queryPlaceholder]: placeholder !== undefined && !value,\n [styles.disabled]: disabled,\n },\n className\n )}\n >\n {label || placeholder}\n </InlineLabel>\n )\n }\n />\n );\n }\n\n return (\n <SegmentSelect\n {...rest}\n value={value && !isObject(value) ? { value } : value}\n placeholder={inputPlaceholder}\n options={state.value ?? []}\n loadOptions={reloadOptionsOnChange ? fetchOptions : undefined}\n width={width}\n noOptionsMessage={noOptionMessageHandler(state)}\n allowCustomValue={allowCustomValue}\n allowEmptyValue={allowEmptyValue}\n onClickOutside={() => {\n setExpanded(false);\n }}\n onChange={(item) => {\n setExpanded(false);\n onChange(item);\n }}\n />\n );\n}\n\nfunction mapStateToNoOptionsMessage<T>(state: AsyncState<Array<SelectableValue<T>>>): string {\n if (state.loading) {\n return 'Loading options...';\n }\n\n if (state.error) {\n return 'Failed to load options';\n }\n\n if (!Array.isArray(state.value) || state.value.length === 0) {\n return 'No options found';\n }\n\n return '';\n}\n","import { cx, css } from '@emotion/css';\nimport React, { HTMLProps, useRef, useState } from 'react';\nimport useClickAway from 'react-use/lib/useClickAway';\n\nimport { useStyles } from '../../themes';\nimport { measureText } from '../../utils/measureText';\nimport { InlineLabel } from '../Forms/InlineLabel';\n\nimport { getSegmentStyles } from './styles';\n\nimport { useExpandableLabel, SegmentProps } from '.';\n\nexport interface SegmentInputProps<T> extends SegmentProps<T>, Omit<HTMLProps<HTMLInputElement>, 'value' | 'onChange'> {\n value: string | number;\n onChange: (text: string | number) => void;\n}\n\nconst FONT_SIZE = 14;\n\nexport function SegmentInput<T>({\n value: initialValue,\n onChange,\n Component,\n className,\n placeholder,\n inputPlaceholder,\n disabled,\n autofocus = false,\n onExpandedChange,\n ...rest\n}: React.PropsWithChildren<SegmentInputProps<T>>) {\n const ref = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState<number | string>(initialValue);\n const [inputWidth, setInputWidth] = useState<number>(measureText((initialValue || '').toString(), FONT_SIZE).width);\n const [Label, , expanded, setExpanded] = useExpandableLabel(autofocus, onExpandedChange);\n const styles = useStyles(getSegmentStyles);\n\n useClickAway(ref, () => {\n setExpanded(false);\n onChange(value);\n });\n\n if (!expanded) {\n return (\n <Label\n disabled={disabled}\n Component={\n Component || (\n <InlineLabel\n className={cx(\n styles.segment,\n {\n [styles.queryPlaceholder]: placeholder !== undefined && !value,\n [styles.disabled]: disabled,\n },\n className\n )}\n >\n {initialValue || placeholder}\n </InlineLabel>\n )\n }\n />\n );\n }\n\n const inputWidthStyle = css`\n width: ${Math.max(inputWidth + 20, 32)}px;\n `;\n\n return (\n <input\n {...rest}\n ref={ref}\n autoFocus\n className={cx(`gf-form gf-form-input`, inputWidthStyle)}\n value={value}\n placeholder={inputPlaceholder}\n onChange={(item) => {\n const { width } = measureText(item.target.value, FONT_SIZE);\n setInputWidth(width);\n setValue(item.target.value);\n }}\n onBlur={() => {\n setExpanded(false);\n onChange(value);\n }}\n onKeyDown={(e) => {\n if ([13, 27].includes(e.keyCode)) {\n setExpanded(false);\n onChange(value);\n }\n }}\n />\n );\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { InlineFieldRow } from '../Forms/InlineFieldRow';\nimport { InlineLabel } from '../Forms/InlineLabel';\n\n/**\n * Horizontal section for editor components.\n *\n * @alpha\n */\nexport const SegmentSection = ({\n label,\n htmlFor,\n children,\n fill,\n}: {\n // Name of the section\n label: string;\n // htmlFor for the label\n htmlFor?: string;\n // List of components in the section\n children: React.ReactNode;\n // Fill the space at the end\n fill?: boolean;\n}) => {\n const styles = useStyles2(getStyles);\n return (\n <>\n <InlineFieldRow>\n <InlineLabel htmlFor={htmlFor} width={12} className={styles.label}>\n {label}\n </InlineLabel>\n {children}\n {fill && (\n <div className={styles.fill}>\n <InlineLabel>{''}</InlineLabel>\n </div>\n )}\n </InlineFieldRow>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n label: css`\n color: ${theme.colors.primary.text};\n `,\n fill: css`\n flex-grow: 1;\n margin-bottom: ${theme.spacing(0.5)};\n `,\n});\n","import React, { useState, useRef, ReactElement } from 'react';\n\ninterface LabelProps {\n Component: ReactElement;\n onClick?: () => void;\n disabled?: boolean;\n}\n\nexport const useExpandableLabel = (\n initialExpanded: boolean,\n onExpandedChange?: (expanded: boolean) => void\n): [React.ComponentType<LabelProps>, number, boolean, (expanded: boolean) => void] => {\n const ref = useRef<HTMLDivElement>(null);\n const [expanded, setExpanded] = useState<boolean>(initialExpanded);\n const [width, setWidth] = useState(0);\n\n const setExpandedWrapper = (expanded: boolean) => {\n setExpanded(expanded);\n if (onExpandedChange) {\n onExpandedChange(expanded);\n }\n };\n\n const Label: React.FC<LabelProps> = ({ Component, onClick, disabled }) => (\n <div\n ref={ref}\n onClick={\n disabled\n ? undefined\n : () => {\n setExpandedWrapper(true);\n if (ref && ref.current) {\n setWidth(ref.current.clientWidth * 1.25);\n }\n if (onClick) {\n onClick();\n }\n }\n }\n >\n {Component}\n </div>\n );\n\n return [Label, width, expanded, setExpandedWrapper];\n};\n","import { css } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport RcDrawer from 'rc-drawer';\nimport React, { CSSProperties, ReactNode, useState, useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2 } from '../../themes';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { IconButton } from '../IconButton/IconButton';\n\nexport interface Props {\n children: ReactNode;\n /** Title shown at the top of the drawer */\n title?: ReactNode;\n /** Subtitle shown below the title */\n subtitle?: ReactNode;\n /** Should the Drawer be closable by clicking on the mask, defaults to true */\n closeOnMaskClick?: boolean;\n /** Render the drawer inside a container on the page */\n inline?: boolean;\n /** Either a number in px or a string with unit postfix */\n width?: number | string;\n /** Should the Drawer be expandable to full width */\n expandable?: boolean;\n /** Tabs */\n tabs?: React.ReactNode;\n /** Set to true if the component rendered within in drawer content has its own scroll */\n scrollableContent?: boolean;\n /** Callback for closing the drawer */\n onClose: () => void;\n}\n\nexport function Drawer({\n children,\n inline = false,\n onClose,\n closeOnMaskClick = true,\n scrollableContent = false,\n title,\n subtitle,\n width = '40%',\n expandable = false,\n tabs,\n}: Props) {\n const drawerStyles = useStyles2(getStyles);\n const [isExpanded, setIsExpanded] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n const currentWidth = isExpanded ? '100%' : width;\n const overlayRef = React.useRef(null);\n const { dialogProps, titleProps } = useDialog({}, overlayRef);\n const { overlayProps } = useOverlay(\n {\n isDismissable: false,\n isOpen,\n onClose,\n },\n overlayRef\n );\n\n // RcDrawer v4.x needs to be mounted in advance for animations to play.\n useEffect(() => {\n setIsOpen(true);\n }, []);\n\n const content = <div className={drawerStyles.content}>{children}</div>;\n\n return (\n <RcDrawer\n level={null}\n handler={false}\n open={isOpen}\n onClose={onClose}\n maskClosable={closeOnMaskClick}\n placement=\"right\"\n width={currentWidth}\n getContainer={inline ? undefined : 'body'}\n style={{ position: `${inline && 'absolute'}` } as CSSProperties}\n className={drawerStyles.drawer}\n aria-label={\n typeof title === 'string'\n ? selectors.components.Drawer.General.title(title)\n : selectors.components.Drawer.General.title('no title')\n }\n >\n <FocusScope restoreFocus contain autoFocus>\n <div className={drawerStyles.container} {...overlayProps} {...dialogProps} ref={overlayRef}>\n {typeof title === 'string' && (\n <div className={drawerStyles.header}>\n <div className={drawerStyles.actions}>\n {expandable && !isExpanded && (\n <IconButton\n name=\"angle-left\"\n size=\"xl\"\n onClick={() => setIsExpanded(true)}\n aria-label={selectors.components.Drawer.General.expand}\n />\n )}\n {expandable && isExpanded && (\n <IconButton\n name=\"angle-right\"\n size=\"xl\"\n onClick={() => setIsExpanded(false)}\n aria-label={selectors.components.Drawer.General.contract}\n />\n )}\n <IconButton\n name=\"times\"\n size=\"xl\"\n onClick={onClose}\n aria-label={selectors.components.Drawer.General.close}\n />\n </div>\n <div className={drawerStyles.titleWrapper}>\n <h3 {...titleProps}>{title}</h3>\n {typeof subtitle === 'string' && <div className=\"muted\">{subtitle}</div>}\n {typeof subtitle !== 'string' && subtitle}\n {tabs && <div className={drawerStyles.tabsWrapper}>{tabs}</div>}\n </div>\n </div>\n )}\n {typeof title !== 'string' && title}\n <div className={drawerStyles.contentScroll}>\n {!scrollableContent ? content : <CustomScrollbar autoHeightMin=\"100%\">{content}</CustomScrollbar>}\n </div>\n </div>\n </FocusScope>\n </RcDrawer>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n flex: 1 1 0;\n `,\n drawer: css`\n .drawer-content {\n background-color: ${theme.colors.background.primary};\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n &.drawer-open .drawer-mask {\n background-color: ${theme.components.overlay.background};\n backdrop-filter: blur(1px);\n opacity: 1;\n }\n .drawer-mask {\n background-color: ${theme.components.overlay.background};\n backdrop-filter: blur(1px);\n }\n .drawer-open .drawer-content-wrapper {\n box-shadow: ${theme.shadows.z3};\n }\n z-index: ${theme.zIndex.dropdown};\n `,\n header: css`\n background-color: ${theme.colors.background.canvas};\n flex-grow: 0;\n padding-top: ${theme.spacing(0.5)};\n `,\n actions: css`\n display: flex;\n align-items: baseline;\n justify-content: flex-end;\n `,\n titleWrapper: css`\n margin-bottom: ${theme.spacing(3)};\n padding: ${theme.spacing(0, 1, 0, 3)};\n overflow-wrap: break-word;\n `,\n content: css({\n padding: theme.spacing(2),\n height: '100%',\n flexGrow: 1,\n }),\n contentScroll: css({\n minHeight: 0,\n flex: 1,\n }),\n tabsWrapper: css({\n paddingLeft: theme.spacing(2),\n margin: theme.spacing(3, -1, -3, -3),\n }),\n };\n};\n","import { cx } from '@emotion/css';\nimport { Global } from '@emotion/react';\nimport SliderComponent from 'rc-slider';\nimport React, { useState, useCallback, ChangeEvent, FunctionComponent, FocusEvent } from 'react';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { Input } from '../Input/Input';\n\nimport { getStyles } from './styles';\nimport { SliderProps } from './types';\n\n/**\n * @public\n */\nexport const Slider: FunctionComponent<SliderProps> = ({\n min,\n max,\n onChange,\n onAfterChange,\n orientation = 'horizontal',\n reverse,\n step,\n value,\n ariaLabelForHandle,\n marks,\n included,\n}) => {\n const isHorizontal = orientation === 'horizontal';\n const theme = useTheme2();\n const styles = getStyles(theme, isHorizontal, Boolean(marks));\n const SliderWithTooltip = SliderComponent;\n const [sliderValue, setSliderValue] = useState<number>(value ?? min);\n\n const onSliderChange = useCallback(\n (v: number) => {\n setSliderValue(v);\n\n if (onChange) {\n onChange(v);\n }\n },\n [setSliderValue, onChange]\n );\n\n const onSliderInputChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n let v = +e.target.value;\n\n if (Number.isNaN(v)) {\n v = 0;\n }\n\n setSliderValue(v);\n\n if (onChange) {\n onChange(v);\n }\n\n if (onAfterChange) {\n onAfterChange(v);\n }\n },\n [onChange, onAfterChange]\n );\n\n // Check for min/max on input blur so user is able to enter\n // custom values that might seem above/below min/max on first keystroke\n const onSliderInputBlur = useCallback(\n (e: FocusEvent<HTMLInputElement>) => {\n const v = +e.target.value;\n\n if (v > max) {\n setSliderValue(max);\n } else if (v < min) {\n setSliderValue(min);\n }\n },\n [max, min]\n );\n\n const sliderInputClassNames = !isHorizontal ? [styles.sliderInputVertical] : [];\n const sliderInputFieldClassNames = !isHorizontal ? [styles.sliderInputFieldVertical] : [];\n\n return (\n <div className={cx(styles.container, styles.slider)}>\n {/** Slider tooltip's parent component is body and therefore we need Global component to do css overrides for it. */}\n <Global styles={styles.tooltip} />\n <label className={cx(styles.sliderInput, ...sliderInputClassNames)}>\n <SliderWithTooltip\n min={min}\n max={max}\n step={step}\n defaultValue={value}\n value={sliderValue}\n onChange={onSliderChange}\n onAfterChange={onAfterChange}\n vertical={!isHorizontal}\n reverse={reverse}\n ariaLabelForHandle={ariaLabelForHandle}\n marks={marks}\n included={included}\n />\n {/* Uses text input so that the number spinners are not shown */}\n <Input\n type=\"text\"\n className={cx(styles.sliderInputField, ...sliderInputFieldClassNames)}\n value={`${sliderValue}`} // to fix the react leading zero issue\n onChange={onSliderInputChange}\n onBlur={onSliderInputBlur}\n min={min}\n max={max}\n />\n </label>\n </div>\n );\n};\n\nSlider.displayName = 'Slider';\n","import { cx } from '@emotion/css';\nimport { Global } from '@emotion/react';\nimport { Range as RangeComponent, createSliderWithTooltip } from 'rc-slider';\nimport React, { FunctionComponent } from 'react';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\n\nimport { getStyles } from './styles';\nimport { RangeSliderProps } from './types';\n\n/**\n * @public\n *\n * RichHistoryQueriesTab uses this Range Component\n */\nexport const RangeSlider: FunctionComponent<RangeSliderProps> = ({\n min,\n max,\n onChange,\n onAfterChange,\n orientation = 'horizontal',\n reverse,\n step,\n formatTooltipResult,\n value,\n tooltipAlwaysVisible = true,\n}) => {\n const isHorizontal = orientation === 'horizontal';\n const theme = useTheme2();\n const styles = getStyles(theme, isHorizontal);\n const RangeWithTooltip = createSliderWithTooltip(RangeComponent);\n return (\n <div className={cx(styles.container, styles.slider)}>\n {/** Slider tooltip's parent component is body and therefore we need Global component to do css overrides for it. */}\n <Global styles={styles.tooltip} />\n <RangeWithTooltip\n tipProps={{\n visible: tooltipAlwaysVisible,\n placement: isHorizontal ? 'top' : 'right',\n }}\n min={min}\n max={max}\n step={step}\n defaultValue={value}\n tipFormatter={(value: number) => (formatTooltipResult ? formatTooltipResult(value) : value)}\n onChange={onChange}\n onAfterChange={onAfterChange}\n vertical={!isHorizontal}\n reverse={reverse}\n />\n </div>\n );\n};\n\nRangeSlider.displayName = 'Range';\n","import { css } from '@emotion/css';\nimport React, { HTMLProps, useEffect } from 'react';\nimport { useForm, Mode, DeepPartial, UnpackNestedValue, SubmitHandler } from 'react-hook-form';\n\nimport { FormAPI } from '../../types';\n\ninterface FormProps<T> extends Omit<HTMLProps<HTMLFormElement>, 'onSubmit'> {\n validateOn?: Mode;\n validateOnMount?: boolean;\n validateFieldsOnMount?: string | string[];\n defaultValues?: UnpackNestedValue<DeepPartial<T>>;\n onSubmit: SubmitHandler<T>;\n children: (api: FormAPI<T>) => React.ReactNode;\n /** Sets max-width for container. Use it instead of setting individual widths on inputs.*/\n maxWidth?: number | 'none';\n}\n\nexport function Form<T>({\n defaultValues,\n onSubmit,\n validateOnMount = false,\n validateFieldsOnMount,\n children,\n validateOn = 'onSubmit',\n maxWidth = 600,\n ...htmlProps\n}: FormProps<T>) {\n const { handleSubmit, trigger, formState, ...rest } = useForm<T>({\n mode: validateOn,\n defaultValues,\n });\n\n useEffect(() => {\n if (validateOnMount) {\n //@ts-expect-error\n trigger(validateFieldsOnMount);\n }\n }, [trigger, validateFieldsOnMount, validateOnMount]);\n\n return (\n <form\n className={css`\n max-width: ${maxWidth !== 'none' ? maxWidth + 'px' : maxWidth};\n width: 100%;\n `}\n onSubmit={handleSubmit(onSubmit)}\n {...htmlProps}\n >\n {children({ errors: formState.errors, formState, ...rest })}\n </form>\n );\n}\n","/**\n * Rollup does not support renamed exports so do not change this to export { Controller as InputControl } ...\n */\nimport { Controller } from 'react-hook-form';\nexport const InputControl = Controller;\n","import React, { useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useTheme2 } from '../../themes';\nimport { IconName } from '../../types';\nimport { ComponentSize } from '../../types/size';\nimport { Button, ButtonVariant } from '../Button';\nimport { Select } from '../Select/Select';\n\nexport interface ValuePickerProps<T> {\n /** Label to display on the picker button */\n label: string;\n /** Icon to display on the picker button */\n icon?: IconName;\n /** ValuePicker options */\n options: Array<SelectableValue<T>>;\n /** Callback to handle selected option */\n onChange: (value: SelectableValue<T>) => void;\n /** Which ButtonVariant to render */\n variant?: ButtonVariant;\n /** Size of button */\n size?: ComponentSize;\n /** Min width for select in grid units */\n minWidth?: number;\n /** Should the picker cover the full width of its parent */\n isFullWidth?: boolean;\n /** Control where the menu is rendered */\n menuPlacement?: 'auto' | 'bottom' | 'top';\n}\n\nexport function ValuePicker<T>({\n label,\n icon,\n options,\n onChange,\n variant,\n minWidth = 16,\n size = 'sm',\n isFullWidth = true,\n menuPlacement,\n}: ValuePickerProps<T>) {\n const [isPicking, setIsPicking] = useState(false);\n const theme = useTheme2();\n\n return (\n <>\n {!isPicking && (\n <Button\n size={size || 'sm'}\n icon={icon || 'plus'}\n onClick={() => setIsPicking(true)}\n variant={variant}\n fullWidth={isFullWidth}\n aria-label={selectors.components.ValuePicker.button(label)}\n >\n {label}\n </Button>\n )}\n\n {isPicking && (\n <span style={{ minWidth: theme.spacing(minWidth), flexGrow: isFullWidth ? 1 : undefined }}>\n <Select\n placeholder={label}\n options={options}\n aria-label={selectors.components.ValuePicker.select(label)}\n isOpen\n onCloseMenu={() => setIsPicking(false)}\n autoFocus={true}\n onChange={(value) => {\n setIsPicking(false);\n onChange(value);\n }}\n menuPlacement={menuPlacement}\n />\n </span>\n )}\n </>\n );\n}\n","import React, { memo, useCallback } from 'react';\n\nimport { FieldMatcherID, fieldMatchers } from '@grafana/data';\n\nimport { Input } from '../Input/Input';\n\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\n\nexport const FieldNameByRegexMatcherEditor = memo<MatcherUIProps<string>>((props) => {\n const { options, onChange } = props;\n\n const onBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n return onChange(e.target.value);\n },\n [onChange]\n );\n\n return <Input placeholder=\"Enter regular expression\" defaultValue={options} onBlur={onBlur} />;\n});\nFieldNameByRegexMatcherEditor.displayName = 'FieldNameByRegexMatcherEditor';\n\nexport const fieldNameByRegexMatcherItem: FieldMatcherUIRegistryItem<string> = {\n id: FieldMatcherID.byRegexp,\n component: FieldNameByRegexMatcherEditor,\n matcher: fieldMatchers.get(FieldMatcherID.byRegexp),\n name: 'Fields with name matching regex',\n description: 'Set properties for fields with names matching a regex',\n optionsToLabel: (options) => options,\n};\n","import React, { memo, useCallback } from 'react';\n\nimport { FieldMatcherID, fieldMatchers, SelectableValue } from '@grafana/data';\n\nimport { Select } from '../Select/Select';\n\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { useFieldDisplayNames, useSelectOptions, frameHasName } from './utils';\n\nexport const FieldNameMatcherEditor = memo<MatcherUIProps<string>>((props) => {\n const { data, options, onChange: onChangeFromProps, id } = props;\n const names = useFieldDisplayNames(data);\n const selectOptions = useSelectOptions(names, options);\n\n const onChange = useCallback(\n (selection: SelectableValue<string>) => {\n if (!frameHasName(selection.value, names)) {\n return;\n }\n return onChangeFromProps(selection.value!);\n },\n [names, onChangeFromProps]\n );\n\n const selectedOption = selectOptions.find((v) => v.value === options);\n return <Select value={selectedOption} options={selectOptions} onChange={onChange} inputId={id} />;\n});\nFieldNameMatcherEditor.displayName = 'FieldNameMatcherEditor';\n\nexport const fieldNameMatcherItem: FieldMatcherUIRegistryItem<string> = {\n id: FieldMatcherID.byName,\n component: FieldNameMatcherEditor,\n matcher: fieldMatchers.get(FieldMatcherID.byName),\n name: 'Fields with name',\n description: 'Set properties for a specific field',\n optionsToLabel: (options) => options,\n};\n","import React, { memo, useCallback } from 'react';\n\nimport { FieldMatcherID, fieldMatchers, SelectableValue, ByNamesMatcherOptions } from '@grafana/data';\n\nimport { Input } from '../Input/Input';\nimport { MultiSelect } from '../Select/Select';\n\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { useFieldDisplayNames, useSelectOptions, frameHasName } from './utils';\n\nexport const FieldNamesMatcherEditor = memo<MatcherUIProps<ByNamesMatcherOptions>>((props) => {\n const { data, options, onChange: onChangeFromProps } = props;\n const { readOnly, prefix } = options;\n const names = useFieldDisplayNames(data);\n const selectOptions = useSelectOptions(names, undefined);\n\n const onChange = useCallback(\n (selections: Array<SelectableValue<string>>) => {\n if (!Array.isArray(selections)) {\n return;\n }\n\n return onChangeFromProps({\n ...options,\n names: selections.reduce((all: string[], current) => {\n if (!frameHasName(current.value, names)) {\n return all;\n }\n all.push(current.value!);\n return all;\n }, []),\n });\n },\n [names, onChangeFromProps, options]\n );\n\n if (readOnly) {\n const displayNames = (options.names ?? []).join(', ');\n return <Input value={displayNames} readOnly={true} disabled={true} prefix={prefix} />;\n }\n\n return <MultiSelect value={options.names} options={selectOptions} onChange={onChange} />;\n});\nFieldNamesMatcherEditor.displayName = 'FieldNameMatcherEditor';\n\nexport const fieldNamesMatcherItem: FieldMatcherUIRegistryItem<ByNamesMatcherOptions> = {\n id: FieldMatcherID.byNames,\n component: FieldNamesMatcherEditor,\n matcher: fieldMatchers.get(FieldMatcherID.byNames),\n name: 'Fields with name',\n description: 'Set properties for a specific field',\n optionsToLabel: (options) => (options.names ?? []).join(', '),\n excludeFromPicker: true,\n};\n","import React, { memo, useMemo, useCallback } from 'react';\n\nimport { FieldMatcherID, fieldMatchers, SelectableValue, FieldType, DataFrame } from '@grafana/data';\n\nimport { Select } from '../Select/Select';\n\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\n\nexport const FieldTypeMatcherEditor = memo<MatcherUIProps<string>>((props) => {\n const { data, options, onChange: onChangeFromProps, id } = props;\n const counts = useFieldCounts(data);\n const selectOptions = useSelectOptions(counts, options);\n\n const onChange = useCallback(\n (selection: SelectableValue<string>) => {\n return onChangeFromProps(selection.value!);\n },\n [onChangeFromProps]\n );\n\n const selectedOption = selectOptions.find((v) => v.value === options);\n return <Select inputId={id} value={selectedOption} options={selectOptions} onChange={onChange} />;\n});\nFieldTypeMatcherEditor.displayName = 'FieldTypeMatcherEditor';\n\nconst allTypes: Array<SelectableValue<FieldType>> = [\n { value: FieldType.number, label: 'Numeric' },\n { value: FieldType.string, label: 'String' },\n { value: FieldType.time, label: 'Time' },\n { value: FieldType.boolean, label: 'Boolean' },\n { value: FieldType.trace, label: 'Traces' },\n { value: FieldType.other, label: 'Other' },\n];\n\nconst useFieldCounts = (data: DataFrame[]): Map<FieldType, number> => {\n return useMemo(() => {\n const counts: Map<FieldType, number> = new Map();\n for (const t of allTypes) {\n counts.set(t.value!, 0);\n }\n for (const frame of data) {\n for (const field of frame.fields) {\n const key = field.type || FieldType.other;\n let v = counts.get(key);\n if (!v) {\n v = 0;\n }\n counts.set(key, v + 1);\n }\n }\n return counts;\n }, [data]);\n};\n\nconst useSelectOptions = (counts: Map<string, number>, opt?: string): Array<SelectableValue<string>> => {\n return useMemo(() => {\n let found = false;\n const options: Array<SelectableValue<string>> = [];\n for (const t of allTypes) {\n const count = counts.get(t.value!);\n const match = opt === t.value;\n if (count || match) {\n options.push({\n ...t,\n label: `${t.label} (${counts.get(t.value!)})`,\n });\n }\n if (match) {\n found = true;\n }\n }\n if (opt && !found) {\n options.push({\n value: opt,\n label: `${opt} (No matches)`,\n });\n }\n return options;\n }, [counts, opt]);\n};\n\nexport const fieldTypeMatcherItem: FieldMatcherUIRegistryItem<string> = {\n id: FieldMatcherID.byType,\n component: FieldTypeMatcherEditor,\n matcher: fieldMatchers.get(FieldMatcherID.byType),\n name: 'Fields with type',\n description: 'Set properties for fields of a specific type (number, string, boolean)',\n optionsToLabel: (options) => options,\n};\n","import React, { memo, useMemo, useCallback } from 'react';\n\nimport { FieldMatcherID, fieldMatchers, SelectableValue, DataFrame } from '@grafana/data';\n\nimport { Select } from '../Select/Select';\n\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\n\n/**\n * UI to configure \"fields by frame refId\"-matcher.\n * @public\n */\nexport const FieldsByFrameRefIdMatcher = memo<MatcherUIProps<string>>((props) => {\n const { data, options, onChange: onChangeFromProps } = props;\n const referenceIDs = useFrameRefIds(data);\n const selectOptions = useSelectOptions(referenceIDs);\n\n const onChange = useCallback(\n (selection: SelectableValue<string>) => {\n if (!selection.value || !referenceIDs.has(selection.value)) {\n return;\n }\n return onChangeFromProps(selection.value);\n },\n [referenceIDs, onChangeFromProps]\n );\n\n const selectedOption = selectOptions.find((v) => v.value === options);\n return <Select value={selectedOption} options={selectOptions} onChange={onChange} />;\n});\n\nFieldsByFrameRefIdMatcher.displayName = 'FieldsByFrameRefIdMatcher';\n\n/**\n * Registry item for UI to configure \"fields by frame refId\"-matcher.\n * @public\n */\nexport const fieldsByFrameRefIdItem: FieldMatcherUIRegistryItem<string> = {\n id: FieldMatcherID.byFrameRefID,\n component: FieldsByFrameRefIdMatcher,\n matcher: fieldMatchers.get(FieldMatcherID.byFrameRefID),\n name: 'Fields returned by query',\n description: 'Set properties for fields from a specific query',\n optionsToLabel: (options) => options,\n};\n\nconst useFrameRefIds = (data: DataFrame[]): Set<string> => {\n return useMemo(() => {\n const refIds: Set<string> = new Set();\n\n for (const frame of data) {\n if (frame.refId) {\n refIds.add(frame.refId);\n }\n }\n\n return refIds;\n }, [data]);\n};\n\nconst useSelectOptions = (displayNames: Set<string>): Array<SelectableValue<string>> => {\n return useMemo(() => {\n return Array.from(displayNames).map((n) => ({\n value: n,\n label: n,\n }));\n }, [displayNames]);\n};\n","import { Registry } from '@grafana/data';\n\nimport { fieldNameByRegexMatcherItem } from './FieldNameByRegexMatcherEditor';\nimport { fieldNameMatcherItem } from './FieldNameMatcherEditor';\nimport { fieldNamesMatcherItem } from './FieldNamesMatcherEditor';\nimport { fieldTypeMatcherItem } from './FieldTypeMatcherEditor';\nimport { fieldsByFrameRefIdItem } from './FieldsByFrameRefIdMatcher';\nimport { FieldMatcherUIRegistryItem } from './types';\n\nexport const fieldMatchersUI = new Registry<FieldMatcherUIRegistryItem<any>>(() => [\n fieldNameMatcherItem,\n fieldNameByRegexMatcherItem,\n fieldTypeMatcherItem,\n fieldsByFrameRefIdItem,\n fieldNamesMatcherItem,\n]);\n","import React, { AnchorHTMLAttributes, forwardRef } from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\n\nimport { locationUtil, textUtil } from '@grafana/data';\n\nexport interface Props extends AnchorHTMLAttributes<HTMLAnchorElement> {}\n\n/**\n * @alpha\n */\nexport const Link = forwardRef<HTMLAnchorElement, Props>(({ href, children, ...rest }, ref) => {\n const validUrl = locationUtil.stripBaseFromUrl(textUtil.sanitizeUrl(href ?? ''));\n\n return (\n // @ts-ignore\n <RouterLink ref={ref as React.Ref<HTMLAnchorElement>} to={validUrl} {...rest}>\n {children}\n </RouterLink>\n );\n});\n\nLink.displayName = 'Link';\n","import { css, cx } from '@emotion/css';\nimport React, { ReactNode } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme, stylesFactory } from '../../themes';\n\nexport interface LabelProps extends React.HTMLAttributes<HTMLLegendElement> {\n children: string | ReactNode;\n description?: string;\n}\n\nexport const getLegendStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n legend: css`\n font-size: ${theme.typography.heading.h3};\n font-weight: ${theme.typography.weight.regular};\n margin: 0 0 ${theme.spacing.md} 0;\n `,\n };\n});\n\nexport const Legend: React.FC<LabelProps> = ({ children, className, ...legendProps }) => {\n const theme = useTheme();\n const styles = getLegendStyles(theme);\n\n return (\n <legend className={cx(styles.legend, className)} {...legendProps}>\n {children}\n </legend>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC, HTMLProps } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\n\nimport { Legend } from './Legend';\n\nexport interface Props extends Omit<HTMLProps<HTMLFieldSetElement>, 'label'> {\n children: React.ReactNode[] | React.ReactNode;\n /** Label for the fieldset's legend */\n label?: React.ReactNode;\n}\n\nexport const FieldSet: FC<Props> = ({ label, children, className, ...rest }) => {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <fieldset className={cx(styles.wrapper, className)} {...rest}>\n {label && <Legend>{label}</Legend>}\n {children}\n </fieldset>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n margin-bottom: ${theme.spacing(4)};\n\n &:last-child {\n margin-bottom: 0;\n }\n `,\n };\n});\n","import { cx, css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useTheme } from '../../themes';\n\nexport interface Props {\n grow?: boolean;\n className?: string;\n}\n\n/** @beta */\nexport const InlineSegmentGroup: FC<Props> = ({ children, className, grow, ...htmlProps }) => {\n const theme = useTheme();\n const styles = getStyles(theme, grow);\n\n return (\n <div className={cx(styles.container, className)} {...htmlProps}>\n {children}\n </div>\n );\n};\n\nInlineSegmentGroup.displayName = 'InlineSegmentGroup';\n\nconst getStyles = (theme: GrafanaTheme, grow?: boolean) => {\n return {\n container: css`\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n text-align: left;\n position: relative;\n flex: ${grow ? 1 : 0} 0 auto;\n margin-bottom: ${theme.spacing.xs};\n `,\n };\n};\n","import { FC } from 'react';\nimport { useFieldArray, UseFieldArrayProps } from 'react-hook-form';\n\nimport { FieldArrayApi } from '../../types';\n\nexport interface FieldArrayProps extends UseFieldArrayProps {\n children: (api: FieldArrayApi) => JSX.Element;\n}\n\nexport const FieldArray: FC<FieldArrayProps> = ({ name, control, children, ...rest }) => {\n const { fields, append, prepend, remove, swap, move, insert } = useFieldArray({\n control,\n name,\n ...rest,\n });\n return children({ fields, append, prepend, remove, swap, move, insert });\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { StringSelector } from '@grafana/e2e-selectors';\n\nimport { useTheme2, stylesFactory } from '../../../themes';\nimport { getFocusStyles, getMouseFocusStyles } from '../../../themes/mixins';\nimport { getPropertiesForButtonSize } from '../commonStyles';\n\nexport type RadioButtonSize = 'sm' | 'md';\n\nexport interface RadioButtonProps {\n size?: RadioButtonSize;\n disabled?: boolean;\n name?: string;\n description?: string;\n active: boolean;\n id: string;\n onChange: () => void;\n onClick: () => void;\n fullWidth?: boolean;\n 'aria-label'?: StringSelector;\n children?: React.ReactNode;\n}\n\nexport const RadioButton = React.forwardRef<HTMLInputElement, RadioButtonProps>(\n (\n {\n children,\n active = false,\n disabled = false,\n size = 'md',\n onChange,\n onClick,\n id,\n name = undefined,\n description,\n fullWidth,\n 'aria-label': ariaLabel,\n },\n ref\n ) => {\n const theme = useTheme2();\n const styles = getRadioButtonStyles(theme, size, fullWidth);\n\n return (\n <>\n <input\n type=\"radio\"\n className={styles.radio}\n onChange={onChange}\n onClick={onClick}\n disabled={disabled}\n id={id}\n checked={active}\n name={name}\n aria-label={ariaLabel}\n ref={ref}\n />\n <label className={styles.radioLabel} htmlFor={id} title={description}>\n {children}\n </label>\n </>\n );\n }\n);\n\nRadioButton.displayName = 'RadioButton';\n\nconst getRadioButtonStyles = stylesFactory((theme: GrafanaTheme2, size: RadioButtonSize, fullWidth?: boolean) => {\n const { fontSize, height, padding } = getPropertiesForButtonSize(size, theme);\n\n const textColor = theme.colors.text.secondary;\n const textColorHover = theme.colors.text.primary;\n // remove the group inner padding (set on RadioButtonGroup)\n const labelHeight = height * theme.spacing.gridSize - 4 - 2;\n\n return {\n radio: css`\n position: absolute;\n opacity: 0;\n z-index: -1000;\n\n &:checked + label {\n color: ${theme.colors.text.primary};\n font-weight: ${theme.typography.fontWeightMedium};\n background: ${theme.colors.action.selected};\n z-index: 3;\n }\n\n &:focus + label,\n &:focus-visible + label {\n ${getFocusStyles(theme)};\n }\n\n &:focus:not(:focus-visible) + label {\n ${getMouseFocusStyles(theme)}\n }\n\n &:disabled + label {\n color: ${theme.colors.text.disabled};\n cursor: not-allowed;\n }\n `,\n radioLabel: css`\n display: inline-block;\n position: relative;\n font-size: ${fontSize};\n height: ${labelHeight}px;\n // Deduct border from line-height for perfect vertical centering on windows and linux\n line-height: ${labelHeight}px;\n color: ${textColor};\n padding: ${theme.spacing(0, padding)};\n border-radius: ${theme.shape.borderRadius()};\n background: ${theme.colors.background.primary};\n cursor: pointer;\n z-index: 1;\n flex: ${fullWidth ? `1 0 0` : 'none'};\n text-align: center;\n user-select: none;\n white-space: nowrap;\n\n &:hover {\n color: ${textColorHover};\n }\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\nimport { IconName } from '../../../types/icon';\nimport { Icon } from '../../Icon/Icon';\n\nimport { RadioButtonSize, RadioButton } from './RadioButton';\n\nexport interface RadioButtonGroupProps<T> {\n value?: T;\n id?: string;\n disabled?: boolean;\n disabledOptions?: T[];\n options: Array<SelectableValue<T>>;\n onChange?: (value: T) => void;\n onClick?: (value: T) => void;\n size?: RadioButtonSize;\n fullWidth?: boolean;\n className?: string;\n autoFocus?: boolean;\n}\n\nexport function RadioButtonGroup<T>({\n options,\n value,\n onChange,\n onClick,\n disabled,\n disabledOptions,\n size = 'md',\n id,\n className,\n fullWidth = false,\n autoFocus = false,\n}: RadioButtonGroupProps<T>) {\n const handleOnChange = useCallback(\n (option: SelectableValue) => {\n return () => {\n if (onChange) {\n onChange(option.value);\n }\n };\n },\n [onChange]\n );\n const handleOnClick = useCallback(\n (option: SelectableValue) => {\n return () => {\n if (onClick) {\n onClick(option.value);\n }\n };\n },\n [onClick]\n );\n\n const internalId = id ?? uniqueId('radiogroup-');\n const groupName = useRef(internalId);\n const styles = useStyles2(getStyles);\n\n const activeButtonRef = useRef<HTMLInputElement | null>(null);\n useEffect(() => {\n if (autoFocus && activeButtonRef.current) {\n activeButtonRef.current.focus();\n }\n }, [autoFocus]);\n\n return (\n <div className={cx(styles.radioGroup, fullWidth && styles.fullWidth, className)}>\n {options.map((o, i) => {\n const isItemDisabled = disabledOptions && o.value && disabledOptions.includes(o.value);\n return (\n <RadioButton\n size={size}\n disabled={isItemDisabled || disabled}\n active={value === o.value}\n key={`o.label-${i}`}\n aria-label={o.ariaLabel}\n onChange={handleOnChange(o)}\n onClick={handleOnClick(o)}\n id={`option-${o.value}-${internalId}`}\n name={groupName.current}\n description={o.description}\n fullWidth={fullWidth}\n ref={value === o.value ? activeButtonRef : undefined}\n >\n {o.icon && <Icon name={o.icon as IconName} className={styles.icon} />}\n {o.imgUrl && <img src={o.imgUrl} alt={o.label} className={styles.img} />}\n {o.label} {o.component ? <o.component /> : null}\n </RadioButton>\n );\n })}\n </div>\n );\n}\n\nRadioButtonGroup.displayName = 'RadioButtonGroup';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n radioGroup: css({\n display: 'inline-flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n border: `1px solid ${theme.components.input.borderColor}`,\n borderRadius: theme.shape.borderRadius(),\n padding: '2px',\n }),\n fullWidth: css({\n display: 'flex',\n }),\n icon: css`\n margin-right: 6px;\n `,\n img: css`\n width: ${theme.spacing(2)};\n height: ${theme.spacing(2)};\n margin-right: ${theme.spacing(1)};\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\n\nexport interface RadioButtonDotProps {\n id: string;\n name: string;\n checked?: boolean;\n disabled?: boolean;\n label: React.ReactNode;\n description?: string;\n onChange?: (id: string) => void;\n}\n\nexport const RadioButtonDot = ({ id, name, label, checked, disabled, description, onChange }: RadioButtonDotProps) => {\n const styles = useStyles2(getStyles);\n\n return (\n <label title={description} className={styles.label}>\n <input\n id={id}\n name={name}\n type=\"radio\"\n checked={checked}\n disabled={disabled}\n className={styles.input}\n onChange={() => onChange && onChange(id)}\n />\n {label}\n </label>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n input: css`\n position: relative;\n appearance: none;\n outline: none;\n background-color: ${theme.colors.background.canvas};\n margin: 0;\n width: ${theme.spacing(2)} !important; /* TODO How to overcome this? Checkbox does the same 🙁 */\n height: ${theme.spacing(2)};\n border: 1px solid ${theme.colors.border.medium};\n border-radius: 50%;\n margin: 3px 0; /* Space for box-shadow when focused */\n\n :checked {\n background-color: ${theme.v1.palette.white};\n border: 5px solid ${theme.colors.primary.main};\n }\n\n :disabled {\n background-color: ${theme.colors.action.disabledBackground} !important;\n border-color: ${theme.colors.border.weak};\n }\n\n :disabled:checked {\n border: 1px solid ${theme.colors.border.weak};\n }\n\n :disabled:checked::after {\n content: '';\n width: 6px;\n height: 6px;\n background-color: ${theme.colors.text.disabled};\n border-radius: 50%;\n display: inline-block;\n position: absolute;\n top: 4px;\n left: 4px;\n }\n\n :focus {\n outline: none !important;\n box-shadow: 0 0 0 1px ${theme.colors.background.canvas}, 0 0 0 3px ${theme.colors.primary.main};\n }\n `,\n label: css`\n font-size: ${theme.typography.fontSize};\n line-height: 22px; /* 16px for the radio button and 6px for the focus shadow */\n display: grid;\n grid-template-columns: ${theme.spacing(2)} auto;\n gap: ${theme.spacing(1)};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\n\nimport { RadioButtonDot } from './RadioButtonDot';\n\nexport interface RadioButtonListProps<T> {\n /** A name of a radio group. Used to group multiple radio inputs into a single group */\n name: string;\n id?: string;\n /** An array of available options */\n options: Array<SelectableValue<T>>;\n value?: T;\n onChange?: (value: T) => void;\n /** Disables all elements in the list */\n disabled?: boolean;\n /** Disables subset of elements in the list. Compares values using the === operator */\n disabledOptions?: T[];\n className?: string;\n}\n\nexport function RadioButtonList<T>({\n name,\n id,\n options,\n value,\n onChange,\n className,\n disabled,\n disabledOptions = [],\n}: RadioButtonListProps<T>) {\n const styles = useStyles2(getStyles);\n const internalId = id ?? uniqueId('radiogroup-list-');\n\n return (\n <div id={id} className={cx(styles.container, className)} role=\"radiogroup\">\n {options.map((option, index) => {\n const itemId = `${internalId}-${index}`;\n\n const isChecked = value && value === option.value;\n const isDisabled = disabled || disabledOptions.some((optionValue) => optionValue === option.value);\n\n const handleChange = () => onChange && option.value && onChange(option.value);\n\n return (\n <RadioButtonDot\n key={itemId}\n id={itemId}\n name={name}\n label={option.label}\n description={option.description}\n checked={isChecked}\n disabled={isDisabled}\n onChange={handleChange}\n />\n );\n })}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css`\n display: grid;\n gap: ${theme.spacing(1)};\n `,\n});\n","import React, { useEffect } from 'react';\n\nimport { measureText } from '../../utils/measureText';\n\nimport { Input, Props as InputProps } from './Input';\n\nexport interface Props extends InputProps {\n /** Sets the min-width to a multiple of 8px. Default value is 10*/\n minWidth?: number;\n /** Sets the max-width to a multiple of 8px.*/\n maxWidth?: number;\n /** onChange function that will be run on onBlur and onKeyPress with enter*/\n onCommitChange?: (event: React.FormEvent<HTMLInputElement>) => void;\n}\n\nexport const AutoSizeInput = React.forwardRef<HTMLInputElement, Props>((props, ref) => {\n const { defaultValue = '', minWidth = 10, maxWidth, onCommitChange, onKeyDown, onBlur, ...restProps } = props;\n const [value, setValue] = React.useState(defaultValue);\n const [inputWidth, setInputWidth] = React.useState(minWidth);\n\n useEffect(() => {\n setInputWidth(getWidthFor(value.toString(), minWidth, maxWidth));\n }, [value, maxWidth, minWidth]);\n\n return (\n <Input\n {...restProps}\n ref={ref}\n value={value.toString()}\n onChange={(event) => {\n setValue(event.currentTarget.value);\n }}\n width={inputWidth}\n onBlur={(event) => {\n if (onBlur) {\n onBlur(event);\n } else if (onCommitChange) {\n onCommitChange(event);\n }\n }}\n onKeyDown={(event) => {\n if (onKeyDown) {\n onKeyDown(event);\n } else if (event.key === 'Enter' && onCommitChange) {\n onCommitChange(event);\n }\n }}\n data-testid={'autosize-input'}\n />\n );\n});\n\nfunction getWidthFor(value: string, minWidth: number, maxWidth: number | undefined): number {\n if (!value) {\n return minWidth;\n }\n\n const extraSpace = 3;\n const realWidth = measureText(value.toString(), 14).width / 8 + extraSpace;\n\n if (minWidth && realWidth < minWidth) {\n return minWidth;\n }\n\n if (maxWidth && realWidth > maxWidth) {\n return realWidth;\n }\n\n return realWidth;\n}\n\nAutoSizeInput.displayName = 'AutoSizeInput';\n","import React, { HTMLProps } from 'react';\n\nimport { escapeStringForRegex, unEscapeStringFromRegex } from '@grafana/data';\n\nimport { Button, Icon, Input } from '..';\nimport { useCombinedRefs } from '../../utils/useCombinedRefs';\n\nexport interface Props extends Omit<HTMLProps<HTMLInputElement>, 'onChange'> {\n value: string | undefined;\n width?: number;\n onChange: (value: string) => void;\n}\n\nexport const FilterInput = React.forwardRef<HTMLInputElement, Props>(\n ({ value, width, onChange, ...restProps }, ref) => {\n const innerRef = React.useRef<HTMLInputElement>(null);\n const combinedRef = useCombinedRefs(ref, innerRef) as React.Ref<HTMLInputElement>;\n\n const suffix =\n value !== '' ? (\n <Button\n icon=\"times\"\n fill=\"text\"\n size=\"sm\"\n onClick={(e) => {\n innerRef.current?.focus();\n onChange('');\n e.stopPropagation();\n }}\n >\n Clear\n </Button>\n ) : null;\n\n return (\n <Input\n prefix={<Icon name=\"search\" />}\n suffix={suffix}\n width={width}\n type=\"text\"\n value={value ? unEscapeStringFromRegex(value) : ''}\n onChange={(event) => onChange(escapeStringForRegex(event.currentTarget.value))}\n {...restProps}\n ref={combinedRef}\n />\n );\n }\n);\n\nFilterInput.displayName = 'FilterInput';\n","import React from 'react';\n\nexport function useCombinedRefs<T>(...refs: any) {\n const targetRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n refs.forEach((ref: any) => {\n if (!ref) {\n return;\n }\n\n if (typeof ref === 'function') {\n ref(targetRef.current);\n } else {\n ref.current = targetRef.current;\n }\n });\n }, [refs]);\n\n return targetRef;\n}\n","import * as React from 'react';\n\nimport { Button } from '../Button';\nimport { Input } from '../Input/Input';\nimport { HorizontalGroup } from '../Layout/Layout';\n\nexport type Props = React.ComponentProps<typeof Input> & {\n /** TRUE if the secret was already configured. (It is needed as often the backend doesn't send back the actual secret, only the information that it was configured) */\n isConfigured: boolean;\n /** Called when the user clicks on the \"Reset\" button in order to clear the secret */\n onReset: () => void;\n};\n\nexport const CONFIGURED_TEXT = 'configured';\nexport const RESET_BUTTON_TEXT = 'Reset';\n\nexport const SecretInput = ({ isConfigured, onReset, ...props }: Props) => (\n <HorizontalGroup>\n {!isConfigured && <Input {...props} type=\"password\" />}\n {isConfigured && <Input {...props} type=\"text\" disabled={true} value={CONFIGURED_TEXT} />}\n {isConfigured && (\n <Button onClick={onReset} variant=\"secondary\">\n {RESET_BUTTON_TEXT}\n </Button>\n )}\n </HorizontalGroup>\n);\n","import { css, cx } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Button } from '../Button';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { TextArea } from '../TextArea/TextArea';\n\nexport type Props = React.ComponentProps<typeof TextArea> & {\n /** TRUE if the secret was already configured. (It is needed as often the backend doesn't send back the actual secret, only the information that it was configured) */\n isConfigured: boolean;\n /** Called when the user clicks on the \"Reset\" button in order to clear the secret */\n onReset: () => void;\n};\n\nexport const CONFIGURED_TEXT = 'configured';\nexport const RESET_BUTTON_TEXT = 'Reset';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n configuredStyle: css`\n min-height: ${theme.spacing(theme.components.height.md)};\n padding-top: ${theme.spacing(0.5) /** Needed to mimic vertically centered text in an input box */};\n resize: none;\n `,\n };\n};\n\n/**\n * Text area that does not disclose an already configured value but lets the user reset the current value and enter a new one.\n * Typically useful for asymmetric cryptography keys.\n */\nexport const SecretTextArea = ({ isConfigured, onReset, ...props }: Props) => {\n const styles = useStyles2(getStyles);\n return (\n <HorizontalGroup>\n {!isConfigured && <TextArea {...props} />}\n {isConfigured && (\n <TextArea {...props} rows={1} disabled={true} value={CONFIGURED_TEXT} className={cx(styles.configuredStyle)} />\n )}\n {isConfigured && (\n <Button onClick={onReset} variant=\"secondary\">\n {RESET_BUTTON_TEXT}\n </Button>\n )}\n </HorizontalGroup>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLProps, useCallback } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { stylesFactory, useStyles2 } from '../../themes';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\n\nimport { getLabelStyles } from './Label';\n\nexport interface CheckboxProps extends Omit<HTMLProps<HTMLInputElement>, 'value'> {\n label?: string;\n description?: string;\n value?: boolean;\n // htmlValue allows to specify the input \"value\" attribute\n htmlValue?: string | number;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, description, value, htmlValue, onChange, disabled, className, ...inputProps }, ref) => {\n const handleOnChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n const styles = useStyles2(getCheckboxStyles);\n\n return (\n <label className={cx(styles.wrapper, className)}>\n <input\n type=\"checkbox\"\n className={styles.input}\n checked={value}\n disabled={disabled}\n onChange={handleOnChange}\n value={htmlValue}\n {...inputProps}\n ref={ref}\n />\n <span className={styles.checkmark} />\n {label && <span className={styles.label}>{label}</span>}\n {description && <span className={styles.description}>{description}</span>}\n </label>\n );\n }\n);\n\nexport const getCheckboxStyles = stylesFactory((theme: GrafanaTheme2) => {\n const labelStyles = getLabelStyles(theme);\n const checkboxSize = 2;\n const labelPadding = 1;\n\n return {\n wrapper: css`\n position: relative;\n vertical-align: middle;\n font-size: 0;\n `,\n input: css`\n position: absolute;\n z-index: 1;\n top: 0;\n left: 0;\n width: 100% !important; // global styles unset this\n height: 100%;\n opacity: 0;\n\n &:focus + span,\n &:focus-visible + span {\n ${getFocusStyles(theme)}\n }\n\n &:focus:not(:focus-visible) + span {\n ${getMouseFocusStyles(theme)}\n }\n\n /**\n * Using adjacent sibling selector to style checked state.\n * Primarily to limit the classes necessary to use when these classes will be used\n * for angular components styling\n * */\n &:checked + span {\n background: blue;\n background: ${theme.colors.primary.main};\n border: none;\n\n &:hover {\n background: ${theme.colors.primary.shade};\n }\n\n &:after {\n content: '';\n position: absolute;\n z-index: 2;\n left: 5px;\n top: 1px;\n width: 6px;\n height: 12px;\n border: solid ${theme.colors.primary.contrastText};\n border-width: 0 3px 3px 0;\n transform: rotate(45deg);\n }\n }\n\n &:disabled + span {\n background-color: ${theme.colors.action.disabledBackground};\n cursor: not-allowed;\n\n &:hover {\n background-color: ${theme.colors.action.disabledBackground};\n }\n\n &:after {\n border-color: ${theme.colors.action.disabledText};\n }\n }\n `,\n checkmark: css`\n position: relative; /* Checkbox should be layered on top of the invisible input so it recieves :hover */\n z-index: 2;\n display: inline-block;\n width: ${theme.spacing(checkboxSize)};\n height: ${theme.spacing(checkboxSize)};\n border-radius: ${theme.shape.borderRadius()};\n background: ${theme.components.input.background};\n border: 1px solid ${theme.components.input.borderColor};\n\n &:hover {\n cursor: pointer;\n border-color: ${theme.components.input.borderHover};\n }\n `,\n label: cx(\n labelStyles.label,\n css`\n position: relative;\n z-index: 2;\n padding-left: ${theme.spacing(labelPadding)};\n white-space: nowrap;\n cursor: pointer;\n position: relative;\n top: -3px;\n `\n ),\n description: cx(\n labelStyles.description,\n css`\n line-height: ${theme.typography.bodySmall.lineHeight};\n padding-left: ${theme.spacing(checkboxSize + labelPadding)};\n margin-top: 0; /* The margin effectively comes from the top: -2px on the label above it */\n `\n ),\n };\n});\n\nCheckbox.displayName = 'Checkbox';\n","/**\n * Shortens the filename to 16 length\n * @param fileName\n */\nexport function trimFileName(fileName: string): string {\n const nameLength = 16;\n const delimiter = fileName.lastIndexOf('.');\n const extension = fileName.substring(delimiter);\n const file = fileName.substring(0, delimiter);\n\n if (file.length < nameLength) {\n return fileName;\n }\n\n return `${file.substring(0, nameLength)}...${extension}`;\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC, FormEvent, useCallback, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { ComponentSize } from '../../types/size';\nimport { trimFileName } from '../../utils/file';\nimport { getButtonStyles } from '../Button';\nimport { Icon } from '../index';\n\nexport interface Props {\n /** Callback function to handle uploaded file */\n onFileUpload: (event: FormEvent<HTMLInputElement>) => void;\n /** Accepted file extensions */\n accept?: string;\n /** Overwrite or add to style */\n className?: string;\n /** Button size */\n size?: ComponentSize;\n /** Show the file name */\n showFileName?: boolean;\n}\n\nexport const FileUpload: FC<Props> = ({\n onFileUpload,\n className,\n children = 'Upload file',\n accept = '*',\n size = 'md',\n}) => {\n const style = useStyles2(getStyles(size));\n const [fileName, setFileName] = useState('');\n const id = uuidv4();\n\n const onChange = useCallback(\n (event: FormEvent<HTMLInputElement>) => {\n const file = event.currentTarget?.files?.[0];\n if (file) {\n setFileName(file.name ?? '');\n }\n onFileUpload(event);\n },\n [onFileUpload]\n );\n\n return (\n <>\n <input\n type=\"file\"\n id={id}\n className={style.fileUpload}\n onChange={onChange}\n multiple={false}\n accept={accept}\n data-testid={selectors.components.FileUpload.inputField}\n />\n <label role=\"button\" htmlFor={id} className={cx(style.labelWrapper, className)}>\n <Icon name=\"upload\" className={style.icon} />\n {children}\n </label>\n\n {fileName && (\n <span\n aria-label=\"File name\"\n className={style.fileName}\n data-testid={selectors.components.FileUpload.fileNameSpan}\n >\n {trimFileName(fileName)}\n </span>\n )}\n </>\n );\n};\n\nconst getStyles = (size: ComponentSize) => (theme: GrafanaTheme2) => {\n const buttonStyles = getButtonStyles({ theme, variant: 'primary', size, iconOnly: false });\n const focusStyle = getFocusStyles(theme);\n\n return {\n fileUpload: css({\n height: '0.1px',\n opacity: '0',\n overflow: 'hidden',\n position: 'absolute',\n width: '0.1px',\n zIndex: -1,\n '&:focus + label': focusStyle,\n '&:focus-visible + label': focusStyle,\n }),\n labelWrapper: buttonStyles.button,\n icon: buttonStyles.icon,\n fileName: css({\n marginLeft: theme.spacing(0.5),\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { formattedValueToString, getValueFormat, GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\nimport { trimFileName } from '../../utils/file';\nimport { Button } from '../Button';\nimport { Icon } from '../Icon/Icon';\nimport { IconButton } from '../IconButton/IconButton';\n\nimport { DropzoneFile } from './FileDropzone';\n\nexport const REMOVE_FILE = 'Remove file';\nexport interface FileListItemProps {\n file: DropzoneFile;\n removeFile?: (file: DropzoneFile) => void;\n}\n\nexport function FileListItem({ file: customFile, removeFile }: FileListItemProps) {\n const styles = useStyles2(getStyles);\n const { file, progress, error, abortUpload, retryUpload } = customFile;\n\n const renderRightSide = () => {\n if (error) {\n return (\n <>\n <span className={styles.error}>{error.message}</span>\n {retryUpload && (\n <IconButton\n type=\"button\"\n aria-label=\"Retry\"\n name=\"sync\"\n tooltip=\"Retry\"\n tooltipPlacement=\"top\"\n onClick={retryUpload}\n />\n )}\n {removeFile && (\n <IconButton\n className={retryUpload ? styles.marginLeft : ''}\n type=\"button\"\n name=\"trash-alt\"\n onClick={() => removeFile(customFile)}\n tooltip={REMOVE_FILE}\n aria-label={REMOVE_FILE}\n />\n )}\n </>\n );\n }\n\n if (progress && file.size > progress) {\n return (\n <>\n <progress className={styles.progressBar} max={file.size} value={progress} />\n <span className={styles.paddingLeft}>{Math.round((progress / file.size) * 100)}%</span>\n {abortUpload && (\n <Button variant=\"secondary\" type=\"button\" fill=\"text\" onClick={abortUpload}>\n Cancel upload\n </Button>\n )}\n </>\n );\n }\n return (\n removeFile && (\n <IconButton\n name=\"trash-alt\"\n onClick={() => removeFile(customFile)}\n tooltip={REMOVE_FILE}\n aria-label={REMOVE_FILE}\n type=\"button\"\n tooltipPlacement=\"top\"\n />\n )\n );\n };\n\n const valueFormat = getValueFormat('decbytes')(file.size);\n\n return (\n <div className={styles.fileListContainer}>\n <span className={styles.fileNameWrapper}>\n <Icon name=\"file-blank\" size=\"lg\" aria-hidden={true} />\n <span className={styles.padding}>{trimFileName(file.name)}</span>\n <span>{formattedValueToString(valueFormat)}</span>\n </span>\n\n <div className={styles.fileNameWrapper}>{renderRightSide()}</div>\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n fileListContainer: css`\n width: 100%;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n padding: ${theme.spacing(2)};\n border: 1px dashed ${theme.colors.border.medium};\n background-color: ${theme.colors.background.secondary};\n margin-top: ${theme.spacing(1)};\n `,\n fileNameWrapper: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n `,\n padding: css`\n padding: ${theme.spacing(0, 1)};\n `,\n paddingLeft: css`\n padding-left: ${theme.spacing(2)};\n `,\n marginLeft: css`\n margin-left: ${theme.spacing(1)};\n `,\n error: css`\n padding-right: ${theme.spacing(2)};\n color: ${theme.colors.error.text};\n `,\n progressBar: css`\n border-radius: ${theme.spacing(1)};\n height: 4px;\n ::-webkit-progress-bar {\n background-color: ${theme.colors.border.weak};\n border-radius: ${theme.spacing(1)};\n }\n ::-webkit-progress-value {\n background-color: ${theme.colors.primary.main};\n border-radius: ${theme.spacing(1)};\n }\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { isString, uniqueId } from 'lodash';\nimport React, { ReactNode, useCallback, useState } from 'react';\nimport { Accept, DropEvent, DropzoneOptions, FileRejection, useDropzone } from 'react-dropzone';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes';\nimport { Alert } from '../Alert/Alert';\nimport { Icon } from '../Icon/Icon';\n\nimport { FileListItem } from './FileListItem';\n\ntype BackwardsCompatibleDropzoneOptions = Omit<DropzoneOptions, 'accept'> & {\n // For backward compatibility we are still allowing the old `string | string[]` format for adding accepted file types (format changed in v13.0.0)\n accept?: string | string[] | Accept;\n};\n\nexport interface FileDropzoneProps {\n /**\n * Use the children property to have custom dropzone view.\n */\n children?: ReactNode;\n /**\n * Use this property to override the default behaviour for the react-dropzone options.\n * @default {\n * maxSize: Infinity,\n * minSize: 0,\n * multiple: true,\n * useFsAccessApi: false,\n * maxFiles: 0,\n * }\n */\n options?: BackwardsCompatibleDropzoneOptions;\n /**\n * Use this to change the FileReader's read.\n */\n readAs?: 'readAsArrayBuffer' | 'readAsText' | 'readAsBinaryString' | 'readAsDataURL';\n /**\n * Use the onLoad function to get the result from FileReader.\n */\n onLoad?: (result: string | ArrayBuffer | null) => void;\n /**\n * The fileListRenderer property can be used to overwrite the list of files. To not to show\n * any list return null in the function.\n */\n fileListRenderer?: (file: DropzoneFile, removeFile: (file: DropzoneFile) => void) => ReactNode;\n onFileRemove?: (file: DropzoneFile) => void;\n}\n\nexport interface DropzoneFile {\n file: File;\n id: string;\n error: DOMException | null;\n progress?: number;\n abortUpload?: () => void;\n retryUpload?: () => void;\n}\n\nexport function FileDropzone({ options, children, readAs, onLoad, fileListRenderer, onFileRemove }: FileDropzoneProps) {\n const [files, setFiles] = useState<DropzoneFile[]>([]);\n const [errorMessages, setErrorMessages] = useState<string[]>([]);\n\n const setFileProperty = useCallback(\n (customFile: DropzoneFile, action: (customFileToModify: DropzoneFile) => void) => {\n setFiles((oldFiles) => {\n return oldFiles.map((oldFile) => {\n if (oldFile.id === customFile.id) {\n action(oldFile);\n return oldFile;\n }\n return oldFile;\n });\n });\n },\n []\n );\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: FileRejection[], event: DropEvent) => {\n let customFiles = acceptedFiles.map(mapToCustomFile);\n if (options?.multiple === false) {\n setFiles(customFiles);\n } else {\n setFiles((oldFiles) => [...oldFiles, ...customFiles]);\n }\n\n setErrors(rejectedFiles);\n\n if (options?.onDrop) {\n options.onDrop(acceptedFiles, rejectedFiles, event);\n } else {\n for (const customFile of customFiles) {\n const reader = new FileReader();\n\n const read = () => {\n if (readAs) {\n reader[readAs](customFile.file);\n } else {\n reader.readAsText(customFile.file);\n }\n };\n\n // Set abort FileReader\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.abortUpload = () => {\n reader.abort();\n };\n fileToModify.retryUpload = () => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.error = null;\n fileToModify.progress = undefined;\n });\n read();\n };\n });\n\n reader.onabort = () => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.error = new DOMException('Aborted');\n });\n };\n\n reader.onprogress = (event) => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.progress = event.loaded;\n });\n };\n\n reader.onload = () => {\n onLoad?.(reader.result);\n };\n\n reader.onerror = () => {\n setFileProperty(customFile, (fileToModify) => {\n fileToModify.error = reader.error;\n });\n };\n\n read();\n }\n }\n },\n [onLoad, options, readAs, setFileProperty]\n );\n\n const removeFile = (file: DropzoneFile) => {\n const newFiles = files.filter((f) => file.id !== f.id);\n setFiles(newFiles);\n onFileRemove?.(file);\n };\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n ...options,\n useFsAccessApi: false,\n onDrop,\n accept: transformAcceptToNewFormat(options?.accept),\n });\n const theme = useTheme2();\n const styles = getStyles(theme, isDragActive);\n const fileList = files.map((file) => {\n if (fileListRenderer) {\n return fileListRenderer(file, removeFile);\n }\n return <FileListItem key={file.id} file={file} removeFile={removeFile} />;\n });\n\n const setErrors = (rejectedFiles: FileRejection[]) => {\n let errors: string[] = [];\n rejectedFiles.map((rejectedFile) => {\n rejectedFile.errors.map((error) => {\n if (errors.indexOf(error.message) === -1) {\n errors.push(error.message);\n }\n });\n });\n\n setErrorMessages(errors);\n };\n\n const getErrorMessages = () => {\n return (\n <div className={styles.errorAlert}>\n <Alert title=\"Upload failed\" severity=\"error\" onRemove={clearAlert}>\n {errorMessages.map((error) => {\n return <div key={error}>{error}</div>;\n })}\n </Alert>\n </div>\n );\n };\n\n const clearAlert = () => {\n setErrorMessages([]);\n };\n\n return (\n <div className={styles.container}>\n <div data-testid=\"dropzone\" {...getRootProps({ className: styles.dropzone })}>\n <input {...getInputProps()} />\n {children ?? <FileDropzoneDefaultChildren primaryText={getPrimaryText(files, options)} />}\n </div>\n {errorMessages.length > 0 && getErrorMessages()}\n {options?.accept && (\n <small className={cx(styles.small, styles.acceptMargin)}>{getAcceptedFileTypeText(options.accept)}</small>\n )}\n {fileList}\n </div>\n );\n}\n\nexport function getMimeTypeByExtension(ext: string) {\n if (['txt', 'json', 'csv', 'xls', 'yml'].some((e) => ext.match(e))) {\n return 'text/plain';\n }\n\n return 'application/octet-stream';\n}\n\nexport function transformAcceptToNewFormat(accept?: string | string[] | Accept): Accept | undefined {\n if (isString(accept)) {\n return {\n [getMimeTypeByExtension(accept)]: [accept],\n };\n }\n\n if (Array.isArray(accept)) {\n return accept.reduce((prev: Record<string, string[]>, current) => {\n const mime = getMimeTypeByExtension(current);\n\n prev[mime] = prev[mime] ? [...prev[mime], current] : [current];\n\n return prev;\n }, {});\n }\n\n return accept;\n}\n\nexport function FileDropzoneDefaultChildren({\n primaryText = 'Upload file',\n secondaryText = 'Drag and drop here or browse',\n}) {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <div className={styles.iconWrapper}>\n <Icon name=\"upload\" size=\"xxl\" />\n <h3>{primaryText}</h3>\n <small className={styles.small}>{secondaryText}</small>\n </div>\n );\n}\nfunction getPrimaryText(files: DropzoneFile[], options?: BackwardsCompatibleDropzoneOptions) {\n if (options?.multiple === undefined || options?.multiple) {\n return 'Upload file';\n }\n return files.length ? 'Replace file' : 'Upload file';\n}\n\nfunction getAcceptedFileTypeText(accept: string | string[] | Accept) {\n if (isString(accept)) {\n return `Accepted file type: ${accept}`;\n }\n\n if (Array.isArray(accept)) {\n return `Accepted file types: ${accept.join(', ')}`;\n }\n\n // react-dropzone has updated the type of the \"accept\" parameter since v13.0.0:\n // https://github.com/react-dropzone/react-dropzone/blob/master/src/index.js#L95\n return `Accepted file types: ${Object.values(accept).flat().join(', ')}`;\n}\n\nfunction mapToCustomFile(file: File): DropzoneFile {\n return {\n id: uniqueId('file'),\n file,\n error: null,\n };\n}\n\nfunction getStyles(theme: GrafanaTheme2, isDragActive?: boolean) {\n return {\n container: css`\n display: flex;\n flex-direction: column;\n width: 100%;\n `,\n dropzone: css`\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n padding: ${theme.spacing(6)};\n border-radius: 2px;\n border: 2px dashed ${theme.colors.border.medium};\n background-color: ${isDragActive ? theme.colors.background.secondary : theme.colors.background.primary};\n cursor: pointer;\n `,\n iconWrapper: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n `,\n acceptMargin: css`\n margin: ${theme.spacing(2, 0, 1)};\n `,\n small: css`\n color: ${theme.colors.text.secondary};\n `,\n errorAlert: css`\n padding-top: 10px;\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC, FormEvent, MouseEvent, useState } from 'react';\n\nimport { dateMath, dateTime, getDefaultTimeRange, GrafanaTheme2, TimeRange, TimeZone } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { stylesFactory } from '../../themes';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { Icon } from '../Icon/Icon';\nimport { getInputStyles } from '../Input/Input';\n\nimport { TimePickerButtonLabel } from './TimeRangePicker';\nimport { TimePickerContent } from './TimeRangePicker/TimePickerContent';\nimport { quickOptions } from './options';\n\nconst isValidTimeRange = (range: any) => {\n return dateMath.isValid(range.from) && dateMath.isValid(range.to);\n};\n\nexport interface TimeRangeInputProps {\n value: TimeRange;\n timeZone?: TimeZone;\n onChange: (timeRange: TimeRange) => void;\n onChangeTimeZone?: (timeZone: TimeZone) => void;\n hideTimeZone?: boolean;\n placeholder?: string;\n clearable?: boolean;\n isReversed?: boolean;\n hideQuickRanges?: boolean;\n disabled?: boolean;\n}\n\nconst noop = () => {};\n\nexport const TimeRangeInput: FC<TimeRangeInputProps> = ({\n value,\n onChange,\n onChangeTimeZone = noop,\n clearable,\n hideTimeZone = true,\n timeZone = 'browser',\n placeholder = 'Select time range',\n isReversed = true,\n hideQuickRanges = false,\n disabled = false,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const theme = useTheme2();\n const styles = getStyles(theme, disabled);\n\n const onOpen = (event: FormEvent<HTMLDivElement>) => {\n event.stopPropagation();\n event.preventDefault();\n if (disabled) {\n return;\n }\n setIsOpen(!isOpen);\n };\n\n const onClose = () => {\n setIsOpen(false);\n };\n\n const onRangeChange = (timeRange: TimeRange) => {\n onClose();\n onChange(timeRange);\n };\n\n const onRangeClear = (event: MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n const from = dateTime(null);\n const to = dateTime(null);\n onChange({ from, to, raw: { from, to } });\n };\n\n return (\n <div className={styles.container}>\n <div\n tabIndex={0}\n className={styles.pickerInput}\n aria-label={selectors.components.TimePicker.openButton}\n onClick={onOpen}\n >\n {isValidTimeRange(value) ? (\n <TimePickerButtonLabel value={value as TimeRange} timeZone={timeZone} />\n ) : (\n <span className={styles.placeholder}>{placeholder}</span>\n )}\n\n {!disabled && (\n <span className={styles.caretIcon}>\n {isValidTimeRange(value) && clearable && (\n <Icon className={styles.clearIcon} name=\"times\" size=\"lg\" onClick={onRangeClear} />\n )}\n <Icon name={isOpen ? 'angle-up' : 'angle-down'} size=\"lg\" />\n </span>\n )}\n </div>\n {isOpen && (\n <ClickOutsideWrapper includeButtonPress={false} onClick={onClose}>\n <TimePickerContent\n timeZone={timeZone}\n value={isValidTimeRange(value) ? (value as TimeRange) : getDefaultTimeRange()}\n onChange={onRangeChange}\n quickOptions={quickOptions}\n onChangeTimeZone={onChangeTimeZone}\n className={styles.content}\n hideTimeZone={hideTimeZone}\n isReversed={isReversed}\n hideQuickRanges={hideQuickRanges}\n />\n </ClickOutsideWrapper>\n )}\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, disabled = false) => {\n const inputStyles = getInputStyles({ theme, invalid: false });\n return {\n container: css`\n display: flex;\n position: relative;\n `,\n content: css`\n margin-left: 0;\n `,\n pickerInput: cx(\n inputStyles.input,\n disabled && inputStyles.inputDisabled,\n inputStyles.wrapper,\n css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n padding-right: 0;\n line-height: ${theme.v1.spacing.formInputHeight - 2}px;\n `\n ),\n caretIcon: cx(\n inputStyles.suffix,\n css`\n position: relative;\n top: -1px;\n margin-left: ${theme.v1.spacing.xs};\n `\n ),\n clearIcon: css`\n margin-right: ${theme.v1.spacing.xs};\n &:hover {\n color: ${theme.v1.colors.linkHover};\n }\n `,\n placeholder: css`\n color: ${theme.v1.colors.formInputPlaceholderText};\n opacity: 1;\n `,\n };\n});\n","import { RelativeTimeRange, TimeOption } from '@grafana/data';\n\nconst regex = /^now$|^now\\-(\\d{1,10})([wdhms])$/;\n\nexport const mapOptionToRelativeTimeRange = (option: TimeOption): RelativeTimeRange | undefined => {\n return {\n from: relativeToSeconds(option.from),\n to: relativeToSeconds(option.to),\n };\n};\n\nexport const mapRelativeTimeRangeToOption = (range: RelativeTimeRange): TimeOption => {\n const from = secondsToRelativeFormat(range.from);\n const to = secondsToRelativeFormat(range.to);\n\n return { from, to, display: `${from} to ${to}` };\n};\n\nexport type RangeValidation = {\n isValid: boolean;\n errorMessage?: string;\n};\n\nexport const isRangeValid = (relative: string, now = Date.now()): RangeValidation => {\n if (!isRelativeFormat(relative)) {\n return {\n isValid: false,\n errorMessage: 'Value not in relative time format.',\n };\n }\n\n const seconds = relativeToSeconds(relative);\n\n if (seconds > Math.ceil(now / 1000)) {\n return {\n isValid: false,\n errorMessage: 'Can not enter value prior to January 1, 1970.',\n };\n }\n\n return { isValid: true };\n};\n\nexport const isRelativeFormat = (format: string): boolean => {\n return regex.test(format);\n};\n\nconst relativeToSeconds = (relative: string): number => {\n const match = regex.exec(relative);\n\n if (!match || match.length !== 3) {\n return 0;\n }\n\n const [, value, unit] = match;\n const parsed = parseInt(value, 10);\n\n if (isNaN(parsed)) {\n return 0;\n }\n\n return parsed * units[unit];\n};\n\nconst units: Record<string, number> = {\n w: 604800,\n d: 86400,\n h: 3600,\n m: 60,\n s: 1,\n};\n\nconst secondsToRelativeFormat = (seconds: number): string => {\n if (seconds <= 0) {\n return 'now';\n }\n\n if (seconds >= units.w && seconds % units.w === 0) {\n return `now-${seconds / units.w}w`;\n }\n\n if (seconds >= units.d && seconds % units.d === 0) {\n return `now-${seconds / units.d}d`;\n }\n\n if (seconds >= units.h && seconds % units.h === 0) {\n return `now-${seconds / units.h}h`;\n }\n\n if (seconds >= units.m && seconds % units.m === 0) {\n return `now-${seconds / units.m}m`;\n }\n\n return `now-${seconds}s`;\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FormEvent, ReactElement, useCallback, useState } from 'react';\n\nimport { RelativeTimeRange, GrafanaTheme2, TimeOption } from '@grafana/data';\n\nimport { useStyles2 } from '../../../themes';\nimport { Button } from '../../Button';\nimport { ClickOutsideWrapper } from '../../ClickOutsideWrapper/ClickOutsideWrapper';\nimport CustomScrollbar from '../../CustomScrollbar/CustomScrollbar';\nimport { Field } from '../../Forms/Field';\nimport { Icon } from '../../Icon/Icon';\nimport { getInputStyles, Input } from '../../Input/Input';\nimport { Tooltip } from '../../Tooltip/Tooltip';\nimport { TimePickerTitle } from '../TimeRangePicker/TimePickerTitle';\nimport { TimeRangeList } from '../TimeRangePicker/TimeRangeList';\nimport { quickOptions } from '../options';\n\nimport {\n isRangeValid,\n isRelativeFormat,\n mapOptionToRelativeTimeRange,\n mapRelativeTimeRangeToOption,\n RangeValidation,\n} from './utils';\n\n/**\n * @internal\n */\nexport interface RelativeTimeRangePickerProps {\n timeRange: RelativeTimeRange;\n onChange: (timeRange: RelativeTimeRange) => void;\n}\n\ntype InputState = {\n value: string;\n validation: RangeValidation;\n};\n\nconst validOptions = quickOptions.filter((o) => isRelativeFormat(o.from));\n\n/**\n * @internal\n */\nexport function RelativeTimeRangePicker(props: RelativeTimeRangePickerProps): ReactElement | null {\n const { timeRange, onChange } = props;\n const [isOpen, setIsOpen] = useState(false);\n const onClose = useCallback(() => setIsOpen(false), []);\n const timeOption = mapRelativeTimeRangeToOption(timeRange);\n const [from, setFrom] = useState<InputState>({ value: timeOption.from, validation: isRangeValid(timeOption.from) });\n const [to, setTo] = useState<InputState>({ value: timeOption.to, validation: isRangeValid(timeOption.to) });\n\n const styles = useStyles2(getStyles(from.validation.errorMessage, to.validation.errorMessage));\n\n const onChangeTimeOption = (option: TimeOption) => {\n const relativeTimeRange = mapOptionToRelativeTimeRange(option);\n if (!relativeTimeRange) {\n return;\n }\n onClose();\n setFrom({ ...from, value: option.from });\n setTo({ ...to, value: option.to });\n onChange(relativeTimeRange);\n };\n\n const onOpen = useCallback(\n (event: FormEvent<HTMLDivElement>) => {\n event.stopPropagation();\n event.preventDefault();\n setIsOpen(!isOpen);\n },\n [isOpen]\n );\n\n const onApply = (event: FormEvent<HTMLButtonElement>) => {\n event.preventDefault();\n\n if (!to.validation.isValid || !from.validation.isValid) {\n return;\n }\n\n const timeRange = mapOptionToRelativeTimeRange({\n from: from.value,\n to: to.value,\n display: '',\n });\n\n if (!timeRange) {\n return;\n }\n\n onChange(timeRange);\n setIsOpen(false);\n };\n\n return (\n <div className={styles.container}>\n <div tabIndex={0} className={styles.pickerInput} onClick={onOpen}>\n <span className={styles.clockIcon}>\n <Icon name=\"clock-nine\" />\n </span>\n <span>\n {timeOption.from} to {timeOption.to}\n </span>\n <span className={styles.caretIcon}>\n <Icon name={isOpen ? 'angle-up' : 'angle-down'} size=\"lg\" />\n </span>\n </div>\n {isOpen && (\n <ClickOutsideWrapper includeButtonPress={false} onClick={onClose}>\n <div className={styles.content}>\n <div className={styles.body}>\n <CustomScrollbar className={styles.leftSide} hideHorizontalTrack>\n <TimeRangeList\n title=\"Example time ranges\"\n options={validOptions}\n onChange={onChangeTimeOption}\n value={timeOption}\n />\n </CustomScrollbar>\n <div className={styles.rightSide}>\n <div className={styles.title}>\n <TimePickerTitle>\n <Tooltip content={<TooltipContent />} placement=\"bottom\" theme=\"info\">\n <div>\n Specify time range <Icon name=\"info-circle\" />\n </div>\n </Tooltip>\n </TimePickerTitle>\n </div>\n <Field label=\"From\" invalid={!from.validation.isValid} error={from.validation.errorMessage}>\n <Input\n onClick={(event) => event.stopPropagation()}\n onBlur={() => setFrom({ ...from, validation: isRangeValid(from.value) })}\n onChange={(event) => setFrom({ ...from, value: event.currentTarget.value })}\n value={from.value}\n />\n </Field>\n <Field label=\"To\" invalid={!to.validation.isValid} error={to.validation.errorMessage}>\n <Input\n onClick={(event) => event.stopPropagation()}\n onBlur={() => setTo({ ...to, validation: isRangeValid(to.value) })}\n onChange={(event) => setTo({ ...to, value: event.currentTarget.value })}\n value={to.value}\n />\n </Field>\n <Button aria-label=\"TimePicker submit button\" onClick={onApply}>\n Apply time range\n </Button>\n </div>\n </div>\n </div>\n </ClickOutsideWrapper>\n )}\n </div>\n );\n}\n\nconst TooltipContent = () => {\n const styles = useStyles2(toolTipStyles);\n return (\n <>\n <div className={styles.supported}>\n Supported formats: <code className={styles.tooltip}>now-[digit]s/m/h/d/w</code>\n </div>\n <div>Example: to select a time range from 10 minutes ago to now</div>\n <code className={styles.tooltip}>From: now-10m To: now</code>\n <div className={styles.link}>\n For more information see{' '}\n <a href=\"https://grafana.com/docs/grafana/latest/dashboards/time-range-controls/\">\n docs <Icon name=\"external-link-alt\" />\n </a>\n .\n </div>\n </>\n );\n};\n\nconst toolTipStyles = (theme: GrafanaTheme2) => ({\n supported: css`\n margin-bottom: ${theme.spacing(1)};\n `,\n tooltip: css`\n margin: 0;\n `,\n link: css`\n margin-top: ${theme.spacing(1)};\n `,\n});\n\nconst getStyles = (fromError?: string, toError?: string) => (theme: GrafanaTheme2) => {\n const inputStyles = getInputStyles({ theme, invalid: false });\n const bodyMinimumHeight = 250;\n const bodyHeight = bodyMinimumHeight + calculateErrorHeight(theme, fromError) + calculateErrorHeight(theme, toError);\n\n return {\n container: css`\n display: flex;\n position: relative;\n `,\n pickerInput: cx(\n inputStyles.input,\n inputStyles.wrapper,\n css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n padding-right: 0;\n padding-left: 0;\n line-height: ${theme.v1.spacing.formInputHeight - 2}px;\n `\n ),\n caretIcon: cx(\n inputStyles.suffix,\n css`\n position: relative;\n margin-left: ${theme.v1.spacing.xs};\n `\n ),\n clockIcon: cx(\n inputStyles.prefix,\n css`\n position: relative;\n margin-right: ${theme.v1.spacing.xs};\n `\n ),\n content: css`\n background: ${theme.colors.background.primary};\n box-shadow: ${theme.shadows.z3};\n position: absolute;\n z-index: ${theme.zIndex.dropdown};\n width: 500px;\n top: 100%;\n border-radius: 2px;\n border: 1px solid ${theme.colors.border.weak};\n left: 0;\n white-space: normal;\n `,\n body: css`\n display: flex;\n height: ${bodyHeight}px;\n `,\n description: css`\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.size.sm};\n `,\n leftSide: css`\n width: 50% !important;\n border-right: 1px solid ${theme.colors.border.medium};\n `,\n rightSide: css`\n width: 50%;\n padding: ${theme.spacing(1)};\n `,\n title: css`\n margin-bottom: ${theme.spacing(1)};\n `,\n };\n};\n\nfunction calculateErrorHeight(theme: GrafanaTheme2, errorMessage?: string): number {\n if (!errorMessage) {\n return 0;\n }\n\n if (errorMessage.length > 34) {\n return theme.spacing.gridSize * 6.5;\n }\n\n return theme.spacing.gridSize * 4;\n}\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { styleMixins, stylesFactory, useStyles2, useTheme2 } from '../../themes';\n\n/**\n * @public\n */\nexport interface CardInnerProps {\n href?: string;\n children?: React.ReactNode;\n}\n\n/** @deprecated This component will be removed in a future release */\nconst CardInner = ({ children, href }: CardInnerProps) => {\n const { inner } = useStyles2(getCardInnerStyles);\n return href ? (\n <a className={inner} href={href}>\n {children}\n </a>\n ) : (\n <>{children}</>\n );\n};\n\nconst getCardInnerStyles = (theme: GrafanaTheme2) => ({\n inner: css({\n display: 'flex',\n width: '100%',\n padding: theme.spacing(2),\n }),\n});\n\n/**\n * @public\n */\nexport interface CardContainerProps extends HTMLAttributes<HTMLOrSVGElement>, CardInnerProps {\n /** Disable pointer events for the Card, e.g. click events */\n disableEvents?: boolean;\n /** No style change on hover */\n disableHover?: boolean;\n /** Makes the card selectable, set to \"true\" to apply selected styles */\n isSelected?: boolean;\n /** Custom container styles */\n className?: string;\n}\n\n/** @deprecated Using `CardContainer` directly is discouraged and should be replaced with `Card` */\nexport const CardContainer = ({\n children,\n disableEvents,\n disableHover,\n isSelected,\n className,\n href,\n ...props\n}: CardContainerProps) => {\n const theme = useTheme2();\n const { oldContainer } = getCardContainerStyles(theme, disableEvents, disableHover, isSelected);\n return (\n <div {...props} className={cx(oldContainer, className)}>\n <CardInner href={href}>{children}</CardInner>\n </div>\n );\n};\n\nexport const getCardContainerStyles = stylesFactory(\n (theme: GrafanaTheme2, disabled = false, disableHover = false, isSelected) => {\n const isSelectable = isSelected !== undefined;\n\n return {\n container: css({\n display: 'grid',\n position: 'relative',\n gridTemplateColumns: 'auto 1fr auto',\n gridTemplateRows: '1fr auto auto auto',\n gridAutoColumns: '1fr',\n gridAutoFlow: 'row',\n gridTemplateAreas: `\n \"Figure Heading Tags\"\n \"Figure Meta Tags\"\n \"Figure Description Tags\"\n \"Figure Actions Secondary\"`,\n width: '100%',\n padding: theme.spacing(2),\n background: theme.colors.background.secondary,\n borderRadius: theme.shape.borderRadius(),\n marginBottom: '8px',\n pointerEvents: disabled ? 'none' : 'auto',\n transition: theme.transitions.create(['background-color', 'box-shadow', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n ...(!disableHover && {\n '&:hover': {\n background: theme.colors.emphasize(theme.colors.background.secondary, 0.03),\n cursor: 'pointer',\n zIndex: 1,\n },\n '&:focus': styleMixins.getFocusStyles(theme),\n }),\n\n ...(isSelectable && {\n cursor: 'pointer',\n }),\n\n ...(isSelected && {\n outline: `solid 2px ${theme.colors.primary.border}`,\n }),\n }),\n oldContainer: css({\n display: 'flex',\n width: '100%',\n background: theme.colors.background.secondary,\n borderRadius: theme.shape.borderRadius(),\n position: 'relative',\n pointerEvents: disabled ? 'none' : 'auto',\n marginBottom: theme.spacing(1),\n transition: theme.transitions.create(['background-color', 'box-shadow', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n ...(!disableHover && {\n '&:hover': {\n background: theme.colors.emphasize(theme.colors.background.secondary, 0.03),\n cursor: 'pointer',\n zIndex: 1,\n },\n '&:focus': styleMixins.getFocusStyles(theme),\n }),\n }),\n };\n }\n);\n","import { css, cx } from '@emotion/css';\nimport React, { memo, cloneElement, FC, useMemo, useContext, ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\n\nimport { CardContainer, CardContainerProps, getCardContainerStyles } from './CardContainer';\n\n/**\n * @public\n */\nexport interface Props extends Omit<CardContainerProps, 'disableEvents' | 'disableHover'> {\n /** Indicates if the card and all its actions can be interacted with */\n disabled?: boolean;\n /** Link to redirect to on card click. If provided, the Card inner content will be rendered inside `a` */\n href?: string;\n /** On click handler for the Card */\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n /** @deprecated Use `Card.Heading` instead */\n heading?: ReactNode;\n /** @deprecated Use `Card.Description` instead */\n description?: string;\n isSelected?: boolean;\n}\n\nexport interface CardInterface extends FC<Props> {\n Heading: typeof Heading;\n Tags: typeof Tags;\n Figure: typeof Figure;\n Meta: typeof Meta;\n Actions: typeof Actions;\n SecondaryActions: typeof SecondaryActions;\n Description: typeof Description;\n}\n\nconst CardContext = React.createContext<{\n href?: string;\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n disabled?: boolean;\n isSelected?: boolean;\n} | null>(null);\n\n/**\n * Generic card component\n *\n * @public\n */\nexport const Card: CardInterface = ({ disabled, href, onClick, children, isSelected, className, ...htmlProps }) => {\n const hasHeadingComponent = useMemo(\n () =>\n React.Children.toArray(children).some(\n (c) => React.isValidElement(c) && (c.type as any).displayName === Heading.displayName\n ),\n [children]\n );\n\n const disableHover = disabled || (!onClick && !href);\n const onCardClick = onClick && !disabled ? onClick : undefined;\n const theme = useTheme2();\n const styles = getCardContainerStyles(theme, disabled, disableHover, isSelected);\n\n return (\n <CardContainer\n disableEvents={disabled}\n disableHover={disableHover}\n isSelected={isSelected}\n className={cx(styles.container, className)}\n {...htmlProps}\n >\n <CardContext.Provider value={{ href, onClick: onCardClick, disabled, isSelected }}>\n {!hasHeadingComponent && <Heading />}\n {children}\n </CardContext.Provider>\n </CardContainer>\n );\n};\n\ninterface ChildProps {\n className?: string;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\n/** Main heading for the card */\nconst Heading = ({ children, className, 'aria-label': ariaLabel }: ChildProps & { 'aria-label'?: string }) => {\n const context = useContext(CardContext);\n const styles = useStyles2(getHeadingStyles);\n\n const { href, onClick, isSelected } = context ?? { href: undefined, onClick: undefined, isSelected: undefined };\n\n return (\n <h2 className={cx(styles.heading, className)}>\n {href ? (\n <a href={href} className={styles.linkHack} aria-label={ariaLabel} onClick={onClick}>\n {children}\n </a>\n ) : onClick ? (\n <button onClick={onClick} className={styles.linkHack} aria-label={ariaLabel}>\n {children}\n </button>\n ) : (\n <>{children}</>\n )}\n {isSelected !== undefined && <input aria-label=\"option\" type=\"radio\" readOnly checked={isSelected} />}\n </h2>\n );\n};\nHeading.displayName = 'Heading';\n\nconst getHeadingStyles = (theme: GrafanaTheme2) => ({\n heading: css({\n gridArea: 'Heading',\n justifySelf: 'start',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n marginBottom: 0,\n fontSize: theme.typography.size.md,\n letterSpacing: 'inherit',\n lineHeight: theme.typography.body.lineHeight,\n color: theme.colors.text.primary,\n fontWeight: theme.typography.fontWeightMedium,\n }),\n linkHack: css({\n all: 'unset',\n '&::after': {\n position: 'absolute',\n content: '\"\"',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n borderRadius: theme.shape.borderRadius(1),\n },\n\n '&:focus-visible': {\n outline: 'none',\n outlineOffset: 0,\n boxShadow: 'none',\n\n '&::after': {\n ...getFocusStyles(theme),\n zIndex: 1,\n },\n },\n }),\n});\n\nconst Tags = ({ children, className }: ChildProps) => {\n const styles = useStyles2(getTagStyles);\n return <div className={cx(styles.tagList, className)}>{children}</div>;\n};\nTags.displayName = 'Tags';\n\nconst getTagStyles = (theme: GrafanaTheme2) => ({\n tagList: css({\n position: 'relative',\n gridArea: 'Tags',\n alignSelf: 'center',\n }),\n});\n\n/** Card description text */\nconst Description = ({ children, className }: ChildProps) => {\n const styles = useStyles2(getDescriptionStyles);\n return <p className={cx(styles.description, className)}>{children}</p>;\n};\nDescription.displayName = 'Description';\n\nconst getDescriptionStyles = (theme: GrafanaTheme2) => ({\n description: css({\n width: '100%',\n gridArea: 'Description',\n margin: theme.spacing(1, 0, 0),\n color: theme.colors.text.secondary,\n lineHeight: theme.typography.body.lineHeight,\n }),\n});\n\nconst Figure = ({ children, align = 'start', className }: ChildProps & { align?: 'start' | 'center' }) => {\n const styles = useStyles2(getFigureStyles);\n return (\n <div\n className={cx(\n styles.media,\n className,\n css`\n align-self: ${align};\n `\n )}\n >\n {children}\n </div>\n );\n};\nFigure.displayName = 'Figure';\n\nconst getFigureStyles = (theme: GrafanaTheme2) => ({\n media: css({\n position: 'relative',\n gridArea: 'Figure',\n\n marginRight: theme.spacing(2),\n width: '40px',\n\n '> img': {\n width: '100%',\n },\n\n '&:empty': {\n display: 'none',\n },\n }),\n});\n\nconst Meta = memo(({ children, className, separator = '|' }: ChildProps & { separator?: string }) => {\n const styles = useStyles2(getMetaStyles);\n let meta = children;\n\n const filtered = React.Children.toArray(children).filter(Boolean);\n if (!filtered.length) {\n return null;\n }\n meta = filtered.map((element, i) => (\n <div key={`element_${i}`} className={styles.metadataItem}>\n {element}\n </div>\n ));\n // Join meta data elements by separator\n if (filtered.length > 1 && separator) {\n meta = filtered.reduce((prev, curr, i) => [\n prev,\n <span key={`separator_${i}`} className={styles.separator}>\n {separator}\n </span>,\n curr,\n ]);\n }\n return <div className={cx(styles.metadata, className)}>{meta}</div>;\n});\nMeta.displayName = 'Meta';\n\nconst getMetaStyles = (theme: GrafanaTheme2) => ({\n metadata: css({\n gridArea: 'Meta',\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n fontSize: theme.typography.size.sm,\n color: theme.colors.text.secondary,\n margin: theme.spacing(0.5, 0, 0),\n lineHeight: theme.typography.bodySmall.lineHeight,\n overflowWrap: 'anywhere',\n }),\n metadataItem: css({\n // Needed to allow for clickable children in metadata\n zIndex: 0,\n }),\n separator: css({\n margin: `0 ${theme.spacing(1)}`,\n }),\n});\n\ninterface ActionsProps extends ChildProps {\n children?: React.ReactNode;\n variant?: 'primary' | 'secondary';\n}\n\nconst BaseActions = ({ children, disabled, variant, className }: ActionsProps) => {\n const styles = useStyles2(getActionStyles);\n const context = useContext(CardContext);\n const isDisabled = context?.disabled || disabled;\n\n const css = variant === 'primary' ? styles.actions : styles.secondaryActions;\n return (\n <div className={cx(css, className)}>\n {React.Children.map(children, (child) => {\n return React.isValidElement(child) ? cloneElement(child, { disabled: isDisabled, ...child.props }) : null;\n })}\n </div>\n );\n};\n\nconst getActionStyles = (theme: GrafanaTheme2) => ({\n actions: css({\n gridArea: 'Actions',\n marginTop: theme.spacing(2),\n '& > *': {\n marginRight: theme.spacing(1),\n },\n }),\n secondaryActions: css({\n display: 'flex',\n gridArea: 'Secondary',\n alignSelf: 'center',\n color: theme.colors.text.secondary,\n marginTtop: theme.spacing(2),\n\n '& > *': {\n marginRight: `${theme.spacing(1)} !important`,\n },\n }),\n});\n\nconst Actions = ({ children, disabled, className }: ChildProps) => {\n return (\n <BaseActions variant=\"primary\" disabled={disabled} className={className}>\n {children}\n </BaseActions>\n );\n};\nActions.displayName = 'Actions';\n\nconst SecondaryActions = ({ children, disabled, className }: ChildProps) => {\n return (\n <BaseActions variant=\"secondary\" disabled={disabled} className={className}>\n {children}\n </BaseActions>\n );\n};\nSecondaryActions.displayName = 'SecondaryActions';\n\n/**\n * @public\n * @deprecated Use `className` on respective components to modify styles\n */\nexport const getCardStyles = (theme: GrafanaTheme2) => {\n return {\n inner: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n flex-wrap: wrap;\n `,\n ...getHeadingStyles(theme),\n ...getMetaStyles(theme),\n ...getDescriptionStyles(theme),\n ...getFigureStyles(theme),\n ...getActionStyles(theme),\n ...getTagStyles(theme),\n };\n};\n\nCard.Heading = Heading;\nCard.Tags = Tags;\nCard.Figure = Figure;\nCard.Meta = Meta;\nCard.Actions = Actions;\nCard.SecondaryActions = SecondaryActions;\nCard.Description = Description;\n","import { css } from '@emotion/css';\nimport { FocusScope } from '@react-aria/focus';\nimport React, { useState } from 'react';\nimport { usePopperTooltip } from 'react-popper-tooltip';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { ReactUtils } from '../../utils';\nimport { Portal } from '../Portal/Portal';\nimport { TooltipPlacement } from '../Tooltip/types';\n\nexport interface Props {\n overlay: React.ReactElement | (() => React.ReactElement);\n placement?: TooltipPlacement;\n children: React.ReactElement;\n}\n\nexport const Dropdown = React.memo(({ children, overlay, placement }: Props) => {\n const [show, setShow] = useState(false);\n\n const { getArrowProps, getTooltipProps, setTooltipRef, setTriggerRef, visible } = usePopperTooltip({\n visible: show,\n placement: placement,\n onVisibleChange: setShow,\n interactive: true,\n delayHide: 0,\n delayShow: 0,\n offset: [0, 8],\n trigger: ['click'],\n });\n\n const animationDuration = 150;\n const animationStyles = getStyles(animationDuration);\n\n const onOverlayClicked = () => {\n setShow(false);\n };\n\n return (\n <>\n {React.cloneElement(children, {\n ref: setTriggerRef,\n })}\n {visible && (\n <Portal>\n <FocusScope autoFocus>\n <div ref={setTooltipRef} {...getTooltipProps()} onClick={onOverlayClicked}>\n <div {...getArrowProps({ className: 'tooltip-arrow' })} />\n <CSSTransition\n appear={true}\n in={true}\n timeout={{ appear: animationDuration, exit: 0, enter: 0 }}\n classNames={animationStyles}\n >\n {ReactUtils.renderOrCallToRender(overlay)}\n </CSSTransition>\n </div>\n </FocusScope>\n </Portal>\n )}\n </>\n );\n});\n\nDropdown.displayName = 'Dropdown';\n\nconst getStyles = (duration: number) => {\n return {\n appear: css`\n opacity: 0;\n position: relative;\n transform: scaleY(0.5);\n transform-origin: top;\n `,\n appearActive: css`\n opacity: 1;\n transform: scaleY(1);\n transition: transform ${duration}ms cubic-bezier(0.2, 0, 0.2, 1),\n opacity ${duration}ms cubic-bezier(0.2, 0, 0.2, 1);\n `,\n };\n};\n","import React, { HTMLAttributes } from 'react';\n\nimport { PluginSignatureStatus } from '@grafana/data';\n\nimport { Badge, BadgeProps } from '../Badge/Badge';\n\n/**\n * @public\n */\nexport interface PluginSignatureBadgeProps extends HTMLAttributes<HTMLDivElement> {\n status?: PluginSignatureStatus;\n}\n\n/**\n * @public\n */\nexport const PluginSignatureBadge: React.FC<PluginSignatureBadgeProps> = ({ status, ...otherProps }) => {\n const display = getSignatureDisplayModel(status);\n return (\n <Badge\n text={display.text}\n color={display.color as any}\n icon={display.icon}\n tooltip={display.tooltip}\n {...otherProps}\n />\n );\n};\n\nPluginSignatureBadge.displayName = 'PluginSignatureBadge';\n\nfunction getSignatureDisplayModel(signature?: PluginSignatureStatus): BadgeProps {\n if (!signature) {\n signature = PluginSignatureStatus.invalid;\n }\n\n switch (signature) {\n case PluginSignatureStatus.internal:\n return { text: 'Core', color: 'blue', tooltip: 'Core plugin that is bundled with Grafana' };\n case PluginSignatureStatus.valid:\n return { text: 'Signed', icon: 'lock', color: 'green', tooltip: 'Signed and verified plugin' };\n case PluginSignatureStatus.invalid:\n return {\n text: 'Invalid signature',\n icon: 'exclamation-triangle',\n color: 'red',\n tooltip: 'Invalid plugin signature',\n };\n case PluginSignatureStatus.modified:\n return {\n text: 'Modified signature',\n icon: 'exclamation-triangle',\n color: 'red',\n tooltip: 'Valid signature but content has been modified',\n };\n case PluginSignatureStatus.missing:\n return {\n text: 'Missing signature',\n icon: 'exclamation-triangle',\n color: 'red',\n tooltip: 'Missing plugin signature',\n };\n default:\n return {\n text: 'Unsigned',\n icon: 'exclamation-triangle',\n color: 'red',\n tooltip: 'Unsigned external plugin',\n };\n }\n}\n","import { SelectableValue } from '@grafana/data';\nimport {\n AxisPlacement,\n BarAlignment,\n GraphDrawStyle,\n GraphGradientMode,\n GraphTresholdsStyleMode,\n LineInterpolation,\n VisibilityMode,\n StackingMode,\n} from '@grafana/schema';\n\n/**\n * @alpha\n */\nexport const graphFieldOptions = {\n drawStyle: [\n { label: 'Lines', value: GraphDrawStyle.Line },\n { label: 'Bars', value: GraphDrawStyle.Bars },\n { label: 'Points', value: GraphDrawStyle.Points },\n ] as Array<SelectableValue<GraphDrawStyle>>,\n\n lineInterpolation: [\n { description: 'Linear', value: LineInterpolation.Linear, icon: 'gf-interpolation-linear' },\n { description: 'Smooth', value: LineInterpolation.Smooth, icon: 'gf-interpolation-smooth' },\n { description: 'Step before', value: LineInterpolation.StepBefore, icon: 'gf-interpolation-step-before' },\n { description: 'Step after', value: LineInterpolation.StepAfter, icon: 'gf-interpolation-step-after' },\n ] as Array<SelectableValue<LineInterpolation>>,\n\n barAlignment: [\n { description: 'Before', value: BarAlignment.Before, icon: 'gf-bar-alignment-before' },\n { description: 'Center', value: BarAlignment.Center, icon: 'gf-bar-alignment-center' },\n { description: 'After', value: BarAlignment.After, icon: 'gf-bar-alignment-after' },\n ] as Array<SelectableValue<BarAlignment>>,\n\n showPoints: [\n { label: 'Auto', value: VisibilityMode.Auto, description: 'Show points when the density is low' },\n { label: 'Always', value: VisibilityMode.Always },\n { label: 'Never', value: VisibilityMode.Never },\n ] as Array<SelectableValue<VisibilityMode>>,\n\n axisPlacement: [\n { label: 'Auto', value: AxisPlacement.Auto, description: 'First field on the left, everything else on the right' },\n { label: 'Left', value: AxisPlacement.Left },\n { label: 'Right', value: AxisPlacement.Right },\n { label: 'Hidden', value: AxisPlacement.Hidden },\n ] as Array<SelectableValue<AxisPlacement>>,\n\n fillGradient: [\n { label: 'None', value: GraphGradientMode.None },\n { label: 'Opacity', value: GraphGradientMode.Opacity, description: 'Enable fill opacity gradient' },\n { label: 'Hue', value: GraphGradientMode.Hue, description: 'Small color hue gradient' },\n {\n label: 'Scheme',\n value: GraphGradientMode.Scheme,\n description: 'Use color scheme to define gradient',\n },\n ] as Array<SelectableValue<GraphGradientMode>>,\n\n stacking: [\n { label: 'Off', value: StackingMode.None },\n { label: 'Normal', value: StackingMode.Normal },\n { label: '100%', value: StackingMode.Percent },\n ] as Array<SelectableValue<StackingMode>>,\n\n thresholdsDisplayModes: [\n { label: 'Off', value: GraphTresholdsStyleMode.Off },\n { label: 'As lines', value: GraphTresholdsStyleMode.Line },\n { label: 'As filled regions', value: GraphTresholdsStyleMode.Area },\n { label: 'As filled regions and lines', value: GraphTresholdsStyleMode.LineAndArea },\n ] as Array<SelectableValue<GraphTresholdsStyleMode>>,\n};\n","import React from 'react';\n\nimport {\n DataFrame,\n DisplayProcessor,\n DisplayValue,\n fieldReducers,\n getDisplayProcessor,\n getFieldDisplayName,\n getFieldSeriesColor,\n reduceField,\n ReducerID,\n} from '@grafana/data';\nimport { VizLegendOptions, AxisPlacement } from '@grafana/schema';\n\nimport { useTheme2 } from '../../themes';\nimport { VizLayout, VizLayoutLegendProps } from '../VizLayout/VizLayout';\nimport { VizLegend } from '../VizLegend/VizLegend';\nimport { VizLegendItem } from '../VizLegend/types';\n\nimport { UPlotConfigBuilder } from './config/UPlotConfigBuilder';\n\nconst defaultFormatter = (v: any) => (v == null ? '-' : v.toFixed(1));\n\ninterface PlotLegendProps extends VizLegendOptions, Omit<VizLayoutLegendProps, 'children'> {\n data: DataFrame[];\n config: UPlotConfigBuilder;\n}\n\nexport const PlotLegend: React.FC<PlotLegendProps> = ({\n data,\n config,\n placement,\n calcs,\n displayMode,\n ...vizLayoutLegendProps\n}) => {\n const theme = useTheme2();\n const legendItems = config\n .getSeries()\n .map<VizLegendItem | undefined>((s) => {\n const seriesConfig = s.props;\n const fieldIndex = seriesConfig.dataFrameFieldIndex;\n const axisPlacement = config.getAxisPlacement(s.props.scaleKey);\n\n if (!fieldIndex) {\n return undefined;\n }\n\n const field = data[fieldIndex.frameIndex]?.fields[fieldIndex.fieldIndex];\n\n if (!field || field.config.custom?.hideFrom?.legend) {\n return undefined;\n }\n\n const label = getFieldDisplayName(field, data[fieldIndex.frameIndex]!, data);\n const scaleColor = getFieldSeriesColor(field, theme);\n const seriesColor = scaleColor.color;\n\n return {\n disabled: !(seriesConfig.show ?? true),\n fieldIndex,\n color: seriesColor,\n label,\n yAxis: axisPlacement === AxisPlacement.Left ? 1 : 2,\n getDisplayValues: () => {\n if (!calcs?.length) {\n return [];\n }\n\n const fmt = field.display ?? defaultFormatter;\n let countFormatter: DisplayProcessor | null = null;\n\n const fieldCalcs = reduceField({\n field,\n reducers: calcs,\n });\n\n return calcs.map<DisplayValue>((reducerId) => {\n const fieldReducer = fieldReducers.get(reducerId);\n let formatter = fmt;\n\n if (fieldReducer.id === ReducerID.diffperc) {\n formatter = getDisplayProcessor({\n field: {\n ...field,\n config: {\n ...field.config,\n unit: 'percent',\n },\n },\n theme,\n });\n }\n\n if (\n fieldReducer.id === ReducerID.count ||\n fieldReducer.id === ReducerID.changeCount ||\n fieldReducer.id === ReducerID.distinctCount\n ) {\n if (!countFormatter) {\n countFormatter = getDisplayProcessor({\n field: {\n ...field,\n config: {\n ...field.config,\n unit: 'none',\n },\n },\n theme,\n });\n }\n formatter = countFormatter;\n }\n\n return {\n ...formatter(fieldCalcs[reducerId]),\n title: fieldReducer.name,\n description: fieldReducer.description,\n };\n });\n },\n getItemKey: () => `${label}-${fieldIndex.frameIndex}-${fieldIndex.fieldIndex}`,\n };\n })\n .filter((i) => i !== undefined) as VizLegendItem[];\n\n return (\n <VizLayout.Legend placement={placement} {...vizLayoutLegendProps}>\n <VizLegend\n placement={placement}\n items={legendItems}\n displayMode={displayMode}\n sortBy={vizLayoutLegendProps.sortBy}\n sortDesc={vizLayoutLegendProps.sortDesc}\n />\n </VizLayout.Legend>\n );\n};\n\nPlotLegend.displayName = 'PlotLegend';\n","import React from 'react';\n\ninterface MarkerProps {\n /** x position relative to plotting area bounding box*/\n x: number;\n /** y position relative to plotting area bounding box*/\n y: number;\n}\n\n// An abstraction over a component rendered within a chart canvas.\n// Marker is rendered with DOM coords of the chart bounding box.\nexport const Marker: React.FC<MarkerProps> = ({ x, y, children }) => {\n return (\n <div\n style={{\n position: 'absolute',\n top: `${y}px`,\n left: `${x}px`,\n }}\n >\n {children}\n </div>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\ninterface XYCanvasProps {\n top: number; // css pxls\n left: number; // css pxls\n}\n\n/**\n * Renders absolutely positioned element on top of the uPlot's plotting area (axes are not included!).\n * Useful when you want to render some overlay with canvas-independent elements on top of the plot.\n */\nexport const XYCanvas: React.FC<XYCanvasProps> = ({ children, left, top }) => {\n const className = useMemo(() => {\n return css`\n position: absolute;\n overflow: visible;\n left: ${left}px;\n top: ${top}px;\n `;\n }, [left, top]);\n\n return <div className={className}>{children}</div>;\n};\n","import React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport uPlot from 'uplot';\n\nimport { DataFrame, DataFrameFieldIndex } from '@grafana/data';\n\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\nimport { Marker } from './Marker';\nimport { XYCanvas } from './XYCanvas';\n\ninterface EventsCanvasProps {\n id: string;\n config: UPlotConfigBuilder;\n events: DataFrame[];\n renderEventMarker: (dataFrame: DataFrame, dataFrameFieldIndex: DataFrameFieldIndex) => React.ReactNode;\n mapEventToXYCoords: (\n dataFrame: DataFrame,\n dataFrameFieldIndex: DataFrameFieldIndex\n ) => { x: number; y: number } | undefined;\n}\n\nexport function EventsCanvas({ id, events, renderEventMarker, mapEventToXYCoords, config }: EventsCanvasProps) {\n const plotInstance = useRef<uPlot>();\n // render token required to re-render annotation markers. Rendering lines happens in uPlot and the props do not change\n // so we need to force the re-render when the draw hook was performed by uPlot\n const [renderToken, setRenderToken] = useState(0);\n const isMounted = useMountedState();\n\n useLayoutEffect(() => {\n config.addHook('init', (u) => {\n plotInstance.current = u;\n });\n\n config.addHook('draw', () => {\n if (!isMounted()) {\n return;\n }\n setRenderToken((s) => s + 1);\n });\n }, [config, setRenderToken]);\n\n const eventMarkers = useMemo(() => {\n const markers: React.ReactNode[] = [];\n\n if (!plotInstance.current || events.length === 0) {\n return markers;\n }\n\n for (let i = 0; i < events.length; i++) {\n const frame = events[i];\n for (let j = 0; j < frame.length; j++) {\n const coords = mapEventToXYCoords(frame, { fieldIndex: j, frameIndex: i });\n if (!coords) {\n continue;\n }\n markers.push(\n <Marker {...coords} key={`${id}-marker-${i}-${j}`}>\n {renderEventMarker(frame, { fieldIndex: j, frameIndex: i })}\n </Marker>\n );\n }\n }\n\n return <>{markers}</>;\n }, [events, renderEventMarker, renderToken]);\n\n if (!plotInstance.current) {\n return null;\n }\n\n return (\n <XYCanvas\n left={plotInstance.current.bbox.left / window.devicePixelRatio}\n top={plotInstance.current.bbox.top / window.devicePixelRatio}\n >\n {eventMarkers}\n </XYCanvas>\n );\n}\n","import React, { useEffect, useLayoutEffect, useState } from 'react';\n\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\nimport { PlotSelection } from '../types';\nimport { pluginLog } from '../utils';\n\ninterface ZoomPluginProps {\n onZoom: (range: { from: number; to: number }) => void;\n config: UPlotConfigBuilder;\n}\n\n// min px width that triggers zoom\nconst MIN_ZOOM_DIST = 5;\n\n/**\n * @alpha\n */\nexport const ZoomPlugin: React.FC<ZoomPluginProps> = ({ onZoom, config }) => {\n const [selection, setSelection] = useState<PlotSelection | null>(null);\n\n useEffect(() => {\n if (selection) {\n pluginLog('ZoomPlugin', false, 'selected', selection);\n if (selection.bbox.width < MIN_ZOOM_DIST) {\n return;\n }\n onZoom({ from: selection.min, to: selection.max });\n }\n }, [selection]);\n\n useLayoutEffect(() => {\n config.addHook('setSelect', (u) => {\n const min = u.posToVal(u.select.left, 'x');\n const max = u.posToVal(u.select.left + u.select.width, 'x');\n\n setSelection({\n min,\n max,\n bbox: {\n left: u.bbox.left / window.devicePixelRatio + u.select.left,\n top: u.bbox.top / window.devicePixelRatio,\n height: u.bbox.height / window.devicePixelRatio,\n width: u.select.width,\n },\n });\n\n // manually hide selected region (since cursor.drag.setScale = false)\n /* @ts-ignore */\n u.setSelect({ left: 0, width: 0 }, false);\n });\n }, [config]);\n\n return null;\n};\n","import { clamp } from 'lodash';\nimport React, { useLayoutEffect } from 'react';\nimport uPlot from 'uplot';\n\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\ninterface KeyboardPluginProps {\n config: UPlotConfigBuilder; // onkeypress, onkeyup, onkeydown (triggered by vizlayout handlers)\n}\n\nconst PIXELS_PER_MS = 0.1 as const;\nconst SHIFT_MULTIPLIER = 2 as const;\nconst KNOWN_KEYS = new Set(['ArrowRight', 'ArrowLeft', 'ArrowUp', 'ArrowDown', 'Shift', ' ']);\n\nconst initHook = (u: uPlot) => {\n let vizLayoutViz: HTMLElement | null = u.root.closest('[tabindex]');\n let pressedKeys = new Set<string>();\n let dragStartX: number | null = null;\n let keysLastHandledAt: number | null = null;\n\n if (!vizLayoutViz) {\n return;\n }\n\n const moveCursor = (dx: number, dy: number) => {\n const { cursor } = u;\n if (cursor.left === undefined || cursor.top === undefined) {\n return;\n }\n\n const { width, height } = u.over.style;\n const [maxX, maxY] = [Math.floor(parseFloat(width)), Math.floor(parseFloat(height))];\n\n u.setCursor({\n left: clamp(cursor.left + dx, 0, maxX),\n top: clamp(cursor.top + dy, 0, maxY),\n });\n };\n\n const handlePressedKeys = (time: number) => {\n const nothingPressed = pressedKeys.size === 0;\n if (nothingPressed || !u) {\n keysLastHandledAt = null;\n return;\n }\n\n const dt = time - (keysLastHandledAt ?? time);\n const dx = dt * PIXELS_PER_MS;\n let horValue = 0;\n let vertValue = 0;\n\n if (pressedKeys.has('ArrowUp')) {\n vertValue -= dx;\n }\n if (pressedKeys.has('ArrowDown')) {\n vertValue += dx;\n }\n if (pressedKeys.has('ArrowLeft')) {\n horValue -= dx;\n }\n if (pressedKeys.has('ArrowRight')) {\n horValue += dx;\n }\n if (pressedKeys.has('Shift')) {\n horValue *= SHIFT_MULTIPLIER;\n vertValue *= SHIFT_MULTIPLIER;\n }\n\n moveCursor(horValue, vertValue);\n\n const { cursor } = u;\n if (pressedKeys.has(' ') && cursor) {\n const drawHeight = Number(u.over.style.height.slice(0, -2));\n\n u.setSelect(\n {\n left: cursor.left! < dragStartX! ? cursor.left! : dragStartX!,\n top: 0,\n width: Math.abs(cursor.left! - (dragStartX ?? cursor.left!)),\n height: drawHeight,\n },\n false\n );\n }\n\n keysLastHandledAt = time;\n window.requestAnimationFrame(handlePressedKeys);\n };\n\n vizLayoutViz.addEventListener('keydown', (e) => {\n if (e.key === 'Tab') {\n // Hide the cursor if the user tabs away\n u.setCursor({ left: -5, top: -5 });\n return;\n }\n\n if (!KNOWN_KEYS.has(e.key)) {\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const newKey = !pressedKeys.has(e.key);\n if (newKey) {\n const initiateAnimationLoop = pressedKeys.size === 0;\n pressedKeys.add(e.key);\n\n dragStartX = e.key === ' ' && dragStartX === null ? u.cursor.left! : dragStartX;\n\n if (initiateAnimationLoop) {\n window.requestAnimationFrame(handlePressedKeys);\n }\n }\n });\n\n vizLayoutViz.addEventListener('keyup', (e) => {\n if (!KNOWN_KEYS.has(e.key)) {\n return;\n }\n\n pressedKeys.delete(e.key);\n\n if (e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n\n // We do this so setSelect hooks get fired, zooming the plot\n u.setSelect(u.select);\n dragStartX = null;\n }\n });\n\n vizLayoutViz.addEventListener('focus', (e) => {\n // We only want to initialize the cursor if the user is using keyboard controls\n if (!vizLayoutViz?.matches(':focus-visible')) {\n return;\n }\n\n // Is there a more idiomatic way to do this?\n const drawWidth = parseFloat(u.over.style.width);\n const drawHeight = parseFloat(u.over.style.height);\n u.setCursor({ left: drawWidth / 2, top: drawHeight / 2 });\n });\n\n vizLayoutViz.addEventListener('blur', (e) => {\n keysLastHandledAt = null;\n dragStartX = null;\n pressedKeys.clear();\n u.setSelect({ left: 0, top: 0, width: 0, height: 0 }, false);\n });\n};\n\n/**\n * @alpha\n */\nexport const KeyboardPlugin: React.FC<KeyboardPluginProps> = ({ config }) => {\n useLayoutEffect(() => config.addHook('init', initHook), [config]);\n\n return null;\n};\n","import { isNumber } from 'lodash';\nimport uPlot from 'uplot';\n\nimport {\n DashboardCursorSync,\n DataFrame,\n DataHoverClearEvent,\n DataHoverEvent,\n DataHoverPayload,\n FieldConfig,\n FieldType,\n formattedValueToString,\n getFieldColorModeForField,\n getFieldSeriesColor,\n getFieldDisplayName,\n getDisplayProcessor,\n FieldColorModeId,\n DecimalCount,\n} from '@grafana/data';\nimport {\n AxisPlacement,\n GraphDrawStyle,\n GraphFieldConfig,\n GraphTresholdsStyleMode,\n VisibilityMode,\n ScaleDirection,\n ScaleOrientation,\n StackingMode,\n GraphTransform,\n AxisColorMode,\n GraphGradientMode,\n} from '@grafana/schema';\n\nimport { buildScaleKey } from '../GraphNG/utils';\nimport { UPlotConfigBuilder, UPlotConfigPrepFn } from '../uPlot/config/UPlotConfigBuilder';\nimport { getScaleGradientFn } from '../uPlot/config/gradientFills';\nimport { getStackingGroups, preparePlotData2 } from '../uPlot/utils';\n\nconst defaultFormatter = (v: any, decimals: DecimalCount = 1) => (v == null ? '-' : v.toFixed(decimals));\n\nconst defaultConfig: GraphFieldConfig = {\n drawStyle: GraphDrawStyle.Line,\n showPoints: VisibilityMode.Auto,\n axisPlacement: AxisPlacement.Auto,\n};\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<{\n sync?: () => DashboardCursorSync;\n}> = ({\n frame,\n theme,\n timeZones,\n getTimeRange,\n eventBus,\n sync,\n allFrames,\n renderers,\n tweakScale = (opts) => opts,\n tweakAxis = (opts) => opts,\n}) => {\n const builder = new UPlotConfigBuilder(timeZones[0]);\n\n let alignedFrame: DataFrame;\n\n builder.setPrepData((frames) => {\n // cache alignedFrame\n alignedFrame = frames[0];\n\n return preparePlotData2(frames[0], builder.getStackingGroups());\n });\n\n // X is the first field in the aligned frame\n const xField = frame.fields[0];\n if (!xField) {\n return builder; // empty frame with no options\n }\n\n let seriesIndex = 0;\n\n const xScaleKey = 'x';\n let xScaleUnit = '_x';\n let yScaleKey = '';\n\n const xFieldAxisPlacement =\n xField.config.custom?.axisPlacement !== AxisPlacement.Hidden ? AxisPlacement.Bottom : AxisPlacement.Hidden;\n const xFieldAxisShow = xField.config.custom?.axisPlacement !== AxisPlacement.Hidden;\n\n if (xField.type === FieldType.time) {\n xScaleUnit = 'time';\n builder.addScale({\n scaleKey: xScaleKey,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n isTime: true,\n range: () => {\n const r = getTimeRange();\n return [r.from.valueOf(), r.to.valueOf()];\n },\n });\n\n // filters first 2 ticks to make space for timezone labels\n const filterTicks: uPlot.Axis.Filter | undefined =\n timeZones.length > 1\n ? (u, splits) => {\n return splits.map((v, i) => (i < 2 ? null : v));\n }\n : undefined;\n\n for (let i = 0; i < timeZones.length; i++) {\n const timeZone = timeZones[i];\n builder.addAxis({\n scaleKey: xScaleKey,\n isTime: true,\n placement: xFieldAxisPlacement,\n show: xFieldAxisShow,\n label: xField.config.custom?.axisLabel,\n timeZone,\n theme,\n grid: { show: i === 0 && xField.config.custom?.axisGridShow },\n filter: filterTicks,\n });\n }\n\n // render timezone labels\n if (timeZones.length > 1) {\n builder.addHook('drawAxes', (u: uPlot) => {\n u.ctx.save();\n\n u.ctx.fillStyle = theme.colors.text.primary;\n u.ctx.textAlign = 'left';\n u.ctx.textBaseline = 'bottom';\n\n let i = 0;\n u.axes.forEach((a) => {\n if (a.side === 2) {\n //@ts-ignore\n let cssBaseline: number = a._pos + a._size;\n u.ctx.fillText(timeZones[i], u.bbox.left, cssBaseline * uPlot.pxRatio);\n i++;\n }\n });\n\n u.ctx.restore();\n });\n }\n } else {\n // Not time!\n if (xField.config.unit) {\n xScaleUnit = xField.config.unit;\n }\n\n builder.addScale({\n scaleKey: xScaleKey,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n });\n\n builder.addAxis({\n scaleKey: xScaleKey,\n placement: xFieldAxisPlacement,\n show: xFieldAxisShow,\n label: xField.config.custom?.axisLabel,\n theme,\n grid: { show: xField.config.custom?.axisGridShow },\n });\n }\n\n let customRenderedFields =\n renderers?.flatMap((r) => Object.values(r.fieldMap).filter((name) => r.indicesOnly.indexOf(name) === -1)) ?? [];\n\n let indexByName: Map<string, number> | undefined;\n\n for (let i = 1; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n\n const config = {\n ...field.config,\n custom: {\n ...defaultConfig,\n ...field.config.custom,\n },\n } as FieldConfig<GraphFieldConfig>;\n\n const customConfig: GraphFieldConfig = config.custom!;\n\n if (field === xField || field.type !== FieldType.number) {\n continue;\n }\n\n // TODO: skip this for fields with custom renderers?\n field.state!.seriesIndex = seriesIndex++;\n\n let fmt = field.display ?? defaultFormatter;\n if (field.config.custom?.stacking?.mode === StackingMode.Percent) {\n fmt = getDisplayProcessor({\n field: {\n ...field,\n config: {\n ...field.config,\n unit: 'percentunit',\n },\n },\n theme,\n });\n }\n const scaleKey = buildScaleKey(config);\n const colorMode = getFieldColorModeForField(field);\n const scaleColor = getFieldSeriesColor(field, theme);\n const seriesColor = scaleColor.color;\n\n // The builder will manage unique scaleKeys and combine where appropriate\n builder.addScale(\n tweakScale(\n {\n scaleKey,\n orientation: ScaleOrientation.Vertical,\n direction: ScaleDirection.Up,\n distribution: customConfig.scaleDistribution?.type,\n log: customConfig.scaleDistribution?.log,\n min: field.config.min,\n max: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n centeredZero: customConfig.axisCenteredZero,\n },\n field\n )\n );\n\n if (!yScaleKey) {\n yScaleKey = scaleKey;\n }\n\n if (customConfig.axisPlacement !== AxisPlacement.Hidden) {\n let axisColor: uPlot.Axis.Stroke | undefined;\n\n if (customConfig.axisColorMode === AxisColorMode.Series) {\n if (\n colorMode.isByValue &&\n field.config.custom?.gradientMode === GraphGradientMode.Scheme &&\n colorMode.id === FieldColorModeId.Thresholds\n ) {\n axisColor = getScaleGradientFn(1, theme, colorMode, field.config.thresholds);\n } else {\n axisColor = seriesColor;\n }\n }\n\n let axisColorOpts = {};\n\n if (axisColor) {\n axisColorOpts = {\n border: {\n show: true,\n width: 1,\n stroke: axisColor,\n },\n ticks: {\n stroke: axisColor,\n },\n color: customConfig.axisColorMode === AxisColorMode.Series ? axisColor : undefined,\n };\n }\n\n builder.addAxis(\n tweakAxis(\n {\n scaleKey,\n label: customConfig.axisLabel,\n size: customConfig.axisWidth,\n placement: customConfig.axisPlacement ?? AxisPlacement.Auto,\n formatValue: (v, decimals) => formattedValueToString(fmt(v, config.decimals ?? decimals)),\n theme,\n grid: { show: customConfig.axisGridShow },\n show: customConfig.hideFrom?.viz === false,\n ...axisColorOpts,\n },\n field\n )\n );\n }\n\n const showPoints =\n customConfig.drawStyle === GraphDrawStyle.Points ? VisibilityMode.Always : customConfig.showPoints;\n\n let pointsFilter: uPlot.Series.Points.Filter = () => null;\n\n if (customConfig.spanNulls !== true) {\n pointsFilter = (u, seriesIdx, show, gaps) => {\n let filtered = [];\n\n let series = u.series[seriesIdx];\n\n if (!show && gaps && gaps.length) {\n const [firstIdx, lastIdx] = series.idxs!;\n const xData = u.data[0];\n const yData = u.data[seriesIdx];\n const firstPos = Math.round(u.valToPos(xData[firstIdx], 'x', true));\n const lastPos = Math.round(u.valToPos(xData[lastIdx], 'x', true));\n\n if (gaps[0][0] === firstPos) {\n filtered.push(firstIdx);\n }\n\n // show single points between consecutive gaps that share end/start\n for (let i = 0; i < gaps.length; i++) {\n let thisGap = gaps[i];\n let nextGap = gaps[i + 1];\n\n if (nextGap && thisGap[1] === nextGap[0]) {\n // approx when data density is > 1pt/px, since gap start/end pixels are rounded\n let approxIdx = u.posToIdx(thisGap[1], true);\n\n if (yData[approxIdx] == null) {\n // scan left/right alternating to find closest index with non-null value\n for (let j = 1; j < 100; j++) {\n if (yData[approxIdx + j] != null) {\n approxIdx += j;\n break;\n }\n if (yData[approxIdx - j] != null) {\n approxIdx -= j;\n break;\n }\n }\n }\n\n filtered.push(approxIdx);\n }\n }\n\n if (gaps[gaps.length - 1][1] === lastPos) {\n filtered.push(lastIdx);\n }\n }\n\n return filtered.length ? filtered : null;\n };\n }\n\n let { fillOpacity } = customConfig;\n\n let pathBuilder: uPlot.Series.PathBuilder | null = null;\n let pointsBuilder: uPlot.Series.Points.Show | null = null;\n\n if (field.state?.origin) {\n if (!indexByName) {\n indexByName = getNamesToFieldIndex(frame, allFrames);\n }\n\n const originFrame = allFrames[field.state.origin.frameIndex];\n const originField = originFrame?.fields[field.state.origin.fieldIndex];\n\n const dispName = getFieldDisplayName(originField ?? field, originFrame, allFrames);\n\n // disable default renderers\n if (customRenderedFields.indexOf(dispName) >= 0) {\n pathBuilder = () => null;\n pointsBuilder = () => undefined;\n } else if (customConfig.transform === GraphTransform.Constant) {\n // patch some monkeys!\n const defaultBuilder = uPlot.paths!.linear!();\n\n pathBuilder = (u, seriesIdx) => {\n //eslint-disable-next-line\n const _data: any[] = (u as any)._data; // uplot.AlignedData not exposed in types\n\n // the data we want the line renderer to pull is x at each plot edge with paired flat y values\n\n const r = getTimeRange();\n let xData = [r.from.valueOf(), r.to.valueOf()];\n let firstY = _data[seriesIdx].find((v: number | null | undefined) => v != null);\n let yData = [firstY, firstY];\n let fauxData = _data.slice();\n fauxData[0] = xData;\n fauxData[seriesIdx] = yData;\n\n //eslint-disable-next-line\n return defaultBuilder(\n {\n ...u,\n _data: fauxData,\n } as any,\n seriesIdx,\n 0,\n 1\n );\n };\n }\n\n if (customConfig.fillBelowTo) {\n const t = indexByName.get(dispName);\n const b = indexByName.get(customConfig.fillBelowTo);\n if (isNumber(b) && isNumber(t)) {\n builder.addBand({\n series: [t, b],\n fill: undefined, // using null will have the band use fill options from `t`\n });\n\n if (!fillOpacity) {\n fillOpacity = 35; // default from flot\n }\n } else {\n fillOpacity = 0;\n }\n }\n }\n\n let dynamicSeriesColor: ((seriesIdx: number) => string | undefined) | undefined = undefined;\n\n if (colorMode.id === FieldColorModeId.Thresholds) {\n dynamicSeriesColor = (seriesIdx) => getFieldSeriesColor(alignedFrame.fields[seriesIdx], theme).color;\n }\n\n builder.addSeries({\n pathBuilder,\n pointsBuilder,\n scaleKey,\n showPoints,\n pointsFilter,\n colorMode,\n fillOpacity,\n theme,\n dynamicSeriesColor,\n drawStyle: customConfig.drawStyle!,\n lineColor: customConfig.lineColor ?? seriesColor,\n lineWidth: customConfig.lineWidth,\n lineInterpolation: customConfig.lineInterpolation,\n lineStyle: customConfig.lineStyle,\n barAlignment: customConfig.barAlignment,\n barWidthFactor: customConfig.barWidthFactor,\n barMaxWidth: customConfig.barMaxWidth,\n pointSize: customConfig.pointSize,\n spanNulls: customConfig.spanNulls || false,\n show: !customConfig.hideFrom?.viz,\n gradientMode: customConfig.gradientMode,\n thresholds: config.thresholds,\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n dataFrameFieldIndex: field.state?.origin,\n });\n\n // Render thresholds in graph\n if (customConfig.thresholdsStyle && config.thresholds) {\n const thresholdDisplay = customConfig.thresholdsStyle.mode ?? GraphTresholdsStyleMode.Off;\n if (thresholdDisplay !== GraphTresholdsStyleMode.Off) {\n builder.addThresholds({\n config: customConfig.thresholdsStyle,\n thresholds: config.thresholds,\n scaleKey,\n theme,\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n });\n }\n }\n }\n\n let stackingGroups = getStackingGroups(frame);\n\n builder.setStackingGroups(stackingGroups);\n\n // hook up custom/composite renderers\n renderers?.forEach((r) => {\n if (!indexByName) {\n indexByName = getNamesToFieldIndex(frame, allFrames);\n }\n let fieldIndices: Record<string, number> = {};\n\n for (let key in r.fieldMap) {\n let dispName = r.fieldMap[key];\n fieldIndices[key] = indexByName.get(dispName)!;\n }\n\n r.init(builder, fieldIndices);\n });\n\n builder.scaleKeys = [xScaleKey, yScaleKey];\n\n // if hovered value is null, how far we may scan left/right to hover nearest non-null\n const hoverProximityPx = 15;\n\n let cursor: Partial<uPlot.Cursor> = {\n // this scans left and right from cursor position to find nearest data index with value != null\n // TODO: do we want to only scan past undefined values, but halt at explicit null values?\n dataIdx: (self, seriesIdx, hoveredIdx, cursorXVal) => {\n let seriesData = self.data[seriesIdx];\n\n if (seriesData[hoveredIdx] == null) {\n let nonNullLft = null,\n nonNullRgt = null,\n i;\n\n i = hoveredIdx;\n while (nonNullLft == null && i-- > 0) {\n if (seriesData[i] != null) {\n nonNullLft = i;\n }\n }\n\n i = hoveredIdx;\n while (nonNullRgt == null && i++ < seriesData.length) {\n if (seriesData[i] != null) {\n nonNullRgt = i;\n }\n }\n\n let xVals = self.data[0];\n\n let curPos = self.valToPos(cursorXVal, 'x');\n let rgtPos = nonNullRgt == null ? Infinity : self.valToPos(xVals[nonNullRgt], 'x');\n let lftPos = nonNullLft == null ? -Infinity : self.valToPos(xVals[nonNullLft], 'x');\n\n let lftDelta = curPos - lftPos;\n let rgtDelta = rgtPos - curPos;\n\n if (lftDelta <= rgtDelta) {\n if (lftDelta <= hoverProximityPx) {\n hoveredIdx = nonNullLft!;\n }\n } else {\n if (rgtDelta <= hoverProximityPx) {\n hoveredIdx = nonNullRgt!;\n }\n }\n }\n\n return hoveredIdx;\n },\n };\n\n if (sync && sync() !== DashboardCursorSync.Off) {\n const payload: DataHoverPayload = {\n point: {\n [xScaleKey]: null,\n [yScaleKey]: null,\n },\n data: frame,\n };\n const hoverEvent = new DataHoverEvent(payload);\n cursor.sync = {\n key: '__global_',\n filters: {\n pub: (type: string, src: uPlot, x: number, y: number, w: number, h: number, dataIdx: number) => {\n if (sync && sync() === DashboardCursorSync.Off) {\n return false;\n }\n\n payload.rowIndex = dataIdx;\n if (x < 0 && y < 0) {\n payload.point[xScaleUnit] = null;\n payload.point[yScaleKey] = null;\n eventBus.publish(new DataHoverClearEvent());\n } else {\n // convert the points\n payload.point[xScaleUnit] = src.posToVal(x, xScaleKey);\n payload.point[yScaleKey] = src.posToVal(y, yScaleKey);\n payload.point.panelRelY = y > 0 ? y / h : 1; // used by old graph panel to position tooltip\n eventBus.publish(hoverEvent);\n hoverEvent.payload.down = undefined;\n }\n return true;\n },\n },\n scales: [xScaleKey, yScaleKey],\n // match: [() => true, (a, b) => a === b],\n };\n }\n\n builder.setSync();\n builder.setCursor(cursor);\n\n return builder;\n};\n\nexport function getNamesToFieldIndex(frame: DataFrame, allFrames: DataFrame[]): Map<string, number> {\n const originNames = new Map<string, number>();\n frame.fields.forEach((field, i) => {\n const origin = field.state?.origin;\n if (origin) {\n const origField = allFrames[origin.frameIndex]?.fields[origin.fieldIndex];\n if (origField) {\n originNames.set(getFieldDisplayName(origField, allFrames[origin.frameIndex], allFrames), i);\n }\n }\n });\n return originNames;\n}\n","import React from 'react';\n\nimport { DataFrame, TimeRange } from '@grafana/data';\n\nimport { PropDiffFn } from '../../../../../packages/grafana-ui/src/components/GraphNG/GraphNG';\nimport { withTheme2 } from '../../themes/ThemeContext';\nimport { GraphNG, GraphNGProps } from '../GraphNG/GraphNG';\nimport { PanelContext, PanelContextRoot } from '../PanelChrome/PanelContext';\nimport { PlotLegend } from '../uPlot/PlotLegend';\nimport { UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder';\n\nimport { preparePlotConfigBuilder } from './utils';\n\nconst propsToDiff: Array<string | PropDiffFn> = ['legend', 'options'];\n\ntype TimeSeriesProps = Omit<GraphNGProps, 'prepConfig' | 'propsToDiff' | 'renderLegend'>;\n\nexport class UnthemedTimeSeries extends React.Component<TimeSeriesProps> {\n static contextType = PanelContextRoot;\n panelContext: PanelContext = {} as PanelContext;\n\n prepConfig = (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => {\n const { eventBus, sync } = this.context as PanelContext;\n const { theme, timeZones, renderers, tweakAxis, tweakScale } = this.props;\n\n return preparePlotConfigBuilder({\n frame: alignedFrame,\n theme,\n timeZones: Array.isArray(timeZones) ? timeZones : [timeZones],\n getTimeRange,\n eventBus,\n sync,\n allFrames,\n renderers,\n tweakScale,\n tweakAxis,\n });\n };\n\n renderLegend = (config: UPlotConfigBuilder) => {\n const { legend, frames } = this.props;\n\n //hides and shows the legend ON the uPlot graph\n if (!config || (legend && !legend.showLegend)) {\n return null;\n }\n\n return <PlotLegend data={frames} config={config} {...legend} />;\n };\n\n render() {\n return (\n <GraphNG\n {...this.props}\n prepConfig={this.prepConfig}\n propsToDiff={propsToDiff}\n renderLegend={this.renderLegend as any}\n />\n );\n }\n}\n\nexport const TimeSeries = withTheme2(UnthemedTimeSeries);\nTimeSeries.displayName = 'TimeSeries';\n","import React, { useCallback, useContext } from 'react';\n\nimport { DataFrame, DataFrameFieldIndex, Field } from '@grafana/data';\n\nimport { XYFieldMatchers } from './types';\n\n/** @alpha */\ninterface GraphNGContextType {\n mapSeriesIndexToDataFrameFieldIndex: (index: number) => DataFrameFieldIndex;\n dimFields: XYFieldMatchers;\n data: DataFrame;\n}\n\n/** @alpha */\nexport const GraphNGContext = React.createContext<GraphNGContextType>({} as GraphNGContextType);\n\n/**\n * @alpha\n * Exposes API for data frame inspection in Plot plugins\n */\nexport const useGraphNGContext = () => {\n const { data, dimFields, mapSeriesIndexToDataFrameFieldIndex } = useContext<GraphNGContextType>(GraphNGContext);\n\n const getXAxisField = useCallback(() => {\n const xFieldMatcher = dimFields.x;\n let xField: Field | null = null;\n\n for (let j = 0; j < data.fields.length; j++) {\n if (xFieldMatcher(data.fields[j], data, [data])) {\n xField = data.fields[j];\n break;\n }\n }\n\n return xField;\n }, [data, dimFields]);\n\n return {\n dimFields,\n mapSeriesIndexToDataFrameFieldIndex,\n getXAxisField,\n alignedData: data,\n };\n};\n","/** @jsxImportSource @emotion/react */\n\nimport { css, cx } from '@emotion/css';\nimport classnames from 'classnames';\nimport { Profiler, ProfilerOnRenderCallback, useState, FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { Button } from '../Button';\nimport { VerticalGroup } from '../Layout/Layout';\n\nexport function EmotionPerfTest() {\n console.log('process.env.NODE_ENV', process.env.NODE_ENV);\n\n return (\n <VerticalGroup>\n <div>Emotion performance tests</div>\n <TestScenario name=\"No styles\" Component={NoStyles} />\n <TestScenario name=\"inline emotion/css\" Component={InlineEmotionCSS} />\n <TestScenario name=\"useStyles no cx\" Component={UseStylesNoCX} />\n <TestScenario name=\"useStyles with conditional cx styles\" Component={UseStylesWithConditionalCX} />\n <TestScenario name=\"useStyles with css prop\" Component={UseStylesWithCSSProp} />\n <TestScenario name=\"useStyles with conditional css prop\" Component={UseStylesWithConditionalCSS} />\n <TestScenario name=\"useStyles with conditional classnames\" Component={UseStylesWithConditionalClassNames} />\n </VerticalGroup>\n );\n}\n\nexport const TestScenario: FC<{ name: string; Component: FC<TestComponentProps> }> = ({ name, Component }) => {\n const [render, setRender] = useState(0);\n\n return (\n <div>\n <Button onClick={() => setRender(render > 2 ? 0 : render + 1)}>{name}</Button>\n {render > 0 && <MeasureRender id={name}>{renderManyComponents(Component)}</MeasureRender>}\n </div>\n );\n};\n\nTestScenario.displayName = 'TestScenario';\n\nfunction renderManyComponents(Component: FC<TestComponentProps>) {\n const elements: React.ReactNode[] = [];\n\n for (let i = 0; i < 5000; i++) {\n elements.push(<Component index={i} key={i.toString()} />);\n }\n\n return <div style={{ display: 'flex', flexWrap: 'wrap' }}>{elements}</div>;\n}\n\ninterface TestComponentProps {\n index: number;\n}\n\nfunction UseStylesNoCX({ index }: TestComponentProps) {\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.main}>\n <div className={styles.child}>{index}</div>\n </div>\n );\n}\n\nfunction UseStylesWithConditionalCX({ index }: TestComponentProps) {\n const styles = useStyles2(getStyles);\n const mainStyles = cx(styles.main, { [styles.large]: index > 10, [styles.disabed]: index % 10 === 0 });\n\n return (\n <div className={mainStyles}>\n <div className={styles.child}>{index}</div>\n </div>\n );\n}\n\nfunction UseStylesWithConditionalClassNames({ index }: TestComponentProps) {\n const styles = useStyles2(getStyles);\n const mainStyles = classnames(styles.main, { [styles.large]: index > 10, [styles.disabed]: index % 10 === 0 });\n\n return (\n <div className={mainStyles}>\n <div className={styles.child}>{index}</div>\n </div>\n );\n}\n\nfunction UseStylesWithCSSProp({ index }: TestComponentProps) {\n const styles = useStyles2(getStylesObjects);\n\n return (\n <div css={styles.main}>\n <div css={styles.child}>{index}</div>\n </div>\n );\n}\n\nfunction UseStylesWithConditionalCSS({ index }: TestComponentProps) {\n const styles = useStyles2(getStylesObjects);\n const mainStyles = [styles.main, index > 10 && styles.large, index % 10 === 0 && styles.disabed];\n return (\n <div css={mainStyles}>\n <div css={styles.child}>{index}</div>\n </div>\n );\n}\n\nfunction InlineEmotionCSS({ index }: TestComponentProps) {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <div className={styles.main}>\n <div className={styles.child}>{index}</div>\n </div>\n );\n}\n\nfunction NoStyles({ index }: TestComponentProps) {\n return (\n <div className=\"no-styles-main\">\n <div className=\"no-styles-child\">{index}</div>\n </div>\n );\n}\n\nfunction MeasureRender({ children, id }: { children: React.ReactNode; id: string }) {\n const onRender: ProfilerOnRenderCallback = (\n id: string,\n phase: 'mount' | 'update',\n actualDuration: number,\n baseDuration: number,\n startTime: number,\n commitTime: number\n ) => {\n console.log('Profile ' + id, actualDuration);\n };\n\n return (\n <Profiler id={id} onRender={onRender}>\n {children}\n </Profiler>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n main: css(getStylesObjectMain(theme)),\n large: css({\n fontSize: '20px',\n color: 'red',\n }),\n disabed: css({\n fontSize: '10px',\n color: 'gray',\n }),\n child: css(getStylesObjectChild(theme)),\n };\n};\n\nconst getStylesObjects = (theme: GrafanaTheme2) => {\n return {\n main: getStylesObjectMain(theme),\n large: {\n fontSize: '20px',\n color: 'red',\n },\n disabed: {\n fontSize: '10px',\n color: 'gray',\n },\n child: getStylesObjectChild(theme),\n };\n};\n\nfunction getStylesObjectMain(theme: GrafanaTheme2): any {\n return {\n background: 'blue',\n border: '1px solid red',\n color: 'white',\n padding: theme.spacing(1),\n shadow: theme.shadows.z1,\n ':hover': {\n background: theme.colors.background.primary,\n },\n };\n}\n\nfunction getStylesObjectChild(theme: GrafanaTheme2): any {\n return {\n padding: '2px',\n fontSize: '10px',\n boxShadow: 'none',\n textAlign: 'center',\n textDecoration: 'none',\n };\n}\n","import { cx, css } from '@emotion/css';\nimport React, { forwardRef, HTMLAttributes, useCallback } from 'react';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useTheme2 } from '../../themes';\nimport { HighlightPart } from '../../types';\nimport { PartialHighlighter } from '../Typeahead/PartialHighlighter';\n\ntype OnLabelClick = (name: string, value: string | undefined, event: React.MouseEvent<HTMLElement>) => void;\n\ninterface Props extends Omit<HTMLAttributes<HTMLElement>, 'onClick'> {\n name: string;\n active?: boolean;\n loading?: boolean;\n searchTerm?: string;\n value?: string;\n facets?: number;\n title?: string;\n highlightParts?: HighlightPart[];\n onClick?: OnLabelClick;\n}\n\n/**\n * @internal\n */\nexport const Label = forwardRef<HTMLElement, Props>(\n (\n {\n name,\n value,\n hidden,\n facets,\n onClick,\n className,\n loading,\n searchTerm,\n active,\n style,\n title,\n highlightParts,\n ...rest\n },\n ref\n ) => {\n const theme = useTheme2();\n const styles = getLabelStyles(theme);\n const searchWords = searchTerm ? [searchTerm] : [];\n\n const onLabelClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (onClick && !hidden) {\n onClick(name, value, event);\n }\n },\n [onClick, name, hidden, value]\n );\n\n // Using this component for labels and label values. If value is given use value for display text.\n let text = value || name;\n if (facets) {\n text = `${text} (${facets})`;\n }\n\n return (\n <span\n key={text}\n ref={ref}\n onClick={onLabelClick}\n style={style}\n title={title || text}\n role=\"option\"\n aria-selected={!!active}\n className={cx(\n styles.base,\n active && styles.active,\n loading && styles.loading,\n hidden && styles.hidden,\n className,\n onClick && !hidden && styles.hover\n )}\n {...rest}\n >\n {highlightParts !== undefined ? (\n <PartialHighlighter text={text} highlightClassName={styles.matchHighLight} highlightParts={highlightParts} />\n ) : (\n <Highlighter\n textToHighlight={text}\n searchWords={searchWords}\n autoEscape\n highlightClassName={styles.matchHighLight}\n />\n )}\n </span>\n );\n }\n);\n\nLabel.displayName = 'Label';\n\nconst getLabelStyles = (theme: GrafanaTheme2) => ({\n base: css`\n display: inline-block;\n cursor: pointer;\n font-size: ${theme.typography.size.sm};\n line-height: ${theme.typography.bodySmall.lineHeight};\n background-color: ${theme.colors.background.secondary};\n color: ${theme.colors.text};\n white-space: nowrap;\n text-shadow: none;\n padding: ${theme.spacing(0.5)};\n border-radius: ${theme.shape.borderRadius()};\n margin-right: ${theme.spacing(1)};\n margin-bottom: ${theme.spacing(0.5)};\n `,\n loading: css`\n font-weight: ${theme.typography.fontWeightMedium};\n background-color: ${theme.colors.primary.shade};\n color: ${theme.colors.text.primary};\n animation: pulse 3s ease-out 0s infinite normal forwards;\n @keyframes pulse {\n 0% {\n color: ${theme.colors.text.primary};\n }\n 50% {\n color: ${theme.colors.text.secondary};\n }\n 100% {\n color: ${theme.colors.text.disabled};\n }\n }\n `,\n active: css`\n font-weight: ${theme.typography.fontWeightMedium};\n background-color: ${theme.colors.primary.main};\n color: ${theme.colors.primary.contrastText};\n `,\n matchHighLight: css`\n background: inherit;\n color: ${theme.components.textHighlight.text};\n background-color: ${theme.components.textHighlight.background};\n `,\n hidden: css`\n opacity: 0.6;\n cursor: default;\n border: 1px solid transparent;\n `,\n hover: css`\n &:hover {\n opacity: 0.85;\n cursor: pointer;\n }\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { useStyles2 } from '../../themes';\n\ntype Props = DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\nexport const PanelContainer = ({ children, className, ...props }: Props) => {\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles, className)} {...props}>\n {children}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) =>\n css`\n background-color: ${theme.components.panel.background};\n border: 1px solid ${theme.components.panel.borderColor};\n border-radius: 3px;\n `;\n","import { FormField } from './FormField/FormField';\nimport { Input, LegacyInputStatus } from './Forms/Legacy/Input/Input';\nimport { IndicatorsContainer } from './Forms/Legacy/Select/IndicatorsContainer';\nimport { NoOptionsMessage } from './Forms/Legacy/Select/NoOptionsMessage';\nimport { AsyncSelect, Select } from './Forms/Legacy/Select/Select';\nimport { Switch } from './Forms/Legacy/Switch/Switch';\nimport { SecretFormField } from './SecretFormField/SecretFormField';\n\nexport { Icon } from './Icon/Icon';\nexport { IconButton, IconButtonVariant } from './IconButton/IconButton';\nexport { ConfirmButton } from './ConfirmButton/ConfirmButton';\nexport { DeleteButton } from './ConfirmButton/DeleteButton';\nexport { Tooltip } from './Tooltip/Tooltip';\nexport { PopoverContent } from './Tooltip/types';\nexport { PopoverController } from './Tooltip/PopoverController';\nexport { Popover } from './Tooltip/Popover';\nexport { Portal, getPortalContainer, PortalContainer } from './Portal/Portal';\nexport { CustomScrollbar, ScrollbarPosition } from './CustomScrollbar/CustomScrollbar';\nexport { TabbedContainer, TabConfig } from './TabbedContainer/TabbedContainer';\n\nexport { ClipboardButton } from './ClipboardButton/ClipboardButton';\nexport { Cascader, CascaderOption } from './Cascader/Cascader';\nexport { ButtonCascader } from './ButtonCascader/ButtonCascader';\nexport { InlineToast } from './InlineToast/InlineToast';\n\nexport { LoadingPlaceholder, LoadingPlaceholderProps } from './LoadingPlaceholder/LoadingPlaceholder';\nexport { ColorPicker, SeriesColorPicker } from './ColorPicker/ColorPicker';\nexport { ColorPickerInput } from './ColorPicker/ColorPickerInput';\nexport { SeriesColorPickerPopover, SeriesColorPickerPopoverWithTheme } from './ColorPicker/SeriesColorPickerPopover';\nexport { EmptySearchResult } from './EmptySearchResult/EmptySearchResult';\nexport { UnitPicker } from './UnitPicker/UnitPicker';\nexport { StatsPicker } from './StatsPicker/StatsPicker';\nexport { RefreshPicker, defaultIntervals } from './RefreshPicker/RefreshPicker';\nexport { TimeRangePicker, TimeRangePickerProps } from './DateTimePickers/TimeRangePicker';\nexport { TimeOfDayPicker } from './DateTimePickers/TimeOfDayPicker';\nexport { TimeZonePicker } from './DateTimePickers/TimeZonePicker';\nexport { WeekStartPicker } from './DateTimePickers/WeekStartPicker';\nexport { DatePicker, DatePickerProps } from './DateTimePickers/DatePicker/DatePicker';\nexport {\n DatePickerWithInput,\n DatePickerWithInputProps,\n} from './DateTimePickers/DatePickerWithInput/DatePickerWithInput';\nexport { DateTimePicker } from './DateTimePickers/DateTimePicker/DateTimePicker';\nexport { List } from './List/List';\nexport { TagsInput } from './TagsInput/TagsInput';\nexport { Pagination } from './Pagination/Pagination';\nexport { Tag, OnTagClick } from './Tags/Tag';\nexport { TagList } from './Tags/TagList';\nexport { FilterPill } from './FilterPill/FilterPill';\n\nexport { ConfirmModal, ConfirmModalProps } from './ConfirmModal/ConfirmModal';\nexport { QueryField } from './QueryField/QueryField';\n\nexport { CodeEditor } from './Monaco/CodeEditor';\n\nexport { ReactMonacoEditorLazy as ReactMonacoEditor } from './Monaco/ReactMonacoEditorLazy';\n\nexport {\n Monaco,\n monacoTypes,\n MonacoEditor,\n MonacoOptions as CodeEditorMonacoOptions,\n CodeEditorSuggestionItem,\n CodeEditorSuggestionItemKind,\n} from './Monaco/types';\nexport { variableSuggestionToCodeEditorSuggestion } from './Monaco/utils';\n\n// TODO: namespace\nexport { Modal } from './Modal/Modal';\nexport { ModalHeader } from './Modal/ModalHeader';\nexport { ModalTabsHeader } from './Modal/ModalTabsHeader';\nexport { ModalTabContent } from './Modal/ModalTabContent';\nexport { ModalsProvider, ModalRoot, ModalsController, ModalsContext } from './Modal/ModalsContext';\nexport { PageToolbar } from './PageLayout/PageToolbar';\n\n// Renderless\nexport { SetInterval } from './SetInterval/SetInterval';\n\nexport { Table } from './Table/Table';\nexport { TableCellDisplayMode, TableSortByFieldState } from './Table/types';\nexport { TableInputCSV } from './TableInputCSV/TableInputCSV';\nexport { TabsBar } from './Tabs/TabsBar';\nexport { Tab } from './Tabs/Tab';\nexport { VerticalTab } from './Tabs/VerticalTab';\nexport { TabContent } from './Tabs/TabContent';\nexport { Counter } from './Tabs/Counter';\n\n// Visualizations\nexport {\n BigValue,\n BigValueColorMode,\n BigValueGraphMode,\n BigValueJustifyMode,\n BigValueTextMode,\n} from './BigValue/BigValue';\nexport { Sparkline } from './Sparkline/Sparkline';\n\nexport { Gauge } from './Gauge/Gauge';\nexport { Graph } from './Graph/Graph';\nexport { GraphWithLegend } from './Graph/GraphWithLegend';\nexport { GraphContextMenu, GraphContextMenuHeader } from './Graph/GraphContextMenu';\nexport { BarGauge, BarGaugeDisplayMode } from './BarGauge/BarGauge';\nexport {\n VizTooltip,\n VizTooltipContainer,\n SeriesTable,\n SeriesTableProps,\n SeriesTableRow,\n SeriesTableRowProps,\n} from './VizTooltip';\nexport { VizRepeater, VizRepeaterRenderValueProps } from './VizRepeater/VizRepeater';\nexport { graphTimeFormat, graphTickFormatter } from './Graph/utils';\nexport {\n PanelChrome,\n PanelChromeProps,\n PanelPadding,\n PanelChromeType,\n PanelChromeLoadingIndicator,\n PanelChromeLoadingIndicatorProps,\n PanelChromeErrorIndicator,\n PanelChromeErrorIndicatorProps,\n PanelContextProvider,\n PanelContext,\n PanelContextRoot,\n usePanelContext,\n} from './PanelChrome';\nexport { VizLayout, VizLayoutComponentType, VizLayoutLegendProps, VizLayoutProps } from './VizLayout/VizLayout';\nexport { VizLegendItem, SeriesVisibilityChangeBehavior } from './VizLegend/types';\nexport { VizLegend } from './VizLegend/VizLegend';\nexport { VizLegendListItem } from './VizLegend/VizLegendListItem';\n\nexport { Alert, AlertVariant } from './Alert/Alert';\nexport { GraphSeriesToggler, GraphSeriesTogglerAPI } from './Graph/GraphSeriesToggler';\nexport { Collapse, ControlledCollapse } from './Collapse/Collapse';\nexport { CollapsableSection } from './Collapse/CollapsableSection';\nexport { LogLabels } from './Logs/LogLabels';\nexport { LogMessageAnsi } from './Logs/LogMessageAnsi';\nexport { LogRows } from './Logs/LogRows';\nexport { getLogRowStyles } from './Logs/getLogRowStyles';\nexport { DataLinkButton } from './DataLinks/DataLinkButton';\nexport { FieldLinkList } from './DataLinks/FieldLinkList';\n// Panel editors\nexport { FullWidthButtonContainer } from './Button/FullWidthButtonContainer';\nexport { ClickOutsideWrapper } from './ClickOutsideWrapper/ClickOutsideWrapper';\nexport * from './SingleStatShared/index';\nexport { CallToActionCard } from './CallToActionCard/CallToActionCard';\nexport { ContextMenu, ContextMenuProps } from './ContextMenu/ContextMenu';\nexport { Menu, MenuProps } from './Menu/Menu';\nexport { MenuGroup, MenuItemsGroup, MenuGroupProps } from './Menu/MenuGroup';\nexport { MenuItem, MenuItemProps } from './Menu/MenuItem';\nexport { WithContextMenu } from './ContextMenu/WithContextMenu';\nexport { DataLinksInlineEditor } from './DataLinks/DataLinksInlineEditor/DataLinksInlineEditor';\nexport { DataLinkInput } from './DataLinks/DataLinkInput';\nexport { DataLinksContextMenu } from './DataLinks/DataLinksContextMenu';\nexport { SeriesIcon } from './VizLegend/SeriesIcon';\nexport { InfoBox } from './InfoBox/InfoBox';\nexport { FeatureBadge, FeatureInfoBox } from './InfoBox/FeatureInfoBox';\n\nexport { JSONFormatter } from './JSONFormatter/JSONFormatter';\nexport { JsonExplorer } from './JSONFormatter/json_explorer/json_explorer';\nexport {\n ErrorBoundary,\n ErrorBoundaryAlert,\n ErrorBoundaryAlertProps,\n withErrorBoundary,\n} from './ErrorBoundary/ErrorBoundary';\nexport { ErrorWithStack } from './ErrorBoundary/ErrorWithStack';\nexport { DataSourceHttpSettings } from './DataSourceSettings/DataSourceHttpSettings';\nexport { AlertingSettings } from './DataSourceSettings/AlertingSettings';\nexport { TLSAuthSettings } from './DataSourceSettings/TLSAuthSettings';\nexport { CertificationKey } from './DataSourceSettings/CertificationKey';\nexport { Spinner } from './Spinner/Spinner';\nexport { FadeTransition } from './transitions/FadeTransition';\nexport { SlideOutTransition } from './transitions/SlideOutTransition';\nexport { Segment, SegmentAsync, SegmentInput, SegmentSelect, SegmentSection } from './Segment/';\nexport { Drawer } from './Drawer/Drawer';\nexport { Slider } from './Slider/Slider';\nexport { RangeSlider } from './Slider/RangeSlider';\n\n// Next-gen forms\nexport { Form } from './Forms/Form';\nexport { sharedInputStyle } from './Forms/commonStyles';\nexport { InputControl } from './InputControl';\nexport { Button, LinkButton, ButtonVariant, ButtonGroup, ButtonProps } from './Button';\nexport { ToolbarButton, ToolbarButtonRow } from './ToolbarButton';\nexport { ValuePicker } from './ValuePicker/ValuePicker';\nexport { fieldMatchersUI } from './MatchersUI/fieldMatchersUI';\nexport { Link } from './Link/Link';\n\nexport { Label } from './Forms/Label';\nexport { Field } from './Forms/Field';\nexport { Legend } from './Forms/Legend';\nexport { FieldSet } from './Forms/FieldSet';\nexport { FieldValidationMessage } from './Forms/FieldValidationMessage';\nexport { InlineField } from './Forms/InlineField';\nexport { InlineSegmentGroup } from './Forms/InlineSegmentGroup';\nexport { InlineLabel } from './Forms/InlineLabel';\nexport { InlineFieldRow } from './Forms/InlineFieldRow';\nexport { FieldArray } from './Forms/FieldArray';\n\n// Select\nexport { default as resetSelectStyles } from './Select/resetSelectStyles';\nexport * from './Select/Select';\nexport { DropdownIndicator } from './Select/DropdownIndicator';\nexport { getSelectStyles } from './Select/getSelectStyles';\nexport * from './Select/types';\n\nexport { HorizontalGroup, VerticalGroup, Container } from './Layout/Layout';\nexport { Badge, BadgeColor, BadgeProps } from './Badge/Badge';\nexport { RadioButtonGroup } from './Forms/RadioButtonGroup/RadioButtonGroup';\nexport { RadioButtonList } from './Forms/RadioButtonList/RadioButtonList';\n\nexport { Input, getInputStyles } from './Input/Input';\nexport { AutoSizeInput } from './Input/AutoSizeInput';\nexport { FilterInput } from './FilterInput/FilterInput';\nexport { FormInputSize } from './Forms/types';\nexport * from './SecretInput';\nexport * from './SecretTextArea';\n\nexport { Switch, InlineSwitch } from './Switch/Switch';\nexport { Checkbox } from './Forms/Checkbox';\n\nexport { TextArea } from './TextArea/TextArea';\nexport { FileUpload } from './FileUpload/FileUpload';\nexport * from './FileDropzone';\nexport { TimeRangeInput } from './DateTimePickers/TimeRangeInput';\nexport { RelativeTimeRangePicker } from './DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker';\nexport { Card, Props as CardProps, getCardStyles } from './Card/Card';\nexport { CardContainer, CardContainerProps } from './Card/CardContainer';\nexport { FormattedValueDisplay } from './FormattedValueDisplay/FormattedValueDisplay';\nexport { ButtonSelect } from './Dropdown/ButtonSelect';\nexport { Dropdown } from './Dropdown/Dropdown';\nexport { PluginSignatureBadge, PluginSignatureBadgeProps } from './PluginSignatureBadge/PluginSignatureBadge';\n\n// Export this until we've figured out a good approach to inline form styles.\nexport { InlineFormLabel } from './FormLabel/FormLabel';\n\nconst LegacyForms = {\n SecretFormField,\n FormField,\n Select,\n AsyncSelect,\n IndicatorsContainer,\n NoOptionsMessage,\n Input,\n Switch,\n};\nexport { LegacyForms, LegacyInputStatus };\n\n// WIP, need renames and exports cleanup\nexport * from './uPlot/config';\nexport { ScaleDistribution } from '@grafana/schema';\nexport { UPlotConfigBuilder } from './uPlot/config/UPlotConfigBuilder';\nexport { UPLOT_AXIS_FONT_SIZE } from './uPlot/config/UPlotAxisBuilder';\nexport { UPlotChart } from './uPlot/Plot';\nexport { PlotLegend } from './uPlot/PlotLegend';\nexport * from './uPlot/geometries';\nexport * from './uPlot/plugins';\nexport { PlotTooltipInterpolator, PlotSelection } from './uPlot/types';\nexport { UPlotConfigPrepFn } from './uPlot/config/UPlotConfigBuilder';\nexport { GraphNG, GraphNGProps, FIXED_UNIT } from './GraphNG/GraphNG';\nexport { TimeSeries } from './TimeSeries/TimeSeries';\nexport { useGraphNGContext } from './GraphNG/hooks';\nexport { preparePlotFrame, buildScaleKey } from './GraphNG/utils';\nexport { GraphNGLegendEvent } from './GraphNG/types';\nexport * from './PanelChrome/types';\nexport { EmotionPerfTest } from './ThemeDemos/EmotionPerfTest';\nexport { Label as BrowserLabel } from './BrowserLabel/Label';\nexport { PanelContainer } from './PanelContainer/PanelContainer';\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { stylesFactory } from '../../themes';\n\nconst getStyles = stylesFactory((duration: number) => {\n return {\n enter: css`\n label: enter;\n opacity: 0;\n `,\n enterActive: css`\n label: enterActive;\n opacity: 1;\n transition: opacity ${duration}ms ease-out;\n `,\n exit: css`\n label: exit;\n opacity: 1;\n `,\n exitActive: css`\n label: exitActive;\n opacity: 0;\n transition: opacity ${duration}ms ease-out;\n `,\n };\n});\n\ntype Props = {\n children: React.ReactNode;\n visible: boolean;\n duration?: number;\n};\n\nexport function FadeTransition(props: Props) {\n const { visible, children, duration = 250 } = props;\n const styles = getStyles(duration);\n return (\n <CSSTransition in={visible} mountOnEnter={true} unmountOnExit={true} timeout={duration} classNames={styles}>\n {children}\n </CSSTransition>\n );\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { stylesFactory } from '../../themes';\n\nconst getStyles = stylesFactory((duration: number, measurement: 'width' | 'height', size: number) => {\n return {\n enter: css`\n label: enter;\n ${measurement}: 0;\n opacity: 0;\n `,\n enterActive: css`\n label: enterActive;\n ${measurement}: ${size}px;\n opacity: 1;\n transition: opacity ${duration}ms ease-out, ${measurement} ${duration}ms ease-out;\n `,\n exit: css`\n label: exit;\n ${measurement}: ${size}px;\n opacity: 1;\n `,\n exitActive: css`\n label: exitActive;\n opacity: 0;\n ${measurement}: 0;\n transition: opacity ${duration}ms ease-out, ${measurement} ${duration}ms ease-out;\n `,\n };\n});\n\ntype Props = {\n children: React.ReactNode;\n visible: boolean;\n size: number;\n\n duration?: number;\n horizontal?: boolean;\n};\n\nexport function SlideOutTransition(props: Props) {\n const { visible, children, duration = 250, horizontal, size } = props;\n const styles = getStyles(duration, horizontal ? 'width' : 'height', size);\n return (\n <CSSTransition in={visible} mountOnEnter={true} unmountOnExit={true} timeout={duration} classNames={styles}>\n {children}\n </CSSTransition>\n );\n}\n","import React, { createRef } from 'react';\nimport uPlot, { AlignedData, Options } from 'uplot';\n\nimport { PlotProps } from './types';\nimport { DEFAULT_PLOT_CONFIG, pluginLog } from './utils';\n\nfunction sameDims(prevProps: PlotProps, nextProps: PlotProps) {\n return nextProps.width === prevProps.width && nextProps.height === prevProps.height;\n}\n\nfunction sameData(prevProps: PlotProps, nextProps: PlotProps) {\n return nextProps.data === prevProps.data;\n}\n\nfunction sameConfig(prevProps: PlotProps, nextProps: PlotProps) {\n return nextProps.config === prevProps.config;\n}\n\nfunction sameTimeRange(prevProps: PlotProps, nextProps: PlotProps) {\n let prevTime = prevProps.timeRange;\n let nextTime = nextProps.timeRange;\n\n return (\n prevTime === nextTime ||\n (nextTime.from.valueOf() === prevTime.from.valueOf() && nextTime.to.valueOf() === prevTime.to.valueOf())\n );\n}\n\ntype UPlotChartState = {\n plot: uPlot | null;\n};\n\n/**\n * @internal\n * uPlot abstraction responsible for plot initialisation, setup and refresh\n * Receives a data frame that is x-axis aligned, as of https://github.com/leeoniya/uPlot/tree/master/docs#data-format\n * Exposes context for uPlot instance access\n */\nexport class UPlotChart extends React.Component<PlotProps, UPlotChartState> {\n plotContainer = createRef<HTMLDivElement>();\n plotCanvasBBox = createRef<DOMRect>();\n\n constructor(props: PlotProps) {\n super(props);\n\n this.state = {\n plot: null,\n };\n }\n\n reinitPlot() {\n let { width, height, plotRef } = this.props;\n\n this.state.plot?.destroy();\n\n if (width === 0 && height === 0) {\n return;\n }\n\n this.props.config.addHook('setSize', (u) => {\n const canvas = u.over;\n if (!canvas) {\n return;\n }\n });\n\n const config: Options = {\n ...DEFAULT_PLOT_CONFIG,\n width: this.props.width,\n height: this.props.height,\n ms: 1 as 1,\n ...this.props.config.getConfig(),\n };\n\n pluginLog('UPlot', false, 'Reinitializing plot', config);\n const plot = new uPlot(config, this.props.data as AlignedData, this.plotContainer!.current!);\n\n if (plotRef) {\n plotRef(plot);\n }\n\n this.setState({ plot });\n }\n\n componentDidMount() {\n this.reinitPlot();\n }\n\n componentWillUnmount() {\n this.state.plot?.destroy();\n }\n\n componentDidUpdate(prevProps: PlotProps) {\n let { plot } = this.state;\n\n if (!sameDims(prevProps, this.props)) {\n plot?.setSize({\n width: this.props.width,\n height: this.props.height,\n });\n } else if (!sameConfig(prevProps, this.props)) {\n this.reinitPlot();\n } else if (!sameData(prevProps, this.props)) {\n plot?.setData(this.props.data as AlignedData);\n } else if (!sameTimeRange(prevProps, this.props)) {\n plot?.setScale('x', {\n min: this.props.timeRange.from.valueOf(),\n max: this.props.timeRange.to.valueOf(),\n });\n }\n }\n\n render() {\n return (\n <div style={{ position: 'relative' }}>\n <div ref={this.plotContainer} data-testid=\"uplot-main-div\" />\n {this.props.children}\n </div>\n );\n }\n}\n","import uPlot, { Axis } from 'uplot';\n\nimport {\n dateTimeFormat,\n DecimalCount,\n GrafanaTheme2,\n guessDecimals,\n isBooleanUnit,\n roundDecimals,\n systemDateFormats,\n TimeZone,\n} from '@grafana/data';\nimport { AxisPlacement } from '@grafana/schema';\n\nimport { measureText } from '../../../utils/measureText';\nimport { PlotConfigBuilder } from '../types';\n\nimport { optMinMax } from './UPlotScaleBuilder';\n\nexport interface AxisProps {\n scaleKey: string;\n theme: GrafanaTheme2;\n label?: string;\n show?: boolean;\n size?: number | null;\n gap?: number;\n tickLabelRotation?: number;\n placement?: AxisPlacement;\n grid?: Axis.Grid;\n ticks?: Axis.Ticks;\n filter?: Axis.Filter;\n space?: Axis.Space;\n formatValue?: (v: any, decimals?: DecimalCount) => string;\n incrs?: Axis.Incrs;\n splits?: Axis.Splits;\n values?: Axis.Values;\n isTime?: boolean;\n timeZone?: TimeZone;\n color?: uPlot.Axis.Stroke;\n border?: uPlot.Axis.Border;\n}\n\nexport const UPLOT_AXIS_FONT_SIZE = 12;\nconst labelPad = 8;\n\nexport class UPlotAxisBuilder extends PlotConfigBuilder<AxisProps, Axis> {\n merge(props: AxisProps) {\n this.props.size = optMinMax('max', this.props.size, props.size);\n if (!this.props.label) {\n this.props.label = props.label;\n }\n if (this.props.placement === AxisPlacement.Auto) {\n this.props.placement = props.placement;\n }\n }\n /* Minimum grid & tick spacing in CSS pixels */\n calculateSpace(self: uPlot, axisIdx: number, scaleMin: number, scaleMax: number, plotDim: number): number {\n const axis = self.axes[axisIdx];\n const scale = self.scales[axis.scale!];\n\n // for axis left & right\n if (axis.side !== 2 || !scale) {\n return 30;\n }\n\n const defaultSpacing = 40;\n\n if (scale.time) {\n const maxTicks = plotDim / defaultSpacing;\n const increment = (scaleMax - scaleMin) / maxTicks;\n const sample = formatTime(self, [scaleMin], axisIdx, defaultSpacing, increment);\n const width = measureText(sample[0], UPLOT_AXIS_FONT_SIZE).width + 18;\n return width;\n }\n\n return defaultSpacing;\n }\n\n /** height of x axis or width of y axis in CSS pixels alloted for values, gap & ticks, but excluding axis label */\n calculateAxisSize(self: uPlot, values: string[], axisIdx: number) {\n const axis = self.axes[axisIdx];\n\n let axisSize = axis.ticks!.size!;\n\n if (axis.side === 2) {\n axisSize += axis!.gap! + UPLOT_AXIS_FONT_SIZE;\n } else if (values?.length) {\n let maxTextWidth = values.reduce(\n (acc, value) => Math.max(acc, measureText(value, UPLOT_AXIS_FONT_SIZE).width),\n 0\n );\n // limit y tick label width to 40% of visualization\n const textWidthWithLimit = Math.min(self.width * 0.4, maxTextWidth);\n // Not sure why this += and not normal assignment\n axisSize += axis!.gap! + axis!.labelGap! + textWidthWithLimit;\n }\n\n return Math.ceil(axisSize);\n }\n\n getConfig(): Axis {\n let {\n scaleKey,\n label,\n show = true,\n placement = AxisPlacement.Auto,\n grid = { show: true },\n ticks,\n space,\n filter,\n gap = 5,\n formatValue,\n splits,\n values,\n isTime,\n timeZone,\n theme,\n tickLabelRotation,\n size,\n color,\n border,\n } = this.props;\n\n const font = `${UPLOT_AXIS_FONT_SIZE}px ${theme.typography.fontFamily}`;\n\n const gridColor = theme.isDark ? 'rgba(240, 250, 255, 0.09)' : 'rgba(0, 10, 23, 0.09)';\n\n if (isBooleanUnit(scaleKey)) {\n splits = [0, 1];\n }\n\n let config: Axis = {\n scale: scaleKey,\n show,\n stroke: color ?? theme.colors.text.primary,\n side: getUPlotSideFromAxis(placement),\n font,\n size:\n size ??\n ((self, values, axisIdx) => {\n return this.calculateAxisSize(self, values, axisIdx);\n }),\n rotate: tickLabelRotation,\n gap,\n\n labelGap: 0,\n\n grid: {\n show: grid.show,\n stroke: gridColor,\n width: 1 / devicePixelRatio,\n },\n ticks: Object.assign(\n {\n show: true,\n stroke: gridColor,\n width: 1 / devicePixelRatio,\n size: 4,\n },\n ticks\n ),\n splits,\n values,\n space:\n space ??\n ((self, axisIdx, scaleMin, scaleMax, plotDim) => {\n return this.calculateSpace(self, axisIdx, scaleMin, scaleMax, plotDim);\n }),\n filter,\n };\n\n if (border != null) {\n config.border = border;\n }\n\n if (label != null && label.length > 0) {\n config.label = label;\n config.labelSize = UPLOT_AXIS_FONT_SIZE + labelPad;\n config.labelFont = font;\n config.labelGap = labelPad;\n }\n\n if (values) {\n config.values = values;\n } else if (isTime) {\n config.values = formatTime;\n } else if (formatValue) {\n config.values = (u: uPlot, splits, axisIdx, tickSpace, tickIncr) => {\n let decimals = guessDecimals(roundDecimals(tickIncr, 6));\n return splits.map((v) => formatValue!(v, decimals > 0 ? decimals : undefined));\n };\n }\n\n // store timezone\n (config as any).timeZone = timeZone;\n\n return config;\n }\n}\n\nconst timeUnitSize = {\n second: 1000,\n minute: 60 * 1000,\n hour: 60 * 60 * 1000,\n day: 24 * 60 * 60 * 1000,\n month: 28 * 24 * 60 * 60 * 1000,\n year: 365 * 24 * 60 * 60 * 1000,\n};\n\n/** Format time axis ticks */\nexport function formatTime(\n self: uPlot,\n splits: number[],\n axisIdx: number,\n foundSpace: number,\n foundIncr: number\n): string[] {\n const timeZone = (self.axes[axisIdx] as any).timeZone;\n const scale = self.scales.x;\n const range = (scale?.max ?? 0) - (scale?.min ?? 0);\n const yearRoundedToDay = Math.round(timeUnitSize.year / timeUnitSize.day) * timeUnitSize.day;\n const incrementRoundedToDay = Math.round(foundIncr / timeUnitSize.day) * timeUnitSize.day;\n\n let format = systemDateFormats.interval.year;\n\n if (foundIncr < timeUnitSize.second) {\n format = systemDateFormats.interval.millisecond;\n } else if (foundIncr <= timeUnitSize.minute) {\n format = systemDateFormats.interval.second;\n } else if (range <= timeUnitSize.day) {\n format = systemDateFormats.interval.minute;\n } else if (foundIncr <= timeUnitSize.day) {\n format = systemDateFormats.interval.hour;\n } else if (range < timeUnitSize.year) {\n format = systemDateFormats.interval.day;\n } else if (incrementRoundedToDay === yearRoundedToDay) {\n format = systemDateFormats.interval.year;\n } else if (foundIncr <= timeUnitSize.year) {\n format = systemDateFormats.interval.month;\n }\n\n return splits.map((v) => (v == null ? '' : dateTimeFormat(v, { format, timeZone })));\n}\n\nexport function getUPlotSideFromAxis(axis: AxisPlacement) {\n switch (axis) {\n case AxisPlacement.Top:\n return 0;\n case AxisPlacement.Right:\n return 1;\n case AxisPlacement.Bottom:\n return 2;\n case AxisPlacement.Left:\n }\n\n return 3; // default everythign to the left\n}\n","import uPlot, { Scale, Range } from 'uplot';\n\nimport { isBooleanUnit } from '@grafana/data';\nimport { ScaleOrientation, ScaleDirection, ScaleDistribution } from '@grafana/schema';\n\nimport { PlotConfigBuilder } from '../types';\n\nexport interface ScaleProps {\n scaleKey: string;\n isTime?: boolean;\n min?: number | null;\n max?: number | null;\n softMin?: number | null;\n softMax?: number | null;\n range?: Scale.Range;\n distribution?: ScaleDistribution;\n orientation: ScaleOrientation;\n direction: ScaleDirection;\n log?: number;\n centeredZero?: boolean;\n}\n\nexport class UPlotScaleBuilder extends PlotConfigBuilder<ScaleProps, Scale> {\n merge(props: ScaleProps) {\n this.props.min = optMinMax('min', this.props.min, props.min);\n this.props.max = optMinMax('max', this.props.max, props.max);\n }\n\n getConfig(): Scale {\n let {\n isTime,\n scaleKey,\n min: hardMin,\n max: hardMax,\n softMin,\n softMax,\n range,\n direction,\n orientation,\n centeredZero,\n } = this.props;\n const distribution = !isTime\n ? {\n distr:\n this.props.distribution === ScaleDistribution.Log\n ? 3\n : this.props.distribution === ScaleDistribution.Ordinal\n ? 2\n : 1,\n log: this.props.distribution === ScaleDistribution.Log ? this.props.log || 2 : undefined,\n }\n : {};\n\n // uPlot's default ranging config for both min & max is {pad: 0.1, hard: null, soft: 0, mode: 3}\n let softMinMode: Range.SoftMode = softMin == null ? 3 : 1;\n let softMaxMode: Range.SoftMode = softMax == null ? 3 : 1;\n\n const rangeConfig: Range.Config = {\n min: {\n pad: 0.1,\n hard: hardMin ?? -Infinity,\n soft: softMin || 0,\n mode: softMinMode,\n },\n max: {\n pad: 0.1,\n hard: hardMax ?? Infinity,\n soft: softMax || 0,\n mode: softMaxMode,\n },\n };\n\n let hardMinOnly = softMin == null && hardMin != null;\n let hardMaxOnly = softMax == null && hardMax != null;\n\n // uPlot range function\n const rangeFn = (u: uPlot, dataMin: number, dataMax: number, scaleKey: string) => {\n const scale = u.scales[scaleKey];\n\n let minMax: uPlot.Range.MinMax = [dataMin, dataMax];\n\n if (scale.distr === 1 || scale.distr === 2) {\n if (centeredZero) {\n let absMin = Math.abs(dataMin);\n let absMax = Math.abs(dataMax);\n let max = Math.max(absMin, absMax);\n dataMin = -max;\n dataMax = max;\n }\n\n // @ts-ignore here we may use hardMin / hardMax to make sure any extra padding is computed from a more accurate delta\n minMax = uPlot.rangeNum(hardMinOnly ? hardMin : dataMin, hardMaxOnly ? hardMax : dataMax, rangeConfig);\n } else if (scale.distr === 3) {\n minMax = uPlot.rangeLog(dataMin, dataMax, scale.log ?? 10, true);\n }\n\n // if all we got were hard limits, treat them as static min/max\n if (hardMinOnly) {\n minMax[0] = hardMin!;\n }\n\n if (hardMaxOnly) {\n minMax[1] = hardMax!;\n }\n\n return minMax;\n };\n\n let auto = !isTime && !(hardMinOnly && hardMaxOnly);\n if (isBooleanUnit(scaleKey)) {\n auto = false;\n range = [0, 1];\n }\n\n return {\n [scaleKey]: {\n time: isTime,\n auto,\n range: range ?? rangeFn,\n dir: direction,\n ori: orientation,\n ...distribution,\n },\n };\n }\n}\n\nexport function optMinMax(minmax: 'min' | 'max', a?: number | null, b?: number | null): undefined | number | null {\n const hasA = !(a === undefined || a === null);\n const hasB = !(b === undefined || b === null);\n if (hasA) {\n if (!hasB) {\n return a;\n }\n if (minmax === 'min') {\n return a! < b! ? a : b;\n }\n return a! > b! ? a : b;\n }\n return b;\n}\n","import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport uPlot from 'uplot';\n\nimport {\n arrayUtils,\n CartesianCoords2D,\n DashboardCursorSync,\n DataFrame,\n FALLBACK_COLOR,\n FieldType,\n formattedValueToString,\n getDisplayProcessor,\n getFieldDisplayName,\n TimeZone,\n} from '@grafana/data';\nimport { TooltipDisplayMode, SortOrder } from '@grafana/schema';\n\nimport { useTheme2 } from '../../../themes/ThemeContext';\nimport { Portal } from '../../Portal/Portal';\nimport { SeriesTable, SeriesTableRowProps, VizTooltipContainer } from '../../VizTooltip';\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\nimport { findMidPointYPosition, pluginLog } from '../utils';\n\ninterface TooltipPluginProps {\n timeZone: TimeZone;\n data: DataFrame;\n config: UPlotConfigBuilder;\n mode?: TooltipDisplayMode;\n sortOrder?: SortOrder;\n sync?: () => DashboardCursorSync;\n // Allows custom tooltip content rendering. Exposes aligned data frame with relevant indexes for data inspection\n // Use field.state.origin indexes from alignedData frame field to get access to original data frame and field index.\n renderTooltip?: (alignedFrame: DataFrame, seriesIdx: number | null, datapointIdx: number | null) => React.ReactNode;\n}\n\nconst TOOLTIP_OFFSET = 10;\n\n/**\n * @alpha\n */\nexport const TooltipPlugin: React.FC<TooltipPluginProps> = ({\n mode = TooltipDisplayMode.Single,\n sortOrder = SortOrder.None,\n sync,\n timeZone,\n config,\n renderTooltip,\n ...otherProps\n}) => {\n const plotInstance = useRef<uPlot>();\n const theme = useTheme2();\n const [focusedSeriesIdx, setFocusedSeriesIdx] = useState<number | null>(null);\n const [focusedPointIdx, setFocusedPointIdx] = useState<number | null>(null);\n const [focusedPointIdxs, setFocusedPointIdxs] = useState<Array<number | null>>([]);\n const [coords, setCoords] = useState<CartesianCoords2D | null>(null);\n const [isActive, setIsActive] = useState<boolean>(false);\n const isMounted = useMountedState();\n\n const pluginId = `TooltipPlugin`;\n\n // Debug logs\n useEffect(() => {\n pluginLog(pluginId, true, `Focused series: ${focusedSeriesIdx}, focused point: ${focusedPointIdx}`);\n }, [focusedPointIdx, focusedSeriesIdx]);\n\n // Add uPlot hooks to the config, or re-add when the config changed\n useLayoutEffect(() => {\n let bbox: DOMRect | undefined = undefined;\n\n const plotEnter = () => {\n if (!isMounted()) {\n return;\n }\n setIsActive(true);\n plotInstance.current?.root.classList.add('plot-active');\n };\n\n const plotLeave = () => {\n if (!isMounted()) {\n return;\n }\n setCoords(null);\n setIsActive(false);\n plotInstance.current?.root.classList.remove('plot-active');\n };\n\n // cache uPlot plotting area bounding box\n config.addHook('syncRect', (u, rect) => (bbox = rect));\n\n config.addHook('init', (u) => {\n plotInstance.current = u;\n\n u.root.parentElement?.addEventListener('focus', plotEnter);\n u.over.addEventListener('mouseenter', plotEnter);\n\n u.root.parentElement?.addEventListener('blur', plotLeave);\n u.over.addEventListener('mouseleave', plotLeave);\n\n if (sync && sync() === DashboardCursorSync.Crosshair) {\n u.root.classList.add('shared-crosshair');\n }\n });\n\n const tooltipInterpolator = config.getTooltipInterpolator();\n\n if (tooltipInterpolator) {\n // Custom toolitp positioning\n config.addHook('setCursor', (u) => {\n tooltipInterpolator(\n setFocusedSeriesIdx,\n setFocusedPointIdx,\n (clear) => {\n if (clear) {\n setCoords(null);\n return;\n }\n\n if (!bbox) {\n return;\n }\n\n const { x, y } = positionTooltip(u, bbox);\n if (x !== undefined && y !== undefined) {\n setCoords({ x, y });\n }\n },\n u\n );\n });\n } else {\n config.addHook('setLegend', (u) => {\n if (!isMounted()) {\n return;\n }\n setFocusedPointIdx(u.legend.idx!);\n setFocusedPointIdxs(u.legend.idxs!.slice());\n });\n\n // default series/datapoint idx retireval\n config.addHook('setCursor', (u) => {\n if (!bbox || !isMounted()) {\n return;\n }\n\n const { x, y } = positionTooltip(u, bbox);\n if (x !== undefined && y !== undefined) {\n setCoords({ x, y });\n } else {\n setCoords(null);\n }\n });\n\n config.addHook('setSeries', (_, idx) => {\n if (!isMounted()) {\n return;\n }\n setFocusedSeriesIdx(idx);\n });\n }\n\n return () => {\n setCoords(null);\n if (plotInstance.current) {\n plotInstance.current.over.removeEventListener('mouseleave', plotLeave);\n plotInstance.current.over.removeEventListener('mouseenter', plotEnter);\n plotInstance.current.root.parentElement?.removeEventListener('focus', plotEnter);\n plotInstance.current.root.parentElement?.removeEventListener('blur', plotLeave);\n }\n };\n }, [config, setCoords, setIsActive, setFocusedPointIdx, setFocusedPointIdxs]);\n\n if (focusedPointIdx === null || (!isActive && sync && sync() === DashboardCursorSync.Crosshair)) {\n return null;\n }\n\n // GraphNG expects aligned data, let's take field 0 as x field. FTW\n let xField = otherProps.data.fields[0];\n if (!xField) {\n return null;\n }\n const xFieldFmt = xField.display || getDisplayProcessor({ field: xField, timeZone, theme });\n let tooltip: React.ReactNode = null;\n\n let xVal = xFieldFmt(xField!.values.get(focusedPointIdx)).text;\n\n if (!renderTooltip) {\n // when interacting with a point in single mode\n if (mode === TooltipDisplayMode.Single && focusedSeriesIdx !== null) {\n const field = otherProps.data.fields[focusedSeriesIdx];\n\n if (!field) {\n return null;\n }\n\n const dataIdx = focusedPointIdxs?.[focusedSeriesIdx] ?? focusedPointIdx;\n xVal = xFieldFmt(xField!.values.get(dataIdx)).text;\n const fieldFmt = field.display || getDisplayProcessor({ field, timeZone, theme });\n const display = fieldFmt(field.values.get(dataIdx));\n\n tooltip = (\n <SeriesTable\n series={[\n {\n color: display.color || FALLBACK_COLOR,\n label: getFieldDisplayName(field, otherProps.data),\n value: display ? formattedValueToString(display) : null,\n },\n ]}\n timestamp={xVal}\n />\n );\n }\n\n if (mode === TooltipDisplayMode.Multi) {\n let series: SeriesTableRowProps[] = [];\n const frame = otherProps.data;\n const fields = frame.fields;\n const sortIdx: any[] = [];\n\n for (let i = 0; i < fields.length; i++) {\n const field = frame.fields[i];\n if (\n !field ||\n field === xField ||\n field.type === FieldType.time ||\n field.type !== FieldType.number ||\n field.config.custom?.hideFrom?.tooltip ||\n field.config.custom?.hideFrom?.viz\n ) {\n continue;\n }\n\n const v = otherProps.data.fields[i].values.get(focusedPointIdxs[i]!);\n const display = field.display!(v);\n\n sortIdx.push(v);\n series.push({\n color: display.color || FALLBACK_COLOR,\n label: getFieldDisplayName(field, frame),\n value: display ? formattedValueToString(display) : null,\n isActive: focusedSeriesIdx === i,\n });\n }\n\n if (sortOrder !== SortOrder.None) {\n // create sort reference series array, as Array.sort() mutates the original array\n const sortRef = [...series];\n const sortFn = arrayUtils.sortValues(sortOrder);\n\n series.sort((a, b) => {\n // get compared values indices to retrieve raw values from sortIdx\n const aIdx = sortRef.indexOf(a);\n const bIdx = sortRef.indexOf(b);\n return sortFn(sortIdx[aIdx], sortIdx[bIdx]);\n });\n }\n\n tooltip = <SeriesTable series={series} timestamp={xVal} />;\n }\n } else {\n tooltip = renderTooltip(otherProps.data, focusedSeriesIdx, focusedPointIdx);\n }\n\n return (\n <Portal>\n {tooltip && coords && (\n <VizTooltipContainer position={{ x: coords.x, y: coords.y }} offset={{ x: TOOLTIP_OFFSET, y: TOOLTIP_OFFSET }}>\n {tooltip}\n </VizTooltipContainer>\n )}\n </Portal>\n );\n};\n\nfunction isCursorOutsideCanvas({ left, top }: uPlot.Cursor, canvas: DOMRect) {\n if (left === undefined || top === undefined) {\n return false;\n }\n return left < 0 || left > canvas.width || top < 0 || top > canvas.height;\n}\n\n/**\n * Given uPlot cursor position, figure out position of the tooltip withing the canvas bbox\n * Tooltip is positioned relatively to a viewport\n * @internal\n **/\nexport function positionTooltip(u: uPlot, bbox: DOMRect) {\n let x, y;\n const cL = u.cursor.left || 0;\n const cT = u.cursor.top || 0;\n\n if (isCursorOutsideCanvas(u.cursor, bbox)) {\n const idx = u.posToIdx(cL);\n // when cursor outside of uPlot's canvas\n if (cT < 0 || cT > bbox.height) {\n let pos = findMidPointYPosition(u, idx);\n\n if (pos) {\n y = bbox.top + pos;\n if (cL >= 0 && cL <= bbox.width) {\n // find x-scale position for a current cursor left position\n x = bbox.left + u.valToPos(u.data[0][u.posToIdx(cL)], u.series[0].scale!);\n }\n }\n }\n } else {\n x = bbox.left + cL;\n y = bbox.top + cT;\n }\n\n return { x, y };\n}\n","import React from 'react';\nimport uPlot, { Options, AlignedData } from 'uplot';\n\nimport { TimeRange } from '@grafana/data';\n\nimport { UPlotConfigBuilder } from './config/UPlotConfigBuilder';\n\nexport type PlotConfig = Pick<\n Options,\n 'mode' | 'series' | 'scales' | 'axes' | 'cursor' | 'bands' | 'hooks' | 'select' | 'tzDate' | 'padding'\n>;\n\nexport interface PlotPluginProps {\n id: string;\n}\n\nexport type FacetValues = any[];\nexport type FacetSeries = FacetValues[];\nexport type FacetedData = [_: null, ...series: FacetSeries];\n\nexport interface PlotProps {\n data: AlignedData | FacetedData;\n width: number;\n height: number;\n config: UPlotConfigBuilder;\n timeRange: TimeRange;\n children?: React.ReactNode;\n // Reference to uPlot instance\n plotRef?: (u: uPlot) => void;\n}\n\nexport abstract class PlotConfigBuilder<P, T> {\n constructor(public props: P) {}\n abstract getConfig(): T;\n}\n\n/**\n * @alpha\n */\nexport type PlotTooltipInterpolator = (\n updateActiveSeriesIdx: (sIdx: number | null) => void,\n updateActiveDatapointIdx: (dIdx: number | null) => void,\n updateTooltipPosition: (clear?: boolean) => void,\n u: uPlot\n) => void;\n\nexport interface PlotSelection {\n min: number;\n max: number;\n\n // selection bounding box, relative to canvas\n bbox: {\n top: number;\n left: number;\n width: number;\n height: number;\n };\n}\n","import uPlot, { AlignedData, Options, PaddingSide } from 'uplot';\n\nimport { DataFrame, ensureTimeField, FieldType } from '@grafana/data';\nimport { BarAlignment, GraphDrawStyle, GraphTransform, LineInterpolation, StackingMode } from '@grafana/schema';\n\nimport { attachDebugger } from '../../utils';\nimport { createLogger } from '../../utils/logger';\nimport { buildScaleKey } from '../GraphNG/utils';\n\nconst ALLOWED_FORMAT_STRINGS_REGEX = /\\b(YYYY|YY|MMMM|MMM|MM|M|DD|D|WWWW|WWW|HH|H|h|AA|aa|a|mm|m|ss|s|fff)\\b/g;\n\nexport function timeFormatToTemplate(f: string) {\n return f.replace(ALLOWED_FORMAT_STRINGS_REGEX, (match) => `{${match}}`);\n}\n\nconst paddingSide: PaddingSide = (u, side, sidesWithAxes) => {\n let hasCrossAxis = side % 2 ? sidesWithAxes[0] || sidesWithAxes[2] : sidesWithAxes[1] || sidesWithAxes[3];\n\n return sidesWithAxes[side] || !hasCrossAxis ? 0 : 8;\n};\n\nexport const DEFAULT_PLOT_CONFIG: Partial<Options> = {\n focus: {\n alpha: 1,\n },\n cursor: {\n focus: {\n prox: 30,\n },\n },\n legend: {\n show: false,\n },\n padding: [paddingSide, paddingSide, paddingSide, paddingSide],\n series: [],\n hooks: {},\n};\n\n/** @internal */\ninterface StackMeta {\n totals: AlignedData;\n}\n\n/** @internal */\nexport interface StackingGroup {\n series: number[];\n dir: StackDirection;\n}\n\n/** @internal */\nconst enum StackDirection {\n Pos = 1,\n Neg = -1,\n}\n\n// generates bands between adjacent group series\n/** @internal */\nexport function getStackingBands(group: StackingGroup) {\n let bands: uPlot.Band[] = [];\n let { series, dir } = group;\n let lastIdx = series.length - 1;\n\n let rSeries = series.slice().reverse();\n\n rSeries.forEach((si, i) => {\n if (i !== lastIdx) {\n let nextIdx = rSeries[i + 1];\n bands.push({\n series: [si, nextIdx],\n // fill direction is inverted from stack direction\n dir: (-1 * dir) as 1 | -1,\n });\n }\n });\n\n return bands;\n}\n\n// expects an AlignedFrame\n/** @internal */\nexport function getStackingGroups(frame: DataFrame) {\n let groups: Map<string, StackingGroup> = new Map();\n\n frame.fields.forEach(({ config, values }, i) => {\n // skip x or time field\n if (i === 0) {\n return;\n }\n\n let { custom } = config;\n\n if (custom == null) {\n return;\n }\n\n // TODO: currently all AlignedFrame fields end up in uplot series & data, even custom.hideFrom?.viz\n // ideally hideFrom.viz fields would be excluded so we can remove this\n if (custom.hideFrom?.viz) {\n return;\n }\n\n let { stacking } = custom;\n\n if (stacking == null) {\n return;\n }\n\n let { mode: stackingMode, group: stackingGroup } = stacking;\n\n // not stacking\n if (stackingMode === StackingMode.None) {\n return;\n }\n\n // will this be stacked up or down after any transforms applied\n let vals = values.toArray();\n let transform = custom.transform;\n let firstValue = vals.find((v) => v != null);\n let stackDir =\n transform === GraphTransform.Constant\n ? firstValue >= 0\n ? StackDirection.Pos\n : StackDirection.Neg\n : transform === GraphTransform.NegativeY\n ? firstValue >= 0\n ? StackDirection.Neg\n : StackDirection.Pos\n : firstValue >= 0\n ? StackDirection.Pos\n : StackDirection.Neg;\n\n let drawStyle = custom.drawStyle as GraphDrawStyle;\n let drawStyle2 =\n drawStyle === GraphDrawStyle.Bars\n ? (custom.barAlignment as BarAlignment)\n : drawStyle === GraphDrawStyle.Line\n ? (custom.lineInterpolation as LineInterpolation)\n : null;\n\n let stackKey = `${stackDir}|${stackingMode}|${stackingGroup}|${buildScaleKey(config)}|${drawStyle}|${drawStyle2}`;\n\n let group = groups.get(stackKey);\n\n if (group == null) {\n group = {\n series: [],\n dir: stackDir,\n };\n\n groups.set(stackKey, group);\n }\n\n group.series.push(i);\n });\n\n return [...groups.values()];\n}\n\n/** @internal */\nexport function preparePlotData2(\n frame: DataFrame,\n stackingGroups: StackingGroup[],\n onStackMeta?: (meta: StackMeta) => void\n) {\n let data = Array(frame.fields.length) as AlignedData;\n\n let stacksQty = stackingGroups.length;\n\n let dataLen = frame.length;\n let zeroArr = stacksQty > 0 ? Array(dataLen).fill(0) : [];\n let falseArr = stacksQty > 0 ? Array(dataLen).fill(false) : [];\n let accums = Array.from({ length: stacksQty }, () => zeroArr.slice());\n\n let anyValsAtX = Array.from({ length: stacksQty }, () => falseArr.slice());\n\n // figure out at which time indices each stacking group has any values\n // (needed to avoid absorbing initial accum 0s at unrelated joined timestamps)\n stackingGroups.forEach((group, groupIdx) => {\n let groupValsAtX = anyValsAtX[groupIdx];\n\n group.series.forEach((seriesIdx) => {\n let field = frame.fields[seriesIdx];\n\n if (field.config.custom?.hideFrom?.viz) {\n return;\n }\n\n let vals = field.values.toArray();\n\n for (let i = 0; i < dataLen; i++) {\n if (vals[i] != null) {\n groupValsAtX[i] = true;\n }\n }\n });\n });\n\n frame.fields.forEach((field, i) => {\n let vals = field.values.toArray();\n\n if (i === 0) {\n if (field.type === FieldType.time) {\n data[i] = ensureTimeField(field).values.toArray();\n } else {\n data[i] = vals;\n }\n return;\n }\n\n let { custom } = field.config;\n\n if (!custom || custom.hideFrom?.viz) {\n data[i] = vals;\n return;\n }\n\n // apply transforms\n if (custom.transform === GraphTransform.Constant) {\n let firstValIdx = vals.findIndex((v) => v != null);\n let firstVal = vals[firstValIdx];\n vals = Array(vals.length).fill(undefined);\n vals[firstValIdx] = firstVal;\n } else {\n vals = vals.slice();\n\n if (custom.transform === GraphTransform.NegativeY) {\n for (let i = 0; i < vals.length; i++) {\n if (vals[i] != null) {\n vals[i] *= -1;\n }\n }\n }\n }\n\n let stackingMode = custom.stacking?.mode;\n\n if (!stackingMode || stackingMode === StackingMode.None) {\n data[i] = vals;\n } else {\n let stackIdx = stackingGroups.findIndex((group) => group.series.indexOf(i) > -1);\n\n let accum = accums[stackIdx];\n let groupValsAtX = anyValsAtX[stackIdx];\n let stacked = (data[i] = Array(dataLen));\n\n for (let i = 0; i < dataLen; i++) {\n let v = vals[i];\n\n if (v != null) {\n stacked[i] = accum[i] += v;\n } else {\n stacked[i] = groupValsAtX[i] ? accum[i] : v;\n }\n }\n }\n });\n\n if (onStackMeta) {\n let accumsBySeriesIdx = data.map((vals, i) => {\n let stackIdx = stackingGroups.findIndex((group) => group.series.indexOf(i) > -1);\n return stackIdx !== -1 ? accums[stackIdx] : vals;\n });\n\n onStackMeta({\n totals: accumsBySeriesIdx as AlignedData,\n });\n }\n\n // re-compute by percent\n frame.fields.forEach((field, i) => {\n if (i === 0 || field.config.custom?.hideFrom?.viz) {\n return;\n }\n\n let stackingMode = field.config.custom?.stacking?.mode;\n\n if (stackingMode === StackingMode.Percent) {\n let stackIdx = stackingGroups.findIndex((group) => group.series.indexOf(i) > -1);\n let accum = accums[stackIdx];\n let group = stackingGroups[stackIdx];\n\n let stacked = data[i];\n\n for (let i = 0; i < dataLen; i++) {\n let v = stacked[i];\n\n if (v != null) {\n // v / accum will always be pos, so properly (re)sign by group stacking dir\n stacked[i] = accum[i] === 0 ? 0 : group.dir * (v / accum[i]);\n }\n }\n }\n });\n\n return data;\n}\n\n/**\n * Finds y axis midpoint for point at given idx (css pixels relative to uPlot canvas)\n * @internal\n **/\n\nexport function findMidPointYPosition(u: uPlot, idx: number) {\n let y;\n let sMaxIdx = 1;\n let sMinIdx = 1;\n // assume min/max being values of 1st series\n let max = u.data[1][idx];\n let min = u.data[1][idx];\n\n // find min max values AND ids of the corresponding series to get the scales\n for (let i = 1; i < u.data.length; i++) {\n const sData = u.data[i];\n const sVal = sData[idx];\n if (sVal != null) {\n if (max == null) {\n max = sVal;\n } else {\n if (sVal > max) {\n max = u.data[i][idx];\n sMaxIdx = i;\n }\n }\n if (min == null) {\n min = sVal;\n } else {\n if (sVal < min) {\n min = u.data[i][idx];\n sMinIdx = i;\n }\n }\n }\n }\n\n if (min == null && max == null) {\n // no tooltip to show\n y = undefined;\n } else if (min != null && max != null) {\n // find median position\n y = (u.valToPos(min, u.series[sMinIdx].scale!) + u.valToPos(max, u.series[sMaxIdx].scale!)) / 2;\n } else {\n // snap tooltip to min OR max point, one of those is not null :)\n y = u.valToPos((min || max)!, u.series[(sMaxIdx || sMinIdx)!].scale!);\n }\n\n // if y is out of canvas bounds, snap it to the bottom\n if (y !== undefined && y < 0) {\n y = u.bbox.height / devicePixelRatio;\n }\n\n return y;\n}\n\n// Dev helpers\n\n/** @internal */\nexport const pluginLogger = createLogger('uPlot');\nexport const pluginLog = pluginLogger.logger;\n// pluginLogger.enable();\nattachDebugger('graphng', undefined, pluginLogger);\n","import React from 'react';\n\nimport {\n FieldConfigEditorBuilder,\n FieldType,\n identityOverrideProcessor,\n SelectableValue,\n StandardEditorProps,\n} from '@grafana/data';\nimport { AxisColorMode, AxisConfig, AxisPlacement, ScaleDistribution, ScaleDistributionConfig } from '@grafana/schema';\n\nimport { graphFieldOptions, Select, HorizontalGroup, RadioButtonGroup } from '../../index';\n\n/**\n * @alpha\n */\nexport function addAxisConfig(\n builder: FieldConfigEditorBuilder<AxisConfig>,\n defaultConfig: AxisConfig,\n hideScale?: boolean\n) {\n const category = ['Axis'];\n\n // options for axis appearance\n builder\n .addRadio({\n path: 'axisPlacement',\n name: 'Placement',\n category,\n defaultValue: graphFieldOptions.axisPlacement[0].value,\n settings: {\n options: graphFieldOptions.axisPlacement,\n },\n })\n .addTextInput({\n path: 'axisLabel',\n name: 'Label',\n category,\n defaultValue: '',\n settings: {\n placeholder: 'Optional text',\n },\n showIf: (c) => c.axisPlacement !== AxisPlacement.Hidden,\n // Do not apply default settings to time and string fields which are used as x-axis fields in Time series and Bar chart panels\n shouldApply: (f) => f.type !== FieldType.time && f.type !== FieldType.string,\n })\n .addNumberInput({\n path: 'axisWidth',\n name: 'Width',\n category,\n settings: {\n placeholder: 'Auto',\n },\n showIf: (c) => c.axisPlacement !== AxisPlacement.Hidden,\n })\n .addRadio({\n path: 'axisGridShow',\n name: 'Show grid lines',\n category,\n defaultValue: undefined,\n settings: {\n options: [\n { value: undefined, label: 'Auto' },\n { value: true, label: 'On' },\n { value: false, label: 'Off' },\n ],\n },\n })\n .addRadio({\n path: 'axisColorMode',\n name: 'Color',\n category,\n defaultValue: AxisColorMode.Text,\n settings: {\n options: [\n { value: AxisColorMode.Text, label: 'Text' },\n { value: AxisColorMode.Series, label: 'Series' },\n ],\n },\n });\n\n // options for scale range\n builder\n .addCustomEditor<void, ScaleDistributionConfig>({\n id: 'scaleDistribution',\n path: 'scaleDistribution',\n name: 'Scale',\n category,\n editor: ScaleDistributionEditor as any,\n override: ScaleDistributionEditor as any,\n defaultValue: { type: ScaleDistribution.Linear },\n shouldApply: (f) => f.type === FieldType.number,\n process: identityOverrideProcessor,\n })\n .addBooleanSwitch({\n path: 'axisCenteredZero',\n name: 'Centered zero',\n category,\n defaultValue: false,\n showIf: (c) => c.scaleDistribution?.type !== ScaleDistribution.Log,\n })\n .addNumberInput({\n path: 'axisSoftMin',\n name: 'Soft min',\n defaultValue: defaultConfig.axisSoftMin,\n category,\n settings: {\n placeholder: 'See: Standard options > Min',\n },\n })\n .addNumberInput({\n path: 'axisSoftMax',\n name: 'Soft max',\n defaultValue: defaultConfig.axisSoftMax,\n category,\n settings: {\n placeholder: 'See: Standard options > Max',\n },\n });\n}\n\nconst DISTRIBUTION_OPTIONS: Array<SelectableValue<ScaleDistribution>> = [\n {\n label: 'Linear',\n value: ScaleDistribution.Linear,\n },\n {\n label: 'Logarithmic',\n value: ScaleDistribution.Log,\n },\n];\n\nconst LOG_DISTRIBUTION_OPTIONS: Array<SelectableValue<number>> = [\n {\n label: '2',\n value: 2,\n },\n {\n label: '10',\n value: 10,\n },\n];\n\n/**\n * @internal\n */\nexport const ScaleDistributionEditor = ({ value, onChange }: StandardEditorProps<ScaleDistributionConfig>) => {\n const type = value?.type ?? ScaleDistribution.Linear;\n return (\n <HorizontalGroup>\n <RadioButtonGroup\n value={type}\n options={DISTRIBUTION_OPTIONS}\n onChange={(v) => {\n onChange({\n ...value,\n type: v!,\n log: v === ScaleDistribution.Linear ? undefined : 2,\n });\n }}\n />\n {type === ScaleDistribution.Log && (\n <Select\n options={LOG_DISTRIBUTION_OPTIONS}\n value={value.log || 2}\n prefix={'base'}\n width={12}\n onChange={(v) => {\n onChange({\n ...value,\n log: v.value!,\n });\n }}\n />\n )}\n </HorizontalGroup>\n );\n};\n","import { startCase } from 'lodash';\nimport React, { useCallback } from 'react';\n\nimport { FieldConfigEditorBuilder, FieldConfigEditorProps } from '@grafana/data';\nimport { HideableFieldConfig, HideSeriesConfig } from '@grafana/schema';\n\nimport { FilterPill, HorizontalGroup } from '../../index';\n\nconst SeriesConfigEditor: React.FC<FieldConfigEditorProps<HideSeriesConfig, {}>> = (props) => {\n const { value, onChange } = props;\n\n const onChangeToggle = useCallback(\n (prop: keyof HideSeriesConfig) => {\n onChange({ ...value, [prop]: !value[prop] });\n },\n [value, onChange]\n );\n\n return (\n <HorizontalGroup spacing=\"xs\">\n {Object.keys(value).map((k) => {\n const key = k as keyof HideSeriesConfig;\n return (\n <FilterPill\n icon={value[key] ? 'eye-slash' : 'eye'}\n onClick={() => onChangeToggle(key)}\n key={key}\n label={startCase(key)}\n selected={value[key]}\n />\n );\n })}\n </HorizontalGroup>\n );\n};\n\n/**\n * @alpha\n */\nexport function addHideFrom(builder: FieldConfigEditorBuilder<HideableFieldConfig>) {\n builder.addCustomEditor({\n id: 'hideFrom',\n name: 'Hide in area',\n category: ['Series'],\n path: 'hideFrom',\n defaultValue: {\n tooltip: false,\n viz: false,\n legend: false,\n },\n editor: SeriesConfigEditor,\n override: SeriesConfigEditor,\n shouldApply: () => true,\n hideFromDefaults: true,\n process: (value) => value,\n });\n}\n","import { PanelOptionsEditorBuilder, standardEditorsRegistry, StatsPickerConfigSettings } from '@grafana/data';\nimport { LegendDisplayMode, OptionsWithLegend } from '@grafana/schema';\n\n/**\n * @alpha\n */\nexport function addLegendOptions<T extends OptionsWithLegend>(\n builder: PanelOptionsEditorBuilder<T>,\n includeLegendCalcs = true\n) {\n builder\n .addBooleanSwitch({\n path: 'legend.showLegend',\n name: 'Visibility',\n category: ['Legend'],\n description: '',\n defaultValue: true,\n })\n .addRadio({\n path: 'legend.displayMode',\n name: 'Mode',\n category: ['Legend'],\n description: '',\n defaultValue: LegendDisplayMode.List,\n settings: {\n options: [\n { value: LegendDisplayMode.List, label: 'List' },\n { value: LegendDisplayMode.Table, label: 'Table' },\n ],\n },\n showIf: (c) => c.legend.showLegend,\n })\n .addRadio({\n path: 'legend.placement',\n name: 'Placement',\n category: ['Legend'],\n description: '',\n defaultValue: 'bottom',\n settings: {\n options: [\n { value: 'bottom', label: 'Bottom' },\n { value: 'right', label: 'Right' },\n ],\n },\n showIf: (c) => c.legend.showLegend,\n })\n .addNumberInput({\n path: 'legend.width',\n name: 'Width',\n category: ['Legend'],\n settings: {\n placeholder: 'Auto',\n },\n showIf: (c) => c.legend.showLegend && c.legend.placement === 'right',\n });\n\n if (includeLegendCalcs) {\n builder.addCustomEditor<StatsPickerConfigSettings, string[]>({\n id: 'legend.calcs',\n path: 'legend.calcs',\n name: 'Values',\n category: ['Legend'],\n description: 'Select values or calculations to show in legend',\n editor: standardEditorsRegistry.get('stats-picker').editor as any,\n defaultValue: [],\n settings: {\n allowMultiple: true,\n },\n showIf: (currentConfig) => currentConfig.legend.showLegend !== false,\n });\n }\n}\n","import { PanelOptionsEditorBuilder } from '@grafana/data';\nimport { OptionsWithTooltip, TooltipDisplayMode, SortOrder } from '@grafana/schema';\n\nexport function addTooltipOptions<T extends OptionsWithTooltip>(\n builder: PanelOptionsEditorBuilder<T>,\n singleOnly = false\n) {\n const category = ['Tooltip'];\n const modeOptions = singleOnly\n ? [\n { value: TooltipDisplayMode.Single, label: 'Single' },\n { value: TooltipDisplayMode.None, label: 'Hidden' },\n ]\n : [\n { value: TooltipDisplayMode.Single, label: 'Single' },\n { value: TooltipDisplayMode.Multi, label: 'All' },\n { value: TooltipDisplayMode.None, label: 'Hidden' },\n ];\n\n const sortOptions = [\n { value: SortOrder.None, label: 'None' },\n { value: SortOrder.Ascending, label: 'Ascending' },\n { value: SortOrder.Descending, label: 'Descending' },\n ];\n\n builder\n .addRadio({\n path: 'tooltip.mode',\n name: 'Tooltip mode',\n category,\n defaultValue: 'single',\n settings: {\n options: modeOptions,\n },\n })\n .addRadio({\n path: 'tooltip.sort',\n name: 'Values sort order',\n category,\n defaultValue: SortOrder.None,\n showIf: (options: T) => options.tooltip.mode === TooltipDisplayMode.Multi,\n settings: {\n options: sortOptions,\n },\n });\n}\n","import { PanelOptionsEditorBuilder } from '@grafana/data';\nimport { OptionsWithTextFormatting } from '@grafana/schema';\n\n/**\n * Adds common text control options to a visualization options\n * @param builder\n * @param withTitle\n * @public\n */\nexport function addTextSizeOptions<T extends OptionsWithTextFormatting>(\n builder: PanelOptionsEditorBuilder<T>,\n withTitle = true\n) {\n if (withTitle) {\n builder.addNumberInput({\n path: 'text.titleSize',\n category: ['Text size'],\n name: 'Title',\n settings: {\n placeholder: 'Auto',\n integer: false,\n min: 1,\n max: 200,\n },\n defaultValue: undefined,\n });\n }\n\n builder.addNumberInput({\n path: 'text.valueSize',\n category: ['Text size'],\n name: 'Value',\n settings: {\n placeholder: 'Auto',\n integer: false,\n min: 1,\n max: 200,\n },\n defaultValue: undefined,\n });\n}\n","import React from 'react';\n\nimport {\n FieldConfigEditorBuilder,\n FieldOverrideEditorProps,\n FieldType,\n identityOverrideProcessor,\n} from '@grafana/data';\nimport { StackingConfig, StackingMode } from '@grafana/schema';\n\nimport {\n GraphFieldConfig,\n graphFieldOptions,\n HorizontalGroup,\n IconButton,\n Input,\n RadioButtonGroup,\n Tooltip,\n} from '../..';\n\nexport const StackingEditor: React.FC<FieldOverrideEditorProps<StackingConfig, any>> = ({\n value,\n context,\n onChange,\n item,\n}) => {\n return (\n <HorizontalGroup>\n <RadioButtonGroup\n value={value?.mode || StackingMode.None}\n options={item.settings.options}\n onChange={(v) => {\n onChange({\n ...value,\n mode: v,\n });\n }}\n />\n {context.isOverride && value?.mode && value?.mode !== StackingMode.None && (\n <Input\n type=\"text\"\n placeholder=\"Group\"\n suffix={\n <Tooltip content=\"Name of the stacking group\" placement=\"top\">\n <IconButton name=\"question-circle\" />\n </Tooltip>\n }\n defaultValue={value?.group}\n onChange={(v) => {\n onChange({\n ...value,\n group: v.currentTarget.value.trim(),\n });\n }}\n />\n )}\n </HorizontalGroup>\n );\n};\n\nexport function addStackingConfig(\n builder: FieldConfigEditorBuilder<GraphFieldConfig>,\n defaultConfig?: StackingConfig,\n category = ['Graph styles']\n) {\n builder.addCustomEditor({\n id: 'stacking',\n path: 'stacking',\n name: 'Stack series',\n category: category,\n defaultValue: defaultConfig,\n editor: StackingEditor,\n override: StackingEditor,\n settings: {\n options: graphFieldOptions.stacking,\n },\n process: identityOverrideProcessor,\n shouldApply: (f) => f.type === FieldType.number,\n });\n}\n","import { Editor as CoreEditor, Annotation } from 'slate';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { Plugin } from '@grafana/slate-react';\n\nconst BRACES: any = {\n '[': ']',\n '{': '}',\n '(': ')',\n};\n\nconst MATCH_MARK = 'brace_match';\n\nexport function BracesPlugin(): Plugin {\n return {\n onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n const keyEvent = event as KeyboardEvent;\n const { value } = editor;\n\n switch (keyEvent.key) {\n case '(':\n case '{':\n case '[': {\n const {\n start: { offset: startOffset, key: startKey },\n end: { offset: endOffset, key: endKey },\n focus: { offset: focusOffset },\n } = value.selection;\n const text = value.focusText.text;\n\n // If text is selected, wrap selected text in parens\n if (value.selection.isExpanded) {\n keyEvent.preventDefault();\n editor\n .insertTextByKey(startKey, startOffset, keyEvent.key)\n .insertTextByKey(endKey, endOffset + 1, BRACES[keyEvent.key])\n .moveEndBackward(1);\n return true;\n } else if (\n // Insert matching brace when there is no input after caret\n focusOffset === text.length ||\n text[focusOffset] === ' ' ||\n Object.values(BRACES).includes(text[focusOffset])\n ) {\n keyEvent.preventDefault();\n const complement = BRACES[keyEvent.key];\n const matchAnnotation = {\n key: `${MATCH_MARK}-${uuidv4()}`,\n type: `${MATCH_MARK}-${complement}`,\n anchor: {\n key: startKey,\n offset: startOffset,\n object: 'point',\n },\n focus: {\n key: endKey,\n offset: endOffset + 1,\n object: 'point',\n },\n object: 'annotation',\n } as Annotation;\n editor.insertText(keyEvent.key).insertText(complement).addAnnotation(matchAnnotation).moveBackward(1);\n\n return true;\n }\n break;\n }\n\n case ')':\n case '}':\n case ']': {\n const text = value.anchorText.text;\n const offset = value.selection.anchor.offset;\n const nextChar = text[offset];\n // Handle closing brace when it's already the next character\n const complement = keyEvent.key;\n const annotationType = `${MATCH_MARK}-${complement}`;\n const annotation = value.annotations.find(\n (a) => a?.type === annotationType && a.anchor.key === value.anchorText.key\n );\n if (annotation && nextChar === complement && !value.selection.isExpanded) {\n keyEvent.preventDefault();\n editor.moveFocusForward(1).removeAnnotation(annotation).moveAnchorForward(1);\n return true;\n }\n break;\n }\n\n case 'Backspace': {\n const text = value.anchorText.text;\n const offset = value.selection.anchor.offset;\n const previousChar = text[offset - 1];\n const nextChar = text[offset];\n if (BRACES[previousChar] && BRACES[previousChar] === nextChar) {\n keyEvent.preventDefault();\n // Remove closing brace if directly following\n editor.deleteBackward(1).deleteForward(1).focus();\n return true;\n }\n }\n\n default: {\n break;\n }\n }\n\n return next();\n },\n };\n}\n","import { Editor as CoreEditor } from 'slate';\n\nimport { Plugin } from '@grafana/slate-react';\n\n// Clears the rest of the line after the caret\nexport function ClearPlugin(): Plugin {\n return {\n onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n const keyEvent = event as KeyboardEvent;\n const value = editor.value;\n\n if (value.selection.isExpanded) {\n return next();\n }\n\n if (keyEvent.key === 'k' && keyEvent.ctrlKey) {\n keyEvent.preventDefault();\n const text = value.anchorText.text;\n const offset = value.selection.anchor.offset;\n const length = text.length;\n const forward = length - offset;\n editor.deleteForward(forward);\n return true;\n }\n\n return next();\n },\n };\n}\n","import { Editor as CoreEditor } from 'slate';\n\nimport { Plugin } from '@grafana/slate-react';\n\nconst getCopiedText = (textBlocks: string[], startOffset: number, endOffset: number) => {\n if (!textBlocks.length) {\n return undefined;\n }\n\n const excludingLastLineLength = textBlocks.slice(0, -1).join('').length + textBlocks.length - 1;\n return textBlocks.join('\\n').slice(startOffset, excludingLastLineLength + endOffset);\n};\n\n// Remove unicode special symbol - byte order mark (BOM), U+FEFF.\nconst removeBom = (str: string | undefined): string | undefined => {\n return str?.replace(/[\\uFEFF]/g, '');\n};\n\nexport function ClipboardPlugin(): Plugin {\n const clipboardPlugin: Plugin = {\n onCopy(event: Event, editor: CoreEditor, next: () => any) {\n const clipEvent = event as ClipboardEvent;\n clipEvent.preventDefault();\n\n const { document, selection } = editor.value;\n const {\n start: { offset: startOffset },\n end: { offset: endOffset },\n } = selection;\n const selectedBlocks = document\n .getLeafBlocksAtRange(selection)\n .toArray()\n .map((block) => block.text);\n\n const copiedText = removeBom(getCopiedText(selectedBlocks, startOffset, endOffset));\n if (copiedText && clipEvent.clipboardData) {\n clipEvent.clipboardData.setData('Text', copiedText);\n }\n\n return true;\n },\n\n onPaste(event: Event, editor: CoreEditor, next: () => any) {\n const clipEvent = event as ClipboardEvent;\n clipEvent.preventDefault();\n if (clipEvent.clipboardData) {\n const pastedValue = removeBom(clipEvent.clipboardData.getData('Text'));\n const lines = pastedValue?.split('\\n');\n\n if (lines && lines.length) {\n editor.insertText(lines[0]);\n for (const line of lines.slice(1)) {\n editor.splitBlock().insertText(line);\n }\n }\n }\n\n return true;\n },\n };\n\n return {\n ...clipboardPlugin,\n onCut(event: Event, editor: CoreEditor, next: () => any) {\n const clipEvent = event as ClipboardEvent;\n clipboardPlugin.onCopy!(clipEvent, editor, next);\n editor.deleteAtRange(editor.value.selection);\n\n return true;\n },\n };\n}\n","import { isKeyHotkey } from 'is-hotkey';\nimport { RangeJSON, Range as SlateRange, Editor as CoreEditor } from 'slate';\n\nimport { Plugin } from '@grafana/slate-react';\n\nconst isIndentLeftHotkey = isKeyHotkey('mod+[');\nconst isShiftTabHotkey = isKeyHotkey('shift+tab');\nconst isIndentRightHotkey = isKeyHotkey('mod+]');\n\nconst SLATE_TAB = ' ';\n\nconst handleTabKey = (event: KeyboardEvent, editor: CoreEditor, next: Function): void => {\n const {\n startBlock,\n endBlock,\n selection: {\n start: { offset: startOffset, key: startKey },\n end: { offset: endOffset, key: endKey },\n },\n } = editor.value;\n\n const first = startBlock.getFirstText();\n\n const startBlockIsSelected =\n first && startOffset === 0 && startKey === first.key && endOffset === first.text.length && endKey === first.key;\n\n if (startBlockIsSelected || !startBlock.equals(endBlock)) {\n handleIndent(editor, 'right');\n } else {\n editor.insertText(SLATE_TAB);\n }\n};\n\nconst handleIndent = (editor: CoreEditor, indentDirection: 'left' | 'right') => {\n const curSelection = editor.value.selection;\n const selectedBlocks = editor.value.document.getLeafBlocksAtRange(curSelection).toArray();\n\n if (indentDirection === 'left') {\n for (const block of selectedBlocks) {\n const blockWhitespace = block.text.length - block.text.trimLeft().length;\n\n const textKey = block.getFirstText()!.key;\n\n const rangeProperties: RangeJSON = {\n anchor: {\n key: textKey,\n offset: blockWhitespace,\n path: [],\n },\n focus: {\n key: textKey,\n offset: blockWhitespace,\n path: [],\n },\n };\n\n editor.deleteBackwardAtRange(SlateRange.create(rangeProperties), Math.min(SLATE_TAB.length, blockWhitespace));\n }\n } else {\n const { startText } = editor.value;\n const textBeforeCaret = startText.text.slice(0, curSelection.start.offset);\n const isWhiteSpace = /^\\s*$/.test(textBeforeCaret);\n\n for (const block of selectedBlocks) {\n editor.insertTextByKey(block.getFirstText()!.key, 0, SLATE_TAB);\n }\n\n if (isWhiteSpace) {\n editor.moveStartBackward(SLATE_TAB.length);\n }\n }\n};\n\n// Clears the rest of the line after the caret\nexport function IndentationPlugin(): Plugin {\n return {\n onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n const keyEvent = event as KeyboardEvent;\n if (isIndentLeftHotkey(keyEvent) || isShiftTabHotkey(keyEvent)) {\n keyEvent.preventDefault();\n handleIndent(editor, 'left');\n } else if (isIndentRightHotkey(keyEvent)) {\n keyEvent.preventDefault();\n handleIndent(editor, 'right');\n } else if (keyEvent.key === 'Tab') {\n keyEvent.preventDefault();\n handleTabKey(keyEvent, editor, next);\n } else {\n return next();\n }\n\n return true;\n },\n };\n}\n","import { Editor as CoreEditor } from 'slate';\n\nimport { Plugin } from '@grafana/slate-react';\n\nfunction getIndent(text: string) {\n let offset = text.length - text.trimLeft().length;\n if (offset) {\n let indent = text[0];\n while (--offset) {\n indent += text[0];\n }\n return indent;\n }\n return '';\n}\n\nexport function NewlinePlugin(): Plugin {\n return {\n onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n const keyEvent = event as KeyboardEvent;\n const value = editor.value;\n\n if (value.selection.isExpanded) {\n return next();\n }\n\n if (keyEvent.key === 'Enter') {\n keyEvent.preventDefault();\n\n const { startBlock } = value;\n const currentLineText = startBlock.text;\n const indent = getIndent(currentLineText);\n\n return editor.splitBlock().insertText(indent).focus();\n }\n\n return next();\n },\n };\n}\n","import { Editor as CoreEditor } from 'slate';\n\nimport { Plugin } from '@grafana/slate-react';\n\nexport function RunnerPlugin({ handler }: any): Plugin {\n return {\n onKeyDown(event: Event, editor: CoreEditor, next: Function) {\n const keyEvent = event as KeyboardEvent;\n\n // Handle enter\n if (handler && keyEvent.key === 'Enter' && (keyEvent.shiftKey || keyEvent.ctrlKey)) {\n // Submit on Enter\n keyEvent.preventDefault();\n handler(keyEvent);\n return editor;\n }\n\n return next();\n },\n };\n}\n","import { isKeyHotkey } from 'is-hotkey';\nimport { Editor as CoreEditor } from 'slate';\n\nimport { Plugin } from '@grafana/slate-react';\n\nconst isSelectLineHotkey = isKeyHotkey('mod+l');\n\n// Clears the rest of the line after the caret\nexport function SelectionShortcutsPlugin(): Plugin {\n return {\n onKeyDown(event: Event, editor: CoreEditor, next: () => any) {\n const keyEvent = event as KeyboardEvent;\n if (isSelectLineHotkey(keyEvent)) {\n keyEvent.preventDefault();\n const { focusBlock, document } = editor.value;\n\n editor.moveAnchorToStartOfBlock();\n\n const nextBlock = document.getNextBlock(focusBlock.key);\n if (nextBlock) {\n editor.moveFocusToStartOfNextBlock();\n } else {\n editor.moveFocusToEndOfText();\n }\n } else {\n return next();\n }\n\n return true;\n },\n };\n}\n","import { default as calculateSize } from 'calculate-size';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { CompletionItemGroup, CompletionItem, CompletionItemKind } from '../types/completion';\n\nexport const flattenGroupItems = (groupedItems: CompletionItemGroup[]): CompletionItem[] => {\n return groupedItems.reduce((all: CompletionItem[], { items, label }) => {\n all.push({\n label,\n kind: CompletionItemKind.GroupTitle,\n });\n return items.reduce((all, item) => {\n all.push(item);\n return all;\n }, all);\n }, []);\n};\n\nexport const calculateLongestLabel = (allItems: CompletionItem[]): string => {\n return allItems.reduce((longest, current) => {\n return longest.length < current.label.length ? current.label : longest;\n }, '');\n};\n\nexport const calculateListSizes = (theme: GrafanaTheme, allItems: CompletionItem[], longestLabel: string) => {\n const size = calculateSize(longestLabel, {\n font: theme.typography.fontFamily.monospace,\n fontSize: theme.typography.size.sm,\n fontWeight: 'normal',\n });\n\n const listWidth = calculateListWidth(size.width, theme);\n const itemHeight = calculateItemHeight(size.height, theme);\n const listHeight = calculateListHeight(itemHeight, allItems);\n\n return {\n listWidth,\n listHeight,\n itemHeight,\n };\n};\n\nexport const calculateItemHeight = (longestLabelHeight: number, theme: GrafanaTheme) => {\n const horizontalPadding = parseInt(theme.spacing.sm, 10) * 2;\n const itemHeight = longestLabelHeight + horizontalPadding;\n\n return itemHeight;\n};\n\nexport const calculateListWidth = (longestLabelWidth: number, theme: GrafanaTheme) => {\n const verticalPadding = parseInt(theme.spacing.sm, 10) + parseInt(theme.spacing.md, 10);\n const maxWidth = 800;\n const listWidth = Math.min(Math.max(longestLabelWidth + verticalPadding, 200), maxWidth);\n\n return listWidth;\n};\n\nexport const calculateListHeight = (itemHeight: number, allItems: CompletionItem[]) => {\n const numberOfItemsToShow = Math.min(allItems.length, 10);\n const minHeight = 100;\n const totalHeight = numberOfItemsToShow * itemHeight;\n const listHeight = Math.max(totalHeight, minHeight);\n\n return listHeight;\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme, renderMarkdown } from '@grafana/data';\n\nimport { useTheme } from '../../themes/ThemeContext';\nimport { CompletionItem } from '../../types';\n\nconst getStyles = (theme: GrafanaTheme, height: number, visible: boolean) => {\n return {\n typeaheadItem: css`\n label: type-ahead-item;\n z-index: 11;\n padding: ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.md};\n border-radius: ${theme.border.radius.md};\n border: ${theme.colors.border2};\n overflow-y: scroll;\n overflow-x: hidden;\n outline: none;\n background: ${theme.colors.bg2};\n color: ${theme.colors.text};\n box-shadow: 0 0 20px ${theme.colors.dropdownShadow};\n visibility: ${visible === true ? 'visible' : 'hidden'};\n width: 250px;\n min-height: ${height + parseInt(theme.spacing.xxs, 10)}px;\n position: relative;\n word-break: break-word;\n `,\n };\n};\n\ninterface Props {\n item: CompletionItem;\n height: number;\n}\n\nexport const TypeaheadInfo: React.FC<Props> = ({ item, height }) => {\n const visible = item && !!item.documentation;\n const label = item ? item.label : '';\n const documentation = renderMarkdown(item?.documentation);\n const theme = useTheme();\n const styles = getStyles(theme, height, visible);\n\n return (\n <div className={cx([styles.typeaheadItem])}>\n <b>{label}</b>\n <hr />\n <div dangerouslySetInnerHTML={{ __html: documentation }} />\n </div>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\n\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { useStyles } from '../../themes/ThemeContext';\nimport { CompletionItem, CompletionItemKind } from '../../types/completion';\n\nimport { PartialHighlighter } from './PartialHighlighter';\n\ninterface Props {\n isSelected: boolean;\n item: CompletionItem;\n style: any;\n prefix?: string;\n\n onClickItem?: (event: React.MouseEvent) => void;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}\n\nconst getStyles = (theme: GrafanaTheme) => ({\n typeaheadItem: css`\n label: type-ahead-item;\n height: auto;\n font-family: ${theme.typography.fontFamily.monospace};\n padding: ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.sm} ${theme.spacing.md};\n font-size: ${theme.typography.size.sm};\n text-overflow: ellipsis;\n overflow: hidden;\n z-index: 11;\n display: block;\n white-space: nowrap;\n cursor: pointer;\n transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1),\n background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1);\n `,\n\n typeaheadItemSelected: css`\n label: type-ahead-item-selected;\n background-color: ${theme.colors.bg2};\n `,\n\n typeaheadItemMatch: css`\n label: type-ahead-item-match;\n color: ${theme.palette.yellow};\n border-bottom: 1px solid ${theme.palette.yellow};\n padding: inherit;\n background: inherit;\n `,\n\n typeaheadItemGroupTitle: css`\n label: type-ahead-item-group-title;\n color: ${theme.colors.textWeak};\n font-size: ${theme.typography.size.sm};\n line-height: ${theme.typography.lineHeight.md};\n padding: ${theme.spacing.sm};\n `,\n});\n\nexport const TypeaheadItem: React.FC<Props> = (props: Props) => {\n const styles = useStyles(getStyles);\n\n const { isSelected, item, prefix, style, onMouseEnter, onMouseLeave, onClickItem } = props;\n const className = isSelected ? cx([styles.typeaheadItem, styles.typeaheadItemSelected]) : cx([styles.typeaheadItem]);\n const highlightClassName = cx([styles.typeaheadItemMatch]);\n const itemGroupTitleClassName = cx([styles.typeaheadItemGroupTitle]);\n const label = item.label || '';\n\n if (item.kind === CompletionItemKind.GroupTitle) {\n return (\n <li className={itemGroupTitleClassName} style={style}>\n <span>{label}</span>\n </li>\n );\n }\n\n return (\n <li\n className={className}\n style={style}\n onMouseDown={onClickItem}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {item.highlightParts !== undefined ? (\n <PartialHighlighter\n text={label}\n highlightClassName={highlightClassName}\n highlightParts={item.highlightParts}\n ></PartialHighlighter>\n ) : (\n <Highlighter\n textToHighlight={label}\n searchWords={[prefix ?? '']}\n autoEscape={true}\n highlightClassName={highlightClassName}\n />\n )}\n </li>\n );\n};\n","import { isEqual } from 'lodash';\nimport React, { createRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport { FixedSizeList } from 'react-window';\n\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { CompletionItem, CompletionItemGroup, CompletionItemKind } from '../../types/completion';\nimport { flattenGroupItems, calculateLongestLabel, calculateListSizes } from '../../utils/typeahead';\n\nimport { TypeaheadInfo } from './TypeaheadInfo';\nimport { TypeaheadItem } from './TypeaheadItem';\n\nconst modulo = (a: number, n: number) => a - n * Math.floor(a / n);\n\ninterface Props {\n origin: string;\n groupedItems: CompletionItemGroup[];\n prefix?: string;\n menuRef?: (el: Typeahead) => void;\n onSelectSuggestion?: (suggestion: CompletionItem) => void;\n isOpen?: boolean;\n}\n\nexport interface State {\n allItems: CompletionItem[];\n listWidth: number;\n listHeight: number;\n itemHeight: number;\n hoveredItem: number | null;\n typeaheadIndex: number | null;\n}\n\nexport class Typeahead extends React.PureComponent<Props, State> {\n static contextType = ThemeContext;\n context!: React.ContextType<typeof ThemeContext>;\n listRef = createRef<FixedSizeList>();\n\n state: State = {\n hoveredItem: null,\n typeaheadIndex: null,\n allItems: [],\n listWidth: -1,\n listHeight: -1,\n itemHeight: -1,\n };\n\n componentDidMount = () => {\n if (this.props.menuRef) {\n this.props.menuRef(this);\n }\n\n document.addEventListener('selectionchange', this.handleSelectionChange);\n\n const allItems = flattenGroupItems(this.props.groupedItems);\n const longestLabel = calculateLongestLabel(allItems);\n const { listWidth, listHeight, itemHeight } = calculateListSizes(this.context.v1, allItems, longestLabel);\n this.setState({\n listWidth,\n listHeight,\n itemHeight,\n allItems,\n });\n };\n\n componentWillUnmount = () => {\n document.removeEventListener('selectionchange', this.handleSelectionChange);\n };\n\n handleSelectionChange = () => {\n this.forceUpdate();\n };\n\n componentDidUpdate = (prevProps: Readonly<Props>, prevState: Readonly<State>) => {\n if (\n this.state.typeaheadIndex !== null &&\n prevState.typeaheadIndex !== this.state.typeaheadIndex &&\n this.listRef &&\n this.listRef.current\n ) {\n if (this.state.typeaheadIndex === 1) {\n this.listRef.current.scrollToItem(0); // special case for handling the first group label\n return;\n }\n this.listRef.current.scrollToItem(this.state.typeaheadIndex);\n }\n\n if (isEqual(prevProps.groupedItems, this.props.groupedItems) === false) {\n const allItems = flattenGroupItems(this.props.groupedItems);\n const longestLabel = calculateLongestLabel(allItems);\n const { listWidth, listHeight, itemHeight } = calculateListSizes(this.context.v1, allItems, longestLabel);\n this.setState({ listWidth, listHeight, itemHeight, allItems, typeaheadIndex: null });\n }\n };\n\n onMouseEnter = (index: number) => {\n this.setState({\n hoveredItem: index,\n });\n };\n\n onMouseLeave = () => {\n this.setState({\n hoveredItem: null,\n });\n };\n\n moveMenuIndex = (moveAmount: number) => {\n const itemCount = this.state.allItems.length;\n if (itemCount) {\n // Select next suggestion\n const typeaheadIndex = this.state.typeaheadIndex || 0;\n let newTypeaheadIndex = modulo(typeaheadIndex + moveAmount, itemCount);\n\n if (this.state.allItems[newTypeaheadIndex].kind === CompletionItemKind.GroupTitle) {\n newTypeaheadIndex = modulo(newTypeaheadIndex + moveAmount, itemCount);\n }\n\n this.setState({\n typeaheadIndex: newTypeaheadIndex,\n });\n\n return;\n }\n };\n\n insertSuggestion = () => {\n if (this.props.onSelectSuggestion && this.state.typeaheadIndex !== null) {\n this.props.onSelectSuggestion(this.state.allItems[this.state.typeaheadIndex]);\n }\n };\n\n get menuPosition(): string {\n // Exit for unit tests\n if (!window.getSelection) {\n return '';\n }\n\n const selection = window.getSelection();\n const node = selection && selection.anchorNode;\n\n // Align menu overlay to editor node\n if (node && node.parentElement) {\n // Read from DOM\n const rect = node.parentElement.getBoundingClientRect();\n const scrollX = window.scrollX;\n const scrollY = window.scrollY;\n\n return `position: absolute; display: flex; top: ${rect.top + scrollY + rect.height + 6}px; left: ${\n rect.left + scrollX - 2\n }px`;\n }\n\n return '';\n }\n\n render() {\n const { prefix, isOpen = false, origin } = this.props;\n const { allItems, listWidth, listHeight, itemHeight, hoveredItem, typeaheadIndex } = this.state;\n\n const showDocumentation = hoveredItem || typeaheadIndex;\n const documentationItem = allItems[hoveredItem ? hoveredItem : typeaheadIndex || 0];\n\n return (\n <Portal origin={origin} isOpen={isOpen} style={this.menuPosition}>\n <ul className=\"typeahead\" data-testid=\"typeahead\">\n <FixedSizeList\n ref={this.listRef}\n itemCount={allItems.length}\n itemSize={itemHeight}\n itemKey={(index) => {\n const item = allItems && allItems[index];\n const key = item ? `${index}-${item.label}` : `${index}`;\n return key;\n }}\n width={listWidth}\n height={listHeight}\n >\n {({ index, style }) => {\n const item = allItems && allItems[index];\n if (!item) {\n return null;\n }\n\n return (\n <TypeaheadItem\n onClickItem={() => (this.props.onSelectSuggestion ? this.props.onSelectSuggestion(item) : {})}\n isSelected={typeaheadIndex === null ? false : allItems[typeaheadIndex] === item}\n item={item}\n prefix={prefix}\n style={style}\n onMouseEnter={() => this.onMouseEnter(index)}\n onMouseLeave={this.onMouseLeave}\n />\n );\n }}\n </FixedSizeList>\n </ul>\n\n {showDocumentation && <TypeaheadInfo height={listHeight} item={documentationItem} />}\n </Portal>\n );\n }\n}\n\ninterface PortalProps {\n index?: number;\n isOpen: boolean;\n origin: string;\n style: string;\n}\n\nclass Portal extends React.PureComponent<PortalProps, {}> {\n node: HTMLElement;\n\n constructor(props: PortalProps) {\n super(props);\n const { index = 0, origin = 'query', style } = props;\n this.node = document.createElement('div');\n this.node.setAttribute('style', style);\n this.node.classList.add(`slate-typeahead`, `slate-typeahead-${origin}-${index}`);\n document.body.appendChild(this.node);\n }\n\n componentWillUnmount() {\n document.body.removeChild(this.node);\n }\n\n render() {\n if (this.props.isOpen) {\n this.node.setAttribute('style', this.props.style);\n this.node.classList.add(`slate-typeahead--open`);\n return ReactDOM.createPortal(this.props.children, this.node);\n } else {\n this.node.classList.remove(`slate-typeahead--open`);\n }\n\n return null;\n }\n}\n","import { debounce, sortBy } from 'lodash';\nimport React from 'react';\nimport { Editor as CoreEditor } from 'slate';\n\nimport { Plugin as SlatePlugin } from '@grafana/slate-react';\n\nimport { Typeahead } from '../components/Typeahead/Typeahead';\nimport { CompletionItem, SuggestionsState, TypeaheadInput, TypeaheadOutput } from '../types';\nimport { makeFragment, SearchFunctionType } from '../utils';\nimport { SearchFunctionMap } from '../utils/searchFunctions';\n\nimport TOKEN_MARK from './slate-prism/TOKEN_MARK';\n\nexport const TYPEAHEAD_DEBOUNCE = 250;\n\n// Commands added to the editor by this plugin.\ninterface SuggestionsPluginCommands {\n selectSuggestion: (suggestion: CompletionItem) => CoreEditor;\n applyTypeahead: (suggestion: CompletionItem) => CoreEditor;\n}\n\nexport function SuggestionsPlugin({\n onTypeahead,\n cleanText,\n onWillApplySuggestion,\n portalOrigin,\n}: {\n onTypeahead?: (typeahead: TypeaheadInput) => Promise<TypeaheadOutput>;\n cleanText?: (text: string) => string;\n onWillApplySuggestion?: (suggestion: string, state: SuggestionsState) => string;\n portalOrigin: string;\n}): SlatePlugin {\n let typeaheadRef: Typeahead;\n let state: SuggestionsState = {\n groupedItems: [],\n typeaheadPrefix: '',\n typeaheadContext: '',\n typeaheadText: '',\n };\n const handleTypeaheadDebounced = debounce(handleTypeahead, TYPEAHEAD_DEBOUNCE);\n\n const setState = (update: Partial<SuggestionsState>) => {\n state = {\n ...state,\n ...update,\n };\n };\n\n return {\n onBlur: (event, editor, next) => {\n state = {\n ...state,\n groupedItems: [],\n };\n\n return next();\n },\n\n onClick: (event, editor, next) => {\n state = {\n ...state,\n groupedItems: [],\n };\n\n return next();\n },\n\n onKeyDown: (event: Event, editor, next) => {\n const keyEvent = event as KeyboardEvent;\n const currentSuggestions = state.groupedItems;\n\n const hasSuggestions = currentSuggestions.length;\n\n switch (keyEvent.key) {\n case 'Escape': {\n if (hasSuggestions) {\n keyEvent.preventDefault();\n\n state = {\n ...state,\n groupedItems: [],\n };\n\n // Bogus edit to re-render editor\n return editor.insertText('');\n }\n\n break;\n }\n\n case 'ArrowDown':\n case 'ArrowUp':\n if (hasSuggestions) {\n keyEvent.preventDefault();\n typeaheadRef.moveMenuIndex(keyEvent.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n\n break;\n\n case 'Enter': {\n if (!(keyEvent.shiftKey || keyEvent.ctrlKey) && hasSuggestions) {\n keyEvent.preventDefault();\n return typeaheadRef.insertSuggestion();\n }\n\n break;\n }\n\n case 'Tab': {\n if (hasSuggestions) {\n keyEvent.preventDefault();\n return typeaheadRef.insertSuggestion();\n }\n\n break;\n }\n\n default: {\n // Don't react on meta keys\n if (keyEvent.key.length === 1) {\n handleTypeaheadDebounced(editor, setState, onTypeahead, cleanText);\n }\n break;\n }\n }\n\n return next();\n },\n\n commands: {\n selectSuggestion: (editor: CoreEditor, suggestion: CompletionItem): CoreEditor => {\n const suggestions = state.groupedItems;\n if (!suggestions || !suggestions.length) {\n return editor;\n }\n\n // @ts-ignore\n const ed = editor.applyTypeahead(suggestion);\n handleTypeaheadDebounced(editor, setState, onTypeahead, cleanText);\n return ed;\n },\n\n applyTypeahead: (editor: CoreEditor, suggestion: CompletionItem): CoreEditor => {\n let suggestionText = suggestion.insertText || suggestion.label;\n\n const preserveSuffix = suggestion.kind === 'function';\n const move = suggestion.move || 0;\n\n const { typeaheadPrefix, typeaheadText, typeaheadContext } = state;\n\n if (onWillApplySuggestion) {\n suggestionText = onWillApplySuggestion(suggestionText, {\n groupedItems: state.groupedItems,\n typeaheadContext,\n typeaheadPrefix,\n typeaheadText,\n });\n }\n\n // Remove the current, incomplete text and replace it with the selected suggestion\n const backward = suggestion.deleteBackwards || typeaheadPrefix.length;\n const text = cleanText ? cleanText(typeaheadText) : typeaheadText;\n const suffixLength = text.length - typeaheadPrefix.length;\n const offset = typeaheadText.indexOf(typeaheadPrefix);\n const midWord = typeaheadPrefix && ((suffixLength > 0 && offset > -1) || suggestionText === typeaheadText);\n const forward = midWord && !preserveSuffix ? suffixLength + offset : 0;\n\n // If new-lines, apply suggestion as block\n if (suggestionText.match(/\\n/)) {\n const fragment = makeFragment(suggestionText);\n return editor.deleteBackward(backward).deleteForward(forward).insertFragment(fragment).focus();\n }\n\n state = {\n ...state,\n groupedItems: [],\n };\n\n return editor\n .snapshotSelection()\n .deleteBackward(backward)\n .deleteForward(forward)\n .insertText(suggestionText)\n .moveForward(move)\n .focus();\n },\n },\n\n renderEditor(props, editor, next) {\n if (editor.value.selection.isExpanded) {\n return next();\n }\n\n const children = next();\n\n return (\n <>\n {children}\n <Typeahead\n menuRef={(menu: Typeahead) => (typeaheadRef = menu)}\n origin={portalOrigin}\n prefix={state.typeaheadPrefix}\n isOpen={!!state.groupedItems.length}\n groupedItems={state.groupedItems}\n onSelectSuggestion={(editor as CoreEditor & SuggestionsPluginCommands).selectSuggestion}\n />\n </>\n );\n },\n };\n}\n\nconst handleTypeahead = async (\n editor: CoreEditor,\n onStateChange: (state: Partial<SuggestionsState>) => void,\n onTypeahead?: (typeahead: TypeaheadInput) => Promise<TypeaheadOutput>,\n cleanText?: (text: string) => string\n): Promise<void> => {\n if (!onTypeahead) {\n return;\n }\n\n const { value } = editor;\n const { selection } = value;\n\n // Get decorations associated with the current line\n const parentBlock = value.document.getClosestBlock(value.focusBlock.key);\n const selectionStartOffset = value.selection.start.offset - 1;\n const decorations = parentBlock && parentBlock.getDecorations(editor as any);\n\n const filteredDecorations = decorations\n ? decorations\n .filter(\n (decoration) =>\n decoration!.start.offset <= selectionStartOffset &&\n decoration!.end.offset > selectionStartOffset &&\n decoration!.type === TOKEN_MARK\n )\n .toArray()\n : [];\n\n // Find the first label key to the left of the cursor\n const labelKeyDec =\n decorations &&\n decorations\n .filter(\n (decoration) =>\n decoration!.end.offset <= selectionStartOffset &&\n decoration!.type === TOKEN_MARK &&\n decoration!.data.get('className').includes('label-key')\n )\n .last();\n\n const labelKey = labelKeyDec && value.focusText.text.slice(labelKeyDec.start.offset, labelKeyDec.end.offset);\n\n const wrapperClasses = filteredDecorations\n .map((decoration) => decoration.data.get('className'))\n .join(' ')\n .split(' ')\n .filter((className) => className.length);\n\n let text = value.focusText.text;\n let prefix = text.slice(0, selection.focus.offset);\n\n if (filteredDecorations.length) {\n text = value.focusText.text.slice(filteredDecorations[0].start.offset, filteredDecorations[0].end.offset);\n prefix = value.focusText.text.slice(filteredDecorations[0].start.offset, selection.focus.offset);\n }\n\n // Label values could have valid characters erased if `cleanText()` is\n // blindly applied, which would undesirably interfere with suggestions\n const labelValueMatch = prefix.match(/(?:!?=~?\"?|\")(.*)/);\n if (labelValueMatch) {\n prefix = labelValueMatch[1];\n } else if (cleanText) {\n prefix = cleanText(prefix);\n }\n\n const { suggestions, context } = await onTypeahead({\n prefix,\n text,\n value,\n wrapperClasses,\n labelKey: labelKey || undefined,\n editor,\n });\n\n const filteredSuggestions = suggestions\n .map((group) => {\n if (!group.items) {\n return group;\n }\n // Falling back to deprecated prefixMatch to support backwards compatibility with plugins using this property\n const searchFunctionType =\n group.searchFunctionType || (group.prefixMatch ? SearchFunctionType.Prefix : SearchFunctionType.Word);\n const searchFunction = SearchFunctionMap[searchFunctionType];\n let newGroup = { ...group };\n if (prefix) {\n // Filter groups based on prefix\n if (!group.skipFilter) {\n newGroup.items = newGroup.items.filter((c) => (c.filterText || c.label).length >= prefix.length);\n newGroup.items = searchFunction(newGroup.items, prefix);\n }\n\n // Filter out the already typed value (prefix) unless it inserts custom text not matching the prefix\n newGroup.items = newGroup.items.filter(\n (c) => !(c.insertText === prefix || (c.filterText ?? c.label) === prefix)\n );\n }\n\n if (!group.skipSort) {\n newGroup.items = sortBy(newGroup.items, (item: CompletionItem) => {\n if (item.sortText === undefined) {\n return item.sortValue !== undefined ? item.sortValue : item.label;\n } else {\n // Falling back to deprecated sortText to support backwards compatibility with plugins using this property\n return item.sortText || item.label;\n }\n });\n }\n\n return newGroup;\n })\n .filter((gr) => gr.items && gr.items.length); // Filter out empty groups\n\n onStateChange({\n groupedItems: filteredSuggestions,\n typeaheadPrefix: prefix,\n typeaheadContext: context,\n typeaheadText: text,\n });\n\n // Bogus edit to force re-render\n editor.blur().focus();\n};\n","const TOKEN_MARK = 'prism-token';\n\nexport default TOKEN_MARK;\n","import { Record } from 'immutable';\nimport React from 'react';\nimport { Mark, Node, Decoration } from 'slate';\n\nimport { Editor } from '@grafana/slate-react';\n\nimport TOKEN_MARK from './TOKEN_MARK';\n\nexport interface OptionsFormat {\n // Determine which node should be highlighted\n onlyIn?: (node: Node) => boolean;\n // Returns the syntax for a node that should be highlighted\n getSyntax?: (node: Node) => string;\n // Render a highlighting mark in a highlighted node\n renderMark?: ({ mark, children }: { mark: Mark; children: React.ReactNode }) => void | React.ReactNode;\n}\n\n/**\n * Default filter for code blocks\n */\nfunction defaultOnlyIn(node: Node): boolean {\n return node.object === 'block' && node.type === 'code_block';\n}\n\n/**\n * Default getter for syntax\n */\nfunction defaultGetSyntax(node: Node): string {\n return 'javascript';\n}\n\n/**\n * Default rendering for decorations\n */\nfunction defaultRenderDecoration(\n props: { children: React.ReactNode; decoration: Decoration },\n editor: Editor,\n next: () => any\n): void | React.ReactNode {\n const { decoration } = props;\n if (decoration.type !== TOKEN_MARK) {\n return next();\n }\n\n const className = decoration.data.get('className');\n return <span className={className}>{props.children}</span>;\n}\n\n/**\n * The plugin options\n */\nclass Options\n extends Record({\n onlyIn: defaultOnlyIn,\n getSyntax: defaultGetSyntax,\n renderDecoration: defaultRenderDecoration,\n })\n implements OptionsFormat\n{\n declare readonly onlyIn: (node: Node) => boolean;\n declare readonly getSyntax: (node: Node) => string;\n declare readonly renderDecoration: (\n {\n decoration,\n children,\n }: {\n decoration: Decoration;\n children: React.ReactNode;\n },\n editor: Editor,\n next: () => any\n ) => void | React.ReactNode;\n\n constructor(props: OptionsFormat) {\n super(props);\n }\n}\n\nexport default Options;\n","import Prism, { LanguageMap } from 'prismjs';\nimport { Block, Text, Decoration } from 'slate';\n\nimport { Plugin } from '@grafana/slate-react';\n\nimport TOKEN_MARK from './TOKEN_MARK';\nimport Options, { OptionsFormat } from './options';\n\nexport interface Token {\n content: string;\n offsets?: {\n start: number;\n end: number;\n };\n types: string[];\n aliases: string[];\n prev?: Token | null;\n next?: Token | null;\n}\n\n/**\n * A Slate plugin to highlight code syntax.\n */\nexport function SlatePrism(optsParam: OptionsFormat = {}, prismLanguages = Prism.languages as LanguageMap): Plugin {\n const opts: Options = new Options(optsParam);\n\n return {\n decorateNode: (node, editor, next) => {\n if (!opts.onlyIn(node)) {\n return next();\n }\n\n const block = Block.create(node as Block);\n const grammarName = opts.getSyntax(block);\n const grammar = prismLanguages[grammarName];\n\n if (!grammar) {\n // Grammar not loaded\n return [];\n }\n\n // Tokenize the whole block text\n const texts = block.getTexts();\n const blockText = texts.map((text) => text && text.getText()).join('\\n');\n const tokens = Prism.tokenize(blockText, grammar);\n const flattened = flattenTokens(tokens);\n\n const newData = editor.value.data.set('tokens', flattened);\n editor.setData(newData);\n return decorateNode(opts, tokens, block);\n },\n\n renderDecoration: (props, editor, next) =>\n opts.renderDecoration(\n {\n children: props.children,\n decoration: props.decoration,\n },\n editor as any,\n next\n ),\n };\n}\n\n/**\n * Returns the decoration for a node\n */\nfunction decorateNode(opts: Options, tokens: Array<string | Prism.Token>, block: Block) {\n const texts = block.getTexts();\n\n // The list of decorations to return\n const decorations: Decoration[] = [];\n let textStart = 0;\n let textEnd = 0;\n\n texts.forEach((text) => {\n textEnd = textStart + text!.getText().length;\n\n let offset = 0;\n function processToken(token: string | Prism.Token, accu?: string | number) {\n if (typeof token === 'string') {\n if (accu) {\n const decoration = createDecoration({\n text: text!,\n textStart,\n textEnd,\n start: offset,\n end: offset + token.length,\n className: `prism-token token ${accu}`,\n block,\n });\n\n if (decoration) {\n decorations.push(decoration);\n }\n }\n offset += token.length;\n } else {\n accu = `${accu} ${token.type}`;\n if (token.alias) {\n accu += ' ' + token.alias;\n }\n\n if (typeof token.content === 'string') {\n const decoration = createDecoration({\n text: text!,\n textStart,\n textEnd,\n start: offset,\n end: offset + token.content.length,\n className: `prism-token token ${accu}`,\n block,\n });\n\n if (decoration) {\n decorations.push(decoration);\n }\n\n offset += token.content.length;\n } else {\n // When using token.content instead of token.matchedStr, token can be deep\n for (let i = 0; i < token.content.length; i += 1) {\n // @ts-ignore\n processToken(token.content[i], accu);\n }\n }\n }\n }\n\n tokens.forEach(processToken);\n textStart = textEnd + 1; // account for added `\\n`\n });\n\n return decorations;\n}\n\n/**\n * Return a decoration range for the given text.\n */\nfunction createDecoration({\n text,\n textStart,\n textEnd,\n start,\n end,\n className,\n block,\n}: {\n text: Text; // The text being decorated\n textStart: number; // Its start position in the whole text\n textEnd: number; // Its end position in the whole text\n start: number; // The position in the whole text where the token starts\n end: number; // The position in the whole text where the token ends\n className: string; // The prism token classname\n block: Block;\n}): Decoration | null {\n if (start >= textEnd || end <= textStart) {\n // Ignore, the token is not in the text\n return null;\n }\n\n // Shrink to this text boundaries\n start = Math.max(start, textStart);\n end = Math.min(end, textEnd);\n\n // Now shift offsets to be relative to this text\n start -= textStart;\n end -= textStart;\n\n const myDec = block.createDecoration({\n object: 'decoration',\n anchor: {\n key: text.key,\n offset: start,\n object: 'point',\n },\n focus: {\n key: text.key,\n offset: end,\n object: 'point',\n },\n type: TOKEN_MARK,\n data: { className },\n });\n\n return myDec;\n}\n\nfunction flattenToken(token: string | Prism.Token | Array<string | Prism.Token>): Token[] {\n if (typeof token === 'string') {\n return [\n {\n content: token,\n types: [],\n aliases: [],\n },\n ];\n } else if (Array.isArray(token)) {\n return token.flatMap((t) => flattenToken(t));\n } else if (token instanceof Prism.Token) {\n return flattenToken(token.content).flatMap((t) => {\n let aliases: string[] = [];\n if (typeof token.alias === 'string') {\n aliases = [token.alias];\n } else {\n aliases = token.alias ?? [];\n }\n\n return {\n content: t.content,\n types: [token.type, ...t.types],\n aliases: [...aliases, ...t.aliases],\n };\n });\n }\n\n return [];\n}\n\nexport function flattenTokens(token: string | Prism.Token | Array<string | Prism.Token>) {\n const tokens = flattenToken(token);\n\n if (!tokens.length) {\n return [];\n }\n\n const firstToken = tokens[0];\n firstToken.prev = null;\n firstToken.next = tokens.length >= 2 ? tokens[1] : null;\n firstToken.offsets = {\n start: 0,\n end: firstToken.content.length,\n };\n\n for (let i = 1; i < tokens.length - 1; i++) {\n tokens[i].prev = tokens[i - 1];\n tokens[i].next = tokens[i + 1];\n\n tokens[i].offsets = {\n start: tokens[i - 1].offsets!.end,\n end: tokens[i - 1].offsets!.end + tokens[i].content.length,\n };\n }\n\n const lastToken = tokens[tokens.length - 1];\n lastToken.prev = tokens.length >= 2 ? tokens[tokens.length - 2] : null;\n lastToken.next = null;\n lastToken.offsets = {\n start: tokens.length >= 2 ? tokens[tokens.length - 2].offsets!.end : 0,\n end:\n tokens.length >= 2 ? tokens[tokens.length - 2].offsets!.end + lastToken.content.length : lastToken.content.length,\n };\n\n return tokens;\n}\n","import hoistNonReactStatics from 'hoist-non-react-statics';\nimport React, { useContext } from 'react';\n\nimport { createTheme, GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\n\nimport { Themeable, Themeable2 } from '../types/theme';\n\nimport { stylesFactory } from './stylesFactory';\n\ntype Omit<T, K> = Pick<T, Exclude<keyof T, K>>;\ntype Subtract<T, K> = Omit<T, keyof K>;\n\n/**\n * Mock used in tests\n */\nlet ThemeContextMock: React.Context<GrafanaTheme2> | null = null;\n\n// Used by useStyles()\nexport const memoizedStyleCreators = new WeakMap();\n\n// Use Grafana Dark theme by default\n/** @public */\nexport const ThemeContext = React.createContext(createTheme());\n\nThemeContext.displayName = 'ThemeContext';\n\n/** @deprecated use withTheme2 */\n/** @public */\nexport const withTheme = <P extends Themeable, S extends {} = {}>(Component: React.ComponentType<P>) => {\n const WithTheme: React.FunctionComponent<Subtract<P, Themeable>> = (props) => {\n /**\n * If theme context is mocked, let's use it instead of the original context\n * This is used in tests when mocking theme using mockThemeContext function defined below\n */\n const ContextComponent = ThemeContextMock || ThemeContext;\n return (\n // @ts-ignore\n <ContextComponent.Consumer>{(theme) => <Component {...props} theme={theme.v1} />}</ContextComponent.Consumer>\n );\n };\n\n WithTheme.displayName = `WithTheme(${Component.displayName})`;\n hoistNonReactStatics(WithTheme, Component);\n type Hoisted = typeof WithTheme & S;\n return WithTheme as Hoisted;\n};\n\n/** @alpha */\nexport const withTheme2 = <P extends Themeable2, S extends {} = {}>(Component: React.ComponentType<P>) => {\n const WithTheme: React.FunctionComponent<Subtract<P, Themeable2>> = (props) => {\n /**\n * If theme context is mocked, let's use it instead of the original context\n * This is used in tests when mocking theme using mockThemeContext function defined below\n */\n const ContextComponent = ThemeContextMock || ThemeContext;\n return (\n // @ts-ignore\n <ContextComponent.Consumer>{(theme) => <Component {...props} theme={theme} />}</ContextComponent.Consumer>\n );\n };\n\n WithTheme.displayName = `WithTheme(${Component.displayName})`;\n hoistNonReactStatics(WithTheme, Component);\n type Hoisted = typeof WithTheme & S;\n return WithTheme as Hoisted;\n};\n\n/** @deprecated use useTheme2 */\n/** @public */\nexport function useTheme(): GrafanaTheme {\n return useContext(ThemeContextMock || ThemeContext).v1;\n}\n\n/** @public */\nexport function useTheme2(): GrafanaTheme2 {\n return useContext(ThemeContextMock || ThemeContext);\n}\n\n/**\n * Hook for using memoized styles with access to the theme.\n *\n * NOTE: For memoization to work, you need to ensure that the function\n * you pass in doesn't change, or only if it needs to. (i.e. declare\n * your style creator outside of a function component or use `useCallback()`.)\n * */\n/** @public */\nexport function useStyles<T>(getStyles: (theme: GrafanaTheme) => T) {\n const theme = useTheme();\n\n let memoizedStyleCreator = memoizedStyleCreators.get(getStyles) as typeof getStyles;\n if (!memoizedStyleCreator) {\n memoizedStyleCreator = stylesFactory(getStyles);\n memoizedStyleCreators.set(getStyles, memoizedStyleCreator);\n }\n\n return memoizedStyleCreator(theme);\n}\n\n/**\n * Hook for using memoized styles with access to the theme.\n *\n * NOTE: For memoization to work, you need to ensure that the function\n * you pass in doesn't change, or only if it needs to. (i.e. declare\n * your style creator outside of a function component or use `useCallback()`.)\n * */\n/** @public */\nexport function useStyles2<T>(getStyles: (theme: GrafanaTheme2) => T) {\n const theme = useTheme2();\n\n let memoizedStyleCreator = memoizedStyleCreators.get(getStyles) as typeof getStyles;\n if (!memoizedStyleCreator) {\n memoizedStyleCreator = stylesFactory(getStyles);\n memoizedStyleCreators.set(getStyles, memoizedStyleCreator);\n }\n\n return memoizedStyleCreator(theme);\n}\n\n/**\n * Enables theme context mocking\n */\n/** @public */\nexport const mockThemeContext = (theme: Partial<GrafanaTheme2>) => {\n ThemeContextMock = React.createContext(theme as GrafanaTheme2);\n\n return () => {\n ThemeContextMock = null;\n };\n};\n","import { createTheme, GrafanaTheme } from '@grafana/data';\n\nlet themeMock: ((name?: string) => GrafanaTheme) | null;\n\n/** @public */\nexport const getTheme = (mode: 'dark' | 'light' = 'dark') => {\n if (themeMock) {\n return themeMock(mode);\n }\n\n return createTheme({ colors: { mode } }).v1;\n};\n\n/** @public */\nexport const mockTheme = (mock: (name?: string) => GrafanaTheme) => {\n themeMock = mock;\n return () => {\n themeMock = null;\n };\n};\n","import { css } from '@emotion/react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport function getAgularPanelStyles(theme: GrafanaTheme2) {\n return css`\n .panel-options-group {\n border-bottom: 1px solid ${theme.colors.border.weak};\n }\n\n .panel-options-group__header {\n padding: ${theme.spacing(1, 2, 1, 1)};\n position: relative;\n display: flex;\n align-items: center;\n cursor: pointer;\n font-weight: 500;\n color: ${theme.colors.text.primary};\n\n &:hover {\n background: ${theme.colors.emphasize(theme.colors.background.primary, 0.03)};\n }\n }\n\n .panel-options-group__icon {\n color: ${theme.colors.text.secondary};\n margin-right: ${theme.spacing(1)};\n padding: ${theme.spacing(0, 0.9, 0, 0.6)};\n }\n\n .panel-options-group__title {\n position: relative;\n }\n\n .panel-options-group__body {\n padding: ${theme.spacing(1, 2, 1, 4)};\n }\n `;\n}\n","import { css } from '@emotion/react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport function getCardStyles(theme: GrafanaTheme2) {\n return css`\n .card-section {\n margin-bottom: ${theme.spacing(4)};\n }\n\n .card-list {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n list-style-type: none;\n }\n\n .card-item {\n display: block;\n height: 100%;\n background: ${theme.colors.background.secondary};\n box-shadow: none;\n padding: ${theme.spacing(2)};\n border-radius: 4px;\n\n &:hover {\n background: ${theme.colors.emphasize(theme.colors.background.secondary, 0.03)};\n }\n\n .label-tag {\n margin-left: ${theme.spacing(1)};\n font-size: 11px;\n padding: 2px 6px;\n }\n }\n\n .card-item-body {\n display: flex;\n overflow: hidden;\n }\n\n .card-item-details {\n overflow: hidden;\n }\n\n .card-item-header {\n margin-bottom: ${theme.spacing(2)};\n }\n\n .card-item-type {\n color: ${theme.colors.text.secondary};\n text-transform: uppercase;\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.fontWeightMedium};\n }\n\n .card-item-badge {\n margin: 6px 0;\n }\n\n .card-item-notice {\n font-size: ${theme.typography.size.sm};\n }\n\n .card-item-name {\n color: ${theme.colors.text.primary};\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n }\n\n .card-item-label {\n margin-left: ${theme.spacing(1)};\n }\n\n .card-item-sub-name {\n color: ${theme.colors.text.secondary};\n overflow: hidden;\n text-overflow: ellipsis;\n width: 100%;\n }\n\n .card-item-sub-name--header {\n color: ${theme.colors.text.secondary};\n text-transform: uppercase;\n margin-bottom: ${theme.spacing(2)};\n font-size: ${theme.typography.size.sm};\n font-weight: bold;\n }\n\n .card-list-layout-grid {\n .card-item-type {\n display: inline-block;\n }\n\n .card-item-notice {\n font-size: ${theme.typography.size.sm};\n display: inline-block;\n margin-left: ${theme.spacing(2)};\n }\n\n .card-item-header-action {\n float: right;\n }\n\n .card-item-wrapper {\n width: 100%;\n padding: ${theme.spacing(0, 2, 2, 0)};\n }\n\n .card-item-wrapper--clickable {\n cursor: pointer;\n }\n\n .card-item-figure {\n margin: ${theme.spacing(0, 2, 2, 0)}0;\n height: 80px;\n\n img {\n width: 80px;\n }\n }\n\n .card-item-name {\n font-size: ${theme.typography.h3.fontSize};\n }\n\n ${theme.breakpoints.up('md')} {\n .card-item-wrapper {\n width: 50%;\n }\n }\n\n ${theme.breakpoints.up('lg')} {\n .card-item-wrapper {\n width: 33.333333%;\n }\n }\n\n &.card-list-layout-grid--max-2-col {\n ${theme.breakpoints.up('lg')} {\n .card-item-wrapper {\n width: 50%;\n }\n }\n }\n }\n\n .card-list-layout-list {\n .card-item-wrapper {\n padding: 0;\n width: 100%;\n margin-bottom: ${theme.spacing(1)};\n }\n\n .card-item-wrapper--clickable {\n cursor: pointer;\n }\n\n .card-item {\n border-radius: 2px;\n }\n\n .card-item-header {\n float: right;\n text-align: right;\n }\n\n .card-item-figure {\n margin: ${theme.spacing(0, 2, 0, 0)};\n img {\n width: 48px;\n }\n }\n\n .card-item-name {\n font-size: ${theme.typography.h4.fontSize};\n }\n\n .card-item-sub-name {\n font-size: ${theme.typography.size.sm};\n }\n\n .layout-selector {\n margin-right: 0;\n }\n }\n `;\n}\n","import { css } from '@emotion/react';\n\nimport { GrafanaTheme2, ThemeTypographyVariant } from '@grafana/data';\n\nimport { getFocusStyles } from '../mixins';\n\nexport function getElementStyles(theme: GrafanaTheme2) {\n return css`\n html {\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n height: 100%;\n font-size: ${theme.typography.htmlFontSize}px;\n font-family: ${theme.typography.fontFamily};\n line-height: ${theme.typography.body.lineHeight};\n font-kerning: normal;\n }\n\n body {\n height: 100%;\n width: 100%;\n position: absolute;\n color: ${theme.colors.text.primary};\n background-color: ${theme.colors.background.canvas};\n ${getVariantStyles(theme.typography.body)}\n }\n\n h1,\n .h1 {\n ${getVariantStyles(theme.typography.h1)}\n }\n h2,\n .h2 {\n ${getVariantStyles(theme.typography.h2)}\n }\n h3,\n .h3 {\n ${getVariantStyles(theme.typography.h3)}\n }\n h4,\n .h4 {\n ${getVariantStyles(theme.typography.h4)}\n }\n h5,\n .h5 {\n ${getVariantStyles(theme.typography.h5)}\n }\n h6,\n .h6 {\n ${getVariantStyles(theme.typography.h6)}\n }\n\n p {\n margin: 0 0 ${theme.spacing(2)};\n }\n\n button {\n letter-spacing: ${theme.typography.body.letterSpacing};\n\n &:focus-visible {\n outline: ${getFocusStyles(theme)};\n }\n &:focus {\n outline: none;\n }\n }\n\n // Ex: 14px base font * 85% = about 12px\n small {\n font-size: ${theme.typography.bodySmall.fontSize};\n }\n\n b,\n strong {\n font-weight: ${theme.typography.fontWeightMedium};\n }\n\n em {\n font-style: italic;\n color: ${theme.colors.text.primary};\n }\n\n cite {\n font-style: normal;\n }\n\n // Utility classes\n .muted {\n color: ${theme.colors.text.secondary};\n }\n\n a.muted:hover,\n a.muted:focus {\n color: ${theme.colors.text.primary};\n }\n\n .text-warning {\n color: ${theme.colors.warning.text};\n\n &:hover,\n &:focus {\n color: ${theme.colors.emphasize(theme.colors.warning.text, 0.15)};\n }\n }\n\n .text-error {\n color: ${theme.colors.error.text};\n\n &:hover,\n &:focus {\n color: ${theme.colors.emphasize(theme.colors.error.text, 0.15)};\n }\n }\n\n .text-success {\n color: $success-text-color;\n\n &:hover,\n &:focus {\n color: ${theme.colors.emphasize(theme.colors.success.text, 0.15)};\n }\n }\n\n a {\n cursor: pointer;\n color: ${theme.colors.text.primary};\n text-decoration: none;\n\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n ${getFocusStyles(theme)}\n }\n\n &: [disabled] {\n cursor: default;\n pointer-events: none !important;\n }\n }\n\n .text-link {\n text-decoration: underline;\n }\n\n .text-left {\n text-align: left;\n }\n\n .text-right {\n text-align: right;\n }\n\n .text-center {\n text-align: center;\n }\n\n .highlight-search-match {\n background: ${theme.components.textHighlight.background};\n color: ${theme.components.textHighlight.text};\n padding: 0;\n }\n `;\n}\n\nexport function getVariantStyles(variant: ThemeTypographyVariant) {\n return `\n margin: 0;\n font-size: ${variant.fontSize}; \n line-height: ${variant.lineHeight};\n font-weight: ${variant.fontWeight};\n letter-spacing: ${variant.letterSpacing};\n font-family: ${variant.fontFamily};\n margin-bottom: 0.45em;\n `;\n}\n","import { css } from '@emotion/react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport function getPageStyles(theme: GrafanaTheme2) {\n const maxWidthBreakpoint =\n theme.breakpoints.values.xxl + theme.spacing.gridSize * 2 + theme.components.sidemenu.width;\n\n return css`\n .grafana-app {\n display: flex;\n align-items: stretch;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n .main-view {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n height: 100%;\n flex: 1 1 0;\n }\n\n .page-scrollbar-content {\n display: flex;\n min-height: 100%;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .page-container {\n flex-grow: 1;\n flex-basis: 100%;\n padding-left: ${theme.spacing(2)};\n padding-right: ${theme.spacing(2)};\n\n ${theme.breakpoints.up('sm')} {\n margin: ${theme.spacing(0, 1)};\n }\n\n ${theme.breakpoints.up('md')} {\n margin: ${theme.spacing(0, 2)};\n }\n\n @media (min-width: ${maxWidthBreakpoint}px) {\n max-width: ${theme.breakpoints.values.xxl}px;\n margin-left: auto;\n margin-right: auto;\n width: 100%;\n }\n }\n\n .page-full {\n margin-left: ${theme.spacing(2)};\n padding-left: ${theme.spacing(2)};\n padding-right: ${theme.spacing(2)};\n }\n\n .page-body {\n padding: ${theme.spacing(1)};\n background: ${theme.components.panel.background};\n border: 1px solid ${theme.components.panel.borderColor};\n margin-bottom: 32px;\n\n ${theme.breakpoints.up('md')} {\n padding: ${theme.spacing(2)};\n }\n\n ${theme.breakpoints.up('lg')} {\n padding: ${theme.spacing(3)};\n }\n }\n\n .page-heading {\n font-size: ${theme.typography.h4.fontSize};\n margin-top: 0;\n margin-bottom: ${theme.spacing(2)};\n }\n\n .page-action-bar {\n margin-bottom: ${theme.spacing(2)};\n display: flex;\n align-items: flex-start;\n\n > a,\n > button {\n margin-left: ${theme.spacing(2)};\n }\n }\n\n .page-action-bar--narrow {\n margin-bottom: 0;\n }\n\n .page-action-bar__spacer {\n width: ${theme.spacing(2)};\n flex-grow: 1;\n }\n\n .page-sub-heading {\n margin-bottom: ${theme.spacing(2)};\n }\n\n .page-sub-heading-icon {\n margin-left: ${theme.spacing(1)};\n margin-top: ${theme.spacing(0.5)};\n }\n `;\n}\n","import { Global } from '@emotion/react';\nimport React from 'react';\n\nimport { useTheme2 } from '..';\n\nimport { getAgularPanelStyles } from './angularPanelStyles';\nimport { getCardStyles } from './card';\nimport { getElementStyles } from './elements';\nimport { getMarkdownStyles } from './markdownStyles';\nimport { getPageStyles } from './page';\n\n/** @internal */\nexport function GlobalStyles() {\n const theme = useTheme2();\n\n return (\n <Global\n styles={[\n getElementStyles(theme),\n getPageStyles(theme),\n getCardStyles(theme),\n getAgularPanelStyles(theme),\n getMarkdownStyles(theme),\n ]}\n />\n );\n}\n","import { css } from '@emotion/react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport function getMarkdownStyles(theme: GrafanaTheme2) {\n return css`\n // TODO copy from _utils.scss\n `;\n}\n","import { CSSObject } from '@emotion/css';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\n\nexport function cardChrome(theme: GrafanaTheme2): string {\n return `\n background: ${theme.colors.background.secondary};\n &:hover {\n background: ${hoverColor(theme.colors.background.secondary, theme)};\n }\n box-shadow: ${theme.components.panel.boxShadow};\n border-radius: ${theme.shape.borderRadius(2)};\n`;\n}\n\nexport function hoverColor(color: string, theme: GrafanaTheme2): string {\n return theme.isDark ? tinycolor(color).brighten(2).toString() : tinycolor(color).darken(2).toString();\n}\n\nexport function listItem(theme: GrafanaTheme2): string {\n return `\n background: ${theme.colors.background.secondary};\n &:hover {\n background: ${hoverColor(theme.colors.background.secondary, theme)};\n }\n box-shadow: ${theme.components.panel.boxShadow};\n border-radius: ${theme.shape.borderRadius(2)};\n`;\n}\n\nexport function listItemSelected(theme: GrafanaTheme2): string {\n return `\n background: ${hoverColor(theme.colors.background.secondary, theme)};\n color: ${theme.colors.text.maxContrast};\n`;\n}\n\nexport function mediaUp(breakpoint: string) {\n return `only screen and (min-width: ${breakpoint})`;\n}\n\nexport const focusCss = (theme: GrafanaTheme) => `\n outline: 2px dotted transparent;\n outline-offset: 2px;\n box-shadow: 0 0 0 2px ${theme.colors.bodyBg}, 0 0 0px 4px ${theme.colors.formFocusOutline};\n transition-property: outline, outline-offset, box-shadow;\n transition-duration: 0.2s;\n transition-timing-function: cubic-bezier(0.19, 1, 0.22, 1);\n`;\n\nexport function getMouseFocusStyles(theme: GrafanaTheme2): CSSObject {\n return {\n outline: 'none',\n boxShadow: `none`,\n };\n}\n\nexport function getFocusStyles(theme: GrafanaTheme2): CSSObject {\n return {\n outline: '2px dotted transparent',\n outlineOffset: '2px',\n boxShadow: `0 0 0 2px ${theme.colors.background.canvas}, 0 0 0px 4px ${theme.colors.primary.main}`,\n transitionTimingFunction: `cubic-bezier(0.19, 1, 0.22, 1)`,\n transitionDuration: '0.2s',\n transitionProperty: 'outline, outline-offset, box-shadow',\n };\n}\n\n// max-width is set up based on .grafana-tooltip class that's used in dashboard\nexport const getTooltipContainerStyles = (theme: GrafanaTheme2) => `\n overflow: hidden;\n background: ${theme.colors.background.secondary};\n box-shadow: ${theme.shadows.z2};\n max-width: 800px;\n padding: ${theme.spacing(1)};\n border-radius: ${theme.shape.borderRadius()};\n z-index: ${theme.zIndex.tooltip};\n`;\n","import memoizeOne from 'memoize-one';\n\n/**\n * @public\n * @deprecated use useStyles hook\n * Creates memoized version of styles creator\n * @param stylesCreator function accepting dependencies based on which styles are created\n */\nexport function stylesFactory<ResultFn extends (this: any, ...newArgs: any[]) => ReturnType<ResultFn>>(\n stylesCreator: ResultFn\n) {\n return memoizeOne(stylesCreator);\n}\n","import { Value, Editor as CoreEditor } from 'slate';\n\nimport { SearchFunctionType } from '../utils';\n\n/**\n * @internal\n */\nexport type SearchFunction = (items: CompletionItem[], prefix: string) => CompletionItem[];\n\nexport interface CompletionItemGroup {\n /**\n * Label that will be displayed for all entries of this group.\n */\n label: string;\n\n /**\n * List of suggestions of this group.\n */\n items: CompletionItem[];\n\n /**\n * If true, match only by prefix (and not mid-word).\n * @deprecated use searchFunctionType instead\n */\n prefixMatch?: boolean;\n\n /**\n * Function type used to create auto-complete list\n * @alpha\n */\n searchFunctionType?: SearchFunctionType;\n\n /**\n * If true, do not filter items in this group based on the search.\n */\n skipFilter?: boolean;\n\n /**\n * If true, do not sort items.\n */\n skipSort?: boolean;\n}\n\nexport enum CompletionItemKind {\n GroupTitle = 'GroupTitle',\n}\n\n/**\n * @internal\n */\nexport type HighlightPart = {\n start: number;\n end: number;\n};\n\nexport interface CompletionItem {\n /**\n * The label of this completion item. By default\n * this is also the text that is inserted when selecting\n * this completion.\n */\n label: string;\n\n /**\n * The kind of this completion item. An icon is chosen\n * by the editor based on the kind.\n */\n kind?: CompletionItemKind | string;\n\n /**\n * A human-readable string with additional information\n * about this item, like type or symbol information.\n */\n detail?: string;\n\n /**\n * A human-readable string, can be Markdown, that represents a doc-comment.\n */\n documentation?: string;\n\n /**\n * A string that should be used when comparing this item\n * with other items. When `falsy` the `label` is used.\n * @deprecated use sortValue instead\n */\n sortText?: string;\n\n /**\n * A string or number that should be used when comparing this\n * item with other items. When `undefined` then `label` is used.\n * @alpha\n */\n sortValue?: string | number;\n\n /**\n * Parts of the label to be highlighted\n * @internal\n */\n highlightParts?: HighlightPart[];\n\n /**\n * A string that should be used when filtering a set of\n * completion items. When `falsy` the `label` is used.\n */\n filterText?: string;\n\n /**\n * A string or snippet that should be inserted in a document when selecting\n * this completion. When `falsy` the `label` is used.\n */\n insertText?: string;\n\n /**\n * Delete number of characters before the caret position,\n * by default the letters from the beginning of the word.\n */\n deleteBackwards?: number;\n\n /**\n * Number of steps to move after the insertion, can be negative.\n */\n move?: number;\n}\n\nexport interface TypeaheadOutput {\n context?: string;\n suggestions: CompletionItemGroup[];\n}\n\nexport interface TypeaheadInput {\n text: string;\n prefix: string;\n wrapperClasses: string[];\n labelKey?: string;\n value?: Value;\n editor?: CoreEditor;\n}\n\nexport interface SuggestionsState {\n groupedItems: CompletionItemGroup[];\n typeaheadPrefix: string;\n typeaheadContext: string;\n typeaheadText: string;\n}\n","import { Field, FieldType } from '@grafana/data';\n\nimport { ComponentSize } from './size';\n\nexport type IconType = 'mono' | 'default' | 'solid';\nexport type IconSize = ComponentSize | 'xl' | 'xxl' | 'xxxl';\n\nexport const getAvailableIcons = () =>\n [\n 'anchor',\n 'angle-double-down',\n 'angle-double-right',\n 'angle-double-up',\n 'angle-down',\n 'angle-left',\n 'angle-right',\n 'angle-up',\n 'apps',\n 'arrow',\n 'arrow-down',\n 'arrow-from-right',\n 'arrow-left',\n 'arrow-random',\n 'arrow-right',\n 'arrow-up',\n 'arrows-h',\n 'arrows-v',\n 'backward',\n 'bars',\n 'bell',\n 'bell-slash',\n 'bolt',\n 'book',\n 'bookmark',\n 'book-open',\n 'brackets-curly',\n 'building',\n 'bug',\n 'building',\n 'calculator-alt',\n 'calendar-alt',\n 'camera',\n 'capture',\n 'channel-add',\n 'chart-line',\n 'check',\n 'check-circle',\n 'circle',\n 'clipboard-alt',\n 'clock-nine',\n 'cloud',\n 'cloud-download',\n 'cloud-upload',\n 'code-branch',\n 'cog',\n 'columns',\n 'comment-alt',\n 'comment-alt-message',\n 'comment-alt-share',\n 'comments-alt',\n 'compass',\n 'copy',\n 'credit-card',\n 'cube',\n 'dashboard',\n 'database',\n 'document-info',\n 'download-alt',\n 'draggabledots',\n 'edit',\n 'ellipsis-v',\n 'envelope',\n 'exchange-alt',\n 'exclamation-triangle',\n 'exclamation-circle',\n 'external-link-alt',\n 'eye',\n 'eye-slash',\n 'ellipsis-h',\n 'fa fa-spinner',\n 'favorite',\n 'file-alt',\n 'file-blank',\n 'file-copy-alt',\n 'filter',\n 'folder',\n 'font',\n 'fire',\n 'folder-open',\n 'folder-plus',\n 'folder-upload',\n 'forward',\n 'gf-bar-alignment-after',\n 'gf-bar-alignment-before',\n 'gf-bar-alignment-center',\n 'gf-grid',\n 'gf-interpolation-linear',\n 'gf-interpolation-smooth',\n 'gf-interpolation-step-after',\n 'gf-interpolation-step-before',\n 'gf-landscape',\n 'gf-layout-simple',\n 'gf-logs',\n 'gf-portrait',\n 'grafana',\n 'graph-bar',\n 'heart',\n 'heart-break',\n 'history',\n 'home',\n 'home-alt',\n 'horizontal-align-center',\n 'horizontal-align-left',\n 'horizontal-align-right',\n 'hourglass',\n 'import',\n 'info',\n 'info-circle',\n 'key-skeleton-alt',\n 'keyboard',\n 'layer-group',\n 'library-panel',\n 'line-alt',\n 'link',\n 'list-ui-alt',\n 'list-ul',\n 'lock',\n 'map-marker',\n 'message',\n 'minus',\n 'minus-circle',\n 'mobile-android',\n 'monitor',\n 'palette',\n 'panel-add',\n 'pause',\n 'pen',\n 'percentage',\n 'play',\n 'plug',\n 'plus',\n 'plus-circle',\n 'plus-square',\n 'power',\n 'presentation-play',\n 'process',\n 'question-circle',\n 'record-audio',\n 'repeat',\n 'rocket',\n 'save',\n 'search',\n 'search-minus',\n 'search-plus',\n 'share-alt',\n 'shield',\n 'shield-exclamation',\n 'signal',\n 'signin',\n 'signout',\n 'sitemap',\n 'slack',\n 'sliders-v-alt',\n 'sort-amount-down',\n 'sort-amount-up',\n 'square-shape',\n 'star',\n 'step-backward',\n 'stopwatch-slash',\n 'sync',\n 'table',\n 'tag-alt',\n 'text-fields',\n 'times',\n 'toggle-on',\n 'trash-alt',\n 'unlock',\n 'upload',\n 'user',\n 'users-alt',\n 'vertical-align-bottom',\n 'vertical-align-center',\n 'vertical-align-top',\n 'wrap-text',\n 'rss',\n 'x',\n ] as const;\n\ntype BrandIconNames = 'google' | 'microsoft' | 'github' | 'gitlab' | 'okta';\n\nexport type IconName = ReturnType<typeof getAvailableIcons>[number] | BrandIconNames;\n\n/** Get the icon for a given field type */\nexport function getFieldTypeIcon(field?: Field): IconName {\n if (field) {\n switch (field.type) {\n case FieldType.time:\n return 'clock-nine';\n case FieldType.string:\n return 'font';\n case FieldType.number:\n return 'calculator-alt';\n case FieldType.boolean:\n return 'toggle-on';\n case FieldType.trace:\n return 'info-circle';\n case FieldType.geo:\n return 'map-marker';\n case FieldType.other:\n return 'brackets-curly';\n }\n }\n return 'question-circle';\n}\n","export const closePopover = (event: React.KeyboardEvent, hidePopper: () => void) => {\n if (event.key === 'Tab' || event.altKey || event.ctrlKey || event.metaKey) {\n return;\n }\n\n event.stopPropagation();\n\n if (event.key === 'Escape') {\n hidePopper();\n }\n\n return;\n};\n","import { LinkModel } from '@grafana/data';\n\nimport { MenuItemProps } from '../components/Menu/MenuItem';\n\n/**\n * Delays creating links until we need to open the ContextMenu\n */\nexport const linkModelToContextMenuItems: (links: () => LinkModel[]) => MenuItemProps[] = (links) => {\n return links().map((link) => {\n return {\n label: link.title,\n ariaLabel: link.title,\n // TODO: rename to href\n url: link.href,\n target: link.target,\n icon: `${link.target === '_blank' ? 'external-link-alt' : 'link'}`,\n onClick: link.onClick,\n };\n });\n};\n","import { last } from 'lodash';\n\nimport { HighlightPart } from '../types';\n\ntype FuzzyMatch = {\n /**\n * Total number of unmatched letters between matched letters\n */\n distance: number;\n ranges: HighlightPart[];\n found: boolean;\n};\n\n/**\n * Attempts to do a partial input search, e.g. allowing to search for a text (needle)\n * in another text (stack) by skipping some letters in-between. All letters from\n * the needle must exist in the stack in the same order to find a match.\n *\n * The search is case sensitive. Convert stack and needle to lower case\n * to make it case insensitive.\n *\n * @param stack - main text to be searched\n * @param needle - partial text to find in the stack\n *\n * @internal\n */\nexport function fuzzyMatch(stack: string, needle: string): FuzzyMatch {\n let distance = 0,\n searchIndex = stack.indexOf(needle);\n // Remove whitespace from needle as a temporary solution to treat separate string\n // queries as 'AND'\n needle = needle.replace(/\\s/g, '');\n\n const ranges: HighlightPart[] = [];\n\n if (searchIndex !== -1) {\n return {\n distance: 0,\n found: true,\n ranges: [{ start: searchIndex, end: searchIndex + needle.length - 1 }],\n };\n }\n\n for (const letter of needle) {\n const letterIndex = stack.indexOf(letter, searchIndex);\n\n if (letterIndex === -1) {\n return { distance: Infinity, ranges: [], found: false };\n }\n // do not cumulate the distance if it's the first letter\n if (searchIndex !== -1) {\n distance += letterIndex - searchIndex;\n }\n searchIndex = letterIndex + 1;\n\n if (ranges.length === 0) {\n ranges.push({ start: letterIndex, end: letterIndex });\n } else {\n const lastRange = last(ranges)!;\n if (letterIndex === lastRange.end + 1) {\n lastRange.end++;\n } else {\n ranges.push({ start: letterIndex, end: letterIndex });\n }\n }\n }\n\n return {\n distance: distance,\n ranges,\n found: true,\n };\n}\n","// Node.closest() polyfill\nif (typeof window !== 'undefined' && 'Element' in window && !Element.prototype.closest) {\n Element.prototype.closest = function (this: any, s: string) {\n const matches = (this.document || this.ownerDocument).querySelectorAll(s);\n let el = this;\n let i;\n // eslint-disable-next-line\n do {\n i = matches.length;\n // eslint-disable-next-line\n while (--i >= 0 && matches.item(i) !== el) {}\n el = el.parentElement;\n } while (i < 0 && el);\n return el;\n };\n}\n\nexport function getPreviousCousin(node: any, selector: string) {\n let sibling = node.parentElement.previousSibling;\n let el;\n while (sibling) {\n el = sibling.querySelector(selector);\n if (el) {\n return el;\n }\n sibling = sibling.previousSibling;\n }\n return undefined;\n}\n\nexport function getNextCharacter(global?: any) {\n const selection = (global || window).getSelection();\n if (!selection || !selection.anchorNode) {\n return null;\n }\n\n const range = selection.getRangeAt(0);\n const text = selection.anchorNode.textContent;\n const offset = range.startOffset;\n return text!.slice(offset, offset + 1);\n}\n","import { map, sortBy, flattenDeep, chunk, zip } from 'lodash';\nimport tinycolor from 'tinycolor2';\n\nconst PALETTE_ROWS = 4;\n\n/**\n * @alpha\n */\nexport const DEFAULT_ANNOTATION_COLOR = 'rgba(0, 211, 255, 1)';\n\n/**\n * @alpha\n */\nexport const OK_COLOR = 'rgba(11, 237, 50, 1)';\n\n/**\n * @alpha\n */\nexport const ALERTING_COLOR = 'rgba(237, 46, 24, 1)';\n\n/**\n * @alpha\n */\nexport const NO_DATA_COLOR = 'rgba(150, 150, 150, 1)';\n\n/**\n * @alpha\n */\nexport const PENDING_COLOR = 'rgba(247, 149, 32, 1)';\n\n/**\n * @alpha\n */\nexport const REGION_FILL_ALPHA = 0.09;\nexport const colors = [\n '#7EB26D', // 0: pale green\n '#EAB839', // 1: mustard\n '#6ED0E0', // 2: light blue\n '#EF843C', // 3: orange\n '#E24D42', // 4: red\n '#1F78C1', // 5: ocean\n '#BA43A9', // 6: purple\n '#705DA0', // 7: violet\n '#508642', // 8: dark green\n '#CCA300', // 9: dark sand\n '#447EBC',\n '#C15C17',\n '#890F02',\n '#0A437C',\n '#6D1F62',\n '#584477',\n '#B7DBAB',\n '#F4D598',\n '#70DBED',\n '#F9BA8F',\n '#F29191',\n '#82B5D8',\n '#E5A8E2',\n '#AEA2E0',\n '#629E51',\n '#E5AC0E',\n '#64B0C8',\n '#E0752D',\n '#BF1B00',\n '#0A50A1',\n '#962D82',\n '#614D93',\n '#9AC48A',\n '#F2C96D',\n '#65C5DB',\n '#F9934E',\n '#EA6460',\n '#5195CE',\n '#D683CE',\n '#806EB7',\n '#3F6833',\n '#967302',\n '#2F575E',\n '#99440A',\n '#58140C',\n '#052B51',\n '#511749',\n '#3F2B5B',\n '#E0F9D7',\n '#FCEACA',\n '#CFFAFF',\n '#F9E2D2',\n '#FCE2DE',\n '#BADFF4',\n '#F9D9F9',\n '#DEDAF7',\n];\n\nfunction sortColorsByHue(hexColors: string[]) {\n const hslColors = map(hexColors, hexToHsl);\n\n const sortedHSLColors = sortBy(hslColors, ['h']);\n const chunkedHSLColors = chunk(sortedHSLColors, PALETTE_ROWS);\n const sortedChunkedHSLColors = map(chunkedHSLColors, (chunk) => {\n return sortBy(chunk, 'l');\n });\n const flattenedZippedSortedChunkedHSLColors = flattenDeep(zip(...sortedChunkedHSLColors));\n\n return map(flattenedZippedSortedChunkedHSLColors, hslToHex);\n}\n\nfunction hexToHsl(color: string) {\n return tinycolor(color).toHsl();\n}\n\nfunction hslToHex(color: any) {\n return tinycolor(color).toHexString();\n}\n\nexport function getTextColorForBackground(color: string) {\n const b = tinycolor(color).getBrightness();\n return b > 180 ? 'rgb(32, 34, 38)' : 'rgb(247, 248, 250)';\n}\n\nexport let sortedColors = sortColorsByHue(colors);\n","import { ValidationRule, ValidationEvents } from '../types/input';\n\nexport enum EventsWithValidation {\n onBlur = 'onBlur',\n onFocus = 'onFocus',\n onChange = 'onChange',\n}\n\nexport const validate = (value: string, validationRules: ValidationRule[]) => {\n const errors = validationRules.reduce((acc, currRule) => {\n if (!currRule.rule(value)) {\n return acc.concat(currRule.errorMessage);\n }\n return acc;\n }, [] as string[]);\n return errors.length > 0 ? errors : null;\n};\n\nexport const hasValidationEvent = (event: EventsWithValidation, validationEvents: ValidationEvents | undefined) => {\n return validationEvents && validationEvents[event];\n};\n\nexport const regexValidation = (pattern: string | RegExp, errorMessage?: string): ValidationRule => {\n return {\n rule: (valueToValidate: string) => {\n return !!valueToValidate.match(pattern);\n },\n errorMessage: errorMessage || 'Value is not valid',\n };\n};\n","const TAG_COLORS = [\n '#D32D20',\n '#1E72B8',\n '#B240A2',\n '#705DA0',\n '#466803',\n '#497A3C',\n '#3D71AA',\n '#B15415',\n '#890F02',\n '#6E6E6E',\n '#0A437C',\n '#6D1F62',\n '#584477',\n '#4C7A3F',\n '#2F4F4F',\n '#BF1B00',\n '#7662B1',\n '#8A2EB8',\n '#517A00',\n '#000000',\n '#3F6833',\n '#2F575E',\n '#99440A',\n '#AE561A',\n '#0E4AB4',\n '#58140C',\n '#052B51',\n '#511749',\n '#3F2B5B',\n];\n\nconst TAG_BORDER_COLORS = [\n '#FF7368',\n '#459EE7',\n '#E069CF',\n '#9683C6',\n '#6C8E29',\n '#76AC68',\n '#6AA4E2',\n '#E7823D',\n '#AF3528',\n '#9B9B9B',\n '#3069A2',\n '#934588',\n '#7E6A9D',\n '#88C477',\n '#557575',\n '#E54126',\n '#A694DD',\n '#B054DE',\n '#8FC426',\n '#262626',\n '#658E59',\n '#557D84',\n '#BF6A30',\n '#FF9B53',\n '#3470DA',\n '#7E3A32',\n '#2B5177',\n '#773D6F',\n '#655181',\n];\n\n/**\n * Returns tag badge background and border colors based on hashed tag name.\n * @param name tag name\n */\nexport function getTagColorsFromName(name = ''): { color: string; borderColor: string } {\n const hash = djb2(name.toLowerCase());\n const index = Math.abs(hash % TAG_COLORS.length);\n return getTagColor(index);\n}\n\nexport function getTagColor(index: number): { color: string; borderColor: string } {\n return { color: TAG_COLORS[index], borderColor: TAG_BORDER_COLORS[index] };\n}\n\nfunction djb2(str: string) {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash << 5) + hash + str.charCodeAt(i); /* hash * 33 + c */\n }\n return hash;\n}\n\nexport default {\n getTagColorsFromName,\n};\n","// Slightly modified, but without dependancies:\n// https://raw.githubusercontent.com/malte-wessel/react-custom-scrollbars/master/src/utils/getScrollbarWidth.js\nlet scrollbarWidth: number | null = null;\n\nexport function getScrollbarWidth() {\n if (scrollbarWidth !== null) {\n return scrollbarWidth;\n }\n\n if (typeof document !== 'undefined') {\n const div = document.createElement('div');\n const newStyles = {\n width: '100px',\n height: '100px',\n position: 'absolute',\n top: '-9999px',\n overflow: 'scroll',\n MsOverflowStyle: 'scrollbar',\n };\n\n Object.keys(newStyles).map((style) => {\n // @ts-ignore\n div.style[style] = newStyles[style];\n });\n\n document.body.appendChild(div);\n scrollbarWidth = div.offsetWidth - div.clientWidth;\n document.body.removeChild(div);\n } else {\n scrollbarWidth = 0;\n }\n\n return scrollbarWidth || 0;\n}\n","import { Row } from 'react-table';\n\nimport { Field, LinkModel } from '@grafana/data';\n\n/**\n * @internal\n */\nexport const getCellLinks = (field: Field, row: Row<any>) => {\n let links: Array<LinkModel<any>> | undefined;\n if (field.getLinks) {\n links = field.getLinks({\n valueRowIndex: row.index,\n });\n }\n\n if (!links) {\n return;\n }\n\n for (let i = 0; i < links?.length; i++) {\n if (links[i].onClick) {\n const origOnClick = links[i].onClick;\n\n links[i].onClick = (event) => {\n // Allow opening in new tab\n if (!(event.ctrlKey || event.metaKey || event.shiftKey)) {\n event.preventDefault();\n origOnClick!(event, {\n field,\n rowIndex: row.index,\n });\n }\n };\n }\n }\n\n return links;\n};\n","import { useState } from 'react';\n\n/** @internal */\nexport function useForceUpdate() {\n const [_, setValue] = useState(0); // integer state\n return () => setValue((prevState) => prevState + 1); // update the state to force render\n}\n","import { Logger } from './logger';\n\n/**\n * Allows debug helpers attachement to the window object\n * @internal\n */\nexport function attachDebugger(key: string, thebugger?: any, logger?: Logger) {\n if (process.env.NODE_ENV === 'production') {\n return;\n }\n let completeDebugger = thebugger || {};\n\n if (logger !== undefined) {\n completeDebugger = { ...completeDebugger, enable: () => logger.enable(), disable: () => logger.disable() };\n }\n\n // @ts-ignore\n let debugGlobal = (typeof window !== 'undefined' && window['_debug']) ?? {};\n debugGlobal[key] = completeDebugger;\n if (typeof window !== 'undefined') {\n // @ts-ignore\n window['_debug'] = debugGlobal;\n }\n}\n","/**\n * @deprecated use it from @grafana/data. Kept here for backward compatibility.\n */\nexport enum NodeGraphDataFrameFieldNames {\n id = 'id',\n title = 'title',\n subTitle = 'subTitle',\n mainStat = 'mainStat',\n secondaryStat = 'secondaryStat',\n source = 'source',\n target = 'target',\n detail = 'detail__',\n arc = 'arc__',\n color = 'color',\n}\n","import { throttle } from 'lodash';\n\n/**\n * @internal\n * */\nconst throttledLog = throttle((...t: any[]) => {\n console.log(...t);\n}, 500);\n\n/**\n * @internal\n */\nexport interface Logger {\n logger: (...t: any[]) => void;\n enable: () => void;\n disable: () => void;\n isEnabled: () => boolean;\n}\n\n/** @internal */\nexport const createLogger = (name: string): Logger => {\n let LOGGIN_ENABLED = false;\n return {\n logger: (id: string, throttle = false, ...t: any[]) => {\n if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test' || !LOGGIN_ENABLED) {\n return;\n }\n const fn = throttle ? throttledLog : console.log;\n fn(`[${name}: ${id}]: `, ...t);\n },\n enable: () => (LOGGIN_ENABLED = true),\n disable: () => (LOGGIN_ENABLED = false),\n isEnabled: () => LOGGIN_ENABLED,\n };\n};\n","let _context: CanvasRenderingContext2D;\nconst cache = new Map<string, TextMetrics>();\nconst cacheLimit = 500;\nlet ctxFontStyle = '';\n\n/**\n * @internal\n */\nexport function getCanvasContext() {\n if (!_context) {\n _context = document.createElement('canvas').getContext('2d')!;\n }\n return _context;\n}\n\n/**\n * @beta\n */\nexport function measureText(text: string, fontSize: number): TextMetrics {\n const fontStyle = `${fontSize}px 'Roboto'`;\n const cacheKey = text + fontStyle;\n const fromCache = cache.get(cacheKey);\n\n if (fromCache) {\n return fromCache;\n }\n\n const context = getCanvasContext();\n\n if (ctxFontStyle !== fontStyle) {\n context.font = ctxFontStyle = fontStyle;\n }\n\n const metrics = context.measureText(text);\n\n if (cache.size === cacheLimit) {\n cache.clear();\n }\n\n cache.set(cacheKey, metrics);\n\n return metrics;\n}\n\n/**\n * @beta\n */\nexport function calculateFontSize(text: string, width: number, height: number, lineHeight: number, maxSize?: number) {\n // calculate width in 14px\n const textSize = measureText(text, 14);\n // how much bigger than 14px can we make it while staying within our width constraints\n const fontSizeBasedOnWidth = (width / (textSize.width + 2)) * 14;\n const fontSizeBasedOnHeight = height / lineHeight;\n\n // final fontSize\n const optimalSize = Math.min(fontSizeBasedOnHeight, fontSizeBasedOnWidth);\n return Math.min(optimalSize, maxSize ?? optimalSize);\n}\n","import React, { ReactElement } from 'react';\n\n/** Returns the ID value of the first, and only, child element */\nexport function getChildId(children: ReactElement): string | undefined {\n let inputId: unknown;\n\n // Get the first, and only, child to retrieve form input's id\n const child = React.Children.only(children);\n\n // Retrieve input's id to apply on the label for correct click interaction\n // For some components (like Select), we want to get the ID from a different prop\n if ('id' in child?.props) {\n inputId = child.props.id;\n } else if ('inputId' in child.props) {\n inputId = child?.props.inputId;\n }\n\n return typeof inputId === 'string' ? inputId : undefined;\n}\n\n/**\n * Given react node or function returns element accordingly\n *\n * @param itemToRender\n * @param props props to be passed to the function if item provided as such\n */\nexport function renderOrCallToRender<TProps = any>(\n itemToRender: ((props?: TProps) => React.ReactNode) | React.ReactNode,\n props?: TProps\n): React.ReactNode {\n if (React.isValidElement(itemToRender) || typeof itemToRender === 'string' || typeof itemToRender === 'number') {\n return itemToRender;\n }\n\n if (typeof itemToRender === 'function') {\n return itemToRender(props);\n }\n\n throw new Error(`${itemToRender} is not a React element nor a function that returns React element`);\n}\n","import { CompletionItem, SearchFunction } from '../types';\n\nimport { fuzzyMatch } from './fuzzy';\n\n/**\n * List of auto-complete search function used by SuggestionsPlugin.handleTypeahead()\n * @alpha\n */\nexport enum SearchFunctionType {\n Word = 'Word',\n Prefix = 'Prefix',\n Fuzzy = 'Fuzzy',\n}\n\n/**\n * Exact-word matching for auto-complete suggestions.\n * - Returns items containing the searched text.\n * @internal\n */\nconst wordSearch: SearchFunction = (items: CompletionItem[], text: string): CompletionItem[] => {\n return items.filter((c) => (c.filterText || c.label).includes(text));\n};\n\n/**\n * Prefix-based search for auto-complete suggestions.\n * - Returns items starting with the searched text.\n * @internal\n */\nconst prefixSearch: SearchFunction = (items: CompletionItem[], text: string): CompletionItem[] => {\n return items.filter((c) => (c.filterText || c.label).startsWith(text));\n};\n\n/**\n * Fuzzy search for auto-complete suggestions.\n * - Returns items containing all letters from the search text occurring in the same order.\n * - Stores highlight parts with parts of the text phrase found by fuzzy search\n * @internal\n */\nconst fuzzySearch: SearchFunction = (items: CompletionItem[], text: string): CompletionItem[] => {\n text = text.toLowerCase();\n return items.filter((item) => {\n const { distance, ranges, found } = fuzzyMatch(item.label.toLowerCase(), text);\n if (!found) {\n return false;\n }\n item.sortValue = distance;\n item.highlightParts = ranges;\n return true;\n });\n};\n\n/**\n * @internal\n */\nexport const SearchFunctionMap = {\n [SearchFunctionType.Word]: wordSearch,\n [SearchFunctionType.Prefix]: prefixSearch,\n [SearchFunctionType.Fuzzy]: fuzzySearch,\n};\n","import { Block, Document, Text, Value, SchemaProperties } from 'slate';\n\nexport const SCHEMA: SchemaProperties = {\n document: {\n nodes: [\n {\n match: [{ type: 'paragraph' }, { type: 'code_block' }, { type: 'code_line' }],\n },\n ],\n },\n inlines: {},\n};\n\nexport const makeFragment = (text: string, syntax?: string): Document => {\n const lines = text.split('\\n').map((line) =>\n Block.create({\n type: 'code_line',\n nodes: [Text.create(line)],\n })\n );\n\n const block = Block.create({\n data: {\n syntax,\n },\n type: 'code_block',\n nodes: lines,\n });\n\n return Document.create({\n nodes: [block],\n });\n};\n\nexport const makeValue = (text: string, syntax?: string): Value => {\n const fragment = makeFragment(text, syntax);\n\n return Value.create({\n document: fragment,\n });\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\n/**\n * Tries to get a dark variant color. Either by simply inverting the luminosity and darkening or lightening the color\n * a bit, or if base is provided, tries 2 variants of lighter and darker colors and checks which is more readable with\n * the base.\n * @param theme\n * @param hex\n * @param base\n */\nexport function autoColor(theme: GrafanaTheme2, hex: string, base?: string) {\n if (theme.isLight) {\n return hex;\n } else {\n if (base) {\n const color = tinycolor(hex);\n return tinycolor\n .mostReadable(\n base,\n [\n color.clone().lighten(25),\n color.clone().lighten(10),\n color,\n color.clone().darken(10),\n color.clone().darken(25),\n ],\n {\n includeFallbackColors: false,\n }\n )\n .toHex8String();\n }\n const color = tinycolor(hex).toHsl();\n color.l = 1 - color.l;\n const newColor = tinycolor(color);\n return newColor.isLight() ? newColor.darken(5).toHex8String() : newColor.lighten(5).toHex8String();\n }\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport { IconButton, Input } from '@grafana/ui';\n\nimport { TNil } from '../types/index';\n\ntype Props = {\n allowClear?: boolean;\n inputProps: Record<string, any>;\n location: Location;\n match: any;\n trackFindFunction?: (str: string | TNil) => void;\n value: string | undefined;\n onChange: (value: string) => void;\n};\n\nexport default class UiFindInput extends React.PureComponent<Props> {\n static defaultProps: Partial<Props> = {\n inputProps: {},\n trackFindFunction: undefined,\n value: undefined,\n };\n\n clearUiFind = () => {\n this.props.onChange('');\n };\n\n render() {\n const { allowClear, inputProps, value } = this.props;\n\n const suffix = (\n <>\n {inputProps.suffix}\n {allowClear && value && value.length && <IconButton name=\"times\" onClick={this.clearUiFind} />}\n </>\n );\n\n return (\n <Input\n placeholder=\"Find...\"\n {...inputProps}\n onChange={(e) => this.props.onChange(e.currentTarget.value)}\n suffix={suffix}\n value={value}\n />\n );\n }\n}\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React, { memo, Dispatch, SetStateAction } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, useStyles2 } from '@grafana/ui';\n\nimport UiFindInput from '../common/UiFindInput';\nimport { ubFlexAuto, ubJustifyEnd } from '../uberUtilityStyles';\n\n// eslint-disable-next-line no-duplicate-imports\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n TracePageSearchBar: css`\n label: TracePageSearchBar;\n float: right;\n position: sticky;\n top: 8px;\n right: 0;\n z-index: ${theme.zIndex.navbarFixed};\n background: ${theme.colors.background.primary};\n margin-top: 8px;\n margin-bottom: -48px;\n padding: 8px;\n margin-right: 2px;\n border-radius: 4px;\n box-shadow: ${theme.shadows.z2};\n `,\n TracePageSearchBarBar: css`\n label: TracePageSearchBarBar;\n max-width: 20rem;\n transition: max-width 0.5s;\n &:focus-within {\n max-width: 100%;\n }\n `,\n TracePageSearchBarSuffix: css`\n label: TracePageSearchBarSuffix;\n opacity: 0.6;\n `,\n TracePageSearchBarBtn: css`\n label: TracePageSearchBarBtn;\n transition: 0.2s;\n margin-left: 8px;\n `,\n TracePageSearchBarBtnDisabled: css`\n label: TracePageSearchBarBtnDisabled;\n opacity: 0.5;\n `,\n TracePageSearchBarLocateBtn: css`\n label: TracePageSearchBarLocateBtn;\n padding: 1px 8px 4px;\n `,\n };\n};\n\ntype TracePageSearchBarProps = {\n navigable: boolean;\n searchValue: string;\n setSearch: (value: string) => void;\n searchBarSuffix: string;\n spanFindMatches: Set<string> | undefined;\n focusedSpanIdForSearch: string;\n setSearchBarSuffix: Dispatch<SetStateAction<string>>;\n setFocusedSpanIdForSearch: Dispatch<SetStateAction<string>>;\n};\n\nexport default memo(function TracePageSearchBar(props: TracePageSearchBarProps) {\n const {\n navigable,\n setSearch,\n searchValue,\n searchBarSuffix,\n spanFindMatches,\n focusedSpanIdForSearch,\n setSearchBarSuffix,\n setFocusedSpanIdForSearch,\n } = props;\n const styles = useStyles2(getStyles);\n\n const suffix = searchValue ? (\n <span className={styles.TracePageSearchBarSuffix} aria-label=\"Search bar suffix\">\n {searchBarSuffix}\n </span>\n ) : null;\n\n const btnClass = cx(styles.TracePageSearchBarBtn, { [styles.TracePageSearchBarBtnDisabled]: !searchValue });\n const uiFindInputInputProps = {\n className: cx(styles.TracePageSearchBarBar, ubFlexAuto),\n name: 'search',\n suffix,\n };\n\n const setTraceSearch = (value: string) => {\n setFocusedSpanIdForSearch('');\n setSearchBarSuffix('');\n setSearch(value);\n };\n\n const nextResult = () => {\n const spanMatches = Array.from(spanFindMatches!);\n const prevMatchedIndex = spanMatches.indexOf(focusedSpanIdForSearch)\n ? spanMatches.indexOf(focusedSpanIdForSearch)\n : 0;\n\n // new query || at end, go to start\n if (prevMatchedIndex === -1 || prevMatchedIndex === spanMatches.length - 1) {\n setFocusedSpanIdForSearch(spanMatches[0]);\n setSearchBarSuffix(getSearchBarSuffix(1));\n return;\n }\n\n // get next\n setFocusedSpanIdForSearch(spanMatches[prevMatchedIndex + 1]);\n setSearchBarSuffix(getSearchBarSuffix(prevMatchedIndex + 2));\n };\n\n const prevResult = () => {\n const spanMatches = Array.from(spanFindMatches!);\n const prevMatchedIndex = spanMatches.indexOf(focusedSpanIdForSearch)\n ? spanMatches.indexOf(focusedSpanIdForSearch)\n : 0;\n\n // new query || at start, go to end\n if (prevMatchedIndex === -1 || prevMatchedIndex === 0) {\n setFocusedSpanIdForSearch(spanMatches[spanMatches.length - 1]);\n setSearchBarSuffix(getSearchBarSuffix(spanMatches.length));\n return;\n }\n\n // get prev\n setFocusedSpanIdForSearch(spanMatches[prevMatchedIndex - 1]);\n setSearchBarSuffix(getSearchBarSuffix(prevMatchedIndex));\n };\n\n const getSearchBarSuffix = (index: number): string => {\n if (spanFindMatches?.size && spanFindMatches?.size > 0) {\n return index + ' of ' + spanFindMatches?.size;\n }\n return '';\n };\n\n return (\n <div className={styles.TracePageSearchBar}>\n <span className={ubJustifyEnd} style={{ display: 'flex' }}>\n <UiFindInput\n onChange={setTraceSearch}\n value={searchValue}\n inputProps={uiFindInputInputProps}\n allowClear={true}\n />\n <>\n {navigable && (\n <>\n <Button\n className={btnClass}\n variant=\"secondary\"\n disabled={!searchValue}\n type=\"button\"\n icon=\"arrow-down\"\n aria-label=\"Next results button\"\n onClick={nextResult}\n />\n <Button\n className={btnClass}\n variant=\"secondary\"\n disabled={!searchValue}\n type=\"button\"\n icon=\"arrow-up\"\n aria-label=\"Prev results button\"\n onClick={prevResult}\n />\n </>\n )}\n </>\n </span>\n </div>\n );\n});\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { TNil } from '../types';\n\nimport { formatDuration } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n Ticks: css`\n label: Ticks;\n pointer-events: none;\n `,\n TicksTick: css`\n label: TicksTick;\n position: absolute;\n height: 100%;\n width: 1px;\n background: ${autoColor(theme, '#d8d8d8')};\n &:last-child {\n width: 0;\n }\n `,\n TicksTickLabel: css`\n label: TicksTickLabel;\n left: 0.25rem;\n position: absolute;\n `,\n TicksTickLabelEndAnchor: css`\n label: TicksTickLabelEndAnchor;\n left: initial;\n right: 0.25rem;\n `,\n };\n};\n\ntype TicksProps = {\n endTime?: number | TNil;\n numTicks: number;\n showLabels?: boolean | TNil;\n startTime?: number | TNil;\n};\n\nexport default function Ticks(props: TicksProps) {\n const { endTime, numTicks, showLabels, startTime } = props;\n\n let labels: undefined | string[];\n if (showLabels) {\n labels = [];\n const viewingDuration = (endTime || 0) - (startTime || 0);\n for (let i = 0; i < numTicks; i++) {\n const durationAtTick = (startTime || 0) + (i / (numTicks - 1)) * viewingDuration;\n labels.push(formatDuration(durationAtTick));\n }\n }\n const styles = useStyles2(getStyles);\n const ticks: React.ReactNode[] = [];\n for (let i = 0; i < numTicks; i++) {\n const portion = i / (numTicks - 1);\n ticks.push(\n <div\n key={portion}\n className={styles.TicksTick}\n style={{\n left: `${portion * 100}%`,\n }}\n >\n {labels && (\n <span className={cx(styles.TicksTickLabel, { [styles.TicksTickLabelEndAnchor]: portion >= 1 })}>\n {labels[i]}\n </span>\n )}\n </div>\n );\n }\n return <div className={styles.Ticks}>{ticks}</div>;\n}\n\nTicks.defaultProps = {\n endTime: null,\n showLabels: null,\n startTime: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { ubRelative } from '../uberUtilityStyles';\n\nconst getStyles = () => {\n return {\n flexRow: css`\n display: flex;\n flex: 0 1 auto;\n flex-direction: row;\n `,\n };\n};\n\ntype TTimelineRowProps = {\n children: React.ReactNode;\n className?: string;\n};\n\ninterface TimelineRowCellProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n className?: string;\n width: number;\n style?: {};\n}\n\nexport default function TimelineRow(props: TTimelineRowProps) {\n const { children, className = '', ...rest } = props;\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles.flexRow, className)} {...rest}>\n {children}\n </div>\n );\n}\n\nTimelineRow.defaultProps = {\n className: '',\n};\n\nexport function TimelineRowCell(props: TimelineRowCellProps) {\n const { children, className = '', width, style, ...rest } = props;\n const widthPercent = `${width * 100}%`;\n const mergedStyle = { ...style, flexBasis: widthPercent, maxWidth: widthPercent };\n return (\n <div className={cx(ubRelative, className)} style={mergedStyle} {...(rest as any)}>\n {children}\n </div>\n );\n}\n\nTimelineRowCell.defaultProps = { className: '', style: {} };\n\nTimelineRow.Cell = TimelineRowCell;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ntype THeightGetter = (index: number) => number;\n\n/**\n * Keeps track of the height and y-position for anything sequenctial where\n * y-positions follow one-after-another and can be derived from the height of\n * the prior entries. The height is known from an accessor function parameter\n * to the methods that require new knowledge the heights.\n *\n * @export\n * @class Positions\n */\nexport default class Positions {\n /**\n * Indicates how far past the explicitly required height or y-values should\n * checked.\n */\n bufferLen: number;\n dataLen: number;\n heights: number[];\n /**\n * `lastI` keeps track of which values have already been visited. In many\n * scenarios, values do not need to be revisited. But, revisiting is required\n * when heights have changed, so `lastI` can be forced.\n */\n lastI: number;\n ys: number[];\n\n constructor(bufferLen: number) {\n this.ys = [];\n this.heights = [];\n this.bufferLen = bufferLen;\n this.dataLen = -1;\n this.lastI = -1;\n }\n\n /**\n * Used to make sure the length of y-values and heights is consistent with\n * the context; in particular `lastI` needs to remain valid.\n */\n profileData(dataLength: number) {\n if (dataLength !== this.dataLen) {\n this.dataLen = dataLength;\n this.ys.length = dataLength;\n this.heights.length = dataLength;\n if (this.lastI >= dataLength) {\n this.lastI = dataLength - 1;\n }\n }\n }\n\n /**\n * Calculate and save the heights and y-values, based on `heightGetter`, from\n * `lastI` until the`max` index; the starting point (`lastI`) can be forced\n * via the `forcedLastI` parameter.\n * @param {number=} forcedLastI\n */\n calcHeights(max: number, heightGetter: THeightGetter, forcedLastI?: number) {\n if (forcedLastI != null) {\n this.lastI = forcedLastI;\n }\n let _max = max + this.bufferLen;\n if (_max <= this.lastI) {\n return;\n }\n if (_max >= this.heights.length) {\n _max = this.heights.length - 1;\n }\n let i = this.lastI;\n if (this.lastI === -1) {\n i = 0;\n this.ys[0] = 0;\n }\n while (i <= _max) {\n // eslint-disable-next-line no-multi-assign\n const h = (this.heights[i] = heightGetter(i));\n this.ys[i + 1] = this.ys[i] + h;\n i++;\n }\n this.lastI = _max;\n }\n\n /**\n * Verify the height and y-values from `lastI` up to `yValue`.\n */\n calcYs(yValue: number, heightGetter: THeightGetter) {\n while ((this.ys[this.lastI] == null || yValue > this.ys[this.lastI]) && this.lastI < this.dataLen - 1) {\n this.calcHeights(this.lastI, heightGetter);\n }\n }\n\n /**\n * Get the latest height for index `_i`. If it's in new terretory\n * (_i > lastI), find the heights (and y-values) leading up to it. If it's in\n * known territory (_i <= lastI) and the height is different than what is\n * known, recalculate subsequent y values, but don't confirm the heights of\n * those items, just update based on the difference.\n */\n confirmHeight(_i: number, heightGetter: THeightGetter) {\n let i = _i;\n if (i > this.lastI) {\n this.calcHeights(i, heightGetter);\n return;\n }\n const h = heightGetter(i);\n if (h === this.heights[i]) {\n return;\n }\n const chg = h - this.heights[i];\n this.heights[i] = h;\n // shift the y positions by `chg` for all known y positions\n while (++i <= this.lastI) {\n this.ys[i] += chg;\n }\n if (this.ys[this.lastI + 1] != null) {\n this.ys[this.lastI + 1] += chg;\n }\n }\n\n /**\n * Given a target y-value (`yValue`), find the closest index (in the `.ys`\n * array) that is prior to the y-value; e.g. map from y-value to index in\n * `.ys`.\n */\n findFloorIndex(yValue: number, heightGetter: THeightGetter): number {\n this.calcYs(yValue, heightGetter);\n\n let imin = 0;\n let imax = this.lastI;\n\n if (this.ys.length < 2 || yValue < this.ys[1]) {\n return 0;\n }\n if (yValue > this.ys[imax]) {\n return imax;\n }\n let i;\n while (imin < imax) {\n // eslint-disable-next-line no-bitwise\n i = (imin + 0.5 * (imax - imin)) | 0;\n if (yValue > this.ys[i]) {\n if (yValue <= this.ys[i + 1]) {\n return i;\n }\n imin = i;\n } else if (yValue < this.ys[i]) {\n if (yValue >= this.ys[i - 1]) {\n return i - 1;\n }\n imax = i;\n } else {\n return i;\n }\n }\n throw new Error(`unable to find floor index for y=${yValue}`);\n }\n\n /**\n * Get the `y` and `height` for a given row.\n *\n * @returns {{ height: number, y: number }}\n */\n getRowPosition(index: number, heightGetter: THeightGetter) {\n this.confirmHeight(index, heightGetter);\n return {\n height: this.heights[index],\n y: this.ys[index],\n };\n }\n\n /**\n * Get the estimated height of the whole shebang by extrapolating based on\n * the average known height.\n */\n getEstimatedHeight(): number {\n const known = this.ys[this.lastI] + this.heights[this.lastI];\n if (this.lastI >= this.dataLen - 1) {\n // eslint-disable-next-line no-bitwise\n return known | 0;\n }\n // eslint-disable-next-line no-bitwise\n return ((known / (this.lastI + 1)) * this.heights.length) | 0;\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport { TNil } from '../../types';\n\nimport Positions from './Positions';\n\ntype TWrapperProps = {\n style: React.CSSProperties;\n ref: (elm: HTMLDivElement) => void;\n onScroll?: () => void;\n};\n\n/**\n * @typedef\n */\ntype TListViewProps = {\n /**\n * Number of elements in the list.\n */\n dataLength: number;\n /**\n * Convert item index (number) to the key (string). ListView uses both indexes\n * and keys to handle the addition of new rows.\n */\n getIndexFromKey: (key: string) => number;\n /**\n * Convert item key (string) to the index (number). ListView uses both indexes\n * and keys to handle the addition of new rows.\n */\n getKeyFromIndex: (index: number) => string;\n /**\n * Number of items to draw and add to the DOM, initially.\n */\n initialDraw?: number;\n /**\n * The parent provides fallback height measurements when there is not a\n * rendered element to measure.\n */\n itemHeightGetter: (index: number, key: string) => number;\n /**\n * Function that renders an item; rendered items are added directly to the\n * DOM, they are not wrapped in list item wrapper HTMLElement.\n */\n // itemRenderer(itemKey, style, i, attrs)\n itemRenderer: (\n itemKey: string,\n style: Record<string, string | number>,\n index: number,\n attributes: Record<string, string>\n ) => React.ReactNode;\n /**\n * `className` for the HTMLElement that holds the items.\n */\n itemsWrapperClassName?: string;\n /**\n * When adding new items to the DOM, this is the number of items to add above\n * and below the current view. E.g. if list is 100 items and is scrolled\n * halfway down (so items [46, 55] are in view), then when a new range of\n * items is rendered, it will render items `46 - viewBuffer` to\n * `55 + viewBuffer`.\n */\n viewBuffer: number;\n /**\n * The minimum number of items offscreen in either direction; e.g. at least\n * `viewBuffer` number of items must be off screen above and below the\n * current view, or more items will be rendered.\n */\n viewBufferMin: number;\n /**\n * When `true`, expect `_wrapperElm` to have `overflow: visible` and to,\n * essentially, be tall to the point the entire page will will end up\n * scrolling as a result of the ListView. Similar to react-virtualized\n * window scroller.\n *\n * - Ref: https://bvaughn.github.io/react-virtualized/#/components/WindowScroller\n * - Ref:https://github.com/bvaughn/react-virtualized/blob/497e2a1942529560681d65a9ef9f5e9c9c9a49ba/docs/WindowScroller.md\n */\n windowScroller?: boolean;\n /**\n * You need to pass in scrollElement when windowScroller is set to false.\n * This element is responsible for tracking scrolling for lazy loading.\n */\n scrollElement?: Element;\n};\n\nconst DEFAULT_INITIAL_DRAW = 100;\n\n/**\n * Virtualized list view component, for the most part, only renders the window\n * of items that are in-view with some buffer before and after. Listens for\n * scroll events and updates which items are rendered. See react-virtualized\n * for a suite of components with similar, but generalized, functionality.\n * https://github.com/bvaughn/react-virtualized\n *\n * Note: Presently, ListView cannot be a PureComponent. This is because ListView\n * is sensitive to the underlying state that drives the list items, but it\n * doesn't actually receive that state. So, a render may still be required even\n * if ListView's props are unchanged.\n *\n * @export\n * @class ListView\n */\nexport default class ListView extends React.Component<TListViewProps> {\n /**\n * Keeps track of the height and y-value of items, by item index, in the\n * ListView.\n */\n _yPositions: Positions;\n /**\n * Keep track of the known / measured heights of the rendered items; populated\n * with values through observation and keyed on the item key, not the item\n * index.\n */\n _knownHeights: Map<string, number>;\n /**\n * The start index of the items currently drawn.\n */\n _startIndexDrawn: number;\n /**\n * The end index of the items currently drawn.\n */\n _endIndexDrawn: number;\n /**\n * The start index of the items currently in view.\n */\n _startIndex: number;\n /**\n * The end index of the items currently in view.\n */\n _endIndex: number;\n /**\n * Height of the visual window, e.g. height of the scroller element.\n */\n _viewHeight: number;\n /**\n * `scrollTop` of the current scroll position.\n */\n _scrollTop: number;\n /**\n * Used to keep track of whether or not a re-calculation of what should be\n * drawn / viewable has been scheduled.\n */\n _isScrolledOrResized: boolean;\n /**\n * If `windowScroller` is true, this notes how far down the page the scroller\n * is located. (Note: repositioning and below-the-fold views are untested)\n */\n _htmlTopOffset: number;\n _windowScrollListenerAdded: boolean;\n _htmlElm: HTMLElement;\n /**\n * Element holding the scroller.\n */\n _wrapperElm: Element | TNil;\n /**\n * HTMLElement holding the rendered items.\n */\n _itemHolderElm: HTMLElement | TNil;\n\n static defaultProps = {\n initialDraw: DEFAULT_INITIAL_DRAW,\n itemsWrapperClassName: '',\n windowScroller: false,\n };\n\n constructor(props: TListViewProps) {\n super(props);\n\n this._yPositions = new Positions(200);\n // _knownHeights is (item-key -> observed height) of list items\n this._knownHeights = new Map();\n\n this._startIndexDrawn = 2 ** 20;\n this._endIndexDrawn = -(2 ** 20);\n this._startIndex = 0;\n this._endIndex = 0;\n this._viewHeight = -1;\n this._scrollTop = -1;\n this._isScrolledOrResized = false;\n\n this._htmlTopOffset = -1;\n this._windowScrollListenerAdded = false;\n // _htmlElm is only relevant if props.windowScroller is true\n this._htmlElm = document.documentElement as any;\n this._wrapperElm = undefined;\n this._itemHolderElm = undefined;\n }\n\n componentDidMount() {\n if (this.props.windowScroller) {\n if (this._wrapperElm) {\n const { top } = this._wrapperElm.getBoundingClientRect();\n this._htmlTopOffset = top + this._htmlElm.scrollTop;\n }\n window.addEventListener('scroll', this._onScroll);\n this._windowScrollListenerAdded = true;\n } else {\n // The wrapper element should be the one that handles the scrolling. Once we are not using scroll-canvas we can remove this.\n this._wrapperElm = this.props.scrollElement;\n this._wrapperElm?.addEventListener('scroll', this._onScroll);\n }\n }\n\n componentDidUpdate() {\n if (this._itemHolderElm) {\n this._scanItemHeights();\n }\n }\n\n componentWillUnmount() {\n if (this._windowScrollListenerAdded) {\n window.removeEventListener('scroll', this._onScroll);\n } else {\n this._wrapperElm?.removeEventListener('scroll', this._onScroll);\n }\n }\n\n getViewHeight = () => this._viewHeight;\n\n /**\n * Get the index of the item at the bottom of the current view.\n */\n getBottomVisibleIndex = (): number => {\n const bottomY = this._scrollTop + this._viewHeight;\n return this._yPositions.findFloorIndex(bottomY, this._getHeight);\n };\n\n /**\n * Get the index of the item at the top of the current view.\n */\n getTopVisibleIndex = (): number => this._yPositions.findFloorIndex(this._scrollTop, this._getHeight);\n\n getRowPosition = (index: number): { height: number; y: number } =>\n this._yPositions.getRowPosition(index, this._getHeight);\n\n scrollToIndex = (index: number) => {\n // calculate the position of the list view relative to the scroll parent\n const { scrollElement } = this.props;\n const scrollElementTop = scrollElement?.getBoundingClientRect().top || 0;\n const listViewTop = (scrollElement?.scrollTop || 0) + (this._itemHolderElm?.getBoundingClientRect().top || 0);\n const listViewOffset = listViewTop - scrollElementTop;\n\n const itemOffset = this.getRowPosition(index).y;\n\n // hard code a small offset to leave a little bit of space above the focused span, so it is visually clear\n // that there is content above\n this.props.scrollElement?.scrollTo({ top: itemOffset + listViewOffset - 80 });\n };\n\n /**\n * Scroll event listener that schedules a remeasuring of which items should be\n * rendered.\n */\n _onScroll = () => {\n if (!this._isScrolledOrResized) {\n this._isScrolledOrResized = true;\n window.requestAnimationFrame(this._positionList);\n }\n };\n\n /**\n * Returns true is the view height (scroll window) or scroll position have\n * changed.\n */\n _isViewChanged() {\n if (!this._wrapperElm) {\n return false;\n }\n const useRoot = this.props.windowScroller;\n const clientHeight = useRoot ? this._htmlElm.clientHeight : this._wrapperElm.clientHeight;\n const scrollTop = useRoot ? this._htmlElm.scrollTop : this._wrapperElm.scrollTop;\n return clientHeight !== this._viewHeight || scrollTop !== this._scrollTop;\n }\n\n /**\n * Recalculate _startIndex and _endIndex, e.g. which items are in view.\n */\n _calcViewIndexes() {\n const useRoot = this.props.windowScroller;\n // funky if statement is to satisfy flow\n if (!useRoot) {\n /* istanbul ignore next */\n if (!this._wrapperElm) {\n this._viewHeight = -1;\n this._startIndex = 0;\n this._endIndex = 0;\n return;\n }\n this._viewHeight = this._wrapperElm.clientHeight;\n this._scrollTop = this._wrapperElm.scrollTop;\n } else {\n this._viewHeight = window.innerHeight - this._htmlTopOffset;\n this._scrollTop = window.scrollY;\n }\n const yStart = this._scrollTop;\n const yEnd = this._scrollTop + this._viewHeight;\n this._startIndex = this._yPositions.findFloorIndex(yStart, this._getHeight);\n this._endIndex = this._yPositions.findFloorIndex(yEnd, this._getHeight);\n }\n\n /**\n * Checked to see if the currently rendered items are sufficient, if not,\n * force an update to trigger more items to be rendered.\n */\n _positionList = () => {\n this._isScrolledOrResized = false;\n if (!this._wrapperElm) {\n return;\n }\n this._calcViewIndexes();\n // indexes drawn should be padded by at least props.viewBufferMin\n const maxStart = this.props.viewBufferMin > this._startIndex ? 0 : this._startIndex - this.props.viewBufferMin;\n const minEnd =\n this.props.viewBufferMin < this.props.dataLength - this._endIndex\n ? this._endIndex + this.props.viewBufferMin\n : this.props.dataLength - 1;\n if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n this.forceUpdate();\n }\n };\n\n _initWrapper = (elm: HTMLElement | TNil) => {\n if (!this.props.windowScroller) {\n return;\n }\n this._wrapperElm = elm;\n if (elm) {\n this._viewHeight = elm.clientHeight;\n }\n };\n\n _initItemHolder = (elm: HTMLElement | TNil) => {\n this._itemHolderElm = elm;\n this._scanItemHeights();\n };\n\n /**\n * Go through all items that are rendered and save their height based on their\n * item-key (which is on a data-* attribute). If any new or adjusted heights\n * are found, re-measure the current known y-positions (via .yPositions).\n */\n _scanItemHeights = () => {\n const getIndexFromKey = this.props.getIndexFromKey;\n if (!this._itemHolderElm) {\n return;\n }\n // note the keys for the first and last altered heights, the `yPositions`\n // needs to be updated\n let lowDirtyKey = null;\n let highDirtyKey = null;\n let isDirty = false;\n // iterating childNodes is faster than children\n // https://jsperf.com/large-htmlcollection-vs-large-nodelist\n const nodes = this._itemHolderElm.childNodes;\n const max = nodes.length;\n for (let i = 0; i < max; i++) {\n const node: HTMLElement = nodes[i] as any;\n // use `.getAttribute(...)` instead of `.dataset` for jest / JSDOM\n const itemKey = node.getAttribute('data-item-key');\n if (!itemKey) {\n // eslint-disable-next-line no-console\n console.warn('itemKey not found');\n continue;\n }\n // measure the first child, if it's available, otherwise the node itself\n // (likely not transferable to other contexts, and instead is specific to\n // how we have the items rendered)\n const measureSrc: Element = node.firstElementChild || node;\n const observed = measureSrc.clientHeight;\n const known = this._knownHeights.get(itemKey);\n if (observed !== known) {\n this._knownHeights.set(itemKey, observed);\n if (!isDirty) {\n isDirty = true;\n // eslint-disable-next-line no-multi-assign\n lowDirtyKey = highDirtyKey = itemKey;\n } else {\n highDirtyKey = itemKey;\n }\n }\n }\n if (lowDirtyKey != null && highDirtyKey != null) {\n // update yPositions, then redraw\n const imin = getIndexFromKey(lowDirtyKey);\n const imax = highDirtyKey === lowDirtyKey ? imin : getIndexFromKey(highDirtyKey);\n this._yPositions.calcHeights(imax, this._getHeight, imin);\n this.forceUpdate();\n }\n };\n\n /**\n * Get the height of the element at index `i`; first check the known heights,\n * fallback to `.props.itemHeightGetter(...)`.\n */\n _getHeight = (i: number) => {\n const key = this.props.getKeyFromIndex(i);\n const known = this._knownHeights.get(key);\n // known !== known iff known is NaN\n // eslint-disable-next-line no-self-compare\n if (known != null && known === known) {\n return known;\n }\n return this.props.itemHeightGetter(i, key);\n };\n\n render() {\n const {\n dataLength,\n getKeyFromIndex,\n initialDraw = DEFAULT_INITIAL_DRAW,\n itemRenderer,\n viewBuffer,\n viewBufferMin,\n } = this.props;\n const heightGetter = this._getHeight;\n const items = [];\n let start;\n let end;\n\n this._yPositions.profileData(dataLength);\n\n if (!this._wrapperElm) {\n start = 0;\n end = (initialDraw < dataLength ? initialDraw : dataLength) - 1;\n } else {\n if (this._isViewChanged()) {\n this._calcViewIndexes();\n }\n const maxStart = viewBufferMin > this._startIndex ? 0 : this._startIndex - viewBufferMin;\n const minEnd = viewBufferMin < dataLength - this._endIndex ? this._endIndex + viewBufferMin : dataLength - 1;\n if (maxStart < this._startIndexDrawn || minEnd > this._endIndexDrawn) {\n start = viewBuffer > this._startIndex ? 0 : this._startIndex - viewBuffer;\n end = this._endIndex + viewBuffer;\n if (end >= dataLength) {\n end = dataLength - 1;\n }\n } else {\n start = this._startIndexDrawn;\n end = this._endIndexDrawn > dataLength - 1 ? dataLength - 1 : this._endIndexDrawn;\n }\n }\n\n this._yPositions.calcHeights(end, heightGetter, start || -1);\n this._startIndexDrawn = start;\n this._endIndexDrawn = end;\n\n items.length = end - start + 1;\n for (let i = start; i <= end; i++) {\n const { y: top, height } = this._yPositions.getRowPosition(i, heightGetter);\n const style = {\n height,\n top,\n position: 'absolute',\n };\n const itemKey = getKeyFromIndex(i);\n const attrs = { 'data-item-key': itemKey };\n items.push(itemRenderer(itemKey, style, i, attrs));\n }\n const wrapperProps: TWrapperProps = {\n style: { position: 'relative' },\n ref: this._initWrapper,\n };\n if (!this.props.windowScroller) {\n wrapperProps.onScroll = this._onScroll;\n wrapperProps.style.height = '100%';\n wrapperProps.style.overflowY = 'auto';\n }\n const scrollerStyle = {\n position: 'relative' as 'relative',\n height: this._yPositions.getEstimatedHeight(),\n };\n return (\n <div {...wrapperProps}>\n <div style={scrollerStyle}>\n <div\n style={{\n position: 'absolute',\n top: 0,\n margin: 0,\n padding: 0,\n }}\n className={this.props.itemsWrapperClassName}\n ref={this._initItemHolder}\n >\n {items}\n </div>\n </div>\n </div>\n );\n }\n}\n","import React, { ReactElement, useRef } from 'react';\n\nimport { Popover as GrafanaPopover, PopoverController } from '@grafana/ui';\n\nexport type PopoverProps = {\n children: ReactElement;\n content: ReactElement;\n overlayClassName?: string;\n};\n\nexport function Popover({ children, content, overlayClassName }: PopoverProps) {\n const popoverRef = useRef<HTMLElement>(null);\n\n return (\n <PopoverController content={content} hideAfter={300}>\n {(showPopper, hidePopper, popperProps) => {\n return (\n <>\n {popoverRef.current && (\n <GrafanaPopover\n {...popperProps}\n referenceElement={popoverRef.current}\n wrapperClassName={overlayClassName}\n onMouseLeave={hidePopper}\n onMouseEnter={showPopper}\n />\n )}\n\n {React.cloneElement(children, {\n ref: popoverRef,\n onMouseEnter: showPopper,\n onMouseLeave: hidePopper,\n })}\n </>\n );\n }}\n </PopoverController>\n );\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport copy from 'copy-to-clipboard';\nimport React, { useState } from 'react';\n\nimport { Button, IconName, Tooltip, useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n CopyIcon: css`\n background-color: transparent;\n border: none;\n color: inherit;\n height: 100%;\n overflow: hidden;\n &:focus {\n background-color: rgba(255, 255, 255, 0.25);\n color: inherit;\n }\n `,\n };\n};\n\ntype PropsType = {\n className?: string;\n copyText: string;\n icon?: IconName;\n tooltipTitle: string;\n};\n\nexport default function CopyIcon(props: PropsType) {\n const styles = useStyles2(getStyles);\n\n const [hasCopied, setHasCopied] = useState(false);\n\n const handleClick = () => {\n copy(props.copyText);\n setHasCopied(true);\n };\n\n return (\n <Tooltip content={hasCopied ? 'Copied' : props.tooltipTitle}>\n <Button className={cx(styles.CopyIcon)} type=\"button\" icon={props.icon} onClick={handleClick} />\n </Tooltip>\n );\n}\n\nCopyIcon.defaultProps = {\n icon: 'copy',\n className: undefined,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport jsonMarkup from 'json-markup';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport CopyIcon from '../../common/CopyIcon';\nimport { TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { ubInlineBlock, uWidth100 } from '../../uberUtilityStyles';\n\nconst copyIconClassName = 'copyIcon';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n KeyValueTable: css`\n label: KeyValueTable;\n background: ${autoColor(theme, '#fff')};\n border: 1px solid ${autoColor(theme, '#ddd')};\n margin-bottom: 0.5rem;\n max-height: 450px;\n overflow: auto;\n `,\n body: css`\n label: body;\n vertical-align: baseline;\n `,\n row: css`\n label: row;\n & > td {\n padding: 0rem 0.5rem;\n height: 30px;\n }\n &:nth-child(2n) > td {\n background: ${autoColor(theme, '#f5f5f5')};\n }\n &:not(:hover) .${copyIconClassName} {\n visibility: hidden;\n }\n `,\n keyColumn: css`\n label: keyColumn;\n color: ${autoColor(theme, '#888')};\n white-space: pre;\n width: 125px;\n `,\n copyColumn: css`\n label: copyColumn;\n text-align: right;\n `,\n linkIcon: css`\n label: linkIcon;\n vertical-align: middle;\n font-weight: bold;\n `,\n };\n};\n\nconst jsonObjectOrArrayStartRegex = /^(\\[|\\{)/;\n\nfunction parseIfComplexJson(value: any) {\n // if the value is a string representing actual json object or array, then use json-markup\n if (typeof value === 'string' && jsonObjectOrArrayStartRegex.test(value)) {\n // otherwise just return as is\n try {\n return JSON.parse(value);\n // eslint-disable-next-line no-empty\n } catch (_) {}\n }\n return value;\n}\n\nexport const LinkValue = (props: { href: string; title?: string; children: React.ReactNode }) => {\n return (\n <a href={props.href} title={props.title} target=\"_blank\" rel=\"noopener noreferrer\">\n {props.children} <Icon name=\"external-link-alt\" />\n </a>\n );\n};\n\nLinkValue.defaultProps = {\n title: '',\n};\n\ntype KeyValuesTableProps = {\n data: TraceKeyValuePair[];\n linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n};\n\nexport default function KeyValuesTable(props: KeyValuesTableProps) {\n const { data, linksGetter } = props;\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles.KeyValueTable)} data-testid=\"KeyValueTable\">\n <table className={uWidth100}>\n <tbody className={styles.body}>\n {data.map((row, i) => {\n const markup = {\n __html: jsonMarkup(parseIfComplexJson(row.value)),\n };\n const jsonTable = <div className={ubInlineBlock} dangerouslySetInnerHTML={markup} />;\n const links = linksGetter ? linksGetter(data, i) : null;\n let valueMarkup;\n if (links && links.length) {\n // TODO: handle multiple items\n valueMarkup = (\n <div>\n <LinkValue href={links[0].url} title={links[0].text}>\n {jsonTable}\n </LinkValue>\n </div>\n );\n } else {\n valueMarkup = jsonTable;\n }\n return (\n // `i` is necessary in the key because row.key can repeat\n <tr className={styles.row} key={`${row.key}-${i}`}>\n <td className={styles.keyColumn} data-testid=\"KeyValueTable--keyColumn\">\n {row.key}\n </td>\n <td>{valueMarkup}</td>\n <td className={styles.copyColumn}>\n <CopyIcon\n className={copyIconClassName}\n copyText={JSON.stringify(row, null, 2)}\n tooltipTitle=\"Copy JSON\"\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { uAlignIcon, uTxEllipsis } from '../../uberUtilityStyles';\n\nimport * as markers from './AccordianKeyValues.markers';\nimport KeyValuesTable from './KeyValuesTable';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css`\n label: header;\n cursor: pointer;\n overflow: hidden;\n padding: 0.25em 0.1em;\n text-overflow: ellipsis;\n white-space: nowrap;\n &:hover {\n background: ${autoColor(theme, '#e8e8e8')};\n }\n `,\n headerEmpty: css`\n label: headerEmpty;\n background: none;\n cursor: initial;\n `,\n headerHighContrast: css`\n label: headerHighContrast;\n &:hover {\n background: ${autoColor(theme, '#ddd')};\n }\n `,\n emptyIcon: css`\n label: emptyIcon;\n color: ${autoColor(theme, '#aaa')};\n `,\n summary: css`\n label: summary;\n display: inline;\n list-style: none;\n padding: 0;\n `,\n summaryItem: css`\n label: summaryItem;\n display: inline;\n margin-left: 0.7em;\n padding-right: 0.5rem;\n border-right: 1px solid ${autoColor(theme, '#ddd')};\n &:last-child {\n padding-right: 0;\n border-right: none;\n }\n `,\n summaryLabel: css`\n label: summaryLabel;\n color: ${autoColor(theme, '#777')};\n `,\n summaryDelim: css`\n label: summaryDelim;\n color: ${autoColor(theme, '#bbb')};\n padding: 0 0.2em;\n `,\n };\n};\n\ntype AccordianKeyValuesProps = {\n className?: string | TNil;\n data: TraceKeyValuePair[];\n highContrast?: boolean;\n interactive?: boolean;\n isOpen: boolean;\n label: string;\n linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n onToggle?: null | (() => void);\n};\n\n// export for tests\nexport function KeyValuesSummary(props: { data?: TraceKeyValuePair[] }) {\n const { data } = props;\n const styles = useStyles2(getStyles);\n\n if (!Array.isArray(data) || !data.length) {\n return null;\n }\n\n return (\n <ul className={styles.summary}>\n {data.map((item, i) => (\n // `i` is necessary in the key because item.key can repeat\n <li className={styles.summaryItem} key={`${item.key}-${i}`}>\n <span className={styles.summaryLabel}>{item.key}</span>\n <span className={styles.summaryDelim}>=</span>\n {String(item.value)}\n </li>\n ))}\n </ul>\n );\n}\n\nKeyValuesSummary.defaultProps = {\n data: null,\n};\n\nexport default function AccordianKeyValues(props: AccordianKeyValuesProps) {\n const { className, data, highContrast, interactive, isOpen, label, linksGetter, onToggle } = props;\n const isEmpty = !Array.isArray(data) || !data.length;\n const styles = useStyles2(getStyles);\n const iconCls = cx(uAlignIcon, { [styles.emptyIcon]: isEmpty });\n let arrow: React.ReactNode | null = null;\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? <IoIosArrowDown className={iconCls} /> : <IoIosArrowRight className={iconCls} />;\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n\n return (\n <div className={cx(className, uTxEllipsis)}>\n <div\n className={cx(styles.header, {\n [styles.headerEmpty]: isEmpty,\n [styles.headerHighContrast]: highContrast && !isEmpty,\n })}\n {...headerProps}\n data-testid=\"AccordianKeyValues--header\"\n >\n {arrow}\n <strong data-test={markers.LABEL}>\n {label}\n {isOpen || ':'}\n </strong>\n {!isOpen && <KeyValuesSummary data={data} />}\n </div>\n {isOpen && <KeyValuesTable data={data} linksGetter={linksGetter} />}\n </div>\n );\n}\n\nAccordianKeyValues.defaultProps = {\n className: null,\n highContrast: false,\n interactive: true,\n onToggle: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const LABEL = 'label';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { sortBy as _sortBy } from 'lodash';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { TraceLog, TraceKeyValuePair, TraceLink } from '../../types/trace';\nimport { uAlignIcon, ubMb1 } from '../../uberUtilityStyles';\nimport { formatDuration } from '../utils';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n AccordianLogs: css`\n label: AccordianLogs;\n border: 1px solid ${autoColor(theme, '#d8d8d8')};\n position: relative;\n margin-bottom: 0.25rem;\n `,\n AccordianLogsHeader: css`\n label: AccordianLogsHeader;\n background: ${autoColor(theme, '#e4e4e4')};\n color: inherit;\n display: block;\n padding: 0.25rem 0.5rem;\n &:hover {\n background: ${autoColor(theme, '#dadada')};\n }\n `,\n AccordianLogsContent: css`\n label: AccordianLogsContent;\n background: ${autoColor(theme, '#f0f0f0')};\n border-top: 1px solid ${autoColor(theme, '#d8d8d8')};\n padding: 0.5rem 0.5rem 0.25rem 0.5rem;\n `,\n AccordianLogsFooter: css`\n label: AccordianLogsFooter;\n color: ${autoColor(theme, '#999')};\n `,\n };\n};\n\ntype AccordianLogsProps = {\n interactive?: boolean;\n isOpen: boolean;\n linksGetter: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n logs: TraceLog[];\n onItemToggle?: (log: TraceLog) => void;\n onToggle?: () => void;\n openedItems?: Set<TraceLog>;\n timestamp: number;\n};\n\nexport default function AccordianLogs(props: AccordianLogsProps) {\n const { interactive, isOpen, linksGetter, logs, openedItems, onItemToggle, onToggle, timestamp } = props;\n let arrow: React.ReactNode | null = null;\n let HeaderComponent: 'span' | 'a' = 'span';\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? <IoIosArrowDown className={uAlignIcon} /> : <IoIosArrowRight className=\"u-align-icon\" />;\n HeaderComponent = 'a';\n headerProps = {\n 'aria-checked': isOpen,\n onClick: onToggle,\n role: 'switch',\n };\n }\n\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.AccordianLogs}>\n <HeaderComponent className={styles.AccordianLogsHeader} {...headerProps}>\n {arrow} <strong>Events</strong> ({logs.length})\n </HeaderComponent>\n {isOpen && (\n <div className={styles.AccordianLogsContent}>\n {_sortBy(logs, 'timestamp').map((log, i) => (\n <AccordianKeyValues\n // `i` is necessary in the key because timestamps can repeat\n key={`${log.timestamp}-${i}`}\n className={i < logs.length - 1 ? ubMb1 : null}\n data={log.fields || []}\n highContrast\n interactive={interactive}\n isOpen={openedItems ? openedItems.has(log) : false}\n label={`${formatDuration(log.timestamp - timestamp)}`}\n linksGetter={linksGetter}\n onToggle={interactive && onItemToggle ? () => onItemToggle(log) : null}\n />\n ))}\n <small className={styles.AccordianLogsFooter}>\n Log timestamps are relative to the start time of the full trace.\n </small>\n </div>\n )}\n </div>\n );\n}\n\nAccordianLogs.defaultProps = {\n interactive: true,\n linksGetter: undefined,\n onItemToggle: undefined,\n onToggle: undefined,\n openedItems: undefined,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { groupBy as _groupBy } from 'lodash';\nimport React, { useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { Popover } from '../common/Popover';\nimport { TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nimport AccordianLogs from './SpanDetail/AccordianLogs';\nimport { ViewedBoundsFunctionType } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n label: wrapper;\n bottom: 0;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n overflow: hidden;\n z-index: 0;\n `,\n bar: css`\n label: bar;\n border-radius: 3px;\n min-width: 2px;\n position: absolute;\n height: 36%;\n top: 32%;\n `,\n rpc: css`\n label: rpc;\n position: absolute;\n top: 35%;\n bottom: 35%;\n z-index: 1;\n `,\n label: css`\n label: label;\n color: #aaa;\n font-size: 12px;\n font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;\n line-height: 1em;\n white-space: nowrap;\n padding: 0 0.5em;\n position: absolute;\n `,\n logMarker: css`\n label: logMarker;\n background-color: ${autoColor(theme, '#2c3235')};\n cursor: pointer;\n height: 60%;\n min-width: 1px;\n position: absolute;\n top: 20%;\n &:hover {\n background-color: ${autoColor(theme, '#464c54')};\n }\n &::before,\n &::after {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n right: 0;\n border: 1px solid transparent;\n }\n &::after {\n left: 0;\n }\n `,\n };\n};\n\ntype Props = {\n color: string;\n onClick?: (evt: React.MouseEvent<any>) => void;\n viewEnd: number;\n viewStart: number;\n getViewedBounds: ViewedBoundsFunctionType;\n rpc:\n | {\n viewStart: number;\n viewEnd: number;\n color: string;\n }\n | TNil;\n traceStartTime: number;\n span: TraceSpan;\n className?: string;\n labelClassName?: string;\n longLabel: string;\n shortLabel: string;\n};\n\nfunction toPercent(value: number) {\n return `${(value * 100).toFixed(1)}%`;\n}\n\nfunction SpanBar({\n viewEnd,\n viewStart,\n getViewedBounds,\n color,\n shortLabel,\n longLabel,\n onClick,\n rpc,\n traceStartTime,\n span,\n className,\n labelClassName,\n}: Props) {\n const [label, setLabel] = useState(shortLabel);\n const setShortLabel = () => setLabel(shortLabel);\n const setLongLabel = () => setLabel(longLabel);\n\n // group logs based on timestamps\n const logGroups = _groupBy(span.logs, (log) => {\n const posPercent = getViewedBounds(log.timestamp, log.timestamp).start;\n // round to the nearest 0.2%\n return toPercent(Math.round(posPercent * 500) / 500);\n });\n const styles = useStyles2(getStyles);\n\n return (\n <div\n className={cx(styles.wrapper, className)}\n onClick={onClick}\n onMouseLeave={setShortLabel}\n onMouseOver={setLongLabel}\n aria-hidden\n data-testid={selectors.components.TraceViewer.spanBar}\n >\n <div\n aria-label={label}\n className={styles.bar}\n style={{\n background: color,\n left: toPercent(viewStart),\n width: toPercent(viewEnd - viewStart),\n }}\n >\n <div className={cx(styles.label, labelClassName)} data-testid=\"SpanBar--label\">\n {label}\n </div>\n </div>\n <div>\n {Object.keys(logGroups).map((positionKey) => (\n <Popover\n key={positionKey}\n content={\n <AccordianLogs interactive={false} isOpen logs={logGroups[positionKey]} timestamp={traceStartTime} />\n }\n >\n <div data-testid=\"SpanBar--logMarker\" className={styles.logMarker} style={{ left: positionKey }} />\n </Popover>\n ))}\n </div>\n {rpc && (\n <div\n className={styles.rpc}\n style={{\n background: rpc.color,\n left: toPercent(rpc.viewStart),\n width: toPercent(rpc.viewEnd - rpc.viewStart),\n }}\n />\n )}\n </div>\n );\n}\n\nexport default React.memo(SpanBar);\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { useStyles2, MenuGroup, MenuItem, Icon, ContextMenu } from '@grafana/ui';\n\nimport { SpanLinks } from '../types/links';\n\ninterface SpanLinksProps {\n links: SpanLinks;\n}\n\nconst renderMenuItems = (links: SpanLinks, styles: ReturnType<typeof getStyles>, closeMenu: () => void) => {\n return (\n <>\n {!!links.logLinks?.length ? (\n <MenuGroup label=\"Logs\">\n {links.logLinks.map((link, i) => (\n <MenuItem\n key={i}\n label=\"Logs for this span\"\n onClick={\n link.onClick\n ? (event) => {\n event?.preventDefault();\n link.onClick!(event);\n closeMenu();\n }\n : undefined\n }\n url={link.href}\n className={styles.menuItem}\n />\n ))}\n </MenuGroup>\n ) : null}\n {!!links.metricLinks?.length ? (\n <MenuGroup label=\"Metrics\">\n {links.metricLinks.map((link, i) => (\n <MenuItem\n key={i}\n label={link.title ?? 'Metrics for this span'}\n onClick={\n link.onClick\n ? (event) => {\n event?.preventDefault();\n link.onClick!(event);\n closeMenu();\n }\n : undefined\n }\n url={link.href}\n className={styles.menuItem}\n />\n ))}\n </MenuGroup>\n ) : null}\n {!!links.traceLinks?.length ? (\n <MenuGroup label=\"Traces\">\n {links.traceLinks.map((link, i) => (\n <MenuItem\n key={i}\n label={link.title ?? 'View linked span'}\n onClick={\n link.onClick\n ? (event) => {\n event?.preventDefault();\n link.onClick!(event);\n closeMenu();\n }\n : undefined\n }\n url={link.href}\n className={styles.menuItem}\n />\n ))}\n </MenuGroup>\n ) : null}\n </>\n );\n};\n\nexport const SpanLinksMenu = ({ links }: SpanLinksProps) => {\n const styles = useStyles2(getStyles);\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });\n\n const closeMenu = () => setIsMenuOpen(false);\n\n return (\n <div data-testid=\"SpanLinksMenu\">\n <button\n onClick={(e) => {\n setIsMenuOpen(true);\n setMenuPosition({\n x: e.pageX,\n y: e.pageY,\n });\n }}\n className={styles.button}\n >\n <Icon name=\"link\" className={styles.button} />\n </button>\n\n {isMenuOpen ? (\n <ContextMenu\n onClose={() => setIsMenuOpen(false)}\n renderMenuItems={() => renderMenuItems(links, styles, closeMenu)}\n focusOnOpen={true}\n x={menuPosition.x}\n y={menuPosition.y}\n />\n ) : null}\n </div>\n );\n};\n\nconst getStyles = () => {\n return {\n button: css`\n background: transparent;\n border: none;\n padding: 0;\n margin: 0 3px 0 0;\n `,\n menuItem: css`\n max-width: 60ch;\n overflow: hidden;\n `,\n };\n};\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { find as _find, get as _get } from 'lodash';\n\nimport { TNil } from '../types';\nimport { TraceSpan } from '../types/trace';\n\nfunction getFirstAncestor(span: TraceSpan): TraceSpan | TNil {\n return _get(\n _find(\n span.references,\n ({ span: ref, refType }) => ref && ref.spanID && (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM')\n ),\n 'span'\n );\n}\n\nexport default function spanAncestorIds(span: TraceSpan | TNil): string[] {\n const ancestorIDs: string[] = [];\n if (!span) {\n return ancestorIDs;\n }\n let ref = getFirstAncestor(span);\n while (ref) {\n ancestorIDs.push(ref.spanID);\n ref = getFirstAncestor(ref);\n }\n return ancestorIDs;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { get as _get } from 'lodash';\nimport React from 'react';\nimport IoChevronRight from 'react-icons/lib/io/chevron-right';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { TraceSpan } from '../types/trace';\nimport spanAncestorIds from '../utils/span-ancestor-ids';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n SpanTreeOffset: css`\n label: SpanTreeOffset;\n color: ${autoColor(theme, '#000')};\n position: relative;\n `,\n SpanTreeOffsetParent: css`\n label: SpanTreeOffsetParent;\n &:hover {\n cursor: pointer;\n }\n `,\n indentGuide: css`\n label: indentGuide;\n /* The size of the indentGuide is based off of the iconWrapper */\n padding-right: calc(0.5rem + 12px);\n height: 100%;\n border-left: 3px solid transparent;\n display: inline-flex;\n &::before {\n content: '';\n padding-left: 1px;\n background-color: ${autoColor(theme, 'lightgrey')};\n }\n `,\n indentGuideActive: css`\n label: indentGuideActive;\n border-color: ${autoColor(theme, 'darkgrey')};\n &::before {\n background-color: transparent;\n }\n `,\n iconWrapper: css`\n label: iconWrapper;\n position: absolute;\n right: 0.25rem;\n `,\n };\n});\n\ntype TProps = {\n childrenVisible?: boolean;\n onClick?: () => void;\n span: TraceSpan;\n showChildrenIcon?: boolean;\n\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n};\n\nexport class UnthemedSpanTreeOffset extends React.PureComponent<TProps> {\n static displayName = 'UnthemedSpanTreeOffset';\n\n ancestorIds: string[];\n\n static defaultProps = {\n childrenVisible: false,\n showChildrenIcon: true,\n };\n\n constructor(props: TProps) {\n super(props);\n\n this.ancestorIds = spanAncestorIds(props.span);\n // Some traces have multiple root-level spans, this connects them all under one guideline and adds the\n // necessary padding for the collapse icon on root-level spans.\n this.ancestorIds.push('root');\n\n this.ancestorIds.reverse();\n }\n\n /**\n * If the mouse leaves to anywhere except another span with the same ancestor id, this span's ancestor id is\n * removed from the set of hoverIndentGuideIds.\n *\n * @param {Object} event - React Synthetic event tied to mouseleave. Includes the related target which is\n * the element the user is now hovering.\n * @param {string} ancestorId - The span id that the user was hovering over.\n */\n handleMouseLeave = (event: React.MouseEvent<HTMLSpanElement>, ancestorId: string) => {\n if (\n !(event.relatedTarget instanceof HTMLSpanElement) ||\n _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n ) {\n this.props.removeHoverIndentGuideId(ancestorId);\n }\n };\n\n /**\n * If the mouse entered this span from anywhere except another span with the same ancestor id, this span's\n * ancestorId is added to the set of hoverIndentGuideIds.\n *\n * @param {Object} event - React Synthetic event tied to mouseenter. Includes the related target which is\n * the last element the user was hovering.\n * @param {string} ancestorId - The span id that the user is now hovering over.\n */\n handleMouseEnter = (event: React.MouseEvent<HTMLSpanElement>, ancestorId: string) => {\n if (\n !(event.relatedTarget instanceof HTMLSpanElement) ||\n _get(event, 'relatedTarget.dataset.ancestorId') !== ancestorId\n ) {\n this.props.addHoverIndentGuideId(ancestorId);\n }\n };\n\n render() {\n const { childrenVisible, onClick, showChildrenIcon, span, theme } = this.props;\n const { hasChildren, spanID } = span;\n const wrapperProps = hasChildren ? { onClick, role: 'switch', 'aria-checked': childrenVisible } : null;\n const icon = showChildrenIcon && hasChildren && (childrenVisible ? <IoIosArrowDown /> : <IoChevronRight />);\n const styles = getStyles(theme);\n return (\n <span className={cx(styles.SpanTreeOffset, { [styles.SpanTreeOffsetParent]: hasChildren })} {...wrapperProps}>\n {this.ancestorIds.map((ancestorId) => (\n <span\n key={ancestorId}\n className={cx(styles.indentGuide, {\n [styles.indentGuideActive]: this.props.hoverIndentGuideIds.has(ancestorId),\n })}\n data-ancestor-id={ancestorId}\n data-testid=\"SpanTreeOffset--indentGuide\"\n onMouseEnter={(event) => this.handleMouseEnter(event, ancestorId)}\n onMouseLeave={(event) => this.handleMouseLeave(event, ancestorId)}\n />\n ))}\n {icon && (\n <span\n className={styles.iconWrapper}\n onMouseEnter={(event) => this.handleMouseEnter(event, spanID)}\n onMouseLeave={(event) => this.handleMouseLeave(event, spanID)}\n data-testid=\"icon-wrapper\"\n >\n {icon}\n </span>\n )}\n </span>\n );\n }\n}\n\nexport default withTheme2(UnthemedSpanTreeOffset);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, keyframes } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoAlert from 'react-icons/lib/io/alert';\nimport IoArrowRightA from 'react-icons/lib/io/arrow-right-a';\n\nimport { GrafanaTheme2, TraceKeyValuePair } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { DURATION, NONE, TAG } from '../settings/SpanBarSettings';\nimport { SpanBarOptions, SpanLinkFunc, TNil } from '../types';\nimport { SpanLinks } from '../types/links';\nimport { TraceSpan } from '../types/trace';\n\nimport SpanBar from './SpanBar';\nimport { SpanLinksMenu } from './SpanLinks';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport Ticks from './Ticks';\nimport TimelineRow from './TimelineRow';\nimport { formatDuration, ViewedBoundsFunctionType } from './utils';\n\nconst spanBarClassName = 'spanBar';\nconst spanBarLabelClassName = 'spanBarLabel';\nconst nameWrapperClassName = 'nameWrapper';\nconst nameWrapperMatchingFilterClassName = 'nameWrapperMatchingFilter';\nconst viewClassName = 'jaegerView';\nconst nameColumnClassName = 'nameColumn';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n const animations = {\n flash: keyframes`\n label: flash;\n from {\n background-color: ${autoColor(theme, '#68b9ff')};\n }\n to {\n background-color: default;\n }\n `,\n };\n\n return {\n nameWrapper: css`\n label: nameWrapper;\n line-height: 27px;\n overflow: hidden;\n display: flex;\n `,\n nameWrapperMatchingFilter: css`\n label: nameWrapperMatchingFilter;\n background-color: ${autoColor(theme, '#fffce4')};\n `,\n nameColumn: css`\n label: nameColumn;\n position: relative;\n white-space: nowrap;\n z-index: 1;\n &:hover {\n z-index: 1;\n }\n `,\n endpointName: css`\n label: endpointName;\n color: ${autoColor(theme, '#808080')};\n `,\n view: css`\n label: view;\n position: relative;\n `,\n viewExpanded: css`\n label: viewExpanded;\n background: ${autoColor(theme, '#f8f8f8')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n `,\n viewExpandedAndMatchingFilter: css`\n label: viewExpandedAndMatchingFilter;\n background: ${autoColor(theme, '#fff3d7')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n `,\n row: css`\n label: row;\n &:hover .${spanBarClassName} {\n opacity: 1;\n }\n &:hover .${spanBarLabelClassName} {\n color: ${autoColor(theme, '#000')};\n }\n &:hover .${nameWrapperClassName} {\n background: #f8f8f8;\n background: linear-gradient(\n 90deg,\n ${autoColor(theme, '#fafafa')},\n ${autoColor(theme, '#f8f8f8')} 75%,\n ${autoColor(theme, '#eee')}\n );\n }\n &:hover .${viewClassName} {\n background-color: ${autoColor(theme, '#f5f5f5')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n }\n `,\n rowClippingLeft: css`\n label: rowClippingLeft;\n & .${nameColumnClassName}::before {\n content: ' ';\n height: 100%;\n position: absolute;\n width: 6px;\n background-image: linear-gradient(\n to right,\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n ${autoColor(theme, 'rgba(32, 32, 32, 0)')}\n );\n left: 100%;\n z-index: -1;\n }\n `,\n rowClippingRight: css`\n label: rowClippingRight;\n & .${viewClassName}::before {\n content: ' ';\n height: 100%;\n position: absolute;\n width: 6px;\n background-image: linear-gradient(\n to left,\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')},\n ${autoColor(theme, 'rgba(25, 25, 25, 0.25)')}\n );\n right: 0%;\n z-index: 1;\n }\n `,\n rowExpanded: css`\n label: rowExpanded;\n & .${spanBarClassName} {\n opacity: 1;\n }\n & .${spanBarLabelClassName} {\n color: ${autoColor(theme, '#000')};\n }\n & .${nameWrapperClassName}, &:hover .${nameWrapperClassName} {\n background: ${autoColor(theme, '#f0f0f0')};\n box-shadow: 0 1px 0 ${autoColor(theme, '#ddd')};\n }\n & .${nameWrapperMatchingFilterClassName} {\n background: ${autoColor(theme, '#fff3d7')};\n }\n &:hover .${viewClassName} {\n background: ${autoColor(theme, '#eee')};\n }\n `,\n rowMatchingFilter: css`\n label: rowMatchingFilter;\n background-color: ${autoColor(theme, '#fffbde')};\n &:hover .${nameWrapperClassName} {\n background: linear-gradient(\n 90deg,\n ${autoColor(theme, '#fffbde')},\n ${autoColor(theme, '#fffbde')} 75%,\n ${autoColor(theme, '#f7f1c6')}\n );\n }\n &:hover .${viewClassName} {\n background-color: ${autoColor(theme, '#f7f1c6')};\n outline: 1px solid ${autoColor(theme, '#ddd')};\n }\n `,\n rowFocused: css`\n label: rowFocused;\n background-color: ${autoColor(theme, '#cbe7ff')};\n animation: ${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0);\n & .${nameWrapperClassName}, .${viewClassName}, .${nameWrapperMatchingFilterClassName} {\n background-color: ${autoColor(theme, '#cbe7ff')};\n animation: ${animations.flash} 1s cubic-bezier(0.12, 0, 0.39, 0);\n }\n & .${spanBarClassName} {\n opacity: 1;\n }\n & .${spanBarLabelClassName} {\n color: ${autoColor(theme, '#000')};\n }\n &:hover .${nameWrapperClassName}, :hover .${viewClassName} {\n background: ${autoColor(theme, '#d5ebff')};\n box-shadow: 0 1px 0 ${autoColor(theme, '#ddd')};\n }\n `,\n\n rowExpandedAndMatchingFilter: css`\n label: rowExpandedAndMatchingFilter;\n &:hover .${viewClassName} {\n background: ${autoColor(theme, '#ffeccf')};\n }\n `,\n\n name: css`\n label: name;\n color: ${autoColor(theme, '#000')};\n cursor: pointer;\n flex: 1 1 auto;\n outline: none;\n overflow-y: hidden;\n overflow-x: auto;\n margin-right: 8px;\n padding-left: 4px;\n padding-right: 0.25em;\n position: relative;\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar {\n display: none;\n }\n &::before {\n content: ' ';\n position: absolute;\n top: 4px;\n bottom: 4px;\n left: 0;\n border-left: 4px solid;\n border-left-color: inherit;\n }\n &:focus {\n text-decoration: none;\n }\n &:hover > small {\n color: ${autoColor(theme, '#000')};\n }\n `,\n nameDetailExpanded: css`\n label: nameDetailExpanded;\n &::before {\n bottom: 0;\n }\n `,\n svcName: css`\n label: svcName;\n padding: 0 0.25rem 0 0.5rem;\n font-size: 1.05em;\n `,\n svcNameChildrenCollapsed: css`\n label: svcNameChildrenCollapsed;\n font-weight: bold;\n font-style: italic;\n `,\n errorIcon: css`\n label: errorIcon;\n border-radius: 6.5px;\n color: ${autoColor(theme, '#fff')};\n font-size: 0.85em;\n margin-right: 0.25rem;\n padding: 1px;\n `,\n rpcColorMarker: css`\n label: rpcColorMarker;\n border-radius: 6.5px;\n display: inline-block;\n font-size: 0.85em;\n height: 1em;\n margin-right: 0.25rem;\n padding: 1px;\n width: 1em;\n vertical-align: middle;\n `,\n labelRight: css`\n label: labelRight;\n left: 100%;\n `,\n labelLeft: css`\n label: labelLeft;\n right: 100%;\n `,\n };\n});\n\ntype SpanBarRowProps = {\n className?: string;\n theme: GrafanaTheme2;\n color: string;\n spanBarOptions: SpanBarOptions | undefined;\n columnDivision: number;\n isChildrenExpanded: boolean;\n isDetailExpanded: boolean;\n isMatchingFilter: boolean;\n isFocused: boolean;\n onDetailToggled: (spanID: string) => void;\n onChildrenToggled: (spanID: string) => void;\n numTicks: number;\n rpc?:\n | {\n viewStart: number;\n viewEnd: number;\n color: string;\n operationName: string;\n serviceName: string;\n }\n | TNil;\n noInstrumentedServer?:\n | {\n color: string;\n serviceName: string;\n }\n | TNil;\n showErrorIcon: boolean;\n getViewedBounds: ViewedBoundsFunctionType;\n traceStartTime: number;\n span: TraceSpan;\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n clippingLeft?: boolean;\n clippingRight?: boolean;\n createSpanLink?: SpanLinkFunc;\n};\n\n/**\n * This was originally a stateless function, but changing to a PureComponent\n * reduced the render time of expanding a span row detail by ~50%. This is\n * even true in the case where the stateless function has the same prop types as\n * this class and arrow functions are created in the stateless function as\n * handlers to the onClick props. E.g. for now, the PureComponent is more\n * performance than the stateless function.\n */\nexport class UnthemedSpanBarRow extends React.PureComponent<SpanBarRowProps> {\n static displayName = 'UnthemedSpanBarRow';\n static defaultProps: Partial<SpanBarRowProps> = {\n className: '',\n rpc: null,\n };\n\n _detailToggle = () => {\n this.props.onDetailToggled(this.props.span.spanID);\n };\n\n _childrenToggle = () => {\n this.props.onChildrenToggled(this.props.span.spanID);\n };\n\n render() {\n const {\n className,\n color,\n spanBarOptions,\n columnDivision,\n isChildrenExpanded,\n isDetailExpanded,\n isMatchingFilter,\n isFocused,\n numTicks,\n rpc,\n noInstrumentedServer,\n showErrorIcon,\n getViewedBounds,\n traceStartTime,\n span,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n clippingLeft,\n clippingRight,\n theme,\n createSpanLink,\n } = this.props;\n const {\n duration,\n hasChildren: isParent,\n operationName,\n process: { serviceName },\n } = span;\n const label = formatDuration(duration);\n\n const viewBounds = getViewedBounds(span.startTime, span.startTime + span.duration);\n const viewStart = viewBounds.start;\n const viewEnd = viewBounds.end;\n const styles = getStyles(theme);\n\n const labelDetail = `${serviceName}::${operationName}`;\n let longLabel;\n let hintClassName;\n if (viewStart > 1 - viewEnd) {\n longLabel = `${labelDetail} | ${label}`;\n hintClassName = styles.labelLeft;\n } else {\n longLabel = `${label} | ${labelDetail}`;\n hintClassName = styles.labelRight;\n }\n\n const countLinks = (links?: SpanLinks): number => {\n if (!links) {\n return 0;\n }\n\n return Object.values(links).reduce((count, arr) => count + arr.length, 0);\n };\n\n return (\n <TimelineRow\n className={cx(\n styles.row,\n {\n [styles.rowExpanded]: isDetailExpanded,\n [styles.rowMatchingFilter]: isMatchingFilter,\n [styles.rowExpandedAndMatchingFilter]: isMatchingFilter && isDetailExpanded,\n [styles.rowFocused]: isFocused,\n [styles.rowClippingLeft]: clippingLeft,\n [styles.rowClippingRight]: clippingRight,\n },\n className\n )}\n >\n <TimelineRow.Cell className={cx(styles.nameColumn, nameColumnClassName)} width={columnDivision}>\n <div\n className={cx(styles.nameWrapper, nameWrapperClassName, {\n [styles.nameWrapperMatchingFilter]: isMatchingFilter,\n nameWrapperMatchingFilter: isMatchingFilter,\n })}\n >\n <SpanTreeOffset\n onClick={isParent ? this._childrenToggle : undefined}\n childrenVisible={isChildrenExpanded}\n span={span}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n />\n <a\n className={cx(styles.name, { [styles.nameDetailExpanded]: isDetailExpanded })}\n aria-checked={isDetailExpanded}\n title={labelDetail}\n onClick={this._detailToggle}\n role=\"switch\"\n style={{ borderColor: color }}\n tabIndex={0}\n >\n <span\n className={cx(styles.svcName, {\n [styles.svcNameChildrenCollapsed]: isParent && !isChildrenExpanded,\n })}\n >\n {showErrorIcon && (\n <IoAlert\n style={{\n backgroundColor: span.errorIconColor\n ? autoColor(theme, span.errorIconColor)\n : autoColor(theme, '#db2828'),\n }}\n className={styles.errorIcon}\n />\n )}\n {serviceName}{' '}\n {rpc && (\n <span>\n <IoArrowRightA /> <i className={styles.rpcColorMarker} style={{ background: rpc.color }} />\n {rpc.serviceName}\n </span>\n )}\n {noInstrumentedServer && (\n <span>\n <IoArrowRightA />{' '}\n <i className={styles.rpcColorMarker} style={{ background: noInstrumentedServer.color }} />\n {noInstrumentedServer.serviceName}\n </span>\n )}\n </span>\n <small className={styles.endpointName}>{rpc ? rpc.operationName : operationName}</small>\n <small className={styles.endpointName}> {this.getSpanBarLabel(span, spanBarOptions, label)}</small>\n </a>\n {createSpanLink &&\n (() => {\n const links = createSpanLink(span);\n const count = countLinks(links);\n if (links && count === 1) {\n const link = links.logLinks?.[0] ?? links.metricLinks?.[0] ?? links.traceLinks?.[0] ?? undefined;\n if (!link) {\n return null;\n }\n\n return (\n <a\n href={link.href}\n // Needs to have target otherwise preventDefault would not work due to angularRouter.\n target={'_blank'}\n style={{ marginRight: '5px' }}\n rel=\"noopener noreferrer\"\n onClick={\n link.onClick\n ? (event) => {\n if (!(event.ctrlKey || event.metaKey || event.shiftKey) && link.onClick) {\n event.preventDefault();\n link.onClick(event);\n }\n }\n : undefined\n }\n >\n {link.content}\n </a>\n );\n } else if (links && count > 1) {\n return <SpanLinksMenu links={links} />;\n } else {\n return null;\n }\n })()}\n </div>\n </TimelineRow.Cell>\n <TimelineRow.Cell\n className={cx(styles.view, viewClassName, {\n [styles.viewExpanded]: isDetailExpanded,\n [styles.viewExpandedAndMatchingFilter]: isMatchingFilter && isDetailExpanded,\n })}\n data-testid=\"span-view\"\n style={{ cursor: 'pointer' }}\n width={1 - columnDivision}\n onClick={this._detailToggle}\n >\n <Ticks numTicks={numTicks} />\n <SpanBar\n rpc={rpc}\n viewStart={viewStart}\n viewEnd={viewEnd}\n getViewedBounds={getViewedBounds}\n color={color}\n shortLabel={label}\n longLabel={longLabel}\n traceStartTime={traceStartTime}\n span={span}\n labelClassName={`${spanBarLabelClassName} ${hintClassName}`}\n className={spanBarClassName}\n />\n </TimelineRow.Cell>\n </TimelineRow>\n );\n }\n\n getSpanBarLabel = (span: TraceSpan, spanBarOptions: SpanBarOptions | undefined, duration: string) => {\n const type = spanBarOptions?.type ?? '';\n\n if (type === NONE) {\n return '';\n } else if (type === '' || type === DURATION) {\n return `(${duration})`;\n } else if (type === TAG) {\n const tagKey = spanBarOptions?.tag?.trim() ?? '';\n if (tagKey !== '' && span.tags) {\n const tag = span.tags?.find((tag: TraceKeyValuePair) => {\n return tag.key === tagKey;\n });\n const process = span.process?.tags?.find((process: TraceKeyValuePair) => {\n return process.key === tagKey;\n });\n\n if (tag) {\n return `(${tag.value})`;\n }\n if (process) {\n return `(${process.value})`;\n }\n }\n }\n\n return '';\n };\n}\n\nexport default withTheme2(UnthemedSpanBarRow);\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n Divider: css`\n background: ${autoColor(theme, '#ddd')};\n `,\n\n DividerVertical: css`\n label: DividerVertical;\n display: inline-block;\n width: 1px;\n height: 0.9em;\n margin: 0 8px;\n vertical-align: middle;\n `,\n\n DividerHorizontal: css`\n label: DividerHorizontal;\n display: block;\n height: 1px;\n width: 100%;\n margin: 24px 0;\n clear: both;\n vertical-align: middle;\n position: relative;\n top: -0.06em;\n `,\n };\n};\n\ninterface Props {\n className?: string;\n style?: React.CSSProperties;\n type?: 'vertical' | 'horizontal';\n}\nexport function Divider({ className, style, type }: Props) {\n const styles = useStyles2(getStyles);\n return (\n <div\n style={style}\n className={cx(\n styles.Divider,\n type === 'horizontal' ? styles.DividerHorizontal : styles.DividerVertical,\n className\n )}\n />\n );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport React from 'react';\n\nimport { Field, LinkModel } from '@grafana/data';\n\nimport { TraceSpanReference } from '../types/trace';\n\ntype ReferenceLinkProps = {\n reference: TraceSpanReference;\n children: React.ReactNode;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel<Field>;\n};\n\nexport default function ReferenceLink(props: ReferenceLinkProps) {\n const { reference, children, createFocusSpanLink } = props;\n\n const link = createFocusSpanLink(reference.traceID, reference.spanID);\n\n return (\n <a\n href={link.href}\n target={link.target}\n rel=\"noopener noreferrer\"\n onClick={\n link.onClick\n ? (event) => {\n event.preventDefault();\n link.onClick!(event);\n }\n : undefined\n }\n >\n {children}\n </a>\n );\n}\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { Field, GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TraceSpanReference } from '../../types/trace';\nimport { uAlignIcon, ubMb1 } from '../../uberUtilityStyles';\nimport ReferenceLink from '../../url/ReferenceLink';\n\nimport AccordianKeyValues from './AccordianKeyValues';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n AccordianReferenceItem: css`\n border-bottom: 1px solid ${autoColor(theme, '#d8d8d8')};\n `,\n AccordianKeyValues: css`\n margin-left: 10px;\n `,\n AccordianReferences: css`\n label: AccordianReferences;\n border: 1px solid ${autoColor(theme, '#d8d8d8')};\n position: relative;\n margin-bottom: 0.25rem;\n `,\n AccordianReferencesHeader: css`\n label: AccordianReferencesHeader;\n background: ${autoColor(theme, '#e4e4e4')};\n color: inherit;\n display: block;\n padding: 0.25rem 0.5rem;\n &:hover {\n background: ${autoColor(theme, '#dadada')};\n }\n `,\n AccordianReferencesContent: css`\n label: AccordianReferencesContent;\n background: ${autoColor(theme, '#f0f0f0')};\n border-top: 1px solid ${autoColor(theme, '#d8d8d8')};\n padding: 0.5rem 0.5rem 0.25rem 0.5rem;\n `,\n AccordianReferencesFooter: css`\n label: AccordianReferencesFooter;\n color: ${autoColor(theme, '#999')};\n `,\n ReferencesList: css`\n background: #fff;\n border: 1px solid #ddd;\n margin-bottom: 0.7em;\n max-height: 450px;\n overflow: auto;\n `,\n list: css`\n width: 100%;\n list-style: none;\n padding: 0;\n margin: 0;\n background: #fff;\n `,\n itemContent: css`\n padding: 0.25rem 0.5rem;\n display: flex;\n width: 100%;\n justify-content: space-between;\n `,\n item: css`\n &:nth-child(2n) {\n background: #f5f5f5;\n }\n `,\n debugInfo: css`\n letter-spacing: 0.25px;\n margin: 0.5em 0 0;\n flex-wrap: wrap;\n display: flex;\n justify-content: flex-end;\n `,\n debugLabel: css`\n margin: 0 5px 0 5px;\n &::before {\n color: #bbb;\n content: attr(data-label);\n }\n `,\n serviceName: css`\n margin-right: 8px;\n `,\n title: css`\n display: flex;\n align-items: center;\n gap: 4px;\n `,\n };\n};\n\ntype AccordianReferencesProps = {\n data: TraceSpanReference[];\n highContrast?: boolean;\n interactive?: boolean;\n isOpen: boolean;\n openedItems?: Set<TraceSpanReference>;\n onItemToggle?: (reference: TraceSpanReference) => void;\n onToggle?: null | (() => void);\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel<Field>;\n};\n\ntype ReferenceItemProps = {\n data: TraceSpanReference[];\n interactive?: boolean;\n openedItems?: Set<TraceSpanReference>;\n onItemToggle?: (reference: TraceSpanReference) => void;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel<Field>;\n};\n\n// export for test\nexport function References(props: ReferenceItemProps) {\n const { data, createFocusSpanLink, openedItems, onItemToggle, interactive } = props;\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.AccordianReferencesContent}>\n {data.map((reference, i) => (\n <div className={i < data.length - 1 ? styles.AccordianReferenceItem : undefined} key={i}>\n <div className={styles.item} key={`${reference.spanID}`}>\n <ReferenceLink reference={reference} createFocusSpanLink={createFocusSpanLink}>\n <span className={styles.itemContent}>\n {reference.span ? (\n <span>\n <span className={cx('span-svc-name', styles.serviceName)}>\n {reference.span.process.serviceName}\n </span>\n <small className=\"endpoint-name\">{reference.span.operationName}</small>\n </span>\n ) : (\n <span className={cx('span-svc-name', styles.title)}>\n View Linked Span <Icon name=\"external-link-alt\" />\n </span>\n )}\n <small className={styles.debugInfo}>\n <span className={styles.debugLabel} data-label=\"TraceID:\">\n {reference.traceID}\n </span>\n <span className={styles.debugLabel} data-label=\"SpanID:\">\n {reference.spanID}\n </span>\n </small>\n </span>\n </ReferenceLink>\n </div>\n {!!reference.tags?.length && (\n <div className={styles.AccordianKeyValues}>\n <AccordianKeyValues\n className={i < data.length - 1 ? ubMb1 : null}\n data={reference.tags || []}\n highContrast\n interactive={interactive}\n isOpen={openedItems ? openedItems.has(reference) : false}\n label={'attributes'}\n linksGetter={null}\n onToggle={interactive && onItemToggle ? () => onItemToggle(reference) : null}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nconst AccordianReferences: React.FC<AccordianReferencesProps> = ({\n data,\n interactive = true,\n isOpen,\n onToggle,\n onItemToggle,\n openedItems,\n createFocusSpanLink,\n}) => {\n const isEmpty = !Array.isArray(data) || !data.length;\n let arrow: React.ReactNode | null = null;\n let HeaderComponent: 'span' | 'a' = 'span';\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? <IoIosArrowDown className={uAlignIcon} /> : <IoIosArrowRight className={uAlignIcon} />;\n HeaderComponent = 'a';\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.AccordianReferences}>\n <HeaderComponent className={styles.AccordianReferencesHeader} {...headerProps}>\n {arrow}\n <strong>\n <span>References</span>\n </strong>{' '}\n ({data.length})\n </HeaderComponent>\n {isOpen && (\n <References\n data={data}\n openedItems={openedItems}\n createFocusSpanLink={createFocusSpanLink}\n onItemToggle={onItemToggle}\n interactive={interactive}\n />\n )}\n </div>\n );\n};\n\nexport default React.memo(AccordianReferences);\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n TextList: css`\n max-height: 450px;\n overflow: auto;\n `,\n List: css`\n width: 100%;\n list-style: none;\n padding: 0;\n margin: 0;\n `,\n item: css`\n padding: 0.25rem 0.5rem;\n vertical-align: top;\n &:nth-child(2n) {\n background: #f5f5f5;\n }\n `,\n };\n};\n\ntype TextListProps = {\n data: string[];\n};\n\nexport default function TextList(props: TextListProps) {\n const { data } = props;\n const styles = useStyles2(getStyles);\n return (\n <div className={cx(styles.TextList)} data-testid=\"TextList\">\n <ul className={styles.List}>\n {data.map((row, i) => {\n return (\n // `i` is necessary in the key because row.key can repeat\n <li className={styles.item} key={`${i}`}>\n {row}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\nimport IoIosArrowDown from 'react-icons/lib/io/ios-arrow-down';\nimport IoIosArrowRight from 'react-icons/lib/io/ios-arrow-right';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { uAlignIcon } from '../../uberUtilityStyles';\n\nimport { getStyles as getAccordianKeyValuesStyles } from './AccordianKeyValues';\nimport TextList from './TextList';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css`\n cursor: pointer;\n overflow: hidden;\n padding: 0.25em 0.1em;\n text-overflow: ellipsis;\n white-space: nowrap;\n &:hover {\n background: ${autoColor(theme, '#e8e8e8')};\n }\n `,\n };\n};\n\ntype AccordianTextProps = {\n className?: string | TNil;\n headerClassName?: string | TNil;\n data: string[];\n highContrast?: boolean;\n interactive?: boolean;\n isOpen: boolean;\n label: React.ReactNode | string;\n onToggle?: null | (() => void);\n TextComponent?: React.ElementType<{ data: string[] }>;\n};\n\nfunction DefaultTextComponent({ data }: { data: string[] }) {\n return <TextList data={data} />;\n}\n\nexport default function AccordianText(props: AccordianTextProps) {\n const {\n className,\n data,\n headerClassName,\n interactive,\n isOpen,\n label,\n onToggle,\n TextComponent = DefaultTextComponent,\n } = props;\n const isEmpty = !Array.isArray(data) || !data.length;\n const accordianKeyValuesStyles = useStyles2(getAccordianKeyValuesStyles);\n const iconCls = cx(uAlignIcon, { [accordianKeyValuesStyles.emptyIcon]: isEmpty });\n let arrow: React.ReactNode | null = null;\n let headerProps: {} | null = null;\n if (interactive) {\n arrow = isOpen ? <IoIosArrowDown className={iconCls} /> : <IoIosArrowRight className={iconCls} />;\n headerProps = {\n 'aria-checked': isOpen,\n onClick: isEmpty ? null : onToggle,\n role: 'switch',\n };\n }\n const styles = useStyles2(getStyles);\n return (\n <div className={className || ''}>\n <div className={cx(styles.header, headerClassName)} {...headerProps} data-testid=\"AccordianText--header\">\n {arrow}\n <strong>{label}</strong> ({data.length})\n </div>\n {isOpen && <TextComponent data={data} />}\n </div>\n );\n}\n\nAccordianText.defaultProps = {\n className: null,\n highContrast: false,\n interactive: true,\n onToggle: null,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\nimport IoLink from 'react-icons/lib/io/link';\n\nimport { dateTimeFormat, GrafanaTheme2, LinkModel, TimeZone } from '@grafana/data';\nimport { DataLinkButton, TextArea, useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { Divider } from '../../common/Divider';\nimport LabeledList from '../../common/LabeledList';\nimport { SpanLinkFunc, TNil } from '../../types';\nimport { TraceKeyValuePair, TraceLink, TraceLog, TraceSpan, TraceSpanReference } from '../../types/trace';\nimport { uAlignIcon, ubM0, ubMb1, ubMy1, ubTxRightAlign } from '../../uberUtilityStyles';\nimport { TopOfViewRefType } from '../VirtualizedTraceView';\nimport { formatDuration } from '../utils';\n\nimport AccordianKeyValues from './AccordianKeyValues';\nimport AccordianLogs from './AccordianLogs';\nimport AccordianReferences from './AccordianReferences';\nimport AccordianText from './AccordianText';\nimport DetailState from './DetailState';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n header: css`\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 0 1rem;\n margin-bottom: 0.25rem;\n `,\n listWrapper: css`\n overflow: hidden;\n `,\n debugInfo: css`\n label: debugInfo;\n display: block;\n letter-spacing: 0.25px;\n margin: 0.5em 0 -0.75em;\n text-align: right;\n `,\n debugLabel: css`\n label: debugLabel;\n &::before {\n color: ${autoColor(theme, '#bbb')};\n content: attr(data-label);\n }\n `,\n debugValue: css`\n label: debugValue;\n background-color: inherit;\n border: none;\n color: ${autoColor(theme, '#888')};\n cursor: pointer;\n &:hover {\n color: ${autoColor(theme, '#333')};\n }\n `,\n AccordianWarnings: css`\n label: AccordianWarnings;\n background: ${autoColor(theme, '#fafafa')};\n border: 1px solid ${autoColor(theme, '#e4e4e4')};\n margin-bottom: 0.25rem;\n `,\n AccordianWarningsHeader: css`\n label: AccordianWarningsHeader;\n background: ${autoColor(theme, '#fff7e6')};\n padding: 0.25rem 0.5rem;\n &:hover {\n background: ${autoColor(theme, '#ffe7ba')};\n }\n `,\n AccordianWarningsHeaderOpen: css`\n label: AccordianWarningsHeaderOpen;\n border-bottom: 1px solid ${autoColor(theme, '#e8e8e8')};\n `,\n AccordianWarningsLabel: css`\n label: AccordianWarningsLabel;\n color: ${autoColor(theme, '#d36c08')};\n `,\n Textarea: css`\n word-break: break-all;\n white-space: pre;\n `,\n LinkIcon: css`\n font-size: 1.5em;\n `,\n };\n};\n\ntype SpanDetailProps = {\n detailState: DetailState;\n linksGetter: ((links: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil;\n logItemToggle: (spanID: string, log: TraceLog) => void;\n logsToggle: (spanID: string) => void;\n processToggle: (spanID: string) => void;\n span: TraceSpan;\n timeZone: TimeZone;\n tagsToggle: (spanID: string) => void;\n traceStartTime: number;\n warningsToggle: (spanID: string) => void;\n stackTracesToggle: (spanID: string) => void;\n referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n referencesToggle: (spanID: string) => void;\n createSpanLink?: SpanLinkFunc;\n focusedSpanId?: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfViewRefType?: TopOfViewRefType;\n};\n\nexport default function SpanDetail(props: SpanDetailProps) {\n const {\n detailState,\n linksGetter,\n logItemToggle,\n logsToggle,\n processToggle,\n span,\n tagsToggle,\n traceStartTime,\n warningsToggle,\n stackTracesToggle,\n referencesToggle,\n referenceItemToggle,\n createSpanLink,\n createFocusSpanLink,\n topOfViewRefType,\n } = props;\n const {\n isTagsOpen,\n isProcessOpen,\n logs: logsState,\n isWarningsOpen,\n references: referencesState,\n isStackTracesOpen,\n } = detailState;\n const {\n operationName,\n process,\n duration,\n relativeStartTime,\n startTime,\n traceID,\n spanID,\n logs,\n tags,\n warnings,\n references,\n stackTraces,\n } = span;\n const { timeZone } = props;\n const overviewItems = [\n {\n key: 'svc',\n label: 'Service:',\n value: process.serviceName,\n },\n {\n key: 'duration',\n label: 'Duration:',\n value: formatDuration(duration),\n },\n {\n key: 'start',\n label: 'Start Time:',\n value: formatDuration(relativeStartTime) + getAbsoluteTime(startTime, timeZone),\n },\n ...(span.childSpanCount > 0\n ? [\n {\n key: 'child_count',\n label: 'Child Count:',\n value: span.childSpanCount,\n },\n ]\n : []),\n ];\n const styles = useStyles2(getStyles);\n const links = createSpanLink?.(span);\n const focusSpanLink = createFocusSpanLink(traceID, spanID);\n\n return (\n <div data-testid=\"span-detail-component\">\n <div className={styles.header}>\n <h2 className={cx(ubM0)}>{operationName}</h2>\n <div className={styles.listWrapper}>\n <LabeledList className={ubTxRightAlign} divider={true} items={overviewItems} />\n </div>\n </div>\n {links?.logLinks?.[0] ? (\n <DataLinkButton\n link={{ ...links?.logLinks?.[0], title: 'Logs for this span' } as any}\n buttonProps={{ icon: 'gf-logs' }}\n />\n ) : null}\n <Divider className={ubMy1} type={'horizontal'} />\n <div>\n <div>\n <AccordianKeyValues\n data={tags}\n label=\"Attributes\"\n linksGetter={linksGetter}\n isOpen={isTagsOpen}\n onToggle={() => tagsToggle(spanID)}\n />\n {process.tags && (\n <AccordianKeyValues\n className={ubMb1}\n data={process.tags}\n label=\"Resource\"\n linksGetter={linksGetter}\n isOpen={isProcessOpen}\n onToggle={() => processToggle(spanID)}\n />\n )}\n </div>\n {logs && logs.length > 0 && (\n <AccordianLogs\n linksGetter={linksGetter}\n logs={logs}\n isOpen={logsState.isOpen}\n openedItems={logsState.openedItems}\n onToggle={() => logsToggle(spanID)}\n onItemToggle={(logItem) => logItemToggle(spanID, logItem)}\n timestamp={traceStartTime}\n />\n )}\n {warnings && warnings.length > 0 && (\n <AccordianText\n className={styles.AccordianWarnings}\n headerClassName={styles.AccordianWarningsHeader}\n label={<span className={styles.AccordianWarningsLabel}>Warnings</span>}\n data={warnings}\n isOpen={isWarningsOpen}\n onToggle={() => warningsToggle(spanID)}\n />\n )}\n {stackTraces && stackTraces.length && (\n <AccordianText\n label=\"Stack trace\"\n data={stackTraces}\n isOpen={isStackTracesOpen}\n TextComponent={(textComponentProps) => {\n let text;\n if (textComponentProps.data?.length > 1) {\n text = textComponentProps.data\n .map((stackTrace, index) => `StackTrace ${index + 1}:\\n${stackTrace}`)\n .join('\\n');\n } else {\n text = textComponentProps.data?.[0];\n }\n return (\n <TextArea\n className={styles.Textarea}\n style={{ cursor: 'unset' }}\n readOnly\n cols={10}\n rows={10}\n value={text}\n />\n );\n }}\n onToggle={() => stackTracesToggle(spanID)}\n />\n )}\n {references && references.length > 0 && (references.length > 1 || references[0].refType !== 'CHILD_OF') && (\n <AccordianReferences\n data={references}\n isOpen={referencesState.isOpen}\n openedItems={referencesState.openedItems}\n onToggle={() => referencesToggle(spanID)}\n onItemToggle={(reference) => referenceItemToggle(spanID, reference)}\n createFocusSpanLink={createFocusSpanLink}\n />\n )}\n {topOfViewRefType === TopOfViewRefType.Explore && (\n <small className={styles.debugInfo}>\n <a\n {...focusSpanLink}\n onClick={(e) => {\n // click handling logic copied from react router:\n // https://github.com/remix-run/react-router/blob/997b4d67e506d39ac6571cb369d6d2d6b3dda557/packages/react-router-dom/index.tsx#L392-L394s\n if (\n focusSpanLink.onClick &&\n e.button === 0 && // Ignore everything but left clicks\n (!e.currentTarget.target || e.currentTarget.target === '_self') && // Let browser handle \"target=_blank\" etc.\n !(e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) // Ignore clicks with modifier keys\n ) {\n e.preventDefault();\n focusSpanLink.onClick(e);\n }\n }}\n >\n <IoLink className={cx(uAlignIcon, styles.LinkIcon)}></IoLink>\n </a>\n <span className={styles.debugLabel} data-label=\"SpanID:\" /> {spanID}\n </small>\n )}\n </div>\n </div>\n );\n}\n\nexport const getAbsoluteTime = (startTime: number, timeZone: TimeZone) => {\n const dateStr = dateTimeFormat(startTime / 1000, { timeZone, defaultWithMS: true });\n const match = dateStr.split(' ');\n const absoluteTime = match[1] ? match[1] : dateStr;\n return ` (${absoluteTime})`;\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, LinkModel, TimeZone } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\nimport { SpanLinkFunc } from '../types';\nimport { TraceLog, TraceSpan, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\n\nimport SpanDetail from './SpanDetail';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanTreeOffset from './SpanTreeOffset';\nimport TimelineRow from './TimelineRow';\nimport { TopOfViewRefType } from './VirtualizedTraceView';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n expandedAccent: css`\n cursor: pointer;\n height: 100%;\n overflow: hidden;\n position: absolute;\n width: 100%;\n &::before {\n border-left: 4px solid;\n pointer-events: none;\n width: 1000px;\n }\n &::after {\n border-right: 1000px solid;\n border-color: inherit;\n cursor: pointer;\n opacity: 0.2;\n }\n\n /* border-color inherit must come AFTER other border declarations for accent */\n &::before,\n &::after {\n border-color: inherit;\n content: ' ';\n position: absolute;\n height: 100%;\n }\n\n &:hover::after {\n opacity: 0.35;\n }\n `,\n infoWrapper: css`\n label: infoWrapper;\n border: 1px solid ${autoColor(theme, '#d3d3d3')};\n border-top: 3px solid;\n padding: 0.75rem;\n `,\n };\n});\n\ntype SpanDetailRowProps = {\n color: string;\n columnDivision: number;\n detailState: DetailState;\n onDetailToggled: (spanID: string) => void;\n linksGetter: (span: TraceSpan, links: TraceKeyValuePair[], index: number) => TraceLink[];\n logItemToggle: (spanID: string, log: TraceLog) => void;\n logsToggle: (spanID: string) => void;\n processToggle: (spanID: string) => void;\n referenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n referencesToggle: (spanID: string) => void;\n warningsToggle: (spanID: string) => void;\n stackTracesToggle: (spanID: string) => void;\n span: TraceSpan;\n timeZone: TimeZone;\n tagsToggle: (spanID: string) => void;\n traceStartTime: number;\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n focusedSpanId?: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfViewRefType?: TopOfViewRefType;\n};\n\nexport class UnthemedSpanDetailRow extends React.PureComponent<SpanDetailRowProps> {\n _detailToggle = () => {\n this.props.onDetailToggled(this.props.span.spanID);\n };\n\n _linksGetter = (items: TraceKeyValuePair[], itemIndex: number) => {\n const { linksGetter, span } = this.props;\n return linksGetter(span, items, itemIndex);\n };\n\n render() {\n const {\n color,\n columnDivision,\n detailState,\n logItemToggle,\n logsToggle,\n processToggle,\n referenceItemToggle,\n referencesToggle,\n warningsToggle,\n stackTracesToggle,\n span,\n timeZone,\n tagsToggle,\n traceStartTime,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n theme,\n createSpanLink,\n focusedSpanId,\n createFocusSpanLink,\n topOfViewRefType,\n } = this.props;\n const styles = getStyles(theme);\n return (\n <TimelineRow>\n <TimelineRow.Cell width={columnDivision} style={{ overflow: 'hidden' }}>\n <SpanTreeOffset\n span={span}\n showChildrenIcon={false}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n />\n <span>\n <span\n className={styles.expandedAccent}\n aria-checked=\"true\"\n onClick={this._detailToggle}\n role=\"switch\"\n style={{ borderColor: color }}\n data-testid=\"detail-row-expanded-accent\"\n />\n </span>\n </TimelineRow.Cell>\n <TimelineRow.Cell width={1 - columnDivision}>\n <div className={styles.infoWrapper} style={{ borderTopColor: color }}>\n <SpanDetail\n detailState={detailState}\n linksGetter={this._linksGetter}\n logItemToggle={logItemToggle}\n logsToggle={logsToggle}\n processToggle={processToggle}\n referenceItemToggle={referenceItemToggle}\n referencesToggle={referencesToggle}\n warningsToggle={warningsToggle}\n stackTracesToggle={stackTracesToggle}\n span={span}\n timeZone={timeZone}\n tagsToggle={tagsToggle}\n traceStartTime={traceStartTime}\n createSpanLink={createSpanLink}\n focusedSpanId={focusedSpanId}\n createFocusSpanLink={createFocusSpanLink}\n topOfViewRefType={topOfViewRefType}\n />\n </div>\n </TimelineRow.Cell>\n </TimelineRow>\n );\n }\n}\n\nexport default withTheme2(UnthemedSpanDetailRow);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport memoizeOne from 'memoize-one';\nimport * as React from 'react';\nimport { createRef, RefObject } from 'react';\n\nimport { GrafanaTheme2, LinkModel, TimeZone } from '@grafana/data';\nimport { stylesFactory, withTheme2, ToolbarButton } from '@grafana/ui';\n\nimport { Accessors } from '../ScrollManager';\nimport { PEER_SERVICE } from '../constants/tag-keys';\nimport { SpanBarOptions, SpanLinkFunc, TNil } from '../types';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { TraceLog, TraceSpan, Trace, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\nimport { getColorByKey } from '../utils/color-generator';\n\nimport ListView from './ListView';\nimport SpanBarRow from './SpanBarRow';\nimport DetailState from './SpanDetail/DetailState';\nimport SpanDetailRow from './SpanDetailRow';\nimport {\n createViewedBoundsFunc,\n findServerChildSpan,\n isErrorSpan,\n isKindClient,\n spanContainsErredSpan,\n ViewedBoundsFunctionType,\n} from './utils';\n\ntype TExtractUiFindFromStateReturn = {\n uiFind: string | undefined;\n};\n\nconst getStyles = stylesFactory((props: TVirtualizedTraceViewOwnProps) => {\n const { topOfViewRefType } = props;\n const position = topOfViewRefType === TopOfViewRefType.Explore ? 'fixed' : 'absolute';\n\n return {\n rowsWrapper: css`\n width: 100%;\n `,\n row: css`\n width: 100%;\n `,\n scrollToTopButton: css`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n width: 40px;\n height: 40px;\n position: ${position};\n bottom: 30px;\n right: 30px;\n z-index: 1;\n `,\n };\n});\n\ntype RowState = {\n isDetail: boolean;\n span: TraceSpan;\n spanIndex: number;\n};\n\nexport enum TopOfViewRefType {\n Explore = 'Explore',\n Panel = 'Panel',\n}\n\ntype TVirtualizedTraceViewOwnProps = {\n currentViewRangeTime: [number, number];\n timeZone: TimeZone;\n findMatchesIDs: Set<string> | TNil;\n scrollToFirstVisibleSpan: () => void;\n registerAccessors: (accesors: Accessors) => void;\n trace: Trace;\n spanBarOptions: SpanBarOptions | undefined;\n linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[];\n childrenToggle: (spanID: string) => void;\n clearShouldScrollToFirstUiFindMatch: () => void;\n detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n detailLogsToggle: (spanID: string) => void;\n detailWarningsToggle: (spanID: string) => void;\n detailStackTracesToggle: (spanID: string) => void;\n detailReferencesToggle: (spanID: string) => void;\n detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n detailProcessToggle: (spanID: string) => void;\n detailTagsToggle: (spanID: string) => void;\n detailToggle: (spanID: string) => void;\n setSpanNameColumnWidth: (width: number) => void;\n setTrace: (trace: Trace | TNil, uiFind: string | TNil) => void;\n hoverIndentGuideIds: Set<string>;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n scrollElement?: Element;\n focusedSpanId?: string;\n focusedSpanIdForSearch: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfViewRef?: RefObject<HTMLDivElement>;\n topOfViewRefType?: TopOfViewRefType;\n};\n\ntype VirtualizedTraceViewProps = TVirtualizedTraceViewOwnProps & TExtractUiFindFromStateReturn & TTraceTimeline;\n\n// export for tests\nexport const DEFAULT_HEIGHTS = {\n bar: 28,\n detail: 161,\n detailWithLogs: 197,\n};\n\nconst NUM_TICKS = 5;\n\nfunction generateRowStates(\n spans: TraceSpan[] | TNil,\n childrenHiddenIDs: Set<string>,\n detailStates: Map<string, DetailState | TNil>\n): RowState[] {\n if (!spans) {\n return [];\n }\n let collapseDepth = null;\n const rowStates = [];\n for (let i = 0; i < spans.length; i++) {\n const span = spans[i];\n const { spanID, depth } = span;\n let hidden = false;\n if (collapseDepth != null) {\n if (depth >= collapseDepth) {\n hidden = true;\n } else {\n collapseDepth = null;\n }\n }\n if (hidden) {\n continue;\n }\n if (childrenHiddenIDs.has(spanID)) {\n collapseDepth = depth + 1;\n }\n rowStates.push({\n span,\n isDetail: false,\n spanIndex: i,\n });\n if (detailStates.has(spanID)) {\n rowStates.push({\n span,\n isDetail: true,\n spanIndex: i,\n });\n }\n }\n return rowStates;\n}\n\nfunction getClipping(currentViewRange: [number, number]) {\n const [zoomStart, zoomEnd] = currentViewRange;\n return {\n left: zoomStart > 0,\n right: zoomEnd < 1,\n };\n}\n\nfunction generateRowStatesFromTrace(\n trace: Trace | TNil,\n childrenHiddenIDs: Set<string>,\n detailStates: Map<string, DetailState | TNil>\n): RowState[] {\n return trace ? generateRowStates(trace.spans, childrenHiddenIDs, detailStates) : [];\n}\n\nconst memoizedGenerateRowStates = memoizeOne(generateRowStatesFromTrace);\nconst memoizedViewBoundsFunc = memoizeOne(createViewedBoundsFunc, isEqual);\nconst memoizedGetClipping = memoizeOne(getClipping, isEqual);\n\n// export from tests\nexport class UnthemedVirtualizedTraceView extends React.Component<VirtualizedTraceViewProps> {\n listView: ListView | TNil;\n topTraceViewRef = createRef<HTMLDivElement>();\n\n constructor(props: VirtualizedTraceViewProps) {\n super(props);\n const { setTrace, trace, uiFind } = props;\n setTrace(trace, uiFind);\n }\n\n componentDidMount() {\n this.scrollToSpan(this.props.focusedSpanId);\n }\n\n shouldComponentUpdate(nextProps: VirtualizedTraceViewProps) {\n // If any prop updates, VirtualizedTraceViewImpl should update.\n const nextPropKeys = Object.keys(nextProps) as Array<keyof VirtualizedTraceViewProps>;\n for (let i = 0; i < nextPropKeys.length; i += 1) {\n if (nextProps[nextPropKeys[i]] !== this.props[nextPropKeys[i]]) {\n // Unless the only change was props.shouldScrollToFirstUiFindMatch changing to false.\n if (nextPropKeys[i] === 'shouldScrollToFirstUiFindMatch') {\n if (nextProps[nextPropKeys[i]]) {\n return true;\n }\n } else {\n return true;\n }\n }\n }\n return false;\n }\n\n componentDidUpdate(prevProps: Readonly<VirtualizedTraceViewProps>) {\n const { registerAccessors, trace } = prevProps;\n const {\n shouldScrollToFirstUiFindMatch,\n clearShouldScrollToFirstUiFindMatch,\n scrollToFirstVisibleSpan,\n registerAccessors: nextRegisterAccessors,\n setTrace,\n trace: nextTrace,\n uiFind,\n focusedSpanId,\n focusedSpanIdForSearch,\n } = this.props;\n\n if (trace !== nextTrace) {\n setTrace(nextTrace, uiFind);\n }\n\n if (this.listView && registerAccessors !== nextRegisterAccessors) {\n nextRegisterAccessors(this.getAccessors());\n }\n\n if (shouldScrollToFirstUiFindMatch) {\n scrollToFirstVisibleSpan();\n clearShouldScrollToFirstUiFindMatch();\n }\n\n if (focusedSpanId !== prevProps.focusedSpanId) {\n this.scrollToSpan(focusedSpanId);\n }\n\n if (focusedSpanIdForSearch !== prevProps.focusedSpanIdForSearch) {\n this.scrollToSpan(focusedSpanIdForSearch);\n }\n }\n\n getRowStates(): RowState[] {\n const { childrenHiddenIDs, detailStates, trace } = this.props;\n return memoizedGenerateRowStates(trace, childrenHiddenIDs, detailStates);\n }\n\n getClipping(): { left: boolean; right: boolean } {\n const { currentViewRangeTime } = this.props;\n return memoizedGetClipping(currentViewRangeTime);\n }\n\n getViewedBounds(): ViewedBoundsFunctionType {\n const { currentViewRangeTime, trace } = this.props;\n const [zoomStart, zoomEnd] = currentViewRangeTime;\n\n return memoizedViewBoundsFunc({\n min: trace.startTime,\n max: trace.endTime,\n viewStart: zoomStart,\n viewEnd: zoomEnd,\n });\n }\n\n getAccessors() {\n const lv = this.listView;\n if (!lv) {\n throw new Error('ListView unavailable');\n }\n return {\n getViewRange: this.getViewRange,\n getSearchedSpanIDs: this.getSearchedSpanIDs,\n getCollapsedChildren: this.getCollapsedChildren,\n getViewHeight: lv.getViewHeight,\n getBottomRowIndexVisible: lv.getBottomVisibleIndex,\n getTopRowIndexVisible: lv.getTopVisibleIndex,\n getRowPosition: lv.getRowPosition,\n mapRowIndexToSpanIndex: this.mapRowIndexToSpanIndex,\n mapSpanIndexToRowIndex: this.mapSpanIndexToRowIndex,\n };\n }\n\n getViewRange = () => this.props.currentViewRangeTime;\n\n getSearchedSpanIDs = () => this.props.findMatchesIDs;\n\n getCollapsedChildren = () => this.props.childrenHiddenIDs;\n\n mapRowIndexToSpanIndex = (index: number) => this.getRowStates()[index].spanIndex;\n\n mapSpanIndexToRowIndex = (index: number) => {\n const max = this.getRowStates().length;\n for (let i = 0; i < max; i++) {\n const { spanIndex } = this.getRowStates()[i];\n if (spanIndex === index) {\n return i;\n }\n }\n throw new Error(`unable to find row for span index: ${index}`);\n };\n\n setListView = (listView: ListView | TNil) => {\n const isChanged = this.listView !== listView;\n this.listView = listView;\n if (listView && isChanged) {\n this.props.registerAccessors(this.getAccessors());\n }\n };\n\n // use long form syntax to avert flow error\n // https://github.com/facebook/flow/issues/3076#issuecomment-290944051\n getKeyFromIndex = (index: number) => {\n const { isDetail, span } = this.getRowStates()[index];\n return `${span.traceID}--${span.spanID}--${isDetail ? 'detail' : 'bar'}`;\n };\n\n getIndexFromKey = (key: string) => {\n const parts = key.split('--');\n const _traceID = parts[0];\n const _spanID = parts[1];\n const _isDetail = parts[2] === 'detail';\n const max = this.getRowStates().length;\n for (let i = 0; i < max; i++) {\n const { span, isDetail } = this.getRowStates()[i];\n if (span.spanID === _spanID && span.traceID === _traceID && isDetail === _isDetail) {\n return i;\n }\n }\n return -1;\n };\n\n getRowHeight = (index: number) => {\n const { span, isDetail } = this.getRowStates()[index];\n if (!isDetail) {\n return DEFAULT_HEIGHTS.bar;\n }\n if (Array.isArray(span.logs) && span.logs.length) {\n return DEFAULT_HEIGHTS.detailWithLogs;\n }\n return DEFAULT_HEIGHTS.detail;\n };\n\n renderRow = (key: string, style: React.CSSProperties, index: number, attrs: {}) => {\n const { isDetail, span, spanIndex } = this.getRowStates()[index];\n return isDetail\n ? this.renderSpanDetailRow(span, key, style, attrs)\n : this.renderSpanBarRow(span, spanIndex, key, style, attrs);\n };\n\n scrollToSpan = (spanID?: string) => {\n if (spanID == null) {\n return;\n }\n const i = this.getRowStates().findIndex((row) => row.span.spanID === spanID);\n if (i >= 0) {\n this.listView?.scrollToIndex(i);\n }\n };\n\n renderSpanBarRow(span: TraceSpan, spanIndex: number, key: string, style: React.CSSProperties, attrs: {}) {\n const { spanID } = span;\n const { serviceName } = span.process;\n const {\n childrenHiddenIDs,\n childrenToggle,\n detailStates,\n detailToggle,\n findMatchesIDs,\n spanNameColumnWidth,\n trace,\n spanBarOptions,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n theme,\n createSpanLink,\n focusedSpanId,\n focusedSpanIdForSearch,\n } = this.props;\n // to avert flow error\n if (!trace) {\n return null;\n }\n const color = getColorByKey(serviceName, theme);\n const isCollapsed = childrenHiddenIDs.has(spanID);\n const isDetailExpanded = detailStates.has(spanID);\n const isMatchingFilter = findMatchesIDs ? findMatchesIDs.has(spanID) : false;\n const isFocused = spanID === focusedSpanId || spanID === focusedSpanIdForSearch;\n const showErrorIcon = isErrorSpan(span) || (isCollapsed && spanContainsErredSpan(trace.spans, spanIndex));\n\n // Check for direct child \"server\" span if the span is a \"client\" span.\n let rpc = null;\n if (isCollapsed) {\n const rpcSpan = findServerChildSpan(trace.spans.slice(spanIndex));\n if (rpcSpan) {\n const rpcViewBounds = this.getViewedBounds()(rpcSpan.startTime, rpcSpan.startTime + rpcSpan.duration);\n rpc = {\n color: getColorByKey(rpcSpan.process.serviceName, theme),\n operationName: rpcSpan.operationName,\n serviceName: rpcSpan.process.serviceName,\n viewEnd: rpcViewBounds.end,\n viewStart: rpcViewBounds.start,\n };\n }\n }\n\n const peerServiceKV = span.tags.find((kv) => kv.key === PEER_SERVICE);\n // Leaf, kind == client and has peer.service.tag, is likely a client span that does a request\n // to an uninstrumented/external service\n let noInstrumentedServer = null;\n if (!span.hasChildren && peerServiceKV && isKindClient(span)) {\n noInstrumentedServer = {\n serviceName: peerServiceKV.value,\n color: getColorByKey(peerServiceKV.value, theme),\n };\n }\n\n const styles = getStyles(this.props);\n return (\n <div className={styles.row} key={key} style={style} {...attrs}>\n <SpanBarRow\n clippingLeft={this.getClipping().left}\n clippingRight={this.getClipping().right}\n color={color}\n spanBarOptions={spanBarOptions}\n columnDivision={spanNameColumnWidth}\n isChildrenExpanded={!isCollapsed}\n isDetailExpanded={isDetailExpanded}\n isMatchingFilter={isMatchingFilter}\n isFocused={isFocused}\n numTicks={NUM_TICKS}\n onDetailToggled={detailToggle}\n onChildrenToggled={childrenToggle}\n rpc={rpc}\n noInstrumentedServer={noInstrumentedServer}\n showErrorIcon={showErrorIcon}\n getViewedBounds={this.getViewedBounds()}\n traceStartTime={trace.startTime}\n span={span}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n createSpanLink={createSpanLink}\n />\n </div>\n );\n }\n\n renderSpanDetailRow(span: TraceSpan, key: string, style: React.CSSProperties, attrs: {}) {\n const { spanID } = span;\n const { serviceName } = span.process;\n const {\n detailLogItemToggle,\n detailLogsToggle,\n detailProcessToggle,\n detailReferencesToggle,\n detailReferenceItemToggle,\n detailWarningsToggle,\n detailStackTracesToggle,\n detailStates,\n detailTagsToggle,\n detailToggle,\n spanNameColumnWidth,\n trace,\n timeZone,\n hoverIndentGuideIds,\n addHoverIndentGuideId,\n removeHoverIndentGuideId,\n linksGetter,\n theme,\n createSpanLink,\n focusedSpanId,\n createFocusSpanLink,\n topOfViewRefType,\n } = this.props;\n const detailState = detailStates.get(spanID);\n if (!trace || !detailState) {\n return null;\n }\n const color = getColorByKey(serviceName, theme);\n const styles = getStyles(this.props);\n return (\n <div className={styles.row} key={key} style={{ ...style, zIndex: 1 }} {...attrs}>\n <SpanDetailRow\n color={color}\n columnDivision={spanNameColumnWidth}\n onDetailToggled={detailToggle}\n detailState={detailState}\n linksGetter={linksGetter}\n logItemToggle={detailLogItemToggle}\n logsToggle={detailLogsToggle}\n processToggle={detailProcessToggle}\n referenceItemToggle={detailReferenceItemToggle}\n referencesToggle={detailReferencesToggle}\n warningsToggle={detailWarningsToggle}\n stackTracesToggle={detailStackTracesToggle}\n span={span}\n timeZone={timeZone}\n tagsToggle={detailTagsToggle}\n traceStartTime={trace.startTime}\n hoverIndentGuideIds={hoverIndentGuideIds}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n createSpanLink={createSpanLink}\n focusedSpanId={focusedSpanId}\n createFocusSpanLink={createFocusSpanLink}\n topOfViewRefType={topOfViewRefType}\n />\n </div>\n );\n }\n\n scrollToTop = () => {\n const { topOfViewRef } = this.props;\n topOfViewRef?.current?.scrollIntoView({ behavior: 'smooth' });\n };\n\n render() {\n const styles = getStyles(this.props);\n const { scrollElement } = this.props;\n return (\n <>\n <ListView\n ref={this.setListView}\n dataLength={this.getRowStates().length}\n itemHeightGetter={this.getRowHeight}\n itemRenderer={this.renderRow}\n viewBuffer={50}\n viewBufferMin={50}\n itemsWrapperClassName={styles.rowsWrapper}\n getKeyFromIndex={this.getKeyFromIndex}\n getIndexFromKey={this.getIndexFromKey}\n windowScroller={false}\n scrollElement={scrollElement}\n />\n <ToolbarButton\n className={styles.scrollToTopButton}\n onClick={this.scrollToTop}\n title=\"Scroll to top\"\n icon=\"arrow-up\"\n ></ToolbarButton>\n </>\n );\n }\n}\n\nexport default withTheme2(UnthemedVirtualizedTraceView);\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const HTTP_METHOD = 'http.method' as 'http.method';\nexport const PEER_SERVICE = 'peer.service' as 'peer.service';\nexport const SPAN_KIND = 'span.kind' as 'span.kind';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../types/trace';\n\nexport type ViewedBoundsFunctionType = (start: number, end: number) => { start: number; end: number };\n/**\n * Given a range (`min`, `max`) and factoring in a zoom (`viewStart`, `viewEnd`)\n * a function is created that will find the position of a sub-range (`start`, `end`).\n * The calling the generated method will return the result as a `{ start, end }`\n * object with values ranging in [0, 1].\n *\n * @param {number} min The start of the outer range.\n * @param {number} max The end of the outer range.\n * @param {number} viewStart The start of the zoom, on a range of [0, 1],\n * relative to the `min`, `max`.\n * @param {number} viewEnd The end of the zoom, on a range of [0, 1],\n * relative to the `min`, `max`.\n * @returns {(number, number) => Object} Created view bounds function\n */\nexport function createViewedBoundsFunc(viewRange: { min: number; max: number; viewStart: number; viewEnd: number }) {\n const { min, max, viewStart, viewEnd } = viewRange;\n const duration = max - min;\n const viewMin = min + viewStart * duration;\n const viewMax = max - (1 - viewEnd) * duration;\n const viewWindow = viewMax - viewMin;\n\n /**\n * View bounds function\n * @param {number} start The start of the sub-range.\n * @param {number} end The end of the sub-range.\n * @returns {Object} The resultant range.\n */\n return (start: number, end: number) => ({\n start: (start - viewMin) / viewWindow,\n end: (end - viewMin) / viewWindow,\n });\n}\n\n/**\n * Returns `true` if the `span` has a tag matching `key` = `value`.\n *\n * @param {string} key The tag key to match on.\n * @param {any} value The tag value to match.\n * @param {{tags}} span An object with a `tags` property of { key, value }\n * items.\n * @returns {boolean} True if a match was found.\n */\nexport function spanHasTag(key: string, value: any, span: TraceSpan) {\n if (!Array.isArray(span.tags) || !span.tags.length) {\n return false;\n }\n return span.tags.some((tag) => tag.key === key && tag.value === value);\n}\n\nexport const isClientSpan = spanHasTag.bind(null, 'span.kind', 'client');\nexport const isServerSpan = spanHasTag.bind(null, 'span.kind', 'server');\n\nconst isErrorBool = spanHasTag.bind(null, 'error', true);\nconst isErrorStr = spanHasTag.bind(null, 'error', 'true');\nexport const isErrorSpan = (span: TraceSpan) => isErrorBool(span) || isErrorStr(span);\n\n/**\n * Returns `true` if at least one of the descendants of the `parentSpanIndex`\n * span contains an error tag.\n *\n * @param {TraceSpan[]} spans The spans for a trace - should be\n * sorted with children following parents.\n * @param {number} parentSpanIndex The index of the parent span - only\n * subsequent spans with depth less than\n * the parent span will be checked.\n * @returns {boolean} Returns `true` if a descendant contains an error tag.\n */\nexport function spanContainsErredSpan(spans: TraceSpan[], parentSpanIndex: number) {\n const { depth } = spans[parentSpanIndex];\n let i = parentSpanIndex + 1;\n for (; i < spans.length && spans[i].depth > depth; i++) {\n if (isErrorSpan(spans[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Expects the first span to be the parent span.\n */\nexport function findServerChildSpan(spans: TraceSpan[]) {\n if (spans.length <= 1 || !isClientSpan(spans[0])) {\n return false;\n }\n const span = spans[0];\n const spanChildDepth = span.depth + 1;\n let i = 1;\n while (i < spans.length && spans[i].depth === spanChildDepth) {\n if (isServerSpan(spans[i])) {\n return spans[i];\n }\n i++;\n }\n return null;\n}\n\nexport const isKindClient = (span: TraceSpan): Boolean =>\n span.tags.some(({ key, value }) => key === 'span.kind' && value === 'client');\n\nexport { formatDuration } from '../utils/date';\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../Theme';\n\nconst getStyles = (divider: boolean) => (theme: GrafanaTheme2) => {\n return {\n LabeledList: css`\n label: LabeledList;\n list-style: none;\n margin: 0;\n padding: 0;\n ${divider === true &&\n `\n margin-right: -8px;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n `}\n `,\n LabeledListItem: css`\n label: LabeledListItem;\n display: inline-block;\n ${divider === true &&\n `\n border-right: 1px solid ${autoColor(theme, '#ddd')};\n padding: 0 8px;\n `}\n `,\n LabeledListLabel: css`\n label: LabeledListLabel;\n color: ${theme.isLight ? '#999' : '#666'};\n margin-right: 0.25rem;\n `,\n LabeledListValue: css`\n label: LabeledListValue;\n margin-right: 0.55rem;\n `,\n };\n};\n\ntype LabeledListProps = {\n className?: string;\n divider?: boolean;\n items: Array<{ key: string; label: React.ReactNode; value: React.ReactNode }>;\n};\n\nexport default function LabeledList(props: LabeledListProps) {\n const { className, divider = false, items } = props;\n const styles = useStyles2(getStyles(divider));\n\n return (\n <ul className={cx(styles.LabeledList, className)}>\n {items.map(({ key, label, value }) => {\n return (\n <li className={styles.LabeledListItem} key={`${key}`}>\n <span className={styles.LabeledListLabel}>{label}</span>\n <strong className={styles.LabeledListValue}>{value}</strong>\n </li>\n );\n })}\n </ul>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst keyboardMappings: Record<string, { binding: string | string[]; label: string }> = {\n scrollPageDown: { binding: 's', label: 'Scroll down' },\n scrollPageUp: { binding: 'w', label: 'Scroll up' },\n scrollToNextVisibleSpan: { binding: 'f', label: 'Scroll to the next visible span' },\n scrollToPrevVisibleSpan: { binding: 'b', label: 'Scroll to the previous visible span' },\n panLeft: { binding: ['a', 'left'], label: 'Pan left' },\n panLeftFast: { binding: ['shift+a', 'shift+left'], label: 'Pan left — Large' },\n panRight: { binding: ['d', 'right'], label: 'Pan right' },\n panRightFast: { binding: ['shift+d', 'shift+right'], label: 'Pan right — Large' },\n zoomIn: { binding: 'up', label: 'Zoom in' },\n zoomInFast: { binding: 'shift+up', label: 'Zoom in — Large' },\n zoomOut: { binding: 'down', label: 'Zoom out' },\n zoomOutFast: { binding: 'shift+down', label: 'Zoom out — Large' },\n collapseAll: { binding: ']', label: 'Collapse All' },\n expandAll: { binding: '[', label: 'Expand All' },\n collapseOne: { binding: 'p', label: 'Collapse One Level' },\n expandOne: { binding: 'o', label: 'Expand One Level' },\n searchSpans: { binding: 'ctrl+b', label: 'Search Spans' },\n clearSearch: { binding: 'escape', label: 'Clear Search' },\n};\n\nexport default keyboardMappings;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport Combokeys from 'combokeys';\nimport * as React from 'react';\n\nimport keyboardMappings from './keyboard-mappings';\n\nexport type CombokeysHandler =\n | (() => void)\n | ((event: React.KeyboardEvent<any>) => void)\n | ((event: React.KeyboardEvent<any>, s: string) => void);\n\nexport type ShortcutCallbacks = {\n [name: string]: CombokeysHandler;\n};\n\nlet instance: Combokeys | undefined;\n\nfunction getInstance(): Combokeys {\n if (instance) {\n return instance;\n }\n const local = new Combokeys(document.body);\n instance = local;\n return local;\n}\n\nexport function merge(callbacks: ShortcutCallbacks) {\n const inst = getInstance();\n Object.keys(callbacks).forEach((name) => {\n const keysHandler = callbacks[name];\n if (keysHandler) {\n inst.bind(keyboardMappings[name].binding, keysHandler);\n }\n });\n}\n\nexport function reset() {\n const combokeys = getInstance();\n combokeys.reset();\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { IconButton, useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n TimelineCollapser: css`\n align-items: center;\n display: flex;\n flex: none;\n justify-content: center;\n margin-right: 0.5rem;\n `,\n };\n};\n\ntype CollapserProps = {\n onCollapseAll: () => void;\n onCollapseOne: () => void;\n onExpandOne: () => void;\n onExpandAll: () => void;\n};\n\nexport function TimelineCollapser(props: CollapserProps) {\n const { onExpandAll, onExpandOne, onCollapseAll, onCollapseOne } = props;\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.TimelineCollapser} data-testid=\"TimelineCollapser\">\n <IconButton tooltip=\"Expand +1\" size=\"xl\" tooltipPlacement=\"top\" name=\"angle-down\" onClick={onExpandOne} />\n <IconButton tooltip=\"Collapse +1\" size=\"xl\" tooltipPlacement=\"top\" name=\"angle-right\" onClick={onCollapseOne} />\n <IconButton\n tooltip=\"Expand All\"\n size=\"xl\"\n tooltipPlacement=\"top\"\n name=\"angle-double-down\"\n onClick={onExpandAll}\n />\n <IconButton\n tooltip=\"Collapse All\"\n size=\"xl\"\n tooltipPlacement=\"top\"\n name=\"angle-double-right\"\n onClick={onCollapseAll}\n />\n </div>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// // export default {\n// const updateTypes = {\n// DRAG_END: 'DRAG_END',\n// DRAG_MOVE: 'DRAG_MOVE',\n// DRAG_START: 'DRAG_START',\n// MOUSE_ENTER: 'MOUSE_ENTER',\n// MOUSE_LEAVE: 'MOUSE_LEAVE',\n// MOUSE_MOVE: 'MOUSE_MOVE',\n// };\n\n// const typeUpdateTypes = updateTypes as { [K in keyof typeof updateTypes]: K };\n\nenum EUpdateTypes {\n DragEnd = 'DragEnd',\n DragMove = 'DragMove',\n DragStart = 'DragStart',\n MouseEnter = 'MouseEnter',\n MouseLeave = 'MouseLeave',\n MouseMove = 'MouseMove',\n}\n\nexport default EUpdateTypes;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport { TNil } from '../../types';\n\nimport EUpdateTypes from './EUpdateTypes';\nimport { DraggableBounds, DraggingUpdate } from './types';\n\nconst LEFT_MOUSE_BUTTON = 0;\n\ntype DraggableManagerOptions = {\n getBounds: (tag: string | TNil) => DraggableBounds;\n onMouseEnter?: (update: DraggingUpdate) => void;\n onMouseLeave?: (update: DraggingUpdate) => void;\n onMouseMove?: (update: DraggingUpdate) => void;\n onDragStart?: (update: DraggingUpdate) => void;\n onDragMove?: (update: DraggingUpdate) => void;\n onDragEnd?: (update: DraggingUpdate) => void;\n resetBoundsOnResize?: boolean;\n tag?: string;\n};\n\nexport default class DraggableManager {\n // cache the last known DraggableBounds (invalidate via `#resetBounds())\n _bounds: DraggableBounds | TNil;\n _isDragging: boolean;\n // optional callbacks for various dragging events\n _onMouseEnter: ((update: DraggingUpdate) => void) | TNil;\n _onMouseLeave: ((update: DraggingUpdate) => void) | TNil;\n _onMouseMove: ((update: DraggingUpdate) => void) | TNil;\n _onDragStart: ((update: DraggingUpdate) => void) | TNil;\n _onDragMove: ((update: DraggingUpdate) => void) | TNil;\n _onDragEnd: ((update: DraggingUpdate) => void) | TNil;\n // whether to reset the bounds on window resize\n _resetBoundsOnResize: boolean;\n\n /**\n * Get the `DraggableBounds` for the current drag. The returned value is\n * cached until either `#resetBounds()` is called or the window is resized\n * (assuming `_resetBoundsOnResize` is `true`). The `DraggableBounds` defines\n * the range the current drag can span to. It also establishes the left offset\n * to adjust `clientX` by (from the `MouseEvent`s).\n */\n getBounds: (tag: string | TNil) => DraggableBounds;\n\n // convenience data\n tag: string | TNil;\n\n // handlers for integration with DOM elements\n handleMouseEnter: (event: React.MouseEvent<any>) => void;\n handleMouseMove: (event: React.MouseEvent<any>) => void;\n handleMouseLeave: (event: React.MouseEvent<any>) => void;\n handleMouseDown: (event: React.MouseEvent<any>) => void;\n\n constructor({ getBounds, tag, resetBoundsOnResize = true, ...rest }: DraggableManagerOptions) {\n this.handleMouseDown = this._handleDragEvent;\n this.handleMouseEnter = this._handleMinorMouseEvent;\n this.handleMouseMove = this._handleMinorMouseEvent;\n this.handleMouseLeave = this._handleMinorMouseEvent;\n\n this.getBounds = getBounds;\n this.tag = tag;\n this._isDragging = false;\n this._bounds = undefined;\n this._resetBoundsOnResize = Boolean(resetBoundsOnResize);\n if (this._resetBoundsOnResize) {\n window.addEventListener('resize', this.resetBounds);\n }\n this._onMouseEnter = rest.onMouseEnter;\n this._onMouseLeave = rest.onMouseLeave;\n this._onMouseMove = rest.onMouseMove;\n this._onDragStart = rest.onDragStart;\n this._onDragMove = rest.onDragMove;\n this._onDragEnd = rest.onDragEnd;\n }\n\n _getBounds(): DraggableBounds {\n if (!this._bounds) {\n this._bounds = this.getBounds(this.tag);\n }\n return this._bounds;\n }\n\n _getPosition(clientX: number) {\n const { clientXLeft, maxValue, minValue, width } = this._getBounds();\n let x = clientX - clientXLeft;\n let value = x / width;\n if (minValue != null && value < minValue) {\n value = minValue;\n x = minValue * width;\n } else if (maxValue != null && value > maxValue) {\n value = maxValue;\n x = maxValue * width;\n }\n return { value, x };\n }\n\n _stopDragging() {\n window.removeEventListener('mousemove', this._handleDragEvent);\n window.removeEventListener('mouseup', this._handleDragEvent);\n const style = _get(document, 'body.style');\n if (style) {\n style.userSelect = null;\n }\n this._isDragging = false;\n }\n\n isDragging() {\n return this._isDragging;\n }\n\n dispose() {\n if (this._isDragging) {\n this._stopDragging();\n }\n if (this._resetBoundsOnResize) {\n window.removeEventListener('resize', this.resetBounds);\n }\n this._bounds = undefined;\n this._onMouseEnter = undefined;\n this._onMouseLeave = undefined;\n this._onMouseMove = undefined;\n this._onDragStart = undefined;\n this._onDragMove = undefined;\n this._onDragEnd = undefined;\n }\n\n resetBounds = () => {\n this._bounds = undefined;\n };\n\n _handleMinorMouseEvent = (event: React.MouseEvent<any>) => {\n const { button, clientX, type: eventType } = event;\n if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n return;\n }\n let type: EUpdateTypes | null = null;\n let handler: ((update: DraggingUpdate) => void) | TNil;\n if (eventType === 'mouseenter') {\n type = EUpdateTypes.MouseEnter;\n handler = this._onMouseEnter;\n } else if (eventType === 'mouseleave') {\n type = EUpdateTypes.MouseLeave;\n handler = this._onMouseLeave;\n } else if (eventType === 'mousemove') {\n type = EUpdateTypes.MouseMove;\n handler = this._onMouseMove;\n } else {\n throw new Error(`invalid event type: ${eventType}`);\n }\n if (!handler) {\n return;\n }\n const { value, x } = this._getPosition(clientX);\n handler({\n event,\n type,\n value,\n x,\n manager: this,\n tag: this.tag,\n });\n };\n\n _handleDragEvent = (event: MouseEvent | React.MouseEvent<any>) => {\n const { button, clientX, type: eventType } = event;\n let type: EUpdateTypes | null = null;\n let handler: ((update: DraggingUpdate) => void) | TNil;\n if (eventType === 'mousedown') {\n if (this._isDragging || button !== LEFT_MOUSE_BUTTON) {\n return;\n }\n window.addEventListener('mousemove', this._handleDragEvent);\n window.addEventListener('mouseup', this._handleDragEvent);\n const style = _get(document, 'body.style');\n if (style) {\n style.userSelect = 'none';\n }\n this._isDragging = true;\n\n type = EUpdateTypes.DragStart;\n handler = this._onDragStart;\n } else if (eventType === 'mousemove') {\n if (!this._isDragging) {\n return;\n }\n type = EUpdateTypes.DragMove;\n handler = this._onDragMove;\n } else if (eventType === 'mouseup') {\n if (!this._isDragging) {\n return;\n }\n this._stopDragging();\n type = EUpdateTypes.DragEnd;\n handler = this._onDragEnd;\n } else {\n throw new Error(`invalid event type: ${eventType}`);\n }\n if (!handler) {\n return;\n }\n const { value, x } = this._getPosition(clientX);\n handler({\n event,\n type,\n value,\n x,\n manager: this,\n tag: this.tag,\n });\n };\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { stylesFactory } from '@grafana/ui';\n\nimport { TNil } from '../../types';\nimport DraggableManager, { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager';\n\nexport const getStyles = stylesFactory(() => {\n return {\n TimelineColumnResizer: css`\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n `,\n wrapper: css`\n bottom: 0;\n position: absolute;\n top: 0;\n `,\n dragger: css`\n border-left: 2px solid transparent;\n cursor: col-resize;\n height: 5000px;\n margin-left: -1px;\n position: absolute;\n top: 0;\n width: 1px;\n z-index: 10;\n &:hover {\n border-left: 2px solid rgba(0, 0, 0, 0.3);\n }\n &::before {\n position: absolute;\n top: 0;\n bottom: 0;\n left: -8px;\n right: 0;\n content: ' ';\n }\n `,\n draggerDragging: css`\n background: rgba(136, 0, 136, 0.05);\n width: unset;\n &::before {\n left: -2000px;\n right: -2000px;\n }\n `,\n draggerDraggingLeft: css`\n border-left: 2px solid #808;\n border-right: 1px solid #999;\n `,\n draggerDraggingRight: css`\n border-left: 1px solid #999;\n border-right: 2px solid #808;\n `,\n gripIcon: css`\n position: absolute;\n top: 0;\n bottom: 0;\n &::before,\n &::after {\n border-right: 1px solid #ccc;\n content: ' ';\n height: 9px;\n position: absolute;\n right: 9px;\n top: 25px;\n }\n &::after {\n right: 5px;\n }\n `,\n gripIconDragging: css`\n &::before,\n &::after {\n border-right: 1px solid rgba(136, 0, 136, 0.5);\n }\n `,\n };\n});\n\ntype TimelineColumnResizerProps = {\n min: number;\n max: number;\n onChange: (newSize: number) => void;\n position: number;\n columnResizeHandleHeight: number;\n};\n\ntype TimelineColumnResizerState = {\n dragPosition: number | TNil;\n};\n\nexport default class TimelineColumnResizer extends React.PureComponent<\n TimelineColumnResizerProps,\n TimelineColumnResizerState\n> {\n state: TimelineColumnResizerState;\n\n _dragManager: DraggableManager;\n _rootElm: Element | TNil;\n\n constructor(props: TimelineColumnResizerProps) {\n super(props);\n this._dragManager = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleDragEnd,\n onDragMove: this._handleDragUpdate,\n onDragStart: this._handleDragUpdate,\n });\n this._rootElm = undefined;\n this.state = {\n dragPosition: null,\n };\n }\n\n componentWillUnmount() {\n this._dragManager.dispose();\n }\n\n _setRootElm = (elm: Element | TNil) => {\n this._rootElm = elm;\n };\n\n _getDraggingBounds = (): DraggableBounds => {\n if (!this._rootElm) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._rootElm.getBoundingClientRect();\n const { min, max } = this.props;\n return {\n clientXLeft,\n width,\n maxValue: max,\n minValue: min,\n };\n };\n\n _handleDragUpdate = ({ value }: DraggingUpdate) => {\n this.setState({ dragPosition: value });\n };\n\n _handleDragEnd = ({ manager, value }: DraggingUpdate) => {\n manager.resetBounds();\n this.setState({ dragPosition: null });\n this.props.onChange(value);\n };\n\n render() {\n let left;\n let draggerStyle: React.CSSProperties;\n const { position, columnResizeHandleHeight } = this.props;\n const { dragPosition } = this.state;\n left = `${position * 100}%`;\n const gripStyle = { left };\n let isDraggingLeft = false;\n let isDraggingRight = false;\n const styles = getStyles();\n\n if (this._dragManager.isDragging() && this._rootElm && dragPosition != null) {\n isDraggingLeft = dragPosition < position;\n isDraggingRight = dragPosition > position;\n left = `${dragPosition * 100}%`;\n // Draw a highlight from the current dragged position back to the original\n // position, e.g. highlight the change. Draw the highlight via `left` and\n // `right` css styles (simpler than using `width`).\n const draggerLeft = `${Math.min(position, dragPosition) * 100}%`;\n // subtract 1px for draggerRight to deal with the right border being off\n // by 1px when dragging left\n const draggerRight = `calc(${(1 - Math.max(position, dragPosition)) * 100}% - 1px)`;\n draggerStyle = { left: draggerLeft, right: draggerRight };\n } else {\n draggerStyle = gripStyle;\n }\n draggerStyle.height = columnResizeHandleHeight;\n\n const isDragging = isDraggingLeft || isDraggingRight;\n return (\n <div className={styles.TimelineColumnResizer} ref={this._setRootElm} data-test-id=\"TimelineColumnResizer\">\n <div\n className={cx(styles.gripIcon, isDragging && styles.gripIconDragging)}\n style={gripStyle}\n data-test-id=\"TimelineColumnResizer--gripIcon\"\n />\n <div\n aria-hidden\n className={cx(\n styles.dragger,\n isDragging && styles.draggerDragging,\n isDraggingRight && styles.draggerDraggingRight,\n isDraggingLeft && styles.draggerDraggingLeft\n )}\n onMouseDown={this._dragManager.handleMouseDown}\n style={draggerStyle}\n data-test-id=\"TimelineColumnResizer--dragger\"\n />\n </div>\n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css, cx } from '@emotion/css';\nimport * as React from 'react';\n\nimport { stylesFactory } from '@grafana/ui';\n\nimport { TNil } from '../../types';\nimport DraggableManager, { DraggableBounds, DraggingUpdate } from '../../utils/DraggableManager';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\n// exported for testing\nexport const getStyles = stylesFactory(() => {\n return {\n TimelineViewingLayer: css`\n label: TimelineViewingLayer;\n bottom: 0;\n cursor: vertical-text;\n left: 0;\n position: absolute;\n right: 0;\n top: 0;\n `,\n TimelineViewingLayerCursorGuide: css`\n label: TimelineViewingLayerCursorGuide;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 1px;\n background-color: red;\n `,\n TimelineViewingLayerDragged: css`\n label: TimelineViewingLayerDragged;\n position: absolute;\n top: 0;\n bottom: 0;\n `,\n TimelineViewingLayerDraggedDraggingLeft: css`\n label: TimelineViewingLayerDraggedDraggingLeft;\n border-left: 1px solid;\n `,\n TimelineViewingLayerDraggedDraggingRight: css`\n label: TimelineViewingLayerDraggedDraggingRight;\n border-right: 1px solid;\n `,\n TimelineViewingLayerDraggedShiftDrag: css`\n label: TimelineViewingLayerDraggedShiftDrag;\n background-color: rgba(68, 68, 255, 0.2);\n border-color: #44f;\n `,\n TimelineViewingLayerDraggedReframeDrag: css`\n label: TimelineViewingLayerDraggedReframeDrag;\n background-color: rgba(255, 68, 68, 0.2);\n border-color: #f44;\n `,\n TimelineViewingLayerFullOverlay: css`\n label: TimelineViewingLayerFullOverlay;\n bottom: 0;\n cursor: col-resize;\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n user-select: none;\n `,\n };\n});\n\ntype TimelineViewingLayerProps = {\n /**\n * `boundsInvalidator` is an arbitrary prop that lets the component know the\n * bounds for dragging need to be recalculated. In practice, the name column\n * width serves fine for this.\n */\n boundsInvalidator: any | null | undefined;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRangeTime: ViewRangeTime;\n};\n\ntype TDraggingLeftLayout = {\n isDraggingLeft: boolean;\n left: string;\n width: string;\n};\n\ntype TOutOfViewLayout = {\n isOutOfView: true;\n};\n\nfunction isOutOfView(layout: TDraggingLeftLayout | TOutOfViewLayout): layout is TOutOfViewLayout {\n return Reflect.has(layout, 'isOutOfView');\n}\n\n/**\n * Map from a sub range to the greater view range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 0.25 befomes 3/8.\n * @returns {number}\n */\nfunction mapFromViewSubRange(viewStart: number, viewEnd: number, value: number) {\n return viewStart + value * (viewEnd - viewStart);\n}\n\n/**\n * Map a value from the view ([0, 1]) to a sub-range, e.g, when the view range is\n * the middle half ([0.25, 0.75]), a value of 3/8 becomes 1/4.\n * @returns {number}\n */\nfunction mapToViewSubRange(viewStart: number, viewEnd: number, value: number) {\n return (value - viewStart) / (viewEnd - viewStart);\n}\n\n/**\n * Get the layout for the \"next\" view range time, e.g. the difference from the\n * drag start and the drag end. This is driven by `shiftStart`, `shiftEnd` or\n * `reframe` on `props.viewRangeTime`, not by the current state of the\n * component. So, it reflects in-progress dragging from the span minimap.\n */\nfunction getNextViewLayout(start: number, position: number): TDraggingLeftLayout | TOutOfViewLayout {\n let [left, right] = start < position ? [start, position] : [position, start];\n if (left >= 1 || right <= 0) {\n return { isOutOfView: true };\n }\n if (left < 0) {\n left = 0;\n }\n if (right > 1) {\n right = 1;\n }\n return {\n isDraggingLeft: start > position,\n left: `${left * 100}%`,\n width: `${(right - left) * 100}%`,\n };\n}\n\n/**\n * Render the visual indication of the \"next\" view range.\n */\nfunction getMarkers(viewStart: number, viewEnd: number, from: number, to: number, isShift: boolean): React.ReactNode {\n const mappedFrom = mapToViewSubRange(viewStart, viewEnd, from);\n const mappedTo = mapToViewSubRange(viewStart, viewEnd, to);\n const layout = getNextViewLayout(mappedFrom, mappedTo);\n if (isOutOfView(layout)) {\n return null;\n }\n const { isDraggingLeft, left, width } = layout;\n const styles = getStyles();\n const cls = cx({\n [styles.TimelineViewingLayerDraggedDraggingRight]: !isDraggingLeft,\n [styles.TimelineViewingLayerDraggedReframeDrag]: !isShift,\n [styles.TimelineViewingLayerDraggedShiftDrag]: isShift,\n });\n return (\n <div\n className={cx(styles.TimelineViewingLayerDragged, styles.TimelineViewingLayerDraggedDraggingLeft, cls)}\n style={{ left, width }}\n data-test-id=\"Dragged\"\n />\n );\n}\n\n/**\n * `TimelineViewingLayer` is rendered on top of the TimelineHeaderRow time\n * labels; it handles showing the current view range and handles mouse UX for\n * modifying it.\n */\nexport default class TimelineViewingLayer extends React.PureComponent<TimelineViewingLayerProps> {\n _draggerReframe: DraggableManager;\n _root: Element | TNil;\n\n constructor(props: TimelineViewingLayerProps) {\n super(props);\n this._draggerReframe = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleReframeDragEnd,\n onDragMove: this._handleReframeDragUpdate,\n onDragStart: this._handleReframeDragUpdate,\n onMouseLeave: this._handleReframeMouseLeave,\n onMouseMove: this._handleReframeMouseMove,\n });\n this._root = undefined;\n }\n\n UNSAFE_componentWillReceiveProps(nextProps: TimelineViewingLayerProps) {\n const { boundsInvalidator } = this.props;\n if (boundsInvalidator !== nextProps.boundsInvalidator) {\n this._draggerReframe.resetBounds();\n }\n }\n\n componentWillUnmount() {\n this._draggerReframe.dispose();\n }\n\n _setRoot = (elm: Element | TNil) => {\n this._root = elm;\n };\n\n _getDraggingBounds = (): DraggableBounds => {\n if (!this._root) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n return { clientXLeft, width };\n };\n\n _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n const [viewStart, viewEnd] = this.props.viewRangeTime.current;\n const cursor = mapFromViewSubRange(viewStart, viewEnd, value);\n this.props.updateNextViewRangeTime({ cursor });\n };\n\n _handleReframeMouseLeave = () => {\n this.props.updateNextViewRangeTime({ cursor: undefined });\n };\n\n _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n const { current, reframe } = this.props.viewRangeTime;\n const [viewStart, viewEnd] = current;\n const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n const anchor = reframe ? reframe.anchor : shift;\n const update = { reframe: { anchor, shift } };\n this.props.updateNextViewRangeTime(update);\n };\n\n _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n const { current, reframe } = this.props.viewRangeTime;\n const [viewStart, viewEnd] = current;\n const shift = mapFromViewSubRange(viewStart, viewEnd, value);\n const anchor = reframe ? reframe.anchor : shift;\n const [start, end] = shift < anchor ? [shift, anchor] : [anchor, shift];\n manager.resetBounds();\n this.props.updateViewRangeTime(start, end, 'timeline-header');\n };\n\n render() {\n const { viewRangeTime } = this.props;\n const { current, cursor, reframe, shiftEnd, shiftStart } = viewRangeTime;\n const [viewStart, viewEnd] = current;\n const haveNextTimeRange = reframe != null || shiftEnd != null || shiftStart != null;\n let cusrorPosition: string | TNil;\n if (!haveNextTimeRange && cursor != null && cursor >= viewStart && cursor <= viewEnd) {\n cusrorPosition = `${mapToViewSubRange(viewStart, viewEnd, cursor) * 100}%`;\n }\n const styles = getStyles();\n return (\n <div\n aria-hidden\n className={styles.TimelineViewingLayer}\n ref={this._setRoot}\n onMouseDown={this._draggerReframe.handleMouseDown}\n onMouseLeave={this._draggerReframe.handleMouseLeave}\n onMouseMove={this._draggerReframe.handleMouseMove}\n data-test-id=\"TimelineViewingLayer\"\n >\n {cusrorPosition != null && (\n <div\n className={styles.TimelineViewingLayerCursorGuide}\n style={{ left: cusrorPosition }}\n data-test-id=\"TimelineViewingLayer--cursorGuide\"\n />\n )}\n {reframe != null && getMarkers(viewStart, viewEnd, reframe.anchor, reframe.shift, false)}\n {shiftEnd != null && getMarkers(viewStart, viewEnd, viewEnd, shiftEnd, true)}\n {shiftStart != null && getMarkers(viewStart, viewEnd, viewStart, shiftStart, true)}\n </div>\n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { ubFlex, ubPx2 } from '../../uberUtilityStyles';\nimport Ticks from '../Ticks';\nimport TimelineRow from '../TimelineRow';\nimport { TUpdateViewRangeTimeFunction, ViewRangeTime, ViewRangeTimeUpdate } from '../types';\n\nimport { TimelineCollapser } from './TimelineCollapser';\nimport TimelineColumnResizer from './TimelineColumnResizer';\nimport TimelineViewingLayer from './TimelineViewingLayer';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n TimelineHeaderRow: css`\n label: TimelineHeaderRow;\n background: ${autoColor(theme, '#ececec')};\n border-bottom: 1px solid ${autoColor(theme, '#ccc')};\n height: 38px;\n line-height: 38px;\n width: 100%;\n z-index: 4;\n position: relative;\n `,\n TimelineHeaderRowTitle: css`\n label: TimelineHeaderRowTitle;\n flex: 1;\n overflow: hidden;\n margin: 0;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n TimelineHeaderWrapper: css`\n label: TimelineHeaderWrapper;\n align-items: center;\n `,\n };\n};\n\ntype TimelineHeaderRowProps = {\n duration: number;\n nameColumnWidth: number;\n numTicks: number;\n onCollapseAll: () => void;\n onCollapseOne: () => void;\n onColummWidthChange: (width: number) => void;\n onExpandAll: () => void;\n onExpandOne: () => void;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRangeTime: ViewRangeTime;\n columnResizeHandleHeight: number;\n};\n\nexport default function TimelineHeaderRow(props: TimelineHeaderRowProps) {\n const {\n duration,\n nameColumnWidth,\n numTicks,\n onCollapseAll,\n onCollapseOne,\n onColummWidthChange,\n onExpandAll,\n onExpandOne,\n updateViewRangeTime,\n updateNextViewRangeTime,\n viewRangeTime,\n columnResizeHandleHeight,\n } = props;\n const [viewStart, viewEnd] = viewRangeTime.current;\n const styles = useStyles2(getStyles);\n return (\n <TimelineRow className={styles.TimelineHeaderRow} data-test-id=\"TimelineHeaderRow\">\n <TimelineRow.Cell className={cx(ubFlex, ubPx2, styles.TimelineHeaderWrapper)} width={nameColumnWidth}>\n <h4 className={styles.TimelineHeaderRowTitle}>Service & Operation</h4>\n <TimelineCollapser\n onCollapseAll={onCollapseAll}\n onExpandAll={onExpandAll}\n onCollapseOne={onCollapseOne}\n onExpandOne={onExpandOne}\n />\n </TimelineRow.Cell>\n <TimelineRow.Cell width={1 - nameColumnWidth}>\n <TimelineViewingLayer\n boundsInvalidator={nameColumnWidth}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n viewRangeTime={viewRangeTime}\n />\n <Ticks numTicks={numTicks} startTime={viewStart * duration} endTime={viewEnd * duration} showLabels />\n </TimelineRow.Cell>\n <TimelineColumnResizer\n columnResizeHandleHeight={columnResizeHandleHeight}\n position={nameColumnWidth}\n onChange={onColummWidthChange}\n min={0.2}\n max={0.85}\n />\n </TimelineRow>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React, { RefObject } from 'react';\n\nimport { GrafanaTheme2, LinkModel, TimeZone } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime';\nimport { stylesFactory, withTheme2 } from '@grafana/ui';\n\nimport { Accessors } from '../ScrollManager';\nimport { autoColor } from '../Theme';\nimport { merge as mergeShortcuts } from '../keyboard-shortcuts';\nimport { SpanBarOptions } from '../settings/SpanBarSettings';\nimport { SpanLinkFunc, TNil } from '../types';\nimport TTraceTimeline from '../types/TTraceTimeline';\nimport { TraceSpan, Trace, TraceLog, TraceKeyValuePair, TraceLink, TraceSpanReference } from '../types/trace';\n\nimport TimelineHeaderRow from './TimelineHeaderRow';\nimport VirtualizedTraceView, { TopOfViewRefType } from './VirtualizedTraceView';\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from './types';\n\ntype TExtractUiFindFromStateReturn = {\n uiFind: string | undefined;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n TraceTimelineViewer: css`\n label: TraceTimelineViewer;\n border-bottom: 1px solid ${autoColor(theme, '#bbb')};\n\n & .json-markup {\n line-height: 17px;\n font-size: 13px;\n font-family: monospace;\n white-space: pre-wrap;\n }\n\n & .json-markup-key {\n font-weight: bold;\n }\n\n & .json-markup-bool {\n color: ${autoColor(theme, 'firebrick')};\n }\n\n & .json-markup-string {\n color: ${autoColor(theme, 'teal')};\n }\n\n & .json-markup-null {\n color: ${autoColor(theme, 'teal')};\n }\n\n & .json-markup-number {\n color: ${autoColor(theme, 'blue', 'black')};\n }\n `,\n };\n});\n\ntype TProps = TExtractUiFindFromStateReturn & {\n registerAccessors: (accessors: Accessors) => void;\n findMatchesIDs: Set<string> | TNil;\n scrollToFirstVisibleSpan: () => void;\n traceTimeline: TTraceTimeline;\n trace: Trace;\n datasourceType: string;\n spanBarOptions: SpanBarOptions | undefined;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRange: ViewRange;\n timeZone: TimeZone;\n\n setSpanNameColumnWidth: (width: number) => void;\n collapseAll: (spans: TraceSpan[]) => void;\n collapseOne: (spans: TraceSpan[]) => void;\n expandAll: () => void;\n expandOne: (spans: TraceSpan[]) => void;\n\n childrenToggle: (spanID: string) => void;\n clearShouldScrollToFirstUiFindMatch: () => void;\n detailLogItemToggle: (spanID: string, log: TraceLog) => void;\n detailLogsToggle: (spanID: string) => void;\n detailWarningsToggle: (spanID: string) => void;\n detailStackTracesToggle: (spanID: string) => void;\n detailReferencesToggle: (spanID: string) => void;\n detailReferenceItemToggle: (spanID: string, reference: TraceSpanReference) => void;\n detailProcessToggle: (spanID: string) => void;\n detailTagsToggle: (spanID: string) => void;\n detailToggle: (spanID: string) => void;\n setTrace: (trace: Trace | TNil, uiFind: string | TNil) => void;\n addHoverIndentGuideId: (spanID: string) => void;\n removeHoverIndentGuideId: (spanID: string) => void;\n linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[];\n theme: GrafanaTheme2;\n createSpanLink?: SpanLinkFunc;\n scrollElement?: Element;\n focusedSpanId?: string;\n focusedSpanIdForSearch: string;\n createFocusSpanLink: (traceId: string, spanId: string) => LinkModel;\n topOfViewRef?: RefObject<HTMLDivElement>;\n topOfViewRefType?: TopOfViewRefType;\n};\n\ntype State = {\n // Will be set to real height of the component so it can be passed down to size some other elements.\n height: number;\n};\n\nconst NUM_TICKS = 5;\n\n/**\n * `TraceTimelineViewer` now renders the header row because it is sensitive to\n * `props.viewRange.time.cursor`. If `VirtualizedTraceView` renders it, it will\n * re-render the ListView every time the cursor is moved on the trace minimap\n * or `TimelineHeaderRow`.\n */\nexport class UnthemedTraceTimelineViewer extends React.PureComponent<TProps, State> {\n constructor(props: TProps) {\n super(props);\n this.state = { height: 0 };\n }\n\n componentDidMount() {\n mergeShortcuts({\n collapseAll: this.collapseAll,\n expandAll: this.expandAll,\n collapseOne: this.collapseOne,\n expandOne: this.expandOne,\n });\n }\n\n collapseAll = () => {\n this.props.collapseAll(this.props.trace.spans);\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n type: 'collapseAll',\n });\n };\n\n collapseOne = () => {\n this.props.collapseOne(this.props.trace.spans);\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n type: 'collapseOne',\n });\n };\n\n expandAll = () => {\n this.props.expandAll();\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n type: 'expandAll',\n });\n };\n\n expandOne = () => {\n this.props.expandOne(this.props.trace.spans);\n reportInteraction('grafana_traces_traceID_expand_collapse_clicked', {\n datasourceType: this.props.datasourceType,\n type: 'expandOne',\n });\n };\n\n render() {\n const {\n setSpanNameColumnWidth,\n updateNextViewRangeTime,\n updateViewRangeTime,\n viewRange,\n traceTimeline,\n theme,\n topOfViewRef,\n focusedSpanIdForSearch,\n ...rest\n } = this.props;\n const { trace } = rest;\n const styles = getStyles(theme);\n\n return (\n <div\n className={styles.TraceTimelineViewer}\n ref={(ref: HTMLDivElement | null) => ref && this.setState({ height: ref.getBoundingClientRect().height })}\n >\n <TimelineHeaderRow\n duration={trace.duration}\n nameColumnWidth={traceTimeline.spanNameColumnWidth}\n numTicks={NUM_TICKS}\n onCollapseAll={this.collapseAll}\n onCollapseOne={this.collapseOne}\n onColummWidthChange={setSpanNameColumnWidth}\n onExpandAll={this.expandAll}\n onExpandOne={this.expandOne}\n viewRangeTime={viewRange.time}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n columnResizeHandleHeight={this.state.height}\n />\n <VirtualizedTraceView\n {...rest}\n {...traceTimeline}\n setSpanNameColumnWidth={setSpanNameColumnWidth}\n currentViewRangeTime={viewRange.time.current}\n topOfViewRef={topOfViewRef}\n focusedSpanIdForSearch={focusedSpanIdForSearch}\n />\n </div>\n );\n }\n}\n\nexport default withTheme2(UnthemedTraceTimelineViewer);\n","// Copyright (c) 2018 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\nimport IoAndroidOpen from 'react-icons/lib/io/android-open';\n\nimport { useStyles2 } from '@grafana/ui';\n\nexport const getStyles = () => {\n return {\n NewWindowIconLarge: css`\n label: NewWindowIconLarge;\n font-size: 1.5em;\n `,\n };\n};\n\ntype Props = {\n isLarge?: boolean;\n className?: string;\n};\n\nexport default function NewWindowIcon(props: Props) {\n const { isLarge, className, ...rest } = props;\n const styles = useStyles2(getStyles);\n const cls = cx({ [styles.NewWindowIconLarge]: isLarge }, className);\n return <IoAndroidOpen className={cls} {...rest} />;\n}\n\nNewWindowIcon.defaultProps = {\n isLarge: false,\n};\n","// Copyright (c) 2019 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport * as React from 'react';\n\nimport NewWindowIcon from './NewWindowIcon';\n\ntype Link = {\n text: string;\n url: string;\n};\n\ntype ExternalLinksProps = {\n links: Link[];\n className?: string;\n};\n\nconst LinkValue = (props: { href: string; title?: string; children?: React.ReactNode; className?: string }) => (\n <a href={props.href} title={props.title} target=\"_blank\" rel=\"noopener noreferrer\" className={props.className}>\n {props.children} <NewWindowIcon />\n </a>\n);\n\nexport default function ExternalLinks(props: ExternalLinksProps) {\n const { links } = props;\n // TODO: handle multiple items\n return <LinkValue href={links[0].url} title={links[0].text} className={props.className} />;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const FALLBACK_DAG_MAX_NUM_SERVICES = 100 as 100;\nexport const FALLBACK_TRACE_NAME = '<trace-without-root-span>' as '<trace-without-root-span>';\n\nexport const FETCH_DONE = 'FETCH_DONE' as 'FETCH_DONE';\nexport const FETCH_ERROR = 'FETCH_ERROR' as 'FETCH_ERROR';\nexport const FETCH_LOADING = 'FETCH_LOADING' as 'FETCH_LOADING';\n\nexport const fetchedState = {\n DONE: FETCH_DONE,\n ERROR: FETCH_ERROR,\n LOADING: FETCH_LOADING,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n BreakableText: css`\n label: BreakableText;\n display: inline-block;\n white-space: pre;\n `,\n };\n};\n\nconst WORD_RX = /\\W*\\w+\\W*/g;\n\ntype Props = {\n text: string;\n className?: string;\n wordRegexp?: RegExp;\n};\n\n// TODO typescript doesn't understand text or null as react nodes\n// https://github.com/Microsoft/TypeScript/issues/21699\nexport default function BreakableText(\n props: Props\n): any /* React.ReactNode /* React.ReactElement | React.ReactElement[] \\*\\/ */ {\n const { className, text, wordRegexp = WORD_RX } = props;\n const styles = useStyles2(getStyles);\n if (!text) {\n return typeof text === 'string' ? text : null;\n }\n const spans = [];\n wordRegexp.exec('');\n // if the given text has no words, set the first match to the entire text\n let match: RegExpExecArray | string[] | null = wordRegexp.exec(text) || [text];\n while (match) {\n spans.push(\n <span key={`${text}-${spans.length}`} className={className || styles.BreakableText}>\n {match[0]}\n </span>\n );\n match = wordRegexp.exec(text);\n }\n return spans;\n}\n\nBreakableText.defaultProps = {\n wordRegexp: WORD_RX,\n};\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { FALLBACK_TRACE_NAME } from '../constants';\nimport { TNil } from '../types';\n\nimport BreakableText from './BreakableText';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n TraceName: css`\n label: TraceName;\n font-size: ${theme.typography.size.lg};\n `,\n };\n};\n\ntype Props = {\n className?: string;\n traceName?: string | TNil;\n};\n\nexport default function TraceName(props: Props) {\n const { className, traceName } = props;\n const styles = useStyles2(getStyles);\n const text = String(traceName || FALLBACK_TRACE_NAME);\n const title = <BreakableText text={text} />;\n return <span className={cx(styles.TraceName, className)}>{title}</span>;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport deepFreeze from 'deep-freeze';\n\nimport { FALLBACK_DAG_MAX_NUM_SERVICES } from './index';\n\nexport default deepFreeze(\n Object.defineProperty(\n {\n archiveEnabled: false,\n dependencies: {\n dagMaxNumServices: FALLBACK_DAG_MAX_NUM_SERVICES,\n menuEnabled: true,\n },\n linkPatterns: [],\n menu: [\n {\n label: 'About Jaeger',\n items: [\n {\n label: 'GitHub',\n url: 'https://github.com/uber/jaeger',\n },\n {\n label: 'Docs',\n url: 'http://jaeger.readthedocs.io/en/latest/',\n },\n {\n label: 'Twitter',\n url: 'https://twitter.com/JaegerTracing',\n },\n {\n label: 'Discussion Group',\n url: 'https://groups.google.com/forum/#!forum/jaeger-tracing',\n },\n {\n label: 'Gitter.im',\n url: 'https://gitter.im/jaegertracing/Lobby',\n },\n {\n label: 'Blog',\n url: 'https://medium.com/jaegertracing/',\n },\n ],\n },\n ],\n search: {\n maxLookback: {\n label: '2 Days',\n value: '2d',\n },\n maxLimit: 1500,\n },\n tracking: {\n gaID: null,\n trackErrors: true,\n },\n },\n // fields that should be individually merged vs wholesale replaced\n '__mergeFields',\n { value: ['dependencies', 'search', 'tracking'] }\n )\n);\n\nexport const deprecations = [\n {\n formerKey: 'dependenciesMenuEnabled',\n currentKey: 'dependencies.menuEnabled',\n },\n {\n formerKey: 'gaTrackingID',\n currentKey: 'tracking.gaID',\n },\n];\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { get as _get } from 'lodash';\n\nimport defaultConfig from '../../constants/default-config';\n\n/**\n * Merge the embedded config from the query service (if present) with the\n * default config from `../../constants/default-config`.\n */\nexport default function getConfig() {\n return defaultConfig;\n}\n\nexport function getConfigValue(path: string) {\n return _get(getConfig(), path);\n}\n","// Copyright (c) 2017 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceSpan } from '../types/trace';\n\n/**\n * Searches the span.references to find 'CHILD_OF' reference type or returns null.\n * @param {TraceSpan} span The span whose parent is to be returned.\n * @returns {TraceSpan|null} The parent span if there is one, null otherwise.\n */\nexport function getParent(span: TraceSpan) {\n const parentRef = span.references ? span.references.find((ref) => ref.refType === 'CHILD_OF') : null;\n return parentRef ? parentRef.span : null;\n}\n","// Copyright (c) 2017 The Jaeger Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { uniq as _uniq } from 'lodash';\nimport memoize from 'lru-memoize';\n\nimport { TNil } from '../types';\nimport { TraceSpan, TraceLink, TraceKeyValuePair, Trace } from '../types/trace';\nimport { getConfigValue } from '../utils/config/get-config';\n\nimport { getParent } from './span';\n\nconst parameterRegExp = /#\\{([^{}]*)\\}/g;\n\ntype ProcessedTemplate = {\n parameters: string[];\n template: (template: { [key: string]: any }) => string;\n};\n\ntype ProcessedLinkPattern = {\n object: any;\n type: (link: string) => boolean;\n key: (link: string) => boolean;\n value: (value: any) => boolean;\n url: ProcessedTemplate;\n text: ProcessedTemplate;\n parameters: string[];\n};\n\ntype TLinksRV = Array<{ url: string; text: string }>;\n\nfunction getParamNames(str: string) {\n const names = new Set<string>();\n str.replace(parameterRegExp, (match, name) => {\n names.add(name);\n return match;\n });\n return Array.from(names);\n}\n\nfunction stringSupplant(str: string, encodeFn: (unencoded: any) => string, map: Record<string, any>) {\n return str.replace(parameterRegExp, (_, name) => {\n const value = map[name];\n return value == null ? '' : encodeFn(value);\n });\n}\n\nexport function processTemplate(template: any, encodeFn: (unencoded: any) => string): ProcessedTemplate {\n if (typeof template !== 'string') {\n /*\n\n // kept on ice until #123 is implemented:\n if (template && Array.isArray(template.parameters) && (typeof template.template === 'function')) {\n return template;\n }\n\n */\n throw new Error('Invalid template');\n }\n return {\n parameters: getParamNames(template),\n template: stringSupplant.bind(null, template, encodeFn),\n };\n}\n\nexport function createTestFunction(entry: any) {\n if (typeof entry === 'string') {\n return (arg: any) => arg === entry;\n }\n if (Array.isArray(entry)) {\n return (arg: any) => entry.indexOf(arg) > -1;\n }\n /*\n\n // kept on ice until #123 is implemented:\n if (entry instanceof RegExp) {\n return (arg: any) => entry.test(arg);\n }\n if (typeof entry === 'function') {\n return entry;\n }\n\n */\n if (entry == null) {\n return () => true;\n }\n throw new Error(`Invalid value: ${entry}`);\n}\n\nconst identity = (a: any): typeof a => a;\n\nexport function processLinkPattern(pattern: any): ProcessedLinkPattern | TNil {\n try {\n const url = processTemplate(pattern.url, encodeURIComponent);\n const text = processTemplate(pattern.text, identity);\n return {\n object: pattern,\n type: createTestFunction(pattern.type),\n key: createTestFunction(pattern.key),\n value: createTestFunction(pattern.value),\n url,\n text,\n parameters: _uniq(url.parameters.concat(text.parameters)),\n };\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Ignoring invalid link pattern: ${error}`, pattern);\n return null;\n }\n}\n\nexport function getParameterInArray(name: string, array: TraceKeyValuePair[]) {\n if (array) {\n return array.find((entry) => entry.key === name);\n }\n return undefined;\n}\n\nexport function getParameterInAncestor(name: string, span: TraceSpan) {\n let currentSpan: TraceSpan | TNil = span;\n while (currentSpan) {\n const result = getParameterInArray(name, currentSpan.tags) || getParameterInArray(name, currentSpan.process.tags);\n if (result) {\n return result;\n }\n currentSpan = getParent(currentSpan);\n }\n return undefined;\n}\n\nfunction callTemplate(template: ProcessedTemplate, data: any) {\n return template.template(data);\n}\n\nexport function computeTraceLink(linkPatterns: ProcessedLinkPattern[], trace: Trace) {\n const result: TLinksRV = [];\n const validKeys = (Object.keys(trace) as Array<keyof Trace>).filter(\n (key) => typeof trace[key] === 'string' || trace[key] === 'number'\n );\n\n linkPatterns\n .filter((pattern) => pattern.type('traces'))\n .forEach((pattern) => {\n const parameterValues: Record<string, any> = {};\n const allParameters = pattern.parameters.every((parameter) => {\n const key = parameter as keyof Trace;\n if (validKeys.includes(key)) {\n // At this point is safe to access to trace object using parameter variable because\n // we validated parameter against validKeys, this implies that parameter a keyof Trace.\n parameterValues[parameter] = trace[key];\n return true;\n }\n return false;\n });\n if (allParameters) {\n result.push({\n url: callTemplate(pattern.url, parameterValues),\n text: callTemplate(pattern.text, parameterValues),\n });\n }\n });\n\n return result;\n}\n\nexport function computeLinks(\n linkPatterns: ProcessedLinkPattern[],\n span: TraceSpan,\n items: TraceKeyValuePair[],\n itemIndex: number\n) {\n const item = items[itemIndex];\n let type = 'logs';\n const processTags = span.process.tags === items;\n if (processTags) {\n type = 'process';\n }\n const spanTags = span.tags === items;\n if (spanTags) {\n type = 'tags';\n }\n const result: Array<{ url: string; text: string }> = [];\n linkPatterns.forEach((pattern) => {\n if (pattern.type(type) && pattern.key(item.key) && pattern.value(item.value)) {\n const parameterValues: Record<string, any> = {};\n const allParameters = pattern.parameters.every((parameter) => {\n let entry = getParameterInArray(parameter, items);\n if (!entry && !processTags) {\n // do not look in ancestors for process tags because the same object may appear in different places in the hierarchy\n // and the cache in getLinks uses that object as a key\n entry = getParameterInAncestor(parameter, span);\n }\n if (entry) {\n parameterValues[parameter] = entry.value;\n return true;\n }\n // eslint-disable-next-line no-console\n console.warn(\n `Skipping link pattern, missing parameter ${parameter} for key ${item.key} in ${type}.`,\n pattern.object\n );\n return false;\n });\n if (allParameters) {\n result.push({\n url: callTemplate(pattern.url, parameterValues),\n text: callTemplate(pattern.text, parameterValues),\n });\n }\n }\n });\n return result;\n}\n\nexport function createGetLinks(linkPatterns: ProcessedLinkPattern[], cache: WeakMap<TraceKeyValuePair, TraceLink[]>) {\n return (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => {\n if (linkPatterns.length === 0) {\n return [];\n }\n const item = items[itemIndex];\n let result = cache.get(item);\n if (!result) {\n result = computeLinks(linkPatterns, span, items, itemIndex);\n cache.set(item, result);\n }\n return result;\n };\n}\n\nconst processedLinks: ProcessedLinkPattern[] = (getConfigValue('linkPatterns') || [])\n .map(processLinkPattern)\n .filter(Boolean);\n\nexport const getTraceLinks: (trace: Trace | undefined) => TLinksRV = memoize(10)((trace: Trace | undefined) => {\n const result: TLinksRV = [];\n if (!trace) {\n return result;\n }\n return computeTraceLink(processedLinks, trace);\n});\n\nexport default createGetLinks(processedLinks, new WeakMap());\n","// Copyright (c) 2020 The Jaeger Authors\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { memoize } from 'lodash';\n\nimport { TraceSpan } from '../types/trace';\n\nexport function _getTraceNameImpl(spans: TraceSpan[]) {\n // Use a span with no references to another span in given array\n // prefering the span with the fewest references\n // using start time as a tie breaker\n let candidateSpan: TraceSpan | undefined;\n const allIDs: Set<string> = new Set(spans.map(({ spanID }) => spanID));\n\n for (let i = 0; i < spans.length; i++) {\n const hasInternalRef =\n spans[i].references &&\n spans[i].references.some(({ traceID, spanID }) => traceID === spans[i].traceID && allIDs.has(spanID));\n if (hasInternalRef) {\n continue;\n }\n\n if (!candidateSpan) {\n candidateSpan = spans[i];\n continue;\n }\n\n const thisRefLength = (spans[i].references && spans[i].references.length) || 0;\n const candidateRefLength = (candidateSpan.references && candidateSpan.references.length) || 0;\n\n if (\n thisRefLength < candidateRefLength ||\n (thisRefLength === candidateRefLength && spans[i].startTime < candidateSpan.startTime)\n ) {\n candidateSpan = spans[i];\n }\n }\n return candidateSpan ? `${candidateSpan.process.serviceName}: ${candidateSpan.operationName}` : '';\n}\n\nexport const getTraceName = memoize(_getTraceNameImpl, (spans: TraceSpan[]) => {\n if (!spans.length) {\n return 0;\n }\n return spans[0].traceID;\n});\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, stylesFactory } from '@grafana/ui';\n\nimport { autoColor } from '../../Theme';\nimport { TNil } from '../../types';\nimport { getRgbColorByKey } from '../../utils/color-generator';\n\nimport renderIntoCanvas from './render-into-canvas';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n CanvasSpanGraph: css`\n label: CanvasSpanGraph;\n background: ${autoColor(theme, '#fafafa')};\n height: 60px;\n position: absolute;\n width: 100%;\n `,\n };\n});\n\ntype CanvasSpanGraphProps = {\n items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>;\n valueWidth: number;\n theme: GrafanaTheme2;\n};\n\nexport class UnthemedCanvasSpanGraph extends React.PureComponent<CanvasSpanGraphProps> {\n _canvasElm: HTMLCanvasElement | TNil;\n\n constructor(props: CanvasSpanGraphProps) {\n super(props);\n this._canvasElm = undefined;\n }\n\n getColor = (key: string) => getRgbColorByKey(key, this.props.theme);\n\n componentDidMount() {\n this._draw();\n }\n\n componentDidUpdate() {\n this._draw();\n }\n\n _setCanvasRef = (elm: HTMLCanvasElement | TNil) => {\n this._canvasElm = elm;\n };\n\n _draw() {\n if (this._canvasElm) {\n const { valueWidth: totalValueWidth, items } = this.props;\n renderIntoCanvas(this._canvasElm, items, totalValueWidth, this.getColor, autoColor(this.props.theme, '#fff'));\n }\n }\n\n render() {\n return <canvas className={getStyles(this.props.theme).CanvasSpanGraph} ref={this._setCanvasRef} />;\n }\n}\n\nexport default withTheme2(UnthemedCanvasSpanGraph);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TNil } from '../..';\n\n// exported for tests\nexport const ITEM_ALPHA = 0.8;\nexport const MIN_ITEM_HEIGHT = 2;\nexport const MAX_TOTAL_HEIGHT = 200;\nexport const MIN_ITEM_WIDTH = 10;\nexport const MIN_TOTAL_HEIGHT = 60;\nexport const MAX_ITEM_HEIGHT = 6;\n\nexport default function renderIntoCanvas(\n canvas: HTMLCanvasElement,\n items: Array<{ valueWidth: number; valueOffset: number; serviceName: string }>,\n totalValueWidth: number,\n getFillColor: (serviceName: string) => [number, number, number],\n bgColor: string\n) {\n const fillCache: Map<string, string | TNil> = new Map();\n const cHeight = items.length < MIN_TOTAL_HEIGHT ? MIN_TOTAL_HEIGHT : Math.min(items.length, MAX_TOTAL_HEIGHT);\n const cWidth = window.innerWidth * 2;\n // eslint-disable-next-line no-param-reassign\n canvas.width = cWidth;\n // eslint-disable-next-line no-param-reassign\n canvas.height = cHeight;\n const itemHeight = Math.min(MAX_ITEM_HEIGHT, Math.max(MIN_ITEM_HEIGHT, cHeight / items.length));\n const itemYChange = cHeight / items.length;\n\n const ctx = canvas.getContext('2d', { alpha: false }) as CanvasRenderingContext2D;\n ctx.fillStyle = bgColor;\n ctx.fillRect(0, 0, cWidth, cHeight);\n for (let i = 0; i < items.length; i++) {\n const { valueWidth, valueOffset, serviceName } = items[i];\n const x = (valueOffset / totalValueWidth) * cWidth;\n let width = (valueWidth / totalValueWidth) * cWidth;\n if (width < MIN_ITEM_WIDTH) {\n width = MIN_ITEM_WIDTH;\n }\n let fillStyle = fillCache.get(serviceName);\n if (!fillStyle) {\n fillStyle = `rgba(${getFillColor(serviceName).concat(ITEM_ALPHA).join()})`;\n fillCache.set(serviceName, fillStyle);\n }\n ctx.fillStyle = fillStyle;\n ctx.fillRect(x, i * itemYChange, width, itemHeight);\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { formatDuration } from '../../utils/date';\n\nconst getStyles = () => {\n return {\n TickLabels: css`\n label: TickLabels;\n height: 1rem;\n position: relative;\n `,\n TickLabelsLabel: css`\n label: TickLabelsLabel;\n color: #717171;\n font-size: 0.7rem;\n position: absolute;\n user-select: none;\n `,\n };\n};\n\ntype TickLabelsProps = {\n numTicks: number;\n duration: number;\n};\n\nexport default function TickLabels(props: TickLabelsProps) {\n const { numTicks, duration } = props;\n const styles = useStyles2(getStyles);\n\n const ticks = [];\n for (let i = 0; i < numTicks + 1; i++) {\n const portion = i / numTicks;\n const style = portion === 1 ? { right: '0%' } : { left: `${portion * 100}%` };\n ticks.push(\n <div key={portion} className={styles.TickLabelsLabel} style={style} data-test=\"tick\">\n {formatDuration(duration * portion)}\n </div>\n );\n }\n\n return <div className={styles.TickLabels}>{ticks}</div>;\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = () => {\n return {\n GraphTick: css`\n label: GraphTick;\n stroke: #aaa;\n stroke-width: 1px;\n `,\n };\n};\n\ntype GraphTicksProps = {\n numTicks: number;\n};\n\nexport default function GraphTicks(props: GraphTicksProps) {\n const { numTicks } = props;\n const styles = useStyles2(getStyles);\n const ticks = [];\n // i starts at 1, limit is `i < numTicks` so the first and last ticks aren't drawn\n for (let i = 1; i < numTicks; i++) {\n const x = `${(i / numTicks) * 100}%`;\n ticks.push(<line className={styles.GraphTick} x1={x} y1=\"0%\" x2={x} y2=\"100%\" key={i / numTicks} />);\n }\n\n return (\n <g data-testid=\"ticks\" aria-hidden=\"true\">\n {ticks}\n </g>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nexport const getStyles = () => {\n return {\n ScrubberHandleExpansion: cx(\n css`\n label: ScrubberHandleExpansion;\n cursor: col-resize;\n fill-opacity: 0;\n fill: #44f;\n `,\n 'scrubber-handle-expansion'\n ),\n ScrubberHandle: cx(\n css`\n label: ScrubberHandle;\n cursor: col-resize;\n fill: #555;\n `,\n 'scrubber-handle'\n ),\n ScrubberLine: cx(\n css`\n label: ScrubberLine;\n pointer-events: none;\n stroke: #555;\n `,\n 'scrubber-line'\n ),\n ScrubberDragging: css`\n label: ScrubberDragging;\n & .scrubber-handle-expansion {\n fill-opacity: 1;\n }\n & .scrubber-handle {\n fill: #44f;\n }\n & > .scrubber-line {\n stroke: #44f;\n }\n `,\n ScrubberHandles: css`\n label: ScrubberHandles;\n &:hover > .scrubber-handle-expansion {\n fill-opacity: 1;\n }\n &:hover > .scrubber-handle {\n fill: #44f;\n }\n &:hover + .scrubber.line {\n stroke: #44f;\n }\n `,\n };\n};\n\ntype ScrubberProps = {\n isDragging: boolean;\n position: number;\n onMouseDown: (evt: React.MouseEvent<any>) => void;\n onMouseEnter: (evt: React.MouseEvent<any>) => void;\n onMouseLeave: (evt: React.MouseEvent<any>) => void;\n};\n\nexport default function Scrubber({ isDragging, onMouseDown, onMouseEnter, onMouseLeave, position }: ScrubberProps) {\n const xPercent = `${position * 100}%`;\n const styles = useStyles2(getStyles);\n const className = cx({ [styles.ScrubberDragging]: isDragging });\n return (\n <g className={className}>\n <g\n className={styles.ScrubberHandles}\n onMouseDown={onMouseDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {/* handleExpansion is only visible when `isDragging` is true */}\n <rect\n x={xPercent}\n className={styles.ScrubberHandleExpansion}\n style={{ transform: `translate(-4.5px)` }}\n width=\"9\"\n height=\"20\"\n />\n <rect\n x={xPercent}\n className={styles.ScrubberHandle}\n style={{ transform: `translate(-1.5px)` }}\n width=\"3\"\n height=\"20\"\n />\n </g>\n <line className={styles.ScrubberLine} y2=\"100%\" x1={xPercent} x2={xPercent} />\n </g>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, stylesFactory, Button } from '@grafana/ui';\n\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate, TNil } from '../..';\nimport { autoColor } from '../../Theme';\nimport DraggableManager, { DraggableBounds, DraggingUpdate, EUpdateTypes } from '../../utils/DraggableManager';\n\nimport GraphTicks from './GraphTicks';\nimport Scrubber from './Scrubber';\n\nexport const getStyles = stylesFactory((theme: GrafanaTheme2) => {\n // Need this cause emotion will merge emotion generated classes into single className if used with cx from emotion\n // package and the selector won't work\n const ViewingLayerResetZoomHoverClassName = 'JaegerUiComponents__ViewingLayerResetZoomHoverClassName';\n const ViewingLayerResetZoom = css`\n label: ViewingLayerResetZoom;\n display: none;\n position: absolute;\n right: 1%;\n top: 10%;\n z-index: 1;\n `;\n return {\n ViewingLayer: css`\n label: ViewingLayer;\n cursor: vertical-text;\n position: relative;\n z-index: 1;\n &:hover > .${ViewingLayerResetZoomHoverClassName} {\n display: unset;\n }\n `,\n ViewingLayerGraph: css`\n label: ViewingLayerGraph;\n border: 1px solid ${autoColor(theme, '#999')};\n /* need !important here to overcome something from semantic UI */\n overflow: visible !important;\n position: relative;\n transform-origin: 0 0;\n width: 100%;\n `,\n ViewingLayerInactive: css`\n label: ViewingLayerInactive;\n fill: ${autoColor(theme, 'rgba(214, 214, 214, 0.5)')};\n `,\n ViewingLayerCursorGuide: css`\n label: ViewingLayerCursorGuide;\n stroke: ${autoColor(theme, '#f44')};\n stroke-width: 1;\n `,\n ViewingLayerDraggedShift: css`\n label: ViewingLayerDraggedShift;\n fill-opacity: 0.2;\n `,\n ViewingLayerDrag: css`\n label: ViewingLayerDrag;\n fill: ${autoColor(theme, '#44f')};\n `,\n ViewingLayerFullOverlay: css`\n label: ViewingLayerFullOverlay;\n bottom: 0;\n cursor: col-resize;\n left: 0;\n position: fixed;\n right: 0;\n top: 0;\n user-select: none;\n `,\n ViewingLayerResetZoom,\n ViewingLayerResetZoomHoverClassName,\n };\n});\n\ntype ViewingLayerProps = {\n height: number;\n numTicks: number;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n viewRange: ViewRange;\n theme: GrafanaTheme2;\n};\n\ntype ViewingLayerState = {\n /**\n * Cursor line should not be drawn when the mouse is over the scrubber handle.\n */\n preventCursorLine: boolean;\n};\n\n/**\n * Designate the tags for the different dragging managers. Exported for tests.\n */\nexport const dragTypes = {\n /**\n * Tag for dragging the right scrubber, e.g. end of the current view range.\n */\n SHIFT_END: 'SHIFT_END',\n /**\n * Tag for dragging the left scrubber, e.g. start of the current view range.\n */\n SHIFT_START: 'SHIFT_START',\n /**\n * Tag for dragging a new view range.\n */\n REFRAME: 'REFRAME',\n};\n\n/**\n * Returns the layout information for drawing the view-range differential, e.g.\n * show what will change when the mouse is released. Basically, this is the\n * difference from the start of the drag to the current position.\n *\n * @returns {{ x: string, width: string, leadginX: string }}\n */\nfunction getNextViewLayout(start: number, position: number) {\n const [left, right] = start < position ? [start, position] : [position, start];\n return {\n x: `${left * 100}%`,\n width: `${(right - left) * 100}%`,\n leadingX: `${position * 100}%`,\n };\n}\n\n/**\n * `ViewingLayer` is rendered on top of the Canvas rendering of the minimap and\n * handles showing the current view range and handles mouse UX for modifying it.\n */\nexport class UnthemedViewingLayer extends React.PureComponent<ViewingLayerProps, ViewingLayerState> {\n state: ViewingLayerState;\n\n _root: Element | TNil;\n\n /**\n * `_draggerReframe` handles clicking and dragging on the `ViewingLayer` to\n * redefined the view range.\n */\n _draggerReframe: DraggableManager;\n\n /**\n * `_draggerStart` handles dragging the left scrubber to adjust the start of\n * the view range.\n */\n _draggerStart: DraggableManager;\n\n /**\n * `_draggerEnd` handles dragging the right scrubber to adjust the end of\n * the view range.\n */\n _draggerEnd: DraggableManager;\n\n constructor(props: ViewingLayerProps) {\n super(props);\n\n this._draggerReframe = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleReframeDragEnd,\n onDragMove: this._handleReframeDragUpdate,\n onDragStart: this._handleReframeDragUpdate,\n onMouseMove: this._handleReframeMouseMove,\n onMouseLeave: this._handleReframeMouseLeave,\n tag: dragTypes.REFRAME,\n });\n\n this._draggerStart = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleScrubberDragEnd,\n onDragMove: this._handleScrubberDragUpdate,\n onDragStart: this._handleScrubberDragUpdate,\n onMouseEnter: this._handleScrubberEnterLeave,\n onMouseLeave: this._handleScrubberEnterLeave,\n tag: dragTypes.SHIFT_START,\n });\n\n this._draggerEnd = new DraggableManager({\n getBounds: this._getDraggingBounds,\n onDragEnd: this._handleScrubberDragEnd,\n onDragMove: this._handleScrubberDragUpdate,\n onDragStart: this._handleScrubberDragUpdate,\n onMouseEnter: this._handleScrubberEnterLeave,\n onMouseLeave: this._handleScrubberEnterLeave,\n tag: dragTypes.SHIFT_END,\n });\n\n this._root = undefined;\n this.state = {\n preventCursorLine: false,\n };\n }\n\n componentWillUnmount() {\n this._draggerReframe.dispose();\n this._draggerEnd.dispose();\n this._draggerStart.dispose();\n }\n\n _setRoot = (elm: SVGElement | TNil) => {\n this._root = elm;\n };\n\n _getDraggingBounds = (tag: string | TNil): DraggableBounds => {\n if (!this._root) {\n throw new Error('invalid state');\n }\n const { left: clientXLeft, width } = this._root.getBoundingClientRect();\n const [viewStart, viewEnd] = this.props.viewRange.time.current;\n let maxValue = 1;\n let minValue = 0;\n if (tag === dragTypes.SHIFT_START) {\n maxValue = viewEnd;\n } else if (tag === dragTypes.SHIFT_END) {\n minValue = viewStart;\n }\n return { clientXLeft, maxValue, minValue, width };\n };\n\n _handleReframeMouseMove = ({ value }: DraggingUpdate) => {\n this.props.updateNextViewRangeTime({ cursor: value });\n };\n\n _handleReframeMouseLeave = () => {\n this.props.updateNextViewRangeTime({ cursor: null });\n };\n\n _handleReframeDragUpdate = ({ value }: DraggingUpdate) => {\n const shift = value;\n const { time } = this.props.viewRange;\n const anchor = time.reframe ? time.reframe.anchor : shift;\n const update = { reframe: { anchor, shift } };\n this.props.updateNextViewRangeTime(update);\n };\n\n _handleReframeDragEnd = ({ manager, value }: DraggingUpdate) => {\n const { time } = this.props.viewRange;\n const anchor = time.reframe ? time.reframe.anchor : value;\n const [start, end] = value < anchor ? [value, anchor] : [anchor, value];\n manager.resetBounds();\n this.props.updateViewRangeTime(start, end, 'minimap');\n };\n\n _handleScrubberEnterLeave = ({ type }: DraggingUpdate) => {\n const preventCursorLine = type === EUpdateTypes.MouseEnter;\n this.setState({ preventCursorLine });\n };\n\n _handleScrubberDragUpdate = ({ event, tag, type, value }: DraggingUpdate) => {\n if (type === EUpdateTypes.DragStart) {\n event.stopPropagation();\n }\n if (tag === dragTypes.SHIFT_START) {\n this.props.updateNextViewRangeTime({ shiftStart: value });\n } else if (tag === dragTypes.SHIFT_END) {\n this.props.updateNextViewRangeTime({ shiftEnd: value });\n }\n };\n\n _handleScrubberDragEnd = ({ manager, tag, value }: DraggingUpdate) => {\n const [viewStart, viewEnd] = this.props.viewRange.time.current;\n let update: [number, number];\n if (tag === dragTypes.SHIFT_START) {\n update = [value, viewEnd];\n } else if (tag === dragTypes.SHIFT_END) {\n update = [viewStart, value];\n } else {\n // to satisfy flow\n throw new Error('bad state');\n }\n manager.resetBounds();\n this.setState({ preventCursorLine: false });\n this.props.updateViewRangeTime(update[0], update[1], 'minimap');\n };\n\n /**\n * Resets the zoom to fully zoomed out.\n */\n _resetTimeZoomClickHandler = () => {\n this.props.updateViewRangeTime(0, 1);\n };\n\n /**\n * Renders the difference between where the drag started and the current\n * position, e.g. the red or blue highlight.\n *\n * @returns React.Node[]\n */\n _getMarkers(from: number, to: number) {\n const styles = getStyles(this.props.theme);\n const layout = getNextViewLayout(from, to);\n return [\n <rect\n key=\"fill\"\n className={cx(styles.ViewingLayerDraggedShift, styles.ViewingLayerDrag)}\n x={layout.x}\n y=\"0\"\n width={layout.width}\n height={this.props.height - 2}\n />,\n <rect\n key=\"edge\"\n className={cx(styles.ViewingLayerDrag)}\n x={layout.leadingX}\n y=\"0\"\n width=\"1\"\n height={this.props.height - 2}\n />,\n ];\n }\n\n render() {\n const { height, viewRange, numTicks, theme } = this.props;\n const { preventCursorLine } = this.state;\n const { current, cursor, shiftStart, shiftEnd, reframe } = viewRange.time;\n const haveNextTimeRange = shiftStart != null || shiftEnd != null || reframe != null;\n const [viewStart, viewEnd] = current;\n let leftInactive = 0;\n if (viewStart) {\n leftInactive = viewStart * 100;\n }\n let rightInactive = 100;\n if (viewEnd) {\n rightInactive = 100 - viewEnd * 100;\n }\n let cursorPosition: string | undefined;\n if (!haveNextTimeRange && cursor != null && !preventCursorLine) {\n cursorPosition = `${cursor * 100}%`;\n }\n const styles = getStyles(theme);\n\n return (\n <div aria-hidden className={styles.ViewingLayer} style={{ height }}>\n {(viewStart !== 0 || viewEnd !== 1) && (\n <Button\n onClick={this._resetTimeZoomClickHandler}\n className={cx(styles.ViewingLayerResetZoom, styles.ViewingLayerResetZoomHoverClassName)}\n type=\"button\"\n variant=\"secondary\"\n >\n Reset Selection\n </Button>\n )}\n <svg\n height={height}\n className={styles.ViewingLayerGraph}\n ref={this._setRoot}\n onMouseDown={this._draggerReframe.handleMouseDown}\n onMouseLeave={this._draggerReframe.handleMouseLeave}\n onMouseMove={this._draggerReframe.handleMouseMove}\n >\n {leftInactive > 0 && (\n <rect x={0} y={0} height=\"100%\" width={`${leftInactive}%`} className={styles.ViewingLayerInactive} />\n )}\n {rightInactive > 0 && (\n <rect\n x={`${100 - rightInactive}%`}\n y={0}\n height=\"100%\"\n width={`${rightInactive}%`}\n className={styles.ViewingLayerInactive}\n />\n )}\n <GraphTicks numTicks={numTicks} />\n {cursorPosition && (\n <line\n className={styles.ViewingLayerCursorGuide}\n x1={cursorPosition}\n y1=\"0\"\n x2={cursorPosition}\n y2={height - 2}\n strokeWidth=\"1\"\n />\n )}\n {shiftStart != null && this._getMarkers(viewStart, shiftStart)}\n {shiftEnd != null && this._getMarkers(viewEnd, shiftEnd)}\n <Scrubber\n isDragging={shiftStart != null}\n onMouseDown={this._draggerStart.handleMouseDown}\n onMouseEnter={this._draggerStart.handleMouseEnter}\n onMouseLeave={this._draggerStart.handleMouseLeave}\n position={viewStart || 0}\n />\n <Scrubber\n isDragging={shiftEnd != null}\n position={viewEnd || 1}\n onMouseDown={this._draggerEnd.handleMouseDown}\n onMouseEnter={this._draggerEnd.handleMouseEnter}\n onMouseLeave={this._draggerEnd.handleMouseLeave}\n />\n {reframe != null && this._getMarkers(reframe.anchor, reframe.shift)}\n </svg>\n {/* fullOverlay updates the mouse cursor blocks mouse events */}\n {haveNextTimeRange && <div className={styles.ViewingLayerFullOverlay} />}\n </div>\n );\n }\n}\n\nexport default withTheme2(UnthemedViewingLayer);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport cx from 'classnames';\nimport memoizeOne from 'memoize-one';\nimport * as React from 'react';\n\nimport { TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from '../..';\nimport { TraceSpan, Trace } from '../../types/trace';\nimport { ubPb2, ubPx2, ubRelative } from '../../uberUtilityStyles';\n\nimport CanvasSpanGraph from './CanvasSpanGraph';\nimport TickLabels from './TickLabels';\nimport ViewingLayer from './ViewingLayer';\n\nconst DEFAULT_HEIGHT = 60;\nconst TIMELINE_TICK_INTERVAL = 4;\n\ntype SpanGraphProps = {\n height?: number;\n trace: Trace;\n viewRange: ViewRange;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n updateNextViewRangeTime: (nextUpdate: ViewRangeTimeUpdate) => void;\n};\n\ntype SpanItem = {\n valueOffset: number;\n valueWidth: number;\n serviceName: string;\n};\n\nfunction getItem(span: TraceSpan): SpanItem {\n return {\n valueOffset: span.relativeStartTime,\n valueWidth: span.duration,\n serviceName: span.process.serviceName,\n };\n}\n\nfunction getItems(trace: Trace): SpanItem[] {\n return trace.spans.map(getItem);\n}\n\nconst memoizedGetitems = memoizeOne(getItems);\n\nexport default class SpanGraph extends React.PureComponent<SpanGraphProps> {\n static defaultProps = {\n height: DEFAULT_HEIGHT,\n };\n\n render() {\n const { height, trace, viewRange, updateNextViewRangeTime, updateViewRangeTime } = this.props;\n if (!trace) {\n return <div />;\n }\n\n const items = memoizedGetitems(trace);\n return (\n <div className={cx(ubPb2, ubPx2)}>\n <TickLabels numTicks={TIMELINE_TICK_INTERVAL} duration={trace.duration} />\n <div className={ubRelative}>\n <CanvasSpanGraph valueWidth={trace.duration} items={items} />\n <ViewingLayer\n viewRange={viewRange}\n numTicks={TIMELINE_TICK_INTERVAL}\n height={height || DEFAULT_HEIGHT}\n updateViewRangeTime={updateViewRangeTime}\n updateNextViewRangeTime={updateNextViewRangeTime}\n />\n </div>\n </div>\n );\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { css } from '@emotion/css';\nimport cx from 'classnames';\nimport { get as _get, maxBy as _maxBy, values as _values } from 'lodash';\nimport * as React from 'react';\nimport MdKeyboardArrowRight from 'react-icons/lib/md/keyboard-arrow-right';\n\nimport { dateTimeFormat, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { autoColor, TUpdateViewRangeTimeFunction, ViewRange, ViewRangeTimeUpdate } from '..';\nimport ExternalLinks from '../common/ExternalLinks';\nimport LabeledList from '../common/LabeledList';\nimport TraceName from '../common/TraceName';\nimport { getTraceLinks } from '../model/link-patterns';\nimport { getTraceName } from '../model/trace-viewer';\nimport { Trace } from '../types/trace';\nimport { uTxMuted } from '../uberUtilityStyles';\nimport { formatDuration } from '../utils/date';\n\nimport SpanGraph from './SpanGraph';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n TracePageHeader: css`\n label: TracePageHeader;\n & > :first-child {\n border-bottom: 1px solid ${autoColor(theme, '#e8e8e8')};\n }\n & > :nth-child(2) {\n background-color: ${autoColor(theme, '#eee')};\n border-bottom: 1px solid ${autoColor(theme, '#e4e4e4')};\n }\n & > :last-child {\n border-bottom: 1px solid ${autoColor(theme, '#ccc')};\n }\n `,\n TracePageHeaderTitleRow: css`\n label: TracePageHeaderTitleRow;\n align-items: center;\n display: flex;\n `,\n TracePageHeaderBack: css`\n label: TracePageHeaderBack;\n align-items: center;\n align-self: stretch;\n background-color: #fafafa;\n border-bottom: 1px solid #ddd;\n border-right: 1px solid #ddd;\n color: inherit;\n display: flex;\n font-size: 1.4rem;\n padding: 0 1rem;\n margin-bottom: -1px;\n &:hover {\n background-color: #f0f0f0;\n border-color: #ccc;\n }\n `,\n TracePageHeaderTitleLink: css`\n label: TracePageHeaderTitleLink;\n align-items: center;\n display: flex;\n flex: 1;\n\n &:hover * {\n text-decoration: underline;\n }\n &:hover > *,\n &:hover small {\n text-decoration: none;\n }\n `,\n TracePageHeaderDetailToggle: css`\n label: TracePageHeaderDetailToggle;\n font-size: 2.5rem;\n transition: transform 0.07s ease-out;\n `,\n TracePageHeaderDetailToggleExpanded: css`\n label: TracePageHeaderDetailToggleExpanded;\n transform: rotate(90deg);\n `,\n TracePageHeaderTitle: css`\n label: TracePageHeaderTitle;\n color: inherit;\n flex: 1;\n font-size: 1.7em;\n line-height: 1em;\n margin: 0 0 0 0.5em;\n padding-bottom: 0.5em;\n `,\n TracePageHeaderTitleCollapsible: css`\n label: TracePageHeaderTitleCollapsible;\n margin-left: 0;\n `,\n TracePageHeaderOverviewItems: css`\n label: TracePageHeaderOverviewItems;\n border-bottom: 1px solid #e4e4e4;\n padding: 0.25rem 0.5rem !important;\n `,\n TracePageHeaderOverviewItemValueDetail: cx(\n css`\n label: TracePageHeaderOverviewItemValueDetail;\n color: #aaa;\n `,\n 'trace-item-value-detail'\n ),\n TracePageHeaderOverviewItemValue: css`\n label: TracePageHeaderOverviewItemValue;\n &:hover > .trace-item-value-detail {\n color: unset;\n }\n `,\n TracePageHeaderArchiveIcon: css`\n label: TracePageHeaderArchiveIcon;\n font-size: 1.78em;\n margin-right: 0.15em;\n `,\n TracePageHeaderTraceId: css`\n label: TracePageHeaderTraceId;\n white-space: nowrap;\n `,\n };\n};\n\ntype TracePageHeaderEmbedProps = {\n canCollapse: boolean;\n hideMap: boolean;\n hideSummary: boolean;\n onSlimViewClicked: () => void;\n onTraceGraphViewClicked: () => void;\n slimView: boolean;\n trace: Trace;\n updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void;\n updateViewRangeTime: TUpdateViewRangeTimeFunction;\n viewRange: ViewRange;\n timeZone: TimeZone;\n};\n\nexport const HEADER_ITEMS = [\n {\n key: 'timestamp',\n label: 'Trace Start:',\n renderer(trace: Trace, timeZone: TimeZone, styles: ReturnType<typeof getStyles>) {\n // Convert date from micro to milli seconds\n const dateStr = dateTimeFormat(trace.startTime / 1000, { timeZone, defaultWithMS: true });\n const match = dateStr.match(/^(.+)(:\\d\\d\\.\\d+)$/);\n return match ? (\n <span className={styles.TracePageHeaderOverviewItemValue}>\n {match[1]}\n <span className={styles.TracePageHeaderOverviewItemValueDetail}>{match[2]}</span>\n </span>\n ) : (\n dateStr\n );\n },\n },\n {\n key: 'duration',\n label: 'Duration:',\n renderer: (trace: Trace) => formatDuration(trace.duration),\n },\n {\n key: 'service-count',\n label: 'Services:',\n renderer: (trace: Trace) => new Set(_values(trace.processes).map((p) => p.serviceName)).size,\n },\n {\n key: 'depth',\n label: 'Depth:',\n renderer: (trace: Trace) => _get(_maxBy(trace.spans, 'depth'), 'depth', 0) + 1,\n },\n {\n key: 'span-count',\n label: 'Total Spans:',\n renderer: (trace: Trace) => trace.spans.length,\n },\n];\n\nexport default function TracePageHeader(props: TracePageHeaderEmbedProps) {\n const {\n canCollapse,\n hideMap,\n hideSummary,\n onSlimViewClicked,\n slimView,\n trace,\n updateNextViewRangeTime,\n updateViewRangeTime,\n viewRange,\n timeZone,\n } = props;\n\n const styles = useStyles2(getStyles);\n const links = React.useMemo(() => {\n if (!trace) {\n return [];\n }\n return getTraceLinks(trace);\n }, [trace]);\n\n if (!trace) {\n return null;\n }\n\n const summaryItems =\n !hideSummary &&\n !slimView &&\n HEADER_ITEMS.map((item) => {\n const { renderer, ...rest } = item;\n return { ...rest, value: renderer(trace, timeZone, styles) };\n });\n\n const title = (\n <h1 className={cx(styles.TracePageHeaderTitle, canCollapse && styles.TracePageHeaderTitleCollapsible)}>\n <TraceName traceName={getTraceName(trace.spans)} />{' '}\n <small className={cx(styles.TracePageHeaderTraceId, uTxMuted)}>{trace.traceID}</small>\n </h1>\n );\n\n return (\n <header className={styles.TracePageHeader}>\n <div className={styles.TracePageHeaderTitleRow}>\n {links && links.length > 0 && <ExternalLinks links={links} className={styles.TracePageHeaderBack} />}\n {canCollapse ? (\n <a\n className={styles.TracePageHeaderTitleLink}\n onClick={onSlimViewClicked}\n role=\"switch\"\n aria-checked={!slimView}\n >\n <MdKeyboardArrowRight\n className={cx(\n styles.TracePageHeaderDetailToggle,\n !slimView && styles.TracePageHeaderDetailToggleExpanded\n )}\n />\n {title}\n </a>\n ) : (\n title\n )}\n </div>\n {summaryItems && <LabeledList className={styles.TracePageHeaderOverviewItems} items={summaryItems} />}\n {!hideMap && !slimView && (\n <SpanGraph\n trace={trace}\n viewRange={viewRange}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n />\n )}\n </header>\n );\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TraceLog, TraceSpanReference } from '../../types/trace';\n\n/**\n * Which items of a {@link SpanDetail} component are expanded.\n */\nexport default class DetailState {\n isTagsOpen: boolean;\n isProcessOpen: boolean;\n logs: { isOpen: boolean; openedItems: Set<TraceLog> };\n references: { isOpen: boolean; openedItems: Set<TraceSpanReference> };\n isWarningsOpen: boolean;\n isStackTracesOpen: boolean;\n isReferencesOpen: boolean;\n\n constructor(oldState?: DetailState) {\n const {\n isTagsOpen,\n isProcessOpen,\n isReferencesOpen,\n isWarningsOpen,\n isStackTracesOpen,\n logs,\n references,\n }: DetailState | Record<string, undefined> = oldState || {};\n this.isTagsOpen = Boolean(isTagsOpen);\n this.isProcessOpen = Boolean(isProcessOpen);\n this.isReferencesOpen = Boolean(isReferencesOpen);\n this.isWarningsOpen = Boolean(isWarningsOpen);\n this.isStackTracesOpen = Boolean(isStackTracesOpen);\n this.logs = {\n isOpen: Boolean(logs && logs.isOpen),\n openedItems: logs && logs.openedItems ? new Set(logs.openedItems) : new Set(),\n };\n this.references = {\n isOpen: Boolean(references && references.isOpen),\n openedItems: references && references.openedItems ? new Set(references.openedItems) : new Set(),\n };\n }\n\n toggleTags() {\n const next = new DetailState(this);\n next.isTagsOpen = !this.isTagsOpen;\n return next;\n }\n\n toggleProcess() {\n const next = new DetailState(this);\n next.isProcessOpen = !this.isProcessOpen;\n return next;\n }\n\n toggleReferences() {\n const next = new DetailState(this);\n next.references.isOpen = !this.references.isOpen;\n return next;\n }\n\n toggleReferenceItem(reference: TraceSpanReference) {\n const next = new DetailState(this);\n if (next.references.openedItems.has(reference)) {\n next.references.openedItems.delete(reference);\n } else {\n next.references.openedItems.add(reference);\n }\n return next;\n }\n\n toggleWarnings() {\n const next = new DetailState(this);\n next.isWarningsOpen = !this.isWarningsOpen;\n return next;\n }\n\n toggleStackTraces() {\n const next = new DetailState(this);\n next.isStackTracesOpen = !this.isStackTracesOpen;\n return next;\n }\n\n toggleLogs() {\n const next = new DetailState(this);\n next.logs.isOpen = !this.logs.isOpen;\n return next;\n }\n\n toggleLogItem(logItem: TraceLog) {\n const next = new DetailState(this);\n if (next.logs.openedItems.has(logItem)) {\n next.logs.openedItems.delete(logItem);\n } else {\n next.logs.openedItems.add(logItem);\n }\n return next;\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport default class TreeNode {\n static iterFunction(fn, depth = 0) {\n return (node) => fn(node.value, node, depth);\n }\n\n static searchFunction(search) {\n if (typeof search === 'function') {\n return search;\n }\n\n return (value, node) => (search instanceof TreeNode ? node === search : value === search);\n }\n\n constructor(value, children = []) {\n this.value = value;\n this.children = children;\n }\n\n get depth() {\n return this.children.reduce((depth, child) => Math.max(child.depth + 1, depth), 1);\n }\n\n get size() {\n let i = 0;\n this.walk(() => i++);\n return i;\n }\n\n addChild(child) {\n this.children.push(child instanceof TreeNode ? child : new TreeNode(child));\n return this;\n }\n\n find(search) {\n const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n if (searchFn(this)) {\n return this;\n }\n for (let i = 0; i < this.children.length; i++) {\n const result = this.children[i].find(search);\n if (result) {\n return result;\n }\n }\n return null;\n }\n\n getPath(search) {\n const searchFn = TreeNode.iterFunction(TreeNode.searchFunction(search));\n\n const findPath = (currentNode, currentPath) => {\n // skip if we already found the result\n const attempt = currentPath.concat([currentNode]);\n // base case: return the array when there is a match\n if (searchFn(currentNode)) {\n return attempt;\n }\n for (let i = 0; i < currentNode.children.length; i++) {\n const child = currentNode.children[i];\n const match = findPath(child, attempt);\n if (match) {\n return match;\n }\n }\n return null;\n };\n\n return findPath(this, []);\n }\n\n walk(fn, depth = 0) {\n const nodeStack = [];\n let actualDepth = depth;\n nodeStack.push({ node: this, depth: actualDepth });\n while (nodeStack.length) {\n const { node, depth: nodeDepth } = nodeStack.pop();\n fn(node.value, node, nodeDepth);\n actualDepth = nodeDepth + 1;\n let i = node.children.length - 1;\n while (i >= 0) {\n nodeStack.push({ node: node.children[i], depth: actualDepth });\n i--;\n }\n }\n }\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport const getProcessServiceName = (proc) => proc.serviceName;\nexport const getProcessTags = (proc) => proc.tags;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport fuzzy from 'fuzzy';\nimport { createSelector } from 'reselect';\n\nimport { getProcessServiceName } from './process';\n\nexport const getSpanId = (span) => span.spanID;\nexport const getSpanName = (span) => span.operationName;\nexport const getSpanDuration = (span) => span.duration;\nexport const getSpanTimestamp = (span) => span.startTime;\nexport const getSpanProcessId = (span) => span.processID;\nexport const getSpanReferences = (span) => span.references || [];\nexport const getSpanReferenceByType = createSelector(\n createSelector(({ span }) => span, getSpanReferences),\n ({ type }) => type,\n (references, type) => references.find((ref) => ref.refType === type)\n);\nexport const getSpanParentId = createSelector(\n (span) => getSpanReferenceByType({ span, type: 'CHILD_OF' }),\n (childOfRef) => (childOfRef ? childOfRef.spanID : null)\n);\n\nexport const getSpanProcess = (span) => {\n if (!span.process) {\n throw new Error(\n `\n you must hydrate the spans with the processes, perhaps\n using hydrateSpansWithProcesses(), before accessing a span's process\n `\n );\n }\n\n return span.process;\n};\n\nexport const getSpanServiceName = createSelector(getSpanProcess, getProcessServiceName);\n\nexport const filterSpansForTimestamps = createSelector(\n ({ spans }) => spans,\n ({ leftBound }) => leftBound,\n ({ rightBound }) => rightBound,\n (spans, leftBound, rightBound) =>\n spans.filter((span) => getSpanTimestamp(span) >= leftBound && getSpanTimestamp(span) <= rightBound)\n);\n\nexport const filterSpansForText = createSelector(\n ({ spans }) => spans,\n ({ text }) => text,\n (spans, text) =>\n fuzzy\n .filter(text, spans, {\n extract: (span) => `${getSpanServiceName(span)} ${getSpanName(span)}`,\n })\n .map(({ original }) => original)\n);\n\nconst getTextFilterdSpansAsMap = createSelector(filterSpansForText, (matchingSpans) =>\n matchingSpans.reduce(\n (obj, span) => ({\n ...obj,\n [getSpanId(span)]: span,\n }),\n {}\n )\n);\n\nexport const highlightSpansForTextFilter = createSelector(\n ({ spans }) => spans,\n getTextFilterdSpansAsMap,\n (spans, textFilteredSpansMap) =>\n spans.map((span) => ({\n ...span,\n muted: !textFilteredSpansMap[getSpanId(span)],\n }))\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { createSelector, createStructuredSelector } from 'reselect';\n\nimport TreeNode from '../utils/TreeNode';\nimport { formatMillisecondTime, formatSecondTime, ONE_SECOND } from '../utils/date';\nimport { numberSortComparator } from '../utils/sort';\n\nimport { getProcessServiceName } from './process';\nimport {\n getSpanId,\n getSpanName,\n getSpanServiceName,\n getSpanTimestamp,\n getSpanDuration,\n getSpanProcessId,\n} from './span';\n\nexport const getTraceId = (trace) => trace.traceID;\n\nexport const getTraceSpans = (trace) => trace.spans;\n\nconst getTraceProcesses = (trace) => trace.processes;\n\nconst getSpanWithProcess = createSelector(\n (state) => state.span,\n (state) => state.processes,\n (span, processes) => ({\n ...span,\n process: processes[getSpanProcessId(span)],\n })\n);\n\nexport const getTraceSpansAsMap = createSelector(getTraceSpans, (spans) =>\n spans.reduce((map, span) => map.set(getSpanId(span), span), new Map())\n);\n\nexport const TREE_ROOT_ID = '__root__';\n\n/**\n * Build a tree of { value: spanID, children } items derived from the\n * `span.references` information. The tree represents the grouping of parent /\n * child relationships. The root-most node is nominal in that\n * `.value === TREE_ROOT_ID`. This is done because a root span (the main trace\n * span) is not always included with the trace data. Thus, there can be\n * multiple top-level spans, and the root node acts as their common parent.\n *\n * The children are sorted by `span.startTime` after the tree is built.\n *\n * @param {Trace} trace The trace to build the tree of spanIDs.\n * @return {TreeNode} A tree of spanIDs derived from the relationships\n * between spans in the trace.\n */\nexport function getTraceSpanIdsAsTree(trace) {\n const nodesById = new Map(trace.spans.map((span) => [span.spanID, new TreeNode(span.spanID)]));\n const spansById = new Map(trace.spans.map((span) => [span.spanID, span]));\n const root = new TreeNode(TREE_ROOT_ID);\n trace.spans.forEach((span) => {\n const node = nodesById.get(span.spanID);\n if (Array.isArray(span.references) && span.references.length) {\n const { refType, spanID: parentID } = span.references[0];\n if (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM') {\n const parent = nodesById.get(parentID) || root;\n parent.children.push(node);\n } else {\n throw new Error(`Unrecognized ref type: ${refType}`);\n }\n } else {\n root.children.push(node);\n }\n });\n const comparator = (nodeA, nodeB) => {\n const a = spansById.get(nodeA.value);\n const b = spansById.get(nodeB.value);\n return +(a.startTime > b.startTime) || +(a.startTime === b.startTime) - 1;\n };\n trace.spans.forEach((span) => {\n const node = nodesById.get(span.spanID);\n if (node.children.length > 1) {\n node.children.sort(comparator);\n }\n });\n root.children.sort(comparator);\n return root;\n}\n\n// attach \"process\" as an object to each span.\nexport const hydrateSpansWithProcesses = (trace) => {\n const spans = getTraceSpans(trace);\n const processes = getTraceProcesses(trace);\n\n return {\n ...trace,\n spans: spans.map((span) => getSpanWithProcess({ span, processes })),\n };\n};\n\nexport const getTraceSpanCount = createSelector(getTraceSpans, (spans) => spans.length);\n\nexport const getTraceTimestamp = createSelector(getTraceSpans, (spans) =>\n spans.reduce(\n (prevTimestamp, span) => (prevTimestamp ? Math.min(prevTimestamp, getSpanTimestamp(span)) : getSpanTimestamp(span)),\n null\n )\n);\n\nexport const getTraceDuration = createSelector(getTraceSpans, getTraceTimestamp, (spans, timestamp) =>\n spans.reduce(\n (prevDuration, span) =>\n prevDuration\n ? Math.max(getSpanTimestamp(span) - timestamp + getSpanDuration(span), prevDuration)\n : getSpanDuration(span),\n null\n )\n);\n\nexport const getTraceEndTimestamp = createSelector(\n getTraceTimestamp,\n getTraceDuration,\n (timestamp, duration) => timestamp + duration\n);\n\nexport const getParentSpan = createSelector(\n getTraceSpanIdsAsTree,\n getTraceSpansAsMap,\n (tree, spanMap) =>\n tree.children\n .map((node) => spanMap.get(node.value))\n .sort((spanA, spanB) => numberSortComparator(getSpanTimestamp(spanA), getSpanTimestamp(spanB)))[0]\n);\n\nexport const getTraceDepth = createSelector(getTraceSpanIdsAsTree, (spanTree) => spanTree.depth - 1);\n\nexport const getSpanDepthForTrace = createSelector(\n createSelector((state) => state.trace, getTraceSpanIdsAsTree),\n createSelector((state) => state.span, getSpanId),\n (node, spanID) => node.getPath(spanID).length - 1\n);\n\nexport const getTraceServices = createSelector(getTraceProcesses, (processes) =>\n Object.keys(processes).reduce(\n (services, processID) => services.add(getProcessServiceName(processes[processID])),\n new Set()\n )\n);\n\nexport const getTraceServiceCount = createSelector(getTraceServices, (services) => services.size);\n\n// establish constants to determine how math should be handled\n// for nanosecond-to-millisecond conversions.\nexport const DURATION_FORMATTERS = {\n ms: formatMillisecondTime,\n s: formatSecondTime,\n};\n\nconst getDurationFormatterForTrace = createSelector(getTraceDuration, (totalDuration) =>\n totalDuration >= ONE_SECOND ? DURATION_FORMATTERS.s : DURATION_FORMATTERS.ms\n);\n\nexport const formatDurationForUnit = createSelector(\n ({ duration }) => duration,\n ({ unit }) => DURATION_FORMATTERS[unit],\n (duration, formatter) => formatter(duration)\n);\n\nexport const formatDurationForTrace = createSelector(\n ({ duration }) => duration,\n createSelector(({ trace }) => trace, getDurationFormatterForTrace),\n (duration, formatter) => formatter(duration)\n);\n\nexport const getSortedSpans = createSelector(\n ({ trace }) => trace,\n ({ spans }) => spans,\n ({ sort }) => sort,\n (trace, spans, { dir, comparator, selector }) =>\n [...spans].sort((spanA, spanB) => dir * comparator(selector(spanA, trace), selector(spanB, trace)))\n);\n\nconst getTraceSpansByHierarchyPosition = createSelector(getTraceSpanIdsAsTree, (tree) => {\n const hierarchyPositionMap = new Map();\n let i = 0;\n tree.walk((spanID) => hierarchyPositionMap.set(spanID, i++));\n return hierarchyPositionMap;\n});\n\nexport const getTreeSizeForTraceSpan = createSelector(\n createSelector((state) => state.trace, getTraceSpanIdsAsTree),\n createSelector((state) => state.span, getSpanId),\n (tree, spanID) => {\n const node = tree.find(spanID);\n if (!node) {\n return -1;\n }\n return node.size - 1;\n }\n);\n\nexport const getSpanHierarchySortPositionForTrace = createSelector(\n createSelector(({ trace }) => trace, getTraceSpansByHierarchyPosition),\n ({ span }) => span,\n (hierarchyPositionMap, span) => hierarchyPositionMap.get(getSpanId(span))\n);\n\nexport const getTraceName = createSelector(\n createSelector(\n createSelector(hydrateSpansWithProcesses, getParentSpan),\n createStructuredSelector({\n name: getSpanName,\n serviceName: getSpanServiceName,\n })\n ),\n ({ name, serviceName }) => `${serviceName}: ${name}`\n);\n\nexport const omitCollapsedSpans = createSelector(\n ({ spans }) => spans,\n createSelector(({ trace }) => trace, getTraceSpanIdsAsTree),\n ({ collapsed }) => collapsed,\n (spans, tree, collapse) => {\n const hiddenSpanIds = collapse.reduce((result, collapsedSpanId) => {\n tree.find(collapsedSpanId).walk((id) => id !== collapsedSpanId && result.add(id));\n return result;\n }, new Set());\n\n return hiddenSpanIds.size > 0 ? spans.filter((span) => !hiddenSpanIds.has(getSpanId(span))) : spans;\n }\n);\n\nexport const DEFAULT_TICK_INTERVAL = 4;\nexport const DEFAULT_TICK_WIDTH = 3;\nexport const getTicksForTrace = createSelector(\n ({ trace }) => trace,\n ({ interval = DEFAULT_TICK_INTERVAL }) => interval,\n ({ width = DEFAULT_TICK_WIDTH }) => width,\n (\n trace,\n interval,\n width\n // timestamps will be spaced over the interval, starting from the initial timestamp\n ) =>\n [...Array(interval + 1).keys()].map((num) => ({\n timestamp: getTraceTimestamp(trace) + getTraceDuration(trace) * (num / interval),\n width,\n }))\n);\n\n// TODO: delete this when the backend can ensure uniqueness\n/* istanbul ignore next */\nexport const enforceUniqueSpanIds = createSelector(\n /* istanbul ignore next */ (trace) => trace,\n getTraceSpans,\n /* istanbul ignore next */ (trace, spans) => {\n const map = new Map();\n\n return {\n ...trace,\n spans: spans.reduce((result, span) => {\n const spanID = map.has(getSpanId(span)) ? `${getSpanId(span)}_${map.get(getSpanId(span))}` : getSpanId(span);\n const updatedSpan = { ...span, spanID };\n\n if (spanID !== getSpanId(span)) {\n // eslint-disable-next-line no-console\n console.warn('duplicate spanID in trace replaced', getSpanId(span), 'new:', spanID);\n }\n\n // set the presence of the span in the map or increment the number\n map.set(getSpanId(span), (map.get(getSpanId(span)) || 0) + 1);\n\n return result.concat([updatedSpan]);\n }, []),\n };\n }\n);\n\n// TODO: delete this when the backend can ensure uniqueness\nexport const dropEmptyStartTimeSpans = createSelector(\n /* istanbul ignore next */ (trace) => trace,\n getTraceSpans,\n /* istanbul ignore next */ (trace, spans) => ({\n ...trace,\n spans: spans.filter((span) => !!getSpanTimestamp(span)),\n })\n);\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nexport function localeStringComparator(itemA, itemB) {\n return itemA.localeCompare(itemB);\n}\n\nexport function numberSortComparator(itemA, itemB) {\n return itemA - itemB;\n}\n\nexport function classNameForSortDir(dir) {\n return `sorted ${dir === 1 ? 'ascending' : 'descending'}`;\n}\n\nexport function getNewSortForClick(prevSort, column) {\n const { defaultDir = 1 } = column;\n\n return {\n key: column.name,\n dir: prevSort.key === column.name ? -1 * prevSort.dir : defaultDir,\n };\n}\n\nexport function createSortClickHandler(column, currentSortKey, currentSortDir, updateSort) {\n return function onClickSortingElement() {\n const { key, dir } = getNewSortForClick({ key: currentSortKey, dir: currentSortDir }, column);\n updateSort(key, dir);\n };\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { isEqual as _isEqual } from 'lodash';\n\n// @ts-ignore\nimport { getTraceSpanIdsAsTree } from '../selectors/trace';\nimport { TraceKeyValuePair, TraceSpan, Trace, TraceResponse, TraceProcess } from '../types/trace';\n// @ts-ignore\nimport TreeNode from '../utils/TreeNode';\nimport { getConfigValue } from '../utils/config/get-config';\n\nimport { getTraceName } from './trace-viewer';\n\n// exported for tests\nexport function deduplicateTags(spanTags: TraceKeyValuePair[]) {\n const warningsHash: Map<string, string> = new Map<string, string>();\n const tags: TraceKeyValuePair[] = spanTags.reduce<TraceKeyValuePair[]>((uniqueTags, tag) => {\n if (!uniqueTags.some((t) => t.key === tag.key && t.value === tag.value)) {\n uniqueTags.push(tag);\n } else {\n warningsHash.set(`${tag.key}:${tag.value}`, `Duplicate tag \"${tag.key}:${tag.value}\"`);\n }\n return uniqueTags;\n }, []);\n const warnings = Array.from(warningsHash.values());\n return { tags, warnings };\n}\n\n// exported for tests\nexport function orderTags(spanTags: TraceKeyValuePair[], topPrefixes?: string[]) {\n const orderedTags: TraceKeyValuePair[] = spanTags?.slice() ?? [];\n const tp = (topPrefixes || []).map((p: string) => p.toLowerCase());\n\n orderedTags.sort((a, b) => {\n const aKey = a.key.toLowerCase();\n const bKey = b.key.toLowerCase();\n\n for (let i = 0; i < tp.length; i++) {\n const p = tp[i];\n if (aKey.startsWith(p) && !bKey.startsWith(p)) {\n return -1;\n }\n if (!aKey.startsWith(p) && bKey.startsWith(p)) {\n return 1;\n }\n }\n\n if (aKey > bKey) {\n return 1;\n }\n if (aKey < bKey) {\n return -1;\n }\n return 0;\n });\n\n return orderedTags;\n}\n\n/**\n * NOTE: Mutates `data` - Transform the HTTP response data into the form the app\n * generally requires.\n */\nexport default function transformTraceData(data: TraceResponse | undefined): Trace | null {\n if (!data?.traceID) {\n return null;\n }\n const traceID = data.traceID.toLowerCase();\n\n let traceEndTime = 0;\n let traceStartTime = Number.MAX_SAFE_INTEGER;\n const spanIdCounts = new Map();\n const spanMap = new Map<string, TraceSpan>();\n // filter out spans with empty start times\n // eslint-disable-next-line no-param-reassign\n data.spans = data.spans.filter((span) => Boolean(span.startTime));\n\n // Sort process tags\n data.processes = Object.entries(data.processes).reduce<Record<string, TraceProcess>>((processes, [id, process]) => {\n processes[id] = {\n ...process,\n tags: orderTags(process.tags),\n };\n return processes;\n }, {});\n\n const max = data.spans.length;\n for (let i = 0; i < max; i++) {\n const span: TraceSpan = data.spans[i] as TraceSpan;\n const { startTime, duration, processID } = span;\n\n let spanID = span.spanID;\n // check for start / end time for the trace\n if (startTime < traceStartTime) {\n traceStartTime = startTime;\n }\n if (startTime + duration > traceEndTime) {\n traceEndTime = startTime + duration;\n }\n // make sure span IDs are unique\n const idCount = spanIdCounts.get(spanID);\n if (idCount != null) {\n // eslint-disable-next-line no-console\n console.warn(`Dupe spanID, ${idCount + 1} x ${spanID}`, span, spanMap.get(spanID));\n if (_isEqual(span, spanMap.get(spanID))) {\n // eslint-disable-next-line no-console\n console.warn('\\t two spans with same ID have `isEqual(...) === true`');\n }\n spanIdCounts.set(spanID, idCount + 1);\n spanID = `${spanID}_${idCount}`;\n span.spanID = spanID;\n } else {\n spanIdCounts.set(spanID, 1);\n }\n span.process = data.processes[processID];\n spanMap.set(spanID, span);\n }\n // tree is necessary to sort the spans, so children follow parents, and\n // siblings are sorted by start time\n const tree = getTraceSpanIdsAsTree(data);\n const spans: TraceSpan[] = [];\n const svcCounts: Record<string, number> = {};\n\n // Eslint complains about number type not needed but then TS complains it is implicitly any.\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n tree.walk((spanID: string, node: TreeNode, depth: number = 0) => {\n if (spanID === '__root__') {\n return;\n }\n const span = spanMap.get(spanID) as TraceSpan;\n if (!span) {\n return;\n }\n const { serviceName } = span.process;\n svcCounts[serviceName] = (svcCounts[serviceName] || 0) + 1;\n span.relativeStartTime = span.startTime - traceStartTime;\n span.depth = depth - 1;\n span.hasChildren = node.children.length > 0;\n span.childSpanCount = node.children.length;\n span.warnings = span.warnings || [];\n span.tags = span.tags || [];\n span.references = span.references || [];\n const tagsInfo = deduplicateTags(span.tags);\n span.tags = orderTags(tagsInfo.tags, getConfigValue('topTagPrefixes'));\n span.warnings = span.warnings.concat(tagsInfo.warnings);\n span.references.forEach((ref, index) => {\n const refSpan = spanMap.get(ref.spanID) as TraceSpan;\n if (refSpan) {\n // eslint-disable-next-line no-param-reassign\n ref.span = refSpan;\n if (index > 0) {\n // Don't take into account the parent, just other references.\n refSpan.subsidiarilyReferencedBy = refSpan.subsidiarilyReferencedBy || [];\n refSpan.subsidiarilyReferencedBy.push({\n spanID,\n traceID,\n span,\n refType: ref.refType,\n });\n }\n }\n });\n spans.push(span);\n });\n const traceName = getTraceName(spans);\n const services = Object.keys(svcCounts).map((name) => ({ name, numberOfSpans: svcCounts[name] }));\n return {\n services,\n spans,\n traceID,\n traceName,\n // can't use spread operator for intersection types\n // repl: https://goo.gl/4Z23MJ\n // issue: https://github.com/facebook/flow/issues/1511\n processes: data.processes,\n duration: traceEndTime - traceStartTime,\n startTime: traceStartTime,\n endTime: traceEndTime,\n };\n}\n","// Copyright (c) 2019 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TNil } from '../types';\nimport { TraceKeyValuePair, TraceSpan } from '../types/trace';\n\nexport default function filterSpans(textFilter: string, spans: TraceSpan[] | TNil) {\n if (!spans) {\n return undefined;\n }\n\n // if a span field includes at least one filter in includeFilters, the span is a match\n const includeFilters: string[] = [];\n\n // values with keys that include text in any one of the excludeKeys will be ignored\n const excludeKeys: string[] = [];\n\n // split textFilter by whitespace, remove empty strings, and extract includeFilters and excludeKeys\n textFilter\n .split(/\\s+/)\n .filter(Boolean)\n .forEach((w) => {\n if (w[0] === '-') {\n excludeKeys.push(w.slice(1).toLowerCase());\n } else {\n includeFilters.push(w.toLowerCase());\n }\n });\n\n const isTextInFilters = (filters: string[], text: string) =>\n filters.some((filter) => text.toLowerCase().includes(filter));\n\n const isTextInKeyValues = (kvs: TraceKeyValuePair[]) =>\n kvs\n ? kvs.some((kv) => {\n // ignore checking key and value for a match if key is in excludeKeys\n if (isTextInFilters(excludeKeys, kv.key)) {\n return false;\n }\n // match if key or value matches an item in includeFilters\n return isTextInFilters(includeFilters, kv.key) || isTextInFilters(includeFilters, kv.value.toString());\n })\n : false;\n\n const isSpanAMatch = (span: TraceSpan) =>\n isTextInFilters(includeFilters, span.operationName) ||\n isTextInFilters(includeFilters, span.process.serviceName) ||\n isTextInKeyValues(span.tags) ||\n (span.logs !== null && span.logs.some((log) => isTextInKeyValues(log.fields))) ||\n isTextInKeyValues(span.process.tags) ||\n includeFilters.some((filter) => filter === span.spanID);\n\n // declare as const because need to disambiguate the type\n const rv: Set<string> = new Set(spans.filter(isSpanAMatch).map((span: TraceSpan) => span.spanID));\n return rv;\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n DataSourceJsonData,\n DataSourcePluginOptionsEditorProps,\n GrafanaTheme,\n toOption,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { InlineField, InlineFieldRow, Input, Select, useStyles } from '@grafana/ui';\n\nexport interface SpanBarOptions {\n type?: string;\n tag?: string;\n}\n\nexport interface SpanBarOptionsData extends DataSourceJsonData {\n spanBar?: SpanBarOptions;\n}\n\nexport const NONE = 'None';\nexport const DURATION = 'Duration';\nexport const TAG = 'Tag';\n\ninterface Props extends DataSourcePluginOptionsEditorProps<SpanBarOptionsData> {}\n\nexport default function SpanBarSettings({ options, onOptionsChange }: Props) {\n const styles = useStyles(getStyles);\n const selectOptions = [NONE, DURATION, TAG].map(toOption);\n\n return (\n <div className={css({ width: '100%' })}>\n <h3 className=\"page-heading\">Span bar label</h3>\n\n <div className={styles.infoText}>Span bar label lets you add additional info to the span bar row.</div>\n\n <InlineFieldRow className={styles.row}>\n <InlineField label=\"Label\" labelWidth={26} grow>\n <Select\n inputId=\"label\"\n options={selectOptions}\n value={options.jsonData.spanBar?.type || ''}\n onChange={(v) => {\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'spanBar', {\n ...options.jsonData.spanBar,\n type: v?.value ?? '',\n });\n }}\n placeholder=\"Duration\"\n isClearable\n aria-label={'select-label-name'}\n width={25}\n />\n </InlineField>\n </InlineFieldRow>\n {options.jsonData.spanBar?.type === TAG && (\n <InlineFieldRow className={styles.row}>\n <InlineField label=\"Tag key\" labelWidth={26} tooltip=\"Tag key which will be used to get the tag value\">\n <Input\n type=\"text\"\n placeholder=\"Enter tag key\"\n onChange={(v) =>\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'spanBar', {\n ...options.jsonData.spanBar,\n tag: v.currentTarget.value,\n })\n }\n value={options.jsonData.spanBar?.tag || ''}\n width={25}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme) => ({\n infoText: css`\n label: infoText;\n padding-bottom: ${theme.spacing.md};\n color: ${theme.colors.textSemiWeak};\n `,\n\n row: css`\n label: row;\n align-items: baseline;\n `,\n});\n","import { css } from '@emotion/css';\n\nexport const ubRelative = css`\n position: relative;\n`;\n\nexport const ubMb1 = css`\n margin-bottom: 0.25rem;\n`;\n\nexport const ubMy1 = css`\n margin-top: 0.25rem;\n margin-bottom: 0.25rem;\n`;\n\nexport const ubM0 = css`\n margin: 0;\n`;\n\nexport const ubPx2 = css`\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n`;\n\nexport const ubPb2 = css`\n padding-bottom: 0.5rem;\n`;\n\nexport const ubFlex = css`\n display: flex;\n`;\n\nexport const ubItemsCenter = css`\n align-items: center;\n`;\n\nexport const ubItemsStart = css`\n align-items: start;\n`;\n\nexport const ubFlexAuto = css`\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n`;\n\nexport const ubTxRightAlign = css`\n text-align: right;\n`;\n\nexport const ubInlineBlock = css`\n display: inline-block;\n`;\n\nexport const uAlignIcon = css`\n margin: -0.2rem 0.25rem 0 0;\n`;\n\nexport const uTxEllipsis = css`\n text-overflow: ellipsis;\n`;\n\nexport const uWidth100 = css`\n width: 100%;\n`;\n\nexport const uTxMuted = css`\n color: #aaa;\n`;\n\nexport const ubJustifyEnd = css`\n justify-content: flex-end;\n`;\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport memoizeOne from 'memoize-one';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { colors } from '@grafana/ui';\n\n// TS needs the precise return type\nfunction strToRgb(s: string): [number, number, number] {\n if (s.length !== 7) {\n return [0, 0, 0];\n }\n const r = s.slice(1, 3);\n const g = s.slice(3, 5);\n const b = s.slice(5);\n return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)];\n}\n\nclass ColorGenerator {\n colorsHex: string[];\n colorsRgb: Array<[number, number, number]>;\n cache: Map<string, number>;\n\n constructor(colorsHex: string[]) {\n this.colorsHex = colorsHex;\n this.colorsRgb = colorsHex.map(strToRgb);\n this.cache = new Map();\n }\n\n _getColorIndex(key: string): number {\n let i = this.cache.get(key);\n if (i == null) {\n const hash = this.hashCode(key.toLowerCase());\n const hashIndex = Math.abs(hash % this.colorsHex.length);\n // colors[4] is red (which we want to disallow as a span color because it looks like an error)\n i = hashIndex === 4 ? hashIndex + 1 : hashIndex;\n this.cache.set(key, i);\n }\n return i;\n }\n\n hashCode(key: string) {\n var hash = 0,\n i,\n chr;\n for (i = 0; i < key.length; i++) {\n chr = key.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n }\n return hash;\n }\n\n /**\n * Will assign a color to an arbitrary key.\n * If the key has been used already, it will\n * use the same color.\n */\n getColorByKey(key: string) {\n const i = this._getColorIndex(key);\n return this.colorsHex[i];\n }\n\n /**\n * Retrieve the RGB values associated with a key. Adds the key and associates\n * it with a color if the key is not recognized.\n * @returns {number[]} An array of three ints [0, 255] representing a color.\n */\n getRgbColorByKey(key: string): [number, number, number] {\n const i = this._getColorIndex(key);\n return this.colorsRgb[i];\n }\n\n clear() {\n this.cache.clear();\n }\n}\n\nconst getGenerator = memoizeOne((colors: string[]) => {\n return new ColorGenerator(colors);\n});\n\nexport function clear() {\n getGenerator([]);\n}\n\nexport function getColorByKey(key: string, theme: GrafanaTheme2) {\n return getGenerator(colors).getColorByKey(key);\n}\n\nexport function getRgbColorByKey(key: string, theme: GrafanaTheme2): [number, number, number] {\n return getGenerator(colors).getRgbColorByKey(key);\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { round as _round, dropWhile as _dropWhile } from 'lodash';\nimport moment from 'moment-timezone';\n\nimport { toFloatPrecision } from './number';\n\nconst TODAY = 'Today';\nconst YESTERDAY = 'Yesterday';\n\nexport const STANDARD_DATE_FORMAT = 'YYYY-MM-DD';\nexport const STANDARD_TIME_FORMAT = 'HH:mm';\nexport const STANDARD_DATETIME_FORMAT = 'MMMM D YYYY, HH:mm:ss.SSS';\nexport const ONE_MILLISECOND = 1000;\nexport const ONE_SECOND = 1000 * ONE_MILLISECOND;\nexport const ONE_MINUTE = 60 * ONE_SECOND;\nexport const ONE_HOUR = 60 * ONE_MINUTE;\nexport const ONE_DAY = 24 * ONE_HOUR;\nexport const DEFAULT_MS_PRECISION = Math.log10(ONE_MILLISECOND);\n\nconst UNIT_STEPS: Array<{ unit: string; microseconds: number; ofPrevious: number }> = [\n { unit: 'd', microseconds: ONE_DAY, ofPrevious: 24 },\n { unit: 'h', microseconds: ONE_HOUR, ofPrevious: 60 },\n { unit: 'm', microseconds: ONE_MINUTE, ofPrevious: 60 },\n { unit: 's', microseconds: ONE_SECOND, ofPrevious: 1000 },\n { unit: 'ms', microseconds: ONE_MILLISECOND, ofPrevious: 1000 },\n { unit: 'μs', microseconds: 1, ofPrevious: 1000 },\n];\n\n/**\n * @param {number} timestamp\n * @param {number} initialTimestamp\n * @param {number} totalDuration\n * @returns {number} 0-100 percentage\n */\nexport function getPercentageOfDuration(duration: number, totalDuration: number) {\n return (duration / totalDuration) * 100;\n}\n\nconst quantizeDuration = (duration: number, floatPrecision: number, conversionFactor: number) =>\n toFloatPrecision(duration / conversionFactor, floatPrecision) * conversionFactor;\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatDate(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_DATE_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatTime(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_TIME_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatDatetime(duration: number) {\n return moment(duration / ONE_MILLISECOND).format(STANDARD_DATETIME_FORMAT);\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in milliseconds\n */\nexport function formatMillisecondTime(duration: number) {\n const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_MILLISECOND);\n return `${moment.duration(targetDuration / ONE_MILLISECOND).asMilliseconds()}ms`;\n}\n\n/**\n * @param {number} duration (in microseconds)\n * @returns {string} formatted, unit-labelled string with time in seconds\n */\nexport function formatSecondTime(duration: number) {\n const targetDuration = quantizeDuration(duration, DEFAULT_MS_PRECISION, ONE_SECOND);\n return `${moment.duration(targetDuration / ONE_MILLISECOND).asSeconds()}s`;\n}\n\n/**\n * Humanizes the duration for display.\n *\n * Example:\n * 5000ms => 5s\n * 1000μs => 1ms\n * 183840s => 2d 3h\n *\n * @param {number} duration (in microseconds)\n * @return {string} formatted duration\n */\nexport function formatDuration(duration: number): string {\n // Drop all units that are too large except the last one\n const [primaryUnit, secondaryUnit] = _dropWhile(\n UNIT_STEPS,\n ({ microseconds }, index) => index < UNIT_STEPS.length - 1 && microseconds > duration\n );\n\n if (primaryUnit.ofPrevious === 1000) {\n // If the unit is decimal based, display as a decimal\n return `${_round(duration / primaryUnit.microseconds, 2)}${primaryUnit.unit}`;\n }\n\n const primaryValue = Math.floor(duration / primaryUnit.microseconds);\n const primaryUnitString = `${primaryValue}${primaryUnit.unit}`;\n const secondaryValue = Math.round((duration / secondaryUnit.microseconds) % primaryUnit.ofPrevious);\n const secondaryUnitString = `${secondaryValue}${secondaryUnit.unit}`;\n return secondaryValue === 0 ? primaryUnitString : `${primaryUnitString} ${secondaryUnitString}`;\n}\n\nexport function formatRelativeDate(value: any, fullMonthName = false) {\n const m = moment.isMoment(value) ? value : moment(value);\n const monthFormat = fullMonthName ? 'MMMM' : 'MMM';\n const dt = new Date();\n if (dt.getFullYear() !== m.year()) {\n return m.format(`${monthFormat} D, YYYY`);\n }\n const mMonth = m.month();\n const mDate = m.date();\n const date = dt.getDate();\n if (mMonth === dt.getMonth() && mDate === date) {\n return TODAY;\n }\n dt.setDate(date - 1);\n if (mMonth === dt.getMonth() && mDate === dt.getDate()) {\n return YESTERDAY;\n }\n return m.format(`${monthFormat} D`);\n}\n","// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * given a number and a desired precision for the floating\n * side, return the number at the new precision.\n *\n * toFloatPrecision(3.55, 1) // 3.5\n * toFloatPrecision(0.04422, 2) // 0.04\n * toFloatPrecision(6.24e6, 2) // 6240000.00\n *\n * does not support numbers that use \"e\" notation on toString.\n *\n * @param {number} number\n * @param {number} precision\n * @returns {number} number at new floating precision\n */\nexport function toFloatPrecision(number: number, precision: number): number {\n const log10Length = Math.floor(Math.log10(Math.abs(number))) + 1;\n const targetPrecision = precision + log10Length;\n\n if (targetPrecision <= 0) {\n return Math.trunc(number);\n }\n\n return Number(number.toPrecision(targetPrecision));\n}\n","import { createAction } from '@reduxjs/toolkit';\n\nimport { StoreState } from '../../types';\n\nexport type StateSelector<T> = (state: StoreState) => T;\n\nexport interface CleanUp<T> {\n stateSelector: (state: StoreState) => T;\n}\n\nexport const cleanUpAction = createAction<CleanUp<{}>>('core/cleanUpState');\n","import { EventBusSrv, EventBusExtended } from '@grafana/data';\n\nexport const appEvents: EventBusExtended = new EventBusSrv();\n\nexport default appEvents;\n","export type ResourcePermission = {\n id: number;\n resourceId: string;\n isManaged: boolean;\n userId?: number;\n userLogin?: string;\n userAvatarUrl?: string;\n team?: string;\n teamId?: number;\n teamAvatarUrl?: string;\n builtInRole?: string;\n actions: string[];\n permission: string;\n};\n\nexport type SetPermission = {\n userId?: number;\n teamId?: number;\n builtInRole?: string;\n permission: string;\n target: PermissionTarget;\n};\n\nexport enum PermissionTarget {\n None = 'None',\n Team = 'Team',\n User = 'User',\n BuiltInRole = 'builtInRole',\n}\nexport type Description = {\n assignments: Assignments;\n permissions: string[];\n};\n\nexport type Assignments = {\n users: boolean;\n teams: boolean;\n builtInRoles: boolean;\n};\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { Button, Form, HorizontalGroup, Select } from '@grafana/ui';\nimport { CloseButton } from 'app/core/components/CloseButton/CloseButton';\nimport { TeamPicker } from 'app/core/components/Select/TeamPicker';\nimport { UserPicker } from 'app/core/components/Select/UserPicker';\nimport { OrgRole } from 'app/types/acl';\n\nimport { Assignments, PermissionTarget, SetPermission } from './types';\n\nexport interface Props {\n title?: string;\n permissions: string[];\n assignments: Assignments;\n onCancel: () => void;\n onAdd: (state: SetPermission) => void;\n}\n\nexport const AddPermission = ({ title = 'Add Permission For', permissions, assignments, onAdd, onCancel }: Props) => {\n const [target, setPermissionTarget] = useState<PermissionTarget>(PermissionTarget.None);\n const [teamId, setTeamId] = useState(0);\n const [userId, setUserId] = useState(0);\n const [builtInRole, setBuiltinRole] = useState('');\n const [permission, setPermission] = useState('');\n\n const targetOptions = useMemo(() => {\n const options = [];\n if (assignments.users) {\n options.push({ value: PermissionTarget.User, label: 'User' });\n }\n if (assignments.teams) {\n options.push({ value: PermissionTarget.Team, label: 'Team' });\n }\n if (assignments.builtInRoles) {\n options.push({ value: PermissionTarget.BuiltInRole, label: 'Role' });\n }\n return options;\n }, [assignments]);\n\n useEffect(() => {\n if (permissions.length > 0) {\n setPermission(permissions[0]);\n }\n }, [permissions]);\n\n const isValid = () =>\n (target === PermissionTarget.Team && teamId > 0) ||\n (target === PermissionTarget.User && userId > 0) ||\n (PermissionTarget.BuiltInRole && OrgRole.hasOwnProperty(builtInRole));\n\n return (\n <div className=\"cta-form\" aria-label=\"Permissions slider\">\n <CloseButton onClick={onCancel} />\n <h5>{title}</h5>\n\n <Form\n name=\"addPermission\"\n maxWidth=\"none\"\n onSubmit={() => onAdd({ userId, teamId, builtInRole, permission, target })}\n >\n {() => (\n <HorizontalGroup>\n <Select\n aria-label=\"Role to add new permission to\"\n value={target}\n options={targetOptions}\n onChange={(v) => setPermissionTarget(v.value!)}\n disabled={targetOptions.length === 0}\n />\n\n {target === PermissionTarget.User && (\n <UserPicker onSelected={(u) => setUserId(u.value || 0)} className={'width-20'} />\n )}\n\n {target === PermissionTarget.Team && (\n <TeamPicker onSelected={(t) => setTeamId(t.value?.id || 0)} className={'width-20'} />\n )}\n\n {target === PermissionTarget.BuiltInRole && (\n <Select\n aria-label={'Built-in role picker'}\n options={Object.values(OrgRole).map((r) => ({ value: r, label: r }))}\n onChange={(r) => setBuiltinRole(r.value || '')}\n width={40}\n />\n )}\n\n <Select\n aria-label=\"Permission Level\"\n width={25}\n value={permissions.find((p) => p === permission)}\n options={permissions.map((p) => ({ label: p, value: p }))}\n onChange={(v) => setPermission(v.value || '')}\n />\n <Button type=\"submit\" disabled={!isValid()}>\n Save\n </Button>\n </HorizontalGroup>\n )}\n </Form>\n </div>\n );\n};\n","import React from 'react';\n\nimport { Button, Icon, Select, Tooltip } from '@grafana/ui';\n\nimport { ResourcePermission } from './types';\n\ninterface Props {\n item: ResourcePermission;\n permissionLevels: string[];\n canSet: boolean;\n onRemove: (item: ResourcePermission) => void;\n onChange: (item: ResourcePermission, permission: string) => void;\n}\n\nexport const PermissionListItem = ({ item, permissionLevels, canSet, onRemove, onChange }: Props) => (\n <tr>\n <td style={{ width: '1%' }}>{getAvatar(item)}</td>\n <td style={{ width: '90%' }}>{getDescription(item)}</td>\n <td>\n <div className=\"gf-form\">\n <Select\n className=\"width-20\"\n disabled={!canSet || !item.isManaged}\n onChange={(p) => onChange(item, p.value!)}\n value={permissionLevels.find((p) => p === item.permission)}\n options={permissionLevels.map((p) => ({ value: p, label: p }))}\n />\n </div>\n </td>\n <td>\n <Tooltip content={getPermissionInfo(item)}>\n <Icon name=\"info-circle\" />\n </Tooltip>\n </td>\n <td>\n {item.isManaged ? (\n <Button\n size=\"sm\"\n icon=\"times\"\n variant=\"destructive\"\n disabled={!canSet}\n onClick={() => onRemove(item)}\n aria-label={`Remove permission for ${getName(item)}`}\n />\n ) : (\n <Tooltip content=\"Provisioned permission\">\n <Button size=\"sm\" icon=\"lock\" />\n </Tooltip>\n )}\n </td>\n </tr>\n);\n\nconst getAvatar = (item: ResourcePermission) => {\n if (item.teamId) {\n return <img className=\"filter-table__avatar\" src={item.teamAvatarUrl} alt={`Avatar for team ${item.teamId}`} />;\n } else if (item.userId) {\n return <img className=\"filter-table__avatar\" src={item.userAvatarUrl} alt={`Avatar for user ${item.userId}`} />;\n }\n return <Icon size=\"xl\" name=\"shield\" />;\n};\n\nconst getName = (item: ResourcePermission) => {\n if (item.userId) {\n return item.userLogin;\n }\n if (item.teamId) {\n return item.team;\n }\n return item.builtInRole;\n};\n\nconst getDescription = (item: ResourcePermission) => {\n if (item.userId) {\n return <span key=\"name\">{item.userLogin} </span>;\n } else if (item.teamId) {\n return <span key=\"name\">{item.team} </span>;\n } else if (item.builtInRole) {\n return <span key=\"name\">{item.builtInRole} </span>;\n }\n return <span key=\"name\" />;\n};\n\nconst getPermissionInfo = (p: ResourcePermission) => `Actions: ${[...new Set(p.actions)].sort().join(' ')}`;\n","import React from 'react';\n\nimport { PermissionListItem } from './PermissionListItem';\nimport { ResourcePermission } from './types';\n\ninterface Props {\n title: string;\n items: ResourcePermission[];\n permissionLevels: string[];\n canSet: boolean;\n onRemove: (item: ResourcePermission) => void;\n onChange: (resourcePermission: ResourcePermission, permission: string) => void;\n}\n\nexport const PermissionList = ({ title, items, permissionLevels, canSet, onRemove, onChange }: Props) => {\n if (items.length === 0) {\n return null;\n }\n\n return (\n <div>\n <table className=\"filter-table gf-form-group\">\n <thead>\n <tr>\n <th style={{ width: '1%' }} />\n <th>{title}</th>\n <th>Permission</th>\n <th style={{ width: '1%' }} />\n <th style={{ width: '1%' }} />\n </tr>\n </thead>\n <tbody>\n {items.map((item, index) => (\n <PermissionListItem\n item={item}\n onRemove={onRemove}\n onChange={onChange}\n canSet={canSet}\n key={`${index}-${item.userId}`}\n permissionLevels={permissionLevels}\n />\n ))}\n </tbody>\n </table>\n </div>\n );\n};\n","import { sortBy } from 'lodash';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Button } from '@grafana/ui';\nimport { SlideDown } from 'app/core/components/Animations/SlideDown';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\n\nimport { AddPermission } from './AddPermission';\nimport { PermissionList } from './PermissionList';\nimport { PermissionTarget, ResourcePermission, SetPermission, Description } from './types';\n\nconst EMPTY_PERMISSION = '';\n\nconst INITIAL_DESCRIPTION: Description = {\n permissions: [],\n assignments: {\n teams: false,\n users: false,\n builtInRoles: false,\n },\n};\n\ntype ResourceId = string | number;\ntype Type = 'users' | 'teams' | 'builtInRoles';\n\nexport type Props = {\n title?: string;\n buttonLabel?: string;\n addPermissionTitle?: string;\n resource: string;\n resourceId: ResourceId;\n canSetPermissions: boolean;\n};\n\nexport const Permissions = ({\n title = 'Permissions',\n buttonLabel = 'Add a permission',\n resource,\n resourceId,\n canSetPermissions,\n addPermissionTitle,\n}: Props) => {\n const [isAdding, setIsAdding] = useState(false);\n const [items, setItems] = useState<ResourcePermission[]>([]);\n const [desc, setDesc] = useState(INITIAL_DESCRIPTION);\n\n const fetchItems = useCallback(() => {\n return getPermissions(resource, resourceId).then((r) => setItems(r));\n }, [resource, resourceId]);\n\n useEffect(() => {\n getDescription(resource).then((r) => {\n setDesc(r);\n return fetchItems();\n });\n }, [resource, resourceId, fetchItems]);\n\n const onAdd = (state: SetPermission) => {\n let promise: Promise<void> | null = null;\n if (state.target === PermissionTarget.User) {\n promise = setUserPermission(resource, resourceId, state.userId!, state.permission);\n } else if (state.target === PermissionTarget.Team) {\n promise = setTeamPermission(resource, resourceId, state.teamId!, state.permission);\n } else if (state.target === PermissionTarget.BuiltInRole) {\n promise = setBuiltInRolePermission(resource, resourceId, state.builtInRole!, state.permission);\n }\n\n if (promise !== null) {\n promise.then(fetchItems);\n }\n };\n\n const onRemove = (item: ResourcePermission) => {\n let promise: Promise<void> | null = null;\n if (item.userId) {\n promise = setUserPermission(resource, resourceId, item.userId, EMPTY_PERMISSION);\n } else if (item.teamId) {\n promise = setTeamPermission(resource, resourceId, item.teamId, EMPTY_PERMISSION);\n } else if (item.builtInRole) {\n promise = setBuiltInRolePermission(resource, resourceId, item.builtInRole, EMPTY_PERMISSION);\n }\n\n if (promise !== null) {\n promise.then(fetchItems);\n }\n };\n\n const onChange = (item: ResourcePermission, permission: string) => {\n if (item.permission === permission) {\n return;\n }\n if (item.userId) {\n onAdd({ permission, userId: item.userId, target: PermissionTarget.User });\n } else if (item.teamId) {\n onAdd({ permission, teamId: item.teamId, target: PermissionTarget.Team });\n } else if (item.builtInRole) {\n onAdd({ permission, builtInRole: item.builtInRole, target: PermissionTarget.BuiltInRole });\n }\n };\n\n const teams = useMemo(\n () =>\n sortBy(\n items.filter((i) => i.teamId),\n ['team']\n ),\n [items]\n );\n const users = useMemo(\n () =>\n sortBy(\n items.filter((i) => i.userId),\n ['userLogin']\n ),\n [items]\n );\n const builtInRoles = useMemo(\n () =>\n sortBy(\n items.filter((i) => i.builtInRole),\n ['builtInRole']\n ),\n [items]\n );\n\n return (\n <div>\n <div className=\"page-action-bar\">\n <h3 className=\"page-sub-heading\">{title}</h3>\n <div className=\"page-action-bar__spacer\" />\n {canSetPermissions && (\n <Button variant={'primary'} key=\"add-permission\" onClick={() => setIsAdding(true)}>\n {buttonLabel}\n </Button>\n )}\n </div>\n\n <div>\n <SlideDown in={isAdding}>\n <AddPermission\n title={addPermissionTitle}\n onAdd={onAdd}\n permissions={desc.permissions}\n assignments={desc.assignments}\n onCancel={() => setIsAdding(false)}\n />\n </SlideDown>\n <PermissionList\n title=\"Role\"\n items={builtInRoles}\n permissionLevels={desc.permissions}\n onChange={onChange}\n onRemove={onRemove}\n canSet={canSetPermissions}\n />\n <PermissionList\n title=\"User\"\n items={users}\n permissionLevels={desc.permissions}\n onChange={onChange}\n onRemove={onRemove}\n canSet={canSetPermissions}\n />\n <PermissionList\n title=\"Team\"\n items={teams}\n permissionLevels={desc.permissions}\n onChange={onChange}\n onRemove={onRemove}\n canSet={canSetPermissions}\n />\n </div>\n </div>\n );\n};\n\nconst getDescription = async (resource: string): Promise<Description> => {\n try {\n return await getBackendSrv().get(`/api/access-control/${resource}/description`);\n } catch (e) {\n console.error('failed to load resource description: ', e);\n return INITIAL_DESCRIPTION;\n }\n};\n\nconst getPermissions = (resource: string, resourceId: ResourceId): Promise<ResourcePermission[]> =>\n getBackendSrv().get(`/api/access-control/${resource}/${resourceId}`);\n\nconst setUserPermission = (resource: string, resourceId: ResourceId, userId: number, permission: string) =>\n setPermission(resource, resourceId, 'users', userId, permission);\n\nconst setTeamPermission = (resource: string, resourceId: ResourceId, teamId: number, permission: string) =>\n setPermission(resource, resourceId, 'teams', teamId, permission);\n\nconst setBuiltInRolePermission = (resource: string, resourceId: ResourceId, builtInRole: string, permission: string) =>\n setPermission(resource, resourceId, 'builtInRoles', builtInRole, permission);\n\nconst setPermission = (\n resource: string,\n resourceId: ResourceId,\n type: Type,\n typeId: number | string,\n permission: string\n): Promise<void> =>\n getBackendSrv().post(`/api/access-control/${resource}/${resourceId}/${type}/${typeId}`, { permission });\n","import React, { CSSProperties, FC } from 'react';\nimport Transition from 'react-transition-group/Transition';\n\ninterface Style {\n transition?: string;\n overflow?: string;\n}\n\n// When animating using max-height we need to use a static value.\n// If this is not enough, pass in <SlideDown maxHeight=\"....\nconst defaultMaxHeight = '200px';\nconst defaultDuration = 200;\n\nexport const defaultStyle: Style = {\n transition: `max-height ${defaultDuration}ms ease-in-out`,\n overflow: 'hidden',\n};\n\nexport interface Props {\n children: React.ReactNode;\n in: boolean;\n maxHeight?: number;\n style?: CSSProperties;\n}\n\nexport const SlideDown: FC<Props> = ({ children, in: inProp, maxHeight = defaultMaxHeight, style = defaultStyle }) => {\n // There are 4 main states a Transition can be in:\n // ENTERING, ENTERED, EXITING, EXITED\n // https://reactcommunity.or[g/react-transition-group/\n const transitionStyles: { [str: string]: CSSProperties } = {\n exited: { maxHeight: 0 },\n entering: { maxHeight: maxHeight },\n entered: { maxHeight: 'unset', overflow: 'visible' },\n exiting: { maxHeight: 0 },\n };\n\n return (\n <Transition in={inProp} timeout={defaultDuration}>\n {(state) => (\n <div\n style={{\n ...style,\n ...transitionStyles[state],\n }}\n >\n {children}\n </div>\n )}\n </Transition>\n );\n};\n","import React, { useEffect } from 'react';\n\nimport { NavModelItem } from '@grafana/data';\nimport { useGrafana } from 'app/core/context/GrafanaContext';\n\nexport interface AppChromeUpdateProps {\n pageNav?: NavModelItem;\n actions?: React.ReactNode;\n}\n/**\n * This needs to be moved to @grafana/ui or runtime.\n * This is the way core pages and plugins update the breadcrumbs and page toolbar actions\n */\nexport const AppChromeUpdate = React.memo<AppChromeUpdateProps>(({ pageNav, actions }: AppChromeUpdateProps) => {\n const { chrome } = useGrafana();\n\n useEffect(() => {\n chrome.update({ pageNav, actions });\n });\n return null;\n});\n\nAppChromeUpdate.displayName = 'TopNavUpdate';\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\n\nexport interface Props {\n leftActionsSeparator?: boolean;\n}\n\nexport function NavToolbarSeparator({ leftActionsSeparator }: Props) {\n const styles = useStyles2(getStyles);\n\n if (leftActionsSeparator) {\n return <div className={styles.leftActionsSeparator} />;\n }\n\n if (config.featureToggles.topnav) {\n return <div className={styles.line} />;\n }\n\n return null;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n leftActionsSeparator: css({\n display: 'flex',\n flexGrow: 1,\n }),\n line: css({\n width: 1,\n backgroundColor: theme.colors.border.medium,\n height: 24,\n }),\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { colorManipulator } from '@grafana/data';\nimport { useTheme2, styleMixins } from '@grafana/ui';\n\nexport interface BrandComponentProps {\n className?: string;\n children?: JSX.Element | JSX.Element[];\n}\n\nconst LoginLogo: FC<BrandComponentProps> = ({ className }) => {\n return <img className={className} src=\"public/img/grafana_icon.svg\" alt=\"Grafana\" />;\n};\n\nconst LoginBackground: FC<BrandComponentProps> = ({ className, children }) => {\n const theme = useTheme2();\n\n const background = css`\n &:before {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n background: url(public/img/g8_login_${theme.isDark ? 'dark' : 'light'}.svg);\n background-position: top center;\n background-size: auto;\n background-repeat: no-repeat;\n\n opacity: 0;\n transition: opacity 3s ease-in-out;\n\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.md)} {\n background-position: center;\n background-size: cover;\n }\n }\n `;\n\n return <div className={cx(background, className)}>{children}</div>;\n};\n\nconst MenuLogo: FC<BrandComponentProps> = ({ className }) => {\n return <img className={className} src=\"public/img/grafana_icon.svg\" alt=\"Grafana\" />;\n};\n\nconst LoginBoxBackground = () => {\n const theme = useTheme2();\n return css`\n background: ${colorManipulator.alpha(theme.colors.background.primary, 0.7)};\n background-size: cover;\n `;\n};\n\nexport class Branding {\n static LoginLogo = LoginLogo;\n static LoginBackground = LoginBackground;\n static MenuLogo = MenuLogo;\n static LoginBoxBackground = LoginBoxBackground;\n static AppTitle = 'Grafana';\n static LoginTitle = 'Welcome to Grafana';\n static GetLoginSubTitle = (): null | string => {\n return null;\n };\n}\n","import { css } from '@emotion/css';\nimport React, { HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, IconName, useStyles2 } from '@grafana/ui';\n\ninterface Props extends HTMLAttributes<HTMLButtonElement> {\n icon: IconName;\n onClick: () => void;\n children: React.ReactNode;\n}\n\nexport const CardButton = React.forwardRef<HTMLButtonElement, Props>(\n ({ icon, children, onClick, ...restProps }, ref) => {\n const styles = useStyles2(getStyles);\n\n return (\n <button {...restProps} className={styles.action} onClick={onClick}>\n <Icon name={icon} size=\"xl\" />\n {children}\n </button>\n );\n }\n);\n\nCardButton.displayName = 'CardButton';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n action: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n\n justify-self: center;\n cursor: pointer;\n background: ${theme.colors.background.secondary};\n border-radius: ${theme.shape.borderRadius(1)};\n color: ${theme.colors.text.primary};\n border: unset;\n width: 100%;\n display: flex;\n\n justify-content: center;\n align-items: center;\n text-align: center;\n\n &:hover {\n background: ${theme.colors.emphasize(theme.colors.background.secondary)};\n }\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { IconButton, useStyles2 } from '@grafana/ui';\n\ntype Props = {\n onClick: () => void;\n 'aria-label'?: string;\n style?: React.CSSProperties;\n};\n\nexport const CloseButton: React.FC<Props> = ({ onClick, 'aria-label': ariaLabel, style }) => {\n const styles = useStyles2(getStyles);\n return (\n <IconButton aria-label={ariaLabel ?? 'Close'} className={styles} name=\"times\" onClick={onClick} style={style} />\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) =>\n css`\n position: absolute;\n right: ${theme.spacing(0.5)};\n top: ${theme.spacing(1)};\n `;\n","import { css } from '@emotion/css';\nimport React, { MouseEvent } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, CallToActionCard, Icon, IconName, LinkButton } from '@grafana/ui';\n\nexport interface Props {\n title: string;\n buttonIcon: IconName;\n buttonLink?: string;\n buttonTitle: string;\n buttonDisabled?: boolean;\n onClick?: (event: MouseEvent) => void;\n proTip?: string;\n proTipLink?: string;\n proTipLinkTitle?: string;\n proTipTarget?: string;\n infoBox?: { __html: string };\n infoBoxTitle?: string;\n}\n\nconst ctaStyle = css`\n text-align: center;\n`;\n\nconst infoBoxStyles = css`\n max-width: 700px;\n margin: 0 auto;\n`;\n\nconst EmptyListCTA: React.FunctionComponent<Props> = ({\n title,\n buttonIcon,\n buttonLink,\n buttonTitle,\n buttonDisabled,\n onClick,\n proTip,\n proTipLink,\n proTipLinkTitle,\n proTipTarget,\n infoBox,\n infoBoxTitle,\n}) => {\n const footer = () => {\n return (\n <>\n {proTip ? (\n <span key=\"proTipFooter\">\n <Icon name=\"rocket\" />\n <> ProTip: {proTip} </>\n {proTipLink && (\n <a href={proTipLink} target={proTipTarget} className=\"text-link\">\n {proTipLinkTitle}\n </a>\n )}\n </span>\n ) : (\n ''\n )}\n {infoBox ? (\n <div key=\"infoBoxHtml\" className={`grafana-info-box ${infoBoxStyles}`}>\n {infoBoxTitle && <h5>{infoBoxTitle}</h5>}\n <div dangerouslySetInnerHTML={infoBox} />\n </div>\n ) : (\n ''\n )}\n </>\n );\n };\n\n const ctaElementClassName = !footer()\n ? css`\n margin-bottom: 20px;\n `\n : '';\n\n const ButtonEl = buttonLink ? LinkButton : Button;\n const ctaElement = (\n <ButtonEl\n size=\"lg\"\n onClick={onClick}\n href={buttonLink}\n icon={buttonIcon}\n className={ctaElementClassName}\n data-testid={selectors.components.CallToActionCard.buttonV2(buttonTitle)}\n disabled={buttonDisabled}\n >\n {buttonTitle}\n </ButtonEl>\n );\n\n return <CallToActionCard className={ctaStyle} message={title} footer={footer()} callToActionElement={ctaElement} />;\n};\n\nexport default EmptyListCTA;\n","import React, { FC } from 'react';\n\nimport { config } from '@grafana/runtime';\nimport { Icon, IconName } from '@grafana/ui';\n\nexport interface FooterLink {\n text: string;\n id?: string;\n icon?: IconName;\n url?: string;\n target?: string;\n}\n\nexport let getFooterLinks = (): FooterLink[] => {\n return [\n {\n text: 'Documentation',\n icon: 'document-info',\n url: 'https://grafana.com/docs/grafana/latest/?utm_source=grafana_footer',\n target: '_blank',\n },\n {\n text: 'Support',\n icon: 'question-circle',\n url: 'https://grafana.com/products/enterprise/?utm_source=grafana_footer',\n target: '_blank',\n },\n {\n text: 'Community',\n icon: 'comments-alt',\n url: 'https://community.grafana.com/?utm_source=grafana_footer',\n target: '_blank',\n },\n ];\n};\n\nexport let getVersionLinks = (): FooterLink[] => {\n const { buildInfo, licenseInfo } = config;\n const links: FooterLink[] = [];\n const stateInfo = licenseInfo.stateInfo ? ` (${licenseInfo.stateInfo})` : '';\n\n links.push({ text: `${buildInfo.edition}${stateInfo}`, url: licenseInfo.licenseUrl });\n\n if (buildInfo.hideVersion) {\n return links;\n }\n\n links.push({ text: `v${buildInfo.version} (${buildInfo.commit})` });\n\n if (buildInfo.hasUpdate) {\n links.push({\n id: 'updateVersion',\n text: `New version available!`,\n icon: 'download-alt',\n url: 'https://grafana.com/grafana/download?utm_source=grafana_footer',\n target: '_blank',\n });\n }\n\n return links;\n};\n\nexport function setFooterLinksFn(fn: typeof getFooterLinks) {\n getFooterLinks = fn;\n}\n\nexport function setVersionLinkFn(fn: typeof getFooterLinks) {\n getVersionLinks = fn;\n}\n\nexport const Footer: FC = React.memo(() => {\n const links = getFooterLinks().concat(getVersionLinks());\n\n return (\n <footer className=\"footer\">\n <div className=\"text-center\">\n <ul>\n {links.map((link) => (\n <li key={link.text}>\n <a href={link.url} target={link.target} rel=\"noopener\" id={link.id}>\n {link.icon && <Icon name={link.icon} />} {link.text}\n </a>\n </li>\n ))}\n </ul>\n </div>\n </footer>\n );\n});\n\nFooter.displayName = 'Footer';\n","import React, { FC, SyntheticEvent } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Tooltip, Form, Field, VerticalGroup, Button } from '@grafana/ui';\n\nimport { submitButton } from '../Login/LoginForm';\nimport { PasswordField } from '../PasswordField/PasswordField';\ninterface Props {\n onSubmit: (pw: string) => void;\n onSkip?: (event?: SyntheticEvent) => void;\n}\n\ninterface PasswordDTO {\n newPassword: string;\n confirmNew: string;\n}\n\nexport const ChangePassword: FC<Props> = ({ onSubmit, onSkip }) => {\n const submit = (passwords: PasswordDTO) => {\n onSubmit(passwords.newPassword);\n };\n return (\n <Form onSubmit={submit}>\n {({ errors, register, getValues }) => (\n <>\n <Field label=\"New password\" invalid={!!errors.newPassword} error={errors?.newPassword?.message}>\n <PasswordField\n id=\"new-password\"\n autoFocus\n autoComplete=\"new-password\"\n {...register('newPassword', { required: 'New Password is required' })}\n />\n </Field>\n <Field label=\"Confirm new password\" invalid={!!errors.confirmNew} error={errors?.confirmNew?.message}>\n <PasswordField\n id=\"confirm-new-password\"\n autoComplete=\"new-password\"\n {...register('confirmNew', {\n required: 'Confirmed Password is required',\n validate: (v: string) => v === getValues().newPassword || 'Passwords must match!',\n })}\n />\n </Field>\n <VerticalGroup>\n <Button type=\"submit\" className={submitButton}>\n Submit\n </Button>\n\n {onSkip && (\n <Tooltip\n content=\"If you skip you will be prompted to change password next time you log in.\"\n placement=\"bottom\"\n >\n <Button fill=\"text\" onClick={onSkip} type=\"button\" aria-label={selectors.pages.Login.skip}>\n Skip\n </Button>\n </Tooltip>\n )}\n </VerticalGroup>\n </>\n )}\n </Form>\n );\n};\n","import React, { PureComponent } from 'react';\n\nimport store from '../../store';\n\nexport interface Props<T> {\n storageKey: string;\n defaultValue: T;\n children: (value: T, onSaveToStore: (value: T) => void, onDeleteFromStore: () => void) => React.ReactNode;\n}\n\ninterface State<T> {\n value: T;\n}\n\nexport class LocalStorageValueProvider<T> extends PureComponent<Props<T>, State<T>> {\n constructor(props: Props<T>) {\n super(props);\n\n const { storageKey, defaultValue } = props;\n\n this.state = {\n value: store.getObject(storageKey, defaultValue),\n };\n }\n\n onSaveToStore = (value: T) => {\n const { storageKey } = this.props;\n try {\n store.setObject(storageKey, value);\n } catch (error) {\n console.error(error);\n }\n this.setState({ value });\n };\n\n onDeleteFromStore = () => {\n const { storageKey, defaultValue } = this.props;\n try {\n store.delete(storageKey);\n } catch (error) {\n console.log(error);\n }\n this.setState({ value: defaultValue });\n };\n\n render() {\n const { children } = this.props;\n const { value } = this.state;\n\n return <>{children(value, this.onSaveToStore, this.onDeleteFromStore)}</>;\n }\n}\n","import React, { PureComponent } from 'react';\n\nimport { AppEvents } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\n\nconst isOauthEnabled = () => {\n return !!config.oauth && Object.keys(config.oauth).length > 0;\n};\n\nexport interface FormModel {\n user: string;\n password: string;\n email: string;\n}\n\ninterface Props {\n resetCode?: string;\n\n children: (props: {\n isLoggingIn: boolean;\n changePassword: (pw: string) => void;\n isChangingPassword: boolean;\n skipPasswordChange: Function;\n login: (data: FormModel) => void;\n disableLoginForm: boolean;\n ldapEnabled: boolean;\n authProxyEnabled: boolean;\n disableUserSignUp: boolean;\n isOauthEnabled: boolean;\n loginHint: string;\n passwordHint: string;\n }) => JSX.Element;\n}\n\ninterface State {\n isLoggingIn: boolean;\n isChangingPassword: boolean;\n}\n\nexport class LoginCtrl extends PureComponent<Props, State> {\n result: any = {};\n\n constructor(props: Props) {\n super(props);\n this.state = {\n isLoggingIn: false,\n isChangingPassword: false,\n };\n\n if (config.loginError) {\n appEvents.emit(AppEvents.alertWarning, ['Login Failed', config.loginError]);\n }\n }\n\n changePassword = (password: string) => {\n const pw = {\n newPassword: password,\n confirmNew: password,\n oldPassword: 'admin',\n };\n\n if (this.props.resetCode) {\n const resetModel = {\n code: this.props.resetCode,\n newPassword: password,\n confirmPassword: password,\n };\n\n getBackendSrv()\n .post('/api/user/password/reset', resetModel)\n .then(() => {\n this.toGrafana();\n });\n } else {\n getBackendSrv()\n .put('/api/user/password', pw)\n .then(() => {\n this.toGrafana();\n })\n .catch((err: any) => console.error(err));\n }\n };\n\n login = (formModel: FormModel) => {\n this.setState({\n isLoggingIn: true,\n });\n\n getBackendSrv()\n .post('/login', formModel)\n .then((result: any) => {\n this.result = result;\n if (formModel.password !== 'admin' || config.ldapEnabled || config.authProxyEnabled) {\n this.toGrafana();\n return;\n } else {\n this.changeView();\n }\n })\n .catch(() => {\n this.setState({\n isLoggingIn: false,\n });\n });\n };\n\n changeView = () => {\n this.setState({\n isChangingPassword: true,\n });\n };\n\n toGrafana = () => {\n // Use window.location.href to force page reload\n if (this.result.redirectUrl) {\n if (config.appSubUrl !== '' && !this.result.redirectUrl.startsWith(config.appSubUrl)) {\n window.location.assign(config.appSubUrl + this.result.redirectUrl);\n } else {\n window.location.assign(this.result.redirectUrl);\n }\n } else {\n window.location.assign(config.appSubUrl + '/');\n }\n };\n\n render() {\n const { children } = this.props;\n const { isLoggingIn, isChangingPassword } = this.state;\n const { login, toGrafana, changePassword } = this;\n const { loginHint, passwordHint, disableLoginForm, ldapEnabled, authProxyEnabled, disableUserSignUp } = config;\n\n return (\n <>\n {children({\n isOauthEnabled: isOauthEnabled(),\n loginHint,\n passwordHint,\n disableLoginForm,\n ldapEnabled,\n authProxyEnabled,\n disableUserSignUp,\n login,\n isLoggingIn,\n changePassword,\n skipPasswordChange: toGrafana,\n isChangingPassword,\n })}\n </>\n );\n }\n}\n\nexport default LoginCtrl;\n","import { css } from '@emotion/css';\nimport React, { FC, ReactElement } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, Form, Input, Field } from '@grafana/ui';\n\nimport { PasswordField } from '../PasswordField/PasswordField';\n\nimport { FormModel } from './LoginCtrl';\n\ninterface Props {\n children: ReactElement;\n onSubmit: (data: FormModel) => void;\n isLoggingIn: boolean;\n passwordHint: string;\n loginHint: string;\n}\n\nconst wrapperStyles = css`\n width: 100%;\n padding-bottom: 16px;\n`;\n\nexport const submitButton = css`\n justify-content: center;\n width: 100%;\n`;\n\nexport const LoginForm: FC<Props> = ({ children, onSubmit, isLoggingIn, passwordHint, loginHint }) => {\n return (\n <div className={wrapperStyles}>\n <Form onSubmit={onSubmit} validateOn=\"onChange\">\n {({ register, errors }) => (\n <>\n <Field label=\"Email or username\" invalid={!!errors.user} error={errors.user?.message}>\n <Input\n {...register('user', { required: 'Email or username is required' })}\n autoFocus\n autoCapitalize=\"none\"\n placeholder={loginHint}\n aria-label={selectors.pages.Login.username}\n />\n </Field>\n <Field label=\"Password\" invalid={!!errors.password} error={errors.password?.message}>\n <PasswordField\n id=\"current-password\"\n autoComplete=\"current-password\"\n passwordHint={passwordHint}\n {...register('password', { required: 'Password is required' })}\n />\n </Field>\n <Button\n type=\"submit\"\n aria-label={selectors.pages.Login.submit}\n className={submitButton}\n disabled={isLoggingIn}\n >\n {isLoggingIn ? 'Logging in...' : 'Log in'}\n </Button>\n {children}\n </>\n )}\n </Form>\n </div>\n );\n};\n","import { cx, css, keyframes } from '@emotion/css';\nimport React, { FC, useEffect, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, styleMixins } from '@grafana/ui';\n\nimport { Branding } from '../Branding/Branding';\nimport { Footer } from '../Footer/Footer';\n\ninterface InnerBoxProps {\n enterAnimation?: boolean;\n}\nexport const InnerBox: FC<InnerBoxProps> = ({ children, enterAnimation = true }) => {\n const loginStyles = useStyles2(getLoginStyles);\n return <div className={cx(loginStyles.loginInnerBox, enterAnimation && loginStyles.enterAnimation)}>{children}</div>;\n};\n\nexport const LoginLayout: FC = ({ children }) => {\n const loginStyles = useStyles2(getLoginStyles);\n const subTitle = Branding.GetLoginSubTitle();\n const [startAnim, setStartAnim] = useState(false);\n\n useEffect(() => setStartAnim(true), []);\n\n return (\n <Branding.LoginBackground className={cx(loginStyles.container, startAnim && loginStyles.loginAnim)}>\n <div className={cx(loginStyles.loginContent, Branding.LoginBoxBackground(), 'login-content-box')}>\n <div className={loginStyles.loginLogoWrapper}>\n <Branding.LoginLogo className={loginStyles.loginLogo} />\n <div className={loginStyles.titleWrapper}>\n <h1 className={loginStyles.mainTitle}>{Branding.LoginTitle}</h1>\n {subTitle && <h3 className={loginStyles.subTitle}>{Branding.GetLoginSubTitle()}</h3>}\n </div>\n </div>\n <div className={loginStyles.loginOuterBox}>{children}</div>\n </div>\n <Footer />\n </Branding.LoginBackground>\n );\n};\n\nconst flyInAnimation = keyframes`\nfrom{\n opacity: 0;\n transform: translate(-60px, 0px);\n}\n\nto{\n opacity: 1;\n transform: translate(0px, 0px);\n}`;\n\nexport const getLoginStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n minHeight: '100%',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n minWidth: '100%',\n marginLeft: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n }),\n loginAnim: css`\n &:before {\n opacity: 1;\n }\n\n .login-content-box {\n opacity: 1;\n }\n `,\n submitButton: css`\n justify-content: center;\n width: 100%;\n `,\n loginLogo: css`\n width: 100%;\n max-width: 60px;\n margin-bottom: 15px;\n\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.sm)} {\n max-width: 100px;\n }\n `,\n loginLogoWrapper: css`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n padding: ${theme.spacing(3)};\n `,\n titleWrapper: css`\n text-align: center;\n `,\n mainTitle: css`\n font-size: 22px;\n\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.sm)} {\n font-size: 32px;\n }\n `,\n subTitle: css`\n font-size: ${theme.typography.size.md};\n color: ${theme.colors.text.secondary};\n `,\n loginContent: css`\n max-width: 478px;\n width: calc(100% - 2rem);\n display: flex;\n align-items: stretch;\n flex-direction: column;\n position: relative;\n justify-content: flex-start;\n z-index: 1;\n min-height: 320px;\n border-radius: ${theme.shape.borderRadius(4)};\n padding: ${theme.spacing(2, 0)};\n opacity: 0;\n transition: opacity 0.5s ease-in-out;\n\n @media ${styleMixins.mediaUp(theme.v1.breakpoints.sm)} {\n min-height: 320px;\n justify-content: center;\n }\n `,\n loginOuterBox: css`\n display: flex;\n overflow-y: hidden;\n align-items: center;\n justify-content: center;\n `,\n loginInnerBox: css`\n padding: ${theme.spacing(2)};\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex-grow: 1;\n max-width: 415px;\n width: 100%;\n transform: translate(0px, 0px);\n transition: 0.25s ease;\n `,\n enterAnimation: css`\n animation: ${flyInAnimation} ease-out 0.2s;\n `,\n };\n};\n","import { debounce } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport { Field, Input } from '@grafana/ui';\n\ninterface Props {\n value?: number;\n placeholder?: string;\n autoFocus?: boolean;\n onChange: (number?: number) => void;\n min?: number;\n max?: number;\n step?: number;\n}\n\ninterface State {\n text: string;\n inputCorrected: boolean;\n}\n\n/**\n * This is an Input field that will call `onChange` for blur and enter\n *\n * @internal this is not exported to the `@grafana/ui` library, it is used\n * by options editor (number and slider), and direclty with in grafana core\n */\n\nexport class NumberInput extends PureComponent<Props, State> {\n state: State = { text: '', inputCorrected: false };\n inputRef = React.createRef<HTMLInputElement>();\n\n componentDidMount() {\n this.setState({\n text: isNaN(this.props.value!) ? '' : `${this.props.value}`,\n });\n }\n\n componentDidUpdate(oldProps: Props) {\n if (this.props.value !== oldProps.value) {\n const text = isNaN(this.props.value!) ? '' : `${this.props.value}`;\n if (text !== this.state.text) {\n this.setState({ text });\n }\n }\n }\n\n updateValue = () => {\n let value: number | undefined = undefined;\n const txt = this.inputRef.current?.value;\n if (txt?.length) {\n value = +txt;\n if (isNaN(value)) {\n return;\n }\n }\n if (value !== this.props.value) {\n this.props.onChange(value);\n }\n if (this.state.inputCorrected) {\n this.setState({ inputCorrected: false });\n }\n };\n\n updateValueDebounced = debounce(this.updateValue, 500); // 1/2 second delay\n\n onChange = (e: React.FocusEvent<HTMLInputElement>) => {\n let newValue: string | undefined = undefined;\n let corrected = false;\n const min = this.props.min;\n const max = this.props.max;\n const currValue = e.currentTarget.valueAsNumber;\n if (!Number.isNaN(currValue)) {\n if (min != null && currValue < min) {\n newValue = min.toString();\n corrected = true;\n } else if (max != null && currValue > max) {\n newValue = max.toString();\n corrected = true;\n } else {\n newValue = e.currentTarget.value;\n }\n }\n this.setState({\n text: newValue ? newValue : '',\n inputCorrected: corrected,\n });\n this.updateValueDebounced();\n };\n\n onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n this.updateValue();\n }\n };\n\n renderInput() {\n return (\n <Input\n type=\"number\"\n ref={this.inputRef}\n min={this.props.min}\n max={this.props.max}\n step={this.props.step}\n autoFocus={this.props.autoFocus}\n value={this.state.text}\n onChange={this.onChange}\n onBlur={this.updateValue}\n onKeyPress={this.onKeyPress}\n placeholder={this.props.placeholder}\n />\n );\n }\n\n render() {\n const { inputCorrected } = this.state;\n if (inputCorrected) {\n let range = '';\n let { min, max } = this.props;\n if (max == null) {\n if (min != null) {\n range = `< ${min}`;\n }\n } else if (min != null) {\n range = `${min} < > ${max}`;\n } else {\n range = `> ${max}`;\n }\n return (\n <Field\n invalid={inputCorrected}\n error={`Out of range ${range}`}\n validationMessageHorizontalOverflow={true}\n style={{ direction: 'rtl' }}\n >\n {this.renderInput()}\n </Field>\n );\n }\n\n return this.renderInput();\n }\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2, useStyles2, ColorPicker } from '@grafana/ui';\nimport { ColorSwatch } from '@grafana/ui/src/components/ColorPicker/ColorSwatch';\n\n/**\n * @alpha\n * */\nexport interface ColorValueEditorProps {\n value?: string;\n onChange: (value: string) => void;\n}\n\n/**\n * @alpha\n * */\nexport const ColorValueEditor: React.FC<ColorValueEditorProps> = ({ value, onChange }) => {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n\n return (\n <ColorPicker color={value ?? ''} onChange={onChange} enableNamedColors={true}>\n {({ ref, showColorPicker, hideColorPicker }) => {\n return (\n <div className={styles.spot}>\n <div className={styles.colorPicker}>\n <ColorSwatch\n ref={ref}\n onClick={showColorPicker}\n onMouseLeave={hideColorPicker}\n color={value ? theme.visualization.getColorByName(value) : theme.components.input.borderColor}\n />\n </div>\n </div>\n );\n }}\n </ColorPicker>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n spot: css`\n color: ${theme.colors.text};\n background: ${theme.components.input.background};\n padding: 3px;\n height: ${theme.v1.spacing.formInputHeight}px;\n border: 1px solid ${theme.components.input.borderColor};\n display: flex;\n flex-direction: row;\n align-items: center;\n &:hover {\n border: 1px solid ${theme.components.input.borderHover};\n }\n `,\n colorPicker: css`\n padding: 0 ${theme.spacing(1)};\n `,\n colorText: css`\n cursor: pointer;\n flex-grow: 1;\n `,\n trashIcon: css`\n cursor: pointer;\n color: ${theme.colors.text.secondary};\n &:hover {\n color: ${theme.colors.text};\n }\n `,\n };\n};\n","import React, { useCallback } from 'react';\n\nimport { FieldConfigEditorProps, NumberFieldConfigSettings } from '@grafana/data';\n\nimport { NumberInput } from './NumberInput';\n\nexport const NumberValueEditor: React.FC<FieldConfigEditorProps<number, NumberFieldConfigSettings>> = ({\n value,\n onChange,\n item,\n}) => {\n const { settings } = item;\n\n const onValueChange = useCallback(\n (value: number | undefined) => {\n onChange(settings?.integer && value !== undefined ? Math.floor(value) : value);\n },\n [onChange, settings?.integer]\n );\n\n return (\n <NumberInput\n value={value}\n min={settings?.min}\n max={settings?.max}\n step={settings?.step}\n placeholder={settings?.placeholder}\n onChange={onValueChange}\n />\n );\n};\n","import { css } from '@emotion/css';\nimport { isNumber } from 'lodash';\nimport React, { PureComponent, ChangeEvent } from 'react';\n\nimport {\n Threshold,\n sortThresholds,\n ThresholdsConfig,\n ThresholdsMode,\n SelectableValue,\n GrafanaTheme,\n} from '@grafana/data';\nimport {\n Input,\n colors,\n ColorPicker,\n Icon,\n ThemeContext,\n Button,\n Label,\n RadioButtonGroup,\n stylesFactory,\n} from '@grafana/ui';\n\nconst modes: Array<SelectableValue<ThresholdsMode>> = [\n { value: ThresholdsMode.Absolute, label: 'Absolute', description: 'Pick thresholds based on the absolute values' },\n {\n value: ThresholdsMode.Percentage,\n label: 'Percentage',\n description: 'Pick threshold based on the percent between min/max',\n },\n];\n\nexport interface Props {\n thresholds: ThresholdsConfig;\n onChange: (thresholds: ThresholdsConfig) => void;\n}\n\ninterface State {\n steps: ThresholdWithKey[];\n}\n\nexport class ThresholdsEditor extends PureComponent<Props, State> {\n private latestThresholdInputRef: React.RefObject<HTMLInputElement>;\n\n constructor(props: Props) {\n super(props);\n\n const steps = toThresholdsWithKey(props.thresholds!.steps);\n steps[0].value = -Infinity;\n\n this.state = { steps };\n this.latestThresholdInputRef = React.createRef();\n }\n\n onAddThreshold = () => {\n const { steps } = this.state;\n\n let nextValue = 0;\n\n if (steps.length > 1) {\n nextValue = steps[steps.length - 1].value + 10;\n }\n\n let color = colors.filter((c) => !steps.some((t) => t.color === c))[1];\n if (!color) {\n // Default color when all colors are used\n color = '#CCCCCC';\n }\n\n const add = {\n value: nextValue,\n color: color,\n key: counter++,\n };\n\n const newThresholds = [...steps, add];\n sortThresholds(newThresholds);\n\n this.setState({ steps: newThresholds }, () => {\n if (this.latestThresholdInputRef.current) {\n this.latestThresholdInputRef.current.focus();\n }\n this.onChange();\n });\n };\n\n onRemoveThreshold = (threshold: ThresholdWithKey) => {\n const { steps } = this.state;\n\n if (!steps.length) {\n return;\n }\n\n // Don't remove index 0\n if (threshold.key === steps[0].key) {\n return;\n }\n\n this.setState({ steps: steps.filter((t) => t.key !== threshold.key) }, this.onChange);\n };\n\n onChangeThresholdValue = (event: ChangeEvent<HTMLInputElement>, threshold: ThresholdWithKey) => {\n const cleanValue = event.target.value.replace(/,/g, '.');\n const parsedValue = parseFloat(cleanValue);\n const value = isNaN(parsedValue) ? '' : parsedValue;\n\n const steps = this.state.steps.map((t) => {\n if (t.key === threshold.key) {\n t = { ...t, value: value as number };\n }\n return t;\n });\n\n if (steps.length) {\n steps[0].value = -Infinity;\n }\n\n sortThresholds(steps);\n this.setState({ steps });\n };\n\n onChangeThresholdColor = (threshold: ThresholdWithKey, color: string) => {\n const { steps } = this.state;\n\n const newThresholds = steps.map((t) => {\n if (t.key === threshold.key) {\n t = { ...t, color: color };\n }\n\n return t;\n });\n\n this.setState({ steps: newThresholds }, this.onChange);\n };\n\n onBlur = () => {\n const steps = [...this.state.steps];\n sortThresholds(steps);\n this.setState({ steps }, this.onChange);\n };\n\n onChange = () => {\n this.props.onChange(thresholdsWithoutKey(this.props.thresholds, this.state.steps));\n };\n\n onModeChanged = (value?: ThresholdsMode) => {\n this.props.onChange({\n ...this.props.thresholds,\n mode: value!,\n });\n };\n\n renderInput(threshold: ThresholdWithKey, styles: ThresholdStyles, idx: number) {\n const isPercent = this.props.thresholds.mode === ThresholdsMode.Percentage;\n\n const ariaLabel = `Threshold ${idx + 1}`;\n if (!isFinite(threshold.value)) {\n return (\n <Input\n type=\"text\"\n value={'Base'}\n aria-label={ariaLabel}\n disabled\n prefix={\n <div className={styles.colorPicker}>\n <ColorPicker\n color={threshold.color}\n onChange={(color) => this.onChangeThresholdColor(threshold, color)}\n enableNamedColors={true}\n />\n </div>\n }\n />\n );\n }\n\n return (\n <Input\n type=\"number\"\n step=\"0.0001\"\n key={isPercent.toString()}\n onChange={(event: ChangeEvent<HTMLInputElement>) => this.onChangeThresholdValue(event, threshold)}\n value={threshold.value}\n aria-label={ariaLabel}\n ref={idx === 0 ? this.latestThresholdInputRef : null}\n onBlur={this.onBlur}\n prefix={\n <div className={styles.inputPrefix}>\n <div className={styles.colorPicker}>\n <ColorPicker\n color={threshold.color}\n onChange={(color) => this.onChangeThresholdColor(threshold, color)}\n enableNamedColors={true}\n />\n </div>\n {isPercent && <div className={styles.percentIcon}>%</div>}\n </div>\n }\n suffix={\n <Icon className={styles.trashIcon} name=\"trash-alt\" onClick={() => this.onRemoveThreshold(threshold)} />\n }\n />\n );\n }\n\n render() {\n const { thresholds } = this.props;\n const { steps } = this.state;\n\n return (\n <ThemeContext.Consumer>\n {(theme) => {\n const styles = getStyles(theme.v1);\n return (\n <div className={styles.wrapper}>\n <Button\n size=\"sm\"\n icon=\"plus\"\n onClick={() => this.onAddThreshold()}\n variant=\"secondary\"\n className={styles.addButton}\n fullWidth\n >\n Add threshold\n </Button>\n <div className={styles.thresholds}>\n {steps\n .slice(0)\n .reverse()\n .map((threshold, idx) => (\n <div className={styles.item} key={`${threshold.key}`}>\n {this.renderInput(threshold, styles, idx)}\n </div>\n ))}\n </div>\n\n <div>\n <Label description=\"Percentage means thresholds relative to min & max\">Thresholds mode</Label>\n <RadioButtonGroup options={modes} onChange={this.onModeChanged} value={thresholds.mode} />\n </div>\n </div>\n );\n }}\n </ThemeContext.Consumer>\n );\n }\n}\n\ninterface ThresholdWithKey extends Threshold {\n key: number;\n}\n\nlet counter = 100;\n\nfunction toThresholdsWithKey(steps?: Threshold[]): ThresholdWithKey[] {\n if (!steps || steps.length === 0) {\n steps = [{ value: -Infinity, color: 'green' }];\n }\n\n return steps\n .filter((t, i) => isNumber(t.value) || i === 0)\n .map((t) => {\n return {\n color: t.color,\n value: t.value === null ? -Infinity : t.value,\n key: counter++,\n };\n });\n}\n\nexport function thresholdsWithoutKey(thresholds: ThresholdsConfig, steps: ThresholdWithKey[]): ThresholdsConfig {\n const mode = thresholds.mode ?? ThresholdsMode.Absolute;\n return {\n mode,\n steps: steps.map((t) => {\n const { key, ...rest } = t;\n return rest; // everything except key\n }),\n };\n}\n\ninterface ThresholdStyles {\n wrapper: string;\n thresholds: string;\n item: string;\n colorPicker: string;\n addButton: string;\n percentIcon: string;\n inputPrefix: string;\n trashIcon: string;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme): ThresholdStyles => {\n return {\n wrapper: css`\n display: flex;\n flex-direction: column;\n `,\n thresholds: css`\n display: flex;\n flex-direction: column;\n margin-bottom: ${theme.spacing.formSpacingBase * 2}px;\n `,\n item: css`\n margin-bottom: ${theme.spacing.sm};\n\n &:last-child {\n margin-bottom: 0;\n }\n `,\n colorPicker: css`\n padding: 0 ${theme.spacing.sm};\n `,\n addButton: css`\n margin-bottom: ${theme.spacing.sm};\n `,\n percentIcon: css`\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.textWeak};\n `,\n inputPrefix: css`\n display: flex;\n align-items: center;\n `,\n trashIcon: css`\n color: ${theme.colors.textWeak};\n cursor: pointer;\n\n &:hover {\n color: ${theme.colors.text};\n }\n `,\n };\n});\n","import React from 'react';\n\nimport { FieldConfigEditorProps, ThresholdsConfig, ThresholdsMode, ThresholdsFieldConfigSettings } from '@grafana/data';\n\nimport { ThresholdsEditor } from './ThresholdsEditor';\n\nexport class ThresholdsValueEditor extends React.PureComponent<\n FieldConfigEditorProps<ThresholdsConfig, ThresholdsFieldConfigSettings>\n> {\n constructor(props: FieldConfigEditorProps<ThresholdsConfig, ThresholdsFieldConfigSettings>) {\n super(props);\n }\n\n render() {\n const { onChange } = this.props;\n let value = this.props.value;\n if (!value) {\n value = {\n mode: ThresholdsMode.Percentage,\n\n // Must be sorted by 'value', first value is always -Infinity\n steps: [\n // anything?\n ],\n };\n }\n\n return <ThresholdsEditor thresholds={value} onChange={onChange} />;\n }\n}\n","import { css } from '@emotion/css';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { Draggable } from 'react-beautiful-dnd';\n\nimport { GrafanaTheme2, MappingType, SpecialValueMatch, SelectableValue, ValueMappingResult } from '@grafana/data';\nimport { useStyles2, Icon, Select, HorizontalGroup, ColorPicker, IconButton, Input, Button } from '@grafana/ui';\n\nimport { ResourcePickerSize, ResourceFolderName, MediaType } from '../../types';\nimport { ResourcePicker } from '../ResourcePicker';\n\nexport interface ValueMappingEditRowModel {\n type: MappingType;\n from?: number;\n to?: number;\n pattern?: string;\n key?: string;\n isNew?: boolean;\n specialMatch?: SpecialValueMatch;\n result: ValueMappingResult;\n id: string;\n}\n\ninterface Props {\n mapping: ValueMappingEditRowModel;\n index: number;\n onChange: (index: number, mapping: ValueMappingEditRowModel) => void;\n onRemove: (index: number) => void;\n onDuplicate: (index: number) => void;\n showIconPicker?: boolean;\n}\n\nexport function ValueMappingEditRow({ mapping, index, onChange, onRemove, onDuplicate, showIconPicker }: Props) {\n const { key, result, id } = mapping;\n const styles = useStyles2(getStyles);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const update = useCallback(\n (fn: (item: ValueMappingEditRowModel) => void) => {\n const copy = {\n ...mapping,\n result: {\n ...mapping.result,\n },\n };\n fn(copy);\n onChange(index, copy);\n },\n [mapping, index, onChange]\n );\n\n useEffect(() => {\n if (inputRef.current && mapping.isNew) {\n inputRef.current.focus();\n update((mapping) => {\n mapping.isNew = false;\n });\n }\n }, [mapping, inputRef, update]);\n\n const onChangeColor = (color: string) => {\n update((mapping) => {\n mapping.result.color = color;\n });\n };\n\n const onClearColor = () => {\n update((mapping) => {\n mapping.result.color = undefined;\n });\n };\n\n const onChangeIcon = (icon?: string) => {\n update((mapping) => {\n mapping.result.icon = icon;\n });\n };\n\n const onClearIcon = () => {\n update((mapping) => {\n mapping.result.icon = undefined;\n });\n };\n\n const onUpdateMatchValue = (event: React.FormEvent<HTMLInputElement>) => {\n update((mapping) => {\n mapping.key = event.currentTarget.value;\n });\n };\n\n const onChangeText = (event: React.FormEvent<HTMLInputElement>) => {\n update((mapping) => {\n mapping.result.text = event.currentTarget.value;\n });\n };\n\n const onChangeFrom = (event: React.FormEvent<HTMLInputElement>) => {\n update((mapping) => {\n mapping.from = parseFloat(event.currentTarget.value);\n });\n };\n\n const onChangeTo = (event: React.FormEvent<HTMLInputElement>) => {\n update((mapping) => {\n mapping.to = parseFloat(event.currentTarget.value);\n });\n };\n\n const onChangePattern = (event: React.FormEvent<HTMLInputElement>) => {\n update((mapping) => {\n mapping.pattern = event.currentTarget.value;\n });\n };\n\n const onChangeSpecialMatch = (sel: SelectableValue<SpecialValueMatch>) => {\n update((mapping) => {\n mapping.specialMatch = sel.value;\n });\n };\n\n const specialMatchOptions: Array<SelectableValue<SpecialValueMatch>> = [\n { label: 'Null', value: SpecialValueMatch.Null, description: 'Matches null and undefined values' },\n { label: 'NaN', value: SpecialValueMatch.NaN, description: 'Matches against Number.NaN (not a number)' },\n { label: 'Null + NaN', value: SpecialValueMatch.NullAndNaN, description: 'Matches null, undefined and NaN' },\n { label: 'True', value: SpecialValueMatch.True, description: 'Boolean true values' },\n { label: 'False', value: SpecialValueMatch.False, description: 'Boolean false values' },\n { label: 'Empty', value: SpecialValueMatch.Empty, description: 'Empty string' },\n ];\n\n return (\n <Draggable key={id} draggableId={id} index={index}>\n {(provided) => (\n <tr className={styles.dragRow} ref={provided.innerRef} {...provided.draggableProps}>\n <td>\n <div className={styles.dragHandle} {...provided.dragHandleProps}>\n <Icon name=\"draggabledots\" size=\"lg\" />\n </div>\n </td>\n <td className={styles.typeColumn}>{mapping.type}</td>\n <td>\n {mapping.type === MappingType.ValueToText && (\n <Input\n ref={inputRef}\n type=\"text\"\n value={key ?? ''}\n onChange={onUpdateMatchValue}\n placeholder=\"Exact value to match\"\n />\n )}\n {mapping.type === MappingType.RangeToText && (\n <div className={styles.rangeInputWrapper}>\n <Input\n type=\"number\"\n value={mapping.from ?? ''}\n placeholder=\"Range start\"\n onChange={onChangeFrom}\n prefix=\"From\"\n />\n <Input\n type=\"number\"\n value={mapping.to ?? ''}\n placeholder=\"Range end\"\n onChange={onChangeTo}\n prefix=\"To\"\n />\n </div>\n )}\n {mapping.type === MappingType.RegexToText && (\n <Input\n type=\"text\"\n value={mapping.pattern ?? ''}\n placeholder=\"Regular expression\"\n onChange={onChangePattern}\n />\n )}\n {mapping.type === MappingType.SpecialValue && (\n <Select\n value={specialMatchOptions.find((v) => v.value === mapping.specialMatch)}\n options={specialMatchOptions}\n onChange={onChangeSpecialMatch}\n />\n )}\n </td>\n <td>\n <Input type=\"text\" value={result.text ?? ''} onChange={onChangeText} placeholder=\"Optional display text\" />\n </td>\n <td className={styles.textAlignCenter}>\n {result.color && (\n <HorizontalGroup spacing=\"sm\" justify=\"center\">\n <ColorPicker color={result.color} onChange={onChangeColor} enableNamedColors={true} />\n <IconButton name=\"times\" onClick={onClearColor} tooltip=\"Remove color\" tooltipPlacement=\"top\" />\n </HorizontalGroup>\n )}\n {!result.color && (\n <ColorPicker color={'gray'} onChange={onChangeColor} enableNamedColors={true}>\n {(props) => (\n <Button variant=\"primary\" fill=\"text\" onClick={props.showColorPicker} ref={props.ref} size=\"sm\">\n Set color\n </Button>\n )}\n </ColorPicker>\n )}\n </td>\n {showIconPicker && (\n <td className={styles.textAlignCenter}>\n <HorizontalGroup spacing=\"sm\" justify=\"center\">\n <ResourcePicker\n onChange={onChangeIcon}\n onClear={onClearIcon}\n value={result.icon}\n size={ResourcePickerSize.SMALL}\n folderName={ResourceFolderName.Icon}\n mediaType={MediaType.Icon}\n color={result.color}\n />\n {result.icon && (\n <IconButton name=\"times\" onClick={onClearIcon} tooltip=\"Remove icon\" tooltipPlacement=\"top\" />\n )}\n </HorizontalGroup>\n </td>\n )}\n <td className={styles.textAlignCenter}>\n <HorizontalGroup spacing=\"sm\">\n <IconButton name=\"copy\" onClick={() => onDuplicate(index)} data-testid=\"duplicate-value-mapping\" />\n <IconButton name=\"trash-alt\" onClick={() => onRemove(index)} data-testid=\"remove-value-mapping\" />\n </HorizontalGroup>\n </td>\n </tr>\n )}\n </Draggable>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n dragRow: css({\n position: 'relative',\n }),\n dragHandle: css({\n cursor: 'grab',\n // create focus ring around the whole row when the drag handle is tab-focused\n // needs position: relative on the drag row to work correctly\n '&:focus-visible&:after': {\n bottom: 0,\n content: '\"\"',\n left: 0,\n position: 'absolute',\n right: 0,\n top: 0,\n outline: `2px solid ${theme.colors.primary.main}`,\n outlineOffset: '-2px',\n },\n }),\n rangeInputWrapper: css({\n display: 'flex',\n '> div:first-child': {\n marginRight: theme.spacing(2),\n },\n }),\n regexInputWrapper: css({\n display: 'flex',\n '> div:first-child': {\n marginRight: theme.spacing(2),\n },\n }),\n typeColumn: css({\n textTransform: 'capitalize',\n textAlign: 'center',\n width: '1%',\n }),\n textAlignCenter: css({\n textAlign: 'center',\n }),\n});\n","import { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport React, { useEffect, useState } from 'react';\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd';\n\nimport { GrafanaTheme2, MappingType, SelectableValue, SpecialValueMatch, ValueMapping } from '@grafana/data';\nimport { useStyles2, Modal, ValuePicker, Button } from '@grafana/ui';\n\nimport { ValueMappingEditRow, ValueMappingEditRowModel } from './ValueMappingEditRow';\n\nexport interface Props {\n value: ValueMapping[];\n onChange: (valueMappings: ValueMapping[]) => void;\n onClose: () => void;\n showIconPicker?: boolean;\n}\n\nexport function ValueMappingsEditorModal({ value, onChange, onClose, showIconPicker }: Props) {\n const styles = useStyles2(getStyles);\n const [rows, updateRows] = useState<ValueMappingEditRowModel[]>([]);\n\n useEffect(() => {\n updateRows(buildEditRowModels(value));\n }, [value]);\n\n const onDragEnd = (result: DropResult) => {\n if (!value || !result.destination) {\n return;\n }\n\n const copy = [...rows];\n const element = copy[result.source.index];\n copy.splice(result.source.index, 1);\n copy.splice(result.destination.index, 0, element);\n updateRows(copy);\n };\n\n const onChangeMapping = (index: number, row: ValueMappingEditRowModel) => {\n const newList = [...rows];\n newList.splice(index, 1, row);\n updateRows(newList);\n };\n\n const onRemoveRow = (index: number) => {\n const newList = [...rows];\n newList.splice(index, 1);\n updateRows(newList);\n };\n\n const mappingTypes: Array<SelectableValue<MappingType>> = [\n { label: 'Value', value: MappingType.ValueToText, description: 'Match a specific text value' },\n { label: 'Range', value: MappingType.RangeToText, description: 'Match a numerical range of values' },\n { label: 'Regex', value: MappingType.RegexToText, description: 'Match a regular expression with replacement' },\n { label: 'Special', value: MappingType.SpecialValue, description: 'Match on null, NaN, boolean and empty values' },\n ];\n\n const onAddValueMapping = (value: SelectableValue<MappingType>) => {\n updateRows([...rows, createRow({ type: value.value!, result: {}, isNew: true })]);\n };\n\n const onDuplicateMapping = (index: number) => {\n const sourceRow = duplicateRow(rows[index]);\n const copy = [...rows];\n copy.splice(index, 0, { ...sourceRow });\n\n for (let i = index; i < rows.length; i++) {\n copy[i].result.index = i;\n }\n\n updateRows(copy);\n };\n\n const onUpdate = () => {\n onChange(editModelToSaveModel(rows));\n onClose();\n };\n\n // Start with an empty row\n useEffect(() => {\n if (!value?.length) {\n onAddValueMapping({ value: MappingType.ValueToText });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <>\n <div className={styles.tableWrap}>\n <table className={styles.editTable}>\n <thead>\n <tr>\n <th style={{ width: '1%' }}></th>\n <th style={{ width: '40%', textAlign: 'left' }} colSpan={2}>\n Condition\n </th>\n <th style={{ textAlign: 'left' }}>Display text</th>\n <th style={{ width: '10%' }}>Color</th>\n {showIconPicker && <th style={{ width: '10%' }}>Icon</th>}\n <th style={{ width: '1%' }}></th>\n </tr>\n </thead>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"sortable-field-mappings\" direction=\"vertical\">\n {(provided) => (\n <tbody ref={provided.innerRef} {...provided.droppableProps}>\n {rows.map((row, index) => (\n <ValueMappingEditRow\n key={row.id}\n mapping={row}\n index={index}\n onChange={onChangeMapping}\n onRemove={onRemoveRow}\n onDuplicate={onDuplicateMapping}\n showIconPicker={showIconPicker}\n />\n ))}\n {provided.placeholder}\n </tbody>\n )}\n </Droppable>\n </DragDropContext>\n </table>\n </div>\n\n <Modal.ButtonRow\n leftItems={\n <ValuePicker\n label=\"Add a new mapping\"\n variant=\"secondary\"\n size=\"md\"\n icon=\"plus\"\n menuPlacement=\"auto\"\n minWidth={40}\n options={mappingTypes}\n onChange={onAddValueMapping}\n />\n }\n >\n <Button variant=\"secondary\" fill=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"primary\" onClick={onUpdate}>\n Update\n </Button>\n </Modal.ButtonRow>\n </>\n );\n}\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n tableWrap: css`\n max-height: calc(80vh - 170px);\n min-height: 40px;\n overflow: auto;\n `,\n\n editTable: css({\n width: '100%',\n marginBottom: theme.spacing(2),\n\n 'thead th': {\n textAlign: 'center',\n },\n\n 'tbody tr:hover': {\n background: theme.colors.action.hover,\n },\n\n ' th, td': {\n padding: theme.spacing(1),\n },\n }),\n});\n\nfunction getRowUniqueId(): string {\n return uniqueId('mapping-');\n}\n\nfunction createRow(row: Partial<ValueMappingEditRowModel>): ValueMappingEditRowModel {\n return {\n type: MappingType.ValueToText,\n result: {},\n id: getRowUniqueId(),\n ...row,\n };\n}\n\nfunction duplicateRow(row: Partial<ValueMappingEditRowModel>): ValueMappingEditRowModel {\n return {\n ...createRow(row),\n // provide a new unique id to the duplicated row, to preserve focus when dragging 2 duplicated rows\n id: getRowUniqueId(),\n };\n}\n\nexport function editModelToSaveModel(rows: ValueMappingEditRowModel[]) {\n const mappings: ValueMapping[] = [];\n const valueMaps: ValueMapping = {\n type: MappingType.ValueToText,\n options: {},\n };\n\n rows.forEach((item, index) => {\n const result = {\n ...item.result,\n index,\n };\n\n // Set empty texts to undefined\n if (!result.text || result.text.trim().length === 0) {\n result.text = undefined;\n }\n\n switch (item.type) {\n case MappingType.ValueToText:\n if (item.key != null) {\n valueMaps.options[item.key] = result;\n }\n break;\n case MappingType.RangeToText:\n if (item.from != null && item.to != null) {\n mappings.push({\n type: item.type,\n options: {\n from: item.from,\n to: item.to,\n result,\n },\n });\n }\n break;\n case MappingType.RegexToText:\n if (item.pattern != null) {\n mappings.push({\n type: item.type,\n options: {\n pattern: item.pattern,\n result,\n },\n });\n }\n break;\n case MappingType.SpecialValue:\n mappings.push({\n type: item.type,\n options: {\n match: item.specialMatch!,\n result,\n },\n });\n }\n });\n\n if (Object.keys(valueMaps.options).length > 0) {\n mappings.unshift(valueMaps);\n }\n return mappings;\n}\n\nexport function buildEditRowModels(value: ValueMapping[]) {\n const editRows: ValueMappingEditRowModel[] = [];\n\n if (value) {\n for (const mapping of value) {\n switch (mapping.type) {\n case MappingType.ValueToText:\n for (const key of Object.keys(mapping.options)) {\n editRows.push(\n createRow({\n type: mapping.type,\n result: mapping.options[key],\n key,\n })\n );\n }\n break;\n case MappingType.RangeToText:\n editRows.push(\n createRow({\n type: mapping.type,\n result: mapping.options.result,\n from: mapping.options.from ?? 0,\n to: mapping.options.to ?? 0,\n })\n );\n break;\n case MappingType.RegexToText:\n editRows.push(\n createRow({\n type: mapping.type,\n result: mapping.options.result,\n pattern: mapping.options.pattern,\n })\n );\n break;\n case MappingType.SpecialValue:\n editRows.push(\n createRow({\n type: mapping.type,\n result: mapping.options.result,\n specialMatch: mapping.options.match ?? SpecialValueMatch.Null,\n })\n );\n }\n }\n }\n\n // Sort by index\n editRows.sort((a, b) => {\n return (a.result.index ?? 0) > (b.result.index ?? 0) ? 1 : -1;\n });\n\n return editRows;\n}\n","import { css } from '@emotion/css';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, MappingType, StandardEditorProps, ValueMapping } from '@grafana/data';\nimport { useStyles2, VerticalGroup, Icon, ColorPicker, Button, Modal } from '@grafana/ui';\n\nimport { MediaType, ResourceFolderName, ResourcePickerSize } from '../../types';\nimport { ResourcePicker } from '../ResourcePicker';\n\nimport { buildEditRowModels, editModelToSaveModel, ValueMappingsEditorModal } from './ValueMappingsEditorModal';\n\nexport interface Props extends StandardEditorProps<ValueMapping[], any, any> {\n showIcon?: boolean;\n}\n\nexport const ValueMappingsEditor = React.memo((props: Props) => {\n const { value, onChange, item } = props;\n\n const styles = useStyles2(getStyles);\n const showIconPicker = item.settings?.icon;\n const [isEditorOpen, setIsEditorOpen] = useState(false);\n const onCloseEditor = useCallback(() => {\n setIsEditorOpen(false);\n }, [setIsEditorOpen]);\n\n const rows = useMemo(() => buildEditRowModels(value), [value]);\n\n const onChangeColor = useCallback(\n (color: string, index: number) => {\n rows[index].result.color = color;\n onChange(editModelToSaveModel(rows));\n },\n [rows, onChange]\n );\n\n const onChangeIcon = useCallback(\n (icon: string | undefined, index: number) => {\n rows[index].result.icon = icon;\n onChange(editModelToSaveModel(rows));\n },\n [rows, onChange]\n );\n\n return (\n <VerticalGroup>\n <table className={styles.compactTable}>\n <tbody>\n {rows.map((row, rowIndex) => (\n <tr key={rowIndex.toString()}>\n <td>\n {row.type === MappingType.ValueToText && row.key}\n {row.type === MappingType.RangeToText && (\n <span>\n [{row.from} - {row.to}]\n </span>\n )}\n {row.type === MappingType.RegexToText && row.pattern}\n {row.type === MappingType.SpecialValue && row.specialMatch}\n </td>\n <td>\n <Icon name=\"arrow-right\" />\n </td>\n <td>{row.result.text}</td>\n {row.result.color && (\n <td>\n <ColorPicker\n color={row.result.color}\n onChange={(color) => onChangeColor(color, rowIndex)}\n enableNamedColors={true}\n />\n </td>\n )}\n {showIconPicker && row.result.icon && (\n <td data-testid=\"iconPicker\">\n <ResourcePicker\n onChange={(icon) => onChangeIcon(icon, rowIndex)}\n value={row.result.icon}\n size={ResourcePickerSize.SMALL}\n folderName={ResourceFolderName.Icon}\n mediaType={MediaType.Icon}\n color={row.result.color}\n />\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n\n <Button variant=\"secondary\" size=\"sm\" fullWidth onClick={() => setIsEditorOpen(true)}>\n {rows.length > 0 && <span>Edit value mappings</span>}\n {rows.length === 0 && <span>Add value mappings</span>}\n </Button>\n <Modal\n isOpen={isEditorOpen}\n title=\"Value mappings\"\n onDismiss={onCloseEditor}\n className={styles.modal}\n closeOnBackdropClick={false}\n >\n <ValueMappingsEditorModal\n value={value}\n onChange={onChange}\n onClose={onCloseEditor}\n showIconPicker={showIconPicker}\n />\n </Modal>\n </VerticalGroup>\n );\n});\n\nValueMappingsEditor.displayName = 'ValueMappingsEditor';\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n modal: css({\n width: '980px',\n }),\n compactTable: css({\n width: '100%',\n 'tbody td': {\n padding: theme.spacing(0.5),\n },\n }),\n});\n","import React, { FC, useCallback } from 'react';\n\nimport { SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { DashboardPicker as BasePicker, DashboardPickerDTO } from 'app/core/components/Select/DashboardPicker';\n\nexport interface DashboardPickerOptions {\n placeholder?: string;\n isClearable?: boolean;\n}\n\n/** This will return the item UID */\nexport const DashboardPicker: FC<StandardEditorProps<string, DashboardPickerOptions, any>> = ({\n value,\n onChange,\n item,\n}) => {\n const { placeholder, isClearable } = item?.settings ?? {};\n\n const onPicked = useCallback(\n (sel?: SelectableValue<DashboardPickerDTO>) => {\n onChange(sel?.value?.uid);\n },\n [onChange]\n );\n\n return (\n <BasePicker isClearable={isClearable} defaultOptions onChange={onPicked} placeholder={placeholder} value={value} />\n );\n};\n","import { css } from '@emotion/css';\nimport React, { CSSProperties, FC } from 'react';\n\nimport {\n FieldConfigEditorProps,\n FieldColorModeId,\n SelectableValue,\n FieldColor,\n fieldColorModeRegistry,\n FieldColorMode,\n GrafanaTheme2,\n FieldColorConfigSettings,\n FieldColorSeriesByMode,\n getFieldColorMode,\n} from '@grafana/data';\nimport { useStyles2, useTheme2, Field, RadioButtonGroup, Select } from '@grafana/ui';\n\nimport { ColorValueEditor } from './color';\n\nexport const FieldColorEditor: React.FC<FieldConfigEditorProps<FieldColor | undefined, FieldColorConfigSettings>> = ({\n value,\n onChange,\n item,\n id,\n}) => {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n\n const colorMode = getFieldColorMode(value?.mode);\n const availableOptions = item.settings?.byValueSupport\n ? fieldColorModeRegistry.list()\n : fieldColorModeRegistry.list().filter((m) => !m.isByValue);\n\n const options = availableOptions.map((mode) => {\n let suffix = mode.isByValue ? ' (by value)' : '';\n\n return {\n value: mode.id,\n label: `${mode.name}${suffix}`,\n description: mode.description,\n isContinuous: mode.isContinuous,\n isByValue: mode.isByValue,\n component() {\n return <FieldColorModeViz mode={mode} theme={theme} />;\n },\n };\n });\n\n const onModeChange = (newMode: SelectableValue<string>) => {\n onChange({\n ...value,\n mode: newMode.value! as FieldColorModeId,\n });\n };\n\n const onColorChange = (color?: string) => {\n onChange({\n ...value,\n mode,\n fixedColor: color,\n });\n };\n\n const onSeriesModeChange = (seriesBy?: FieldColorSeriesByMode) => {\n onChange({\n ...value,\n mode,\n seriesBy,\n });\n };\n\n const mode = value?.mode ?? FieldColorModeId.Thresholds;\n\n if (mode === FieldColorModeId.Fixed) {\n return (\n <div className={styles.group}>\n <Select\n minMenuHeight={200}\n options={options}\n value={mode}\n onChange={onModeChange}\n className={styles.select}\n inputId={id}\n />\n <ColorValueEditor value={value?.fixedColor} onChange={onColorChange} />\n </div>\n );\n }\n\n if (item.settings?.bySeriesSupport && colorMode.isByValue) {\n const seriesModes: Array<SelectableValue<FieldColorSeriesByMode>> = [\n { label: 'Last', value: 'last' },\n { label: 'Min', value: 'min' },\n { label: 'Max', value: 'max' },\n ];\n\n return (\n <>\n <div style={{ marginBottom: theme.spacing(2) }}>\n <Select minMenuHeight={200} options={options} value={mode} onChange={onModeChange} inputId={id} />\n </div>\n <Field label=\"Color series by\">\n <RadioButtonGroup value={value?.seriesBy ?? 'last'} options={seriesModes} onChange={onSeriesModeChange} />\n </Field>\n </>\n );\n }\n\n return <Select minMenuHeight={200} options={options} value={mode} onChange={onModeChange} inputId={id} />;\n};\n\ninterface ModeProps {\n mode: FieldColorMode;\n theme: GrafanaTheme2;\n}\n\nconst FieldColorModeViz: FC<ModeProps> = ({ mode, theme }) => {\n if (!mode.getColors) {\n return null;\n }\n\n const colors = mode.getColors(theme).map(theme.visualization.getColorByName);\n const style: CSSProperties = {\n height: '8px',\n width: '100%',\n margin: '2px 0',\n borderRadius: '3px',\n opacity: 1,\n };\n\n if (mode.isContinuous) {\n style.background = `linear-gradient(90deg, ${colors.join(',')})`;\n } else {\n let gradient = '';\n let lastColor = '';\n\n for (let i = 0; i < colors.length; i++) {\n const color = colors[i];\n if (gradient === '') {\n gradient = `linear-gradient(90deg, ${color} 0%`;\n } else {\n const valuePercent = i / (colors.length - 1);\n const pos = valuePercent * 100;\n gradient += `, ${lastColor} ${pos}%, ${color} ${pos}%`;\n }\n lastColor = color;\n }\n style.background = gradient;\n }\n\n return <div style={style} />;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n group: css`\n display: flex;\n `,\n select: css`\n margin-right: 8px;\n flex-grow: 1;\n `,\n };\n};\n","import React from 'react';\n\nimport {\n DataLink,\n DataLinksFieldConfigSettings,\n FieldConfigEditorProps,\n VariableSuggestionsScope,\n} from '@grafana/data';\nimport { DataLinksInlineEditor } from '@grafana/ui';\n\nexport const DataLinksValueEditor: React.FC<FieldConfigEditorProps<DataLink[], DataLinksFieldConfigSettings>> = ({\n value,\n onChange,\n context,\n}) => {\n return (\n <DataLinksInlineEditor\n links={value}\n onChange={onChange}\n data={context.data}\n getSuggestions={() => (context.getSuggestions ? context.getSuggestions(VariableSuggestionsScope.Values) : [])}\n />\n );\n};\n","import React from 'react';\n\nimport { FieldConfigEditorProps, SelectFieldConfigSettings, SelectableValue } from '@grafana/data';\nimport { MultiSelect } from '@grafana/ui';\n\ninterface State<T> {\n isLoading: boolean;\n options: Array<SelectableValue<T>>;\n}\n\ntype Props<T> = FieldConfigEditorProps<T[], SelectFieldConfigSettings<T>>;\n\n/**\n * MultiSelect for options UI\n * @alpha\n */\nexport class MultiSelectValueEditor<T> extends React.PureComponent<Props<T>, State<T>> {\n state: State<T> = {\n isLoading: true,\n options: [],\n };\n\n componentDidMount() {\n this.updateOptions();\n }\n\n componentDidUpdate(oldProps: Props<T>) {\n const old = oldProps.item?.settings;\n const now = this.props.item?.settings;\n if (old !== now) {\n this.updateOptions();\n } else if (now?.getOptions) {\n const old = oldProps.context?.data;\n const now = this.props.context?.data;\n if (old !== now) {\n this.updateOptions();\n }\n }\n }\n\n updateOptions = async () => {\n const { item } = this.props;\n const { settings } = item;\n let options: Array<SelectableValue<T>> = item.settings?.options || [];\n if (settings?.getOptions) {\n options = await settings.getOptions(this.props.context);\n }\n if (this.state.options !== options) {\n this.setState({\n isLoading: false,\n options,\n });\n }\n };\n\n render() {\n const { options, isLoading } = this.state;\n const { value, onChange, item } = this.props;\n\n const { settings } = item;\n return (\n <MultiSelect<T>\n isLoading={isLoading}\n value={value}\n defaultValue={value}\n allowCustomValue={settings?.allowCustomValue}\n onChange={(e) => {\n onChange(e.map((v) => v.value).flatMap((v) => (v !== undefined ? [v] : [])));\n }}\n options={options}\n />\n );\n }\n}\n","import React from 'react';\n\nimport { FieldConfigEditorProps, SelectFieldConfigSettings, SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\n\ninterface State<T> {\n isLoading: boolean;\n options: Array<SelectableValue<T>>;\n}\n\ntype Props<T> = FieldConfigEditorProps<T, SelectFieldConfigSettings<T>>;\n\nexport class SelectValueEditor<T> extends React.PureComponent<Props<T>, State<T>> {\n state: State<T> = {\n isLoading: true,\n options: [],\n };\n\n componentDidMount() {\n this.updateOptions();\n }\n\n componentDidUpdate(oldProps: Props<T>) {\n const old = oldProps.item?.settings;\n const now = this.props.item?.settings;\n if (old !== now) {\n this.updateOptions();\n } else if (now?.getOptions) {\n const old = oldProps.context?.data;\n const now = this.props.context?.data;\n if (old !== now) {\n this.updateOptions();\n }\n }\n }\n\n updateOptions = async () => {\n const { item } = this.props;\n const { settings } = item;\n let options: Array<SelectableValue<T>> = item.settings?.options || [];\n if (settings?.getOptions) {\n options = await settings.getOptions(this.props.context);\n }\n if (this.state.options !== options) {\n this.setState({\n isLoading: false,\n options,\n });\n }\n };\n\n render() {\n const { options, isLoading } = this.state;\n const { value, onChange, item } = this.props;\n\n const { settings } = item;\n let current = options.find((v) => v.value === value);\n if (!current && value) {\n current = {\n label: `${value}`,\n value,\n };\n }\n return (\n <Select<T>\n isLoading={isLoading}\n value={current}\n defaultValue={value}\n allowCustomValue={settings?.allowCustomValue}\n isClearable={settings?.isClearable}\n onChange={(e) => onChange(e?.value)}\n options={options}\n />\n );\n }\n}\n","import React from 'react';\n\nimport { FieldConfigEditorProps, StatsPickerConfigSettings } from '@grafana/data';\nimport { StatsPicker } from '@grafana/ui';\n\nexport const StatsPickerEditor: React.FC<FieldConfigEditorProps<string[], StatsPickerConfigSettings>> = ({\n value,\n onChange,\n item,\n id,\n}) => {\n return (\n <StatsPicker\n stats={value}\n onChange={onChange}\n allowMultiple={!!item.settings?.allowMultiple}\n defaultStat={item.settings?.defaultStat}\n inputId={id}\n />\n );\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { FieldConfigEditorProps, StringFieldConfigSettings, GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, getTheme, Button, Icon, Input } from '@grafana/ui';\n\ntype Props = FieldConfigEditorProps<string[], StringFieldConfigSettings>;\ninterface State {\n showAdd: boolean;\n}\n\nexport class StringArrayEditor extends React.PureComponent<Props, State> {\n state = {\n showAdd: false,\n };\n\n onRemoveString = (index: number) => {\n const { value, onChange } = this.props;\n const copy = [...value];\n copy.splice(index, 1);\n onChange(copy);\n };\n\n onValueChange = (e: React.SyntheticEvent, idx: number) => {\n const evt = e as React.KeyboardEvent<HTMLInputElement>;\n if (e.hasOwnProperty('key')) {\n if (evt.key !== 'Enter') {\n return;\n }\n }\n const { value, onChange } = this.props;\n\n // Form event, or Enter\n const v = evt.currentTarget.value.trim();\n if (idx < 0) {\n if (v) {\n evt.currentTarget.value = ''; // reset last value\n onChange([...value, v]);\n }\n this.setState({ showAdd: false });\n return;\n }\n\n if (!v) {\n return this.onRemoveString(idx);\n }\n\n const copy = [...value];\n copy[idx] = v;\n onChange(copy);\n };\n\n render() {\n const { value, item } = this.props;\n const { showAdd } = this.state;\n const styles = getStyles(getTheme());\n const placeholder = item.settings?.placeholder || 'Add text';\n return (\n <div>\n {value.map((v, index) => {\n return (\n <Input\n className={styles.textInput}\n key={`${index}/${v}`}\n defaultValue={v || ''}\n onBlur={(e) => this.onValueChange(e, index)}\n onKeyDown={(e) => this.onValueChange(e, index)}\n suffix={<Icon className={styles.trashIcon} name=\"trash-alt\" onClick={() => this.onRemoveString(index)} />}\n />\n );\n })}\n\n {showAdd ? (\n <Input\n autoFocus\n className={styles.textInput}\n placeholder={placeholder}\n defaultValue={''}\n onBlur={(e) => this.onValueChange(e, -1)}\n onKeyDown={(e) => this.onValueChange(e, -1)}\n suffix={<Icon name=\"plus-circle\" />}\n />\n ) : (\n <Button icon=\"plus\" size=\"sm\" variant=\"secondary\" onClick={() => this.setState({ showAdd: true })}>\n {placeholder}\n </Button>\n )}\n </div>\n );\n }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n textInput: css`\n margin-bottom: 5px;\n &:hover {\n border: 1px solid ${theme.colors.formInputBorderHover};\n }\n `,\n trashIcon: css`\n color: ${theme.colors.textWeak};\n cursor: pointer;\n\n &:hover {\n color: ${theme.colors.text};\n }\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { FieldConfigEditorProps, GrafanaTheme2, UnitFieldConfigSettings } from '@grafana/data';\nimport { IconButton, UnitPicker, useStyles2 } from '@grafana/ui';\n\ntype Props = FieldConfigEditorProps<string, UnitFieldConfigSettings>;\n\nexport function UnitValueEditor({ value, onChange, item }: Props) {\n const styles = useStyles2(getStyles);\n if (item?.settings?.isClearable && value != null) {\n return (\n <div className={styles.wrapper}>\n <span className={styles.first}>\n <UnitPicker value={value} onChange={onChange} />\n </span>\n <IconButton ariaLabel=\"clear unit selection\" name=\"times\" onClick={() => onChange(undefined)} />\n </div>\n );\n }\n return <UnitPicker value={value} onChange={onChange} />;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n width: 100%;\n display: flex;\n flex-direction: rows;\n align-items: center;\n `,\n first: css`\n margin-right: 8px;\n flex-grow: 2;\n `,\n});\n","import React from 'react';\n\nimport {\n FieldConfigPropertyItem,\n FieldType,\n standardEditorsRegistry,\n StandardEditorsRegistryItem,\n ThresholdsConfig,\n ThresholdsFieldConfigSettings,\n ThresholdsMode,\n thresholdsOverrideProcessor,\n ValueMapping,\n ValueMappingFieldConfigSettings,\n valueMappingsOverrideProcessor,\n DataLink,\n dataLinksOverrideProcessor,\n NumberFieldConfigSettings,\n numberOverrideProcessor,\n StringFieldConfigSettings,\n stringOverrideProcessor,\n identityOverrideProcessor,\n TimeZone,\n FieldColor,\n FieldColorConfigSettings,\n StatsPickerConfigSettings,\n displayNameOverrideProcessor,\n FieldNamePickerConfigSettings,\n} from '@grafana/data';\nimport { RadioButtonGroup, TimeZonePicker, Switch } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\nimport { ThresholdsValueEditor } from 'app/features/dimensions/editors/ThresholdsEditor/thresholds';\nimport { ValueMappingsEditor } from 'app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditor';\n\nimport { DashboardPicker, DashboardPickerOptions } from './DashboardPicker';\nimport { ColorValueEditor } from './color';\nimport { FieldColorEditor } from './fieldColor';\nimport { DataLinksValueEditor } from './links';\nimport { MultiSelectValueEditor } from './multiSelect';\nimport { NumberValueEditor } from './number';\nimport { SelectValueEditor } from './select';\nimport { SliderValueEditor } from './slider';\nimport { StatsPickerEditor } from './stats';\nimport { StringValueEditor } from './string';\nimport { StringArrayEditor } from './strings';\nimport { UnitValueEditor } from './units';\n\n/**\n * Returns collection of standard option editors definitions\n */\nexport const getAllOptionEditors = () => {\n const number: StandardEditorsRegistryItem<number> = {\n id: 'number',\n name: 'Number',\n description: 'Allows numeric values input',\n editor: NumberValueEditor as any,\n };\n\n const slider: StandardEditorsRegistryItem<number> = {\n id: 'slider',\n name: 'Slider',\n description: 'Allows numeric values input',\n editor: SliderValueEditor as any,\n };\n\n const text: StandardEditorsRegistryItem<string> = {\n id: 'text',\n name: 'Text',\n description: 'Allows string values input',\n editor: StringValueEditor as any,\n };\n\n const strings: StandardEditorsRegistryItem<string[]> = {\n id: 'strings',\n name: 'String array',\n description: 'An array of strings',\n editor: StringArrayEditor as any,\n };\n\n const boolean: StandardEditorsRegistryItem<boolean> = {\n id: 'boolean',\n name: 'Boolean',\n description: 'Allows boolean values input',\n editor(props) {\n return <Switch {...props} onChange={(e) => props.onChange(e.currentTarget.checked)} />;\n },\n };\n\n const select: StandardEditorsRegistryItem<any> = {\n id: 'select',\n name: 'Select',\n description: 'Allows option selection',\n editor: SelectValueEditor as any,\n };\n\n const multiSelect: StandardEditorsRegistryItem<any> = {\n id: 'multi-select',\n name: 'Multi select',\n description: 'Allows for multiple option selection',\n editor: MultiSelectValueEditor as any,\n };\n\n const radio: StandardEditorsRegistryItem<any> = {\n id: 'radio',\n name: 'Radio',\n description: 'Allows option selection',\n editor(props) {\n return <RadioButtonGroup {...props} options={props.item.settings?.options} />;\n },\n };\n\n const unit: StandardEditorsRegistryItem<string> = {\n id: 'unit',\n name: 'Unit',\n description: 'Allows unit input',\n editor: UnitValueEditor as any,\n };\n\n const color: StandardEditorsRegistryItem<string> = {\n id: 'color',\n name: 'Color',\n description: 'Allows color selection',\n editor(props) {\n return <ColorValueEditor value={props.value} onChange={props.onChange} />;\n },\n };\n\n const fieldColor: StandardEditorsRegistryItem<FieldColor> = {\n id: 'fieldColor',\n name: 'Field Color',\n description: 'Field color selection',\n editor: FieldColorEditor as any,\n };\n\n const links: StandardEditorsRegistryItem<DataLink[]> = {\n id: 'links',\n name: 'Links',\n description: 'Allows defining data links',\n editor: DataLinksValueEditor as any,\n };\n\n const statsPicker: StandardEditorsRegistryItem<string[], StatsPickerConfigSettings> = {\n id: 'stats-picker',\n name: 'Stats Picker',\n editor: StatsPickerEditor as any,\n description: '',\n };\n\n const timeZone: StandardEditorsRegistryItem<TimeZone> = {\n id: 'timezone',\n name: 'Time zone',\n description: 'Time zone selection',\n editor: TimeZonePicker as any,\n };\n\n const fieldName: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {\n id: 'field-name',\n name: 'Field name',\n description: 'Allows selecting a field name from a data frame',\n editor: FieldNamePicker as any,\n };\n\n const dashboardPicker: StandardEditorsRegistryItem<string, DashboardPickerOptions> = {\n id: 'dashboard-uid',\n name: 'Dashboard',\n description: 'Select dashboard',\n editor: DashboardPicker as any,\n };\n\n const mappings: StandardEditorsRegistryItem<ValueMapping[]> = {\n id: 'mappings',\n name: 'Mappings',\n description: 'Allows defining value mappings',\n editor: ValueMappingsEditor as any,\n };\n\n const thresholds: StandardEditorsRegistryItem<ThresholdsConfig> = {\n id: 'thresholds',\n name: 'Thresholds',\n description: 'Allows defining thresholds',\n editor: ThresholdsValueEditor as any,\n };\n\n return [\n text,\n number,\n slider,\n boolean,\n radio,\n select,\n unit,\n links,\n statsPicker,\n strings,\n timeZone,\n fieldColor,\n color,\n multiSelect,\n fieldName,\n dashboardPicker,\n mappings,\n thresholds,\n ];\n};\n\n/**\n * Returns collection of common field config properties definitions\n */\nexport const getAllStandardFieldConfigs = () => {\n const category = ['Standard options'];\n const displayName: FieldConfigPropertyItem<any, string, StringFieldConfigSettings> = {\n id: 'displayName',\n path: 'displayName',\n name: 'Display name',\n description: 'Change the field or series name',\n editor: standardEditorsRegistry.get('text').editor as any,\n override: standardEditorsRegistry.get('text').editor as any,\n process: displayNameOverrideProcessor,\n settings: {\n placeholder: 'none',\n expandTemplateVars: true,\n },\n shouldApply: () => true,\n category,\n };\n\n const unit: FieldConfigPropertyItem<any, string, StringFieldConfigSettings> = {\n id: 'unit',\n path: 'unit',\n name: 'Unit',\n description: '',\n\n editor: standardEditorsRegistry.get('unit').editor as any,\n override: standardEditorsRegistry.get('unit').editor as any,\n process: stringOverrideProcessor,\n\n settings: {\n placeholder: 'none',\n },\n\n shouldApply: () => true,\n category,\n };\n\n const min: FieldConfigPropertyItem<any, number, NumberFieldConfigSettings> = {\n id: 'min',\n path: 'min',\n name: 'Min',\n description: 'Leave empty to calculate based on all values',\n\n editor: standardEditorsRegistry.get('number').editor as any,\n override: standardEditorsRegistry.get('number').editor as any,\n process: numberOverrideProcessor,\n\n settings: {\n placeholder: 'auto',\n },\n shouldApply: (field) => field.type === FieldType.number,\n category,\n };\n\n const max: FieldConfigPropertyItem<any, number, NumberFieldConfigSettings> = {\n id: 'max',\n path: 'max',\n name: 'Max',\n description: 'Leave empty to calculate based on all values',\n\n editor: standardEditorsRegistry.get('number').editor as any,\n override: standardEditorsRegistry.get('number').editor as any,\n process: numberOverrideProcessor,\n\n settings: {\n placeholder: 'auto',\n },\n\n shouldApply: (field) => field.type === FieldType.number,\n category,\n };\n\n const decimals: FieldConfigPropertyItem<any, number, NumberFieldConfigSettings> = {\n id: 'decimals',\n path: 'decimals',\n name: 'Decimals',\n\n editor: standardEditorsRegistry.get('number').editor as any,\n override: standardEditorsRegistry.get('number').editor as any,\n process: numberOverrideProcessor,\n\n settings: {\n placeholder: 'auto',\n min: 0,\n max: 15,\n integer: true,\n },\n\n shouldApply: (field) => field.type === FieldType.number,\n category,\n };\n\n const noValue: FieldConfigPropertyItem<any, string, StringFieldConfigSettings> = {\n id: 'noValue',\n path: 'noValue',\n name: 'No value',\n description: 'What to show when there is no value',\n\n editor: standardEditorsRegistry.get('text').editor as any,\n override: standardEditorsRegistry.get('text').editor as any,\n process: stringOverrideProcessor,\n\n settings: {\n placeholder: '-',\n },\n // ??? any optionsUi with no value\n shouldApply: () => true,\n category,\n };\n\n const links: FieldConfigPropertyItem<any, DataLink[], StringFieldConfigSettings> = {\n id: 'links',\n path: 'links',\n name: 'Data links',\n editor: standardEditorsRegistry.get('links').editor as any,\n override: standardEditorsRegistry.get('links').editor as any,\n process: dataLinksOverrideProcessor,\n settings: {\n placeholder: '-',\n },\n shouldApply: () => true,\n category: ['Data links'],\n getItemsCount: (value) => (value ? value.length : 0),\n };\n\n const color: FieldConfigPropertyItem<any, FieldColor | undefined, FieldColorConfigSettings> = {\n id: 'color',\n path: 'color',\n name: 'Color scheme',\n editor: standardEditorsRegistry.get('fieldColor').editor as any,\n override: standardEditorsRegistry.get('fieldColor').editor as any,\n process: identityOverrideProcessor,\n shouldApply: () => true,\n settings: {\n byValueSupport: true,\n preferThresholdsMode: true,\n },\n category,\n };\n\n const mappings: FieldConfigPropertyItem<any, ValueMapping[], ValueMappingFieldConfigSettings> = {\n id: 'mappings',\n path: 'mappings',\n name: 'Value mappings',\n description: 'Modify the display text based on input value',\n\n editor: standardEditorsRegistry.get('mappings').editor as any,\n override: standardEditorsRegistry.get('mappings').editor as any,\n process: valueMappingsOverrideProcessor,\n settings: {},\n defaultValue: [],\n shouldApply: (x) => x.type !== FieldType.time,\n category: ['Value mappings'],\n getItemsCount: (value?) => (value ? value.length : 0),\n };\n\n const thresholds: FieldConfigPropertyItem<any, ThresholdsConfig, ThresholdsFieldConfigSettings> = {\n id: 'thresholds',\n path: 'thresholds',\n name: 'Thresholds',\n editor: standardEditorsRegistry.get('thresholds').editor as any,\n override: standardEditorsRegistry.get('thresholds').editor as any,\n process: thresholdsOverrideProcessor,\n settings: {},\n defaultValue: {\n mode: ThresholdsMode.Absolute,\n steps: [\n { value: -Infinity, color: 'green' },\n { value: 80, color: 'red' },\n ],\n },\n shouldApply: () => true,\n category: ['Thresholds'],\n getItemsCount: (value) => (value ? value.steps.length : 0),\n };\n\n return [unit, min, max, decimals, displayName, color, noValue, links, mappings, thresholds];\n};\n","import { css, cx } from '@emotion/css';\nimport { Global } from '@emotion/react';\nimport SliderComponent from 'rc-slider';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { FieldConfigEditorProps, GrafanaTheme2, SliderFieldConfigSettings } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\nimport { getStyles } from '@grafana/ui/src/components/Slider/styles';\n\nimport { NumberInput } from './NumberInput';\n\nexport const SliderValueEditor: React.FC<FieldConfigEditorProps<number, SliderFieldConfigSettings>> = ({\n value,\n onChange,\n item,\n}) => {\n // Input reference\n const inputRef = useRef<HTMLSpanElement>(null);\n\n // Settings\n const { settings } = item;\n const min = settings?.min || 0;\n const max = settings?.max || 100;\n const step = settings?.step;\n const marks = settings?.marks || { [min]: min, [max]: max };\n const included = settings?.included;\n const ariaLabelForHandle = settings?.ariaLabelForHandle;\n\n // Core slider specific parameters and state\n const inputWidthDefault = 75;\n const isHorizontal = true;\n const theme = useTheme2();\n const SliderWithTooltip = SliderComponent;\n const [sliderValue, setSliderValue] = useState<number>(value ?? min);\n const [inputWidth, setInputWidth] = useState<number>(inputWidthDefault);\n\n // Check for a difference between prop value and internal state\n useEffect(() => {\n if (value != null && value !== sliderValue) {\n setSliderValue(value);\n }\n }, [value, sliderValue]);\n\n // Using input font and expected maximum number of digits, set input width\n useEffect(() => {\n const inputElement = getComputedStyle(inputRef.current!);\n const fontWeight = inputElement.getPropertyValue('font-weight') || 'normal';\n const fontSize = inputElement.getPropertyValue('font-size') || '16px';\n const fontFamily = inputElement.getPropertyValue('font-family') || 'Arial';\n const wideNumericalCharacter = '0';\n const marginDigits = 4; // extra digits to account for things like negative, exponential, and controls\n const inputPadding = 8; // TODO: base this on input styling\n const maxDigits =\n Math.max((max + (step || 0)).toString().length, (max - (step || 0)).toString().length) + marginDigits;\n const refString = wideNumericalCharacter.repeat(maxDigits);\n const calculatedTextWidth = getTextWidth(refString, `${fontWeight} ${fontSize} ${fontFamily}`);\n if (calculatedTextWidth) {\n setInputWidth(calculatedTextWidth + inputPadding * 2);\n }\n }, [max, step]);\n\n const onSliderChange = useCallback(\n (v: number) => {\n setSliderValue(v);\n\n if (onChange) {\n onChange(v);\n }\n },\n [setSliderValue, onChange]\n );\n\n const onSliderInputChange = useCallback(\n (value?: number) => {\n let v = value;\n\n if (Number.isNaN(v) || !v) {\n v = 0;\n }\n\n setSliderValue(v);\n\n if (onChange) {\n onChange(v);\n }\n },\n [onChange]\n );\n\n // Styles\n const styles = getStyles(theme, isHorizontal, Boolean(marks));\n const stylesSlider = getStylesSlider(theme, inputWidth);\n const sliderInputClassNames = !isHorizontal ? [styles.sliderInputVertical] : [];\n\n return (\n <div className={cx(styles.container, styles.slider)}>\n {/** Slider tooltip's parent component is body and therefore we need Global component to do css overrides for it. */}\n <Global styles={styles.slider} />\n <label className={cx(styles.sliderInput, ...sliderInputClassNames)}>\n <SliderWithTooltip\n min={min}\n max={max}\n step={step}\n defaultValue={value}\n value={sliderValue}\n onChange={onSliderChange}\n vertical={!isHorizontal}\n reverse={false}\n ariaLabelForHandle={ariaLabelForHandle}\n marks={marks}\n included={included}\n />\n <span className={stylesSlider.numberInputWrapper} ref={inputRef}>\n <NumberInput value={sliderValue} onChange={onSliderInputChange} max={max} min={min} step={step} />\n </span>\n </label>\n </div>\n );\n};\n\n// Calculate width of string with given font\nfunction getTextWidth(text: string, font: string): number | null {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (context) {\n context.font = font;\n const metrics = context.measureText(text);\n return metrics.width;\n }\n return null;\n}\n\nconst getStylesSlider = (theme: GrafanaTheme2, width: number) => {\n return {\n numberInputWrapper: css`\n margin-left: 10px;\n max-height: 32px;\n max-width: ${width}px;\n min-width: ${width}px;\n overflow: visible;\n width: 100%;\n `,\n };\n};\n","import React, { ReactNode, useCallback } from 'react';\n\nimport { StandardEditorProps, StringFieldConfigSettings } from '@grafana/data';\nimport { Input, TextArea } from '@grafana/ui';\n\ninterface Props extends StandardEditorProps<string, StringFieldConfigSettings> {\n suffix?: ReactNode;\n}\n\nexport const StringValueEditor: React.FC<Props> = ({ value, onChange, item, suffix }) => {\n const Component = item.settings?.useTextarea ? TextArea : Input;\n const onValueChange = useCallback(\n (e: React.SyntheticEvent) => {\n let nextValue = value ?? '';\n if (e.hasOwnProperty('key')) {\n // handling keyboard event\n const evt = e as React.KeyboardEvent<HTMLInputElement>;\n if (evt.key === 'Enter' && !item.settings?.useTextarea) {\n nextValue = evt.currentTarget.value.trim();\n }\n } else {\n // handling form event\n const evt = e as React.FormEvent<HTMLInputElement>;\n nextValue = evt.currentTarget.value.trim();\n }\n if (nextValue === value) {\n return; // no change\n }\n onChange(nextValue === '' ? undefined : nextValue);\n },\n [value, item.settings?.useTextarea, onChange]\n );\n\n return (\n <Component\n placeholder={item.settings?.placeholder}\n defaultValue={value || ''}\n rows={(item.settings?.useTextarea && item.settings.rows) || 5}\n onBlur={onValueChange}\n onKeyDown={onValueChange}\n suffix={suffix}\n />\n );\n};\n","import { useSelector } from 'react-redux';\nimport { createSelector } from 'reselect';\n\nimport { NavModel } from '@grafana/data';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { store } from 'app/store/store';\nimport { StoreState } from 'app/types';\n\nexport function usePageNav(navId?: string, oldProp?: NavModel): NavModel | undefined {\n if (oldProp) {\n return oldProp;\n }\n\n if (!navId) {\n return;\n }\n\n // Page component is used in so many tests, this simplifies not having to initialize a full redux store\n if (!store) {\n return;\n }\n\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSelector(createSelector(getNavIndex, (navIndex) => getNavModel(navIndex, navId ?? 'home')));\n}\n\nfunction getNavIndex(store: StoreState) {\n return store.navIndex;\n}\n","import { useEffect } from 'react';\n\nimport { NavModel, NavModelItem } from '@grafana/data';\n\nimport { Branding } from '../Branding/Branding';\n\nexport function usePageTitle(navModel?: NavModel, pageNav?: NavModelItem) {\n useEffect(() => {\n const parts: string[] = [];\n\n if (pageNav) {\n if (pageNav.children) {\n const activePage = pageNav.children.find((x) => x.active);\n if (activePage) {\n parts.push(activePage.text);\n }\n }\n parts.push(pageNav.text);\n }\n\n if (navModel) {\n if (navModel.node !== navModel.main) {\n parts.push(navModel.node.text);\n }\n parts.push(navModel.main.text);\n }\n\n parts.push(Branding.AppTitle);\n\n document.title = parts.join(' - ');\n }, [navModel, pageNav]);\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { NavModelItem, GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nexport interface Props {\n navItem: NavModelItem;\n subTitle?: React.ReactNode;\n}\n\nexport function PageHeader({ navItem, subTitle }: Props) {\n const styles = useStyles2(getStyles);\n const sub = subTitle ?? navItem.subTitle;\n\n return (\n <>\n <h1 className={styles.pageTitle}>\n {navItem.img && <img className={styles.pageImg} src={navItem.img} alt={`logo for ${navItem.text}`} />}\n {navItem.text}\n </h1>\n {sub && <div className={styles.pageSubTitle}>{sub}</div>}\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n pageTitle: css({\n display: 'flex',\n marginBottom: theme.spacing(3),\n }),\n pageSubTitle: css({\n marginBottom: theme.spacing(2),\n position: 'relative',\n top: theme.spacing(-1),\n color: theme.colors.text.secondary,\n }),\n pageImg: css({\n width: '32px',\n height: '32px',\n marginRight: theme.spacing(2),\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { NavModelItem, GrafanaTheme2 } from '@grafana/data';\nimport { IconName, useStyles2, TabsBar, Tab } from '@grafana/ui';\n\nexport interface Props {\n navItem: NavModelItem;\n}\n\nexport function PageTabs({ navItem }: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.tabsWrapper}>\n <TabsBar>\n {navItem.children!.map((child, index) => {\n return (\n !child.hideFromTabs && (\n <Tab\n label={child.text}\n active={child.active}\n key={`${child.url}-${index}`}\n icon={child.icon as IconName}\n href={child.url}\n suffix={child.tabSuffix}\n />\n )\n );\n })}\n </TabsBar>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n tabsWrapper: css({\n paddingBottom: theme.spacing(3),\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { NavModel, GrafanaTheme2 } from '@grafana/data';\nimport { IconName, useStyles2, Icon, VerticalTab } from '@grafana/ui';\n\nexport interface Props {\n model: NavModel;\n}\n\nexport function SectionNav(props: Props) {\n const styles = useStyles2(getStyles);\n\n const main = props.model.main;\n const directChildren = props.model.main.children!.filter((x) => !x.hideFromTabs && !x.children);\n const nestedItems = props.model.main.children!.filter((x) => x.children && x.children.length);\n\n return (\n <nav className={styles.nav}>\n <h2 className={styles.sectionName}>\n {main.icon && <Icon name={main.icon as IconName} size=\"lg\" />}\n {main.img && <img className={styles.sectionImg} src={main.img} alt={`logo of ${main.text}`} />}\n {props.model.main.text}\n </h2>\n <div className={styles.items}>\n {directChildren.map((child, index) => {\n return (\n !child.hideFromTabs &&\n !child.children && (\n <VerticalTab\n label={child.text}\n active={child.active}\n key={`${child.url}-${index}`}\n // icon={child.icon as IconName}\n href={child.url}\n />\n )\n );\n })}\n {nestedItems.map((child) => (\n <>\n <div className={styles.subSection}>{child.text}</div>\n {child.children!.map((child, index) => {\n return (\n !child.hideFromTabs &&\n !child.children && (\n <VerticalTab\n label={child.text}\n active={child.active}\n key={`${child.url}-${index}`}\n // icon={child.icon as IconName}\n href={child.url}\n />\n )\n );\n })}\n </>\n ))}\n </div>\n </nav>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n nav: css({\n display: 'flex',\n flexDirection: 'column',\n background: theme.colors.background.canvas,\n padding: theme.spacing(3, 2),\n flexShrink: 0,\n [theme.breakpoints.up('md')]: {\n width: '250px',\n },\n }),\n sectionName: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n padding: theme.spacing(0.5, 0, 3, 0.25),\n fontSize: theme.typography.h4.fontSize,\n margin: 0,\n }),\n items: css({\n // paddingLeft: '9px',\n }),\n sectionImg: css({\n height: 48,\n }),\n subSection: css({\n padding: theme.spacing(3, 0, 0.5, 1),\n fontWeight: 500,\n }),\n };\n};\n","// Libraries\nimport { css, cx } from '@emotion/css';\nimport React, { useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { CustomScrollbar, useStyles2 } from '@grafana/ui';\nimport { useGrafana } from 'app/core/context/GrafanaContext';\n\nimport { Footer } from '../Footer/Footer';\nimport { PageLayoutType, PageType } from '../Page/types';\nimport { usePageNav } from '../Page/usePageNav';\nimport { usePageTitle } from '../Page/usePageTitle';\n\nimport { PageContents } from './PageContents';\nimport { PageHeader } from './PageHeader';\nimport { PageTabs } from './PageTabs';\nimport { SectionNav } from './SectionNav';\n\nexport const Page: PageType = ({\n navId,\n navModel: oldNavProp,\n pageNav,\n subTitle,\n children,\n className,\n layout = PageLayoutType.Default,\n toolbar,\n scrollTop,\n scrollRef,\n}) => {\n const styles = useStyles2(getStyles);\n const navModel = usePageNav(navId, oldNavProp);\n const { chrome } = useGrafana();\n\n usePageTitle(navModel, pageNav);\n\n const pageHeaderNav = pageNav ?? navModel?.node;\n\n useEffect(() => {\n if (navModel) {\n chrome.update({\n sectionNav: navModel.node,\n ...(pageNav && { pageNav }),\n });\n }\n }, [navModel, pageNav, chrome]);\n\n return (\n <div className={cx(styles.wrapper, className)}>\n {layout === PageLayoutType.Default && (\n <div className={styles.panes}>\n {navModel && navModel.main.children && <SectionNav model={navModel} />}\n <div className={styles.pageContent}>\n <CustomScrollbar autoHeightMin={'100%'} scrollTop={scrollTop} scrollRefCallback={scrollRef}>\n <div className={styles.pageInner}>\n {pageHeaderNav && <PageHeader navItem={pageHeaderNav} subTitle={subTitle} />}\n {pageNav && pageNav.children && <PageTabs navItem={pageNav} />}\n {children}\n </div>\n <Footer />\n </CustomScrollbar>\n </div>\n </div>\n )}\n {layout === PageLayoutType.Dashboard && (\n <CustomScrollbar autoHeightMin={'100%'} scrollTop={scrollTop} scrollRefCallback={scrollRef}>\n <div className={styles.dashboardContent}>\n {toolbar}\n {children}\n </div>\n </CustomScrollbar>\n )}\n </div>\n );\n};\n\nPage.Header = PageHeader;\nPage.Contents = PageContents;\nPage.OldNavOnly = () => null;\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const shadow = theme.isDark\n ? `0 0.6px 1.5px -1px rgb(0 0 0),0 2px 4px -1px rgb(0 0 0 / 40%),0 5px 10px -1px rgb(0 0 0 / 23%)`\n : '0 0.6px 1.5px -1px rgb(0 0 0 / 8%),0 2px 4px rgb(0 0 0 / 6%),0 5px 10px -1px rgb(0 0 0 / 5%)';\n\n return {\n wrapper: css`\n height: 100%;\n display: flex;\n flex: 1 1 0;\n flex-direction: column;\n min-height: 0;\n `,\n panes: css({\n display: 'flex',\n height: '100%',\n width: '100%',\n flexGrow: 1,\n minHeight: 0,\n flexDirection: 'column',\n [theme.breakpoints.up('md')]: {\n flexDirection: 'row',\n },\n }),\n pageContent: css({\n flexGrow: 1,\n }),\n pageInner: css({\n padding: theme.spacing(3),\n boxShadow: shadow,\n background: theme.colors.background.primary,\n margin: theme.spacing(2, 2, 2, 1),\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n }),\n dashboardContent: css({\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(2),\n flexBasis: '100%',\n flexGrow: 1,\n }),\n };\n};\n","// Libraries\nimport React, { FC } from 'react';\n\nimport PageLoader from '../PageLoader/PageLoader';\n\ninterface Props {\n isLoading?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const PageContents: FC<Props> = ({ isLoading, children }) => {\n return <>{isLoading ? <PageLoader /> : children}</>;\n};\n","// Libraries\nimport { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, NavModel, NavModelItem } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { CustomScrollbar, useStyles2 } from '@grafana/ui';\n\nimport { Footer } from '../Footer/Footer';\nimport { PageHeader } from '../PageHeader/PageHeader';\nimport { Page as NewPage } from '../PageNew/Page';\n\nimport { OldNavOnly } from './OldNavOnly';\nimport { PageContents } from './PageContents';\nimport { PageLayoutType, PageType } from './types';\nimport { usePageNav } from './usePageNav';\nimport { usePageTitle } from './usePageTitle';\n\nexport const OldPage: PageType = ({\n navId,\n navModel: oldNavProp,\n pageNav,\n children,\n className,\n toolbar,\n scrollRef,\n scrollTop,\n layout = PageLayoutType.Default,\n}) => {\n const styles = useStyles2(getStyles);\n const navModel = usePageNav(navId, oldNavProp);\n\n usePageTitle(navModel, pageNav);\n\n const pageHeaderNav = getPageHeaderNav(navModel, pageNav);\n\n return (\n <div className={cx(styles.wrapper, className)}>\n {layout === PageLayoutType.Default && (\n <CustomScrollbar autoHeightMin={'100%'} scrollTop={scrollTop} scrollRefCallback={scrollRef}>\n <div className=\"page-scrollbar-content\">\n {pageHeaderNav && <PageHeader navItem={pageHeaderNav} />}\n {children}\n <Footer />\n </div>\n </CustomScrollbar>\n )}\n {layout === PageLayoutType.Dashboard && (\n <>\n {toolbar}\n <div className={styles.scrollWrapper}>\n <CustomScrollbar autoHeightMin={'100%'} scrollTop={scrollTop} scrollRefCallback={scrollRef}>\n <div className={cx(styles.content, !toolbar && styles.contentWithoutToolbar)}>{children}</div>\n </CustomScrollbar>\n </div>\n </>\n )}\n </div>\n );\n};\n\nfunction getPageHeaderNav(navModel?: NavModel, pageNav?: NavModelItem): NavModelItem | undefined {\n if (pageNav?.children && pageNav.children.length > 0) {\n return pageNav;\n }\n\n return navModel?.main;\n}\n\nOldPage.Header = PageHeader;\nOldPage.Contents = PageContents;\nOldPage.OldNavOnly = OldNavOnly;\n\nexport const Page: PageType = config.featureToggles.topnav ? NewPage : OldPage;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n width: '100%',\n height: '100%',\n display: 'flex',\n flex: '1 1 0',\n flexDirection: 'column',\n minHeight: 0,\n }),\n scrollWrapper: css({\n width: '100%',\n flexGrow: 1,\n minHeight: 0,\n display: 'flex',\n }),\n content: css({\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(0, 2, 2, 2),\n flexBasis: '100%',\n flexGrow: 1,\n }),\n contentWithoutToolbar: css({\n padding: theme.spacing(2),\n }),\n});\n","// Libraries\nimport { cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\n// Components\nimport PageLoader from '../PageLoader/PageLoader';\n\ninterface Props {\n isLoading?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const PageContents: FC<Props> = ({ isLoading, children, className }) => {\n return <div className={cx('page-container', 'page-body', className)}>{isLoading ? <PageLoader /> : children}</div>;\n};\n","import React from 'react';\n\ninterface Props {\n children: React.ReactNode;\n}\n\n/** Remove after topnav feature toggle is removed */\nexport function OldNavOnly({ children }: Props): React.ReactElement | null {\n return <>{children}</>;\n}\n","import React, { FC, HTMLAttributes, RefCallback } from 'react';\n\nimport { NavModel, NavModelItem } from '@grafana/data';\n\nimport { PageHeader } from '../PageHeader/PageHeader';\n\nimport { OldNavOnly } from './OldNavOnly';\nimport { PageContents } from './PageContents';\n\nexport interface PageProps extends HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n navId?: string;\n navModel?: NavModel;\n pageNav?: NavModelItem;\n subTitle?: React.ReactNode;\n layout?: PageLayoutType;\n /** Something we can remove when we remove the old nav. */\n toolbar?: React.ReactNode;\n /** Can be used to get the scroll container element to access scroll position */\n scrollRef?: RefCallback<HTMLDivElement>;\n /** Can be used to update the current scroll position */\n scrollTop?: number;\n}\n\nexport enum PageLayoutType {\n Default,\n Dashboard,\n}\n\nexport interface PageType extends FC<PageProps> {\n Header: typeof PageHeader;\n OldNavOnly: typeof OldNavOnly;\n Contents: typeof PageContents;\n}\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { NavModelItem, NavModelBreadcrumb, GrafanaTheme2 } from '@grafana/data';\nimport { Tab, TabsBar, Icon, IconName, useStyles2 } from '@grafana/ui';\nimport { PanelHeaderMenuItem } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuItem';\n\nimport { ProBadge } from '../Upgrade/ProBadge';\n\nexport interface Props {\n navItem: NavModelItem;\n}\n\nconst SelectNav = ({ children, customCss }: { children: NavModelItem[]; customCss: string }) => {\n if (!children || children.length === 0) {\n return null;\n }\n\n const defaultSelectedItem = children.find((navItem) => {\n return navItem.active === true;\n });\n\n return (\n <div className={`gf-form-select-wrapper width-20 ${customCss}`}>\n <div className=\"dropdown\">\n <div className=\"gf-form-input dropdown-toggle\" data-toggle=\"dropdown\">\n {defaultSelectedItem?.text}\n </div>\n <ul className=\"dropdown-menu dropdown-menu--menu\">\n {children.map((navItem: NavModelItem) => {\n if (navItem.hideFromTabs) {\n // TODO: Rename hideFromTabs => hideFromNav\n return null;\n }\n return (\n <PanelHeaderMenuItem\n key={navItem.url}\n iconClassName={navItem.icon}\n text={navItem.text}\n href={navItem.url}\n />\n );\n })}\n </ul>\n </div>\n </div>\n );\n};\n\nconst Navigation = ({ children }: { children: NavModelItem[] }) => {\n if (!children || children.length === 0) {\n return null;\n }\n\n return (\n <nav>\n <SelectNav customCss=\"page-header__select-nav\">{children}</SelectNav>\n <TabsBar className=\"page-header__tabs\" hideBorder={true}>\n {children.map((child, index) => {\n return (\n !child.hideFromTabs && (\n <Tab\n label={child.text}\n active={child.active}\n key={`${child.url}-${index}`}\n icon={child.icon as IconName}\n href={child.url}\n suffix={child.tabSuffix}\n />\n )\n );\n })}\n </TabsBar>\n </nav>\n );\n};\n\nexport const PageHeader: FC<Props> = ({ navItem: model }) => {\n const styles = useStyles2(getStyles);\n\n if (!model) {\n return null;\n }\n\n return (\n <div className={styles.headerCanvas}>\n <div className=\"page-container\">\n <div className=\"page-header\">\n {renderHeaderTitle(model)}\n {model.children && model.children.length > 0 && <Navigation>{model.children}</Navigation>}\n </div>\n </div>\n </div>\n );\n};\n\nfunction renderHeaderTitle(main: NavModelItem) {\n const marginTop = main.icon === 'grafana' ? 12 : 14;\n\n return (\n <div className=\"page-header__inner\">\n <span className=\"page-header__logo\">\n {main.icon && <Icon name={main.icon as IconName} size=\"xxxl\" style={{ marginTop }} />}\n {main.img && <img className=\"page-header__img\" src={main.img} alt={`logo of ${main.text}`} />}\n </span>\n\n <div className=\"page-header__info-block\">\n {renderTitle(main.text, main.breadcrumbs ?? [], main.highlightText)}\n {main.subTitle && <div className=\"page-header__sub-title\">{main.subTitle}</div>}\n </div>\n </div>\n );\n}\n\nfunction renderTitle(title: string, breadcrumbs: NavModelBreadcrumb[], highlightText: NavModelItem['highlightText']) {\n if (!title && (!breadcrumbs || breadcrumbs.length === 0)) {\n return null;\n }\n\n if (!breadcrumbs || breadcrumbs.length === 0) {\n return (\n <h1 className=\"page-header__title\">\n {title}\n {highlightText && (\n <ProBadge\n text={highlightText}\n className={css`\n vertical-align: middle;\n `}\n />\n )}\n </h1>\n );\n }\n\n const breadcrumbsResult = [];\n for (const bc of breadcrumbs) {\n if (bc.url) {\n breadcrumbsResult.push(\n <a className=\"page-header__link\" key={breadcrumbsResult.length} href={bc.url}>\n {bc.title}\n </a>\n );\n } else {\n breadcrumbsResult.push(<span key={breadcrumbsResult.length}> / {bc.title}</span>);\n }\n }\n breadcrumbsResult.push(<span key={breadcrumbs.length + 1}> / {title}</span>);\n\n return <h1 className=\"page-header__title\">{breadcrumbsResult}</h1>;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n headerCanvas: css`\n background: ${theme.colors.background.canvas};\n `,\n});\n","import React, { FC } from 'react';\n\nimport { LoadingPlaceholder } from '@grafana/ui';\n\ninterface Props {\n pageName?: string;\n}\n\nconst PageLoader: FC<Props> = ({ pageName = '' }) => {\n const loadingText = `Loading ${pageName}...`;\n return (\n <div className=\"page-loader-wrapper\">\n <LoadingPlaceholder text={loadingText} />\n </div>\n );\n};\n\nexport default PageLoader;\n","import React, { FC, useState } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Input, IconButton } from '@grafana/ui';\n\nexport interface Props {\n autoFocus?: boolean;\n autoComplete?: string;\n id?: string;\n passwordHint?: string;\n}\n\nexport const PasswordField: FC<Props> = React.forwardRef<HTMLInputElement, Props>(\n ({ autoComplete, autoFocus, id, passwordHint, ...props }, ref) => {\n const [showPassword, setShowPassword] = useState(false);\n\n return (\n <Input\n id={id}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n {...props}\n type={showPassword ? 'text' : 'password'}\n placeholder={passwordHint}\n aria-label={selectors.pages.Login.password}\n ref={ref}\n suffix={\n <IconButton\n name={showPassword ? 'eye-slash' : 'eye'}\n type=\"button\"\n aria-controls={id}\n role=\"switch\"\n aria-checked={showPassword}\n aria-label=\"Show password\"\n onClick={() => {\n setShowPassword(!showPassword);\n }}\n />\n }\n />\n );\n }\n);\n\nPasswordField.displayName = 'PasswordField';\n","import { css } from '@emotion/css';\nimport React, { Component } from 'react';\n\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { Button, Form, HorizontalGroup, Select, stylesFactory } from '@grafana/ui';\nimport { TeamPicker } from 'app/core/components/Select/TeamPicker';\nimport { UserPicker } from 'app/core/components/Select/UserPicker';\nimport config from 'app/core/config';\nimport { OrgUser, Team } from 'app/types';\nimport {\n dashboardPermissionLevels,\n dashboardAclTargets,\n AclTarget,\n PermissionLevel,\n NewDashboardAclItem,\n OrgRole,\n} from 'app/types/acl';\n\nimport { CloseButton } from '../CloseButton/CloseButton';\n\nexport interface Props {\n onAddPermission: (item: NewDashboardAclItem) => void;\n onCancel: () => void;\n}\n\nclass AddPermissions extends Component<Props, NewDashboardAclItem> {\n static defaultProps = {\n showPermissionLevels: true,\n };\n\n constructor(props: Props) {\n super(props);\n this.state = this.getCleanState();\n }\n\n getCleanState() {\n return {\n userId: 0,\n teamId: 0,\n role: undefined,\n type: AclTarget.Team,\n permission: PermissionLevel.View,\n };\n }\n\n onTypeChanged = (item: SelectableValue<AclTarget>) => {\n const type = item.value;\n\n switch (type) {\n case AclTarget.User:\n case AclTarget.Team:\n this.setState({ type: type, userId: 0, teamId: 0, role: undefined });\n break;\n case AclTarget.Editor:\n this.setState({ type: type, userId: 0, teamId: 0, role: OrgRole.Editor });\n break;\n case AclTarget.Viewer:\n this.setState({ type: type, userId: 0, teamId: 0, role: OrgRole.Viewer });\n break;\n }\n };\n\n onUserSelected = (user: SelectableValue<OrgUser['userId']>) => {\n this.setState({ userId: user && !Array.isArray(user) ? user.id : 0 });\n };\n\n onTeamSelected = (team: SelectableValue<Team>) => {\n this.setState({ teamId: team.value?.id && !Array.isArray(team.value) ? team.value.id : 0 });\n };\n\n onPermissionChanged = (permission: SelectableValue<PermissionLevel>) => {\n this.setState({ permission: permission.value! });\n };\n\n onSubmit = async () => {\n await this.props.onAddPermission(this.state);\n this.setState(this.getCleanState());\n };\n\n isValid() {\n switch (this.state.type) {\n case AclTarget.Team:\n return this.state.teamId > 0;\n case AclTarget.User:\n return this.state.userId > 0;\n }\n return true;\n }\n\n render() {\n const { onCancel } = this.props;\n const newItem = this.state;\n const pickerClassName = 'min-width-20';\n const isValid = this.isValid();\n const styles = getStyles(config.theme);\n\n return (\n <div className=\"cta-form\">\n <CloseButton onClick={onCancel} />\n <h5>Add Permission For</h5>\n <Form maxWidth=\"none\" onSubmit={this.onSubmit}>\n {() => (\n <HorizontalGroup>\n <Select\n aria-label=\"Role to add new permission to\"\n isSearchable={false}\n value={this.state.type}\n options={dashboardAclTargets}\n onChange={this.onTypeChanged}\n />\n\n {newItem.type === AclTarget.User ? (\n <UserPicker onSelected={this.onUserSelected} className={pickerClassName} />\n ) : null}\n\n {newItem.type === AclTarget.Team ? (\n <TeamPicker onSelected={this.onTeamSelected} className={pickerClassName} />\n ) : null}\n\n <span className={styles.label}>Can</span>\n\n <Select\n aria-label=\"Permission level\"\n isSearchable={false}\n value={this.state.permission}\n options={dashboardPermissionLevels}\n onChange={this.onPermissionChanged}\n width={25}\n />\n <Button data-save-permission type=\"submit\" disabled={!isValid}>\n Save\n </Button>\n </HorizontalGroup>\n )}\n </Form>\n </div>\n );\n }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n label: css`\n color: ${theme.colors.textBlue};\n font-weight: bold;\n `,\n}));\n\nexport default AddPermissions;\n","import React, { Component } from 'react';\n\nimport { Select, Icon, Button } from '@grafana/ui';\nimport { dashboardPermissionLevels } from 'app/types/acl';\n\nexport interface Props {\n item: any;\n}\n\nexport default class DisabledPermissionListItem extends Component<Props, any> {\n render() {\n const { item } = this.props;\n const currentPermissionLevel = dashboardPermissionLevels.find((dp) => dp.value === item.permission);\n\n return (\n <tr className=\"gf-form-disabled\">\n <td style={{ width: '1%' }}>\n <Icon size=\"lg\" name=\"shield\" />\n </td>\n <td style={{ width: '90%' }}>\n {item.name}\n <span className=\"filter-table__weak-italic\"> (Role)</span>\n </td>\n <td />\n <td className=\"query-keyword\">Can</td>\n <td>\n <div className=\"gf-form\">\n <Select\n aria-label={`Permission level for \"${item.name}\"`}\n options={dashboardPermissionLevels}\n onChange={() => {}}\n disabled={true}\n value={currentPermissionLevel}\n />\n </div>\n </td>\n <td>\n <Button aria-label={`Remove permission for \"${item.name}\"`} size=\"sm\" icon=\"lock\" disabled />\n </td>\n </tr>\n );\n }\n}\n","import React, { PureComponent } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Select, Icon, Button } from '@grafana/ui';\nimport { FolderInfo } from 'app/types';\nimport { dashboardPermissionLevels, DashboardAcl, PermissionLevel } from 'app/types/acl';\n\nconst setClassNameHelper = (inherited: boolean) => {\n return inherited ? 'gf-form-disabled' : '';\n};\n\nfunction ItemAvatar({ item }: { item: DashboardAcl }) {\n if (item.userAvatarUrl) {\n return <img className=\"filter-table__avatar\" src={item.userAvatarUrl} />;\n }\n if (item.teamAvatarUrl) {\n return <img className=\"filter-table__avatar\" src={item.teamAvatarUrl} />;\n }\n if (item.role === 'Editor') {\n return <Icon size=\"lg\" name=\"edit\" />;\n }\n\n return <Icon size=\"lg\" name=\"eye\" />;\n}\n\nfunction ItemDescription({ item }: { item: DashboardAcl }) {\n if (item.userId) {\n return <span className=\"filter-table__weak-italic\">(User)</span>;\n }\n if (item.teamId) {\n return <span className=\"filter-table__weak-italic\">(Team)</span>;\n }\n return <span className=\"filter-table__weak-italic\">(Role)</span>;\n}\n\ninterface Props {\n item: DashboardAcl;\n onRemoveItem: (item: DashboardAcl) => void;\n onPermissionChanged: (item: DashboardAcl, level: PermissionLevel) => void;\n folderInfo?: FolderInfo;\n}\n\nexport default class PermissionsListItem extends PureComponent<Props> {\n onPermissionChanged = (option: SelectableValue<PermissionLevel>) => {\n this.props.onPermissionChanged(this.props.item, option.value!);\n };\n\n onRemoveItem = () => {\n this.props.onRemoveItem(this.props.item);\n };\n\n render() {\n const { item, folderInfo } = this.props;\n const inheritedFromRoot = item.dashboardId === -1 && !item.inherited;\n const currentPermissionLevel = dashboardPermissionLevels.find((dp) => dp.value === item.permission);\n\n return (\n <tr className={setClassNameHelper(Boolean(item?.inherited))}>\n <td style={{ width: '1%' }}>\n <ItemAvatar item={item} />\n </td>\n <td style={{ width: '90%' }}>\n {item.name} <ItemDescription item={item} />\n </td>\n <td>\n {item.inherited && folderInfo && (\n <em className=\"muted no-wrap\">\n Inherited from folder{' '}\n {folderInfo.canViewFolderPermissions ? (\n <a className=\"text-link\" href={`${folderInfo.url}/permissions`}>\n {folderInfo.title}\n </a>\n ) : (\n folderInfo.title\n )}\n </em>\n )}\n {inheritedFromRoot && <em className=\"muted no-wrap\">Default Permission</em>}\n </td>\n <td className=\"query-keyword\">Can</td>\n <td>\n <Select\n aria-label={`Permission level for \"${item.name}\"`}\n isSearchable={false}\n options={dashboardPermissionLevels}\n onChange={this.onPermissionChanged}\n disabled={item.inherited}\n value={currentPermissionLevel}\n width={25}\n />\n </td>\n <td>\n {!item.inherited ? (\n <Button\n aria-label={`Remove permission for \"${item.name}\"`}\n size=\"sm\"\n variant=\"destructive\"\n icon=\"times\"\n onClick={this.onRemoveItem}\n />\n ) : (\n <Button aria-label={`Remove permission for \"${item.name}\" (Disabled)`} size=\"sm\" disabled icon=\"times\" />\n )}\n </td>\n </tr>\n );\n }\n}\n","import React, { PureComponent } from 'react';\n\nimport { FolderInfo } from 'app/types';\nimport { DashboardAcl } from 'app/types/acl';\n\nimport DisabledPermissionsListItem from './DisabledPermissionListItem';\nimport PermissionsListItem from './PermissionListItem';\n\nexport interface Props {\n items: DashboardAcl[];\n onRemoveItem: (item: DashboardAcl) => void;\n onPermissionChanged: any;\n isFetching: boolean;\n folderInfo?: FolderInfo;\n}\n\nclass PermissionList extends PureComponent<Props> {\n render() {\n const { items, onRemoveItem, onPermissionChanged, isFetching, folderInfo } = this.props;\n\n return (\n <table className=\"filter-table gf-form-group\">\n <tbody>\n <DisabledPermissionsListItem\n key={0}\n item={{\n name: 'Admin',\n permission: 4,\n }}\n />\n {items.map((item, idx) => {\n return (\n <PermissionsListItem\n key={idx + 1}\n item={item}\n onRemoveItem={onRemoveItem}\n onPermissionChanged={onPermissionChanged}\n folderInfo={folderInfo}\n />\n );\n })}\n {isFetching === true && items.length < 1 ? (\n <tr>\n <td colSpan={4}>\n <em>Loading permissions...</em>\n </td>\n </tr>\n ) : null}\n\n {isFetching === false && items.length < 1 ? (\n <tr>\n <td colSpan={4}>\n <em>No permissions are set. Will only be accessible by admins.</em>\n </td>\n </tr>\n ) : null}\n </tbody>\n </table>\n );\n }\n}\n\nexport default PermissionList;\n","import React from 'react';\n\nconst PermissionsInfo = () => (\n <div>\n <h5>What are Permissions?</h5>\n <p>\n An Access Control List (ACL) model is used to limit access to Dashboard Folders. A user or a Team can be assigned\n permissions for a folder or for a single dashboard.\n </p>\n </div>\n);\n\nexport default PermissionsInfo;\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, renderMarkdown } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nexport interface Props extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n markdown?: string;\n onRemove?: () => void;\n}\n\nexport const OperationRowHelp = React.memo(\n React.forwardRef<HTMLDivElement, Props>(({ className, children, markdown, onRemove, ...otherProps }, ref) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={cx(styles.wrapper, className)} {...otherProps} ref={ref}>\n {markdown && markdownHelper(markdown)}\n {children}\n </div>\n );\n })\n);\n\nfunction markdownHelper(markdown: string) {\n const helpHtml = renderMarkdown(markdown);\n return <div className=\"markdown-html\" dangerouslySetInnerHTML={{ __html: helpHtml }} />;\n}\n\nOperationRowHelp.displayName = 'OperationRowHelp';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const borderRadius = theme.shape.borderRadius();\n\n return {\n wrapper: css`\n padding: ${theme.spacing(2)};\n border: 2px solid ${theme.colors.background.secondary};\n border-top: none;\n border-radius: 0 0 ${borderRadius} ${borderRadius};\n position: relative;\n top: -4px;\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { IconButton, IconName, useStyles2 } from '@grafana/ui';\n\nexport interface QueryOperationActionProps {\n icon: IconName;\n title: string;\n onClick: (e: React.MouseEvent) => void;\n disabled?: boolean;\n active?: boolean;\n}\n\nexport const QueryOperationAction: React.FC<QueryOperationActionProps> = ({\n icon,\n active,\n disabled,\n title,\n onClick,\n}) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={cx(styles.icon, active && styles.active)}>\n <IconButton\n name={icon}\n title={title}\n className={styles.icon}\n disabled={!!disabled}\n onClick={onClick}\n type=\"button\"\n aria-label={selectors.components.QueryEditorRow.actionButton(title)}\n />\n </div>\n );\n};\n\nQueryOperationAction.displayName = 'QueryOperationAction';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n icon: css`\n display: flex;\n position: relative;\n color: ${theme.colors.text.secondary};\n `,\n active: css`\n &::before {\n display: block;\n content: ' ';\n position: absolute;\n left: -1px;\n right: 2px;\n height: 3px;\n border-radius: 2px;\n bottom: -8px;\n background-image: ${theme.colors.gradients.brandHorizontal} !important;\n }\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { MouseEventHandler } from 'react';\nimport { DraggableProvidedDragHandleProps } from 'react-beautiful-dnd';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\ninterface QueryOperationRowHeaderProps {\n actionsElement?: React.ReactNode;\n disabled?: boolean;\n draggable: boolean;\n dragHandleProps?: DraggableProvidedDragHandleProps;\n headerElement?: React.ReactNode;\n isContentVisible: boolean;\n onRowToggle: () => void;\n reportDragMousePosition: MouseEventHandler<HTMLDivElement>;\n titleElement?: React.ReactNode;\n}\n\nexport const QueryOperationRowHeader: React.FC<QueryOperationRowHeaderProps> = ({\n actionsElement,\n disabled,\n draggable,\n dragHandleProps,\n headerElement,\n isContentVisible,\n onRowToggle,\n reportDragMousePosition,\n titleElement,\n}: QueryOperationRowHeaderProps) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.header}>\n <div className={styles.column}>\n <Icon\n name={isContentVisible ? 'angle-down' : 'angle-right'}\n className={styles.collapseIcon}\n onClick={onRowToggle}\n />\n {titleElement && (\n <div className={styles.titleWrapper} onClick={onRowToggle} aria-label=\"Query operation row title\">\n <div className={cx(styles.title, disabled && styles.disabled)}>{titleElement}</div>\n </div>\n )}\n {headerElement}\n </div>\n\n <div className={styles.column}>\n {actionsElement}\n {draggable && (\n <Icon\n title=\"Drag and drop to reorder\"\n name=\"draggabledots\"\n size=\"lg\"\n className={styles.dragIcon}\n onMouseMove={reportDragMousePosition}\n {...dragHandleProps}\n />\n )}\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n header: css`\n label: Header;\n padding: ${theme.spacing(0.5, 0.5)};\n border-radius: ${theme.shape.borderRadius(1)};\n background: ${theme.colors.background.secondary};\n min-height: ${theme.spacing(4)};\n display: grid;\n grid-template-columns: minmax(100px, max-content) min-content;\n align-items: center;\n justify-content: space-between;\n white-space: nowrap;\n\n &:focus {\n outline: none;\n }\n `,\n column: css`\n label: Column;\n display: flex;\n align-items: center;\n `,\n dragIcon: css`\n cursor: grab;\n color: ${theme.colors.text.disabled};\n margin: ${theme.spacing(0, 0.5)};\n &:hover {\n color: ${theme.colors.text};\n }\n `,\n collapseIcon: css`\n color: ${theme.colors.text.disabled};\n cursor: pointer;\n &:hover {\n color: ${theme.colors.text};\n }\n `,\n titleWrapper: css`\n display: flex;\n align-items: center;\n flex-grow: 1;\n cursor: pointer;\n overflow: hidden;\n margin-right: ${theme.spacing(0.5)};\n `,\n title: css`\n font-weight: ${theme.typography.fontWeightBold};\n color: ${theme.colors.text.link};\n margin-left: ${theme.spacing(0.5)};\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n disabled: css`\n color: ${theme.colors.text.disabled};\n `,\n});\n\nQueryOperationRowHeader.displayName = 'QueryOperationRowHeader';\n","import { css } from '@emotion/css';\nimport React, { useCallback, useState } from 'react';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { useUpdateEffect } from 'react-use';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime';\nimport { ReactUtils, stylesFactory, useTheme } from '@grafana/ui';\n\nimport { QueryOperationRowHeader } from './QueryOperationRowHeader';\n\nexport interface QueryOperationRowProps {\n index: number;\n id: string;\n title?: string;\n headerElement?: QueryOperationRowRenderProp;\n actions?: QueryOperationRowRenderProp;\n onOpen?: () => void;\n onClose?: () => void;\n children: React.ReactNode;\n isOpen?: boolean;\n draggable?: boolean;\n disabled?: boolean;\n}\n\nexport type QueryOperationRowRenderProp = ((props: QueryOperationRowRenderProps) => React.ReactNode) | React.ReactNode;\n\nexport interface QueryOperationRowRenderProps {\n isOpen: boolean;\n onOpen: () => void;\n onClose: () => void;\n}\n\nexport const QueryOperationRow: React.FC<QueryOperationRowProps> = ({\n children,\n actions,\n title,\n headerElement,\n onClose,\n onOpen,\n isOpen,\n disabled,\n draggable,\n index,\n id,\n}: QueryOperationRowProps) => {\n const [isContentVisible, setIsContentVisible] = useState(isOpen !== undefined ? isOpen : true);\n const theme = useTheme();\n const styles = getQueryOperationRowStyles(theme);\n const onRowToggle = useCallback(() => {\n setIsContentVisible(!isContentVisible);\n }, [isContentVisible, setIsContentVisible]);\n\n const reportDragMousePosition = useCallback((e) => {\n // When drag detected react-beautiful-dnd will preventDefault the event\n // Ref: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/guides/how-we-use-dom-events.md#a-mouse-drag-has-started-and-the-user-is-now-dragging\n if (e.defaultPrevented) {\n const rect = e.currentTarget.getBoundingClientRect();\n var x = e.clientX - rect.left;\n var y = e.clientY - rect.top;\n\n // report relative mouse position within the header element\n reportInteraction('query_row_reorder_drag_position', {\n x: x / rect.width,\n y: y / rect.height,\n width: rect.width,\n height: rect.height,\n });\n }\n }, []);\n\n useUpdateEffect(() => {\n if (isContentVisible) {\n if (onOpen) {\n onOpen();\n }\n } else {\n if (onClose) {\n onClose();\n }\n }\n }, [isContentVisible]);\n\n const renderPropArgs: QueryOperationRowRenderProps = {\n isOpen: isContentVisible,\n onOpen: () => {\n setIsContentVisible(true);\n },\n onClose: () => {\n setIsContentVisible(false);\n },\n };\n\n const titleElement = title && ReactUtils.renderOrCallToRender(title, renderPropArgs);\n const actionsElement = actions && ReactUtils.renderOrCallToRender(actions, renderPropArgs);\n const headerElementRendered = headerElement && ReactUtils.renderOrCallToRender(headerElement, renderPropArgs);\n\n if (draggable) {\n return (\n <Draggable draggableId={id} index={index}>\n {(provided) => {\n return (\n <>\n <div ref={provided.innerRef} className={styles.wrapper} {...provided.draggableProps}>\n <div>\n <QueryOperationRowHeader\n actionsElement={actionsElement}\n disabled={disabled}\n draggable\n dragHandleProps={provided.dragHandleProps}\n headerElement={headerElementRendered}\n isContentVisible={isContentVisible}\n onRowToggle={onRowToggle}\n reportDragMousePosition={reportDragMousePosition}\n titleElement={titleElement}\n />\n </div>\n {isContentVisible && <div className={styles.content}>{children}</div>}\n </div>\n </>\n );\n }}\n </Draggable>\n );\n }\n\n return (\n <div className={styles.wrapper}>\n <QueryOperationRowHeader\n actionsElement={actionsElement}\n disabled={disabled}\n draggable={false}\n headerElement={headerElementRendered}\n isContentVisible={isContentVisible}\n onRowToggle={onRowToggle}\n reportDragMousePosition={reportDragMousePosition}\n titleElement={titleElement}\n />\n {isContentVisible && <div className={styles.content}>{children}</div>}\n </div>\n );\n};\n\nconst getQueryOperationRowStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n wrapper: css`\n margin-bottom: ${theme.spacing.md};\n `,\n content: css`\n margin-top: ${theme.spacing.inlineFormMargin};\n margin-left: ${theme.spacing.lg};\n `,\n };\n});\n\nQueryOperationRow.displayName = 'QueryOperationRow';\n","import { css, cx } from '@emotion/css';\nimport React, { forwardRef, ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getInputStyles, Icon, IconName, useStyles2, getSelectStyles } from '@grafana/ui';\n\nexport interface Props {\n children: ReactNode;\n iconName?: IconName;\n}\nexport const ValueContainer = forwardRef<HTMLDivElement, Props>(({ children, iconName }, ref) => {\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.container} ref={ref}>\n {iconName && <Icon name={iconName} size=\"xs\" />}\n {children}\n </div>\n );\n});\n\nValueContainer.displayName = 'ValueContainer';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const { prefix } = getInputStyles({ theme });\n const { multiValueContainer } = getSelectStyles(theme);\n return {\n container: cx(\n prefix,\n multiValueContainer,\n css`\n position: relative;\n padding: ${theme.spacing(0.5, 1, 0.5, 1)};\n\n svg {\n margin-right: ${theme.spacing(0.5)};\n }\n `\n ),\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FormEvent, HTMLProps, useEffect, useRef } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, getInputStyles, sharedInputStyle, styleMixins, Tooltip, Icon } from '@grafana/ui';\n\nimport { Role } from '../../../types';\n\nimport { ValueContainer } from './ValueContainer';\nimport { ROLE_PICKER_WIDTH } from './constants';\n\nconst stopPropagation = (event: React.MouseEvent<HTMLDivElement>) => event.stopPropagation();\n\ninterface InputProps extends HTMLProps<HTMLInputElement> {\n appliedRoles: Role[];\n builtInRole?: string;\n query: string;\n showBuiltInRole?: boolean;\n isFocused?: boolean;\n disabled?: boolean;\n onQueryChange: (query?: string) => void;\n onOpen: (event: FormEvent<HTMLElement>) => void;\n onClose: () => void;\n}\n\nexport const RolePickerInput = ({\n appliedRoles,\n builtInRole,\n disabled,\n isFocused,\n query,\n showBuiltInRole,\n onOpen,\n onClose,\n onQueryChange,\n ...rest\n}: InputProps): JSX.Element => {\n const styles = useStyles2((theme) => getRolePickerInputStyles(theme, false, !!isFocused, !!disabled, false));\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useEffect(() => {\n if (isFocused) {\n inputRef.current?.focus();\n }\n });\n\n const onInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const query = event.target?.value;\n onQueryChange(query);\n };\n\n const numberOfRoles = appliedRoles.length;\n\n return !isFocused ? (\n <div className={cx(styles.wrapper, styles.selectedRoles)} onMouseDown={onOpen}>\n {showBuiltInRole && <ValueContainer>{builtInRole}</ValueContainer>}\n <RolesLabel appliedRoles={appliedRoles} numberOfRoles={numberOfRoles} showBuiltInRole={showBuiltInRole} />\n </div>\n ) : (\n <div className={styles.wrapper}>\n {showBuiltInRole && <ValueContainer>{builtInRole}</ValueContainer>}\n {appliedRoles.map((role) => (\n <ValueContainer key={role.uid}>{role.displayName}</ValueContainer>\n ))}\n\n {!disabled && (\n <input\n {...rest}\n className={styles.input}\n ref={inputRef}\n onMouseDown={stopPropagation}\n onChange={onInputChange}\n data-testid=\"role-picker-input\"\n placeholder={isFocused ? 'Select role' : ''}\n value={query}\n />\n )}\n <div className={styles.suffix}>\n <Icon name=\"angle-up\" className={styles.dropdownIndicator} onMouseDown={onClose} />\n </div>\n </div>\n );\n};\n\nRolePickerInput.displayName = 'RolePickerInput';\n\ninterface RolesLabelProps {\n appliedRoles: Role[];\n showBuiltInRole?: boolean;\n numberOfRoles: number;\n}\n\nexport const RolesLabel = ({ showBuiltInRole, numberOfRoles, appliedRoles }: RolesLabelProps): JSX.Element => {\n const styles = useStyles2((theme) => getTooltipStyles(theme));\n\n return (\n <>\n {!!numberOfRoles ? (\n <Tooltip\n content={\n <div className={styles.tooltip}>\n {appliedRoles?.map((role) => (\n <p key={role.uid}>{role.displayName}</p>\n ))}\n </div>\n }\n >\n <ValueContainer>{`${showBuiltInRole ? '+' : ''}${numberOfRoles} role${\n numberOfRoles > 1 ? 's' : ''\n }`}</ValueContainer>\n </Tooltip>\n ) : (\n !showBuiltInRole && <ValueContainer>No roles assigned</ValueContainer>\n )}\n </>\n );\n};\n\nconst getRolePickerInputStyles = (\n theme: GrafanaTheme2,\n invalid: boolean,\n focused: boolean,\n disabled: boolean,\n withPrefix: boolean\n) => {\n const styles = getInputStyles({ theme, invalid });\n\n return {\n wrapper: cx(\n styles.wrapper,\n sharedInputStyle(theme, invalid),\n focused &&\n css`\n ${styleMixins.focusCss(theme.v1)}\n `,\n disabled && styles.inputDisabled,\n css`\n width: ${ROLE_PICKER_WIDTH}px;\n min-height: 32px;\n height: auto;\n flex-direction: row;\n padding-right: 24px;\n max-width: 100%;\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n position: relative;\n box-sizing: border-box;\n cursor: default;\n `,\n withPrefix &&\n css`\n padding-left: 0;\n `\n ),\n input: cx(\n sharedInputStyle(theme, invalid),\n css`\n max-width: 120px;\n border: none;\n cursor: ${focused ? 'default' : 'pointer'};\n `\n ),\n suffix: styles.suffix,\n dropdownIndicator: css`\n cursor: pointer;\n `,\n selectedRoles: css`\n display: flex;\n align-items: center;\n cursor: ${disabled ? 'not-allowed' : 'pointer'};\n `,\n tooltip: css`\n p {\n margin-bottom: ${theme.spacing(0.5)};\n }\n `,\n };\n};\n\nconst getTooltipStyles = (theme: GrafanaTheme2) => ({\n tooltip: css`\n p {\n margin-bottom: ${theme.spacing(0.5)};\n }\n `,\n});\n","export const MENU_MAX_HEIGHT = 300; // max height for the picker's dropdown menu\nexport const ROLE_PICKER_WIDTH = 360;\n","import { css, cx } from '@emotion/css';\nimport React, { FormEvent, useEffect, useRef, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport {\n Button,\n Checkbox,\n CustomScrollbar,\n HorizontalGroup,\n Icon,\n Portal,\n RadioButtonGroup,\n Tooltip,\n useStyles2,\n useTheme2,\n} from '@grafana/ui';\nimport { getSelectStyles } from '@grafana/ui/src/components/Select/getSelectStyles';\nimport { OrgRole, Role } from 'app/types';\n\nimport { MENU_MAX_HEIGHT } from './constants';\n\nconst BuiltinRoles = Object.values(OrgRole);\nconst BuiltinRoleOption: Array<SelectableValue<OrgRole>> = BuiltinRoles.map((r) => ({\n label: r,\n value: r,\n}));\n\nconst fixedRoleGroupNames: Record<string, string> = {\n ldap: 'LDAP',\n current: 'Current org',\n};\n\ninterface RolePickerMenuProps {\n builtInRole?: OrgRole;\n options: Role[];\n appliedRoles: Role[];\n showGroups?: boolean;\n builtinRolesDisabled?: boolean;\n showBuiltInRole?: boolean;\n onSelect: (roles: Role[]) => void;\n onBuiltInRoleSelect?: (role: OrgRole) => void;\n onUpdate: (newRoles: Role[], newBuiltInRole?: OrgRole) => void;\n updateDisabled?: boolean;\n apply?: boolean;\n offset: { vertical: number; horizontal: number };\n}\n\nexport const RolePickerMenu = ({\n builtInRole,\n options,\n appliedRoles,\n showGroups,\n builtinRolesDisabled,\n showBuiltInRole,\n onSelect,\n onBuiltInRoleSelect,\n onUpdate,\n updateDisabled,\n offset,\n apply,\n}: RolePickerMenuProps): JSX.Element => {\n const [selectedOptions, setSelectedOptions] = useState<Role[]>(appliedRoles);\n const [selectedBuiltInRole, setSelectedBuiltInRole] = useState<OrgRole | undefined>(builtInRole);\n const [showSubMenu, setShowSubMenu] = useState(false);\n const [openedMenuGroup, setOpenedMenuGroup] = useState('');\n const [subMenuOptions, setSubMenuOptions] = useState<Role[]>([]);\n const subMenuNode = useRef<HTMLDivElement | null>(null);\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n const customStyles = useStyles2(getStyles);\n\n // Call onSelect() on every selectedOptions change\n useEffect(() => {\n onSelect(selectedOptions);\n }, [selectedOptions, onSelect]);\n\n useEffect(() => {\n if (onBuiltInRoleSelect && selectedBuiltInRole) {\n onBuiltInRoleSelect(selectedBuiltInRole);\n }\n }, [selectedBuiltInRole, onBuiltInRoleSelect]);\n\n const customRoles = options.filter(filterCustomRoles).sort(sortRolesByName);\n const fixedRoles = options.filter(filterFixedRoles).sort(sortRolesByName);\n const optionGroups = getOptionGroups(options);\n\n const getSelectedGroupOptions = (group: string) => {\n const selectedGroupOptions = [];\n for (const role of selectedOptions) {\n if (getRoleGroup(role) === group) {\n selectedGroupOptions.push(role);\n }\n }\n return selectedGroupOptions;\n };\n\n const groupSelected = (group: string) => {\n const selectedGroupOptions = getSelectedGroupOptions(group);\n const groupOptions = optionGroups.find((g) => g.value === group);\n return selectedGroupOptions.length > 0 && selectedGroupOptions.length >= groupOptions!.options.length;\n };\n\n const groupPartiallySelected = (group: string) => {\n const selectedGroupOptions = getSelectedGroupOptions(group);\n const groupOptions = optionGroups.find((g) => g.value === group);\n return selectedGroupOptions.length > 0 && selectedGroupOptions.length < groupOptions!.options.length;\n };\n\n const onChange = (option: Role) => {\n if (selectedOptions.find((role) => role.uid === option.uid)) {\n setSelectedOptions(selectedOptions.filter((role) => role.uid !== option.uid));\n } else {\n setSelectedOptions([...selectedOptions, option]);\n }\n };\n\n const onGroupChange = (value: string) => {\n const group = optionGroups.find((g) => {\n return g.value === value;\n });\n if (groupSelected(value) || groupPartiallySelected(value)) {\n if (group) {\n setSelectedOptions(selectedOptions.filter((role) => !group.options.find((option) => role.uid === option.uid)));\n }\n } else {\n if (group) {\n const groupOptions = group.options.filter((role) => role.delegatable);\n const restOptions = selectedOptions.filter((role) => !group.options.find((option) => role.uid === option.uid));\n setSelectedOptions([...restOptions, ...groupOptions]);\n }\n }\n };\n\n const onOpenSubMenu = (value: string) => {\n setOpenedMenuGroup(value);\n setShowSubMenu(true);\n const group = optionGroups.find((g) => {\n return g.value === value;\n });\n if (group) {\n setSubMenuOptions(group.options);\n }\n };\n\n const onCloseSubMenu = (value: string) => {\n setShowSubMenu(false);\n setOpenedMenuGroup('');\n setSubMenuOptions([]);\n };\n\n const onSelectedBuiltinRoleChange = (newRole: OrgRole) => {\n setSelectedBuiltInRole(newRole);\n };\n\n const onClearInternal = async () => {\n setSelectedOptions([]);\n };\n\n const onClearSubMenu = () => {\n const options = selectedOptions.filter((role) => {\n const groupName = getRoleGroup(role);\n return groupName !== openedMenuGroup;\n });\n setSelectedOptions(options);\n };\n\n const onUpdateInternal = () => {\n const selectedCustomRoles: string[] = [];\n // TODO: needed?\n for (const key in selectedOptions) {\n const roleUID = selectedOptions[key]?.uid;\n selectedCustomRoles.push(roleUID);\n }\n onUpdate(selectedOptions, selectedBuiltInRole);\n };\n\n return (\n <div\n className={cx(\n styles.menu,\n customStyles.menuWrapper,\n { [customStyles.menuLeft]: offset.horizontal > 0 },\n css`\n bottom: ${offset.vertical > 0 ? `${offset.vertical}px` : 'unset'};\n top: ${offset.vertical < 0 ? `${Math.abs(offset.vertical)}px` : 'unset'};\n `\n )}\n >\n <div className={customStyles.menu} aria-label=\"Role picker menu\">\n <CustomScrollbar autoHide={false} autoHeightMax={`${MENU_MAX_HEIGHT}px`} hideHorizontalTrack hideVerticalTrack>\n {showBuiltInRole && (\n <div className={customStyles.menuSection}>\n <div className={customStyles.groupHeader}>Basic roles</div>\n <RadioButtonGroup\n className={customStyles.builtInRoleSelector}\n options={BuiltinRoleOption}\n value={selectedBuiltInRole}\n onChange={onSelectedBuiltinRoleChange}\n fullWidth={true}\n disabled={builtinRolesDisabled}\n />\n </div>\n )}\n {!!fixedRoles.length &&\n (showGroups && !!optionGroups.length ? (\n <div className={customStyles.menuSection}>\n <div className={customStyles.groupHeader}>Fixed roles</div>\n <div className={styles.optionBody}>\n {optionGroups.map((option, i) => (\n <RoleMenuGroupOption\n data={option}\n key={i}\n isSelected={groupSelected(option.value) || groupPartiallySelected(option.value)}\n partiallySelected={groupPartiallySelected(option.value)}\n disabled={option.options?.every(isNotDelegatable)}\n onChange={onGroupChange}\n onOpenSubMenu={onOpenSubMenu}\n onCloseSubMenu={onCloseSubMenu}\n root={subMenuNode?.current!}\n isFocused={showSubMenu && openedMenuGroup === option.value}\n >\n {showSubMenu && openedMenuGroup === option.value && (\n <RolePickerSubMenu\n options={subMenuOptions}\n selectedOptions={selectedOptions}\n onSelect={onChange}\n onClear={onClearSubMenu}\n showOnLeft={offset.horizontal > 0}\n />\n )}\n </RoleMenuGroupOption>\n ))}\n </div>\n </div>\n ) : (\n <div className={customStyles.menuSection}>\n <div className={customStyles.groupHeader}>Fixed roles</div>\n <div className={styles.optionBody}>\n {fixedRoles.map((option, i) => (\n <RoleMenuOption\n data={option}\n key={i}\n isSelected={!!(option.uid && !!selectedOptions.find((opt) => opt.uid === option.uid))}\n disabled={isNotDelegatable(option)}\n onChange={onChange}\n hideDescription\n />\n ))}\n </div>\n </div>\n ))}\n {!!customRoles.length && (\n <div>\n <div className={customStyles.groupHeader}>Custom roles</div>\n <div className={styles.optionBody}>\n {customRoles.map((option, i) => (\n <RoleMenuOption\n data={option}\n key={i}\n isSelected={!!(option.uid && !!selectedOptions.find((opt) => opt.uid === option.uid))}\n disabled={isNotDelegatable(option)}\n onChange={onChange}\n hideDescription\n />\n ))}\n </div>\n </div>\n )}\n </CustomScrollbar>\n <div className={customStyles.menuButtonRow}>\n <HorizontalGroup justify=\"flex-end\">\n <Button size=\"sm\" fill=\"text\" onClick={onClearInternal} disabled={updateDisabled}>\n Clear all\n </Button>\n <Button size=\"sm\" onClick={onUpdateInternal} disabled={updateDisabled}>\n {apply ? `Apply` : `Update`}\n </Button>\n </HorizontalGroup>\n </div>\n </div>\n <div ref={subMenuNode} />\n </div>\n );\n};\n\nconst filterCustomRoles = (option: Role) => !option.name?.startsWith('fixed:');\nconst filterFixedRoles = (option: Role) => option.name?.startsWith('fixed:');\n\nconst getOptionGroups = (options: Role[]) => {\n const groupsMap: { [key: string]: Role[] } = {};\n options.forEach((role) => {\n if (role.name.startsWith('fixed:')) {\n const groupName = getRoleGroup(role);\n if (groupsMap[groupName]) {\n groupsMap[groupName].push(role);\n } else {\n groupsMap[groupName] = [role];\n }\n }\n });\n\n const groups = [];\n for (const groupName of Object.keys(groupsMap)) {\n const groupOptions = groupsMap[groupName].sort(sortRolesByName);\n groups.push({\n name: fixedRoleGroupNames[groupName] || capitalize(groupName),\n value: groupName,\n options: groupOptions,\n });\n }\n return groups.sort((a, b) => a.name.localeCompare(b.name));\n};\n\ninterface RolePickerSubMenuProps {\n options: Role[];\n selectedOptions: Role[];\n disabledOptions?: Role[];\n onSelect: (option: Role) => void;\n onClear?: () => void;\n showOnLeft?: boolean;\n}\n\nexport const RolePickerSubMenu = ({\n options,\n selectedOptions,\n disabledOptions,\n onSelect,\n onClear,\n showOnLeft,\n}: RolePickerSubMenuProps): JSX.Element => {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n const customStyles = useStyles2(getStyles);\n\n const onClearInternal = async () => {\n if (onClear) {\n onClear();\n }\n };\n\n return (\n <div\n className={cx(customStyles.subMenu, { [customStyles.subMenuLeft]: showOnLeft })}\n aria-label=\"Role picker submenu\"\n >\n <CustomScrollbar autoHide={false} autoHeightMax={`${MENU_MAX_HEIGHT}px`} hideHorizontalTrack>\n <div className={styles.optionBody}>\n {options.map((option, i) => (\n <RoleMenuOption\n data={option}\n key={i}\n isSelected={\n !!(\n option.uid &&\n (!!selectedOptions.find((opt) => opt.uid === option.uid) ||\n disabledOptions?.find((opt) => opt.uid === option.uid))\n )\n }\n disabled={\n !!(option.uid && disabledOptions?.find((opt) => opt.uid === option.uid)) || isNotDelegatable(option)\n }\n onChange={onSelect}\n hideDescription\n />\n ))}\n </div>\n </CustomScrollbar>\n <div className={customStyles.subMenuButtonRow}>\n <HorizontalGroup justify=\"flex-end\">\n <Button size=\"sm\" fill=\"text\" onClick={onClearInternal}>\n Clear\n </Button>\n </HorizontalGroup>\n </div>\n </div>\n );\n};\n\ninterface RoleMenuOptionProps<T> {\n data: Role;\n onChange: (value: Role) => void;\n isSelected?: boolean;\n isFocused?: boolean;\n disabled?: boolean;\n hideDescription?: boolean;\n}\n\nexport const RoleMenuOption = React.forwardRef<HTMLDivElement, React.PropsWithChildren<RoleMenuOptionProps<any>>>(\n ({ data, isFocused, isSelected, disabled, onChange, hideDescription }, ref) => {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n const customStyles = useStyles2(getStyles);\n\n const wrapperClassName = cx(\n styles.option,\n isFocused && styles.optionFocused,\n disabled && customStyles.menuOptionDisabled\n );\n\n const onChangeInternal = (event: FormEvent<HTMLElement>) => {\n if (disabled) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n onChange(data);\n };\n\n return (\n <div ref={ref} className={wrapperClassName} aria-label=\"Role picker option\" onClick={onChangeInternal}>\n <Checkbox\n value={isSelected}\n className={customStyles.menuOptionCheckbox}\n onChange={onChangeInternal}\n disabled={disabled}\n />\n <div className={cx(styles.optionBody, customStyles.menuOptionBody)}>\n <span>{data.displayName || data.name}</span>\n {!hideDescription && data.description && <div className={styles.optionDescription}>{data.description}</div>}\n </div>\n {data.description && (\n <Tooltip content={data.description}>\n <Icon name=\"info-circle\" className={customStyles.menuOptionInfoSign} />\n </Tooltip>\n )}\n </div>\n );\n }\n);\n\nRoleMenuOption.displayName = 'RoleMenuOption';\n\ninterface RoleMenuGroupsOptionProps {\n data: SelectableValue<string>;\n onChange: (value: string) => void;\n onClick?: (value: string) => void;\n onOpenSubMenu?: (value: string) => void;\n onCloseSubMenu?: (value: string) => void;\n isSelected?: boolean;\n partiallySelected?: boolean;\n isFocused?: boolean;\n disabled?: boolean;\n children?: React.ReactNode;\n root?: HTMLElement;\n}\n\nexport const RoleMenuGroupOption = React.forwardRef<HTMLDivElement, RoleMenuGroupsOptionProps>(\n (\n {\n data,\n isFocused,\n isSelected,\n partiallySelected,\n disabled,\n onChange,\n onClick,\n onOpenSubMenu,\n onCloseSubMenu,\n children,\n root,\n },\n ref\n ) => {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n const customStyles = useStyles2(getStyles);\n\n const wrapperClassName = cx(\n styles.option,\n isFocused && styles.optionFocused,\n disabled && customStyles.menuOptionDisabled\n );\n\n const onChangeInternal = (event: FormEvent<HTMLElement>) => {\n if (disabled) {\n return;\n }\n if (data.value) {\n onChange(data.value);\n }\n };\n\n const onClickInternal = (event: FormEvent<HTMLElement>) => {\n if (onClick) {\n onClick(data.value!);\n }\n };\n\n const onMouseEnter = () => {\n if (onOpenSubMenu) {\n onOpenSubMenu(data.value!);\n }\n };\n\n const onMouseLeave = () => {\n if (onCloseSubMenu) {\n onCloseSubMenu(data.value!);\n }\n };\n\n return (\n <div onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}>\n <div ref={ref} className={wrapperClassName} aria-label=\"Role picker option\" onClick={onClickInternal}>\n <Checkbox\n value={isSelected}\n className={cx(customStyles.menuOptionCheckbox, {\n [customStyles.checkboxPartiallyChecked]: partiallySelected,\n })}\n onChange={onChangeInternal}\n disabled={disabled}\n />\n <div className={cx(styles.optionBody, customStyles.menuOptionBody)}>\n <span>{data.displayName || data.name}</span>\n <span className={customStyles.menuOptionExpand} />\n </div>\n {root && children && (\n <Portal className={customStyles.subMenuPortal} root={root}>\n {children}\n </Portal>\n )}\n </div>\n </div>\n );\n }\n);\n\nRoleMenuGroupOption.displayName = 'RoleMenuGroupOption';\n\nconst getRoleGroup = (role: Role) => {\n return role.group ?? 'Other';\n};\n\nconst capitalize = (s: string): string => {\n return s.slice(0, 1).toUpperCase() + s.slice(1);\n};\n\nconst sortRolesByName = (a: Role, b: Role) => a.name.localeCompare(b.name);\n\nconst isNotDelegatable = (role: Role) => {\n return role.delegatable !== undefined && !role.delegatable;\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n menuWrapper: css`\n display: flex;\n max-height: 650px;\n position: absolute;\n z-index: ${theme.zIndex.dropdown};\n overflow: hidden;\n min-width: auto;\n `,\n menu: css`\n min-width: 260px;\n\n & > div {\n padding-top: ${theme.spacing(1)};\n }\n `,\n menuLeft: css`\n right: 0;\n flex-direction: row-reverse;\n `,\n subMenu: css`\n height: 100%;\n min-width: 260px;\n display: flex;\n flex-direction: column;\n border-left: 1px solid ${theme.components.input.borderColor};\n\n & > div {\n padding-top: ${theme.spacing(1)};\n }\n `,\n subMenuLeft: css`\n border-right: 1px solid ${theme.components.input.borderColor};\n border-left: unset;\n `,\n groupHeader: css`\n padding: ${theme.spacing(0, 4)};\n display: flex;\n align-items: center;\n color: ${theme.colors.text.primary};\n font-weight: ${theme.typography.fontWeightBold};\n `,\n container: css`\n padding: ${theme.spacing(1)};\n border: 1px ${theme.colors.border.weak} solid;\n border-radius: ${theme.shape.borderRadius(1)};\n background-color: ${theme.colors.background.primary};\n z-index: ${theme.zIndex.modal};\n `,\n menuSection: css`\n margin-bottom: ${theme.spacing(2)};\n `,\n menuOptionCheckbox: css`\n display: flex;\n margin: ${theme.spacing(0, 1, 0, 0.25)};\n `,\n menuButtonRow: css`\n background-color: ${theme.colors.background.primary};\n padding: ${theme.spacing(1)};\n `,\n menuOptionBody: css`\n font-weight: ${theme.typography.fontWeightRegular};\n padding: ${theme.spacing(0, 1.5, 0, 0)};\n `,\n menuOptionDisabled: css`\n color: ${theme.colors.text.disabled};\n cursor: not-allowed;\n `,\n menuOptionExpand: css`\n position: absolute;\n right: ${theme.spacing(1.25)};\n color: ${theme.colors.text.disabled};\n\n &:after {\n content: '>';\n }\n `,\n menuOptionInfoSign: css`\n color: ${theme.colors.text.disabled};\n `,\n builtInRoleSelector: css`\n margin: ${theme.spacing(1, 1.25, 1, 1)};\n `,\n subMenuPortal: css`\n height: 100%;\n > div {\n height: 100%;\n }\n `,\n subMenuButtonRow: css`\n background-color: ${theme.colors.background.primary};\n padding: ${theme.spacing(1)};\n `,\n checkboxPartiallyChecked: css`\n input {\n &:checked + span {\n &:after {\n border-width: 0 3px 0px 0;\n transform: rotate(90deg);\n }\n }\n }\n `,\n };\n};\n","import React, { FormEvent, useCallback, useEffect, useState, useRef } from 'react';\n\nimport { ClickOutsideWrapper, HorizontalGroup, Spinner } from '@grafana/ui';\nimport { Role, OrgRole } from 'app/types';\n\nimport { RolePickerInput } from './RolePickerInput';\nimport { RolePickerMenu } from './RolePickerMenu';\nimport { MENU_MAX_HEIGHT, ROLE_PICKER_WIDTH } from './constants';\n\nexport interface Props {\n builtInRole?: OrgRole;\n appliedRoles: Role[];\n roleOptions: Role[];\n builtInRoles?: Record<string, Role[]>;\n isLoading?: boolean;\n disabled?: boolean;\n builtinRolesDisabled?: boolean;\n showBuiltInRole?: boolean;\n onRolesChange: (newRoles: Role[]) => void;\n onBuiltinRoleChange?: (newRole: OrgRole) => void;\n canUpdateRoles?: boolean;\n apply?: boolean;\n}\n\nexport const RolePicker = ({\n builtInRole,\n appliedRoles,\n roleOptions,\n disabled,\n isLoading,\n builtinRolesDisabled,\n showBuiltInRole,\n onRolesChange,\n onBuiltinRoleChange,\n canUpdateRoles = true,\n apply = false,\n}: Props): JSX.Element | null => {\n const [isOpen, setOpen] = useState(false);\n const [selectedRoles, setSelectedRoles] = useState<Role[]>(appliedRoles);\n const [selectedBuiltInRole, setSelectedBuiltInRole] = useState<OrgRole | undefined>(builtInRole);\n const [query, setQuery] = useState('');\n const [offset, setOffset] = useState({ vertical: 0, horizontal: 0 });\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setSelectedBuiltInRole(builtInRole);\n setSelectedRoles(appliedRoles);\n }, [appliedRoles, builtInRole]);\n\n useEffect(() => {\n const dimensions = ref?.current?.getBoundingClientRect();\n if (!dimensions || !isOpen) {\n return;\n }\n const { bottom, top, left, right } = dimensions;\n const distance = window.innerHeight - bottom;\n const offsetVertical = bottom - top + 10; // Add extra 10px to offset to account for border and outline\n const offsetHorizontal = right - left;\n let horizontal = -offsetHorizontal;\n let vertical = -offsetVertical;\n\n if (distance < MENU_MAX_HEIGHT + 20) {\n vertical = offsetVertical;\n }\n\n if (window.innerWidth - right < ROLE_PICKER_WIDTH) {\n horizontal = offsetHorizontal;\n }\n\n setOffset({ horizontal, vertical });\n }, [isOpen, selectedRoles]);\n\n const onOpen = useCallback(\n (event: FormEvent<HTMLElement>) => {\n if (!disabled) {\n event.preventDefault();\n event.stopPropagation();\n setOpen(true);\n }\n },\n [setOpen, disabled]\n );\n\n const onClose = useCallback(() => {\n setOpen(false);\n setQuery('');\n setSelectedRoles(appliedRoles);\n setSelectedBuiltInRole(builtInRole);\n }, [appliedRoles, builtInRole]);\n\n // Only call onClose if menu is open. Prevent unnecessary calls for multiple pickers on the page.\n const onClickOutside = () => isOpen && onClose();\n\n const onInputChange = (query?: string) => {\n if (query) {\n setQuery(query);\n } else {\n setQuery('');\n }\n };\n\n const onSelect = (roles: Role[]) => {\n setSelectedRoles(roles);\n };\n\n const onBuiltInRoleSelect = (role: OrgRole) => {\n setSelectedBuiltInRole(role);\n };\n\n const onUpdate = (newRoles: Role[], newBuiltInRole?: OrgRole) => {\n if (onBuiltinRoleChange && newBuiltInRole && newBuiltInRole !== builtInRole) {\n onBuiltinRoleChange(newBuiltInRole);\n }\n if (canUpdateRoles) {\n onRolesChange(newRoles);\n }\n setQuery('');\n setOpen(false);\n };\n\n const getOptions = () => {\n // if roles cannot be updated mark every role as non delegatable\n const options = roleOptions.map((r) => ({ ...r, delegatable: canUpdateRoles && r.delegatable }));\n\n if (query && query.trim() !== '') {\n return options.filter((option) => option.name?.toLowerCase().includes(query.toLowerCase()));\n }\n return options;\n };\n\n if (isLoading) {\n return (\n <HorizontalGroup justify=\"center\">\n <span>Loading...</span>\n <Spinner size={16} />\n </HorizontalGroup>\n );\n }\n\n return (\n <div data-testid=\"role-picker\" style={{ position: 'relative', width: ROLE_PICKER_WIDTH }} ref={ref}>\n <ClickOutsideWrapper onClick={onClickOutside}>\n <RolePickerInput\n builtInRole={selectedBuiltInRole}\n appliedRoles={selectedRoles}\n query={query}\n onQueryChange={onInputChange}\n onOpen={onOpen}\n onClose={onClose}\n isFocused={isOpen}\n disabled={disabled}\n showBuiltInRole={showBuiltInRole}\n />\n {isOpen && (\n <RolePickerMenu\n options={getOptions()}\n builtInRole={selectedBuiltInRole}\n appliedRoles={appliedRoles}\n onBuiltInRoleSelect={onBuiltInRoleSelect}\n onSelect={onSelect}\n onUpdate={onUpdate}\n showGroups={query.length === 0 || query.trim() === ''}\n builtinRolesDisabled={builtinRolesDisabled}\n showBuiltInRole={showBuiltInRole}\n updateDisabled={builtinRolesDisabled && !canUpdateRoles}\n apply={apply}\n offset={offset}\n />\n )}\n </ClickOutsideWrapper>\n </div>\n );\n};\n","import React, { FC, useEffect } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { contextSrv } from 'app/core/core';\nimport { Role, OrgRole, AccessControlAction } from 'app/types';\n\nimport { RolePicker } from './RolePicker';\nimport { fetchUserRoles, updateUserRoles } from './api';\n\nexport interface Props {\n builtInRole: OrgRole;\n userId: number;\n orgId?: number;\n onBuiltinRoleChange: (newRole: OrgRole) => void;\n roleOptions: Role[];\n builtInRoles?: { [key: string]: Role[] };\n disabled?: boolean;\n builtinRolesDisabled?: boolean;\n apply?: boolean;\n onApplyRoles?: (newRoles: Role[], userId: number, orgId: number | undefined) => void;\n pendingRoles?: Role[];\n}\n\nexport const UserRolePicker: FC<Props> = ({\n builtInRole,\n userId,\n orgId,\n onBuiltinRoleChange,\n roleOptions,\n builtInRoles,\n disabled,\n builtinRolesDisabled,\n apply = false,\n onApplyRoles,\n pendingRoles,\n}) => {\n const [{ loading, value: appliedRoles = [] }, getUserRoles] = useAsyncFn(async () => {\n try {\n if (apply) {\n if (pendingRoles?.length! > 0) {\n return pendingRoles;\n }\n }\n if (contextSrv.hasPermission(AccessControlAction.ActionUserRolesList)) {\n return await fetchUserRoles(userId, orgId);\n }\n } catch (e) {\n // TODO handle error\n console.error('Error loading options');\n }\n return [];\n }, [orgId, userId, pendingRoles]);\n\n useEffect(() => {\n // only load roles when there is an Org selected\n if (orgId) {\n getUserRoles();\n }\n }, [orgId, getUserRoles, pendingRoles]);\n\n const onRolesChange = async (roles: Role[]) => {\n if (!apply) {\n await updateUserRoles(roles, userId, orgId);\n await getUserRoles();\n } else if (onApplyRoles) {\n onApplyRoles(roles, userId, orgId);\n }\n };\n\n const canUpdateRoles =\n contextSrv.hasPermission(AccessControlAction.ActionUserRolesAdd) &&\n contextSrv.hasPermission(AccessControlAction.ActionUserRolesRemove);\n\n return (\n <RolePicker\n appliedRoles={appliedRoles}\n builtInRole={builtInRole}\n onRolesChange={onRolesChange}\n onBuiltinRoleChange={onBuiltinRoleChange}\n roleOptions={roleOptions}\n builtInRoles={builtInRoles}\n isLoading={loading}\n disabled={disabled}\n builtinRolesDisabled={builtinRolesDisabled}\n showBuiltInRole\n apply={apply}\n canUpdateRoles={canUpdateRoles}\n />\n );\n};\n","import { getBackendSrv, isFetchError } from '@grafana/runtime';\nimport { Role } from 'app/types';\n\nexport const fetchRoleOptions = async (orgId?: number, query?: string): Promise<Role[]> => {\n let rolesUrl = '/api/access-control/roles?delegatable=true';\n if (orgId) {\n rolesUrl += `&targetOrgId=${orgId}`;\n }\n const roles = await getBackendSrv().get(rolesUrl);\n if (!roles || !roles.length) {\n return [];\n }\n return roles;\n};\n\nexport const fetchBuiltinRoles = (orgId?: number): Promise<{ [key: string]: Role[] }> => {\n let builtinRolesUrl = '/api/access-control/builtin-roles';\n if (orgId) {\n builtinRolesUrl += `?targetOrgId=${orgId}`;\n }\n return getBackendSrv().get(builtinRolesUrl);\n};\n\nexport const fetchUserRoles = async (userId: number, orgId?: number): Promise<Role[]> => {\n let userRolesUrl = `/api/access-control/users/${userId}/roles`;\n if (orgId) {\n userRolesUrl += `?targetOrgId=${orgId}`;\n }\n try {\n const roles = await getBackendSrv().get(userRolesUrl);\n if (!roles || !roles.length) {\n return [];\n }\n return roles;\n } catch (error) {\n if (isFetchError(error)) {\n error.isHandled = true;\n }\n return [];\n }\n};\n\nexport const updateUserRoles = (roles: Role[], userId: number, orgId?: number) => {\n let userRolesUrl = `/api/access-control/users/${userId}/roles`;\n if (orgId) {\n userRolesUrl += `?targetOrgId=${orgId}`;\n }\n const roleUids = roles.flatMap((x) => x.uid);\n return getBackendSrv().put(userRolesUrl, {\n orgId,\n roleUids,\n });\n};\n\nexport const fetchTeamRoles = async (teamId: number, orgId?: number): Promise<Role[]> => {\n let teamRolesUrl = `/api/access-control/teams/${teamId}/roles`;\n if (orgId) {\n teamRolesUrl += `?targetOrgId=${orgId}`;\n }\n try {\n const roles = await getBackendSrv().get(teamRolesUrl);\n if (!roles || !roles.length) {\n return [];\n }\n return roles;\n } catch (error) {\n if (isFetchError(error)) {\n error.isHandled = true;\n }\n return [];\n }\n};\n\nexport const updateTeamRoles = (roles: Role[], teamId: number, orgId?: number) => {\n let teamRolesUrl = `/api/access-control/teams/${teamId}/roles`;\n if (orgId) {\n teamRolesUrl += `?targetOrgId=${orgId}`;\n }\n const roleUids = roles.flatMap((x) => x.uid);\n\n return getBackendSrv().put(teamRolesUrl, {\n orgId,\n roleUids,\n });\n};\n","import debounce from 'debounce-promise';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { AsyncSelectProps, AsyncSelect } from '@grafana/ui';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSearchHit } from 'app/features/search/types';\nimport { DashboardDTO } from 'app/types';\n\ninterface Props extends Omit<AsyncSelectProps<DashboardPickerDTO>, 'value' | 'onChange' | 'loadOptions' | ''> {\n value?: DashboardPickerDTO['uid'];\n onChange?: (value?: DashboardPickerDTO) => void;\n}\n\nexport type DashboardPickerDTO = Pick<DashboardDTO['dashboard'], 'uid' | 'title'> &\n Pick<DashboardDTO['meta'], 'folderUid' | 'folderTitle'>;\n\nconst formatLabel = (folderTitle = 'General', dashboardTitle: string) => `${folderTitle}/${dashboardTitle}`;\n\nconst getDashboards = debounce((query = ''): Promise<Array<SelectableValue<DashboardPickerDTO>>> => {\n return backendSrv.search({ type: 'dash-db', query, limit: 100 }).then((result: DashboardSearchHit[]) => {\n return result.map((item: DashboardSearchHit) => ({\n value: {\n // dashboards uid here is always defined as this endpoint does not return the default home dashboard\n uid: item.uid!,\n title: item.title,\n folderTitle: item.folderTitle,\n folderUid: item.folderUid,\n },\n label: formatLabel(item?.folderTitle, item.title),\n }));\n });\n}, 300);\n\n// TODO: this component should provide a way to apply different filters to the search APIs\nexport const DashboardPicker = ({\n value,\n onChange,\n placeholder = 'Select dashboard',\n noOptionsMessage = 'No dashboards found',\n ...props\n}: Props) => {\n const [current, setCurrent] = useState<SelectableValue<DashboardPickerDTO>>();\n\n // This is required because the async select does not match the raw uid value\n // We can not use a simple Select because the dashboard search should not return *everything*\n useEffect(() => {\n if (!value || value === current?.value?.uid) {\n return;\n }\n\n (async () => {\n // value was manually changed from outside or we are rendering for the first time.\n // We need to fetch dashboard information.\n const res = await backendSrv.getDashboardByUid(value);\n setCurrent({\n value: {\n uid: res.dashboard.uid,\n title: res.dashboard.title,\n folderTitle: res.meta.folderTitle,\n folderUid: res.meta.folderUid,\n },\n label: formatLabel(res.meta?.folderTitle, res.dashboard.title),\n });\n })();\n // we don't need to rerun this effect every time `current` changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const onPicked = useCallback(\n (sel: SelectableValue<DashboardPickerDTO>) => {\n setCurrent(sel);\n onChange?.(sel?.value);\n },\n [onChange, setCurrent]\n );\n\n return (\n <AsyncSelect\n loadOptions={getDashboards}\n onChange={onPicked}\n placeholder={placeholder}\n noOptionsMessage={noOptionsMessage}\n value={current}\n {...props}\n />\n );\n};\n","import { debounce } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport { AppEvents, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { ActionMeta, AsyncSelect, LoadOptionsCallback } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { createFolder, getFolderById, searchFolders } from 'app/features/manage-dashboards/state/actions';\nimport { DashboardSearchHit } from 'app/features/search/types';\n\nimport { AccessControlAction, PermissionLevelString } from '../../../types';\nimport appEvents from '../../app_events';\n\nexport type FolderPickerFilter = (hits: DashboardSearchHit[]) => DashboardSearchHit[];\n\nexport interface Props {\n onChange: ($folder: { title: string; id: number }) => void;\n enableCreateNew?: boolean;\n rootName?: string;\n enableReset?: boolean;\n dashboardId?: any;\n initialTitle?: string;\n initialFolderId?: number;\n permissionLevel?: Exclude<PermissionLevelString, PermissionLevelString.Admin>;\n filter?: FolderPickerFilter;\n allowEmpty?: boolean;\n showRoot?: boolean;\n onClear?: () => void;\n accessControlMetadata?: boolean;\n /**\n * Skips loading all folders in order to find the folder matching\n * the folder where the dashboard is stored.\n * Instead initialFolderId and initialTitle will be used to display the correct folder.\n * initialFolderId needs to have an value > -1 or an error will be thrown.\n */\n skipInitialLoad?: boolean;\n /** The id of the search input. Use this to set a matching label with htmlFor */\n inputId?: string;\n}\n\ninterface State {\n folder: SelectableValue<number> | null;\n}\n\nexport class FolderPicker extends PureComponent<Props, State> {\n debouncedSearch: any;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n folder: null,\n };\n\n this.debouncedSearch = debounce(this.loadOptions, 300, {\n leading: true,\n trailing: true,\n });\n }\n\n static defaultProps: Partial<Props> = {\n rootName: 'General',\n enableReset: false,\n initialTitle: '',\n enableCreateNew: false,\n permissionLevel: PermissionLevelString.Edit,\n allowEmpty: false,\n showRoot: true,\n };\n\n componentDidMount = async () => {\n if (this.props.skipInitialLoad) {\n const folder = await getInitialValues({\n getFolder: getFolderById,\n folderId: this.props.initialFolderId,\n folderName: this.props.initialTitle,\n });\n this.setState({ folder });\n return;\n }\n\n await this.loadInitialValue();\n };\n\n // when debouncing, we must use the callback form of react-select's loadOptions so we don't\n // drop results for user input. This must not return a promise/use await.\n loadOptions = (query: string, callback: LoadOptionsCallback<number>): void => {\n this.searchFolders(query).then(callback);\n };\n\n private searchFolders = async (query: string) => {\n const {\n rootName,\n enableReset,\n initialTitle,\n permissionLevel,\n filter,\n accessControlMetadata,\n initialFolderId,\n showRoot,\n } = this.props;\n\n const searchHits = await searchFolders(query, permissionLevel, accessControlMetadata);\n const options: Array<SelectableValue<number>> = mapSearchHitsToOptions(searchHits, filter);\n\n const hasAccess =\n contextSrv.hasAccess(AccessControlAction.DashboardsWrite, contextSrv.isEditor) ||\n contextSrv.hasAccess(AccessControlAction.DashboardsCreate, contextSrv.isEditor);\n\n if (hasAccess && rootName?.toLowerCase().startsWith(query.toLowerCase()) && showRoot) {\n options.unshift({ label: rootName, value: 0 });\n }\n\n if (\n enableReset &&\n query === '' &&\n initialTitle !== '' &&\n !options.find((option) => option.label === initialTitle)\n ) {\n options.unshift({ label: initialTitle, value: initialFolderId });\n }\n\n return options;\n };\n\n onFolderChange = (newFolder: SelectableValue<number>, actionMeta: ActionMeta) => {\n if (!newFolder) {\n newFolder = { value: 0, label: this.props.rootName };\n }\n\n if (actionMeta.action === 'clear' && this.props.onClear) {\n this.props.onClear();\n return;\n }\n\n this.setState(\n {\n folder: newFolder,\n },\n () => this.props.onChange({ id: newFolder.value!, title: newFolder.label! })\n );\n };\n\n createNewFolder = async (folderName: string) => {\n const newFolder = await createFolder({ title: folderName });\n let folder: SelectableValue<number> = { value: -1, label: 'Not created' };\n\n if (newFolder.id > -1) {\n appEvents.emit(AppEvents.alertSuccess, ['Folder Created', 'OK']);\n folder = { value: newFolder.id, label: newFolder.title };\n\n this.setState(\n {\n folder: newFolder,\n },\n () => {\n this.onFolderChange(folder, { action: 'create-option', option: folder });\n }\n );\n } else {\n appEvents.emit(AppEvents.alertError, ['Folder could not be created']);\n }\n\n return folder;\n };\n\n private loadInitialValue = async () => {\n const { initialTitle, rootName, initialFolderId, enableReset, dashboardId } = this.props;\n const resetFolder: SelectableValue<number> = { label: initialTitle, value: undefined };\n const rootFolder: SelectableValue<number> = { label: rootName, value: 0 };\n\n const options = await this.searchFolders('');\n\n let folder: SelectableValue<number> | null = null;\n\n if (initialFolderId !== undefined && initialFolderId !== null && initialFolderId > -1) {\n folder = options.find((option) => option.value === initialFolderId) || null;\n } else if (enableReset && initialTitle) {\n folder = resetFolder;\n } else if (initialFolderId) {\n folder = options.find((option) => option.id === initialFolderId) || null;\n }\n\n if (!folder && !this.props.allowEmpty) {\n if (contextSrv.isEditor) {\n folder = rootFolder;\n } else {\n // We shouldn't assign a random folder without the user actively choosing it on a persisted dashboard\n const isPersistedDashBoard = !!dashboardId;\n if (isPersistedDashBoard) {\n folder = resetFolder;\n } else {\n folder = options.length > 0 ? options[0] : resetFolder;\n }\n }\n }\n\n this.setState(\n {\n folder,\n },\n () => {\n // if this is not the same as our initial value notify parent\n if (folder && folder.value !== initialFolderId) {\n this.props.onChange({ id: folder.value!, title: folder.label! });\n }\n }\n );\n };\n\n render() {\n const { folder } = this.state;\n const { enableCreateNew, inputId, onClear } = this.props;\n const isClearable = typeof onClear === 'function';\n\n return (\n <div data-testid={selectors.components.FolderPicker.containerV2}>\n <AsyncSelect\n inputId={inputId}\n aria-label={selectors.components.FolderPicker.input}\n loadingMessage=\"Loading folders...\"\n defaultOptions\n defaultValue={folder}\n value={folder}\n allowCustomValue={enableCreateNew}\n loadOptions={this.debouncedSearch}\n onChange={this.onFolderChange}\n onCreateOption={this.createNewFolder}\n isClearable={isClearable}\n />\n </div>\n );\n }\n}\n\nfunction mapSearchHitsToOptions(hits: DashboardSearchHit[], filter?: FolderPickerFilter) {\n const filteredHits = filter ? filter(hits) : hits;\n return filteredHits.map((hit) => ({ label: hit.title, value: hit.id }));\n}\n\ninterface Args {\n getFolder: typeof getFolderById;\n folderId?: number;\n folderName?: string;\n}\n\nexport async function getInitialValues({ folderName, folderId, getFolder }: Args): Promise<SelectableValue<number>> {\n if (folderId === null || folderId === undefined || folderId < 0) {\n throw new Error('folderId should to be greater or equal to zero.');\n }\n\n if (folderName) {\n return { label: folderName, value: folderId };\n }\n\n const folderDto = await getFolder(folderId);\n return { label: folderDto.title, value: folderId };\n}\n","import React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Icon, Select } from '@grafana/ui';\nimport { DEFAULT_SORT } from 'app/features/search/constants';\n\nimport { SearchSrv } from '../../services/search_srv';\n\nexport interface Props {\n onChange: (sortValue: SelectableValue) => void;\n value?: string;\n placeholder?: string;\n getSortOptions?: () => Promise<SelectableValue[]>;\n filter?: string[];\n isClearable?: boolean;\n}\n\nconst defaultSortOptionsGetter = (): Promise<SelectableValue[]> => {\n return new SearchSrv().getSortOptions().then(({ sortOptions }) => {\n return sortOptions.map((opt: any) => ({ label: opt.displayName, value: opt.name }));\n });\n};\n\nexport function SortPicker({ onChange, value, placeholder, filter, getSortOptions, isClearable }: Props) {\n // Using sync Select and manual options fetching here since we need to find the selected option by value\n const options = useAsync<() => Promise<SelectableValue[]>>(async () => {\n const vals = await (getSortOptions ?? defaultSortOptionsGetter)();\n if (filter) {\n return vals.filter((v) => filter.includes(v.value));\n }\n return vals;\n }, [getSortOptions, filter]);\n\n if (options.loading) {\n return null;\n }\n\n const isDesc = Boolean(value?.includes('desc') || value?.startsWith('-')); // bluge syntax starts with \"-\"\n return (\n <Select\n key={value}\n width={28}\n onChange={onChange}\n value={options.value?.find((opt) => opt.value === value) ?? null}\n options={options.value}\n aria-label=\"Sort\"\n placeholder={placeholder ?? `Sort (Default ${DEFAULT_SORT.label})`}\n prefix={<Icon name={isDesc ? 'sort-amount-down' : 'sort-amount-up'} />}\n isClearable={isClearable}\n />\n );\n}\n","import { debounce, isNil } from 'lodash';\nimport React, { Component } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { AsyncSelect } from '@grafana/ui';\nimport { Team } from 'app/types';\n\nexport interface Props {\n onSelected: (team: SelectableValue<Team>) => void;\n className?: string;\n}\n\nexport interface State {\n isLoading: boolean;\n}\n\nexport class TeamPicker extends Component<Props, State> {\n debouncedSearch: any;\n\n constructor(props: Props) {\n super(props);\n this.state = { isLoading: false };\n this.search = this.search.bind(this);\n\n this.debouncedSearch = debounce(this.search, 300, {\n leading: true,\n trailing: true,\n });\n }\n\n search(query?: string) {\n this.setState({ isLoading: true });\n\n if (isNil(query)) {\n query = '';\n }\n\n return getBackendSrv()\n .get(`/api/teams/search?perpage=100&page=1&query=${query}`)\n .then((result: { teams: Team[] }) => {\n const teams: Array<SelectableValue<Team>> = result.teams.map((team) => {\n return {\n value: team,\n label: team.name,\n imgUrl: team.avatarUrl,\n };\n });\n\n this.setState({ isLoading: false });\n return teams;\n });\n }\n\n render() {\n const { onSelected, className } = this.props;\n const { isLoading } = this.state;\n return (\n <div className=\"user-picker\" data-testid=\"teamPicker\">\n <AsyncSelect\n isLoading={isLoading}\n defaultOptions={true}\n loadOptions={this.debouncedSearch}\n onChange={onSelected}\n className={className}\n placeholder=\"Select a team\"\n noOptionsMessage=\"No teams found\"\n aria-label=\"Team picker\"\n />\n </div>\n );\n }\n}\n","import { debounce, isNil } from 'lodash';\nimport React, { Component } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { AsyncSelect } from '@grafana/ui';\nimport { OrgUser } from 'app/types';\n\nexport interface Props {\n onSelected: (user: SelectableValue<OrgUser['userId']>) => void;\n className?: string;\n inputId?: string;\n}\n\nexport interface State {\n isLoading: boolean;\n}\n\nexport class UserPicker extends Component<Props, State> {\n debouncedSearch: any;\n\n constructor(props: Props) {\n super(props);\n this.state = { isLoading: false };\n this.search = this.search.bind(this);\n\n this.debouncedSearch = debounce(this.search, 300, {\n leading: true,\n trailing: true,\n });\n }\n\n search(query?: string) {\n this.setState({ isLoading: true });\n\n if (isNil(query)) {\n query = '';\n }\n\n return getBackendSrv()\n .get(`/api/org/users/lookup?query=${query}&limit=100`)\n .then((result: OrgUser[]) => {\n return result.map((user) => ({\n id: user.userId,\n value: user.userId,\n label: user.login,\n imgUrl: user.avatarUrl,\n login: user.login,\n }));\n })\n .finally(() => {\n this.setState({ isLoading: false });\n });\n }\n\n render() {\n const { className, onSelected, inputId } = this.props;\n const { isLoading } = this.state;\n\n return (\n <div className=\"user-picker\" data-testid=\"userPicker\">\n <AsyncSelect\n isClearable\n className={className}\n inputId={inputId}\n isLoading={isLoading}\n defaultOptions={true}\n loadOptions={this.debouncedSearch}\n onChange={onSelected}\n placeholder=\"Start typing to search for user\"\n noOptionsMessage=\"No users found\"\n aria-label=\"User picker\"\n />\n </div>\n );\n }\n}\n","import React from 'react';\n\nimport { getTagColorsFromName, Icon } from '@grafana/ui';\n\nexport interface Props {\n label: string;\n removeIcon: boolean;\n count: number;\n onClick?: any;\n}\n\nexport class TagBadge extends React.Component<Props, any> {\n constructor(props: Props) {\n super(props);\n }\n\n render() {\n const { label, removeIcon, count } = this.props;\n const { color } = getTagColorsFromName(label);\n\n const tagStyle = {\n backgroundColor: color,\n };\n\n const countLabel = count !== 0 && <span className=\"tag-count-label\">{`(${count})`}</span>;\n\n return (\n <span className={`label label-tag`} style={tagStyle}>\n {removeIcon && <Icon name=\"times\" />}\n {label} {countLabel}\n </span>\n );\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\nimport { OptionProps } from 'react-select';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { useTheme, stylesFactory } from '@grafana/ui';\n\nimport { TagBadge } from './TagBadge';\n\n// https://github.com/JedWatson/react-select/issues/3038\ninterface ExtendedOptionProps extends OptionProps<any, any> {\n data: any;\n}\n\nexport const TagOption: FC<ExtendedOptionProps> = ({ data, className, label, isFocused, innerProps }) => {\n const theme = useTheme();\n const styles = getStyles(theme);\n\n return (\n <div className={cx(styles.option, isFocused && styles.optionFocused)} aria-label=\"Tag option\" {...innerProps}>\n <div className={`tag-filter-option ${className || ''}`}>\n {typeof label === 'string' ? <TagBadge label={label} removeIcon={false} count={data.count ?? 0} /> : label}\n </div>\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n option: css`\n padding: 8px;\n white-space: nowrap;\n cursor: pointer;\n border-left: 2px solid transparent;\n &:hover {\n background: ${theme.colors.dropdownOptionHoverBg};\n }\n `,\n optionFocused: css`\n background: ${theme.colors.dropdownOptionHoverBg};\n border-style: solid;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left-width: 2px;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\nimport { components } from 'react-select';\n\nimport { escapeStringForRegex, GrafanaTheme2 } from '@grafana/data';\nimport { Icon, MultiSelect, useStyles2 } from '@grafana/ui';\n\nimport { TagBadge } from './TagBadge';\nimport { TagOption } from './TagOption';\n\nexport interface TermCount {\n term: string;\n count: number;\n}\n\ninterface TagSelectOption {\n value: string;\n label: string;\n count: number;\n}\n\nexport interface Props {\n allowCustomValue?: boolean;\n formatCreateLabel?: (input: string) => string;\n /** Do not show selected values inside Select. Useful when the values need to be shown in some other components */\n hideValues?: boolean;\n inputId?: string;\n isClearable?: boolean;\n onChange: (tags: string[]) => void;\n placeholder?: string;\n tagOptions: () => Promise<TermCount[]>;\n tags: string[];\n width?: number;\n}\n\nconst filterOption = (option: any, searchQuery: string) => {\n const regex = RegExp(escapeStringForRegex(searchQuery), 'i');\n return regex.test(option.value);\n};\n\nexport const TagFilter: FC<Props> = ({\n allowCustomValue = false,\n formatCreateLabel,\n hideValues,\n inputId,\n isClearable,\n onChange,\n placeholder = 'Filter by tag',\n tagOptions,\n tags,\n width,\n}) => {\n const styles = useStyles2(getStyles);\n\n const currentlySelectedTags = tags.map((tag) => ({ value: tag, label: tag, count: 0 }));\n const [options, setOptions] = useState<TagSelectOption[]>(currentlySelectedTags);\n const [isLoading, setIsLoading] = useState(false);\n const [previousTags, setPreviousTags] = useState(tags);\n const [customTags, setCustomTags] = useState<TagSelectOption[]>(currentlySelectedTags);\n\n // Necessary to force re-render to keep tag options up to date / relevant\n const selectKey = useMemo(() => tags.join(), [tags]);\n\n const onLoadOptions = useCallback(async () => {\n const options = await tagOptions();\n return options.map((option) => {\n if (tags.includes(option.term)) {\n return {\n value: option.term,\n label: option.term,\n count: 0,\n };\n } else {\n return {\n value: option.term,\n label: option.term,\n count: option.count,\n };\n }\n });\n }, [tagOptions, tags]);\n\n const onFocus = useCallback(async () => {\n setIsLoading(true);\n const results = await onLoadOptions();\n\n if (allowCustomValue) {\n customTags.forEach((customTag) => results.push(customTag));\n }\n\n setOptions(results);\n setIsLoading(false);\n }, [allowCustomValue, customTags, onLoadOptions]);\n\n useEffect(() => {\n // Load options when tag is selected externally\n if (tags.length > 0 && options.length === 0) {\n onFocus();\n }\n }, [onFocus, options.length, tags.length]);\n\n useEffect(() => {\n // Update selected tags to not include (counts) when selected externally\n if (tags !== previousTags) {\n setPreviousTags(tags);\n onFocus();\n }\n }, [onFocus, previousTags, tags]);\n\n const onTagChange = (newTags: any[]) => {\n newTags.forEach((tag) => (tag.count = 0));\n\n // On remove with 1 item returns null, so we need to make sure it's an empty array in that case\n // https://github.com/JedWatson/react-select/issues/3632\n onChange((newTags || []).map((tag) => tag.value));\n\n // If custom values are allowed, set custom tags to prevent overwriting from query update\n if (allowCustomValue) {\n setCustomTags(newTags.filter((tag) => !tags.includes(tag)));\n }\n };\n\n const selectOptions = {\n key: selectKey,\n onFocus,\n isLoading,\n options,\n allowCreateWhileLoading: true,\n allowCustomValue,\n formatCreateLabel,\n defaultOptions: true,\n filterOption,\n getOptionLabel: (i: any) => i.label,\n getOptionValue: (i: any) => i.value,\n inputId,\n isMulti: true,\n loadingMessage: 'Loading...',\n noOptionsMessage: 'No tags found',\n onChange: onTagChange,\n placeholder,\n value: currentlySelectedTags,\n width,\n components: {\n Option: TagOption,\n MultiValueLabel: (): any => {\n return null; // We want the whole tag to be clickable so we use MultiValueRemove instead\n },\n MultiValueRemove(props: any) {\n const { data } = props;\n\n return (\n <components.MultiValueRemove {...props}>\n <TagBadge key={data.label} label={data.label} removeIcon={true} count={data.count} />\n </components.MultiValueRemove>\n );\n },\n MultiValueContainer: hideValues ? (): any => null : components.MultiValueContainer,\n },\n };\n\n return (\n <div className={styles.tagFilter}>\n {isClearable && tags.length > 0 && (\n <span className={styles.clear} onClick={() => onTagChange([])} tabIndex={0}>\n Clear tags\n </span>\n )}\n <MultiSelect {...selectOptions} prefix={<Icon name=\"tag-alt\" />} aria-label=\"Tag filter\" />\n </div>\n );\n};\n\nTagFilter.displayName = 'TagFilter';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n tagFilter: css`\n position: relative;\n min-width: 180px;\n flex-grow: 1;\n\n .label-tag {\n margin-left: 6px;\n cursor: pointer;\n }\n `,\n clear: css`\n text-decoration: underline;\n font-size: 12px;\n position: absolute;\n top: -17px;\n right: 0;\n cursor: pointer;\n color: ${theme.colors.text.secondary};\n\n &:hover {\n color: ${theme.colors.text.primary};\n }\n `,\n});\n","import React from 'react';\n\nimport { TimeRange, isDateTime, toUtc } from '@grafana/data';\nimport { TimeRangePickerProps, TimeRangePicker } from '@grafana/ui';\n\nimport { LocalStorageValueProvider } from '../LocalStorageValueProvider';\n\nconst LOCAL_STORAGE_KEY = 'grafana.dashboard.timepicker.history';\n\ninterface Props extends Omit<TimeRangePickerProps, 'history' | 'theme'> {}\n\nexport const TimePickerWithHistory: React.FC<Props> = (props) => {\n return (\n <LocalStorageValueProvider<TimeRange[]> storageKey={LOCAL_STORAGE_KEY} defaultValue={[]}>\n {(values, onSaveToStore) => {\n return (\n <TimeRangePicker\n {...props}\n history={convertIfJson(values)}\n onChange={(value) => {\n onAppendToHistory(value, values, onSaveToStore);\n props.onChange(value);\n }}\n />\n );\n }}\n </LocalStorageValueProvider>\n );\n};\n\nfunction convertIfJson(history: TimeRange[]): TimeRange[] {\n return history.map((time) => {\n if (isDateTime(time.from)) {\n return time;\n }\n\n return {\n from: toUtc(time.from),\n to: toUtc(time.to),\n raw: time.raw,\n };\n });\n}\n\nfunction onAppendToHistory(toAppend: TimeRange, values: TimeRange[], onSaveToStore: (values: TimeRange[]) => void) {\n if (!isAbsolute(toAppend)) {\n return;\n }\n const toStore = limit([toAppend, ...values]);\n onSaveToStore(toStore);\n}\n\nfunction isAbsolute(value: TimeRange): boolean {\n return isDateTime(value.raw.from) || isDateTime(value.raw.to);\n}\n\nfunction limit(value: TimeRange[]): TimeRange[] {\n return value.slice(0, 4);\n}\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes, useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { reportExperimentView } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\n\nexport interface Props extends HTMLAttributes<HTMLSpanElement> {\n text?: string;\n experimentId?: string;\n eventVariant?: string;\n}\n\nexport const ProBadge = ({ text = 'PRO', className, experimentId, eventVariant = '', ...htmlProps }: Props) => {\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n if (experimentId) {\n reportExperimentView(experimentId, 'test', eventVariant);\n }\n }, [experimentId, eventVariant]);\n\n return (\n <span className={cx(styles.badge, className)} {...htmlProps}>\n {text}\n </span>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n badge: css`\n margin-left: ${theme.spacing(1.25)};\n border-radius: ${theme.shape.borderRadius(5)};\n background-color: ${theme.colors.success.main};\n padding: ${theme.spacing(0.25, 0.75)};\n color: white; // use the same color for both themes\n font-weight: ${theme.typography.fontWeightMedium};\n font-size: ${theme.typography.pxToRem(10)};\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Modal, useStyles2 } from '@grafana/ui';\n\nconst shortcuts = {\n Global: [\n { keys: ['g', 'h'], description: 'Go to Home Dashboard' },\n { keys: ['g', 'p'], description: 'Go to Profile' },\n { keys: ['s', 'o'], description: 'Open search' },\n { keys: ['esc'], description: 'Exit edit/setting views' },\n { keys: ['h'], description: 'Show all keyboard shortcuts' },\n { keys: ['mod+k'], description: 'Open command palette' },\n ],\n Dashboard: [\n { keys: ['mod+s'], description: 'Save dashboard' },\n { keys: ['d', 'r'], description: 'Refresh all panels' },\n { keys: ['d', 's'], description: 'Dashboard settings' },\n { keys: ['d', 'v'], description: 'Toggle in-active / view mode' },\n { keys: ['d', 'k'], description: 'Toggle kiosk mode (hides top nav)' },\n { keys: ['d', 'E'], description: 'Expand all rows' },\n { keys: ['d', 'C'], description: 'Collapse all rows' },\n { keys: ['d', 'a'], description: 'Toggle auto fit panels (experimental feature)' },\n { keys: ['mod+o'], description: 'Toggle shared graph crosshair' },\n { keys: ['d', 'l'], description: 'Toggle all panel legends' },\n ],\n 'Focused Panel': [\n { keys: ['e'], description: 'Toggle panel edit view' },\n { keys: ['v'], description: 'Toggle panel fullscreen view' },\n { keys: ['p', 's'], description: 'Open Panel Share Modal' },\n { keys: ['p', 'd'], description: 'Duplicate Panel' },\n { keys: ['p', 'r'], description: 'Remove Panel' },\n { keys: ['p', 'l'], description: 'Toggle panel legend' },\n ],\n 'Time Range': [\n { keys: ['t', 'z'], description: 'Zoom out time range' },\n {\n keys: ['t', '←'],\n description: 'Move time range back',\n },\n {\n keys: ['t', '→'],\n description: 'Move time range forward',\n },\n {\n keys: ['t', 'a'],\n description: 'Make time range absolute/permanent',\n },\n ],\n};\n\nexport interface HelpModalProps {\n onDismiss: () => void;\n}\n\nexport const HelpModal = ({ onDismiss }: HelpModalProps): JSX.Element => {\n const styles = useStyles2(getStyles);\n return (\n <Modal title=\"Shortcuts\" isOpen onDismiss={onDismiss} onClickBackdrop={onDismiss}>\n <div className={styles.titleDescription}>\n <span className={styles.shortcutTableKey}>mod</span> =<span> CTRL on windows or linux and CMD key on Mac</span>\n </div>\n <div className={styles.categories}>\n {Object.entries(shortcuts).map(([category, shortcuts], i) => (\n <div className={styles.shortcutCategory} key={i}>\n <table className={styles.shortcutTable}>\n <tbody>\n <tr>\n <th className={styles.shortcutTableCategoryHeader} colSpan={2}>\n {category}\n </th>\n </tr>\n {shortcuts.map((shortcut, j) => (\n <tr key={`${i}-${j}`}>\n <td className={styles.shortcutTableKeys}>\n {shortcut.keys.map((key, k) => (\n <span className={styles.shortcutTableKey} key={`${i}-${j}-${k}`}>\n {key}\n </span>\n ))}\n </td>\n <td className={styles.shortcutTableDescription}>{shortcut.description}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ))}\n </div>\n </Modal>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n titleDescription: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n font-weight: ${theme.typography.bodySmall.fontWeight};\n color: ${theme.colors.text.disabled};\n padding-bottom: ${theme.spacing(2)};\n `,\n categories: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n display: flex;\n flex-flow: row wrap;\n justify-content: space-between;\n align-items: flex-start;\n `,\n shortcutCategory: css`\n width: 50%;\n font-size: ${theme.typography.bodySmall.fontSize};\n `,\n shortcutTable: css`\n margin-bottom: ${theme.spacing(2)};\n `,\n shortcutTableCategoryHeader: css`\n font-weight: normal;\n font-size: ${theme.typography.h6.fontSize};\n text-align: left;\n `,\n shortcutTableDescription: css`\n text-align: left;\n color: ${theme.colors.text.disabled};\n width: 99%;\n padding: ${theme.spacing(1, 2)};\n `,\n shortcutTableKeys: css`\n white-space: nowrap;\n width: 1%;\n text-align: right;\n color: ${theme.colors.text.primary};\n `,\n shortcutTableKey: css`\n display: inline-block;\n text-align: center;\n margin-right: ${theme.spacing(0.5)};\n padding: 3px 5px;\n font: 11px Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n line-height: 10px;\n vertical-align: middle;\n border: solid 1px ${theme.colors.border.medium};\n border-radius: ${theme.shape.borderRadius(3)};\n color: ${theme.colors.text.primary};\n background-color: ${theme.colors.background.secondary};\n `,\n };\n}\n","import { PluginState } from '@grafana/data';\nimport { config, GrafanaBootConfig } from '@grafana/runtime';\n// Legacy binding paths\nexport { config, GrafanaBootConfig as Settings };\n\nlet grafanaConfig: GrafanaBootConfig = config;\n\nexport default grafanaConfig;\n\nexport const getConfig = () => {\n return grafanaConfig;\n};\n\nexport const updateConfig = (update: Partial<GrafanaBootConfig>) => {\n grafanaConfig = {\n ...grafanaConfig,\n ...update,\n };\n};\n\n// The `enable_alpha` flag is not exposed directly, this is equivalent\nexport const hasAlphaPanels = Boolean(config.panels?.debug?.state === PluginState.alpha);\n","export const GRID_CELL_HEIGHT = 30;\nexport const GRID_CELL_VMARGIN = 8;\nexport const GRID_COLUMN_COUNT = 24;\nexport const REPEAT_DIR_VERTICAL = 'v';\nexport const REPEAT_DIR_HORIZONTAL = 'h';\n\nexport const DEFAULT_PANEL_SPAN = 4;\nexport const DEFAULT_ROW_HEIGHT = 250;\nexport const MIN_PANEL_HEIGHT = GRID_CELL_HEIGHT * 3;\n\nexport const LS_PANEL_COPY_KEY = 'panel-copy';\n\nexport const PANEL_BORDER = 2;\n\nexport const EDIT_PANEL_ID = 23763571993;\n\nexport const DEFAULT_PER_PAGE_PAGINATION = 40;\n\nexport const LS_VISUALIZATION_SELECT_TAB_KEY = 'VisualizationSelectPane.ListMode';\n","import React, { useContext } from 'react';\n\nimport { GrafanaConfig } from '@grafana/data';\nimport { LocationService } from '@grafana/runtime/src/services/LocationService';\nimport { BackendSrv } from '@grafana/runtime/src/services/backendSrv';\n\nimport { AppChromeService } from '../components/AppChrome/AppChromeService';\n\nexport interface GrafanaContextType {\n backend: BackendSrv;\n location: LocationService;\n config: GrafanaConfig;\n chrome: AppChromeService;\n}\n\nexport const GrafanaContext = React.createContext<GrafanaContextType | undefined>(undefined);\n\nexport function useGrafana(): GrafanaContextType {\n const context = useContext(GrafanaContext);\n if (!context) {\n throw new Error('No GrafanaContext found');\n }\n return context;\n}\n","import { useMemo } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { getMessageFromError } from 'app/core/utils/errors';\nimport { AppNotification, AppNotificationSeverity, useDispatch } from 'app/types';\n\nimport { notifyApp } from '../actions';\n\nconst defaultSuccessNotification = {\n title: '',\n text: '',\n severity: AppNotificationSeverity.Success,\n icon: 'check',\n};\n\nconst defaultWarningNotification = {\n title: '',\n text: '',\n severity: AppNotificationSeverity.Warning,\n icon: 'exclamation-triangle',\n};\n\nconst defaultErrorNotification = {\n title: '',\n text: '',\n severity: AppNotificationSeverity.Error,\n icon: 'exclamation-triangle',\n};\n\nexport const createSuccessNotification = (title: string, text = '', traceId?: string): AppNotification => ({\n ...defaultSuccessNotification,\n title,\n text,\n id: uuidv4(),\n timestamp: Date.now(),\n showing: true,\n});\n\nexport const createErrorNotification = (\n title: string,\n text: string | Error = '',\n traceId?: string,\n component?: React.ReactElement\n): AppNotification => {\n return {\n ...defaultErrorNotification,\n text: getMessageFromError(text),\n title,\n id: uuidv4(),\n traceId,\n component,\n timestamp: Date.now(),\n showing: true,\n };\n};\n\nexport const createWarningNotification = (title: string, text = '', traceId?: string): AppNotification => ({\n ...defaultWarningNotification,\n title,\n text,\n traceId,\n id: uuidv4(),\n timestamp: Date.now(),\n showing: true,\n});\n\n/** Hook for showing toast notifications with varying severity (success, warning error).\n * @example\n * const notifyApp = useAppNotification();\n * notifyApp.success('Success!', 'Some additional text');\n * notifyApp.warning('Warning!');\n * notifyApp.error('Error!');\n */\nexport function useAppNotification() {\n const dispatch = useDispatch();\n return useMemo(\n () => ({\n success: (title: string, text = '') => {\n dispatch(notifyApp(createSuccessNotification(title, text)));\n },\n warning: (title: string, text = '', traceId?: string) => {\n dispatch(notifyApp(createWarningNotification(title, text, traceId)));\n },\n error: (title: string, text = '', traceId?: string) => {\n dispatch(notifyApp(createErrorNotification(title, text, traceId)));\n },\n }),\n [dispatch]\n );\n}\n","import { getDataSourceSrv } from '@grafana/runtime';\n\nimport { RichHistoryQuery } from '../../types';\n\nimport { RichHistoryLocalStorageDTO } from './RichHistoryLocalStorage';\n\nexport const fromDTO = (dto: RichHistoryLocalStorageDTO): RichHistoryQuery => {\n const datasource = getDataSourceSrv().getInstanceSettings(dto.datasourceName);\n return {\n id: dto.ts.toString(),\n createdAt: dto.ts,\n datasourceName: dto.datasourceName,\n datasourceUid: datasource?.uid || '', // will be show on the list as coming from a removed data source\n starred: dto.starred,\n comment: dto.comment,\n queries: dto.queries,\n };\n};\n\nexport const toDTO = (richHistoryQuery: RichHistoryQuery): RichHistoryLocalStorageDTO => {\n const datasource = getDataSourceSrv().getInstanceSettings({ uid: richHistoryQuery.datasourceUid });\n\n if (!datasource) {\n throw new Error('Datasource not found.');\n }\n\n return {\n ts: richHistoryQuery.createdAt,\n datasourceName: richHistoryQuery.datasourceName,\n starred: richHistoryQuery.starred,\n comment: richHistoryQuery.comment,\n queries: richHistoryQuery.queries,\n };\n};\n","import { find, isEqual, omit } from 'lodash';\n\nimport { DataQuery, SelectableValue } from '@grafana/data';\nimport { RichHistorySearchFilters, RichHistorySettings } from 'app/core/utils/richHistory';\n\nimport { RichHistoryQuery } from '../../types';\nimport store from '../store';\n\nimport RichHistoryStorage, { RichHistoryServiceError, RichHistoryStorageWarning } from './RichHistoryStorage';\nimport { fromDTO, toDTO } from './localStorageConverter';\nimport {\n createRetentionPeriodBoundary,\n filterAndSortQueries,\n RICH_HISTORY_SETTING_KEYS,\n} from './richHistoryLocalStorageUtils';\n\nexport const RICH_HISTORY_KEY = 'grafana.explore.richHistory';\nexport const MAX_HISTORY_ITEMS = 10000;\n\nexport type RichHistoryLocalStorageDTO = {\n // works as an unique identifier\n ts: number;\n datasourceName: string;\n starred: boolean;\n comment: string;\n queries: DataQuery[];\n};\n\n/**\n * Local storage implementation for Rich History. It keeps all entries in browser's local storage.\n */\nexport default class RichHistoryLocalStorage implements RichHistoryStorage {\n /**\n * Return history entries based on provided filters, perform migration and clean up entries not matching retention policy.\n */\n async getRichHistory(filters: RichHistorySearchFilters) {\n const allQueries = getRichHistoryDTOs().map(fromDTO);\n const queries = filters.starred ? allQueries.filter((q) => q.starred === true) : allQueries;\n\n const richHistory = filterAndSortQueries(queries, filters.sortOrder, filters.datasourceFilters, filters.search, [\n filters.from,\n filters.to,\n ]);\n return { richHistory, total: richHistory.length };\n }\n\n async addToRichHistory(newRichHistoryQuery: Omit<RichHistoryQuery, 'id' | 'createdAt'>) {\n const ts = Date.now();\n const richHistoryQuery = {\n id: ts.toString(),\n createdAt: ts,\n ...newRichHistoryQuery,\n };\n\n const newRichHistoryQueryDTO = toDTO(richHistoryQuery);\n const currentRichHistoryDTOs = cleanUp(getRichHistoryDTOs());\n\n /* Compare queries of a new query and last saved queries. If they are the same, (except selected properties,\n * which can be different) don't save it in rich history.\n */\n const newQueriesToCompare = newRichHistoryQueryDTO.queries.map((q) => omit(q, ['key', 'refId']));\n const lastQueriesToCompare =\n currentRichHistoryDTOs.length > 0 &&\n currentRichHistoryDTOs[0].queries.map((q) => {\n return omit(q, ['key', 'refId']);\n });\n\n if (isEqual(newQueriesToCompare, lastQueriesToCompare)) {\n const error = new Error('Entry already exists');\n error.name = RichHistoryServiceError.DuplicatedEntry;\n throw error;\n }\n\n const { queriesToKeep, limitExceeded } = checkLimits(currentRichHistoryDTOs);\n\n const updatedHistory: RichHistoryLocalStorageDTO[] = [newRichHistoryQueryDTO, ...queriesToKeep];\n\n try {\n store.setObject(RICH_HISTORY_KEY, updatedHistory);\n } catch (error) {\n if (error instanceof Error && error.name === 'QuotaExceededError') {\n throwError(RichHistoryServiceError.StorageFull, `Saving rich history failed: ${error.message}`);\n } else {\n throw error;\n }\n }\n\n if (limitExceeded) {\n return {\n warning: {\n type: RichHistoryStorageWarning.LimitExceeded,\n message: `Query history reached the limit of ${MAX_HISTORY_ITEMS}. Old, not-starred items have been removed.`,\n },\n richHistoryQuery,\n };\n }\n\n return { richHistoryQuery };\n }\n\n async deleteAll() {\n store.delete(RICH_HISTORY_KEY);\n }\n\n async deleteRichHistory(id: string) {\n const ts = parseInt(id, 10);\n const richHistory: RichHistoryLocalStorageDTO[] = store.getObject(RICH_HISTORY_KEY, []);\n const updatedHistory = richHistory.filter((query) => query.ts !== ts);\n store.setObject(RICH_HISTORY_KEY, updatedHistory);\n }\n\n async updateStarred(id: string, starred: boolean) {\n return updateRichHistory(id, (richHistoryDTO) => (richHistoryDTO.starred = starred));\n }\n\n async updateComment(id: string, comment: string) {\n return updateRichHistory(id, (richHistoryDTO) => (richHistoryDTO.comment = comment));\n }\n\n async getSettings() {\n return {\n activeDatasourceOnly: store.getObject(RICH_HISTORY_SETTING_KEYS.activeDatasourceOnly, false),\n retentionPeriod: store.getObject(RICH_HISTORY_SETTING_KEYS.retentionPeriod, 7),\n starredTabAsFirstTab: store.getBool(RICH_HISTORY_SETTING_KEYS.starredTabAsFirstTab, false),\n lastUsedDatasourceFilters: store\n .getObject(RICH_HISTORY_SETTING_KEYS.datasourceFilters, [])\n .map((selectableValue: SelectableValue) => selectableValue.value),\n };\n }\n\n async updateSettings(settings: RichHistorySettings) {\n store.set(RICH_HISTORY_SETTING_KEYS.activeDatasourceOnly, settings.activeDatasourceOnly);\n store.set(RICH_HISTORY_SETTING_KEYS.retentionPeriod, settings.retentionPeriod);\n store.set(RICH_HISTORY_SETTING_KEYS.starredTabAsFirstTab, settings.starredTabAsFirstTab);\n store.setObject(\n RICH_HISTORY_SETTING_KEYS.datasourceFilters,\n (settings.lastUsedDatasourceFilters || []).map((datasourceName: string) => {\n return { value: datasourceName };\n })\n );\n }\n}\n\nfunction updateRichHistory(\n id: string,\n updateCallback: (richHistoryDTO: RichHistoryLocalStorageDTO) => void\n): RichHistoryQuery {\n const ts = parseInt(id, 10);\n const richHistoryDTOs: RichHistoryLocalStorageDTO[] = store.getObject(RICH_HISTORY_KEY, []);\n const richHistoryDTO = find(richHistoryDTOs, { ts });\n\n if (!richHistoryDTO) {\n throw new Error('Rich history item not found.');\n }\n\n updateCallback(richHistoryDTO);\n\n store.setObject(RICH_HISTORY_KEY, richHistoryDTOs);\n return fromDTO(richHistoryDTO);\n}\n\n/**\n * Removes entries that do not match retention policy criteria.\n */\nfunction cleanUp(richHistory: RichHistoryLocalStorageDTO[]): RichHistoryLocalStorageDTO[] {\n const retentionPeriod: number = store.getObject(RICH_HISTORY_SETTING_KEYS.retentionPeriod, 7);\n const retentionPeriodLastTs = createRetentionPeriodBoundary(retentionPeriod, false);\n\n /* Keep only queries, that are within the selected retention period or that are starred.\n * If no queries, initialize with empty array\n */\n return richHistory.filter((q) => q.ts > retentionPeriodLastTs || q.starred === true) || [];\n}\n\n/**\n * Ensures the entry can be added. Throws an error if current limit has been hit.\n * Returns queries that should be saved back giving space for one extra query.\n */\nfunction checkLimits(queriesToKeep: RichHistoryLocalStorageDTO[]): {\n queriesToKeep: RichHistoryLocalStorageDTO[];\n limitExceeded: boolean;\n} {\n // remove oldest non-starred items to give space for the recent query\n let limitExceeded = false;\n let current = queriesToKeep.length - 1;\n while (current >= 0 && queriesToKeep.length >= MAX_HISTORY_ITEMS) {\n if (!queriesToKeep[current].starred) {\n queriesToKeep.splice(current, 1);\n limitExceeded = true;\n }\n current--;\n }\n\n return { queriesToKeep, limitExceeded };\n}\n\nfunction getRichHistoryDTOs(): RichHistoryLocalStorageDTO[] {\n const richHistory: RichHistoryLocalStorageDTO[] = store.getObject(RICH_HISTORY_KEY, []);\n return migrateRichHistory(richHistory);\n}\n\nfunction migrateRichHistory(richHistory: RichHistoryLocalStorageDTO[]): RichHistoryLocalStorageDTO[] {\n const transformedRichHistory = richHistory.map((query) => {\n const transformedQueries: DataQuery[] = query.queries.map((q, index) => createDataQuery(query, q, index));\n return { ...query, queries: transformedQueries };\n });\n\n return transformedRichHistory;\n}\n\nfunction createDataQuery(query: RichHistoryLocalStorageDTO, individualQuery: DataQuery | string, index: number) {\n const letters = 'ABCDEFGHIJKLMNOPQRSTUVXYZ';\n if (typeof individualQuery === 'object') {\n // the current format\n return individualQuery;\n } else if (isParsable(individualQuery)) {\n // ElasticSearch (maybe other datasoures too) before grafana7\n return JSON.parse(individualQuery);\n }\n // prometehus (maybe other datasources too) before grafana7\n return { expr: individualQuery, refId: letters[index] };\n}\n\nfunction isParsable(string: string) {\n try {\n JSON.parse(string);\n } catch (e) {\n return false;\n }\n return true;\n}\n\nfunction throwError(name: string, message: string) {\n const error = new Error(message);\n error.name = name;\n throw error;\n}\n","import { getDataSourceSrv } from '@grafana/runtime';\n\nimport { RichHistoryQuery } from '../../types';\n\nimport { RichHistoryRemoteStorageDTO } from './RichHistoryRemoteStorage';\n\nexport const fromDTO = (dto: RichHistoryRemoteStorageDTO): RichHistoryQuery => {\n const datasource = getDataSourceSrv().getInstanceSettings({ uid: dto.datasourceUid });\n\n return {\n id: dto.uid,\n createdAt: dto.createdAt * 1000,\n datasourceName: datasource?.name || '', // will be show on the list as coming from a removed data source\n datasourceUid: dto.datasourceUid,\n starred: dto.starred,\n comment: dto.comment,\n queries: dto.queries,\n };\n};\n\nexport const toDTO = (richHistory: RichHistoryQuery): RichHistoryRemoteStorageDTO => {\n return {\n uid: richHistory.id,\n createdAt: Math.floor(richHistory.createdAt / 1000),\n datasourceUid: richHistory.datasourceUid,\n starred: richHistory.starred,\n comment: richHistory.comment,\n queries: richHistory.queries,\n };\n};\n","import { lastValueFrom } from 'rxjs';\n\nimport { getBackendSrv, getDataSourceSrv } from '@grafana/runtime';\nimport { RichHistoryQuery } from 'app/types/explore';\n\nimport { DataQuery } from '../../../../packages/grafana-data';\nimport { PreferencesService } from '../services/PreferencesService';\nimport { RichHistorySearchFilters, RichHistorySettings, SortOrder } from '../utils/richHistoryTypes';\n\nimport RichHistoryStorage, { RichHistoryStorageWarningDetails } from './RichHistoryStorage';\nimport { fromDTO, toDTO } from './remoteStorageConverter';\n\nexport type RichHistoryRemoteStorageDTO = {\n uid: string;\n createdAt: number;\n datasourceUid: string;\n starred: boolean;\n comment: string;\n queries: DataQuery[];\n};\n\ntype RichHistoryRemoteStorageMigrationDTO = {\n datasourceUid: string;\n queries: DataQuery[];\n createdAt: number;\n starred: boolean;\n comment: string;\n};\n\ntype RichHistoryRemoteStorageMigrationPayloadDTO = {\n queries: RichHistoryRemoteStorageMigrationDTO[];\n};\n\ntype RichHistoryRemoteStorageResultsPayloadDTO = {\n result: {\n queryHistory: RichHistoryRemoteStorageDTO[];\n totalCount: number;\n };\n};\n\ntype RichHistoryRemoteStorageUpdatePayloadDTO = {\n result: RichHistoryRemoteStorageDTO;\n};\n\nexport default class RichHistoryRemoteStorage implements RichHistoryStorage {\n private readonly preferenceService: PreferencesService;\n\n constructor() {\n this.preferenceService = new PreferencesService('user');\n }\n\n async addToRichHistory(\n newRichHistoryQuery: Omit<RichHistoryQuery, 'id' | 'createdAt'>\n ): Promise<{ warning?: RichHistoryStorageWarningDetails; richHistoryQuery: RichHistoryQuery }> {\n const { result } = await getBackendSrv().post(`/api/query-history`, {\n dataSourceUid: newRichHistoryQuery.datasourceUid,\n queries: newRichHistoryQuery.queries,\n });\n return {\n richHistoryQuery: fromDTO(result),\n };\n }\n\n async deleteAll(): Promise<void> {\n throw new Error('not supported');\n }\n\n async deleteRichHistory(id: string): Promise<void> {\n getBackendSrv().delete(`/api/query-history/${id}`);\n }\n\n async getRichHistory(filters: RichHistorySearchFilters) {\n const params = buildQueryParams(filters);\n\n const queryHistory = await lastValueFrom(\n getBackendSrv().fetch({\n method: 'GET',\n url: `/api/query-history?${params}`,\n // to ensure any previous requests are cancelled\n requestId: 'query-history-get-all',\n })\n );\n\n const data = queryHistory.data as RichHistoryRemoteStorageResultsPayloadDTO;\n const richHistory = (data.result.queryHistory || []).map(fromDTO);\n const total = data.result.totalCount || 0;\n\n return { richHistory, total };\n }\n\n async getSettings(): Promise<RichHistorySettings> {\n const preferences = await this.preferenceService.load();\n return {\n activeDatasourceOnly: false,\n lastUsedDatasourceFilters: undefined,\n retentionPeriod: 14,\n starredTabAsFirstTab: preferences.queryHistory?.homeTab === 'starred',\n };\n }\n\n async updateComment(id: string, comment: string | undefined): Promise<RichHistoryQuery> {\n const dto: RichHistoryRemoteStorageUpdatePayloadDTO = await getBackendSrv().patch(`/api/query-history/${id}`, {\n comment: comment,\n });\n return fromDTO(dto.result);\n }\n\n updateSettings(settings: RichHistorySettings): Promise<void> {\n return this.preferenceService.patch({\n queryHistory: {\n homeTab: settings.starredTabAsFirstTab ? 'starred' : 'query',\n },\n });\n }\n\n async updateStarred(id: string, starred: boolean): Promise<RichHistoryQuery> {\n let dto: RichHistoryRemoteStorageUpdatePayloadDTO;\n if (starred) {\n dto = await getBackendSrv().post(`/api/query-history/star/${id}`);\n } else {\n dto = await getBackendSrv().delete(`/api/query-history/star/${id}`);\n }\n return fromDTO(dto.result);\n }\n\n /**\n * @internal Used only for migration purposes. Will be removed in future.\n */\n async migrate(richHistory: RichHistoryQuery[]) {\n await lastValueFrom(\n getBackendSrv().fetch({\n url: '/api/query-history/migrate',\n method: 'POST',\n data: { queries: richHistory.map(toDTO) } as RichHistoryRemoteStorageMigrationPayloadDTO,\n showSuccessAlert: false,\n })\n );\n }\n}\n\nfunction buildQueryParams(filters: RichHistorySearchFilters): string {\n let params = `${filters.datasourceFilters\n .map((datasourceName) => {\n const uid = getDataSourceSrv().getInstanceSettings(datasourceName)!.uid;\n return `datasourceUid=${encodeURIComponent(uid)}`;\n })\n .join('&')}`;\n if (filters.search) {\n params = params + `&searchString=${filters.search}`;\n }\n if (filters.sortOrder) {\n params = params + `&sort=${filters.sortOrder === SortOrder.Ascending ? 'time-asc' : 'time-desc'}`;\n }\n const relativeFrom = filters.from === 0 ? 'now' : `now-${filters.from}d`;\n const relativeTo = filters.to === 0 ? 'now' : `now-${filters.to}d`;\n // TODO: Unify: remote storage from/to params are swapped comparing to frontend and local storage filters\n params = params + `&to=${relativeFrom}`;\n params = params + `&from=${relativeTo}`;\n params = params + `&limit=100`;\n params = params + `&page=${filters.page || 1}`;\n if (filters.starred) {\n params = params + `&onlyStarred=${filters.starred}`;\n }\n return params;\n}\n","import { RichHistorySearchFilters, RichHistorySettings } from 'app/core/utils/richHistory';\n\nimport { RichHistoryQuery } from '../../types';\n\n/**\n * Errors are used when the operation on Rich History was not successful.\n */\nexport enum RichHistoryServiceError {\n StorageFull = 'StorageFull',\n DuplicatedEntry = 'DuplicatedEntry',\n}\n\n/**\n * Warnings are used when an entry has been added but there are some side effects that user should be informed about.\n */\nexport enum RichHistoryStorageWarning {\n /**\n * Returned when an entry was successfully added but maximum items limit has been reached and old entries have been removed.\n */\n LimitExceeded = 'LimitExceeded',\n}\n\n/**\n * Detailed information about the warning that can be shown to the user\n */\nexport type RichHistoryStorageWarningDetails = {\n type: RichHistoryStorageWarning;\n message: string;\n};\n\nexport type RichHistoryResults = { richHistory: RichHistoryQuery[]; total?: number };\n\n/**\n * @internal\n * @alpha\n */\nexport default interface RichHistoryStorage {\n getRichHistory(filters: RichHistorySearchFilters): Promise<RichHistoryResults>;\n\n /**\n * Creates new RichHistoryQuery, returns object with unique id and created date\n */\n addToRichHistory(\n newRichHistoryQuery: Omit<RichHistoryQuery, 'id' | 'createdAt'>\n ): Promise<{ warning?: RichHistoryStorageWarningDetails; richHistoryQuery: RichHistoryQuery }>;\n\n deleteAll(): Promise<void>;\n deleteRichHistory(id: string): Promise<void>;\n updateStarred(id: string, starred: boolean): Promise<RichHistoryQuery>;\n updateComment(id: string, comment: string | undefined): Promise<RichHistoryQuery>;\n\n getSettings(): Promise<RichHistorySettings>;\n updateSettings(settings: RichHistorySettings): Promise<void>;\n}\n","import { omit } from 'lodash';\n\nimport { RichHistoryQuery } from '../../types';\nimport { SortOrder } from '../utils/richHistoryTypes';\n\n/**\n * Temporary place for local storage specific items that are still in use in richHistory.ts\n *\n * Should be migrated to RichHistoryLocalStorage.ts\n */\n\nexport function filterAndSortQueries(\n queries: RichHistoryQuery[],\n sortOrder: SortOrder,\n listOfDatasourceFilters: string[],\n searchFilter: string,\n timeFilter?: [number, number]\n) {\n const filteredQueriesByDs = filterQueriesByDataSource(queries, listOfDatasourceFilters);\n const filteredQueriesByDsAndSearchFilter = filterQueriesBySearchFilter(filteredQueriesByDs, searchFilter);\n const filteredQueriesToBeSorted = timeFilter\n ? filterQueriesByTime(filteredQueriesByDsAndSearchFilter, timeFilter)\n : filteredQueriesByDsAndSearchFilter;\n\n return sortQueries(filteredQueriesToBeSorted, sortOrder);\n}\n\nexport const createRetentionPeriodBoundary = (days: number, isLastTs: boolean) => {\n const today = new Date();\n const date = new Date(today.setDate(today.getDate() - days));\n /*\n * As a retention period boundaries, we consider:\n * - The last timestamp equals to the 24:00 of the last day of retention\n * - The first timestamp that equals to the 00:00 of the first day of retention\n */\n const boundary = isLastTs ? date.setHours(24, 0, 0, 0) : date.setHours(0, 0, 0, 0);\n return boundary;\n};\n\nfunction filterQueriesByTime(queries: RichHistoryQuery[], timeFilter: [number, number]) {\n const filter1 = createRetentionPeriodBoundary(timeFilter[0], true); // probably the vars should have a different name\n const filter2 = createRetentionPeriodBoundary(timeFilter[1], false);\n return queries.filter((q) => q.createdAt < filter1 && q.createdAt > filter2);\n}\n\nfunction filterQueriesByDataSource(queries: RichHistoryQuery[], listOfDatasourceFilters: string[]) {\n return listOfDatasourceFilters.length > 0\n ? queries.filter((q) => listOfDatasourceFilters.includes(q.datasourceName))\n : queries;\n}\n\nfunction filterQueriesBySearchFilter(queries: RichHistoryQuery[], searchFilter: string) {\n return queries.filter((query) => {\n if (query.comment.includes(searchFilter)) {\n return true;\n }\n\n const listOfMatchingQueries = query.queries.filter((query) =>\n // Remove fields in which we don't want to be searching\n Object.values(omit(query, ['datasource', 'key', 'refId', 'hide', 'queryType'])).some((value: any) =>\n value?.toString().includes(searchFilter)\n )\n );\n\n return listOfMatchingQueries.length > 0;\n });\n}\n\nexport const sortQueries = (array: RichHistoryQuery[], sortOrder: SortOrder) => {\n let sortFunc;\n\n if (sortOrder === SortOrder.Ascending) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) =>\n a.createdAt < b.createdAt ? -1 : a.createdAt > b.createdAt ? 1 : 0;\n }\n if (sortOrder === SortOrder.Descending) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) =>\n a.createdAt < b.createdAt ? 1 : a.createdAt > b.createdAt ? -1 : 0;\n }\n\n if (sortOrder === SortOrder.DatasourceZA) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) =>\n a.datasourceName < b.datasourceName ? -1 : a.datasourceName > b.datasourceName ? 1 : 0;\n }\n\n if (sortOrder === SortOrder.DatasourceAZ) {\n sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) =>\n a.datasourceName < b.datasourceName ? 1 : a.datasourceName > b.datasourceName ? -1 : 0;\n }\n\n return array.sort(sortFunc);\n};\n\nexport const RICH_HISTORY_SETTING_KEYS = {\n retentionPeriod: 'grafana.explore.richHistory.retentionPeriod',\n starredTabAsFirstTab: 'grafana.explore.richHistory.starredTabAsFirstTab',\n activeDatasourceOnly: 'grafana.explore.richHistory.activeDatasourceOnly',\n datasourceFilters: 'grafana.explore.richHistory.datasourceFilters',\n migrated: 'grafana.explore.richHistory.migrated',\n};\n","import { config } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/core';\n\nimport { SortOrder } from '../utils/richHistoryTypes';\n\nimport RichHistoryLocalStorage from './RichHistoryLocalStorage';\nimport RichHistoryRemoteStorage from './RichHistoryRemoteStorage';\nimport RichHistoryStorage from './RichHistoryStorage';\n\nconst richHistoryLocalStorage = new RichHistoryLocalStorage();\nconst richHistoryRemoteStorage = new RichHistoryRemoteStorage();\n\nexport const getRichHistoryStorage = (): RichHistoryStorage => {\n return config.queryHistoryEnabled ? richHistoryRemoteStorage : richHistoryLocalStorage;\n};\n\ninterface RichHistorySupportedFeatures {\n availableFilters: SortOrder[];\n lastUsedDataSourcesAvailable: boolean;\n clearHistory: boolean;\n onlyActiveDataSource: boolean;\n changeRetention: boolean;\n queryHistoryAvailable: boolean;\n}\n\nexport const supportedFeatures = (): RichHistorySupportedFeatures => {\n return config.queryHistoryEnabled\n ? {\n availableFilters: [SortOrder.Descending, SortOrder.Ascending],\n lastUsedDataSourcesAvailable: false,\n clearHistory: false,\n onlyActiveDataSource: false,\n changeRetention: false,\n queryHistoryAvailable: contextSrv.isSignedIn,\n }\n : {\n availableFilters: [SortOrder.Descending, SortOrder.Ascending, SortOrder.DatasourceAZ, SortOrder.DatasourceZA],\n lastUsedDataSourcesAvailable: true,\n clearHistory: true,\n onlyActiveDataSource: true,\n changeRetention: true,\n queryHistoryAvailable: true,\n };\n};\n","import { useCallback, useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { UrlQueryMap } from '@grafana/data';\nimport { locationSearchToObject, locationService } from '@grafana/runtime';\n\nexport function useQueryParams(): [UrlQueryMap, (values: UrlQueryMap, replace?: boolean) => void] {\n const { search } = useLocation();\n const queryParams = useMemo(() => locationSearchToObject(search || ''), [search]);\n const update = useCallback((values: UrlQueryMap, replace?: boolean) => locationService.partial(values, replace), []);\n return [queryParams, update];\n}\n","type LocaleIdentifier = `${string}-${string}`;\n\nexport const ENGLISH_US: LocaleIdentifier = 'en-US';\nexport const FRENCH_FRANCE: LocaleIdentifier = 'fr-FR';\nexport const SPANISH_SPAIN: LocaleIdentifier = 'es-ES';\n\nexport const DEFAULT_LOCALE: LocaleIdentifier = ENGLISH_US;\n\nexport const VALID_LOCALES: LocaleIdentifier[] = [ENGLISH_US, FRENCH_FRANCE, SPANISH_SPAIN];\n","import { size } from 'lodash';\nimport { Observable, from, isObservable } from 'rxjs';\n\nimport {\n AbsoluteTimeRange,\n DataFrame,\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceJsonData,\n dateTimeFormat,\n dateTimeFormatTimeAgo,\n FieldCache,\n FieldColorModeId,\n FieldConfig,\n FieldType,\n FieldWithIndex,\n findCommonLabels,\n findUniqueLabels,\n getLogLevel,\n getLogLevelFromKey,\n Labels,\n LoadingState,\n LogLevel,\n LogRowModel,\n LogsDedupStrategy,\n LogsMetaItem,\n LogsMetaKind,\n LogsModel,\n MutableDataFrame,\n rangeUtil,\n ScopedVars,\n sortInAscendingOrder,\n textUtil,\n TimeRange,\n toDataFrame,\n toUtc,\n} from '@grafana/data';\nimport { SIPrefix } from '@grafana/data/src/valueFormats/symbolFormatters';\nimport { BarAlignment, GraphDrawStyle, StackingMode } from '@grafana/schema';\nimport { ansicolor, colors } from '@grafana/ui';\nimport { getThemeColor } from 'app/core/utils/colors';\n\nexport const LIMIT_LABEL = 'Line limit';\nexport const COMMON_LABELS = 'Common labels';\n\nexport const LogLevelColor = {\n [LogLevel.critical]: colors[7],\n [LogLevel.warning]: colors[1],\n [LogLevel.error]: colors[4],\n [LogLevel.info]: colors[0],\n [LogLevel.debug]: colors[5],\n [LogLevel.trace]: colors[2],\n [LogLevel.unknown]: getThemeColor('#8e8e8e', '#bdc4cd'),\n};\n\nconst MILLISECOND = 1;\nconst SECOND = 1000 * MILLISECOND;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\n\nconst isoDateRegexp = /\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-6]\\d[,\\.]\\d+([+-][0-2]\\d:[0-5]\\d|Z)/g;\nfunction isDuplicateRow(row: LogRowModel, other: LogRowModel, strategy?: LogsDedupStrategy): boolean {\n switch (strategy) {\n case LogsDedupStrategy.exact:\n // Exact still strips dates\n return row.entry.replace(isoDateRegexp, '') === other.entry.replace(isoDateRegexp, '');\n\n case LogsDedupStrategy.numbers:\n return row.entry.replace(/\\d/g, '') === other.entry.replace(/\\d/g, '');\n\n case LogsDedupStrategy.signature:\n return row.entry.replace(/\\w/g, '') === other.entry.replace(/\\w/g, '');\n\n default:\n return false;\n }\n}\n\nexport function dedupLogRows(rows: LogRowModel[], strategy?: LogsDedupStrategy): LogRowModel[] {\n if (strategy === LogsDedupStrategy.none) {\n return rows;\n }\n\n return rows.reduce((result: LogRowModel[], row: LogRowModel, index) => {\n const rowCopy = { ...row };\n const previous = result[result.length - 1];\n if (index > 0 && isDuplicateRow(row, previous, strategy)) {\n previous.duplicates!++;\n } else {\n rowCopy.duplicates = 0;\n result.push(rowCopy);\n }\n return result;\n }, []);\n}\n\nexport function filterLogLevels(logRows: LogRowModel[], hiddenLogLevels: Set<LogLevel>): LogRowModel[] {\n if (hiddenLogLevels.size === 0) {\n return logRows;\n }\n\n return logRows.filter((row: LogRowModel) => {\n return !hiddenLogLevels.has(row.logLevel);\n });\n}\n\ninterface Series {\n lastTs: number | null;\n datapoints: Array<[number, number]>;\n target: LogLevel;\n color: string;\n}\n\nexport function makeDataFramesForLogs(sortedRows: LogRowModel[], bucketSize: number): DataFrame[] {\n // currently interval is rangeMs / resolution, which is too low for showing series as bars.\n // Should be solved higher up the chain when executing queries & interval calculated and not here but this is a temporary fix.\n\n // Graph time series by log level\n const seriesByLevel: Record<string, Series> = {};\n const seriesList: Series[] = [];\n\n for (const row of sortedRows) {\n let series = seriesByLevel[row.logLevel];\n\n if (!series) {\n seriesByLevel[row.logLevel] = series = {\n lastTs: null,\n datapoints: [],\n target: row.logLevel,\n color: LogLevelColor[row.logLevel],\n };\n\n seriesList.push(series);\n }\n\n // align time to bucket size - used Math.floor for calculation as time of the bucket\n // must be in the past (before Date.now()) to be displayed on the graph\n const time = Math.floor(row.timeEpochMs / bucketSize) * bucketSize;\n\n // Entry for time\n if (time === series.lastTs) {\n series.datapoints[series.datapoints.length - 1][0]++;\n } else {\n series.datapoints.push([1, time]);\n series.lastTs = time;\n }\n\n // add zero to other levels to aid stacking so each level series has same number of points\n for (const other of seriesList) {\n if (other !== series && other.lastTs !== time) {\n other.datapoints.push([0, time]);\n other.lastTs = time;\n }\n }\n }\n\n return seriesList.map((series, i) => {\n series.datapoints.sort((a: number[], b: number[]) => a[1] - b[1]);\n\n const data = toDataFrame(series);\n const fieldCache = new FieldCache(data);\n\n const valueField = fieldCache.getFirstFieldOfType(FieldType.number)!;\n\n data.fields[valueField.index].config.min = 0;\n data.fields[valueField.index].config.decimals = 0;\n data.fields[valueField.index].config.color = {\n mode: FieldColorModeId.Fixed,\n fixedColor: series.color,\n };\n\n data.fields[valueField.index].config.custom = {\n drawStyle: GraphDrawStyle.Bars,\n barAlignment: BarAlignment.Center,\n barWidthFactor: 0.9,\n barMaxWidth: 5,\n lineColor: series.color,\n pointColor: series.color,\n fillColor: series.color,\n lineWidth: 0,\n fillOpacity: 100,\n stacking: {\n mode: StackingMode.Normal,\n group: 'A',\n },\n };\n\n return data;\n });\n}\n\nfunction isLogsData(series: DataFrame) {\n return series.fields.some((f) => f.type === FieldType.time) && series.fields.some((f) => f.type === FieldType.string);\n}\n\n/**\n * Convert dataFrame into LogsModel which consists of creating separate array of log rows and metrics series. Metrics\n * series can be either already included in the dataFrame or will be computed from the log rows.\n * @param dataFrame\n * @param intervalMs In case there are no metrics series, we use this for computing it from log rows.\n */\nexport function dataFrameToLogsModel(\n dataFrame: DataFrame[],\n intervalMs: number | undefined,\n absoluteRange?: AbsoluteTimeRange,\n queries?: DataQuery[]\n): LogsModel {\n const { logSeries } = separateLogsAndMetrics(dataFrame);\n const logsModel = logSeriesToLogsModel(logSeries);\n\n if (logsModel) {\n // Create histogram metrics from logs using the interval as bucket size for the line count\n if (intervalMs && logsModel.rows.length > 0) {\n const sortedRows = logsModel.rows.sort(sortInAscendingOrder);\n const { visibleRange, bucketSize, visibleRangeMs, requestedRangeMs } = getSeriesProperties(\n sortedRows,\n intervalMs,\n absoluteRange\n );\n logsModel.visibleRange = visibleRange;\n logsModel.series = makeDataFramesForLogs(sortedRows, bucketSize);\n\n if (logsModel.meta) {\n logsModel.meta = adjustMetaInfo(logsModel, visibleRangeMs, requestedRangeMs);\n }\n } else {\n logsModel.series = [];\n }\n logsModel.queries = queries;\n return logsModel;\n }\n\n return {\n hasUniqueLabels: false,\n rows: [],\n meta: [],\n series: [],\n queries,\n };\n}\n\n/**\n * Returns a clamped time range and interval based on the visible logs and the given range.\n *\n * @param sortedRows Log rows from the query response\n * @param intervalMs Dynamic data interval based on available pixel width\n * @param absoluteRange Requested time range\n * @param pxPerBar Default: 20, buckets will be rendered as bars, assuming 10px per histogram bar plus some free space around it\n */\nexport function getSeriesProperties(\n sortedRows: LogRowModel[],\n intervalMs: number,\n absoluteRange?: AbsoluteTimeRange,\n pxPerBar = 20,\n minimumBucketSize = 1000\n) {\n let visibleRange = absoluteRange;\n let resolutionIntervalMs = intervalMs;\n let bucketSize = Math.max(resolutionIntervalMs * pxPerBar, minimumBucketSize);\n let visibleRangeMs;\n let requestedRangeMs;\n // Clamp time range to visible logs otherwise big parts of the graph might look empty\n if (absoluteRange) {\n const earliestTsLogs = sortedRows[0].timeEpochMs;\n\n requestedRangeMs = absoluteRange.to - absoluteRange.from;\n visibleRangeMs = absoluteRange.to - earliestTsLogs;\n\n if (visibleRangeMs > 0) {\n // Adjust interval bucket size for potentially shorter visible range\n const clampingFactor = visibleRangeMs / requestedRangeMs;\n resolutionIntervalMs *= clampingFactor;\n // Minimum bucketsize of 1s for nicer graphing\n bucketSize = Math.max(Math.ceil(resolutionIntervalMs * pxPerBar), minimumBucketSize);\n // makeSeriesForLogs() aligns dataspoints with time buckets, so we do the same here to not cut off data\n const adjustedEarliest = Math.floor(earliestTsLogs / bucketSize) * bucketSize;\n visibleRange = { from: adjustedEarliest, to: absoluteRange.to };\n } else {\n // We use visibleRangeMs to calculate range coverage of received logs. However, some data sources are rounding up range in requests. This means that received logs\n // can (in edge cases) be outside of the requested range and visibleRangeMs < 0. In that case, we want to change visibleRangeMs to be 1 so we can calculate coverage.\n visibleRangeMs = 1;\n }\n }\n return { bucketSize, visibleRange, visibleRangeMs, requestedRangeMs };\n}\n\nfunction separateLogsAndMetrics(dataFrames: DataFrame[]) {\n const metricSeries: DataFrame[] = [];\n const logSeries: DataFrame[] = [];\n\n for (const dataFrame of dataFrames) {\n // We want to show meta stats even if no result was returned. That's why we are pushing also data frames with no fields.\n if (isLogsData(dataFrame) || !dataFrame.fields.length) {\n logSeries.push(dataFrame);\n continue;\n }\n\n if (dataFrame.length > 0) {\n metricSeries.push(dataFrame);\n }\n }\n\n return { logSeries, metricSeries };\n}\n\ninterface LogFields {\n series: DataFrame;\n\n timeField: FieldWithIndex;\n stringField: FieldWithIndex;\n labelsField?: FieldWithIndex;\n timeNanosecondField?: FieldWithIndex;\n logLevelField?: FieldWithIndex;\n idField?: FieldWithIndex;\n}\n\nfunction getAllLabels(fields: LogFields): Labels[] {\n // there are two types of dataframes we handle:\n // 1. labels are in a separate field (more efficient when labels change by every log-row)\n // 2. labels are in in the string-field's `.labels` attribute\n\n const { stringField, labelsField } = fields;\n\n if (labelsField !== undefined) {\n return labelsField.values.toArray();\n } else {\n return [stringField.labels ?? {}];\n }\n}\n\nfunction getLabelsForFrameRow(fields: LogFields, index: number): Labels {\n // there are two types of dataframes we handle.\n // either labels-on-the-string-field, or labels-in-the-labels-field\n\n const { stringField, labelsField } = fields;\n\n if (labelsField !== undefined) {\n return labelsField.values.get(index);\n } else {\n return stringField.labels ?? {};\n }\n}\n\n/**\n * Converts dataFrames into LogsModel. This involves merging them into one list, sorting them and computing metadata\n * like common labels.\n */\nexport function logSeriesToLogsModel(logSeries: DataFrame[]): LogsModel | undefined {\n if (logSeries.length === 0) {\n return undefined;\n }\n const allLabels: Labels[][] = [];\n\n // Find the fields we care about and collect all labels\n let allSeries: LogFields[] = [];\n\n // We are sometimes passing data frames with no fields because we want to calculate correct meta stats.\n // Therefore we need to filter out series with no fields. These series are used only for meta stats calculation.\n const seriesWithFields = logSeries.filter((series) => series.fields.length);\n\n if (seriesWithFields.length) {\n seriesWithFields.forEach((series) => {\n const fieldCache = new FieldCache(series);\n const stringField = fieldCache.getFirstFieldOfType(FieldType.string);\n const timeField = fieldCache.getFirstFieldOfType(FieldType.time);\n // NOTE: this is experimental, please do not use in your code.\n // we will get this custom-frame-type into the \"real\" frame-type list soon,\n // but the name might change, so please do not use it until then.\n const labelsField =\n series.meta?.custom?.frameType === 'LabeledTimeValues' ? fieldCache.getFieldByName('labels') : undefined;\n\n if (stringField !== undefined && timeField !== undefined) {\n const info = {\n series,\n timeField,\n labelsField,\n timeNanosecondField: fieldCache.getFieldByName('tsNs'),\n stringField,\n logLevelField: fieldCache.getFieldByName('level'),\n idField: getIdField(fieldCache),\n };\n\n allSeries.push(info);\n\n const labels = getAllLabels(info);\n if (labels.length > 0) {\n allLabels.push(labels);\n }\n }\n });\n }\n\n const flatAllLabels = allLabels.flat();\n const commonLabels = flatAllLabels.length > 0 ? findCommonLabels(flatAllLabels) : {};\n\n const rows: LogRowModel[] = [];\n let hasUniqueLabels = false;\n\n for (const info of allSeries) {\n const { timeField, timeNanosecondField, stringField, logLevelField, idField, series } = info;\n\n for (let j = 0; j < series.length; j++) {\n const ts = timeField.values.get(j);\n const time = toUtc(ts);\n const tsNs = timeNanosecondField ? timeNanosecondField.values.get(j) : undefined;\n const timeEpochNs = tsNs ? tsNs : time.valueOf() + '000000';\n\n // In edge cases, this can be undefined. If undefined, we want to replace it with empty string.\n const messageValue: unknown = stringField.values.get(j) ?? '';\n // This should be string but sometimes isn't (eg elastic) because the dataFrame is not strongly typed.\n const message: string = typeof messageValue === 'string' ? messageValue : JSON.stringify(messageValue);\n\n const hasAnsi = textUtil.hasAnsiCodes(message);\n\n const hasUnescapedContent = !!message.match(/\\\\n|\\\\t|\\\\r/);\n\n const searchWords = series.meta && series.meta.searchWords ? series.meta.searchWords : [];\n const entry = hasAnsi ? ansicolor.strip(message) : message;\n\n const labels = getLabelsForFrameRow(info, j);\n const uniqueLabels = findUniqueLabels(labels, commonLabels);\n if (Object.keys(uniqueLabels).length > 0) {\n hasUniqueLabels = true;\n }\n\n let logLevel = LogLevel.unknown;\n const logLevelKey = (logLevelField && logLevelField.values.get(j)) || (labels && labels['level']);\n if (logLevelKey) {\n logLevel = getLogLevelFromKey(logLevelKey);\n } else {\n logLevel = getLogLevel(entry);\n }\n\n rows.push({\n entryFieldIndex: stringField.index,\n rowIndex: j,\n dataFrame: series,\n logLevel,\n timeFromNow: dateTimeFormatTimeAgo(ts),\n timeEpochMs: time.valueOf(),\n timeEpochNs,\n timeLocal: dateTimeFormat(ts, { timeZone: 'browser' }),\n timeUtc: dateTimeFormat(ts, { timeZone: 'utc' }),\n uniqueLabels,\n hasAnsi,\n hasUnescapedContent,\n searchWords,\n entry,\n raw: message,\n labels: labels || {},\n uid: idField ? idField.values.get(j) : j.toString(),\n });\n }\n }\n\n // Meta data to display in status\n const meta: LogsMetaItem[] = [];\n if (size(commonLabels) > 0) {\n meta.push({\n label: COMMON_LABELS,\n value: commonLabels,\n kind: LogsMetaKind.LabelsMap,\n });\n }\n\n const limits = logSeries.filter((series) => series.meta && series.meta.limit);\n const lastLimitPerRef = limits.reduce<Record<string, number>>((acc, elem) => {\n acc[elem.refId ?? ''] = elem.meta?.limit ?? 0;\n\n return acc;\n }, {});\n\n const limitValue = Object.values(lastLimitPerRef).reduce((acc, elem) => (acc += elem), 0);\n\n if (limitValue > 0) {\n meta.push({\n label: LIMIT_LABEL,\n value: limitValue,\n kind: LogsMetaKind.Number,\n });\n }\n\n let totalBytes = 0;\n const queriesVisited: { [refId: string]: boolean } = {};\n // To add just 1 error message\n let errorMetaAdded = false;\n\n for (const series of logSeries) {\n const totalBytesKey = series.meta?.custom?.lokiQueryStatKey;\n const { refId } = series; // Stats are per query, keeping track by refId\n\n if (!errorMetaAdded && series.meta?.custom?.error) {\n meta.push({\n label: '',\n value: series.meta?.custom.error,\n kind: LogsMetaKind.Error,\n });\n errorMetaAdded = true;\n }\n\n if (refId && !queriesVisited[refId]) {\n if (totalBytesKey && series.meta?.stats) {\n const byteStat = series.meta.stats.find((stat) => stat.displayName === totalBytesKey);\n if (byteStat) {\n totalBytes += byteStat.value;\n }\n }\n\n queriesVisited[refId] = true;\n }\n }\n\n if (totalBytes > 0) {\n const { text, suffix } = SIPrefix('B')(totalBytes);\n meta.push({\n label: 'Total bytes processed',\n value: `${text} ${suffix}`,\n kind: LogsMetaKind.String,\n });\n }\n\n return {\n hasUniqueLabels,\n meta,\n rows,\n };\n}\n\nfunction getIdField(fieldCache: FieldCache): FieldWithIndex | undefined {\n const idFieldNames = ['id'];\n for (const fieldName of idFieldNames) {\n const idField = fieldCache.getFieldByName(fieldName);\n if (idField) {\n return idField;\n }\n }\n return undefined;\n}\n\n// Used to add additional information to Line limit meta info\nfunction adjustMetaInfo(logsModel: LogsModel, visibleRangeMs?: number, requestedRangeMs?: number): LogsMetaItem[] {\n let logsModelMeta = [...logsModel.meta!];\n\n const limitIndex = logsModelMeta.findIndex((meta) => meta.label === LIMIT_LABEL);\n const limit = limitIndex >= 0 && logsModelMeta[limitIndex]?.value;\n\n if (limit && limit > 0) {\n let metaLimitValue;\n\n if (limit === logsModel.rows.length && visibleRangeMs && requestedRangeMs) {\n const coverage = ((visibleRangeMs / requestedRangeMs) * 100).toFixed(2);\n\n metaLimitValue = `${limit} reached, received logs cover ${coverage}% (${rangeUtil.msRangeToTimeString(\n visibleRangeMs\n )}) of your selected time range (${rangeUtil.msRangeToTimeString(requestedRangeMs)})`;\n } else {\n metaLimitValue = `${limit} (${logsModel.rows.length} returned)`;\n }\n\n logsModelMeta[limitIndex] = {\n label: LIMIT_LABEL,\n value: metaLimitValue,\n kind: LogsMetaKind.String,\n };\n }\n\n return logsModelMeta;\n}\n\n/**\n * Returns field configuration used to render logs volume bars\n */\nfunction getLogVolumeFieldConfig(level: LogLevel, oneLevelDetected: boolean) {\n const name = oneLevelDetected && level === LogLevel.unknown ? 'logs' : level;\n const color = LogLevelColor[level];\n return {\n displayNameFromDS: name,\n color: {\n mode: FieldColorModeId.Fixed,\n fixedColor: color,\n },\n custom: {\n drawStyle: GraphDrawStyle.Bars,\n barAlignment: BarAlignment.Center,\n lineColor: color,\n pointColor: color,\n fillColor: color,\n lineWidth: 1,\n fillOpacity: 100,\n stacking: {\n mode: StackingMode.Normal,\n group: 'A',\n },\n },\n };\n}\n\n/**\n * Take multiple data frames, sum up values and group by level.\n * Return a list of data frames, each representing single level.\n */\nexport function aggregateRawLogsVolume(\n rawLogsVolume: DataFrame[],\n extractLevel: (dataFrame: DataFrame) => LogLevel\n): DataFrame[] {\n const logsVolumeByLevelMap: Partial<Record<LogLevel, DataFrame[]>> = {};\n\n rawLogsVolume.forEach((dataFrame) => {\n const level = extractLevel(dataFrame);\n if (!logsVolumeByLevelMap[level]) {\n logsVolumeByLevelMap[level] = [];\n }\n logsVolumeByLevelMap[level]!.push(dataFrame);\n });\n\n return Object.keys(logsVolumeByLevelMap).map((level: string) => {\n return aggregateFields(\n logsVolumeByLevelMap[level as LogLevel]!,\n getLogVolumeFieldConfig(level as LogLevel, Object.keys(logsVolumeByLevelMap).length === 1)\n );\n });\n}\n\n/**\n * Aggregate multiple data frames into a single data frame by adding values.\n * Multiple data frames for the same level are passed here to get a single\n * data frame for a given level. Aggregation by level happens in aggregateRawLogsVolume()\n */\nfunction aggregateFields(dataFrames: DataFrame[], config: FieldConfig): DataFrame {\n const aggregatedDataFrame = new MutableDataFrame();\n if (!dataFrames.length) {\n return aggregatedDataFrame;\n }\n\n const totalLength = dataFrames[0].length;\n const timeField = new FieldCache(dataFrames[0]).getFirstFieldOfType(FieldType.time);\n\n if (!timeField) {\n return aggregatedDataFrame;\n }\n\n aggregatedDataFrame.addField({ name: 'Time', type: FieldType.time }, totalLength);\n aggregatedDataFrame.addField({ name: 'Value', type: FieldType.number, config }, totalLength);\n\n dataFrames.forEach((dataFrame) => {\n dataFrame.fields.forEach((field) => {\n if (field.type === FieldType.number) {\n for (let pointIndex = 0; pointIndex < totalLength; pointIndex++) {\n const currentValue = aggregatedDataFrame.get(pointIndex).Value;\n const valueToAdd = field.values.get(pointIndex);\n const totalValue =\n currentValue === null && valueToAdd === null ? null : (currentValue || 0) + (valueToAdd || 0);\n aggregatedDataFrame.set(pointIndex, { Value: totalValue, Time: timeField.values.get(pointIndex) });\n }\n }\n });\n });\n\n return aggregatedDataFrame;\n}\n\ntype LogsVolumeQueryOptions<T extends DataQuery> = {\n extractLevel: (dataFrame: DataFrame) => LogLevel;\n targets: T[];\n range: TimeRange;\n};\n\n/**\n * Creates an observable, which makes requests to get logs volume and aggregates results.\n */\nexport function queryLogsVolume<TQuery extends DataQuery, TOptions extends DataSourceJsonData>(\n datasource: DataSourceApi<TQuery, TOptions>,\n logsVolumeRequest: DataQueryRequest<TQuery>,\n options: LogsVolumeQueryOptions<TQuery>\n): Observable<DataQueryResponse> {\n const timespan = options.range.to.valueOf() - options.range.from.valueOf();\n const intervalInfo = getIntervalInfo(logsVolumeRequest.scopedVars, timespan);\n logsVolumeRequest.interval = intervalInfo.interval;\n logsVolumeRequest.scopedVars.__interval = { value: intervalInfo.interval, text: intervalInfo.interval };\n if (intervalInfo.intervalMs !== undefined) {\n logsVolumeRequest.intervalMs = intervalInfo.intervalMs;\n logsVolumeRequest.scopedVars.__interval_ms = { value: intervalInfo.intervalMs, text: intervalInfo.intervalMs };\n }\n\n return new Observable((observer) => {\n let rawLogsVolume: DataFrame[] = [];\n observer.next({\n state: LoadingState.Loading,\n error: undefined,\n data: [],\n });\n\n const queryResponse = datasource.query(logsVolumeRequest);\n const queryObservable = isObservable(queryResponse) ? queryResponse : from(queryResponse);\n\n const subscription = queryObservable.subscribe({\n complete: () => {\n const aggregatedLogsVolume = aggregateRawLogsVolume(rawLogsVolume, options.extractLevel);\n if (aggregatedLogsVolume[0]) {\n aggregatedLogsVolume[0].meta = {\n custom: {\n targets: options.targets,\n absoluteRange: { from: options.range.from.valueOf(), to: options.range.to.valueOf() },\n },\n };\n }\n observer.next({\n state: LoadingState.Done,\n error: undefined,\n data: aggregatedLogsVolume,\n });\n observer.complete();\n },\n next: (dataQueryResponse: DataQueryResponse) => {\n const { error } = dataQueryResponse;\n if (error !== undefined) {\n observer.next({\n state: LoadingState.Error,\n error,\n data: [],\n });\n observer.error(error);\n } else {\n rawLogsVolume = rawLogsVolume.concat(dataQueryResponse.data.map(toDataFrame));\n }\n },\n error: (error) => {\n observer.next({\n state: LoadingState.Error,\n error: error,\n data: [],\n });\n observer.error(error);\n },\n });\n return () => {\n subscription?.unsubscribe();\n };\n });\n}\n\nfunction getIntervalInfo(scopedVars: ScopedVars, timespanMs: number): { interval: string; intervalMs?: number } {\n if (scopedVars.__interval) {\n let intervalMs: number = scopedVars.__interval_ms.value;\n let interval = '';\n // below 5 seconds we force the resolution to be per 1ms as interval in scopedVars is not less than 10ms\n if (timespanMs < SECOND * 5) {\n intervalMs = MILLISECOND;\n interval = '1ms';\n } else if (intervalMs > HOUR) {\n intervalMs = DAY;\n interval = '1d';\n } else if (intervalMs > MINUTE) {\n intervalMs = HOUR;\n interval = '1h';\n } else if (intervalMs > SECOND) {\n intervalMs = MINUTE;\n interval = '1m';\n } else {\n intervalMs = SECOND;\n interval = '1s';\n }\n\n return { interval, intervalMs };\n } else {\n return { interval: '$__interval' };\n }\n}\n","import config from 'app/core/config';\n\nexport function getThemeColor(dark: string, light: string): string {\n return config.bootData.user.lightTheme ? light : dark;\n}\n","import { useLocation } from 'react-router-dom';\n\nimport { locationService } from '@grafana/runtime';\n\nexport type UseUrlParamsResult = [URLSearchParams, (params: Record<string, any>, replace?: boolean) => void];\n\n/** @internal experimental */\nexport function useUrlParams(): UseUrlParamsResult {\n const location = useLocation();\n const params = new URLSearchParams(location.search);\n\n const updateUrlParams = (params: Record<string, any>, replace?: boolean) => {\n // Should find a way to use history directly here\n locationService.partial(params, replace);\n };\n\n return [params, updateUrlParams];\n}\n","import { t } from '@lingui/macro';\n\nimport { AppEvents } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\n\nimport { KioskMode } from '../../types';\nimport appEvents from '../app_events';\n\nexport function toggleKioskMode() {\n let kiosk = locationService.getSearchObject().kiosk;\n\n switch (kiosk) {\n case 'tv':\n kiosk = true;\n appEvents.emit(AppEvents.alertSuccess, [\n t({ id: 'navigation.kiosk.tv-alert', message: 'Press ESC to exit Kiosk mode' }),\n ]);\n break;\n case '1':\n case true:\n kiosk = null;\n break;\n default:\n kiosk = 'tv';\n }\n\n locationService.partial({ kiosk });\n}\n\nexport function getKioskMode(): KioskMode {\n const kiosk = locationService.getSearchObject().kiosk;\n\n switch (kiosk) {\n case 'tv':\n return KioskMode.TV;\n // legacy support\n case '1':\n case true:\n return KioskMode.Full;\n default:\n return KioskMode.Off;\n }\n}\n\nexport function exitKioskMode() {\n locationService.partial({ kiosk: null });\n}\n","export class Profiler {\n panelsRendered = 0;\n enabled?: boolean = undefined;\n\n renderingCompleted() {\n // add render counter to root scope\n // used by image renderer to know when panel has rendered\n this.panelsRendered += 1;\n\n // this window variable is used by backend rendering tools to know\n // all panels have completed rendering\n (window as any).panelsRendered = this.panelsRendered;\n }\n}\n\nconst profiler = new Profiler();\nexport { profiler };\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AppNotification, AppNotificationSeverity, AppNotificationsState } from 'app/types/';\n\nconst MAX_STORED_NOTIFICATIONS = 25;\nexport const STORAGE_KEY = 'notifications';\nexport const NEW_NOTIFS_KEY = `${STORAGE_KEY}/lastRead`;\ntype StoredNotification = Omit<AppNotification, 'component'>;\n\nexport const initialState: AppNotificationsState = {\n byId: deserializeNotifications(),\n lastRead: Number.parseInt(window.localStorage.getItem(NEW_NOTIFS_KEY) ?? `${Date.now()}`, 10),\n};\n\n/**\n * Reducer and action to show toast notifications of various types (success, warnings, errors etc). Use to show\n * transient info to user, like errors that cannot be otherwise handled or success after an action.\n *\n * Use factory functions in core/copy/appNotifications to create the payload.\n */\nconst appNotificationsSlice = createSlice({\n name: 'appNotifications',\n initialState,\n reducers: {\n notifyApp: (state, { payload: newAlert }: PayloadAction<AppNotification>) => {\n if (Object.values(state.byId).some((alert) => isSimilar(newAlert, alert) && alert.showing)) {\n return;\n }\n\n state.byId[newAlert.id] = newAlert;\n serializeNotifications(state.byId);\n },\n hideAppNotification: (state, { payload: alertId }: PayloadAction<string>) => {\n if (!(alertId in state.byId)) {\n return;\n }\n\n state.byId[alertId].showing = false;\n serializeNotifications(state.byId);\n },\n clearNotification: (state, { payload: alertId }: PayloadAction<string>) => {\n delete state.byId[alertId];\n serializeNotifications(state.byId);\n },\n clearAllNotifications: (state) => {\n state.byId = {};\n serializeNotifications(state.byId);\n },\n readAllNotifications: (state, { payload: timestamp }: PayloadAction<number>) => {\n state.lastRead = timestamp;\n },\n },\n});\n\nexport const { notifyApp, hideAppNotification, clearNotification, clearAllNotifications, readAllNotifications } =\n appNotificationsSlice.actions;\n\nexport const appNotificationsReducer = appNotificationsSlice.reducer;\n\n// Selectors\n\nexport const selectLastReadTimestamp = (state: AppNotificationsState) => state.lastRead;\nexport const selectAll = (state: AppNotificationsState) =>\n Object.values(state.byId).sort((a, b) => b.timestamp - a.timestamp);\nexport const selectWarningsAndErrors = (state: AppNotificationsState) => selectAll(state).filter(isAtLeastWarning);\nexport const selectVisible = (state: AppNotificationsState) => Object.values(state.byId).filter((n) => n.showing);\n\n// Helper functions\n\nfunction isSimilar(a: AppNotification, b: AppNotification): boolean {\n return a.icon === b.icon && a.severity === b.severity && a.text === b.text && a.title === b.title;\n}\n\nfunction isAtLeastWarning(notif: AppNotification) {\n return notif.severity === AppNotificationSeverity.Warning || notif.severity === AppNotificationSeverity.Error;\n}\n\nfunction isStoredNotification(obj: any): obj is StoredNotification {\n return (\n typeof obj.id === 'string' &&\n typeof obj.icon === 'string' &&\n typeof obj.title === 'string' &&\n typeof obj.text === 'string'\n );\n}\n\n// (De)serialization\n\nexport function deserializeNotifications(): Record<string, StoredNotification> {\n const storedNotifsRaw = window.localStorage.getItem(STORAGE_KEY);\n if (!storedNotifsRaw) {\n return {};\n }\n\n const parsed = JSON.parse(storedNotifsRaw);\n if (!Object.values(parsed).every((v) => isStoredNotification(v))) {\n return {};\n }\n\n return parsed;\n}\n\nfunction serializeNotifications(notifs: Record<string, StoredNotification>) {\n const reducedNotifs = Object.values(notifs)\n .filter(isAtLeastWarning)\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, MAX_STORED_NOTIFICATIONS)\n .reduce<Record<string, StoredNotification>>((prev, cur) => {\n prev[cur.id] = {\n id: cur.id,\n severity: cur.severity,\n icon: cur.icon,\n title: cur.title,\n text: cur.text,\n traceId: cur.traceId,\n timestamp: cur.timestamp,\n showing: cur.showing,\n };\n\n return prev;\n }, {});\n\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(reducedNotifs));\n } catch (err) {\n console.error('Unable to persist notifications to local storage');\n console.error(err);\n }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { NavModelItem } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nexport const initialState: NavModelItem[] = config.bootData?.navTree ?? [];\n\nconst navTreeSlice = createSlice({\n name: 'navBarTree',\n initialState,\n reducers: {\n setStarred: (state, action: PayloadAction<{ id: string; title: string; url: string; isStarred: boolean }>) => {\n const starredItems = state.find((navItem) => navItem.id === 'starred');\n const { id, title, url, isStarred } = action.payload;\n if (starredItems) {\n if (isStarred) {\n if (!starredItems.children) {\n starredItems.children = [];\n }\n const newStarredItem: NavModelItem = {\n id,\n text: title,\n url,\n };\n starredItems.children.push(newStarredItem);\n starredItems.children.sort((a, b) => a.text.localeCompare(b.text));\n } else {\n const index = starredItems.children?.findIndex((item) => item.id === id) ?? -1;\n if (index > -1) {\n starredItems?.children?.splice(index, 1);\n }\n }\n }\n },\n updateDashboardName: (state, action: PayloadAction<{ id: string; title: string; url: string }>) => {\n const { id, title, url } = action.payload;\n const starredItems = state.find((navItem) => navItem.id === 'starred');\n if (starredItems) {\n const navItem = starredItems.children?.find((navItem) => navItem.id === id);\n if (navItem) {\n navItem.text = title;\n navItem.url = url;\n starredItems.children?.sort((a, b) => a.text.localeCompare(b.text));\n }\n }\n },\n },\n});\n\nexport const { setStarred, updateDashboardName } = navTreeSlice.actions;\nexport const navTreeReducer = navTreeSlice.reducer;\n","import { AnyAction, createAction } from '@reduxjs/toolkit';\n\nimport { NavIndex, NavModel, NavModelItem } from '@grafana/data';\nimport config from 'app/core/config';\n\nexport function buildInitialState(): NavIndex {\n const navIndex: NavIndex = {};\n const rootNodes = config.bootData.navTree as NavModelItem[];\n buildNavIndex(navIndex, rootNodes);\n return navIndex;\n}\n\nfunction buildNavIndex(navIndex: NavIndex, children: NavModelItem[], parentItem?: NavModelItem) {\n for (const node of children) {\n const newNode = {\n ...node,\n parentItem: parentItem,\n };\n\n navIndex[node.id!] = newNode;\n\n if (node.children) {\n buildNavIndex(navIndex, node.children, newNode);\n }\n }\n\n navIndex['not-found'] = { ...buildWarningNav('Page not found', '404 Error').node };\n}\n\nfunction buildWarningNav(text: string, subTitle?: string): NavModel {\n const node = {\n text,\n subTitle,\n icon: 'exclamation-triangle',\n };\n return {\n node: node,\n main: node,\n };\n}\n\nexport const initialState: NavIndex = {};\n\nexport const updateNavIndex = createAction<NavModelItem>('navIndex/updateNavIndex');\n// Since the configuration subtitle includes the organization name, we include this action to update the org name if it changes.\nexport const updateConfigurationSubtitle = createAction<string>('navIndex/updateConfigurationSubtitle');\n\nexport const getItemWithNewSubTitle = (item: NavModelItem, subTitle: string): NavModelItem => ({\n ...item,\n parentItem: {\n ...item.parentItem,\n text: item.parentItem?.text ?? '',\n subTitle,\n },\n});\n\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because Angular would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const navIndexReducer = (state: NavIndex = initialState, action: AnyAction): NavIndex => {\n if (updateNavIndex.match(action)) {\n const newPages: NavIndex = {};\n const payload = action.payload;\n\n for (const node of payload.children!) {\n newPages[node.id!] = {\n ...node,\n parentItem: payload,\n };\n }\n\n return { ...state, ...newPages };\n } else if (updateConfigurationSubtitle.match(action)) {\n const subTitle = `Organization: ${action.payload}`;\n\n return {\n ...state,\n cfg: { ...state.cfg, subTitle },\n datasources: getItemWithNewSubTitle(state.datasources, subTitle),\n users: getItemWithNewSubTitle(state.users, subTitle),\n teams: getItemWithNewSubTitle(state.teams, subTitle),\n plugins: getItemWithNewSubTitle(state.plugins, subTitle),\n 'org-settings': getItemWithNewSubTitle(state['org-settings'], subTitle),\n apikeys: getItemWithNewSubTitle(state.apikeys, subTitle),\n };\n }\n\n return state;\n};\n","import { NavModel, NavModelItem, NavIndex } from '@grafana/data';\n\nconst getNotFoundModel = (): NavModel => {\n const node: NavModelItem = {\n id: 'not-found',\n text: 'Page not found',\n icon: 'exclamation-triangle',\n subTitle: '404 Error',\n url: 'not-found',\n };\n\n return {\n node: node,\n main: node,\n };\n};\n\nexport const getNavModel = (navIndex: NavIndex, id: string, fallback?: NavModel, onlyChild = false): NavModel => {\n if (navIndex[id]) {\n const node = navIndex[id];\n const nodeWithActive = enrichNodeWithActiveState(node);\n const main = onlyChild ? nodeWithActive : getSectionRoot(nodeWithActive);\n\n return {\n node: nodeWithActive,\n main,\n };\n }\n\n if (fallback) {\n return fallback;\n }\n\n return getNotFoundModel();\n};\n\nfunction getSectionRoot(node: NavModelItem): NavModelItem {\n return node.parentItem ? getSectionRoot(node.parentItem) : node;\n}\n\nfunction enrichNodeWithActiveState(node: NavModelItem): NavModelItem {\n const nodeCopy = { ...node };\n if (nodeCopy.parentItem) {\n nodeCopy.parentItem = { ...nodeCopy.parentItem };\n const root = nodeCopy.parentItem;\n\n if (root.children) {\n root.children = root.children.map((item) => {\n if (item.id === node.id) {\n return { ...nodeCopy, active: true };\n }\n\n return item;\n });\n }\n\n nodeCopy.parentItem = enrichNodeWithActiveState(root);\n }\n return nodeCopy;\n}\n\nexport const getTitleFromNavModel = (navModel: NavModel) => {\n return `${navModel.main.text}${navModel.node.text ? ': ' + navModel.node.text : ''}`;\n};\n","import { UserPreferencesDTO } from 'app/types';\n\nimport { backendSrv } from './backend_srv';\n\nexport class PreferencesService {\n constructor(private resourceUri: string) {}\n\n /**\n * Overrides all preferences\n */\n update(preferences: UserPreferencesDTO): Promise<any> {\n return backendSrv.put(`/api/${this.resourceUri}/preferences`, preferences);\n }\n\n /**\n * Updates only provided preferences\n */\n patch(preferences: Partial<UserPreferencesDTO>): Promise<any> {\n return backendSrv.patch(`/api/${this.resourceUri}/preferences`, preferences);\n }\n\n load(): Promise<UserPreferencesDTO> {\n return backendSrv.get<UserPreferencesDTO>(`/api/${this.resourceUri}/preferences`);\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, InfoBox, Portal, stylesFactory, useTheme2 } from '@grafana/ui';\nimport { getModalStyles } from '@grafana/ui/src/components/Modal/getModalStyles';\n\ninterface Props {\n maxConcurrentSessions?: number;\n}\n\nexport const TokenRevokedModal = (props: Props) => {\n const theme = useTheme2();\n\n const styles = getStyles(theme);\n const modalStyles = getModalStyles(theme);\n\n const showMaxConcurrentSessions = Boolean(props.maxConcurrentSessions);\n\n const redirectToLogin = () => {\n window.location.reload();\n };\n\n return (\n <Portal>\n <div className={modalStyles.modal}>\n <InfoBox title=\"You have been automatically signed out\" severity=\"warning\" className={styles.infobox}>\n <div className={styles.text}>\n <p>\n Your session token was automatically revoked because you have reached\n <strong>\n {` the maximum number of ${\n showMaxConcurrentSessions ? props.maxConcurrentSessions : ''\n } concurrent sessions `}\n </strong>\n for your account.\n </p>\n <p>\n <strong>To resume your session, sign in again.</strong>\n Contact your administrator or visit the license page to review your quota if you are repeatedly signed out\n automatically.\n </p>\n </div>\n <Button size=\"md\" variant=\"primary\" onClick={redirectToLogin}>\n Sign in\n </Button>\n </InfoBox>\n </div>\n <div className={cx(modalStyles.modalBackdrop, styles.backdrop)} />\n </Portal>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n infobox: css`\n margin-bottom: 0;\n `,\n text: css`\n margin: ${theme.spacing(1, 0, 2)};\n `,\n backdrop: css`\n background-color: ${theme.colors.background.canvas};\n opacity: 0.8;\n `,\n };\n});\n","import { Observable, Subject } from 'rxjs';\n\nimport { BackendSrvRequest } from '@grafana/runtime';\n\nexport interface QueueState extends Record<string, { state: FetchStatus; options: BackendSrvRequest }> {}\n\nexport enum FetchStatus {\n Pending,\n InProgress,\n Done,\n}\n\nexport interface FetchQueueUpdate {\n noOfInProgress: number;\n noOfPending: number;\n state: QueueState;\n}\n\ninterface QueueStateEntry {\n id: string;\n options?: BackendSrvRequest;\n state: FetchStatus;\n}\n\nexport class FetchQueue {\n private state: QueueState = {}; // internal queue state\n private queue: Subject<QueueStateEntry> = new Subject<QueueStateEntry>(); // internal stream for requests that are to be queued\n private updates: Subject<FetchQueueUpdate> = new Subject<FetchQueueUpdate>(); // external stream with updates to the queue state\n\n constructor(debug = false) {\n // This will create an implicit live subscription for as long as this class lives.\n // But as FetchQueue is used by the singleton backendSrv that also lives for as long as Grafana app lives\n // I think this ok. We could add some disposable pattern later if the need arises.\n this.queue.subscribe((entry) => {\n const { id, state, options } = entry;\n\n if (!this.state[id]) {\n this.state[id] = { state: FetchStatus.Pending, options: {} as BackendSrvRequest };\n }\n\n if (state === FetchStatus.Done) {\n delete this.state[id];\n const update = this.getUpdate(this.state);\n this.publishUpdate(update, debug);\n return;\n }\n\n this.state[id].state = state;\n\n if (options) {\n this.state[id].options = options;\n }\n\n const update = this.getUpdate(this.state);\n this.publishUpdate(update, debug);\n });\n }\n\n add = (id: string, options: BackendSrvRequest): void => this.queue.next({ id, options, state: FetchStatus.Pending });\n\n setInProgress = (id: string): void => this.queue.next({ id, state: FetchStatus.InProgress });\n\n setDone = (id: string): void => this.queue.next({ id, state: FetchStatus.Done });\n\n getUpdates = (): Observable<FetchQueueUpdate> => this.updates.asObservable();\n\n private getUpdate = (state: QueueState): FetchQueueUpdate => {\n const noOfInProgress = Object.keys(state).filter((key) => state[key].state === FetchStatus.InProgress).length;\n const noOfPending = Object.keys(state).filter((key) => state[key].state === FetchStatus.Pending).length;\n\n return { noOfPending, noOfInProgress, state };\n };\n\n private publishUpdate = (update: FetchQueueUpdate, debug: boolean): void => {\n this.printState(update, debug);\n this.updates.next(update);\n };\n\n private printState = (update: FetchQueueUpdate, debug: boolean): void => {\n if (!debug) {\n return;\n }\n\n const entriesWithoutOptions = Object.keys(update.state).reduce((all, key) => {\n const entry = { id: key, state: update.state[key].state };\n all.push(entry);\n return all;\n }, [] as Array<{ id: string; state: FetchStatus }>);\n\n console.log('FetchQueue noOfStarted', update.noOfInProgress);\n console.log('FetchQueue noOfNotStarted', update.noOfPending);\n console.log('FetchQueue state', entriesWithoutOptions);\n };\n}\n","import { concatMap, filter } from 'rxjs/operators';\n\nimport { BackendSrvRequest, GrafanaBootConfig } from '@grafana/runtime';\n\nimport { isDataQuery } from '../utils/query';\n\nimport { FetchQueue, FetchStatus } from './FetchQueue';\nimport { ResponseQueue } from './ResponseQueue';\n\ninterface WorkerEntry {\n id: string;\n options: BackendSrvRequest;\n}\n\nexport class FetchQueueWorker {\n constructor(fetchQueue: FetchQueue, responseQueue: ResponseQueue, config: GrafanaBootConfig) {\n const maxParallelRequests = config?.http2Enabled ? 1000 : 5; // for tests that don't mock GrafanaBootConfig the config param will be undefined\n\n // This will create an implicit live subscription for as long as this class lives.\n // But as FetchQueueWorker is used by the singleton backendSrv that also lives for as long as Grafana app lives\n // I think this ok. We could add some disposable pattern later if the need arises.\n fetchQueue\n .getUpdates()\n .pipe(\n filter(({ noOfPending }) => noOfPending > 0), // no reason to act if there is nothing to act upon\n // Using concatMap instead of mergeMap so that the order with apiRequests first is preserved\n // https://rxjs.dev/api/operators/concatMap\n concatMap(({ state, noOfInProgress }) => {\n const apiRequests = Object.keys(state)\n .filter((k) => state[k].state === FetchStatus.Pending && !isDataQuery(state[k].options.url))\n .reduce((all, key) => {\n const entry = { id: key, options: state[key].options };\n all.push(entry);\n return all;\n }, [] as WorkerEntry[]);\n\n const dataRequests = Object.keys(state)\n .filter((key) => state[key].state === FetchStatus.Pending && isDataQuery(state[key].options.url))\n .reduce((all, key) => {\n const entry = { id: key, options: state[key].options };\n all.push(entry);\n return all;\n }, [] as WorkerEntry[]);\n\n // apiRequests have precedence over data requests and should always be called directly\n // this means we can end up with a negative value.\n // Because the way Array.toSlice works with negative numbers we use Math.max below.\n const noOfAllowedDataRequests = Math.max(maxParallelRequests - noOfInProgress - apiRequests.length, 0);\n const dataRequestToFetch = dataRequests.slice(0, noOfAllowedDataRequests);\n\n return apiRequests.concat(dataRequestToFetch);\n })\n )\n .subscribe(({ id, options }) => {\n // This will add an entry to the responseQueue\n responseQueue.add(id, options);\n });\n }\n}\n","import { Observable, Subject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\n\nimport { BackendSrvRequest, FetchResponse } from '@grafana/runtime';\n\nimport { FetchQueue } from './FetchQueue';\n\ninterface FetchWorkEntry {\n id: string;\n options: BackendSrvRequest;\n}\n\ninterface FetchResponsesEntry<T> {\n id: string;\n observable: Observable<FetchResponse<T>>;\n}\n\nexport class ResponseQueue {\n private queue: Subject<FetchWorkEntry> = new Subject<FetchWorkEntry>(); // internal stream for requests that are to be executed\n private responses: Subject<FetchResponsesEntry<any>> = new Subject<FetchResponsesEntry<any>>(); // external stream with responses from fetch\n\n constructor(fetchQueue: FetchQueue, fetch: <T>(options: BackendSrvRequest) => Observable<FetchResponse<T>>) {\n // This will create an implicit live subscription for as long as this class lives.\n // But as FetchQueue is used by the singleton backendSrv that also lives for as long as Grafana app lives\n // I think this ok. We could add some disposable pattern later if the need arises.\n this.queue.subscribe((entry) => {\n const { id, options } = entry;\n\n // Let the fetchQueue know that this id has started data fetching.\n fetchQueue.setInProgress(id);\n\n this.responses.next({ id, observable: fetch(options) });\n });\n }\n\n add = (id: string, options: BackendSrvRequest): void => {\n this.queue.next({ id, options });\n };\n\n getResponses = <T>(id: string): Observable<FetchResponsesEntry<T>> =>\n this.responses.asObservable().pipe(filter((entry) => entry.id === id));\n}\n","import {\n from,\n lastValueFrom,\n merge,\n MonoTypeOperatorFunction,\n Observable,\n of,\n Subject,\n Subscription,\n throwError,\n} from 'rxjs';\nimport { fromFetch } from 'rxjs/fetch';\nimport { catchError, filter, map, mergeMap, retryWhen, share, takeUntil, tap, throwIfEmpty } from 'rxjs/operators';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { AppEvents, DataQueryErrorType } from '@grafana/data';\nimport { BackendSrv as BackendService, BackendSrvRequest, config, FetchError, FetchResponse } from '@grafana/runtime';\nimport appEvents from 'app/core/app_events';\nimport { getConfig } from 'app/core/config';\nimport { loadUrlToken } from 'app/core/utils/urlToken';\nimport { DashboardSearchHit } from 'app/features/search/types';\nimport { getGrafanaStorage } from 'app/features/storage/storage';\nimport { TokenRevokedModal } from 'app/features/users/TokenRevokedModal';\nimport { DashboardDTO, FolderDTO } from 'app/types';\n\nimport { ShowModalReactEvent } from '../../types/events';\nimport {\n isContentTypeApplicationJson,\n parseInitFromOptions,\n parseResponseBody,\n parseUrlFromOptions,\n} from '../utils/fetch';\nimport { isDataQuery, isLocalUrl } from '../utils/query';\n\nimport { FetchQueue } from './FetchQueue';\nimport { FetchQueueWorker } from './FetchQueueWorker';\nimport { ResponseQueue } from './ResponseQueue';\nimport { ContextSrv, contextSrv } from './context_srv';\n\nconst CANCEL_ALL_REQUESTS_REQUEST_ID = 'cancel_all_requests_request_id';\n\nexport interface BackendSrvDependencies {\n fromFetch: (input: string | Request, init?: RequestInit) => Observable<Response>;\n appEvents: typeof appEvents;\n contextSrv: ContextSrv;\n logout: () => void;\n}\n\nexport interface FolderRequestOptions {\n withAccessControl?: boolean;\n}\n\nexport class BackendSrv implements BackendService {\n private inFlightRequests: Subject<string> = new Subject<string>();\n private HTTP_REQUEST_CANCELED = -1;\n private noBackendCache: boolean;\n private inspectorStream: Subject<FetchResponse | FetchError> = new Subject<FetchResponse | FetchError>();\n private readonly fetchQueue: FetchQueue;\n private readonly responseQueue: ResponseQueue;\n\n private dependencies: BackendSrvDependencies = {\n fromFetch: fromFetch,\n appEvents: appEvents,\n contextSrv: contextSrv,\n logout: () => {\n contextSrv.setLoggedOut();\n window.location.reload();\n },\n };\n\n constructor(deps?: BackendSrvDependencies) {\n if (deps) {\n this.dependencies = {\n ...this.dependencies,\n ...deps,\n };\n }\n\n this.noBackendCache = false;\n this.internalFetch = this.internalFetch.bind(this);\n this.fetchQueue = new FetchQueue();\n this.responseQueue = new ResponseQueue(this.fetchQueue, this.internalFetch);\n new FetchQueueWorker(this.fetchQueue, this.responseQueue, getConfig());\n }\n\n async request<T = any>(options: BackendSrvRequest): Promise<T> {\n return await lastValueFrom(this.fetch<T>(options).pipe(map((response: FetchResponse<T>) => response.data)));\n }\n\n fetch<T>(options: BackendSrvRequest): Observable<FetchResponse<T>> {\n // We need to match an entry added to the queue stream with the entry that is eventually added to the response stream\n const id = uuidv4();\n const fetchQueue = this.fetchQueue;\n\n return new Observable((observer) => {\n // Subscription is an object that is returned whenever you subscribe to an Observable.\n // You can also use it as a container of many subscriptions and when it is unsubscribed all subscriptions within are also unsubscribed.\n const subscriptions: Subscription = new Subscription();\n\n // We're using the subscriptions.add function to add the subscription implicitly returned by this.responseQueue.getResponses<T>(id).subscribe below.\n subscriptions.add(\n this.responseQueue.getResponses<T>(id).subscribe((result) => {\n // The one liner below can seem magical if you're not accustomed to RxJs.\n // Firstly, we're subscribing to the result from the result.observable and we're passing in the outer observer object.\n // By passing the outer observer object then any updates on result.observable are passed through to any subscriber of the fetch<T> function.\n // Secondly, we're adding the subscription implicitly returned by result.observable.subscribe(observer).\n subscriptions.add(result.observable.subscribe(observer));\n })\n );\n\n // Let the fetchQueue know that this id needs to start data fetching.\n this.fetchQueue.add(id, options);\n\n // This returned function will be called whenever the returned Observable from the fetch<T> function is unsubscribed/errored/completed/canceled.\n return function unsubscribe() {\n // Change status to Done moved here from ResponseQueue because this unsubscribe was called before the responseQueue produced a result\n fetchQueue.setDone(id);\n\n // When subscriptions is unsubscribed all the implicitly added subscriptions above are also unsubscribed.\n subscriptions.unsubscribe();\n };\n });\n }\n\n private internalFetch<T>(options: BackendSrvRequest): Observable<FetchResponse<T>> {\n if (options.requestId) {\n this.inFlightRequests.next(options.requestId);\n }\n\n options = this.parseRequestOptions(options);\n\n const token = loadUrlToken();\n if (token !== null && token !== '') {\n if (!options.headers) {\n options.headers = {};\n }\n\n if (config.jwtUrlLogin && config.jwtHeaderName) {\n options.headers[config.jwtHeaderName] = `${token}`;\n }\n }\n\n const fromFetchStream = this.getFromFetchStream<T>(options);\n const failureStream = fromFetchStream.pipe(this.toFailureStream<T>(options));\n const successStream = fromFetchStream.pipe(\n filter((response) => response.ok === true),\n tap((response) => {\n this.showSuccessAlert(response);\n this.inspectorStream.next(response);\n })\n );\n\n return merge(successStream, failureStream).pipe(\n catchError((err: FetchError) => throwError(this.processRequestError(options, err))),\n this.handleStreamCancellation(options)\n );\n }\n\n resolveCancelerIfExists(requestId: string) {\n this.inFlightRequests.next(requestId);\n }\n\n cancelAllInFlightRequests() {\n this.inFlightRequests.next(CANCEL_ALL_REQUESTS_REQUEST_ID);\n }\n\n async datasourceRequest(options: BackendSrvRequest): Promise<any> {\n return lastValueFrom(this.fetch(options));\n }\n\n private parseRequestOptions(options: BackendSrvRequest): BackendSrvRequest {\n const orgId = this.dependencies.contextSrv.user?.orgId;\n\n // init retry counter\n options.retry = options.retry ?? 0;\n\n if (isLocalUrl(options.url)) {\n if (orgId) {\n options.headers = options.headers ?? {};\n options.headers['X-Grafana-Org-Id'] = orgId;\n }\n\n if (options.url.startsWith('/')) {\n options.url = options.url.substring(1);\n }\n\n if (options.headers?.Authorization) {\n options.headers['X-DS-Authorization'] = options.headers.Authorization;\n delete options.headers.Authorization;\n }\n\n if (this.noBackendCache) {\n options.headers = options.headers ?? {};\n options.headers['X-Grafana-NoCache'] = 'true';\n }\n }\n\n if (options.hideFromInspector === undefined) {\n // Hide all local non data query calls\n options.hideFromInspector = isLocalUrl(options.url) && !isDataQuery(options.url);\n }\n\n return options;\n }\n\n private getFromFetchStream<T>(options: BackendSrvRequest): Observable<FetchResponse<T>> {\n const url = parseUrlFromOptions(options);\n const init = parseInitFromOptions(options);\n\n return this.dependencies.fromFetch(url, init).pipe(\n mergeMap(async (response) => {\n const { status, statusText, ok, headers, url, type, redirected } = response;\n\n const responseType = options.responseType ?? (isContentTypeApplicationJson(headers) ? 'json' : undefined);\n\n const data = await parseResponseBody<T>(response, responseType);\n const fetchResponse: FetchResponse<T> = {\n status,\n statusText,\n ok,\n data,\n headers,\n url,\n type,\n redirected,\n config: options,\n };\n return fetchResponse;\n }),\n share() // sharing this so we can split into success and failure and then merge back\n );\n }\n\n private toFailureStream<T>(options: BackendSrvRequest): MonoTypeOperatorFunction<FetchResponse<T>> {\n const { isSignedIn } = this.dependencies.contextSrv.user;\n\n return (inputStream) =>\n inputStream.pipe(\n filter((response) => response.ok === false),\n mergeMap((response) => {\n const { status, statusText, data } = response;\n const fetchErrorResponse: FetchError = { status, statusText, data, config: options };\n return throwError(fetchErrorResponse);\n }),\n retryWhen((attempts: Observable<any>) =>\n attempts.pipe(\n mergeMap((error, i) => {\n const firstAttempt = i === 0 && options.retry === 0;\n\n if (error.status === 401 && isLocalUrl(options.url) && firstAttempt && isSignedIn) {\n if (error.data?.error?.id === 'ERR_TOKEN_REVOKED') {\n this.dependencies.appEvents.publish(\n new ShowModalReactEvent({\n component: TokenRevokedModal,\n props: {\n maxConcurrentSessions: error.data?.error?.maxConcurrentSessions,\n },\n })\n );\n\n return of({});\n }\n\n return from(this.loginPing()).pipe(\n catchError((err) => {\n if (err.status === 401) {\n this.dependencies.logout();\n return throwError(err);\n }\n return throwError(err);\n })\n );\n }\n\n return throwError(error);\n })\n )\n )\n );\n }\n\n showApplicationErrorAlert(err: FetchError) {}\n\n showSuccessAlert<T>(response: FetchResponse<T>) {\n const { config } = response;\n\n if (config.showSuccessAlert === false) {\n return;\n }\n\n // is showSuccessAlert is undefined we only show alerts non GET request, non data query and local api requests\n if (\n config.showSuccessAlert === undefined &&\n (config.method === 'GET' || isDataQuery(config.url) || !isLocalUrl(config.url))\n ) {\n return;\n }\n\n const data: { message: string } = response.data as any;\n\n if (data?.message) {\n this.dependencies.appEvents.emit(AppEvents.alertSuccess, [data.message]);\n }\n }\n\n showErrorAlert<T>(config: BackendSrvRequest, err: FetchError) {\n if (config.showErrorAlert === false) {\n return;\n }\n\n // is showErrorAlert is undefined we only show alerts non data query and local api requests\n if (config.showErrorAlert === undefined && (isDataQuery(config.url) || !isLocalUrl(config.url))) {\n return;\n }\n\n let description = '';\n let message = err.data.message;\n\n if (message.length > 80) {\n description = message;\n message = 'Error';\n }\n\n // Validation\n if (err.status === 422) {\n message = 'Validation failed';\n }\n\n this.dependencies.appEvents.emit(err.status < 500 ? AppEvents.alertWarning : AppEvents.alertError, [\n message,\n description,\n err.data.traceID,\n ]);\n }\n\n /**\n * Processes FetchError to ensure \"data\" property is an object.\n *\n * @see DataQueryError.data\n */\n processRequestError(options: BackendSrvRequest, err: FetchError): FetchError<{ message: string; error?: string }> {\n err.data = err.data ?? { message: 'Unexpected error' };\n\n if (typeof err.data === 'string') {\n err.data = {\n message: err.data,\n error: err.statusText,\n response: err.data,\n };\n }\n\n // If no message but got error string, copy to message prop\n if (err.data && !err.data.message && typeof err.data.error === 'string') {\n err.data.message = err.data.error;\n }\n\n // check if we should show an error alert\n if (err.data.message) {\n setTimeout(() => {\n if (!err.isHandled) {\n this.showErrorAlert(options, err);\n }\n }, 50);\n }\n\n this.inspectorStream.next(err);\n return err;\n }\n\n private handleStreamCancellation(options: BackendSrvRequest): MonoTypeOperatorFunction<FetchResponse<any>> {\n return (inputStream) =>\n inputStream.pipe(\n takeUntil(\n this.inFlightRequests.pipe(\n filter((requestId) => {\n let cancelRequest = false;\n\n if (options && options.requestId && options.requestId === requestId) {\n // when a new requestId is started it will be published to inFlightRequests\n // if a previous long running request that hasn't finished yet has the same requestId\n // we need to cancel that request\n cancelRequest = true;\n }\n\n if (requestId === CANCEL_ALL_REQUESTS_REQUEST_ID) {\n cancelRequest = true;\n }\n\n return cancelRequest;\n })\n )\n ),\n // when a request is cancelled by takeUntil it will complete without emitting anything so we use throwIfEmpty to identify this case\n // in throwIfEmpty we'll then throw an cancelled error and then we'll return the correct result in the catchError or rethrow\n throwIfEmpty(() => ({\n type: DataQueryErrorType.Cancelled,\n cancelled: true,\n data: null,\n status: this.HTTP_REQUEST_CANCELED,\n statusText: 'Request was aborted',\n config: options,\n }))\n );\n }\n\n getInspectorStream(): Observable<FetchResponse<any> | FetchError> {\n return this.inspectorStream;\n }\n\n async get<T = any>(url: string, params?: any, requestId?: string): Promise<T> {\n return await this.request({ method: 'GET', url, params, requestId });\n }\n\n async delete<T = any>(url: string, data?: any): Promise<T> {\n return await this.request({ method: 'DELETE', url, data });\n }\n\n async post<T = any>(url: string, data?: any): Promise<T> {\n return await this.request({ method: 'POST', url, data });\n }\n\n async patch<T = any>(url: string, data: any): Promise<T> {\n return await this.request({ method: 'PATCH', url, data });\n }\n\n async put<T = any>(url: string, data: any): Promise<T> {\n return await this.request({ method: 'PUT', url, data });\n }\n\n withNoBackendCache(callback: any) {\n this.noBackendCache = true;\n return callback().finally(() => {\n this.noBackendCache = false;\n });\n }\n\n loginPing() {\n return this.request({ url: '/api/login/ping', method: 'GET', retry: 1 });\n }\n\n /** @deprecated */\n search(query: any): Promise<DashboardSearchHit[]> {\n return this.get('/api/search', query);\n }\n\n getDashboardByUid(uid: string): Promise<DashboardDTO> {\n if (uid.indexOf('/') > 0 && config.featureToggles.dashboardsFromStorage) {\n return getGrafanaStorage().getDashboard(uid);\n }\n return this.get<DashboardDTO>(`/api/dashboards/uid/${uid}`);\n }\n\n getPublicDashboardByUid(uid: string) {\n return this.get<DashboardDTO>(`/api/public/dashboards/${uid}`);\n }\n\n getFolderByUid(uid: string, options: FolderRequestOptions = {}) {\n const queryParams = new URLSearchParams();\n if (options.withAccessControl) {\n queryParams.set('accesscontrol', 'true');\n }\n\n return this.get<FolderDTO>(`/api/folders/${uid}?${queryParams.toString()}`);\n }\n}\n\n// Used for testing and things that really need BackendSrv\nexport const backendSrv = new BackendSrv();\nexport const getBackendSrv = (): BackendSrv => backendSrv;\n","import { extend } from 'lodash';\n\nimport { OrgRole, rangeUtil, WithAccessControlMetadata } from '@grafana/data';\nimport { featureEnabled, getBackendSrv } from '@grafana/runtime';\nimport { AccessControlAction, UserPermission } from 'app/types';\nimport { CurrentUserInternal } from 'app/types/config';\n\nimport config from '../../core/config';\n\nexport class User implements CurrentUserInternal {\n isSignedIn: boolean;\n id: number;\n login: string;\n email: string;\n name: string;\n externalUserId: string;\n lightTheme: boolean;\n orgCount: number;\n orgId: number;\n orgName: string;\n orgRole: OrgRole | '';\n isGrafanaAdmin: boolean;\n gravatarUrl: string;\n timezone: string;\n weekStart: string;\n locale: string;\n helpFlags1: number;\n hasEditPermissionInFolders: boolean;\n permissions?: UserPermission;\n fiscalYearStartMonth: number;\n\n constructor() {\n this.id = 0;\n this.isGrafanaAdmin = false;\n this.isSignedIn = false;\n this.orgRole = '';\n this.orgId = 0;\n this.orgName = '';\n this.login = '';\n this.externalUserId = '';\n this.orgCount = 0;\n this.timezone = '';\n this.fiscalYearStartMonth = 0;\n this.helpFlags1 = 0;\n this.lightTheme = false;\n this.hasEditPermissionInFolders = false;\n this.email = '';\n this.name = '';\n this.locale = '';\n this.weekStart = '';\n this.gravatarUrl = '';\n\n if (config.bootData.user) {\n extend(this, config.bootData.user);\n }\n }\n}\n\nexport class ContextSrv {\n pinned: any;\n version: any;\n user: User;\n isSignedIn: any;\n isGrafanaAdmin: any;\n isEditor: any;\n sidemenuSmallBreakpoint = false;\n hasEditPermissionInFolders: boolean;\n minRefreshInterval: string;\n\n constructor() {\n if (!config.bootData) {\n config.bootData = { user: {}, settings: {} } as any;\n }\n\n this.user = new User();\n this.isSignedIn = this.user.isSignedIn;\n this.isGrafanaAdmin = this.user.isGrafanaAdmin;\n this.isEditor = this.hasRole('Editor') || this.hasRole('Admin');\n this.hasEditPermissionInFolders = this.user.hasEditPermissionInFolders;\n this.minRefreshInterval = config.minRefreshInterval;\n }\n\n async fetchUserPermissions() {\n try {\n if (this.accessControlEnabled()) {\n this.user.permissions = await getBackendSrv().get('/api/access-control/user/permissions', {\n reloadcache: true,\n });\n }\n } catch (e) {\n console.error(e);\n }\n }\n\n /**\n * Indicate the user has been logged out\n */\n setLoggedOut() {\n this.user.isSignedIn = false;\n this.isSignedIn = false;\n }\n\n hasRole(role: string) {\n if (role === 'ServerAdmin') {\n return this.isGrafanaAdmin;\n } else {\n return this.user.orgRole === role;\n }\n }\n\n accessControlEnabled(): boolean {\n return config.rbacEnabled;\n }\n\n accessControlBuiltInRoleAssignmentEnabled(): boolean {\n return config.rbacBuiltInRoleAssignmentEnabled;\n }\n\n licensedAccessControlEnabled(): boolean {\n return featureEnabled('accesscontrol') && config.rbacEnabled;\n }\n\n // Checks whether user has required permission\n hasPermissionInMetadata(action: AccessControlAction | string, object: WithAccessControlMetadata): boolean {\n // Fallback if access control disabled\n if (!this.accessControlEnabled()) {\n return true;\n }\n\n return !!object.accessControl?.[action];\n }\n\n // Checks whether user has required permission\n hasPermission(action: AccessControlAction | string): boolean {\n // Fallback if access control disabled\n if (!this.accessControlEnabled()) {\n return true;\n }\n\n return !!this.user.permissions?.[action];\n }\n\n isGrafanaVisible() {\n return document.visibilityState === undefined || document.visibilityState === 'visible';\n }\n\n // checks whether the passed interval is longer than the configured minimum refresh rate\n isAllowedInterval(interval: string) {\n if (!config.minRefreshInterval) {\n return true;\n }\n return rangeUtil.intervalToMs(interval) >= rangeUtil.intervalToMs(config.minRefreshInterval);\n }\n\n getValidInterval(interval: string) {\n if (!this.isAllowedInterval(interval)) {\n return config.minRefreshInterval;\n }\n return interval;\n }\n\n hasAccessToExplore() {\n if (this.accessControlEnabled()) {\n return this.hasPermission(AccessControlAction.DataSourcesExplore);\n }\n return (this.isEditor || config.viewersCanEdit) && config.exploreEnabled;\n }\n\n hasAccess(action: string, fallBack: boolean): boolean {\n if (!this.accessControlEnabled()) {\n return fallBack;\n }\n return this.hasPermission(action);\n }\n\n hasAccessInMetadata(action: string, object: WithAccessControlMetadata, fallBack: boolean) {\n if (!this.accessControlEnabled()) {\n return fallBack;\n }\n return this.hasPermissionInMetadata(action, object);\n }\n\n // evaluates access control permissions, granting access if the user has any of them; uses fallback if access control is disabled\n evaluatePermission(fallback: () => string[], actions: string[]) {\n if (!this.accessControlEnabled()) {\n return fallback();\n }\n if (actions.some((action) => this.hasPermission(action))) {\n return [];\n }\n // Hack to reject when user does not have permission\n return ['Reject'];\n }\n}\n\nlet contextSrv = new ContextSrv();\nexport { contextSrv };\n\nexport const setContextSrv = (override: ContextSrv) => {\n if (process.env.NODE_ENV !== 'test') {\n throw new Error('contextSrv can be only overridden in test environment');\n }\n contextSrv = override;\n};\n","import { filter, isArray, isNumber } from 'lodash';\n\nimport config from 'app/core/config';\nimport store from 'app/core/store';\n\nexport class ImpressionSrv {\n constructor() {}\n\n addDashboardImpression(dashboardId: number) {\n const impressionsKey = this.impressionKey();\n let impressions = [];\n if (store.exists(impressionsKey)) {\n impressions = JSON.parse(store.get(impressionsKey));\n if (!isArray(impressions)) {\n impressions = [];\n }\n }\n\n impressions = impressions.filter((imp) => {\n return dashboardId !== imp;\n });\n\n impressions.unshift(dashboardId);\n\n if (impressions.length > 50) {\n impressions.pop();\n }\n store.set(impressionsKey, JSON.stringify(impressions));\n }\n\n /** Returns an array of internal (numeric) dashboard IDs */\n getDashboardOpened(): number[] {\n let impressions = store.get(this.impressionKey()) || '[]';\n\n impressions = JSON.parse(impressions);\n\n impressions = filter(impressions, (el) => {\n return isNumber(el);\n });\n\n return impressions;\n }\n\n impressionKey() {\n return 'dashboard_impressions-' + config.bootData.user.orgId;\n }\n}\n\nconst impressionSrv = new ImpressionSrv();\nexport default impressionSrv;\n","import { createTheme } from '@grafana/data';\nimport { ThemeChangedEvent } from '@grafana/runtime';\n\nimport appEvents from '../app_events';\nimport { config } from '../config';\nimport { contextSrv } from '../core';\n\nimport { PreferencesService } from './PreferencesService';\n\nexport async function toggleTheme(runtimeOnly: boolean) {\n const currentTheme = config.theme;\n const newTheme = createTheme({\n colors: {\n mode: currentTheme.isDark ? 'light' : 'dark',\n },\n });\n\n appEvents.publish(new ThemeChangedEvent(newTheme));\n\n if (runtimeOnly) {\n return;\n }\n\n // Add css file for new theme\n const newCssLink = document.createElement('link');\n newCssLink.rel = 'stylesheet';\n newCssLink.href = config.bootData.themePaths[newTheme.colors.mode];\n document.body.appendChild(newCssLink);\n\n // Remove old css file\n const bodyLinks = document.getElementsByTagName('link');\n for (let i = 0; i < bodyLinks.length; i++) {\n const link = bodyLinks[i];\n\n if (link.href && link.href.indexOf(`build/grafana.${currentTheme.type}`) > 0) {\n // Remove existing link after a 500ms to allow new css to load to avoid flickering\n // If we add new css at the same time we remove current one the page will be rendered without css\n // As the new css file is loading\n setTimeout(() => link.remove(), 500);\n }\n }\n\n if (!contextSrv.isSignedIn) {\n return;\n }\n\n // Persist new theme\n const service = new PreferencesService('user');\n const currentPref = await service.load();\n\n await service.update({\n ...currentPref,\n theme: newTheme.colors.mode,\n });\n}\n","import Mousetrap from 'mousetrap';\n\nimport 'mousetrap-global-bind';\nimport 'mousetrap/plugins/global-bind/mousetrap-global-bind';\nimport { LegacyGraphHoverClearEvent, locationUtil } from '@grafana/data';\nimport { config, locationService } from '@grafana/runtime';\nimport appEvents from 'app/core/app_events';\nimport { getExploreUrl } from 'app/core/utils/explore';\nimport { SaveDashboardDrawer } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardDrawer';\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { DashboardModel } from 'app/features/dashboard/state';\n\nimport { getTimeSrv } from '../../features/dashboard/services/TimeSrv';\nimport { getDatasourceSrv } from '../../features/plugins/datasource_srv';\nimport {\n RemovePanelEvent,\n ShiftTimeEvent,\n ShiftTimeEventDirection,\n ShowModalReactEvent,\n ZoomOutEvent,\n AbsoluteTimeEvent,\n} from '../../types/events';\nimport { HelpModal } from '../components/help/HelpModal';\nimport { contextSrv } from '../core';\nimport { exitKioskMode, toggleKioskMode } from '../navigation/kiosk';\n\nimport { toggleTheme } from './toggleTheme';\nimport { withFocusedPanel } from './withFocusedPanelId';\n\nexport class KeybindingSrv {\n reset() {\n Mousetrap.reset();\n }\n\n initGlobals() {\n if (locationService.getLocation().pathname !== '/login') {\n this.bind(['?', 'h'], this.showHelpModal);\n this.bind('g h', this.goToHome);\n this.bind('g a', this.openAlerting);\n this.bind('g p', this.goToProfile);\n this.bind('s o', this.openSearch);\n this.bind('t a', this.makeAbsoluteTime);\n this.bind('f', this.openSearch);\n this.bind('esc', this.exit);\n this.bindGlobal('esc', this.globalEsc);\n }\n\n this.bind('t t', () => toggleTheme(false));\n this.bind('t r', () => toggleTheme(true));\n\n if (process.env.NODE_ENV === 'development') {\n this.bind('t n', () => this.toggleNav());\n }\n }\n\n globalEsc() {\n const anyDoc = document as any;\n const activeElement = anyDoc.activeElement;\n\n // typehead needs to handle it\n const typeaheads = document.querySelectorAll('.slate-typeahead--open');\n if (typeaheads.length > 0) {\n return;\n }\n\n // second check if we are in an input we can blur\n if (activeElement && activeElement.blur) {\n if (\n activeElement.nodeName === 'INPUT' ||\n activeElement.nodeName === 'TEXTAREA' ||\n activeElement.hasAttribute('data-slate-editor')\n ) {\n anyDoc.activeElement.blur();\n return;\n }\n }\n\n // ok no focused input or editor that should block this, let exist!\n this.exit();\n }\n\n toggleNav() {\n window.location.href = locationUtil.getUrlForPartial(locationService.getLocation(), {\n '__feature.topnav': (!config.featureToggles.topnav).toString(),\n });\n }\n\n private openSearch() {\n locationService.partial({ search: 'open' });\n }\n\n private closeSearch() {\n locationService.partial({ search: null });\n }\n\n private openAlerting() {\n locationService.push('/alerting');\n }\n\n private goToHome() {\n locationService.push('/');\n }\n\n private goToProfile() {\n locationService.push('/profile');\n }\n\n private makeAbsoluteTime() {\n appEvents.publish(new AbsoluteTimeEvent());\n }\n\n private showHelpModal() {\n appEvents.publish(new ShowModalReactEvent({ component: HelpModal }));\n }\n\n private exit() {\n const search = locationService.getSearchObject();\n\n if (search.editview) {\n locationService.partial({ editview: null });\n return;\n }\n\n if (search.inspect) {\n locationService.partial({ inspect: null, inspectTab: null });\n return;\n }\n\n if (search.editPanel) {\n locationService.partial({ editPanel: null, tab: null });\n return;\n }\n\n if (search.viewPanel) {\n locationService.partial({ viewPanel: null, tab: null });\n return;\n }\n\n if (search.kiosk) {\n exitKioskMode();\n }\n\n if (search.search) {\n this.closeSearch();\n }\n }\n\n private showDashEditView() {\n locationService.partial({\n editview: 'settings',\n });\n }\n\n bind(keyArg: string | string[], fn: () => void) {\n Mousetrap.bind(\n keyArg,\n (evt: any) => {\n evt.preventDefault();\n evt.stopPropagation();\n evt.returnValue = false;\n fn.call(this);\n },\n 'keydown'\n );\n }\n\n bindGlobal(keyArg: string, fn: () => void) {\n Mousetrap.bindGlobal(\n keyArg,\n (evt: any) => {\n evt.preventDefault();\n evt.stopPropagation();\n evt.returnValue = false;\n fn.call(this);\n },\n 'keydown'\n );\n }\n\n unbind(keyArg: string, keyType?: string) {\n Mousetrap.unbind(keyArg, keyType);\n }\n\n bindWithPanelId(keyArg: string, fn: (panelId: number) => void) {\n this.bind(keyArg, withFocusedPanel(fn));\n }\n\n setupTimeRangeBindings(updateUrl = true) {\n this.bind('t z', () => {\n appEvents.publish(new ZoomOutEvent({ scale: 2, updateUrl }));\n });\n\n this.bind('ctrl+z', () => {\n appEvents.publish(new ZoomOutEvent({ scale: 2, updateUrl }));\n });\n\n this.bind('t left', () => {\n appEvents.publish(new ShiftTimeEvent({ direction: ShiftTimeEventDirection.Left, updateUrl }));\n });\n\n this.bind('t right', () => {\n appEvents.publish(new ShiftTimeEvent({ direction: ShiftTimeEventDirection.Right, updateUrl }));\n });\n }\n\n setupDashboardBindings(dashboard: DashboardModel) {\n this.bind('mod+o', () => {\n dashboard.graphTooltip = (dashboard.graphTooltip + 1) % 3;\n dashboard.events.publish(new LegacyGraphHoverClearEvent());\n dashboard.startRefresh();\n });\n\n this.bind('mod+s', () => {\n if (dashboard.meta.canSave) {\n appEvents.publish(\n new ShowModalReactEvent({\n component: SaveDashboardDrawer,\n props: {\n dashboard,\n },\n })\n );\n }\n });\n\n this.setupTimeRangeBindings();\n\n // edit panel\n this.bindWithPanelId('e', (panelId) => {\n if (dashboard.canEditPanelById(panelId)) {\n const isEditing = locationService.getSearchObject().editPanel !== undefined;\n locationService.partial({ editPanel: isEditing ? null : panelId });\n }\n });\n\n // view panel\n this.bindWithPanelId('v', (panelId) => {\n const isViewing = locationService.getSearchObject().viewPanel !== undefined;\n locationService.partial({ viewPanel: isViewing ? null : panelId });\n });\n\n //toggle legend\n this.bindWithPanelId('p l', (panelId) => {\n const panel = dashboard.getPanelById(panelId)!;\n const newOptions = { ...panel.options };\n\n newOptions.legend.showLegend ? (newOptions.legend.showLegend = false) : (newOptions.legend.showLegend = true);\n\n panel.updateOptions(newOptions);\n });\n\n this.bindWithPanelId('i', (panelId) => {\n locationService.partial({ inspect: panelId });\n });\n\n // jump to explore if permissions allow\n if (contextSrv.hasAccessToExplore()) {\n this.bindWithPanelId('x', async (panelId) => {\n const panel = dashboard.getPanelById(panelId)!;\n const url = await getExploreUrl({\n panel,\n datasourceSrv: getDatasourceSrv(),\n timeSrv: getTimeSrv(),\n });\n\n if (url) {\n const urlWithoutBase = locationUtil.stripBaseFromUrl(url);\n if (urlWithoutBase) {\n locationService.push(urlWithoutBase);\n }\n }\n });\n }\n\n // delete panel\n this.bindWithPanelId('p r', (panelId) => {\n if (dashboard.canEditPanelById(panelId) && !(dashboard.panelInView || dashboard.panelInEdit)) {\n appEvents.publish(new RemovePanelEvent(panelId));\n }\n });\n\n // duplicate panel\n this.bindWithPanelId('p d', (panelId) => {\n if (dashboard.canEditPanelById(panelId)) {\n const panelIndex = dashboard.getPanelInfoById(panelId)!.index;\n dashboard.duplicatePanel(dashboard.panels[panelIndex]);\n }\n });\n\n // share panel\n this.bindWithPanelId('p s', (panelId) => {\n const panelInfo = dashboard.getPanelInfoById(panelId);\n\n appEvents.publish(\n new ShowModalReactEvent({\n component: ShareModal,\n props: {\n dashboard: dashboard,\n panel: panelInfo?.panel,\n },\n })\n );\n });\n\n // toggle panel legend\n\n // toggle all panel legends\n this.bind('d l', () => {\n dashboard.toggleLegendsForAll();\n });\n\n // collapse all rows\n this.bind('d shift+c', () => {\n dashboard.collapseRows();\n });\n\n // expand all rows\n this.bind('d shift+e', () => {\n dashboard.expandRows();\n });\n\n this.bind('d n', () => {\n locationService.push('/dashboard/new');\n });\n\n this.bind('d r', () => {\n dashboard.startRefresh();\n });\n\n this.bind('d s', () => {\n this.showDashEditView();\n });\n\n this.bind('d k', () => {\n toggleKioskMode();\n });\n\n //Autofit panels\n this.bind('d a', () => {\n // this has to be a full page reload\n const queryParams = locationService.getSearchObject();\n const newUrlParam = queryParams.autofitpanels ? '' : '&autofitpanels';\n window.location.href = window.location.href + newUrlParam;\n });\n }\n}\n\nexport const keybindingSrv = new KeybindingSrv();\n","export function withFocusedPanel(fn: (panelId: number) => void) {\n return () => {\n const elements = document.querySelectorAll(':hover');\n\n for (let i = elements.length - 1; i > 0; i--) {\n const element = elements[i] as unknown as HTMLElement;\n if (element.dataset?.panelid) {\n fn(parseInt(element.dataset?.panelid, 10));\n }\n }\n };\n}\n","import { clone, keys, sortBy, take, values } from 'lodash';\n\nimport { contextSrv } from 'app/core/services/context_srv';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport store from 'app/core/store';\nimport { SECTION_STORAGE_KEY } from 'app/features/search/constants';\nimport { DashboardSection, DashboardSearchItemType, DashboardSearchHit, SearchLayout } from 'app/features/search/types';\nimport { hasFilters } from 'app/features/search/utils';\n\nimport { backendSrv } from './backend_srv';\n\ninterface Sections {\n [key: string]: Partial<DashboardSection>;\n}\n\n/** @deprecated */\nexport class SearchSrv {\n private getRecentDashboards(sections: DashboardSection[] | any) {\n return this.queryForRecentDashboards().then((result: any[]) => {\n if (result.length > 0) {\n sections['recent'] = {\n title: 'Recent',\n icon: 'clock-nine',\n score: -1,\n expanded: store.getBool(`${SECTION_STORAGE_KEY}.recent`, true),\n items: result,\n type: DashboardSearchItemType.DashFolder,\n };\n }\n });\n }\n\n private queryForRecentDashboards(): Promise<DashboardSearchHit[]> {\n const dashIds: number[] = take(impressionSrv.getDashboardOpened(), 30);\n if (dashIds.length === 0) {\n return Promise.resolve([]);\n }\n\n return backendSrv.search({ dashboardIds: dashIds }).then((result) => {\n return dashIds\n .map((orderId) => result.find((result) => result.id === orderId))\n .filter((hit) => hit && !hit.isStarred) as DashboardSearchHit[];\n });\n }\n\n private getStarred(sections: DashboardSection): Promise<any> {\n if (!contextSrv.isSignedIn) {\n return Promise.resolve();\n }\n\n return backendSrv.search({ starred: true, limit: 30 }).then((result) => {\n if (result.length > 0) {\n (sections as any)['starred'] = {\n title: 'Starred',\n icon: 'star',\n score: -2,\n expanded: store.getBool(`${SECTION_STORAGE_KEY}.starred`, true),\n items: result,\n type: DashboardSearchItemType.DashFolder,\n };\n }\n });\n }\n\n search(options: any) {\n const sections: any = {};\n const promises = [];\n const query = clone(options);\n const filters = hasFilters(options) || query.folderIds?.length > 0;\n\n query.folderIds = query.folderIds || [];\n\n if (query.layout === SearchLayout.List) {\n return backendSrv\n .search({ ...query, type: DashboardSearchItemType.DashDB })\n .then((results) => (results.length ? [{ title: '', items: results }] : []));\n }\n\n if (!filters) {\n query.folderIds = [0];\n }\n\n if (!options.skipRecent && !filters) {\n promises.push(this.getRecentDashboards(sections));\n }\n\n if (!options.skipStarred && !filters) {\n promises.push(this.getStarred(sections));\n }\n\n promises.push(\n backendSrv.search(query).then((results) => {\n return this.handleSearchResult(sections, results);\n })\n );\n\n return Promise.all(promises).then(() => {\n return sortBy(values(sections), 'score');\n });\n }\n\n private handleSearchResult(sections: Sections, results: DashboardSearchHit[]): any {\n if (results.length === 0) {\n return sections;\n }\n\n // create folder index\n for (const hit of results) {\n if (hit.type === 'dash-folder') {\n sections[hit.id] = {\n id: hit.id,\n uid: hit.uid,\n title: hit.title,\n expanded: false,\n items: [],\n url: hit.url,\n icon: 'folder',\n score: keys(sections).length,\n type: hit.type,\n };\n }\n }\n\n for (const hit of results) {\n if (hit.type === 'dash-folder') {\n continue;\n }\n\n let section = sections[hit.folderId || 0];\n if (!section) {\n if (hit.folderId) {\n section = {\n id: hit.folderId,\n uid: hit.folderUid,\n title: hit.folderTitle,\n url: hit.folderUrl,\n items: [],\n icon: 'folder-open',\n score: keys(sections).length,\n type: DashboardSearchItemType.DashFolder,\n };\n } else {\n section = {\n id: 0,\n title: 'General',\n items: [],\n icon: 'folder-open',\n score: keys(sections).length,\n type: DashboardSearchItemType.DashFolder,\n };\n }\n // add section\n sections[hit.folderId || 0] = section;\n }\n\n section.expanded = true;\n section.items && section.items.push(hit);\n }\n }\n\n getDashboardTags() {\n return backendSrv.get('/api/dashboards/tags');\n }\n\n getSortOptions() {\n return backendSrv.get('/api/search/sorting');\n }\n}\n","type StoreValue = string | number | boolean | null;\n\nexport class Store {\n get(key: string) {\n return window.localStorage[key];\n }\n\n set(key: string, value: StoreValue) {\n window.localStorage[key] = value;\n }\n\n getBool(key: string, def: boolean): boolean {\n if (def !== void 0 && !this.exists(key)) {\n return def;\n }\n return window.localStorage[key] === 'true';\n }\n\n getObject<T = unknown>(key: string): T | undefined;\n getObject<T = unknown>(key: string, def: T): T;\n getObject<T = unknown>(key: string, def?: T) {\n let ret = def;\n if (this.exists(key)) {\n const json = window.localStorage[key];\n try {\n ret = JSON.parse(json);\n } catch (error) {\n console.error(`Error parsing store object: ${key}. Returning default: ${def}. [${error}]`);\n }\n }\n return ret;\n }\n\n /* Returns true when successfully stored, throws error if not successfully stored */\n setObject(key: string, value: any) {\n let json;\n try {\n json = JSON.stringify(value);\n } catch (error) {\n throw new Error(`Could not stringify object: ${key}. [${error}]`);\n }\n try {\n this.set(key, json);\n } catch (error) {\n // Likely hitting storage quota\n const errorToThrow = new Error(`Could not save item in localStorage: ${key}. [${error}]`);\n if (error instanceof Error) {\n errorToThrow.name = error.name;\n }\n throw errorToThrow;\n }\n return true;\n }\n\n exists(key: string) {\n return window.localStorage[key] !== void 0;\n }\n\n delete(key: string) {\n window.localStorage.removeItem(key);\n }\n}\n\nconst store = new Store();\nexport default store;\n","import { findIndex } from 'lodash';\n\nimport { Column, TableData, QueryResultMeta } from '@grafana/data';\n\n/**\n * Extends the standard Column class with variables that get\n * mutated in the angular table panel.\n */\nexport interface MutableColumn extends Column {\n title?: string;\n sort?: boolean;\n desc?: boolean;\n type?: string;\n}\n\nexport default class TableModel implements TableData {\n columns: MutableColumn[];\n rows: any[];\n type: string;\n columnMap: any;\n refId?: string;\n meta?: QueryResultMeta;\n\n constructor(table?: any) {\n this.columns = [];\n this.columnMap = {};\n this.rows = [];\n this.type = 'table';\n\n if (table) {\n if (table.columns) {\n for (const col of table.columns) {\n this.addColumn(col);\n }\n }\n if (table.rows) {\n for (const row of table.rows) {\n this.addRow(row);\n }\n }\n }\n }\n\n sort(options: { col: number; desc: boolean }) {\n // Since 8.3.0 col property can be also undefined, https://github.com/grafana/grafana/issues/44127\n if (options.col === null || options.col === undefined || this.columns.length <= options.col) {\n return;\n }\n\n this.rows.sort((a, b) => {\n a = a[options.col];\n b = b[options.col];\n // Sort null or undefined separately from comparable values\n return +(a == null) - +(b == null) || +(a > b) || -(a < b);\n });\n\n if (options.desc) {\n this.rows.reverse();\n }\n\n this.columns[options.col].sort = true;\n this.columns[options.col].desc = options.desc;\n }\n\n addColumn(col: Column) {\n if (!this.columnMap[col.text]) {\n this.columns.push(col);\n this.columnMap[col.text] = col;\n }\n }\n\n addRow(row: any[]) {\n this.rows.push(row);\n }\n}\n\n// Returns true if both rows have matching non-empty fields as well as matching\n// indexes where one field is empty and the other is not\nfunction areRowsMatching(columns: Column[], row: any[], otherRow: any[]) {\n let foundFieldToMatch = false;\n for (let columnIndex = 0; columnIndex < columns.length; columnIndex++) {\n if (row[columnIndex] !== undefined && otherRow[columnIndex] !== undefined) {\n if (row[columnIndex] !== otherRow[columnIndex]) {\n return false;\n }\n } else if (row[columnIndex] === undefined || otherRow[columnIndex] === undefined) {\n foundFieldToMatch = true;\n }\n }\n return foundFieldToMatch;\n}\n\nexport function mergeTablesIntoModel(dst?: TableModel, ...tables: TableModel[]): TableModel {\n const model = dst || new TableModel();\n\n if (arguments.length === 1) {\n return model;\n }\n // Single query returns data columns and rows as is\n if (arguments.length === 2) {\n model.columns = tables[0].hasOwnProperty('columns') ? [...tables[0].columns] : [];\n model.rows = tables[0].hasOwnProperty('rows') ? [...tables[0].rows] : [];\n return model;\n }\n\n // Filter out any tables that are not of TableData format\n const tableDataTables = tables.filter((table) => !!table.columns);\n\n // Track column indexes of union: name -> index\n const columnNames: { [key: string]: any } = {};\n\n // Union of all non-value columns\n const columnsUnion = tableDataTables.slice().reduce((acc, series) => {\n series.columns.forEach((col) => {\n const { text } = col;\n if (columnNames[text] === undefined) {\n columnNames[text] = acc.length;\n acc.push(col);\n }\n });\n return acc;\n }, [] as MutableColumn[]);\n\n // Map old column index to union index per series, e.g.,\n // given columnNames {A: 0, B: 1} and\n // data [{columns: [{ text: 'A' }]}, {columns: [{ text: 'B' }]}] => [[0], [1]]\n const columnIndexMapper = tableDataTables.map((series) => series.columns.map((col) => columnNames[col.text]));\n\n // Flatten rows of all series and adjust new column indexes\n const flattenedRows = tableDataTables.reduce((acc, series, seriesIndex) => {\n const mapper = columnIndexMapper[seriesIndex];\n series.rows.forEach((row) => {\n const alteredRow: MutableColumn[] = [];\n // Shifting entries according to index mapper\n mapper.forEach((to, from) => {\n alteredRow[to] = row[from];\n });\n acc.push(alteredRow);\n });\n return acc;\n }, [] as MutableColumn[][]);\n\n // Merge rows that have same values for columns\n const mergedRows: { [key: string]: any } = {};\n\n const compactedRows = flattenedRows.reduce((acc, row, rowIndex) => {\n if (!mergedRows[rowIndex]) {\n // Look from current row onwards\n let offset = rowIndex + 1;\n // More than one row can be merged into current row\n while (offset < flattenedRows.length) {\n // Find next row that could be merged\n const match = findIndex(flattenedRows, (otherRow) => areRowsMatching(columnsUnion, row, otherRow), offset);\n if (match > -1) {\n const matchedRow = flattenedRows[match];\n // Merge values from match into current row if there is a gap in the current row\n for (let columnIndex = 0; columnIndex < columnsUnion.length; columnIndex++) {\n if (row[columnIndex] === undefined && matchedRow[columnIndex] !== undefined) {\n row[columnIndex] = matchedRow[columnIndex];\n }\n }\n // Don't visit this row again\n mergedRows[match] = matchedRow;\n // Keep looking for more rows to merge\n offset = match + 1;\n } else {\n // No match found, stop looking\n break;\n }\n }\n acc.push(row);\n }\n return acc;\n }, [] as MutableColumn[][]);\n\n model.columns = columnsUnion;\n model.rows = compactedRows;\n return model;\n}\n","import { isNumber, isFinite, escape } from 'lodash';\n\nimport { DecimalCount, formattedValueToString, getValueFormat, stringToJsRegex, ValueFormatter } from '@grafana/data';\n\nfunction matchSeriesOverride(aliasOrRegex: string, seriesAlias: string) {\n if (!aliasOrRegex) {\n return false;\n }\n\n if (aliasOrRegex[0] === '/') {\n const regex = stringToJsRegex(aliasOrRegex);\n return seriesAlias.match(regex) != null;\n }\n\n return aliasOrRegex === seriesAlias;\n}\n\nfunction translateFillOption(fill: number) {\n return fill === 0 ? 0.001 : fill / 10;\n}\n\nfunction getFillGradient(amount: number) {\n if (!amount) {\n return null;\n }\n\n return {\n colors: [{ opacity: 0.0 }, { opacity: amount / 10 }],\n };\n}\n\n/**\n * Calculate decimals for legend and update values for each series.\n * @param data series data\n * @param panel\n * @param height\n */\nexport function updateLegendValues(data: TimeSeries[], panel: any, height: number) {\n for (let i = 0; i < data.length; i++) {\n const series = data[i];\n const yaxes = panel.yaxes;\n const seriesYAxis = series.yaxis || 1;\n const axis = yaxes[seriesYAxis - 1];\n const formatter = getValueFormat(axis.format);\n\n // decimal override\n if (isNumber(panel.decimals)) {\n series.updateLegendValues(formatter, panel.decimals);\n } else if (isNumber(axis.decimals)) {\n series.updateLegendValues(formatter, axis.decimals + 1);\n } else {\n series.updateLegendValues(formatter, null);\n }\n }\n}\n\n/**\n * @deprecated: This class should not be used in new panels\n *\n * Use DataFrame and helpers instead\n */\nexport default class TimeSeries {\n datapoints: any;\n id: string;\n // Represents index of original data frame in the quey response\n dataFrameIndex: number;\n // Represents index of field in the data frame\n fieldIndex: number;\n label: string;\n alias: string;\n aliasEscaped: string;\n color?: string;\n valueFormater: any;\n stats: any;\n legend: boolean;\n hideTooltip?: boolean;\n allIsNull?: boolean;\n allIsZero?: boolean;\n decimals: DecimalCount;\n hasMsResolution: boolean;\n isOutsideRange?: boolean;\n\n lines: any;\n hiddenSeries?: boolean;\n dashes: any;\n bars: any;\n points: any;\n yaxis: any;\n zindex: any;\n stack: any;\n nullPointMode: any;\n fillBelowTo: any;\n transform: any;\n flotpairs: any;\n unit: any;\n\n constructor(opts: any) {\n this.datapoints = opts.datapoints;\n this.label = opts.alias;\n this.id = opts.alias;\n this.alias = opts.alias;\n this.aliasEscaped = escape(opts.alias);\n this.color = opts.color;\n this.bars = { fillColor: opts.color };\n this.valueFormater = getValueFormat('none');\n this.stats = {};\n this.legend = true;\n this.unit = opts.unit;\n this.dataFrameIndex = opts.dataFrameIndex;\n this.fieldIndex = opts.fieldIndex;\n this.hasMsResolution = this.isMsResolutionNeeded();\n }\n\n applySeriesOverrides(overrides: any[]) {\n this.lines = {};\n this.dashes = {\n dashLength: [],\n };\n this.points = {};\n this.yaxis = 1;\n this.zindex = 0;\n this.nullPointMode = null;\n delete this.stack;\n delete this.bars.show;\n\n for (let i = 0; i < overrides.length; i++) {\n const override = overrides[i];\n if (!matchSeriesOverride(override.alias, this.alias)) {\n continue;\n }\n if (override.lines !== void 0) {\n this.lines.show = override.lines;\n }\n if (override.dashes !== void 0) {\n this.dashes.show = override.dashes;\n this.lines.lineWidth = 0;\n }\n if (override.points !== void 0) {\n this.points.show = override.points;\n }\n if (override.bars !== void 0) {\n this.bars.show = override.bars;\n }\n if (override.fill !== void 0) {\n this.lines.fill = translateFillOption(override.fill);\n }\n if (override.fillGradient !== void 0) {\n this.lines.fillColor = getFillGradient(override.fillGradient);\n }\n if (override.stack !== void 0) {\n this.stack = override.stack;\n }\n if (override.linewidth !== void 0) {\n this.lines.lineWidth = this.dashes.show ? 0 : override.linewidth;\n this.dashes.lineWidth = override.linewidth;\n }\n if (override.dashLength !== void 0) {\n this.dashes.dashLength[0] = override.dashLength;\n }\n if (override.spaceLength !== void 0) {\n this.dashes.dashLength[1] = override.spaceLength;\n }\n if (override.nullPointMode !== void 0) {\n this.nullPointMode = override.nullPointMode;\n }\n if (override.pointradius !== void 0) {\n this.points.radius = override.pointradius;\n }\n if (override.steppedLine !== void 0) {\n this.lines.steps = override.steppedLine;\n }\n if (override.zindex !== void 0) {\n this.zindex = override.zindex;\n }\n if (override.fillBelowTo !== void 0) {\n this.fillBelowTo = override.fillBelowTo;\n }\n if (override.color !== void 0) {\n this.setColor(override.color);\n }\n if (override.transform !== void 0) {\n this.transform = override.transform;\n }\n if (override.legend !== void 0) {\n this.legend = override.legend;\n }\n if (override.hideTooltip !== void 0) {\n this.hideTooltip = override.hideTooltip;\n }\n\n if (override.yaxis !== void 0) {\n this.yaxis = override.yaxis;\n }\n if (override.hiddenSeries !== void 0) {\n this.hiddenSeries = override.hiddenSeries;\n }\n }\n }\n\n getFlotPairs(fillStyle: string) {\n const result = [];\n\n this.stats.total = 0;\n this.stats.max = -Number.MAX_VALUE;\n this.stats.min = Number.MAX_VALUE;\n this.stats.logmin = Number.MAX_VALUE;\n this.stats.avg = null;\n this.stats.current = null;\n this.stats.first = null;\n this.stats.delta = 0;\n this.stats.diff = null;\n this.stats.diffperc = 0;\n this.stats.range = null;\n this.stats.timeStep = Number.MAX_VALUE;\n this.allIsNull = true;\n this.allIsZero = true;\n\n const ignoreNulls = fillStyle === 'connected';\n const nullAsZero = fillStyle === 'null as zero';\n let currentTime;\n let currentValue;\n let nonNulls = 0;\n let previousTime;\n let previousValue = 0;\n let previousDeltaUp = true;\n\n for (let i = 0; i < this.datapoints.length; i++) {\n currentValue = this.datapoints[i][0];\n currentTime = this.datapoints[i][1];\n\n // Due to missing values we could have different timeStep all along the series\n // so we have to find the minimum one (could occur with aggregators such as ZimSum)\n if (previousTime !== undefined) {\n const timeStep = currentTime - previousTime;\n if (timeStep < this.stats.timeStep) {\n this.stats.timeStep = timeStep;\n }\n }\n previousTime = currentTime;\n\n if (currentValue === null) {\n if (ignoreNulls) {\n continue;\n }\n if (nullAsZero) {\n currentValue = 0;\n }\n }\n\n if (currentValue !== null) {\n if (isNumber(currentValue)) {\n this.stats.total += currentValue;\n this.allIsNull = false;\n nonNulls++;\n }\n\n if (currentValue > this.stats.max) {\n this.stats.max = currentValue;\n }\n\n if (currentValue < this.stats.min) {\n this.stats.min = currentValue;\n }\n\n if (this.stats.first === null) {\n this.stats.first = currentValue;\n } else {\n if (previousValue > currentValue) {\n // counter reset\n previousDeltaUp = false;\n if (i === this.datapoints.length - 1) {\n // reset on last\n this.stats.delta += currentValue;\n }\n } else {\n if (previousDeltaUp) {\n this.stats.delta += currentValue - previousValue; // normal increment\n } else {\n this.stats.delta += currentValue; // account for counter reset\n }\n previousDeltaUp = true;\n }\n }\n previousValue = currentValue;\n\n if (currentValue < this.stats.logmin && currentValue > 0) {\n this.stats.logmin = currentValue;\n }\n\n if (currentValue !== 0) {\n this.allIsZero = false;\n }\n }\n\n result.push([currentTime, currentValue]);\n }\n\n if (this.stats.max === -Number.MAX_VALUE) {\n this.stats.max = null;\n }\n if (this.stats.min === Number.MAX_VALUE) {\n this.stats.min = null;\n }\n\n if (result.length && !this.allIsNull) {\n this.stats.avg = this.stats.total / nonNulls;\n this.stats.current = result[result.length - 1][1];\n if (this.stats.current === null && result.length > 1) {\n this.stats.current = result[result.length - 2][1];\n }\n }\n if (this.stats.max !== null && this.stats.min !== null) {\n this.stats.range = this.stats.max - this.stats.min;\n }\n if (this.stats.current !== null && this.stats.first !== null) {\n this.stats.diff = this.stats.current - this.stats.first;\n this.stats.diffperc = this.stats.diff / this.stats.first;\n }\n\n this.stats.count = result.length;\n return result;\n }\n\n updateLegendValues(formater: ValueFormatter, decimals: DecimalCount) {\n this.valueFormater = formater;\n this.decimals = decimals;\n }\n\n formatValue(value: number | null) {\n if (!isFinite(value)) {\n value = null; // Prevent NaN formatting\n }\n return formattedValueToString(this.valueFormater(value, this.decimals));\n }\n\n isMsResolutionNeeded() {\n for (let i = 0; i < this.datapoints.length; i++) {\n if (this.datapoints[i][1] !== null && this.datapoints[i][1] !== undefined) {\n const timestamp = this.datapoints[i][1].toString();\n if (timestamp.length === 13 && timestamp % 1000 !== 0) {\n return true;\n }\n }\n }\n return false;\n }\n\n hideFromLegend(options: any) {\n if (options.hideEmpty && this.allIsNull) {\n return true;\n }\n // ignore series excluded via override\n if (!this.legend) {\n return true;\n }\n\n // ignore zero series\n if (options.hideZero && this.allIsZero) {\n return true;\n }\n\n return false;\n }\n\n setColor(color: string) {\n this.color = color;\n this.bars.fillColor = color;\n }\n}\n","import React, { useEffect, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { ThemeChangedEvent } from '@grafana/runtime';\nimport { ThemeContext } from '@grafana/ui';\n\nimport { appEvents } from '../core';\n\nexport const ThemeProvider = ({ children, value }: { children: React.ReactNode; value: GrafanaTheme2 }) => {\n const [theme, setTheme] = useState(value);\n\n useEffect(() => {\n const sub = appEvents.subscribe(ThemeChangedEvent, (event) => {\n setTheme(event.payload);\n });\n\n return () => sub.unsubscribe();\n }, []);\n\n return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n};\n\nexport const provideTheme = (component: React.ComponentType<any>, theme: GrafanaTheme2) => {\n return function ThemeProviderWrapper(props: any) {\n return <ThemeProvider value={theme}>{React.createElement(component, { ...props })}</ThemeProvider>;\n };\n};\n","// works with webpack plugin: scripts/webpack/plugins/CorsWorkerPlugin.js\nexport class CorsWorker extends window.Worker {\n constructor(url: URL, options?: WorkerOptions) {\n // by default, worker inherits HTML document's location and pathname which leads to wrong public path value\n // the CorsWorkerPlugin will override it with the value based on the initial worker chunk, ie.\n // initial worker chunk: http://host.com/cdn/scripts/worker-123.js\n // resulting public path: http://host.com/cdn/scripts\n\n const scriptUrl = url.toString();\n const urlParts = scriptUrl.split('/');\n urlParts.pop();\n const scriptsBasePathUrl = `${urlParts.join('/')}/`;\n\n const importScripts = `importScripts('${scriptUrl}');`;\n const objectURL = URL.createObjectURL(\n new Blob([`__webpack_worker_public_path__ = '${scriptsBasePathUrl}'; ${importScripts}`], {\n type: 'application/javascript',\n })\n );\n super(objectURL, options);\n URL.revokeObjectURL(objectURL);\n }\n}\n","import config from '../../core/config';\n\n// accessControlQueryParam adds an additional accesscontrol=true param to params when accesscontrol is enabled\nexport function accessControlQueryParam(params = {}) {\n if (!config.rbacEnabled) {\n return params;\n }\n return { ...params, accesscontrol: true };\n}\n","import { DashboardAcl, DashboardAclDTO } from 'app/types/acl';\n\nexport function processAclItems(items: DashboardAclDTO[]): DashboardAcl[] {\n return items.map(processAclItem).sort((a, b) => b.sortRank! - a.sortRank! || a.name!.localeCompare(b.name!));\n}\n\nfunction processAclItem(dto: DashboardAclDTO): DashboardAcl {\n const item = dto as DashboardAcl;\n\n item.sortRank = 0;\n\n if (item.userId! > 0) {\n item.name = item.userLogin;\n item.sortRank = 10;\n } else if (item.teamId! > 0) {\n item.name = item.team;\n item.sortRank = 20;\n } else if (item.role) {\n item.icon = 'fa fa-fw fa-street-view';\n item.name = item.role;\n item.sortRank = 30;\n if (item.role === 'Editor') {\n item.sortRank += 1;\n }\n }\n\n if (item.inherited) {\n item.sortRank += 100;\n }\n\n return item;\n}\n","export const arrayMove = <T>(array: T[], fromIndex: number, toIndex: number): T[] => {\n array.splice(toIndex, 0, array.splice(fromIndex, 1)[0]);\n return array;\n};\n","import { isString } from 'lodash';\n\nexport function getMessageFromError(err: string | (Error & { data?: any; statusText?: string })): string {\n if (err && !isString(err)) {\n if (err.message) {\n return err.message;\n } else if (err.data && err.data.message) {\n return err.data.message;\n } else if (err.statusText) {\n return err.statusText;\n } else {\n return JSON.stringify(err);\n }\n }\n\n return err as string;\n}\n","import { flatten, omit, uniq } from 'lodash';\nimport { Unsubscribable } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n dateMath,\n DateTime,\n DefaultTimeZone,\n ExploreUrlState,\n HistoryItem,\n IntervalValues,\n isDateTime,\n LogsDedupStrategy,\n LogsSortOrder,\n rangeUtil,\n RawTimeRange,\n TimeFragment,\n TimeRange,\n TimeZone,\n toUtc,\n urlUtil,\n} from '@grafana/data';\nimport { DataSourceSrv } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\nimport store from 'app/core/store';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { EXPLORE_GRAPH_STYLES, ExploreGraphStyle, ExploreId, QueryOptions, QueryTransaction } from 'app/types/explore';\n\nimport { config } from '../config';\n\nimport { getNextRefIdChar } from './query';\n\nexport const DEFAULT_RANGE = {\n from: 'now-1h',\n to: 'now',\n};\n\nexport const DEFAULT_UI_STATE = {\n dedupStrategy: LogsDedupStrategy.none,\n};\n\nconst MAX_HISTORY_ITEMS = 100;\n\nexport const LAST_USED_DATASOURCE_KEY = 'grafana.explore.datasource';\nexport const lastUsedDatasourceKeyForOrgId = (orgId: number) => `${LAST_USED_DATASOURCE_KEY}.${orgId}`;\n\nexport interface GetExploreUrlArguments {\n panel: PanelModel;\n /** Datasource service to query other datasources in case the panel datasource is mixed */\n datasourceSrv: DataSourceSrv;\n /** Time service to get the current dashboard range from */\n timeSrv: TimeSrv;\n}\n\n/**\n * Returns an Explore-URL that contains a panel's queries and the dashboard time range.\n */\nexport async function getExploreUrl(args: GetExploreUrlArguments): Promise<string | undefined> {\n const { panel, datasourceSrv, timeSrv } = args;\n let exploreDatasource = await datasourceSrv.get(panel.datasource);\n\n /** In Explore, we don't have legend formatter and we don't want to keep\n * legend formatting as we can't change it\n */\n let exploreTargets: DataQuery[] = panel.targets.map((t) => omit(t, 'legendFormat'));\n let url: string | undefined;\n\n // Mixed datasources need to choose only one datasource\n if (exploreDatasource.meta?.id === 'mixed' && exploreTargets) {\n // Find first explore datasource among targets\n for (const t of exploreTargets) {\n const datasource = await datasourceSrv.get(t.datasource || undefined);\n if (datasource) {\n exploreDatasource = datasource;\n exploreTargets = panel.targets.filter((t) => t.datasource === datasource.name);\n break;\n }\n }\n }\n\n if (exploreDatasource) {\n const range = timeSrv.timeRangeForUrl();\n let state: Partial<ExploreUrlState> = { range };\n if (exploreDatasource.interpolateVariablesInQueries) {\n const scopedVars = panel.scopedVars || {};\n state = {\n ...state,\n datasource: exploreDatasource.name,\n context: 'explore',\n queries: exploreDatasource.interpolateVariablesInQueries(exploreTargets, scopedVars),\n };\n } else {\n state = {\n ...state,\n datasource: exploreDatasource.name,\n context: 'explore',\n queries: exploreTargets.map((t) => ({ ...t, datasource: exploreDatasource.getRef() })),\n };\n }\n\n const exploreState = JSON.stringify(state);\n url = urlUtil.renderUrl('/explore', { left: exploreState });\n }\n\n return url;\n}\n\nexport function buildQueryTransaction(\n exploreId: ExploreId,\n queries: DataQuery[],\n queryOptions: QueryOptions,\n range: TimeRange,\n scanning: boolean,\n timeZone?: TimeZone\n): QueryTransaction {\n const key = queries.reduce((combinedKey, query) => {\n combinedKey += query.key;\n return combinedKey;\n }, '');\n\n const { interval, intervalMs } = getIntervals(range, queryOptions.minInterval, queryOptions.maxDataPoints);\n\n // Most datasource is using `panelId + query.refId` for cancellation logic.\n // Using `format` here because it relates to the view panel that the request is for.\n // However, some datasources don't use `panelId + query.refId`, but only `panelId`.\n // Therefore panel id has to be unique.\n const panelId = `${key}`;\n\n const request: DataQueryRequest = {\n app: CoreApp.Explore,\n dashboardId: 0,\n // TODO probably should be taken from preferences but does not seem to be used anyway.\n timezone: timeZone || DefaultTimeZone,\n startTime: Date.now(),\n interval,\n intervalMs,\n // TODO: the query request expects number and we are using string here. Seems like it works so far but can create\n // issues down the road.\n panelId: panelId as any,\n targets: queries, // Datasources rely on DataQueries being passed under the targets key.\n range,\n requestId: 'explore_' + exploreId,\n rangeRaw: range.raw,\n scopedVars: {\n __interval: { text: interval, value: interval },\n __interval_ms: { text: intervalMs, value: intervalMs },\n },\n maxDataPoints: queryOptions.maxDataPoints,\n liveStreaming: queryOptions.liveStreaming,\n };\n\n return {\n queries,\n request,\n scanning,\n id: generateKey(), // reusing for unique ID\n done: false,\n };\n}\n\nexport const clearQueryKeys: (query: DataQuery) => DataQuery = ({ key, ...rest }) => rest;\n\nconst isSegment = (segment: { [key: string]: string }, ...props: string[]) =>\n props.some((prop) => segment.hasOwnProperty(prop));\n\nenum ParseUrlStateIndex {\n RangeFrom = 0,\n RangeTo = 1,\n Datasource = 2,\n SegmentsStart = 3,\n}\n\nexport const safeParseJson = (text?: string): any | undefined => {\n if (!text) {\n return;\n }\n\n try {\n return JSON.parse(text);\n } catch (error) {\n console.error(error);\n }\n};\n\nexport const safeStringifyValue = (value: any, space?: number) => {\n if (!value) {\n return '';\n }\n\n try {\n return JSON.stringify(value, null, space);\n } catch (error) {\n console.error(error);\n }\n\n return '';\n};\n\nconst DEFAULT_GRAPH_STYLE: ExploreGraphStyle = 'lines';\n// we use this function to take any kind of data we loaded\n// from an external source (URL, localStorage, whatever),\n// and extract the graph-style from it, or return the default\n// graph-style if we are not able to do that.\n// it is important that this function is able to take any form of data,\n// (be it objects, or arrays, or booleans or whatever),\n// and produce a best-effort graphStyle.\n// note that typescript makes sure we make no mistake in this function.\n// we do not rely on ` as ` or ` any `.\nexport const toGraphStyle = (data: unknown): ExploreGraphStyle => {\n const found = EXPLORE_GRAPH_STYLES.find((v) => v === data);\n return found ?? DEFAULT_GRAPH_STYLE;\n};\n\nexport function parseUrlState(initial: string | undefined): ExploreUrlState {\n const parsed = safeParseJson(initial);\n const errorResult: any = {\n datasource: null,\n queries: [],\n range: DEFAULT_RANGE,\n mode: null,\n };\n\n if (!parsed) {\n return errorResult;\n }\n\n if (!Array.isArray(parsed)) {\n return parsed;\n }\n\n if (parsed.length <= ParseUrlStateIndex.SegmentsStart) {\n console.error('Error parsing compact URL state for Explore.');\n return errorResult;\n }\n\n const range = {\n from: parsed[ParseUrlStateIndex.RangeFrom],\n to: parsed[ParseUrlStateIndex.RangeTo],\n };\n const datasource = parsed[ParseUrlStateIndex.Datasource];\n const parsedSegments = parsed.slice(ParseUrlStateIndex.SegmentsStart);\n const queries = parsedSegments.filter((segment) => !isSegment(segment, 'ui', 'mode', '__panelsState'));\n\n const panelsState = parsedSegments.find((segment) => isSegment(segment, '__panelsState'))?.__panelsState;\n return { datasource, queries, range, panelsState };\n}\n\nexport function generateKey(index = 0): string {\n return `Q-${uuidv4()}-${index}`;\n}\n\nexport function generateEmptyQuery(queries: DataQuery[], index = 0): DataQuery {\n return { refId: getNextRefIdChar(queries), key: generateKey(index) };\n}\n\nexport const generateNewKeyAndAddRefIdIfMissing = (target: DataQuery, queries: DataQuery[], index = 0): DataQuery => {\n const key = generateKey(index);\n const refId = target.refId || getNextRefIdChar(queries);\n\n return { ...target, refId, key };\n};\n\n/**\n * Ensure at least one target exists and that targets have the necessary keys\n */\nexport function ensureQueries(queries?: DataQuery[]): DataQuery[] {\n if (queries && typeof queries === 'object' && queries.length > 0) {\n const allQueries = [];\n for (let index = 0; index < queries.length; index++) {\n const query = queries[index];\n const key = generateKey(index);\n let refId = query.refId;\n if (!refId) {\n refId = getNextRefIdChar(allQueries);\n }\n\n allQueries.push({\n ...query,\n refId,\n key,\n });\n }\n return allQueries;\n }\n return [{ ...generateEmptyQuery(queries ?? []) }];\n}\n\n/**\n * A target is non-empty when it has keys (with non-empty values) other than refId, key, context and datasource.\n * FIXME: While this is reasonable for practical use cases, a query without any propery might still be \"non-empty\"\n * in its own scope, for instance when there's no user input needed. This might be the case for an hypothetic datasource in\n * which query options are only set in its config and the query object itself, as generated from its query editor it's always \"empty\"\n */\nconst validKeys = ['refId', 'key', 'context', 'datasource'];\nexport function hasNonEmptyQuery<TQuery extends DataQuery>(queries: TQuery[]): boolean {\n return (\n queries &&\n queries.some((query: any) => {\n const keys = Object.keys(query)\n .filter((key) => validKeys.indexOf(key) === -1)\n .map((k) => query[k])\n .filter((v) => v);\n return keys.length > 0;\n })\n );\n}\n\n/**\n * Update the query history. Side-effect: store history in local storage\n */\nexport function updateHistory<T extends DataQuery>(\n history: Array<HistoryItem<T>>,\n datasourceId: string,\n queries: T[]\n): Array<HistoryItem<T>> {\n const ts = Date.now();\n let updatedHistory = history;\n queries.forEach((query) => {\n updatedHistory = [{ query, ts }, ...updatedHistory];\n });\n\n if (updatedHistory.length > MAX_HISTORY_ITEMS) {\n updatedHistory = updatedHistory.slice(0, MAX_HISTORY_ITEMS);\n }\n\n // Combine all queries of a datasource type into one history\n const historyKey = `grafana.explore.history.${datasourceId}`;\n try {\n store.setObject(historyKey, updatedHistory);\n return updatedHistory;\n } catch (error) {\n console.error(error);\n return history;\n }\n}\n\nexport function clearHistory(datasourceId: string) {\n const historyKey = `grafana.explore.history.${datasourceId}`;\n store.delete(historyKey);\n}\n\nexport const getQueryKeys = (queries: DataQuery[], datasourceInstance?: DataSourceApi | null): string[] => {\n const queryKeys = queries.reduce<string[]>((newQueryKeys, query, index) => {\n const primaryKey = datasourceInstance && datasourceInstance.name ? datasourceInstance.name : query.key;\n return newQueryKeys.concat(`${primaryKey}-${index}`);\n }, []);\n\n return queryKeys;\n};\n\nexport const getTimeRange = (timeZone: TimeZone, rawRange: RawTimeRange, fiscalYearStartMonth: number): TimeRange => {\n let range = rangeUtil.convertRawToRange(rawRange, timeZone, fiscalYearStartMonth);\n\n if (range.to.isBefore(range.from)) {\n range = rangeUtil.convertRawToRange({ from: range.raw.to, to: range.raw.from }, timeZone, fiscalYearStartMonth);\n }\n\n return range;\n};\n\nconst parseRawTime = (value: string | DateTime): TimeFragment | null => {\n if (value === null) {\n return null;\n }\n\n if (isDateTime(value)) {\n return value;\n }\n\n if (value.indexOf('now') !== -1) {\n return value;\n }\n if (value.length === 8) {\n return toUtc(value, 'YYYYMMDD');\n }\n if (value.length === 15) {\n return toUtc(value, 'YYYYMMDDTHHmmss');\n }\n // Backward compatibility\n if (value.length === 19) {\n return toUtc(value, 'YYYY-MM-DD HH:mm:ss');\n }\n\n // This should handle cases where value is an epoch time as string\n if (value.match(/^\\d+$/)) {\n const epoch = parseInt(value, 10);\n return toUtc(epoch);\n }\n\n // This should handle ISO strings\n const time = toUtc(value);\n if (time.isValid()) {\n return time;\n }\n\n return null;\n};\n\nexport const getTimeRangeFromUrl = (\n range: RawTimeRange,\n timeZone: TimeZone,\n fiscalYearStartMonth: number\n): TimeRange => {\n const raw = {\n from: parseRawTime(range.from)!,\n to: parseRawTime(range.to)!,\n };\n\n return {\n from: dateMath.parse(raw.from, false, timeZone as any)!,\n to: dateMath.parse(raw.to, true, timeZone as any)!,\n raw,\n };\n};\n\nexport const getValueWithRefId = (value?: any): any => {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n if (value.refId) {\n return value;\n }\n\n const keys = Object.keys(value);\n for (let index = 0; index < keys.length; index++) {\n const key = keys[index];\n const refId = getValueWithRefId(value[key]);\n if (refId) {\n return refId;\n }\n }\n\n return undefined;\n};\n\nexport const getRefIds = (value: any): string[] => {\n if (!value) {\n return [];\n }\n\n if (typeof value !== 'object') {\n return [];\n }\n\n const keys = Object.keys(value);\n const refIds = [];\n for (let index = 0; index < keys.length; index++) {\n const key = keys[index];\n if (key === 'refId') {\n refIds.push(value[key]);\n continue;\n }\n refIds.push(getRefIds(value[key]));\n }\n\n return uniq(flatten(refIds));\n};\n\nexport const refreshIntervalToSortOrder = (refreshInterval?: string) =>\n RefreshPicker.isLive(refreshInterval) ? LogsSortOrder.Ascending : LogsSortOrder.Descending;\n\nexport const convertToWebSocketUrl = (url: string) => {\n const protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://';\n let backend = `${protocol}${window.location.host}${config.appSubUrl}`;\n if (backend.endsWith('/')) {\n backend = backend.slice(0, -1);\n }\n return `${backend}${url}`;\n};\n\nexport const stopQueryState = (querySubscription: Unsubscribable | undefined) => {\n if (querySubscription) {\n querySubscription.unsubscribe();\n }\n};\n\nexport function getIntervals(range: TimeRange, lowLimit?: string, resolution?: number): IntervalValues {\n if (!resolution) {\n return { interval: '1s', intervalMs: 1000 };\n }\n\n return rangeUtil.calculateInterval(range, resolution, lowLimit);\n}\n\nexport const copyStringToClipboard = (string: string) => {\n const el = document.createElement('textarea');\n el.value = string;\n document.body.appendChild(el);\n el.select();\n document.execCommand('copy');\n document.body.removeChild(el);\n};\n","import { omitBy } from 'lodash';\n\nimport { deprecationWarning } from '@grafana/data';\nimport { BackendSrvRequest } from '@grafana/runtime';\n\nexport const parseInitFromOptions = (options: BackendSrvRequest): RequestInit => {\n const method = options.method;\n const headers = parseHeaders(options);\n const isAppJson = isContentTypeApplicationJson(headers);\n const body = parseBody(options, isAppJson);\n const credentials = parseCredentials(options);\n\n return {\n method,\n headers,\n body,\n credentials,\n };\n};\n\ninterface HeaderParser {\n canParse: (options: BackendSrvRequest) => boolean;\n parse: (headers: Headers) => Headers;\n}\n\nconst defaultHeaderParser: HeaderParser = {\n canParse: () => true,\n parse: (headers) => {\n const accept = headers.get('accept');\n if (accept) {\n return headers;\n }\n\n headers.set('accept', 'application/json, text/plain, */*');\n return headers;\n },\n};\n\nconst parseHeaderByMethodFactory = (methodPredicate: string): HeaderParser => ({\n canParse: (options) => {\n const method = options?.method ? options?.method.toLowerCase() : '';\n return method === methodPredicate;\n },\n parse: (headers) => {\n const contentType = headers.get('content-type');\n if (contentType) {\n return headers;\n }\n\n headers.set('content-type', 'application/json');\n return headers;\n },\n});\n\nconst postHeaderParser: HeaderParser = parseHeaderByMethodFactory('post');\nconst putHeaderParser: HeaderParser = parseHeaderByMethodFactory('put');\nconst patchHeaderParser: HeaderParser = parseHeaderByMethodFactory('patch');\n\nconst headerParsers = [postHeaderParser, putHeaderParser, patchHeaderParser, defaultHeaderParser];\n\nexport const parseHeaders = (options: BackendSrvRequest) => {\n const headers = options?.headers ? new Headers(options.headers) : new Headers();\n const parsers = headerParsers.filter((parser) => parser.canParse(options));\n const combinedHeaders = parsers.reduce((prev, parser) => {\n return parser.parse(prev);\n }, headers);\n\n return combinedHeaders;\n};\n\nexport const isContentTypeApplicationJson = (headers: Headers) => {\n if (!headers) {\n return false;\n }\n\n const contentType = headers.get('content-type');\n if (contentType && contentType.toLowerCase() === 'application/json') {\n return true;\n }\n\n return false;\n};\n\nexport const parseBody = (options: BackendSrvRequest, isAppJson: boolean) => {\n if (!options) {\n return options;\n }\n\n if (!options.data || typeof options.data === 'string') {\n return options.data;\n }\n\n return isAppJson ? JSON.stringify(options.data) : new URLSearchParams(options.data);\n};\n\nexport async function parseResponseBody<T>(\n response: Response,\n responseType?: 'json' | 'text' | 'arraybuffer' | 'blob'\n): Promise<T> {\n if (responseType) {\n switch (responseType) {\n case 'arraybuffer':\n return response.arrayBuffer() as any;\n\n case 'blob':\n return response.blob() as any;\n\n case 'json':\n // An empty string is not a valid JSON.\n // Sometimes (unfortunately) our APIs declare their Content-Type as JSON, however they return an empty body.\n if (response.headers.get('Content-Length') === '0') {\n console.warn(`${response.url} returned an invalid JSON`);\n return {} as unknown as T;\n }\n\n return await response.json();\n\n case 'text':\n return response.text() as any;\n }\n }\n\n const textData = await response.text(); // this could be just a string, prometheus requests for instance\n try {\n return JSON.parse(textData); // majority of the requests this will be something that can be parsed\n } catch {}\n return textData as any;\n}\n\nexport function serializeParams(data: Record<string, any>): string {\n return Object.keys(data)\n .map((key) => {\n const value = data[key];\n if (Array.isArray(value)) {\n return value.map((arrayValue) => `${encodeURIComponent(key)}=${encodeURIComponent(arrayValue)}`).join('&');\n }\n return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n })\n .join('&');\n}\n\nexport const parseUrlFromOptions = (options: BackendSrvRequest): string => {\n const cleanParams = omitBy(options.params, (v) => v === undefined || (v && v.length === 0));\n const serializedParams = serializeParams(cleanParams);\n return options.params && serializedParams.length ? `${options.url}?${serializedParams}` : options.url;\n};\n\nexport const parseCredentials = (options: BackendSrvRequest): RequestCredentials => {\n if (!options) {\n return options;\n }\n\n if (options.credentials) {\n return options.credentials;\n }\n\n if (options.withCredentials) {\n deprecationWarning('BackendSrvRequest', 'withCredentials', 'credentials');\n return 'include';\n }\n\n return 'same-origin';\n};\n","// Copyright (c) 2014, Hugh Kennedy\n// Based on code from https://github.com/hughsk/flat/blob/master/index.js\n//\nexport default function flatten(target: object, opts?: { delimiter?: any; maxDepth?: any; safe?: any }): any {\n opts = opts || {};\n\n const delimiter = opts.delimiter || '.';\n let maxDepth = opts.maxDepth || 3;\n let currentDepth = 1;\n const output: any = {};\n\n function step(object: any, prev: string | null) {\n Object.keys(object).forEach((key) => {\n const value = object[key];\n const isarray = opts?.safe && Array.isArray(value);\n const type = Object.prototype.toString.call(value);\n const isobject = type === '[object Object]';\n\n const newKey = prev ? prev + delimiter + key : key;\n\n if (!opts?.maxDepth) {\n maxDepth = currentDepth + 1;\n }\n\n if (!isarray && isobject && Object.keys(value).length && currentDepth < maxDepth) {\n ++currentDepth;\n return step(value, newKey);\n }\n\n output[newKey] = value;\n });\n }\n\n step(target, null);\n\n return output;\n}\n","import {\n DecimalCount,\n deprecationWarning,\n formattedValueToString,\n getValueFormat,\n getValueFormats,\n getValueFormatterIndex,\n stringToJsRegex,\n TimeRange,\n ValueFormatterIndex,\n rangeUtil,\n} from '@grafana/data';\n\nconst kbn = {\n valueFormats: {} as ValueFormatterIndex,\n intervalRegex: /(\\d+(?:\\.\\d+)?)(ms|[Mwdhmsy])/,\n intervalsInSeconds: {\n y: 31536000,\n M: 2592000,\n w: 604800,\n d: 86400,\n h: 3600,\n m: 60,\n s: 1,\n ms: 0.001,\n } as { [index: string]: number },\n regexEscape: (value: string) => value.replace(/[\\\\^$*+?.()|[\\]{}\\/]/g, '\\\\$&'),\n\n /** @deprecated since 7.2, use grafana/data */\n roundInterval: (interval: number) => {\n deprecationWarning('kbn.ts', 'kbn.roundInterval()', '@grafana/data');\n return rangeUtil.roundInterval(interval);\n },\n /** @deprecated since 7.2, use grafana/data */\n secondsToHms: (s: number) => {\n deprecationWarning('kbn.ts', 'kbn.secondsToHms()', '@grafana/data');\n return rangeUtil.secondsToHms(s);\n },\n secondsToHhmmss: (seconds: number) => {\n const strings: string[] = [];\n const numHours = Math.floor(seconds / 3600);\n const numMinutes = Math.floor((seconds % 3600) / 60);\n const numSeconds = Math.floor((seconds % 3600) % 60);\n numHours > 9 ? strings.push('' + numHours) : strings.push('0' + numHours);\n numMinutes > 9 ? strings.push('' + numMinutes) : strings.push('0' + numMinutes);\n numSeconds > 9 ? strings.push('' + numSeconds) : strings.push('0' + numSeconds);\n return strings.join(':');\n },\n toPercent: (nr: number, outOf: number) => Math.floor((nr / outOf) * 10000) / 100 + '%',\n addSlashes: (str: string) => str.replace(/[\\'\\\"\\\\0]/g, '\\\\$&'),\n /** @deprecated since 7.2, use grafana/data */\n describeInterval: (str: string) => {\n deprecationWarning('kbn.ts', 'kbn.describeInterval()', '@grafana/data');\n return rangeUtil.describeInterval(str);\n },\n /** @deprecated since 7.2, use grafana/data */\n intervalToSeconds: (str: string) => {\n deprecationWarning('kbn.ts', 'rangeUtil.intervalToSeconds()', '@grafana/data');\n return rangeUtil.intervalToSeconds(str);\n },\n /** @deprecated since 7.2, use grafana/data */\n intervalToMs: (str: string) => {\n deprecationWarning('kbn.ts', 'rangeUtil.intervalToMs()', '@grafana/data');\n return rangeUtil.intervalToMs(str);\n },\n /** @deprecated since 7.2, use grafana/data */\n calculateInterval: (range: TimeRange, resolution: number, lowLimitInterval?: string) => {\n deprecationWarning('kbn.ts', 'kbn.calculateInterval()', '@grafana/data');\n return rangeUtil.calculateInterval(range, resolution, lowLimitInterval);\n },\n queryColorDot: (color: string, diameter: string) => {\n return (\n '<div class=\"icon-circle\" style=\"' +\n ['display:inline-block', 'color:' + color, 'font-size:' + diameter + 'px'].join(';') +\n '\"></div>'\n );\n },\n slugifyForUrl: (str: string) => {\n return str\n .toLowerCase()\n .replace(/[^\\w ]+/g, '')\n .replace(/ +/g, '-');\n },\n /** @deprecated since 6.1, use grafana/data */\n stringToJsRegex: (str: string) => {\n deprecationWarning('kbn.ts', 'kbn.stringToJsRegex()', '@grafana/data');\n return stringToJsRegex(str);\n },\n toFixed: (value: number | null, decimals: number) => {\n if (value === null) {\n return '';\n }\n\n const factor = decimals ? Math.pow(10, Math.max(0, decimals)) : 1;\n const formatted = String(Math.round(value * factor) / factor);\n\n // if exponent return directly\n if (formatted.indexOf('e') !== -1 || value === 0) {\n return formatted;\n }\n\n // If tickDecimals was specified, ensure that we have exactly that\n // much precision; otherwise default to the value's own precision.\n if (decimals != null) {\n const decimalPos = formatted.indexOf('.');\n const precision = decimalPos === -1 ? 0 : formatted.length - decimalPos - 1;\n if (precision < decimals) {\n return (precision ? formatted : formatted + '.') + String(factor).slice(1, decimals - precision + 1);\n }\n }\n\n return formatted;\n },\n toFixedScaled: (\n value: number,\n decimals: number,\n scaledDecimals: number | null,\n additionalDecimals: number,\n ext: number\n ) => {\n if (scaledDecimals === null) {\n return kbn.toFixed(value, decimals) + ext;\n } else {\n return kbn.toFixed(value, scaledDecimals + additionalDecimals) + ext;\n }\n },\n roundValue: (num: number, decimals: number) => {\n if (num === null) {\n return null;\n }\n const n = Math.pow(10, decimals);\n const formatted = (n * num).toFixed(decimals);\n return Math.round(parseFloat(formatted)) / n;\n },\n // FORMAT MENU\n getUnitFormats: getValueFormats,\n};\n\n/**\n * Backward compatible layer for value formats to support old plugins\n */\nif (typeof Proxy !== 'undefined') {\n kbn.valueFormats = new Proxy(kbn.valueFormats, {\n get(target, name, receiver) {\n if (typeof name !== 'string') {\n throw { message: `Value format ${String(name)} is not a string` };\n }\n\n const formatter = getValueFormat(name);\n if (formatter) {\n // Return the results as a simple string\n return (value: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount, isUtc?: boolean) => {\n return formattedValueToString(formatter(value, decimals, scaledDecimals, isUtc ? 'utc' : 'browser'));\n };\n }\n\n // default to look here\n return Reflect.get(target, name, receiver);\n },\n });\n} else {\n kbn.valueFormats = getValueFormatterIndex();\n}\n\nexport default kbn;\n","import { DataQuery, DataSourceRef } from '@grafana/data';\n\nexport const getNextRefIdChar = (queries: DataQuery[]): string => {\n for (let num = 0; ; num++) {\n const refId = getRefId(num);\n if (!queries.some((query) => query.refId === refId)) {\n return refId;\n }\n }\n};\n\nexport function addQuery(queries: DataQuery[], query?: Partial<DataQuery>, datasource?: DataSourceRef): DataQuery[] {\n const q = query || {};\n q.refId = getNextRefIdChar(queries);\n q.hide = false;\n\n if (!q.datasource && datasource) {\n q.datasource = datasource;\n }\n\n return [...queries, q as DataQuery];\n}\n\nexport function isDataQuery(url: string): boolean {\n if (url.indexOf('api/datasources/proxy') !== -1 || url.indexOf('api/ds/query') !== -1) {\n return true;\n }\n\n return false;\n}\n\nexport function isLocalUrl(url: string) {\n return !url.match(/^http/);\n}\n\nfunction getRefId(num: number): string {\n const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n if (num < letters.length) {\n return letters[num];\n } else {\n return getRefId(Math.floor(num / letters.length) - 1) + letters[num % letters.length];\n }\n}\n\n/**\n * Returns the input value for non empty string and undefined otherwise\n *\n * It is inadvisable to set a query param to an empty string as it will be added to the URL.\n * It is better to keep it undefined so the param won't be added to the URL at all.\n */\nexport function getQueryParamValue(value: string | undefined | null): string | undefined {\n return value || undefined;\n}\n","import { omit } from 'lodash';\n\nimport { DataQuery, DataSourceApi, dateTimeFormat, ExploreUrlState, urlUtil } from '@grafana/data';\nimport { serializeStateToUrlParam } from '@grafana/data/src/utils/url';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport {\n createErrorNotification,\n createSuccessNotification,\n createWarningNotification,\n} from 'app/core/copy/appNotification';\nimport { dispatch } from 'app/store/store';\nimport { RichHistoryQuery } from 'app/types/explore';\n\nimport RichHistoryLocalStorage from '../history/RichHistoryLocalStorage';\nimport RichHistoryRemoteStorage from '../history/RichHistoryRemoteStorage';\nimport {\n RichHistoryResults,\n RichHistoryServiceError,\n RichHistoryStorageWarning,\n RichHistoryStorageWarningDetails,\n} from '../history/RichHistoryStorage';\nimport { getRichHistoryStorage } from '../history/richHistoryStorageProvider';\n\nimport { RichHistorySearchFilters, RichHistorySettings, SortOrder } from './richHistoryTypes';\n\nexport { RichHistorySearchFilters, RichHistorySettings, SortOrder };\n\n/*\n * Add queries to rich history. Save only queries within the retention period, or that are starred.\n * Side-effect: store history in local storage\n */\n\nexport async function addToRichHistory(\n datasourceUid: string,\n datasourceName: string | null,\n queries: DataQuery[],\n starred: boolean,\n comment: string | null,\n showQuotaExceededError: boolean,\n showLimitExceededWarning: boolean\n): Promise<{ richHistoryStorageFull?: boolean; limitExceeded?: boolean }> {\n /* Save only queries, that are not falsy (e.g. empty object, null, ...) */\n const newQueriesToSave: DataQuery[] = queries && queries.filter((query) => notEmptyQuery(query));\n\n if (newQueriesToSave.length > 0) {\n let richHistoryStorageFull = false;\n let limitExceeded = false;\n let warning: RichHistoryStorageWarningDetails | undefined;\n\n try {\n const result = await getRichHistoryStorage().addToRichHistory({\n datasourceUid: datasourceUid,\n datasourceName: datasourceName ?? '',\n queries: newQueriesToSave,\n starred,\n comment: comment ?? '',\n });\n warning = result.warning;\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === RichHistoryServiceError.StorageFull) {\n richHistoryStorageFull = true;\n showQuotaExceededError && dispatch(notifyApp(createErrorNotification(error.message)));\n } else if (error.name !== RichHistoryServiceError.DuplicatedEntry) {\n dispatch(notifyApp(createErrorNotification('Rich History update failed', error.message)));\n }\n }\n // Saving failed. Do not add new entry.\n return { richHistoryStorageFull, limitExceeded };\n }\n\n // Limit exceeded but new entry was added. Notify that old entries have been removed.\n if (warning && warning.type === RichHistoryStorageWarning.LimitExceeded) {\n limitExceeded = true;\n showLimitExceededWarning && dispatch(notifyApp(createWarningNotification(warning.message)));\n }\n\n return { richHistoryStorageFull, limitExceeded };\n }\n\n // Nothing to change\n return {};\n}\n\nexport async function getRichHistory(filters: RichHistorySearchFilters): Promise<RichHistoryResults> {\n return await getRichHistoryStorage().getRichHistory(filters);\n}\n\nexport async function updateRichHistorySettings(settings: RichHistorySettings): Promise<void> {\n await getRichHistoryStorage().updateSettings(settings);\n}\n\nexport async function getRichHistorySettings(): Promise<RichHistorySettings> {\n return await getRichHistoryStorage().getSettings();\n}\n\nexport async function deleteAllFromRichHistory(): Promise<void> {\n return getRichHistoryStorage().deleteAll();\n}\n\nexport async function updateStarredInRichHistory(id: string, starred: boolean) {\n try {\n return await getRichHistoryStorage().updateStarred(id, starred);\n } catch (error) {\n if (error instanceof Error) {\n dispatch(notifyApp(createErrorNotification('Saving rich history failed', error.message)));\n }\n return undefined;\n }\n}\n\nexport async function updateCommentInRichHistory(id: string, newComment: string | undefined) {\n try {\n return await getRichHistoryStorage().updateComment(id, newComment);\n } catch (error) {\n if (error instanceof Error) {\n dispatch(notifyApp(createErrorNotification('Saving rich history failed', error.message)));\n }\n return undefined;\n }\n}\n\nexport async function deleteQueryInRichHistory(id: string) {\n try {\n await getRichHistoryStorage().deleteRichHistory(id);\n return id;\n } catch (error) {\n if (error instanceof Error) {\n dispatch(notifyApp(createErrorNotification('Saving rich history failed', error.message)));\n }\n return undefined;\n }\n}\n\nexport enum LocalStorageMigrationStatus {\n Successful = 'successful',\n Failed = 'failed',\n NotNeeded = 'not-needed',\n}\n\nexport interface LocalStorageMigrationResult {\n status: LocalStorageMigrationStatus;\n error?: Error;\n}\n\nexport async function migrateQueryHistoryFromLocalStorage(): Promise<LocalStorageMigrationResult> {\n const richHistoryLocalStorage = new RichHistoryLocalStorage();\n const richHistoryRemoteStorage = new RichHistoryRemoteStorage();\n\n try {\n const { richHistory } = await richHistoryLocalStorage.getRichHistory({\n datasourceFilters: [],\n from: 0,\n search: '',\n sortOrder: SortOrder.Descending,\n starred: false,\n to: 14,\n });\n if (richHistory.length === 0) {\n return { status: LocalStorageMigrationStatus.NotNeeded };\n }\n await richHistoryRemoteStorage.migrate(richHistory);\n dispatch(notifyApp(createSuccessNotification('Query history successfully migrated from local storage')));\n return { status: LocalStorageMigrationStatus.Successful };\n } catch (error) {\n const errorToThrow = error instanceof Error ? error : new Error('Uknown error occurred.');\n dispatch(notifyApp(createWarningNotification(`Query history migration failed. ${errorToThrow.message}`)));\n return { status: LocalStorageMigrationStatus.Failed, error: errorToThrow };\n }\n}\n\nexport const createUrlFromRichHistory = (query: RichHistoryQuery) => {\n const exploreState: ExploreUrlState = {\n /* Default range, as we are not saving timerange in rich history */\n range: { from: 'now-1h', to: 'now' },\n datasource: query.datasourceName,\n queries: query.queries,\n context: 'explore',\n };\n\n const serializedState = serializeStateToUrlParam(exploreState);\n const baseUrl = /.*(?=\\/explore)/.exec(`${window.location.href}`)![0];\n const url = urlUtil.renderUrl(`${baseUrl}/explore`, { left: serializedState });\n return url;\n};\n\n/* Needed for slider in Rich history to map numerical values to meaningful strings */\nexport const mapNumbertoTimeInSlider = (num: number) => {\n let str;\n switch (num) {\n case 0:\n str = 'today';\n break;\n case 1:\n str = 'yesterday';\n break;\n case 7:\n str = 'a week ago';\n break;\n case 14:\n str = 'two weeks ago';\n break;\n default:\n str = `${num} days ago`;\n }\n\n return str;\n};\n\nexport function createDateStringFromTs(ts: number) {\n return dateTimeFormat(ts, {\n format: 'MMMM D',\n });\n}\n\nexport function getQueryDisplayText(query: DataQuery): string {\n /* If datasource doesn't have getQueryDisplayText, create query display text by\n * stringifying query that was stripped of key, refId and datasource for nicer\n * formatting and improved readability\n */\n const strippedQuery = omit(query, ['key', 'refId', 'datasource']);\n return JSON.stringify(strippedQuery);\n}\n\nexport function createQueryHeading(query: RichHistoryQuery, sortOrder: SortOrder) {\n let heading = '';\n if (sortOrder === SortOrder.DatasourceAZ || sortOrder === SortOrder.DatasourceZA) {\n heading = query.datasourceName;\n } else {\n heading = createDateStringFromTs(query.createdAt);\n }\n return heading;\n}\n\nexport function createQueryText(query: DataQuery, queryDsInstance: DataSourceApi | undefined) {\n /* query DatasourceInstance is necessary because we use its getQueryDisplayText method\n * to format query text\n */\n if (queryDsInstance?.getQueryDisplayText) {\n return queryDsInstance.getQueryDisplayText(query);\n }\n\n return getQueryDisplayText(query);\n}\n\nexport function mapQueriesToHeadings(query: RichHistoryQuery[], sortOrder: SortOrder) {\n let mappedQueriesToHeadings: any = {};\n\n query.forEach((q) => {\n let heading = createQueryHeading(q, sortOrder);\n if (!(heading in mappedQueriesToHeadings)) {\n mappedQueriesToHeadings[heading] = [q];\n } else {\n mappedQueriesToHeadings[heading] = [...mappedQueriesToHeadings[heading], q];\n }\n });\n\n return mappedQueriesToHeadings;\n}\n\n/*\n * Create a list of all available data sources\n */\nexport function createDatasourcesList() {\n return getDataSourceSrv()\n .getList()\n .map((dsSettings) => {\n return {\n name: dsSettings.name,\n uid: dsSettings.uid,\n imgUrl: dsSettings.meta.info.logos.small,\n };\n });\n}\n\nexport function notEmptyQuery(query: DataQuery) {\n /* Check if query has any other properties besides key, refId and datasource.\n * If not, then we consider it empty query.\n */\n const strippedQuery = omit(query, ['key', 'refId', 'datasource']);\n const queryKeys = Object.keys(strippedQuery);\n\n if (queryKeys.length > 0) {\n return true;\n }\n\n return false;\n}\n","export enum SortOrder {\n Descending = 'Descending',\n Ascending = 'Ascending',\n /**\n * @deprecated supported only by local storage. It will be removed in the future\n */\n DatasourceAZ = 'Datasource A-Z',\n /**\n * @deprecated supported only by local storage. It will be removed in the future\n */\n DatasourceZA = 'Datasource Z-A',\n}\n\nexport interface RichHistorySettings {\n retentionPeriod: number;\n starredTabAsFirstTab: boolean;\n activeDatasourceOnly: boolean;\n lastUsedDatasourceFilters?: string[];\n}\n\nexport type RichHistorySearchFilters = {\n search: string;\n sortOrder: SortOrder;\n /** Names of data sources (not uids) - used by local and remote storage **/\n datasourceFilters: string[];\n from: number;\n to: number;\n starred: boolean;\n page?: number;\n};\n","import memoizeOne from 'memoize-one';\n\nimport { getBackendSrv, config } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification, createSuccessNotification } from 'app/core/copy/appNotification';\nimport { dispatch } from 'app/store/store';\n\nimport { copyStringToClipboard } from './explore';\n\nfunction buildHostUrl() {\n return `${window.location.protocol}//${window.location.host}${config.appSubUrl}`;\n}\n\nfunction getRelativeURLPath(url: string) {\n let path = url.replace(buildHostUrl(), '');\n return path.startsWith('/') ? path.substring(1, path.length) : path;\n}\n\nexport const createShortLink = memoizeOne(async function (path: string) {\n try {\n const shortLink = await getBackendSrv().post(`/api/short-urls`, {\n path: getRelativeURLPath(path),\n });\n return shortLink.url;\n } catch (err) {\n console.error('Error when creating shortened link: ', err);\n dispatch(notifyApp(createErrorNotification('Error generating shortened link')));\n }\n});\n\nexport const createAndCopyShortLink = async (path: string) => {\n const shortLink = await createShortLink(path);\n if (shortLink) {\n copyStringToClipboard(shortLink);\n dispatch(notifyApp(createSuccessNotification('Shortened link copied to clipboard')));\n } else {\n dispatch(notifyApp(createErrorNotification('Error generating shortened link')));\n }\n};\n","/**\n * Calculate tick step.\n * Implementation from d3-array (ticks.js)\n * https://github.com/d3/d3-array/blob/master/src/ticks.js\n * @param start Start value\n * @param stop End value\n * @param count Ticks count\n */\nexport function tickStep(start: number, stop: number, count: number): number {\n const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\n const step0 = Math.abs(stop - start) / Math.max(0, count);\n let step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10));\n const error = step0 / step1;\n\n if (error >= e10) {\n step1 *= 10;\n } else if (error >= e5) {\n step1 *= 5;\n } else if (error >= e2) {\n step1 *= 2;\n }\n\n return stop < start ? -step1 : step1;\n}\n\nexport function getScaledDecimals(decimals: number, tickSize: number) {\n return decimals - Math.floor(Math.log(tickSize) / Math.LN10);\n}\n\n/**\n * Calculate tick size based on min and max values, number of ticks and precision.\n * Implementation from Flot.\n * @param min Axis minimum\n * @param max Axis maximum\n * @param noTicks Number of ticks\n * @param tickDecimals Tick decimal precision\n */\nexport function getFlotTickSize(min: number, max: number, noTicks: number, tickDecimals: number) {\n const delta = (max - min) / noTicks;\n let dec = -Math.floor(Math.log(delta) / Math.LN10);\n const maxDec = tickDecimals;\n\n const magn = Math.pow(10, -dec);\n const norm = delta / magn; // norm is between 1.0 and 10.0\n let size;\n\n if (norm < 1.5) {\n size = 1;\n } else if (norm < 3) {\n size = 2;\n // special case for 2.5, requires an extra decimal\n if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\n size = 2.5;\n ++dec;\n }\n } else if (norm < 7.5) {\n size = 5;\n } else {\n size = 10;\n }\n\n size *= magn;\n\n return size;\n}\n\n/**\n * Calculate axis range (min and max).\n * Implementation from Flot.\n */\nexport function getFlotRange(panelMin: any, panelMax: any, datamin: number, datamax: number) {\n const autoscaleMargin = 0.02;\n\n let min = +(panelMin != null ? panelMin : datamin);\n let max = +(panelMax != null ? panelMax : datamax);\n const delta = max - min;\n\n if (delta === 0.0) {\n // Grafana fix: wide Y min and max using increased wideFactor\n // when all series values are the same\n const wideFactor = 0.25;\n const widen = Math.abs(max === 0 ? 1 : max * wideFactor);\n\n if (panelMin === null) {\n min -= widen;\n }\n // always widen max if we couldn't widen min to ensure we\n // don't fall into min == max which doesn't work\n if (panelMax == null || panelMin != null) {\n max += widen;\n }\n } else {\n // consider autoscaling\n const margin = autoscaleMargin;\n if (margin != null) {\n if (panelMin == null) {\n min -= delta * margin;\n // make sure we don't go below zero if all values\n // are positive\n if (min < 0 && datamin != null && datamin >= 0) {\n min = 0;\n }\n }\n if (panelMax == null) {\n max += delta * margin;\n if (max > 0 && datamax != null && datamax <= 0) {\n max = 0;\n }\n }\n }\n }\n return { min, max };\n}\n\n/**\n * Calculate tick decimals.\n * Implementation from Flot.\n */\nexport function getFlotTickDecimals(datamin: number, datamax: number, axis: { min: any; max: any }, height: number) {\n const { min, max } = getFlotRange(axis.min, axis.max, datamin, datamax);\n const noTicks = 0.3 * Math.sqrt(height);\n const delta = (max - min) / noTicks;\n const dec = -Math.floor(Math.log(delta) / Math.LN10);\n\n const magn = Math.pow(10, -dec);\n // norm is between 1.0 and 10.0\n const norm = delta / magn;\n let size;\n\n if (norm < 1.5) {\n size = 1;\n } else if (norm < 3) {\n size = 2;\n // special case for 2.5, requires an extra decimal\n if (norm > 2.25) {\n size = 2.5;\n }\n } else if (norm < 7.5) {\n size = 5;\n } else {\n size = 10;\n }\n size *= magn;\n\n const tickDecimals = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1);\n // grafana addition\n const scaledDecimals = tickDecimals - Math.floor(Math.log(size) / Math.LN10);\n return { tickDecimals, scaledDecimals };\n}\n\n/**\n * Format timestamp similar to Grafana graph panel.\n * @param ticks Number of ticks\n * @param min Time from (in milliseconds)\n * @param max Time to (in milliseconds)\n */\nexport function grafanaTimeFormat(ticks: number, min: number, max: number) {\n if (min && max && ticks) {\n const range = max - min;\n const secPerTick = range / ticks / 1000;\n const oneDay = 86400000;\n const oneYear = 31536000000;\n\n if (secPerTick <= 45) {\n return 'HH:mm:ss';\n }\n if (secPerTick <= 7200 || range <= oneDay) {\n return 'HH:mm';\n }\n if (secPerTick <= 80000) {\n return 'MM/DD HH:mm';\n }\n if (secPerTick <= 2419200 || range <= oneYear) {\n return 'MM/DD';\n }\n return 'YYYY-MM';\n }\n\n return 'HH:mm';\n}\n\n/**\n * Logarithm of value for arbitrary base.\n */\nexport function logp(value: number, base: number) {\n return Math.log(value) / Math.log(base);\n}\n\n/**\n * Get decimal precision of number (3.14 => 2)\n */\nexport function getPrecision(num: number): number {\n const str = num.toString();\n return getStringPrecision(str);\n}\n\n/**\n * Get decimal precision of number stored as a string (\"3.14\" => 2)\n */\nexport function getStringPrecision(num: string): number {\n if (isNaN(num as unknown as number)) {\n return 0;\n }\n\n const dotIndex = num.indexOf('.');\n if (dotIndex === -1) {\n return 0;\n } else {\n return num.length - dotIndex - 1;\n }\n}\n","import { TimeRange, toUtc, AbsoluteTimeRange } from '@grafana/data';\n\nexport const getShiftedTimeRange = (direction: number, origRange: TimeRange): AbsoluteTimeRange => {\n const range = {\n from: toUtc(origRange.from),\n to: toUtc(origRange.to),\n };\n\n const timespan = (range.to.valueOf() - range.from.valueOf()) / 2;\n let to: number, from: number;\n\n if (direction === -1) {\n to = range.to.valueOf() - timespan;\n from = range.from.valueOf() - timespan;\n } else if (direction === 1) {\n to = range.to.valueOf() + timespan;\n from = range.from.valueOf() + timespan;\n if (to > Date.now() && range.to.valueOf() < Date.now()) {\n to = Date.now();\n from = range.from.valueOf();\n }\n } else {\n to = range.to.valueOf();\n from = range.from.valueOf();\n }\n\n return { from, to };\n};\n\nexport const getZoomedTimeRange = (range: TimeRange, factor: number): AbsoluteTimeRange => {\n const timespan = range.to.valueOf() - range.from.valueOf();\n const center = range.to.valueOf() - timespan / 2;\n // If the timepsan is 0, zooming out would do nothing, so we force a zoom out to 30s\n const newTimespan = timespan === 0 ? 30000 : timespan * factor;\n\n const to = center + newTimespan / 2;\n const from = center - newTimespan / 2;\n\n return { from, to };\n};\n","import React from 'react';\n\nimport { OrgRole } from '@grafana/data';\nimport { Select } from '@grafana/ui';\n\ninterface Props {\n value: OrgRole;\n disabled?: boolean;\n 'aria-label'?: string;\n inputId?: string;\n onChange: (role: OrgRole) => void;\n autoFocus?: boolean;\n width?: number | 'auto';\n}\n\nconst options = Object.keys(OrgRole).map((key) => ({ label: key, value: key }));\n\nexport function OrgRolePicker({ value, onChange, 'aria-label': ariaLabel, inputId, autoFocus, ...restProps }: Props) {\n return (\n <Select\n inputId={inputId}\n value={value}\n options={options}\n onChange={(val) => onChange(val.value as OrgRole)}\n placeholder=\"Choose role...\"\n aria-label={ariaLabel}\n autoFocus={autoFocus}\n {...restProps}\n />\n );\n}\n","import { debounce } from 'lodash';\n\nimport { dateTimeFormatTimeAgo } from '@grafana/data';\nimport { featureEnabled, getBackendSrv, isFetchError, locationService } from '@grafana/runtime';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/core';\nimport { accessControlQueryParam } from 'app/core/utils/accessControl';\nimport { ThunkResult, LdapUser, UserSession, UserDTO, AccessControlAction, UserFilter } from 'app/types';\n\nimport {\n userAdminPageLoadedAction,\n userProfileLoadedAction,\n userOrgsLoadedAction,\n userSessionsLoadedAction,\n userAdminPageFailedAction,\n ldapConnectionInfoLoadedAction,\n ldapSyncStatusLoadedAction,\n userMappingInfoLoadedAction,\n userMappingInfoFailedAction,\n clearUserMappingInfoAction,\n clearUserErrorAction,\n ldapFailedAction,\n usersFetched,\n queryChanged,\n pageChanged,\n filterChanged,\n usersFetchBegin,\n usersFetchEnd,\n} from './reducers';\n// UserAdminPage\n\nexport function loadAdminUserPage(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n try {\n dispatch(userAdminPageLoadedAction(false));\n await dispatch(loadUserProfile(userId));\n await dispatch(loadUserOrgs(userId));\n await dispatch(loadUserSessions(userId));\n if (config.ldapEnabled && featureEnabled('ldapsync')) {\n await dispatch(loadLdapSyncStatus());\n }\n dispatch(userAdminPageLoadedAction(true));\n } catch (error) {\n console.error(error);\n\n if (isFetchError(error)) {\n const userError = {\n title: error.data.message,\n body: error.data.error,\n };\n\n dispatch(userAdminPageFailedAction(userError));\n }\n }\n };\n}\n\nexport function loadUserProfile(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n const user = await getBackendSrv().get(`/api/users/${userId}`, accessControlQueryParam());\n dispatch(userProfileLoadedAction(user));\n };\n}\n\nexport function updateUser(user: UserDTO): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().put(`/api/users/${user.id}`, user);\n dispatch(loadAdminUserPage(user.id));\n };\n}\n\nexport function setUserPassword(userId: number, password: string): ThunkResult<void> {\n return async (dispatch) => {\n const payload = { password };\n await getBackendSrv().put(`/api/admin/users/${userId}/password`, payload);\n dispatch(loadAdminUserPage(userId));\n };\n}\n\nexport function disableUser(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().post(`/api/admin/users/${userId}/disable`);\n locationService.push('/admin/users');\n };\n}\n\nexport function enableUser(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().post(`/api/admin/users/${userId}/enable`);\n dispatch(loadAdminUserPage(userId));\n };\n}\n\nexport function deleteUser(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().delete(`/api/admin/users/${userId}`);\n locationService.push('/admin/users');\n };\n}\n\nexport function updateUserPermissions(userId: number, isGrafanaAdmin: boolean): ThunkResult<void> {\n return async (dispatch) => {\n const payload = { isGrafanaAdmin };\n await getBackendSrv().put(`/api/admin/users/${userId}/permissions`, payload);\n dispatch(loadAdminUserPage(userId));\n };\n}\n\nexport function loadUserOrgs(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n const orgs = await getBackendSrv().get(`/api/users/${userId}/orgs`);\n dispatch(userOrgsLoadedAction(orgs));\n };\n}\n\nexport function addOrgUser(user: UserDTO, orgId: number, role: string): ThunkResult<void> {\n return async (dispatch) => {\n const payload = {\n loginOrEmail: user.login,\n role: role,\n };\n await getBackendSrv().post(`/api/orgs/${orgId}/users/`, payload);\n dispatch(loadAdminUserPage(user.id));\n };\n}\n\nexport function updateOrgUserRole(userId: number, orgId: number, role: string): ThunkResult<void> {\n return async (dispatch) => {\n const payload = { role };\n await getBackendSrv().patch(`/api/orgs/${orgId}/users/${userId}`, payload);\n dispatch(loadAdminUserPage(userId));\n };\n}\n\nexport function deleteOrgUser(userId: number, orgId: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().delete(`/api/orgs/${orgId}/users/${userId}`);\n dispatch(loadAdminUserPage(userId));\n };\n}\n\nexport function loadUserSessions(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n if (!contextSrv.hasPermission(AccessControlAction.UsersAuthTokenList)) {\n return;\n }\n\n const tokens = await getBackendSrv().get(`/api/admin/users/${userId}/auth-tokens`);\n tokens.reverse();\n\n const sessions = tokens.map((session: UserSession) => {\n return {\n id: session.id,\n isActive: session.isActive,\n seenAt: dateTimeFormatTimeAgo(session.seenAt),\n createdAt: session.createdAt,\n clientIp: session.clientIp,\n browser: session.browser,\n browserVersion: session.browserVersion,\n os: session.os,\n osVersion: session.osVersion,\n device: session.device,\n };\n });\n\n dispatch(userSessionsLoadedAction(sessions));\n };\n}\n\nexport function revokeSession(tokenId: number, userId: number): ThunkResult<void> {\n return async (dispatch) => {\n const payload = { authTokenId: tokenId };\n await getBackendSrv().post(`/api/admin/users/${userId}/revoke-auth-token`, payload);\n dispatch(loadUserSessions(userId));\n };\n}\n\nexport function revokeAllSessions(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().post(`/api/admin/users/${userId}/logout`);\n dispatch(loadUserSessions(userId));\n };\n}\n\n// LDAP user actions\n\nexport function loadLdapSyncStatus(): ThunkResult<void> {\n return async (dispatch) => {\n // Available only in enterprise\n const canReadLDAPStatus = contextSrv.hasPermission(AccessControlAction.LDAPStatusRead);\n if (featureEnabled('ldapsync') && canReadLDAPStatus) {\n const syncStatus = await getBackendSrv().get(`/api/admin/ldap-sync-status`);\n dispatch(ldapSyncStatusLoadedAction(syncStatus));\n }\n };\n}\n\nexport function syncLdapUser(userId: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().post(`/api/admin/ldap/sync/${userId}`);\n dispatch(loadAdminUserPage(userId));\n };\n}\n\n// LDAP debug page\n\nexport function loadLdapState(): ThunkResult<void> {\n return async (dispatch) => {\n if (!contextSrv.hasPermission(AccessControlAction.LDAPStatusRead)) {\n return;\n }\n\n try {\n const connectionInfo = await getBackendSrv().get(`/api/admin/ldap/status`);\n dispatch(ldapConnectionInfoLoadedAction(connectionInfo));\n } catch (error) {\n if (isFetchError(error)) {\n error.isHandled = true;\n const ldapError = {\n title: error.data.message,\n body: error.data.error,\n };\n dispatch(ldapFailedAction(ldapError));\n }\n }\n };\n}\n\nexport function loadUserMapping(username: string): ThunkResult<void> {\n return async (dispatch) => {\n try {\n const response = await getBackendSrv().get(`/api/admin/ldap/${encodeURIComponent(username)}`);\n const { name, surname, email, login, isGrafanaAdmin, isDisabled, roles, teams } = response;\n const userInfo: LdapUser = {\n info: { name, surname, email, login },\n permissions: { isGrafanaAdmin, isDisabled },\n roles,\n teams,\n };\n dispatch(userMappingInfoLoadedAction(userInfo));\n } catch (error) {\n if (isFetchError(error)) {\n error.isHandled = true;\n const userError = {\n title: error.data.message,\n body: error.data.error,\n };\n dispatch(clearUserMappingInfoAction());\n dispatch(userMappingInfoFailedAction(userError));\n }\n }\n };\n}\n\nexport function clearUserError(): ThunkResult<void> {\n return (dispatch) => {\n dispatch(clearUserErrorAction());\n };\n}\n\nexport function clearUserMappingInfo(): ThunkResult<void> {\n return (dispatch) => {\n dispatch(clearUserErrorAction());\n dispatch(clearUserMappingInfoAction());\n };\n}\n\n// UserListAdminPage\n\nconst getFilters = (filters: UserFilter[]) => {\n return filters\n .map((filter) => {\n if (Array.isArray(filter.value)) {\n return filter.value.map((v) => `${filter.name}=${v.value}`).join('&');\n }\n return `${filter.name}=${filter.value}`;\n })\n .join('&');\n};\n\nexport function fetchUsers(): ThunkResult<void> {\n return async (dispatch, getState) => {\n try {\n const { perPage, page, query, filters } = getState().userListAdmin;\n const result = await getBackendSrv().get(\n `/api/users/search?perpage=${perPage}&page=${page}&query=${query}&${getFilters(filters)}`\n );\n dispatch(usersFetched(result));\n } catch (error) {\n usersFetchEnd();\n console.error(error);\n }\n };\n}\n\nconst fetchUsersWithDebounce = debounce((dispatch) => dispatch(fetchUsers()), 500);\n\nexport function changeQuery(query: string): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(usersFetchBegin());\n dispatch(queryChanged(query));\n fetchUsersWithDebounce(dispatch);\n };\n}\n\nexport function changeFilter(filter: UserFilter): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(usersFetchBegin());\n dispatch(filterChanged(filter));\n fetchUsersWithDebounce(dispatch);\n };\n}\n\nexport function changePage(page: number): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(usersFetchBegin());\n dispatch(pageChanged(page));\n dispatch(fetchUsers());\n };\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport {\n LdapConnectionInfo,\n LdapError,\n LdapState,\n LdapUser,\n SyncInfo,\n UserAdminError,\n UserAdminState,\n UserDTO,\n UserOrg,\n UserSession,\n UserListAdminState,\n UserFilter,\n} from 'app/types';\n\nconst initialLdapState: LdapState = {\n connectionInfo: [],\n syncInfo: undefined,\n user: undefined,\n connectionError: undefined,\n userError: undefined,\n};\n\nconst ldapSlice = createSlice({\n name: 'ldap',\n initialState: initialLdapState,\n reducers: {\n ldapConnectionInfoLoadedAction: (state, action: PayloadAction<LdapConnectionInfo>): LdapState => ({\n ...state,\n ldapError: undefined,\n connectionInfo: action.payload,\n }),\n ldapFailedAction: (state, action: PayloadAction<LdapError>): LdapState => ({\n ...state,\n ldapError: action.payload,\n }),\n ldapSyncStatusLoadedAction: (state, action: PayloadAction<SyncInfo>): LdapState => ({\n ...state,\n syncInfo: action.payload,\n }),\n userMappingInfoLoadedAction: (state, action: PayloadAction<LdapUser>): LdapState => ({\n ...state,\n user: action.payload,\n userError: undefined,\n }),\n userMappingInfoFailedAction: (state, action: PayloadAction<LdapError>): LdapState => ({\n ...state,\n user: undefined,\n userError: action.payload,\n }),\n clearUserMappingInfoAction: (state, action: PayloadAction<undefined>): LdapState => ({\n ...state,\n user: undefined,\n }),\n clearUserErrorAction: (state, action: PayloadAction<undefined>): LdapState => ({\n ...state,\n userError: undefined,\n }),\n },\n});\n\nexport const {\n clearUserErrorAction,\n clearUserMappingInfoAction,\n ldapConnectionInfoLoadedAction,\n ldapFailedAction,\n ldapSyncStatusLoadedAction,\n userMappingInfoFailedAction,\n userMappingInfoLoadedAction,\n} = ldapSlice.actions;\n\nexport const ldapReducer = ldapSlice.reducer;\n\n// UserAdminPage\n\nconst initialUserAdminState: UserAdminState = {\n user: undefined,\n sessions: [],\n orgs: [],\n isLoading: true,\n error: undefined,\n};\n\nexport const userAdminSlice = createSlice({\n name: 'userAdmin',\n initialState: initialUserAdminState,\n reducers: {\n userProfileLoadedAction: (state, action: PayloadAction<UserDTO>): UserAdminState => ({\n ...state,\n user: action.payload,\n }),\n userOrgsLoadedAction: (state, action: PayloadAction<UserOrg[]>): UserAdminState => ({\n ...state,\n orgs: action.payload,\n }),\n userSessionsLoadedAction: (state, action: PayloadAction<UserSession[]>): UserAdminState => ({\n ...state,\n sessions: action.payload,\n }),\n userAdminPageLoadedAction: (state, action: PayloadAction<boolean>): UserAdminState => ({\n ...state,\n isLoading: !action.payload,\n }),\n userAdminPageFailedAction: (state, action: PayloadAction<UserAdminError>): UserAdminState => ({\n ...state,\n error: action.payload,\n isLoading: false,\n }),\n },\n});\n\nexport const {\n userProfileLoadedAction,\n userOrgsLoadedAction,\n userSessionsLoadedAction,\n userAdminPageLoadedAction,\n userAdminPageFailedAction,\n} = userAdminSlice.actions;\n\nexport const userAdminReducer = userAdminSlice.reducer;\n\n// UserListAdminPage\n\nconst initialUserListAdminState: UserListAdminState = {\n users: [],\n query: '',\n page: 0,\n perPage: 50,\n totalPages: 1,\n showPaging: false,\n filters: [{ name: 'activeLast30Days', value: false }],\n isLoading: false,\n};\n\ninterface UsersFetched {\n users: UserDTO[];\n perPage: number;\n page: number;\n totalCount: number;\n}\n\nexport const userListAdminSlice = createSlice({\n name: 'userListAdmin',\n initialState: initialUserListAdminState,\n reducers: {\n usersFetched: (state, action: PayloadAction<UsersFetched>) => {\n const { totalCount, perPage, ...rest } = action.payload;\n const totalPages = Math.ceil(totalCount / perPage);\n\n return {\n ...state,\n ...rest,\n totalPages,\n perPage,\n showPaging: totalPages > 1,\n isLoading: false,\n };\n },\n usersFetchBegin: (state) => {\n return { ...state, isLoading: true };\n },\n usersFetchEnd: (state) => {\n return { ...state, isLoading: false };\n },\n queryChanged: (state, action: PayloadAction<string>) => ({\n ...state,\n query: action.payload,\n page: 0,\n }),\n pageChanged: (state, action: PayloadAction<number>) => ({\n ...state,\n page: action.payload,\n }),\n filterChanged: (state, action: PayloadAction<UserFilter>) => {\n const { name, value } = action.payload;\n\n if (state.filters.some((filter) => filter.name === name)) {\n return {\n ...state,\n page: 0,\n filters: state.filters.map((filter) => (filter.name === name ? { ...filter, value } : filter)),\n };\n }\n return {\n ...state,\n page: 0,\n filters: [...state.filters, action.payload],\n };\n },\n },\n});\n\nexport const { usersFetched, usersFetchBegin, usersFetchEnd, queryChanged, pageChanged, filterChanged } =\n userListAdminSlice.actions;\nexport const userListAdminReducer = userListAdminSlice.reducer;\n\nexport default {\n ldap: ldapReducer,\n userAdmin: userAdminReducer,\n userListAdmin: userListAdminReducer,\n};\n","import { isArray, reduce } from 'lodash';\n\nimport { IconName } from '@grafana/ui';\nimport { QueryPartDef, QueryPart } from 'app/features/alerting/state/query_part';\n\nconst alertQueryDef = new QueryPartDef({\n type: 'query',\n params: [\n { name: 'queryRefId', type: 'string', dynamicLookup: true },\n {\n name: 'from',\n type: 'string',\n options: ['10s', '1m', '5m', '10m', '15m', '1h', '2h', '6h', '12h', '24h', '48h'],\n },\n { name: 'to', type: 'string', options: ['now', 'now-1m', 'now-5m', 'now-10m', 'now-1h'] },\n ],\n defaultParams: ['#A', '15m', 'now', 'avg'],\n});\n\nconst conditionTypes = [{ text: 'Query', value: 'query' }];\n\nconst alertStateSortScore = {\n alerting: 1,\n firing: 1,\n no_data: 2,\n pending: 3,\n ok: 4,\n paused: 5,\n inactive: 5,\n};\n\nexport enum EvalFunction {\n 'IsAbove' = 'gt',\n 'IsBelow' = 'lt',\n 'IsOutsideRange' = 'outside_range',\n 'IsWithinRange' = 'within_range',\n 'HasNoValue' = 'no_value',\n}\n\nconst evalFunctions = [\n { value: EvalFunction.IsAbove, text: 'IS ABOVE' },\n { value: EvalFunction.IsBelow, text: 'IS BELOW' },\n { value: EvalFunction.IsOutsideRange, text: 'IS OUTSIDE RANGE' },\n { value: EvalFunction.IsWithinRange, text: 'IS WITHIN RANGE' },\n { value: EvalFunction.HasNoValue, text: 'HAS NO VALUE' },\n];\n\nconst evalOperators = [\n { text: 'OR', value: 'or' },\n { text: 'AND', value: 'and' },\n];\n\nconst reducerTypes = [\n { text: 'avg()', value: 'avg' },\n { text: 'min()', value: 'min' },\n { text: 'max()', value: 'max' },\n { text: 'sum()', value: 'sum' },\n { text: 'count()', value: 'count' },\n { text: 'last()', value: 'last' },\n { text: 'median()', value: 'median' },\n { text: 'diff()', value: 'diff' },\n { text: 'diff_abs()', value: 'diff_abs' },\n { text: 'percent_diff()', value: 'percent_diff' },\n { text: 'percent_diff_abs()', value: 'percent_diff_abs' },\n { text: 'count_non_null()', value: 'count_non_null' },\n];\n\nconst noDataModes = [\n { text: 'Alerting', value: 'alerting' },\n { text: 'No Data', value: 'no_data' },\n { text: 'Keep Last State', value: 'keep_state' },\n { text: 'Ok', value: 'ok' },\n];\n\nconst executionErrorModes = [\n { text: 'Alerting', value: 'alerting' },\n { text: 'Keep Last State', value: 'keep_state' },\n];\n\nfunction createReducerPart(model: any) {\n const def = new QueryPartDef({ type: model.type, defaultParams: [] });\n return new QueryPart(model, def);\n}\n\n// state can also contain a \"Reason\", ie. \"Alerting (NoData)\" which indicates that the actual state is \"Alerting\" but\n// the reason it is set to \"Alerting\" is \"NoData\"; a lack of data points to evaluate.\nfunction normalizeAlertState(state: string) {\n return state.toLowerCase().replace(/_/g, '').split(' ')[0];\n}\n\ninterface AlertStateDisplayModel {\n text: string;\n iconClass: IconName;\n stateClass: string;\n}\n\nfunction getStateDisplayModel(state: string): AlertStateDisplayModel {\n const normalizedState = normalizeAlertState(state);\n\n switch (normalizedState) {\n case 'normal':\n case 'ok': {\n return {\n text: 'OK',\n iconClass: 'heart',\n stateClass: 'alert-state-ok',\n };\n }\n case 'alerting': {\n return {\n text: 'ALERTING',\n iconClass: 'heart-break',\n stateClass: 'alert-state-critical',\n };\n }\n case 'nodata': {\n return {\n text: 'NO DATA',\n iconClass: 'question-circle',\n stateClass: 'alert-state-warning',\n };\n }\n case 'paused': {\n return {\n text: 'PAUSED',\n iconClass: 'pause',\n stateClass: 'alert-state-paused',\n };\n }\n case 'pending': {\n return {\n text: 'PENDING',\n iconClass: 'hourglass',\n stateClass: 'alert-state-warning',\n };\n }\n\n case 'firing': {\n return {\n text: 'FIRING',\n iconClass: 'fire',\n stateClass: '',\n };\n }\n\n case 'inactive': {\n return {\n text: 'INACTIVE',\n iconClass: 'check',\n stateClass: '',\n };\n }\n\n case 'error': {\n return {\n text: 'ERROR',\n iconClass: 'heart-break',\n stateClass: 'alert-state-critical',\n };\n }\n\n case 'unknown':\n default: {\n return {\n text: 'UNKNOWN',\n iconClass: 'question-circle',\n stateClass: '.alert-state-paused',\n };\n }\n }\n}\n\nfunction joinEvalMatches(matches: any, separator: string) {\n return reduce(\n matches,\n (res, ev) => {\n if (ev.metric !== undefined && ev.value !== undefined) {\n res.push(ev.metric + '=' + ev.value);\n }\n\n // For backwards compatibility . Should be be able to remove this after ~2017-06-01\n if (ev.Metric !== undefined && ev.Value !== undefined) {\n res.push(ev.Metric + '=' + ev.Value);\n }\n\n return res;\n },\n [] as string[]\n ).join(separator);\n}\n\nfunction getAlertAnnotationInfo(ah: any) {\n // backward compatibility, can be removed in grafana 5.x\n // old way stored evalMatches in data property directly,\n // new way stores it in evalMatches property on new data object\n\n if (isArray(ah.data)) {\n return joinEvalMatches(ah.data, ', ');\n } else if (isArray(ah.data.evalMatches)) {\n return joinEvalMatches(ah.data.evalMatches, ', ');\n }\n\n if (ah.data.error) {\n return 'Error: ' + ah.data.error;\n }\n\n return '';\n}\n\nexport default {\n alertQueryDef: alertQueryDef,\n getStateDisplayModel: getStateDisplayModel,\n conditionTypes: conditionTypes,\n evalFunctions: evalFunctions,\n evalOperators: evalOperators,\n noDataModes: noDataModes,\n executionErrorModes: executionErrorModes,\n reducerTypes: reducerTypes,\n createReducerPart: createReducerPart,\n getAlertAnnotationInfo: getAlertAnnotationInfo,\n alertStateSortScore: alertStateSortScore,\n};\n","import { clone, each, map } from 'lodash';\n\nexport class QueryPartDef {\n type: string;\n params: any[];\n defaultParams: any[];\n renderer: any;\n category: any;\n addStrategy: any;\n\n constructor(options: any) {\n this.type = options.type;\n this.params = options.params;\n this.defaultParams = options.defaultParams;\n this.renderer = options.renderer;\n this.category = options.category;\n this.addStrategy = options.addStrategy;\n }\n}\n\nexport class QueryPart {\n part: any;\n def: QueryPartDef;\n params: any[];\n text: string;\n\n constructor(part: any, def: any) {\n this.part = part;\n this.def = def;\n if (!this.def) {\n throw { message: 'Could not find query part ' + part.type };\n }\n\n part.params = part.params || clone(this.def.defaultParams);\n this.params = part.params;\n this.text = '';\n this.updateText();\n }\n\n render(innerExpr: string) {\n return this.def.renderer(this, innerExpr);\n }\n\n hasMultipleParamsInString(strValue: string, index: number) {\n if (strValue.indexOf(',') === -1) {\n return false;\n }\n\n return this.def.params[index + 1] && this.def.params[index + 1].optional;\n }\n\n updateParam(strValue: string, index: number) {\n // handle optional parameters\n // if string contains ',' and next param is optional, split and update both\n if (this.hasMultipleParamsInString(strValue, index)) {\n each(strValue.split(','), (partVal, idx) => {\n this.updateParam(partVal.trim(), idx);\n });\n return;\n }\n\n if (strValue === '' && this.def.params[index].optional) {\n this.params.splice(index, 1);\n } else {\n this.params[index] = strValue;\n }\n\n this.part.params = this.params;\n this.updateText();\n }\n\n updateText() {\n if (this.params.length === 0) {\n this.text = this.def.type + '()';\n return;\n }\n\n let text = this.def.type + '(';\n text += this.params.join(', ');\n text += ')';\n this.text = text;\n }\n}\n\nexport function functionRenderer(part: any, innerExpr: string) {\n const str = part.def.type + '(';\n const parameters = map(part.params, (value, index) => {\n const paramType = part.def.params[index];\n if (paramType.type === 'time') {\n if (value === 'auto') {\n value = '$__interval';\n }\n }\n if (paramType.quote === 'single') {\n return \"'\" + value + \"'\";\n } else if (paramType.quote === 'double') {\n return '\"' + value + '\"';\n }\n\n return value;\n });\n\n if (innerExpr) {\n parameters.unshift(innerExpr);\n }\n return str + parameters.join(', ') + ')';\n}\n\nexport function suffixRenderer(part: QueryPart, innerExpr: string) {\n return innerExpr + ' ' + part.params[0];\n}\n\nexport function identityRenderer(part: QueryPart, innerExpr: string) {\n return part.params[0];\n}\n\nexport function quotedIdentityRenderer(part: QueryPart, innerExpr: string) {\n return '\"' + part.params[0] + '\"';\n}\n","import { combineReducers } from 'redux';\n\nimport { createAsyncMapSlice, createAsyncSlice } from '../utils/redux';\n\nimport {\n createOrUpdateSilenceAction,\n deleteAlertManagerConfigAction,\n fetchAlertGroupsAction,\n fetchAlertManagerConfigAction,\n fetchAmAlertsAction,\n fetchEditableRuleAction,\n fetchExternalAlertmanagersAction,\n fetchExternalAlertmanagersConfigAction,\n fetchFolderAction,\n fetchGrafanaAnnotationsAction,\n fetchGrafanaNotifiersAction,\n fetchPromRulesAction,\n fetchRulerRulesAction,\n fetchRulesSourceBuildInfoAction,\n fetchSilencesAction,\n saveRuleFormAction,\n testReceiversAction,\n updateAlertManagerConfigAction,\n updateLotexNamespaceAndGroupAction,\n} from './actions';\n\nexport const reducer = combineReducers({\n dataSources: createAsyncMapSlice(\n 'dataSources',\n fetchRulesSourceBuildInfoAction,\n ({ rulesSourceName }) => rulesSourceName\n ).reducer,\n promRules: createAsyncMapSlice('promRules', fetchPromRulesAction, ({ rulesSourceName }) => rulesSourceName).reducer,\n rulerRules: createAsyncMapSlice('rulerRules', fetchRulerRulesAction, ({ rulesSourceName }) => rulesSourceName)\n .reducer,\n amConfigs: createAsyncMapSlice(\n 'amConfigs',\n fetchAlertManagerConfigAction,\n (alertManagerSourceName) => alertManagerSourceName\n ).reducer,\n silences: createAsyncMapSlice('silences', fetchSilencesAction, (alertManagerSourceName) => alertManagerSourceName)\n .reducer,\n ruleForm: combineReducers({\n saveRule: createAsyncSlice('saveRule', saveRuleFormAction).reducer,\n existingRule: createAsyncSlice('existingRule', fetchEditableRuleAction).reducer,\n }),\n grafanaNotifiers: createAsyncSlice('grafanaNotifiers', fetchGrafanaNotifiersAction).reducer,\n saveAMConfig: createAsyncSlice('saveAMConfig', updateAlertManagerConfigAction).reducer,\n deleteAMConfig: createAsyncSlice('deleteAMConfig', deleteAlertManagerConfigAction).reducer,\n updateSilence: createAsyncSlice('updateSilence', createOrUpdateSilenceAction).reducer,\n amAlerts: createAsyncMapSlice('amAlerts', fetchAmAlertsAction, (alertManagerSourceName) => alertManagerSourceName)\n .reducer,\n folders: createAsyncMapSlice('folders', fetchFolderAction, (uid) => uid).reducer,\n amAlertGroups: createAsyncMapSlice(\n 'amAlertGroups',\n fetchAlertGroupsAction,\n (alertManagerSourceName) => alertManagerSourceName\n ).reducer,\n testReceivers: createAsyncSlice('testReceivers', testReceiversAction).reducer,\n updateLotexNamespaceAndGroup: createAsyncSlice('updateLotexNamespaceAndGroup', updateLotexNamespaceAndGroupAction)\n .reducer,\n externalAlertmanagers: combineReducers({\n alertmanagerConfig: createAsyncSlice('alertmanagerConfig', fetchExternalAlertmanagersConfigAction).reducer,\n discoveredAlertmanagers: createAsyncSlice('discoveredAlertmanagers', fetchExternalAlertmanagersAction).reducer,\n }),\n managedAlertStateHistory: createAsyncSlice('managedAlertStateHistory', fetchGrafanaAnnotationsAction).reducer,\n});\n\nexport type UnifiedAlertingState = ReturnType<typeof reducer>;\n\nexport default reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { dateTime } from '@grafana/data';\nimport {\n AlertRule,\n AlertRuleDTO,\n AlertRulesState,\n NotificationChannelOption,\n NotificationChannelState,\n NotifierDTO,\n} from 'app/types';\n\nimport unifiedAlertingReducer from '../unified/state/reducers';\n\nimport alertDef from './alertDef';\n\nexport const initialState: AlertRulesState = {\n items: [],\n searchQuery: '',\n isLoading: false,\n};\n\nexport const initialChannelState: NotificationChannelState = {\n notificationChannelTypes: [],\n notificationChannel: {},\n notifiers: [],\n};\n\nfunction convertToAlertRule(dto: AlertRuleDTO, state: string): AlertRule {\n const stateModel = alertDef.getStateDisplayModel(state);\n\n const rule: AlertRule = {\n ...dto,\n stateText: stateModel.text,\n stateIcon: stateModel.iconClass,\n stateClass: stateModel.stateClass,\n stateAge: dateTime(dto.newStateDate).fromNow(true),\n };\n\n if (rule.state !== 'paused') {\n if (rule.executionError) {\n rule.info = 'Execution Error: ' + rule.executionError;\n }\n if (rule.evalData && rule.evalData.noData) {\n rule.info = 'Query returned no data';\n }\n }\n\n return rule;\n}\n\nconst alertRulesSlice = createSlice({\n name: 'alertRules',\n initialState,\n reducers: {\n loadAlertRules: (state) => {\n return { ...state, isLoading: true };\n },\n loadedAlertRules: (state, action: PayloadAction<AlertRuleDTO[]>): AlertRulesState => {\n const alertRules: AlertRuleDTO[] = action.payload;\n\n const alertRulesViewModel: AlertRule[] = alertRules.map((rule) => {\n return convertToAlertRule(rule, rule.state);\n });\n\n return { ...state, items: alertRulesViewModel, isLoading: false };\n },\n setSearchQuery: (state, action: PayloadAction<string>): AlertRulesState => {\n return { ...state, searchQuery: action.payload };\n },\n },\n});\n\nconst notificationChannelSlice = createSlice({\n name: 'notificationChannel',\n initialState: initialChannelState,\n reducers: {\n setNotificationChannels: (state, action: PayloadAction<NotifierDTO[]>): NotificationChannelState => {\n return {\n ...state,\n notificationChannelTypes: transformNotifiers(action.payload),\n notifiers: action.payload,\n };\n },\n notificationChannelLoaded: (state, action: PayloadAction<any>): NotificationChannelState => {\n const notificationChannel = action.payload;\n const selectedType: NotifierDTO = state.notifiers.find((t) => t.type === notificationChannel.type)!;\n const secureChannelOptions = selectedType.options.filter((o: NotificationChannelOption) => o.secure);\n /*\n If any secure field is in plain text we need to migrate it to use secure field instead.\n */\n if (\n secureChannelOptions.length > 0 &&\n secureChannelOptions.some((o: NotificationChannelOption) => {\n return notificationChannel.settings[o.propertyName] !== '';\n })\n ) {\n return migrateSecureFields(state, action.payload, secureChannelOptions);\n }\n\n return { ...state, notificationChannel: notificationChannel };\n },\n resetSecureField: (state, action: PayloadAction<string>): NotificationChannelState => {\n return {\n ...state,\n notificationChannel: {\n ...state.notificationChannel,\n secureFields: { ...state.notificationChannel.secureFields, [action.payload]: false },\n },\n };\n },\n },\n});\n\nexport const { loadAlertRules, loadedAlertRules, setSearchQuery } = alertRulesSlice.actions;\n\nexport const { setNotificationChannels, notificationChannelLoaded, resetSecureField } =\n notificationChannelSlice.actions;\n\nexport const alertRulesReducer = alertRulesSlice.reducer;\nexport const notificationChannelReducer = notificationChannelSlice.reducer;\n\nexport default {\n alertRules: alertRulesReducer,\n notificationChannel: notificationChannelReducer,\n unifiedAlerting: unifiedAlertingReducer,\n};\n\nfunction migrateSecureFields(\n state: NotificationChannelState,\n notificationChannel: any,\n secureChannelOptions: NotificationChannelOption[]\n) {\n const cleanedSettings: { [key: string]: string } = {};\n const secureSettings: { [key: string]: string } = {};\n\n secureChannelOptions.forEach((option) => {\n secureSettings[option.propertyName] = notificationChannel.settings[option.propertyName];\n cleanedSettings[option.propertyName] = '';\n });\n\n return {\n ...state,\n notificationChannel: {\n ...notificationChannel,\n settings: { ...notificationChannel.settings, ...cleanedSettings },\n secureSettings: { ...secureSettings },\n },\n };\n}\n\nfunction transformNotifiers(notifiers: NotifierDTO[]) {\n return notifiers\n .map((option: NotifierDTO) => {\n return {\n value: option.type,\n label: option.name,\n ...option,\n typeName: option.type,\n };\n })\n .sort((o1, o2) => {\n if (o1.name > o2.name) {\n return 1;\n }\n return -1;\n });\n}\n","import { lastValueFrom } from 'rxjs';\n\nimport { getBackendSrv, isFetchError } from '@grafana/runtime';\nimport { PromApplication, PromApiFeatures, PromBuildInfoResponse } from 'app/types/unified-alerting-dto';\n\nimport { RULER_NOT_SUPPORTED_MSG } from '../utils/constants';\nimport { getDataSourceByName } from '../utils/datasource';\n\nimport { fetchRules } from './prometheus';\nimport { fetchTestRulerRulesGroup } from './ruler';\n\n/**\n * This function will attempt to detect what type of system we are talking to; this could be\n * Prometheus (vanilla) | Cortex | Mimir\n *\n * Cortex and Mimir allow editing rules via their API, Prometheus does not.\n * Prometheus and Mimir expose a `buildinfo` endpoint, Cortex does not.\n * Mimir reports which \"features\" are enabled or available via the buildinfo endpoint, Prometheus does not.\n */\nexport async function discoverDataSourceFeatures(dsSettings: {\n url: string;\n name: string;\n type: 'prometheus' | 'loki';\n}): Promise<PromApiFeatures> {\n const { url, name, type } = dsSettings;\n\n // The current implementation of Loki's build info endpoint is useless\n // because it doesn't provide information about Loki's available features (e.g. Ruler API)\n // It's better to skip fetching it for Loki and go the Cortex path (manual discovery)\n const buildInfoResponse = type === 'prometheus' ? await fetchPromBuildInfo(url) : undefined;\n\n // check if the component returns buildinfo\n const hasBuildInfo = buildInfoResponse !== undefined;\n\n // we are dealing with a Cortex or Loki datasource since the response for buildinfo came up empty\n if (!hasBuildInfo) {\n // check if we can fetch rules via the prometheus compatible api\n const promRulesSupported = await hasPromRulesSupport(name);\n if (!promRulesSupported) {\n throw new Error(`Unable to fetch alert rules. Is the ${name} data source properly configured?`);\n }\n\n // check if the ruler is enabled\n const rulerSupported = await hasRulerSupport(name);\n\n return {\n application: PromApplication.Lotex,\n features: {\n rulerApiEnabled: rulerSupported,\n },\n };\n }\n\n // if no features are reported but buildinfo was return we're talking to Prometheus\n const { features } = buildInfoResponse.data;\n if (!features) {\n return {\n application: PromApplication.Prometheus,\n features: {\n rulerApiEnabled: false,\n },\n };\n }\n\n // if we have both features and buildinfo reported we're talking to Mimir\n return {\n application: PromApplication.Mimir,\n features: {\n rulerApiEnabled: features?.ruler_config_api === 'true',\n },\n };\n}\n\n/**\n * Attempt to fetch buildinfo from our component\n */\nexport async function discoverFeatures(dataSourceName: string): Promise<PromApiFeatures> {\n const dsConfig = getDataSourceByName(dataSourceName);\n if (!dsConfig) {\n throw new Error(`Cannot find data source configuration for ${dataSourceName}`);\n }\n const { url, name, type } = dsConfig;\n if (!url) {\n throw new Error(`The data souce url cannot be empty.`);\n }\n\n if (type !== 'prometheus' && type !== 'loki') {\n throw new Error(`The build info request is not available for ${type}. Only 'prometheus' and 'loki' are supported`);\n }\n\n return discoverDataSourceFeatures({ name, url, type });\n}\n\nasync function fetchPromBuildInfo(url: string): Promise<PromBuildInfoResponse | undefined> {\n const response = await lastValueFrom(\n getBackendSrv().fetch<PromBuildInfoResponse>({\n url: `${url}/api/v1/status/buildinfo`,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n ).catch((e) => {\n if ('status' in e && e.status === 404) {\n return undefined; // Cortex does not support buildinfo endpoint, we return an empty response\n }\n\n throw e;\n });\n\n return response?.data;\n}\n\n/**\n * Check if the component allows us to fetch rules\n */\nasync function hasPromRulesSupport(dataSourceName: string) {\n try {\n await fetchRules(dataSourceName);\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Attempt to check if the ruler API is enabled for Cortex, Prometheus does not support it and Mimir\n * reports this via the buildInfo \"features\"\n */\nasync function hasRulerSupport(dataSourceName: string) {\n try {\n await fetchTestRulerRulesGroup(dataSourceName);\n return true;\n } catch (e) {\n if (errorIndicatesMissingRulerSupport(e)) {\n return false;\n }\n throw e;\n }\n}\n\n// there errors indicate that the ruler API might be disabled or not supported for Cortex\nfunction errorIndicatesMissingRulerSupport(error: any) {\n return (\n (isFetchError(error) &&\n (error.data.message?.includes('GetRuleGroup unsupported in rule local store') || // \"local\" rule storage\n error.data.message?.includes('page not found'))) || // ruler api disabled\n error.message?.includes('404 from rules config endpoint') || // ruler api disabled\n error.data.message?.includes(RULER_NOT_SUPPORTED_MSG) // ruler api not supported\n );\n}\n","import { lastValueFrom } from 'rxjs';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { RuleNamespace } from 'app/types/unified-alerting';\nimport { PromRulesResponse } from 'app/types/unified-alerting-dto';\n\nimport { getDatasourceAPIUid, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nexport interface FetchPromRulesFilter {\n dashboardUID: string;\n panelId?: number;\n}\n\nexport interface PrometheusDataSourceConfig {\n dataSourceName: string;\n}\n\nexport function prometheusUrlBuilder(dataSourceConfig: PrometheusDataSourceConfig) {\n const { dataSourceName } = dataSourceConfig;\n\n return {\n rules: (filter?: FetchPromRulesFilter) => {\n const searchParams = new URLSearchParams();\n const params = prepareRulesFilterQueryParams(searchParams, filter);\n\n return {\n url: `/api/prometheus/${getDatasourceAPIUid(dataSourceName)}/api/v1/rules`,\n params: params,\n };\n },\n };\n}\n\nexport function prepareRulesFilterQueryParams(\n params: URLSearchParams,\n filter?: FetchPromRulesFilter\n): Record<string, string> {\n if (filter?.dashboardUID) {\n params.set('dashboard_uid', filter.dashboardUID);\n if (filter?.panelId) {\n params.set('panel_id', String(filter.panelId));\n }\n }\n\n return Object.fromEntries(params);\n}\n\nexport async function fetchRules(dataSourceName: string, filter?: FetchPromRulesFilter): Promise<RuleNamespace[]> {\n if (filter?.dashboardUID && dataSourceName !== GRAFANA_RULES_SOURCE_NAME) {\n throw new Error('Filtering by dashboard UID is only supported for Grafana Managed rules.');\n }\n\n const { url, params } = prometheusUrlBuilder({ dataSourceName }).rules(filter);\n\n const response = await lastValueFrom(\n getBackendSrv().fetch<PromRulesResponse>({\n url,\n params,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n ).catch((e) => {\n if ('status' in e && e.status === 404) {\n throw new Error('404 from rule state endpoint. Perhaps ruler API is not enabled?');\n }\n throw e;\n });\n\n const nsMap: { [key: string]: RuleNamespace } = {};\n response.data.data.groups.forEach((group) => {\n group.rules.forEach((rule) => {\n rule.query = rule.query || '';\n });\n if (!nsMap[group.file]) {\n nsMap[group.file] = {\n dataSourceName,\n name: group.file,\n groups: [group],\n };\n } else {\n nsMap[group.file].groups.push(group);\n }\n });\n\n return Object.values(nsMap);\n}\n","import { lastValueFrom } from 'rxjs';\n\nimport { FetchResponse, getBackendSrv } from '@grafana/runtime';\nimport { RulerDataSourceConfig } from 'app/types/unified-alerting';\nimport { PostableRulerRuleGroupDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto';\n\nimport { RULER_NOT_SUPPORTED_MSG } from '../utils/constants';\nimport { getDatasourceAPIUid, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nimport { prepareRulesFilterQueryParams } from './prometheus';\n\ninterface ErrorResponseMessage {\n message?: string;\n error?: string;\n}\n\nexport interface RulerRequestUrl {\n path: string;\n params?: Record<string, string>;\n}\n\nexport function rulerUrlBuilder(rulerConfig: RulerDataSourceConfig) {\n const grafanaServerPath = `/api/ruler/${getDatasourceAPIUid(rulerConfig.dataSourceName)}`;\n\n const rulerPath = `${grafanaServerPath}/api/v1/rules`;\n const rulerSearchParams = new URLSearchParams();\n\n rulerSearchParams.set('subtype', rulerConfig.apiVersion === 'legacy' ? 'cortex' : 'mimir');\n\n return {\n rules: (filter?: FetchRulerRulesFilter): RulerRequestUrl => {\n const params = prepareRulesFilterQueryParams(rulerSearchParams, filter);\n\n return {\n path: `${rulerPath}`,\n params: params,\n };\n },\n namespace: (namespace: string): RulerRequestUrl => ({\n path: `${rulerPath}/${encodeURIComponent(namespace)}`,\n params: Object.fromEntries(rulerSearchParams),\n }),\n namespaceGroup: (namespace: string, group: string): RulerRequestUrl => ({\n path: `${rulerPath}/${encodeURIComponent(namespace)}/${encodeURIComponent(group)}`,\n params: Object.fromEntries(rulerSearchParams),\n }),\n };\n}\n\n// upsert a rule group. use this to update rule\nexport async function setRulerRuleGroup(\n rulerConfig: RulerDataSourceConfig,\n namespace: string,\n group: PostableRulerRuleGroupDTO\n): Promise<void> {\n const { path, params } = rulerUrlBuilder(rulerConfig).namespace(namespace);\n await lastValueFrom(\n getBackendSrv().fetch<unknown>({\n method: 'POST',\n url: path,\n data: group,\n showErrorAlert: false,\n showSuccessAlert: false,\n params,\n })\n );\n}\n\nexport interface FetchRulerRulesFilter {\n dashboardUID: string;\n panelId?: number;\n}\n\n// fetch all ruler rule namespaces and included groups\nexport async function fetchRulerRules(rulerConfig: RulerDataSourceConfig, filter?: FetchRulerRulesFilter) {\n if (filter?.dashboardUID && rulerConfig.dataSourceName !== GRAFANA_RULES_SOURCE_NAME) {\n throw new Error('Filtering by dashboard UID is only supported by Grafana.');\n }\n\n // TODO Move params creation to the rules function\n const { path: url, params } = rulerUrlBuilder(rulerConfig).rules(filter);\n return rulerGetRequest<RulerRulesConfigDTO>(url, {}, params);\n}\n\n// fetch rule groups for a particular namespace\n// will throw with { status: 404 } if namespace does not exist\nexport async function fetchRulerRulesNamespace(rulerConfig: RulerDataSourceConfig, namespace: string) {\n const { path, params } = rulerUrlBuilder(rulerConfig).namespace(namespace);\n const result = await rulerGetRequest<Record<string, RulerRuleGroupDTO[]>>(path, {}, params);\n return result[namespace] || [];\n}\n\n// fetch a particular rule group\n// will throw with { status: 404 } if rule group does not exist\nexport async function fetchTestRulerRulesGroup(dataSourceName: string): Promise<RulerRuleGroupDTO | null> {\n return rulerGetRequest<RulerRuleGroupDTO | null>(\n `/api/ruler/${getDatasourceAPIUid(dataSourceName)}/api/v1/rules/test/test`,\n null\n );\n}\n\nexport async function fetchRulerRulesGroup(\n rulerConfig: RulerDataSourceConfig,\n namespace: string,\n group: string\n): Promise<RulerRuleGroupDTO | null> {\n const { path, params } = rulerUrlBuilder(rulerConfig).namespaceGroup(namespace, group);\n return rulerGetRequest<RulerRuleGroupDTO | null>(path, null, params);\n}\n\nexport async function deleteRulerRulesGroup(rulerConfig: RulerDataSourceConfig, namespace: string, groupName: string) {\n const { path, params } = rulerUrlBuilder(rulerConfig).namespaceGroup(namespace, groupName);\n await lastValueFrom(\n getBackendSrv().fetch({\n url: path,\n method: 'DELETE',\n showSuccessAlert: false,\n showErrorAlert: false,\n params,\n })\n );\n}\n\n// false in case ruler is not supported. this is weird, but we'll work on it\nasync function rulerGetRequest<T>(url: string, empty: T, params?: Record<string, string>): Promise<T> {\n try {\n const response = await lastValueFrom(\n getBackendSrv().fetch<T>({\n url,\n showErrorAlert: false,\n showSuccessAlert: false,\n params,\n })\n );\n return response.data;\n } catch (error) {\n if (!isResponseError(error)) {\n throw error;\n }\n\n if (isCortexErrorResponse(error)) {\n return empty;\n } else if (isRulerNotSupported(error)) {\n // assert if the endoint is not supported at all\n throw {\n ...error,\n data: {\n ...error.data,\n message: RULER_NOT_SUPPORTED_MSG,\n },\n };\n }\n throw error;\n }\n}\n\nfunction isResponseError(error: unknown): error is FetchResponse<ErrorResponseMessage> {\n const hasErrorMessage = (error as FetchResponse<ErrorResponseMessage>).data != null;\n const hasErrorCode = Number.isFinite((error as FetchResponse<ErrorResponseMessage>).status);\n return hasErrorCode && hasErrorMessage;\n}\n\nfunction isRulerNotSupported(error: FetchResponse<ErrorResponseMessage>) {\n return (\n error.status === 404 ||\n (error.status === 500 &&\n error.data.message?.includes('unexpected content type from upstream. expected YAML, got text/html'))\n );\n}\n\nfunction isCortexErrorResponse(error: FetchResponse<ErrorResponseMessage>) {\n return (\n error.status === 404 &&\n (error.data.message?.includes('group does not exist') || error.data.message?.includes('no rule groups found'))\n );\n}\n\nexport async function deleteNamespace(rulerConfig: RulerDataSourceConfig, namespace: string): Promise<void> {\n const { path, params } = rulerUrlBuilder(rulerConfig).namespace(namespace);\n await lastValueFrom(\n getBackendSrv().fetch<unknown>({\n method: 'DELETE',\n url: path,\n showErrorAlert: false,\n showSuccessAlert: false,\n params,\n })\n );\n}\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { IconButton, useStyles } from '@grafana/ui';\n\ninterface Props {\n labelKey: string;\n value: string;\n operator?: string;\n onRemoveLabel?: () => void;\n}\n\nexport const AlertLabel: FC<Props> = ({ labelKey, value, operator = '=', onRemoveLabel }) => (\n <div className={useStyles(getStyles)}>\n {labelKey}\n {operator}\n {value}\n {!!onRemoveLabel && <IconButton name=\"times\" size=\"xs\" onClick={onRemoveLabel} />}\n </div>\n);\n\nexport const getStyles = (theme: GrafanaTheme) => css`\n padding: ${theme.spacing.xs} ${theme.spacing.sm};\n border-radius: ${theme.border.radius.sm};\n border: solid 1px ${theme.colors.border2};\n font-size: ${theme.typography.size.sm};\n background-color: ${theme.colors.bg2};\n font-weight: ${theme.typography.weight.bold};\n color: ${theme.colors.formLabel};\n display: inline-block;\n line-height: 1.2;\n`;\n","import React from 'react';\n\nimport { TagList } from '@grafana/ui';\n\ntype Props = { labels: Record<string, string>; className?: string };\n\nexport const AlertLabels = ({ labels, className }: Props) => {\n const pairs = Object.entries(labels).filter(([key]) => !(key.startsWith('__') && key.endsWith('__')));\n return (\n <div className={className}>\n <TagList tags={Object.values(pairs).map(([label, value]) => `${label}=${value}`)} />\n </div>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { Field, Select, useStyles2 } from '@grafana/ui';\n\nimport { AlertManagerDataSource, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\ninterface Props {\n onChange: (alertManagerSourceName: string) => void;\n current?: string;\n disabled?: boolean;\n dataSources: AlertManagerDataSource[];\n}\n\nfunction getAlertManagerLabel(alertManager: AlertManagerDataSource) {\n return alertManager.name === GRAFANA_RULES_SOURCE_NAME ? 'Grafana' : alertManager.name.slice(0, 37);\n}\n\nexport const AlertManagerPicker: FC<Props> = ({ onChange, current, dataSources, disabled = false }) => {\n const styles = useStyles2(getStyles);\n\n const options: Array<SelectableValue<string>> = useMemo(() => {\n return dataSources.map((ds) => ({\n label: getAlertManagerLabel(ds),\n value: ds.name,\n imgUrl: ds.imgUrl,\n meta: ds.meta,\n }));\n }, [dataSources]);\n\n return (\n <Field\n className={styles.field}\n label={disabled ? 'Alertmanager' : 'Choose Alertmanager'}\n disabled={disabled || options.length === 1}\n data-testid=\"alertmanager-picker\"\n >\n <Select\n aria-label={disabled ? 'Alertmanager' : 'Choose Alertmanager'}\n width={29}\n className=\"ds-picker select-container\"\n backspaceRemovesValue={false}\n onChange={(value) => value.value && onChange(value.value)}\n options={options}\n maxMenuHeight={500}\n noOptionsMessage=\"No datasources found\"\n value={current}\n getOptionLabel={(o) => o.label}\n />\n </Field>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n field: css`\n margin-bottom: ${theme.spacing(4)};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Tooltip, useStyles } from '@grafana/ui';\n\nimport { Annotation, annotationLabels } from '../utils/constants';\n\nimport { DetailsField } from './DetailsField';\nimport { Tokenize } from './Tokenize';\nimport { Well } from './Well';\n\nconst wellableAnnotationKeys = ['message', 'description'];\n\ninterface Props {\n annotationKey: string;\n value: string;\n}\n\nexport const AnnotationDetailsField: FC<Props> = ({ annotationKey, value }) => {\n const label = annotationLabels[annotationKey as Annotation] ? (\n <Tooltip content={annotationKey} placement=\"top\" theme=\"info\">\n <span>{annotationLabels[annotationKey as Annotation]}</span>\n </Tooltip>\n ) : (\n annotationKey\n );\n\n return (\n <DetailsField label={label} horizontal={true}>\n <AnnotationValue annotationKey={annotationKey} value={value} />\n </DetailsField>\n );\n};\n\nconst AnnotationValue: FC<Props> = ({ annotationKey, value }) => {\n const styles = useStyles(getStyles);\n\n const needsWell = wellableAnnotationKeys.includes(annotationKey);\n const needsLink = value && value.startsWith('http');\n\n const tokenizeValue = <Tokenize input={value} delimiter={['{{', '}}']} />;\n\n if (needsWell) {\n return <Well className={styles.well}>{tokenizeValue}</Well>;\n }\n\n if (needsLink) {\n return (\n <a href={value} target=\"__blank\" className={styles.link}>\n {value}\n </a>\n );\n }\n\n return <>{tokenizeValue}</>;\n};\n\nexport const getStyles = (theme: GrafanaTheme) => ({\n well: css`\n word-break: break-word;\n `,\n link: css`\n word-break: break-all;\n color: ${theme.colors.textBlue};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC, HTMLAttributes } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { IconSize, useStyles2, Button } from '@grafana/ui';\n\ninterface Props extends HTMLAttributes<HTMLButtonElement> {\n isCollapsed: boolean;\n onToggle: (isCollapsed: boolean) => void;\n // Todo: this should be made compulsory for a11y purposes\n idControlled?: string;\n size?: IconSize;\n className?: string;\n text?: string;\n}\n\nexport const CollapseToggle: FC<Props> = ({\n isCollapsed,\n onToggle,\n idControlled,\n className,\n text,\n size = 'xl',\n ...restOfProps\n}) => {\n const styles = useStyles2(getStyles);\n\n return (\n <Button\n type=\"button\"\n fill=\"text\"\n aria-expanded={!isCollapsed}\n aria-controls={idControlled}\n className={cx(styles.expandButton, className)}\n icon={isCollapsed ? 'angle-right' : 'angle-down'}\n onClick={() => onToggle(!isCollapsed)}\n {...restOfProps}\n >\n {text}\n </Button>\n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n expandButton: css`\n color: ${theme.colors.text.secondary};\n margin-right: ${theme.spacing(1)};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\ninterface Props {\n label: React.ReactNode;\n className?: string;\n horizontal?: boolean;\n}\n\nexport const DetailsField: FC<Props> = ({ className, label, horizontal, children }) => {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={cx(className, styles.field, horizontal ? styles.fieldHorizontal : styles.fieldVertical)}>\n <div>{label}</div>\n <div>{children}</div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n fieldHorizontal: css`\n flex-direction: row;\n ${theme.breakpoints.down('md')} {\n flex-direction: column;\n }\n `,\n fieldVertical: css`\n flex-direction: column;\n `,\n field: css`\n display: flex;\n margin: ${theme.spacing(2)} 0;\n\n & > div:first-child {\n width: 110px;\n padding-right: ${theme.spacing(1)};\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.fontWeightBold};\n line-height: 1.8;\n }\n & > div:nth-child(2) {\n flex: 1;\n color: ${theme.colors.text.secondary};\n }\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { ReactNode, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { IconButton, Pagination, useStyles2 } from '@grafana/ui';\n\nimport { usePagination } from '../hooks/usePagination';\nimport { getPaginationStyles } from '../styles/pagination';\n\ninterface DynamicTablePagination {\n itemsPerPage: number;\n}\n\nexport interface DynamicTableColumnProps<T = unknown> {\n id: string | number;\n label: string;\n\n renderCell: (item: DynamicTableItemProps<T>, index: number) => ReactNode;\n size?: number | string;\n}\n\nexport interface DynamicTableItemProps<T = unknown> {\n id: string | number;\n data: T;\n renderExpandedContent?: () => ReactNode;\n}\n\nexport interface DynamicTableProps<T = unknown> {\n cols: Array<DynamicTableColumnProps<T>>;\n items: Array<DynamicTableItemProps<T>>;\n\n isExpandable?: boolean;\n pagination?: DynamicTablePagination;\n paginationStyles?: string;\n\n // provide these to manually control expanded status\n onCollapse?: (item: DynamicTableItemProps<T>) => void;\n onExpand?: (item: DynamicTableItemProps<T>) => void;\n isExpanded?: (item: DynamicTableItemProps<T>) => boolean;\n\n renderExpandedContent?: (\n item: DynamicTableItemProps<T>,\n index: number,\n items: Array<DynamicTableItemProps<T>>\n ) => ReactNode;\n testIdGenerator?: (item: DynamicTableItemProps<T>, index: number) => string;\n renderPrefixHeader?: () => ReactNode;\n renderPrefixCell?: (\n item: DynamicTableItemProps<T>,\n index: number,\n items: Array<DynamicTableItemProps<T>>\n ) => ReactNode;\n\n footerRow?: JSX.Element;\n}\n\nexport const DynamicTable = <T extends object>({\n cols,\n items,\n isExpandable = false,\n onCollapse,\n onExpand,\n isExpanded,\n renderExpandedContent,\n testIdGenerator,\n pagination,\n paginationStyles,\n // render a cell BEFORE expand icon for header/ each row.\n // currently use by RuleList to render guidelines\n renderPrefixCell,\n renderPrefixHeader,\n footerRow,\n}: DynamicTableProps<T>) => {\n const defaultPaginationStyles = useStyles2(getPaginationStyles);\n\n if ((onCollapse || onExpand || isExpanded) && !(onCollapse && onExpand && isExpanded)) {\n throw new Error('either all of onCollapse, onExpand, isExpanded must be provided, or none');\n }\n if ((isExpandable || renderExpandedContent) && !(isExpandable && renderExpandedContent)) {\n throw new Error('either both isExpanded and renderExpandedContent must be provided, or neither');\n }\n const styles = useStyles2(getStyles(cols, isExpandable, !!renderPrefixHeader));\n\n const [expandedIds, setExpandedIds] = useState<Array<DynamicTableItemProps['id']>>([]);\n\n const toggleExpanded = (item: DynamicTableItemProps<T>) => {\n if (isExpanded && onCollapse && onExpand) {\n isExpanded(item) ? onCollapse(item) : onExpand(item);\n } else {\n setExpandedIds(\n expandedIds.includes(item.id) ? expandedIds.filter((itemId) => itemId !== item.id) : [...expandedIds, item.id]\n );\n }\n };\n\n const itemsPerPage = pagination?.itemsPerPage ?? items.length;\n const { page, numberOfPages, onPageChange, pageItems } = usePagination(items, 1, itemsPerPage);\n\n return (\n <>\n <div className={styles.container} data-testid=\"dynamic-table\">\n <div className={styles.row} data-testid=\"header\">\n {renderPrefixHeader && renderPrefixHeader()}\n {isExpandable && <div className={styles.cell} />}\n {cols.map((col) => (\n <div className={styles.cell} key={col.id}>\n {col.label}\n </div>\n ))}\n </div>\n\n {pageItems.map((item, index) => {\n const isItemExpanded = isExpanded ? isExpanded(item) : expandedIds.includes(item.id);\n return (\n <div\n className={styles.row}\n key={`${item.id}-${index}`}\n data-testid={testIdGenerator?.(item, index) ?? 'row'}\n >\n {renderPrefixCell && renderPrefixCell(item, index, items)}\n {isExpandable && (\n <div className={cx(styles.cell, styles.expandCell)}>\n <IconButton\n aria-label={`${isItemExpanded ? 'Collapse' : 'Expand'} row`}\n size=\"xl\"\n data-testid=\"collapse-toggle\"\n className={styles.expandButton}\n name={isItemExpanded ? 'angle-down' : 'angle-right'}\n onClick={() => toggleExpanded(item)}\n type=\"button\"\n />\n </div>\n )}\n {cols.map((col) => (\n <div className={cx(styles.cell, styles.bodyCell)} data-column={col.label} key={`${item.id}-${col.id}`}>\n {col.renderCell(item, index)}\n </div>\n ))}\n {isItemExpanded && renderExpandedContent && (\n <div className={styles.expandedContentRow} data-testid=\"expanded-content\">\n {renderExpandedContent(item, index, items)}\n </div>\n )}\n </div>\n );\n })}\n {footerRow && <div className={cx(styles.row, styles.footerRow)}>{footerRow}</div>}\n </div>\n {pagination && (\n <Pagination\n className={cx(defaultPaginationStyles, paginationStyles)}\n currentPage={page}\n numberOfPages={numberOfPages}\n onNavigate={onPageChange}\n hideWhenSinglePage\n />\n )}\n </>\n );\n};\n\nconst getStyles = <T extends unknown>(\n cols: Array<DynamicTableColumnProps<T>>,\n isExpandable: boolean,\n hasPrefixCell: boolean\n) => {\n const sizes = cols.map((col) => {\n if (!col.size) {\n return 'auto';\n }\n\n if (typeof col.size === 'number') {\n return `${col.size}fr`;\n }\n\n return col.size;\n });\n\n if (isExpandable) {\n sizes.unshift('calc(1em + 16px)');\n }\n\n if (hasPrefixCell) {\n sizes.unshift('0');\n }\n\n return (theme: GrafanaTheme2) => ({\n container: css`\n border: 1px solid ${theme.colors.border.strong};\n border-radius: 2px;\n color: ${theme.colors.text.secondary};\n `,\n row: css`\n display: grid;\n grid-template-columns: ${sizes.join(' ')};\n grid-template-rows: 1fr auto;\n\n &:nth-child(2n + 1) {\n background-color: ${theme.colors.background.secondary};\n }\n\n &:nth-child(2n) {\n background-color: ${theme.colors.background.primary};\n }\n\n ${theme.breakpoints.down('sm')} {\n grid-template-columns: auto 1fr;\n grid-template-areas: 'left right';\n padding: 0 ${theme.spacing(0.5)};\n\n &:first-child {\n display: none;\n }\n\n ${hasPrefixCell\n ? `\n & > *:first-child {\n display: none;\n }\n `\n : ''}\n }\n `,\n footerRow: css`\n display: flex;\n padding: ${theme.spacing(1)};\n `,\n cell: css`\n align-items: center;\n padding: ${theme.spacing(1)};\n\n ${theme.breakpoints.down('sm')} {\n padding: ${theme.spacing(1)} 0;\n grid-template-columns: 1fr;\n }\n `,\n bodyCell: css`\n overflow: hidden;\n\n ${theme.breakpoints.down('sm')} {\n grid-column-end: right;\n grid-column-start: right;\n\n &::before {\n content: attr(data-column);\n display: block;\n color: ${theme.colors.text.primary};\n }\n }\n `,\n expandCell: css`\n justify-content: center;\n\n ${theme.breakpoints.down('sm')} {\n align-items: start;\n grid-area: left;\n }\n `,\n expandedContentRow: css`\n grid-column-end: ${sizes.length + 1};\n grid-column-start: ${hasPrefixCell ? 3 : 2};\n grid-row: 2;\n padding: 0 ${theme.spacing(3)} 0 ${theme.spacing(1)};\n position: relative;\n\n ${theme.breakpoints.down('sm')} {\n grid-column-start: 2;\n border-top: 1px solid ${theme.colors.border.strong};\n grid-row: auto;\n padding: ${theme.spacing(1)} 0 0 0;\n }\n `,\n expandButton: css`\n margin-right: 0;\n display: block;\n `,\n });\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nexport type State = 'good' | 'bad' | 'warning' | 'neutral' | 'info';\n\ntype Props = {\n state: State;\n};\n\nexport const StateTag: FC<Props> = ({ children, state }) => {\n const styles = useStyles2(getStyles);\n\n return <span className={cx(styles.common, styles[state])}>{children || state}</span>;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n common: css`\n display: inline-block;\n color: white;\n border-radius: ${theme.shape.borderRadius()};\n font-size: ${theme.typography.size.sm};\n padding: ${theme.spacing(0.5, 1)};\n text-transform: capitalize;\n line-height: 1.2;\n min-width: ${theme.spacing(8)};\n text-align: center;\n font-weight: ${theme.typography.fontWeightBold};\n `,\n good: css`\n background-color: ${theme.colors.success.main};\n border: solid 1px ${theme.colors.success.main};\n color: ${theme.colors.success.contrastText};\n `,\n warning: css`\n background-color: ${theme.colors.warning.main};\n border: solid 1px ${theme.colors.warning.main};\n color: ${theme.colors.warning.contrastText};\n `,\n bad: css`\n background-color: ${theme.colors.error.main};\n border: solid 1px ${theme.colors.error.main};\n color: ${theme.colors.error.contrastText};\n `,\n neutral: css`\n background-color: ${theme.colors.secondary.main};\n border: solid 1px ${theme.colors.secondary.main};\n color: ${theme.colors.secondary.contrastText};\n `,\n info: css`\n background-color: ${theme.colors.primary.main};\n border: solid 1px ${theme.colors.primary.main};\n color: ${theme.colors.primary.contrastText};\n `,\n});\n","import { css } from '@emotion/css';\nimport { Placement } from '@popperjs/core';\nimport classnames from 'classnames';\nimport React, { FC, ReactElement, useRef } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Popover as GrafanaPopover, PopoverController, useStyles2 } from '@grafana/ui';\n\nexport interface HoverCardProps {\n children: ReactElement;\n content: ReactElement;\n wrapperClassName?: string;\n placement?: Placement;\n disabled?: boolean;\n}\n\nexport const HoverCard: FC<HoverCardProps> = ({ children, content, wrapperClassName, disabled = false, ...rest }) => {\n const popoverRef = useRef<HTMLElement>(null);\n const styles = useStyles2(getStyles);\n\n if (disabled) {\n return children;\n }\n\n return (\n <PopoverController content={content} hideAfter={100}>\n {(showPopper, hidePopper, popperProps) => {\n return (\n <>\n {popoverRef.current && (\n <GrafanaPopover\n {...popperProps}\n {...rest}\n wrapperClassName={classnames(styles.popover, wrapperClassName)}\n onMouseLeave={hidePopper}\n onMouseEnter={showPopper}\n referenceElement={popoverRef.current}\n />\n )}\n\n {React.cloneElement(children, {\n ref: popoverRef,\n onMouseEnter: showPopper,\n onMouseLeave: hidePopper,\n })}\n </>\n );\n }}\n </PopoverController>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n popover: css`\n border-radius: ${theme.shape.borderRadius()};\n box-shadow: ${theme.shadows.z3};\n background: ${theme.colors.background.primary};\n border: 1px solid ${theme.colors.border.medium};\n\n padding: ${theme.spacing(1)};\n `,\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Badge, useStyles2 } from '@grafana/ui';\n\nimport { HoverCard } from './HoverCard';\nimport { keywords as KEYWORDS, builtinFunctions as FUNCTIONS } from './receivers/editor/language';\n\nconst VARIABLES = ['$', '.', '\"'];\n\ninterface TokenizerProps {\n input: string;\n delimiter?: [string, string];\n}\n\nfunction Tokenize({ input, delimiter = ['{{', '}}'] }: TokenizerProps) {\n const styles = useStyles2(getStyles);\n\n const [open, close] = delimiter;\n\n /**\n * This RegExp uses 2 named capture groups, text that comes before the token and the token itself\n *\n * <before> open <token> close\n * ───────── ── ─────────── ──\n * Some text {{ $labels.foo }}\n */\n const regex = new RegExp(`(?<before>.*?)(${open}(?<token>.*?)${close}|$)`, 'gm');\n const lines = input.split('\\n');\n\n const output: React.ReactElement[] = [];\n\n lines.forEach((line, index) => {\n const matches = Array.from(line.matchAll(regex));\n\n matches.forEach((match, index) => {\n const before = match.groups?.before;\n const token = match.groups?.token?.trim();\n\n if (before) {\n output.push(<span key={`${index}-before`}>{before}</span>);\n }\n\n if (token) {\n const type = tokenType(token);\n const description = type === TokenType.Variable ? token : '';\n const tokenContent = `${open} ${token} ${close}`;\n\n output.push(<Token key={`${index}-token`} content={tokenContent} type={type} description={description} />);\n }\n });\n\n output.push(<br key={`${index}-newline`} />);\n });\n\n return <span className={styles.wrapper}>{output}</span>;\n}\n\nenum TokenType {\n Variable = 'variable',\n Function = 'function',\n Keyword = 'keyword',\n Unknown = 'unknown',\n}\n\ninterface TokenProps {\n content: string;\n type?: TokenType;\n description?: string;\n}\n\nfunction Token({ content, description, type }: TokenProps) {\n const styles = useStyles2(getStyles);\n\n const disableCard = Boolean(type) === false;\n\n return (\n <HoverCard\n placement=\"top-start\"\n disabled={disableCard}\n content={\n <div className={styles.hoverTokenItem}>\n <Badge text={<>{type}</>} color={'blue'} /> {description && <code>{description}</code>}\n </div>\n }\n >\n <span>\n <Badge className={styles.token} text={content} color={'blue'} />\n </span>\n </HoverCard>\n );\n}\n\nfunction isVariable(input: string) {\n return VARIABLES.some((character) => input.startsWith(character));\n}\n\nfunction isKeyword(input: string) {\n return KEYWORDS.some((keyword) => input.startsWith(keyword));\n}\n\nfunction isFunction(input: string) {\n return FUNCTIONS.some((functionName) => input.startsWith(functionName));\n}\n\nfunction tokenType(input: string) {\n let tokenType;\n if (isVariable(input)) {\n tokenType = TokenType.Variable;\n } else if (isKeyword(input)) {\n tokenType = TokenType.Keyword;\n } else if (isFunction(input)) {\n tokenType = TokenType.Function;\n } else {\n tokenType = TokenType.Unknown;\n }\n\n return tokenType;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n white-space: pre-wrap;\n `,\n token: css`\n cursor: default;\n font-family: ${theme.typography.fontFamilyMonospace};\n `,\n popover: css`\n border-radius: ${theme.shape.borderRadius()};\n box-shadow: ${theme.shadows.z3};\n background: ${theme.colors.background.primary};\n border: 1px solid ${theme.colors.border.medium};\n\n padding: ${theme.spacing(1)};\n `,\n hoverTokenItem: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: ${theme.spacing(1)};\n `,\n});\n\nexport { Tokenize, Token };\n","import { cx, css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\n\ntype Props = React.HTMLAttributes<HTMLDivElement>;\n\nexport const Well: FC<Props> = ({ children, className }) => {\n const styles = useStyles(getStyles);\n return <div className={cx(styles.wrapper, className)}>{children}</div>;\n};\nexport const getStyles = (theme: GrafanaTheme) => ({\n wrapper: css`\n background-color: ${theme.colors.panelBg};\n border: solid 1px ${theme.colors.formInputBorder};\n border-radius: ${theme.border.radius.sm};\n padding: ${theme.spacing.xs} ${theme.spacing.sm};\n font-family: ${theme.typography.fontFamily.monospace};\n `,\n});\n","import pluralize from 'pluralize';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\nimport { AlertmanagerGroup, AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nimport { getNotificationsTextColors } from '../../styles/notifications';\n\ninterface Props {\n group: AlertmanagerGroup;\n}\n\nexport const AlertGroupHeader = ({ group }: Props) => {\n const textStyles = useStyles2(getNotificationsTextColors);\n const total = group.alerts.length;\n const countByStatus = group.alerts.reduce((statusObj, alert) => {\n if (statusObj[alert.status.state]) {\n statusObj[alert.status.state] += 1;\n } else {\n statusObj[alert.status.state] = 1;\n }\n return statusObj;\n }, {} as Record<AlertState, number>);\n\n return (\n <div>\n {`${total} ${pluralize('alert', total)}: `}\n {Object.entries(countByStatus).map(([state, count], index) => {\n return (\n <span\n key={`${JSON.stringify(group.labels)}-notifications-${index}`}\n className={textStyles[state as AlertState]}\n >\n {index > 0 && ', '}\n {`${count} ${state}`}\n </span>\n );\n })}\n </div>\n );\n};\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\n// these map to the builtin token types\nenum TokenType {\n Delimiter = 'delimiter',\n Keyword = 'keyword',\n Function = 'type.identifier',\n String = 'string',\n Variable = 'variable.name',\n Number = 'number',\n Comment = 'comment',\n Operator = 'operator',\n Identifier = 'idenfifier',\n}\n\n// list of available functions in Alertmanager templates\n// see https://cs.github.com/prometheus/alertmanager/blob/805e505288ce82c3e2b625a3ca63aaf2b0aa9cea/template/template.go?q=join#L132-L151\nexport const availableAlertManagerFunctions = [\n 'toUpper',\n 'toLower',\n 'title',\n 'join',\n 'match',\n 'safeHtml',\n 'reReplaceAll',\n 'stringSlice',\n];\n\n// boolean functions\nconst booleanFunctions = ['eq', 'ne', 'lt', 'le', 'gt', 'ge'];\n\n// built-in functions for Go templates\nexport const builtinFunctions = [\n 'and',\n 'call',\n 'html',\n 'index',\n 'slice',\n 'js',\n 'len',\n 'not',\n 'or',\n 'print',\n 'printf',\n 'println',\n 'urlquery',\n ...booleanFunctions,\n];\n\n// Go template keywords\nexport const keywords = ['define', 'if', 'else', 'end', 'range', 'break', 'continue', 'template', 'block', 'with'];\n\n// Monarch language definition, see https://microsoft.github.io/monaco-editor/monarch.html\n// check https://github.com/microsoft/monaco-editor/blob/main/src/basic-languages/go/go.ts for an example\n// see https://pkg.go.dev/text/template for the available keywords etc\nexport const language: monacoType.languages.IMonarchLanguage = {\n defaultToken: '', // change this to \"invalid\" to find tokens that were never matched\n keywords: keywords,\n functions: [...builtinFunctions, ...availableAlertManagerFunctions],\n operators: ['|'],\n tokenizer: {\n root: [\n // strings\n [/\"/, TokenType.String, '@string'],\n [/`/, TokenType.String, '@rawstring'],\n // numbers\n [/\\d*\\d+[eE]([\\-+]?\\d+)?/, 'number.float'],\n [/\\d*\\.\\d+([eE][\\-+]?\\d+)?/, 'number.float'],\n [/0[xX][0-9a-fA-F']*[0-9a-fA-F]/, 'number.hex'],\n [/0[0-7']*[0-7]/, 'number.octal'],\n [/0[bB][0-1']*[0-1]/, 'number.binary'],\n [/\\d[\\d']*/, TokenType.Number],\n [/\\d/, TokenType.Number],\n // delimiter: after number because of .\\d floats\n [/[;,.]/, TokenType.Delimiter],\n // delimiters\n [/{{-?/, TokenType.Delimiter],\n [/-?}}/, TokenType.Delimiter],\n // variables\n // [/\\.([A-Za-z]+)?/, TokenType.Variable],\n // identifiers and keywords\n [\n /[a-zA-Z_]\\w*/,\n {\n cases: {\n '@keywords': { token: TokenType.Keyword },\n '@functions': { token: TokenType.Function },\n '@default': TokenType.Identifier,\n },\n },\n ],\n // comments\n [/\\/\\*.*\\*\\//, TokenType.Comment],\n ],\n string: [\n [/[^\\\\\"]+/, TokenType.String],\n [/\\\\./, 'string.escape.invalid'],\n [/\"/, TokenType.String, '@pop'],\n ],\n rawstring: [\n [/[^\\`]/, TokenType.String],\n [/`/, TokenType.String, '@pop'],\n ],\n },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n comments: {\n blockComment: ['/*', '*/'],\n },\n brackets: [\n ['{{', '}}'],\n ['(', ')'],\n ],\n autoClosingPairs: [\n { open: '{{', close: '}}' },\n { open: '(', close: ')' },\n { open: '`', close: '`' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n surroundingPairs: [\n { open: '{{', close: '}}' },\n { open: '(', close: ')' },\n { open: '`', close: '`' },\n { open: '\"', close: '\"' },\n { open: \"'\", close: \"'\" },\n ],\n};\n","import React, { FC } from 'react';\n\nimport { Alert } from 'app/types/unified-alerting';\n\nimport { AnnotationDetailsField } from '../AnnotationDetailsField';\nimport { DetailsField } from '../DetailsField';\n\ninterface Props {\n instance: Alert;\n}\n\nexport const AlertInstanceDetails: FC<Props> = ({ instance }) => {\n const annotations = (Object.entries(instance.annotations || {}) || []).filter(([_, value]) => !!value.trim());\n\n return (\n <div>\n {instance.value && (\n <DetailsField label=\"Value\" horizontal={true}>\n {instance.value}\n </DetailsField>\n )}\n {annotations.map(([key, value]) => (\n <AnnotationDetailsField key={key} annotationKey={key} value={value} />\n ))}\n </div>\n );\n};\n","import React, { FC, useMemo } from 'react';\n\nimport { Alert, PaginationProps } from 'app/types/unified-alerting';\n\nimport { alertInstanceKey } from '../../utils/rules';\nimport { AlertLabels } from '../AlertLabels';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\n\nimport { AlertInstanceDetails } from './AlertInstanceDetails';\nimport { AlertStateTag } from './AlertStateTag';\n\ninterface Props {\n instances: Alert[];\n pagination?: PaginationProps;\n footerRow?: JSX.Element;\n}\n\ntype AlertTableColumnProps = DynamicTableColumnProps<Alert>;\ntype AlertTableItemProps = DynamicTableItemProps<Alert>;\n\nexport const AlertInstancesTable: FC<Props> = ({ instances, pagination, footerRow }) => {\n const items = useMemo(\n (): AlertTableItemProps[] =>\n instances.map((instance) => ({\n data: instance,\n id: alertInstanceKey(instance),\n })),\n [instances]\n );\n\n return (\n <DynamicTable\n cols={columns}\n isExpandable={true}\n items={items}\n renderExpandedContent={({ data }) => <AlertInstanceDetails instance={data} />}\n pagination={pagination}\n footerRow={footerRow}\n />\n );\n};\n\nconst columns: AlertTableColumnProps[] = [\n {\n id: 'state',\n label: 'State',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { state } }) => <AlertStateTag state={state} />,\n size: '80px',\n },\n {\n id: 'labels',\n label: 'Labels',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { labels } }) => <AlertLabels labels={labels} />,\n },\n {\n id: 'created',\n label: 'Created',\n // eslint-disable-next-line react/display-name\n renderCell: ({ data: { activeAt } }) => (\n <>{activeAt.startsWith('0001') ? '-' : activeAt.slice(0, 19).replace('T', ' ')}</>\n ),\n size: '150px',\n },\n];\n","import React, { FC } from 'react';\n\nimport { AlertState } from '@grafana/data';\nimport { GrafanaAlertStateWithReason, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { alertStateToReadable, alertStateToState } from '../../utils/rules';\nimport { StateTag } from '../StateTag';\ninterface Props {\n state: PromAlertingRuleState | GrafanaAlertStateWithReason | AlertState;\n}\n\nexport const AlertStateTag: FC<Props> = ({ state }) => (\n <StateTag state={alertStateToState(state)}>{alertStateToReadable(state)}</StateTag>\n);\n","import { useCallback, useEffect, useMemo, useState } from 'react';\n\nexport function usePagination<T>(items: T[], initialPage: number, itemsPerPage: number) {\n const [page, setPage] = useState(initialPage);\n\n const numberOfPages = Math.ceil(items.length / itemsPerPage);\n const firstItemOnPageIndex = itemsPerPage * (page - 1);\n\n const pageItems = useMemo(\n () => items.slice(firstItemOnPageIndex, firstItemOnPageIndex + itemsPerPage),\n [items, firstItemOnPageIndex, itemsPerPage]\n );\n\n const onPageChange = useCallback(\n (newPage: number) => {\n setPage(newPage);\n },\n [setPage]\n );\n\n // Reset the current page when number of pages has been changed\n useEffect(() => setPage(1), [numberOfPages]);\n\n return { page, onPageChange, numberOfPages, pageItems };\n}\n","import { useSelector } from 'react-redux';\n\nimport { StoreState } from 'app/types';\n\nimport { UnifiedAlertingState } from '../state/reducers';\n\nexport function useUnifiedAlertingSelector<TSelected = unknown>(\n selector: (state: UnifiedAlertingState) => TSelected,\n equalityFn?: (left: TSelected, right: TSelected) => boolean\n): TSelected {\n return useSelector((state: StoreState) => selector(state.unifiedAlerting), equalityFn);\n}\n","import { lastValueFrom } from 'rxjs';\n\nimport { urlUtil } from '@grafana/data';\nimport { getBackendSrv, isFetchError } from '@grafana/runtime';\nimport {\n AlertmanagerAlert,\n AlertManagerCortexConfig,\n AlertmanagerGroup,\n AlertmanagerStatus,\n ExternalAlertmanagersResponse,\n Matcher,\n Receiver,\n Silence,\n SilenceCreatePayload,\n TestReceiversAlert,\n TestReceiversPayload,\n TestReceiversResult,\n ExternalAlertmanagerConfig,\n} from 'app/plugins/datasource/alertmanager/types';\n\nimport { getDatasourceAPIUid, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\n// \"grafana\" for grafana-managed, otherwise a datasource name\nexport async function fetchAlertManagerConfig(alertManagerSourceName: string): Promise<AlertManagerCortexConfig> {\n try {\n const result = await lastValueFrom(\n getBackendSrv().fetch<AlertManagerCortexConfig>({\n url: `/api/alertmanager/${getDatasourceAPIUid(alertManagerSourceName)}/config/api/v1/alerts`,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n return {\n template_files: result.data.template_files ?? {},\n template_file_provenances: result.data.template_file_provenances ?? {},\n alertmanager_config: result.data.alertmanager_config ?? {},\n };\n } catch (e) {\n // if no config has been uploaded to grafana, it returns error instead of latest config\n if (\n alertManagerSourceName === GRAFANA_RULES_SOURCE_NAME &&\n isFetchError(e) &&\n e.data?.message?.includes('could not find an Alertmanager configuration')\n ) {\n return {\n template_files: {},\n alertmanager_config: {},\n };\n }\n throw e;\n }\n}\n\nexport async function updateAlertManagerConfig(\n alertManagerSourceName: string,\n config: AlertManagerCortexConfig\n): Promise<void> {\n await lastValueFrom(\n getBackendSrv().fetch({\n method: 'POST',\n url: `/api/alertmanager/${getDatasourceAPIUid(alertManagerSourceName)}/config/api/v1/alerts`,\n data: config,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n}\n\nexport async function deleteAlertManagerConfig(alertManagerSourceName: string): Promise<void> {\n await lastValueFrom(\n getBackendSrv().fetch({\n method: 'DELETE',\n url: `/api/alertmanager/${getDatasourceAPIUid(alertManagerSourceName)}/config/api/v1/alerts`,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n}\n\nexport async function fetchSilences(alertManagerSourceName: string): Promise<Silence[]> {\n const result = await lastValueFrom(\n getBackendSrv().fetch<Silence[]>({\n url: `/api/alertmanager/${getDatasourceAPIUid(alertManagerSourceName)}/api/v2/silences`,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n return result.data;\n}\n\n// returns the new silence ID. Even in the case of an update, a new silence is created and the previous one expired.\nexport async function createOrUpdateSilence(\n alertmanagerSourceName: string,\n payload: SilenceCreatePayload\n): Promise<Silence> {\n const result = await lastValueFrom(\n getBackendSrv().fetch<Silence>({\n url: `/api/alertmanager/${getDatasourceAPIUid(alertmanagerSourceName)}/api/v2/silences`,\n data: payload,\n showErrorAlert: false,\n showSuccessAlert: false,\n method: 'POST',\n })\n );\n return result.data;\n}\n\nexport async function expireSilence(alertmanagerSourceName: string, silenceID: string): Promise<void> {\n await getBackendSrv().delete(\n `/api/alertmanager/${getDatasourceAPIUid(alertmanagerSourceName)}/api/v2/silence/${encodeURIComponent(silenceID)}`\n );\n}\n\nexport async function fetchAlerts(\n alertmanagerSourceName: string,\n matchers?: Matcher[],\n silenced = true,\n active = true,\n inhibited = true\n): Promise<AlertmanagerAlert[]> {\n const filters =\n urlUtil.toUrlParams({ silenced, active, inhibited }) +\n matchers\n ?.map(\n (matcher) =>\n `filter=${encodeURIComponent(\n `${escapeQuotes(matcher.name)}=${matcher.isRegex ? '~' : ''}\"${escapeQuotes(matcher.value)}\"`\n )}`\n )\n .join('&') || '';\n\n const result = await lastValueFrom(\n getBackendSrv().fetch<AlertmanagerAlert[]>({\n url:\n `/api/alertmanager/${getDatasourceAPIUid(alertmanagerSourceName)}/api/v2/alerts` +\n (filters ? '?' + filters : ''),\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n\n return result.data;\n}\n\nexport async function fetchAlertGroups(alertmanagerSourceName: string): Promise<AlertmanagerGroup[]> {\n const result = await lastValueFrom(\n getBackendSrv().fetch<AlertmanagerGroup[]>({\n url: `/api/alertmanager/${getDatasourceAPIUid(alertmanagerSourceName)}/api/v2/alerts/groups`,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n\n return result.data;\n}\n\nexport async function fetchStatus(alertManagerSourceName: string): Promise<AlertmanagerStatus> {\n const result = await lastValueFrom(\n getBackendSrv().fetch<AlertmanagerStatus>({\n url: `/api/alertmanager/${getDatasourceAPIUid(alertManagerSourceName)}/api/v2/status`,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n\n return result.data;\n}\n\nexport async function testReceivers(\n alertManagerSourceName: string,\n receivers: Receiver[],\n alert?: TestReceiversAlert\n): Promise<void> {\n const data: TestReceiversPayload = {\n receivers,\n alert,\n };\n try {\n const result = await lastValueFrom(\n getBackendSrv().fetch<TestReceiversResult>({\n method: 'POST',\n data,\n url: `/api/alertmanager/${getDatasourceAPIUid(alertManagerSourceName)}/config/api/v1/receivers/test`,\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n );\n\n if (receiversResponseContainsErrors(result.data)) {\n throw new Error(getReceiverResultError(result.data));\n }\n } catch (error) {\n if (isFetchError(error) && isTestReceiversResult(error.data) && receiversResponseContainsErrors(error.data)) {\n throw new Error(getReceiverResultError(error.data));\n }\n\n throw error;\n }\n}\n\nfunction receiversResponseContainsErrors(result: TestReceiversResult) {\n return result.receivers.some((receiver) =>\n receiver.grafana_managed_receiver_configs.some((config) => config.status === 'failed')\n );\n}\n\nfunction isTestReceiversResult(data: any): data is TestReceiversResult {\n const receivers = data?.receivers;\n\n if (Array.isArray(receivers)) {\n return receivers.every(\n (receiver: any) => typeof receiver.name === 'string' && Array.isArray(receiver.grafana_managed_receiver_configs)\n );\n }\n\n return false;\n}\n\nfunction getReceiverResultError(receiversResult: TestReceiversResult) {\n return receiversResult.receivers\n .flatMap((receiver) =>\n receiver.grafana_managed_receiver_configs\n .filter((receiver) => receiver.status === 'failed')\n .map((receiver) => receiver.error ?? 'Unknown error.')\n )\n .join('; ');\n}\n\nexport async function addAlertManagers(alertManagerConfig: ExternalAlertmanagerConfig): Promise<void> {\n await lastValueFrom(\n getBackendSrv().fetch({\n method: 'POST',\n data: alertManagerConfig,\n url: '/api/v1/ngalert/admin_config',\n showErrorAlert: false,\n showSuccessAlert: false,\n })\n ).then(() => {\n fetchExternalAlertmanagerConfig();\n });\n}\n\nexport async function fetchExternalAlertmanagers(): Promise<ExternalAlertmanagersResponse> {\n const result = await lastValueFrom(\n getBackendSrv().fetch<ExternalAlertmanagersResponse>({\n method: 'GET',\n url: '/api/v1/ngalert/alertmanagers',\n })\n );\n\n return result.data;\n}\n\nexport async function fetchExternalAlertmanagerConfig(): Promise<ExternalAlertmanagerConfig> {\n const result = await lastValueFrom(\n getBackendSrv().fetch<ExternalAlertmanagerConfig>({\n method: 'GET',\n url: '/api/v1/ngalert/admin_config',\n showErrorAlert: false,\n })\n );\n\n return result.data;\n}\n\nfunction escapeQuotes(value: string): string {\n return value.replace(/\"/g, '\\\\\"');\n}\n","import { getBackendSrv } from '@grafana/runtime';\nimport { StateHistoryItem } from 'app/types/unified-alerting';\n\nexport function fetchAnnotations(alertId: string): Promise<StateHistoryItem[]> {\n return getBackendSrv()\n .get('/api/annotations', {\n alertId,\n })\n .then((result) => {\n return result?.sort(sortStateHistory);\n });\n}\n\nexport function sortStateHistory(a: StateHistoryItem, b: StateHistoryItem): number {\n const compareDesc = (a: number, b: number): number => {\n // Larger numbers first.\n if (a > b) {\n return -1;\n }\n\n if (b > a) {\n return 1;\n }\n return 0;\n };\n\n const endNeq = compareDesc(a.timeEnd, b.timeEnd);\n if (endNeq) {\n return endNeq;\n }\n\n const timeNeq = compareDesc(a.time, b.time);\n if (timeNeq) {\n return timeNeq;\n }\n\n return compareDesc(a.id, b.id);\n}\n","import { RuleIdentifier, RulerDataSourceConfig, RuleWithLocation } from 'app/types/unified-alerting';\nimport {\n PostableRuleGrafanaRuleDTO,\n PostableRulerRuleGroupDTO,\n RulerGrafanaRuleDTO,\n RulerRuleGroupDTO,\n} from 'app/types/unified-alerting-dto';\n\nimport { deleteRulerRulesGroup, fetchRulerRulesGroup, fetchRulerRules, setRulerRuleGroup } from '../api/ruler';\nimport { RuleFormValues } from '../types/rule-form';\nimport * as ruleId from '../utils/rule-id';\n\nimport { GRAFANA_RULES_SOURCE_NAME } from './datasource';\nimport { formValuesToRulerGrafanaRuleDTO, formValuesToRulerRuleDTO } from './rule-form';\nimport {\n isCloudRuleIdentifier,\n isGrafanaRuleIdentifier,\n isGrafanaRulerRule,\n isPrometheusRuleIdentifier,\n} from './rules';\n\nexport interface RulerClient {\n findEditableRule(ruleIdentifier: RuleIdentifier): Promise<RuleWithLocation | null>;\n deleteRule(ruleWithLocation: RuleWithLocation): Promise<void>;\n saveLotexRule(values: RuleFormValues, existing?: RuleWithLocation): Promise<RuleIdentifier>;\n saveGrafanaRule(values: RuleFormValues, existing?: RuleWithLocation): Promise<RuleIdentifier>;\n}\n\nexport function getRulerClient(rulerConfig: RulerDataSourceConfig): RulerClient {\n const findEditableRule = async (ruleIdentifier: RuleIdentifier): Promise<RuleWithLocation | null> => {\n if (isGrafanaRuleIdentifier(ruleIdentifier)) {\n const namespaces = await fetchRulerRules(rulerConfig);\n // find namespace and group that contains the uid for the rule\n for (const [namespace, groups] of Object.entries(namespaces)) {\n for (const group of groups) {\n const rule = group.rules.find(\n (rule) => isGrafanaRulerRule(rule) && rule.grafana_alert?.uid === ruleIdentifier.uid\n );\n if (rule) {\n return {\n group,\n ruleSourceName: GRAFANA_RULES_SOURCE_NAME,\n namespace: namespace,\n rule,\n };\n }\n }\n }\n }\n\n if (isCloudRuleIdentifier(ruleIdentifier)) {\n const { ruleSourceName, namespace, groupName } = ruleIdentifier;\n const group = await fetchRulerRulesGroup(rulerConfig, namespace, groupName);\n\n if (!group) {\n return null;\n }\n\n const rule = group.rules.find((rule) => {\n const identifier = ruleId.fromRulerRule(ruleSourceName, namespace, group.name, rule);\n return ruleId.equal(identifier, ruleIdentifier);\n });\n\n if (!rule) {\n return null;\n }\n\n return {\n group,\n ruleSourceName,\n namespace,\n rule,\n };\n }\n\n if (isPrometheusRuleIdentifier(ruleIdentifier)) {\n throw new Error('Native prometheus rules can not be edited in grafana.');\n }\n\n return null;\n };\n\n const deleteRule = async (ruleWithLocation: RuleWithLocation): Promise<void> => {\n const { namespace, group, rule } = ruleWithLocation;\n\n // it was the last rule, delete the entire group\n if (group.rules.length === 1) {\n await deleteRulerRulesGroup(rulerConfig, namespace, group.name);\n return;\n }\n // post the group with rule removed\n await setRulerRuleGroup(rulerConfig, namespace, {\n ...group,\n rules: group.rules.filter((r) => r !== rule),\n });\n };\n\n const saveLotexRule = async (values: RuleFormValues, existing?: RuleWithLocation): Promise<RuleIdentifier> => {\n const { dataSourceName, group, namespace } = values;\n const formRule = formValuesToRulerRuleDTO(values);\n if (dataSourceName && group && namespace) {\n // if we're updating a rule...\n if (existing) {\n // refetch it so we always have the latest greatest\n const freshExisting = await findEditableRule(ruleId.fromRuleWithLocation(existing));\n if (!freshExisting) {\n throw new Error('Rule not found.');\n }\n // if namespace or group was changed, delete the old rule\n if (freshExisting.namespace !== namespace || freshExisting.group.name !== group) {\n await deleteRule(freshExisting);\n } else {\n // if same namespace or group, update the group replacing the old rule with new\n const payload = {\n ...freshExisting.group,\n rules: freshExisting.group.rules.map((existingRule) =>\n existingRule === freshExisting.rule ? formRule : existingRule\n ),\n };\n await setRulerRuleGroup(rulerConfig, namespace, payload);\n return ruleId.fromRulerRule(dataSourceName, namespace, group, formRule);\n }\n }\n\n // if creating new rule or existing rule was in a different namespace/group, create new rule in target group\n\n const targetGroup = await fetchRulerRulesGroup(rulerConfig, namespace, group);\n\n const payload: RulerRuleGroupDTO = targetGroup\n ? {\n ...targetGroup,\n rules: [...targetGroup.rules, formRule],\n }\n : {\n name: group,\n rules: [formRule],\n };\n\n await setRulerRuleGroup(rulerConfig, namespace, payload);\n return ruleId.fromRulerRule(dataSourceName, namespace, group, formRule);\n } else {\n throw new Error('Data source and location must be specified');\n }\n };\n\n const saveGrafanaRule = async (values: RuleFormValues, existingRule?: RuleWithLocation): Promise<RuleIdentifier> => {\n const { folder, group, evaluateEvery } = values;\n if (!folder) {\n throw new Error('Folder must be specified');\n }\n\n const newRule = formValuesToRulerGrafanaRuleDTO(values);\n const namespace = folder.title;\n const groupSpec = { name: group, interval: evaluateEvery };\n\n if (!existingRule) {\n return addRuleToNamespaceAndGroup(namespace, groupSpec, newRule);\n }\n\n const sameNamespace = existingRule.namespace === namespace;\n const sameGroup = existingRule.group.name === values.group;\n const sameLocation = sameNamespace && sameGroup;\n\n if (sameLocation) {\n // we're update a rule in the same namespace and group\n return updateGrafanaRule(existingRule, newRule, evaluateEvery);\n } else {\n // we're moving a rule to either a different group or namespace\n return moveGrafanaRule(namespace, groupSpec, existingRule, newRule);\n }\n };\n\n const addRuleToNamespaceAndGroup = async (\n namespace: string,\n group: { name: string; interval: string },\n newRule: PostableRuleGrafanaRuleDTO\n ): Promise<RuleIdentifier> => {\n const existingGroup = await fetchRulerRulesGroup(rulerConfig, namespace, group.name);\n if (!existingGroup) {\n throw new Error(`No group found with name \"${group.name}\"`);\n }\n\n const payload: PostableRulerRuleGroupDTO = {\n name: group.name,\n interval: group.interval,\n rules: (existingGroup.rules ?? []).concat(newRule as RulerGrafanaRuleDTO),\n };\n\n await setRulerRuleGroup(rulerConfig, namespace, payload);\n\n return { uid: newRule.grafana_alert.uid ?? '', ruleSourceName: GRAFANA_RULES_SOURCE_NAME };\n };\n\n // move the rule to another namespace / groupname\n const moveGrafanaRule = async (\n namespace: string,\n group: { name: string; interval: string },\n existingRule: RuleWithLocation,\n newRule: PostableRuleGrafanaRuleDTO\n ): Promise<RuleIdentifier> => {\n // make sure our updated alert has the same UID as before\n // that way the rule is automatically moved to the new namespace / group name\n copyGrafanaUID(existingRule, newRule);\n\n // add the new rule to the requested namespace and group\n const identifier = await addRuleToNamespaceAndGroup(namespace, group, newRule);\n\n return identifier;\n };\n\n const updateGrafanaRule = async (\n existingRule: RuleWithLocation,\n newRule: PostableRuleGrafanaRuleDTO,\n interval: string\n ): Promise<RuleIdentifier> => {\n // make sure our updated alert has the same UID as before\n copyGrafanaUID(existingRule, newRule);\n\n // create the new array of rules we want to send to the group. Keep the order of alerts in the group.\n const newRules = existingRule.group.rules.map((rule) => {\n if (!isGrafanaRulerRule(rule)) {\n return rule;\n }\n if (rule.grafana_alert.uid === existingRule.rule.grafana_alert.uid) {\n return newRule;\n }\n return rule;\n });\n\n await setRulerRuleGroup(rulerConfig, existingRule.namespace, {\n name: existingRule.group.name,\n interval: interval,\n rules: newRules,\n });\n\n return { uid: existingRule.rule.grafana_alert.uid, ruleSourceName: GRAFANA_RULES_SOURCE_NAME };\n };\n\n // Would be nice to somehow align checking of ruler type between different methods\n // Maybe each datasource should have its own ruler client implementation\n return {\n findEditableRule,\n deleteRule,\n saveLotexRule,\n saveGrafanaRule,\n };\n}\n\n//copy the Grafana rule UID from the old rule to the new rule\nfunction copyGrafanaUID(\n oldRule: RuleWithLocation,\n newRule: PostableRuleGrafanaRuleDTO\n): asserts oldRule is RuleWithLocation<RulerGrafanaRuleDTO> {\n // type guard to make sure we're working with a Grafana managed rule\n if (!isGrafanaRulerRule(oldRule.rule)) {\n throw new Error('The rule is not a Grafana managed rule');\n }\n\n const uid = oldRule.rule.grafana_alert.uid;\n newRule.grafana_alert.uid = uid;\n}\n","import { createAsyncThunk } from '@reduxjs/toolkit';\nimport { isEmpty } from 'lodash';\n\nimport { locationService } from '@grafana/runtime';\nimport {\n AlertmanagerAlert,\n AlertManagerCortexConfig,\n AlertmanagerGroup,\n ExternalAlertmanagerConfig,\n ExternalAlertmanagersResponse,\n Receiver,\n Silence,\n SilenceCreatePayload,\n TestReceiversAlert,\n} from 'app/plugins/datasource/alertmanager/types';\nimport messageFromError from 'app/plugins/datasource/grafana-azure-monitor-datasource/utils/messageFromError';\nimport { FolderDTO, NotifierDTO, StoreState, ThunkResult } from 'app/types';\nimport {\n CombinedRuleGroup,\n CombinedRuleNamespace,\n PromBasedDataSource,\n RuleIdentifier,\n RuleNamespace,\n RulerDataSourceConfig,\n RuleWithLocation,\n StateHistoryItem,\n} from 'app/types/unified-alerting';\nimport { PromApplication, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto';\n\nimport { backendSrv } from '../../../../core/services/backend_srv';\nimport {\n addAlertManagers,\n createOrUpdateSilence,\n deleteAlertManagerConfig,\n expireSilence,\n fetchAlertGroups,\n fetchAlertManagerConfig,\n fetchAlerts,\n fetchExternalAlertmanagerConfig,\n fetchExternalAlertmanagers,\n fetchSilences,\n fetchStatus,\n testReceivers,\n updateAlertManagerConfig,\n} from '../api/alertmanager';\nimport { fetchAnnotations } from '../api/annotations';\nimport { discoverFeatures } from '../api/buildInfo';\nimport { fetchNotifiers } from '../api/grafana';\nimport { FetchPromRulesFilter, fetchRules } from '../api/prometheus';\nimport {\n deleteNamespace,\n deleteRulerRulesGroup,\n fetchRulerRules,\n FetchRulerRulesFilter,\n setRulerRuleGroup,\n} from '../api/ruler';\nimport { RuleFormType, RuleFormValues } from '../types/rule-form';\nimport { addDefaultsToAlertmanagerConfig, removeMuteTimingFromRoute } from '../utils/alertmanager';\nimport {\n getAllRulesSourceNames,\n getRulesDataSource,\n getRulesSourceName,\n GRAFANA_RULES_SOURCE_NAME,\n isVanillaPrometheusAlertManagerDataSource,\n} from '../utils/datasource';\nimport { makeAMLink, retryWhile } from '../utils/misc';\nimport { AsyncRequestMapSlice, withAppEvents, withSerializedError } from '../utils/redux';\nimport * as ruleId from '../utils/rule-id';\nimport { getRulerClient } from '../utils/rulerClient';\nimport { isRulerNotSupportedResponse } from '../utils/rules';\n\nconst FETCH_CONFIG_RETRY_TIMEOUT = 30 * 1000;\n\nfunction getDataSourceConfig(getState: () => unknown, rulesSourceName: string) {\n const dataSources = (getState() as StoreState).unifiedAlerting.dataSources;\n const dsConfig = dataSources[rulesSourceName]?.result;\n if (!dsConfig) {\n throw new Error(`Data source configuration is not available for \"${rulesSourceName}\" data source`);\n }\n\n return dsConfig;\n}\n\nfunction getDataSourceRulerConfig(getState: () => unknown, rulesSourceName: string) {\n const dsConfig = getDataSourceConfig(getState, rulesSourceName);\n if (!dsConfig.rulerConfig) {\n throw new Error(`Ruler API is not available for ${rulesSourceName}`);\n }\n\n return dsConfig.rulerConfig;\n}\n\nexport const fetchPromRulesAction = createAsyncThunk(\n 'unifiedalerting/fetchPromRules',\n async (\n { rulesSourceName, filter }: { rulesSourceName: string; filter?: FetchPromRulesFilter },\n thunkAPI\n ): Promise<RuleNamespace[]> => {\n await thunkAPI.dispatch(fetchRulesSourceBuildInfoAction({ rulesSourceName }));\n return await withSerializedError(fetchRules(rulesSourceName, filter));\n }\n);\n\nexport const fetchAlertManagerConfigAction = createAsyncThunk(\n 'unifiedalerting/fetchAmConfig',\n (alertManagerSourceName: string): Promise<AlertManagerCortexConfig> =>\n withSerializedError(\n (async () => {\n // for vanilla prometheus, there is no config endpoint. Only fetch config from status\n if (isVanillaPrometheusAlertManagerDataSource(alertManagerSourceName)) {\n return fetchStatus(alertManagerSourceName).then((status) => ({\n alertmanager_config: status.config,\n template_files: {},\n }));\n }\n\n return retryWhile(\n () => fetchAlertManagerConfig(alertManagerSourceName),\n // if config has been recently deleted, it takes a while for cortex start returning the default one.\n // retry for a short while instead of failing\n (e) => !!messageFromError(e)?.includes('alertmanager storage object not found'),\n FETCH_CONFIG_RETRY_TIMEOUT\n ).then((result) => {\n // if user config is empty for cortex alertmanager, try to get config from status endpoint\n if (\n isEmpty(result.alertmanager_config) &&\n isEmpty(result.template_files) &&\n alertManagerSourceName !== GRAFANA_RULES_SOURCE_NAME\n ) {\n return fetchStatus(alertManagerSourceName).then((status) => ({\n alertmanager_config: status.config,\n template_files: {},\n template_file_provenances: result.template_file_provenances,\n }));\n }\n return result;\n });\n })()\n )\n);\n\nexport const fetchExternalAlertmanagersAction = createAsyncThunk(\n 'unifiedAlerting/fetchExternalAlertmanagers',\n (): Promise<ExternalAlertmanagersResponse> => {\n return withSerializedError(fetchExternalAlertmanagers());\n }\n);\n\nexport const fetchExternalAlertmanagersConfigAction = createAsyncThunk(\n 'unifiedAlerting/fetchExternAlertmanagersConfig',\n (): Promise<ExternalAlertmanagerConfig> => {\n return withSerializedError(fetchExternalAlertmanagerConfig());\n }\n);\n\nexport const fetchRulerRulesAction = createAsyncThunk(\n 'unifiedalerting/fetchRulerRules',\n async (\n {\n rulesSourceName,\n filter,\n }: {\n rulesSourceName: string;\n filter?: FetchRulerRulesFilter;\n },\n { dispatch, getState }\n ): Promise<RulerRulesConfigDTO | null> => {\n await dispatch(fetchRulesSourceBuildInfoAction({ rulesSourceName }));\n const rulerConfig = getDataSourceRulerConfig(getState, rulesSourceName);\n return await withSerializedError(fetchRulerRules(rulerConfig, filter));\n }\n);\n\nexport function fetchPromAndRulerRulesAction({ rulesSourceName }: { rulesSourceName: string }): ThunkResult<void> {\n return async (dispatch, getState) => {\n await dispatch(fetchRulesSourceBuildInfoAction({ rulesSourceName }));\n const dsConfig = getDataSourceConfig(getState, rulesSourceName);\n\n await dispatch(fetchPromRulesAction({ rulesSourceName }));\n if (dsConfig.rulerConfig) {\n await dispatch(fetchRulerRulesAction({ rulesSourceName }));\n }\n };\n}\n\nexport const fetchSilencesAction = createAsyncThunk(\n 'unifiedalerting/fetchSilences',\n (alertManagerSourceName: string): Promise<Silence[]> => {\n return withSerializedError(fetchSilences(alertManagerSourceName));\n }\n);\n\n// this will only trigger ruler rules fetch if rules are not loaded yet and request is not in flight\nexport function fetchRulerRulesIfNotFetchedYet(rulesSourceName: string): ThunkResult<void> {\n return (dispatch, getStore) => {\n const { rulerRules } = getStore().unifiedAlerting;\n const resp = rulerRules[rulesSourceName];\n if (!resp?.result && !(resp && isRulerNotSupportedResponse(resp)) && !resp?.loading) {\n dispatch(fetchRulerRulesAction({ rulesSourceName }));\n }\n };\n}\n\nexport function fetchAllPromBuildInfoAction(): ThunkResult<Promise<void>> {\n return async (dispatch) => {\n const allRequests = getAllRulesSourceNames().map((rulesSourceName) =>\n dispatch(fetchRulesSourceBuildInfoAction({ rulesSourceName }))\n );\n\n await Promise.allSettled(allRequests);\n };\n}\n\nexport const fetchRulesSourceBuildInfoAction = createAsyncThunk(\n 'unifiedalerting/fetchPromBuildinfo',\n async ({ rulesSourceName }: { rulesSourceName: string }): Promise<PromBasedDataSource> => {\n return withSerializedError<PromBasedDataSource>(\n (async (): Promise<PromBasedDataSource> => {\n if (rulesSourceName === GRAFANA_RULES_SOURCE_NAME) {\n return {\n name: GRAFANA_RULES_SOURCE_NAME,\n id: GRAFANA_RULES_SOURCE_NAME,\n rulerConfig: {\n dataSourceName: GRAFANA_RULES_SOURCE_NAME,\n apiVersion: 'legacy',\n },\n };\n }\n\n const ds = getRulesDataSource(rulesSourceName);\n if (!ds) {\n throw new Error(`Missing data source configuration for ${rulesSourceName}`);\n }\n\n const { id, name } = ds;\n const buildInfo = await discoverFeatures(name);\n\n const rulerConfig: RulerDataSourceConfig | undefined = buildInfo.features.rulerApiEnabled\n ? {\n dataSourceName: name,\n apiVersion: buildInfo.application === PromApplication.Lotex ? 'legacy' : 'config',\n }\n : undefined;\n\n return {\n name: name,\n id: id,\n rulerConfig,\n };\n })()\n );\n },\n {\n condition: ({ rulesSourceName }, { getState }) => {\n const dataSources: AsyncRequestMapSlice<PromBasedDataSource> = (getState() as StoreState).unifiedAlerting\n .dataSources;\n const hasLoaded = Boolean(dataSources[rulesSourceName]?.result);\n const hasError = Boolean(dataSources[rulesSourceName]?.error);\n\n return !(hasLoaded || hasError);\n },\n }\n);\n\nexport function fetchAllPromAndRulerRulesAction(force = false): ThunkResult<void> {\n return async (dispatch, getStore) => {\n return Promise.all(\n getAllRulesSourceNames().map(async (rulesSourceName) => {\n await dispatch(fetchRulesSourceBuildInfoAction({ rulesSourceName }));\n\n const { promRules, rulerRules, dataSources } = getStore().unifiedAlerting;\n const dataSourceConfig = dataSources[rulesSourceName].result;\n\n if (!dataSourceConfig) {\n return;\n }\n\n if (force || !promRules[rulesSourceName]?.loading) {\n dispatch(fetchPromRulesAction({ rulesSourceName }));\n }\n if ((force || !rulerRules[rulesSourceName]?.loading) && dataSourceConfig.rulerConfig) {\n dispatch(fetchRulerRulesAction({ rulesSourceName }));\n }\n })\n );\n };\n}\n\nexport function fetchAllPromRulesAction(force = false): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const { promRules } = getStore().unifiedAlerting;\n getAllRulesSourceNames().map((rulesSourceName) => {\n if (force || !promRules[rulesSourceName]?.loading) {\n dispatch(fetchPromRulesAction({ rulesSourceName }));\n }\n });\n };\n}\n\nexport const fetchEditableRuleAction = createAsyncThunk(\n 'unifiedalerting/fetchEditableRule',\n (ruleIdentifier: RuleIdentifier, thunkAPI): Promise<RuleWithLocation | null> => {\n const rulerConfig = getDataSourceRulerConfig(thunkAPI.getState, ruleIdentifier.ruleSourceName);\n return withSerializedError(getRulerClient(rulerConfig).findEditableRule(ruleIdentifier));\n }\n);\n\nexport function deleteRulesGroupAction(\n namespace: CombinedRuleNamespace,\n ruleGroup: CombinedRuleGroup\n): ThunkResult<void> {\n return async (dispatch, getState) => {\n withAppEvents(\n (async () => {\n const sourceName = getRulesSourceName(namespace.rulesSource);\n const rulerConfig = getDataSourceRulerConfig(getState, sourceName);\n\n await deleteRulerRulesGroup(rulerConfig, namespace.name, ruleGroup.name);\n await dispatch(fetchPromAndRulerRulesAction({ rulesSourceName: sourceName }));\n })(),\n { successMessage: 'Group deleted' }\n );\n };\n}\n\nexport function deleteRuleAction(\n ruleIdentifier: RuleIdentifier,\n options: { navigateTo?: string } = {}\n): ThunkResult<void> {\n /*\n * fetch the rules group from backend, delete group if it is found and+\n * reload ruler rules\n */\n return async (dispatch, getState) => {\n withAppEvents(\n (async () => {\n const rulerConfig = getDataSourceRulerConfig(getState, ruleIdentifier.ruleSourceName);\n const rulerClient = getRulerClient(rulerConfig);\n const ruleWithLocation = await rulerClient.findEditableRule(ruleIdentifier);\n\n if (!ruleWithLocation) {\n throw new Error('Rule not found.');\n }\n await rulerClient.deleteRule(ruleWithLocation);\n // refetch rules for this rules source\n await dispatch(fetchPromAndRulerRulesAction({ rulesSourceName: ruleWithLocation.ruleSourceName }));\n\n if (options.navigateTo) {\n locationService.replace(options.navigateTo);\n }\n })(),\n {\n successMessage: 'Rule deleted.',\n }\n );\n };\n}\n\nexport const saveRuleFormAction = createAsyncThunk(\n 'unifiedalerting/saveRuleForm',\n (\n {\n values,\n existing,\n redirectOnSave,\n }: {\n values: RuleFormValues;\n existing?: RuleWithLocation;\n redirectOnSave?: string;\n },\n thunkAPI\n ): Promise<void> =>\n withAppEvents(\n withSerializedError(\n (async () => {\n const { type } = values;\n\n // TODO getRulerConfig should be smart enough to provide proper rulerClient implementation\n // For the dataSourceName specified\n // in case of system (cortex/loki)\n let identifier: RuleIdentifier;\n if (type === RuleFormType.cloudAlerting || type === RuleFormType.cloudRecording) {\n if (!values.dataSourceName) {\n throw new Error('The Data source has not been defined.');\n }\n const rulerConfig = getDataSourceRulerConfig(thunkAPI.getState, values.dataSourceName);\n const rulerClient = getRulerClient(rulerConfig);\n identifier = await rulerClient.saveLotexRule(values, existing);\n\n // in case of grafana managed\n } else if (type === RuleFormType.grafana) {\n const rulerConfig = getDataSourceRulerConfig(thunkAPI.getState, GRAFANA_RULES_SOURCE_NAME);\n const rulerClient = getRulerClient(rulerConfig);\n identifier = await rulerClient.saveGrafanaRule(values, existing);\n } else {\n throw new Error('Unexpected rule form type');\n }\n if (redirectOnSave) {\n locationService.push(redirectOnSave);\n } else {\n // if the identifier comes up empty (this happens when Grafana managed rule moves to another namespace or group)\n const stringifiedIdentifier = ruleId.stringifyIdentifier(identifier);\n if (!stringifiedIdentifier) {\n locationService.push('/alerting/list');\n return;\n }\n // redirect to edit page\n const newLocation = `/alerting/${encodeURIComponent(stringifiedIdentifier)}/edit`;\n if (locationService.getLocation().pathname !== newLocation) {\n locationService.replace(newLocation);\n } else {\n // refresh the details of the current editable rule after saving\n thunkAPI.dispatch(fetchEditableRuleAction(identifier));\n }\n }\n })()\n ),\n {\n successMessage: existing ? `Rule \"${values.name}\" updated.` : `Rule \"${values.name}\" saved.`,\n errorMessage: 'Failed to save rule',\n }\n )\n);\n\nexport const fetchGrafanaNotifiersAction = createAsyncThunk(\n 'unifiedalerting/fetchGrafanaNotifiers',\n (): Promise<NotifierDTO[]> => withSerializedError(fetchNotifiers())\n);\n\nexport const fetchGrafanaAnnotationsAction = createAsyncThunk(\n 'unifiedalerting/fetchGrafanaAnnotations',\n (alertId: string): Promise<StateHistoryItem[]> => withSerializedError(fetchAnnotations(alertId))\n);\n\ninterface UpdateAlertManagerConfigActionOptions {\n alertManagerSourceName: string;\n oldConfig: AlertManagerCortexConfig; // it will be checked to make sure it didn't change in the meanwhile\n newConfig: AlertManagerCortexConfig;\n successMessage?: string; // show toast on success\n redirectPath?: string; // where to redirect on success\n refetch?: boolean; // refetch config on success\n}\n\nexport const updateAlertManagerConfigAction = createAsyncThunk<void, UpdateAlertManagerConfigActionOptions, {}>(\n 'unifiedalerting/updateAMConfig',\n ({ alertManagerSourceName, oldConfig, newConfig, successMessage, redirectPath, refetch }, thunkAPI): Promise<void> =>\n withAppEvents(\n withSerializedError(\n (async () => {\n const latestConfig = await fetchAlertManagerConfig(alertManagerSourceName);\n if (\n !(isEmpty(latestConfig.alertmanager_config) && isEmpty(latestConfig.template_files)) &&\n JSON.stringify(latestConfig) !== JSON.stringify(oldConfig)\n ) {\n throw new Error(\n 'It seems configuration has been recently updated. Please reload page and try again to make sure that recent changes are not overwritten.'\n );\n }\n await updateAlertManagerConfig(alertManagerSourceName, addDefaultsToAlertmanagerConfig(newConfig));\n if (refetch) {\n await thunkAPI.dispatch(fetchAlertManagerConfigAction(alertManagerSourceName));\n }\n if (redirectPath) {\n locationService.push(makeAMLink(redirectPath, alertManagerSourceName));\n }\n })()\n ),\n {\n successMessage,\n }\n )\n);\n\nexport const fetchAmAlertsAction = createAsyncThunk(\n 'unifiedalerting/fetchAmAlerts',\n (alertManagerSourceName: string): Promise<AlertmanagerAlert[]> =>\n withSerializedError(fetchAlerts(alertManagerSourceName, [], true, true, true))\n);\n\nexport const expireSilenceAction = (alertManagerSourceName: string, silenceId: string): ThunkResult<void> => {\n return async (dispatch) => {\n await withAppEvents(expireSilence(alertManagerSourceName, silenceId), {\n successMessage: 'Silence expired.',\n });\n dispatch(fetchSilencesAction(alertManagerSourceName));\n dispatch(fetchAmAlertsAction(alertManagerSourceName));\n };\n};\n\ntype UpdateSilenceActionOptions = {\n alertManagerSourceName: string;\n payload: SilenceCreatePayload;\n exitOnSave: boolean;\n successMessage?: string;\n};\n\nexport const createOrUpdateSilenceAction = createAsyncThunk<void, UpdateSilenceActionOptions, {}>(\n 'unifiedalerting/updateSilence',\n ({ alertManagerSourceName, payload, exitOnSave, successMessage }): Promise<void> =>\n withAppEvents(\n withSerializedError(\n (async () => {\n await createOrUpdateSilence(alertManagerSourceName, payload);\n if (exitOnSave) {\n locationService.push('/alerting/silences');\n }\n })()\n ),\n {\n successMessage,\n }\n )\n);\n\nexport const deleteReceiverAction = (receiverName: string, alertManagerSourceName: string): ThunkResult<void> => {\n return (dispatch, getState) => {\n const config = getState().unifiedAlerting.amConfigs?.[alertManagerSourceName]?.result;\n if (!config) {\n throw new Error(`Config for ${alertManagerSourceName} not found`);\n }\n if (!config.alertmanager_config.receivers?.find((receiver) => receiver.name === receiverName)) {\n throw new Error(`Cannot delete receiver ${receiverName}: not found in config.`);\n }\n const newConfig: AlertManagerCortexConfig = {\n ...config,\n alertmanager_config: {\n ...config.alertmanager_config,\n receivers: config.alertmanager_config.receivers.filter((receiver) => receiver.name !== receiverName),\n },\n };\n return dispatch(\n updateAlertManagerConfigAction({\n newConfig,\n oldConfig: config,\n alertManagerSourceName,\n successMessage: 'Contact point deleted.',\n refetch: true,\n })\n );\n };\n};\n\nexport const deleteTemplateAction = (templateName: string, alertManagerSourceName: string): ThunkResult<void> => {\n return (dispatch, getState) => {\n const config = getState().unifiedAlerting.amConfigs?.[alertManagerSourceName]?.result;\n if (!config) {\n throw new Error(`Config for ${alertManagerSourceName} not found`);\n }\n if (typeof config.template_files?.[templateName] !== 'string') {\n throw new Error(`Cannot delete template ${templateName}: not found in config.`);\n }\n const newTemplates = { ...config.template_files };\n delete newTemplates[templateName];\n const newConfig: AlertManagerCortexConfig = {\n ...config,\n alertmanager_config: {\n ...config.alertmanager_config,\n templates: config.alertmanager_config.templates?.filter((existing) => existing !== templateName),\n },\n template_files: newTemplates,\n };\n return dispatch(\n updateAlertManagerConfigAction({\n newConfig,\n oldConfig: config,\n alertManagerSourceName,\n successMessage: 'Template deleted.',\n refetch: true,\n })\n );\n };\n};\n\nexport const fetchFolderAction = createAsyncThunk(\n 'unifiedalerting/fetchFolder',\n (uid: string): Promise<FolderDTO> => withSerializedError(backendSrv.getFolderByUid(uid, { withAccessControl: true }))\n);\n\nexport const fetchFolderIfNotFetchedAction = (uid: string): ThunkResult<void> => {\n return (dispatch, getState) => {\n if (!getState().unifiedAlerting.folders[uid]?.dispatched) {\n dispatch(fetchFolderAction(uid));\n }\n };\n};\n\nexport const fetchAlertGroupsAction = createAsyncThunk(\n 'unifiedalerting/fetchAlertGroups',\n (alertManagerSourceName: string): Promise<AlertmanagerGroup[]> => {\n return withSerializedError(fetchAlertGroups(alertManagerSourceName));\n }\n);\n\nexport const deleteAlertManagerConfigAction = createAsyncThunk(\n 'unifiedalerting/deleteAlertManagerConfig',\n async (alertManagerSourceName: string, thunkAPI): Promise<void> => {\n return withAppEvents(\n withSerializedError(\n (async () => {\n await deleteAlertManagerConfig(alertManagerSourceName);\n await thunkAPI.dispatch(fetchAlertManagerConfigAction(alertManagerSourceName));\n })()\n ),\n {\n errorMessage: 'Failed to reset Alertmanager configuration',\n successMessage: 'Alertmanager configuration reset.',\n }\n );\n }\n);\n\nexport const deleteMuteTimingAction = (alertManagerSourceName: string, muteTimingName: string): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const config = getState().unifiedAlerting.amConfigs[alertManagerSourceName].result;\n\n const muteIntervals =\n config?.alertmanager_config?.mute_time_intervals?.filter(({ name }) => name !== muteTimingName) ?? [];\n\n if (config) {\n withAppEvents(\n dispatch(\n updateAlertManagerConfigAction({\n alertManagerSourceName,\n oldConfig: config,\n newConfig: {\n ...config,\n alertmanager_config: {\n ...config.alertmanager_config,\n route: config.alertmanager_config.route\n ? removeMuteTimingFromRoute(muteTimingName, config.alertmanager_config?.route)\n : undefined,\n mute_time_intervals: muteIntervals,\n },\n },\n refetch: true,\n })\n ),\n {\n successMessage: `Deleted \"${muteTimingName}\" from Alertmanager configuration`,\n errorMessage: 'Failed to delete mute timing',\n }\n );\n }\n };\n};\n\ninterface TestReceiversOptions {\n alertManagerSourceName: string;\n receivers: Receiver[];\n alert?: TestReceiversAlert;\n}\n\nexport const testReceiversAction = createAsyncThunk(\n 'unifiedalerting/testReceivers',\n ({ alertManagerSourceName, receivers, alert }: TestReceiversOptions): Promise<void> => {\n return withAppEvents(withSerializedError(testReceivers(alertManagerSourceName, receivers, alert)), {\n errorMessage: 'Failed to send test alert.',\n successMessage: 'Test alert sent.',\n });\n }\n);\n\ninterface UpdateNamespaceAndGroupOptions {\n rulesSourceName: string;\n namespaceName: string;\n groupName: string;\n newNamespaceName: string;\n newGroupName: string;\n groupInterval?: string;\n}\n\n// allows renaming namespace, renaming group and changing group interval, all in one go\nexport const updateLotexNamespaceAndGroupAction = createAsyncThunk(\n 'unifiedalerting/updateLotexNamespaceAndGroup',\n async (options: UpdateNamespaceAndGroupOptions, thunkAPI): Promise<void> => {\n return withAppEvents(\n withSerializedError(\n (async () => {\n const { rulesSourceName, namespaceName, groupName, newNamespaceName, newGroupName, groupInterval } = options;\n if (options.rulesSourceName === GRAFANA_RULES_SOURCE_NAME) {\n throw new Error(`this action does not support Grafana rules`);\n }\n\n const rulerConfig = getDataSourceRulerConfig(thunkAPI.getState, rulesSourceName);\n // fetch rules and perform sanity checks\n const rulesResult = await fetchRulerRules(rulerConfig);\n if (!rulesResult[namespaceName]) {\n throw new Error(`Namespace \"${namespaceName}\" not found.`);\n }\n const existingGroup = rulesResult[namespaceName].find((group) => group.name === groupName);\n if (!existingGroup) {\n throw new Error(`Group \"${groupName}\" not found.`);\n }\n if (newGroupName !== groupName && !!rulesResult[namespaceName].find((group) => group.name === newGroupName)) {\n throw new Error(`Group \"${newGroupName}\" already exists.`);\n }\n if (newNamespaceName !== namespaceName && !!rulesResult[newNamespaceName]) {\n throw new Error(`Namespace \"${newNamespaceName}\" already exists.`);\n }\n if (\n newNamespaceName === namespaceName &&\n groupName === newGroupName &&\n groupInterval === existingGroup.interval\n ) {\n throw new Error('Nothing changed.');\n }\n\n // if renaming namespace - make new copies of all groups, then delete old namespace\n if (newNamespaceName !== namespaceName) {\n for (const group of rulesResult[namespaceName]) {\n await setRulerRuleGroup(\n rulerConfig,\n newNamespaceName,\n group.name === groupName\n ? {\n ...group,\n name: newGroupName,\n interval: groupInterval,\n }\n : group\n );\n }\n await deleteNamespace(rulerConfig, namespaceName);\n\n // if only modifying group...\n } else {\n // save updated group\n await setRulerRuleGroup(rulerConfig, namespaceName, {\n ...existingGroup,\n name: newGroupName,\n interval: groupInterval,\n });\n // if group name was changed, delete old group\n if (newGroupName !== groupName) {\n await deleteRulerRulesGroup(rulerConfig, namespaceName, groupName);\n }\n }\n\n // refetch all rules\n await thunkAPI.dispatch(fetchRulerRulesAction({ rulesSourceName }));\n })()\n ),\n {\n errorMessage: 'Failed to update namespace / group',\n successMessage: 'Update successful',\n }\n );\n }\n);\n\nexport const addExternalAlertmanagersAction = createAsyncThunk(\n 'unifiedAlerting/addExternalAlertmanagers',\n async (alertmanagerConfig: ExternalAlertmanagerConfig, thunkAPI): Promise<void> => {\n return withAppEvents(\n withSerializedError(\n (async () => {\n await addAlertManagers(alertmanagerConfig);\n thunkAPI.dispatch(fetchExternalAlertmanagersConfigAction());\n })()\n ),\n {\n errorMessage: 'Failed adding alertmanagers',\n successMessage: 'Alertmanagers updated',\n }\n );\n }\n);\n","import { getBackendSrv } from '@grafana/runtime';\nimport { NotifierDTO } from 'app/types';\n\nexport function fetchNotifiers(): Promise<NotifierDTO[]> {\n return getBackendSrv().get(`/api/alert-notifiers`);\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { AlertState } from 'app/plugins/datasource/alertmanager/types';\n\nexport const getNotificationsTextColors = (theme: GrafanaTheme2) => ({\n [AlertState.Active]: css`\n color: ${theme.colors.error.text};\n `,\n [AlertState.Suppressed]: css`\n color: ${theme.colors.primary.text};\n `,\n [AlertState.Unprocessed]: css`\n color: ${theme.colors.secondary.text};\n `,\n});\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data/src';\n\nexport const getPaginationStyles = (theme: GrafanaTheme2) => {\n return css`\n float: none;\n display: flex;\n justify-content: flex-start;\n margin: ${theme.spacing(2, 0)};\n `;\n};\n","import { AlertQuery, GrafanaAlertStateDecision } from 'app/types/unified-alerting-dto';\n\nexport enum RuleFormType {\n grafana = 'grafana',\n cloudAlerting = 'cloud-alerting',\n cloudRecording = 'cloud-recording',\n}\n\nexport interface RuleForm {\n title: string;\n id: number;\n}\n\nexport interface RuleFormValues {\n // common\n name: string;\n type?: RuleFormType;\n dataSourceName: string | null;\n group: string;\n\n labels: Array<{ key: string; value: string }>;\n annotations: Array<{ key: string; value: string }>;\n\n // grafana rules\n queries: AlertQuery[];\n condition: string | null; // refId of the query that gets alerted on\n noDataState: GrafanaAlertStateDecision;\n execErrState: GrafanaAlertStateDecision;\n folder: RuleForm | null;\n evaluateEvery: string;\n evaluateFor: string;\n\n // cortex / loki rules\n namespace: string;\n forTime: number;\n forTimeUnit: string;\n expression: string;\n}\n","import { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\n\nimport { GRAFANA_RULES_SOURCE_NAME, isGrafanaRulesSource } from './datasource';\n\ntype RulesSourceType = 'grafana' | 'external';\n\nfunction getRulesSourceType(alertManagerSourceName: string): RulesSourceType {\n return isGrafanaRulesSource(alertManagerSourceName) ? 'grafana' : 'external';\n}\n\nexport const instancesPermissions = {\n read: {\n grafana: AccessControlAction.AlertingInstanceRead,\n external: AccessControlAction.AlertingInstancesExternalRead,\n },\n create: {\n grafana: AccessControlAction.AlertingInstanceCreate,\n external: AccessControlAction.AlertingInstancesExternalWrite,\n },\n update: {\n grafana: AccessControlAction.AlertingInstanceUpdate,\n external: AccessControlAction.AlertingInstancesExternalWrite,\n },\n delete: {\n grafana: AccessControlAction.AlertingInstanceUpdate,\n external: AccessControlAction.AlertingInstancesExternalWrite,\n },\n};\n\nexport const notificationsPermissions = {\n read: {\n grafana: AccessControlAction.AlertingNotificationsRead,\n external: AccessControlAction.AlertingNotificationsExternalRead,\n },\n create: {\n grafana: AccessControlAction.AlertingNotificationsWrite,\n external: AccessControlAction.AlertingNotificationsExternalWrite,\n },\n update: {\n grafana: AccessControlAction.AlertingNotificationsWrite,\n external: AccessControlAction.AlertingNotificationsExternalWrite,\n },\n delete: {\n grafana: AccessControlAction.AlertingNotificationsWrite,\n external: AccessControlAction.AlertingNotificationsExternalWrite,\n },\n};\n\nconst rulesPermissions = {\n read: {\n grafana: AccessControlAction.AlertingRuleRead,\n external: AccessControlAction.AlertingRuleExternalRead,\n },\n create: {\n grafana: AccessControlAction.AlertingRuleCreate,\n external: AccessControlAction.AlertingRuleExternalWrite,\n },\n update: {\n grafana: AccessControlAction.AlertingRuleUpdate,\n external: AccessControlAction.AlertingRuleExternalWrite,\n },\n delete: {\n grafana: AccessControlAction.AlertingRuleDelete,\n external: AccessControlAction.AlertingRuleExternalWrite,\n },\n};\n\nexport function getInstancesPermissions(rulesSourceName: string) {\n const sourceType = getRulesSourceType(rulesSourceName);\n\n return {\n read: instancesPermissions.read[sourceType],\n create: instancesPermissions.create[sourceType],\n update: instancesPermissions.update[sourceType],\n delete: instancesPermissions.delete[sourceType],\n };\n}\n\nexport function getNotificationsPermissions(rulesSourceName: string) {\n const sourceType = getRulesSourceType(rulesSourceName);\n\n return {\n read: notificationsPermissions.read[sourceType],\n create: notificationsPermissions.create[sourceType],\n update: notificationsPermissions.update[sourceType],\n delete: notificationsPermissions.delete[sourceType],\n };\n}\n\nexport function getRulesPermissions(rulesSourceName: string) {\n const sourceType = getRulesSourceType(rulesSourceName);\n\n return {\n read: rulesPermissions.read[sourceType],\n create: rulesPermissions.create[sourceType],\n update: rulesPermissions.update[sourceType],\n delete: rulesPermissions.delete[sourceType],\n };\n}\n\nexport function evaluateAccess(actions: AccessControlAction[], fallBackUserRoles: string[]) {\n return () => {\n return contextSrv.evaluatePermission(() => fallBackUserRoles, actions);\n };\n}\n\nexport function getRulesAccess() {\n return {\n canCreateGrafanaRules:\n contextSrv.hasAccess(AccessControlAction.FoldersRead, contextSrv.hasEditPermissionInFolders) &&\n contextSrv.hasAccess(rulesPermissions.create.grafana, contextSrv.hasEditPermissionInFolders),\n canCreateCloudRules:\n contextSrv.hasAccess(AccessControlAction.DataSourcesRead, contextSrv.isEditor) &&\n contextSrv.hasAccess(rulesPermissions.create.external, contextSrv.isEditor),\n canEditRules: (rulesSourceName: string) => {\n const permissionFallback =\n rulesSourceName === GRAFANA_RULES_SOURCE_NAME ? contextSrv.hasEditPermissionInFolders : contextSrv.isEditor;\n return contextSrv.hasAccess(getRulesPermissions(rulesSourceName).update, permissionFallback);\n },\n };\n}\n","import { SelectableValue } from '@grafana/data';\nimport {\n AlertManagerCortexConfig,\n MatcherOperator,\n Route,\n Matcher,\n TimeInterval,\n TimeRange,\n} from 'app/plugins/datasource/alertmanager/types';\nimport { Labels } from 'app/types/unified-alerting-dto';\n\nimport { MatcherFieldValue } from '../types/silence-form';\n\nimport { getAllDataSources } from './config';\nimport { DataSourceType } from './datasource';\n\nexport function addDefaultsToAlertmanagerConfig(config: AlertManagerCortexConfig): AlertManagerCortexConfig {\n // add default receiver if it does not exist\n if (!config.alertmanager_config.receivers) {\n config.alertmanager_config.receivers = [{ name: 'default ' }];\n }\n // add default route if it does not exists\n if (!config.alertmanager_config.route) {\n config.alertmanager_config.route = {\n receiver: config.alertmanager_config.receivers![0].name,\n };\n }\n if (!config.template_files) {\n config.template_files = {};\n }\n return config;\n}\n\nexport function removeMuteTimingFromRoute(muteTiming: string, route: Route): Route {\n const newRoute: Route = {\n ...route,\n mute_time_intervals: route.mute_time_intervals?.filter((muteName) => muteName !== muteTiming) ?? [],\n routes: route.routes?.map((subRoute) => removeMuteTimingFromRoute(muteTiming, subRoute)),\n };\n return newRoute;\n}\n\nexport function renameMuteTimings(newMuteTimingName: string, oldMuteTimingName: string, route: Route): Route {\n return {\n ...route,\n mute_time_intervals: route.mute_time_intervals?.map((name) =>\n name === oldMuteTimingName ? newMuteTimingName : name\n ),\n routes: route.routes?.map((subRoute) => renameMuteTimings(newMuteTimingName, oldMuteTimingName, subRoute)),\n };\n}\n\nfunction isReceiverUsedInRoute(receiver: string, route: Route): boolean {\n return (\n (route.receiver === receiver || route.routes?.some((route) => isReceiverUsedInRoute(receiver, route))) ?? false\n );\n}\n\nexport function isReceiverUsed(receiver: string, config: AlertManagerCortexConfig): boolean {\n return (\n (config.alertmanager_config.route && isReceiverUsedInRoute(receiver, config.alertmanager_config.route)) ?? false\n );\n}\n\nexport function matcherToOperator(matcher: Matcher): MatcherOperator {\n if (matcher.isEqual) {\n if (matcher.isRegex) {\n return MatcherOperator.regex;\n } else {\n return MatcherOperator.equal;\n }\n } else if (matcher.isRegex) {\n return MatcherOperator.notRegex;\n } else {\n return MatcherOperator.notEqual;\n }\n}\n\nexport function matcherOperatorToValue(operator: MatcherOperator) {\n switch (operator) {\n case MatcherOperator.equal:\n return { isEqual: true, isRegex: false };\n case MatcherOperator.notEqual:\n return { isEqual: false, isRegex: false };\n case MatcherOperator.regex:\n return { isEqual: true, isRegex: true };\n case MatcherOperator.notRegex:\n return { isEqual: false, isRegex: true };\n }\n}\n\nexport function matcherToMatcherField(matcher: Matcher): MatcherFieldValue {\n return {\n name: matcher.name,\n value: matcher.value,\n operator: matcherToOperator(matcher),\n };\n}\n\nexport function matcherFieldToMatcher(field: MatcherFieldValue): Matcher {\n return {\n name: field.name,\n value: field.value,\n ...matcherOperatorToValue(field.operator),\n };\n}\n\nexport function matchersToString(matchers: Matcher[]) {\n const matcherFields = matchers.map(matcherToMatcherField);\n\n const combinedMatchers = matcherFields.reduce((acc, current) => {\n const currentMatcherString = `${current.name}${current.operator}\"${current.value}\"`;\n return acc ? `${acc},${currentMatcherString}` : currentMatcherString;\n }, '');\n\n return `{${combinedMatchers}}`;\n}\n\nexport const matcherFieldOptions: SelectableValue[] = [\n { label: MatcherOperator.equal, description: 'Equals', value: MatcherOperator.equal },\n { label: MatcherOperator.notEqual, description: 'Does not equal', value: MatcherOperator.notEqual },\n { label: MatcherOperator.regex, description: 'Matches regex', value: MatcherOperator.regex },\n { label: MatcherOperator.notRegex, description: 'Does not match regex', value: MatcherOperator.notRegex },\n];\n\nconst matcherOperators = [\n MatcherOperator.regex,\n MatcherOperator.notRegex,\n MatcherOperator.notEqual,\n MatcherOperator.equal,\n];\n\nexport function parseMatcher(matcher: string): Matcher {\n const trimmed = matcher.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n throw new Error(`PromQL matchers not supported yet, sorry! PromQL matcher found: ${trimmed}`);\n }\n const operatorsFound = matcherOperators\n .map((op): [MatcherOperator, number] => [op, trimmed.indexOf(op)])\n .filter(([_, idx]) => idx > -1)\n .sort((a, b) => a[1] - b[1]);\n\n if (!operatorsFound.length) {\n throw new Error(`Invalid matcher: ${trimmed}`);\n }\n const [operator, idx] = operatorsFound[0];\n const name = trimmed.slice(0, idx).trim();\n const value = trimmed.slice(idx + operator.length).trim();\n if (!name) {\n throw new Error(`Invalid matcher: ${trimmed}`);\n }\n\n return {\n name,\n value,\n isRegex: operator === MatcherOperator.regex || operator === MatcherOperator.notRegex,\n isEqual: operator === MatcherOperator.equal || operator === MatcherOperator.regex,\n };\n}\n\nexport function parseMatchers(matcherQueryString: string): Matcher[] {\n const matcherRegExp = /\\b([\\w.-]+)(=~|!=|!~|=(?=\"?\\w))\"?([^\"\\n,]*)\"?/g;\n const matchers: Matcher[] = [];\n\n matcherQueryString.replace(matcherRegExp, (_, key, operator, value) => {\n const isEqual = operator === MatcherOperator.equal || operator === MatcherOperator.regex;\n const isRegex = operator === MatcherOperator.regex || operator === MatcherOperator.notRegex;\n matchers.push({\n name: key,\n value,\n isEqual,\n isRegex,\n });\n return '';\n });\n\n return matchers;\n}\n\nexport function labelsMatchMatchers(labels: Labels, matchers: Matcher[]): boolean {\n return matchers.every(({ name, value, isRegex, isEqual }) => {\n return Object.entries(labels).some(([labelKey, labelValue]) => {\n const nameMatches = name === labelKey;\n let valueMatches;\n if (isEqual && !isRegex) {\n valueMatches = value === labelValue;\n }\n if (!isEqual && !isRegex) {\n valueMatches = value !== labelValue;\n }\n if (isEqual && isRegex) {\n valueMatches = new RegExp(value).test(labelValue);\n }\n if (!isEqual && isRegex) {\n valueMatches = !new RegExp(value).test(labelValue);\n }\n\n return nameMatches && valueMatches;\n });\n });\n}\n\nexport function getAllAlertmanagerDataSources() {\n return getAllDataSources().filter((ds) => ds.type === DataSourceType.Alertmanager);\n}\n\nexport function getAlertmanagerByUid(uid?: string) {\n return getAllAlertmanagerDataSources().find((ds) => uid === ds.uid);\n}\n\nexport function timeIntervalToString(timeInterval: TimeInterval): string {\n const { times, weekdays, days_of_month, months, years } = timeInterval;\n const timeString = getTimeString(times);\n const weekdayString = getWeekdayString(weekdays);\n const daysString = getDaysOfMonthString(days_of_month);\n const monthsString = getMonthsString(months);\n const yearsString = getYearsString(years);\n\n return [timeString, weekdayString, daysString, monthsString, yearsString].join(', ');\n}\n\nexport function getTimeString(times?: TimeRange[]): string {\n return (\n 'Times: ' +\n (times ? times?.map(({ start_time, end_time }) => `${start_time} - ${end_time} UTC`).join(' and ') : 'All')\n );\n}\n\nexport function getWeekdayString(weekdays?: string[]): string {\n return (\n 'Weekdays: ' +\n (weekdays\n ?.map((day) => {\n if (day.includes(':')) {\n return day\n .split(':')\n .map((d) => {\n const abbreviated = d.slice(0, 3);\n return abbreviated[0].toLocaleUpperCase() + abbreviated.slice(1);\n })\n .join('-');\n } else {\n const abbreviated = day.slice(0, 3);\n return abbreviated[0].toLocaleUpperCase() + abbreviated.slice(1);\n }\n })\n .join(', ') ?? 'All')\n );\n}\n\nexport function getDaysOfMonthString(daysOfMonth?: string[]): string {\n return 'Days of the month: ' + (daysOfMonth?.join(', ') ?? 'All');\n}\n\nexport function getMonthsString(months?: string[]): string {\n return 'Months: ' + (months?.join(', ') ?? 'All');\n}\n\nexport function getYearsString(years?: string[]): string {\n return 'Years: ' + (years?.join(', ') ?? 'All');\n}\n","import { DataSourceInstanceSettings, DataSourceJsonData, isValidGoDuration, rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nexport function getAllDataSources(): Array<DataSourceInstanceSettings<DataSourceJsonData>> {\n return Object.values(config.datasources);\n}\n\nexport function checkEvaluationIntervalGlobalLimit(alertGroupEvaluateEvery?: string) {\n if (!alertGroupEvaluateEvery) {\n return { globalLimit: 0, exceedsLimit: false };\n }\n\n if (!isValidGoDuration(config.unifiedAlerting.minInterval)) {\n return { globalLimit: 0, exceedsLimit: false };\n }\n\n const evaluateEveryMs = rangeUtil.intervalToMs(alertGroupEvaluateEvery);\n const evaluateEveryGlobalLimitMs = rangeUtil.intervalToMs(config.unifiedAlerting.minInterval);\n\n const exceedsLimit = evaluateEveryGlobalLimitMs > evaluateEveryMs && evaluateEveryMs > 0;\n\n return { globalLimit: evaluateEveryGlobalLimitMs, exceedsLimit };\n}\n","export const RULER_NOT_SUPPORTED_MSG = 'ruler not supported';\n\nexport const RULE_LIST_POLL_INTERVAL_MS = 20000;\n\nexport const ALERTMANAGER_NAME_QUERY_KEY = 'alertmanager';\nexport const ALERTMANAGER_NAME_LOCAL_STORAGE_KEY = 'alerting-alertmanager';\nexport const SILENCES_POLL_INTERVAL_MS = 20000;\nexport const NOTIFICATIONS_POLL_INTERVAL_MS = 20000;\n\nexport const TIMESERIES = 'timeseries';\nexport const TABLE = 'table';\nexport const STAT = 'stat';\n\nexport enum Annotation {\n description = 'description',\n summary = 'summary',\n runbookURL = 'runbook_url',\n alertId = '__alertId__',\n dashboardUID = '__dashboardUid__',\n panelID = '__panelId__',\n}\n\nexport const annotationLabels: Record<Annotation, string> = {\n [Annotation.description]: 'Description',\n [Annotation.summary]: 'Summary',\n [Annotation.runbookURL]: 'Runbook URL',\n [Annotation.dashboardUID]: 'Dashboard UID',\n [Annotation.panelID]: 'Panel ID',\n [Annotation.alertId]: 'Alert ID',\n};\n","import { DataSourceInstanceSettings, DataSourceJsonData } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AlertManagerDataSourceJsonData, AlertManagerImplementation } from 'app/plugins/datasource/alertmanager/types';\nimport { AccessControlAction } from 'app/types';\nimport { RulesSource } from 'app/types/unified-alerting';\n\nimport { instancesPermissions, notificationsPermissions } from './access-control';\nimport { getAllDataSources } from './config';\n\nexport const GRAFANA_RULES_SOURCE_NAME = 'grafana';\nexport const GRAFANA_DATASOURCE_NAME = '-- Grafana --';\n\nexport enum DataSourceType {\n Alertmanager = 'alertmanager',\n Loki = 'loki',\n Prometheus = 'prometheus',\n}\n\nexport interface AlertManagerDataSource {\n name: string;\n imgUrl: string;\n meta?: DataSourceInstanceSettings['meta'];\n}\n\nexport const RulesDataSourceTypes: string[] = [DataSourceType.Loki, DataSourceType.Prometheus];\n\nexport function getRulesDataSources() {\n if (!contextSrv.hasPermission(AccessControlAction.AlertingRuleExternalRead)) {\n return [];\n }\n\n return getAllDataSources()\n .filter((ds) => RulesDataSourceTypes.includes(ds.type) && ds.jsonData.manageAlerts !== false)\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function getRulesDataSource(rulesSourceName: string) {\n return getRulesDataSources().find((x) => x.name === rulesSourceName);\n}\n\nexport function getAlertManagerDataSources() {\n return getAllDataSources()\n .filter(\n (ds): ds is DataSourceInstanceSettings<AlertManagerDataSourceJsonData> => ds.type === DataSourceType.Alertmanager\n )\n .sort((a, b) => a.name.localeCompare(b.name));\n}\n\nconst grafanaAlertManagerDataSource: AlertManagerDataSource = {\n name: GRAFANA_RULES_SOURCE_NAME,\n imgUrl: 'public/img/grafana_icon.svg',\n};\n\n// Used only as a fallback for Alert Group plugin\nexport function getAllAlertManagerDataSources(): AlertManagerDataSource[] {\n return [\n grafanaAlertManagerDataSource,\n ...getAlertManagerDataSources().map<AlertManagerDataSource>((ds) => ({\n name: ds.name,\n displayName: ds.name,\n imgUrl: ds.meta.info.logos.small,\n meta: ds.meta,\n })),\n ];\n}\n\nexport function getAlertManagerDataSourcesByPermission(\n permission: 'instance' | 'notification'\n): AlertManagerDataSource[] {\n const availableDataSources: AlertManagerDataSource[] = [];\n const permissions = {\n instance: instancesPermissions.read,\n notification: notificationsPermissions.read,\n };\n\n if (contextSrv.hasPermission(permissions[permission].grafana)) {\n availableDataSources.push(grafanaAlertManagerDataSource);\n }\n\n if (contextSrv.hasPermission(permissions[permission].external)) {\n const cloudSources = getAlertManagerDataSources().map<AlertManagerDataSource>((ds) => ({\n name: ds.name,\n displayName: ds.name,\n imgUrl: ds.meta.info.logos.small,\n meta: ds.meta,\n }));\n availableDataSources.push(...cloudSources);\n }\n\n return availableDataSources;\n}\n\nexport function getLotexDataSourceByName(dataSourceName: string): DataSourceInstanceSettings {\n const dataSource = getDataSourceByName(dataSourceName);\n if (!dataSource) {\n throw new Error(`Data source ${dataSourceName} not found`);\n }\n if (dataSource.type !== DataSourceType.Loki && dataSource.type !== DataSourceType.Prometheus) {\n throw new Error(`Unexpected data source type ${dataSource.type}`);\n }\n return dataSource;\n}\n\nexport function getAllRulesSourceNames(): string[] {\n const availableRulesSources: string[] = getRulesDataSources().map((r) => r.name);\n\n if (contextSrv.hasPermission(AccessControlAction.AlertingRuleRead)) {\n availableRulesSources.push(GRAFANA_RULES_SOURCE_NAME);\n }\n\n return availableRulesSources;\n}\n\nexport function getAllRulesSources(): RulesSource[] {\n const availableRulesSources: RulesSource[] = getRulesDataSources();\n\n if (contextSrv.hasPermission(AccessControlAction.AlertingRuleRead)) {\n availableRulesSources.push(GRAFANA_RULES_SOURCE_NAME);\n }\n\n return availableRulesSources;\n}\n\nexport function getRulesSourceName(rulesSource: RulesSource): string {\n return isCloudRulesSource(rulesSource) ? rulesSource.name : rulesSource;\n}\n\nexport function getRulesSourceUid(rulesSource: RulesSource): string {\n return isCloudRulesSource(rulesSource) ? rulesSource.uid : GRAFANA_RULES_SOURCE_NAME;\n}\n\nexport function isCloudRulesSource(rulesSource: RulesSource | string): rulesSource is DataSourceInstanceSettings {\n return rulesSource !== GRAFANA_RULES_SOURCE_NAME;\n}\n\nexport function isVanillaPrometheusAlertManagerDataSource(name: string): boolean {\n return (\n name !== GRAFANA_RULES_SOURCE_NAME &&\n (getDataSourceByName(name)?.jsonData as AlertManagerDataSourceJsonData)?.implementation ===\n AlertManagerImplementation.prometheus\n );\n}\n\nexport function isGrafanaRulesSource(\n rulesSource: RulesSource | string\n): rulesSource is typeof GRAFANA_RULES_SOURCE_NAME {\n return rulesSource === GRAFANA_RULES_SOURCE_NAME;\n}\n\nexport function getDataSourceByName(name: string): DataSourceInstanceSettings<DataSourceJsonData> | undefined {\n return getAllDataSources().find((source) => source.name === name);\n}\n\nexport function getRulesSourceByName(name: string): RulesSource | undefined {\n if (name === GRAFANA_RULES_SOURCE_NAME) {\n return GRAFANA_RULES_SOURCE_NAME;\n }\n return getDataSourceByName(name);\n}\n\nexport function getDatasourceAPIId(dataSourceName: string) {\n if (dataSourceName === GRAFANA_RULES_SOURCE_NAME) {\n return GRAFANA_RULES_SOURCE_NAME;\n }\n const ds = getDataSourceByName(dataSourceName);\n if (!ds) {\n throw new Error(`Datasource \"${dataSourceName}\" not found`);\n }\n return String(ds.id);\n}\n\nexport function getDatasourceAPIUid(dataSourceName: string) {\n if (dataSourceName === GRAFANA_RULES_SOURCE_NAME) {\n return GRAFANA_RULES_SOURCE_NAME;\n }\n const ds = getDataSourceByName(dataSourceName);\n if (!ds) {\n throw new Error(`Datasource \"${dataSourceName}\" not found`);\n }\n return ds.uid;\n}\n\nexport function getFirstCompatibleDataSource(): DataSourceInstanceSettings<DataSourceJsonData> | undefined {\n return getRulesDataSources()[0];\n}\n\nexport function getDefaultOrFirstCompatibleDataSource(): DataSourceInstanceSettings<DataSourceJsonData> | undefined {\n const defaultDataSource = getDataSourceSrv().getInstanceSettings('default');\n const defaultIsCompatible = defaultDataSource?.meta.alerting ?? false;\n\n return defaultIsCompatible ? defaultDataSource : getFirstCompatibleDataSource();\n}\n","import { uniqBy } from 'lodash';\n\nimport { Labels } from '@grafana/data';\nimport { Matcher, MatcherOperator } from 'app/plugins/datasource/alertmanager/types';\nimport { Alert } from 'app/types/unified-alerting';\n\nimport { MatcherFieldValue } from '../types/silence-form';\n\nimport { parseMatcher } from './alertmanager';\n\n// Parses a list of entries like like \"['foo=bar', 'baz=~bad*']\" into SilenceMatcher[]\nexport function parseQueryParamMatchers(matcherPairs: string[]): Matcher[] {\n const parsedMatchers = matcherPairs.filter((x) => !!x.trim()).map((x) => parseMatcher(x.trim()));\n\n // Due to migration, old alert rules might have a duplicated alertname label\n // To handle that case want to filter out duplicates and make sure there are only unique labels\n return uniqBy(parsedMatchers, (matcher) => matcher.name);\n}\n\nexport const getMatcherQueryParams = (labels: Labels) => {\n const validMatcherLabels = Object.entries(labels).filter(\n ([labelKey]) => !(labelKey.startsWith('__') && labelKey.endsWith('__'))\n );\n\n const matcherUrlParams = new URLSearchParams();\n validMatcherLabels.forEach(([labelKey, labelValue]) =>\n matcherUrlParams.append('matcher', `${labelKey}=${labelValue}`)\n );\n\n return matcherUrlParams;\n};\n\ninterface MatchedInstance {\n id: string;\n data: {\n matchedInstance: Alert;\n };\n}\n\nexport const findAlertInstancesWithMatchers = (\n instances: Alert[],\n matchers: MatcherFieldValue[]\n): MatchedInstance[] => {\n const anchorRegex = (regexpString: string): RegExp => {\n // Silence matchers are always fully anchored in the Alertmanager: https://github.com/prometheus/alertmanager/pull/748\n if (!regexpString.startsWith('^')) {\n regexpString = '^' + regexpString;\n }\n if (!regexpString.endsWith('$')) {\n regexpString = regexpString + '$';\n }\n return new RegExp(regexpString);\n };\n\n const matchesInstance = (instance: Alert, matcher: MatcherFieldValue) => {\n return Object.entries(instance.labels).some(([key, value]) => {\n if (!matcher.name || !matcher.value) {\n return false;\n }\n if (matcher.name !== key) {\n return false;\n }\n switch (matcher.operator) {\n case MatcherOperator.equal:\n return matcher.value === value;\n case MatcherOperator.notEqual:\n return matcher.value !== value;\n case MatcherOperator.regex:\n const regex = anchorRegex(matcher.value);\n return regex.test(value);\n case MatcherOperator.notRegex:\n const negregex = anchorRegex(matcher.value);\n return !negregex.test(value);\n default:\n return false;\n }\n });\n };\n\n const filteredInstances = instances.filter((instance) => {\n return matchers.every((matcher) => matchesInstance(instance, matcher));\n });\n const mappedInstances = filteredInstances.map((instance) => ({\n id: `${instance.activeAt}-${instance.value}`,\n data: { matchedInstance: instance },\n }));\n\n return mappedInstances;\n};\n","import { sortBy } from 'lodash';\n\nimport { urlUtil, UrlQueryMap, Labels, DataSourceInstanceSettings } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { alertInstanceKey } from 'app/features/alerting/unified/utils/rules';\nimport { SortOrder } from 'app/plugins/panel/alertlist/types';\nimport { Alert, CombinedRule, FilterState, RulesSource, SilenceFilterState } from 'app/types/unified-alerting';\nimport {\n GrafanaAlertState,\n PromAlertingRuleState,\n mapStateWithReasonToBaseState,\n} from 'app/types/unified-alerting-dto';\n\nimport { ALERTMANAGER_NAME_QUERY_KEY } from './constants';\nimport { getRulesSourceName } from './datasource';\nimport { getMatcherQueryParams } from './matchers';\nimport * as ruleId from './rule-id';\n\nexport function createViewLink(ruleSource: RulesSource, rule: CombinedRule, returnTo: string): string {\n const sourceName = getRulesSourceName(ruleSource);\n const identifier = ruleId.fromCombinedRule(sourceName, rule);\n const paramId = encodeURIComponent(ruleId.stringifyIdentifier(identifier));\n const paramSource = encodeURIComponent(sourceName);\n\n return urlUtil.renderUrl(`${config.appSubUrl}/alerting/${paramSource}/${paramId}/view`, { returnTo });\n}\n\nexport function createExploreLink(dataSourceName: string, query: string) {\n return urlUtil.renderUrl(`${config.appSubUrl}/explore`, {\n left: JSON.stringify([\n 'now-1h',\n 'now',\n dataSourceName,\n { datasource: dataSourceName, expr: query },\n { ui: [true, true, true, 'none'] },\n ]),\n });\n}\n\nexport function arrayToRecord(items: Array<{ key: string; value: string }>): Record<string, string> {\n return items.reduce<Record<string, string>>((rec, { key, value }) => {\n rec[key] = value;\n return rec;\n }, {});\n}\n\nexport const getFiltersFromUrlParams = (queryParams: UrlQueryMap): FilterState => {\n const queryString = queryParams['queryString'] === undefined ? undefined : String(queryParams['queryString']);\n const alertState = queryParams['alertState'] === undefined ? undefined : String(queryParams['alertState']);\n const dataSource = queryParams['dataSource'] === undefined ? undefined : String(queryParams['dataSource']);\n const ruleType = queryParams['ruleType'] === undefined ? undefined : String(queryParams['ruleType']);\n const groupBy = queryParams['groupBy'] === undefined ? undefined : String(queryParams['groupBy']).split(',');\n return { queryString, alertState, dataSource, groupBy, ruleType };\n};\n\nexport const getNotificationPoliciesFilters = (searchParams: URLSearchParams) => {\n return {\n queryString: searchParams.get('queryString') ?? undefined,\n contactPoint: searchParams.get('contactPoint') ?? undefined,\n };\n};\n\nexport const getSilenceFiltersFromUrlParams = (queryParams: UrlQueryMap): SilenceFilterState => {\n const queryString = queryParams['queryString'] === undefined ? undefined : String(queryParams['queryString']);\n const silenceState = queryParams['silenceState'] === undefined ? undefined : String(queryParams['silenceState']);\n\n return { queryString, silenceState };\n};\n\nexport function recordToArray(record: Record<string, string>): Array<{ key: string; value: string }> {\n return Object.entries(record).map(([key, value]) => ({ key, value }));\n}\n\nexport function makeAMLink(path: string, alertManagerName?: string, options?: Record<string, string>): string {\n const search = new URLSearchParams(options);\n if (alertManagerName) {\n search.append(ALERTMANAGER_NAME_QUERY_KEY, alertManagerName);\n }\n return `${path}?${search.toString()}`;\n}\n\nexport function makeRuleBasedSilenceLink(alertManagerSourceName: string, rule: CombinedRule) {\n const labels: Labels = {\n alertname: rule.name,\n ...rule.labels,\n };\n\n return makeLabelBasedSilenceLink(alertManagerSourceName, labels);\n}\n\nexport function makeLabelBasedSilenceLink(alertManagerSourceName: string, labels: Labels) {\n const silenceUrlParams = new URLSearchParams();\n silenceUrlParams.append('alertmanager', alertManagerSourceName);\n\n const matcherParams = getMatcherQueryParams(labels);\n matcherParams.forEach((value, key) => silenceUrlParams.append(key, value));\n\n return `${config.appSubUrl}/alerting/silence/new?${silenceUrlParams.toString()}`;\n}\n\nexport function makeDataSourceLink<T>(dataSource: DataSourceInstanceSettings<T>) {\n return `${config.appSubUrl}/datasources/edit/${dataSource.uid}`;\n}\n\n// keep retrying fn if it's error passes shouldRetry(error) and timeout has not elapsed yet\nexport function retryWhile<T, E = Error>(\n fn: () => Promise<T>,\n shouldRetry: (e: E) => boolean,\n timeout: number, // milliseconds, how long to keep retrying\n pause = 1000 // milliseconds, pause between retries\n): Promise<T> {\n const start = new Date().getTime();\n const makeAttempt = (): Promise<T> =>\n fn().catch((e) => {\n if (shouldRetry(e) && new Date().getTime() - start < timeout) {\n return new Promise((resolve) => setTimeout(resolve, pause)).then(makeAttempt);\n }\n throw e;\n });\n return makeAttempt();\n}\n\nconst alertStateSortScore = {\n [GrafanaAlertState.Alerting]: 1,\n [PromAlertingRuleState.Firing]: 1,\n [GrafanaAlertState.Error]: 1,\n [GrafanaAlertState.Pending]: 2,\n [PromAlertingRuleState.Pending]: 2,\n [PromAlertingRuleState.Inactive]: 2,\n [GrafanaAlertState.NoData]: 3,\n [GrafanaAlertState.Normal]: 4,\n};\n\nexport function sortAlerts(sortOrder: SortOrder, alerts: Alert[]): Alert[] {\n // Make sure to handle tie-breaks because API returns alert instances in random order every time\n if (sortOrder === SortOrder.Importance) {\n return sortBy(alerts, (alert) => [\n alertStateSortScore[mapStateWithReasonToBaseState(alert.state)],\n alertInstanceKey(alert).toLocaleLowerCase(),\n ]);\n } else if (sortOrder === SortOrder.TimeAsc) {\n return sortBy(alerts, (alert) => [\n new Date(alert.activeAt) || new Date(),\n alertInstanceKey(alert).toLocaleLowerCase(),\n ]);\n } else if (sortOrder === SortOrder.TimeDesc) {\n return sortBy(alerts, (alert) => [\n new Date(alert.activeAt) || new Date(),\n alertInstanceKey(alert).toLocaleLowerCase(),\n ]).reverse();\n }\n const result = sortBy(alerts, (alert) => alertInstanceKey(alert).toLocaleLowerCase());\n if (sortOrder === SortOrder.AlphaDesc) {\n result.reverse();\n }\n\n return result;\n}\n","import { AsyncThunk, createSlice, Draft, isAsyncThunkAction, PayloadAction, SerializedError } from '@reduxjs/toolkit';\n\nimport { AppEvents } from '@grafana/data';\nimport { FetchError, isFetchError } from '@grafana/runtime';\nimport { appEvents } from 'app/core/core';\n\nexport interface AsyncRequestState<T> {\n result?: T;\n loading: boolean;\n error?: SerializedError;\n dispatched: boolean;\n requestId?: string;\n}\n\nexport const initialAsyncRequestState: Pick<\n AsyncRequestState<undefined>,\n 'loading' | 'dispatched' | 'result' | 'error'\n> = Object.freeze({\n loading: false,\n result: undefined,\n error: undefined,\n dispatched: false,\n});\n\nexport type AsyncRequestMapSlice<T> = Record<string, AsyncRequestState<T>>;\n\nexport type AsyncRequestAction<T> = PayloadAction<Draft<T>, string, any, any>;\n\nfunction requestStateReducer<T, ThunkArg = void, ThunkApiConfig = {}>(\n asyncThunk: AsyncThunk<T, ThunkArg, ThunkApiConfig>,\n state: Draft<AsyncRequestState<T>> = initialAsyncRequestState,\n action: AsyncRequestAction<T>\n): Draft<AsyncRequestState<T>> {\n if (asyncThunk.pending.match(action)) {\n return {\n result: state.result,\n loading: true,\n error: state.error,\n dispatched: true,\n requestId: action.meta.requestId,\n };\n } else if (asyncThunk.fulfilled.match(action)) {\n if (state.requestId === undefined || state.requestId === action.meta.requestId) {\n return {\n ...state,\n result: action.payload,\n loading: false,\n error: undefined,\n };\n }\n } else if (asyncThunk.rejected.match(action)) {\n if (state.requestId === action.meta.requestId) {\n return {\n ...state,\n loading: false,\n error: action.error,\n };\n }\n }\n return state;\n}\n\n/*\n * createAsyncSlice creates a slice based on a given async action, exposing it's state.\n * takes care to only use state of the latest invocation of the action if there are several in flight.\n */\nexport function createAsyncSlice<T, ThunkArg = void, ThunkApiConfig = {}>(\n name: string,\n asyncThunk: AsyncThunk<T, ThunkArg, ThunkApiConfig>\n) {\n return createSlice({\n name,\n initialState: initialAsyncRequestState as AsyncRequestState<T>,\n reducers: {},\n extraReducers: (builder) =>\n builder.addDefaultCase((state, action) =>\n requestStateReducer(asyncThunk, state, action as unknown as AsyncRequestAction<T>)\n ),\n });\n}\n\n/*\n * createAsyncMapSlice creates a slice based on a given async action exposing a map of request states.\n * separate requests are uniquely indentified by result of provided getEntityId function\n * takes care to only use state of the latest invocation of the action if there are several in flight.\n */\nexport function createAsyncMapSlice<T, ThunkArg = void, ThunkApiConfig = {}>(\n name: string,\n asyncThunk: AsyncThunk<T, ThunkArg, ThunkApiConfig>,\n getEntityId: (arg: ThunkArg) => string\n) {\n return createSlice({\n name,\n initialState: {} as AsyncRequestMapSlice<T>,\n reducers: {},\n extraReducers: (builder) =>\n builder.addDefaultCase((state, action) => {\n if (isAsyncThunkAction(asyncThunk)(action)) {\n const asyncAction = action as unknown as AsyncRequestAction<T>;\n const entityId = getEntityId(asyncAction.meta.arg);\n return {\n ...state,\n [entityId]: requestStateReducer(asyncThunk, state[entityId], asyncAction),\n };\n }\n return state;\n }),\n });\n}\n\n// rethrow promise error in redux serialized format\nexport function withSerializedError<T>(p: Promise<T>): Promise<T> {\n return p.catch((e) => {\n const err: SerializedError = {\n message: messageFromError(e),\n code: e.statusCode,\n };\n throw err;\n });\n}\n\nexport function withAppEvents<T>(\n p: Promise<T>,\n options: { successMessage?: string; errorMessage?: string }\n): Promise<T> {\n return p\n .then((v) => {\n if (options.successMessage) {\n appEvents.emit(AppEvents.alertSuccess, [options.successMessage]);\n }\n return v;\n })\n .catch((e) => {\n const msg = messageFromError(e);\n appEvents.emit(AppEvents.alertError, [`${options.errorMessage ?? 'Error'}: ${msg}`]);\n throw e;\n });\n}\n\nexport function messageFromError(e: Error | FetchError | SerializedError): string {\n if (isFetchError(e)) {\n if (e.data?.message) {\n let msg = e.data?.message;\n if (typeof e.data?.error === 'string') {\n msg += `; ${e.data.error}`;\n }\n return msg;\n } else if (Array.isArray(e.data) && e.data.length && e.data[0]?.message) {\n return e.data\n .map((d) => d?.message)\n .filter((m) => !!m)\n .join(' ');\n } else if (e.statusText) {\n return e.statusText;\n }\n }\n return (e as Error)?.message || String(e);\n}\n\nexport function isAsyncRequestMapSliceFulfilled<T>(slice: AsyncRequestMapSlice<T>): boolean {\n return Object.values(slice).every(isAsyncRequestStateFulfilled);\n}\n\nexport function isAsyncRequestStateFulfilled<T>(state: AsyncRequestState<T>): boolean {\n return state.dispatched && !state.loading && !state.error;\n}\n\nexport function isAsyncRequestMapSlicePending<T>(slice: AsyncRequestMapSlice<T>): boolean {\n return Object.values(slice).some(isAsyncRequestStatePending);\n}\n\nexport function isAsyncRequestStatePending<T>(state: AsyncRequestState<T>): boolean {\n return state.dispatched && state.loading;\n}\n","import {\n DataQuery,\n DataSourceRef,\n getDefaultRelativeTimeRange,\n IntervalValues,\n rangeUtil,\n RelativeTimeRange,\n ScopedVars,\n TimeRange,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\nimport { getNextRefIdChar } from 'app/core/utils/query';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { ExpressionDatasourceUID } from 'app/features/expressions/ExpressionDatasource';\nimport { ExpressionQuery, ExpressionQueryType } from 'app/features/expressions/types';\nimport { RuleWithLocation } from 'app/types/unified-alerting';\nimport {\n AlertQuery,\n Annotations,\n GrafanaAlertStateDecision,\n Labels,\n PostableRuleGrafanaRuleDTO,\n RulerRuleDTO,\n} from 'app/types/unified-alerting-dto';\n\nimport { EvalFunction } from '../../state/alertDef';\nimport { RuleFormType, RuleFormValues } from '../types/rule-form';\n\nimport { getRulesAccess } from './access-control';\nimport { Annotation } from './constants';\nimport { getDefaultOrFirstCompatibleDataSource, isGrafanaRulesSource } from './datasource';\nimport { arrayToRecord, recordToArray } from './misc';\nimport { isAlertingRulerRule, isGrafanaRulerRule, isRecordingRulerRule } from './rules';\nimport { parseInterval } from './time';\n\nexport const getDefaultFormValues = (): RuleFormValues => {\n const { canCreateGrafanaRules, canCreateCloudRules } = getRulesAccess();\n\n return Object.freeze({\n name: '',\n labels: [{ key: '', value: '' }],\n annotations: [\n { key: Annotation.summary, value: '' },\n { key: Annotation.description, value: '' },\n { key: Annotation.runbookURL, value: '' },\n ],\n dataSourceName: null,\n type: canCreateGrafanaRules ? RuleFormType.grafana : canCreateCloudRules ? RuleFormType.cloudAlerting : undefined, // viewers can't create prom alerts\n group: '',\n\n // grafana\n folder: null,\n queries: [],\n condition: '',\n noDataState: GrafanaAlertStateDecision.NoData,\n execErrState: GrafanaAlertStateDecision.Alerting,\n evaluateEvery: '1m',\n evaluateFor: '5m',\n\n // cortex / loki\n namespace: '',\n expression: '',\n forTime: 1,\n forTimeUnit: 'm',\n });\n};\n\nexport function formValuesToRulerRuleDTO(values: RuleFormValues): RulerRuleDTO {\n const { name, expression, forTime, forTimeUnit, type } = values;\n if (type === RuleFormType.cloudAlerting) {\n return {\n alert: name,\n for: `${forTime}${forTimeUnit}`,\n annotations: arrayToRecord(values.annotations || []),\n labels: arrayToRecord(values.labels || []),\n expr: expression,\n };\n } else if (type === RuleFormType.cloudRecording) {\n return {\n record: name,\n labels: arrayToRecord(values.labels || []),\n expr: expression,\n };\n }\n throw new Error(`unexpected rule type: ${type}`);\n}\n\nfunction listifyLabelsOrAnnotations(item: Labels | Annotations | undefined): Array<{ key: string; value: string }> {\n return [...recordToArray(item || {}), { key: '', value: '' }];\n}\n\nexport function formValuesToRulerGrafanaRuleDTO(values: RuleFormValues): PostableRuleGrafanaRuleDTO {\n const { name, condition, noDataState, execErrState, evaluateFor, queries } = values;\n if (condition) {\n return {\n grafana_alert: {\n title: name,\n condition,\n no_data_state: noDataState,\n exec_err_state: execErrState,\n data: queries,\n },\n for: evaluateFor,\n annotations: arrayToRecord(values.annotations || []),\n labels: arrayToRecord(values.labels || []),\n };\n }\n throw new Error('Cannot create rule without specifying alert condition');\n}\n\nexport function rulerRuleToFormValues(ruleWithLocation: RuleWithLocation): RuleFormValues {\n const { ruleSourceName, namespace, group, rule } = ruleWithLocation;\n\n const defaultFormValues = getDefaultFormValues();\n if (isGrafanaRulesSource(ruleSourceName)) {\n if (isGrafanaRulerRule(rule)) {\n const ga = rule.grafana_alert;\n return {\n ...defaultFormValues,\n name: ga.title,\n type: RuleFormType.grafana,\n group: group.name,\n evaluateFor: rule.for || '0',\n evaluateEvery: group.interval || defaultFormValues.evaluateEvery,\n noDataState: ga.no_data_state,\n execErrState: ga.exec_err_state,\n queries: ga.data,\n condition: ga.condition,\n annotations: listifyLabelsOrAnnotations(rule.annotations),\n labels: listifyLabelsOrAnnotations(rule.labels),\n folder: { title: namespace, id: ga.namespace_id },\n };\n } else {\n throw new Error('Unexpected type of rule for grafana rules source');\n }\n } else {\n if (isAlertingRulerRule(rule)) {\n const [forTime, forTimeUnit] = rule.for\n ? parseInterval(rule.for)\n : [defaultFormValues.forTime, defaultFormValues.forTimeUnit];\n return {\n ...defaultFormValues,\n name: rule.alert,\n type: RuleFormType.cloudAlerting,\n dataSourceName: ruleSourceName,\n namespace,\n group: group.name,\n expression: rule.expr,\n forTime,\n forTimeUnit,\n annotations: listifyLabelsOrAnnotations(rule.annotations),\n labels: listifyLabelsOrAnnotations(rule.labels),\n };\n } else if (isRecordingRulerRule(rule)) {\n return {\n ...defaultFormValues,\n name: rule.record,\n type: RuleFormType.cloudRecording,\n dataSourceName: ruleSourceName,\n namespace,\n group: group.name,\n expression: rule.expr,\n labels: listifyLabelsOrAnnotations(rule.labels),\n };\n } else {\n throw new Error('Unexpected type of rule for cloud rules source');\n }\n }\n}\n\nexport const getDefaultQueries = (): AlertQuery[] => {\n const dataSource = getDefaultOrFirstCompatibleDataSource();\n\n if (!dataSource) {\n return [getDefaultExpression('A')];\n }\n const relativeTimeRange = getDefaultRelativeTimeRange();\n\n return [\n {\n refId: 'A',\n datasourceUid: dataSource.uid,\n queryType: '',\n relativeTimeRange,\n model: {\n refId: 'A',\n hide: false,\n },\n },\n getDefaultExpression('B'),\n ];\n};\n\nconst getDefaultExpression = (refId: string): AlertQuery => {\n const model: ExpressionQuery = {\n refId,\n hide: false,\n type: ExpressionQueryType.classic,\n datasource: {\n uid: ExpressionDatasourceUID,\n type: ExpressionDatasourceRef.type,\n },\n conditions: [\n {\n type: 'query',\n evaluator: {\n params: [3],\n type: EvalFunction.IsAbove,\n },\n operator: {\n type: 'and',\n },\n query: {\n params: ['A'],\n },\n reducer: {\n params: [],\n type: 'last',\n },\n },\n ],\n expression: 'A',\n };\n\n return {\n refId,\n datasourceUid: ExpressionDatasourceUID,\n queryType: '',\n model,\n };\n};\n\nconst dataQueriesToGrafanaQueries = async (\n queries: DataQuery[],\n relativeTimeRange: RelativeTimeRange,\n scopedVars: ScopedVars | {},\n panelDataSourceRef?: DataSourceRef,\n maxDataPoints?: number,\n minInterval?: string\n): Promise<AlertQuery[]> => {\n const result: AlertQuery[] = [];\n\n for (const target of queries) {\n const datasource = await getDataSourceSrv().get(target.datasource?.uid ? target.datasource : panelDataSourceRef);\n const dsRef = { uid: datasource.uid, type: datasource.type };\n\n const range = rangeUtil.relativeToTimeRange(relativeTimeRange);\n const { interval, intervalMs } = getIntervals(range, minInterval ?? datasource.interval, maxDataPoints);\n const queryVariables = {\n __interval: { text: interval, value: interval },\n __interval_ms: { text: intervalMs, value: intervalMs },\n ...scopedVars,\n };\n\n const interpolatedTarget = datasource.interpolateVariablesInQueries\n ? await datasource.interpolateVariablesInQueries([target], queryVariables)[0]\n : target;\n\n // expressions\n if (dsRef.uid === ExpressionDatasourceUID) {\n const newQuery: AlertQuery = {\n refId: interpolatedTarget.refId,\n queryType: '',\n relativeTimeRange,\n datasourceUid: ExpressionDatasourceUID,\n model: interpolatedTarget,\n };\n result.push(newQuery);\n // queries\n } else {\n const datasourceSettings = getDataSourceSrv().getInstanceSettings(dsRef);\n if (datasourceSettings && datasourceSettings.meta.alerting) {\n const newQuery: AlertQuery = {\n refId: interpolatedTarget.refId,\n queryType: interpolatedTarget.queryType ?? '',\n relativeTimeRange,\n datasourceUid: datasourceSettings.uid,\n model: {\n ...interpolatedTarget,\n maxDataPoints,\n intervalMs,\n },\n };\n result.push(newQuery);\n }\n }\n }\n return result;\n};\n\nexport const panelToRuleFormValues = async (\n panel: PanelModel,\n dashboard: DashboardModel\n): Promise<Partial<RuleFormValues> | undefined> => {\n const { targets } = panel;\n if (!panel.id || !dashboard.uid) {\n return undefined;\n }\n\n const relativeTimeRange = rangeUtil.timeRangeToRelative(rangeUtil.convertRawToRange(dashboard.time));\n const queries = await dataQueriesToGrafanaQueries(\n targets,\n relativeTimeRange,\n panel.scopedVars || {},\n panel.datasource ?? undefined,\n panel.maxDataPoints ?? undefined,\n panel.interval ?? undefined\n );\n // if no alerting capable queries are found, can't create a rule\n if (!queries.length || !queries.find((query) => query.datasourceUid !== ExpressionDatasourceUID)) {\n return undefined;\n }\n\n if (!queries.find((query) => query.datasourceUid === ExpressionDatasourceUID)) {\n queries.push(getDefaultExpression(getNextRefIdChar(queries.map((query) => query.model))));\n }\n\n const { folderId, folderTitle } = dashboard.meta;\n\n const formValues = {\n type: RuleFormType.grafana,\n folder:\n folderId && folderTitle\n ? {\n id: folderId,\n title: folderTitle,\n }\n : undefined,\n queries,\n name: panel.title,\n condition: queries[queries.length - 1].refId,\n annotations: [\n {\n key: Annotation.dashboardUID,\n value: dashboard.uid,\n },\n {\n key: Annotation.panelID,\n value: String(panel.id),\n },\n ],\n };\n return formValues;\n};\n\nexport function getIntervals(range: TimeRange, lowLimit?: string, resolution?: number): IntervalValues {\n if (!resolution) {\n if (lowLimit && rangeUtil.intervalToMs(lowLimit) > 1000) {\n return {\n interval: lowLimit,\n intervalMs: rangeUtil.intervalToMs(lowLimit),\n };\n }\n return { interval: '1s', intervalMs: 1000 };\n }\n\n return rangeUtil.calculateInterval(range, resolution, lowLimit);\n}\n","import { CombinedRule, Rule, RuleIdentifier, RuleWithLocation } from 'app/types/unified-alerting';\nimport { Annotations, Labels, RulerRuleDTO } from 'app/types/unified-alerting-dto';\n\nimport { GRAFANA_RULES_SOURCE_NAME } from './datasource';\nimport {\n isAlertingRule,\n isAlertingRulerRule,\n isCloudRuleIdentifier,\n isGrafanaRuleIdentifier,\n isGrafanaRulerRule,\n isPrometheusRuleIdentifier,\n isRecordingRule,\n isRecordingRulerRule,\n} from './rules';\n\nexport function fromRulerRule(\n ruleSourceName: string,\n namespace: string,\n groupName: string,\n rule: RulerRuleDTO\n): RuleIdentifier {\n if (isGrafanaRulerRule(rule)) {\n return { uid: rule.grafana_alert.uid!, ruleSourceName: 'grafana' };\n }\n return {\n ruleSourceName,\n namespace,\n groupName,\n rulerRuleHash: hashRulerRule(rule),\n };\n}\n\nexport function fromRule(ruleSourceName: string, namespace: string, groupName: string, rule: Rule): RuleIdentifier {\n return {\n ruleSourceName,\n namespace,\n groupName,\n ruleHash: hashRule(rule),\n };\n}\n\nexport function fromCombinedRule(ruleSourceName: string, rule: CombinedRule): RuleIdentifier {\n const namespaceName = rule.namespace.name;\n const groupName = rule.group.name;\n\n if (rule.rulerRule) {\n return fromRulerRule(ruleSourceName, namespaceName, groupName, rule.rulerRule);\n }\n\n if (rule.promRule) {\n return fromRule(ruleSourceName, namespaceName, groupName, rule.promRule);\n }\n\n throw new Error('Could not create an id for a rule that is missing both `rulerRule` and `promRule`.');\n}\n\nexport function fromRuleWithLocation(rule: RuleWithLocation): RuleIdentifier {\n return fromRulerRule(rule.ruleSourceName, rule.namespace, rule.group.name, rule.rule);\n}\n\nexport function equal(a: RuleIdentifier, b: RuleIdentifier) {\n if (isGrafanaRuleIdentifier(a) && isGrafanaRuleIdentifier(b)) {\n return a.uid === b.uid;\n }\n\n if (isCloudRuleIdentifier(a) && isCloudRuleIdentifier(b)) {\n return (\n a.groupName === b.groupName &&\n a.namespace === b.namespace &&\n a.rulerRuleHash === b.rulerRuleHash &&\n a.ruleSourceName === b.ruleSourceName\n );\n }\n\n if (isPrometheusRuleIdentifier(a) && isPrometheusRuleIdentifier(b)) {\n return (\n a.groupName === b.groupName &&\n a.namespace === b.namespace &&\n a.ruleHash === b.ruleHash &&\n a.ruleSourceName === b.ruleSourceName\n );\n }\n\n return false;\n}\n\nconst cloudRuleIdentifierPrefix = 'cri';\nconst prometheusRuleIdentifierPrefix = 'pri';\n\nfunction escapeDollars(value: string): string {\n return value.replace(/\\$/g, '_DOLLAR_');\n}\n\nfunction unesacapeDollars(value: string): string {\n return value.replace(/\\_DOLLAR\\_/g, '$');\n}\n\nexport function parse(value: string, decodeFromUri = false): RuleIdentifier {\n const source = decodeFromUri ? decodeURIComponent(value) : value;\n const parts = source.split('$');\n\n if (parts.length === 1) {\n return { uid: value, ruleSourceName: 'grafana' };\n }\n\n if (parts.length === 5) {\n const [prefix, ruleSourceName, namespace, groupName, hash] = parts.map(unesacapeDollars);\n\n if (prefix === cloudRuleIdentifierPrefix) {\n return { ruleSourceName, namespace, groupName, rulerRuleHash: Number(hash) };\n }\n\n if (prefix === prometheusRuleIdentifierPrefix) {\n return { ruleSourceName, namespace, groupName, ruleHash: Number(hash) };\n }\n }\n\n throw new Error(`Failed to parse rule location: ${value}`);\n}\n\nexport function tryParse(value: string | undefined, decodeFromUri = false): RuleIdentifier | undefined {\n if (!value) {\n return;\n }\n\n try {\n return parse(value, decodeFromUri);\n } catch (error) {\n return;\n }\n}\n\nexport function stringifyIdentifier(identifier: RuleIdentifier): string {\n if (isGrafanaRuleIdentifier(identifier)) {\n return identifier.uid;\n }\n\n if (isCloudRuleIdentifier(identifier)) {\n return [\n cloudRuleIdentifierPrefix,\n identifier.ruleSourceName,\n identifier.namespace,\n identifier.groupName,\n identifier.rulerRuleHash,\n ]\n .map(String)\n .map(escapeDollars)\n .join('$');\n }\n\n return [\n prometheusRuleIdentifierPrefix,\n identifier.ruleSourceName,\n identifier.namespace,\n identifier.groupName,\n identifier.ruleHash,\n ]\n .map(String)\n .map(escapeDollars)\n .join('$');\n}\n\nfunction hash(value: string): number {\n let hash = 0;\n if (value.length === 0) {\n return hash;\n }\n for (var i = 0; i < value.length; i++) {\n var char = value.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// this is used to identify lotex rules, as they do not have a unique identifier\nfunction hashRulerRule(rule: RulerRuleDTO): number {\n if (isRecordingRulerRule(rule)) {\n return hash(JSON.stringify([rule.record, rule.expr, hashLabelsOrAnnotations(rule.labels)]));\n } else if (isAlertingRulerRule(rule)) {\n return hash(\n JSON.stringify([\n rule.alert,\n rule.expr,\n hashLabelsOrAnnotations(rule.annotations),\n hashLabelsOrAnnotations(rule.labels),\n ])\n );\n } else {\n throw new Error('only recording and alerting ruler rules can be hashed');\n }\n}\n\nfunction hashRule(rule: Rule): number {\n if (isRecordingRule(rule)) {\n return hash(JSON.stringify([rule.type, rule.query, hashLabelsOrAnnotations(rule.labels)]));\n }\n\n if (isAlertingRule(rule)) {\n return hash(\n JSON.stringify([\n rule.type,\n rule.query,\n hashLabelsOrAnnotations(rule.annotations),\n hashLabelsOrAnnotations(rule.labels),\n ])\n );\n }\n\n throw new Error('only recording and alerting rules can be hashed');\n}\n\nfunction hashLabelsOrAnnotations(item: Labels | Annotations | undefined): string {\n return JSON.stringify(Object.entries(item || {}).sort((a, b) => a[0].localeCompare(b[0])));\n}\n\nexport function ruleIdentifierToRuleSourceName(identifier: RuleIdentifier): string {\n return isGrafanaRuleIdentifier(identifier) ? GRAFANA_RULES_SOURCE_NAME : identifier.ruleSourceName;\n}\n","import { capitalize } from 'lodash';\n\nimport { AlertState } from '@grafana/data';\nimport {\n Alert,\n AlertingRule,\n CloudRuleIdentifier,\n CombinedRuleGroup,\n GrafanaRuleIdentifier,\n PrometheusRuleIdentifier,\n PromRuleWithLocation,\n RecordingRule,\n Rule,\n RuleIdentifier,\n RuleNamespace,\n} from 'app/types/unified-alerting';\nimport {\n GrafanaAlertState,\n GrafanaAlertStateWithReason,\n mapStateWithReasonToBaseState,\n PromAlertingRuleState,\n PromRuleType,\n RulerAlertingRuleDTO,\n RulerGrafanaRuleDTO,\n RulerRecordingRuleDTO,\n RulerRuleDTO,\n} from 'app/types/unified-alerting-dto';\n\nimport { State } from '../components/StateTag';\n\nimport { RULER_NOT_SUPPORTED_MSG } from './constants';\nimport { AsyncRequestState } from './redux';\n\nexport function isAlertingRule(rule: Rule | undefined): rule is AlertingRule {\n return typeof rule === 'object' && rule.type === PromRuleType.Alerting;\n}\n\nexport function isRecordingRule(rule: Rule): rule is RecordingRule {\n return rule.type === PromRuleType.Recording;\n}\n\nexport function isAlertingRulerRule(rule?: RulerRuleDTO): rule is RulerAlertingRuleDTO {\n return typeof rule === 'object' && 'alert' in rule;\n}\n\nexport function isRecordingRulerRule(rule?: RulerRuleDTO): rule is RulerRecordingRuleDTO {\n return typeof rule === 'object' && 'record' in rule;\n}\n\nexport function isGrafanaRulerRule(rule?: RulerRuleDTO): rule is RulerGrafanaRuleDTO {\n return typeof rule === 'object' && 'grafana_alert' in rule;\n}\n\nexport function alertInstanceKey(alert: Alert): string {\n return JSON.stringify(alert.labels);\n}\n\nexport function isRulerNotSupportedResponse(resp: AsyncRequestState<any>) {\n return resp.error && resp.error?.message?.includes(RULER_NOT_SUPPORTED_MSG);\n}\n\nexport function isGrafanaRuleIdentifier(identifier: RuleIdentifier): identifier is GrafanaRuleIdentifier {\n return 'uid' in identifier;\n}\n\nexport function isCloudRuleIdentifier(identifier: RuleIdentifier): identifier is CloudRuleIdentifier {\n return 'rulerRuleHash' in identifier;\n}\n\nexport function isPrometheusRuleIdentifier(identifier: RuleIdentifier): identifier is PrometheusRuleIdentifier {\n return 'ruleHash' in identifier;\n}\n\nexport function alertStateToReadable(state: PromAlertingRuleState | GrafanaAlertStateWithReason | AlertState): string {\n if (state === PromAlertingRuleState.Inactive) {\n return 'Normal';\n }\n return capitalize(state);\n}\n\nexport const flattenRules = (rules: RuleNamespace[]) => {\n return rules.reduce<PromRuleWithLocation[]>((acc, { dataSourceName, name: namespaceName, groups }) => {\n groups.forEach(({ name: groupName, rules }) => {\n rules.forEach((rule) => {\n if (isAlertingRule(rule)) {\n acc.push({ dataSourceName, namespaceName, groupName, rule });\n }\n });\n });\n return acc;\n }, []);\n};\n\nexport function alertStateToState(state: PromAlertingRuleState | GrafanaAlertStateWithReason | AlertState): State {\n let key: PromAlertingRuleState | GrafanaAlertState | AlertState;\n if (Object.values(AlertState).includes(state as AlertState)) {\n key = state as AlertState;\n } else {\n key = mapStateWithReasonToBaseState(state as GrafanaAlertStateWithReason | PromAlertingRuleState);\n }\n\n return alertStateToStateMap[key];\n}\n\nconst alertStateToStateMap: Record<PromAlertingRuleState | GrafanaAlertState | AlertState, State> = {\n [PromAlertingRuleState.Inactive]: 'good',\n [PromAlertingRuleState.Firing]: 'bad',\n [PromAlertingRuleState.Pending]: 'warning',\n [GrafanaAlertState.Alerting]: 'bad',\n [GrafanaAlertState.Error]: 'bad',\n [GrafanaAlertState.NoData]: 'info',\n [GrafanaAlertState.Normal]: 'good',\n [GrafanaAlertState.Pending]: 'warning',\n [AlertState.NoData]: 'info',\n [AlertState.Paused]: 'warning',\n [AlertState.Alerting]: 'bad',\n [AlertState.OK]: 'good',\n [AlertState.Pending]: 'warning',\n [AlertState.Unknown]: 'info',\n};\n\nexport function getFirstActiveAt(promRule: AlertingRule) {\n if (!promRule.alerts) {\n return null;\n }\n return promRule.alerts.reduce((prev, alert) => {\n const isNotNormal =\n mapStateWithReasonToBaseState(alert.state as GrafanaAlertStateWithReason) !== GrafanaAlertState.Normal;\n if (alert.activeAt && isNotNormal) {\n const activeAt = new Date(alert.activeAt);\n if (prev === null || prev.getTime() > activeAt.getTime()) {\n return activeAt;\n }\n }\n return prev;\n }, null as Date | null);\n}\n\n/**\n * A rule group is \"federated\" when it has at least one \"source_tenants\" entry, federated rule groups will evaluate rules in multiple tenants\n * Non-federated rules do not have this property\n *\n * see https://grafana.com/docs/metrics-enterprise/latest/tenant-management/tenant-federation/#cross-tenant-alerting-and-recording-rule-federation\n */\nexport function isFederatedRuleGroup(group: CombinedRuleGroup) {\n return Array.isArray(group.source_tenants);\n}\n","export enum TimeOptions {\n seconds = 's',\n minutes = 'm',\n hours = 'h',\n days = 'd',\n weeks = 'w',\n}\n","import { durationToMilliseconds, parseDuration } from '@grafana/data';\nimport { describeInterval } from '@grafana/data/src/datetime/rangeutil';\n\nimport { TimeOptions } from '../types/time';\n\nexport function parseInterval(value: string): [number, string] {\n const match = value.match(/(\\d+)(\\w+)/);\n if (match) {\n return [Number(match[1]), match[2]];\n }\n throw new Error(`Invalid interval description: ${value}`);\n}\n\nexport function intervalToSeconds(interval: string): number {\n const { sec, count } = describeInterval(interval);\n return sec * count;\n}\n\nexport const timeOptions = Object.entries(TimeOptions).map(([key, value]) => ({\n label: key[0].toUpperCase() + key.slice(1),\n value: value,\n}));\n\n// 1h, 10m and such\nexport const positiveDurationValidationPattern = {\n value: new RegExp(`^\\\\d+(${Object.values(TimeOptions).join('|')})$`),\n message: `Must be of format \"(number)(unit)\" , for example \"1m\". Available units: ${Object.values(TimeOptions).join(\n ', '\n )}`,\n};\n\n// 1h, 10m or 0 (without units)\nexport const durationValidationPattern = {\n value: new RegExp(`^\\\\d+(${Object.values(TimeOptions).join('|')})|0$`),\n message: `Must be of format \"(number)(unit)\", for example \"1m\", or just \"0\". Available units: ${Object.values(\n TimeOptions\n ).join(', ')}`,\n};\n\nexport function parseDurationToMilliseconds(duration: string) {\n return durationToMilliseconds(parseDuration(duration));\n}\n","import { AnnotationEvent } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\n\nimport { AnnotationTagsResponse } from './types';\n\nexport function saveAnnotation(annotation: AnnotationEvent) {\n return getBackendSrv().post('/api/annotations', annotation);\n}\n\nexport function updateAnnotation(annotation: AnnotationEvent) {\n return getBackendSrv().put(`/api/annotations/${annotation.id}`, annotation);\n}\n\nexport function deleteAnnotation(annotation: AnnotationEvent) {\n return getBackendSrv().delete(`/api/annotations/${annotation.id}`);\n}\n\nexport async function getAnnotationTags() {\n const response: AnnotationTagsResponse = await getBackendSrv().get('/api/annotations/tags');\n return response.result.tags.map(({ tag, count }) => ({\n term: tag,\n count,\n }));\n}\n","import { Observable, of } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport { CoreApp, DataQueryRequest, DataSourceApi, rangeUtil, ScopedVars } from '@grafana/data';\n\nimport { runRequest } from '../query/state/runRequest';\n\nimport { standardAnnotationSupport } from './standardAnnotationSupport';\nimport { AnnotationQueryOptions, AnnotationQueryResponse } from './types';\n\nlet counter = 100;\nfunction getNextRequestId() {\n return 'AQ' + counter++;\n}\n\nexport function executeAnnotationQuery(\n options: AnnotationQueryOptions,\n datasource: DataSourceApi,\n savedJsonAnno: any\n): Observable<AnnotationQueryResponse> {\n const processor = {\n ...standardAnnotationSupport,\n ...datasource.annotations,\n };\n\n const annotation = processor.prepareAnnotation!(savedJsonAnno);\n if (!annotation) {\n return of({});\n }\n\n const query = processor.prepareQuery!(annotation);\n if (!query) {\n return of({});\n }\n\n // No more points than pixels\n const maxDataPoints = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\n\n // Add interval to annotation queries\n const interval = rangeUtil.calculateInterval(options.range, maxDataPoints, datasource.interval);\n\n const scopedVars: ScopedVars = {\n __interval: { text: interval.interval, value: interval.interval },\n __interval_ms: { text: interval.intervalMs.toString(), value: interval.intervalMs },\n __annotation: { text: annotation.name, value: annotation },\n };\n\n const queryRequest: DataQueryRequest = {\n startTime: Date.now(),\n requestId: getNextRequestId(),\n range: options.range,\n maxDataPoints,\n scopedVars,\n ...interval,\n app: CoreApp.Dashboard,\n\n timezone: options.dashboard.timezone,\n\n targets: [\n {\n ...query,\n refId: 'Anno',\n },\n ],\n };\n\n return runRequest(datasource, queryRequest).pipe(\n mergeMap((panelData) => {\n if (!panelData.series) {\n return of({ panelData, events: [] });\n }\n\n return processor.processEvents!(annotation, panelData.series).pipe(map((events) => ({ panelData, events })));\n })\n );\n}\n","import { isString } from 'lodash';\nimport { Observable, of, OperatorFunction } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport {\n AnnotationEvent,\n AnnotationEventFieldSource,\n AnnotationEventMappings,\n AnnotationQuery,\n AnnotationSupport,\n DataFrame,\n DataSourceApi,\n Field,\n FieldType,\n getFieldDisplayName,\n KeyValue,\n standardTransformers,\n} from '@grafana/data';\n\nexport const standardAnnotationSupport: AnnotationSupport = {\n /**\n * Assume the stored value is standard model.\n */\n prepareAnnotation: (json: any) => {\n if (isString(json?.query)) {\n const { query, ...rest } = json;\n return {\n ...rest,\n target: {\n refId: 'annotation_query',\n query,\n },\n mappings: {},\n };\n }\n return json as AnnotationQuery;\n },\n\n /**\n * Default will just return target from the annotation.\n */\n prepareQuery: (anno: AnnotationQuery) => anno.target,\n\n /**\n * Provides default processing from dataFrame to annotation events.\n */\n processEvents: (anno: AnnotationQuery, data: DataFrame[]) => {\n return getAnnotationsFromData(data, anno.mappings);\n },\n};\n\n/**\n * Flatten all frames into a single frame with mergeTransformer.\n */\n\nexport function singleFrameFromPanelData(): OperatorFunction<DataFrame[], DataFrame | undefined> {\n return (source) =>\n source.pipe(\n mergeMap((data) => {\n if (!data?.length) {\n return of(undefined);\n }\n\n if (data.length === 1) {\n return of(data[0]);\n }\n\n return of(data).pipe(\n standardTransformers.mergeTransformer.operator({}),\n map((d) => d[0])\n );\n })\n );\n}\n\ninterface AnnotationEventFieldSetter {\n key: keyof AnnotationEvent;\n field?: Field;\n text?: string;\n regex?: RegExp;\n split?: string; // for tags\n}\n\nexport interface AnnotationFieldInfo {\n key: keyof AnnotationEvent;\n\n split?: string;\n field?: (frame: DataFrame) => Field | undefined;\n placeholder?: string;\n help?: string;\n}\n\n// These fields get added to the standard UI\nexport const annotationEventNames: AnnotationFieldInfo[] = [\n {\n key: 'time',\n field: (frame: DataFrame) => frame.fields.find((f) => f.type === FieldType.time),\n placeholder: 'time, or the first time field',\n },\n { key: 'timeEnd', help: 'When this field is defined, the annotation will be treated as a range' },\n {\n key: 'title',\n },\n {\n key: 'text',\n field: (frame: DataFrame) => frame.fields.find((f) => f.type === FieldType.string),\n placeholder: 'text, or the first text field',\n },\n { key: 'tags', split: ',', help: 'The results will be split on comma (,)' },\n {\n key: 'id',\n },\n];\n\n// Given legacy infrastructure, alert events are passed though the same annotation\n// pipeline, but include fields that should not be exposed generally\nconst alertEventAndAnnotationFields: AnnotationFieldInfo[] = [\n ...annotationEventNames,\n { key: 'userId' },\n { key: 'login' },\n { key: 'email' },\n { key: 'prevState' },\n { key: 'newState' },\n { key: 'data' as any },\n { key: 'panelId' },\n { key: 'alertId' },\n { key: 'dashboardId' },\n { key: 'dashboardUID' },\n];\n\nexport function getAnnotationsFromData(\n data: DataFrame[],\n options?: AnnotationEventMappings\n): Observable<AnnotationEvent[]> {\n return of(data).pipe(\n singleFrameFromPanelData(),\n map((frame) => {\n if (!frame?.length) {\n return [];\n }\n\n let hasTime = false;\n let hasText = false;\n const byName: KeyValue<Field> = {};\n\n for (const f of frame.fields) {\n const name = getFieldDisplayName(f, frame);\n byName[name.toLowerCase()] = f;\n }\n\n if (!options) {\n options = {};\n }\n\n const fields: AnnotationEventFieldSetter[] = [];\n\n for (const evts of alertEventAndAnnotationFields) {\n const opt = options[evts.key] || {}; //AnnotationEventFieldMapping\n\n if (opt.source === AnnotationEventFieldSource.Skip) {\n continue;\n }\n\n const setter: AnnotationEventFieldSetter = { key: evts.key, split: evts.split };\n\n if (opt.source === AnnotationEventFieldSource.Text) {\n setter.text = opt.value;\n } else {\n const lower = (opt.value || evts.key).toLowerCase();\n setter.field = byName[lower];\n\n if (!setter.field && evts.field) {\n setter.field = evts.field(frame);\n }\n }\n\n if (setter.field || setter.text) {\n fields.push(setter);\n if (setter.key === 'time') {\n hasTime = true;\n } else if (setter.key === 'text') {\n hasText = true;\n }\n }\n }\n\n if (!hasTime || !hasText) {\n return []; // throw an error?\n }\n\n // Add each value to the string\n const events: AnnotationEvent[] = [];\n\n for (let i = 0; i < frame.length; i++) {\n const anno: AnnotationEvent = {\n type: 'default',\n color: 'red',\n };\n\n for (const f of fields) {\n let v: any = undefined;\n\n if (f.text) {\n v = f.text; // TODO support templates!\n } else if (f.field) {\n v = f.field.values.get(i);\n if (v !== undefined && f.regex) {\n const match = f.regex.exec(v);\n if (match) {\n v = match[1] ? match[1] : match[0];\n }\n }\n }\n\n if (v !== null && v !== undefined) {\n if (f.split && typeof v === 'string') {\n v = v.split(',');\n }\n (anno as any)[f.key] = v;\n }\n }\n\n events.push(anno);\n }\n\n return events;\n })\n );\n}\n\n// These opt outs are here only for quicker and easier migration to react based annotations editors and because\n// annotation support API needs some work to support less \"standard\" editors like prometheus and here it is not\n// polluting public API.\n\nconst legacyRunner = [\n 'prometheus',\n 'loki',\n 'elasticsearch',\n 'grafana-opensearch-datasource', // external\n 'grafana-splunk-datasource', // external\n];\n\n/**\n * Opt out of using the default mapping functionality on frontend.\n */\nexport function shouldUseMappingUI(datasource: DataSourceApi): boolean {\n const { type } = datasource;\n return !(\n type === 'datasource' || // ODD behavior for \"-- Grafana --\" datasource\n legacyRunner.includes(type)\n );\n}\n\n/**\n * Use legacy runner. Used only as an escape hatch for easier transition to React based annotation editor.\n */\nexport function shouldUseLegacyRunner(datasource: DataSourceApi): boolean {\n const { type } = datasource;\n return legacyRunner.includes(type);\n}\n","import { createSlice } from '@reduxjs/toolkit';\n\nimport { ApiKeysState } from 'app/types';\n\nexport const initialApiKeysState: ApiKeysState = {\n hasFetched: false,\n includeExpired: false,\n keys: [],\n keysIncludingExpired: [],\n searchQuery: '',\n apiKeysMigrated: false,\n};\n\nconst apiKeysSlice = createSlice({\n name: 'apiKeys',\n initialState: initialApiKeysState,\n reducers: {\n apiKeysLoaded: (state, action): ApiKeysState => {\n const { keys, keysIncludingExpired } = action.payload;\n const includeExpired =\n action.payload.keys.length === 0 && action.payload.keysIncludingExpired.length > 0\n ? true\n : state.includeExpired;\n return { ...state, hasFetched: true, keys, keysIncludingExpired, includeExpired };\n },\n apiKeysMigrationStatusLoaded: (state, action): ApiKeysState => {\n return { ...state, apiKeysMigrated: action.payload };\n },\n setSearchQuery: (state, action): ApiKeysState => {\n return { ...state, searchQuery: action.payload };\n },\n includeExpiredToggled: (state): ApiKeysState => {\n return { ...state, includeExpired: !state.includeExpired };\n },\n isFetching: (state): ApiKeysState => {\n return { ...state, hasFetched: false };\n },\n },\n});\n\nexport const { apiKeysLoaded, includeExpiredToggled, isFetching, setSearchQuery, apiKeysMigrationStatusLoaded } =\n apiKeysSlice.actions;\n\nexport const apiKeysReducer = apiKeysSlice.reducer;\n\nexport default {\n apiKeys: apiKeysReducer,\n};\n","import { css } from '@emotion/css';\nimport DangerouslySetHtmlContent from 'dangerously-set-html-content';\nimport React from 'react';\n\nimport { GrafanaTheme2, renderMarkdown } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { Message } from './types';\n\ntype Props = {\n message: Message;\n};\n\nexport const Comment = ({ message }: Props) => {\n const styles = useStyles2(getStyles);\n\n let senderColor = '#34BA18';\n let senderName = 'System';\n let avatarUrl = '/public/img/grafana_icon.svg';\n if (message.userId > 0) {\n senderColor = '#19a2e7';\n senderName = message.user.login;\n avatarUrl = message.user.avatarUrl;\n }\n const timeColor = '#898989';\n const timeFormatted = new Date(message.created * 1000).toLocaleTimeString();\n const markdownContent = renderMarkdown(message.content, { breaks: true });\n\n return (\n <div className={styles.comment}>\n <div className={styles.avatarContainer}>\n <img src={avatarUrl} alt=\"User avatar\" className={styles.avatar} />\n </div>\n <div>\n <div>\n <span style={{ color: senderColor }}>{senderName}</span>\n \n <span style={{ color: timeColor }}>{timeFormatted}</span>\n </div>\n <div>\n <DangerouslySetHtmlContent html={markdownContent} className={styles.content} />\n </div>\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n comment: css`\n margin-bottom: 10px;\n padding-top: 3px;\n padding-bottom: 3px;\n word-break: break-word;\n display: flex;\n flex-direction: row;\n align-items: top;\n\n :hover {\n background-color: #1e1f24;\n }\n\n blockquote {\n padding: 0 0 0 10px;\n margin: 0 0 10px;\n }\n `,\n avatarContainer: css`\n align-self: left;\n margin-top: 6px;\n margin-right: 10px;\n `,\n avatar: css`\n width: 30px;\n height: 30px;\n `,\n content: css`\n display: block;\n overflow: hidden;\n\n p {\n margin: 0;\n padding: 0;\n }\n\n blockquote p {\n font-size: 14px;\n padding-top: 4px;\n }\n\n a {\n color: #43c57e;\n }\n\n a:hover {\n text-decoration: underline;\n }\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FormEvent, useLayoutEffect, useRef, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { CustomScrollbar, TextArea, useStyles2 } from '@grafana/ui';\n\nimport { Comment } from './Comment';\nimport { Message } from './types';\n\ntype Props = {\n comments: Message[];\n packetCounter: number;\n addComment: (comment: string) => Promise<boolean>;\n};\n\nexport const CommentView = ({ comments, packetCounter, addComment }: Props) => {\n const styles = useStyles2(getStyles);\n\n const [comment, setComment] = useState('');\n const [scrollTop, setScrollTop] = useState(0);\n const commentViewContainer = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (commentViewContainer.current) {\n setScrollTop(commentViewContainer.current.offsetHeight);\n } else {\n setScrollTop(0);\n }\n }, [packetCounter]);\n\n const onUpdateComment = (event: FormEvent<HTMLTextAreaElement>) => {\n const element = event.target as HTMLInputElement;\n setComment(element.value);\n };\n\n const onKeyPress = async (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (event?.key === 'Enter' && !event?.shiftKey) {\n event.preventDefault();\n\n if (comment.length > 0) {\n const result = await addComment(comment);\n if (result) {\n setComment('');\n }\n }\n }\n };\n\n return (\n <CustomScrollbar scrollTop={scrollTop}>\n <div ref={commentViewContainer} className={styles.commentViewContainer}>\n {comments.map((msg) => (\n <Comment key={msg.id} message={msg} />\n ))}\n <TextArea\n placeholder=\"Write a comment\"\n value={comment}\n onChange={onUpdateComment}\n onKeyPress={onKeyPress}\n autoFocus={true}\n />\n </div>\n </CustomScrollbar>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n commentViewContainer: css`\n margin: 5px;\n `,\n});\n","import React, { PureComponent } from 'react';\nimport { Unsubscribable } from 'rxjs';\n\nimport { isLiveChannelMessageEvent, LiveChannelScope } from '@grafana/data';\nimport { getBackendSrv, getGrafanaLiveSrv } from '@grafana/runtime';\n\nimport { CommentView } from './CommentView';\nimport { Message, MessagePacket } from './types';\n\nexport interface Props {\n objectType: string;\n objectId: string;\n}\n\nexport interface State {\n messages: Message[];\n value: string;\n}\n\nexport class CommentManager extends PureComponent<Props, State> {\n subscription?: Unsubscribable;\n packetCounter = 0;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n messages: [],\n value: '',\n };\n }\n\n async componentDidMount() {\n const resp = await getBackendSrv().post('/api/comments/get', {\n objectType: this.props.objectType,\n objectId: this.props.objectId,\n });\n this.packetCounter++;\n this.setState({\n messages: resp.comments,\n });\n this.updateSubscription();\n }\n\n getLiveChannel = () => {\n const live = getGrafanaLiveSrv();\n if (!live) {\n console.error('Grafana live not running, enable \"live\" feature toggle');\n return undefined;\n }\n\n const address = this.getLiveAddress();\n if (!address) {\n return undefined;\n }\n\n return live.getStream<MessagePacket>(address);\n };\n\n getLiveAddress = () => {\n return {\n scope: LiveChannelScope.Grafana,\n namespace: 'comment',\n path: `${this.props.objectType}/${this.props.objectId}`,\n };\n };\n\n updateSubscription = () => {\n if (this.subscription) {\n this.subscription.unsubscribe();\n this.subscription = undefined;\n }\n\n const channel = this.getLiveChannel();\n if (channel) {\n this.subscription = channel.subscribe({\n next: (msg) => {\n if (isLiveChannelMessageEvent(msg)) {\n const { commentCreated } = msg.message;\n if (commentCreated) {\n this.setState((prevState) => ({\n messages: [...prevState.messages, commentCreated],\n }));\n this.packetCounter++;\n }\n }\n },\n });\n }\n };\n\n addComment = async (comment: string): Promise<boolean> => {\n const response = await getBackendSrv().post('/api/comments/create', {\n objectType: this.props.objectType,\n objectId: this.props.objectId,\n content: comment,\n });\n\n // TODO: set up error handling\n console.log(response);\n\n return true;\n };\n\n render() {\n return (\n <CommentView comments={this.state.messages} packetCounter={this.packetCounter} addComment={this.addComment} />\n );\n }\n}\n","import { defaults, each, sortBy } from 'lodash';\n\nimport { DataSourceRef, PanelPluginMeta } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport config from 'app/core/config';\nimport { PanelModel } from 'app/features/dashboard/state';\n\nimport { isPanelModelLibraryPanel } from '../../../library-panels/guard';\nimport { LibraryElementKind } from '../../../library-panels/types';\nimport { isConstant, isQuery } from '../../../variables/guard';\nimport { VariableOption, VariableRefresh } from '../../../variables/types';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { GridPos } from '../../state/PanelModel';\n\ninterface Input {\n name: string;\n type: string;\n label: string;\n value: any;\n description: string;\n}\n\ninterface Requires {\n [key: string]: {\n type: string;\n id: string;\n name: string;\n version: string;\n };\n}\n\ninterface ExternalDashboard {\n __inputs: Input[];\n __elements: Record<string, LibraryElementExport>;\n __requires: Array<Requires[string]>;\n panels: Array<PanelModel | PanelWithExportableLibraryPanel>;\n}\n\ninterface PanelWithExportableLibraryPanel {\n gridPos: GridPos;\n id: number;\n libraryPanel: {\n name: string;\n uid: string;\n };\n}\n\nfunction isExportableLibraryPanel(p: any): p is PanelWithExportableLibraryPanel {\n return p.libraryPanel && typeof p.libraryPanel.name === 'string' && typeof p.libraryPanel.uid === 'string';\n}\n\ninterface DataSources {\n [key: string]: {\n name: string;\n label: string;\n description: string;\n type: string;\n pluginId: string;\n pluginName: string;\n };\n}\n\nexport interface LibraryElementExport {\n name: string;\n uid: string;\n model: any;\n kind: LibraryElementKind;\n}\n\nexport class DashboardExporter {\n async makeExportable(dashboard: DashboardModel) {\n // clean up repeated rows and panels,\n // this is done on the live real dashboard instance, not on a clone\n // so we need to undo this\n // this is pretty hacky and needs to be changed\n dashboard.cleanUpRepeats();\n\n const saveModel = dashboard.getSaveModelClone();\n saveModel.id = null;\n\n // undo repeat cleanup\n dashboard.processRepeats();\n\n const inputs: Input[] = [];\n const requires: Requires = {};\n const datasources: DataSources = {};\n const variableLookup: { [key: string]: any } = {};\n const libraryPanels: Map<string, LibraryElementExport> = new Map<string, LibraryElementExport>();\n\n for (const variable of saveModel.getVariables()) {\n variableLookup[variable.name] = variable;\n }\n\n const templateizeDatasourceUsage = (obj: any, fallback?: DataSourceRef) => {\n if (obj.datasource === undefined) {\n obj.datasource = fallback;\n return;\n }\n\n let datasource: string = obj.datasource;\n let datasourceVariable: any = null;\n\n const datasourceUid: string = (datasource as any)?.uid;\n // ignore data source properties that contain a variable\n if (datasourceUid) {\n if (datasourceUid.indexOf('$') === 0) {\n datasourceVariable = variableLookup[datasourceUid.substring(1)];\n if (datasourceVariable && datasourceVariable.current) {\n datasource = datasourceVariable.current.value;\n }\n }\n }\n\n return getDataSourceSrv()\n .get(datasource)\n .then((ds) => {\n if (ds.meta?.builtIn) {\n return;\n }\n\n // add data source type to require list\n requires['datasource' + ds.meta?.id] = {\n type: 'datasource',\n id: ds.meta.id,\n name: ds.meta.name,\n version: ds.meta.info.version || '1.0.0',\n };\n\n // if used via variable we can skip templatizing usage\n if (datasourceVariable) {\n return;\n }\n\n const refName = 'DS_' + ds.name.replace(' ', '_').toUpperCase();\n datasources[refName] = {\n name: refName,\n label: ds.name,\n description: '',\n type: 'datasource',\n pluginId: ds.meta?.id,\n pluginName: ds.meta?.name,\n };\n\n obj.datasource = { type: ds.meta.id, uid: '${' + refName + '}' };\n });\n };\n\n const processPanel = async (panel: PanelModel) => {\n if (panel.type !== 'row') {\n await templateizeDatasourceUsage(panel);\n\n if (panel.targets) {\n for (const target of panel.targets) {\n await templateizeDatasourceUsage(target, panel.datasource!);\n }\n }\n\n const panelDef: PanelPluginMeta = config.panels[panel.type];\n if (panelDef) {\n requires['panel' + panelDef.id] = {\n type: 'panel',\n id: panelDef.id,\n name: panelDef.name,\n version: panelDef.info.version,\n };\n }\n }\n };\n\n const processLibraryPanels = (panel: any) => {\n if (isPanelModelLibraryPanel(panel)) {\n const { libraryPanel, ...model } = panel;\n const { name, uid } = libraryPanel;\n const { gridPos, id, ...rest } = model;\n if (!libraryPanels.has(uid)) {\n libraryPanels.set(uid, { name, uid, kind: LibraryElementKind.Panel, model: rest });\n }\n }\n };\n\n try {\n // check up panel data sources\n for (const panel of saveModel.panels) {\n await processPanel(panel);\n\n // handle collapsed rows\n if (panel.collapsed !== undefined && panel.collapsed === true && panel.panels) {\n for (const rowPanel of panel.panels) {\n await processPanel(rowPanel);\n }\n }\n }\n\n // templatize template vars\n for (const variable of saveModel.getVariables()) {\n if (isQuery(variable)) {\n await templateizeDatasourceUsage(variable);\n variable.options = [];\n variable.current = {} as unknown as VariableOption;\n variable.refresh =\n variable.refresh !== VariableRefresh.never ? variable.refresh : VariableRefresh.onDashboardLoad;\n }\n }\n\n // templatize annotations vars\n for (const annotationDef of saveModel.annotations.list) {\n await templateizeDatasourceUsage(annotationDef);\n }\n\n // add grafana version\n requires['grafana'] = {\n type: 'grafana',\n id: 'grafana',\n name: 'Grafana',\n version: config.buildInfo.version,\n };\n\n each(datasources, (value: any) => {\n inputs.push(value);\n });\n\n // we need to process all panels again after all the promises are resolved\n // so all data sources, variables and targets have been templateized when we process library panels\n for (const panel of saveModel.panels) {\n processLibraryPanels(panel);\n if (panel.collapsed !== undefined && panel.collapsed === true && panel.panels) {\n for (const rowPanel of panel.panels) {\n processLibraryPanels(rowPanel);\n }\n }\n }\n\n // templatize constants\n for (const variable of saveModel.getVariables()) {\n if (isConstant(variable)) {\n const refName = 'VAR_' + variable.name.replace(' ', '_').toUpperCase();\n inputs.push({\n name: refName,\n type: 'constant',\n label: variable.label || variable.name,\n value: variable.query,\n description: '',\n });\n // update current and option\n variable.query = '${' + refName + '}';\n variable.current = {\n value: variable.query,\n text: variable.query,\n selected: false,\n };\n variable.options = [variable.current];\n }\n }\n\n const __elements = [...libraryPanels.entries()].reduce<Record<string, LibraryElementExport>>(\n (prev, [curKey, curLibPanel]) => {\n prev[curKey] = curLibPanel;\n return prev;\n },\n {}\n );\n\n // make inputs and requires a top thing\n const newObj: ExternalDashboard = defaults(\n {\n __inputs: inputs,\n __elements,\n __requires: sortBy(requires, ['id']),\n },\n saveModel\n );\n\n // Remove extraneous props from library panels\n for (let i = 0; i < newObj.panels.length; i++) {\n const libPanel = newObj.panels[i];\n if (isExportableLibraryPanel(libPanel)) {\n newObj.panels[i] = {\n gridPos: libPanel.gridPos,\n id: libPanel.id,\n libraryPanel: { uid: libPanel.libraryPanel.uid, name: libPanel.libraryPanel.name },\n };\n }\n }\n\n return newObj;\n } catch (err) {\n console.error('Export failed:', err);\n return {\n error: err,\n };\n }\n }\n}\n","// Libraries\nimport { css } from '@emotion/css';\nimport React, { FunctionComponent, MouseEvent } from 'react';\n\n// Components\nimport { GrafanaTheme } from '@grafana/data';\nimport { IconName, IconType, IconSize, IconButton, useTheme, stylesFactory } from '@grafana/ui';\n\ninterface Props {\n icon?: IconName;\n tooltip: string;\n onClick?: (event: MouseEvent<HTMLButtonElement>) => void;\n href?: string;\n children?: React.ReactNode;\n iconType?: IconType;\n iconSize?: IconSize;\n}\n\nexport const DashNavButton: FunctionComponent<Props> = ({ icon, iconType, iconSize, tooltip, onClick, children }) => {\n const theme = useTheme();\n const styles = getStyles(theme);\n\n return (\n <div className={styles.noBorderContainer}>\n {icon && (\n <IconButton\n name={icon}\n size={iconSize}\n iconType={iconType}\n tooltip={tooltip}\n tooltipPlacement=\"bottom\"\n onClick={onClick}\n />\n )}\n {children}\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n noBorderContainer: css`\n padding: 0 ${theme.spacing.xs};\n display: flex;\n `,\n}));\n","import { t } from '@lingui/macro';\nimport React, { Component } from 'react';\nimport { Unsubscribable } from 'rxjs';\n\nimport { dateMath, TimeRange, TimeZone } from '@grafana/data';\nimport { TimeRangeUpdatedEvent } from '@grafana/runtime';\nimport { defaultIntervals, RefreshPicker, ToolbarButtonRow } from '@grafana/ui';\nimport { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';\nimport { appEvents } from 'app/core/core';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\n\nimport { ShiftTimeEvent, ShiftTimeEventDirection, ZoomOutEvent } from '../../../../types/events';\nimport { DashboardModel } from '../../state';\n\nexport interface Props {\n dashboard: DashboardModel;\n onChangeTimeZone: (timeZone: TimeZone) => void;\n}\n\nexport class DashNavTimeControls extends Component<Props> {\n private sub?: Unsubscribable;\n\n componentDidMount() {\n this.sub = this.props.dashboard.events.subscribe(TimeRangeUpdatedEvent, () => this.forceUpdate());\n }\n\n componentWillUnmount() {\n this.sub?.unsubscribe();\n }\n\n onChangeRefreshInterval = (interval: string) => {\n getTimeSrv().setAutoRefresh(interval);\n this.forceUpdate();\n };\n\n onRefresh = () => {\n getTimeSrv().refreshTimeModel();\n return Promise.resolve();\n };\n\n onMoveBack = () => {\n appEvents.publish(new ShiftTimeEvent({ direction: ShiftTimeEventDirection.Left }));\n };\n\n onMoveForward = () => {\n appEvents.publish(new ShiftTimeEvent({ direction: ShiftTimeEventDirection.Right }));\n };\n\n onChangeTimePicker = (timeRange: TimeRange) => {\n const { dashboard } = this.props;\n const panel = dashboard.timepicker;\n const hasDelay = panel.nowDelay && timeRange.raw.to === 'now';\n\n const adjustedFrom = dateMath.isMathString(timeRange.raw.from) ? timeRange.raw.from : timeRange.from;\n const adjustedTo = dateMath.isMathString(timeRange.raw.to) ? timeRange.raw.to : timeRange.to;\n const nextRange = {\n from: adjustedFrom,\n to: hasDelay ? 'now-' + panel.nowDelay : adjustedTo,\n };\n\n getTimeSrv().setTime(nextRange);\n };\n\n onChangeTimeZone = (timeZone: TimeZone) => {\n this.props.dashboard.timezone = timeZone;\n this.props.onChangeTimeZone(timeZone);\n this.onRefresh();\n };\n\n onChangeFiscalYearStartMonth = (month: number) => {\n this.props.dashboard.fiscalYearStartMonth = month;\n this.onRefresh();\n };\n\n onZoom = () => {\n appEvents.publish(new ZoomOutEvent({ scale: 2 }));\n };\n\n render() {\n const { dashboard } = this.props;\n const { refresh_intervals } = dashboard.timepicker;\n const intervals = getTimeSrv().getValidIntervals(refresh_intervals || defaultIntervals);\n\n const timePickerValue = getTimeSrv().timeRange();\n const timeZone = dashboard.getTimezone();\n const fiscalYearStartMonth = dashboard.fiscalYearStartMonth;\n const hideIntervalPicker = dashboard.panelInEdit?.isEditing;\n\n return (\n <ToolbarButtonRow>\n <TimePickerWithHistory\n value={timePickerValue}\n onChange={this.onChangeTimePicker}\n timeZone={timeZone}\n fiscalYearStartMonth={fiscalYearStartMonth}\n onMoveBackward={this.onMoveBack}\n onMoveForward={this.onMoveForward}\n onZoom={this.onZoom}\n onChangeTimeZone={this.onChangeTimeZone}\n onChangeFiscalYearStartMonth={this.onChangeFiscalYearStartMonth}\n />\n <RefreshPicker\n onIntervalChanged={this.onChangeRefreshInterval}\n onRefresh={this.onRefresh}\n value={dashboard.refresh}\n intervals={intervals}\n tooltip={t({ id: 'dashboard.toolbar.refresh', message: 'Refresh dashboard' })}\n noIntervalPicker={hideIntervalPicker}\n offDescriptionAriaLabelMsg={t({\n id: 'dashboard.refresh-picker.off-description',\n message: 'Auto refresh turned off. Choose refresh time interval',\n })}\n onDescriptionAriaLabelMsg={(durationAriaLabel) =>\n t({\n id: 'dashboard.refresh-picker.on-description',\n message: `Choose refresh time interval with current interval ${durationAriaLabel} selected`,\n })\n }\n offOptionLabelMsg={t({ id: 'dashboard.refresh-picker.off-label', message: 'Off' })}\n offOptionAriaLabelMsg={t({ id: 'dashboard.refresh-picker.off-arialabel', message: 'Turn off auto refresh' })}\n />\n </ToolbarButtonRow>\n );\n }\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Modal, useStyles2 } from '@grafana/ui';\nimport { CommentManager } from 'app/features/comments/CommentManager';\n\nimport { DashboardModel } from '../../state/DashboardModel';\n\ntype Props = {\n dashboard: DashboardModel;\n onDismiss: () => void;\n};\n\nexport const DashboardCommentsModal = ({ dashboard, onDismiss }: Props) => {\n const styles = useStyles2(getStyles);\n\n return (\n <Modal isOpen={true} title=\"Dashboard comments\" icon=\"save\" onDismiss={onDismiss} className={styles.modal}>\n <CommentManager objectType={'dashboard'} objectId={dashboard.uid} />\n </Modal>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n modal: css`\n width: 500px;\n height: 60vh;\n `,\n});\n","import { t, Trans } from '@lingui/macro';\nimport React, { FC, ReactNode } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { locationUtil, textUtil } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';\nimport { locationService } from '@grafana/runtime';\nimport { ButtonGroup, ModalsController, ToolbarButton, PageToolbar, useForceUpdate, Tag } from '@grafana/ui';\nimport { AppChromeUpdate } from 'app/core/components/AppChrome/AppChromeUpdate';\nimport { NavToolbarSeparator } from 'app/core/components/AppChrome/NavToolbarSeparator';\nimport config from 'app/core/config';\nimport { toggleKioskMode } from 'app/core/navigation/kiosk';\nimport { DashboardCommentsModal } from 'app/features/dashboard/components/DashboardComments/DashboardCommentsModal';\nimport { SaveDashboardDrawer } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardDrawer';\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { playlistSrv } from 'app/features/playlist/PlaylistSrv';\nimport { updateTimeZoneForSession } from 'app/features/profile/state/reducers';\nimport { KioskMode } from 'app/types';\n\nimport { setStarred } from '../../../../core/reducers/navBarTree';\nimport { getDashboardSrv } from '../../services/DashboardSrv';\nimport { DashboardModel } from '../../state';\n\nimport { DashNavButton } from './DashNavButton';\nimport { DashNavTimeControls } from './DashNavTimeControls';\n\nconst mapDispatchToProps = {\n setStarred,\n updateTimeZoneForSession,\n};\n\nconst connector = connect(null, mapDispatchToProps);\n\nconst selectors = e2eSelectors.pages.Dashboard.DashNav;\n\nexport interface OwnProps {\n dashboard: DashboardModel;\n isFullscreen: boolean;\n kioskMode: KioskMode;\n hideTimePicker: boolean;\n folderTitle?: string;\n title: string;\n onAddPanel: () => void;\n}\n\ninterface DashNavButtonModel {\n show: (props: Props) => boolean;\n component: FC<Partial<Props>>;\n index?: number | 'end';\n}\n\nconst customLeftActions: DashNavButtonModel[] = [];\nconst customRightActions: DashNavButtonModel[] = [];\n\nexport function addCustomLeftAction(content: DashNavButtonModel) {\n customLeftActions.push(content);\n}\n\nexport function addCustomRightAction(content: DashNavButtonModel) {\n customRightActions.push(content);\n}\n\ntype Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport const DashNav = React.memo<Props>((props) => {\n const forceUpdate = useForceUpdate();\n\n const onStarDashboard = () => {\n const dashboardSrv = getDashboardSrv();\n const { dashboard, setStarred } = props;\n\n dashboardSrv.starDashboard(dashboard.id, dashboard.meta.isStarred).then((newState: any) => {\n setStarred({ id: dashboard.uid, title: dashboard.title, url: dashboard.meta.url ?? '', isStarred: newState });\n dashboard.meta.isStarred = newState;\n forceUpdate();\n });\n };\n\n const onClose = () => {\n locationService.partial({ viewPanel: null });\n };\n\n const onToggleTVMode = () => {\n toggleKioskMode();\n };\n\n const onOpenSettings = () => {\n locationService.partial({ editview: 'settings' });\n };\n\n const onPlaylistPrev = () => {\n playlistSrv.prev();\n };\n\n const onPlaylistNext = () => {\n playlistSrv.next();\n };\n\n const onPlaylistStop = () => {\n playlistSrv.stop();\n forceUpdate();\n };\n\n const addCustomContent = (actions: DashNavButtonModel[], buttons: ReactNode[]) => {\n actions.map((action, index) => {\n const Component = action.component;\n const element = <Component {...props} key={`button-custom-${index}`} />;\n typeof action.index === 'number' ? buttons.splice(action.index, 0, element) : buttons.push(element);\n });\n };\n\n const isPlaylistRunning = () => {\n return playlistSrv.isPlaying;\n };\n\n const renderLeftActions = () => {\n const { dashboard, kioskMode } = props;\n const { canStar, canShare, isStarred } = dashboard.meta;\n const buttons: ReactNode[] = [];\n\n if (kioskMode !== KioskMode.Off || isPlaylistRunning()) {\n return [];\n }\n\n if (canStar) {\n let desc = isStarred\n ? t({ id: 'dashboard.toolbar.unmark-favorite', message: 'Unmark as favorite' })\n : t({ id: 'dashboard.toolbar.mark-favorite', message: 'Mark as favorite' });\n buttons.push(\n <DashNavButton\n tooltip={desc}\n icon={isStarred ? 'favorite' : 'star'}\n iconType={isStarred ? 'mono' : 'default'}\n iconSize=\"lg\"\n onClick={onStarDashboard}\n key=\"button-star\"\n />\n );\n }\n\n if (canShare) {\n buttons.push(\n <ModalsController key=\"button-share\">\n {({ showModal, hideModal }) => (\n <DashNavButton\n tooltip={t({ id: 'dashboard.toolbar.share', message: 'Share dashboard or panel' })}\n icon=\"share-alt\"\n iconSize=\"lg\"\n onClick={() => {\n showModal(ShareModal, {\n dashboard,\n onDismiss: hideModal,\n });\n }}\n />\n )}\n </ModalsController>\n );\n }\n\n if (dashboard.meta.publicDashboardEnabled) {\n buttons.push(<Tag name=\"Public\" colorIndex={5} data-testid={selectors.publicDashboardTag}></Tag>);\n }\n\n if (dashboard.uid && config.featureToggles.dashboardComments) {\n buttons.push(\n <ModalsController key=\"button-dashboard-comments\">\n {({ showModal, hideModal }) => (\n <DashNavButton\n tooltip={t({ id: 'dashboard.toolbar.comments-show', message: 'Show dashboard comments' })}\n icon=\"comment-alt-message\"\n iconSize=\"lg\"\n onClick={() => {\n showModal(DashboardCommentsModal, {\n dashboard,\n onDismiss: hideModal,\n });\n }}\n />\n )}\n </ModalsController>\n );\n }\n\n addCustomContent(customLeftActions, buttons);\n return buttons;\n };\n\n const renderPlaylistControls = () => {\n return (\n <ButtonGroup key=\"playlist-buttons\">\n <ToolbarButton\n tooltip={t({ id: 'dashboard.toolbar.playlist-previous', message: 'Go to previous dashboard' })}\n icon=\"backward\"\n onClick={onPlaylistPrev}\n narrow\n />\n <ToolbarButton onClick={onPlaylistStop}>\n <Trans id=\"dashboard.toolbar.playlist-stop\">Stop playlist</Trans>\n </ToolbarButton>\n <ToolbarButton\n tooltip={t({ id: 'dashboard.toolbar.playlist-next', message: 'Go to next dashboard' })}\n icon=\"forward\"\n onClick={onPlaylistNext}\n narrow\n />\n </ButtonGroup>\n );\n };\n\n const renderTimeControls = () => {\n const { dashboard, updateTimeZoneForSession, hideTimePicker } = props;\n\n if (hideTimePicker) {\n return null;\n }\n\n return (\n <DashNavTimeControls dashboard={dashboard} onChangeTimeZone={updateTimeZoneForSession} key=\"time-controls\" />\n );\n };\n\n const renderRightActions = () => {\n const { dashboard, onAddPanel, isFullscreen, kioskMode } = props;\n const { canSave, canEdit, showSettings } = dashboard.meta;\n const { snapshot } = dashboard;\n const snapshotUrl = snapshot && snapshot.originalUrl;\n const buttons: ReactNode[] = [];\n const tvButton = (\n <ToolbarButton\n tooltip={t({ id: 'dashboard.toolbar.tv-button', message: 'Cycle view mode' })}\n icon=\"monitor\"\n onClick={onToggleTVMode}\n key=\"tv-button\"\n />\n );\n\n if (isPlaylistRunning()) {\n return [renderPlaylistControls(), renderTimeControls()];\n }\n\n if (kioskMode === KioskMode.TV) {\n return [renderTimeControls(), tvButton];\n }\n\n if (canEdit && !isFullscreen) {\n buttons.push(\n <ToolbarButton\n tooltip={t({ id: 'dashboard.toolbar.add-panel', message: 'Add panel' })}\n icon=\"panel-add\"\n onClick={onAddPanel}\n key=\"button-panel-add\"\n />\n );\n }\n\n if (canSave && !isFullscreen) {\n buttons.push(\n <ModalsController key=\"button-save\">\n {({ showModal, hideModal }) => (\n <ToolbarButton\n tooltip={t({ id: 'dashboard.toolbar.save', message: 'Save dashboard' })}\n icon=\"save\"\n onClick={() => {\n showModal(SaveDashboardDrawer, {\n dashboard,\n onDismiss: hideModal,\n });\n }}\n />\n )}\n </ModalsController>\n );\n }\n\n if (snapshotUrl) {\n buttons.push(\n <ToolbarButton\n tooltip={t({ id: 'dashboard.toolbar.open-original', message: 'Open original dashboard' })}\n onClick={() => gotoSnapshotOrigin(snapshotUrl)}\n icon=\"link\"\n key=\"button-snapshot\"\n />\n );\n }\n\n if (showSettings) {\n buttons.push(\n <ToolbarButton\n tooltip={t({ id: 'dashboard.toolbar.settings', message: 'Dashboard settings' })}\n icon=\"cog\"\n onClick={onOpenSettings}\n key=\"button-settings\"\n />\n );\n }\n\n addCustomContent(customRightActions, buttons);\n\n buttons.push(renderTimeControls());\n buttons.push(tvButton);\n return buttons;\n };\n\n const gotoSnapshotOrigin = (snapshotUrl: string) => {\n window.location.href = textUtil.sanitizeUrl(snapshotUrl);\n };\n\n const { isFullscreen, title, folderTitle } = props;\n // this ensures the component rerenders when the location changes\n const location = useLocation();\n const titleHref = locationUtil.getUrlForPartial(location, { search: 'open' });\n const parentHref = locationUtil.getUrlForPartial(location, { search: 'open', folder: 'current' });\n const onGoBack = isFullscreen ? onClose : undefined;\n\n if (config.featureToggles.topnav) {\n return (\n <AppChromeUpdate\n pageNav={{ text: title }}\n actions={\n <>\n {renderLeftActions()}\n <NavToolbarSeparator leftActionsSeparator />\n {renderRightActions()}\n </>\n }\n />\n );\n }\n\n return (\n <PageToolbar\n pageIcon={isFullscreen ? undefined : 'apps'}\n title={title}\n parent={folderTitle}\n titleHref={titleHref}\n parentHref={parentHref}\n onGoBack={onGoBack}\n leftItems={renderLeftActions()}\n >\n {renderRightActions()}\n </PageToolbar>\n );\n});\n\nDashNav.displayName = 'DashNav';\n\nexport default connector(DashNav);\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Input, defaultIntervals, Field } from '@grafana/ui';\n\nimport { getTimeSrv } from '../../services/TimeSrv';\n\nexport interface Props {\n refreshIntervals: string[];\n onRefreshIntervalChange: (interval: string[]) => void;\n getIntervalsFunc?: typeof getValidIntervals;\n validateIntervalsFunc?: typeof validateIntervals;\n}\n\nexport const AutoRefreshIntervals: FC<Props> = ({\n refreshIntervals,\n onRefreshIntervalChange,\n getIntervalsFunc = getValidIntervals,\n validateIntervalsFunc = validateIntervals,\n}) => {\n const [intervals, setIntervals] = useState<string[]>(getIntervalsFunc(refreshIntervals ?? defaultIntervals));\n const [invalidIntervalsMessage, setInvalidIntervalsMessage] = useState<string | null>(null);\n\n useEffect(() => {\n const intervals = getIntervalsFunc(refreshIntervals ?? defaultIntervals);\n setIntervals(intervals);\n }, [getIntervalsFunc, refreshIntervals]);\n\n const intervalsString = useMemo(() => {\n if (!Array.isArray(intervals)) {\n return '';\n }\n\n return intervals.join(',');\n }, [intervals]);\n\n const onIntervalsChange = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n const newIntervals = event.currentTarget.value ? event.currentTarget.value.split(',') : [];\n\n setIntervals(newIntervals);\n },\n [setIntervals]\n );\n\n const onIntervalsBlur = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n const invalidMessage = validateIntervalsFunc(intervals);\n\n if (invalidMessage === null) {\n // only refresh dashboard JSON if intervals are valid\n onRefreshIntervalChange(getIntervalsFunc(intervals));\n }\n\n setInvalidIntervalsMessage(invalidMessage);\n },\n [getIntervalsFunc, intervals, onRefreshIntervalChange, validateIntervalsFunc]\n );\n\n return (\n <Field\n label=\"Auto refresh\"\n description=\"Define the auto refresh intervals that should be available in the auto refresh list.\"\n error={invalidIntervalsMessage}\n invalid={!!invalidIntervalsMessage}\n >\n <Input\n id=\"auto-refresh-input\"\n invalid={!!invalidIntervalsMessage}\n value={intervalsString}\n onChange={onIntervalsChange}\n onBlur={onIntervalsBlur}\n />\n </Field>\n );\n};\n\nexport const validateIntervals = (\n intervals: string[],\n dependencies: { getTimeSrv: typeof getTimeSrv } = { getTimeSrv }\n): string | null => {\n try {\n getValidIntervals(intervals, dependencies);\n return null;\n } catch (err) {\n return err instanceof Error ? err.message : 'Invalid intervals';\n }\n};\n\nexport const getValidIntervals = (\n intervals: string[],\n dependencies: { getTimeSrv: typeof getTimeSrv } = { getTimeSrv }\n) => {\n const cleanIntervals = intervals.filter((i) => i.trim() !== '').map((interval) => interval.replace(/\\s+/g, ''));\n return [...new Set(dependencies.getTimeSrv().getValidIntervals(cleanIntervals))];\n};\n","import { isEmpty } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport { rangeUtil, TimeZone } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { CollapsableSection, Field, Input, Switch, TimeZonePicker, WeekStartPicker } from '@grafana/ui';\n\nimport { AutoRefreshIntervals } from './AutoRefreshIntervals';\n\ninterface Props {\n onWeekStartChange: (weekStart: string) => void;\n onTimeZoneChange: (timeZone: TimeZone) => void;\n onRefreshIntervalChange: (interval: string[]) => void;\n onNowDelayChange: (nowDelay: string) => void;\n onHideTimePickerChange: (hide: boolean) => void;\n onLiveNowChange: (liveNow: boolean) => void;\n refreshIntervals: string[];\n timePickerHidden: boolean;\n nowDelay: string;\n timezone: TimeZone;\n weekStart: string;\n liveNow: boolean;\n}\n\ninterface State {\n isNowDelayValid: boolean;\n}\n\nexport class TimePickerSettings extends PureComponent<Props, State> {\n state: State = { isNowDelayValid: true };\n\n onNowDelayChange = (event: React.FormEvent<HTMLInputElement>) => {\n const value = event.currentTarget.value;\n\n if (isEmpty(value)) {\n this.setState({ isNowDelayValid: true });\n return this.props.onNowDelayChange(value);\n }\n\n if (rangeUtil.isValidTimeSpan(value)) {\n this.setState({ isNowDelayValid: true });\n return this.props.onNowDelayChange(value);\n }\n\n this.setState({ isNowDelayValid: false });\n };\n\n onHideTimePickerChange = () => {\n this.props.onHideTimePickerChange(!this.props.timePickerHidden);\n };\n\n onLiveNowChange = () => {\n this.props.onLiveNowChange(!this.props.liveNow);\n };\n\n onTimeZoneChange = (timeZone?: string) => {\n if (typeof timeZone !== 'string') {\n return;\n }\n this.props.onTimeZoneChange(timeZone);\n };\n\n onWeekStartChange = (weekStart: string) => {\n this.props.onWeekStartChange(weekStart);\n };\n\n render() {\n return (\n <CollapsableSection label=\"Time options\" isOpen={true}>\n <Field label=\"Time zone\" data-testid={selectors.components.TimeZonePicker.containerV2}>\n <TimeZonePicker\n inputId=\"time-options-input\"\n includeInternal={true}\n value={this.props.timezone}\n onChange={this.onTimeZoneChange}\n width={40}\n />\n </Field>\n <Field label=\"Week start\" data-testid={selectors.components.WeekStartPicker.containerV2}>\n <WeekStartPicker\n inputId=\"week-start-input\"\n width={40}\n value={this.props.weekStart}\n onChange={this.onWeekStartChange}\n />\n </Field>\n <AutoRefreshIntervals\n refreshIntervals={this.props.refreshIntervals}\n onRefreshIntervalChange={this.props.onRefreshIntervalChange}\n />\n <Field label=\"Now delay\" description=\"Exclude recent data that may be incomplete.\">\n <Input\n id=\"now-delay-input\"\n invalid={!this.state.isNowDelayValid}\n placeholder=\"0m\"\n onChange={this.onNowDelayChange}\n defaultValue={this.props.nowDelay}\n />\n </Field>\n <Field label=\"Hide time picker\">\n <Switch\n id=\"hide-time-picker-toggle\"\n value={!!this.props.timePickerHidden}\n onChange={this.onHideTimePickerChange}\n />\n </Field>\n <Field\n label=\"Refresh live dashboards\"\n description=\"Continuously re-draw panels where the time range references 'now'\"\n >\n <Switch id=\"refresh-live-dashboards-toggle\" value={!!this.props.liveNow} onChange={this.onLiveNowChange} />\n </Field>\n </CollapsableSection>\n );\n }\n}\n","import React, { FC, useCallback, useEffect, useRef } from 'react';\n\nimport { GraphEdge, GraphNode } from './utils';\n\ninterface OwnProps {\n nodes: GraphNode[];\n edges: GraphEdge[];\n direction?: 'UD' | 'DU' | 'LR' | 'RL';\n onDoubleClick?: (node: string) => void;\n width?: string;\n height?: string;\n}\n\ninterface ConnectedProps {}\n\ninterface DispatchProps {}\n\nexport type Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport const NetworkGraph: FC<Props> = ({ nodes, edges, direction, width, height, onDoubleClick }) => {\n const network = useRef<any>(null);\n const ref = useRef(null);\n\n const onNodeDoubleClick = useCallback(\n (params: { nodes: string[] }) => {\n if (onDoubleClick) {\n onDoubleClick(params.nodes[0]);\n }\n },\n [onDoubleClick]\n );\n\n useEffect(() => {\n const createNetwork = async () => {\n // @ts-ignore no types yet for visjs-network\n const visJs = await import(/* webpackChunkName: \"visjs-network\" */ 'visjs-network');\n const data = {\n nodes: toVisNetworkNodes(visJs, nodes),\n edges: toVisNetworkEdges(visJs, edges),\n };\n const options = {\n width: '100%',\n height: '100%',\n autoResize: true,\n layout: {\n improvedLayout: true,\n hierarchical: {\n enabled: true,\n direction: direction ?? 'DU',\n sortMethod: 'directed',\n },\n },\n interaction: {\n navigationButtons: true,\n dragNodes: false,\n },\n };\n\n network.current = new visJs.Network(ref.current, data, options);\n network.current?.on('doubleClick', onNodeDoubleClick);\n };\n\n createNetwork();\n\n return () => {\n // unsubscribe event handlers\n if (network.current) {\n network.current.off('doubleClick');\n }\n };\n }, [direction, edges, nodes, onNodeDoubleClick]);\n\n return (\n <div>\n <div ref={ref} style={{ width: width ?? '100%', height: height ?? '60vh' }} />\n </div>\n );\n};\n\nfunction toVisNetworkNodes(visJs: any, nodes: GraphNode[]): any[] {\n const nodesWithStyle: any[] = nodes.map((node) => ({\n ...node,\n shape: 'box',\n }));\n return new visJs.DataSet(nodesWithStyle);\n}\n\nfunction toVisNetworkEdges(visJs: any, edges: GraphEdge[]): any[] {\n const edgesWithStyle: any[] = edges.map((edge) => ({ ...edge, arrows: 'to', dashes: true }));\n return new visJs.DataSet(edgesWithStyle);\n}\n","import React, { useCallback, useState } from 'react';\n\nimport { Modal } from '@grafana/ui';\n\nimport { NetworkGraph, Props as NetWorkGraphProps } from './NetworkGraph';\nimport { GraphEdge, GraphNode } from './utils';\n\ninterface NetworkGraphModalApi {\n showModal: () => void;\n}\n\ninterface OwnProps extends Pick<NetWorkGraphProps, 'direction'> {\n show: boolean;\n title: string;\n nodes: GraphNode[];\n edges: GraphEdge[];\n children: (api: NetworkGraphModalApi) => JSX.Element;\n}\n\ninterface ConnectedProps {}\n\ninterface DispatchProps {}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport function NetworkGraphModal({ edges, nodes, show: propsShow, title, children }: Props): JSX.Element {\n const [show, setShow] = useState(propsShow);\n const showModal = useCallback(() => setShow(true), [setShow]);\n const onClose = useCallback(() => setShow(false), [setShow]);\n\n return (\n <>\n <Modal\n isOpen={show}\n title={title}\n icon=\"info-circle\"\n iconTooltip=\"The graph can be moved, zoomed in, and zoomed out.\"\n onClickBackdrop={onClose}\n onDismiss={onClose}\n >\n <NetworkGraph nodes={nodes} edges={edges} />\n </Modal>\n {children({ showModal })}\n </>\n );\n}\n","import React, { FC, useMemo } from 'react';\nimport { Provider } from 'react-redux';\n\nimport { reportInteraction } from '@grafana/runtime';\nimport { Button } from '@grafana/ui';\n\nimport { store } from '../../../store/store';\nimport { VariableModel } from '../types';\n\nimport { NetworkGraphModal } from './NetworkGraphModal';\nimport { createDependencyEdges, createDependencyNodes, filterNodesWithDependencies } from './utils';\n\ninterface OwnProps {\n variables: VariableModel[];\n}\n\ninterface ConnectedProps {}\n\ninterface DispatchProps {}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport const UnProvidedVariablesDependenciesButton: FC<Props> = ({ variables }) => {\n const nodes = useMemo(() => createDependencyNodes(variables), [variables]);\n const edges = useMemo(() => createDependencyEdges(variables), [variables]);\n\n if (!edges.length) {\n return null;\n }\n\n return (\n <NetworkGraphModal\n show={false}\n title=\"Dependencies\"\n nodes={filterNodesWithDependencies(nodes, edges)}\n edges={edges}\n >\n {({ showModal }) => {\n return (\n <Button\n onClick={() => {\n reportInteraction('Show variable dependencies');\n showModal();\n }}\n icon=\"channel-add\"\n variant=\"secondary\"\n >\n Show dependencies\n </Button>\n );\n }}\n </NetworkGraphModal>\n );\n};\n\nexport const VariablesDependenciesButton: FC<Props> = (props) => (\n <Provider store={store}>\n <UnProvidedVariablesDependenciesButton {...props} />\n </Provider>\n);\n","import React, { FC, useMemo } from 'react';\n\nimport { IconButton } from '@grafana/ui';\n\nimport { NetworkGraphModal } from './NetworkGraphModal';\nimport { UsagesToNetwork } from './utils';\n\ninterface Props {\n id: string;\n usages: UsagesToNetwork[];\n}\n\nexport const VariablesUnknownButton: FC<Props> = ({ id, usages }) => {\n const network = useMemo(() => usages.find((n) => n.variable.id === id), [id, usages]);\n\n if (!network) {\n return null;\n }\n\n const nodes = network.nodes.map((n) => {\n if (n.label.includes(`$${id}`)) {\n return { ...n, color: '#FB7E81' };\n }\n return n;\n });\n\n return (\n <NetworkGraphModal show={false} title={`Showing usages for: $${id}`} nodes={nodes} edges={network.edges}>\n {({ showModal }) => {\n return (\n <IconButton\n onClick={() => showModal()}\n name=\"code-branch\"\n title=\"Show usages\"\n data-testid=\"VariablesUnknownButton\"\n />\n );\n }}\n </NetworkGraphModal>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { ReactElement, useEffect, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime';\nimport { CollapsableSection, HorizontalGroup, Icon, Spinner, Tooltip, useStyles, VerticalGroup } from '@grafana/ui';\n\nimport { DashboardModel } from '../../dashboard/state';\nimport { VariableModel } from '../types';\n\nimport { VariablesUnknownButton } from './VariablesUnknownButton';\nimport { getUnknownsNetwork, UsagesToNetwork } from './utils';\n\nexport const SLOW_VARIABLES_EXPANSION_THRESHOLD = 1000;\n\nexport interface VariablesUnknownTableProps {\n variables: VariableModel[];\n dashboard: DashboardModel | null;\n}\n\nexport function VariablesUnknownTable({ variables, dashboard }: VariablesUnknownTableProps): ReactElement {\n const [open, setOpen] = useState(false);\n const [changed, setChanged] = useState(0);\n const [usages, setUsages] = useState<UsagesToNetwork[]>([]);\n const style = useStyles(getStyles);\n useEffect(() => setChanged((prevState) => prevState + 1), [variables, dashboard]);\n const { loading } = useAsync(async () => {\n if (open && changed > 0) {\n // make sure we only fetch when opened and variables or dashboard have changed\n const start = Date.now();\n const unknownsNetwork = await getUnknownsNetwork(variables, dashboard);\n const stop = Date.now();\n const elapsed = stop - start;\n if (elapsed >= SLOW_VARIABLES_EXPANSION_THRESHOLD) {\n reportInteraction('Slow unknown variables expansion', { elapsed });\n }\n setChanged(0);\n setUsages(unknownsNetwork);\n return unknownsNetwork;\n }\n\n return [];\n }, [variables, dashboard, open, changed]);\n\n const onToggle = (isOpen: boolean) => {\n if (isOpen) {\n reportInteraction('Unknown variables section expanded');\n }\n\n setOpen(isOpen);\n };\n\n return (\n <div className={style.container}>\n <CollapsableSection label={<CollapseLabel />} isOpen={open} onToggle={onToggle}>\n {loading && (\n <VerticalGroup justify=\"center\">\n <HorizontalGroup justify=\"center\">\n <span>Loading...</span>\n <Spinner size={16} />\n </HorizontalGroup>\n </VerticalGroup>\n )}\n {!loading && usages && (\n <>\n {usages.length === 0 && <NoUnknowns />}\n {usages.length > 0 && <UnknownTable usages={usages} />}\n </>\n )}\n </CollapsableSection>\n </div>\n );\n}\n\nfunction CollapseLabel(): ReactElement {\n const style = useStyles(getStyles);\n return (\n <h5>\n Renamed or missing variables\n <Tooltip content=\"Click to expand a list with all variable references that have been renamed or are missing from the dashboard.\">\n <Icon name=\"info-circle\" className={style.infoIcon} />\n </Tooltip>\n </h5>\n );\n}\n\nfunction NoUnknowns(): ReactElement {\n return <span>No renamed or missing variables found.</span>;\n}\n\nfunction UnknownTable({ usages }: { usages: UsagesToNetwork[] }): ReactElement {\n const style = useStyles(getStyles);\n return (\n <table className=\"filter-table filter-table--hover\">\n <thead>\n <tr>\n <th>Variable</th>\n <th colSpan={5} />\n </tr>\n </thead>\n <tbody>\n {usages.map((usage) => {\n const { variable } = usage;\n const { id, name } = variable;\n return (\n <tr key={id}>\n <td className={style.firstColumn}>\n <span>{name}</span>\n </td>\n <td className={style.defaultColumn} />\n <td className={style.defaultColumn} />\n <td className={style.defaultColumn} />\n <td className={style.lastColumn}>\n <VariablesUnknownButton id={variable.id} usages={usages} />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme) => ({\n container: css`\n margin-top: ${theme.spacing.xl};\n padding-top: ${theme.spacing.xl};\n `,\n infoIcon: css`\n margin-left: ${theme.spacing.sm};\n `,\n defaultColumn: css`\n width: 1%;\n `,\n firstColumn: css`\n width: 1%;\n vertical-align: top;\n color: ${theme.colors.textStrong};\n `,\n lastColumn: css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n width: 100%;\n text-align: right;\n `,\n});\n","import React, { PropsWithChildren, useMemo } from 'react';\n\nimport { SelectableValue, VariableType } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { VariableHide } from '../types';\n\ninterface Props {\n onChange: (option: SelectableValue<VariableHide>) => void;\n hide: VariableHide;\n type: VariableType;\n}\n\nconst HIDE_OPTIONS = [\n { label: '', value: VariableHide.dontHide },\n { label: 'Label', value: VariableHide.hideLabel },\n { label: 'Variable', value: VariableHide.hideVariable },\n];\n\nexport function VariableHideSelect({ onChange, hide, type }: PropsWithChildren<Props>) {\n const value = useMemo(() => HIDE_OPTIONS.find((o) => o.value === hide) ?? HIDE_OPTIONS[0], [hide]);\n\n if (type === 'constant') {\n return null;\n }\n\n return (\n <VariableSelectField\n name=\"Hide\"\n value={value}\n options={HIDE_OPTIONS}\n onChange={onChange}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalHideSelectV2}\n />\n );\n}\n","import React, { PropsWithChildren, useMemo } from 'react';\n\nimport { SelectableValue, VariableType } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { variableAdapters } from '../adapters';\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { getVariableTypes } from '../utils';\n\ninterface Props {\n onChange: (option: SelectableValue<VariableType>) => void;\n type: VariableType;\n}\n\nexport function VariableTypeSelect({ onChange, type }: PropsWithChildren<Props>) {\n const options = useMemo(() => getVariableTypes(), []);\n const value = useMemo(() => options.find((o) => o.value === type) ?? options[0], [options, type]);\n\n return (\n <VariableSelectField\n name=\"Type\"\n value={value}\n options={options}\n onChange={onChange}\n tooltip={variableAdapters.get(type).description}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalTypeSelectV2}\n />\n );\n}\n","import { css } from '@emotion/css';\nimport React, { MouseEvent, useCallback, useEffect, useState } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, InlineFieldRow, InlineLabel, useStyles, VerticalGroup } from '@grafana/ui';\n\nimport { VariableOption, VariableWithOptions } from '../types';\n\nexport interface VariableValuesPreviewProps {\n variable: VariableWithOptions;\n}\n\nexport const VariableValuesPreview: React.FunctionComponent<VariableValuesPreviewProps> = ({\n variable: { options },\n}) => {\n const [previewLimit, setPreviewLimit] = useState(20);\n const [previewOptions, setPreviewOptions] = useState<VariableOption[]>([]);\n const showMoreOptions = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n setPreviewLimit(previewLimit + 20);\n },\n [previewLimit, setPreviewLimit]\n );\n const styles = useStyles(getStyles);\n useEffect(() => setPreviewOptions(options.slice(0, previewLimit)), [previewLimit, options]);\n\n if (!previewOptions.length) {\n return null;\n }\n\n return (\n <VerticalGroup spacing=\"none\">\n <h5>Preview of values</h5>\n <InlineFieldRow>\n {previewOptions.map((o, index) => (\n <InlineFieldRow key={`${o.value}-${index}`} className={styles.optionContainer}>\n <InlineLabel aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.previewOfValuesOption}>\n <div className={styles.label}>{o.text}</div>\n </InlineLabel>\n </InlineFieldRow>\n ))}\n </InlineFieldRow>\n {options.length > previewLimit && (\n <InlineFieldRow className={styles.optionContainer}>\n <Button\n onClick={showMoreOptions}\n variant=\"secondary\"\n size=\"sm\"\n aria-label=\"Variable editor Preview of Values Show More link\"\n >\n Show more\n </Button>\n </InlineFieldRow>\n )}\n </VerticalGroup>\n );\n};\nVariableValuesPreview.displayName = 'VariableValuesPreview';\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n optionContainer: css`\n margin-left: ${theme.spacing.xs};\n margin-bottom: ${theme.spacing.xs};\n `,\n label: css`\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 50vw;\n `,\n };\n}\n","import { cloneDeep } from 'lodash';\n\nimport { VariableType } from '@grafana/data';\n\nimport { ThunkResult } from '../../../types';\nimport { variableAdapters } from '../adapters';\nimport { initInspect } from '../inspect/reducer';\nimport { createUsagesNetwork, transformUsagesToNetwork } from '../inspect/utils';\nimport { updateOptions } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getEditorVariables, getNewVariableIndex, getVariable, getVariablesByKey } from '../state/selectors';\nimport { addVariable, removeVariable } from '../state/sharedReducer';\nimport { AddVariable, KeyedVariableIdentifier, VariableIdentifier } from '../state/types';\nimport { VariableModel } from '../types';\nimport { toKeyedVariableIdentifier, toStateKey, toVariablePayload } from '../utils';\n\nimport {\n changeVariableNameFailed,\n changeVariableNameSucceeded,\n clearIdInEditor,\n setIdInEditor,\n variableEditorMounted,\n variableEditorUnMounted,\n} from './reducer';\n\nexport const variableEditorMount = (identifier: KeyedVariableIdentifier): ThunkResult<void> => {\n return async (dispatch) => {\n const { rootStateKey } = identifier;\n dispatch(toKeyedAction(rootStateKey, variableEditorMounted({ name: getVariable(identifier).name })));\n };\n};\n\nexport const variableEditorUnMount = (identifier: KeyedVariableIdentifier): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const { rootStateKey } = identifier;\n dispatch(toKeyedAction(rootStateKey, variableEditorUnMounted(toVariablePayload(identifier))));\n };\n};\n\nexport const onEditorUpdate = (identifier: KeyedVariableIdentifier): ThunkResult<void> => {\n return async (dispatch) => {\n await dispatch(updateOptions(identifier));\n dispatch(switchToListMode(identifier.rootStateKey));\n };\n};\n\nexport const changeVariableName = (identifier: KeyedVariableIdentifier, newName: string): ThunkResult<void> => {\n return (dispatch, getState) => {\n const { id, rootStateKey: uid } = identifier;\n let errorText = null;\n if (!newName.match(/^(?!__).*$/)) {\n errorText = \"Template names cannot begin with '__', that's reserved for Grafana's global variables\";\n }\n\n if (!newName.match(/^\\w+$/)) {\n errorText = 'Only word and digit characters are allowed in variable names';\n }\n\n const variables = getVariablesByKey(uid, getState());\n const foundVariables = variables.filter((v) => v.name === newName && v.id !== id);\n\n if (foundVariables.length) {\n errorText = 'Variable with the same name already exists';\n }\n\n if (errorText) {\n dispatch(toKeyedAction(uid, changeVariableNameFailed({ newName, errorText })));\n return;\n }\n\n dispatch(completeChangeVariableName(identifier, newName));\n };\n};\n\nexport const completeChangeVariableName =\n (identifier: KeyedVariableIdentifier, newName: string): ThunkResult<void> =>\n (dispatch, getState) => {\n const { rootStateKey } = identifier;\n const originalVariable = getVariable(identifier, getState());\n if (originalVariable.name === newName) {\n dispatch(toKeyedAction(rootStateKey, changeVariableNameSucceeded(toVariablePayload(identifier, { newName }))));\n return;\n }\n const model = { ...cloneDeep(originalVariable), name: newName, id: newName };\n const global = originalVariable.global;\n const index = originalVariable.index;\n const renamedIdentifier = toKeyedVariableIdentifier(model);\n\n dispatch(toKeyedAction(rootStateKey, addVariable(toVariablePayload(renamedIdentifier, { global, index, model }))));\n dispatch(\n toKeyedAction(rootStateKey, changeVariableNameSucceeded(toVariablePayload(renamedIdentifier, { newName })))\n );\n dispatch(switchToEditMode(renamedIdentifier));\n dispatch(toKeyedAction(rootStateKey, removeVariable(toVariablePayload(identifier, { reIndex: false }))));\n };\n\nexport const switchToNewMode =\n (key: string | null | undefined, type: VariableType = 'query'): ThunkResult<void> =>\n (dispatch, getState) => {\n const rootStateKey = toStateKey(key);\n const id = getNextAvailableId(type, getVariablesByKey(rootStateKey, getState()));\n const identifier: VariableIdentifier = { type, id };\n const global = false;\n const index = getNewVariableIndex(rootStateKey, getState());\n const model: VariableModel = cloneDeep(variableAdapters.get(type).initialState);\n model.id = id;\n model.name = id;\n model.rootStateKey = rootStateKey;\n dispatch(\n toKeyedAction(rootStateKey, addVariable(toVariablePayload<AddVariable>(identifier, { global, model, index })))\n );\n dispatch(toKeyedAction(rootStateKey, setIdInEditor({ id: identifier.id })));\n };\n\nexport const switchToEditMode =\n (identifier: KeyedVariableIdentifier): ThunkResult<void> =>\n (dispatch) => {\n const { rootStateKey } = identifier;\n dispatch(toKeyedAction(rootStateKey, setIdInEditor({ id: identifier.id })));\n };\n\nexport const switchToListMode =\n (key: string | null | undefined): ThunkResult<void> =>\n (dispatch, getState) => {\n const rootStateKey = toStateKey(key);\n dispatch(toKeyedAction(rootStateKey, clearIdInEditor()));\n const state = getState();\n const variables = getEditorVariables(rootStateKey, state);\n const dashboard = state.dashboard.getModel();\n const { usages } = createUsagesNetwork(variables, dashboard);\n const usagesNetwork = transformUsagesToNetwork(usages);\n\n dispatch(toKeyedAction(rootStateKey, initInspect({ usages, usagesNetwork })));\n };\n\nexport function getNextAvailableId(type: VariableType, variables: VariableModel[]): string {\n let counter = 0;\n let nextId = `${type}${counter}`;\n\n while (variables.find((variable) => variable.id === nextId)) {\n nextId = `${type}${++counter}`;\n }\n\n return nextId;\n}\n","import { isEqual } from 'lodash';\nimport React, { FormEvent, PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { bindActionCreators } from 'redux';\n\nimport { AppEvents, LoadingState, SelectableValue, VariableType } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, Icon, InlineFieldRow, VerticalGroup } from '@grafana/ui';\n\nimport { appEvents } from '../../../core/core';\nimport { StoreState, ThunkDispatch } from '../../../types';\nimport { variableAdapters } from '../adapters';\nimport { hasOptions } from '../guard';\nimport { updateOptions } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getVariable, getVariablesState } from '../state/selectors';\nimport { changeVariableProp, changeVariableType } from '../state/sharedReducer';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { VariableHide } from '../types';\nimport { toKeyedVariableIdentifier, toVariablePayload } from '../utils';\n\nimport { VariableHideSelect } from './VariableHideSelect';\nimport { VariableSectionHeader } from './VariableSectionHeader';\nimport { VariableTextField } from './VariableTextField';\nimport { VariableTypeSelect } from './VariableTypeSelect';\nimport { VariableValuesPreview } from './VariableValuesPreview';\nimport { changeVariableName, onEditorUpdate, variableEditorMount, variableEditorUnMount } from './actions';\nimport { OnPropChangeArguments } from './types';\n\nconst mapStateToProps = (state: StoreState, ownProps: OwnProps) => ({\n editor: getVariablesState(ownProps.identifier.rootStateKey, state).editor,\n variable: getVariable(ownProps.identifier, state, false), // we could be renaming a variable and we don't want this to throw\n});\n\nconst mapDispatchToProps = (dispatch: ThunkDispatch) => {\n return {\n ...bindActionCreators(\n { variableEditorMount, variableEditorUnMount, changeVariableName, onEditorUpdate, updateOptions },\n dispatch\n ),\n changeVariableProp: (identifier: KeyedVariableIdentifier, propName: string, propValue: any) =>\n dispatch(\n toKeyedAction(\n identifier.rootStateKey,\n changeVariableProp(toVariablePayload(identifier, { propName, propValue }))\n )\n ),\n changeVariableType: (identifier: KeyedVariableIdentifier, newType: VariableType) =>\n dispatch(toKeyedAction(identifier.rootStateKey, changeVariableType(toVariablePayload(identifier, { newType })))),\n };\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport interface OwnProps {\n identifier: KeyedVariableIdentifier;\n}\n\ntype Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport class VariableEditorEditorUnConnected extends PureComponent<Props> {\n componentDidMount(): void {\n this.props.variableEditorMount(this.props.identifier);\n }\n\n componentDidUpdate(prevProps: Readonly<Props>, prevState: Readonly<{}>, snapshot?: any): void {\n if (!isEqual(prevProps.editor.errors, this.props.editor.errors)) {\n Object.values(this.props.editor.errors).forEach((error) => {\n appEvents.emit(AppEvents.alertWarning, ['Validation', error]);\n });\n }\n }\n\n componentWillUnmount(): void {\n this.props.variableEditorUnMount(this.props.identifier);\n }\n\n onNameChange = (event: FormEvent<HTMLInputElement>) => {\n event.preventDefault();\n this.props.changeVariableName(this.props.identifier, event.currentTarget.value);\n };\n\n onTypeChange = (option: SelectableValue<VariableType>) => {\n if (!option.value) {\n return;\n }\n this.props.changeVariableType(this.props.identifier, option.value);\n };\n\n onLabelChange = (event: FormEvent<HTMLInputElement>) => {\n event.preventDefault();\n this.props.changeVariableProp(this.props.identifier, 'label', event.currentTarget.value);\n };\n\n onDescriptionChange = (event: FormEvent<HTMLInputElement>) => {\n this.props.changeVariableProp(this.props.identifier, 'description', event.currentTarget.value);\n };\n\n onHideChange = (option: SelectableValue<VariableHide>) => {\n this.props.changeVariableProp(this.props.identifier, 'hide', option.value);\n };\n\n onPropChanged = async ({ propName, propValue, updateOptions = false }: OnPropChangeArguments) => {\n this.props.changeVariableProp(this.props.identifier, propName, propValue);\n if (updateOptions) {\n await this.props.updateOptions(toKeyedVariableIdentifier(this.props.variable));\n }\n };\n\n onHandleSubmit = async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!this.props.editor.isValid) {\n return;\n }\n\n await this.props.onEditorUpdate(this.props.identifier);\n };\n\n render() {\n const { variable } = this.props;\n const EditorToRender = variableAdapters.get(this.props.variable.type).editor;\n if (!EditorToRender) {\n return null;\n }\n const loading = variable.state === LoadingState.Loading;\n\n return (\n <div>\n <form aria-label=\"Variable editor Form\" onSubmit={this.onHandleSubmit}>\n <VerticalGroup spacing=\"lg\">\n <VerticalGroup spacing=\"none\">\n <VariableSectionHeader name=\"General\" />\n <InlineFieldRow>\n <VariableTextField\n value={this.props.editor.name}\n onChange={this.onNameChange}\n name=\"Name\"\n placeholder=\"name\"\n required\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalNameInputV2}\n />\n <VariableTypeSelect onChange={this.onTypeChange} type={this.props.variable.type} />\n </InlineFieldRow>\n\n {this.props.editor.errors.name && (\n <div className=\"gf-form\">\n <span className=\"gf-form-label gf-form-label--error\">{this.props.editor.errors.name}</span>\n </div>\n )}\n\n <InlineFieldRow>\n <VariableTextField\n value={this.props.variable.label ?? ''}\n onChange={this.onLabelChange}\n name=\"Label\"\n placeholder=\"optional display name\"\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalLabelInputV2}\n />\n <VariableHideSelect\n onChange={this.onHideChange}\n hide={this.props.variable.hide}\n type={this.props.variable.type}\n />\n </InlineFieldRow>\n\n <VariableTextField\n name=\"Description\"\n value={variable.description ?? ''}\n placeholder=\"descriptive text\"\n onChange={this.onDescriptionChange}\n grow\n />\n </VerticalGroup>\n\n {EditorToRender && <EditorToRender variable={this.props.variable} onPropChange={this.onPropChanged} />}\n\n {hasOptions(this.props.variable) ? <VariableValuesPreview variable={this.props.variable} /> : null}\n\n <VerticalGroup spacing=\"none\">\n <Button\n type=\"submit\"\n aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.submitButton}\n disabled={loading}\n >\n Update\n {loading ? (\n <Icon className=\"spin-clockwise\" name=\"sync\" size=\"sm\" style={{ marginLeft: '2px' }} />\n ) : null}\n </Button>\n </VerticalGroup>\n </VerticalGroup>\n </form>\n </div>\n );\n }\n}\n\nexport const VariableEditorEditor = connector(VariableEditorEditorUnConnected);\n","import React, { FC, useMemo } from 'react';\n\nimport { reportInteraction } from '@grafana/runtime';\nimport { IconButton } from '@grafana/ui';\n\nimport { NetworkGraphModal } from './NetworkGraphModal';\nimport { UsagesToNetwork } from './utils';\n\ninterface Props {\n id: string;\n usages: UsagesToNetwork[];\n isAdhoc: boolean;\n}\n\nexport const VariableUsagesButton: FC<Props> = ({ id, usages, isAdhoc }) => {\n const network = useMemo(() => usages.find((n) => n.variable.id === id), [usages, id]);\n if (usages.length === 0 || isAdhoc || !network) {\n return null;\n }\n\n const nodes = network.nodes.map((n) => {\n if (n.label.includes(`$${id}`)) {\n return { ...n, color: '#FB7E81' };\n }\n return n;\n });\n\n return (\n <NetworkGraphModal show={false} title={`Showing usages for: $${id}`} nodes={nodes} edges={network.edges}>\n {({ showModal }) => {\n return (\n <IconButton\n onClick={() => {\n reportInteraction('Show variable usages');\n showModal();\n }}\n name=\"code-branch\"\n title=\"Show usages\"\n />\n );\n }}\n </NetworkGraphModal>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { ReactElement } from 'react';\nimport { Draggable } from 'react-beautiful-dnd';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Button, Icon, IconButton, useStyles2, useTheme2 } from '@grafana/ui';\n\nimport { hasOptions, isAdHoc, isQuery } from '../guard';\nimport { VariableUsagesButton } from '../inspect/VariableUsagesButton';\nimport { getVariableUsages, UsagesToNetwork, VariableUsageTree } from '../inspect/utils';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { VariableModel } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nexport interface VariableEditorListRowProps {\n index: number;\n variable: VariableModel;\n usageTree: VariableUsageTree[];\n usagesNetwork: UsagesToNetwork[];\n onEdit: (identifier: KeyedVariableIdentifier) => void;\n onDuplicate: (identifier: KeyedVariableIdentifier) => void;\n onDelete: (identifier: KeyedVariableIdentifier) => void;\n}\n\nexport function VariableEditorListRow({\n index,\n variable,\n usageTree,\n usagesNetwork,\n onEdit: propsOnEdit,\n onDuplicate: propsOnDuplicate,\n onDelete: propsOnDelete,\n}: VariableEditorListRowProps): ReactElement {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n const definition = getDefinition(variable);\n const usages = getVariableUsages(variable.id, usageTree);\n const passed = usages > 0 || isAdHoc(variable);\n const identifier = toKeyedVariableIdentifier(variable);\n\n return (\n <Draggable draggableId={JSON.stringify(identifier)} index={index}>\n {(provided, snapshot) => (\n <tr\n ref={provided.innerRef}\n {...provided.draggableProps}\n style={{\n userSelect: snapshot.isDragging ? 'none' : 'auto',\n background: snapshot.isDragging ? theme.colors.background.secondary : undefined,\n ...provided.draggableProps.style,\n }}\n >\n <td className={styles.column}>\n <Button\n size=\"xs\"\n fill=\"text\"\n onClick={(event) => {\n event.preventDefault();\n propsOnEdit(identifier);\n }}\n className={styles.nameLink}\n aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowNameFields(variable.name)}\n >\n {variable.name}\n </Button>\n </td>\n <td\n className={styles.definitionColumn}\n onClick={(event) => {\n event.preventDefault();\n propsOnEdit(identifier);\n }}\n aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowDefinitionFields(variable.name)}\n >\n {definition}\n </td>\n\n <td className={styles.column}>\n <VariableCheckIndicator passed={passed} />\n </td>\n\n <td className={styles.column}>\n <VariableUsagesButton id={variable.id} isAdhoc={isAdHoc(variable)} usages={usagesNetwork} />\n </td>\n\n <td className={styles.column}>\n <IconButton\n onClick={(event) => {\n event.preventDefault();\n reportInteraction('Duplicate variable');\n propsOnDuplicate(identifier);\n }}\n name=\"copy\"\n title=\"Duplicate variable\"\n aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowDuplicateButtons(variable.name)}\n />\n </td>\n\n <td className={styles.column}>\n <IconButton\n onClick={(event) => {\n event.preventDefault();\n reportInteraction('Delete variable');\n propsOnDelete(identifier);\n }}\n name=\"trash-alt\"\n title=\"Remove variable\"\n aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowRemoveButtons(variable.name)}\n />\n </td>\n <td className={styles.column}>\n <div {...provided.dragHandleProps} className={styles.dragHandle}>\n <Icon name=\"draggabledots\" size=\"lg\" />\n </div>\n </td>\n </tr>\n )}\n </Draggable>\n );\n}\n\nfunction getDefinition(model: VariableModel): string {\n let definition = '';\n if (isQuery(model)) {\n if (model.definition) {\n definition = model.definition;\n } else if (typeof model.query === 'string') {\n definition = model.query;\n }\n } else if (hasOptions(model)) {\n definition = model.query;\n }\n\n return definition;\n}\n\ninterface VariableCheckIndicatorProps {\n passed: boolean;\n}\n\nfunction VariableCheckIndicator({ passed }: VariableCheckIndicatorProps): ReactElement {\n const styles = useStyles2(getStyles);\n if (passed) {\n return (\n <Icon\n name=\"check\"\n className={styles.iconPassed}\n title=\"This variable is referenced by other variables or dashboard.\"\n />\n );\n }\n\n return (\n <Icon\n name=\"exclamation-triangle\"\n className={styles.iconFailed}\n title=\"This variable is not referenced by any variable or dashboard.\"\n />\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n dragHandle: css`\n cursor: grab;\n `,\n column: css`\n width: 1%;\n `,\n nameLink: css`\n cursor: pointer;\n color: ${theme.colors.primary.text};\n `,\n definitionColumn: css`\n width: 100%;\n max-width: 200px;\n cursor: pointer;\n overflow: hidden;\n text-overflow: ellipsis;\n -o-text-overflow: ellipsis;\n white-space: nowrap;\n `,\n iconPassed: css`\n color: ${theme.v1.palette.greenBase};\n `,\n iconFailed: css`\n color: ${theme.v1.palette.orange};\n `,\n };\n}\n","import React, { ReactElement } from 'react';\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { reportInteraction } from '@grafana/runtime';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\n\nimport { UsagesToNetwork, VariableUsageTree } from '../inspect/utils';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { VariableModel } from '../types';\n\nimport { VariableEditorListRow } from './VariableEditorListRow';\n\nexport interface Props {\n variables: VariableModel[];\n usages: VariableUsageTree[];\n usagesNetwork: UsagesToNetwork[];\n onAdd: () => void;\n onEdit: (identifier: KeyedVariableIdentifier) => void;\n onChangeOrder: (identifier: KeyedVariableIdentifier, fromIndex: number, toIndex: number) => void;\n onDuplicate: (identifier: KeyedVariableIdentifier) => void;\n onDelete: (identifier: KeyedVariableIdentifier) => void;\n}\n\nexport function VariableEditorList({\n variables,\n usages,\n usagesNetwork,\n onChangeOrder,\n onAdd,\n onEdit,\n onDelete,\n onDuplicate,\n}: Props): ReactElement {\n const onDragEnd = (result: DropResult) => {\n if (!result.destination || !result.source) {\n return;\n }\n reportInteraction('Variable drag and drop');\n const identifier = JSON.parse(result.draggableId);\n onChangeOrder(identifier, result.source.index, result.destination.index);\n };\n\n return (\n <div>\n <div>\n {variables.length === 0 && <EmptyVariablesList onAdd={onAdd} />}\n\n {variables.length > 0 && (\n <div>\n <table\n className=\"filter-table filter-table--hover\"\n aria-label={selectors.pages.Dashboard.Settings.Variables.List.table}\n >\n <thead>\n <tr>\n <th>Variable</th>\n <th>Definition</th>\n <th colSpan={5} />\n </tr>\n </thead>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"variables-list\" direction=\"vertical\">\n {(provided) => (\n <tbody ref={provided.innerRef} {...provided.droppableProps}>\n {variables.map((variable, index) => (\n <VariableEditorListRow\n index={index}\n key={`${variable.name}-${index}`}\n variable={variable}\n usageTree={usages}\n usagesNetwork={usagesNetwork}\n onDelete={onDelete}\n onDuplicate={onDuplicate}\n onEdit={onEdit}\n />\n ))}\n {provided.placeholder}\n </tbody>\n )}\n </Droppable>\n </DragDropContext>\n </table>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction EmptyVariablesList({ onAdd }: { onAdd: () => void }): ReactElement {\n return (\n <div>\n <EmptyListCTA\n title=\"There are no variables yet\"\n buttonIcon=\"calculator-alt\"\n buttonTitle=\"Add variable\"\n infoBox={{\n __html: ` <p>\n Variables enable more interactive and dynamic dashboards. Instead of hard-coding things like server\n or sensor names in your metric queries you can use variables in their place. Variables are shown as\n list boxes at the top of the dashboard. These drop-down lists make it easy to change the data\n being displayed in your dashboard. Check out the\n <a class=\"external-link\" href=\"https://grafana.com/docs/grafana/latest/variables/\" target=\"_blank\">\n Templates and variables documentation\n </a>\n for more information.\n </p>`,\n }}\n infoBoxTitle=\"What do variables do?\"\n onClick={(event) => {\n event.preventDefault();\n onAdd();\n }}\n />\n </div>\n );\n}\n","import React, { MouseEvent, PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { bindActionCreators } from 'redux';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, Icon } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\n\nimport { StoreState, ThunkDispatch } from '../../../types';\nimport { VariablesDependenciesButton } from '../inspect/VariablesDependenciesButton';\nimport { VariablesUnknownTable } from '../inspect/VariablesUnknownTable';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getEditorVariables, getVariablesState } from '../state/selectors';\nimport { changeVariableOrder, duplicateVariable, removeVariable } from '../state/sharedReducer';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { toKeyedVariableIdentifier, toVariablePayload } from '../utils';\n\nimport { VariableEditorEditor } from './VariableEditorEditor';\nimport { VariableEditorList } from './VariableEditorList';\nimport { switchToEditMode, switchToListMode, switchToNewMode } from './actions';\n\nconst mapStateToProps = (state: StoreState, ownProps: OwnProps) => {\n const { uid } = ownProps.dashboard;\n const templatingState = getVariablesState(uid, state);\n return {\n variables: getEditorVariables(uid, state),\n idInEditor: templatingState.editor.id,\n usagesNetwork: templatingState.inspect.usagesNetwork,\n usages: templatingState.inspect.usages,\n };\n};\n\nconst mapDispatchToProps = (dispatch: ThunkDispatch) => {\n return {\n ...bindActionCreators({ switchToNewMode, switchToEditMode, switchToListMode }, dispatch),\n changeVariableOrder: (identifier: KeyedVariableIdentifier, fromIndex: number, toIndex: number) =>\n dispatch(\n toKeyedAction(\n identifier.rootStateKey,\n changeVariableOrder(toVariablePayload(identifier, { fromIndex, toIndex }))\n )\n ),\n duplicateVariable: (identifier: KeyedVariableIdentifier) =>\n dispatch(\n toKeyedAction(\n identifier.rootStateKey,\n duplicateVariable(toVariablePayload(identifier, { newId: undefined as unknown as string }))\n )\n ),\n removeVariable: (identifier: KeyedVariableIdentifier) => {\n dispatch(\n toKeyedAction(identifier.rootStateKey, removeVariable(toVariablePayload(identifier, { reIndex: true })))\n );\n },\n };\n};\n\ninterface OwnProps {\n dashboard: DashboardModel;\n}\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype Props = OwnProps & ConnectedProps<typeof connector>;\n\nclass VariableEditorContainerUnconnected extends PureComponent<Props> {\n componentDidMount(): void {\n this.props.switchToListMode(this.props.dashboard.uid);\n }\n\n onChangeToListMode = (event: MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n this.props.switchToListMode(this.props.dashboard.uid);\n };\n\n onEditVariable = (identifier: KeyedVariableIdentifier) => {\n this.props.switchToEditMode(identifier);\n };\n\n onNewVariable = () => {\n this.props.switchToNewMode(this.props.dashboard.uid);\n };\n\n onChangeVariableOrder = (identifier: KeyedVariableIdentifier, fromIndex: number, toIndex: number) => {\n this.props.changeVariableOrder(identifier, fromIndex, toIndex);\n };\n\n onDuplicateVariable = (identifier: KeyedVariableIdentifier) => {\n this.props.duplicateVariable(identifier);\n };\n\n onRemoveVariable = (identifier: KeyedVariableIdentifier) => {\n this.props.removeVariable(identifier);\n };\n\n render() {\n const variableToEdit = this.props.variables.find((s) => s.id === this.props.idInEditor) ?? null;\n\n return (\n <div>\n <div className=\"page-action-bar\">\n <h3 className=\"dashboard-settings__header\">\n <a\n onClick={this.onChangeToListMode}\n aria-label={selectors.pages.Dashboard.Settings.Variables.Edit.General.headerLink}\n >\n Variables\n </a>\n {this.props.idInEditor && (\n <span>\n <Icon name=\"angle-right\" />\n Edit\n </span>\n )}\n </h3>\n\n <div className=\"page-action-bar__spacer\" />\n {this.props.variables.length > 0 && variableToEdit === null && (\n <>\n <VariablesDependenciesButton variables={this.props.variables} />\n <Button\n type=\"button\"\n onClick={this.onNewVariable}\n aria-label={selectors.pages.Dashboard.Settings.Variables.List.newButton}\n >\n New\n </Button>\n </>\n )}\n </div>\n\n {!variableToEdit && (\n <VariableEditorList\n variables={this.props.variables}\n onAdd={this.onNewVariable}\n onEdit={this.onEditVariable}\n onChangeOrder={this.onChangeVariableOrder}\n onDuplicate={this.onDuplicateVariable}\n onDelete={this.onRemoveVariable}\n usages={this.props.usages}\n usagesNetwork={this.props.usagesNetwork}\n />\n )}\n {!variableToEdit && this.props.variables.length > 0 && (\n <VariablesUnknownTable variables={this.props.variables} dashboard={this.props.dashboard} />\n )}\n {variableToEdit && <VariableEditorEditor identifier={toKeyedVariableIdentifier(variableToEdit)} />}\n </div>\n );\n }\n}\n\nexport const VariableEditorContainer = connector(VariableEditorContainerUnconnected);\n","import React from 'react';\n\nimport { Permissions } from 'app/core/components/AccessControl';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction } from 'app/types';\n\nimport { DashboardModel } from '../../state';\n\ninterface Props {\n dashboard: DashboardModel;\n}\n\nexport const AccessControlDashboardPermissions = ({ dashboard }: Props) => {\n const canSetPermissions = contextSrv.hasPermission(AccessControlAction.DashboardsPermissionsWrite);\n\n return <Permissions resource={'dashboards'} resourceId={dashboard.uid} canSetPermissions={canSetPermissions} />;\n};\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { Tooltip, Icon, Button } from '@grafana/ui';\nimport { SlideDown } from 'app/core/components/Animations/SlideDown';\nimport AddPermission from 'app/core/components/PermissionList/AddPermission';\nimport PermissionList from 'app/core/components/PermissionList/PermissionList';\nimport PermissionsInfo from 'app/core/components/PermissionList/PermissionsInfo';\nimport { StoreState } from 'app/types';\nimport { DashboardAcl, PermissionLevel, NewDashboardAclItem } from 'app/types/acl';\n\nimport { checkFolderPermissions } from '../../../folders/state/actions';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport {\n getDashboardPermissions,\n addDashboardPermission,\n removeDashboardPermission,\n updateDashboardPermission,\n} from '../../state/actions';\n\nconst mapStateToProps = (state: StoreState) => ({\n permissions: state.dashboard.permissions,\n canViewFolderPermissions: state.folder.canViewFolderPermissions,\n});\n\nconst mapDispatchToProps = {\n getDashboardPermissions,\n addDashboardPermission,\n removeDashboardPermission,\n updateDashboardPermission,\n checkFolderPermissions,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport interface OwnProps {\n dashboard: DashboardModel;\n}\n\nexport type Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport interface State {\n isAdding: boolean;\n}\n\nexport class DashboardPermissionsUnconnected extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n isAdding: false,\n };\n }\n\n componentDidMount() {\n this.props.getDashboardPermissions(this.props.dashboard.id);\n if (this.props.dashboard.meta.folderUid) {\n this.props.checkFolderPermissions(this.props.dashboard.meta.folderUid);\n }\n }\n\n onOpenAddPermissions = () => {\n this.setState({ isAdding: true });\n };\n\n onRemoveItem = (item: DashboardAcl) => {\n this.props.removeDashboardPermission(this.props.dashboard.id, item);\n };\n\n onPermissionChanged = (item: DashboardAcl, level: PermissionLevel) => {\n this.props.updateDashboardPermission(this.props.dashboard.id, item, level);\n };\n\n onAddPermission = (newItem: NewDashboardAclItem) => {\n return this.props.addDashboardPermission(this.props.dashboard.id, newItem);\n };\n\n onCancelAddPermission = () => {\n this.setState({ isAdding: false });\n };\n\n getFolder() {\n const { dashboard, canViewFolderPermissions } = this.props;\n\n return {\n id: dashboard.meta.folderId,\n title: dashboard.meta.folderTitle,\n url: dashboard.meta.folderUrl,\n canViewFolderPermissions,\n };\n }\n\n render() {\n const {\n permissions,\n dashboard: {\n meta: { hasUnsavedFolderChange },\n },\n } = this.props;\n const { isAdding } = this.state;\n\n return hasUnsavedFolderChange ? (\n <h5>You have changed a folder, please save to view permissions.</h5>\n ) : (\n <div>\n <div className=\"page-action-bar\">\n <h3 className=\"page-sub-heading\">Permissions</h3>\n <Tooltip placement=\"auto\" content={<PermissionsInfo />}>\n <Icon className=\"icon--has-hover page-sub-heading-icon\" name=\"question-circle\" />\n </Tooltip>\n <div className=\"page-action-bar__spacer\" />\n <Button className=\"pull-right\" onClick={this.onOpenAddPermissions} disabled={isAdding}>\n Add permission\n </Button>\n </div>\n <SlideDown in={isAdding}>\n <AddPermission onAddPermission={this.onAddPermission} onCancel={this.onCancelAddPermission} />\n </SlideDown>\n <PermissionList\n items={permissions}\n onRemoveItem={this.onRemoveItem}\n onPermissionChanged={this.onPermissionChanged}\n isFetching={false}\n folderInfo={this.getFolder()}\n />\n </div>\n );\n }\n}\n\nexport const DashboardPermissions = connector(DashboardPermissionsUnconnected);\n","import React, { PureComponent } from 'react';\n\nimport {\n SelectableValue,\n getFieldDisplayName,\n AnnotationEvent,\n AnnotationEventMappings,\n AnnotationEventFieldMapping,\n formattedValueToString,\n AnnotationEventFieldSource,\n getValueFormat,\n} from '@grafana/data';\nimport { Select, Tooltip, Icon } from '@grafana/ui';\n\nimport { annotationEventNames, AnnotationFieldInfo } from '../standardAnnotationSupport';\nimport { AnnotationQueryResponse } from '../types';\n\n// const valueOptions: Array<SelectableValue<AnnotationEventFieldSource>> = [\n// { value: AnnotationEventFieldSource.Field, label: 'Field', description: 'Set the field value from a response field' },\n// { value: AnnotationEventFieldSource.Text, label: 'Text', description: 'Enter direct text for the value' },\n// { value: AnnotationEventFieldSource.Skip, label: 'Skip', description: 'Hide this field' },\n// ];\n\ninterface Props {\n response?: AnnotationQueryResponse;\n\n mappings?: AnnotationEventMappings;\n\n change: (mappings?: AnnotationEventMappings) => void;\n}\n\ninterface State {\n fieldNames: Array<SelectableValue<string>>;\n}\n\nexport class AnnotationFieldMapper extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n fieldNames: [],\n };\n }\n\n updateFields = () => {\n const frame = this.props.response?.panelData?.series[0];\n if (frame && frame.fields) {\n const fieldNames = frame.fields.map((f) => {\n const name = getFieldDisplayName(f, frame);\n\n let description = '';\n for (let i = 0; i < frame.length; i++) {\n if (i > 0) {\n description += ', ';\n }\n if (i > 2) {\n description += '...';\n break;\n }\n description += f.values.get(i);\n }\n\n if (description.length > 50) {\n description = description.substring(0, 50) + '...';\n }\n\n return {\n label: `${name} (${f.type})`,\n value: name,\n description,\n };\n });\n this.setState({ fieldNames });\n }\n };\n\n componentDidMount() {\n this.updateFields();\n }\n\n componentDidUpdate(oldProps: Props) {\n if (oldProps.response !== this.props.response) {\n this.updateFields();\n }\n }\n\n onFieldSourceChange = (k: keyof AnnotationEvent, v: SelectableValue<AnnotationEventFieldSource>) => {\n const mappings = this.props.mappings || {};\n const mapping = mappings[k] || {};\n\n this.props.change({\n ...mappings,\n [k]: {\n ...mapping,\n source: v.value || AnnotationEventFieldSource.Field,\n },\n });\n };\n\n onFieldNameChange = (k: keyof AnnotationEvent, v: SelectableValue<string>) => {\n const mappings = this.props.mappings || {};\n const mapping = mappings[k] || {};\n\n this.props.change({\n ...mappings,\n [k]: {\n ...mapping,\n value: v.value,\n source: AnnotationEventFieldSource.Field,\n },\n });\n };\n\n renderRow(row: AnnotationFieldInfo, mapping: AnnotationEventFieldMapping, first?: AnnotationEvent) {\n const { fieldNames } = this.state;\n\n let picker = fieldNames;\n const current = mapping.value;\n let currentValue = fieldNames.find((f) => current === f.value);\n if (current) {\n picker = [...fieldNames];\n if (!currentValue) {\n picker.push({\n label: current,\n value: current,\n });\n }\n }\n\n let value = first ? first[row.key] : '';\n if (value && row.key.startsWith('time')) {\n const fmt = getValueFormat('dateTimeAsIso');\n value = formattedValueToString(fmt(value as number));\n }\n if (value === null || value === undefined) {\n value = ''; // empty string\n }\n\n return (\n <tr key={row.key}>\n <td>\n {row.key}{' '}\n {row.help && (\n <Tooltip content={row.help}>\n <Icon name=\"info-circle\" />\n </Tooltip>\n )}\n </td>\n {/* <td>\n <Select\n\n value={valueOptions.find(v => v.value === mapping.source) || valueOptions[0]}\n options={valueOptions}\n onChange={(v: SelectableValue<AnnotationEventFieldSource>) => {\n this.onFieldSourceChange(row.key, v);\n }}\n />\n </td> */}\n <td>\n <Select\n value={currentValue}\n options={picker}\n placeholder={row.placeholder || row.key}\n onChange={(v: SelectableValue<string>) => {\n this.onFieldNameChange(row.key, v);\n }}\n noOptionsMessage=\"Unknown field names\"\n allowCustomValue={true}\n />\n </td>\n <td>{`${value}`}</td>\n </tr>\n );\n }\n\n render() {\n const first = this.props.response?.events?.[0];\n const mappings = this.props.mappings || {};\n\n return (\n <table className=\"filter-table\">\n <thead>\n <tr>\n <th>Annotation</th>\n <th>From</th>\n <th>First Value</th>\n </tr>\n </thead>\n <tbody>\n {annotationEventNames.map((row) => {\n return this.renderRow(row, mappings[row.key] || {}, first);\n })}\n </tbody>\n </table>\n );\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { lastValueFrom } from 'rxjs';\n\nimport { AnnotationEventMappings, AnnotationQuery, DataQuery, DataSourceApi, LoadingState } from '@grafana/data';\nimport { Button, Icon, IconName, Spinner } from '@grafana/ui';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { PanelModel } from 'app/features/dashboard/state';\n\nimport { executeAnnotationQuery } from '../executeAnnotationQuery';\nimport { shouldUseLegacyRunner, shouldUseMappingUI, standardAnnotationSupport } from '../standardAnnotationSupport';\nimport { AnnotationQueryResponse } from '../types';\n\nimport { AnnotationFieldMapper } from './AnnotationResultMapper';\n\ninterface Props {\n datasource: DataSourceApi;\n annotation: AnnotationQuery<DataQuery>;\n onChange: (annotation: AnnotationQuery<DataQuery>) => void;\n}\n\ninterface State {\n running?: boolean;\n response?: AnnotationQueryResponse;\n}\n\nexport default class StandardAnnotationQueryEditor extends PureComponent<Props, State> {\n state = {} as State;\n\n componentDidMount() {\n this.verifyDataSource();\n }\n\n componentDidUpdate(oldProps: Props) {\n if (this.props.annotation !== oldProps.annotation && !shouldUseLegacyRunner(this.props.datasource)) {\n this.verifyDataSource();\n }\n }\n\n verifyDataSource() {\n const { datasource, annotation } = this.props;\n\n // Handle any migration issues\n const processor = {\n ...standardAnnotationSupport,\n ...datasource.annotations,\n };\n\n const fixed = processor.prepareAnnotation!(annotation);\n if (fixed !== annotation) {\n this.props.onChange(fixed);\n } else {\n this.onRunQuery();\n }\n }\n\n onRunQuery = async () => {\n const { datasource, annotation } = this.props;\n if (shouldUseLegacyRunner(datasource)) {\n // In the new UI the running of query is done so the data can be mapped. In the legacy annotations this does\n // not exist as the annotationQuery already returns annotation events which cannot be mapped. This means that\n // right now running a query for data source with legacy runner does not make much sense.\n return;\n }\n\n const dashboard = getDashboardSrv().getCurrent();\n if (!dashboard) {\n return;\n }\n\n this.setState({\n running: true,\n });\n const response = await lastValueFrom(\n executeAnnotationQuery(\n {\n range: getTimeSrv().timeRange(),\n panel: new PanelModel({}),\n dashboard,\n },\n datasource,\n annotation\n )\n );\n this.setState({\n running: false,\n response,\n });\n };\n\n onQueryChange = (target: DataQuery) => {\n this.props.onChange({\n ...this.props.annotation,\n target,\n });\n };\n\n onMappingChange = (mappings?: AnnotationEventMappings) => {\n this.props.onChange({\n ...this.props.annotation,\n mappings,\n });\n };\n\n renderStatus() {\n const { response, running } = this.state;\n let rowStyle = 'alert-info';\n let text = '...';\n let icon: IconName | undefined = undefined;\n\n if (running || response?.panelData?.state === LoadingState.Loading || !response) {\n text = 'loading...';\n } else {\n const { events, panelData } = response;\n\n if (panelData?.error) {\n rowStyle = 'alert-error';\n icon = 'exclamation-triangle';\n text = panelData.error.message ?? 'error';\n } else if (!events?.length) {\n rowStyle = 'alert-warning';\n icon = 'exclamation-triangle';\n text = 'No events found';\n } else {\n const frame = panelData?.series[0];\n\n text = `${events.length} events (from ${frame?.fields.length} fields)`;\n }\n }\n return (\n <div\n className={cx(\n rowStyle,\n css`\n margin: 4px 0px;\n padding: 4px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n `\n )}\n >\n <div>\n {icon && (\n <>\n <Icon name={icon} />\n \n </>\n )}\n {text}\n </div>\n <div>\n {running ? (\n <Spinner />\n ) : (\n <Button variant=\"secondary\" size=\"xs\" onClick={this.onRunQuery}>\n TEST\n </Button>\n )}\n </div>\n </div>\n );\n }\n\n onAnnotationChange = (annotation: AnnotationQuery) => {\n this.props.onChange(annotation);\n };\n\n render() {\n const { datasource, annotation } = this.props;\n const { response } = this.state;\n\n // Find the annotation runner\n let QueryEditor = datasource.annotations?.QueryEditor || datasource.components?.QueryEditor;\n if (!QueryEditor) {\n return <div>Annotations are not supported. This datasource needs to export a QueryEditor</div>;\n }\n\n const query = annotation.target ?? { refId: 'Anno' };\n return (\n <>\n <QueryEditor\n key={datasource?.name}\n query={query}\n datasource={datasource}\n onChange={this.onQueryChange}\n onRunQuery={this.onRunQuery}\n data={response?.panelData}\n range={getTimeSrv().timeRange()}\n annotation={annotation}\n onAnnotationChange={this.onAnnotationChange}\n />\n {shouldUseMappingUI(datasource) && (\n <>\n {this.renderStatus()}\n <AnnotationFieldMapper response={response} mappings={annotation.mappings} change={this.onMappingChange} />\n </>\n )}\n </>\n );\n }\n}\n","import React from 'react';\n\nimport { AnnotationQuery, DataSourceApi } from '@grafana/data';\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\n\nexport interface Props {\n annotation: AnnotationQuery;\n datasource: DataSourceApi;\n onChange: (annotation: AnnotationQuery) => void;\n}\n\ninterface ScopeProps {\n ctrl: {\n currentDatasource: DataSourceApi;\n currentAnnotation: AnnotationQuery;\n ignoreNextWatcherFiring: boolean;\n };\n}\n\nexport class AngularEditorLoader extends React.PureComponent<Props> {\n ref: HTMLDivElement | null = null;\n angularComponent?: AngularComponent;\n scopeProps?: ScopeProps;\n\n componentWillUnmount() {\n if (this.angularComponent) {\n this.angularComponent.destroy();\n }\n }\n\n componentDidMount() {\n if (this.ref) {\n this.loadAngular();\n }\n }\n\n componentDidUpdate(prevProps: Props) {\n if (prevProps.datasource !== this.props.datasource) {\n this.loadAngular();\n }\n\n if (this.scopeProps && this.scopeProps.ctrl.currentAnnotation !== this.props.annotation) {\n this.scopeProps.ctrl.ignoreNextWatcherFiring = true;\n this.scopeProps.ctrl.currentAnnotation = this.props.annotation;\n this.angularComponent?.digest();\n }\n }\n\n loadAngular() {\n if (this.angularComponent) {\n this.angularComponent.destroy();\n this.scopeProps = undefined;\n }\n\n const loader = getAngularLoader();\n // NOTE: BE CAREFUL HERE\n // If this template contains an ng-if, then it won't be removed correctly by AngularLoader.\n // The compiledElem will only contain the single comment node (e.g. <!-- ngIf !ctrl.currentDatasource.annotations -->)\n const template = `<plugin-component type=\"annotations-query-ctrl\"> </plugin-component>`;\n const scopeProps = {\n ctrl: {\n currentDatasource: this.props.datasource,\n currentAnnotation: this.props.annotation,\n ignoreNextWatcherFiring: false,\n },\n };\n\n this.angularComponent = loader.load(this.ref, scopeProps, template);\n this.angularComponent.digest();\n this.angularComponent.getScope().$watch(() => {\n // To avoid recursive loop when the annotation is updated from outside angular in componentDidUpdate\n if (scopeProps.ctrl.ignoreNextWatcherFiring) {\n scopeProps.ctrl.ignoreNextWatcherFiring = false;\n return;\n }\n\n this.props.onChange(scopeProps.ctrl.currentAnnotation);\n });\n\n this.scopeProps = scopeProps;\n }\n\n render() {\n return <div ref={(element) => (this.ref = element)} />;\n }\n}\n","import React, { useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { AnnotationQuery, DataSourceInstanceSettings, getDataSourceRef } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { DataSourcePicker, getDataSourceSrv } from '@grafana/runtime';\nimport { Checkbox, CollapsableSection, Field, HorizontalGroup, Input } from '@grafana/ui';\nimport { ColorValueEditor } from 'app/core/components/OptionsUI/color';\nimport StandardAnnotationQueryEditor from 'app/features/annotations/components/StandardAnnotationQueryEditor';\n\nimport { DashboardModel } from '../../state/DashboardModel';\n\nimport { AngularEditorLoader } from './AngularEditorLoader';\n\ntype Props = {\n editIdx: number;\n dashboard: DashboardModel;\n};\n\nexport const newAnnotationName = 'New annotation';\n\nexport const AnnotationSettingsEdit: React.FC<Props> = ({ editIdx, dashboard }) => {\n const [annotation, setAnnotation] = useState(dashboard.annotations.list[editIdx]);\n\n const { value: ds } = useAsync(() => {\n return getDataSourceSrv().get(annotation.datasource);\n }, [annotation.datasource]);\n\n const onUpdate = (annotation: AnnotationQuery) => {\n const list = [...dashboard.annotations.list];\n list.splice(editIdx, 1, annotation);\n setAnnotation(annotation);\n dashboard.annotations.list = list;\n };\n\n const onNameChange = (ev: React.FocusEvent<HTMLInputElement>) => {\n onUpdate({\n ...annotation,\n name: ev.currentTarget.value,\n });\n };\n\n const onDataSourceChange = (ds: DataSourceInstanceSettings) => {\n onUpdate({\n ...annotation,\n datasource: getDataSourceRef(ds),\n });\n };\n\n const onChange = (ev: React.FocusEvent<HTMLInputElement>) => {\n const target = ev.currentTarget;\n onUpdate({\n ...annotation,\n [target.name]: target.type === 'checkbox' ? target.checked : target.value,\n });\n };\n\n const onColorChange = (color: string) => {\n onUpdate({\n ...annotation,\n iconColor: color,\n });\n };\n\n const isNewAnnotation = annotation.name === newAnnotationName;\n\n return (\n <div>\n <Field label=\"Name\">\n <Input\n aria-label={selectors.pages.Dashboard.Settings.Annotations.Settings.name}\n name=\"name\"\n id=\"name\"\n autoFocus={isNewAnnotation}\n value={annotation.name}\n onChange={onNameChange}\n width={50}\n />\n </Field>\n <Field label=\"Data source\" htmlFor=\"data-source-picker\">\n <DataSourcePicker\n width={50}\n annotations\n variables\n current={annotation.datasource}\n onChange={onDataSourceChange}\n />\n </Field>\n <Field label=\"Enabled\" description=\"When enabled the annotation query is issued every dashboard refresh\">\n <Checkbox name=\"enable\" id=\"enable\" value={annotation.enable} onChange={onChange} />\n </Field>\n <Field\n label=\"Hidden\"\n description=\"Annotation queries can be toggled on or off at the top of the dashboard. With this option checked this toggle will be hidden.\"\n >\n <Checkbox name=\"hide\" id=\"hide\" value={annotation.hide} onChange={onChange} />\n </Field>\n <Field label=\"Color\" description=\"Color to use for the annotation event markers\">\n <HorizontalGroup>\n <ColorValueEditor value={annotation?.iconColor} onChange={onColorChange} />\n </HorizontalGroup>\n </Field>\n <CollapsableSection isOpen={true} label=\"Query\">\n {ds?.annotations && (\n <StandardAnnotationQueryEditor datasource={ds} annotation={annotation} onChange={onUpdate} />\n )}\n {ds && !ds.annotations && <AngularEditorLoader datasource={ds} annotation={annotation} onChange={onUpdate} />}\n </CollapsableSection>\n </div>\n );\n};\n\nAnnotationSettingsEdit.displayName = 'AnnotationSettingsEdit';\n","import { css } from '@emotion/css';\nimport React, { ButtonHTMLAttributes } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Button, useStyles } from '@grafana/ui';\n\nexport interface Props extends ButtonHTMLAttributes<HTMLButtonElement> {}\n\nexport const ListNewButton: React.FC<Props> = ({ children, ...restProps }) => {\n const styles = useStyles(getStyles);\n return (\n <div className={styles.buttonWrapper}>\n <Button icon=\"plus\" variant=\"secondary\" {...restProps}>\n {children}\n </Button>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n buttonWrapper: css`\n padding: ${theme.spacing.lg} 0;\n `,\n});\n","import React, { useState } from 'react';\n\nimport { arrayUtils } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DeleteButton, Icon, IconButton, VerticalGroup } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\n\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { ListNewButton } from '../DashboardSettings/ListNewButton';\n\ntype Props = {\n dashboard: DashboardModel;\n onNew: () => void;\n onEdit: (idx: number) => void;\n};\n\nexport const AnnotationSettingsList: React.FC<Props> = ({ dashboard, onNew, onEdit }) => {\n const [annotations, updateAnnotations] = useState(dashboard.annotations.list);\n\n const onMove = (idx: number, direction: number) => {\n dashboard.annotations.list = arrayUtils.moveItemImmutably(annotations, idx, idx + direction);\n updateAnnotations(dashboard.annotations.list);\n };\n\n const onDelete = (idx: number) => {\n dashboard.annotations.list = [...annotations.slice(0, idx), ...annotations.slice(idx + 1)];\n updateAnnotations(dashboard.annotations.list);\n };\n\n const showEmptyListCTA = annotations.length === 0 || (annotations.length === 1 && annotations[0].builtIn);\n\n const dataSourceSrv = getDataSourceSrv();\n return (\n <VerticalGroup>\n {annotations.length > 0 && (\n <table className=\"filter-table filter-table--hover\">\n <thead>\n <tr>\n <th>Query name</th>\n <th>Data source</th>\n <th colSpan={3}></th>\n </tr>\n </thead>\n <tbody>\n {dashboard.annotations.list.map((annotation, idx) => (\n <tr key={`${annotation.name}-${idx}`}>\n {annotation.builtIn ? (\n <td style={{ width: '90%' }} className=\"pointer\" onClick={() => onEdit(idx)}>\n <Icon name=\"comment-alt\" /> <em className=\"muted\">{annotation.name} (Built-in)</em>\n </td>\n ) : (\n <td className=\"pointer\" onClick={() => onEdit(idx)}>\n <Icon name=\"comment-alt\" /> {annotation.name}\n </td>\n )}\n <td className=\"pointer\" onClick={() => onEdit(idx)}>\n {dataSourceSrv.getInstanceSettings(annotation.datasource)?.name || annotation.datasource?.uid}\n </td>\n <td style={{ width: '1%' }}>\n {idx !== 0 && <IconButton name=\"arrow-up\" aria-label=\"arrow-up\" onClick={() => onMove(idx, -1)} />}\n </td>\n <td style={{ width: '1%' }}>\n {dashboard.annotations.list.length > 1 && idx !== dashboard.annotations.list.length - 1 ? (\n <IconButton name=\"arrow-down\" aria-label=\"arrow-down\" onClick={() => onMove(idx, 1)} />\n ) : null}\n </td>\n <td style={{ width: '1%' }}>\n <DeleteButton\n size=\"sm\"\n onConfirm={() => onDelete(idx)}\n aria-label={`Delete query with title \"${annotation.name}\"`}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n {showEmptyListCTA && (\n <EmptyListCTA\n onClick={onNew}\n title=\"There are no custom annotation queries added yet\"\n buttonIcon=\"comment-alt\"\n buttonTitle=\"Add annotation query\"\n infoBoxTitle=\"What are annotation queries?\"\n infoBox={{\n __html: `<p>Annotations provide a way to integrate event data into your graphs. They are visualized as vertical lines\n and icons on all graph panels. When you hover over an annotation icon you can get event text & tags for\n the event. You can add annotation events directly from grafana by holding CTRL or CMD + click on graph (or\n drag region). These will be stored in Grafana's annotation database.\n </p>\n Checkout the\n <a class='external-link' target='_blank' href='http://docs.grafana.org/reference/annotations/'\n >Annotations documentation</a\n >\n for more information.`,\n }}\n />\n )}\n {!showEmptyListCTA && <ListNewButton onClick={onNew}>New query</ListNewButton>}\n </VerticalGroup>\n );\n};\n","import React from 'react';\n\nimport { Icon, HorizontalGroup } from '@grafana/ui';\n\ntype Props = {\n title: string;\n onGoBack: () => void;\n isEditing: boolean;\n};\n\nexport const DashboardSettingsHeader: React.FC<Props> = ({ onGoBack, isEditing, title }) => {\n return (\n <div className=\"dashboard-settings__header\">\n <HorizontalGroup align=\"center\" justify=\"space-between\">\n <h3>\n <span onClick={onGoBack} className={isEditing ? 'pointer' : ''}>\n {title}\n </span>\n {isEditing && (\n <span>\n <Icon name=\"angle-right\" /> Edit\n </span>\n )}\n </h3>\n </HorizontalGroup>\n </div>\n );\n};\n","import React, { useState } from 'react';\n\nimport { AnnotationQuery, getDataSourceRef } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { AnnotationSettingsEdit, AnnotationSettingsList, newAnnotationName } from '../AnnotationSettings';\n\nimport { DashboardSettingsHeader } from './DashboardSettingsHeader';\n\ninterface Props {\n dashboard: DashboardModel;\n}\n\nexport const AnnotationsSettings: React.FC<Props> = ({ dashboard }) => {\n const [editIdx, setEditIdx] = useState<number | null>(null);\n\n const onGoBack = () => {\n setEditIdx(null);\n };\n\n const onNew = () => {\n const newAnnotation: AnnotationQuery = {\n name: newAnnotationName,\n enable: true,\n datasource: getDataSourceRef(getDataSourceSrv().getInstanceSettings(null)!),\n iconColor: 'red',\n };\n\n dashboard.annotations.list = [...dashboard.annotations.list, { ...newAnnotation }];\n setEditIdx(dashboard.annotations.list.length - 1);\n };\n\n const onEdit = (idx: number) => {\n setEditIdx(idx);\n };\n\n const isEditing = editIdx !== null;\n\n return (\n <>\n <DashboardSettingsHeader title=\"Annotations\" onGoBack={onGoBack} isEditing={isEditing} />\n {!isEditing && <AnnotationSettingsList dashboard={dashboard} onNew={onNew} onEdit={onEdit} />}\n {isEditing && <AnnotationSettingsEdit dashboard={dashboard} editIdx={editIdx!} />}\n </>\n );\n};\n","import { css } from '@emotion/css';\nimport { sumBy } from 'lodash';\nimport React from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\n\nimport { Modal, ConfirmModal, Button } from '@grafana/ui';\nimport { config } from 'app/core/config';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { cleanUpDashboardAndVariables } from 'app/features/dashboard/state/actions';\n\nimport { useDashboardDelete } from './useDashboardDelete';\n\ntype DeleteDashboardModalProps = {\n hideModal(): void;\n dashboard: DashboardModel;\n};\n\nconst mapDispatchToProps = {\n cleanUpDashboardAndVariables,\n};\n\nconst connector = connect(null, mapDispatchToProps);\n\ntype Props = DeleteDashboardModalProps & ConnectedProps<typeof connector>;\n\nconst DeleteDashboardModalUnconnected: React.FC<Props> = ({ hideModal, cleanUpDashboardAndVariables, dashboard }) => {\n const isProvisioned = dashboard.meta.provisioned;\n const { onDeleteDashboard } = useDashboardDelete(dashboard.uid, cleanUpDashboardAndVariables);\n\n const [, onConfirm] = useAsyncFn(async () => {\n await onDeleteDashboard();\n hideModal();\n }, [hideModal]);\n\n const modalBody = getModalBody(dashboard.panels, dashboard.title);\n\n if (isProvisioned) {\n return <ProvisionedDeleteModal hideModal={hideModal} provisionedId={dashboard.meta.provisionedExternalId!} />;\n }\n\n return (\n <ConfirmModal\n isOpen={true}\n body={modalBody}\n onConfirm={onConfirm}\n onDismiss={hideModal}\n title=\"Delete\"\n icon=\"trash-alt\"\n confirmText=\"Delete\"\n />\n );\n};\n\nconst getModalBody = (panels: PanelModel[], title: string) => {\n const totalAlerts = sumBy(panels, (panel) => (panel.alert ? 1 : 0));\n return totalAlerts > 0 && !config.unifiedAlertingEnabled ? (\n <>\n <p>Do you want to delete this dashboard?</p>\n <p>\n This dashboard contains {totalAlerts} alert{totalAlerts > 1 ? 's' : ''}. Deleting this dashboard also deletes\n those alerts.\n </p>\n </>\n ) : (\n <>\n <p>Do you want to delete this dashboard?</p>\n <p>{title}</p>\n </>\n );\n};\n\nconst ProvisionedDeleteModal = ({ hideModal, provisionedId }: { hideModal(): void; provisionedId: string }) => (\n <Modal\n isOpen={true}\n title=\"Cannot delete provisioned dashboard\"\n icon=\"trash-alt\"\n onDismiss={hideModal}\n className={css`\n width: 500px;\n `}\n >\n <p>\n This dashboard is managed by Grafana provisioning and cannot be deleted. Remove the dashboard from the config file\n to delete it.\n </p>\n <p>\n <i>\n See{' '}\n <a\n className=\"external-link\"\n href=\"https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n documentation\n </a>{' '}\n for more information about provisioning.\n </i>\n <br />\n File path: {provisionedId}\n </p>\n <Modal.ButtonRow>\n <Button variant=\"primary\" onClick={hideModal}>\n OK\n </Button>\n </Modal.ButtonRow>\n </Modal>\n);\n\nexport const DeleteDashboardModal = connector(DeleteDashboardModalUnconnected);\n","import { useEffect } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { locationService } from '@grafana/runtime';\nimport { useAppNotification } from 'app/core/copy/appNotification';\nimport { deleteDashboard } from 'app/features/manage-dashboards/state/actions';\n\nexport const useDashboardDelete = (uid: string, cleanUpDashboardAndVariables: () => void) => {\n const [state, onDeleteDashboard] = useAsyncFn(() => deleteDashboard(uid, false), []);\n const notifyApp = useAppNotification();\n\n useEffect(() => {\n if (state.value) {\n cleanUpDashboardAndVariables();\n locationService.replace('/');\n notifyApp.success('Dashboard Deleted', `${state.value.title} has been deleted`);\n }\n }, [state, notifyApp, cleanUpDashboardAndVariables]);\n\n return { state, onDeleteDashboard };\n};\n","import React from 'react';\n\nimport { Button, ModalsController } from '@grafana/ui';\n\nimport { DashboardModel } from '../../state';\n\nimport { DeleteDashboardModal } from './DeleteDashboardModal';\n\ntype Props = {\n dashboard: DashboardModel;\n};\n\nexport const DeleteDashboardButton = ({ dashboard }: Props) => (\n <ModalsController>\n {({ showModal, hideModal }) => (\n <Button\n variant=\"destructive\"\n onClick={() => {\n showModal(DeleteDashboardModal, {\n dashboard,\n hideModal,\n });\n }}\n aria-label=\"Dashboard settings page delete dashboard button\"\n >\n Delete Dashboard\n </Button>\n )}\n </ModalsController>\n);\n","import React, { PureComponent } from 'react';\n\nimport { Button, CollapsableSection, FileUpload } from '@grafana/ui';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { getThumbnailURL } from 'app/features/search/components/SearchCard';\n\ninterface Props {\n uid: string;\n}\n\ninterface State {}\n\nexport class PreviewSettings extends PureComponent<Props, State> {\n state: State = {};\n\n doUpload = (evt: EventTarget & HTMLInputElement, isLight?: boolean) => {\n const file = evt?.files && evt.files[0];\n if (!file) {\n console.log('NOPE!', evt);\n return;\n }\n\n const url = getThumbnailURL(this.props.uid, isLight);\n const formData = new FormData();\n formData.append('file', file);\n\n fetch(url, {\n method: 'POST',\n body: formData,\n })\n .then((response) => response.json())\n .then((result) => {\n console.log('Success:', result);\n location.reload(); //HACK\n })\n .catch((error) => {\n console.error('Error:', error);\n });\n };\n\n markAsStale = (isLight: boolean) => async () => {\n return getBackendSrv().put(getThumbnailURL(this.props.uid, isLight), { state: 'stale' });\n };\n\n render() {\n const { uid } = this.props;\n const imgstyle = { maxWidth: 300, maxHeight: 300 };\n return (\n <CollapsableSection label=\"Preview settings\" isOpen={true}>\n <div>DUMMY UI just so we have an upload button!</div>\n <table cellSpacing=\"4\">\n <thead>\n <tr>\n <td>[DARK]</td>\n <td>[LIGHT]</td>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <Button type=\"button\" variant=\"primary\" onClick={this.markAsStale(false)} fill=\"outline\">\n Mark as stale\n </Button>\n </td>\n <td>\n <Button type=\"button\" variant=\"primary\" onClick={this.markAsStale(true)} fill=\"outline\">\n Mark as stale\n </Button>\n </td>\n </tr>\n <tr>\n <td>\n <img src={getThumbnailURL(uid, false)} style={imgstyle} />\n </td>\n <td>\n <img src={getThumbnailURL(uid, true)} style={imgstyle} />\n </td>\n </tr>\n <tr>\n <td>\n <FileUpload\n accept=\"image/png, image/webp\"\n onFileUpload={({ currentTarget }) => this.doUpload(currentTarget, false)}\n >\n Upload dark\n </FileUpload>\n </td>\n <td>\n <FileUpload\n accept=\"image/png, image/webp\"\n onFileUpload={({ currentTarget }) => this.doUpload(currentTarget, true)}\n >\n Upload light\n </FileUpload>\n </td>\n </tr>\n </tbody>\n </table>\n </CollapsableSection>\n );\n }\n}\n","import React, { useState } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { TimeZone } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { config } from '@grafana/runtime';\nimport { CollapsableSection, Field, Input, RadioButtonGroup, TagsInput } from '@grafana/ui';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { updateTimeZoneDashboard, updateWeekStartDashboard } from 'app/features/dashboard/state/actions';\n\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { DeleteDashboardButton } from '../DeleteDashboard/DeleteDashboardButton';\n\nimport { PreviewSettings } from './PreviewSettings';\nimport { TimePickerSettings } from './TimePickerSettings';\n\ninterface OwnProps {\n dashboard: DashboardModel;\n}\n\nexport type Props = OwnProps & ConnectedProps<typeof connector>;\n\nconst GRAPH_TOOLTIP_OPTIONS = [\n { value: 0, label: 'Default' },\n { value: 1, label: 'Shared crosshair' },\n { value: 2, label: 'Shared Tooltip' },\n];\n\nexport function GeneralSettingsUnconnected({ dashboard, updateTimeZone, updateWeekStart }: Props): JSX.Element {\n const [renderCounter, setRenderCounter] = useState(0);\n\n const onFolderChange = (folder: { id: number; title: string }) => {\n dashboard.meta.folderId = folder.id;\n dashboard.meta.folderTitle = folder.title;\n dashboard.meta.hasUnsavedFolderChange = true;\n };\n\n const onBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n dashboard[event.currentTarget.name as 'title' | 'description'] = event.currentTarget.value;\n };\n\n const onTooltipChange = (graphTooltip: number) => {\n dashboard.graphTooltip = graphTooltip;\n setRenderCounter(renderCounter + 1);\n };\n\n const onRefreshIntervalChange = (intervals: string[]) => {\n dashboard.timepicker.refresh_intervals = intervals.filter((i) => i.trim() !== '');\n };\n\n const onNowDelayChange = (nowDelay: string) => {\n dashboard.timepicker.nowDelay = nowDelay;\n };\n\n const onHideTimePickerChange = (hide: boolean) => {\n dashboard.timepicker.hidden = hide;\n setRenderCounter(renderCounter + 1);\n };\n\n const onLiveNowChange = (v: boolean) => {\n dashboard.liveNow = v;\n setRenderCounter(renderCounter + 1);\n };\n\n const onTimeZoneChange = (timeZone: TimeZone) => {\n dashboard.timezone = timeZone;\n setRenderCounter(renderCounter + 1);\n updateTimeZone(timeZone);\n };\n\n const onWeekStartChange = (weekStart: string) => {\n dashboard.weekStart = weekStart;\n setRenderCounter(renderCounter + 1);\n updateWeekStart(weekStart);\n };\n\n const onTagsChange = (tags: string[]) => {\n dashboard.tags = tags;\n setRenderCounter(renderCounter + 1);\n };\n\n const onEditableChange = (value: boolean) => {\n dashboard.editable = value;\n setRenderCounter(renderCounter + 1);\n };\n\n const editableOptions = [\n { label: 'Editable', value: true },\n { label: 'Read-only', value: false },\n ];\n\n return (\n <div style={{ maxWidth: '600px' }}>\n <h3 className=\"dashboard-settings__header\" aria-label={selectors.pages.Dashboard.Settings.General.title}>\n General\n </h3>\n <div className=\"gf-form-group\">\n <Field label=\"Name\">\n <Input id=\"title-input\" name=\"title\" onBlur={onBlur} defaultValue={dashboard.title} />\n </Field>\n <Field label=\"Description\">\n <Input id=\"description-input\" name=\"description\" onBlur={onBlur} defaultValue={dashboard.description} />\n </Field>\n <Field label=\"Tags\">\n <TagsInput id=\"tags-input\" tags={dashboard.tags} onChange={onTagsChange} />\n </Field>\n <Field label=\"Folder\">\n <FolderPicker\n inputId=\"dashboard-folder-input\"\n initialTitle={dashboard.meta.folderTitle}\n initialFolderId={dashboard.meta.folderId}\n onChange={onFolderChange}\n enableCreateNew={true}\n dashboardId={dashboard.id}\n skipInitialLoad={true}\n />\n </Field>\n\n <Field\n label=\"Editable\"\n description=\"Set to read-only to disable all editing. Reload the dashboard for changes to take effect\"\n >\n <RadioButtonGroup value={dashboard.editable} options={editableOptions} onChange={onEditableChange} />\n </Field>\n </div>\n\n {config.featureToggles.dashboardPreviews && config.featureToggles.dashboardPreviewsAdmin && (\n <PreviewSettings uid={dashboard.uid} />\n )}\n\n <TimePickerSettings\n onTimeZoneChange={onTimeZoneChange}\n onWeekStartChange={onWeekStartChange}\n onRefreshIntervalChange={onRefreshIntervalChange}\n onNowDelayChange={onNowDelayChange}\n onHideTimePickerChange={onHideTimePickerChange}\n onLiveNowChange={onLiveNowChange}\n refreshIntervals={dashboard.timepicker.refresh_intervals}\n timePickerHidden={dashboard.timepicker.hidden}\n nowDelay={dashboard.timepicker.nowDelay}\n timezone={dashboard.timezone}\n weekStart={dashboard.weekStart}\n liveNow={dashboard.liveNow}\n />\n\n {/* @todo: Update \"Graph tooltip\" description to remove prompt about reloading when resolving #46581 */}\n <CollapsableSection label=\"Panel options\" isOpen={true}>\n <Field\n label=\"Graph tooltip\"\n description=\"Controls tooltip and hover highlight behavior across different panels. Reload the dashboard for changes to take effect\"\n >\n <RadioButtonGroup onChange={onTooltipChange} options={GRAPH_TOOLTIP_OPTIONS} value={dashboard.graphTooltip} />\n </Field>\n </CollapsableSection>\n\n <div className=\"gf-form-button-row\">\n {dashboard.meta.canDelete && <DeleteDashboardButton dashboard={dashboard} />}\n </div>\n </div>\n );\n}\n\nconst mapDispatchToProps = {\n updateTimeZone: updateTimeZoneDashboard,\n updateWeekStart: updateWeekStartDashboard,\n};\n\nconst connector = connect(null, mapDispatchToProps);\n\nexport const GeneralSettings = connector(GeneralSettingsUnconnected);\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, CodeEditor, HorizontalGroup, useStyles2 } from '@grafana/ui';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\n\nimport { getDashboardSrv } from '../../services/DashboardSrv';\nimport { DashboardModel } from '../../state/DashboardModel';\n\ninterface Props {\n dashboard: DashboardModel;\n}\n\nexport const JsonEditorSettings: React.FC<Props> = ({ dashboard }) => {\n const [dashboardJson, setDashboardJson] = useState<string>(JSON.stringify(dashboard.getSaveModelClone(), null, 2));\n const onBlur = (value: string) => {\n setDashboardJson(value);\n };\n\n const onClick = () => {\n getDashboardSrv()\n .saveJSONDashboard(dashboardJson)\n .then(() => {\n dashboardWatcher.reloadPage();\n });\n };\n\n const styles = useStyles2(getStyles);\n\n return (\n <div>\n <h3 className=\"dashboard-settings__header\">JSON Model</h3>\n <div className=\"dashboard-settings__subheader\">\n The JSON model below is the data structure that defines the dashboard. This includes dashboard settings, panel\n settings, layout, queries, and so on.\n </div>\n\n <div className={styles.editWrapper}>\n <AutoSizer>\n {({ width, height }) => (\n <CodeEditor\n value={dashboardJson}\n language=\"json\"\n width={width}\n height={height}\n showMiniMap={true}\n showLineNumbers={true}\n onBlur={onBlur}\n />\n )}\n </AutoSizer>\n </div>\n {dashboard.meta.canSave && (\n <HorizontalGroup>\n <Button type=\"submit\" onClick={onClick}>\n Save changes\n </Button>\n </HorizontalGroup>\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n editWrapper: css`\n height: calc(100vh - 250px);\n margin-bottom: 10px;\n `,\n});\n","import React, { useState } from 'react';\n\nimport { arrayUtils } from '@grafana/data';\nimport { DeleteButton, HorizontalGroup, Icon, IconButton, TagList } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\n\nimport { DashboardModel, DashboardLink } from '../../state/DashboardModel';\nimport { ListNewButton } from '../DashboardSettings/ListNewButton';\n\ntype LinkSettingsListProps = {\n dashboard: DashboardModel;\n onNew: () => void;\n onEdit: (idx: number) => void;\n};\n\nexport const LinkSettingsList: React.FC<LinkSettingsListProps> = ({ dashboard, onNew, onEdit }) => {\n const [links, setLinks] = useState(dashboard.links);\n\n const moveLink = (idx: number, direction: number) => {\n dashboard.links = arrayUtils.moveItemImmutably(links, idx, idx + direction);\n setLinks(dashboard.links);\n };\n\n const duplicateLink = (link: DashboardLink, idx: number) => {\n dashboard.links = [...links, { ...link }];\n setLinks(dashboard.links);\n };\n\n const deleteLink = (idx: number) => {\n dashboard.links = [...links.slice(0, idx), ...links.slice(idx + 1)];\n setLinks(dashboard.links);\n };\n\n const isEmptyList = dashboard.links.length === 0;\n\n if (isEmptyList) {\n return (\n <EmptyListCTA\n onClick={onNew}\n title=\"There are no dashboard links added yet\"\n buttonIcon=\"link\"\n buttonTitle=\"Add dashboard link\"\n infoBoxTitle=\"What are dashboard links?\"\n infoBox={{\n __html:\n '<p>Dashboard Links allow you to place links to other dashboards and web sites directly below the dashboard header.</p>',\n }}\n />\n );\n }\n\n return (\n <>\n <table className=\"filter-table filter-table--hover\">\n <thead>\n <tr>\n <th>Type</th>\n <th>Info</th>\n <th colSpan={3} />\n </tr>\n </thead>\n <tbody>\n {links.map((link, idx) => (\n <tr key={`${link.title}-${idx}`}>\n <td className=\"pointer\" onClick={() => onEdit(idx)}>\n <Icon name=\"external-link-alt\" /> {link.type}\n </td>\n <td>\n <HorizontalGroup>\n {link.title && <span>{link.title}</span>}\n {link.type === 'link' && <span>{link.url}</span>}\n {link.type === 'dashboards' && <TagList tags={link.tags ?? []} />}\n </HorizontalGroup>\n </td>\n <td style={{ width: '1%' }}>\n {idx !== 0 && <IconButton name=\"arrow-up\" aria-label=\"arrow-up\" onClick={() => moveLink(idx, -1)} />}\n </td>\n <td style={{ width: '1%' }}>\n {links.length > 1 && idx !== links.length - 1 ? (\n <IconButton name=\"arrow-down\" aria-label=\"arrow-down\" onClick={() => moveLink(idx, 1)} />\n ) : null}\n </td>\n <td style={{ width: '1%' }}>\n <IconButton aria-label=\"copy\" name=\"copy\" onClick={() => duplicateLink(link, idx)} />\n </td>\n <td style={{ width: '1%' }}>\n <DeleteButton\n aria-label={`Delete link with title \"${link.title}\"`}\n size=\"sm\"\n onConfirm={() => deleteLink(idx)}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n <ListNewButton onClick={onNew}>New link</ListNewButton>\n </>\n );\n};\n","import React, { useState } from 'react';\n\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { LinkSettingsEdit, LinkSettingsList } from '../LinksSettings';\nimport { newLink } from '../LinksSettings/LinkSettingsEdit';\n\nimport { DashboardSettingsHeader } from './DashboardSettingsHeader';\ninterface Props {\n dashboard: DashboardModel;\n}\n\nexport type LinkSettingsMode = 'list' | 'new' | 'edit';\n\nexport const LinksSettings: React.FC<Props> = ({ dashboard }) => {\n const [editIdx, setEditIdx] = useState<number | null>(null);\n\n const onGoBack = () => {\n setEditIdx(null);\n };\n\n const onNew = () => {\n dashboard.links = [...dashboard.links, { ...newLink }];\n setEditIdx(dashboard.links.length - 1);\n };\n\n const onEdit = (idx: number) => {\n setEditIdx(idx);\n };\n\n const isEditing = editIdx !== null;\n\n return (\n <>\n <DashboardSettingsHeader onGoBack={onGoBack} title=\"Dashboard links\" isEditing={isEditing} />\n {!isEditing && <LinkSettingsList dashboard={dashboard} onNew={onNew} onEdit={onEdit} />}\n {isEditing && <LinkSettingsEdit dashboard={dashboard} editLinkIdx={editIdx!} onGoBack={onGoBack} />}\n </>\n );\n};\n","import React, { PureComponent } from 'react';\n\nimport { Spinner, HorizontalGroup } from '@grafana/ui';\n\nimport { DashboardModel } from '../../state/DashboardModel';\nimport {\n historySrv,\n RevisionsModel,\n VersionHistoryTable,\n VersionHistoryHeader,\n VersionsHistoryButtons,\n VersionHistoryComparison,\n} from '../VersionHistory';\n\ninterface Props {\n dashboard: DashboardModel;\n}\n\ntype State = {\n isLoading: boolean;\n isAppending: boolean;\n versions: DecoratedRevisionModel[];\n viewMode: 'list' | 'compare';\n diffData: { lhs: any; rhs: any };\n newInfo?: DecoratedRevisionModel;\n baseInfo?: DecoratedRevisionModel;\n isNewLatest: boolean;\n};\n\nexport type DecoratedRevisionModel = RevisionsModel & {\n createdDateString: string;\n ageString: string;\n};\n\nexport const VERSIONS_FETCH_LIMIT = 10;\n\nexport class VersionsSettings extends PureComponent<Props, State> {\n limit: number;\n start: number;\n\n constructor(props: Props) {\n super(props);\n this.limit = VERSIONS_FETCH_LIMIT;\n this.start = 0;\n this.state = {\n isAppending: true,\n isLoading: true,\n versions: [],\n viewMode: 'list',\n isNewLatest: false,\n diffData: {\n lhs: {},\n rhs: {},\n },\n };\n }\n\n componentDidMount() {\n this.getVersions();\n }\n\n getVersions = (append = false) => {\n this.setState({ isAppending: append });\n historySrv\n .getHistoryList(this.props.dashboard, { limit: this.limit, start: this.start })\n .then((res) => {\n this.setState({\n isLoading: false,\n versions: [...this.state.versions, ...this.decorateVersions(res)],\n });\n this.start += this.limit;\n })\n .catch((err) => console.log(err))\n .finally(() => this.setState({ isAppending: false }));\n };\n\n getDiff = async () => {\n const selectedVersions = this.state.versions.filter((version) => version.checked);\n const [newInfo, baseInfo] = selectedVersions;\n const isNewLatest = newInfo.version === this.props.dashboard.version;\n\n this.setState({\n isLoading: true,\n });\n\n const lhs = await historySrv.getDashboardVersion(this.props.dashboard.uid, baseInfo.version);\n const rhs = await historySrv.getDashboardVersion(this.props.dashboard.uid, newInfo.version);\n\n this.setState({\n baseInfo,\n isLoading: false,\n isNewLatest,\n newInfo,\n viewMode: 'compare',\n diffData: {\n lhs: lhs.data,\n rhs: rhs.data,\n },\n });\n };\n\n decorateVersions = (versions: RevisionsModel[]) =>\n versions.map((version) => ({\n ...version,\n createdDateString: this.props.dashboard.formatDate(version.created),\n ageString: this.props.dashboard.getRelativeTime(version.created),\n checked: false,\n }));\n\n isLastPage() {\n return this.state.versions.find((rev) => rev.version === 1);\n }\n\n onCheck = (ev: React.FormEvent<HTMLInputElement>, versionId: number) => {\n this.setState({\n versions: this.state.versions.map((version) =>\n version.id === versionId ? { ...version, checked: ev.currentTarget.checked } : version\n ),\n });\n };\n\n reset = () => {\n this.setState({\n baseInfo: undefined,\n diffData: {\n lhs: {},\n rhs: {},\n },\n isNewLatest: false,\n newInfo: undefined,\n versions: this.state.versions.map((version) => ({ ...version, checked: false })),\n viewMode: 'list',\n });\n };\n\n render() {\n const { versions, viewMode, baseInfo, newInfo, isNewLatest, isLoading, diffData } = this.state;\n const canCompare = versions.filter((version) => version.checked).length === 2;\n const showButtons = versions.length > 1;\n const hasMore = versions.length >= this.limit;\n\n if (viewMode === 'compare') {\n return (\n <div>\n <VersionHistoryHeader\n isComparing\n onClick={this.reset}\n baseVersion={baseInfo?.version}\n newVersion={newInfo?.version}\n isNewLatest={isNewLatest}\n />\n {isLoading ? (\n <VersionsHistorySpinner msg=\"Fetching changes…\" />\n ) : (\n <VersionHistoryComparison\n newInfo={newInfo!}\n baseInfo={baseInfo!}\n isNewLatest={isNewLatest}\n diffData={diffData}\n />\n )}\n </div>\n );\n }\n\n return (\n <div>\n <VersionHistoryHeader />\n {isLoading ? (\n <VersionsHistorySpinner msg=\"Fetching history list…\" />\n ) : (\n <VersionHistoryTable versions={versions} onCheck={this.onCheck} canCompare={canCompare} />\n )}\n {this.state.isAppending && <VersionsHistorySpinner msg=\"Fetching more entries…\" />}\n {showButtons && (\n <VersionsHistoryButtons\n hasMore={hasMore}\n canCompare={canCompare}\n getVersions={this.getVersions}\n getDiff={this.getDiff}\n isLastPage={!!this.isLastPage()}\n />\n )}\n </div>\n );\n }\n}\n\nconst VersionsHistorySpinner = ({ msg }: { msg: string }) => (\n <HorizontalGroup>\n <Spinner />\n <em>{msg}</em>\n </HorizontalGroup>\n);\n","import { css, cx } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { GrafanaTheme2, locationUtil } from '@grafana/data';\nimport { locationService, reportInteraction } from '@grafana/runtime';\nimport { Button, CustomScrollbar, Icon, IconName, PageToolbar, stylesFactory, useForceUpdate } from '@grafana/ui';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\n\nimport { VariableEditorContainer } from '../../../variables/editor/VariableEditorContainer';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { AccessControlDashboardPermissions } from '../DashboardPermissions/AccessControlDashboardPermissions';\nimport { DashboardPermissions } from '../DashboardPermissions/DashboardPermissions';\nimport { SaveDashboardAsButton, SaveDashboardButton } from '../SaveDashboard/SaveDashboardButton';\n\nimport { AnnotationsSettings } from './AnnotationsSettings';\nimport { GeneralSettings } from './GeneralSettings';\nimport { JsonEditorSettings } from './JsonEditorSettings';\nimport { LinksSettings } from './LinksSettings';\nimport { VersionsSettings } from './VersionsSettings';\n\nexport interface Props {\n dashboard: DashboardModel;\n editview: string;\n}\n\nexport interface SettingsPage {\n id: string;\n title: string;\n icon: IconName;\n component: React.ReactNode;\n}\n\nconst onClose = () => locationService.partial({ editview: null });\n\nconst MakeEditable = (props: { onMakeEditable: () => any }) => (\n <div>\n <div className=\"dashboard-settings__header\">Dashboard not editable</div>\n <Button type=\"submit\" onClick={props.onMakeEditable}>\n Make editable\n </Button>\n </div>\n);\n\nexport function DashboardSettings({ dashboard, editview }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n },\n ref\n );\n const { dialogProps } = useDialog(\n {\n 'aria-label': 'Dashboard settings',\n },\n ref\n );\n const forceUpdate = useForceUpdate();\n const onMakeEditable = useCallback(() => {\n dashboard.editable = true;\n dashboard.meta.canMakeEditable = false;\n dashboard.meta.canEdit = true;\n dashboard.meta.canSave = true;\n forceUpdate();\n }, [dashboard, forceUpdate]);\n\n const pages = useMemo((): SettingsPage[] => {\n const pages: SettingsPage[] = [];\n\n if (dashboard.meta.canEdit) {\n pages.push({\n title: 'General',\n id: 'settings',\n icon: 'sliders-v-alt',\n component: <GeneralSettings dashboard={dashboard} />,\n });\n\n pages.push({\n title: 'Annotations',\n id: 'annotations',\n icon: 'comment-alt',\n component: <AnnotationsSettings dashboard={dashboard} />,\n });\n\n pages.push({\n title: 'Variables',\n id: 'templating',\n icon: 'calculator-alt',\n component: <VariableEditorContainer dashboard={dashboard} />,\n });\n\n pages.push({\n title: 'Links',\n id: 'links',\n icon: 'link',\n component: <LinksSettings dashboard={dashboard} />,\n });\n }\n\n if (dashboard.meta.canMakeEditable) {\n pages.push({\n title: 'General',\n icon: 'sliders-v-alt',\n id: 'settings',\n component: <MakeEditable onMakeEditable={onMakeEditable} />,\n });\n }\n\n if (dashboard.id && dashboard.meta.canSave) {\n pages.push({\n title: 'Versions',\n id: 'versions',\n icon: 'history',\n component: <VersionsSettings dashboard={dashboard} />,\n });\n }\n\n if (dashboard.id && dashboard.meta.canAdmin) {\n if (!config.rbacEnabled) {\n pages.push({\n title: 'Permissions',\n id: 'permissions',\n icon: 'lock',\n component: <DashboardPermissions dashboard={dashboard} />,\n });\n } else if (contextSrv.hasPermission(AccessControlAction.DashboardsPermissionsRead)) {\n pages.push({\n title: 'Permissions',\n id: 'permissions',\n icon: 'lock',\n component: <AccessControlDashboardPermissions dashboard={dashboard} />,\n });\n }\n }\n\n pages.push({\n title: 'JSON Model',\n id: 'dashboard_json',\n icon: 'arrow',\n component: <JsonEditorSettings dashboard={dashboard} />,\n });\n\n return pages;\n }, [dashboard, onMakeEditable]);\n\n const onPostSave = () => {\n dashboard.meta.hasUnsavedFolderChange = false;\n };\n\n const folderTitle = dashboard.meta.folderTitle;\n const currentPage = pages.find((page) => page.id === editview) ?? pages[0];\n const canSaveAs = contextSrv.hasEditPermissionInFolders;\n const canSave = dashboard.meta.canSave;\n const styles = getStyles(config.theme2);\n\n return (\n <FocusScope contain autoFocus>\n <div className=\"dashboard-settings\" ref={ref} {...overlayProps} {...dialogProps}>\n <PageToolbar\n className={styles.toolbar}\n title={dashboard.title}\n section=\"Settings\"\n parent={folderTitle}\n onGoBack={onClose}\n />\n <CustomScrollbar>\n <div className={styles.scrollInner}>\n <div className={styles.settingsWrapper}>\n <aside className=\"dashboard-settings__aside\">\n {pages.map((page) => (\n <Link\n onClick={() => reportInteraction(`Dashboard settings navigation to ${page.id}`)}\n to={(loc) => locationUtil.getUrlForPartial(loc, { editview: page.id })}\n className={cx('dashboard-settings__nav-item', { active: page.id === editview })}\n key={page.id}\n >\n <Icon name={page.icon} style={{ marginRight: '4px' }} />\n {page.title}\n </Link>\n ))}\n <div className=\"dashboard-settings__aside-actions\">\n {canSave && <SaveDashboardButton dashboard={dashboard} onSaveSuccess={onPostSave} />}\n {canSaveAs && (\n <SaveDashboardAsButton dashboard={dashboard} onSaveSuccess={onPostSave} variant=\"secondary\" />\n )}\n </div>\n </aside>\n <div className={styles.settingsContent}>{currentPage.component}</div>\n </div>\n </div>\n </CustomScrollbar>\n </div>\n </FocusScope>\n );\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n scrollInner: css`\n min-width: 100%;\n display: flex;\n `,\n toolbar: css`\n width: 60vw;\n min-width: min-content;\n `,\n settingsWrapper: css`\n margin: ${theme.spacing(0, 2, 2)};\n display: flex;\n flex-grow: 1;\n `,\n settingsContent: css`\n flex-grow: 1;\n height: 100%;\n padding: 32px;\n border: 1px solid ${theme.colors.border.weak};\n background: ${theme.colors.background.primary};\n border-radius: ${theme.shape.borderRadius()};\n `,\n}));\n","import React, { useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { CollapsableSection, TagsInput, Select, Field, Input, Checkbox, Button } from '@grafana/ui';\n\nimport { DashboardLink, DashboardModel } from '../../state/DashboardModel';\n\nexport const newLink = {\n icon: 'external link',\n title: 'New link',\n tooltip: '',\n type: 'dashboards',\n url: '',\n asDropdown: false,\n tags: [],\n targetBlank: false,\n keepTime: false,\n includeVars: false,\n} as DashboardLink;\n\nconst linkTypeOptions = [\n { value: 'dashboards', label: 'Dashboards' },\n { value: 'link', label: 'Link' },\n];\n\nexport const linkIconMap: { [key: string]: string } = {\n 'external link': 'external-link-alt',\n dashboard: 'apps',\n question: 'question-circle',\n info: 'info-circle',\n bolt: 'bolt',\n doc: 'file-alt',\n cloud: 'cloud',\n};\n\nconst linkIconOptions = Object.keys(linkIconMap).map((key) => ({ label: key, value: key }));\n\ntype LinkSettingsEditProps = {\n editLinkIdx: number;\n dashboard: DashboardModel;\n onGoBack: () => void;\n};\n\nexport const LinkSettingsEdit: React.FC<LinkSettingsEditProps> = ({ editLinkIdx, dashboard, onGoBack }) => {\n const [linkSettings, setLinkSettings] = useState(editLinkIdx !== null ? dashboard.links[editLinkIdx] : newLink);\n\n const onUpdate = (link: DashboardLink) => {\n const links = [...dashboard.links];\n links.splice(editLinkIdx, 1, link);\n dashboard.links = links;\n setLinkSettings(link);\n };\n\n const onTagsChange = (tags: any[]) => {\n onUpdate({ ...linkSettings, tags: tags });\n };\n\n const onTypeChange = (selectedItem: SelectableValue) => {\n const update = { ...linkSettings, type: selectedItem.value };\n\n // clear props that are no longe revant for this type\n if (update.type === 'dashboards') {\n update.url = '';\n update.tooltip = '';\n } else {\n update.tags = [];\n }\n\n onUpdate(update);\n };\n\n const onIconChange = (selectedItem: SelectableValue) => {\n onUpdate({ ...linkSettings, icon: selectedItem.value });\n };\n\n const onChange = (ev: React.FocusEvent<HTMLInputElement>) => {\n const target = ev.currentTarget;\n onUpdate({\n ...linkSettings,\n [target.name]: target.type === 'checkbox' ? target.checked : target.value,\n });\n };\n\n const isNew = linkSettings.title === newLink.title;\n\n return (\n <div style={{ maxWidth: '600px' }}>\n <Field label=\"Title\">\n <Input name=\"title\" id=\"title\" value={linkSettings.title} onChange={onChange} autoFocus={isNew} />\n </Field>\n <Field label=\"Type\">\n <Select inputId=\"link-type-input\" value={linkSettings.type} options={linkTypeOptions} onChange={onTypeChange} />\n </Field>\n {linkSettings.type === 'dashboards' && (\n <>\n <Field label=\"With tags\">\n <TagsInput tags={linkSettings.tags} placeholder=\"add tags\" onChange={onTagsChange} />\n </Field>\n </>\n )}\n {linkSettings.type === 'link' && (\n <>\n <Field label=\"URL\">\n <Input name=\"url\" value={linkSettings.url} onChange={onChange} />\n </Field>\n <Field label=\"Tooltip\">\n <Input name=\"tooltip\" value={linkSettings.tooltip} onChange={onChange} placeholder=\"Open dashboard\" />\n </Field>\n <Field label=\"Icon\">\n <Select value={linkSettings.icon} options={linkIconOptions} onChange={onIconChange} />\n </Field>\n </>\n )}\n <CollapsableSection label=\"Options\" isOpen={true}>\n {linkSettings.type === 'dashboards' && (\n <Field>\n <Checkbox label=\"Show as dropdown\" name=\"asDropdown\" value={linkSettings.asDropdown} onChange={onChange} />\n </Field>\n )}\n <Field>\n <Checkbox\n label=\"Include current time range\"\n name=\"keepTime\"\n value={linkSettings.keepTime}\n onChange={onChange}\n />\n </Field>\n <Field>\n <Checkbox\n label=\"Include current template variable values\"\n name=\"includeVars\"\n value={linkSettings.includeVars}\n onChange={onChange}\n />\n </Field>\n <Field>\n <Checkbox\n label=\"Open link in new tab\"\n name=\"targetBlank\"\n value={linkSettings.targetBlank}\n onChange={onChange}\n />\n </Field>\n </CollapsableSection>\n <Button onClick={onGoBack}>Apply</Button>\n </div>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC, ReactNode, useCallback, useEffect, useState, useRef } from 'react';\nimport { useLocalStorage } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Counter, useStyles2 } from '@grafana/ui';\nimport { useQueryParams } from 'app/core/hooks/useQueryParams';\nimport { CollapseToggle } from 'app/features/alerting/unified/components/CollapseToggle';\n\nimport { PANEL_EDITOR_UI_STATE_STORAGE_KEY } from './state/reducers';\n\nexport interface OptionsPaneCategoryProps {\n id: string;\n title?: string;\n renderTitle?: (isExpanded: boolean) => React.ReactNode;\n isOpenDefault?: boolean;\n itemsCount?: number;\n forceOpen?: number;\n className?: string;\n isNested?: boolean;\n children: ReactNode;\n}\n\nconst CATEGORY_PARAM_NAME = 'showCategory';\n\nexport const OptionsPaneCategory: FC<OptionsPaneCategoryProps> = React.memo(\n ({ id, title, children, forceOpen, isOpenDefault, renderTitle, className, itemsCount, isNested = false }) => {\n const initialIsExpanded = isOpenDefault !== false;\n const [savedState, setSavedState] = useLocalStorage(getOptionGroupStorageKey(id), {\n isExpanded: initialIsExpanded,\n });\n\n const styles = useStyles2(getStyles);\n const [queryParams, updateQueryParams] = useQueryParams();\n const [isExpanded, setIsExpanded] = useState(savedState?.isExpanded ?? initialIsExpanded);\n const manualClickTime = useRef(0);\n const ref = useRef<HTMLDivElement>(null);\n const isOpenFromUrl = queryParams[CATEGORY_PARAM_NAME] === id;\n\n useEffect(() => {\n if (manualClickTime.current) {\n // ignore changes since the click handled the expected behavior\n if (Date.now() - manualClickTime.current < 200) {\n return;\n }\n }\n if (isOpenFromUrl || forceOpen) {\n if (!isExpanded) {\n setIsExpanded(true);\n }\n if (isOpenFromUrl) {\n ref.current?.scrollIntoView();\n }\n }\n }, [forceOpen, isExpanded, isOpenFromUrl]);\n\n const onToggle = useCallback(() => {\n manualClickTime.current = Date.now();\n updateQueryParams(\n {\n [CATEGORY_PARAM_NAME]: isExpanded ? undefined : id,\n },\n true\n );\n setSavedState({ isExpanded: !isExpanded });\n setIsExpanded(!isExpanded);\n }, [setSavedState, setIsExpanded, updateQueryParams, isExpanded, id]);\n\n if (!renderTitle) {\n renderTitle = function defaultTitle(isExpanded: boolean) {\n if (isExpanded || itemsCount === undefined || itemsCount === 0) {\n return title;\n }\n\n return (\n <span>\n {title} <Counter value={itemsCount} />\n </span>\n );\n };\n }\n\n const boxStyles = cx(\n {\n [styles.box]: true,\n [styles.boxNestedExpanded]: isNested && isExpanded,\n },\n className,\n 'options-group'\n );\n\n const headerStyles = cx(styles.header, {\n [styles.headerExpanded]: isExpanded,\n [styles.headerNested]: isNested,\n });\n\n const bodyStyles = cx(styles.body, {\n [styles.bodyNested]: isNested,\n });\n\n return (\n <div\n className={boxStyles}\n data-testid=\"options-category\"\n aria-label={selectors.components.OptionsGroup.group(id)}\n ref={ref}\n >\n <div className={headerStyles} onClick={onToggle} aria-label={selectors.components.OptionsGroup.toggle(id)}>\n <CollapseToggle isCollapsed={!isExpanded} idControlled={id} onToggle={onToggle} />\n <h6 id={`button-${id}`} className={styles.title}>\n {renderTitle(isExpanded)}\n </h6>\n </div>\n {isExpanded && (\n <div className={bodyStyles} id={id} aria-labelledby={`button-${id}`}>\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nOptionsPaneCategory.displayName = 'OptionsPaneCategory';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n box: css`\n border-top: 1px solid ${theme.colors.border.weak};\n `,\n boxNestedExpanded: css`\n margin-bottom: ${theme.spacing(2)};\n `,\n title: css`\n flex-grow: 1;\n overflow: hidden;\n line-height: 1.5;\n font-size: 1rem;\n font-weight: ${theme.typography.fontWeightMedium};\n margin: 0;\n `,\n header: css`\n display: flex;\n cursor: pointer;\n align-items: baseline;\n padding: ${theme.spacing(0.5)};\n color: ${theme.colors.text.primary};\n font-weight: ${theme.typography.fontWeightMedium};\n\n &:hover {\n background: ${theme.colors.emphasize(theme.colors.background.primary, 0.03)};\n }\n `,\n headerExpanded: css`\n color: ${theme.colors.text.primary};\n `,\n headerNested: css`\n padding: ${theme.spacing(0.5, 0, 0.5, 0)};\n `,\n body: css`\n padding: ${theme.spacing(1, 2, 1, 4)};\n `,\n bodyNested: css`\n position: relative;\n padding-right: 0;\n &:before {\n content: '';\n position: absolute;\n top: 0;\n left: 8px;\n width: 1px;\n height: 100%;\n background: ${theme.colors.border.weak};\n }\n `,\n };\n};\n\nconst getOptionGroupStorageKey = (id: string): string => `${PANEL_EDITOR_UI_STATE_STORAGE_KEY}.optionGroup[${id}]`;\n","import React from 'react';\n\nimport { OptionsPaneCategory } from './OptionsPaneCategory';\nimport { OptionsPaneItemDescriptor } from './OptionsPaneItemDescriptor';\n\nexport interface OptionsPaneCategoryDescriptorProps {\n id: string;\n title: string;\n renderTitle?: (isExpanded: boolean) => React.ReactNode;\n isOpenDefault?: boolean;\n forceOpen?: number;\n className?: string;\n isNested?: boolean;\n itemsCount?: number;\n customRender?: () => React.ReactNode;\n}\n/**\n * This is not a real React component but an intermediary to enable deep option search without traversing a React node tree.\n */\n\nexport class OptionsPaneCategoryDescriptor {\n items: OptionsPaneItemDescriptor[] = [];\n categories: OptionsPaneCategoryDescriptor[] = [];\n parent?: OptionsPaneCategoryDescriptor;\n\n constructor(public props: OptionsPaneCategoryDescriptorProps) {}\n\n addItem(item: OptionsPaneItemDescriptor) {\n item.parent = this;\n this.items.push(item);\n return this;\n }\n\n addCategory(category: OptionsPaneCategoryDescriptor) {\n category.props.isNested = true;\n category.parent = this;\n this.categories.push(category);\n return this;\n }\n\n getCategory(name: string): OptionsPaneCategoryDescriptor {\n let sub = this.categories.find((c) => c.props.id === name);\n if (sub) {\n return sub;\n }\n sub = new OptionsPaneCategoryDescriptor({\n title: name,\n id: name,\n });\n this.addCategory(sub);\n return sub;\n }\n\n render(searchQuery?: string) {\n if (this.props.customRender) {\n return this.props.customRender();\n }\n\n return (\n <OptionsPaneCategory key={this.props.title} {...this.props}>\n {this.items.map((item) => item.render(searchQuery))}\n {this.categories.map((category) => category.render(searchQuery))}\n </OptionsPaneCategory>\n );\n }\n}\n","import { css, CSSObject } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { OptionPaneItemOverrideInfo } from './types';\n\nexport interface Props {\n overrides: OptionPaneItemOverrideInfo[];\n}\n\nexport function OptionsPaneItemOverrides({ overrides }: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.wrapper}>\n {overrides.map((override, index) => (\n <Tooltip content={override.tooltip} key={index.toString()} placement=\"top\">\n <div aria-label={override.description} className={styles[override.type]} />\n </Tooltip>\n ))}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const common: CSSObject = {\n width: 8,\n height: 8,\n borderRadius: '50%',\n marginLeft: theme.spacing(1),\n position: 'relative',\n top: '-1px',\n };\n\n return {\n wrapper: css({\n display: 'flex',\n }),\n rule: css({\n ...common,\n backgroundColor: theme.colors.primary.main,\n }),\n data: css({\n ...common,\n backgroundColor: theme.colors.warning.main,\n }),\n };\n};\n","import React, { ReactNode } from 'react';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Field, Label } from '@grafana/ui';\n\nimport { OptionsPaneCategoryDescriptor } from './OptionsPaneCategoryDescriptor';\nimport { OptionsPaneItemOverrides } from './OptionsPaneItemOverrides';\nimport { OptionPaneItemOverrideInfo } from './types';\n\nexport interface OptionsPaneItemProps {\n title: string;\n value?: any;\n description?: string;\n popularRank?: number;\n render: () => React.ReactNode;\n skipField?: boolean;\n showIf?: () => boolean;\n overrides?: OptionPaneItemOverrideInfo[];\n}\n\n/**\n * This is not a real React component but an intermediary to enable deep option search without traversing a React node tree.\n */\nexport class OptionsPaneItemDescriptor {\n parent!: OptionsPaneCategoryDescriptor;\n\n constructor(public props: OptionsPaneItemProps) {}\n\n getLabel(searchQuery?: string): ReactNode {\n const { title, description, overrides } = this.props;\n\n if (!searchQuery) {\n // Do not render label for categories with only one child\n if (this.parent.props.title === title && !overrides?.length) {\n return null;\n }\n\n return (\n <Label description={description}>\n {title}\n {overrides && overrides.length > 0 && <OptionsPaneItemOverrides overrides={overrides} />}\n </Label>\n );\n }\n\n const categories: React.ReactNode[] = [];\n\n if (this.parent.parent) {\n categories.push(this.highlightWord(this.parent.parent.props.title, searchQuery));\n }\n\n if (this.parent.props.title !== title) {\n categories.push(this.highlightWord(this.parent.props.title, searchQuery));\n }\n\n return (\n <Label description={description && this.highlightWord(description, searchQuery)} category={categories}>\n {this.highlightWord(title, searchQuery)}\n {overrides && overrides.length > 0 && <OptionsPaneItemOverrides overrides={overrides} />}\n </Label>\n );\n }\n\n highlightWord(word: string, query: string) {\n return (\n <Highlighter textToHighlight={word} searchWords={[query]} highlightClassName={'search-fragment-highlight'} />\n );\n }\n\n renderOverrides() {\n const { overrides } = this.props;\n if (!overrides || overrides.length === 0) {\n return;\n }\n }\n\n render(searchQuery?: string) {\n const { title, description, render, showIf, skipField } = this.props;\n const key = `${this.parent.props.id} ${title}`;\n\n if (showIf && !showIf()) {\n return null;\n }\n\n if (skipField) {\n return render();\n }\n\n return (\n <Field\n label={this.getLabel(searchQuery)}\n description={description}\n key={key}\n aria-label={selectors.components.PanelEditor.OptionsPane.fieldLabel(key)}\n >\n {render() as React.ReactElement}\n </Field>\n );\n }\n}\n","import { get as lodashGet } from 'lodash';\n\nimport { DataFrame, FieldConfigPropertyItem, FieldConfigSource } from '@grafana/data';\n\nimport { OptionPaneItemOverrideInfo } from '../types';\n\nexport const dataOverrideTooltipDescription =\n 'Some data fields have this option pre-configured. Add a field override rule to override the pre-configured value.';\nexport const overrideRuleTooltipDescription = 'An override rule exists for this property';\n\nexport function getOptionOverrides(\n fieldOption: FieldConfigPropertyItem,\n fieldConfig: FieldConfigSource,\n frames: DataFrame[] | undefined\n): OptionPaneItemOverrideInfo[] {\n const infoDots: OptionPaneItemOverrideInfo[] = [];\n\n // Look for options overriden in data field config\n if (frames) {\n for (const frame of frames) {\n for (const field of frame.fields) {\n const value = lodashGet(field.config, fieldOption.path);\n if (value == null) {\n continue;\n }\n\n infoDots.push({\n type: 'data',\n description: dataOverrideTooltipDescription,\n tooltip: dataOverrideTooltipDescription,\n });\n\n break;\n }\n }\n }\n\n const overrideRuleFound = fieldConfig.overrides.some((rule) =>\n rule.properties.some((prop) => prop.id === fieldOption.id)\n );\n\n if (overrideRuleFound) {\n infoDots.push({\n type: 'rule',\n description: overrideRuleTooltipDescription,\n tooltip: overrideRuleTooltipDescription,\n });\n }\n\n return infoDots;\n}\n","import { get as lodashGet } from 'lodash';\nimport React from 'react';\n\nimport {\n EventBus,\n InterpolateFunction,\n PanelData,\n StandardEditorContext,\n VariableSuggestionsScope,\n} from '@grafana/data';\nimport { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin';\nimport {\n isNestedPanelOptions,\n NestedValueAccess,\n PanelOptionsEditorBuilder,\n} from '@grafana/data/src/utils/OptionsUIBuilders';\nimport { getDataLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv';\n\nimport { OptionsPaneCategoryDescriptor } from './OptionsPaneCategoryDescriptor';\nimport { OptionsPaneItemDescriptor } from './OptionsPaneItemDescriptor';\nimport { getOptionOverrides } from './state/getOptionOverrides';\nimport { OptionPaneRenderProps } from './types';\nimport { setOptionImmutably, updateDefaultFieldConfigValue } from './utils';\n\ntype categoryGetter = (categoryNames?: string[]) => OptionsPaneCategoryDescriptor;\n\ninterface GetStandardEditorContextProps {\n data: PanelData | undefined;\n replaceVariables: InterpolateFunction;\n options: Record<string, unknown>;\n eventBus: EventBus;\n instanceState: OptionPaneRenderProps['instanceState'];\n}\n\nexport function getStandardEditorContext({\n data,\n replaceVariables,\n options,\n eventBus,\n instanceState,\n}: GetStandardEditorContextProps): StandardEditorContext<unknown, unknown> {\n const dataSeries = data?.series ?? [];\n\n const context: StandardEditorContext<unknown, unknown> = {\n data: dataSeries,\n replaceVariables,\n options,\n eventBus,\n getSuggestions: (scope?: VariableSuggestionsScope) => getDataLinksVariableSuggestions(dataSeries, scope),\n instanceState,\n };\n\n return context;\n}\n\nexport function getVisualizationOptions(props: OptionPaneRenderProps): OptionsPaneCategoryDescriptor[] {\n const { plugin, panel, onPanelOptionsChanged, onFieldConfigsChange, data, dashboard, instanceState } = props;\n const currentOptions = panel.getOptions();\n const currentFieldConfig = panel.fieldConfig;\n const categoryIndex: Record<string, OptionsPaneCategoryDescriptor> = {};\n\n const context = getStandardEditorContext({\n data,\n replaceVariables: panel.replaceVariables,\n options: currentOptions,\n eventBus: dashboard.events,\n instanceState,\n });\n\n const getOptionsPaneCategory = (categoryNames?: string[]): OptionsPaneCategoryDescriptor => {\n const categoryName = (categoryNames && categoryNames[0]) ?? `${plugin.meta.name}`;\n const category = categoryIndex[categoryName];\n\n if (category) {\n return category;\n }\n\n return (categoryIndex[categoryName] = new OptionsPaneCategoryDescriptor({\n title: categoryName,\n id: categoryName,\n }));\n };\n\n const access: NestedValueAccess = {\n getValue: (path: string) => lodashGet(currentOptions, path),\n onChange: (path: string, value: any) => {\n const newOptions = setOptionImmutably(currentOptions, path, value);\n onPanelOptionsChanged(newOptions);\n },\n };\n\n // Load the options into categories\n fillOptionsPaneItems(plugin.getPanelOptionsSupplier(), access, getOptionsPaneCategory, context);\n\n /**\n * Field options\n */\n for (const fieldOption of plugin.fieldConfigRegistry.list()) {\n if (\n fieldOption.isCustom &&\n fieldOption.showIf &&\n !fieldOption.showIf(currentFieldConfig.defaults.custom, data?.series)\n ) {\n continue;\n }\n\n if (fieldOption.hideFromDefaults) {\n continue;\n }\n\n const category = getOptionsPaneCategory(fieldOption.category);\n const Editor = fieldOption.editor;\n\n const defaults = currentFieldConfig.defaults;\n const value = fieldOption.isCustom\n ? defaults.custom\n ? lodashGet(defaults.custom, fieldOption.path)\n : undefined\n : lodashGet(defaults, fieldOption.path);\n\n if (fieldOption.getItemsCount) {\n category.props.itemsCount = fieldOption.getItemsCount(value);\n }\n\n category.addItem(\n new OptionsPaneItemDescriptor({\n title: fieldOption.name,\n description: fieldOption.description,\n overrides: getOptionOverrides(fieldOption, currentFieldConfig, data?.series),\n render: function renderEditor() {\n const onChange = (v: any) => {\n onFieldConfigsChange(\n updateDefaultFieldConfigValue(currentFieldConfig, fieldOption.path, v, fieldOption.isCustom)\n );\n };\n\n return <Editor value={value} onChange={onChange} item={fieldOption} context={context} id={fieldOption.id} />;\n },\n })\n );\n }\n\n return Object.values(categoryIndex);\n}\n\n/**\n * This will iterate all options panes and add register them with the configured categories\n *\n * @internal\n */\nexport function fillOptionsPaneItems(\n supplier: PanelOptionsSupplier<any>,\n access: NestedValueAccess,\n getOptionsPaneCategory: categoryGetter,\n context: StandardEditorContext<any, any>,\n parentCategory?: OptionsPaneCategoryDescriptor\n) {\n const builder = new PanelOptionsEditorBuilder<any>();\n supplier(builder, context);\n\n for (const pluginOption of builder.getItems()) {\n if (pluginOption.showIf && !pluginOption.showIf(context.options, context.data)) {\n continue;\n }\n\n let category = parentCategory;\n if (!category) {\n category = getOptionsPaneCategory(pluginOption.category);\n } else if (pluginOption.category?.[0]?.length) {\n category = category.getCategory(pluginOption.category[0]);\n }\n\n // Nested options get passed up one level\n if (isNestedPanelOptions(pluginOption)) {\n const subAccess = pluginOption.getNestedValueAccess(access);\n const subContext = subAccess.getContext\n ? subAccess.getContext(context)\n : { ...context, options: access.getValue(pluginOption.path) };\n\n fillOptionsPaneItems(\n pluginOption.getBuilder(),\n subAccess,\n getOptionsPaneCategory,\n subContext,\n category // parent category\n );\n continue;\n }\n\n const Editor = pluginOption.editor;\n category.addItem(\n new OptionsPaneItemDescriptor({\n title: pluginOption.name,\n description: pluginOption.description,\n render: function renderEditor() {\n return (\n <Editor\n value={access.getValue(pluginOption.path)}\n onChange={(value: any) => {\n access.onChange(pluginOption.path, value);\n }}\n item={pluginOption}\n context={context}\n id={pluginOption.id}\n />\n );\n },\n })\n );\n }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { getDefaultTimeRange, LoadingState, PanelData } from '@grafana/data';\n\nimport store from '../../../../../core/store';\nimport { PanelModel } from '../../../state/PanelModel';\nimport { DisplayMode } from '../types';\n\nexport const PANEL_EDITOR_UI_STATE_STORAGE_KEY = 'grafana.dashboard.editor.ui';\n\nexport const DEFAULT_PANEL_EDITOR_UI_STATE: PanelEditorUIState = {\n isPanelOptionsVisible: true,\n rightPaneSize: 400,\n topPaneSize: 0.45,\n mode: DisplayMode.Fill,\n};\n\nexport interface PanelEditorUIState {\n /* Visualization options pane visibility */\n isPanelOptionsVisible: boolean;\n /* Pixels or percentage */\n rightPaneSize: number;\n /* Pixels or percentage */\n topPaneSize: number;\n /* Visualization size mode */\n mode: DisplayMode;\n}\n\nexport interface PanelEditorState {\n /* These are functions as they are mutated later on and redux toolkit will Object.freeze state so\n * we need to store these using functions instead */\n getSourcePanel: () => PanelModel;\n getPanel: () => PanelModel;\n getData: () => PanelData;\n initDone: boolean;\n shouldDiscardChanges: boolean;\n isOpen: boolean;\n ui: PanelEditorUIState;\n isVizPickerOpen: boolean;\n tableViewEnabled: boolean;\n}\n\nexport const initialState = (): PanelEditorState => {\n const storedUiState = store.getObject(PANEL_EDITOR_UI_STATE_STORAGE_KEY, DEFAULT_PANEL_EDITOR_UI_STATE);\n\n let migratedState = { ...storedUiState };\n\n if (typeof storedUiState.topPaneSize === 'string') {\n migratedState = { ...storedUiState, topPaneSize: parseFloat(storedUiState.topPaneSize) / 100 };\n }\n\n return {\n getPanel: () => new PanelModel({}),\n getSourcePanel: () => new PanelModel({}),\n getData: () => ({\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\n }),\n initDone: false,\n shouldDiscardChanges: false,\n isOpen: false,\n isVizPickerOpen: false,\n tableViewEnabled: false,\n ui: {\n ...DEFAULT_PANEL_EDITOR_UI_STATE,\n ...migratedState,\n },\n };\n};\n\ninterface InitEditorPayload {\n panel: PanelModel;\n sourcePanel: PanelModel;\n}\n\nconst pluginsSlice = createSlice({\n name: 'panelEditor',\n initialState: initialState(),\n reducers: {\n updateEditorInitState: (state, action: PayloadAction<InitEditorPayload>) => {\n state.getPanel = () => action.payload.panel;\n state.getSourcePanel = () => action.payload.sourcePanel;\n state.initDone = true;\n state.isOpen = true;\n state.shouldDiscardChanges = false;\n },\n setEditorPanelData: (state, action: PayloadAction<PanelData>) => {\n state.getData = () => action.payload;\n },\n setDiscardChanges: (state, action: PayloadAction<boolean>) => {\n state.shouldDiscardChanges = action.payload;\n },\n setPanelEditorUIState: (state, action: PayloadAction<Partial<PanelEditorUIState>>) => {\n state.ui = { ...state.ui, ...action.payload };\n // Close viz picker if closing options pane\n if (!state.ui.isPanelOptionsVisible && state.isVizPickerOpen) {\n state.isVizPickerOpen = false;\n }\n },\n toggleVizPicker: (state, action: PayloadAction<boolean>) => {\n state.isVizPickerOpen = action.payload;\n // Ensure options pane is opened when viz picker is open\n if (state.isVizPickerOpen) {\n state.ui.isPanelOptionsVisible = true;\n }\n },\n toggleTableView(state) {\n state.tableViewEnabled = !state.tableViewEnabled;\n },\n closeEditor: (state) => {\n state.isOpen = false;\n state.initDone = false;\n state.isVizPickerOpen = false;\n state.tableViewEnabled = false;\n },\n },\n});\n\nexport const {\n updateEditorInitState,\n setEditorPanelData,\n setDiscardChanges,\n closeEditor,\n setPanelEditorUIState,\n toggleVizPicker,\n toggleTableView,\n} = pluginsSlice.actions;\n\nexport const panelEditorReducer = pluginsSlice.reducer;\n\nexport default {\n panelEditor: panelEditorReducer,\n};\n","import { DataFrame, FieldConfigSource, PanelData, PanelPlugin } from '@grafana/data';\n\nimport { DashboardModel, PanelModel } from '../../state';\n\nexport interface PanelEditorTab {\n id: string;\n text: string;\n active: boolean;\n icon: string;\n}\n\nexport enum PanelEditorTabId {\n Query = 'query',\n Transform = 'transform',\n Visualize = 'visualize',\n Alert = 'alert',\n}\n\nexport enum DisplayMode {\n Fill = 0,\n Fit = 1,\n Exact = 2,\n}\n\nexport enum PanelEditTableToggle {\n Off = 0,\n Table = 1,\n}\n\nexport const displayModes = [\n { value: DisplayMode.Fill, label: 'Fill', description: 'Use all available space' },\n { value: DisplayMode.Exact, label: 'Actual', description: 'Make same size as on the dashboard' },\n];\n\nexport const panelEditTableModes = [\n {\n value: PanelEditTableToggle.Off,\n label: 'Visualization',\n description: 'Show using selected visualization',\n },\n { value: PanelEditTableToggle.Table, label: 'Table', description: 'Show raw data in table form' },\n];\n\n/** @internal */\nexport interface Props {\n plugin: PanelPlugin;\n config: FieldConfigSource;\n onChange: (config: FieldConfigSource) => void;\n /* Helpful for IntelliSense */\n data: DataFrame[];\n}\n\nexport interface OptionPaneRenderProps {\n panel: PanelModel;\n plugin: PanelPlugin;\n data?: PanelData;\n dashboard: DashboardModel;\n instanceState: any;\n onPanelConfigChange: (configKey: keyof PanelModel, value: any) => void;\n onPanelOptionsChanged: (options: any) => void;\n onFieldConfigsChange: (config: FieldConfigSource) => void;\n}\n\nexport interface OptionPaneItemOverrideInfo {\n type: 'data' | 'rule';\n onClick?: () => void;\n tooltip: string;\n description: string;\n}\n\nexport enum VisualizationSelectPaneTab {\n Visualizations,\n LibraryPanels,\n Suggestions,\n}\n","import { omit } from 'lodash';\n\nimport { FieldConfigSource, PanelPlugin } from '@grafana/data';\nimport { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN, GRID_COLUMN_COUNT } from 'app/core/constants';\n\nimport { PanelModel } from '../../state/PanelModel';\n\nimport { DisplayMode } from './types';\n\nexport function calculatePanelSize(mode: DisplayMode, width: number, height: number, panel: PanelModel) {\n if (mode === DisplayMode.Fill) {\n return { width, height };\n }\n const panelPadding = 8 * 6;\n const sidebarWidth = 60;\n\n const colWidth = (window.innerWidth - sidebarWidth - GRID_CELL_VMARGIN * 4) / GRID_COLUMN_COUNT;\n const pWidth = colWidth * panel.gridPos.w;\n const pHeight = GRID_CELL_HEIGHT * panel.gridPos.h + panelPadding;\n const scale = Math.min(width / pWidth, height / pHeight);\n\n if (pWidth <= width && pHeight <= height) {\n return {\n width: pWidth,\n height: pHeight,\n };\n }\n\n return {\n width: pWidth * scale,\n height: pHeight * scale,\n };\n}\n\nexport function supportsDataQuery(plugin: PanelPlugin | undefined | null): boolean {\n return plugin?.meta.skipDataQuery === false;\n}\n\nexport const updateDefaultFieldConfigValue = (\n config: FieldConfigSource,\n name: string,\n value: any,\n isCustom?: boolean\n) => {\n let defaults = { ...config.defaults };\n const remove = value == null || value === '';\n\n if (isCustom) {\n if (defaults.custom) {\n if (remove) {\n defaults.custom = omit(defaults.custom, name);\n } else {\n defaults.custom = setOptionImmutably(defaults.custom, name, value);\n }\n } else if (!remove) {\n defaults.custom = setOptionImmutably(defaults.custom, name, value);\n }\n } else if (remove) {\n defaults = omit(defaults, name);\n } else {\n defaults = setOptionImmutably(defaults, name, value);\n }\n\n return {\n ...config,\n defaults,\n };\n};\n\nexport function setOptionImmutably<T extends object>(options: T, path: string | string[], value: any): T {\n const splat = !Array.isArray(path) ? path.split('.') : path;\n\n const key = splat.shift()!;\n if (key.endsWith(']')) {\n const idx = key.lastIndexOf('[');\n const index = +key.substring(idx + 1, key.length - 1);\n const propKey = key.substring(0, idx);\n let current = (options as Record<string, any>)[propKey];\n const arr = Array.isArray(current) ? [...current] : [];\n if (splat.length) {\n current = arr[index];\n if (current == null || typeof current !== 'object') {\n current = {};\n }\n value = setOptionImmutably(current, splat, value);\n }\n arr[index] = value;\n return { ...options, [propKey]: arr };\n }\n\n if (!splat.length) {\n return { ...options, [key]: value };\n }\n\n let current = (options as Record<string, any>)[key];\n\n if (current == null || typeof current !== 'object') {\n current = {};\n }\n\n return { ...options, [key]: setOptionImmutably(current, splat, value) };\n}\n","import React from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, ButtonVariant, ModalsController, FullWidthButtonContainer } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state';\n\nimport { SaveDashboardDrawer } from './SaveDashboardDrawer';\n\ninterface SaveDashboardButtonProps {\n dashboard: DashboardModel;\n onSaveSuccess?: () => void;\n}\n\nexport const SaveDashboardButton: React.FC<SaveDashboardButtonProps> = ({ dashboard, onSaveSuccess }) => {\n return (\n <ModalsController>\n {({ showModal, hideModal }) => {\n return (\n <Button\n onClick={() => {\n showModal(SaveDashboardDrawer, {\n dashboard,\n onSaveSuccess,\n onDismiss: hideModal,\n });\n }}\n aria-label={selectors.pages.Dashboard.Settings.General.saveDashBoard}\n >\n Save dashboard\n </Button>\n );\n }}\n </ModalsController>\n );\n};\n\nexport const SaveDashboardAsButton: React.FC<SaveDashboardButtonProps & { variant?: ButtonVariant }> = ({\n dashboard,\n onSaveSuccess,\n variant,\n}) => {\n return (\n <ModalsController>\n {({ showModal, hideModal }) => {\n return (\n <FullWidthButtonContainer>\n <Button\n onClick={() => {\n showModal(SaveDashboardDrawer, {\n dashboard,\n onSaveSuccess,\n onDismiss: hideModal,\n isCopy: true,\n });\n }}\n variant={variant}\n aria-label={selectors.pages.Dashboard.Settings.General.saveAsDashBoard}\n >\n Save As...\n </Button>\n </FullWidthButtonContainer>\n );\n }}\n </ModalsController>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { ReactElement } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Spinner, useStyles2 } from '@grafana/ui';\n\nimport { DiffGroup } from '../VersionHistory/DiffGroup';\nimport { DiffViewer } from '../VersionHistory/DiffViewer';\nimport { Diffs } from '../VersionHistory/utils';\n\ninterface SaveDashboardDiffProps {\n oldValue?: any;\n newValue?: any;\n\n // calculated by parent so we can see summary in tabs\n diff?: Diffs;\n}\n\nexport const SaveDashboardDiff = ({ diff, oldValue, newValue }: SaveDashboardDiffProps) => {\n const styles = useStyles2(getStyles);\n const loader = useAsync(async () => {\n const oldJSON = JSON.stringify(oldValue ?? {}, null, 2);\n const newJSON = JSON.stringify(newValue ?? {}, null, 2);\n\n // Schema changes will have MANY changes that the user will not understand\n let schemaChange: ReactElement | undefined = undefined;\n const diffs: ReactElement[] = [];\n let count = 0;\n if (diff) {\n for (const [key, changes] of Object.entries(diff)) {\n // this takes a long time for large diffs (so this is async)\n const g = <DiffGroup diffs={changes} key={key} title={key} />;\n if (key === 'schemaVersion') {\n schemaChange = g;\n } else {\n diffs.push(g);\n }\n count += changes.length;\n }\n }\n return {\n schemaChange,\n diffs,\n count,\n showDiffs: count < 15, // overwhelming if too many changes\n jsonView: <DiffViewer oldValue={oldJSON} newValue={newJSON} />,\n };\n }, [diff, oldValue, newValue]);\n\n const { value } = loader;\n if (!value || !oldValue) {\n return <Spinner />;\n }\n\n if (value.count < 1) {\n return <div>No changes in this dashboard</div>;\n }\n\n return (\n <div>\n {value.schemaChange && <div className={styles.spacer}>{value.schemaChange}</div>}\n\n {value.showDiffs && <div className={styles.spacer}>{value.diffs}</div>}\n\n <h4>JSON Model</h4>\n {value.jsonView}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n spacer: css`\n margin-bottom: ${theme.v1.spacing.xl};\n `,\n});\n","import { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\n\nimport { locationUtil } from '@grafana/data';\nimport { locationService, reportInteraction } from '@grafana/runtime';\nimport appEvents from 'app/core/app_events';\nimport { useAppNotification } from 'app/core/copy/appNotification';\nimport { contextSrv } from 'app/core/core';\nimport { updateDashboardName } from 'app/core/reducers/navBarTree';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { saveDashboard as saveDashboardApiCall } from 'app/features/manage-dashboards/state/actions';\nimport { DashboardSavedEvent } from 'app/types/events';\n\nimport { SaveDashboardOptions } from './types';\n\nconst saveDashboard = async (saveModel: any, options: SaveDashboardOptions, dashboard: DashboardModel) => {\n let folderId = options.folderId;\n if (folderId === undefined) {\n folderId = dashboard.meta.folderId ?? saveModel.folderId;\n }\n\n const result = await saveDashboardApiCall({ ...options, folderId, dashboard: saveModel });\n // fetch updated access control permissions\n await contextSrv.fetchUserPermissions();\n return result;\n};\n\nexport const useDashboardSave = (dashboard: DashboardModel) => {\n const [state, onDashboardSave] = useAsyncFn(\n async (clone: any, options: SaveDashboardOptions, dashboard: DashboardModel) =>\n await saveDashboard(clone, options, dashboard),\n []\n );\n const dispatch = useDispatch();\n\n const notifyApp = useAppNotification();\n useEffect(() => {\n if (state.error) {\n notifyApp.error(state.error.message ?? 'Error saving dashboard');\n }\n if (state.value) {\n dashboard.version = state.value.version;\n dashboard.clearUnsavedChanges();\n\n // important that these happen before location redirect below\n appEvents.publish(new DashboardSavedEvent());\n notifyApp.success('Dashboard saved');\n reportInteraction(`Dashboard ${dashboard.id ? 'saved' : 'created'}`, {\n name: dashboard.title,\n url: state.value.url,\n });\n\n const currentPath = locationService.getLocation().pathname;\n const newUrl = locationUtil.stripBaseFromUrl(state.value.url);\n\n if (newUrl !== currentPath) {\n setTimeout(() => locationService.replace(newUrl));\n }\n if (dashboard.meta.isStarred) {\n dispatch(\n updateDashboardName({\n id: dashboard.uid,\n title: dashboard.title,\n url: newUrl,\n })\n );\n }\n }\n }, [dashboard, state, notifyApp, dispatch]);\n\n return { state, onDashboardSave };\n};\n","import { css } from '@emotion/css';\nimport React, { useEffect } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Button, ConfirmModal, Modal, stylesFactory, useTheme } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state';\n\nimport { SaveDashboardAsButton } from './SaveDashboardButton';\nimport { SaveDashboardModalProps } from './types';\nimport { useDashboardSave } from './useDashboardSave';\n\ninterface SaveDashboardErrorProxyProps {\n /** original dashboard */\n dashboard: DashboardModel;\n /** dashboard save model with applied modifications, i.e. title */\n dashboardSaveModel: any;\n error: any;\n onDismiss: () => void;\n}\n\nexport const SaveDashboardErrorProxy: React.FC<SaveDashboardErrorProxyProps> = ({\n dashboard,\n dashboardSaveModel,\n error,\n onDismiss,\n}) => {\n const { onDashboardSave } = useDashboardSave(dashboard);\n\n useEffect(() => {\n if (error.data && isHandledError(error.data.status)) {\n error.isHandled = true;\n }\n }, [error]);\n\n return (\n <>\n {error.data && error.data.status === 'version-mismatch' && (\n <ConfirmModal\n isOpen={true}\n title=\"Conflict\"\n body={\n <div>\n Someone else has updated this dashboard <br /> <small>Would you still like to save this dashboard?</small>\n </div>\n }\n confirmText=\"Save and overwrite\"\n onConfirm={async () => {\n await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);\n onDismiss();\n }}\n onDismiss={onDismiss}\n />\n )}\n {error.data && error.data.status === 'name-exists' && (\n <ConfirmModal\n isOpen={true}\n title=\"Conflict\"\n body={\n <div>\n A dashboard with the same name in selected folder already exists. <br />\n <small>Would you still like to save this dashboard?</small>\n </div>\n }\n confirmText=\"Save and overwrite\"\n onConfirm={async () => {\n await onDashboardSave(dashboardSaveModel, { overwrite: true }, dashboard);\n onDismiss();\n }}\n onDismiss={onDismiss}\n />\n )}\n {error.data && error.data.status === 'plugin-dashboard' && (\n <ConfirmPluginDashboardSaveModal dashboard={dashboard} onDismiss={onDismiss} />\n )}\n </>\n );\n};\n\nconst ConfirmPluginDashboardSaveModal: React.FC<SaveDashboardModalProps> = ({ onDismiss, dashboard }) => {\n const theme = useTheme();\n const { onDashboardSave } = useDashboardSave(dashboard);\n const styles = getConfirmPluginDashboardSaveModalStyles(theme);\n\n return (\n <Modal className={styles.modal} title=\"Plugin dashboard\" icon=\"copy\" isOpen={true} onDismiss={onDismiss}>\n <div className={styles.modalText}>\n Your changes will be lost when you update the plugin.\n <br />\n <small>\n Use <strong>Save As</strong> to create custom version.\n </small>\n </div>\n <Modal.ButtonRow>\n <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n Cancel\n </Button>\n <SaveDashboardAsButton dashboard={dashboard} onSaveSuccess={onDismiss} />\n <Button\n variant=\"destructive\"\n onClick={async () => {\n await onDashboardSave(dashboard.getSaveModelClone(), { overwrite: true }, dashboard);\n onDismiss();\n }}\n >\n Overwrite\n </Button>\n </Modal.ButtonRow>\n </Modal>\n );\n};\n\nconst isHandledError = (errorStatus: string) => {\n switch (errorStatus) {\n case 'version-mismatch':\n case 'name-exists':\n case 'plugin-dashboard':\n return true;\n\n default:\n return false;\n }\n};\n\nconst getConfirmPluginDashboardSaveModalStyles = stylesFactory((theme: GrafanaTheme) => ({\n modal: css`\n width: 500px;\n `,\n modalText: css`\n font-size: ${theme.typography.heading.h4};\n color: ${theme.colors.link};\n margin-bottom: calc(${theme.spacing.d} * 2);\n padding-top: ${theme.spacing.d};\n `,\n modalButtonRow: css`\n margin-bottom: 14px;\n a,\n button {\n margin-right: ${theme.spacing.d};\n }\n `,\n}));\n","import React from 'react';\n\nimport { Button, Input, Switch, Form, Field, InputControl, HorizontalGroup } from '@grafana/ui';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { validationSrv } from 'app/features/manage-dashboards/services/ValidationSrv';\n\nimport { SaveDashboardFormProps } from '../types';\n\ninterface SaveDashboardAsFormDTO {\n title: string;\n $folder: { id?: number; title?: string };\n copyTags: boolean;\n}\n\nconst getSaveAsDashboardClone = (dashboard: DashboardModel) => {\n const clone: any = dashboard.getSaveModelClone();\n clone.id = null;\n clone.uid = '';\n clone.title += ' Copy';\n clone.editable = true;\n\n // remove alerts if source dashboard is already persisted\n // do not want to create alert dupes\n if (dashboard.id > 0) {\n clone.panels.forEach((panel: PanelModel) => {\n if (panel.type === 'graph' && panel.alert) {\n delete panel.thresholds;\n }\n delete panel.alert;\n });\n }\n\n delete clone.autoUpdate;\n return clone;\n};\n\nexport interface SaveDashboardAsFormProps extends SaveDashboardFormProps {\n isNew?: boolean;\n}\n\nexport const SaveDashboardAsForm: React.FC<SaveDashboardAsFormProps> = ({\n dashboard,\n isNew,\n onSubmit,\n onCancel,\n onSuccess,\n}) => {\n const defaultValues: SaveDashboardAsFormDTO = {\n title: isNew ? dashboard.title : `${dashboard.title} Copy`,\n $folder: {\n id: dashboard.meta.folderId,\n title: dashboard.meta.folderTitle,\n },\n copyTags: false,\n };\n\n const validateDashboardName = (getFormValues: () => SaveDashboardAsFormDTO) => async (dashboardName: string) => {\n if (dashboardName && dashboardName === getFormValues().$folder.title?.trim()) {\n return 'Dashboard name cannot be the same as folder name';\n }\n try {\n await validationSrv.validateNewDashboardName(getFormValues().$folder.id, dashboardName);\n return true;\n } catch (e) {\n return e instanceof Error ? e.message : 'Dashboard name is invalid';\n }\n };\n\n return (\n <Form\n defaultValues={defaultValues}\n onSubmit={async (data: SaveDashboardAsFormDTO) => {\n if (!onSubmit) {\n return;\n }\n\n const clone = getSaveAsDashboardClone(dashboard);\n clone.title = data.title;\n if (!data.copyTags) {\n clone.tags = [];\n }\n\n const result = await onSubmit(\n clone,\n {\n folderId: data.$folder.id,\n },\n dashboard\n );\n\n if (result.status === 'success') {\n onSuccess();\n }\n }}\n >\n {({ register, control, errors, getValues }) => (\n <>\n <Field label=\"Dashboard name\" invalid={!!errors.title} error={errors.title?.message}>\n <Input\n {...register('title', {\n validate: validateDashboardName(getValues),\n })}\n aria-label=\"Save dashboard title field\"\n autoFocus\n />\n </Field>\n <Field label=\"Folder\">\n <InputControl\n render={({ field: { ref, ...field } }) => (\n <FolderPicker\n {...field}\n dashboardId={dashboard.id}\n initialFolderId={dashboard.meta.folderId}\n initialTitle={dashboard.meta.folderTitle}\n enableCreateNew\n />\n )}\n control={control}\n name=\"$folder\"\n />\n </Field>\n {!isNew && (\n <Field label=\"Copy tags\">\n <Switch {...register('copyTags')} />\n </Field>\n )}\n <HorizontalGroup>\n <Button type=\"button\" variant=\"secondary\" onClick={onCancel} fill=\"outline\">\n Cancel\n </Button>\n <Button type=\"submit\" aria-label=\"Save dashboard button\">\n Save\n </Button>\n </HorizontalGroup>\n </>\n )}\n </Form>\n );\n};\n","import React, { useMemo, useState } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Stack } from '@grafana/experimental';\nimport { Button, Checkbox, Form, TextArea } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state';\n\nimport { SaveDashboardData, SaveDashboardOptions } from '../types';\n\ninterface FormDTO {\n message: string;\n}\n\nexport type SaveProps = {\n dashboard: DashboardModel; // original\n saveModel: SaveDashboardData; // already cloned\n onCancel: () => void;\n onSuccess: () => void;\n onSubmit?: (clone: any, options: SaveDashboardOptions, dashboard: DashboardModel) => Promise<any>;\n options: SaveDashboardOptions;\n onOptionsChange: (opts: SaveDashboardOptions) => void;\n};\n\nexport const SaveDashboardForm = ({\n dashboard,\n saveModel,\n options,\n onSubmit,\n onCancel,\n onSuccess,\n onOptionsChange,\n}: SaveProps) => {\n const hasTimeChanged = useMemo(() => dashboard.hasTimeChanged(), [dashboard]);\n const hasVariableChanged = useMemo(() => dashboard.hasVariableValuesChanged(), [dashboard]);\n\n const [saving, setSaving] = useState(false);\n\n return (\n <Form\n onSubmit={async (data: FormDTO) => {\n if (!onSubmit) {\n return;\n }\n setSaving(true);\n options = { ...options, message: data.message };\n const result = await onSubmit(saveModel.clone, options, dashboard);\n if (result.status === 'success') {\n if (options.saveVariables) {\n dashboard.resetOriginalVariables();\n }\n if (options.saveTimerange) {\n dashboard.resetOriginalTime();\n }\n onSuccess();\n } else {\n setSaving(false);\n }\n }}\n >\n {({ register, errors }) => (\n <Stack direction=\"column\" gap={2}>\n {hasTimeChanged && (\n <Checkbox\n checked={!!options.saveTimerange}\n onChange={() =>\n onOptionsChange({\n ...options,\n saveTimerange: !options.saveTimerange,\n })\n }\n label=\"Save current time range as dashboard default\"\n aria-label={selectors.pages.SaveDashboardModal.saveTimerange}\n />\n )}\n {hasVariableChanged && (\n <Checkbox\n checked={!!options.saveVariables}\n onChange={() =>\n onOptionsChange({\n ...options,\n saveVariables: !options.saveVariables,\n })\n }\n label=\"Save current variable values as dashboard default\"\n aria-label={selectors.pages.SaveDashboardModal.saveVariables}\n />\n )}\n\n <TextArea {...register('message')} placeholder=\"Add a note to describe your changes.\" autoFocus rows={5} />\n\n <Stack alignItems=\"center\">\n <Button variant=\"secondary\" onClick={onCancel} fill=\"outline\">\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={!saveModel.hasChanges}\n icon={saving ? 'fa fa-spinner' : undefined}\n aria-label={selectors.pages.SaveDashboardModal.save}\n >\n Save\n </Button>\n {!saveModel.hasChanges && <div>No changes to save</div>}\n </Stack>\n </Stack>\n )}\n </Form>\n );\n};\n","import { css } from '@emotion/css';\nimport { saveAs } from 'file-saver';\nimport React, { useCallback, useState } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Button, ClipboardButton, HorizontalGroup, stylesFactory, TextArea, useTheme } from '@grafana/ui';\n\nimport { SaveDashboardFormProps } from '../types';\n\nexport const SaveProvisionedDashboardForm: React.FC<SaveDashboardFormProps> = ({ dashboard, onCancel }) => {\n const theme = useTheme();\n const [dashboardJSON, setDashboardJson] = useState(() => {\n const clone = dashboard.getSaveModelClone();\n delete clone.id;\n return JSON.stringify(clone, null, 2);\n });\n\n const saveToFile = useCallback(() => {\n const blob = new Blob([dashboardJSON], {\n type: 'application/json;charset=utf-8',\n });\n saveAs(blob, dashboard.title + '-' + new Date().getTime() + '.json');\n }, [dashboard.title, dashboardJSON]);\n\n const styles = getStyles(theme);\n return (\n <>\n <Stack direction=\"column\" gap={2}>\n <div>\n This dashboard cannot be saved from the Grafana UI because it has been provisioned from another source. Copy\n the JSON or save it to a file below, then you can update your dashboard in the provisioning source.\n <br />\n <i>\n See{' '}\n <a\n className=\"external-link\"\n href=\"https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n documentation\n </a>{' '}\n for more information about provisioning.\n </i>\n <br /> <br />\n <strong>File path: </strong> {dashboard.meta.provisionedExternalId}\n </div>\n <TextArea\n spellCheck={false}\n value={dashboardJSON}\n onChange={(e) => {\n setDashboardJson(e.currentTarget.value);\n }}\n className={styles.json}\n />\n <HorizontalGroup>\n <Button variant=\"secondary\" onClick={onCancel} fill=\"outline\">\n Cancel\n </Button>\n <ClipboardButton icon=\"copy\" getText={() => dashboardJSON}>\n Copy JSON to clipboard\n </ClipboardButton>\n <Button type=\"submit\" onClick={saveToFile}>\n Save JSON to file\n </Button>\n </HorizontalGroup>\n </Stack>\n </>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n json: css`\n height: 400px;\n width: 100%;\n overflow: auto;\n resize: none;\n font-family: monospace;\n `,\n };\n});\n","import React, { useMemo, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Stack } from '@grafana/experimental';\nimport { locationService } from '@grafana/runtime';\nimport {\n Button,\n Checkbox,\n Field,\n Form,\n HorizontalGroup,\n Input,\n RadioButtonGroup,\n Spinner,\n TextArea,\n} from '@grafana/ui';\nimport { getGrafanaStorage } from 'app/features/storage/storage';\nimport { ItemOptions, WorkflowID, WriteValueResponse } from 'app/features/storage/types';\n\nimport { SaveProps } from './SaveDashboardForm';\n\ninterface FormDTO {\n title?: string;\n message: string;\n}\n\ninterface Props extends SaveProps {\n isNew?: boolean;\n isCopy?: boolean;\n}\n\nexport function SaveToStorageForm(props: Props) {\n const { dashboard, saveModel, onSubmit, onCancel, onSuccess, onOptionsChange, isNew, isCopy } = props;\n const hasTimeChanged = useMemo(() => dashboard.hasTimeChanged(), [dashboard]);\n const hasVariableChanged = useMemo(() => dashboard.hasVariableValuesChanged(), [dashboard]);\n const [saving, setSaving] = useState(false);\n const [response, setResponse] = useState<WriteValueResponse>();\n const [path, setPath] = useState(dashboard.uid);\n const [workflow, setWorkflow] = useState(WorkflowID.Save);\n const saveText = useMemo(() => {\n switch (workflow) {\n case WorkflowID.PR:\n return 'Create PR';\n case WorkflowID.Push:\n return 'Push';\n }\n console.log('???', workflow);\n return 'Save';\n }, [workflow]);\n\n const item = useAsync(async () => {\n const opts = await getGrafanaStorage().getOptions(dashboard.uid);\n setWorkflow(opts.workflows[0]?.value ?? WorkflowID.Save);\n return opts;\n }, [dashboard.uid]);\n\n if (item.error) {\n return <div>Error loading workflows</div>;\n }\n\n if (item.loading || !item.value) {\n return <Spinner />;\n }\n\n if (response) {\n return (\n <div>\n {response.url && (\n <div>\n <h2>View pull request</h2>\n <a href={response.url}>{response.url}</a>\n </div>\n )}\n\n <pre>{JSON.stringify(response)}</pre>\n\n <HorizontalGroup>\n <Button variant=\"secondary\" onClick={onCancel}>\n Close\n </Button>\n </HorizontalGroup>\n </div>\n );\n }\n\n let options = props.options;\n const workflows = item.value?.workflows ?? [];\n const canSave = saveModel.hasChanges || isNew || isCopy;\n\n return (\n <Form\n onSubmit={async (data: FormDTO) => {\n if (!onSubmit) {\n return;\n }\n setSaving(true);\n\n let uid = saveModel.clone.uid;\n if (isNew || isCopy) {\n uid = path;\n if (!uid.endsWith('-dash.json')) {\n uid += '-dash.json';\n }\n }\n const rsp = await getGrafanaStorage().write(uid, {\n body: saveModel.clone,\n kind: 'dashboard',\n title: data.title,\n message: data.message,\n workflow: workflow,\n });\n\n console.log('GOT', rsp);\n if (rsp.code === 200) {\n if (options.saveVariables) {\n dashboard.resetOriginalVariables();\n }\n if (options.saveTimerange) {\n dashboard.resetOriginalTime();\n }\n\n if (!rsp.pending) {\n // should close\n onSuccess();\n\n // Need to update the URL\n if (isNew || isCopy) {\n locationService.push(`/g/${uid}`);\n }\n }\n } else {\n setSaving(false);\n }\n setResponse(rsp);\n }}\n >\n {({ register, errors }) => (\n <Stack direction=\"column\" gap={1}>\n <Stack direction=\"column\" gap={1}>\n {hasTimeChanged && (\n <Checkbox\n checked={!!options.saveTimerange}\n onChange={() =>\n onOptionsChange({\n ...options,\n saveTimerange: !options.saveTimerange,\n })\n }\n label=\"Save current time range as dashboard default\"\n aria-label={selectors.pages.SaveDashboardModal.saveTimerange}\n />\n )}\n {hasVariableChanged && (\n <Checkbox\n checked={!!options.saveVariables}\n onChange={() =>\n onOptionsChange({\n ...options,\n saveVariables: !options.saveVariables,\n })\n }\n label=\"Save current variable values as dashboard default\"\n aria-label={selectors.pages.SaveDashboardModal.saveVariables}\n />\n )}\n </Stack>\n\n {(isNew || isCopy) && (\n <Field label=\"Path\">\n <Input\n value={path ?? ''}\n required\n autoFocus\n placeholder=\"Full path (todo, help validate)\"\n onChange={(v) => setPath(v.currentTarget.value)}\n />\n </Field>\n )}\n\n {!isJustSave(item.value) && (\n <Field label=\"Workflow\">\n <RadioButtonGroup value={workflow} options={workflows} onChange={setWorkflow} />\n </Field>\n )}\n\n {workflow === WorkflowID.PR && (\n <Field label=\"PR Title\">\n <Input {...register('title')} required placeholder=\"Enter a PR title\" autoFocus />\n </Field>\n )}\n\n <Field label=\"Message\">\n <TextArea {...register('message')} placeholder=\"Add a note to describe your changes.\" rows={5} />\n </Field>\n\n <HorizontalGroup>\n <Button variant=\"secondary\" onClick={onCancel} fill=\"outline\">\n Cancel\n </Button>\n <Button\n type=\"submit\"\n disabled={!canSave}\n icon={saving ? 'fa fa-spinner' : undefined}\n aria-label={selectors.pages.SaveDashboardModal.save}\n >\n {saveText}\n </Button>\n {!canSave && <div>No changes to save</div>}\n </HorizontalGroup>\n </Stack>\n )}\n </Form>\n );\n}\n\nfunction isJustSave(opts: ItemOptions): boolean {\n if (opts.workflows.length === 1) {\n return opts.workflows.find((v) => v.value === WorkflowID.Save) != null;\n }\n return false;\n}\n","import React, { useMemo, useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { config } from '@grafana/runtime';\nimport { Drawer, Spinner, Tab, TabsBar } from '@grafana/ui';\nimport { backendSrv } from 'app/core/services/backend_srv';\n\nimport { jsonDiff } from '../VersionHistory/utils';\n\nimport { SaveDashboardDiff } from './SaveDashboardDiff';\nimport { SaveDashboardErrorProxy } from './SaveDashboardErrorProxy';\nimport { SaveDashboardAsForm } from './forms/SaveDashboardAsForm';\nimport { SaveDashboardForm } from './forms/SaveDashboardForm';\nimport { SaveProvisionedDashboardForm } from './forms/SaveProvisionedDashboardForm';\nimport { SaveToStorageForm } from './forms/SaveToStorageForm';\nimport { SaveDashboardData, SaveDashboardModalProps, SaveDashboardOptions } from './types';\nimport { useDashboardSave } from './useDashboardSave';\n\nexport const SaveDashboardDrawer = ({ dashboard, onDismiss, onSaveSuccess, isCopy }: SaveDashboardModalProps) => {\n const [options, setOptions] = useState<SaveDashboardOptions>({});\n\n const isFromStorage = config.featureToggles.dashboardsFromStorage && dashboard.uid.indexOf('/') > 0;\n const isProvisioned = dashboard.meta.provisioned && !isFromStorage;\n const isNew = dashboard.version === 0 && !isFromStorage;\n\n const previous = useAsync(async () => {\n if (isNew) {\n return undefined;\n }\n\n const result = await backendSrv.getDashboardByUid(dashboard.uid);\n return result.dashboard;\n }, [dashboard, isNew]);\n\n const data = useMemo<SaveDashboardData>(() => {\n const clone = dashboard.getSaveModelClone({\n saveTimerange: Boolean(options.saveTimerange),\n saveVariables: Boolean(options.saveVariables),\n });\n\n if (!previous.value) {\n return { clone, diff: {}, diffCount: 0, hasChanges: false };\n }\n\n const cloneJSON = JSON.stringify(clone, null, 2);\n const cloneSafe = JSON.parse(cloneJSON); // avoids undefined issues\n\n const diff = jsonDiff(previous.value, cloneSafe);\n let diffCount = 0;\n for (const d of Object.values(diff)) {\n diffCount += d.length;\n }\n\n return {\n clone,\n diff,\n diffCount,\n hasChanges: diffCount > 0 && !isNew,\n };\n }, [dashboard, previous.value, options, isNew]);\n\n const [showDiff, setShowDiff] = useState(false);\n const { state, onDashboardSave } = useDashboardSave(dashboard);\n const onSuccess = onSaveSuccess\n ? () => {\n onDismiss();\n onSaveSuccess();\n }\n : onDismiss;\n\n const renderBody = () => {\n if (showDiff) {\n return <SaveDashboardDiff diff={data.diff} oldValue={previous.value} newValue={data.clone} />;\n }\n\n if (state.loading) {\n return (\n <div>\n <Spinner />\n </div>\n );\n }\n\n if (isFromStorage) {\n return (\n <SaveToStorageForm\n dashboard={dashboard}\n saveModel={data}\n onCancel={onDismiss}\n onSuccess={onSuccess}\n onSubmit={onDashboardSave}\n options={options}\n onOptionsChange={setOptions}\n isNew={isNew}\n isCopy={isCopy}\n />\n );\n }\n\n if (isNew || isCopy) {\n return (\n <SaveDashboardAsForm\n dashboard={dashboard}\n onCancel={onDismiss}\n onSuccess={onSuccess}\n onSubmit={onDashboardSave}\n isNew={isNew}\n />\n );\n }\n\n if (isProvisioned) {\n return <SaveProvisionedDashboardForm dashboard={dashboard} onCancel={onDismiss} onSuccess={onSuccess} />;\n }\n\n return (\n <SaveDashboardForm\n dashboard={dashboard}\n saveModel={data}\n onCancel={onDismiss}\n onSuccess={onSuccess}\n onSubmit={onDashboardSave}\n options={options}\n onOptionsChange={setOptions}\n />\n );\n };\n\n if (state.error) {\n return (\n <SaveDashboardErrorProxy\n error={state.error}\n dashboard={dashboard}\n dashboardSaveModel={data.clone}\n onDismiss={onDismiss}\n />\n );\n }\n\n let title = 'Save dashboard';\n if (isCopy) {\n title = 'Save dashboard copy';\n } else if (isProvisioned) {\n title = 'Provisioned dashboard';\n }\n\n return (\n <Drawer\n title={title}\n onClose={onDismiss}\n width={'40%'}\n subtitle={dashboard.title}\n tabs={\n <TabsBar>\n <Tab label={'Details'} active={!showDiff} onChangeTab={() => setShowDiff(false)} />\n <Tab label={'Changes'} active={showDiff} onChangeTab={() => setShowDiff(true)} counter={data.diffCount} />\n </TabsBar>\n }\n expandable\n scrollableContent\n >\n {renderBody()}\n </Drawer>\n );\n};\n","import React, { FormEvent, PureComponent } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime/src';\nimport { ClipboardButton, Field, Modal, RadioButtonGroup, Switch, TextArea } from '@grafana/ui';\n\nimport { ShareModalTabProps } from './types';\nimport { buildIframeHtml } from './utils';\n\nconst themeOptions: Array<SelectableValue<string>> = [\n { label: 'Current', value: 'current' },\n { label: 'Dark', value: 'dark' },\n { label: 'Light', value: 'light' },\n];\n\ninterface Props extends ShareModalTabProps {}\n\ninterface State {\n useCurrentTimeRange: boolean;\n selectedTheme: string;\n iframeHtml: string;\n}\n\nexport class ShareEmbed extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n useCurrentTimeRange: true,\n selectedTheme: 'current',\n iframeHtml: '',\n };\n }\n\n componentDidMount() {\n reportInteraction('grafana_dashboards_embed_share_viewed');\n this.buildIframeHtml();\n }\n\n buildIframeHtml = () => {\n const { panel, dashboard } = this.props;\n const { useCurrentTimeRange, selectedTheme } = this.state;\n\n const iframeHtml = buildIframeHtml(useCurrentTimeRange, dashboard.uid, selectedTheme, panel);\n this.setState({ iframeHtml });\n };\n\n onIframeHtmlChange = (event: FormEvent<HTMLTextAreaElement>) => {\n this.setState({ iframeHtml: event.currentTarget.value });\n };\n\n onUseCurrentTimeRangeChange = () => {\n this.setState(\n {\n useCurrentTimeRange: !this.state.useCurrentTimeRange,\n },\n this.buildIframeHtml\n );\n };\n\n onThemeChange = (value: string) => {\n this.setState({ selectedTheme: value }, this.buildIframeHtml);\n };\n\n getIframeHtml = () => {\n return this.state.iframeHtml;\n };\n\n render() {\n const { useCurrentTimeRange, selectedTheme, iframeHtml } = this.state;\n const isRelativeTime = this.props.dashboard ? this.props.dashboard.time.to === 'now' : false;\n\n return (\n <>\n <p className=\"share-modal-info-text\">Generate HTML for embedding an iframe with this panel.</p>\n <Field\n label=\"Current time range\"\n description={isRelativeTime ? 'Transforms the current relative time range to an absolute time range' : ''}\n >\n <Switch\n id=\"share-current-time-range\"\n value={useCurrentTimeRange}\n onChange={this.onUseCurrentTimeRangeChange}\n />\n </Field>\n <Field label=\"Theme\">\n <RadioButtonGroup options={themeOptions} value={selectedTheme} onChange={this.onThemeChange} />\n </Field>\n <Field\n label=\"Embed HTML\"\n description=\"The HTML code below can be pasted and included in another web page. Unless anonymous access is enabled,\n the user viewing that page need to be signed into Grafana for the graph to load.\"\n >\n <TextArea\n data-testid=\"share-embed-html\"\n id=\"share-panel-embed-embed-html-textarea\"\n rows={5}\n value={iframeHtml}\n onChange={this.onIframeHtmlChange}\n />\n </Field>\n <Modal.ButtonRow>\n <ClipboardButton icon=\"copy\" variant=\"primary\" getText={this.getIframeHtml}>\n Copy to clipboard\n </ClipboardButton>\n </Modal.ButtonRow>\n </>\n );\n }\n}\n","import React, { useCallback } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { ClipboardButton, CodeEditor, Modal } from '@grafana/ui';\n\nexport interface ViewJsonModalProps {\n json: string;\n onDismiss: () => void;\n}\n\nexport function ViewJsonModal({ json, onDismiss }: ViewJsonModalProps): JSX.Element {\n const getClipboardText = useCallback(() => json, [json]);\n return (\n <Modal title=\"JSON\" onDismiss={onDismiss} onClickBackdrop={onDismiss} isOpen>\n <AutoSizer disableHeight>\n {({ width }) => <CodeEditor value={json} language=\"json\" showMiniMap={false} height=\"500px\" width={width} />}\n </AutoSizer>\n <Modal.ButtonRow>\n <ClipboardButton icon=\"copy\" getText={getClipboardText}>\n Copy to Clipboard\n </ClipboardButton>\n </Modal.ButtonRow>\n </Modal>\n );\n}\n","import { Trans, t } from '@lingui/macro';\nimport { saveAs } from 'file-saver';\nimport React, { PureComponent } from 'react';\n\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { Button, Field, Modal, Switch } from '@grafana/ui';\nimport { appEvents } from 'app/core/core';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { DashboardExporter } from 'app/features/dashboard/components/DashExportModal';\nimport { ShowModalReactEvent } from 'app/types/events';\n\nimport { ViewJsonModal } from './ViewJsonModal';\nimport { ShareModalTabProps } from './types';\n\ninterface Props extends ShareModalTabProps {}\n\ninterface State {\n shareExternally: boolean;\n trimDefaults: boolean;\n}\n\nexport class ShareExport extends PureComponent<Props, State> {\n private exporter: DashboardExporter;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n shareExternally: false,\n trimDefaults: false,\n };\n\n this.exporter = new DashboardExporter();\n }\n\n componentDidMount() {\n reportInteraction('grafana_dashboards_export_share_viewed');\n }\n\n onShareExternallyChange = () => {\n this.setState({\n shareExternally: !this.state.shareExternally,\n });\n };\n\n onTrimDefaultsChange = () => {\n this.setState({\n trimDefaults: !this.state.trimDefaults,\n });\n };\n\n onSaveAsFile = () => {\n const { dashboard } = this.props;\n const { shareExternally } = this.state;\n const { trimDefaults } = this.state;\n\n if (shareExternally) {\n this.exporter.makeExportable(dashboard).then((dashboardJson: any) => {\n if (trimDefaults) {\n getBackendSrv()\n .post('/api/dashboards/trim', { dashboard: dashboardJson })\n .then((resp: any) => {\n this.openSaveAsDialog(resp.dashboard);\n });\n } else {\n this.openSaveAsDialog(dashboardJson);\n }\n });\n } else {\n if (trimDefaults) {\n getBackendSrv()\n .post('/api/dashboards/trim', { dashboard: dashboard.getSaveModelClone() })\n .then((resp: any) => {\n this.openSaveAsDialog(resp.dashboard);\n });\n } else {\n this.openSaveAsDialog(dashboard.getSaveModelClone());\n }\n }\n };\n\n onViewJson = () => {\n const { dashboard } = this.props;\n const { shareExternally } = this.state;\n const { trimDefaults } = this.state;\n\n if (shareExternally) {\n this.exporter.makeExportable(dashboard).then((dashboardJson: any) => {\n if (trimDefaults) {\n getBackendSrv()\n .post('/api/dashboards/trim', { dashboard: dashboardJson })\n .then((resp: any) => {\n this.openJsonModal(resp.dashboard);\n });\n } else {\n this.openJsonModal(dashboardJson);\n }\n });\n } else {\n if (trimDefaults) {\n getBackendSrv()\n .post('/api/dashboards/trim', { dashboard: dashboard.getSaveModelClone() })\n .then((resp: any) => {\n this.openJsonModal(resp.dashboard);\n });\n } else {\n this.openJsonModal(dashboard.getSaveModelClone());\n }\n }\n };\n\n openSaveAsDialog = (dash: any) => {\n const dashboardJsonPretty = JSON.stringify(dash, null, 2);\n const blob = new Blob([dashboardJsonPretty], {\n type: 'application/json;charset=utf-8',\n });\n const time = new Date().getTime();\n saveAs(blob, `${dash.title}-${time}.json`);\n };\n\n openJsonModal = (clone: object) => {\n appEvents.publish(\n new ShowModalReactEvent({\n props: {\n json: JSON.stringify(clone, null, 2),\n },\n component: ViewJsonModal,\n })\n );\n\n this.props.onDismiss?.();\n };\n\n render() {\n const { onDismiss } = this.props;\n const { shareExternally } = this.state;\n const { trimDefaults } = this.state;\n\n const exportExternallyTranslation = t({\n id: 'share-modal.export.share-externally-label',\n message: `Export for sharing externally`,\n });\n\n const exportDefaultTranslation = t({\n id: 'share-modal.export.share-default-label',\n message: `Export with default values removed`,\n });\n\n return (\n <>\n <p className=\"share-modal-info-text\">\n <Trans id=\"share-modal.export.info-text\">Export this dashboard.</Trans>\n </p>\n <Field label={exportExternallyTranslation}>\n <Switch id=\"share-externally-toggle\" value={shareExternally} onChange={this.onShareExternallyChange} />\n </Field>\n {config.featureToggles.trimDefaults && (\n <Field label={exportDefaultTranslation}>\n <Switch id=\"trim-defaults-toggle\" value={trimDefaults} onChange={this.onTrimDefaultsChange} />\n </Field>\n )}\n <Modal.ButtonRow>\n <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n <Trans id=\"share-modal.export.cancel-button\">Cancel</Trans>\n </Button>\n <Button variant=\"secondary\" onClick={this.onViewJson}>\n <Trans id=\"share-modal.export.view-button\">View JSON</Trans>\n </Button>\n <Button variant=\"primary\" onClick={this.onSaveAsFile}>\n <Trans id=\"share-modal.export.save-button\">Save to file</Trans>\n </Button>\n </Modal.ButtonRow>\n </>\n );\n }\n}\n","import React, { useEffect } from 'react';\n\nimport { reportInteraction } from '@grafana/runtime/src';\nimport { AddLibraryPanelContents } from 'app/features/library-panels/components/AddLibraryPanelModal/AddLibraryPanelModal';\n\nimport { ShareModalTabProps } from './types';\n\ninterface Props extends ShareModalTabProps {\n initialFolderId?: number;\n}\n\nexport const ShareLibraryPanel = ({ panel, initialFolderId, onDismiss }: Props) => {\n useEffect(() => {\n reportInteraction('grafana_dashboards_library_panel_share_viewed');\n }, []);\n\n if (!panel) {\n return null;\n }\n\n return (\n <>\n <p className=\"share-modal-info-text\">Create library panel.</p>\n <AddLibraryPanelContents panel={panel} initialFolderId={initialFolderId} onDismiss={onDismiss!} />\n </>\n );\n};\n","import { Trans, t } from '@lingui/macro';\nimport React, { PureComponent } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport { reportInteraction } from '@grafana/runtime/src';\nimport { Alert, ClipboardButton, Field, FieldSet, Icon, Input, RadioButtonGroup, Switch } from '@grafana/ui';\nimport config from 'app/core/config';\n\nimport { ShareModalTabProps } from './types';\nimport { buildImageUrl, buildShareUrl } from './utils';\n\nexport interface Props extends ShareModalTabProps {}\n\nexport interface State {\n useCurrentTimeRange: boolean;\n useShortUrl: boolean;\n selectedTheme: string;\n shareUrl: string;\n imageUrl: string;\n}\n\nexport class ShareLink extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n useCurrentTimeRange: true,\n useShortUrl: false,\n selectedTheme: 'current',\n shareUrl: '',\n imageUrl: '',\n };\n }\n\n componentDidMount() {\n reportInteraction('grafana_dashboards_link_share_viewed');\n this.buildUrl();\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n const { useCurrentTimeRange, useShortUrl, selectedTheme } = this.state;\n if (\n prevState.useCurrentTimeRange !== useCurrentTimeRange ||\n prevState.selectedTheme !== selectedTheme ||\n prevState.useShortUrl !== useShortUrl\n ) {\n this.buildUrl();\n }\n }\n\n buildUrl = async () => {\n const { panel, dashboard } = this.props;\n const { useCurrentTimeRange, useShortUrl, selectedTheme } = this.state;\n\n const shareUrl = await buildShareUrl(useCurrentTimeRange, selectedTheme, panel, useShortUrl);\n const imageUrl = buildImageUrl(useCurrentTimeRange, dashboard.uid, selectedTheme, panel);\n\n this.setState({ shareUrl, imageUrl });\n };\n\n onUseCurrentTimeRangeChange = () => {\n this.setState({ useCurrentTimeRange: !this.state.useCurrentTimeRange });\n };\n\n onUrlShorten = () => {\n this.setState({ useShortUrl: !this.state.useShortUrl });\n };\n\n onThemeChange = (value: string) => {\n this.setState({ selectedTheme: value });\n };\n\n getShareUrl = () => {\n return this.state.shareUrl;\n };\n\n render() {\n const { panel, dashboard } = this.props;\n const isRelativeTime = dashboard ? dashboard.time.to === 'now' : false;\n const { useCurrentTimeRange, useShortUrl, selectedTheme, shareUrl, imageUrl } = this.state;\n const selectors = e2eSelectors.pages.SharePanelModal;\n const isDashboardSaved = Boolean(dashboard.id);\n\n const timeRangeLabelTranslation = t({\n id: 'share-modal.link.time-range-label',\n message: `Lock time range`,\n });\n\n const timeRangeDescriptionTranslation = t({\n id: 'share-modal.link.time-range-description',\n message: `Transforms the current relative time range to an absolute time range`,\n });\n\n const shortenURLTranslation = t({\n id: 'share-modal.link.shorten-url',\n message: `Shorten URL`,\n });\n\n const linkURLTranslation = t({\n id: 'share-modal.link.link-url',\n message: `Link URL`,\n });\n\n const themeOptions: Array<SelectableValue<string>> = [\n {\n label: t({\n id: 'share-modal.link.theme-current',\n message: `Current`,\n }),\n value: 'current',\n },\n {\n label: t({\n id: 'share-modal.link.theme-dark',\n message: `Dark`,\n }),\n value: 'dark',\n },\n {\n label: t({\n id: 'share-modal.link.theme-light',\n message: `Light`,\n }),\n value: 'light',\n },\n ];\n\n return (\n <>\n <p className=\"share-modal-info-text\">\n <Trans id=\"share-modal.link.info-text\">\n Create a direct link to this dashboard or panel, customized with the options below.\n </Trans>\n </p>\n <FieldSet>\n <Field label={timeRangeLabelTranslation} description={isRelativeTime ? timeRangeDescriptionTranslation : ''}>\n <Switch\n id=\"share-current-time-range\"\n value={useCurrentTimeRange}\n onChange={this.onUseCurrentTimeRangeChange}\n />\n </Field>\n <Field\n label={t({\n id: 'share-modal.link.theme',\n message: `Theme`,\n })}\n >\n <RadioButtonGroup options={themeOptions} value={selectedTheme} onChange={this.onThemeChange} />\n </Field>\n <Field label={shortenURLTranslation}>\n <Switch id=\"share-shorten-url\" value={useShortUrl} onChange={this.onUrlShorten} />\n </Field>\n\n <Field label={linkURLTranslation}>\n <Input\n id=\"link-url-input\"\n value={shareUrl}\n readOnly\n addonAfter={\n <ClipboardButton icon=\"copy\" variant=\"primary\" getText={this.getShareUrl}>\n <Trans id=\"share-modal.link.copy-link-button\">Copy</Trans>\n </ClipboardButton>\n }\n />\n </Field>\n </FieldSet>\n\n {panel && config.rendererAvailable && (\n <>\n {isDashboardSaved && (\n <div className=\"gf-form\">\n <a href={imageUrl} target=\"_blank\" rel=\"noreferrer\" aria-label={selectors.linkToRenderedImage}>\n <Icon name=\"camera\" />\n \n <Trans id=\"share-modal.link.rendered-image\">Direct link rendered image</Trans>\n </a>\n </div>\n )}\n\n {!isDashboardSaved && (\n <Alert\n severity=\"info\"\n title={t({ id: 'share-modal.link.save-alert', message: `Dashboard is not saved` })}\n bottomSpacing={0}\n >\n <Trans id=\"share-modal.link.save-dashboard\">\n To render a panel image, you must save the dashboard first.\n </Trans>\n </Alert>\n )}\n </>\n )}\n\n {panel && !config.rendererAvailable && (\n <Alert\n severity=\"info\"\n title={t({ id: 'share-modal.link.render-alert', message: `Image renderer plugin not installed` })}\n bottomSpacing={0}\n >\n <Trans id=\"share-modal.link.render-instructions\">\n To render a panel image, you must install the \n <a\n href=\"https://grafana.com/grafana/plugins/grafana-image-renderer\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"external-link\"\n >\n Grafana image renderer plugin\n </a>\n . Please contact your Grafana administrator to install the plugin.\n </Trans>\n </Alert>\n )}\n </>\n );\n }\n}\n","import { getBackendSrv } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport { createSuccessNotification } from 'app/core/copy/appNotification';\nimport { VariableModel } from 'app/features/variables/types';\nimport { dispatch } from 'app/store/store';\nimport { DashboardDataDTO, DashboardMeta } from 'app/types/dashboard';\n\nexport interface PublicDashboard {\n accessToken?: string;\n isEnabled: boolean;\n uid: string;\n dashboardUid: string;\n timeSettings?: object;\n}\n\nexport interface DashboardResponse {\n dashboard: DashboardDataDTO;\n meta: DashboardMeta;\n}\n\nexport const getPublicDashboardConfig = async (\n dashboardUid: string,\n setPublicDashboard: React.Dispatch<React.SetStateAction<PublicDashboard>>\n) => {\n const url = `/api/dashboards/uid/${dashboardUid}/public-config`;\n const pdResp: PublicDashboard = await getBackendSrv().get(url);\n setPublicDashboard(pdResp);\n};\n\nexport const savePublicDashboardConfig = async (\n dashboardUid: string,\n publicDashboardConfig: PublicDashboard,\n setPublicDashboard: React.Dispatch<React.SetStateAction<PublicDashboard>>\n) => {\n const url = `/api/dashboards/uid/${dashboardUid}/public-config`;\n const pdResp: PublicDashboard = await getBackendSrv().post(url, publicDashboardConfig);\n\n // Never allow a user to send the orgId\n // @ts-ignore\n delete pdResp.orgId;\n\n dispatch(notifyApp(createSuccessNotification('Dashboard sharing configuration saved')));\n setPublicDashboard(pdResp);\n};\n\n// Instance methods\nexport const dashboardHasTemplateVariables = (variables: VariableModel[]): boolean => {\n return variables.length > 0;\n};\n\nexport const publicDashboardPersisted = (publicDashboard: PublicDashboard): boolean => {\n return publicDashboard.uid !== '' && publicDashboard.uid !== undefined;\n};\n\nexport const generatePublicDashboardUrl = (publicDashboard: PublicDashboard): string => {\n return `${window.location.origin}/public-dashboards/${publicDashboard.accessToken}`;\n};\n","import React, { useCallback, useEffect, useState } from 'react';\n\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors/src';\nimport { reportInteraction } from '@grafana/runtime/src';\nimport {\n Alert,\n Button,\n Checkbox,\n ClipboardButton,\n Field,\n FieldSet,\n Input,\n Label,\n LinkButton,\n Switch,\n} from '@grafana/ui';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { dispatch } from 'app/store/store';\n\nimport {\n dashboardHasTemplateVariables,\n generatePublicDashboardUrl,\n getPublicDashboardConfig,\n PublicDashboard,\n publicDashboardPersisted,\n savePublicDashboardConfig,\n} from './SharePublicDashboardUtils';\nimport { ShareModalTabProps } from './types';\n\ninterface Props extends ShareModalTabProps {}\n\ninterface Acknowledgements {\n public: boolean;\n datasources: boolean;\n usage: boolean;\n}\n\nexport const SharePublicDashboard = (props: Props) => {\n const dashboardVariables = props.dashboard.getVariables();\n const selectors = e2eSelectors.pages.ShareDashboardModal.PublicDashboard;\n\n const [publicDashboard, setPublicDashboardConfig] = useState<PublicDashboard>({\n isEnabled: false,\n uid: '',\n dashboardUid: props.dashboard.uid,\n });\n const [acknowledgements, setAcknowledgements] = useState<Acknowledgements>({\n public: false,\n datasources: false,\n usage: false,\n });\n\n useEffect(() => {\n reportInteraction('grafana_dashboards_public_share_viewed');\n\n getPublicDashboardConfig(props.dashboard.uid, setPublicDashboardConfig).catch();\n }, [props.dashboard.uid]);\n\n useEffect(() => {\n if (publicDashboardPersisted(publicDashboard)) {\n setAcknowledgements({\n public: true,\n datasources: true,\n usage: true,\n });\n }\n }, [publicDashboard]);\n\n const onSavePublicConfig = () => {\n reportInteraction('grafana_dashboards_public_create_clicked');\n\n if (dashboardHasTemplateVariables(dashboardVariables)) {\n dispatch(\n notifyApp(createErrorNotification('This dashboard cannot be made public because it has template variables'))\n );\n return;\n }\n\n savePublicDashboardConfig(props.dashboard.uid, publicDashboard, setPublicDashboardConfig).catch();\n };\n\n const onAcknowledge = useCallback(\n (field: string, checked: boolean) => {\n setAcknowledgements({ ...acknowledgements, [field]: checked });\n },\n [acknowledgements]\n );\n\n // check if all conditions have been acknowledged\n const acknowledged = () => {\n return acknowledgements.public && acknowledgements.datasources && acknowledgements.usage;\n };\n\n return (\n <>\n <p>Welcome to Grafana public dashboards alpha!</p>\n {dashboardHasTemplateVariables(dashboardVariables) ? (\n <Alert\n severity=\"warning\"\n title=\"dashboard cannot be public\"\n data-testid={selectors.TemplateVariablesWarningAlert}\n >\n This dashboard cannot be made public because it has template variables\n </Alert>\n ) : (\n <>\n <p>\n To allow the current dashboard to be published publicly, toggle the switch. For now we do not support\n template variables or frontend datasources.\n </p>\n We'd love your feedback. To share, please comment on this{' '}\n <a\n href=\"https://github.com/grafana/grafana/discussions/49253\"\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-link\"\n >\n github discussion\n </a>\n <hr />\n <div>\n Before you click Save, please acknowledge the following information: <br />\n <FieldSet>\n <br />\n <div>\n <Checkbox\n label=\"Your entire dashboard will be public\"\n value={acknowledgements.public}\n disabled={publicDashboardPersisted(publicDashboard)}\n data-testid={selectors.WillBePublicCheckbox}\n onChange={(e) => onAcknowledge('public', e.currentTarget.checked)}\n />\n </div>\n <br />\n <div>\n <Checkbox\n label=\"Publishing currently only works with a subset of datasources\"\n value={acknowledgements.datasources}\n disabled={publicDashboardPersisted(publicDashboard)}\n data-testid={selectors.LimitedDSCheckbox}\n onChange={(e) => onAcknowledge('datasources', e.currentTarget.checked)}\n />\n <LinkButton\n variant=\"primary\"\n href=\"https://grafana.com/docs/grafana/latest/datasources/\"\n target=\"_blank\"\n fill=\"text\"\n icon=\"info-circle\"\n rel=\"noopener noreferrer\"\n tooltip=\"Learn more about public datasources\"\n />\n </div>\n <br />\n <Checkbox\n label=\"Making your dashboard public will cause queries to run each time the dashboard is viewed which may increase costs\"\n value={acknowledgements.usage}\n disabled={publicDashboardPersisted(publicDashboard)}\n data-testid={selectors.CostIncreaseCheckbox}\n onChange={(e) => onAcknowledge('usage', e.currentTarget.checked)}\n />\n <LinkButton\n variant=\"primary\"\n href=\"https://grafana.com/docs/grafana/latest/enterprise/query-caching/\"\n target=\"_blank\"\n fill=\"text\"\n icon=\"info-circle\"\n rel=\"noopener noreferrer\"\n tooltip=\"Learn more about query caching\"\n />\n <br />\n <br />\n </FieldSet>\n </div>\n <div>\n <h4 className=\"share-modal-info-text\">Public Dashboard Configuration</h4>\n <FieldSet>\n <Label description=\"The public dashboard uses the default time settings of the dashboard\">\n Time Range\n </Label>\n <div style={{ padding: '5px' }}>\n <Input\n value={props.dashboard.getDefaultTime().from}\n disabled={true}\n addonBefore={\n <span style={{ width: '50px', display: 'flex', alignItems: 'center', padding: '5px' }}>From:</span>\n }\n />\n <Input\n value={props.dashboard.getDefaultTime().to}\n disabled={true}\n addonBefore={\n <span style={{ width: '50px', display: 'flex', alignItems: 'center', padding: '5px' }}>To:</span>\n }\n />\n </div>\n <br />\n <Field label=\"Enabled\" description=\"Configures whether current dashboard can be available publicly\">\n <Switch\n disabled={dashboardHasTemplateVariables(dashboardVariables)}\n data-testid={selectors.EnableSwitch}\n value={publicDashboard?.isEnabled}\n onChange={() => {\n reportInteraction('grafana_dashboards_public_enable_clicked', {\n action: publicDashboard?.isEnabled ? 'disable' : 'enable',\n });\n\n setPublicDashboardConfig({\n ...publicDashboard,\n isEnabled: !publicDashboard.isEnabled,\n });\n }}\n />\n </Field>\n {publicDashboardPersisted(publicDashboard) && publicDashboard.isEnabled && (\n <Field label=\"Link URL\">\n <Input\n value={generatePublicDashboardUrl(publicDashboard)}\n readOnly\n data-testid={selectors.CopyUrlInput}\n addonAfter={\n <ClipboardButton\n data-testid={selectors.CopyUrlButton}\n variant=\"primary\"\n icon=\"copy\"\n getText={() => {\n return generatePublicDashboardUrl(publicDashboard);\n }}\n >\n Copy\n </ClipboardButton>\n }\n />\n </Field>\n )}\n </FieldSet>\n\n {props.dashboard.hasUnsavedChanges() && (\n <Alert\n title=\"Please save your dashboard changes before updating the public configuration\"\n severity=\"warning\"\n />\n )}\n <Button\n disabled={!acknowledged() || props.dashboard.hasUnsavedChanges()}\n onClick={onSavePublicConfig}\n data-testid={selectors.SaveConfigButton}\n >\n Save Sharing Configuration\n </Button>\n </div>\n </>\n )}\n </>\n );\n};\n","import { Trans, t } from '@lingui/macro';\nimport React, { PureComponent } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { getBackendSrv, reportInteraction } from '@grafana/runtime';\nimport { Button, ClipboardButton, Field, Input, LinkButton, Modal, Select, Spinner } from '@grafana/ui';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\n\nimport { VariableRefresh } from '../../../variables/types';\n\nimport { ShareModalTabProps } from './types';\n\nconst snapshotApiUrl = '/api/snapshots';\n\ninterface Props extends ShareModalTabProps {}\n\ninterface State {\n isLoading: boolean;\n step: number;\n snapshotName: string;\n selectedExpireOption: SelectableValue<number>;\n snapshotExpires?: number;\n snapshotUrl: string;\n deleteUrl: string;\n timeoutSeconds: number;\n externalEnabled: boolean;\n sharingButtonText: string;\n}\n\nexport class ShareSnapshot extends PureComponent<Props, State> {\n private dashboard: DashboardModel;\n private expireOptions: Array<SelectableValue<number>>;\n\n constructor(props: Props) {\n super(props);\n this.dashboard = props.dashboard;\n this.expireOptions = [\n {\n label: t({\n id: 'share-modal.snapshot.expire-never',\n message: `Never`,\n }),\n value: 0,\n },\n {\n label: t({\n id: 'share-modal.snapshot.expire-hour',\n message: `1 Hour`,\n }),\n value: 60 * 60,\n },\n {\n label: t({\n id: 'share-modal.snapshot.expire-day',\n message: `1 Day`,\n }),\n value: 60 * 60 * 24,\n },\n {\n label: t({\n id: 'share-modal.snapshot.expire-week',\n message: `7 Days`,\n }),\n value: 60 * 60 * 24 * 7,\n },\n ];\n this.state = {\n isLoading: false,\n step: 1,\n selectedExpireOption: this.expireOptions[0],\n snapshotExpires: this.expireOptions[0].value,\n snapshotName: props.dashboard.title,\n timeoutSeconds: 4,\n snapshotUrl: '',\n deleteUrl: '',\n externalEnabled: false,\n sharingButtonText: '',\n };\n }\n\n componentDidMount() {\n reportInteraction('grafana_dashboards_snapshot_share_viewed');\n this.getSnaphotShareOptions();\n }\n\n async getSnaphotShareOptions() {\n const shareOptions = await getBackendSrv().get('/api/snapshot/shared-options');\n this.setState({\n sharingButtonText: shareOptions['externalSnapshotName'],\n externalEnabled: shareOptions['externalEnabled'],\n });\n }\n\n createSnapshot = (external?: boolean) => () => {\n const { timeoutSeconds } = this.state;\n this.dashboard.snapshot = {\n timestamp: new Date(),\n };\n\n if (!external) {\n this.dashboard.snapshot.originalUrl = window.location.href;\n }\n\n this.setState({ isLoading: true });\n this.dashboard.startRefresh();\n\n setTimeout(() => {\n this.saveSnapshot(this.dashboard, external);\n }, timeoutSeconds * 1000);\n };\n\n saveSnapshot = async (dashboard: DashboardModel, external?: boolean) => {\n const { snapshotExpires } = this.state;\n const dash = this.dashboard.getSaveModelClone();\n this.scrubDashboard(dash);\n\n const cmdData = {\n dashboard: dash,\n name: dash.title,\n expires: snapshotExpires,\n external: external,\n };\n\n try {\n const results: { deleteUrl: string; url: string } = await getBackendSrv().post(snapshotApiUrl, cmdData);\n this.setState({\n deleteUrl: results.deleteUrl,\n snapshotUrl: results.url,\n step: 2,\n });\n } finally {\n reportInteraction('grafana_dashboards_snapshot_created', {\n location: external ? 'raintank' : 'local',\n });\n this.setState({ isLoading: false });\n }\n };\n\n scrubDashboard = (dash: DashboardModel) => {\n const { panel } = this.props;\n const { snapshotName } = this.state;\n // change title\n dash.title = snapshotName;\n\n // make relative times absolute\n dash.time = getTimeSrv().timeRange();\n\n // Remove links\n dash.links = [];\n\n // remove panel queries & links\n dash.panels.forEach((panel) => {\n panel.targets = [];\n panel.links = [];\n panel.datasource = null;\n });\n\n // remove annotation queries\n const annotations = dash.annotations.list.filter((annotation) => annotation.enable);\n dash.annotations.list = annotations.map((annotation) => {\n return {\n name: annotation.name,\n enable: annotation.enable,\n iconColor: annotation.iconColor,\n snapshotData: annotation.snapshotData,\n type: annotation.type,\n builtIn: annotation.builtIn,\n hide: annotation.hide,\n };\n });\n\n // remove template queries\n dash.getVariables().forEach((variable: any) => {\n variable.query = '';\n variable.options = variable.current ? [variable.current] : [];\n variable.refresh = VariableRefresh.never;\n });\n\n // snapshot single panel\n if (panel) {\n const singlePanel = panel.getSaveModel();\n singlePanel.gridPos.w = 24;\n singlePanel.gridPos.x = 0;\n singlePanel.gridPos.y = 0;\n singlePanel.gridPos.h = 20;\n dash.panels = [singlePanel];\n }\n\n // cleanup snapshotData\n delete this.dashboard.snapshot;\n this.dashboard.forEachPanel((panel: PanelModel) => {\n delete panel.snapshotData;\n });\n this.dashboard.annotations.list.forEach((annotation) => {\n delete annotation.snapshotData;\n });\n };\n\n deleteSnapshot = async () => {\n const { deleteUrl } = this.state;\n await getBackendSrv().get(deleteUrl);\n this.setState({ step: 3 });\n };\n\n getSnapshotUrl = () => {\n return this.state.snapshotUrl;\n };\n\n onSnapshotNameChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({ snapshotName: event.target.value });\n };\n\n onTimeoutChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.setState({ timeoutSeconds: Number(event.target.value) });\n };\n\n onExpireChange = (option: SelectableValue<number>) => {\n this.setState({\n selectedExpireOption: option,\n snapshotExpires: option.value,\n });\n };\n\n renderStep1() {\n const { onDismiss } = this.props;\n const { snapshotName, selectedExpireOption, timeoutSeconds, isLoading, sharingButtonText, externalEnabled } =\n this.state;\n\n const snapshotNameTranslation = t({\n id: 'share-modal.snapshot.name',\n message: `Snapshot name`,\n });\n\n const expireTranslation = t({\n id: 'share-modal.snapshot.expire',\n message: `Expire`,\n });\n\n const timeoutTranslation = t({\n id: 'share-modal.snapshot.timeout',\n message: `Timeout (seconds)`,\n });\n\n const timeoutDescriptionTranslation = t({\n id: 'share-modal.snapshot.timeout-description',\n message: `You might need to configure the timeout value if it takes a long time to collect your dashboard\n metrics.`,\n });\n\n return (\n <>\n <div>\n <p className=\"share-modal-info-text\">\n <Trans id=\"share-modal.snapshot.info-text-1\">\n A snapshot is an instant way to share an interactive dashboard publicly. When created, we strip sensitive\n data like queries (metric, template, and annotation) and panel links, leaving only the visible metric data\n and series names embedded in your dashboard.\n </Trans>\n </p>\n <p className=\"share-modal-info-text\">\n <Trans id=\"share-modal.snapshot.info-text-2\">\n Keep in mind, your snapshot <em>can be viewed by anyone</em> that has the link and can access the URL.\n Share wisely.\n </Trans>\n </p>\n </div>\n <Field label={snapshotNameTranslation}>\n <Input id=\"snapshot-name-input\" width={30} value={snapshotName} onChange={this.onSnapshotNameChange} />\n </Field>\n <Field label={expireTranslation}>\n <Select\n inputId=\"expire-select-input\"\n width={30}\n options={this.expireOptions}\n value={selectedExpireOption}\n onChange={this.onExpireChange}\n />\n </Field>\n <Field label={timeoutTranslation} description={timeoutDescriptionTranslation}>\n <Input id=\"timeout-input\" type=\"number\" width={21} value={timeoutSeconds} onChange={this.onTimeoutChange} />\n </Field>\n\n <Modal.ButtonRow>\n <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n <Trans id=\"share-modal.snapshot.cancel-button\">Cancel</Trans>\n </Button>\n {externalEnabled && (\n <Button variant=\"secondary\" disabled={isLoading} onClick={this.createSnapshot(true)}>\n {sharingButtonText}\n </Button>\n )}\n <Button variant=\"primary\" disabled={isLoading} onClick={this.createSnapshot()}>\n <Trans id=\"share-modal.snapshot.local-button\">Local Snapshot</Trans>\n </Button>\n </Modal.ButtonRow>\n </>\n );\n }\n\n renderStep2() {\n const { snapshotUrl } = this.state;\n\n return (\n <>\n <Field label=\"Snapshot URL\">\n <Input\n id=\"snapshot-url-input\"\n value={snapshotUrl}\n readOnly\n addonAfter={\n <ClipboardButton icon=\"copy\" variant=\"primary\" getText={this.getSnapshotUrl}>\n <Trans id=\"share-modal.snapshot.copy-link-button\">Copy</Trans>\n </ClipboardButton>\n }\n />\n </Field>\n\n <div className=\"pull-right\" style={{ padding: '5px' }}>\n <Trans id=\"share-modal.snapshot.mistake-message\">Did you make a mistake? </Trans> \n <LinkButton fill=\"text\" target=\"_blank\" onClick={this.deleteSnapshot}>\n <Trans id=\"share-modal.snapshot.delete-button\">Delete snapshot.</Trans>\n </LinkButton>\n </div>\n </>\n );\n }\n\n renderStep3() {\n return (\n <div className=\"share-modal-header\">\n <p className=\"share-modal-info-text\">\n <Trans id=\"share-modal.snapshot.deleted-message\">\n The snapshot has been deleted. If you have already accessed it once, then it might take up to an hour before\n before it is removed from browser caches or CDN caches.\n </Trans>\n </p>\n </div>\n );\n }\n\n render() {\n const { isLoading, step } = this.state;\n\n return (\n <>\n {step === 1 && this.renderStep1()}\n {step === 2 && this.renderStep2()}\n {step === 3 && this.renderStep3()}\n {isLoading && <Spinner inline={true} />}\n </>\n );\n }\n}\n","import React from 'react';\n\nimport { reportInteraction } from '@grafana/runtime/src';\nimport { Modal, ModalTabsHeader, TabContent } from '@grafana/ui';\nimport { config } from 'app/core/config';\nimport { contextSrv } from 'app/core/core';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { isPanelModelLibraryPanel } from 'app/features/library-panels/guard';\n\nimport { ShareEmbed } from './ShareEmbed';\nimport { ShareExport } from './ShareExport';\nimport { ShareLibraryPanel } from './ShareLibraryPanel';\nimport { ShareLink } from './ShareLink';\nimport { SharePublicDashboard } from './SharePublicDashboard';\nimport { ShareSnapshot } from './ShareSnapshot';\nimport { ShareModalTabModel } from './types';\n\nconst customDashboardTabs: ShareModalTabModel[] = [];\nconst customPanelTabs: ShareModalTabModel[] = [];\n\nexport function addDashboardShareTab(tab: ShareModalTabModel) {\n customDashboardTabs.push(tab);\n}\n\nexport function addPanelShareTab(tab: ShareModalTabModel) {\n customPanelTabs.push(tab);\n}\n\nfunction getInitialState(props: Props): State {\n const tabs = getTabs(props);\n return {\n tabs,\n activeTab: tabs[0].value,\n };\n}\n\nfunction getTabs(props: Props) {\n const { panel } = props;\n\n const tabs: ShareModalTabModel[] = [{ label: 'Link', value: 'link', component: ShareLink }];\n\n if (contextSrv.isSignedIn) {\n tabs.push({ label: 'Snapshot', value: 'snapshot', component: ShareSnapshot });\n }\n\n if (panel) {\n tabs.push({ label: 'Embed', value: 'embed', component: ShareEmbed });\n\n if (!isPanelModelLibraryPanel(panel)) {\n tabs.push({ label: 'Library panel', value: 'library_panel', component: ShareLibraryPanel });\n }\n tabs.push(...customPanelTabs);\n } else {\n tabs.push({ label: 'Export', value: 'export', component: ShareExport });\n tabs.push(...customDashboardTabs);\n }\n\n if (Boolean(config.featureToggles['publicDashboards'])) {\n tabs.push({ label: 'Public Dashboard', value: 'share', component: SharePublicDashboard });\n }\n\n return tabs;\n}\n\ninterface Props {\n dashboard: DashboardModel;\n panel?: PanelModel;\n\n onDismiss(): void;\n}\n\ninterface State {\n tabs: ShareModalTabModel[];\n activeTab: string;\n}\n\nexport class ShareModal extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = getInitialState(props);\n }\n\n componentDidMount() {\n reportInteraction('grafana_dashboards_share_modal_viewed');\n }\n\n onSelectTab = (t: any) => {\n this.setState({ activeTab: t.value });\n };\n\n getTabs() {\n return getTabs(this.props);\n }\n\n getActiveTab() {\n const { tabs, activeTab } = this.state;\n return tabs.find((t) => t.value === activeTab)!;\n }\n\n renderTitle() {\n const { panel } = this.props;\n const { activeTab } = this.state;\n const title = panel ? 'Share Panel' : 'Share';\n const tabs = this.getTabs();\n\n return (\n <ModalTabsHeader\n title={title}\n icon=\"share-alt\"\n tabs={tabs}\n activeTab={activeTab}\n onChangeTab={this.onSelectTab}\n />\n );\n }\n\n render() {\n const { dashboard, panel } = this.props;\n const activeTabModel = this.getActiveTab();\n const ActiveTab = activeTabModel.component;\n\n return (\n <Modal isOpen={true} title={this.renderTitle()} onDismiss={this.props.onDismiss}>\n <TabContent>\n <ActiveTab dashboard={dashboard} panel={panel} onDismiss={this.props.onDismiss} />\n </TabContent>\n </Modal>\n );\n }\n}\n","import { dateTime, locationUtil, PanelModel, TimeRange, urlUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { createShortLink } from 'app/core/utils/shortLinks';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\n\nexport interface BuildParamsArgs {\n useCurrentTimeRange: boolean;\n selectedTheme?: string;\n panel?: PanelModel;\n search?: string;\n range?: TimeRange;\n orgId?: number;\n}\n\nexport function buildParams({\n useCurrentTimeRange,\n selectedTheme,\n panel,\n search = window.location.search,\n range = getTimeSrv().timeRange(),\n orgId = config.bootData.user.orgId,\n}: BuildParamsArgs): URLSearchParams {\n const searchParams = new URLSearchParams(search);\n\n searchParams.set('from', String(range.from.valueOf()));\n searchParams.set('to', String(range.to.valueOf()));\n searchParams.set('orgId', String(orgId));\n\n if (!useCurrentTimeRange) {\n searchParams.delete('from');\n searchParams.delete('to');\n }\n\n if (selectedTheme !== 'current') {\n searchParams.set('theme', selectedTheme!);\n }\n\n if (panel && !searchParams.has('editPanel')) {\n searchParams.set('viewPanel', String(panel.id));\n }\n\n return searchParams;\n}\n\nexport function buildBaseUrl() {\n let baseUrl = window.location.href;\n const queryStart = baseUrl.indexOf('?');\n\n if (queryStart !== -1) {\n baseUrl = baseUrl.substring(0, queryStart);\n }\n\n return baseUrl;\n}\n\nexport async function buildShareUrl(\n useCurrentTimeRange: boolean,\n selectedTheme?: string,\n panel?: PanelModel,\n shortenUrl?: boolean\n) {\n const baseUrl = buildBaseUrl();\n const params = buildParams({ useCurrentTimeRange, selectedTheme, panel });\n const shareUrl = urlUtil.appendQueryToUrl(baseUrl, params.toString());\n if (shortenUrl) {\n return await createShortLink(shareUrl);\n }\n return shareUrl;\n}\n\nexport function buildSoloUrl(\n useCurrentTimeRange: boolean,\n dashboardUid: string,\n selectedTheme?: string,\n panel?: PanelModel\n) {\n const baseUrl = buildBaseUrl();\n const params = buildParams({ useCurrentTimeRange, selectedTheme, panel });\n\n let soloUrl = baseUrl.replace(config.appSubUrl + '/dashboard/', config.appSubUrl + '/dashboard-solo/');\n soloUrl = soloUrl.replace(config.appSubUrl + '/d/', config.appSubUrl + '/d-solo/');\n\n // For handling the case when default_home_dashboard_path is set in the grafana config\n const strippedUrl = locationUtil.stripBaseFromUrl(baseUrl);\n if (strippedUrl === '/') {\n soloUrl = `${config.appUrl}d-solo/${dashboardUid}`;\n }\n\n const panelId = params.get('editPanel') ?? params.get('viewPanel') ?? '';\n params.set('panelId', panelId);\n params.delete('editPanel');\n params.delete('viewPanel');\n\n return urlUtil.appendQueryToUrl(soloUrl, params.toString());\n}\n\nexport function buildImageUrl(\n useCurrentTimeRange: boolean,\n dashboardUid: string,\n selectedTheme?: string,\n panel?: PanelModel\n) {\n let soloUrl = buildSoloUrl(useCurrentTimeRange, dashboardUid, selectedTheme, panel);\n let imageUrl = soloUrl.replace(config.appSubUrl + '/dashboard-solo/', config.appSubUrl + '/render/dashboard-solo/');\n imageUrl = imageUrl.replace(config.appSubUrl + '/d-solo/', config.appSubUrl + '/render/d-solo/');\n imageUrl += '&width=1000&height=500' + getLocalTimeZone();\n return imageUrl;\n}\n\nexport function buildIframeHtml(\n useCurrentTimeRange: boolean,\n dashboardUid: string,\n selectedTheme?: string,\n panel?: PanelModel\n) {\n let soloUrl = buildSoloUrl(useCurrentTimeRange, dashboardUid, selectedTheme, panel);\n return '<iframe src=\"' + soloUrl + '\" width=\"450\" height=\"200\" frameborder=\"0\"></iframe>';\n}\n\nexport function getLocalTimeZone() {\n const utcOffset = '&tz=UTC' + encodeURIComponent(dateTime().format('Z'));\n\n // Older browser does not the internationalization API\n if (!(window as any).Intl) {\n return utcOffset;\n }\n\n const dateFormat = (window as any).Intl.DateTimeFormat();\n if (!dateFormat.resolvedOptions) {\n return utcOffset;\n }\n\n const options = dateFormat.resolvedOptions();\n if (!options.timeZone) {\n return utcOffset;\n }\n\n return '&tz=' + encodeURIComponent(options.timeZone);\n}\n","import { css } from '@emotion/css';\nimport { isArray, isObject, isUndefined } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, Icon } from '@grafana/ui';\n\nimport { Diff } from './utils';\n\ntype DiffProps = {\n diff: Diff;\n};\n\nexport const DiffValues: React.FC<DiffProps> = ({ diff }) => {\n const styles = useStyles2(getStyles);\n const hasLeftValue =\n !isUndefined(diff.originalValue) && !isArray(diff.originalValue) && !isObject(diff.originalValue);\n const hasRightValue = !isUndefined(diff.value) && !isArray(diff.value) && !isObject(diff.value);\n\n return (\n <>\n {hasLeftValue && <span className={styles}>{String(diff.originalValue)}</span>}\n {hasLeftValue && hasRightValue ? <Icon name=\"arrow-right\" /> : null}\n {hasRightValue && <span className={styles}>{String(diff.value)}</span>}\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => css`\n background-color: ${theme.colors.action.hover};\n border-radius: ${theme.shape.borderRadius()};\n color: ${theme.colors.text.primary};\n font-size: ${theme.typography.body.fontSize};\n margin: 0 ${theme.spacing(0.5)};\n padding: ${theme.spacing(0.5, 1)};\n`;\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles, Icon } from '@grafana/ui';\n\nimport { DiffValues } from './DiffValues';\nimport { Diff, getDiffText } from './utils';\n\ntype DiffTitleProps = {\n diff?: Diff;\n title: string;\n};\n\nconst replaceDiff: Diff = { op: 'replace', originalValue: undefined, path: [''], value: undefined, startLineNumber: 0 };\n\nexport const DiffTitle: React.FC<DiffTitleProps> = ({ diff, title }) => {\n const styles = useStyles(getDiffTitleStyles);\n return diff ? (\n <>\n <Icon type=\"mono\" name=\"circle\" className={styles[diff.op]} /> <span className={styles.embolden}>{title}</span>{' '}\n <span>{getDiffText(diff, diff.path.length > 1)}</span> <DiffValues diff={diff} />\n </>\n ) : (\n <div className={styles.withoutDiff}>\n <Icon type=\"mono\" name=\"circle\" className={styles.replace} /> <span className={styles.embolden}>{title}</span>{' '}\n <span>{getDiffText(replaceDiff, false)}</span>\n </div>\n );\n};\n\nconst getDiffTitleStyles = (theme: GrafanaTheme) => ({\n embolden: css`\n font-weight: ${theme.typography.weight.bold};\n `,\n add: css`\n color: ${theme.palette.online};\n `,\n replace: css`\n color: ${theme.palette.warn};\n `,\n move: css`\n color: ${theme.palette.warn};\n `,\n copy: css`\n color: ${theme.palette.warn};\n `,\n _get: css`\n color: ${theme.palette.warn};\n `,\n test: css`\n color: ${theme.palette.warn};\n `,\n remove: css`\n color: ${theme.palette.critical};\n `,\n withoutDiff: css`\n margin-bottom: ${theme.spacing.md};\n `,\n});\n","import { css } from '@emotion/css';\nimport { last } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\n\nimport { DiffTitle } from './DiffTitle';\nimport { DiffValues } from './DiffValues';\nimport { Diff, getDiffText } from './utils';\n\ntype DiffGroupProps = {\n diffs: Diff[];\n title: string;\n};\n\nexport const DiffGroup: React.FC<DiffGroupProps> = ({ diffs, title }) => {\n const styles = useStyles(getStyles);\n\n if (diffs.length === 1) {\n return (\n <div className={styles.container} data-testid=\"diffGroup\">\n <DiffTitle title={title} diff={diffs[0]} />\n </div>\n );\n }\n\n return (\n <div className={styles.container} data-testid=\"diffGroup\">\n <DiffTitle title={title} />\n <ul className={styles.list}>\n {diffs.map((diff: Diff, idx: number) => {\n return (\n <li className={styles.listItem} key={`${last(diff.path)}__${idx}`}>\n <span>{getDiffText(diff)}</span> <DiffValues diff={diff} />\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n container: css`\n background-color: ${theme.colors.bg2};\n font-size: ${theme.typography.size.md};\n margin-bottom: ${theme.spacing.md};\n padding: ${theme.spacing.md};\n `,\n list: css`\n margin-left: ${theme.spacing.xl};\n `,\n listItem: css`\n margin-bottom: ${theme.spacing.sm};\n `,\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport ReactDiffViewer, { ReactDiffViewerProps, DiffMethod } from 'react-diff-viewer';\nimport tinycolor from 'tinycolor2';\n\nimport { useTheme } from '@grafana/ui';\n\nexport const DiffViewer: React.FC<ReactDiffViewerProps> = ({ oldValue, newValue }) => {\n const theme = useTheme();\n\n const styles = {\n variables: {\n // the light theme supplied by ReactDiffViewer is very similar to Grafana\n // the dark theme needs some tweaks.\n dark: {\n diffViewerBackground: theme.colors.dashboardBg,\n diffViewerColor: theme.colors.text,\n addedBackground: tinycolor(theme.palette.greenShade).setAlpha(0.3).toString(),\n addedColor: 'white',\n removedBackground: tinycolor(theme.palette.redShade).setAlpha(0.3).toString(),\n removedColor: 'white',\n wordAddedBackground: tinycolor(theme.palette.greenBase).setAlpha(0.4).toString(),\n wordRemovedBackground: tinycolor(theme.palette.redBase).setAlpha(0.4).toString(),\n addedGutterBackground: tinycolor(theme.palette.greenShade).setAlpha(0.2).toString(),\n removedGutterBackground: tinycolor(theme.palette.redShade).setAlpha(0.2).toString(),\n gutterBackground: theme.colors.bg1,\n gutterBackgroundDark: theme.colors.bg1,\n highlightBackground: tinycolor(theme.colors.bgBlue1).setAlpha(0.4).toString(),\n highlightGutterBackground: tinycolor(theme.colors.bgBlue2).setAlpha(0.2).toString(),\n codeFoldGutterBackground: theme.colors.bg2,\n codeFoldBackground: theme.colors.bg2,\n emptyLineBackground: theme.colors.bg2,\n gutterColor: theme.colors.textFaint,\n addedGutterColor: theme.colors.text,\n removedGutterColor: theme.colors.text,\n codeFoldContentColor: theme.colors.textFaint,\n diffViewerTitleBackground: theme.colors.bg2,\n diffViewerTitleColor: theme.colors.textFaint,\n diffViewerTitleBorderColor: theme.colors.border3,\n },\n },\n codeFold: {\n fontSize: theme.typography.size.sm,\n },\n gutter: `\n pre {\n color: ${tinycolor(theme.colors.textFaint).setAlpha(1).toString()};\n opacity: 0.61;\n }\n `,\n };\n\n return (\n <div\n className={css`\n font-size: ${theme.typography.size.sm};\n // prevent global styles interfering with diff viewer\n pre {\n all: revert;\n }\n `}\n >\n <ReactDiffViewer\n styles={styles}\n oldValue={oldValue}\n newValue={newValue}\n splitView={false}\n compareMethod={DiffMethod.CSS}\n useDarkTheme={theme.isDark}\n />\n </div>\n );\n};\n","import { isNumber } from 'lodash';\n\nimport { getBackendSrv } from '@grafana/runtime';\n\nimport { DashboardModel } from '../../state/DashboardModel';\n\nexport interface HistoryListOpts {\n limit: number;\n start: number;\n}\n\nexport interface RevisionsModel {\n id: number;\n checked: boolean;\n dashboardUID: string;\n parentVersion: number;\n version: number;\n created: Date;\n createdBy: string;\n message: string;\n}\n\nexport interface DiffTarget {\n dashboardUID: string;\n version: number;\n unsavedDashboard?: DashboardModel; // when doing diffs against unsaved dashboard version\n}\n\nexport class HistorySrv {\n getHistoryList(dashboard: DashboardModel, options: HistoryListOpts) {\n const uid = dashboard && dashboard.uid ? dashboard.uid : void 0;\n return uid ? getBackendSrv().get(`api/dashboards/uid/${uid}/versions`, options) : Promise.resolve([]);\n }\n\n getDashboardVersion(uid: string, version: number) {\n return getBackendSrv().get(`api/dashboards/uid/${uid}/versions/${version}`);\n }\n\n restoreDashboard(dashboard: DashboardModel, version: number) {\n const uid = dashboard && dashboard.uid ? dashboard.uid : void 0;\n const url = `api/dashboards/uid/${uid}/restore`;\n\n return uid && isNumber(version) ? getBackendSrv().post(url, { version }) : Promise.resolve({});\n }\n}\n\nconst historySrv = new HistorySrv();\nexport { historySrv };\n","import { useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useAsyncFn } from 'react-use';\n\nimport { locationUtil } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { useAppNotification } from 'app/core/copy/appNotification';\nimport { StoreState } from 'app/types';\n\nimport { DashboardModel } from '../../state';\n\nimport { historySrv } from './HistorySrv';\n\nconst restoreDashboard = async (version: number, dashboard: DashboardModel) => {\n return await historySrv.restoreDashboard(dashboard, version);\n};\n\nexport const useDashboardRestore = (version: number) => {\n const dashboard = useSelector((state: StoreState) => state.dashboard.getModel());\n const [state, onRestoreDashboard] = useAsyncFn(async () => await restoreDashboard(version, dashboard!), []);\n const notifyApp = useAppNotification();\n\n useEffect(() => {\n if (state.value) {\n const location = locationService.getLocation();\n const newUrl = locationUtil.stripBaseFromUrl(state.value.url);\n const prevState = (location.state as any)?.routeReloadCounter;\n locationService.replace({\n ...location,\n pathname: newUrl,\n state: { routeReloadCounter: prevState ? prevState + 1 : 1 },\n });\n notifyApp.success('Dashboard restored', `Restored from version ${version}`);\n }\n }, [state, version, notifyApp]);\n return { state, onRestoreDashboard };\n};\n","import React, { useEffect } from 'react';\n\nimport { ConfirmModal } from '@grafana/ui';\n\nimport { useDashboardRestore } from './useDashboardRestore';\nexport interface RevertDashboardModalProps {\n hideModal: () => void;\n version: number;\n}\n\nexport const RevertDashboardModal: React.FC<RevertDashboardModalProps> = ({ hideModal, version }) => {\n // TODO: how should state.error be handled?\n const { state, onRestoreDashboard } = useDashboardRestore(version);\n\n useEffect(() => {\n if (state.loading === false && state.value) {\n hideModal();\n }\n }, [state, hideModal]);\n\n return (\n <ConfirmModal\n isOpen={true}\n title=\"Restore Version\"\n icon=\"history\"\n onDismiss={hideModal}\n onConfirm={onRestoreDashboard}\n body={\n <p>Are you sure you want to restore the dashboard to version {version}? All unsaved changes will be lost.</p>\n }\n confirmText={`Yes, restore to version ${version}`}\n />\n );\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Checkbox, Button, Tag, ModalsController } from '@grafana/ui';\n\nimport { DecoratedRevisionModel } from '../DashboardSettings/VersionsSettings';\n\nimport { RevertDashboardModal } from './RevertDashboardModal';\n\ntype VersionsTableProps = {\n versions: DecoratedRevisionModel[];\n canCompare: boolean;\n onCheck: (ev: React.FormEvent<HTMLInputElement>, versionId: number) => void;\n};\n\nexport const VersionHistoryTable = ({ versions, canCompare, onCheck }: VersionsTableProps) => (\n <table className=\"filter-table gf-form-group\">\n <thead>\n <tr>\n <th className=\"width-4\"></th>\n <th className=\"width-4\">Version</th>\n <th className=\"width-14\">Date</th>\n <th className=\"width-10\">Updated by</th>\n <th>Notes</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {versions.map((version, idx) => (\n <tr key={version.id}>\n <td>\n <Checkbox\n aria-label={`Toggle selection of version ${version.version}`}\n className={css`\n display: inline;\n `}\n checked={version.checked}\n onChange={(ev) => onCheck(ev, version.id)}\n disabled={!version.checked && canCompare}\n />\n </td>\n <td>{version.version}</td>\n <td>{version.createdDateString}</td>\n <td>{version.createdBy}</td>\n <td>{version.message}</td>\n <td className=\"text-right\">\n {idx === 0 ? (\n <Tag name=\"Latest\" colorIndex={17} />\n ) : (\n <ModalsController>\n {({ showModal, hideModal }) => (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n icon=\"history\"\n onClick={() => {\n showModal(RevertDashboardModal, {\n version: version.version,\n hideModal,\n });\n }}\n >\n Restore\n </Button>\n )}\n </ModalsController>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n);\n","import { css } from '@emotion/css';\nimport { noop } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, useStyles } from '@grafana/ui';\n\ntype VersionHistoryHeaderProps = {\n isComparing?: boolean;\n onClick?: () => void;\n baseVersion?: number;\n newVersion?: number;\n isNewLatest?: boolean;\n};\n\nexport const VersionHistoryHeader: React.FC<VersionHistoryHeaderProps> = ({\n isComparing = false,\n onClick = noop,\n baseVersion = 0,\n newVersion = 0,\n isNewLatest = false,\n}) => {\n const styles = useStyles(getStyles);\n\n return (\n <h3 className={styles.header}>\n <span onClick={onClick} className={isComparing ? 'pointer' : ''}>\n Versions\n </span>\n {isComparing && (\n <span>\n <Icon name=\"angle-right\" /> Comparing {baseVersion} <Icon name=\"arrows-h\" /> {newVersion}{' '}\n {isNewLatest && <cite className=\"muted\">(Latest)</cite>}\n </span>\n )}\n </h3>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n header: css`\n font-size: ${theme.typography.heading.h3};\n margin-bottom: ${theme.spacing.lg};\n `,\n});\n","import React from 'react';\n\nimport { HorizontalGroup, Tooltip, Button } from '@grafana/ui';\n\ntype VersionsButtonsType = {\n hasMore: boolean;\n canCompare: boolean;\n getVersions: (append: boolean) => void;\n getDiff: () => void;\n isLastPage: boolean;\n};\nexport const VersionsHistoryButtons: React.FC<VersionsButtonsType> = ({\n hasMore,\n canCompare,\n getVersions,\n getDiff,\n isLastPage,\n}) => (\n <HorizontalGroup>\n {hasMore && (\n <Button type=\"button\" onClick={() => getVersions(true)} variant=\"secondary\" disabled={isLastPage}>\n Show more versions\n </Button>\n )}\n <Tooltip content=\"Select two versions to start comparing\" placement=\"bottom\">\n <Button type=\"button\" disabled={!canCompare} onClick={getDiff} icon=\"code-branch\">\n Compare versions\n </Button>\n </Tooltip>\n </HorizontalGroup>\n);\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Button, ModalsController, CollapsableSection, HorizontalGroup, useStyles } from '@grafana/ui';\n\nimport { DecoratedRevisionModel } from '../DashboardSettings/VersionsSettings';\n\nimport { DiffGroup } from './DiffGroup';\nimport { DiffViewer } from './DiffViewer';\nimport { RevertDashboardModal } from './RevertDashboardModal';\nimport { jsonDiff } from './utils';\n\ntype DiffViewProps = {\n isNewLatest: boolean;\n newInfo: DecoratedRevisionModel;\n baseInfo: DecoratedRevisionModel;\n diffData: { lhs: any; rhs: any };\n};\n\nexport const VersionHistoryComparison: React.FC<DiffViewProps> = ({ baseInfo, newInfo, diffData, isNewLatest }) => {\n const diff = jsonDiff(diffData.lhs, diffData.rhs);\n const styles = useStyles(getStyles);\n\n return (\n <div>\n <div className={styles.spacer}>\n <HorizontalGroup justify=\"space-between\" align=\"center\">\n <div>\n <p className={styles.versionInfo}>\n <strong>Version {newInfo.version}</strong> updated by {newInfo.createdBy} {newInfo.ageString} -{' '}\n {newInfo.message}\n </p>\n <p className={cx(styles.versionInfo, styles.noMarginBottom)}>\n <strong>Version {baseInfo.version}</strong> updated by {baseInfo.createdBy} {baseInfo.ageString} -{' '}\n {baseInfo.message}\n </p>\n </div>\n {isNewLatest && (\n <ModalsController>\n {({ showModal, hideModal }) => (\n <Button\n variant=\"destructive\"\n icon=\"history\"\n onClick={() => {\n showModal(RevertDashboardModal, {\n version: baseInfo.version,\n hideModal,\n });\n }}\n >\n Restore to version {baseInfo.version}\n </Button>\n )}\n </ModalsController>\n )}\n </HorizontalGroup>\n </div>\n <div className={styles.spacer}>\n {Object.entries(diff).map(([key, diffs]) => (\n <DiffGroup diffs={diffs} key={key} title={key} />\n ))}\n </div>\n <CollapsableSection isOpen={false} label=\"View JSON Diff\">\n <DiffViewer oldValue={JSON.stringify(diffData.lhs, null, 2)} newValue={JSON.stringify(diffData.rhs, null, 2)} />\n </CollapsableSection>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n spacer: css`\n margin-bottom: ${theme.spacing.xl};\n `,\n versionInfo: css`\n color: ${theme.colors.textWeak};\n font-size: ${theme.typography.size.sm};\n `,\n noMarginBottom: css`\n margin-bottom: 0;\n `,\n});\n","import { compare, Operation } from 'fast-json-patch';\n// @ts-ignore\nimport jsonMap from 'json-source-map';\nimport { flow, get, isArray, isEmpty, last, sortBy, tail, toNumber, isNaN } from 'lodash';\n\nexport type Diff = {\n op: 'add' | 'replace' | 'remove' | 'copy' | 'test' | '_get' | 'move';\n value: any;\n originalValue: any;\n path: string[];\n startLineNumber: number;\n};\n\nexport type Diffs = {\n [key: string]: Diff[];\n};\n\nexport const jsonDiff = (lhs: any, rhs: any): Diffs => {\n const diffs = compare(lhs, rhs);\n const lhsMap = jsonMap.stringify(lhs, null, 2);\n const rhsMap = jsonMap.stringify(rhs, null, 2);\n\n const getDiffInformation = (diffs: Operation[]): Diff[] => {\n return diffs.map((diff) => {\n let originalValue = undefined;\n let value = undefined;\n let startLineNumber = 0;\n\n const path = tail(diff.path.split('/'));\n\n if (diff.op === 'replace') {\n originalValue = get(lhs, path);\n value = diff.value;\n startLineNumber = rhsMap.pointers[diff.path].value.line;\n }\n if (diff.op === 'add') {\n value = diff.value;\n startLineNumber = rhsMap.pointers[diff.path].value.line;\n }\n if (diff.op === 'remove') {\n originalValue = get(lhs, path);\n startLineNumber = lhsMap.pointers[diff.path].value.line;\n }\n\n return {\n op: diff.op,\n value,\n path,\n originalValue,\n startLineNumber,\n };\n });\n };\n\n const sortByLineNumber = (diffs: Diff[]) => sortBy(diffs, 'startLineNumber');\n const groupByPath = (diffs: Diff[]) =>\n diffs.reduce<Record<string, any>>((acc, value) => {\n const groupKey: string = value.path[0];\n if (!acc[groupKey]) {\n acc[groupKey] = [];\n }\n acc[groupKey].push(value);\n return acc;\n }, {});\n\n return flow([getDiffInformation, sortByLineNumber, groupByPath])(diffs);\n};\n\nexport const getDiffText = (diff: Diff, showProp = true) => {\n const prop = last(diff.path)!;\n const propIsNumeric = isNumeric(prop);\n const val = diff.op === 'remove' ? diff.originalValue : diff.value;\n let text = getDiffOperationText(diff.op);\n\n if (showProp) {\n if (propIsNumeric) {\n text += ` item ${prop}`;\n } else {\n if (isArray(val) && !isEmpty(val)) {\n text += ` ${val.length} ${prop}`;\n } else {\n text += ` ${prop}`;\n }\n }\n }\n\n return text;\n};\n\nconst isNumeric = (value: string) => !isNaN(toNumber(value));\n\nexport const getDiffOperationText = (operation: string): string => {\n if (operation === 'add') {\n return 'added';\n }\n if (operation === 'remove') {\n return 'deleted';\n }\n return 'changed';\n};\n","import { css } from '@emotion/css';\nimport React, { FC, useState } from 'react';\n\nimport { PanelMenuItem } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, IconName, useTheme } from '@grafana/ui';\n\ninterface Props {\n children?: any;\n}\n\nexport const PanelHeaderMenuItem: FC<Props & PanelMenuItem> = (props) => {\n const [ref, setRef] = useState<HTMLLIElement | null>(null);\n const isSubMenu = props.type === 'submenu';\n const isDivider = props.type === 'divider';\n const theme = useTheme();\n const menuIconClassName = css`\n margin-right: ${theme.spacing.sm};\n a::after {\n display: none;\n }\n `;\n const shortcutIconClassName = css`\n position: absolute;\n top: 7px;\n right: ${theme.spacing.xs};\n color: ${theme.colors.textWeak};\n `;\n\n return isDivider ? (\n <li className=\"divider\" />\n ) : (\n <li className={isSubMenu ? `dropdown-submenu ${getDropdownLocationCssClass(ref)}` : undefined} ref={setRef}>\n <a onClick={props.onClick} href={props.href}>\n {props.iconClassName && <Icon name={props.iconClassName as IconName} className={menuIconClassName} />}\n <span className=\"dropdown-item-text\" aria-label={selectors.components.Panels.Panel.headerItems(props.text)}>\n {props.text}\n {isSubMenu && <Icon name=\"angle-right\" className={shortcutIconClassName} />}\n </span>\n {props.shortcut && (\n <span className=\"dropdown-menu-item-shortcut\">\n <Icon name=\"keyboard\" className={menuIconClassName} /> {props.shortcut}\n </span>\n )}\n </a>\n {props.children}\n </li>\n );\n};\n\nfunction getDropdownLocationCssClass(element: HTMLElement | null) {\n if (!element) {\n return 'invisible';\n }\n\n const wrapperPos = element.parentElement!.getBoundingClientRect();\n const pos = element.getBoundingClientRect();\n\n if (pos.width === 0) {\n return 'invisible';\n }\n\n if (wrapperPos.right + pos.width + 10 > window.innerWidth) {\n return 'pull-left';\n } else {\n return 'pull-right';\n }\n}\n","import { BehaviorSubject } from 'rxjs';\n\nimport { dateMath, dateTime, TimeRange } from '@grafana/data';\n\nimport { PanelChrome } from './PanelChrome';\n\n// target is 20hz (50ms), but we poll at 100ms to smooth out jitter\nconst interval = 100;\n\ninterface LiveListener {\n last: number;\n intervalMs: number;\n panel: PanelChrome;\n}\n\nclass LiveTimer {\n listeners: LiveListener[] = [];\n\n budget = 1;\n threshold = 1.5; // trial and error appears about right\n ok = new BehaviorSubject(true);\n lastUpdate = Date.now();\n\n isLive = false; // the dashboard time range ends in \"now\"\n timeRange?: TimeRange;\n liveTimeOffset = 0;\n\n /** Called when the dashboard time range changes */\n setLiveTimeRange(v?: TimeRange) {\n this.timeRange = v;\n this.isLive = v?.raw?.to === 'now';\n\n if (this.isLive) {\n const from = dateMath.parse(v!.raw.from, false)?.valueOf()!;\n const to = dateMath.parse(v!.raw.to, true)?.valueOf()!;\n this.liveTimeOffset = to - from;\n\n for (const listener of this.listeners) {\n listener.intervalMs = getLiveTimerInterval(this.liveTimeOffset, listener.panel.props.width);\n }\n }\n }\n\n listen(panel: PanelChrome) {\n this.listeners.push({\n last: this.lastUpdate,\n panel: panel,\n intervalMs: getLiveTimerInterval(\n 60000, // 1min\n panel.props.width\n ),\n });\n }\n\n remove(panel: PanelChrome) {\n this.listeners = this.listeners.filter((v) => v.panel !== panel);\n }\n\n updateInterval(panel: PanelChrome) {\n if (!this.timeRange || !this.isLive) {\n return;\n }\n for (const listener of this.listeners) {\n if (listener.panel === panel) {\n listener.intervalMs = getLiveTimerInterval(this.liveTimeOffset, listener.panel.props.width);\n return;\n }\n }\n }\n\n // Called at the consistent dashboard interval\n measure = () => {\n const now = Date.now();\n this.budget = (now - this.lastUpdate) / interval;\n\n const oldOk = this.ok.getValue();\n const newOk = this.budget <= this.threshold;\n if (oldOk !== newOk) {\n this.ok.next(newOk);\n }\n this.lastUpdate = now;\n\n // For live dashboards, listen to changes\n if (this.isLive && this.ok.getValue() && this.timeRange) {\n // when the time-range is relative fire events\n let tr: TimeRange | undefined = undefined;\n for (const listener of this.listeners) {\n if (!listener.panel.props.isInView) {\n continue;\n }\n\n const elapsed = now - listener.last;\n if (elapsed >= listener.intervalMs) {\n if (!tr) {\n const { raw } = this.timeRange;\n tr = {\n raw,\n from: dateTime(now - this.liveTimeOffset),\n to: dateTime(now),\n };\n }\n listener.panel.liveTimeChanged(tr);\n listener.last = now;\n }\n }\n }\n };\n}\n\nconst FIVE_MINS = 5 * 60 * 1000;\n\nexport function getLiveTimerInterval(delta: number, width: number): number {\n const millisPerPixel = Math.ceil(delta / width / 100) * 100;\n if (millisPerPixel > FIVE_MINS) {\n return FIVE_MINS;\n }\n return millisPerPixel;\n}\n\nexport const liveTimer = new LiveTimer();\nsetInterval(liveTimer.measure, interval);\n","import $ from 'jquery';\nimport _, { isFunction } from 'lodash'; // eslint-disable-line lodash/import-scope\nimport moment from 'moment'; // eslint-disable-line no-restricted-imports\n\nimport { AppEvents, dateMath, UrlQueryValue } from '@grafana/data';\nimport { getBackendSrv, locationService } from '@grafana/runtime';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport kbn from 'app/core/utils/kbn';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { getGrafanaStorage } from 'app/features/storage/storage';\nimport { DashboardRoutes } from 'app/types';\n\nimport { appEvents } from '../../../core/core';\n\nimport { getDashboardSrv } from './DashboardSrv';\n\nexport class DashboardLoaderSrv {\n constructor() {}\n _dashboardLoadFailed(title: string, snapshot?: boolean) {\n snapshot = snapshot || false;\n return {\n meta: {\n canStar: false,\n isSnapshot: snapshot,\n canDelete: false,\n canSave: false,\n canEdit: false,\n dashboardNotFound: true,\n },\n dashboard: { title },\n };\n }\n\n loadDashboard(type: UrlQueryValue, slug: any, uid: any) {\n let promise;\n\n if (type === 'script') {\n promise = this._loadScriptedDashboard(slug);\n } else if (type === 'snapshot') {\n promise = backendSrv.get('/api/snapshots/' + slug).catch(() => {\n return this._dashboardLoadFailed('Snapshot not found', true);\n });\n } else if (type === DashboardRoutes.Path) {\n promise = getGrafanaStorage().getDashboard(slug!);\n } else if (type === 'ds') {\n promise = this._loadFromDatasource(slug); // explore dashboards as code\n } else if (type === 'public') {\n promise = backendSrv\n .getPublicDashboardByUid(uid)\n .then((result: any) => {\n return result;\n })\n .catch(() => {\n return this._dashboardLoadFailed('Public Dashboard Not found', true);\n });\n } else {\n promise = backendSrv\n .getDashboardByUid(uid)\n .then((result: any) => {\n if (result.meta.isFolder) {\n appEvents.emit(AppEvents.alertError, ['Dashboard not found']);\n throw new Error('Dashboard not found');\n }\n return result;\n })\n .catch(() => {\n return this._dashboardLoadFailed('Not found', true);\n });\n }\n\n promise.then((result: any) => {\n if (result.meta.dashboardNotFound !== true) {\n impressionSrv.addDashboardImpression(result.dashboard.id);\n }\n\n return result;\n });\n\n return promise;\n }\n\n _loadScriptedDashboard(file: string) {\n const url = 'public/dashboards/' + file.replace(/\\.(?!js)/, '/') + '?' + new Date().getTime();\n\n return getBackendSrv()\n .get(url)\n .then(this._executeScript.bind(this))\n .then(\n (result: any) => {\n return {\n meta: {\n fromScript: true,\n canDelete: false,\n canSave: false,\n canStar: false,\n },\n dashboard: result.data,\n };\n },\n (err: any) => {\n console.error('Script dashboard error ' + err);\n appEvents.emit(AppEvents.alertError, [\n 'Script Error',\n 'Please make sure it exists and returns a valid dashboard',\n ]);\n return this._dashboardLoadFailed('Scripted dashboard');\n }\n );\n }\n\n /**\n * This is a temporary solution to load dashboards dynamically from a datasource\n * Eventually this should become a plugin type or a special handler in the dashboard\n * loading code\n */\n async _loadFromDatasource(dsid: string) {\n const ds = await getDatasourceSrv().get(dsid);\n if (!ds) {\n return Promise.reject('can not find datasource: ' + dsid);\n }\n\n const params = new URLSearchParams(window.location.search);\n const path = params.get('path');\n if (!path) {\n return Promise.reject('expecting path parameter');\n }\n\n const queryParams: { [key: string]: any } = {};\n\n params.forEach((value, key) => {\n queryParams[key] = value;\n });\n\n return getBackendSrv()\n .get(`/api/datasources/${ds.id}/resources/${path}`, queryParams)\n .then((data) => {\n return {\n meta: {\n fromScript: true,\n canDelete: false,\n canSave: false,\n canStar: false,\n },\n dashboard: data,\n };\n });\n }\n\n _executeScript(result: any) {\n const services = {\n dashboardSrv: getDashboardSrv(),\n datasourceSrv: getDatasourceSrv(),\n };\n const scriptFunc = new Function(\n 'ARGS',\n 'kbn',\n 'dateMath',\n '_',\n 'moment',\n 'window',\n 'document',\n '$',\n 'jQuery',\n 'services',\n result\n );\n const scriptResult = scriptFunc(\n locationService.getSearchObject(),\n kbn,\n dateMath,\n _,\n moment,\n window,\n document,\n $,\n $,\n services\n );\n\n // Handle async dashboard scripts\n if (isFunction(scriptResult)) {\n return new Promise((resolve) => {\n scriptResult((dashboard: any) => {\n resolve({ data: dashboard });\n });\n });\n }\n\n return { data: scriptResult };\n }\n}\n\nlet dashboardLoaderSrv = new DashboardLoaderSrv();\nexport { dashboardLoaderSrv };\n\n/** @internal\n * Used for tests only\n */\nexport const setDashboardLoaderSrv = (srv: DashboardLoaderSrv) => {\n if (process.env.NODE_ENV !== 'test') {\n throw new Error('dashboardLoaderSrv can be only overriden in test environment');\n }\n dashboardLoaderSrv = srv;\n};\n","import { lastValueFrom } from 'rxjs';\n\nimport { BackendSrvRequest } from '@grafana/runtime';\nimport { appEvents } from 'app/core/app_events';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { saveDashboard } from 'app/features/manage-dashboards/state/actions';\nimport { DashboardMeta } from 'app/types';\n\nimport { RemovePanelEvent } from '../../../types/events';\nimport { DashboardModel } from '../state/DashboardModel';\nimport { removePanel } from '../utils/panel';\n\nexport interface SaveDashboardOptions {\n /** The complete dashboard model. If `dashboard.id` is not set a new dashboard will be created. */\n dashboard: DashboardModel;\n /** Set a commit message for the version history. */\n message?: string;\n /** The id of the folder to save the dashboard in. */\n folderId?: number;\n /** The UID of the folder to save the dashboard in. Overrides `folderId`. */\n folderUid?: string;\n /** Set to `true` if you want to overwrite existing dashboard with newer version,\n * same dashboard title in folder or same dashboard uid. */\n overwrite?: boolean;\n /** Set the dashboard refresh interval.\n * If this is lower than the minimum refresh interval, Grafana will ignore it and will enforce the minimum refresh interval. */\n refresh?: string;\n}\n\ninterface SaveDashboardResponse {\n id: number;\n slug: string;\n status: string;\n uid: string;\n url: string;\n version: number;\n}\n\nexport class DashboardSrv {\n dashboard?: DashboardModel;\n\n constructor() {\n appEvents.subscribe(RemovePanelEvent, (e) => this.onRemovePanel(e.payload));\n }\n\n create(dashboard: any, meta: DashboardMeta) {\n return new DashboardModel(dashboard, meta);\n }\n\n setCurrent(dashboard: DashboardModel) {\n this.dashboard = dashboard;\n }\n\n getCurrent(): DashboardModel | undefined {\n if (!this.dashboard) {\n console.warn('Calling getDashboardSrv().getCurrent() without calling getDashboardSrv().setCurrent() first.');\n }\n return this.dashboard;\n }\n\n onRemovePanel = (panelId: number) => {\n const dashboard = this.getCurrent();\n if (dashboard) {\n removePanel(dashboard, dashboard.getPanelById(panelId)!, true);\n }\n };\n\n saveJSONDashboard(json: string) {\n const parsedJson = JSON.parse(json);\n return saveDashboard({\n dashboard: parsedJson,\n folderId: this.dashboard?.meta.folderId || parsedJson.folderId,\n });\n }\n\n saveDashboard(\n data: SaveDashboardOptions,\n requestOptions?: Pick<BackendSrvRequest, 'showErrorAlert' | 'showSuccessAlert'>\n ) {\n return lastValueFrom(\n getBackendSrv().fetch<SaveDashboardResponse>({\n url: '/api/dashboards/db/',\n method: 'POST',\n data: {\n ...data,\n dashboard: data.dashboard.getSaveModelClone(),\n },\n ...requestOptions,\n })\n );\n }\n\n starDashboard(dashboardId: string, isStarred: any) {\n const backendSrv = getBackendSrv();\n let promise;\n\n if (isStarred) {\n promise = backendSrv.delete('/api/user/stars/dashboard/' + dashboardId).then(() => {\n return false;\n });\n } else {\n promise = backendSrv.post('/api/user/stars/dashboard/' + dashboardId).then(() => {\n return true;\n });\n }\n\n return promise.then((res: boolean) => {\n if (this.dashboard && this.dashboard.id === dashboardId) {\n this.dashboard.meta.isStarred = res;\n }\n return res;\n });\n }\n}\n\n//\n// Code below is to export the service to React components\n//\n\nlet singletonInstance: DashboardSrv;\n\nexport function setDashboardSrv(instance: DashboardSrv) {\n singletonInstance = instance;\n}\n\nexport function getDashboardSrv(): DashboardSrv {\n if (!singletonInstance) {\n singletonInstance = new DashboardSrv();\n }\n return singletonInstance;\n}\n","import { cloneDeep, extend, isString } from 'lodash';\n\nimport {\n dateMath,\n dateTime,\n getDefaultTimeRange,\n isDateTime,\n rangeUtil,\n RawTimeRange,\n TimeRange,\n toUtc,\n} from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport appEvents from 'app/core/app_events';\nimport { config } from 'app/core/config';\nimport { contextSrv, ContextSrv } from 'app/core/services/context_srv';\nimport { getShiftedTimeRange, getZoomedTimeRange } from 'app/core/utils/timePicker';\n\nimport { AbsoluteTimeEvent, ShiftTimeEvent, ShiftTimeEventDirection, ZoomOutEvent } from '../../../types/events';\nimport { TimeModel } from '../state/TimeModel';\nimport { getRefreshFromUrl } from '../utils/getRefreshFromUrl';\n\nexport class TimeSrv {\n time: any;\n refreshTimer: any;\n refresh: any;\n autoRefreshPaused = false;\n oldRefresh: string | null | undefined;\n timeModel?: TimeModel;\n timeAtLoad: any;\n private autoRefreshBlocked?: boolean;\n\n constructor(private contextSrv: ContextSrv) {\n // default time\n this.time = getDefaultTimeRange().raw;\n this.refreshTimeModel = this.refreshTimeModel.bind(this);\n\n appEvents.subscribe(ZoomOutEvent, (e) => {\n this.zoomOut(e.payload.scale, e.payload.updateUrl);\n });\n\n appEvents.subscribe(ShiftTimeEvent, (e) => {\n this.shiftTime(e.payload.direction, e.payload.updateUrl);\n });\n\n appEvents.subscribe(AbsoluteTimeEvent, () => {\n this.makeAbsoluteTime();\n });\n\n document.addEventListener('visibilitychange', () => {\n if (this.autoRefreshBlocked && document.visibilityState === 'visible') {\n this.autoRefreshBlocked = false;\n this.refreshTimeModel();\n }\n });\n }\n\n init(timeModel: TimeModel) {\n this.timeModel = timeModel;\n this.time = timeModel.time;\n this.refresh = timeModel.refresh;\n\n this.initTimeFromUrl();\n this.parseTime();\n\n // remember time at load so we can go back to it\n this.timeAtLoad = cloneDeep(this.time);\n\n const range = rangeUtil.convertRawToRange(\n this.time,\n this.timeModel?.getTimezone(),\n this.timeModel?.fiscalYearStartMonth\n );\n\n if (range.to.isBefore(range.from)) {\n this.setTime(\n {\n from: range.raw.to,\n to: range.raw.from,\n },\n false\n );\n }\n\n if (this.refresh) {\n this.setAutoRefresh(this.refresh);\n }\n }\n\n getValidIntervals(intervals: string[]): string[] {\n if (!this.contextSrv.minRefreshInterval) {\n return intervals;\n }\n\n return intervals.filter((str) => str !== '').filter(this.contextSrv.isAllowedInterval);\n }\n\n private parseTime() {\n // when absolute time is saved in json it is turned to a string\n if (isString(this.time.from) && this.time.from.indexOf('Z') >= 0) {\n this.time.from = dateTime(this.time.from).utc();\n }\n if (isString(this.time.to) && this.time.to.indexOf('Z') >= 0) {\n this.time.to = dateTime(this.time.to).utc();\n }\n }\n\n private parseUrlParam(value: any) {\n if (value.indexOf('now') !== -1) {\n return value;\n }\n if (value.length === 8) {\n const utcValue = toUtc(value, 'YYYYMMDD');\n if (utcValue.isValid()) {\n return utcValue;\n }\n } else if (value.length === 15) {\n const utcValue = toUtc(value, 'YYYYMMDDTHHmmss');\n if (utcValue.isValid()) {\n return utcValue;\n }\n }\n\n if (!isNaN(value)) {\n const epoch = parseInt(value, 10);\n return toUtc(epoch);\n }\n\n return null;\n }\n\n private getTimeWindow(time: string, timeWindow: string) {\n const valueTime = parseInt(time, 10);\n let timeWindowMs;\n\n if (timeWindow.match(/^\\d+$/) && parseInt(timeWindow, 10)) {\n // when time window specified in ms\n timeWindowMs = parseInt(timeWindow, 10);\n } else {\n timeWindowMs = rangeUtil.intervalToMs(timeWindow);\n }\n\n return {\n from: toUtc(valueTime - timeWindowMs / 2),\n to: toUtc(valueTime + timeWindowMs / 2),\n };\n }\n\n private initTimeFromUrl() {\n const params = locationService.getSearch();\n\n if (params.get('time') && params.get('time.window')) {\n this.time = this.getTimeWindow(params.get('time')!, params.get('time.window')!);\n }\n\n if (params.get('from')) {\n this.time.from = this.parseUrlParam(params.get('from')!) || this.time.from;\n }\n\n if (params.get('to')) {\n this.time.to = this.parseUrlParam(params.get('to')!) || this.time.to;\n }\n\n // if absolute ignore refresh option saved to timeModel\n if (params.get('to') && params.get('to')!.indexOf('now') === -1) {\n this.refresh = false;\n if (this.timeModel) {\n this.timeModel.refresh = false;\n }\n }\n\n // but if refresh explicitly set then use that\n this.refresh = getRefreshFromUrl({\n urlRefresh: params.get('refresh'),\n currentRefresh: this.refresh,\n refreshIntervals: Array.isArray(this.timeModel?.timepicker?.refresh_intervals)\n ? this.timeModel?.timepicker?.refresh_intervals\n : undefined,\n isAllowedIntervalFn: this.contextSrv.isAllowedInterval,\n minRefreshInterval: config.minRefreshInterval,\n });\n }\n\n updateTimeRangeFromUrl() {\n const params = locationService.getSearch();\n\n if (params.get('left')) {\n return; // explore handles this;\n }\n\n const urlRange = this.timeRangeForUrl();\n const from = params.get('from');\n const to = params.get('to');\n\n // check if url has time range\n if (from && to) {\n // is it different from what our current time range?\n if (from !== urlRange.from || to !== urlRange.to) {\n // issue update\n this.initTimeFromUrl();\n this.setTime(this.time, false);\n }\n } else if (this.timeHasChangedSinceLoad()) {\n this.setTime(this.timeAtLoad, true);\n }\n }\n\n private timeHasChangedSinceLoad() {\n return this.timeAtLoad && (this.timeAtLoad.from !== this.time.from || this.timeAtLoad.to !== this.time.to);\n }\n\n setAutoRefresh(interval: any) {\n if (this.timeModel) {\n this.timeModel.refresh = interval;\n }\n\n this.stopAutoRefresh();\n\n const currentUrlState = locationService.getSearchObject();\n\n if (!interval) {\n // Clear URL state\n if (currentUrlState.refresh) {\n locationService.partial({ refresh: null }, true);\n }\n\n return;\n }\n\n const validInterval = this.contextSrv.getValidInterval(interval);\n const intervalMs = rangeUtil.intervalToMs(validInterval);\n\n this.refreshTimer = setTimeout(() => {\n this.startNextRefreshTimer(intervalMs);\n !this.autoRefreshPaused && this.refreshTimeModel();\n }, intervalMs);\n\n const refresh = this.contextSrv.getValidInterval(interval);\n\n if (currentUrlState.refresh !== refresh) {\n locationService.partial({ refresh }, true);\n }\n }\n\n refreshTimeModel() {\n this.timeModel?.timeRangeUpdated(this.timeRange());\n }\n\n private startNextRefreshTimer(afterMs: number) {\n this.refreshTimer = setTimeout(() => {\n this.startNextRefreshTimer(afterMs);\n if (this.contextSrv.isGrafanaVisible()) {\n !this.autoRefreshPaused && this.refreshTimeModel();\n } else {\n this.autoRefreshBlocked = true;\n }\n }, afterMs);\n }\n\n stopAutoRefresh() {\n clearTimeout(this.refreshTimer);\n }\n\n // store timeModel refresh value and pause auto-refresh in some places\n // i.e panel edit\n pauseAutoRefresh() {\n this.autoRefreshPaused = true;\n }\n\n // resume auto-refresh based on old dashboard refresh property\n resumeAutoRefresh() {\n this.autoRefreshPaused = false;\n this.refreshTimeModel();\n }\n\n setTime(time: RawTimeRange, updateUrl = true) {\n extend(this.time, time);\n\n // disable refresh if zoom in or zoom out\n if (isDateTime(time.to)) {\n this.oldRefresh = this.timeModel?.refresh || this.oldRefresh;\n this.setAutoRefresh(false);\n } else if (this.oldRefresh && this.oldRefresh !== this.timeModel?.refresh) {\n this.setAutoRefresh(this.oldRefresh);\n this.oldRefresh = null;\n }\n\n if (updateUrl === true) {\n const urlRange = this.timeRangeForUrl();\n const urlParams = locationService.getSearchObject();\n\n if (urlParams.from === urlRange.from.toString() && urlParams.to === urlRange.to.toString()) {\n return;\n }\n\n urlParams.from = urlRange.from.toString();\n urlParams.to = urlRange.to.toString();\n\n locationService.partial(urlParams);\n }\n\n this.refreshTimeModel();\n }\n\n timeRangeForUrl = () => {\n const range = this.timeRange().raw;\n\n if (isDateTime(range.from)) {\n range.from = range.from.valueOf().toString();\n }\n if (isDateTime(range.to)) {\n range.to = range.to.valueOf().toString();\n }\n\n return range;\n };\n\n timeRange(): TimeRange {\n // make copies if they are moment (do not want to return out internal moment, because they are mutable!)\n const raw = {\n from: isDateTime(this.time.from) ? dateTime(this.time.from) : this.time.from,\n to: isDateTime(this.time.to) ? dateTime(this.time.to) : this.time.to,\n };\n\n const timezone = this.timeModel ? this.timeModel.getTimezone() : undefined;\n\n return {\n from: dateMath.parse(raw.from, false, timezone, this.timeModel?.fiscalYearStartMonth)!,\n to: dateMath.parse(raw.to, true, timezone, this.timeModel?.fiscalYearStartMonth)!,\n raw: raw,\n };\n }\n\n zoomOut(factor: number, updateUrl = true) {\n const range = this.timeRange();\n const { from, to } = getZoomedTimeRange(range, factor);\n\n this.setTime({ from: toUtc(from), to: toUtc(to) }, updateUrl);\n }\n\n shiftTime(direction: ShiftTimeEventDirection, updateUrl = true) {\n const range = this.timeRange();\n const { from, to } = getShiftedTimeRange(direction, range);\n\n this.setTime(\n {\n from: toUtc(from),\n to: toUtc(to),\n },\n updateUrl\n );\n }\n\n makeAbsoluteTime() {\n const params = locationService.getSearch();\n if (params.get('left')) {\n return; // explore handles this;\n }\n\n const { from, to } = this.timeRange();\n this.setTime({ from, to }, true);\n }\n\n // isRefreshOutsideThreshold function calculates the difference between last refresh and now\n // if the difference is outside 5% of the current set time range then the function will return true\n // if the difference is within 5% of the current set time range then the function will return false\n // if the current time range is absolute (i.e. not using relative strings like now-5m) then the function will return false\n isRefreshOutsideThreshold(lastRefresh: number, threshold = 0.05) {\n const timeRange = this.timeRange();\n\n if (dateMath.isMathString(timeRange.raw.from)) {\n const totalRange = timeRange.to.diff(timeRange.from);\n const msSinceLastRefresh = Date.now() - lastRefresh;\n const msThreshold = totalRange * threshold;\n return msSinceLastRefresh >= msThreshold;\n }\n\n return false;\n }\n}\n\nlet singleton: TimeSrv | undefined;\n\nexport function setTimeSrv(srv: TimeSrv) {\n singleton = srv;\n}\n\nexport function getTimeSrv(): TimeSrv {\n if (!singleton) {\n singleton = new TimeSrv(contextSrv);\n }\n\n return singleton;\n}\n","import { defaultIntervals } from '@grafana/ui';\n\ninterface Args {\n urlRefresh: string | null;\n currentRefresh: string | boolean | undefined;\n isAllowedIntervalFn: (interval: string) => boolean;\n minRefreshInterval: string;\n refreshIntervals?: string[];\n}\n\n// getRefreshFromUrl function returns the value from the supplied &refresh= param in url.\n// If the supplied interval is not allowed or does not exist in the refresh intervals for the dashboard then we\n// try to find the first refresh interval that matches the minRefreshInterval (min_refresh_interval in ini)\n// or just take the first interval.\nexport function getRefreshFromUrl({\n urlRefresh,\n currentRefresh,\n isAllowedIntervalFn,\n minRefreshInterval,\n refreshIntervals = defaultIntervals,\n}: Args): string | boolean | undefined {\n if (!urlRefresh) {\n return currentRefresh;\n }\n\n const isAllowedInterval = isAllowedIntervalFn(urlRefresh);\n const isExistingInterval = refreshIntervals.find((interval) => interval === urlRefresh);\n\n if (!isAllowedInterval || !isExistingInterval) {\n const minRefreshIntervalInIntervals = minRefreshInterval\n ? refreshIntervals.find((interval) => interval === minRefreshInterval)\n : undefined;\n const lowestRefreshInterval = refreshIntervals?.length ? refreshIntervals[0] : undefined;\n\n return minRefreshIntervalInIntervals ?? lowestRefreshInterval ?? currentRefresh;\n }\n\n return urlRefresh || currentRefresh;\n}\n","// Functions in this file are called from the app/features/dashboard/state/DashboardMigrator.\n// Migrations applied by the DashboardMigrator are performed before the plugin is loaded.\n// DashboardMigrator migrations are tied to a certain minimum version of a dashboard which means they will only be ran once.\n\nimport { DataQuery, AnnotationQuery } from '@grafana/data';\nimport { getNextRefIdChar } from 'app/core/utils/query';\n\nimport { CloudWatchMetricsQuery, LegacyAnnotationQuery, MetricQueryType, MetricEditorMode } from '../types';\n\n// E.g query.statistics = ['Max', 'Min'] will be migrated to two queries - query1.statistic = 'Max' and query2.statistic = 'Min'\nexport function migrateMultipleStatsMetricsQuery(\n query: CloudWatchMetricsQuery,\n panelQueries: DataQuery[]\n): DataQuery[] {\n const newQueries = [];\n if (query?.statistics && query?.statistics.length) {\n query.statistic = query.statistics[0];\n for (const stat of query.statistics.splice(1)) {\n newQueries.push({ ...query, statistic: stat });\n }\n }\n for (const newTarget of newQueries) {\n newTarget.refId = getNextRefIdChar(panelQueries);\n delete newTarget.statistics;\n panelQueries.push(newTarget);\n }\n delete query.statistics;\n\n return newQueries;\n}\n\n// Migrates an annotation query that use more than one statistic into multiple queries\n// E.g query.statistics = ['Max', 'Min'] will be migrated to two queries - query1.statistic = 'Max' and query2.statistic = 'Min'\nexport function migrateMultipleStatsAnnotationQuery(\n annotationQuery: AnnotationQuery<LegacyAnnotationQuery>\n): Array<AnnotationQuery<DataQuery>> {\n const newAnnotations: Array<AnnotationQuery<LegacyAnnotationQuery>> = [];\n\n if (annotationQuery && 'statistics' in annotationQuery && annotationQuery?.statistics?.length) {\n for (const stat of annotationQuery.statistics.splice(1)) {\n const { statistics, name, ...newAnnotation } = annotationQuery;\n newAnnotations.push({ ...newAnnotation, statistic: stat, name: `${name} - ${stat}` });\n }\n annotationQuery.statistic = annotationQuery.statistics[0];\n // Only change the name of the original if new annotations have been created\n if (newAnnotations.length !== 0) {\n annotationQuery.name = `${annotationQuery.name} - ${annotationQuery.statistic}`;\n }\n delete annotationQuery.statistics;\n }\n\n return newAnnotations;\n}\n\nexport function migrateCloudWatchQuery(query: CloudWatchMetricsQuery) {\n if (!query.hasOwnProperty('metricQueryType')) {\n query.metricQueryType = MetricQueryType.Search;\n }\n\n if (!query.hasOwnProperty('metricEditorMode')) {\n if (query.metricQueryType === MetricQueryType.Query) {\n query.metricEditorMode = MetricEditorMode.Code;\n } else {\n query.metricEditorMode = query.expression ? MetricEditorMode.Code : MetricEditorMode.Builder;\n }\n }\n}\n","import { each, find, findIndex, flattenDeep, isArray, isBoolean, isNumber, isString, map, max, some } from 'lodash';\n\nimport {\n AnnotationQuery,\n DataLink,\n DataLinkBuiltInVars,\n DataQuery,\n DataSourceRef,\n DataTransformerConfig,\n FieldConfigSource,\n FieldMatcherID,\n FieldType,\n getActiveThreshold,\n getDataSourceRef,\n isDataSourceRef,\n MappingType,\n PanelPlugin,\n SpecialValueMatch,\n standardEditorsRegistry,\n standardFieldConfigEditorRegistry,\n ThresholdsConfig,\n urlUtil,\n ValueMap,\n ValueMapping,\n} from '@grafana/data';\nimport { getDataSourceSrv, setDataSourceSrv } from '@grafana/runtime';\nimport { AxisPlacement, GraphFieldConfig } from '@grafana/ui';\nimport { getAllOptionEditors, getAllStandardFieldConfigs } from 'app/core/components/OptionsUI/registry';\nimport { config } from 'app/core/config';\nimport {\n DEFAULT_PANEL_SPAN,\n DEFAULT_ROW_HEIGHT,\n GRID_CELL_HEIGHT,\n GRID_CELL_VMARGIN,\n GRID_COLUMN_COUNT,\n MIN_PANEL_HEIGHT,\n} from 'app/core/constants';\nimport getFactors from 'app/core/utils/factors';\nimport kbn from 'app/core/utils/kbn';\nimport { DatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { isConstant, isMulti } from 'app/features/variables/guard';\nimport { alignCurrentWithMulti } from 'app/features/variables/shared/multiOptions';\nimport { CloudWatchMetricsQuery, LegacyAnnotationQuery } from 'app/plugins/datasource/cloudwatch/types';\nimport { plugin as gaugePanelPlugin } from 'app/plugins/panel/gauge/module';\nimport { plugin as statPanelPlugin } from 'app/plugins/panel/stat/module';\n\nimport { labelsToFieldsTransformer } from '../../../../../packages/grafana-data/src/transformations/transformers/labelsToFields';\nimport { mergeTransformer } from '../../../../../packages/grafana-data/src/transformations/transformers/merge';\nimport {\n migrateCloudWatchQuery,\n migrateMultipleStatsAnnotationQuery,\n migrateMultipleStatsMetricsQuery,\n} from '../../../plugins/datasource/cloudwatch/migrations/dashboardMigrations';\nimport { VariableHide } from '../../variables/types';\n\nimport { DashboardModel } from './DashboardModel';\nimport { PanelModel } from './PanelModel';\n\nstandardEditorsRegistry.setInit(getAllOptionEditors);\nstandardFieldConfigEditorRegistry.setInit(getAllStandardFieldConfigs);\n\ntype PanelSchemeUpgradeHandler = (panel: PanelModel) => PanelModel;\nexport class DashboardMigrator {\n dashboard: DashboardModel;\n\n constructor(dashboardModel: DashboardModel) {\n this.dashboard = dashboardModel;\n\n // for tests to pass\n if (!getDataSourceSrv()) {\n setDataSourceSrv(new DatasourceSrv());\n }\n }\n\n updateSchema(old: any) {\n let i, j, k, n;\n const oldVersion = this.dashboard.schemaVersion;\n const panelUpgrades: PanelSchemeUpgradeHandler[] = [];\n this.dashboard.schemaVersion = 37;\n\n if (oldVersion === this.dashboard.schemaVersion) {\n return;\n }\n\n // version 2 schema changes\n if (oldVersion < 2) {\n if (old.services) {\n if (old.services.filter) {\n this.dashboard.time = old.services.filter.time;\n this.dashboard.templating.list = old.services.filter.list || [];\n }\n }\n\n panelUpgrades.push((panel: any) => {\n // rename panel type\n if (panel.type === 'graphite') {\n panel.type = 'graph';\n }\n\n if (panel.type !== 'graph') {\n return panel;\n }\n\n if (isBoolean(panel.legend)) {\n panel.legend = { show: panel.legend };\n }\n\n if (panel.grid) {\n if (panel.grid.min) {\n panel.grid.leftMin = panel.grid.min;\n delete panel.grid.min;\n }\n\n if (panel.grid.max) {\n panel.grid.leftMax = panel.grid.max;\n delete panel.grid.max;\n }\n }\n\n if (panel.y_format) {\n if (!panel.y_formats) {\n panel.y_formats = [];\n }\n panel.y_formats[0] = panel.y_format;\n delete panel.y_format;\n }\n\n if (panel.y2_format) {\n if (!panel.y_formats) {\n panel.y_formats = [];\n }\n panel.y_formats[1] = panel.y2_format;\n delete panel.y2_format;\n }\n\n return panel;\n });\n }\n\n // schema version 3 changes\n if (oldVersion < 3) {\n // ensure panel IDs\n let maxId = this.dashboard.getNextPanelId();\n panelUpgrades.push((panel: any) => {\n if (!panel.id) {\n panel.id = maxId;\n maxId += 1;\n }\n\n return panel;\n });\n }\n\n // schema version 4 changes\n if (oldVersion < 4) {\n // move aliasYAxis changes\n panelUpgrades.push((panel: any) => {\n if (panel.type !== 'graph') {\n return panel;\n }\n\n each(panel.aliasYAxis, (value, key) => {\n panel.seriesOverrides = [{ alias: key, yaxis: value }];\n });\n\n delete panel.aliasYAxis;\n\n return panel;\n });\n }\n\n if (oldVersion < 6) {\n // move drop-downs to new schema\n const annotations: any = find(old.pulldowns, { type: 'annotations' });\n\n if (annotations) {\n this.dashboard.annotations = {\n list: annotations.annotations || [],\n };\n }\n\n // update template variables\n for (i = 0; i < this.dashboard.templating.list.length; i++) {\n const variable = this.dashboard.templating.list[i];\n if (variable.datasource === void 0) {\n variable.datasource = null;\n }\n if (variable.type === 'filter') {\n variable.type = 'query';\n }\n if (variable.type === void 0) {\n variable.type = 'query';\n }\n if (variable.allFormat === void 0) {\n variable.allFormat = 'glob';\n }\n }\n }\n\n if (oldVersion < 7) {\n if (old.nav && old.nav.length) {\n this.dashboard.timepicker = old.nav[0];\n }\n\n // ensure query refIds\n panelUpgrades.push((panel: any) => {\n each(panel.targets, (target) => {\n if (!target.refId) {\n target.refId = panel.getNextQueryLetter && panel.getNextQueryLetter();\n }\n });\n\n return panel;\n });\n }\n\n if (oldVersion < 8) {\n panelUpgrades.push((panel: any) => {\n each(panel.targets, (target) => {\n // update old influxdb query schema\n if (target.fields && target.tags && target.groupBy) {\n if (target.rawQuery) {\n delete target.fields;\n delete target.fill;\n } else {\n target.select = map(target.fields, (field) => {\n const parts = [];\n parts.push({ type: 'field', params: [field.name] });\n parts.push({ type: field.func, params: [] });\n if (field.mathExpr) {\n parts.push({ type: 'math', params: [field.mathExpr] });\n }\n if (field.asExpr) {\n parts.push({ type: 'alias', params: [field.asExpr] });\n }\n return parts;\n });\n delete target.fields;\n each(target.groupBy, (part) => {\n if (part.type === 'time' && part.interval) {\n part.params = [part.interval];\n delete part.interval;\n }\n if (part.type === 'tag' && part.key) {\n part.params = [part.key];\n delete part.key;\n }\n });\n\n if (target.fill) {\n target.groupBy.push({ type: 'fill', params: [target.fill] });\n delete target.fill;\n }\n }\n }\n });\n\n return panel;\n });\n }\n\n // schema version 9 changes\n if (oldVersion < 9) {\n // move aliasYAxis changes\n panelUpgrades.push((panel: any) => {\n if (panel.type !== 'singlestat' && panel.thresholds !== '') {\n return panel;\n }\n\n if (panel.thresholds) {\n const k = panel.thresholds.split(',');\n\n if (k.length >= 3) {\n k.shift();\n panel.thresholds = k.join(',');\n }\n }\n\n return panel;\n });\n }\n\n // schema version 10 changes\n if (oldVersion < 10) {\n // move aliasYAxis changes\n panelUpgrades.push((panel: any) => {\n if (panel.type !== 'table') {\n return panel;\n }\n\n each(panel.styles, (style) => {\n if (style.thresholds && style.thresholds.length >= 3) {\n const k = style.thresholds;\n k.shift();\n style.thresholds = k;\n }\n });\n\n return panel;\n });\n }\n\n if (oldVersion < 12) {\n // update template variables\n each(this.dashboard.getVariables(), (templateVariable: any) => {\n if (templateVariable.refresh) {\n templateVariable.refresh = 1;\n }\n if (!templateVariable.refresh) {\n templateVariable.refresh = 0;\n }\n if (templateVariable.hideVariable) {\n templateVariable.hide = 2;\n } else if (templateVariable.hideLabel) {\n templateVariable.hide = 1;\n }\n });\n }\n\n if (oldVersion < 12) {\n // update graph yaxes changes\n panelUpgrades.push((panel: any) => {\n if (panel.type !== 'graph') {\n return panel;\n }\n if (!panel.grid) {\n return panel;\n }\n\n if (!panel.yaxes) {\n panel.yaxes = [\n {\n show: panel['y-axis'],\n min: panel.grid.leftMin,\n max: panel.grid.leftMax,\n logBase: panel.grid.leftLogBase,\n format: panel.y_formats[0],\n label: panel.leftYAxisLabel,\n },\n {\n show: panel['y-axis'],\n min: panel.grid.rightMin,\n max: panel.grid.rightMax,\n logBase: panel.grid.rightLogBase,\n format: panel.y_formats[1],\n label: panel.rightYAxisLabel,\n },\n ];\n\n panel.xaxis = {\n show: panel['x-axis'],\n };\n\n delete panel.grid.leftMin;\n delete panel.grid.leftMax;\n delete panel.grid.leftLogBase;\n delete panel.grid.rightMin;\n delete panel.grid.rightMax;\n delete panel.grid.rightLogBase;\n delete panel.y_formats;\n delete panel.leftYAxisLabel;\n delete panel.rightYAxisLabel;\n delete panel['y-axis'];\n delete panel['x-axis'];\n }\n\n return panel;\n });\n }\n\n if (oldVersion < 13) {\n // update graph yaxes changes\n panelUpgrades.push((panel: any) => {\n if (panel.type !== 'graph') {\n return panel;\n }\n if (!panel.grid) {\n return panel;\n }\n\n if (!panel.thresholds) {\n panel.thresholds = [];\n }\n const t1: any = {},\n t2: any = {};\n\n if (panel.grid.threshold1 !== null) {\n t1.value = panel.grid.threshold1;\n if (panel.grid.thresholdLine) {\n t1.line = true;\n t1.lineColor = panel.grid.threshold1Color;\n t1.colorMode = 'custom';\n } else {\n t1.fill = true;\n t1.fillColor = panel.grid.threshold1Color;\n t1.colorMode = 'custom';\n }\n }\n\n if (panel.grid.threshold2 !== null) {\n t2.value = panel.grid.threshold2;\n if (panel.grid.thresholdLine) {\n t2.line = true;\n t2.lineColor = panel.grid.threshold2Color;\n t2.colorMode = 'custom';\n } else {\n t2.fill = true;\n t2.fillColor = panel.grid.threshold2Color;\n t2.colorMode = 'custom';\n }\n }\n\n if (isNumber(t1.value)) {\n if (isNumber(t2.value)) {\n if (t1.value > t2.value) {\n t1.op = t2.op = 'lt';\n panel.thresholds.push(t1);\n panel.thresholds.push(t2);\n } else {\n t1.op = t2.op = 'gt';\n panel.thresholds.push(t1);\n panel.thresholds.push(t2);\n }\n } else {\n t1.op = 'gt';\n panel.thresholds.push(t1);\n }\n }\n\n delete panel.grid.threshold1;\n delete panel.grid.threshold1Color;\n delete panel.grid.threshold2;\n delete panel.grid.threshold2Color;\n delete panel.grid.thresholdLine;\n\n return panel;\n });\n }\n\n if (oldVersion < 14) {\n this.dashboard.graphTooltip = old.sharedCrosshair ? 1 : 0;\n }\n\n if (oldVersion < 16) {\n this.upgradeToGridLayout(old);\n }\n\n if (oldVersion < 17) {\n panelUpgrades.push((panel: any) => {\n if (panel.minSpan) {\n const max = GRID_COLUMN_COUNT / panel.minSpan;\n const factors = getFactors(GRID_COLUMN_COUNT);\n // find the best match compared to factors\n // (ie. [1,2,3,4,6,12,24] for 24 columns)\n panel.maxPerRow =\n factors[\n findIndex(factors, (o) => {\n return o > max;\n }) - 1\n ];\n }\n\n delete panel.minSpan;\n\n return panel;\n });\n }\n\n if (oldVersion < 18) {\n // migrate change to gauge options\n panelUpgrades.push((panel: any) => {\n if (panel['options-gauge']) {\n panel.options = panel['options-gauge'];\n panel.options.valueOptions = {\n unit: panel.options.unit,\n stat: panel.options.stat,\n decimals: panel.options.decimals,\n prefix: panel.options.prefix,\n suffix: panel.options.suffix,\n };\n\n // correct order\n if (panel.options.thresholds) {\n panel.options.thresholds.reverse();\n }\n\n // this options prop was due to a bug\n delete panel.options.options;\n delete panel.options.unit;\n delete panel.options.stat;\n delete panel.options.decimals;\n delete panel.options.prefix;\n delete panel.options.suffix;\n delete panel['options-gauge'];\n }\n\n return panel;\n });\n }\n\n if (oldVersion < 19) {\n // migrate change to gauge options\n panelUpgrades.push((panel: any) => {\n if (panel.links && isArray(panel.links)) {\n panel.links = panel.links.map(upgradePanelLink);\n }\n\n return panel;\n });\n }\n\n if (oldVersion < 20) {\n const updateLinks = (link: DataLink) => {\n return {\n ...link,\n url: updateVariablesSyntax(link.url),\n };\n };\n panelUpgrades.push((panel: any) => {\n // For graph panel\n if (panel.options && panel.options.dataLinks && isArray(panel.options.dataLinks)) {\n panel.options.dataLinks = panel.options.dataLinks.map(updateLinks);\n }\n\n // For panel with fieldOptions\n if (panel.options && panel.options.fieldOptions && panel.options.fieldOptions.defaults) {\n if (panel.options.fieldOptions.defaults.links && isArray(panel.options.fieldOptions.defaults.links)) {\n panel.options.fieldOptions.defaults.links = panel.options.fieldOptions.defaults.links.map(updateLinks);\n }\n if (panel.options.fieldOptions.defaults.title) {\n panel.options.fieldOptions.defaults.title = updateVariablesSyntax(\n panel.options.fieldOptions.defaults.title\n );\n }\n }\n\n return panel;\n });\n }\n\n if (oldVersion < 21) {\n const updateLinks = (link: DataLink) => {\n return {\n ...link,\n url: link.url.replace(/__series.labels/g, '__field.labels'),\n };\n };\n panelUpgrades.push((panel: any) => {\n // For graph panel\n if (panel.options && panel.options.dataLinks && isArray(panel.options.dataLinks)) {\n panel.options.dataLinks = panel.options.dataLinks.map(updateLinks);\n }\n\n // For panel with fieldOptions\n if (panel.options && panel.options.fieldOptions && panel.options.fieldOptions.defaults) {\n if (panel.options.fieldOptions.defaults.links && isArray(panel.options.fieldOptions.defaults.links)) {\n panel.options.fieldOptions.defaults.links = panel.options.fieldOptions.defaults.links.map(updateLinks);\n }\n }\n\n return panel;\n });\n }\n\n if (oldVersion < 22) {\n panelUpgrades.push((panel: any) => {\n if (panel.type !== 'table') {\n return panel;\n }\n\n each(panel.styles, (style) => {\n style.align = 'auto';\n });\n\n return panel;\n });\n }\n\n if (oldVersion < 23) {\n for (const variable of this.dashboard.templating.list) {\n if (!isMulti(variable)) {\n continue;\n }\n const { multi, current } = variable;\n variable.current = alignCurrentWithMulti(current, multi);\n }\n }\n\n if (oldVersion < 24) {\n // 7.0\n // - migrate existing tables to 'table-old'\n panelUpgrades.push((panel: any) => {\n const wasAngularTable = panel.type === 'table';\n if (wasAngularTable && !panel.styles) {\n return panel; // styles are missing so assumes default settings\n }\n const wasReactTable = panel.table === 'table2';\n if (!wasAngularTable || wasReactTable) {\n return panel;\n }\n panel.type = wasAngularTable ? 'table-old' : 'table';\n return panel;\n });\n }\n\n if (oldVersion < 25) {\n // tags are removed in version 28\n }\n\n if (oldVersion < 26) {\n panelUpgrades.push((panel: any) => {\n const wasReactText = panel.type === 'text2';\n if (!wasReactText) {\n return panel;\n }\n\n panel.type = 'text';\n delete panel.options.angular;\n return panel;\n });\n }\n\n if (oldVersion < 27) {\n for (const variable of this.dashboard.templating.list) {\n if (!isConstant(variable)) {\n continue;\n }\n\n if (variable.hide === VariableHide.dontHide || variable.hide === VariableHide.hideLabel) {\n variable.type = 'textbox';\n }\n\n variable.current = { selected: true, text: variable.query ?? '', value: variable.query ?? '' };\n variable.options = [variable.current];\n }\n }\n\n if (oldVersion < 28) {\n panelUpgrades.push((panel: PanelModel) => {\n if (panel.type === 'singlestat') {\n return migrateSinglestat(panel);\n }\n\n return panel;\n });\n\n for (const variable of this.dashboard.templating.list) {\n if (variable.tags) {\n delete variable.tags;\n }\n\n if (variable.tagsQuery) {\n delete variable.tagsQuery;\n }\n\n if (variable.tagValuesQuery) {\n delete variable.tagValuesQuery;\n }\n\n if (variable.useTags) {\n delete variable.useTags;\n }\n }\n }\n\n if (oldVersion < 29) {\n for (const variable of this.dashboard.templating.list) {\n if (variable.type !== 'query') {\n continue;\n }\n\n if (variable.refresh !== 1 && variable.refresh !== 2) {\n variable.refresh = 1;\n }\n\n if (variable.options?.length) {\n variable.options = [];\n }\n }\n }\n\n if (oldVersion < 30) {\n panelUpgrades.push(upgradeValueMappingsForPanel);\n panelUpgrades.push(migrateTooltipOptions);\n }\n\n if (oldVersion < 31) {\n panelUpgrades.push((panel: PanelModel) => {\n if (panel.transformations) {\n for (const t of panel.transformations) {\n if (t.id === labelsToFieldsTransformer.id) {\n return appendTransformerAfter(panel, labelsToFieldsTransformer.id, {\n id: mergeTransformer.id,\n options: {},\n });\n }\n }\n }\n return panel;\n });\n }\n\n if (oldVersion < 32) {\n // CloudWatch migrations have been moved to version 34\n }\n\n // Replace datasource name with reference, uid and type\n if (oldVersion < 33) {\n panelUpgrades.push((panel) => {\n panel.datasource = migrateDatasourceNameToRef(panel.datasource, { returnDefaultAsNull: true });\n\n if (!panel.targets) {\n return panel;\n }\n\n for (const target of panel.targets) {\n const targetRef = migrateDatasourceNameToRef(target.datasource, { returnDefaultAsNull: true });\n if (targetRef != null) {\n target.datasource = targetRef;\n }\n }\n\n return panel;\n });\n }\n\n if (oldVersion < 34) {\n panelUpgrades.push((panel: PanelModel) => {\n this.migrateCloudWatchQueries(panel);\n return panel;\n });\n\n this.migrateCloudWatchAnnotationQuery();\n }\n\n if (oldVersion < 35) {\n panelUpgrades.push(ensureXAxisVisibility);\n }\n\n if (oldVersion < 36) {\n // Migrate datasource to refs in annotations\n for (const query of this.dashboard.annotations.list) {\n query.datasource = migrateDatasourceNameToRef(query.datasource, { returnDefaultAsNull: false });\n }\n\n // Migrate datasource: null to current default\n const defaultDs = getDataSourceSrv().getInstanceSettings(null);\n if (defaultDs) {\n for (const variable of this.dashboard.templating.list) {\n if (variable.type === 'query' && variable.datasource === null) {\n variable.datasource = getDataSourceRef(defaultDs);\n }\n }\n\n panelUpgrades.push((panel: PanelModel) => {\n if (panel.targets) {\n let panelDataSourceWasDefault = false;\n if (panel.datasource == null && panel.targets.length > 0) {\n panel.datasource = getDataSourceRef(defaultDs);\n panelDataSourceWasDefault = true;\n }\n\n for (const target of panel.targets) {\n if (target.datasource == null || target.datasource.uid == null) {\n target.datasource = { ...panel.datasource };\n }\n\n if (panelDataSourceWasDefault && target.datasource.uid !== '__expr__') {\n // We can have situations when default ds changed and the panel level data source is different from the queries\n // In this case we use the query level data source as source for truth\n panel.datasource = target.datasource as DataSourceRef;\n }\n }\n }\n return panel;\n });\n }\n }\n\n if (oldVersion < 37) {\n panelUpgrades.push((panel: PanelModel) => {\n if (panel.options?.legend && panel.options.legend.displayMode === 'hidden') {\n panel.options.legend.displayMode = 'list';\n panel.options.legend.showLegend = false;\n } else if (panel.options?.legend) {\n panel.options.legend = { ...panel.options?.legend, showLegend: true };\n }\n return panel;\n });\n }\n\n if (panelUpgrades.length === 0) {\n return;\n }\n\n for (j = 0; j < this.dashboard.panels.length; j++) {\n for (k = 0; k < panelUpgrades.length; k++) {\n this.dashboard.panels[j] = panelUpgrades[k].call(this, this.dashboard.panels[j]);\n const rowPanels = this.dashboard.panels[j].panels;\n if (rowPanels) {\n for (n = 0; n < rowPanels.length; n++) {\n rowPanels[n] = panelUpgrades[k].call(this, rowPanels[n]);\n }\n }\n }\n }\n }\n\n // Migrates metric queries and/or annotation queries that use more than one statistic.\n // E.g query.statistics = ['Max', 'Min'] will be migrated to two queries - query1.statistic = 'Max' and query2.statistic = 'Min'\n // New queries, that were created during migration, are put at the end of the array.\n migrateCloudWatchQueries(panel: PanelModel) {\n for (const target of panel.targets || []) {\n if (isCloudWatchQuery(target)) {\n migrateCloudWatchQuery(target);\n if (target.hasOwnProperty('statistics')) {\n // New queries, that were created during migration, are put at the end of the array.\n const newQueries = migrateMultipleStatsMetricsQuery(target, [...panel.targets]);\n for (const newQuery of newQueries) {\n panel.targets.push(newQuery);\n }\n }\n }\n }\n }\n\n migrateCloudWatchAnnotationQuery() {\n for (const annotation of this.dashboard.annotations.list) {\n if (isLegacyCloudWatchAnnotationQuery(annotation)) {\n const newAnnotationQueries = migrateMultipleStatsAnnotationQuery(annotation);\n for (const newAnnotationQuery of newAnnotationQueries) {\n this.dashboard.annotations.list.push(newAnnotationQuery);\n }\n }\n }\n }\n\n upgradeToGridLayout(old: any) {\n let yPos = 0;\n const widthFactor = GRID_COLUMN_COUNT / 12;\n\n const maxPanelId = max(\n flattenDeep(\n map(old.rows, (row) => {\n return map(row.panels, 'id');\n })\n )\n );\n let nextRowId = maxPanelId + 1;\n\n if (!old.rows) {\n return;\n }\n\n // Add special \"row\" panels if even one row is collapsed, repeated or has visible title\n const showRows = some(old.rows, (row) => row.collapse || row.showTitle || row.repeat);\n\n for (const row of old.rows) {\n if (row.repeatIteration) {\n continue;\n }\n\n const height: any = row.height || DEFAULT_ROW_HEIGHT;\n const rowGridHeight = getGridHeight(height);\n\n const rowPanel: any = {};\n let rowPanelModel: PanelModel | undefined;\n\n if (showRows) {\n // add special row panel\n rowPanel.id = nextRowId;\n rowPanel.type = 'row';\n rowPanel.title = row.title;\n rowPanel.collapsed = row.collapse;\n rowPanel.repeat = row.repeat;\n rowPanel.panels = [];\n rowPanel.gridPos = {\n x: 0,\n y: yPos,\n w: GRID_COLUMN_COUNT,\n h: rowGridHeight,\n };\n rowPanelModel = new PanelModel(rowPanel);\n nextRowId++;\n yPos++;\n }\n\n const rowArea = new RowArea(rowGridHeight, GRID_COLUMN_COUNT, yPos);\n\n for (const panel of row.panels) {\n panel.span = panel.span || DEFAULT_PANEL_SPAN;\n if (panel.minSpan) {\n panel.minSpan = Math.min(GRID_COLUMN_COUNT, (GRID_COLUMN_COUNT / 12) * panel.minSpan);\n }\n const panelWidth = Math.floor(panel.span) * widthFactor;\n const panelHeight = panel.height ? getGridHeight(panel.height) : rowGridHeight;\n\n const panelPos = rowArea.getPanelPosition(panelHeight, panelWidth);\n yPos = rowArea.yPos;\n panel.gridPos = {\n x: panelPos.x,\n y: yPos + panelPos.y,\n w: panelWidth,\n h: panelHeight,\n };\n rowArea.addPanel(panel.gridPos);\n\n delete panel.span;\n\n if (rowPanelModel && rowPanel.collapsed) {\n rowPanelModel.panels?.push(panel);\n } else {\n this.dashboard.panels.push(new PanelModel(panel));\n }\n }\n\n if (rowPanelModel) {\n this.dashboard.panels.push(rowPanelModel);\n }\n\n if (!(rowPanelModel && rowPanel.collapsed)) {\n yPos += rowGridHeight;\n }\n }\n }\n}\n\nfunction getGridHeight(height: number | string) {\n if (isString(height)) {\n height = parseInt(height.replace('px', ''), 10);\n }\n\n if (height < MIN_PANEL_HEIGHT) {\n height = MIN_PANEL_HEIGHT;\n }\n\n const gridHeight = Math.ceil(height / (GRID_CELL_HEIGHT + GRID_CELL_VMARGIN));\n return gridHeight;\n}\n\n/**\n * RowArea represents dashboard row filled by panels\n * area is an array of numbers represented filled column's cells like\n * -----------------------\n * |******** ****\n * |******** ****\n * |********\n * -----------------------\n * 33333333 2222 00000 ...\n */\nclass RowArea {\n area: number[];\n yPos: number;\n height: number;\n\n constructor(height: number, width = GRID_COLUMN_COUNT, rowYPos = 0) {\n this.area = new Array(width).fill(0);\n this.yPos = rowYPos;\n this.height = height;\n }\n\n reset() {\n this.area.fill(0);\n }\n\n /**\n * Update area after adding the panel.\n */\n addPanel(gridPos: any) {\n for (let i = gridPos.x; i < gridPos.x + gridPos.w; i++) {\n if (!this.area[i] || gridPos.y + gridPos.h - this.yPos > this.area[i]) {\n this.area[i] = gridPos.y + gridPos.h - this.yPos;\n }\n }\n return this.area;\n }\n\n /**\n * Calculate position for the new panel in the row.\n */\n getPanelPosition(panelHeight: number, panelWidth: number, callOnce = false): any {\n let startPlace, endPlace;\n let place;\n for (let i = this.area.length - 1; i >= 0; i--) {\n if (this.height - this.area[i] > 0) {\n if (endPlace === undefined) {\n endPlace = i;\n } else {\n if (i < this.area.length - 1 && this.area[i] <= this.area[i + 1]) {\n startPlace = i;\n } else {\n break;\n }\n }\n } else {\n break;\n }\n }\n\n if (startPlace !== undefined && endPlace !== undefined && endPlace - startPlace >= panelWidth - 1) {\n const yPos = max(this.area.slice(startPlace));\n place = {\n x: startPlace,\n y: yPos,\n };\n } else if (!callOnce) {\n // wrap to next row\n this.yPos += this.height;\n this.reset();\n return this.getPanelPosition(panelHeight, panelWidth, true);\n } else {\n return null;\n }\n\n return place;\n }\n}\n\nfunction upgradePanelLink(link: any): DataLink {\n let url = link.url;\n\n if (!url && link.dashboard) {\n url = `dashboard/db/${kbn.slugifyForUrl(link.dashboard)}`;\n }\n\n if (!url && link.dashUri) {\n url = `dashboard/${link.dashUri}`;\n }\n\n // some models are incomplete and have no dashboard or dashUri\n if (!url) {\n url = '/';\n }\n\n if (link.keepTime) {\n url = urlUtil.appendQueryToUrl(url, `$${DataLinkBuiltInVars.keepTime}`);\n }\n\n if (link.includeVars) {\n url = urlUtil.appendQueryToUrl(url, `$${DataLinkBuiltInVars.includeVars}`);\n }\n\n if (link.params) {\n url = urlUtil.appendQueryToUrl(url, link.params);\n }\n\n return {\n url: url,\n title: link.title,\n targetBlank: link.targetBlank,\n };\n}\n\nfunction updateVariablesSyntax(text: string) {\n const legacyVariableNamesRegex = /(__series_name)|(\\$__series_name)|(__value_time)|(__field_name)|(\\$__field_name)/g;\n\n return text.replace(legacyVariableNamesRegex, (match, seriesName, seriesName1, valueTime, fieldName, fieldName1) => {\n if (seriesName) {\n return '__series.name';\n }\n if (seriesName1) {\n return '${__series.name}';\n }\n if (valueTime) {\n return '__value.time';\n }\n if (fieldName) {\n return '__field.name';\n }\n if (fieldName1) {\n return '${__field.name}';\n }\n return match;\n });\n}\n\nfunction migrateSinglestat(panel: PanelModel) {\n // If 'grafana-singlestat-panel' exists, move to that\n if (config.panels['grafana-singlestat-panel']) {\n panel.type = 'grafana-singlestat-panel';\n return panel;\n }\n\n let returnSaveModel = false;\n\n if (!panel.changePlugin) {\n returnSaveModel = true;\n panel = new PanelModel(panel);\n }\n\n // To make sure PanelModel.isAngularPlugin logic thinks the current panel is angular\n // And since this plugin no longer exist we just fake it here\n panel.plugin = { angularPanelCtrl: {} } as PanelPlugin;\n\n // Otheriwse use gauge or stat panel\n if ((panel as any).gauge?.show) {\n gaugePanelPlugin.meta = config.panels['gauge'];\n panel.changePlugin(gaugePanelPlugin);\n } else {\n statPanelPlugin.meta = config.panels['stat'];\n panel.changePlugin(statPanelPlugin);\n }\n\n if (returnSaveModel) {\n return panel.getSaveModel();\n }\n\n return panel;\n}\n\ninterface MigrateDatasourceNameOptions {\n returnDefaultAsNull: boolean;\n}\n\nexport function migrateDatasourceNameToRef(\n nameOrRef: string | DataSourceRef | null | undefined,\n options: MigrateDatasourceNameOptions\n): DataSourceRef | null {\n if (options.returnDefaultAsNull && (nameOrRef == null || nameOrRef === 'default')) {\n return null;\n }\n\n if (isDataSourceRef(nameOrRef)) {\n return nameOrRef;\n }\n\n const ds = getDataSourceSrv().getInstanceSettings(nameOrRef);\n if (!ds) {\n return { uid: nameOrRef as string }; // not found\n }\n\n return getDataSourceRef(ds);\n}\n\n// mutates transformations appending a new transformer after the existing one\nfunction appendTransformerAfter(panel: PanelModel, id: string, cfg: DataTransformerConfig) {\n if (panel.transformations) {\n const transformations: DataTransformerConfig[] = [];\n for (const t of panel.transformations) {\n transformations.push(t);\n if (t.id === id) {\n transformations.push({ ...cfg });\n }\n }\n panel.transformations = transformations;\n }\n return panel;\n}\n\nfunction upgradeValueMappingsForPanel(panel: PanelModel) {\n const fieldConfig = panel.fieldConfig;\n if (!fieldConfig) {\n return panel;\n }\n\n if (fieldConfig.defaults && fieldConfig.defaults.mappings) {\n fieldConfig.defaults.mappings = upgradeValueMappings(\n fieldConfig.defaults.mappings,\n fieldConfig.defaults.thresholds\n );\n }\n\n // Protect against no overrides\n if (Array.isArray(fieldConfig.overrides)) {\n for (const override of fieldConfig.overrides) {\n for (const prop of override.properties) {\n if (prop.id === 'mappings') {\n prop.value = upgradeValueMappings(prop.value);\n }\n }\n }\n }\n\n return panel;\n}\n\nfunction isCloudWatchQuery(target: DataQuery): target is CloudWatchMetricsQuery {\n return (\n target.hasOwnProperty('dimensions') &&\n target.hasOwnProperty('namespace') &&\n target.hasOwnProperty('region') &&\n target.hasOwnProperty('metricName')\n );\n}\n\nfunction isLegacyCloudWatchAnnotationQuery(\n target: AnnotationQuery<DataQuery>\n): target is AnnotationQuery<LegacyAnnotationQuery> {\n return (\n target.hasOwnProperty('dimensions') &&\n target.hasOwnProperty('namespace') &&\n target.hasOwnProperty('region') &&\n target.hasOwnProperty('prefixMatching') &&\n target.hasOwnProperty('statistics')\n );\n}\n\nfunction upgradeValueMappings(oldMappings: any, thresholds?: ThresholdsConfig): ValueMapping[] | undefined {\n if (!oldMappings) {\n return undefined;\n }\n\n const valueMaps: ValueMap = { type: MappingType.ValueToText, options: {} };\n const newMappings: ValueMapping[] = [];\n\n for (const old of oldMappings) {\n // when migrating singlestat to stat/gauge, mappings are handled by panel type change handler used in that migration\n if (old.type && old.options) {\n // collect al value->text mappings in a single value map object. These are migrated by panel change handler as a separate value maps\n if (old.type === MappingType.ValueToText) {\n valueMaps.options = {\n ...valueMaps.options,\n ...old.options,\n };\n } else {\n newMappings.push(old);\n }\n continue;\n }\n\n // Use the color we would have picked from thesholds\n let color: string | undefined = undefined;\n const numeric = parseFloat(old.text);\n if (thresholds && !isNaN(numeric)) {\n const level = getActiveThreshold(numeric, thresholds.steps);\n if (level && level.color) {\n color = level.color;\n }\n }\n\n switch (old.type) {\n case 1: // MappingType.ValueToText:\n if (old.value != null) {\n if (old.value === 'null') {\n newMappings.push({\n type: MappingType.SpecialValue,\n options: {\n match: SpecialValueMatch.Null,\n result: { text: old.text, color },\n },\n });\n } else {\n valueMaps.options[String(old.value)] = {\n text: old.text,\n color,\n };\n }\n }\n break;\n case 2: // MappingType.RangeToText:\n newMappings.push({\n type: MappingType.RangeToText,\n options: {\n from: +old.from,\n to: +old.to,\n result: { text: old.text, color },\n },\n });\n break;\n }\n }\n\n if (Object.keys(valueMaps.options).length > 0) {\n newMappings.unshift(valueMaps);\n }\n\n return newMappings;\n}\n\nfunction migrateTooltipOptions(panel: PanelModel) {\n if (panel.type === 'timeseries' || panel.type === 'xychart') {\n if (panel.options.tooltipOptions) {\n panel.options = {\n ...panel.options,\n tooltip: panel.options.tooltipOptions,\n };\n delete panel.options.tooltipOptions;\n }\n }\n\n return panel;\n}\n\n// This migration is performed when there is a time series panel with all axes configured to be hidden\n// To avoid breaking dashboards we add override that persists x-axis visibility\nfunction ensureXAxisVisibility(panel: PanelModel) {\n if (panel.type === 'timeseries') {\n if (\n (panel.fieldConfig as FieldConfigSource<GraphFieldConfig>)?.defaults.custom?.axisPlacement ===\n AxisPlacement.Hidden\n ) {\n panel.fieldConfig = {\n ...panel.fieldConfig,\n overrides: [\n ...panel.fieldConfig.overrides,\n {\n matcher: {\n id: FieldMatcherID.byType,\n options: FieldType.time,\n },\n properties: [\n {\n id: 'custom.axisPlacement',\n value: AxisPlacement.Auto,\n },\n ],\n },\n ],\n };\n }\n }\n\n return panel;\n}\n","// Returns the factors of a number\n// Example getFactors(12) -> [1, 2, 3, 4, 6, 12]\nexport default function getFactors(num: number): number[] {\n return Array.from(new Array(num + 1), (_, i) => i).filter((i) => num % i === 0);\n}\n","import { isArray, isPlainObject } from 'lodash';\n\n/** @returns a deep clone of the object, but with any null value removed */\nexport function sortedDeepCloneWithoutNulls<T>(value: T): T {\n if (isArray(value)) {\n return value.map(sortedDeepCloneWithoutNulls) as unknown as T;\n }\n if (isPlainObject(value)) {\n return Object.keys(value)\n .sort()\n .reduce((acc: any, key) => {\n const v = (value as any)[key];\n if (v != null) {\n acc[key] = sortedDeepCloneWithoutNulls(v);\n }\n return acc;\n }, {});\n }\n return value;\n}\n","import { isEqualWith } from 'lodash';\n\nimport { PanelModel as IPanelModel } from '@grafana/data';\n\nimport { PanelModel } from '../state';\n\nexport interface PanelMergeInfo {\n changed: boolean;\n panels: PanelModel[];\n actions: Record<string, number[]>;\n}\n\n// Values that are safe to change without a full panel unmount/remount\n// TODO: options and fieldConfig should also be supported\nconst mutableKeys = new Set<keyof PanelModel>(['gridPos', 'title', 'description', 'transparent']);\n\nexport function mergePanels(current: PanelModel[], data: IPanelModel[]): PanelMergeInfo {\n const panels: PanelModel[] = [];\n const info = {\n changed: false,\n actions: {\n add: [] as number[],\n remove: [] as number[],\n replace: [] as number[],\n update: [] as number[],\n noop: [] as number[],\n },\n panels,\n };\n\n let nextId = 0;\n const inputPanels = new Map<number, IPanelModel>();\n for (let p of data) {\n let { id } = p;\n if (!id) {\n if (!nextId) {\n nextId = findNextPanelID([current, data]);\n }\n id = nextId++;\n p = { ...p, id }; // clone with new ID\n }\n inputPanels.set(id, p);\n }\n\n for (const panel of current) {\n const target = inputPanels.get(panel.id) as PanelModel;\n if (!target) {\n info.changed = true;\n info.actions.remove.push(panel.id);\n panel.destroy();\n continue;\n }\n inputPanels.delete(panel.id);\n\n // Fast comparison when working with the same panel objects\n if (target === panel) {\n panels.push(panel);\n info.actions.noop.push(panel.id);\n continue;\n }\n\n // Check if it is the same type\n if (panel.type === target.type) {\n const save = panel.getSaveModel();\n let isNoop = true;\n let doUpdate = false;\n for (const [key, value] of Object.entries(target)) {\n if (!isEqualWith(value, save[key], infinityEqualsNull)) {\n info.changed = true;\n isNoop = false;\n if (mutableKeys.has(key as any)) {\n (panel as any)[key] = value;\n doUpdate = true;\n } else {\n doUpdate = false;\n break; // needs full replace\n }\n }\n }\n\n if (isNoop) {\n panels.push(panel);\n info.actions.noop.push(panel.id);\n continue;\n }\n\n if (doUpdate) {\n panels.push(panel);\n info.actions.update.push(panel.id);\n continue;\n }\n }\n panel.destroy();\n\n const next = new PanelModel(target);\n next.key = `${next.id}-update-${Date.now()}`; // force react invalidate\n panels.push(next);\n info.changed = true;\n info.actions.replace.push(panel.id);\n }\n\n // Add the new panels\n for (const t of inputPanels.values()) {\n panels.push(new PanelModel(t));\n info.changed = true;\n info.actions.add.push(t.id);\n }\n\n return info;\n}\n\n// Since +- Infinity are saved as null in JSON, we need to make them equal here also\nfunction infinityEqualsNull(a: any, b: any) {\n if (a == null && (b === Infinity || b === -Infinity || b == null)) {\n return true;\n }\n if (b == null && (a === Infinity || a === -Infinity || a == null)) {\n return true;\n }\n return undefined; // use default comparison\n}\n\nfunction findNextPanelID(args: IPanelModel[][]): number {\n let max = 0;\n for (const panels of args) {\n for (const panel of panels) {\n if (panel.id > max) {\n max = panel.id;\n }\n }\n }\n return max + 1;\n}\n","import { cloneDeep, defaults as _defaults, filter, indexOf, isEqual, map, maxBy, pull } from 'lodash';\nimport { Subscription } from 'rxjs';\n\nimport {\n AnnotationQuery,\n AppEvent,\n DashboardCursorSync,\n dateTime,\n dateTimeFormat,\n dateTimeFormatTimeAgo,\n DateTimeInput,\n EventBusExtended,\n EventBusSrv,\n PanelModel as IPanelModel,\n TimeRange,\n TimeZone,\n UrlQueryValue,\n} from '@grafana/data';\nimport { RefreshEvent, TimeRangeUpdatedEvent } from '@grafana/runtime';\nimport { DEFAULT_ANNOTATION_COLOR } from '@grafana/ui';\nimport { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN, GRID_COLUMN_COUNT, REPEAT_DIR_VERTICAL } from 'app/core/constants';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { sortedDeepCloneWithoutNulls } from 'app/core/utils/object';\nimport { variableAdapters } from 'app/features/variables/adapters';\nimport { onTimeRangeUpdated } from 'app/features/variables/state/actions';\nimport { GetVariables, getVariablesByKey } from 'app/features/variables/state/selectors';\nimport { CoreEvents, DashboardMeta, KioskMode } from 'app/types';\nimport { DashboardPanelsChangedEvent, RenderEvent } from 'app/types/events';\n\nimport { appEvents } from '../../../core/core';\nimport { dispatch } from '../../../store/store';\nimport {\n VariablesChanged,\n VariablesChangedEvent,\n VariablesChangedInUrl,\n VariablesTimeRangeProcessDone,\n} from '../../variables/types';\nimport { isAllVariable } from '../../variables/utils';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { mergePanels, PanelMergeInfo } from '../utils/panelMerge';\n\nimport { DashboardMigrator } from './DashboardMigrator';\nimport { GridPos, PanelModel } from './PanelModel';\nimport { TimeModel } from './TimeModel';\nimport { deleteScopeVars, isOnTheSameGridRow } from './utils';\n\nexport interface CloneOptions {\n saveVariables?: boolean;\n saveTimerange?: boolean;\n message?: string;\n}\n\nexport type DashboardLinkType = 'link' | 'dashboards';\n\nexport interface DashboardLink {\n icon: string;\n title: string;\n tooltip: string;\n type: DashboardLinkType;\n url: string;\n asDropdown: boolean;\n tags: any[];\n searchHits?: any[];\n targetBlank: boolean;\n keepTime: boolean;\n includeVars: boolean;\n}\n\nexport class DashboardModel implements TimeModel {\n id: any;\n uid: string;\n title: string;\n autoUpdate: any;\n description: any;\n tags: any;\n style: any;\n timezone: any;\n weekStart: any;\n editable: any;\n graphTooltip: DashboardCursorSync;\n time: any;\n liveNow: boolean;\n private originalTime: any;\n timepicker: any;\n templating: { list: any[] };\n private originalTemplating: any;\n annotations: { list: AnnotationQuery[] };\n refresh: any;\n snapshot: any;\n schemaVersion: number;\n version: number;\n revision: number;\n links: DashboardLink[];\n gnetId: any;\n panels: PanelModel[];\n panelInEdit?: PanelModel;\n panelInView?: PanelModel;\n fiscalYearStartMonth?: number;\n private panelsAffectedByVariableChange: number[] | null;\n private appEventsSubscription: Subscription;\n private lastRefresh: number;\n\n // ------------------\n // not persisted\n // ------------------\n\n // repeat process cycles\n declare meta: DashboardMeta;\n events: EventBusExtended;\n\n static nonPersistedProperties: { [str: string]: boolean } = {\n events: true,\n meta: true,\n panels: true, // needs special handling\n templating: true, // needs special handling\n originalTime: true,\n originalTemplating: true,\n originalLibraryPanels: true,\n panelInEdit: true,\n panelInView: true,\n getVariablesFromState: true,\n formatDate: true,\n appEventsSubscription: true,\n panelsAffectedByVariableChange: true,\n lastRefresh: true,\n };\n\n constructor(data: any, meta?: DashboardMeta, private getVariablesFromState: GetVariables = getVariablesByKey) {\n if (!data) {\n data = {};\n }\n\n this.events = new EventBusSrv();\n this.id = data.id || null;\n this.uid = data.uid || null;\n this.revision = data.revision;\n this.title = data.title ?? 'No Title';\n this.autoUpdate = data.autoUpdate;\n this.description = data.description;\n this.tags = data.tags ?? [];\n this.style = data.style ?? 'dark';\n this.timezone = data.timezone ?? '';\n this.weekStart = data.weekStart ?? '';\n this.editable = data.editable !== false;\n this.graphTooltip = data.graphTooltip || 0;\n this.time = data.time ?? { from: 'now-6h', to: 'now' };\n this.timepicker = data.timepicker ?? {};\n this.liveNow = Boolean(data.liveNow);\n this.templating = this.ensureListExist(data.templating);\n this.annotations = this.ensureListExist(data.annotations);\n this.refresh = data.refresh;\n this.snapshot = data.snapshot;\n this.schemaVersion = data.schemaVersion ?? 0;\n this.fiscalYearStartMonth = data.fiscalYearStartMonth ?? 0;\n this.version = data.version ?? 0;\n this.links = data.links ?? [];\n this.gnetId = data.gnetId || null;\n this.panels = map(data.panels ?? [], (panelData: any) => new PanelModel(panelData));\n this.ensurePanelsHaveIds();\n this.formatDate = this.formatDate.bind(this);\n\n this.resetOriginalVariables(true);\n this.resetOriginalTime();\n\n this.initMeta(meta);\n this.updateSchema(data);\n\n this.addBuiltInAnnotationQuery();\n this.sortPanelsByGridPos();\n this.panelsAffectedByVariableChange = null;\n this.appEventsSubscription = new Subscription();\n this.lastRefresh = Date.now();\n this.appEventsSubscription.add(appEvents.subscribe(VariablesChanged, this.variablesChangedHandler.bind(this)));\n this.appEventsSubscription.add(\n appEvents.subscribe(VariablesTimeRangeProcessDone, this.variablesTimeRangeProcessDoneHandler.bind(this))\n );\n this.appEventsSubscription.add(\n appEvents.subscribe(VariablesChangedInUrl, this.variablesChangedInUrlHandler.bind(this))\n );\n }\n\n addBuiltInAnnotationQuery() {\n const found = this.annotations.list.some((item) => item.builtIn === 1);\n if (found) {\n return;\n }\n\n this.annotations.list.unshift({\n datasource: { uid: '-- Grafana --', type: 'grafana' },\n name: 'Annotations & Alerts',\n type: 'dashboard',\n iconColor: DEFAULT_ANNOTATION_COLOR,\n enable: true,\n hide: true,\n builtIn: 1,\n });\n }\n\n private initMeta(meta?: DashboardMeta) {\n meta = meta || {};\n\n meta.canShare = meta.canShare !== false;\n meta.canSave = meta.canSave !== false;\n meta.canStar = meta.canStar !== false;\n meta.canEdit = meta.canEdit !== false;\n meta.canDelete = meta.canDelete !== false;\n\n meta.showSettings = meta.canEdit;\n meta.canMakeEditable = meta.canSave && !this.editable;\n meta.hasUnsavedFolderChange = false;\n\n if (!this.editable) {\n meta.canEdit = false;\n meta.canDelete = false;\n meta.canSave = false;\n }\n\n this.meta = meta;\n }\n\n // cleans meta data and other non persistent state\n getSaveModelClone(options?: CloneOptions): DashboardModel {\n const defaults = _defaults(options || {}, {\n saveVariables: true,\n saveTimerange: true,\n });\n\n // make clone\n let copy: any = {};\n for (const property in this) {\n if (DashboardModel.nonPersistedProperties[property] || !this.hasOwnProperty(property)) {\n continue;\n }\n\n copy[property] = cloneDeep(this[property]);\n }\n\n this.updateTemplatingSaveModelClone(copy, defaults);\n\n if (!defaults.saveTimerange) {\n copy.time = this.originalTime;\n }\n\n // get panel save models\n copy.panels = this.getPanelSaveModels();\n\n // sort by keys\n copy = sortedDeepCloneWithoutNulls(copy);\n copy.getVariables = () => copy.templating.list;\n\n return copy;\n }\n\n /**\n * This will load a new dashboard, but keep existing panels unchanged\n *\n * This function can be used to implement:\n * 1. potentially faster loading dashboard loading\n * 2. dynamic dashboard behavior\n * 3. \"live\" dashboard editing\n *\n * @internal and experimental\n */\n updatePanels(panels: IPanelModel[]): PanelMergeInfo {\n const info = mergePanels(this.panels, panels ?? []);\n if (info.changed) {\n this.panels = info.panels ?? [];\n this.sortPanelsByGridPos();\n this.events.publish(new DashboardPanelsChangedEvent());\n }\n return info;\n }\n\n private getPanelSaveModels() {\n return this.panels\n .filter(\n (panel) =>\n this.isSnapshotTruthy() || !(panel.type === 'add-panel' || panel.repeatPanelId || panel.repeatedByRow)\n )\n .map((panel) => {\n // If we save while editing we should include the panel in edit mode instead of the\n // unmodified source panel\n if (this.panelInEdit && this.panelInEdit.id === panel.id) {\n return this.panelInEdit.getSaveModel();\n }\n\n return panel.getSaveModel();\n })\n .map((model: any) => {\n if (this.isSnapshotTruthy()) {\n return model;\n }\n // Clear any scopedVars from persisted mode. This cannot be part of getSaveModel as we need to be able to copy\n // panel models with preserved scopedVars, for example when going into edit mode.\n delete model.scopedVars;\n\n // Clear any repeated panels from collapsed rows\n if (model.type === 'row' && model.panels && model.panels.length > 0) {\n model.panels = model.panels\n .filter((rowPanel: PanelModel) => !rowPanel.repeatPanelId)\n .map((model: PanelModel) => {\n delete model.scopedVars;\n return model;\n });\n }\n\n return model;\n });\n }\n\n private updateTemplatingSaveModelClone(\n copy: any,\n defaults: { saveTimerange: boolean; saveVariables: boolean } & CloneOptions\n ) {\n const originalVariables = this.originalTemplating;\n const currentVariables = this.getVariablesFromState(this.uid);\n\n copy.templating = {\n list: currentVariables.map((variable) =>\n variableAdapters.get(variable.type).getSaveModel(variable, defaults.saveVariables)\n ),\n };\n\n if (!defaults.saveVariables) {\n for (const current of copy.templating.list) {\n const original = originalVariables.find(\n ({ name, type }: any) => name === current.name && type === current.type\n );\n\n if (!original) {\n continue;\n }\n\n if (current.type === 'adhoc') {\n current.filters = original.filters;\n } else {\n current.current = original.current;\n }\n }\n }\n }\n\n timeRangeUpdated(timeRange: TimeRange) {\n this.events.publish(new TimeRangeUpdatedEvent(timeRange));\n dispatch(onTimeRangeUpdated(this.uid, timeRange));\n }\n\n startRefresh(event: VariablesChangedEvent = { refreshAll: true, panelIds: [] }) {\n this.events.publish(new RefreshEvent());\n this.lastRefresh = Date.now();\n\n if (this.panelInEdit && (event.refreshAll || event.panelIds.includes(this.panelInEdit.id))) {\n this.panelInEdit.refresh();\n return;\n }\n\n for (const panel of this.panels) {\n if (!this.otherPanelInFullscreen(panel) && (event.refreshAll || event.panelIds.includes(panel.id))) {\n panel.refresh();\n }\n }\n }\n\n render() {\n this.events.publish(new RenderEvent());\n for (const panel of this.panels) {\n panel.render();\n }\n }\n\n panelInitialized(panel: PanelModel) {\n const lastResult = panel.getQueryRunner().getLastResult();\n\n if (!this.otherPanelInFullscreen(panel) && !lastResult) {\n panel.refresh();\n }\n }\n\n otherPanelInFullscreen(panel: PanelModel) {\n return (this.panelInEdit || this.panelInView) && !(panel.isViewing || panel.isEditing);\n }\n\n initEditPanel(sourcePanel: PanelModel): PanelModel {\n getTimeSrv().pauseAutoRefresh();\n this.panelInEdit = sourcePanel.getEditClone();\n return this.panelInEdit;\n }\n\n initViewPanel(panel: PanelModel) {\n this.panelInView = panel;\n panel.setIsViewing(true);\n }\n\n exitViewPanel(panel: PanelModel) {\n this.panelInView = undefined;\n panel.setIsViewing(false);\n this.refreshIfPanelsAffectedByVariableChange();\n }\n\n exitPanelEditor() {\n this.panelInEdit!.destroy();\n this.panelInEdit = undefined;\n getTimeSrv().resumeAutoRefresh();\n this.refreshIfPanelsAffectedByVariableChange();\n }\n\n private refreshIfPanelsAffectedByVariableChange() {\n if (!this.panelsAffectedByVariableChange) {\n return;\n }\n\n this.startRefresh({ panelIds: this.panelsAffectedByVariableChange, refreshAll: false });\n this.panelsAffectedByVariableChange = null;\n }\n\n private ensurePanelsHaveIds() {\n let nextPanelId = this.getNextPanelId();\n for (const panel of this.panelIterator()) {\n panel.id ??= nextPanelId++;\n }\n }\n\n private ensureListExist(data: any = {}) {\n data.list ??= [];\n return data;\n }\n\n getNextPanelId() {\n let max = 0;\n\n for (const panel of this.panelIterator()) {\n if (panel.id > max) {\n max = panel.id;\n }\n }\n\n return max + 1;\n }\n\n *panelIterator() {\n for (const panel of this.panels) {\n yield panel;\n\n const rowPanels = panel.panels ?? [];\n for (const rowPanel of rowPanels) {\n yield rowPanel;\n }\n }\n }\n\n forEachPanel(callback: (panel: PanelModel, index: number) => void) {\n for (let i = 0; i < this.panels.length; i++) {\n callback(this.panels[i], i);\n }\n }\n\n getPanelById(id: number): PanelModel | null {\n if (this.panelInEdit && this.panelInEdit.id === id) {\n return this.panelInEdit;\n }\n\n return this.panels.find((p) => p.id === id) ?? null;\n }\n\n canEditPanel(panel?: PanelModel | null): boolean | undefined | null {\n return Boolean(this.meta.canEdit && panel && !panel.repeatPanelId && panel.type !== 'row');\n }\n\n canEditPanelById(id: number): boolean | undefined | null {\n return this.canEditPanel(this.getPanelById(id));\n }\n\n addPanel(panelData: any) {\n panelData.id = this.getNextPanelId();\n\n this.panels.unshift(new PanelModel(panelData));\n\n this.sortPanelsByGridPos();\n\n this.events.publish(new DashboardPanelsChangedEvent());\n }\n\n sortPanelsByGridPos() {\n this.panels.sort((panelA, panelB) => {\n if (panelA.gridPos.y === panelB.gridPos.y) {\n return panelA.gridPos.x - panelB.gridPos.x;\n } else {\n return panelA.gridPos.y - panelB.gridPos.y;\n }\n });\n }\n\n clearUnsavedChanges() {\n for (const panel of this.panels) {\n panel.configRev = 0;\n }\n }\n\n hasUnsavedChanges() {\n const changedPanel = this.panels.find((p) => p.hasChanged);\n return Boolean(changedPanel);\n }\n\n cleanUpRepeats() {\n if (this.isSnapshotTruthy() || !this.hasVariables()) {\n return;\n }\n\n // cleanup scopedVars\n deleteScopeVars(this.panels);\n\n const panelsToRemove = this.panels.filter((p) => (!p.repeat || p.repeatedByRow) && p.repeatPanelId);\n\n // remove panels\n pull(this.panels, ...panelsToRemove);\n panelsToRemove.map((p) => p.destroy());\n this.sortPanelsByGridPos();\n }\n\n processRepeats() {\n if (this.isSnapshotTruthy() || !this.hasVariables()) {\n return;\n }\n\n this.cleanUpRepeats();\n\n for (let i = 0; i < this.panels.length; i++) {\n const panel = this.panels[i];\n if (panel.repeat) {\n this.repeatPanel(panel, i);\n }\n }\n\n this.sortPanelsByGridPos();\n this.events.publish(new DashboardPanelsChangedEvent());\n }\n\n cleanUpRowRepeats(rowPanels: PanelModel[]) {\n const panelIds = rowPanels.map((row) => row.id);\n // Remove repeated panels whose parent is in this row as these will be recreated later in processRowRepeats\n const panelsToRemove = rowPanels.filter((p) => !p.repeat && p.repeatPanelId && panelIds.includes(p.repeatPanelId));\n\n pull(rowPanels, ...panelsToRemove);\n pull(this.panels, ...panelsToRemove);\n }\n\n processRowRepeats(row: PanelModel) {\n if (this.isSnapshotTruthy() || !this.hasVariables()) {\n return;\n }\n\n let rowPanels = row.panels ?? [];\n if (!row.collapsed) {\n const rowPanelIndex = this.panels.findIndex((p) => p.id === row.id);\n rowPanels = this.getRowPanels(rowPanelIndex);\n }\n\n this.cleanUpRowRepeats(rowPanels);\n\n for (const panel of rowPanels) {\n if (panel.repeat) {\n const panelIndex = this.panels.findIndex((p) => p.id === panel.id);\n this.repeatPanel(panel, panelIndex);\n }\n }\n }\n\n getPanelRepeatClone(sourcePanel: PanelModel, valueIndex: number, sourcePanelIndex: number) {\n // if first clone return source\n if (valueIndex === 0) {\n return sourcePanel;\n }\n\n const m = sourcePanel.getSaveModel();\n m.id = this.getNextPanelId();\n const clone = new PanelModel(m);\n\n // insert after source panel + value index\n this.panels.splice(sourcePanelIndex + valueIndex, 0, clone);\n\n clone.repeatPanelId = sourcePanel.id;\n clone.repeat = undefined;\n\n if (this.panelInView?.id === clone.id) {\n clone.setIsViewing(true);\n this.panelInView = clone;\n }\n\n return clone;\n }\n\n getRowRepeatClone(sourceRowPanel: PanelModel, valueIndex: number, sourcePanelIndex: number) {\n // if first clone return source\n if (valueIndex === 0) {\n if (!sourceRowPanel.collapsed) {\n const rowPanels = this.getRowPanels(sourcePanelIndex);\n sourceRowPanel.panels = rowPanels;\n }\n return sourceRowPanel;\n }\n\n const clone = new PanelModel(sourceRowPanel.getSaveModel());\n // for row clones we need to figure out panels under row to clone and where to insert clone\n let rowPanels: PanelModel[], insertPos: number;\n if (sourceRowPanel.collapsed) {\n rowPanels = cloneDeep(sourceRowPanel.panels) ?? [];\n clone.panels = rowPanels;\n // insert copied row after preceding row\n insertPos = sourcePanelIndex + valueIndex;\n } else {\n rowPanels = this.getRowPanels(sourcePanelIndex);\n clone.panels = rowPanels.map((panel) => panel.getSaveModel());\n // insert copied row after preceding row's panels\n insertPos = sourcePanelIndex + (rowPanels.length + 1) * valueIndex;\n }\n this.panels.splice(insertPos, 0, clone);\n\n this.updateRepeatedPanelIds(clone);\n return clone;\n }\n\n repeatPanel(panel: PanelModel, panelIndex: number) {\n const variable = this.getPanelRepeatVariable(panel);\n if (!variable) {\n return;\n }\n\n if (panel.type === 'row') {\n this.repeatRow(panel, panelIndex, variable);\n return;\n }\n\n const selectedOptions = this.getSelectedVariableOptions(variable);\n\n const maxPerRow = panel.maxPerRow || 4;\n let xPos = 0;\n let yPos = panel.gridPos.y;\n\n for (let index = 0; index < selectedOptions.length; index++) {\n const option = selectedOptions[index];\n let copy;\n\n copy = this.getPanelRepeatClone(panel, index, panelIndex);\n copy.scopedVars ??= {};\n copy.scopedVars[variable.name] = option;\n\n if (panel.repeatDirection === REPEAT_DIR_VERTICAL) {\n if (index > 0) {\n yPos += copy.gridPos.h;\n }\n copy.gridPos.y = yPos;\n } else {\n // set width based on how many are selected\n // assumed the repeated panels should take up full row width\n copy.gridPos.w = Math.max(GRID_COLUMN_COUNT / selectedOptions.length, GRID_COLUMN_COUNT / maxPerRow);\n copy.gridPos.x = xPos;\n copy.gridPos.y = yPos;\n\n xPos += copy.gridPos.w;\n\n // handle overflow by pushing down one row\n if (xPos + copy.gridPos.w > GRID_COLUMN_COUNT) {\n xPos = 0;\n yPos += copy.gridPos.h;\n }\n }\n }\n\n // Update gridPos for panels below\n const yOffset = yPos - panel.gridPos.y;\n if (yOffset > 0) {\n const panelBelowIndex = panelIndex + selectedOptions.length;\n for (const curPanel of this.panels.slice(panelBelowIndex)) {\n if (isOnTheSameGridRow(panel, curPanel)) {\n continue;\n }\n\n curPanel.gridPos.y += yOffset;\n }\n }\n }\n\n repeatRow(panel: PanelModel, panelIndex: number, variable: any) {\n const selectedOptions = this.getSelectedVariableOptions(variable);\n let yPos = panel.gridPos.y;\n\n function setScopedVars(panel: PanelModel, variableOption: any) {\n panel.scopedVars ??= {};\n panel.scopedVars[variable.name] = variableOption;\n }\n\n for (let optionIndex = 0; optionIndex < selectedOptions.length; optionIndex++) {\n const option = selectedOptions[optionIndex];\n const rowCopy = this.getRowRepeatClone(panel, optionIndex, panelIndex);\n setScopedVars(rowCopy, option);\n\n const rowHeight = this.getRowHeight(rowCopy);\n const rowPanels = rowCopy.panels || [];\n let panelBelowIndex;\n\n if (panel.collapsed) {\n // For collapsed row just copy its panels and set scoped vars and proper IDs\n for (const rowPanel of rowPanels) {\n setScopedVars(rowPanel, option);\n if (optionIndex > 0) {\n this.updateRepeatedPanelIds(rowPanel, true);\n }\n }\n rowCopy.gridPos.y += optionIndex;\n yPos += optionIndex;\n panelBelowIndex = panelIndex + optionIndex + 1;\n } else {\n // insert after 'row' panel\n const insertPos = panelIndex + (rowPanels.length + 1) * optionIndex + 1;\n rowPanels.forEach((rowPanel: PanelModel, i: number) => {\n setScopedVars(rowPanel, option);\n if (optionIndex > 0) {\n const cloneRowPanel = new PanelModel(rowPanel);\n this.updateRepeatedPanelIds(cloneRowPanel, true);\n // For exposed row additionally set proper Y grid position and add it to dashboard panels\n cloneRowPanel.gridPos.y += rowHeight * optionIndex;\n this.panels.splice(insertPos + i, 0, cloneRowPanel);\n }\n });\n rowCopy.panels = [];\n rowCopy.gridPos.y += rowHeight * optionIndex;\n yPos += rowHeight;\n panelBelowIndex = insertPos + rowPanels.length;\n }\n\n // Update gridPos for panels below if we inserted more than 1 repeated row panel\n if (selectedOptions.length > 1) {\n for (const panel of this.panels.slice(panelBelowIndex)) {\n panel.gridPos.y += yPos;\n }\n }\n }\n }\n\n updateRepeatedPanelIds(panel: PanelModel, repeatedByRow?: boolean) {\n panel.repeatPanelId = panel.id;\n panel.id = this.getNextPanelId();\n\n if (repeatedByRow) {\n panel.repeatedByRow = true;\n } else {\n panel.repeat = undefined;\n }\n\n return panel;\n }\n\n getSelectedVariableOptions(variable: any) {\n let selectedOptions: any[];\n if (isAllVariable(variable)) {\n selectedOptions = variable.options.slice(1, variable.options.length);\n } else {\n selectedOptions = filter(variable.options, { selected: true });\n }\n return selectedOptions;\n }\n\n getRowHeight(rowPanel: PanelModel): number {\n if (!rowPanel.panels || rowPanel.panels.length === 0) {\n return 0;\n }\n\n const rowYPos = rowPanel.gridPos.y;\n const positions = map(rowPanel.panels, 'gridPos');\n const maxPos = maxBy(positions, (pos: GridPos) => pos.y + pos.h);\n return maxPos!.y + maxPos!.h - rowYPos;\n }\n\n removePanel(panel: PanelModel) {\n this.panels = this.panels.filter((item) => item !== panel);\n this.events.publish(new DashboardPanelsChangedEvent());\n }\n\n removeRow(row: PanelModel, removePanels: boolean) {\n const needToggle = (!removePanels && row.collapsed) || (removePanels && !row.collapsed);\n\n if (needToggle) {\n this.toggleRow(row);\n }\n\n this.removePanel(row);\n }\n\n expandRows() {\n const collapsedRows = this.panels.filter((p) => p.type === 'row' && p.collapsed);\n for (const row of collapsedRows) {\n this.toggleRow(row);\n }\n }\n\n collapseRows() {\n const collapsedRows = this.panels.filter((p) => p.type === 'row' && !p.collapsed);\n for (const row of collapsedRows) {\n this.toggleRow(row);\n }\n }\n\n isSubMenuVisible() {\n return (\n this.links.length > 0 ||\n this.getVariables().some((variable) => variable.hide !== 2) ||\n this.annotations.list.some((annotation) => !annotation.hide)\n );\n }\n\n getPanelInfoById(panelId: number) {\n const panelIndex = this.panels.findIndex((p) => p.id === panelId);\n return panelIndex >= 0 ? { panel: this.panels[panelIndex], index: panelIndex } : null;\n }\n\n duplicatePanel(panel: PanelModel) {\n const newPanel = panel.getSaveModel();\n newPanel.id = this.getNextPanelId();\n\n delete newPanel.repeat;\n delete newPanel.repeatIteration;\n delete newPanel.repeatPanelId;\n delete newPanel.scopedVars;\n\n if (newPanel.alert) {\n delete newPanel.thresholds;\n }\n\n delete newPanel.alert;\n\n // does it fit to the right?\n if (panel.gridPos.x + panel.gridPos.w * 2 <= GRID_COLUMN_COUNT) {\n newPanel.gridPos.x += panel.gridPos.w;\n } else {\n // add below\n newPanel.gridPos.y += panel.gridPos.h;\n }\n\n this.addPanel(newPanel);\n return newPanel;\n }\n\n formatDate(date: DateTimeInput, format?: string) {\n return dateTimeFormat(date, {\n format,\n timeZone: this.getTimezone(),\n });\n }\n\n destroy() {\n this.appEventsSubscription.unsubscribe();\n this.events.removeAllListeners();\n for (const panel of this.panels) {\n panel.destroy();\n }\n }\n\n toggleRow(row: PanelModel) {\n const rowIndex = indexOf(this.panels, row);\n\n if (!row.collapsed) {\n const rowPanels = this.getRowPanels(rowIndex);\n\n // remove panels\n pull(this.panels, ...rowPanels);\n // save panel models inside row panel\n row.panels = rowPanels.map((panel: PanelModel) => panel.getSaveModel());\n row.collapsed = true;\n\n if (rowPanels.some((panel) => panel.hasChanged)) {\n row.configRev++;\n }\n\n // emit change event\n this.events.publish(new DashboardPanelsChangedEvent());\n return;\n }\n\n row.collapsed = false;\n const rowPanels = row.panels ?? [];\n const hasRepeat = rowPanels.some((p: PanelModel) => p.repeat);\n if (rowPanels.length > 0) {\n // Use first panel to figure out if it was moved or pushed\n // If the panel doesn't have gridPos.y, use the row gridPos.y instead.\n // This can happen for some generated dashboards.\n const firstPanelYPos = rowPanels[0].gridPos.y ?? row.gridPos.y;\n const yDiff = firstPanelYPos - (row.gridPos.y + row.gridPos.h);\n\n // start inserting after row\n let insertPos = rowIndex + 1;\n // y max will represent the bottom y pos after all panels have been added\n // needed to know home much panels below should be pushed down\n let yMax = row.gridPos.y;\n\n for (const panel of rowPanels) {\n // set the y gridPos if it wasn't already set\n panel.gridPos.y ?? (panel.gridPos.y = row.gridPos.y); // (Safari 13.1 lacks ??= support)\n // make sure y is adjusted (in case row moved while collapsed)\n panel.gridPos.y -= yDiff;\n // insert after row\n this.panels.splice(insertPos, 0, new PanelModel(panel));\n // update insert post and y max\n insertPos += 1;\n yMax = Math.max(yMax, panel.gridPos.y + panel.gridPos.h);\n }\n\n const pushDownAmount = yMax - row.gridPos.y - 1;\n\n // push panels below down\n for (const panel of this.panels.slice(insertPos)) {\n panel.gridPos.y += pushDownAmount;\n }\n\n row.panels = [];\n\n if (hasRepeat) {\n this.processRowRepeats(row);\n }\n }\n\n // sort panels\n this.sortPanelsByGridPos();\n\n // emit change event\n this.events.publish(new DashboardPanelsChangedEvent());\n }\n\n /**\n * Will return all panels after rowIndex until it encounters another row\n */\n getRowPanels(rowIndex: number): PanelModel[] {\n const panelsBelowRow = this.panels.slice(rowIndex + 1);\n const nextRowIndex = panelsBelowRow.findIndex((p) => p.type === 'row');\n\n // Take all panels up to next row, or all panels if there are no other rows\n const rowPanels = panelsBelowRow.slice(0, nextRowIndex >= 0 ? nextRowIndex : this.panels.length);\n\n return rowPanels;\n }\n\n /** @deprecated */\n on<T>(event: AppEvent<T>, callback: (payload?: T) => void) {\n console.log('DashboardModel.on is deprecated use events.subscribe');\n this.events.on(event, callback);\n }\n\n /** @deprecated */\n off<T>(event: AppEvent<T>, callback: (payload?: T) => void) {\n console.log('DashboardModel.off is deprecated');\n this.events.off(event, callback);\n }\n\n cycleGraphTooltip() {\n this.graphTooltip = (this.graphTooltip + 1) % 3;\n }\n\n sharedTooltipModeEnabled() {\n return this.graphTooltip > 0;\n }\n\n sharedCrosshairModeOnly() {\n return this.graphTooltip === 1;\n }\n\n getRelativeTime(date: DateTimeInput) {\n return dateTimeFormatTimeAgo(date, {\n timeZone: this.getTimezone(),\n });\n }\n\n isSnapshot() {\n return this.snapshot !== undefined;\n }\n\n getTimezone(): TimeZone {\n return (this.timezone ? this.timezone : contextSrv?.user?.timezone) as TimeZone;\n }\n\n private updateSchema(old: any) {\n const migrator = new DashboardMigrator(this);\n migrator.updateSchema(old);\n }\n\n resetOriginalTime() {\n this.originalTime = cloneDeep(this.time);\n }\n\n hasTimeChanged() {\n const { time, originalTime } = this;\n\n // Compare moment values vs strings values\n return !(\n isEqual(time, originalTime) ||\n (isEqual(dateTime(time?.from), dateTime(originalTime?.from)) &&\n isEqual(dateTime(time?.to), dateTime(originalTime?.to)))\n );\n }\n\n resetOriginalVariables(initial = false) {\n if (initial) {\n this.originalTemplating = this.cloneVariablesFrom(this.templating.list);\n return;\n }\n\n this.originalTemplating = this.cloneVariablesFrom(this.getVariablesFromState(this.uid));\n }\n\n hasVariableValuesChanged() {\n return this.hasVariablesChanged(this.originalTemplating, this.getVariablesFromState(this.uid));\n }\n\n autoFitPanels(viewHeight: number, kioskMode?: UrlQueryValue) {\n const currentGridHeight = Math.max(...this.panels.map((panel) => panel.gridPos.h + panel.gridPos.y));\n\n const navbarHeight = 55;\n const margin = 20;\n const submenuHeight = 50;\n\n let visibleHeight = viewHeight - navbarHeight - margin;\n\n // Remove submenu height if visible\n if (this.meta.submenuEnabled && !kioskMode) {\n visibleHeight -= submenuHeight;\n }\n\n // add back navbar height\n if (kioskMode && kioskMode !== KioskMode.TV) {\n visibleHeight += navbarHeight;\n }\n\n const visibleGridHeight = Math.floor(visibleHeight / (GRID_CELL_HEIGHT + GRID_CELL_VMARGIN));\n const scaleFactor = currentGridHeight / visibleGridHeight;\n\n for (const panel of this.panels) {\n panel.gridPos.y = Math.round(panel.gridPos.y / scaleFactor) || 1;\n panel.gridPos.h = Math.round(panel.gridPos.h / scaleFactor) || 1;\n }\n }\n\n templateVariableValueUpdated() {\n this.processRepeats();\n this.events.emit(CoreEvents.templateVariableValueUpdated);\n }\n\n getPanelByUrlId(panelUrlId: string) {\n const panelId = parseInt(panelUrlId ?? '0', 10);\n\n // First try to find it in a collapsed row and exand it\n const collapsedPanels = this.panels.filter((p) => p.collapsed);\n for (const panel of collapsedPanels) {\n const hasPanel = panel.panels?.some((rp: any) => rp.id === panelId);\n hasPanel && this.toggleRow(panel);\n }\n\n return this.getPanelById(panelId);\n }\n\n toggleLegendsForAll() {\n const panelsWithLegends = this.panels.filter(isPanelWithLegend);\n\n // determine if more panels are displaying legends or not\n const onCount = panelsWithLegends.filter((panel) => panel.legend.show).length;\n const offCount = panelsWithLegends.length - onCount;\n const panelLegendsOn = onCount >= offCount;\n\n for (const panel of panelsWithLegends) {\n panel.legend.show = !panelLegendsOn;\n panel.render();\n }\n }\n\n getVariables() {\n return this.getVariablesFromState(this.uid);\n }\n\n canEditAnnotations(dashboardUID?: string) {\n let canEdit = true;\n\n // if RBAC is enabled there are additional conditions to check\n if (contextSrv.accessControlEnabled()) {\n // dashboardUID is falsy when it is an organizational annotation\n if (!dashboardUID) {\n canEdit = !!this.meta.annotationsPermissions?.organization.canEdit;\n } else {\n canEdit = !!this.meta.annotationsPermissions?.dashboard.canEdit;\n }\n }\n return this.canEditDashboard() && canEdit;\n }\n\n canDeleteAnnotations(dashboardUID?: string) {\n let canDelete = true;\n\n if (contextSrv.accessControlEnabled()) {\n // dashboardUID is falsy when it is an organizational annotation\n if (!dashboardUID) {\n canDelete = !!this.meta.annotationsPermissions?.organization.canDelete;\n } else {\n canDelete = !!this.meta.annotationsPermissions?.dashboard.canDelete;\n }\n }\n return canDelete && this.canEditDashboard();\n }\n\n canAddAnnotations() {\n // If RBAC is enabled there are additional conditions to check.\n const canAdd = !contextSrv.accessControlEnabled() || Boolean(this.meta.annotationsPermissions?.dashboard.canAdd);\n\n return this.canEditDashboard() && canAdd;\n }\n\n canEditDashboard() {\n return Boolean(this.meta.canEdit || this.meta.canMakeEditable);\n }\n\n shouldUpdateDashboardPanelFromJSON(updatedPanel: PanelModel, panel: PanelModel) {\n const shouldUpdateGridPositionLayout = !isEqual(updatedPanel?.gridPos, panel?.gridPos);\n if (shouldUpdateGridPositionLayout) {\n this.events.publish(new DashboardPanelsChangedEvent());\n }\n }\n\n getDefaultTime() {\n return this.originalTime;\n }\n\n private getPanelRepeatVariable(panel: PanelModel) {\n return this.getVariablesFromState(this.uid).find((variable) => variable.name === panel.repeat);\n }\n\n private isSnapshotTruthy() {\n return this.snapshot;\n }\n\n private hasVariables() {\n return this.getVariablesFromState(this.uid).length > 0;\n }\n\n private hasVariablesChanged(originalVariables: any[], currentVariables: any[]): boolean {\n if (originalVariables.length !== currentVariables.length) {\n return false;\n }\n\n const updated = currentVariables.map((variable: any) => ({\n name: variable.name,\n type: variable.type,\n current: cloneDeep(variable.current),\n filters: cloneDeep(variable.filters),\n }));\n\n return !isEqual(updated, originalVariables);\n }\n\n private cloneVariablesFrom(variables: any[]): any[] {\n return variables.map((variable) => ({\n name: variable.name,\n type: variable.type,\n current: cloneDeep(variable.current),\n filters: cloneDeep(variable.filters),\n }));\n }\n\n private variablesTimeRangeProcessDoneHandler(event: VariablesTimeRangeProcessDone) {\n const processRepeats = event.payload.variableIds.length > 0;\n this.variablesChangedHandler(new VariablesChanged({ panelIds: [], refreshAll: true }), processRepeats);\n }\n\n private variablesChangedHandler(event: VariablesChanged, processRepeats = true) {\n if (processRepeats) {\n this.processRepeats();\n }\n\n if (event.payload.refreshAll || getTimeSrv().isRefreshOutsideThreshold(this.lastRefresh)) {\n this.startRefresh({ refreshAll: true, panelIds: [] });\n return;\n }\n\n if (this.panelInEdit || this.panelInView) {\n this.panelsAffectedByVariableChange = event.payload.panelIds.filter(\n (id) => id !== (this.panelInEdit?.id ?? this.panelInView?.id)\n );\n }\n\n this.startRefresh(event.payload);\n }\n\n private variablesChangedInUrlHandler(event: VariablesChangedInUrl) {\n this.templateVariableValueUpdated();\n this.startRefresh(event.payload);\n }\n}\n\nfunction isPanelWithLegend(panel: PanelModel): panel is PanelModel & Pick<Required<PanelModel>, 'legend'> {\n return Boolean(panel.legend);\n}\n","import { REPEAT_DIR_HORIZONTAL } from '../../../core/constants';\n\nimport { PanelModel } from './PanelModel';\n\nexport function isOnTheSameGridRow(sourcePanel: PanelModel, otherPanel: PanelModel): boolean {\n if (sourcePanel.repeatDirection === REPEAT_DIR_HORIZONTAL) {\n return false;\n }\n\n if (\n otherPanel.gridPos.x >= sourcePanel.gridPos.x + sourcePanel.gridPos.w &&\n otherPanel.gridPos.y === sourcePanel.gridPos.y\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function deleteScopeVars(panels: PanelModel[]) {\n for (const panel of panels) {\n delete panel.scopedVars;\n if (panel.panels?.length) {\n for (const collapsedPanel of panel.panels) {\n delete collapsedPanel.scopedVars;\n }\n }\n }\n}\n","import { cloneDeep, defaultsDeep, isArray, isEqual, keys } from 'lodash';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n DataConfigSource,\n DataFrameDTO,\n DataLink,\n DataLinkBuiltInVars,\n DataQuery,\n DataTransformerConfig,\n EventBusSrv,\n FieldConfigSource,\n PanelPlugin,\n PanelPluginDataSupport,\n ScopedVars,\n urlUtil,\n PanelModel as IPanelModel,\n DataSourceRef,\n} from '@grafana/data';\nimport { getTemplateSrv, RefreshEvent } from '@grafana/runtime';\nimport config from 'app/core/config';\nimport { safeStringifyValue } from 'app/core/utils/explore';\nimport { getNextRefIdChar } from 'app/core/utils/query';\nimport { QueryGroupOptions } from 'app/types';\nimport {\n PanelOptionsChangedEvent,\n PanelQueriesChangedEvent,\n PanelTransformationsChangedEvent,\n RenderEvent,\n} from 'app/types/events';\n\nimport { PanelModelLibraryPanel } from '../../library-panels/types';\nimport { PanelQueryRunner } from '../../query/state/PanelQueryRunner';\nimport { getVariablesUrlParams } from '../../variables/getAllVariableValuesForUrl';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { TimeOverrideResult } from '../utils/panel';\n\nimport {\n filterFieldConfigOverrides,\n getPanelOptionsWithDefaults,\n isStandardFieldProp,\n restoreCustomOverrideRules,\n} from './getPanelOptionsWithDefaults';\n\nexport interface GridPos {\n x: number;\n y: number;\n w: number;\n h: number;\n static?: boolean;\n}\n\nconst notPersistedProperties: { [str: string]: boolean } = {\n events: true,\n isViewing: true,\n isEditing: true,\n isInView: true,\n hasRefreshed: true,\n cachedPluginOptions: true,\n plugin: true,\n queryRunner: true,\n replaceVariables: true,\n configRev: true,\n getDisplayTitle: true,\n dataSupport: true,\n key: true,\n};\n\n// For angular panels we need to clean up properties when changing type\n// To make sure the change happens without strange bugs happening when panels use same\n// named property with different type / value expectations\n// This is not required for react panels\nconst mustKeepProps: { [str: string]: boolean } = {\n id: true,\n gridPos: true,\n type: true,\n title: true,\n scopedVars: true,\n repeat: true,\n repeatPanelId: true,\n repeatDirection: true,\n repeatedByRow: true,\n minSpan: true,\n collapsed: true,\n panels: true,\n targets: true,\n datasource: true,\n timeFrom: true,\n timeShift: true,\n hideTimeOverride: true,\n description: true,\n links: true,\n fullscreen: true,\n isEditing: true,\n hasRefreshed: true,\n events: true,\n cacheTimeout: true,\n cachedPluginOptions: true,\n transparent: true,\n pluginVersion: true,\n queryRunner: true,\n transformations: true,\n fieldConfig: true,\n maxDataPoints: true,\n interval: true,\n replaceVariables: true,\n libraryPanel: true,\n getDisplayTitle: true,\n configRev: true,\n key: true,\n};\n\nconst defaults: any = {\n gridPos: { x: 0, y: 0, h: 3, w: 6 },\n targets: [{ refId: 'A' }],\n cachedPluginOptions: {},\n transparent: false,\n options: {},\n fieldConfig: {\n defaults: {},\n overrides: [],\n },\n title: '',\n};\n\nexport class PanelModel implements DataConfigSource, IPanelModel {\n /* persisted id, used in URL to identify a panel */\n id!: number;\n gridPos!: GridPos;\n type!: string;\n title!: string;\n alert?: any;\n scopedVars?: ScopedVars;\n repeat?: string;\n repeatIteration?: number;\n repeatPanelId?: number;\n repeatDirection?: string;\n repeatedByRow?: boolean;\n maxPerRow?: number;\n collapsed?: boolean;\n\n panels?: PanelModel[];\n declare targets: DataQuery[];\n transformations?: DataTransformerConfig[];\n datasource: DataSourceRef | null = null;\n thresholds?: any;\n pluginVersion?: string;\n\n snapshotData?: DataFrameDTO[];\n timeFrom?: any;\n timeShift?: any;\n hideTimeOverride?: any;\n declare options: {\n [key: string]: any;\n };\n declare fieldConfig: FieldConfigSource;\n\n maxDataPoints?: number | null;\n interval?: string | null;\n description?: string;\n links?: DataLink[];\n declare transparent: boolean;\n\n libraryPanel?: { uid: undefined; name: string } | PanelModelLibraryPanel;\n\n autoMigrateFrom?: string;\n\n // non persisted\n isViewing = false;\n isEditing = false;\n isInView = false;\n configRev = 0; // increments when configs change\n hasRefreshed?: boolean;\n cacheTimeout?: string | null;\n cachedPluginOptions: Record<string, PanelOptionsCache> = {};\n legend?: { show: boolean; sort?: string; sortDesc?: boolean };\n plugin?: PanelPlugin;\n /**\n * Unique in application state, this is used as redux key for panel and for redux panel state\n * Change will cause unmount and re-init of panel\n */\n key: string;\n\n /**\n * The PanelModel event bus only used for internal and legacy angular support.\n * The EventBus passed to panels is based on the dashboard event model.\n */\n events: EventBusSrv;\n\n private queryRunner?: PanelQueryRunner;\n\n constructor(model: any) {\n this.events = new EventBusSrv();\n this.restoreModel(model);\n this.replaceVariables = this.replaceVariables.bind(this);\n this.key = uuidv4();\n }\n\n /** Given a persistened PanelModel restores property values */\n restoreModel(model: any) {\n // Start with clean-up\n for (const property in this) {\n if (notPersistedProperties[property] || !this.hasOwnProperty(property)) {\n continue;\n }\n\n if (model[property]) {\n continue;\n }\n\n if (typeof (this as any)[property] === 'function') {\n continue;\n }\n\n if (typeof (this as any)[property] === 'symbol') {\n continue;\n }\n\n delete (this as any)[property];\n }\n\n // copy properties from persisted model\n for (const property in model) {\n (this as any)[property] = model[property];\n }\n\n switch (this.type) {\n case 'graph':\n if (config?.featureToggles?.autoMigrateGraphPanels) {\n this.autoMigrateFrom = this.type;\n this.type = 'timeseries';\n }\n break;\n case 'heatmap-new':\n this.autoMigrateFrom = this.type;\n this.type = 'heatmap';\n break;\n }\n\n // defaults\n defaultsDeep(this, cloneDeep(defaults));\n\n // queries must have refId\n this.ensureQueryIds();\n }\n\n generateNewKey() {\n this.key = uuidv4();\n }\n\n ensureQueryIds() {\n if (this.targets && isArray(this.targets)) {\n for (const query of this.targets) {\n if (!query.refId) {\n query.refId = getNextRefIdChar(this.targets);\n }\n }\n }\n }\n\n getOptions() {\n return this.options;\n }\n\n get hasChanged(): boolean {\n return this.configRev > 0;\n }\n\n updateOptions(options: object) {\n this.options = options;\n this.configRev++;\n this.events.publish(new PanelOptionsChangedEvent());\n this.render();\n }\n\n updateFieldConfig(config: FieldConfigSource) {\n this.fieldConfig = config;\n this.configRev++;\n this.events.publish(new PanelOptionsChangedEvent());\n\n this.resendLastResult();\n this.render();\n }\n\n getSaveModel() {\n const model: any = {};\n\n for (const property in this) {\n if (notPersistedProperties[property] || !this.hasOwnProperty(property)) {\n continue;\n }\n\n if (isEqual(this[property], defaults[property])) {\n continue;\n }\n\n model[property] = cloneDeep(this[property]);\n }\n\n return model;\n }\n\n setIsViewing(isViewing: boolean) {\n this.isViewing = isViewing;\n }\n\n updateGridPos(newPos: GridPos, manuallyUpdated = true) {\n if (\n newPos.x === this.gridPos.x &&\n newPos.y === this.gridPos.y &&\n newPos.h === this.gridPos.h &&\n newPos.w === this.gridPos.w\n ) {\n return;\n }\n\n this.gridPos.x = newPos.x;\n this.gridPos.y = newPos.y;\n this.gridPos.w = newPos.w;\n this.gridPos.h = newPos.h;\n if (manuallyUpdated) {\n this.configRev++;\n }\n }\n\n runAllPanelQueries(\n dashboardId: number,\n dashboardTimezone: string,\n timeData: TimeOverrideResult,\n width: number,\n publicDashboardAccessToken?: string\n ) {\n this.getQueryRunner().run({\n datasource: this.datasource,\n queries: this.targets,\n panelId: this.id,\n dashboardId: dashboardId,\n publicDashboardAccessToken,\n timezone: dashboardTimezone,\n timeRange: timeData.timeRange,\n timeInfo: timeData.timeInfo,\n maxDataPoints: this.maxDataPoints || Math.floor(width),\n minInterval: this.interval,\n scopedVars: this.scopedVars,\n cacheTimeout: this.cacheTimeout,\n transformations: this.transformations,\n });\n }\n\n refresh() {\n this.hasRefreshed = true;\n this.events.publish(new RefreshEvent());\n }\n\n render() {\n if (!this.hasRefreshed) {\n this.refresh();\n } else {\n this.events.publish(new RenderEvent());\n }\n }\n\n private getOptionsToRemember() {\n return Object.keys(this).reduce((acc, property) => {\n if (notPersistedProperties[property] || mustKeepProps[property]) {\n return acc;\n }\n return {\n ...acc,\n [property]: (this as any)[property],\n };\n }, {});\n }\n\n private restorePanelOptions(pluginId: string) {\n const prevOptions = this.cachedPluginOptions[pluginId];\n\n if (!prevOptions) {\n return;\n }\n\n Object.keys(prevOptions.properties).map((property) => {\n (this as any)[property] = prevOptions.properties[property];\n });\n\n this.fieldConfig = restoreCustomOverrideRules(this.fieldConfig, prevOptions.fieldConfig);\n }\n\n applyPluginOptionDefaults(plugin: PanelPlugin, isAfterPluginChange: boolean) {\n const options = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: this.options,\n currentFieldConfig: this.fieldConfig,\n isAfterPluginChange: isAfterPluginChange,\n });\n\n this.fieldConfig = options.fieldConfig;\n this.options = options.options;\n }\n\n pluginLoaded(plugin: PanelPlugin) {\n this.plugin = plugin;\n const version = getPluginVersion(plugin);\n\n if (this.autoMigrateFrom) {\n const wasAngular = this.autoMigrateFrom === 'graph';\n this.callPanelTypeChangeHandler(\n plugin,\n this.autoMigrateFrom,\n this.getOptionsToRemember(), // old options\n wasAngular\n );\n\n delete this.autoMigrateFrom;\n }\n\n if (plugin.onPanelMigration) {\n if (version !== this.pluginVersion) {\n this.options = plugin.onPanelMigration(this);\n this.pluginVersion = version;\n }\n }\n\n this.applyPluginOptionDefaults(plugin, false);\n this.resendLastResult();\n }\n\n clearPropertiesBeforePluginChange() {\n // remove panel type specific options\n for (const key of keys(this)) {\n if (mustKeepProps[key]) {\n continue;\n }\n delete (this as any)[key];\n }\n\n this.options = {};\n\n // clear custom options\n this.fieldConfig = {\n defaults: {\n ...this.fieldConfig.defaults,\n custom: {},\n },\n // filter out custom overrides\n overrides: filterFieldConfigOverrides(this.fieldConfig.overrides, isStandardFieldProp),\n };\n }\n\n // Let panel plugins inspect options from previous panel and keep any that it can use\n private callPanelTypeChangeHandler(\n newPlugin: PanelPlugin,\n oldPluginId: string,\n oldOptions: any,\n wasAngular: boolean\n ) {\n if (newPlugin.onPanelTypeChanged) {\n const prevOptions = wasAngular ? { angular: oldOptions } : oldOptions.options;\n Object.assign(this.options, newPlugin.onPanelTypeChanged(this, oldPluginId, prevOptions, this.fieldConfig));\n }\n }\n\n changePlugin(newPlugin: PanelPlugin) {\n const pluginId = newPlugin.meta.id;\n const oldOptions: any = this.getOptionsToRemember();\n const prevFieldConfig = this.fieldConfig;\n const oldPluginId = this.type;\n const wasAngular = this.isAngularPlugin();\n this.cachedPluginOptions[oldPluginId] = {\n properties: oldOptions,\n fieldConfig: prevFieldConfig,\n };\n\n this.clearPropertiesBeforePluginChange();\n this.restorePanelOptions(pluginId);\n\n // Potentially modify current options\n this.callPanelTypeChangeHandler(newPlugin, oldPluginId, oldOptions, wasAngular);\n\n // switch\n this.type = pluginId;\n this.plugin = newPlugin;\n this.configRev++;\n\n this.applyPluginOptionDefaults(newPlugin, true);\n\n if (newPlugin.onPanelMigration) {\n this.pluginVersion = getPluginVersion(newPlugin);\n }\n }\n\n updateQueries(options: QueryGroupOptions) {\n const { dataSource } = options;\n this.datasource = {\n uid: dataSource.uid,\n type: dataSource.type,\n };\n this.cacheTimeout = options.cacheTimeout;\n this.timeFrom = options.timeRange?.from;\n this.timeShift = options.timeRange?.shift;\n this.hideTimeOverride = options.timeRange?.hide;\n this.interval = options.minInterval;\n this.maxDataPoints = options.maxDataPoints;\n this.targets = options.queries;\n this.configRev++;\n\n this.events.publish(new PanelQueriesChangedEvent());\n }\n\n addQuery(query?: Partial<DataQuery>) {\n query = query || { refId: 'A' };\n query.refId = getNextRefIdChar(this.targets);\n this.targets.push(query as DataQuery);\n this.configRev++;\n }\n\n changeQuery(query: DataQuery, index: number) {\n // ensure refId is maintained\n query.refId = this.targets[index].refId;\n this.configRev++;\n\n // update query in array\n this.targets = this.targets.map((item, itemIndex) => {\n if (itemIndex === index) {\n return query;\n }\n return item;\n });\n }\n\n getEditClone() {\n const sourceModel = this.getSaveModel();\n\n const clone = new PanelModel(sourceModel);\n clone.isEditing = true;\n\n const sourceQueryRunner = this.getQueryRunner();\n\n // Copy last query result\n clone.getQueryRunner().useLastResultFrom(sourceQueryRunner);\n\n return clone;\n }\n\n getTransformations() {\n return this.transformations;\n }\n\n getFieldOverrideOptions() {\n if (!this.plugin) {\n return undefined;\n }\n\n return {\n fieldConfig: this.fieldConfig,\n replaceVariables: this.replaceVariables,\n fieldConfigRegistry: this.plugin.fieldConfigRegistry,\n theme: config.theme2,\n };\n }\n\n getDataSupport(): PanelPluginDataSupport {\n return this.plugin?.dataSupport ?? { annotations: false, alertStates: false };\n }\n\n getQueryRunner(): PanelQueryRunner {\n if (!this.queryRunner) {\n this.queryRunner = new PanelQueryRunner(this);\n }\n return this.queryRunner;\n }\n\n hasTitle() {\n return this.title && this.title.length > 0;\n }\n\n isAngularPlugin(): boolean {\n return (this.plugin && this.plugin.angularPanelCtrl) !== undefined;\n }\n\n destroy() {\n this.events.removeAllListeners();\n\n if (this.queryRunner) {\n this.queryRunner.destroy();\n }\n }\n\n setTransformations(transformations: DataTransformerConfig[]) {\n this.transformations = transformations;\n this.resendLastResult();\n this.configRev++;\n this.events.publish(new PanelTransformationsChangedEvent());\n }\n\n setProperty(key: keyof this, value: any) {\n this[key] = value;\n this.configRev++;\n\n // Custom handling of repeat dependent options, handled here as PanelEditor can\n // update one key at a time right now\n if (key === 'repeat') {\n if (this.repeat && !this.repeatDirection) {\n this.repeatDirection = 'h';\n } else if (!this.repeat) {\n delete this.repeatDirection;\n delete this.maxPerRow;\n }\n }\n }\n\n replaceVariables(value: string, extraVars: ScopedVars | undefined, format?: string | Function) {\n const lastRequest = this.getQueryRunner().getLastRequest();\n const vars: ScopedVars = Object.assign({}, this.scopedVars, lastRequest?.scopedVars, extraVars);\n\n const allVariablesParams = getVariablesUrlParams(vars);\n const variablesQuery = urlUtil.toUrlParams(allVariablesParams);\n const timeRangeUrl = urlUtil.toUrlParams(getTimeSrv().timeRangeForUrl());\n\n vars[DataLinkBuiltInVars.keepTime] = {\n text: timeRangeUrl,\n value: timeRangeUrl,\n };\n\n vars[DataLinkBuiltInVars.includeVars] = {\n text: variablesQuery,\n value: variablesQuery,\n };\n\n return getTemplateSrv().replace(value, vars, format);\n }\n\n resendLastResult() {\n if (!this.plugin) {\n return;\n }\n\n this.getQueryRunner().resendLastResult();\n }\n\n /*\n * This is the title used when displaying the title in the UI so it will include any interpolated variables.\n * If you need the raw title without interpolation use title property instead.\n * */\n getDisplayTitle(): string {\n return this.replaceVariables(this.title, undefined, 'text');\n }\n}\n\nfunction getPluginVersion(plugin: PanelPlugin): string {\n return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n}\n\ninterface PanelOptionsCache {\n properties: any;\n fieldConfig: FieldConfigSource;\n}\n\n// For cases where we immediately want to stringify the panel model without cloning each property\nexport function stringifyPanelModel(panel: PanelModel) {\n const model: any = {};\n\n Object.entries(panel)\n .filter(\n ([prop, val]) => !notPersistedProperties[prop] && panel.hasOwnProperty(prop) && !isEqual(val, defaults[prop])\n )\n .forEach(([k, v]) => {\n model[k] = v;\n });\n\n return safeStringifyValue(model);\n}\n","import { TimeZone } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport { createSuccessNotification } from 'app/core/copy/appNotification';\nimport { updateTimeZoneForSession, updateWeekStartForSession } from 'app/features/profile/state/reducers';\nimport { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLevel, ThunkResult } from 'app/types';\n\nimport { loadPluginDashboards } from '../../plugins/admin/state/actions';\nimport { cancelVariables } from '../../variables/state/actions';\nimport { getTimeSrv } from '../services/TimeSrv';\n\nimport { cleanUpDashboard, loadDashboardPermissions } from './reducers';\n\nexport function getDashboardPermissions(id: number): ThunkResult<void> {\n return async (dispatch) => {\n const permissions = await getBackendSrv().get(`/api/dashboards/id/${id}/permissions`);\n dispatch(loadDashboardPermissions(permissions));\n };\n}\n\nfunction toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO {\n return {\n userId: item.userId,\n teamId: item.teamId,\n role: item.role,\n permission: item.permission,\n };\n}\n\nexport function updateDashboardPermission(\n dashboardId: number,\n itemToUpdate: DashboardAcl,\n level: PermissionLevel\n): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const { dashboard } = getStore();\n const itemsToUpdate = [];\n\n for (const item of dashboard.permissions) {\n if (item.inherited) {\n continue;\n }\n\n const updated = toUpdateItem(item);\n\n // if this is the item we want to update, update it's permission\n if (itemToUpdate === item) {\n updated.permission = level;\n }\n\n itemsToUpdate.push(updated);\n }\n\n await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });\n await dispatch(getDashboardPermissions(dashboardId));\n };\n}\n\nexport function removeDashboardPermission(dashboardId: number, itemToDelete: DashboardAcl): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const dashboard = getStore().dashboard;\n const itemsToUpdate = [];\n\n for (const item of dashboard.permissions) {\n if (item.inherited || item === itemToDelete) {\n continue;\n }\n itemsToUpdate.push(toUpdateItem(item));\n }\n\n await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });\n await dispatch(getDashboardPermissions(dashboardId));\n };\n}\n\nexport function addDashboardPermission(dashboardId: number, newItem: NewDashboardAclItem): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const { dashboard } = getStore();\n const itemsToUpdate = [];\n\n for (const item of dashboard.permissions) {\n if (item.inherited) {\n continue;\n }\n itemsToUpdate.push(toUpdateItem(item));\n }\n\n itemsToUpdate.push({\n userId: newItem.userId,\n teamId: newItem.teamId,\n role: newItem.role,\n permission: newItem.permission,\n });\n\n await getBackendSrv().post(`/api/dashboards/id/${dashboardId}/permissions`, { items: itemsToUpdate });\n await dispatch(getDashboardPermissions(dashboardId));\n };\n}\n\nexport function importDashboard(data: any, dashboardTitle: string): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().post('/api/dashboards/import', data);\n dispatch(notifyApp(createSuccessNotification('Dashboard Imported', dashboardTitle)));\n dispatch(loadPluginDashboards());\n };\n}\n\nexport function removeDashboard(uid: string): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().delete(`/api/dashboards/uid/${uid}`);\n dispatch(loadPluginDashboards());\n };\n}\n\nexport const cleanUpDashboardAndVariables = (): ThunkResult<void> => (dispatch, getStore) => {\n const store = getStore();\n const dashboard = store.dashboard.getModel();\n\n if (dashboard) {\n dashboard.destroy();\n dispatch(cancelVariables(dashboard.uid));\n }\n\n getTimeSrv().stopAutoRefresh();\n\n dispatch(cleanUpDashboard());\n};\n\nexport const updateTimeZoneDashboard =\n (timeZone: TimeZone): ThunkResult<void> =>\n (dispatch) => {\n dispatch(updateTimeZoneForSession(timeZone));\n getTimeSrv().refreshTimeModel();\n };\n\nexport const updateWeekStartDashboard =\n (weekStart: string): ThunkResult<void> =>\n (dispatch) => {\n dispatch(updateWeekStartForSession(weekStart));\n getTimeSrv().refreshTimeModel();\n };\n","import { mergeWith, isArray, isObject, unset, isEqual } from 'lodash';\n\nimport {\n ConfigOverrideRule,\n DynamicConfigValue,\n FieldColorConfigSettings,\n FieldColorModeId,\n fieldColorModeRegistry,\n FieldConfigOptionsRegistry,\n FieldConfigProperty,\n FieldConfigSource,\n PanelPlugin,\n ThresholdsConfig,\n ThresholdsMode,\n} from '@grafana/data';\n\nexport interface Props {\n plugin: PanelPlugin;\n currentFieldConfig: FieldConfigSource;\n currentOptions: Record<string, any>;\n isAfterPluginChange: boolean;\n}\n\nexport interface OptionDefaults {\n options: any;\n fieldConfig: FieldConfigSource;\n}\n\nexport function getPanelOptionsWithDefaults({\n plugin,\n currentOptions,\n currentFieldConfig,\n isAfterPluginChange,\n}: Props): OptionDefaults {\n const optionsWithDefaults = mergeWith(\n {},\n plugin.defaults,\n currentOptions || {},\n (objValue: any, srcValue: any): any => {\n if (isArray(srcValue)) {\n return srcValue;\n }\n }\n );\n\n const fieldConfigWithDefaults = applyFieldConfigDefaults(currentFieldConfig, plugin);\n const fieldConfigWithOptimalColorMode = adaptFieldColorMode(plugin, fieldConfigWithDefaults, isAfterPluginChange);\n\n return { options: optionsWithDefaults, fieldConfig: fieldConfigWithOptimalColorMode };\n}\n\nfunction applyFieldConfigDefaults(existingFieldConfig: FieldConfigSource, plugin: PanelPlugin): FieldConfigSource {\n const pluginDefaults = plugin.fieldConfigDefaults;\n\n const result: FieldConfigSource = {\n defaults: mergeWith(\n {},\n pluginDefaults.defaults,\n existingFieldConfig ? existingFieldConfig.defaults : {},\n (objValue: any, srcValue: any): any => {\n if (isArray(srcValue)) {\n return srcValue;\n }\n }\n ),\n overrides: existingFieldConfig?.overrides ?? [],\n };\n\n cleanProperties(result.defaults, '', plugin.fieldConfigRegistry);\n\n // Thresholds base values are null in JSON but need to be converted to -Infinity\n if (result.defaults.thresholds) {\n fixThresholds(result.defaults.thresholds);\n }\n\n // Filter out overrides for properties that cannot be found in registry\n result.overrides = filterFieldConfigOverrides(result.overrides, (prop) => {\n return plugin.fieldConfigRegistry.getIfExists(prop.id) !== undefined;\n });\n\n for (const override of result.overrides) {\n for (const property of override.properties) {\n if (property.id === 'thresholds') {\n fixThresholds(property.value as ThresholdsConfig);\n }\n }\n }\n\n return result;\n}\n\nexport function filterFieldConfigOverrides(\n overrides: ConfigOverrideRule[],\n condition: (value: DynamicConfigValue) => boolean\n): ConfigOverrideRule[] {\n return overrides\n .map((x) => {\n const properties = x.properties.filter(condition);\n\n return {\n ...x,\n properties,\n };\n })\n .filter((x) => x.properties.length > 0);\n}\n\nfunction cleanProperties(obj: any, parentPath: string, fieldConfigRegistry: FieldConfigOptionsRegistry) {\n let found = false;\n\n for (const propName of Object.keys(obj)) {\n const value = obj[propName];\n const fullPath = `${parentPath}${propName}`;\n const existsInRegistry = !!fieldConfigRegistry.getIfExists(fullPath);\n\n // need to check early here as some standard properties have nested properies\n if (existsInRegistry) {\n found = true;\n continue;\n }\n\n if (isArray(value) || !isObject(value)) {\n if (!existsInRegistry) {\n unset(obj, propName);\n }\n } else {\n const childPropFound = cleanProperties(value, `${fullPath}.`, fieldConfigRegistry);\n // If no child props found unset the main object\n if (!childPropFound) {\n unset(obj, propName);\n }\n }\n }\n\n return found;\n}\n\nfunction adaptFieldColorMode(\n plugin: PanelPlugin,\n fieldConfig: FieldConfigSource,\n isAfterPluginChange: boolean\n): FieldConfigSource {\n if (!isAfterPluginChange) {\n return fieldConfig;\n }\n\n // adjust to prefered field color setting if needed\n const color = plugin.fieldConfigRegistry.getIfExists(FieldConfigProperty.Color);\n\n if (color && color.settings) {\n const colorSettings = color.settings as FieldColorConfigSettings;\n const mode = fieldColorModeRegistry.getIfExists(fieldConfig.defaults.color?.mode);\n\n // When no support fo value colors, use classic palette\n if (!colorSettings.byValueSupport) {\n if (!mode || mode.isByValue) {\n fieldConfig.defaults.color = { mode: FieldColorModeId.PaletteClassic };\n return fieldConfig;\n }\n }\n\n // When supporting value colors and prefering thresholds, use Thresholds mode.\n // Otherwise keep current mode\n if (colorSettings.byValueSupport && colorSettings.preferThresholdsMode && mode?.id !== FieldColorModeId.Fixed) {\n if (!mode || !mode.isByValue) {\n fieldConfig.defaults.color = { mode: FieldColorModeId.Thresholds };\n return fieldConfig;\n }\n }\n\n // If panel support bySeries then we should default to that when switching to this panel as that is most likely\n // what users will expect. Example scenario a user who has a graph panel (time series) and switches to Gauge and\n // then back to time series we want the graph panel color mode to reset to classic palette and not preserve the\n // Gauge prefered thresholds mode.\n if (colorSettings.bySeriesSupport && mode?.isByValue) {\n fieldConfig.defaults.color = { mode: FieldColorModeId.PaletteClassic };\n return fieldConfig;\n }\n }\n return fieldConfig;\n}\n\nfunction fixThresholds(thresholds: ThresholdsConfig) {\n if (!thresholds.mode) {\n thresholds.mode = ThresholdsMode.Absolute;\n }\n\n if (!thresholds.steps) {\n thresholds.steps = [];\n } else if (thresholds.steps.length) {\n // First value is always -Infinity\n // JSON saves it as null\n thresholds.steps[0].value = -Infinity;\n }\n}\n\nexport function restoreCustomOverrideRules(current: FieldConfigSource, old: FieldConfigSource): FieldConfigSource {\n const result = {\n defaults: {\n ...current.defaults,\n custom: old.defaults.custom,\n },\n overrides: [...current.overrides],\n };\n\n for (const override of old.overrides) {\n for (const prop of override.properties) {\n if (isCustomFieldProp(prop)) {\n const currentOverride = result.overrides.find((o) => isEqual(o.matcher, override.matcher));\n if (currentOverride) {\n if (currentOverride !== override) {\n currentOverride.properties.push(prop);\n }\n } else {\n result.overrides.push(override);\n }\n }\n }\n }\n\n return result;\n}\n\nexport function isCustomFieldProp(prop: DynamicConfigValue): boolean {\n return prop.id.startsWith('custom.');\n}\n\nexport function isStandardFieldProp(prop: DynamicConfigValue): boolean {\n return !isCustomFieldProp(prop);\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { AngularComponent } from '@grafana/runtime';\nimport { processAclItems } from 'app/core/utils/acl';\nimport { DashboardAclDTO, DashboardInitError, DashboardInitPhase, DashboardState } from 'app/types';\n\nimport { DashboardModel } from './DashboardModel';\nimport { PanelModel } from './PanelModel';\n\nexport const initialState: DashboardState = {\n initPhase: DashboardInitPhase.NotStarted,\n getModel: () => null,\n permissions: [],\n initError: null,\n};\n\nconst dashboardSlice = createSlice({\n name: 'dashboard',\n initialState,\n reducers: {\n loadDashboardPermissions: (state, action: PayloadAction<DashboardAclDTO[]>) => {\n state.permissions = processAclItems(action.payload);\n },\n dashboardInitFetching: (state) => {\n state.initPhase = DashboardInitPhase.Fetching;\n },\n dashboardInitServices: (state) => {\n state.initPhase = DashboardInitPhase.Services;\n },\n dashboardInitCompleted: (state, action: PayloadAction<DashboardModel>) => {\n state.getModel = () => action.payload;\n state.initPhase = DashboardInitPhase.Completed;\n },\n dashboardInitFailed: (state, action: PayloadAction<DashboardInitError>) => {\n state.initPhase = DashboardInitPhase.Failed;\n state.initError = action.payload;\n state.getModel = () => {\n return new DashboardModel({ title: 'Dashboard init failed' }, { canSave: false, canEdit: false });\n };\n },\n cleanUpDashboard: (state) => {\n state.initPhase = DashboardInitPhase.NotStarted;\n state.initError = null;\n state.getModel = () => null;\n },\n addPanel: (state, action: PayloadAction<PanelModel>) => {\n //state.panels[action.payload.id] = { pluginId: action.payload.type };\n },\n },\n});\n\nexport interface PanelModelAndPluginReadyPayload {\n panelId: number;\n plugin: PanelPlugin;\n}\n\nexport interface SetPanelAngularComponentPayload {\n panelId: number;\n angularComponent: AngularComponent | null;\n}\n\nexport interface SetPanelInstanceStatePayload {\n panelId: number;\n value: any;\n}\n\nexport const {\n loadDashboardPermissions,\n dashboardInitFetching,\n dashboardInitFailed,\n dashboardInitCompleted,\n dashboardInitServices,\n cleanUpDashboard,\n addPanel,\n} = dashboardSlice.actions;\n\nexport const dashboardReducer = dashboardSlice.reducer;\n\nexport default {\n dashboard: dashboardReducer,\n};\n","import { isString as _isString } from 'lodash';\n\nimport { TimeRange, AppEvents, rangeUtil, dateMath, PanelModel as IPanelModel } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\nimport { LS_PANEL_COPY_KEY, PANEL_BORDER } from 'app/core/constants';\nimport store from 'app/core/store';\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { AddLibraryPanelModal } from 'app/features/library-panels/components/AddLibraryPanelModal/AddLibraryPanelModal';\nimport { UnlinkModal } from 'app/features/library-panels/components/UnlinkModal/UnlinkModal';\nimport { cleanUpPanelState } from 'app/features/panel/state/actions';\nimport { dispatch } from 'app/store/store';\n\nimport { ShowConfirmModalEvent, ShowModalReactEvent } from '../../../types/events';\n\nexport const removePanel = (dashboard: DashboardModel, panel: PanelModel, ask: boolean) => {\n // confirm deletion\n if (ask !== false) {\n const text2 =\n panel.alert && !config.unifiedAlertingEnabled\n ? 'Panel includes an alert rule. removing the panel will also remove the alert rule'\n : undefined;\n const confirmText = panel.alert ? 'YES' : undefined;\n\n appEvents.publish(\n new ShowConfirmModalEvent({\n title: 'Remove panel',\n text: 'Are you sure you want to remove this panel?',\n text2: text2,\n icon: 'trash-alt',\n confirmText: confirmText,\n yesText: 'Remove',\n onConfirm: () => removePanel(dashboard, panel, false),\n })\n );\n return;\n }\n\n dashboard.removePanel(panel);\n dispatch(cleanUpPanelState(panel.key));\n};\n\nexport const duplicatePanel = (dashboard: DashboardModel, panel: PanelModel) => {\n dashboard.duplicatePanel(panel);\n};\n\nexport const copyPanel = (panel: IPanelModel) => {\n let saveModel = panel;\n if (panel instanceof PanelModel) {\n saveModel = panel.getSaveModel();\n }\n\n store.set(LS_PANEL_COPY_KEY, JSON.stringify(saveModel));\n appEvents.emit(AppEvents.alertSuccess, ['Panel copied. Click **Add panel** icon to paste.']);\n};\n\nexport const sharePanel = (dashboard: DashboardModel, panel: PanelModel) => {\n appEvents.publish(\n new ShowModalReactEvent({\n component: ShareModal,\n props: {\n dashboard: dashboard,\n panel: panel,\n },\n })\n );\n};\n\nexport const addLibraryPanel = (dashboard: DashboardModel, panel: PanelModel) => {\n appEvents.publish(\n new ShowModalReactEvent({\n component: AddLibraryPanelModal,\n props: {\n panel,\n initialFolderId: dashboard.meta.folderId,\n isOpen: true,\n },\n })\n );\n};\n\nexport const unlinkLibraryPanel = (panel: PanelModel) => {\n appEvents.publish(\n new ShowModalReactEvent({\n component: UnlinkModal,\n props: {\n onConfirm: () => {\n delete panel.libraryPanel;\n panel.render();\n },\n isOpen: true,\n },\n })\n );\n};\n\nexport const refreshPanel = (panel: PanelModel) => {\n panel.refresh();\n};\n\nexport const toggleLegend = (panel: PanelModel) => {\n const newOptions = { ...panel.options };\n newOptions.legend.showLegend === true\n ? (newOptions.legend.showLegend = false)\n : (newOptions.legend.showLegend = true);\n panel.updateOptions(newOptions);\n};\n\nexport interface TimeOverrideResult {\n timeRange: TimeRange;\n timeInfo: string;\n}\n\nexport function applyPanelTimeOverrides(panel: PanelModel, timeRange: TimeRange): TimeOverrideResult {\n const newTimeData = {\n timeInfo: '',\n timeRange: timeRange,\n };\n\n if (panel.timeFrom) {\n const timeFromInterpolated = getTemplateSrv().replace(panel.timeFrom, panel.scopedVars);\n const timeFromInfo = rangeUtil.describeTextRange(timeFromInterpolated);\n if (timeFromInfo.invalid) {\n newTimeData.timeInfo = 'invalid time override';\n return newTimeData;\n }\n\n if (_isString(timeRange.raw.from)) {\n const timeFromDate = dateMath.parse(timeFromInfo.from)!;\n newTimeData.timeInfo = timeFromInfo.display;\n newTimeData.timeRange = {\n from: timeFromDate,\n to: dateMath.parse(timeFromInfo.to)!,\n raw: {\n from: timeFromInfo.from,\n to: timeFromInfo.to,\n },\n };\n }\n }\n\n if (panel.timeShift) {\n const timeShiftInterpolated = getTemplateSrv().replace(panel.timeShift, panel.scopedVars);\n const timeShiftInfo = rangeUtil.describeTextRange(timeShiftInterpolated);\n if (timeShiftInfo.invalid) {\n newTimeData.timeInfo = 'invalid timeshift';\n return newTimeData;\n }\n\n const timeShift = '-' + timeShiftInterpolated;\n newTimeData.timeInfo += ' timeshift ' + timeShift;\n const from = dateMath.parseDateMath(timeShift, newTimeData.timeRange.from, false)!;\n const to = dateMath.parseDateMath(timeShift, newTimeData.timeRange.to, true)!;\n\n newTimeData.timeRange = {\n from,\n to,\n raw: {\n from,\n to,\n },\n };\n }\n\n if (panel.hideTimeOverride) {\n newTimeData.timeInfo = '';\n }\n\n return newTimeData;\n}\n\nexport function getResolution(panel: PanelModel): number {\n const htmlEl = document.getElementsByTagName('html')[0];\n const width = htmlEl.getBoundingClientRect().width; // https://stackoverflow.com/a/21454625\n\n return panel.maxDataPoints ? panel.maxDataPoints : Math.ceil(width * (panel.gridPos.w / 24));\n}\n\nexport function calculateInnerPanelHeight(panel: PanelModel, containerHeight: number): number {\n const chromePadding = panel.plugin && panel.plugin.noPadding ? 0 : config.theme.panelPadding * 2;\n const headerHeight = panel.hasTitle() ? config.theme.panelHeaderHeight : 0;\n return containerHeight - headerHeight - chromePadding - PANEL_BORDER;\n}\n","// The ID of the app plugin that we render under that \"Cloud Integrations\" tab\nexport const CLOUD_ONBOARDING_APP_ID = 'grafana-easystart-app';\n\n// The ID of the main nav-tree item (the main item in the NavIndex)\nexport const ROUTE_BASE_ID = 'data-connections';\n\nexport enum ROUTES {\n DataSources = '/data-connections/datasources',\n DataSourcesNew = '/data-connections/datasources/new',\n DataSourcesEdit = '/data-connections/datasources/edit/:uid',\n DataSourcesDashboards = '/data-connections/datasources/edit/:uid/dashboards',\n Plugins = '/data-connections/plugins',\n CloudIntegrations = '/data-connections/cloud-integrations',\n RecordedQueries = '/data-connections/recorded-queries',\n}\n","import { DataSourcesRoutes } from './types';\n\n/**\n * Default routes for data sources pages.\n * (Links to the pages can be overriden for this feature by using `DataSourcesRoutesContext`)\n */\nexport const DATASOURCES_ROUTES: DataSourcesRoutes = {\n List: '/datasources',\n Edit: '/datasources/edit/:uid',\n Dashboards: '/datasources/edit/:uid/dashboards',\n New: '/datasources/new',\n} as const;\n","import { AnyAction, createAction } from '@reduxjs/toolkit';\n\nimport { DataSourcePluginMeta, DataSourceSettings, LayoutMode, LayoutModes } from '@grafana/data';\nimport { DataSourcesState, DataSourceSettingsState, TestingStatus } from 'app/types';\n\nimport { GenericDataSourcePlugin } from '../types';\n\nimport { DataSourceTypesLoadedPayload } from './actions';\n\nexport const initialState: DataSourcesState = {\n dataSources: [],\n plugins: [],\n categories: [],\n dataSource: {} as DataSourceSettings,\n layoutMode: LayoutModes.List,\n searchQuery: '',\n dataSourcesCount: 0,\n dataSourceTypeSearchQuery: '',\n hasFetched: false,\n isLoadingDataSources: false,\n dataSourceMeta: {} as DataSourcePluginMeta,\n};\n\nexport const dataSourceLoaded = createAction<DataSourceSettings>('dataSources/dataSourceLoaded');\nexport const dataSourcesLoaded = createAction<DataSourceSettings[]>('dataSources/dataSourcesLoaded');\nexport const dataSourceMetaLoaded = createAction<DataSourcePluginMeta>('dataSources/dataSourceMetaLoaded');\nexport const dataSourcePluginsLoad = createAction('dataSources/dataSourcePluginsLoad');\nexport const dataSourcePluginsLoaded = createAction<DataSourceTypesLoadedPayload>(\n 'dataSources/dataSourcePluginsLoaded'\n);\nexport const setDataSourcesSearchQuery = createAction<string>('dataSources/setDataSourcesSearchQuery');\nexport const setDataSourcesLayoutMode = createAction<LayoutMode>('dataSources/setDataSourcesLayoutMode');\nexport const setDataSourceTypeSearchQuery = createAction<string>('dataSources/setDataSourceTypeSearchQuery');\nexport const setDataSourceName = createAction<string>('dataSources/setDataSourceName');\nexport const setIsDefault = createAction<boolean>('dataSources/setIsDefault');\n\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because Angular would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const dataSourcesReducer = (state: DataSourcesState = initialState, action: AnyAction): DataSourcesState => {\n if (dataSourcesLoaded.match(action)) {\n return {\n ...state,\n hasFetched: true,\n dataSources: action.payload,\n dataSourcesCount: action.payload.length,\n };\n }\n\n if (dataSourceLoaded.match(action)) {\n return { ...state, dataSource: action.payload };\n }\n\n if (setDataSourcesSearchQuery.match(action)) {\n return { ...state, searchQuery: action.payload };\n }\n\n if (setDataSourcesLayoutMode.match(action)) {\n return { ...state, layoutMode: action.payload };\n }\n\n if (dataSourcePluginsLoad.match(action)) {\n return { ...state, plugins: [], isLoadingDataSources: true };\n }\n\n if (dataSourcePluginsLoaded.match(action)) {\n return {\n ...state,\n plugins: action.payload.plugins,\n categories: action.payload.categories,\n isLoadingDataSources: false,\n };\n }\n\n if (setDataSourceTypeSearchQuery.match(action)) {\n return { ...state, dataSourceTypeSearchQuery: action.payload };\n }\n\n if (dataSourceMetaLoaded.match(action)) {\n return { ...state, dataSourceMeta: action.payload };\n }\n\n if (setDataSourceName.match(action)) {\n return { ...state, dataSource: { ...state.dataSource, name: action.payload } };\n }\n\n if (setIsDefault.match(action)) {\n return {\n ...state,\n dataSource: { ...state.dataSource, isDefault: action.payload },\n };\n }\n\n return state;\n};\n\nexport const initialDataSourceSettingsState: DataSourceSettingsState = {\n testingStatus: {},\n loadError: null,\n loading: true,\n plugin: null,\n};\n\nexport const initDataSourceSettingsSucceeded = createAction<GenericDataSourcePlugin>(\n 'dataSourceSettings/initDataSourceSettingsSucceeded'\n);\n\nexport const initDataSourceSettingsFailed = createAction<Error>('dataSourceSettings/initDataSourceSettingsFailed');\n\nexport const testDataSourceStarting = createAction<undefined>('dataSourceSettings/testDataSourceStarting');\n\nexport const testDataSourceSucceeded = createAction<TestingStatus>('dataSourceSettings/testDataSourceSucceeded');\n\nexport const testDataSourceFailed = createAction<TestingStatus>('dataSourceSettings/testDataSourceFailed');\n\nexport const dataSourceSettingsReducer = (\n state: DataSourceSettingsState = initialDataSourceSettingsState,\n action: AnyAction\n): DataSourceSettingsState => {\n if (initDataSourceSettingsSucceeded.match(action)) {\n return { ...state, plugin: action.payload, loadError: null, loading: false };\n }\n\n if (initDataSourceSettingsFailed.match(action)) {\n return { ...state, plugin: null, loadError: action.payload.message, loading: false };\n }\n\n if (testDataSourceStarting.match(action)) {\n return {\n ...state,\n testingStatus: {\n message: 'Testing...',\n status: 'info',\n },\n };\n }\n\n if (testDataSourceSucceeded.match(action)) {\n return {\n ...state,\n testingStatus: {\n status: action.payload?.status,\n message: action.payload?.message,\n details: action.payload?.details,\n },\n };\n }\n\n if (testDataSourceFailed.match(action)) {\n return {\n ...state,\n testingStatus: {\n status: 'error',\n message: action.payload?.message,\n details: action.payload?.details,\n },\n };\n }\n\n return state;\n};\n\nexport default {\n dataSources: dataSourcesReducer,\n dataSourceSettings: dataSourceSettingsReducer,\n};\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback } from 'react';\n\nimport { GrafanaTheme2, SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { Select, ColorPicker, useStyles2 } from '@grafana/ui';\n\nimport {\n useFieldDisplayNames,\n useSelectOptions,\n} from '../../../../../packages/grafana-ui/src/components/MatchersUI/utils';\nimport { ColorDimensionConfig } from '../types';\n\nconst fixedColorOption: SelectableValue<string> = {\n label: 'Fixed color',\n value: '_____fixed_____',\n};\n\nexport const ColorDimensionEditor: FC<StandardEditorProps<ColorDimensionConfig, any, any>> = (props) => {\n const { value, context, onChange } = props;\n\n const defaultColor = 'dark-green';\n\n const styles = useStyles2(getStyles);\n const fieldName = value?.field;\n const isFixed = Boolean(!fieldName);\n const names = useFieldDisplayNames(context.data);\n const selectOptions = useSelectOptions(names, fieldName, fixedColorOption);\n\n const onSelectChange = useCallback(\n (selection: SelectableValue<string>) => {\n const field = selection.value;\n if (field && field !== fixedColorOption.value) {\n onChange({\n ...value,\n field,\n });\n } else {\n const fixed = value?.fixed ?? defaultColor;\n onChange({\n ...value,\n field: undefined,\n fixed,\n });\n }\n },\n [onChange, value]\n );\n\n const onColorChange = useCallback(\n (c: string) => {\n onChange({\n field: undefined,\n fixed: c ?? defaultColor,\n });\n },\n [onChange]\n );\n\n const selectedOption = isFixed ? fixedColorOption : selectOptions.find((v) => v.value === fieldName);\n return (\n <>\n <div className={styles.container}>\n <Select\n value={selectedOption}\n options={selectOptions}\n onChange={onSelectChange}\n noOptionsMessage=\"No fields found\"\n />\n {isFixed && (\n <div className={styles.picker}>\n <ColorPicker color={value?.fixed ?? defaultColor} onChange={onColorChange} enableNamedColors={true} />\n </div>\n )}\n </div>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css`\n display: flex;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n `,\n picker: css`\n padding-left: 8px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { Dispatch, SetStateAction, useState } from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { FileDropzone, useStyles2, Button, DropzoneFile, Field } from '@grafana/ui';\n\nimport { MediaType } from '../types';\ninterface Props {\n setFormData: Dispatch<SetStateAction<FormData>>;\n mediaType: MediaType;\n setUpload: Dispatch<SetStateAction<boolean>>;\n newValue: string;\n error: ErrorResponse;\n}\ninterface ErrorResponse {\n message: string;\n}\nexport function FileDropzoneCustomChildren({ secondaryText = 'Drag and drop here or browse' }) {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.iconWrapper}>\n <small className={styles.small}>{secondaryText}</small>\n <Button type=\"button\" icon=\"upload\">\n Upload\n </Button>\n </div>\n );\n}\nexport const FileUploader = ({ mediaType, setFormData, setUpload, error }: Props) => {\n const styles = useStyles2(getStyles);\n const [dropped, setDropped] = useState<boolean>(false);\n const [file, setFile] = useState<string>('');\n\n const Preview = () => (\n <Field label=\"Preview\">\n <div className={styles.iconPreview}>\n {mediaType === MediaType.Icon && <SVG src={file} className={styles.img} />}\n {mediaType === MediaType.Image && <img src={file} className={styles.img} />}\n </div>\n </Field>\n );\n\n const onFileRemove = (file: DropzoneFile) => {\n fetch(`/api/storage/delete/upload/${file.file.name}`, {\n method: 'DELETE',\n }).catch((error) => console.error('cannot delete file', error));\n };\n\n const acceptableFiles =\n mediaType === 'icon' ? { 'image/*': ['.svg', '.xml'] } : { 'image/*': ['.jpeg', '.png', '.gif', '.webp'] };\n return (\n <FileDropzone\n readAs=\"readAsBinaryString\"\n onFileRemove={onFileRemove}\n options={{\n accept: acceptableFiles,\n multiple: false,\n onDrop: (acceptedFiles: File[]) => {\n let formData = new FormData();\n formData.append('file', acceptedFiles[0]);\n setFile(URL.createObjectURL(acceptedFiles[0]));\n setDropped(true);\n setFormData(formData);\n setUpload(true);\n },\n }}\n >\n {error.message !== '' && dropped ? (\n <p>{error.message}</p>\n ) : dropped ? (\n <Preview />\n ) : (\n <FileDropzoneCustomChildren />\n )}\n </FileDropzone>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2, isDragActive?: boolean) {\n return {\n container: css`\n display: flex;\n flex-direction: column;\n width: 100%;\n `,\n dropzone: css`\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n padding: ${theme.spacing(6)};\n border-radius: 2px;\n border: 2px dashed ${theme.colors.border.medium};\n background-color: ${isDragActive ? theme.colors.background.secondary : theme.colors.background.primary};\n cursor: pointer;\n `,\n iconWrapper: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n `,\n acceptMargin: css`\n margin: ${theme.spacing(2, 0, 1)};\n `,\n small: css`\n color: ${theme.colors.text.secondary};\n margin-bottom: ${theme.spacing(2)};\n `,\n iconContainer: css`\n display: flex;\n flex-direction: column;\n width: 80%;\n align-items: center;\n align-self: center;\n `,\n iconPreview: css`\n width: 238px;\n height: 198px;\n border: 1px solid ${theme.colors.border.medium};\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n img: css`\n width: 147px;\n height: 147px;\n fill: ${theme.colors.text.primary};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport React, { memo, CSSProperties } from 'react';\nimport SVG from 'react-inlinesvg';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { areEqual, FixedSizeGrid as Grid } from 'react-window';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2, stylesFactory } from '@grafana/ui';\n\nimport { ResourceItem } from './FolderPickerTab';\n\ninterface CellProps {\n columnIndex: number;\n rowIndex: number;\n style: CSSProperties;\n data: {\n cards: ResourceItem[];\n columnCount: number;\n onChange: (value: string) => void;\n selected?: string;\n };\n}\n\nfunction Cell(props: CellProps) {\n const { columnIndex, rowIndex, style, data } = props;\n const { cards, columnCount, onChange, selected } = data;\n const singleColumnIndex = columnIndex + rowIndex * columnCount;\n const card = cards[singleColumnIndex];\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <div style={style}>\n {card && (\n <div\n key={card.value}\n className={selected === card.value ? cx(styles.card, styles.selected) : styles.card}\n onClick={() => onChange(card.value)}\n >\n {card.imgUrl.endsWith('.svg') ? (\n <SVG src={card.imgUrl} className={styles.img} />\n ) : (\n <img src={card.imgUrl} className={styles.img} />\n )}\n <h6 className={styles.text}>{card.label.slice(0, -4)}</h6>\n </div>\n )}\n </div>\n );\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n card: css`\n display: inline-block;\n width: 90px;\n height: 90px;\n margin: 0.75rem;\n margin-left: 15px;\n text-align: center;\n cursor: pointer;\n position: relative;\n background-color: transparent;\n border: 1px solid transparent;\n border-radius: 8px;\n padding-top: 6px;\n :hover {\n border-color: ${theme.colors.action.hover};\n box-shadow: ${theme.shadows.z2};\n }\n `,\n selected: css`\n border: 2px solid ${theme.colors.primary.main};\n :hover {\n border-color: ${theme.colors.primary.main};\n }\n `,\n img: css`\n width: 40px;\n height: 40px;\n object-fit: cover;\n vertical-align: middle;\n fill: ${theme.colors.text.primary};\n `,\n text: css`\n color: ${theme.colors.text.primary};\n white-space: nowrap;\n font-size: 12px;\n text-overflow: ellipsis;\n display: block;\n overflow: hidden;\n `,\n grid: css`\n border: 1px solid ${theme.colors.border.medium};\n `,\n };\n});\n\ninterface CardProps {\n onChange: (value: string) => void;\n cards: ResourceItem[];\n value?: string;\n}\n\nexport const ResourceCards = (props: CardProps) => {\n const { onChange, cards, value } = props;\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <AutoSizer defaultWidth={680}>\n {({ width, height }) => {\n const cardWidth = 90;\n const cardHeight = 90;\n const columnCount = Math.floor(width / cardWidth);\n const rowCount = Math.ceil(cards.length / columnCount);\n return (\n <Grid\n width={width}\n height={height}\n columnCount={columnCount}\n columnWidth={cardWidth}\n rowCount={rowCount}\n rowHeight={cardHeight}\n itemData={{ cards, columnCount, onChange, selected: value }}\n className={styles.grid}\n >\n {memo(Cell, areEqual)}\n </Grid>\n );\n }}\n </AutoSizer>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { Dispatch, SetStateAction, useEffect, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { Field, FilterInput, Select, useStyles2 } from '@grafana/ui';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { FileElement, GrafanaDatasource } from 'app/plugins/datasource/grafana/datasource';\n\nimport { MediaType, ResourceFolderName } from '../types';\n\nimport { ResourceCards } from './ResourceCards';\n\nconst getFolders = (mediaType: MediaType) => {\n if (mediaType === MediaType.Icon) {\n return [ResourceFolderName.Icon, ResourceFolderName.IOT, ResourceFolderName.Marker];\n } else {\n return [ResourceFolderName.BG];\n }\n};\n\nconst getFolderIfExists = (folders: Array<SelectableValue<string>>, path: string) => {\n return folders.find((folder) => path.startsWith(folder.value!)) ?? folders[0];\n};\n\nexport interface ResourceItem {\n label: string;\n value: string; // includes folder\n search: string;\n imgUrl: string;\n}\n\ninterface Props {\n value?: string;\n mediaType: MediaType;\n folderName: ResourceFolderName;\n newValue: string;\n setNewValue: Dispatch<SetStateAction<string>>;\n}\n\nexport const FolderPickerTab = (props: Props) => {\n const { value, mediaType, folderName, newValue, setNewValue } = props;\n const styles = useStyles2(getStyles);\n\n const folders = getFolders(mediaType).map((v) => ({\n label: v,\n value: v,\n }));\n\n const [searchQuery, setSearchQuery] = useState<string>();\n\n const [currentFolder, setCurrentFolder] = useState<SelectableValue<string>>(\n getFolderIfExists(folders, value?.length ? value : folderName)\n );\n const [directoryIndex, setDirectoryIndex] = useState<ResourceItem[]>([]);\n const [filteredIndex, setFilteredIndex] = useState<ResourceItem[]>([]);\n\n const onChangeSearch = (query: string) => {\n if (query) {\n query = query.toLowerCase();\n setFilteredIndex(directoryIndex.filter((card) => card.search.includes(query)));\n } else {\n setFilteredIndex(directoryIndex);\n }\n };\n\n useEffect(() => {\n // we don't want to load everything before picking a folder\n const folder = currentFolder?.value;\n if (folder) {\n const filter =\n mediaType === MediaType.Icon\n ? (item: FileElement) => item.name.endsWith('.svg')\n : (item: FileElement) => item.name.endsWith('.png') || item.name.endsWith('.gif');\n\n getDatasourceSrv()\n .get('-- Grafana --')\n .then((ds) => {\n (ds as GrafanaDatasource).listFiles(folder).subscribe({\n next: (frame) => {\n const cards: ResourceItem[] = [];\n frame.forEach((item) => {\n if (filter(item)) {\n const idx = item.name.lastIndexOf('.');\n cards.push({\n value: `${folder}/${item.name}`,\n label: item.name,\n search: (idx ? item.name.substring(0, idx) : item.name).toLowerCase(),\n imgUrl: `public/${folder}/${item.name}`,\n });\n }\n });\n setDirectoryIndex(cards);\n setFilteredIndex(cards);\n },\n });\n });\n }\n }, [mediaType, currentFolder]);\n\n return (\n <>\n <Field>\n <Select options={folders} onChange={setCurrentFolder} value={currentFolder} />\n </Field>\n <Field>\n <FilterInput\n value={searchQuery ?? ''}\n placeholder=\"Search\"\n onChange={(v) => {\n onChangeSearch(v);\n setSearchQuery(v);\n }}\n />\n </Field>\n {filteredIndex && (\n <div className={styles.cardsWrapper}>\n <ResourceCards cards={filteredIndex} onChange={(v) => setNewValue(v)} value={newValue} />\n </div>\n )}\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n cardsWrapper: css`\n height: 30vh;\n min-height: 50px;\n margin-top: 5px;\n max-width: 680px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { Dispatch, SetStateAction } from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Field, Input, Label, useStyles2 } from '@grafana/ui';\n\nimport { getPublicOrAbsoluteUrl } from '../resource';\nimport { MediaType } from '../types';\n\ninterface Props {\n newValue: string;\n setNewValue: Dispatch<SetStateAction<string>>;\n mediaType: MediaType;\n}\n\nexport const URLPickerTab = (props: Props) => {\n const { newValue, setNewValue, mediaType } = props;\n const styles = useStyles2(getStyles);\n\n const imgSrc = getPublicOrAbsoluteUrl(newValue!);\n\n let shortName = newValue?.substring(newValue.lastIndexOf('/') + 1, newValue.lastIndexOf('.'));\n if (shortName.length > 20) {\n shortName = shortName.substring(0, 20) + '...';\n }\n\n return (\n <>\n <Field>\n <Input onChange={(e) => setNewValue(e.currentTarget.value)} value={newValue} />\n </Field>\n <div className={styles.iconContainer}>\n <Field label=\"Preview\">\n <div className={styles.iconPreview}>\n {mediaType === MediaType.Icon && <SVG src={imgSrc} className={styles.img} />}\n {mediaType === MediaType.Image && newValue && <img src={imgSrc} className={styles.img} />}\n </div>\n </Field>\n <Label>{shortName}</Label>\n </div>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n iconContainer: css`\n display: flex;\n flex-direction: column;\n width: 80%;\n align-items: center;\n align-self: center;\n `,\n iconPreview: css`\n width: 238px;\n height: 198px;\n border: 1px solid ${theme.colors.border.medium};\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n img: css`\n width: 147px;\n height: 147px;\n fill: ${theme.colors.text.primary};\n `,\n});\n","import { css } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport React, { createRef, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { Button, ButtonGroup, useStyles2 } from '@grafana/ui';\nimport { config } from 'app/core/config';\n\nimport { MediaType, PickerTabType, ResourceFolderName } from '../types';\n\nimport { FileUploader } from './FileUploader';\nimport { FolderPickerTab } from './FolderPickerTab';\nimport { URLPickerTab } from './URLPickerTab';\n\ninterface Props {\n value?: string; //img/icons/unicons/0-plus.svg\n onChange: (value?: string) => void;\n mediaType: MediaType;\n folderName: ResourceFolderName;\n}\n\ninterface ErrorResponse {\n message: string;\n}\nexport const ResourcePickerPopover = (props: Props) => {\n const { value, onChange, mediaType, folderName } = props;\n const styles = useStyles2(getStyles);\n\n const onClose = () => {\n onChange(value);\n };\n\n const ref = createRef<HTMLElement>();\n const { dialogProps } = useDialog({}, ref);\n const { overlayProps } = useOverlay({ onClose, isDismissable: true, isOpen: true }, ref);\n\n const [newValue, setNewValue] = useState<string>(value ?? '');\n const [activePicker, setActivePicker] = useState<PickerTabType>(PickerTabType.Folder);\n const [formData, setFormData] = useState<FormData>(new FormData());\n const [upload, setUpload] = useState<boolean>(false);\n const [error, setError] = useState<ErrorResponse>({ message: '' });\n\n const getTabClassName = (tabName: PickerTabType) => {\n return `${styles.resourcePickerPopoverTab} ${activePicker === tabName && styles.resourcePickerPopoverActiveTab}`;\n };\n\n const renderFolderPicker = () => (\n <FolderPickerTab\n value={value}\n mediaType={mediaType}\n folderName={folderName}\n newValue={newValue}\n setNewValue={setNewValue}\n />\n );\n\n const renderURLPicker = () => <URLPickerTab newValue={newValue} setNewValue={setNewValue} mediaType={mediaType} />;\n const renderUploader = () => (\n <FileUploader\n mediaType={mediaType}\n setFormData={setFormData}\n setUpload={setUpload}\n newValue={newValue}\n error={error}\n />\n );\n const renderPicker = () => {\n switch (activePicker) {\n case PickerTabType.Folder:\n return renderFolderPicker();\n case PickerTabType.URL:\n return renderURLPicker();\n case PickerTabType.Upload:\n return renderUploader();\n default:\n return renderFolderPicker();\n }\n };\n\n return (\n <FocusScope contain autoFocus restoreFocus>\n <section ref={ref} {...overlayProps} {...dialogProps}>\n <div className={styles.resourcePickerPopover}>\n <div className={styles.resourcePickerPopoverTabs}>\n <button\n className={getTabClassName(PickerTabType.Folder)}\n onClick={() => setActivePicker(PickerTabType.Folder)}\n >\n Folder\n </button>\n <button className={getTabClassName(PickerTabType.URL)} onClick={() => setActivePicker(PickerTabType.URL)}>\n URL\n </button>\n </div>\n <div className={styles.resourcePickerPopoverContent}>\n {renderPicker()}\n <ButtonGroup className={styles.buttonGroup}>\n <Button className={styles.button} variant={'secondary'} onClick={() => onClose()}>\n Cancel\n </Button>\n <Button\n className={styles.button}\n variant={newValue && newValue !== value ? 'primary' : 'secondary'}\n onClick={() => {\n if (upload) {\n fetch('/api/storage/upload', {\n method: 'POST',\n body: formData,\n })\n .then((res) => {\n if (res.status >= 400) {\n res.json().then((data) => setError(data));\n return;\n } else {\n return res.json();\n }\n })\n .then((data) => {\n getBackendSrv()\n .get(`api/storage/read/${data.path}`)\n .then(() => setNewValue(`${config.appUrl}api/storage/read/${data.path}`))\n .then(() => onChange(`${config.appUrl}api/storage/read/${data.path}`));\n })\n .catch((err) => console.error(err));\n } else {\n onChange(newValue);\n }\n }}\n >\n Select\n </Button>\n </ButtonGroup>\n </div>\n </div>\n </section>\n </FocusScope>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n resourcePickerPopover: css`\n border-radius: ${theme.shape.borderRadius()};\n box-shadow: ${theme.shadows.z3};\n background: ${theme.colors.background.primary};\n border: 1px solid ${theme.colors.border.medium};\n `,\n resourcePickerPopoverTab: css`\n width: 50%;\n text-align: center;\n padding: ${theme.spacing(1, 0)};\n background: ${theme.colors.background.secondary};\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.bodySmall.fontSize};\n cursor: pointer;\n border: none;\n\n &:focus:not(:focus-visible) {\n outline: none;\n box-shadow: none;\n }\n\n :focus-visible {\n position: relative;\n }\n `,\n resourcePickerPopoverActiveTab: css`\n color: ${theme.colors.text.primary};\n font-weight: ${theme.typography.fontWeightMedium};\n background: ${theme.colors.background.primary};\n `,\n resourcePickerPopoverContent: css`\n width: 315px;\n font-size: ${theme.typography.bodySmall.fontSize};\n min-height: 184px;\n padding: ${theme.spacing(1)};\n display: flex;\n flex-direction: column;\n `,\n resourcePickerPopoverTabs: css`\n display: flex;\n width: 100%;\n border-radius: ${theme.shape.borderRadius()} ${theme.shape.borderRadius()} 0 0;\n `,\n buttonGroup: css`\n align-self: center;\n flex-direction: row;\n `,\n button: css`\n margin: 12px 20px 5px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { createRef } from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport {\n Button,\n InlineField,\n InlineFieldRow,\n Input,\n LinkButton,\n Popover,\n PopoverController,\n useStyles2,\n useTheme2,\n} from '@grafana/ui';\nimport { closePopover } from '@grafana/ui/src/utils/closePopover';\n\nimport { getPublicOrAbsoluteUrl } from '../resource';\nimport { MediaType, ResourceFolderName, ResourcePickerSize } from '../types';\n\nimport { ResourcePickerPopover } from './ResourcePickerPopover';\n\ninterface Props {\n onChange: (value?: string) => void;\n mediaType: MediaType;\n folderName: ResourceFolderName;\n size: ResourcePickerSize;\n onClear?: (event: React.MouseEvent) => void;\n value?: string; //img/icons/unicons/0-plus.svg\n src?: string;\n name?: string;\n placeholder?: string;\n color?: string;\n}\n\nexport const ResourcePicker = (props: Props) => {\n const { value, src, name, placeholder, onChange, onClear, mediaType, folderName, size, color } = props;\n\n const styles = useStyles2(getStyles);\n const theme = useTheme2();\n\n const pickerTriggerRef = createRef<any>();\n const popoverElement = (\n <ResourcePickerPopover onChange={onChange} value={value} mediaType={mediaType} folderName={folderName} />\n );\n\n let sanitizedSrc = src;\n if (!sanitizedSrc && value) {\n sanitizedSrc = getPublicOrAbsoluteUrl(value);\n }\n\n const colorStyle = color && {\n fill: theme.visualization.getColorByName(color),\n };\n\n const renderSmallResourcePicker = () => {\n if (value && sanitizedSrc) {\n return <SVG src={sanitizedSrc} className={styles.icon} style={{ ...colorStyle }} />;\n } else {\n return (\n <LinkButton variant=\"primary\" fill=\"text\" size=\"sm\">\n Set icon\n </LinkButton>\n );\n }\n };\n\n const renderNormalResourcePicker = () => (\n <InlineFieldRow>\n <InlineField label={null} grow>\n <Input\n value={name}\n placeholder={placeholder}\n readOnly={true}\n prefix={sanitizedSrc && <SVG src={sanitizedSrc} className={styles.icon} style={{ ...colorStyle }} />}\n suffix={<Button icon=\"times\" variant=\"secondary\" fill=\"text\" size=\"sm\" onClick={onClear} />}\n />\n </InlineField>\n </InlineFieldRow>\n );\n\n return (\n <PopoverController content={popoverElement}>\n {(showPopper, hidePopper, popperProps) => {\n return (\n <>\n {pickerTriggerRef.current && (\n <Popover\n {...popperProps}\n referenceElement={pickerTriggerRef.current}\n onMouseEnter={showPopper}\n onKeyDown={(event: any) => {\n closePopover(event, hidePopper);\n }}\n />\n )}\n\n <div ref={pickerTriggerRef} onClick={showPopper} className={styles.pointer}>\n {size === ResourcePickerSize.SMALL && renderSmallResourcePicker()}\n {size === ResourcePickerSize.NORMAL && renderNormalResourcePicker()}\n </div>\n </>\n );\n }}\n </PopoverController>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n pointer: css`\n cursor: pointer;\n input[readonly] {\n cursor: pointer;\n }\n `,\n icon: css`\n vertical-align: middle;\n display: inline-block;\n fill: currentColor;\n width: 25px;\n `,\n});\n","import React, { FC, useCallback, useState } from 'react';\n\nimport {\n FieldNamePickerConfigSettings,\n StandardEditorProps,\n StandardEditorsRegistryItem,\n StringFieldConfigSettings,\n} from '@grafana/data';\nimport { Button, InlineField, InlineFieldRow, RadioButtonGroup } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\nimport { StringValueEditor } from 'app/core/components/OptionsUI/string';\n\nimport { TextDimensionConfig, TextDimensionMode, TextDimensionOptions } from '../types';\n\nconst textOptions = [\n { label: 'Fixed', value: TextDimensionMode.Fixed, description: 'Fixed value' },\n { label: 'Field', value: TextDimensionMode.Field, description: 'Display field value' },\n // { label: 'Template', value: TextDimensionMode.Template, description: 'use template text' },\n];\n\nconst dummyFieldSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {\n settings: {},\n} as any;\n\nconst dummyStringSettings: StandardEditorsRegistryItem<string, StringFieldConfigSettings> = {\n settings: {},\n} as any;\n\nexport const TextDimensionEditor: FC<StandardEditorProps<TextDimensionConfig, TextDimensionOptions, any>> = (props) => {\n const { value, context, onChange } = props;\n const labelWidth = 9;\n\n // force re-render on clear fixed text\n const [refresh, setRefresh] = useState(0);\n\n const onModeChange = useCallback(\n (mode) => {\n onChange({\n ...value,\n mode,\n });\n },\n [onChange, value]\n );\n\n const onFieldChange = useCallback(\n (field) => {\n onChange({\n ...value,\n field,\n });\n },\n [onChange, value]\n );\n\n const onFixedChange = useCallback(\n (fixed) => {\n onChange({\n ...value,\n fixed,\n });\n },\n [onChange, value]\n );\n\n const onClearFixed = () => {\n onFixedChange('');\n setRefresh(refresh + 1);\n };\n\n const mode = value?.mode ?? TextDimensionMode.Fixed;\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Source\" labelWidth={labelWidth} grow={true}>\n <RadioButtonGroup value={mode} options={textOptions} onChange={onModeChange} fullWidth />\n </InlineField>\n </InlineFieldRow>\n {mode !== TextDimensionMode.Fixed && (\n <InlineFieldRow>\n <InlineField label=\"Field\" labelWidth={labelWidth} grow={true}>\n <FieldNamePicker\n context={context}\n value={value.field ?? ''}\n onChange={onFieldChange}\n item={dummyFieldSettings}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n {mode === TextDimensionMode.Fixed && (\n <InlineFieldRow key={refresh}>\n <InlineField label={'Value'} labelWidth={labelWidth} grow={true}>\n <StringValueEditor\n context={context}\n value={value?.fixed}\n onChange={onFixedChange}\n item={dummyStringSettings}\n suffix={\n value?.fixed && <Button icon=\"times\" variant=\"secondary\" fill=\"text\" size=\"sm\" onClick={onClearFixed} />\n }\n />\n </InlineField>\n </InlineFieldRow>\n )}\n {mode === TextDimensionMode.Template && (\n <InlineFieldRow>\n <InlineField label=\"Template\" labelWidth={labelWidth} grow={true}>\n <StringValueEditor // This could be a code editor\n context={context}\n value={value?.fixed}\n onChange={onFixedChange}\n item={dummyStringSettings}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </>\n );\n};\n","import React, { FC, useCallback } from 'react';\n\nimport { FieldNamePickerConfigSettings, StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data';\nimport { InlineField, InlineFieldRow, RadioButtonGroup } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\n\nimport { getPublicOrAbsoluteUrl, ResourceFolderName } from '..';\nimport {\n MediaType,\n ResourceDimensionConfig,\n ResourceDimensionMode,\n ResourceDimensionOptions,\n ResourcePickerSize,\n} from '../types';\n\nimport { ResourcePicker } from './ResourcePicker';\n\nconst resourceOptions = [\n { label: 'Fixed', value: ResourceDimensionMode.Fixed, description: 'Fixed value' },\n { label: 'Field', value: ResourceDimensionMode.Field, description: 'Use a string field result' },\n // { label: 'Mapping', value: ResourceDimensionMode.Mapping, description: 'Map the results of a value to an svg' },\n];\n\nconst dummyFieldSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {\n settings: {},\n} as any;\n\nexport const ResourceDimensionEditor: FC<\n StandardEditorProps<ResourceDimensionConfig, ResourceDimensionOptions, any>\n> = (props) => {\n const { value, context, onChange, item } = props;\n const labelWidth = 9;\n\n const onModeChange = useCallback(\n (mode) => {\n onChange({\n ...value,\n mode,\n });\n },\n [onChange, value]\n );\n\n const onFieldChange = useCallback(\n (field) => {\n onChange({\n ...value,\n field,\n });\n },\n [onChange, value]\n );\n\n const onFixedChange = useCallback(\n (fixed?: string) => {\n onChange({\n ...value,\n fixed: fixed ?? '',\n });\n },\n [onChange, value]\n );\n\n const onClear = (event: React.MouseEvent) => {\n event.stopPropagation();\n onChange({ mode: ResourceDimensionMode.Fixed, fixed: '', field: '' });\n };\n\n const mode = value?.mode ?? ResourceDimensionMode.Fixed;\n const showSourceRadio = item.settings?.showSourceRadio ?? true;\n const mediaType = item.settings?.resourceType ?? MediaType.Icon;\n const folderName = item.settings?.folderName ?? ResourceFolderName.Icon;\n let srcPath = '';\n if (mediaType === MediaType.Icon) {\n if (value?.fixed) {\n srcPath = getPublicOrAbsoluteUrl(value.fixed);\n } else if (item.settings?.placeholderValue) {\n srcPath = getPublicOrAbsoluteUrl(item.settings.placeholderValue);\n }\n }\n\n return (\n <>\n {showSourceRadio && (\n <InlineFieldRow>\n <InlineField label=\"Source\" labelWidth={labelWidth} grow={true}>\n <RadioButtonGroup value={mode} options={resourceOptions} onChange={onModeChange} fullWidth />\n </InlineField>\n </InlineFieldRow>\n )}\n {mode !== ResourceDimensionMode.Fixed && (\n <InlineFieldRow>\n <InlineField label=\"Field\" labelWidth={labelWidth} grow={true}>\n <FieldNamePicker\n context={context}\n value={value.field ?? ''}\n onChange={onFieldChange}\n item={dummyFieldSettings}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n {mode === ResourceDimensionMode.Fixed && (\n <ResourcePicker\n onChange={onFixedChange}\n onClear={onClear}\n value={value?.fixed}\n src={srcPath}\n placeholder={item.settings?.placeholderText ?? 'Select a value'}\n name={niceName(value?.fixed) ?? ''}\n mediaType={mediaType}\n folderName={folderName}\n size={ResourcePickerSize.NORMAL}\n />\n )}\n {mode === ResourceDimensionMode.Mapping && (\n <InlineFieldRow>\n <InlineField label=\"Mappings\" labelWidth={labelWidth} grow={true}>\n <div>TODO mappings editor!</div>\n </InlineField>\n </InlineFieldRow>\n )}\n </>\n );\n};\n\nexport function niceName(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const idx = value.lastIndexOf('/');\n if (idx > 0) {\n return value.substring(idx + 1);\n }\n return value;\n}\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback, useMemo } from 'react';\n\nimport { GrafanaTheme2, SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';\nimport { NumberInput } from 'app/core/components/OptionsUI/NumberInput';\n\nimport {\n useFieldDisplayNames,\n useSelectOptions,\n} from '../../../../../packages/grafana-ui/src/components/MatchersUI/utils';\nimport { validateScaleOptions, validateScaleConfig } from '../scale';\nimport { ScaleDimensionConfig, ScaleDimensionOptions } from '../types';\n\nconst fixedValueOption: SelectableValue<string> = {\n label: 'Fixed value',\n value: '_____fixed_____',\n};\n\nexport const ScaleDimensionEditor: FC<StandardEditorProps<ScaleDimensionConfig, ScaleDimensionOptions, any>> = (\n props\n) => {\n const { value, context, onChange, item } = props;\n const { settings } = item;\n const styles = useStyles2(getStyles);\n\n const fieldName = value?.field;\n const isFixed = Boolean(!fieldName);\n const names = useFieldDisplayNames(context.data);\n const selectOptions = useSelectOptions(names, fieldName, fixedValueOption);\n const minMaxStep = useMemo(() => {\n return validateScaleOptions(settings);\n }, [settings]);\n\n // Validate and update\n const validateAndDoChange = useCallback(\n (v: ScaleDimensionConfig) => {\n // always called with a copy so no need to spread\n onChange(validateScaleConfig(v, minMaxStep));\n },\n [onChange, minMaxStep]\n );\n\n const onSelectChange = useCallback(\n (selection: SelectableValue<string>) => {\n const field = selection.value;\n if (field && field !== fixedValueOption.value) {\n validateAndDoChange({\n ...value,\n field,\n });\n } else {\n validateAndDoChange({\n ...value,\n field: undefined,\n });\n }\n },\n [validateAndDoChange, value]\n );\n\n const onMinChange = useCallback(\n (min?: number) => {\n if (min !== undefined) {\n validateAndDoChange({\n ...value,\n min,\n });\n }\n },\n [validateAndDoChange, value]\n );\n\n const onMaxChange = useCallback(\n (max?: number) => {\n if (max !== undefined) {\n validateAndDoChange({\n ...value,\n max,\n });\n }\n },\n [validateAndDoChange, value]\n );\n\n const onValueChange = useCallback(\n (fixed?: number) => {\n if (fixed !== undefined) {\n validateAndDoChange({\n ...value,\n fixed,\n });\n }\n },\n [validateAndDoChange, value]\n );\n\n const val = value ?? {};\n const selectedOption = isFixed ? fixedValueOption : selectOptions.find((v) => v.value === fieldName);\n return (\n <>\n <div>\n <Select\n value={selectedOption}\n options={selectOptions}\n onChange={onSelectChange}\n noOptionsMessage=\"No fields found\"\n />\n </div>\n <div className={styles.range}>\n {isFixed && (\n <InlineFieldRow>\n <InlineField label=\"Value\" labelWidth={8} grow={true}>\n <NumberInput value={val.fixed} {...minMaxStep} onChange={onValueChange} />\n </InlineField>\n </InlineFieldRow>\n )}\n {!isFixed && !minMaxStep.hideRange && (\n <>\n <InlineFieldRow>\n <InlineField label=\"Min\" labelWidth={8} grow={true}>\n <NumberInput value={val.min} {...minMaxStep} onChange={onMinChange} />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label=\"Max\" labelWidth={8} grow={true}>\n <NumberInput value={val.max} {...minMaxStep} onChange={onMaxChange} />\n </InlineField>\n </InlineFieldRow>\n </>\n )}\n </div>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n range: css`\n padding-top: 8px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback } from 'react';\n\nimport { FieldType, GrafanaTheme2, SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { InlineField, InlineFieldRow, RadioButtonGroup, Select, useStyles2 } from '@grafana/ui';\nimport { useFieldDisplayNames, useSelectOptions } from '@grafana/ui/src/components/MatchersUI/utils';\nimport { NumberInput } from 'app/core/components/OptionsUI/NumberInput';\n\nimport { ScalarDimensionConfig, ScalarDimensionMode, ScalarDimensionOptions } from '../types';\n\nconst fixedValueOption: SelectableValue<string> = {\n label: 'Fixed value',\n value: '_____fixed_____',\n};\n\nconst scalarOptions = [\n { label: 'Mod', value: ScalarDimensionMode.Mod, description: 'Use field values, mod from max' },\n { label: 'Clamped', value: ScalarDimensionMode.Clamped, description: 'Use field values, clamped to max and min' },\n];\n\nexport const ScalarDimensionEditor: FC<StandardEditorProps<ScalarDimensionConfig, ScalarDimensionOptions, any>> = (\n props\n) => {\n const { value, context, onChange, item } = props;\n const { settings } = item;\n\n const DEFAULT_VALUE = 0;\n\n const fieldName = value?.field;\n const isFixed = Boolean(!fieldName);\n const names = useFieldDisplayNames(context.data);\n const selectOptions = useSelectOptions(names, fieldName, fixedValueOption, FieldType.number);\n\n const styles = useStyles2(getStyles);\n\n const onSelectChange = useCallback(\n (selection: SelectableValue<string>) => {\n const field = selection.value;\n if (field && field !== fixedValueOption.value) {\n onChange({\n ...value,\n field,\n });\n } else {\n const fixed = value.fixed ?? DEFAULT_VALUE;\n onChange({\n ...value,\n field: undefined,\n fixed,\n });\n }\n },\n [onChange, value]\n );\n\n const onModeChange = useCallback(\n (mode) => {\n onChange({\n ...value,\n mode,\n });\n },\n [onChange, value]\n );\n\n const onValueChange = useCallback(\n (v: number | undefined) => {\n onChange({\n ...value,\n field: undefined,\n fixed: v ?? DEFAULT_VALUE,\n });\n },\n [onChange, value]\n );\n\n const val = value ?? {};\n const mode = value?.mode ?? ScalarDimensionMode.Mod;\n const selectedOption = isFixed ? fixedValueOption : selectOptions.find((v) => v.value === fieldName);\n return (\n <>\n <div>\n <InlineFieldRow>\n <InlineField label=\"Limit\" labelWidth={8} grow={true}>\n <RadioButtonGroup value={mode} options={scalarOptions} onChange={onModeChange} fullWidth />\n </InlineField>\n </InlineFieldRow>\n <Select\n value={selectedOption}\n options={selectOptions}\n onChange={onSelectChange}\n noOptionsMessage=\"No fields found\"\n />\n </div>\n <div className={styles.range}>\n {isFixed && (\n <InlineFieldRow>\n <InlineField label=\"Value\" labelWidth={8} grow={true}>\n <NumberInput\n value={val?.fixed ?? DEFAULT_VALUE}\n onChange={onValueChange}\n max={settings?.max}\n min={settings?.min}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </div>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n range: css`\n padding-top: 8px;\n `,\n});\n","import { DataFrame, Field, getDisplayProcessor, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data';\n\nimport { ColorDimensionConfig, DimensionSupplier } from './types';\nimport { findField, getLastNotNullFieldValue } from './utils';\n\n//---------------------------------------------------------\n// Color dimension\n//---------------------------------------------------------\n\nexport function getColorDimension(\n frame: DataFrame | undefined,\n config: ColorDimensionConfig,\n theme: GrafanaTheme2\n): DimensionSupplier<string> {\n return getColorDimensionForField(findField(frame, config.field), config, theme);\n}\n\nexport function getColorDimensionForField(\n field: Field | undefined,\n config: ColorDimensionConfig,\n theme: GrafanaTheme2\n): DimensionSupplier<string> {\n if (!field) {\n const v = theme.visualization.getColorByName(config.fixed ?? 'grey');\n return {\n isAssumed: Boolean(config.field?.length) || !config.fixed,\n fixed: v,\n value: () => v,\n get: (i) => v,\n };\n }\n\n // Use the expensive color calculation by value\n const mode = getFieldColorModeForField(field);\n if (mode.isByValue || field.config.mappings?.length) {\n const disp = getDisplayProcessor({ field, theme });\n const getColor = (value: any): string => {\n return disp(value).color ?? '#ccc';\n };\n\n return {\n field,\n get: (index: number): string => getColor(field.values.get(index)),\n value: () => getColor(getLastNotNullFieldValue(field)),\n };\n }\n\n // Typically series or fixed color (does not depend on value)\n const fixed = mode.getCalculator(field, theme)(0, 0);\n return {\n fixed,\n value: () => fixed,\n get: (i) => fixed,\n field,\n };\n}\n","import { DataFrame, Field, FieldType, formattedValueToString } from '@grafana/data';\n\nimport { DimensionSupplier, TextDimensionConfig, TextDimensionMode } from './types';\nimport { findField, getLastNotNullFieldValue } from './utils';\n\n//---------------------------------------------------------\n// Resource dimension\n//---------------------------------------------------------\n\nexport function getTextDimension(frame: DataFrame | undefined, config: TextDimensionConfig): DimensionSupplier<string> {\n const field = config.field ? findField(frame, config.field) : frame?.fields.find((f) => f.type === FieldType.string);\n return getTextDimensionForField(field, config);\n}\n\nexport function getTextDimensionForField(\n field: Field | undefined,\n config: TextDimensionConfig\n): DimensionSupplier<string> {\n let v = config.fixed;\n const mode = config.mode ?? TextDimensionMode.Fixed;\n if (mode === TextDimensionMode.Fixed) {\n return {\n isAssumed: !Boolean(v),\n fixed: v,\n value: () => v,\n get: (i) => v,\n };\n }\n\n if (mode === TextDimensionMode.Template) {\n const disp = (v: any) => {\n return `TEMPLATE[${config.fixed} // ${v}]`;\n };\n if (!field) {\n v = disp('');\n return {\n isAssumed: true,\n fixed: v,\n value: () => v,\n get: (i) => v,\n };\n }\n return {\n field,\n get: (i) => disp(field.values.get(i)),\n value: () => disp(getLastNotNullFieldValue(field)),\n };\n }\n\n if (!field) {\n return {\n isAssumed: true,\n fixed: v,\n value: () => v,\n get: (i) => v,\n };\n }\n\n let disp = (v: any) => formattedValueToString(field.display!(v));\n return {\n field,\n get: (i) => disp(field.values.get(i)),\n value: () => disp(getLastNotNullFieldValue(field)),\n };\n}\n","import { DataFrame } from '@grafana/data';\n\nimport { DimensionSupplier, ResourceDimensionConfig, ResourceDimensionMode } from './types';\nimport { findField, getLastNotNullFieldValue } from './utils';\n\n//---------------------------------------------------------\n// Resource dimension\n//---------------------------------------------------------\nexport function getPublicOrAbsoluteUrl(v: string): string {\n if (!v) {\n return '';\n }\n return v.indexOf(':/') > 0 ? v : (window as any).__grafana_public_path__ + v;\n}\n\nexport function getResourceDimension(\n frame: DataFrame | undefined,\n config: ResourceDimensionConfig\n): DimensionSupplier<string> {\n const mode = config.mode ?? ResourceDimensionMode.Fixed;\n if (mode === ResourceDimensionMode.Fixed) {\n const v = getPublicOrAbsoluteUrl(config.fixed!);\n return {\n isAssumed: !Boolean(v),\n fixed: v,\n value: () => v,\n get: (i) => v,\n };\n }\n\n const field = findField(frame, config.field);\n if (!field) {\n const v = '';\n return {\n isAssumed: true,\n fixed: v,\n value: () => v,\n get: (i) => v,\n };\n }\n\n if (mode === ResourceDimensionMode.Mapping) {\n const mapper = (v: any) => getPublicOrAbsoluteUrl(`${v}`);\n return {\n field,\n get: (i) => mapper(field.values.get(i)),\n value: () => mapper(getLastNotNullFieldValue(field)),\n };\n }\n\n const getIcon = (value: any): string => {\n const disp = field.display!;\n return getPublicOrAbsoluteUrl(disp(value).icon ?? '');\n };\n\n return {\n field,\n get: (index: number): string => getIcon(field.values.get(index)),\n value: () => getIcon(getLastNotNullFieldValue(field)),\n };\n}\n","import { DataFrame, Field } from '@grafana/data';\n\nimport { DimensionSupplier, ScalarDimensionConfig, ScalarDimensionMode } from './types';\nimport { findField, getLastNotNullFieldValue } from './utils';\n\n//---------------------------------------------------------\n// Scalar dimension\n//---------------------------------------------------------\nexport function getScalarDimension(\n frame: DataFrame | undefined,\n config: ScalarDimensionConfig\n): DimensionSupplier<number> {\n return getScalarDimensionForField(findField(frame, config?.field), config);\n}\nexport function getScalarDimensionForField(\n field: Field | undefined,\n cfg: ScalarDimensionConfig\n): DimensionSupplier<number> {\n if (!field) {\n const v = cfg.fixed ?? 0;\n return {\n isAssumed: Boolean(cfg.field?.length) || !cfg.fixed,\n fixed: v,\n value: () => v,\n get: () => v,\n };\n }\n\n //mod mode as default\n let validated = (value: number) => {\n return value % cfg.max;\n };\n\n //capped mode\n if (cfg.mode === ScalarDimensionMode.Clamped) {\n validated = (value: number) => {\n if (value < cfg.min) {\n return cfg.min;\n }\n if (value > cfg.max) {\n return cfg.max;\n }\n return value;\n };\n }\n\n const get = (i: number) => {\n const v = field.values.get(i);\n if (v === null || typeof v !== 'number') {\n return 0;\n }\n return validated(v);\n };\n\n return {\n field,\n get,\n value: () => getLastNotNullFieldValue(field),\n };\n}\n","import { DataFrame, Field } from '@grafana/data';\n\nimport { getMinMaxAndDelta } from '../../../../packages/grafana-data/src/field/scale';\n\nimport { ScaleDimensionConfig, DimensionSupplier, ScaleDimensionOptions } from './types';\nimport { findField, getLastNotNullFieldValue } from './utils';\n\nimport { ScaleDimensionMode } from '.';\n\n//---------------------------------------------------------\n// Scale dimension\n//---------------------------------------------------------\n\nexport function getScaledDimension(\n frame: DataFrame | undefined,\n config: ScaleDimensionConfig\n): DimensionSupplier<number> {\n return getScaledDimensionForField(findField(frame, config?.field), config);\n}\n\nexport function getScaledDimensionForField(\n field: Field | undefined,\n config: ScaleDimensionConfig,\n mode?: ScaleDimensionMode\n): DimensionSupplier<number> {\n if (!field) {\n const v = config.fixed ?? 0;\n return {\n isAssumed: Boolean(config.field?.length) || !config.fixed,\n fixed: v,\n value: () => v,\n get: () => v,\n };\n }\n const info = getMinMaxAndDelta(field);\n const delta = config.max - config.min;\n const values = field.values;\n if (values.length < 1 || delta <= 0 || info.delta <= 0) {\n return {\n fixed: config.min,\n value: () => config.min,\n get: () => config.min,\n };\n }\n\n let scaled = (percent: number) => config.min + percent * delta;\n if (mode === ScaleDimensionMode.Quadratic) {\n const maxArea = Math.PI * (config.max / 2) ** 2;\n const minArea = Math.PI * (config.min / 2) ** 2;\n const deltaArea = maxArea - minArea;\n\n // quadratic scaling (px area)\n scaled = (percent: number) => {\n let area = minArea + deltaArea * percent;\n return Math.sqrt(area / Math.PI) * 2;\n };\n }\n\n const get = (i: number) => {\n const value = field.values.get(i);\n let percent = 0;\n if (value !== -Infinity) {\n percent = (value - info.min!) / info.delta;\n }\n if (percent > 1) {\n percent = 1;\n } else if (percent < 0) {\n percent = 0;\n }\n return scaled(percent);\n };\n\n return {\n get,\n value: () => get(getLastNotNullFieldValue(field)),\n field,\n };\n}\n\n// This will mutate options\nexport function validateScaleOptions(options?: ScaleDimensionOptions): ScaleDimensionOptions {\n if (!options) {\n options = { min: 0, max: 1 };\n }\n if (options.min == null) {\n options.min = 0;\n }\n if (options.max == null) {\n options.max = 1;\n }\n\n return options;\n}\n\n/** Mutates and will return a valid version */\nexport function validateScaleConfig(copy: ScaleDimensionConfig, options: ScaleDimensionOptions): ScaleDimensionConfig {\n let { min, max } = validateScaleOptions(options);\n if (!copy) {\n copy = {} as any;\n }\n\n if (copy.max == null) {\n copy.max = max;\n }\n if (copy.min == null) {\n copy.min = min;\n }\n // Make sure the order is right\n if (copy.min > copy.max) {\n const tmp = copy.max;\n copy.max = copy.min;\n copy.min = tmp;\n }\n // Validate range\n if (copy.min < min) {\n copy.min = min;\n }\n if (copy.max > max) {\n copy.max = max;\n }\n\n if (copy.fixed == null) {\n copy.fixed = copy.min + (copy.max - copy.min) / 2.0;\n }\n\n // Make sure the field value is within the absolute range\n if (!copy.field) {\n if (copy.fixed > max) {\n copy.fixed = max;\n } else if (copy.fixed < min) {\n copy.fixed = min;\n }\n }\n return copy;\n}\n","import { Field } from '@grafana/data';\n\nexport interface BaseDimensionConfig<T = any> {\n fixed: T;\n field?: string;\n}\n\nexport interface DimensionSupplier<T = any> {\n /**\n * This means an explicit value was not configured\n */\n isAssumed?: boolean;\n\n /**\n * The field used for\n */\n field?: Field;\n\n /**\n * Explicit value -- if == null, then need a value for each index\n */\n fixed?: T;\n\n /**\n * A single value -- typically last\n */\n value: () => T;\n\n /**\n * Supplier for the dimension value\n */\n get: (index: number) => T;\n}\n\nexport enum ScaleDimensionMode {\n Linear = 'linear',\n Quadratic = 'quad',\n}\n\n/** This will map the field value% to a scaled value within the range */\nexport interface ScaleDimensionConfig extends BaseDimensionConfig<number> {\n min: number;\n max: number;\n}\n\n/** Places that use the value */\nexport interface ScaleDimensionOptions {\n min: number;\n max: number;\n step?: number;\n hideRange?: boolean; // false\n}\n\nexport enum ScalarDimensionMode {\n Mod = 'mod',\n Clamped = 'clamped',\n}\nexport interface ScalarDimensionConfig extends BaseDimensionConfig<number> {\n mode: ScalarDimensionMode;\n min: number;\n max: number;\n}\n\nexport interface ScalarDimensionOptions {\n min: number;\n max: number;\n}\n\nexport interface TextDimensionOptions {\n // anything?\n}\n\nexport enum TextDimensionMode {\n Fixed = 'fixed',\n Field = 'field',\n Template = 'template',\n}\n\nexport interface TextDimensionConfig extends BaseDimensionConfig<string> {\n mode: TextDimensionMode;\n}\n\nexport const defaultTextConfig: TextDimensionConfig = Object.freeze({\n fixed: '',\n mode: TextDimensionMode.Field,\n field: '',\n});\n\n/** Use the color value from field configs */\nexport interface ColorDimensionConfig extends BaseDimensionConfig<string> {}\n\n/** Places that use the value */\nexport interface ResourceDimensionOptions {\n resourceType: MediaType;\n folderName?: ResourceFolderName;\n placeholderText?: string;\n placeholderValue?: string;\n // If you want your icon to be driven by value of a field\n showSourceRadio?: boolean;\n}\n\nexport enum ResourceDimensionMode {\n Fixed = 'fixed',\n Field = 'field',\n Mapping = 'mapping',\n // pattern? uses field in the pattern\n}\n\n/** Get the path to a resource (URL) */\nexport interface ResourceDimensionConfig extends BaseDimensionConfig<string> {\n mode: ResourceDimensionMode;\n}\n\nexport enum ResourceFolderName {\n Icon = 'img/icons/unicons',\n IOT = 'img/icons/iot',\n Marker = 'img/icons/marker',\n BG = 'img/bg',\n}\n\nexport enum MediaType {\n Icon = 'icon',\n Image = 'image',\n}\n\nexport enum PickerTabType {\n Folder = 'folder',\n URL = 'url',\n Upload = 'upload',\n}\n\nexport enum ResourcePickerSize {\n SMALL = 'small',\n NORMAL = 'normal',\n}\n","import { DataFrame, PanelData, Field, getFieldDisplayName, ReducerID } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport {\n getColorDimension,\n getScaledDimension,\n getTextDimension,\n getResourceDimension,\n ColorDimensionConfig,\n DimensionSupplier,\n ResourceDimensionConfig,\n ScaleDimensionConfig,\n TextDimensionConfig,\n ScalarDimensionConfig,\n} from 'app/features/dimensions';\n\nimport { getScalarDimension } from './scalar';\n\nexport function getColorDimensionFromData(\n data: PanelData | undefined,\n cfg: ColorDimensionConfig\n): DimensionSupplier<string> {\n if (data?.series && cfg.field) {\n for (const frame of data.series) {\n const d = getColorDimension(frame, cfg, config.theme2);\n if (!d.isAssumed || data.series.length === 1) {\n return d;\n }\n }\n }\n return getColorDimension(undefined, cfg, config.theme2);\n}\n\nexport function getScaleDimensionFromData(\n data: PanelData | undefined,\n cfg: ScaleDimensionConfig\n): DimensionSupplier<number> {\n if (data?.series && cfg.field) {\n for (const frame of data.series) {\n const d = getScaledDimension(frame, cfg);\n if (!d.isAssumed || data.series.length === 1) {\n return d;\n }\n }\n }\n return getScaledDimension(undefined, cfg);\n}\n\nexport function getScalarDimensionFromData(\n data: PanelData | undefined,\n cfg: ScalarDimensionConfig\n): DimensionSupplier<number> {\n if (data?.series && cfg.field) {\n for (const frame of data.series) {\n const d = getScalarDimension(frame, cfg);\n if (!d.isAssumed || data.series.length === 1) {\n return d;\n }\n }\n }\n return getScalarDimension(undefined, cfg);\n}\n\nexport function getResourceDimensionFromData(\n data: PanelData | undefined,\n cfg: ResourceDimensionConfig\n): DimensionSupplier<string> {\n if (data?.series && cfg.field) {\n for (const frame of data.series) {\n const d = getResourceDimension(frame, cfg);\n if (!d.isAssumed || data.series.length === 1) {\n return d;\n }\n }\n }\n return getResourceDimension(undefined, cfg);\n}\n\nexport function getTextDimensionFromData(\n data: PanelData | undefined,\n cfg: TextDimensionConfig\n): DimensionSupplier<string> {\n if (data?.series && cfg.field) {\n for (const frame of data.series) {\n const d = getTextDimension(frame, cfg);\n if (!d.isAssumed || data.series.length === 1) {\n return d;\n }\n }\n }\n return getTextDimension(undefined, cfg);\n}\n\nexport function findField(frame?: DataFrame, name?: string): Field | undefined {\n if (!frame || !name?.length) {\n return undefined;\n }\n\n for (const field of frame.fields) {\n if (name === field.name) {\n return field;\n }\n const disp = getFieldDisplayName(field, frame);\n if (name === disp) {\n return field;\n }\n }\n return undefined;\n}\n\nexport function findFieldIndex(frame?: DataFrame, name?: string): number | undefined {\n if (!frame || !name?.length) {\n return undefined;\n }\n\n for (let i = 0; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n if (name === field.name) {\n return i;\n }\n const disp = getFieldDisplayName(field, frame);\n if (name === disp) {\n return i;\n }\n }\n return undefined;\n}\n\nexport function getLastNotNullFieldValue<T>(field: Field): T {\n const calcs = field.state?.calcs;\n if (calcs) {\n const v = calcs[ReducerID.lastNotNull];\n if (v != null) {\n return v as T;\n }\n }\n\n const data = field.values;\n let idx = data.length - 1;\n while (idx >= 0) {\n const v = data.get(idx--);\n if (v != null) {\n return v;\n }\n }\n return undefined as any;\n}\n","import { SpanLinks } from '@jaegertracing/jaeger-ui-components/src/types/links';\nimport React from 'react';\n\nimport {\n DataFrame,\n DataLink,\n DataQuery,\n DataSourceInstanceSettings,\n DataSourceJsonData,\n dateTime,\n Field,\n KeyValue,\n LinkModel,\n mapInternalLinkToExplore,\n rangeUtil,\n SplitOpen,\n TimeRange,\n} from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { Icon } from '@grafana/ui';\nimport { SpanLinkFunc, TraceSpan } from '@jaegertracing/jaeger-ui-components';\nimport { TraceToLogsOptions } from 'app/core/components/TraceToLogs/TraceToLogsSettings';\nimport { TraceToMetricQuery, TraceToMetricsOptions } from 'app/core/components/TraceToMetrics/TraceToMetricsSettings';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { PromQuery } from 'app/plugins/datasource/prometheus/types';\n\nimport { LokiQuery } from '../../../plugins/datasource/loki/types';\nimport { getFieldLinksForExplore } from '../utils/links';\n\n/**\n * This is a factory for the link creator. It returns the function mainly so it can return undefined in which case\n * the trace view won't create any links and to capture the datasource and split function making it easier to memoize\n * with useMemo.\n */\nexport function createSpanLinkFactory({\n splitOpenFn,\n traceToLogsOptions,\n traceToMetricsOptions,\n dataFrame,\n createFocusSpanLink,\n}: {\n splitOpenFn: SplitOpen;\n traceToLogsOptions?: TraceToLogsOptions;\n traceToMetricsOptions?: TraceToMetricsOptions;\n dataFrame?: DataFrame;\n createFocusSpanLink?: (traceId: string, spanId: string) => LinkModel<Field>;\n}): SpanLinkFunc | undefined {\n if (!dataFrame || dataFrame.fields.length === 1 || !dataFrame.fields.some((f) => Boolean(f.config.links?.length))) {\n // if the dataframe contains just a single blob of data (legacy format) or does not have any links configured,\n // let's try to use the old legacy path.\n return legacyCreateSpanLinkFactory(splitOpenFn, traceToLogsOptions, traceToMetricsOptions, createFocusSpanLink);\n } else {\n return function SpanLink(span: TraceSpan): SpanLinks | undefined {\n // We should be here only if there are some links in the dataframe\n const field = dataFrame.fields.find((f) => Boolean(f.config.links?.length))!;\n try {\n const links = getFieldLinksForExplore({\n field,\n rowIndex: span.dataFrameRowIndex!,\n splitOpenFn,\n range: getTimeRangeFromSpan(span),\n dataFrame,\n });\n\n return {\n logLinks: [\n {\n href: links[0].href,\n onClick: links[0].onClick,\n content: <Icon name=\"gf-logs\" title=\"Explore the logs for this in split view\" />,\n },\n ],\n };\n } catch (error) {\n // It's fairly easy to crash here for example if data source defines wrong interpolation in the data link\n console.error(error);\n return undefined;\n }\n };\n }\n}\n\nfunction legacyCreateSpanLinkFactory(\n splitOpenFn: SplitOpen,\n traceToLogsOptions?: TraceToLogsOptions,\n traceToMetricsOptions?: TraceToMetricsOptions,\n createFocusSpanLink?: (traceId: string, spanId: string) => LinkModel<Field>\n) {\n let logsDataSourceSettings: DataSourceInstanceSettings<DataSourceJsonData> | undefined;\n if (traceToLogsOptions?.datasourceUid) {\n logsDataSourceSettings = getDatasourceSrv().getInstanceSettings(traceToLogsOptions.datasourceUid);\n }\n const isSplunkDS = logsDataSourceSettings?.type === 'grafana-splunk-datasource';\n\n let metricsDataSourceSettings: DataSourceInstanceSettings<DataSourceJsonData> | undefined;\n if (traceToMetricsOptions?.datasourceUid) {\n metricsDataSourceSettings = getDatasourceSrv().getInstanceSettings(traceToMetricsOptions.datasourceUid);\n }\n\n return function SpanLink(span: TraceSpan): SpanLinks {\n const links: SpanLinks = { traceLinks: [] };\n // This is reusing existing code from derived fields which may not be ideal match so some data is a bit faked at\n // the moment. Issue is that the trace itself isn't clearly mapped to dataFrame (right now it's just a json blob\n // inside a single field) so the dataLinks as config of that dataFrame abstraction breaks down a bit and we do\n // it manually here instead of leaving it for the data source to supply the config.\n let dataLink: DataLink<LokiQuery | DataQuery> | undefined = {} as DataLink<LokiQuery | DataQuery> | undefined;\n\n // Get logs link\n if (logsDataSourceSettings && traceToLogsOptions) {\n switch (logsDataSourceSettings?.type) {\n case 'loki':\n dataLink = getLinkForLoki(span, traceToLogsOptions, logsDataSourceSettings);\n break;\n case 'grafana-splunk-datasource':\n dataLink = getLinkForSplunk(span, traceToLogsOptions, logsDataSourceSettings);\n break;\n }\n\n if (dataLink) {\n const link = mapInternalLinkToExplore({\n link: dataLink,\n internalLink: dataLink.internal!,\n scopedVars: {},\n range: getTimeRangeFromSpan(\n span,\n {\n startMs: traceToLogsOptions.spanStartTimeShift\n ? rangeUtil.intervalToMs(traceToLogsOptions.spanStartTimeShift)\n : 0,\n endMs: traceToLogsOptions.spanEndTimeShift\n ? rangeUtil.intervalToMs(traceToLogsOptions.spanEndTimeShift)\n : 0,\n },\n isSplunkDS\n ),\n field: {} as Field,\n onClickFn: splitOpenFn,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n });\n\n links.logLinks = [\n {\n href: link.href,\n onClick: link.onClick,\n content: <Icon name=\"gf-logs\" title=\"Explore the logs for this in split view\" />,\n },\n ];\n }\n }\n\n // Get metrics links\n if (metricsDataSourceSettings && traceToMetricsOptions?.queries) {\n links.metricLinks = [];\n for (const query of traceToMetricsOptions.queries) {\n const expr = buildMetricsQuery(query, traceToMetricsOptions?.tags, span);\n const dataLink: DataLink<PromQuery> = {\n title: metricsDataSourceSettings.name,\n url: '',\n internal: {\n datasourceUid: metricsDataSourceSettings.uid,\n datasourceName: metricsDataSourceSettings.name,\n query: {\n expr,\n refId: 'A',\n },\n },\n };\n\n const link = mapInternalLinkToExplore({\n link: dataLink,\n internalLink: dataLink.internal!,\n scopedVars: {},\n range: getTimeRangeFromSpan(span, {\n startMs: 0,\n endMs: 0,\n }),\n field: {} as Field,\n onClickFn: splitOpenFn,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n });\n\n links.metricLinks.push({\n title: query?.name,\n href: link.href,\n onClick: link.onClick,\n content: <Icon name=\"chart-line\" title=\"Explore metrics for this span\" />,\n });\n }\n }\n\n // Get trace links\n if (span.references && createFocusSpanLink) {\n for (const reference of span.references) {\n // Ignore parent-child links\n if (reference.refType === 'CHILD_OF') {\n continue;\n }\n\n const link = createFocusSpanLink(reference.traceID, reference.spanID);\n\n links.traceLinks!.push({\n href: link.href,\n title: reference.span ? reference.span.operationName : 'View linked span',\n content: <Icon name=\"link\" title=\"View linked span\" />,\n onClick: link.onClick,\n });\n }\n }\n\n if (span.subsidiarilyReferencedBy && createFocusSpanLink) {\n for (const reference of span.subsidiarilyReferencedBy) {\n const link = createFocusSpanLink(reference.traceID, reference.spanID);\n\n links.traceLinks!.push({\n href: link.href,\n title: reference.span ? reference.span.operationName : 'View linked span',\n content: <Icon name=\"link\" title=\"View linked span\" />,\n onClick: link.onClick,\n });\n }\n }\n\n return links;\n };\n}\n\n/**\n * Default keys to use when there are no configured tags.\n */\nconst defaultKeys = ['cluster', 'hostname', 'namespace', 'pod'];\nfunction getLinkForLoki(span: TraceSpan, options: TraceToLogsOptions, dataSourceSettings: DataSourceInstanceSettings) {\n const { tags: keys, filterByTraceID, filterBySpanID, mapTagNamesEnabled, mappedTags } = options;\n\n // In order, try to use mapped tags -> tags -> default tags\n const keysToCheck = mapTagNamesEnabled && mappedTags?.length ? mappedTags : keys?.length ? keys : defaultKeys;\n // Build tag portion of query\n const tags = [...span.process.tags, ...span.tags].reduce((acc, tag) => {\n if (mapTagNamesEnabled) {\n const keyValue = (keysToCheck as KeyValue[]).find((keyValue: KeyValue) => keyValue.key === tag.key);\n if (keyValue) {\n acc.push(`${keyValue.value ? keyValue.value : keyValue.key}=\"${tag.value}\"`);\n }\n } else {\n if ((keysToCheck as string[]).includes(tag.key)) {\n acc.push(`${tag.key}=\"${tag.value}\"`);\n }\n }\n return acc;\n }, [] as string[]);\n\n // If no tags found, return undefined to prevent an invalid Loki query\n if (!tags.length) {\n return undefined;\n }\n let expr = `{${tags.join(', ')}}`;\n if (filterByTraceID && span.traceID) {\n expr += ` |=\"${span.traceID}\"`;\n }\n if (filterBySpanID && span.spanID) {\n expr += ` |=\"${span.spanID}\"`;\n }\n\n const dataLink: DataLink<LokiQuery> = {\n title: dataSourceSettings.name,\n url: '',\n internal: {\n datasourceUid: dataSourceSettings.uid,\n datasourceName: dataSourceSettings.name,\n query: {\n expr: expr,\n refId: '',\n },\n },\n };\n\n return dataLink;\n}\n\nfunction getLinkForSplunk(\n span: TraceSpan,\n options: TraceToLogsOptions,\n dataSourceSettings: DataSourceInstanceSettings\n) {\n const { tags: keys, filterByTraceID, filterBySpanID, mapTagNamesEnabled, mappedTags } = options;\n\n // In order, try to use mapped tags -> tags -> default tags\n const keysToCheck = mapTagNamesEnabled && mappedTags?.length ? mappedTags : keys?.length ? keys : defaultKeys;\n // Build tag portion of query\n const tags = [...span.process.tags, ...span.tags].reduce((acc, tag) => {\n if (mapTagNamesEnabled) {\n const keyValue = (keysToCheck as KeyValue[]).find((keyValue: KeyValue) => keyValue.key === tag.key);\n if (keyValue) {\n acc.push(`${keyValue.value ? keyValue.value : keyValue.key}=\"${tag.value}\"`);\n }\n } else {\n if ((keysToCheck as string[]).includes(tag.key)) {\n acc.push(`${tag.key}=\"${tag.value}\"`);\n }\n }\n return acc;\n }, [] as string[]);\n\n let query = '';\n if (tags.length > 0) {\n query += `${tags.join(' ')}`;\n }\n if (filterByTraceID && span.traceID) {\n query += ` \"${span.traceID}\"`;\n }\n if (filterBySpanID && span.spanID) {\n query += ` \"${span.spanID}\"`;\n }\n\n const dataLink: DataLink<DataQuery> = {\n title: dataSourceSettings.name,\n url: '',\n internal: {\n datasourceUid: dataSourceSettings.uid,\n datasourceName: dataSourceSettings.name,\n query: {\n query: query,\n refId: '',\n },\n },\n } as DataLink<DataQuery>;\n\n return dataLink;\n}\n\n/**\n * Gets a time range from the span.\n */\nfunction getTimeRangeFromSpan(\n span: TraceSpan,\n timeShift: { startMs: number; endMs: number } = { startMs: 0, endMs: 0 },\n isSplunkDS = false\n): TimeRange {\n const adjustedStartTime = Math.floor(span.startTime / 1000 + timeShift.startMs);\n const from = dateTime(adjustedStartTime);\n const spanEndMs = (span.startTime + span.duration) / 1000;\n let adjustedEndTime = Math.floor(spanEndMs + timeShift.endMs);\n\n // Splunk requires a time interval of >= 1s, rather than >=1ms like Loki timerange in below elseif block\n if (isSplunkDS && adjustedEndTime - adjustedStartTime < 1000) {\n adjustedEndTime = adjustedStartTime + 1000;\n } else if (adjustedStartTime === adjustedEndTime) {\n // Because we can only pass milliseconds in the url we need to check if they equal.\n // We need end time to be later than start time\n adjustedEndTime++;\n }\n\n const to = dateTime(adjustedEndTime);\n\n // Beware that public/app/features/explore/state/main.ts SplitOpen fn uses the range from here. No matter what is in the url.\n return {\n from,\n to,\n raw: {\n from,\n to,\n },\n };\n}\n\n// Interpolates span attributes into trace to metric query, or returns default query\nfunction buildMetricsQuery(query: TraceToMetricQuery, tags: Array<KeyValue<string>> = [], span: TraceSpan): string {\n if (!query.query) {\n return `histogram_quantile(0.5, sum(rate(tempo_spanmetrics_latency_bucket{operation=\"${span.operationName}\"}[5m])) by (le))`;\n }\n\n let expr = query.query;\n if (tags.length && expr.indexOf('$__tags') !== -1) {\n const spanTags = [...span.process.tags, ...span.tags];\n const labels = tags.reduce((acc, tag) => {\n const tagValue = spanTags.find((t) => t.key === tag.key)?.value;\n if (tagValue) {\n acc.push(`${tag.value ? tag.value : tag.key}=\"${tagValue}\"`);\n }\n return acc;\n }, [] as string[]);\n\n const labelsQuery = labels?.join(', ');\n expr = expr.replace('$__tags', labelsQuery);\n }\n\n return expr;\n}\n","import { useCallback, useState } from 'react';\n\nimport { TraceSpan } from '@jaegertracing/jaeger-ui-components';\n\n/**\n * Children state means whether spans are collapsed or not. Also provides some functions to manipulate that state.\n */\nexport function useChildrenState() {\n const [childrenHiddenIDs, setChildrenHiddenIDs] = useState(new Set<string>());\n\n const expandOne = useCallback(\n function expandOne(spans: TraceSpan[]) {\n if (childrenHiddenIDs.size === 0) {\n return;\n }\n let prevExpandedDepth = -1;\n let expandNextHiddenSpan = true;\n const newChildrenHiddenIDs = spans.reduce((res, s) => {\n if (s.depth <= prevExpandedDepth) {\n expandNextHiddenSpan = true;\n }\n if (expandNextHiddenSpan && res.has(s.spanID)) {\n res.delete(s.spanID);\n expandNextHiddenSpan = false;\n prevExpandedDepth = s.depth;\n }\n return res;\n }, new Set(childrenHiddenIDs));\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n const collapseOne = useCallback(\n function collapseOne(spans: TraceSpan[]) {\n if (shouldDisableCollapse(spans, childrenHiddenIDs)) {\n return;\n }\n let nearestCollapsedAncestor: TraceSpan | undefined;\n const newChildrenHiddenIDs = spans.reduce((res, curSpan) => {\n if (nearestCollapsedAncestor && curSpan.depth <= nearestCollapsedAncestor.depth) {\n res.add(nearestCollapsedAncestor.spanID);\n if (curSpan.hasChildren) {\n nearestCollapsedAncestor = curSpan;\n }\n } else if (curSpan.hasChildren && !res.has(curSpan.spanID)) {\n nearestCollapsedAncestor = curSpan;\n }\n return res;\n }, new Set(childrenHiddenIDs));\n // The last one\n if (nearestCollapsedAncestor) {\n newChildrenHiddenIDs.add(nearestCollapsedAncestor.spanID);\n }\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n const expandAll = useCallback(function expandAll() {\n setChildrenHiddenIDs(new Set<string>());\n }, []);\n\n const collapseAll = useCallback(\n function collapseAll(spans: TraceSpan[]) {\n if (shouldDisableCollapse(spans, childrenHiddenIDs)) {\n return;\n }\n const newChildrenHiddenIDs = spans.reduce((res, s) => {\n if (s.hasChildren) {\n res.add(s.spanID);\n }\n return res;\n }, new Set<string>());\n\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n const childrenToggle = useCallback(\n function childrenToggle(spanID: string) {\n const newChildrenHiddenIDs = new Set(childrenHiddenIDs);\n if (childrenHiddenIDs.has(spanID)) {\n newChildrenHiddenIDs.delete(spanID);\n } else {\n newChildrenHiddenIDs.add(spanID);\n }\n setChildrenHiddenIDs(newChildrenHiddenIDs);\n },\n [childrenHiddenIDs]\n );\n\n return {\n childrenHiddenIDs,\n expandOne,\n collapseOne,\n expandAll,\n collapseAll,\n childrenToggle,\n };\n}\n\nfunction shouldDisableCollapse(allSpans: TraceSpan[], hiddenSpansIds: Set<string>) {\n const allParentSpans = allSpans.filter((s) => s.hasChildren);\n return allParentSpans.length === hiddenSpansIds.size;\n}\n","import { TraceLog, TraceSpanReference } from '@jaegertracing/jaeger-ui-components/src/types/trace';\nimport { useCallback, useState, useEffect } from 'react';\n\nimport { DataFrame } from '@grafana/data';\nimport { DetailState } from '@jaegertracing/jaeger-ui-components';\n\n/**\n * Keeps state of the span detail. This means whether span details are open but also state of each detail subitem\n * like logs or tags.\n */\nexport function useDetailState(frame: DataFrame) {\n const [detailStates, setDetailStates] = useState(new Map<string, DetailState>());\n\n // Clear detail state when new trace arrives\n useEffect(() => {\n setDetailStates(new Map<string, DetailState>());\n }, [frame, setDetailStates]);\n\n const toggleDetail = useCallback(\n function toggleDetail(spanID: string) {\n const newDetailStates = new Map(detailStates);\n if (newDetailStates.has(spanID)) {\n newDetailStates.delete(spanID);\n } else {\n newDetailStates.set(spanID, new DetailState());\n }\n setDetailStates(newDetailStates);\n },\n [detailStates]\n );\n\n const detailLogItemToggle = useCallback(\n function detailLogItemToggle(spanID: string, log: TraceLog) {\n const old = detailStates.get(spanID);\n if (!old) {\n return;\n }\n const detailState = old.toggleLogItem(log);\n const newDetailStates = new Map(detailStates);\n newDetailStates.set(spanID, detailState);\n return setDetailStates(newDetailStates);\n },\n [detailStates]\n );\n\n const detailReferenceItemToggle = useCallback(\n function detailReferenceItemToggle(spanID: string, reference: TraceSpanReference) {\n const old = detailStates.get(spanID);\n if (!old) {\n return;\n }\n const detailState = old.toggleReferenceItem(reference);\n const newDetailStates = new Map(detailStates);\n newDetailStates.set(spanID, detailState);\n return setDetailStates(newDetailStates);\n },\n [detailStates]\n );\n\n return {\n detailStates,\n toggleDetail,\n detailLogItemToggle,\n detailLogsToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('logs', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailWarningsToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('warnings', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailStackTracesToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('stackTraces', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailReferenceItemToggle,\n detailReferencesToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('references', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailProcessToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('process', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n detailTagsToggle: useCallback(\n (spanID: string) => makeDetailSubsectionToggle('tags', detailStates, setDetailStates)(spanID),\n [detailStates]\n ),\n };\n}\n\nfunction makeDetailSubsectionToggle(\n subSection: 'tags' | 'process' | 'logs' | 'warnings' | 'references' | 'stackTraces',\n detailStates: Map<string, DetailState>,\n setDetailStates: (detailStates: Map<string, DetailState>) => void\n) {\n return (spanID: string) => {\n const old = detailStates.get(spanID);\n if (!old) {\n return;\n }\n let detailState;\n if (subSection === 'tags') {\n detailState = old.toggleTags();\n } else if (subSection === 'process') {\n detailState = old.toggleProcess();\n } else if (subSection === 'warnings') {\n detailState = old.toggleWarnings();\n } else if (subSection === 'references') {\n detailState = old.toggleReferences();\n } else if (subSection === 'stackTraces') {\n detailState = old.toggleStackTraces();\n } else {\n detailState = old.toggleLogs();\n }\n const newDetailStates = new Map(detailStates);\n newDetailStates.set(spanID, detailState);\n setDetailStates(newDetailStates);\n };\n}\n","import { css } from '@emotion/css';\nimport { TopOfViewRefType } from '@jaegertracing/jaeger-ui-components/src/TraceTimelineViewer/VirtualizedTraceView';\nimport React, { RefObject, useCallback, useMemo, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport {\n DataFrame,\n DataLink,\n DataQuery,\n DataSourceApi,\n DataSourceJsonData,\n Field,\n GrafanaTheme2,\n LinkModel,\n mapInternalLinkToExplore,\n PanelData,\n SplitOpen,\n} from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\nimport {\n SpanBarOptionsData,\n Trace,\n TracePageHeader,\n TraceTimelineViewer,\n TTraceTimeline,\n} from '@jaegertracing/jaeger-ui-components';\nimport { TraceToLogsData } from 'app/core/components/TraceToLogs/TraceToLogsSettings';\nimport { TraceToMetricsData } from 'app/core/components/TraceToMetrics/TraceToMetricsSettings';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { getTimeZone } from 'app/features/profile/state/selectors';\nimport { TempoQuery } from 'app/plugins/datasource/tempo/datasource';\nimport { StoreState } from 'app/types';\nimport { ExploreId } from 'app/types/explore';\n\nimport { changePanelState } from '../state/explorePane';\n\nimport { createSpanLinkFactory } from './createSpanLink';\nimport { useChildrenState } from './useChildrenState';\nimport { useDetailState } from './useDetailState';\nimport { useHoverIndentGuide } from './useHoverIndentGuide';\nimport { useViewRange } from './useViewRange';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n noDataMsg: css`\n height: 100%;\n width: 100%;\n display: grid;\n place-items: center;\n font-size: ${theme.typography.h4.fontSize};\n color: ${theme.colors.text.secondary};\n `,\n});\n\nfunction noop(): {} {\n return {};\n}\n\ntype Props = {\n dataFrames: DataFrame[];\n splitOpenFn?: SplitOpen;\n exploreId?: ExploreId;\n scrollElement?: Element;\n traceProp: Trace;\n spanFindMatches?: Set<string>;\n search: string;\n focusedSpanIdForSearch: string;\n queryResponse: PanelData;\n datasource: DataSourceApi<DataQuery, DataSourceJsonData, {}> | undefined;\n topOfViewRef: RefObject<HTMLDivElement>;\n topOfViewRefType: TopOfViewRefType;\n};\n\nexport function TraceView(props: Props) {\n const { spanFindMatches, traceProp, datasource, topOfViewRef, topOfViewRefType } = props;\n\n const {\n detailStates,\n toggleDetail,\n detailLogItemToggle,\n detailLogsToggle,\n detailProcessToggle,\n detailReferencesToggle,\n detailReferenceItemToggle,\n detailTagsToggle,\n detailWarningsToggle,\n detailStackTracesToggle,\n } = useDetailState(props.dataFrames[0]);\n\n const { removeHoverIndentGuideId, addHoverIndentGuideId, hoverIndentGuideIds } = useHoverIndentGuide();\n const { viewRange, updateViewRangeTime, updateNextViewRangeTime } = useViewRange();\n const { expandOne, collapseOne, childrenToggle, collapseAll, childrenHiddenIDs, expandAll } = useChildrenState();\n\n const styles = useStyles2(getStyles);\n\n /**\n * Keeps state of resizable name column width\n */\n const [spanNameColumnWidth, setSpanNameColumnWidth] = useState(0.25);\n /**\n * State of the top minimap, slim means it is collapsed.\n */\n const [slim, setSlim] = useState(false);\n\n const [focusedSpanId, createFocusSpanLink] = useFocusSpanLink({\n refId: props.dataFrames[0]?.refId,\n exploreId: props.exploreId!,\n datasource,\n splitOpenFn: props.splitOpenFn!,\n });\n\n const traceTimeline: TTraceTimeline = useMemo(\n () => ({\n childrenHiddenIDs,\n detailStates,\n hoverIndentGuideIds,\n shouldScrollToFirstUiFindMatch: false,\n spanNameColumnWidth,\n traceID: props.traceProp?.traceID,\n }),\n [childrenHiddenIDs, detailStates, hoverIndentGuideIds, spanNameColumnWidth, props.traceProp?.traceID]\n );\n\n const instanceSettings = getDatasourceSrv().getInstanceSettings(datasource?.name);\n const traceToLogsOptions = (instanceSettings?.jsonData as TraceToLogsData)?.tracesToLogs;\n const traceToMetricsOptions = (instanceSettings?.jsonData as TraceToMetricsData)?.tracesToMetrics;\n const spanBarOptions: SpanBarOptionsData | undefined = instanceSettings?.jsonData;\n\n const createSpanLink = useMemo(\n () =>\n createSpanLinkFactory({\n splitOpenFn: props.splitOpenFn!,\n traceToLogsOptions,\n traceToMetricsOptions,\n dataFrame: props.dataFrames[0],\n createFocusSpanLink,\n }),\n [props.splitOpenFn, traceToLogsOptions, traceToMetricsOptions, props.dataFrames, createFocusSpanLink]\n );\n const onSlimViewClicked = useCallback(() => setSlim(!slim), [slim]);\n const timeZone = useSelector((state: StoreState) => getTimeZone(state.user));\n const datasourceType = datasource ? datasource?.type : 'unknown';\n\n return (\n <>\n {props.dataFrames?.length && props.dataFrames[0]?.meta?.preferredVisualisationType === 'trace' && traceProp ? (\n <>\n <TracePageHeader\n canCollapse={false}\n hideMap={false}\n hideSummary={false}\n onSlimViewClicked={onSlimViewClicked}\n onTraceGraphViewClicked={noop}\n slimView={slim}\n trace={traceProp}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n viewRange={viewRange}\n timeZone={timeZone}\n />\n <TraceTimelineViewer\n registerAccessors={noop}\n scrollToFirstVisibleSpan={noop}\n findMatchesIDs={spanFindMatches}\n trace={traceProp}\n datasourceType={datasourceType}\n spanBarOptions={spanBarOptions?.spanBar}\n traceTimeline={traceTimeline}\n updateNextViewRangeTime={updateNextViewRangeTime}\n updateViewRangeTime={updateViewRangeTime}\n viewRange={viewRange}\n timeZone={timeZone}\n setSpanNameColumnWidth={setSpanNameColumnWidth}\n collapseAll={collapseAll}\n collapseOne={collapseOne}\n expandAll={expandAll}\n expandOne={expandOne}\n childrenToggle={childrenToggle}\n clearShouldScrollToFirstUiFindMatch={noop}\n detailLogItemToggle={detailLogItemToggle}\n detailLogsToggle={detailLogsToggle}\n detailWarningsToggle={detailWarningsToggle}\n detailStackTracesToggle={detailStackTracesToggle}\n detailReferencesToggle={detailReferencesToggle}\n detailReferenceItemToggle={detailReferenceItemToggle}\n detailProcessToggle={detailProcessToggle}\n detailTagsToggle={detailTagsToggle}\n detailToggle={toggleDetail}\n setTrace={noop}\n addHoverIndentGuideId={addHoverIndentGuideId}\n removeHoverIndentGuideId={removeHoverIndentGuideId}\n linksGetter={noop as any}\n uiFind={props.search}\n createSpanLink={createSpanLink}\n scrollElement={props.scrollElement}\n focusedSpanId={focusedSpanId}\n focusedSpanIdForSearch={props.focusedSpanIdForSearch!}\n createFocusSpanLink={createFocusSpanLink}\n topOfViewRef={topOfViewRef}\n topOfViewRefType={topOfViewRefType}\n />\n </>\n ) : (\n <div className={styles.noDataMsg}>No data</div>\n )}\n </>\n );\n}\n\n/**\n * Handles focusing a span. Returns the span id to focus to based on what is in current explore state and also a\n * function to change the focused span id.\n * @param options\n */\nfunction useFocusSpanLink(options: {\n exploreId: ExploreId;\n splitOpenFn: SplitOpen;\n refId?: string;\n datasource?: DataSourceApi;\n}): [string | undefined, (traceId: string, spanId: string) => LinkModel<Field>] {\n const panelState = useSelector((state: StoreState) => state.explore[options.exploreId]?.panelsState.trace);\n const focusedSpanId = panelState?.spanId;\n\n const dispatch = useDispatch();\n const setFocusedSpanId = (spanId?: string) =>\n dispatch(\n changePanelState(options.exploreId, 'trace', {\n ...panelState,\n spanId,\n })\n );\n\n const query = useSelector((state: StoreState) =>\n state.explore[options.exploreId]?.queries.find((query) => query.refId === options.refId)\n );\n\n const createFocusSpanLink = (traceId: string, spanId: string) => {\n const link: DataLink = {\n title: 'Deep link to this span',\n url: '',\n internal: {\n datasourceUid: options.datasource?.uid!,\n datasourceName: options.datasource?.name!,\n query: {\n ...query,\n query: traceId,\n },\n panelsState: {\n trace: {\n spanId,\n },\n },\n },\n };\n\n // Check if the link is to a different trace or not.\n // If it's the same trace, only update panel state with setFocusedSpanId (no navigation).\n // If it's a different trace, use splitOpenFn to open a new explore panel\n const sameTrace = query?.queryType === 'traceId' && (query as TempoQuery).query === traceId;\n\n return mapInternalLinkToExplore({\n link,\n internalLink: link.internal!,\n scopedVars: {},\n range: {} as any,\n field: {} as Field,\n onClickFn: sameTrace\n ? () => setFocusedSpanId(focusedSpanId === spanId ? undefined : spanId)\n : options.splitOpenFn\n ? () =>\n options.splitOpenFn({\n datasourceUid: options.datasource?.uid!,\n query: {\n ...query!,\n query: traceId,\n },\n panelsState: {\n trace: {\n spanId,\n },\n },\n })\n : undefined,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n });\n };\n\n return [focusedSpanId, createFocusSpanLink];\n}\n","import { useCallback, useState } from 'react';\n\n/**\n * This is used internally to handle hover state of indent guide. As indent guides are separate\n * components per each row/span and you need to highlight all in multiple rows to make the effect of single line\n * they need this kind of common imperative state changes.\n *\n * Ideally would be changed to trace view internal state.\n */\nexport function useHoverIndentGuide() {\n const [hoverIndentGuideIds, setHoverIndentGuideIds] = useState(new Set<string>());\n\n const addHoverIndentGuideId = useCallback(function addHoverIndentGuideId(spanID: string) {\n setHoverIndentGuideIds((prevState) => {\n const newHoverIndentGuideIds = new Set(prevState);\n newHoverIndentGuideIds.add(spanID);\n return newHoverIndentGuideIds;\n });\n }, []);\n\n const removeHoverIndentGuideId = useCallback(function removeHoverIndentGuideId(spanID: string) {\n setHoverIndentGuideIds((prevState) => {\n const newHoverIndentGuideIds = new Set(prevState);\n newHoverIndentGuideIds.delete(spanID);\n return newHoverIndentGuideIds;\n });\n }, []);\n\n return { hoverIndentGuideIds, addHoverIndentGuideId, removeHoverIndentGuideId };\n}\n","import { useCallback, useState } from 'react';\n\nimport { ViewRangeTimeUpdate, ViewRange } from '@jaegertracing/jaeger-ui-components';\n\n/**\n * Controls state of the zoom function that can be used through minimap in header or on the timeline. ViewRange contains\n * state not only for current range that is showing but range that is currently being selected by the user.\n */\nexport function useViewRange() {\n const [viewRange, setViewRange] = useState<ViewRange>({\n time: {\n current: [0, 1],\n },\n });\n\n const updateNextViewRangeTime = useCallback(function updateNextViewRangeTime(update: ViewRangeTimeUpdate) {\n setViewRange((prevRange): ViewRange => {\n const time = { ...prevRange.time, ...update };\n return { ...prevRange, time };\n });\n }, []);\n\n const updateViewRangeTime = useCallback(function updateViewRangeTime(start: number, end: number) {\n const current: [number, number] = [start, end];\n const time = { current };\n setViewRange((prevRange): ViewRange => {\n return { ...prevRange, time };\n });\n }, []);\n\n return { viewRange, updateViewRangeTime, updateNextViewRangeTime };\n}\n","import { useMemo, useState } from 'react';\n\nimport { filterSpans, TraceSpan } from '@jaegertracing/jaeger-ui-components';\n\n/**\n * Controls the state of search input that highlights spans if they match the search string.\n * @param spans\n */\nexport function useSearch(spans?: TraceSpan[]) {\n const [search, setSearch] = useState('');\n const spanFindMatches: Set<string> | undefined = useMemo(() => {\n return search && spans ? filterSpans(search, spans) : undefined;\n }, [search, spans]);\n\n return { search, setSearch, spanFindMatches };\n}\n","import { DataFrame, DataFrameView, TraceSpanRow } from '@grafana/data';\nimport { Trace, TraceProcess, TraceResponse, transformTraceData } from '@jaegertracing/jaeger-ui-components';\n\nexport function transformDataFrames(frame?: DataFrame): Trace | null {\n if (!frame) {\n return null;\n }\n let data: TraceResponse =\n frame.fields.length === 1\n ? // For backward compatibility when we sent whole json response in a single field/value\n frame.fields[0].values.get(0)\n : transformTraceDataFrame(frame);\n return transformTraceData(data);\n}\n\nfunction transformTraceDataFrame(frame: DataFrame): TraceResponse {\n const view = new DataFrameView<TraceSpanRow>(frame);\n const processes: Record<string, TraceProcess> = {};\n for (let i = 0; i < view.length; i++) {\n const span = view.get(i);\n if (!processes[span.spanID]) {\n processes[span.spanID] = {\n serviceName: span.serviceName,\n tags: span.serviceTags,\n };\n }\n }\n\n return {\n traceID: view.get(0).traceID,\n processes,\n spans: view.toArray().map((s, index) => {\n const references = [];\n if (s.parentSpanID) {\n references.push({ refType: 'CHILD_OF' as const, spanID: s.parentSpanID, traceID: s.traceID });\n }\n if (s.references) {\n references.push(...s.references.map((reference) => ({ refType: 'FOLLOWS_FROM' as const, ...reference })));\n }\n return {\n ...s,\n duration: s.duration * 1000,\n startTime: s.startTime * 1000,\n processID: s.spanID,\n flags: 0,\n references,\n logs: s.logs?.map((l) => ({ ...l, timestamp: l.timestamp * 1000 })) || [],\n dataFrameRowIndex: index,\n };\n }),\n };\n}\n","// Libraries\nimport { AnyAction, createAction } from '@reduxjs/toolkit';\n\nimport { DataSourceApi, HistoryItem } from '@grafana/data';\nimport { RefreshPicker } from '@grafana/ui';\nimport { stopQueryState } from 'app/core/utils/explore';\nimport { ExploreItemState, ThunkResult } from 'app/types';\nimport { ExploreId } from 'app/types/explore';\n\nimport { importQueries, runQueries } from './query';\nimport { changeRefreshInterval } from './time';\nimport { createEmptyQueryResponse, loadAndInitDatasource } from './utils';\n\n//\n// Actions and Payloads\n//\n\n/**\n * Updates datasource instance before datasource loading has started\n */\nexport interface UpdateDatasourceInstancePayload {\n exploreId: ExploreId;\n datasourceInstance: DataSourceApi;\n history: HistoryItem[];\n}\nexport const updateDatasourceInstanceAction = createAction<UpdateDatasourceInstancePayload>(\n 'explore/updateDatasourceInstance'\n);\n\n//\n// Action creators\n//\n\n/**\n * Loads a new datasource identified by the given name.\n */\nexport function changeDatasource(\n exploreId: ExploreId,\n datasourceUid: string,\n options?: { importQueries: boolean }\n): ThunkResult<void> {\n return async (dispatch, getState) => {\n const orgId = getState().user.orgId;\n const { history, instance } = await loadAndInitDatasource(orgId, { uid: datasourceUid });\n const currentDataSourceInstance = getState().explore[exploreId]!.datasourceInstance;\n\n dispatch(\n updateDatasourceInstanceAction({\n exploreId,\n datasourceInstance: instance,\n history,\n })\n );\n\n if (options?.importQueries) {\n const queries = getState().explore[exploreId]!.queries;\n await dispatch(importQueries(exploreId, queries, currentDataSourceInstance, instance));\n }\n\n if (getState().explore[exploreId]!.isLive) {\n dispatch(changeRefreshInterval(exploreId, RefreshPicker.offOption.value));\n }\n\n // Exception - we only want to run queries on data source change, if the queries were imported\n if (options?.importQueries) {\n dispatch(runQueries(exploreId));\n }\n };\n}\n\n//\n// Reducer\n//\n\n/**\n * Reducer for an Explore area, to be used by the global Explore reducer.\n */\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because flot (Graph lib) would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const datasourceReducer = (state: ExploreItemState, action: AnyAction): ExploreItemState => {\n if (updateDatasourceInstanceAction.match(action)) {\n const { datasourceInstance, history } = action.payload;\n\n // Custom components\n stopQueryState(state.querySubscription);\n\n return {\n ...state,\n datasourceInstance,\n graphResult: null,\n tableResult: null,\n logsResult: null,\n logsVolumeDataProvider: undefined,\n logsVolumeData: undefined,\n queryResponse: createEmptyQueryResponse(),\n loading: false,\n queryKeys: [],\n history,\n datasourceMissing: false,\n };\n }\n\n return state;\n};\n","import { createAction, PayloadAction } from '@reduxjs/toolkit';\nimport { isEqual } from 'lodash';\nimport { AnyAction } from 'redux';\n\nimport {\n EventBusExtended,\n DataQuery,\n ExploreUrlState,\n TimeRange,\n HistoryItem,\n DataSourceApi,\n ExplorePanelsState,\n PreferredVisualisationType,\n DataSourceRef,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { keybindingSrv } from 'app/core/services/keybindingSrv';\nimport {\n DEFAULT_RANGE,\n getQueryKeys,\n parseUrlState,\n ensureQueries,\n generateNewKeyAndAddRefIdIfMissing,\n getTimeRangeFromUrl,\n} from 'app/core/utils/explore';\nimport { getFiscalYearStartMonth, getTimeZone } from 'app/features/profile/state/selectors';\nimport { ThunkResult } from 'app/types';\nimport { ExploreGraphStyle, ExploreId, ExploreItemState } from 'app/types/explore';\n\nimport { datasourceReducer } from './datasource';\nimport { historyReducer } from './history';\nimport { richHistorySearchFiltersUpdatedAction, richHistoryUpdatedAction, stateSave } from './main';\nimport { queryReducer, runQueries, setQueriesAction } from './query';\nimport { timeReducer, updateTime } from './time';\nimport {\n makeExplorePaneState,\n loadAndInitDatasource,\n createEmptyQueryResponse,\n getUrlStateFromPaneState,\n storeGraphStyle,\n} from './utils';\n// Types\n\n//\n// Actions and Payloads\n//\n\n/**\n * Keep track of the Explore container size, in particular the width.\n * The width will be used to calculate graph intervals (number of datapoints).\n */\nexport interface ChangeSizePayload {\n exploreId: ExploreId;\n width: number;\n height: number;\n}\nexport const changeSizeAction = createAction<ChangeSizePayload>('explore/changeSize');\n\n/**\n * Tracks the state of explore panels that gets synced with the url.\n */\ninterface ChangePanelsState {\n exploreId: ExploreId;\n panelsState: ExplorePanelsState;\n}\nconst changePanelsStateAction = createAction<ChangePanelsState>('explore/changePanels');\nexport function changePanelState(\n exploreId: ExploreId,\n panel: PreferredVisualisationType,\n panelState: ExplorePanelsState[PreferredVisualisationType]\n): ThunkResult<void> {\n return async (dispatch, getState) => {\n const exploreItem = getState().explore[exploreId];\n if (exploreItem === undefined) {\n return;\n }\n const { panelsState } = exploreItem;\n dispatch(\n changePanelsStateAction({\n exploreId,\n panelsState: {\n ...panelsState,\n [panel]: panelState,\n },\n })\n );\n dispatch(stateSave());\n };\n}\n\n/**\n * Initialize Explore state with state from the URL and the React component.\n * Call this only on components for with the Explore state has not been initialized.\n */\nexport interface InitializeExplorePayload {\n exploreId: ExploreId;\n containerWidth: number;\n eventBridge: EventBusExtended;\n queries: DataQuery[];\n range: TimeRange;\n history: HistoryItem[];\n datasourceInstance?: DataSourceApi;\n}\nexport const initializeExploreAction = createAction<InitializeExplorePayload>('explore/initializeExplore');\n\nexport interface SetUrlReplacedPayload {\n exploreId: ExploreId;\n}\nexport const setUrlReplacedAction = createAction<SetUrlReplacedPayload>('explore/setUrlReplaced');\n\n/**\n * Keep track of the Explore container size, in particular the width.\n * The width will be used to calculate graph intervals (number of datapoints).\n */\nexport function changeSize(\n exploreId: ExploreId,\n { height, width }: { height: number; width: number }\n): PayloadAction<ChangeSizePayload> {\n return changeSizeAction({ exploreId, height, width });\n}\n\ninterface ChangeGraphStylePayload {\n exploreId: ExploreId;\n graphStyle: ExploreGraphStyle;\n}\n\nconst changeGraphStyleAction = createAction<ChangeGraphStylePayload>('explore/changeGraphStyle');\n\nexport function changeGraphStyle(exploreId: ExploreId, graphStyle: ExploreGraphStyle): ThunkResult<void> {\n return async (dispatch, getState) => {\n storeGraphStyle(graphStyle);\n dispatch(changeGraphStyleAction({ exploreId, graphStyle }));\n };\n}\n\n/**\n * Initialize Explore state with state from the URL and the React component.\n * Call this only on components for with the Explore state has not been initialized.\n *\n * The `datasource` param will be passed to the datasource service `get` function\n * and can be either a string that is the name or uid, or a datasourceRef\n * This is to maximize compatability with how datasources are accessed from the URL param.\n */\nexport function initializeExplore(\n exploreId: ExploreId,\n datasource: DataSourceRef | string,\n queries: DataQuery[],\n range: TimeRange,\n containerWidth: number,\n eventBridge: EventBusExtended,\n panelsState?: ExplorePanelsState\n): ThunkResult<void> {\n return async (dispatch, getState) => {\n const exploreDatasources = getDataSourceSrv().getList();\n let instance = undefined;\n let history: HistoryItem[] = [];\n\n if (exploreDatasources.length >= 1) {\n const orgId = getState().user.orgId;\n const loadResult = await loadAndInitDatasource(orgId, datasource);\n instance = loadResult.instance;\n history = loadResult.history;\n }\n\n dispatch(\n initializeExploreAction({\n exploreId,\n containerWidth,\n eventBridge,\n queries,\n range,\n datasourceInstance: instance,\n history,\n })\n );\n if (panelsState !== undefined) {\n dispatch(changePanelsStateAction({ exploreId, panelsState }));\n }\n dispatch(updateTime({ exploreId }));\n\n keybindingSrv.setupTimeRangeBindings(false);\n\n if (instance) {\n // We do not want to add the url to browser history on init because when the pane is initialised it's because\n // we already have something in the url. Adding basically the same state as additional history item prevents\n // user to go back to previous url.\n dispatch(runQueries(exploreId, { replaceUrl: true }));\n }\n };\n}\n\n/**\n * Reacts to changes in URL state that we need to sync back to our redux state. Computes diff of newUrlQuery vs current\n * state and runs update actions for relevant parts.\n */\nexport function refreshExplore(exploreId: ExploreId, newUrlQuery: string): ThunkResult<void> {\n return async (dispatch, getState) => {\n const itemState = getState().explore[exploreId]!;\n if (!itemState.initialized) {\n return;\n }\n\n // Get diff of what should be updated\n const newUrlState = parseUrlState(newUrlQuery);\n const update = urlDiff(newUrlState, getUrlStateFromPaneState(itemState));\n\n const { containerWidth, eventBridge } = itemState;\n\n // datasource will either be name or UID here\n const { datasource, queries, range: urlRange, panelsState } = newUrlState;\n const refreshQueries: DataQuery[] = [];\n\n for (let index = 0; index < queries.length; index++) {\n const query = queries[index];\n refreshQueries.push(generateNewKeyAndAddRefIdIfMissing(query, refreshQueries, index));\n }\n\n const timeZone = getTimeZone(getState().user);\n const fiscalYearStartMonth = getFiscalYearStartMonth(getState().user);\n const range = getTimeRangeFromUrl(urlRange, timeZone, fiscalYearStartMonth);\n\n // commit changes based on the diff of new url vs old url\n\n if (update.datasource) {\n const initialQueries = ensureQueries(queries);\n await dispatch(\n initializeExplore(exploreId, datasource, initialQueries, range, containerWidth, eventBridge, panelsState)\n );\n return;\n }\n\n if (update.range) {\n dispatch(updateTime({ exploreId, rawRange: range.raw }));\n }\n\n if (update.queries) {\n dispatch(setQueriesAction({ exploreId, queries: refreshQueries }));\n }\n\n if (update.panelsState && panelsState !== undefined) {\n dispatch(changePanelsStateAction({ exploreId, panelsState }));\n }\n\n // always run queries when refresh is needed\n if (update.queries || update.range) {\n dispatch(runQueries(exploreId));\n }\n };\n}\n\n/**\n * Reducer for an Explore area, to be used by the global Explore reducer.\n */\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because flot (Graph lib) would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const paneReducer = (state: ExploreItemState = makeExplorePaneState(), action: AnyAction): ExploreItemState => {\n state = queryReducer(state, action);\n state = datasourceReducer(state, action);\n state = timeReducer(state, action);\n state = historyReducer(state, action);\n\n if (richHistoryUpdatedAction.match(action)) {\n const { richHistory, total } = action.payload.richHistoryResults;\n return {\n ...state,\n richHistory,\n richHistoryTotal: total,\n };\n }\n\n if (richHistorySearchFiltersUpdatedAction.match(action)) {\n const richHistorySearchFilters = action.payload.filters;\n return {\n ...state,\n richHistorySearchFilters,\n };\n }\n\n if (changeSizeAction.match(action)) {\n const containerWidth = action.payload.width;\n return { ...state, containerWidth };\n }\n\n if (changeGraphStyleAction.match(action)) {\n const { graphStyle } = action.payload;\n return { ...state, graphStyle };\n }\n\n if (changePanelsStateAction.match(action)) {\n const { panelsState } = action.payload;\n return { ...state, panelsState };\n }\n\n if (initializeExploreAction.match(action)) {\n const { containerWidth, eventBridge, queries, range, datasourceInstance, history } = action.payload;\n\n return {\n ...state,\n containerWidth,\n eventBridge,\n range,\n queries,\n initialized: true,\n queryKeys: getQueryKeys(queries, datasourceInstance),\n datasourceInstance,\n history,\n datasourceMissing: !datasourceInstance,\n queryResponse: createEmptyQueryResponse(),\n cache: [],\n };\n }\n\n return state;\n};\n\n/**\n * Compare 2 explore urls and return a map of what changed. Used to update the local state with all the\n * side effects needed.\n */\nexport const urlDiff = (\n oldUrlState: ExploreUrlState | undefined,\n currentUrlState: ExploreUrlState | undefined\n): {\n datasource: boolean;\n queries: boolean;\n range: boolean;\n panelsState: boolean;\n} => {\n const datasource = !isEqual(currentUrlState?.datasource, oldUrlState?.datasource);\n const queries = !isEqual(currentUrlState?.queries, oldUrlState?.queries);\n const range = !isEqual(currentUrlState?.range || DEFAULT_RANGE, oldUrlState?.range || DEFAULT_RANGE);\n const panelsState = !isEqual(currentUrlState?.panelsState, oldUrlState?.panelsState);\n\n return {\n datasource,\n queries,\n range,\n panelsState,\n };\n};\n","import { AnyAction, createAction } from '@reduxjs/toolkit';\n\nimport { DataQuery, HistoryItem } from '@grafana/data';\nimport { config, logError } from '@grafana/runtime';\nimport { RICH_HISTORY_SETTING_KEYS } from 'app/core/history/richHistoryLocalStorageUtils';\nimport store from 'app/core/store';\nimport {\n addToRichHistory,\n deleteAllFromRichHistory,\n deleteQueryInRichHistory,\n getRichHistory,\n getRichHistorySettings,\n LocalStorageMigrationStatus,\n migrateQueryHistoryFromLocalStorage,\n updateCommentInRichHistory,\n updateRichHistorySettings,\n updateStarredInRichHistory,\n} from 'app/core/utils/richHistory';\nimport { ExploreId, ExploreItemState, ExploreState, RichHistoryQuery, ThunkResult } from 'app/types';\n\nimport { supportedFeatures } from '../../../core/history/richHistoryStorageProvider';\nimport { RichHistorySearchFilters, RichHistorySettings } from '../../../core/utils/richHistoryTypes';\n\nimport {\n richHistoryLimitExceededAction,\n richHistoryMigrationFailedAction,\n richHistorySearchFiltersUpdatedAction,\n richHistorySettingsUpdatedAction,\n richHistoryStorageFullAction,\n richHistoryUpdatedAction,\n} from './main';\n\n//\n// Actions and Payloads\n//\n\nexport interface HistoryUpdatedPayload {\n exploreId: ExploreId;\n history: HistoryItem[];\n}\nexport const historyUpdatedAction = createAction<HistoryUpdatedPayload>('explore/historyUpdated');\n\n//\n// Action creators\n//\n\ntype SyncHistoryUpdatesOptions = {\n updatedQuery?: RichHistoryQuery;\n deletedId?: string;\n};\n\n/**\n * Updates current state in both Explore panes after changing or deleting a query history item\n */\nconst updateRichHistoryState = ({ updatedQuery, deletedId }: SyncHistoryUpdatesOptions): ThunkResult<void> => {\n return async (dispatch, getState) => {\n forEachExplorePane(getState().explore, (item, exploreId) => {\n const newRichHistory = item.richHistory\n // update\n .map((query) => (query.id === updatedQuery?.id ? updatedQuery : query))\n // or remove\n .filter((query) => query.id !== deletedId);\n const deletedItems = item.richHistory.length - newRichHistory.length;\n dispatch(\n richHistoryUpdatedAction({\n richHistoryResults: { richHistory: newRichHistory, total: item.richHistoryTotal! - deletedItems },\n exploreId,\n })\n );\n });\n };\n};\n\nconst forEachExplorePane = (state: ExploreState, callback: (item: ExploreItemState, exploreId: ExploreId) => void) => {\n callback(state.left, ExploreId.left);\n state.right && callback(state.right, ExploreId.right);\n};\n\nexport const addHistoryItem = (\n datasourceUid: string,\n datasourceName: string,\n queries: DataQuery[]\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const { richHistoryStorageFull, limitExceeded } = await addToRichHistory(\n datasourceUid,\n datasourceName,\n queries,\n false,\n '',\n !getState().explore.richHistoryStorageFull,\n !getState().explore.richHistoryLimitExceededWarningShown\n );\n if (richHistoryStorageFull) {\n dispatch(richHistoryStorageFullAction());\n }\n if (limitExceeded) {\n dispatch(richHistoryLimitExceededAction());\n }\n };\n};\n\nexport const starHistoryItem = (id: string, starred: boolean): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const updatedQuery = await updateStarredInRichHistory(id, starred);\n dispatch(updateRichHistoryState({ updatedQuery }));\n };\n};\n\nexport const commentHistoryItem = (id: string, comment?: string): ThunkResult<void> => {\n return async (dispatch) => {\n const updatedQuery = await updateCommentInRichHistory(id, comment);\n dispatch(updateRichHistoryState({ updatedQuery }));\n };\n};\n\nexport const deleteHistoryItem = (id: string): ThunkResult<void> => {\n return async (dispatch) => {\n const deletedId = await deleteQueryInRichHistory(id);\n dispatch(updateRichHistoryState({ deletedId }));\n };\n};\n\nexport const deleteRichHistory = (): ThunkResult<void> => {\n return async (dispatch) => {\n await deleteAllFromRichHistory();\n dispatch(\n richHistoryUpdatedAction({ richHistoryResults: { richHistory: [], total: 0 }, exploreId: ExploreId.left })\n );\n dispatch(\n richHistoryUpdatedAction({ richHistoryResults: { richHistory: [], total: 0 }, exploreId: ExploreId.right })\n );\n };\n};\n\nexport const loadRichHistory = (exploreId: ExploreId): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const filters = getState().explore![exploreId]?.richHistorySearchFilters;\n if (filters) {\n const richHistoryResults = await getRichHistory(filters);\n dispatch(richHistoryUpdatedAction({ richHistoryResults, exploreId }));\n }\n };\n};\n\nexport const loadMoreRichHistory = (exploreId: ExploreId): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const currentFilters = getState().explore![exploreId]?.richHistorySearchFilters;\n const currentRichHistory = getState().explore![exploreId]?.richHistory;\n if (currentFilters && currentRichHistory) {\n const nextFilters = { ...currentFilters, page: (currentFilters?.page || 1) + 1 };\n const moreRichHistory = await getRichHistory(nextFilters);\n const richHistory = [...currentRichHistory, ...moreRichHistory.richHistory];\n dispatch(richHistorySearchFiltersUpdatedAction({ filters: nextFilters, exploreId }));\n dispatch(\n richHistoryUpdatedAction({ richHistoryResults: { richHistory, total: moreRichHistory.total }, exploreId })\n );\n }\n };\n};\n\nexport const clearRichHistoryResults = (exploreId: ExploreId): ThunkResult<void> => {\n return async (dispatch) => {\n dispatch(richHistorySearchFiltersUpdatedAction({ filters: undefined, exploreId }));\n dispatch(richHistoryUpdatedAction({ richHistoryResults: { richHistory: [], total: 0 }, exploreId }));\n };\n};\n\n/**\n * Initialize query history pane. To load history it requires settings to be loaded first\n * (but only once per session). Filters are initialised by the tab (starred or home).\n */\nexport const initRichHistory = (): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const queriesMigrated = store.getBool(RICH_HISTORY_SETTING_KEYS.migrated, false);\n const migrationFailedDuringThisSession = getState().explore.richHistoryMigrationFailed;\n\n // Query history migration should always be successful, but in case of unexpected errors we ensure\n // the migration attempt happens only once per session, and the user is informed about the failure\n // in a way that can help with potential investigation.\n if (config.queryHistoryEnabled && !queriesMigrated && !migrationFailedDuringThisSession) {\n const migrationResult = await migrateQueryHistoryFromLocalStorage();\n if (migrationResult.status === LocalStorageMigrationStatus.Failed) {\n dispatch(richHistoryMigrationFailedAction());\n logError(migrationResult.error!, { explore: { event: 'QueryHistoryMigrationFailed' } });\n } else {\n store.set(RICH_HISTORY_SETTING_KEYS.migrated, true);\n }\n }\n let settings = getState().explore.richHistorySettings;\n if (!settings) {\n settings = await getRichHistorySettings();\n dispatch(richHistorySettingsUpdatedAction(settings));\n }\n };\n};\n\nexport const updateHistorySettings = (settings: RichHistorySettings): ThunkResult<void> => {\n return async (dispatch) => {\n dispatch(richHistorySettingsUpdatedAction(settings));\n await updateRichHistorySettings(settings);\n };\n};\n\n/**\n * Assumed this can be called only when settings and filters are initialised\n */\nexport const updateHistorySearchFilters = (\n exploreId: ExploreId,\n filters: RichHistorySearchFilters\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n await dispatch(richHistorySearchFiltersUpdatedAction({ exploreId, filters: { ...filters } }));\n const currentSettings = getState().explore.richHistorySettings!;\n if (supportedFeatures().lastUsedDataSourcesAvailable) {\n await dispatch(\n updateHistorySettings({\n ...currentSettings,\n lastUsedDatasourceFilters: filters.datasourceFilters,\n })\n );\n }\n };\n};\n\nexport const historyReducer = (state: ExploreItemState, action: AnyAction): ExploreItemState => {\n if (historyUpdatedAction.match(action)) {\n return {\n ...state,\n history: action.payload.history,\n };\n }\n return state;\n};\n","import { createAction } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\n\nimport { ExploreUrlState, serializeStateToUrlParam, SplitOpen, UrlQueryMap } from '@grafana/data';\nimport { DataSourceSrv, locationService } from '@grafana/runtime';\nimport { GetExploreUrlArguments, stopQueryState } from 'app/core/utils/explore';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { ExploreId, ExploreItemState, ExploreState } from 'app/types/explore';\n\nimport { RichHistoryResults } from '../../../core/history/RichHistoryStorage';\nimport { RichHistorySearchFilters, RichHistorySettings } from '../../../core/utils/richHistoryTypes';\nimport { ThunkResult } from '../../../types';\nimport { TimeSrv } from '../../dashboard/services/TimeSrv';\n\nimport { paneReducer } from './explorePane';\nimport { getUrlStateFromPaneState, makeExplorePaneState } from './utils';\n\n//\n// Actions and Payloads\n//\n\nexport interface SyncTimesPayload {\n syncedTimes: boolean;\n}\nexport const syncTimesAction = createAction<SyncTimesPayload>('explore/syncTimes');\n\nexport const richHistoryUpdatedAction = createAction<{ richHistoryResults: RichHistoryResults; exploreId: ExploreId }>(\n 'explore/richHistoryUpdated'\n);\nexport const richHistoryStorageFullAction = createAction('explore/richHistoryStorageFullAction');\nexport const richHistoryLimitExceededAction = createAction('explore/richHistoryLimitExceededAction');\nexport const richHistoryMigrationFailedAction = createAction('explore/richHistoryMigrationFailedAction');\n\nexport const richHistorySettingsUpdatedAction = createAction<RichHistorySettings>('explore/richHistorySettingsUpdated');\nexport const richHistorySearchFiltersUpdatedAction = createAction<{\n exploreId: ExploreId;\n filters?: RichHistorySearchFilters;\n}>('explore/richHistorySearchFiltersUpdatedAction');\n\n/**\n * Resets state for explore.\n */\nexport interface ResetExplorePayload {\n force?: boolean;\n}\nexport const resetExploreAction = createAction<ResetExplorePayload>('explore/resetExplore');\n\n/**\n * Close the split view and save URL state.\n */\nexport interface SplitCloseActionPayload {\n itemId: ExploreId;\n}\nexport const splitCloseAction = createAction<SplitCloseActionPayload>('explore/splitClose');\n\n/**\n * Cleans up a pane state. Could seem like this should be in explorePane.ts actions but in case we area closing\n * left pane we need to move right state to the left.\n * Also this may seem redundant as we have splitClose actions which clears up state but that action is not called on\n * URL change.\n */\nexport interface CleanupPanePayload {\n exploreId: ExploreId;\n}\nexport const cleanupPaneAction = createAction<CleanupPanePayload>('explore/cleanupPane');\n\n//\n// Action creators\n//\n\n/**\n * Save local redux state back to the URL. Should be called when there is some change that should affect the URL.\n * Not all of the redux state is reflected in URL though.\n */\nexport const stateSave = (options?: { replace?: boolean }): ThunkResult<void> => {\n return (dispatch, getState) => {\n const { left, right } = getState().explore;\n const orgId = getState().user.orgId.toString();\n const urlStates: { [index: string]: string | null } = { orgId };\n\n urlStates.left = serializeStateToUrlParam(getUrlStateFromPaneState(left));\n\n if (right) {\n urlStates.right = serializeStateToUrlParam(getUrlStateFromPaneState(right));\n } else {\n urlStates.right = null;\n }\n\n lastSavedUrl.right = urlStates.right;\n lastSavedUrl.left = urlStates.left;\n\n locationService.partial({ ...urlStates }, options?.replace);\n };\n};\n\n// Store the url we saved last se we are not trying to update local state based on that.\nexport const lastSavedUrl: UrlQueryMap = {};\n\n/**\n * Opens a new right split pane by navigating to appropriate URL. It either copies existing state of the left pane\n * or uses values from options arg. This does only navigation each pane is then responsible for initialization from\n * the URL.\n */\nexport const splitOpen: SplitOpen = (options): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const leftState: ExploreItemState = getState().explore[ExploreId.left];\n const leftUrlState = getUrlStateFromPaneState(leftState);\n let rightUrlState: ExploreUrlState = leftUrlState;\n\n if (options) {\n rightUrlState = {\n datasource: options.datasourceUid,\n queries: [options.query],\n range: options.range || leftState.range,\n panelsState: options.panelsState,\n };\n }\n\n const urlState = serializeStateToUrlParam(rightUrlState);\n locationService.partial({ right: urlState }, true);\n };\n};\n\n/**\n * Close the split view and save URL state. We need to update the state here because when closing we cannot just\n * update the URL and let the components handle it because if we swap panes from right to left it is not easily apparent\n * from the URL.\n */\nexport function splitClose(itemId: ExploreId): ThunkResult<void> {\n return (dispatch, getState) => {\n dispatch(splitCloseAction({ itemId }));\n dispatch(stateSave());\n };\n}\n\nexport interface NavigateToExploreDependencies {\n getDataSourceSrv: () => DataSourceSrv;\n getTimeSrv: () => TimeSrv;\n getExploreUrl: (args: GetExploreUrlArguments) => Promise<string | undefined>;\n openInNewWindow?: (url: string) => void;\n}\n\nexport const navigateToExplore = (\n panel: PanelModel,\n dependencies: NavigateToExploreDependencies\n): ThunkResult<void> => {\n return async (dispatch) => {\n const { getDataSourceSrv, getTimeSrv, getExploreUrl, openInNewWindow } = dependencies;\n const datasourceSrv = getDataSourceSrv();\n const path = await getExploreUrl({\n panel,\n datasourceSrv,\n timeSrv: getTimeSrv(),\n });\n\n if (openInNewWindow && path) {\n openInNewWindow(path);\n return;\n }\n\n locationService.push(path!);\n };\n};\n\n/**\n * Global Explore state that handles multiple Explore areas and the split state\n */\nconst initialExploreItemState = makeExplorePaneState();\nexport const initialExploreState: ExploreState = {\n syncedTimes: false,\n left: initialExploreItemState,\n right: undefined,\n richHistoryStorageFull: false,\n richHistoryLimitExceededWarningShown: false,\n richHistoryMigrationFailed: false,\n};\n\n/**\n * Global Explore reducer that handles multiple Explore areas (left and right).\n * Actions that have an `exploreId` get routed to the ExploreItemReducer.\n */\nexport const exploreReducer = (state = initialExploreState, action: AnyAction): ExploreState => {\n if (splitCloseAction.match(action)) {\n const { itemId } = action.payload as SplitCloseActionPayload;\n const targetSplit = {\n left: itemId === ExploreId.left ? state.right! : state.left,\n right: undefined,\n };\n return {\n ...state,\n ...targetSplit,\n };\n }\n\n if (cleanupPaneAction.match(action)) {\n const { exploreId } = action.payload as CleanupPanePayload;\n\n // We want to do this only when we remove single pane not when we are unmounting whole explore.\n // It needs to be checked like this because in component we don't get new path (which would tell us if we are\n // navigating out of explore) before the unmount.\n if (!state[exploreId]?.initialized) {\n return state;\n }\n\n if (exploreId === ExploreId.left) {\n return {\n ...state,\n [ExploreId.left]: state[ExploreId.right]!,\n [ExploreId.right]: undefined,\n };\n } else {\n return {\n ...state,\n [ExploreId.right]: undefined,\n };\n }\n }\n\n if (syncTimesAction.match(action)) {\n return { ...state, syncedTimes: action.payload.syncedTimes };\n }\n\n if (richHistoryStorageFullAction.match(action)) {\n return {\n ...state,\n richHistoryStorageFull: true,\n };\n }\n\n if (richHistoryLimitExceededAction.match(action)) {\n return {\n ...state,\n richHistoryLimitExceededWarningShown: true,\n };\n }\n\n if (richHistoryMigrationFailedAction.match(action)) {\n return {\n ...state,\n richHistoryMigrationFailed: true,\n };\n }\n\n if (resetExploreAction.match(action)) {\n const payload: ResetExplorePayload = action.payload;\n const leftState = state[ExploreId.left];\n const rightState = state[ExploreId.right];\n stopQueryState(leftState.querySubscription);\n if (rightState) {\n stopQueryState(rightState.querySubscription);\n }\n\n if (payload.force) {\n return initialExploreState;\n }\n\n return {\n ...initialExploreState,\n left: {\n ...initialExploreItemState,\n queries: state.left.queries,\n },\n };\n }\n\n if (richHistorySettingsUpdatedAction.match(action)) {\n const richHistorySettings = action.payload;\n return {\n ...state,\n richHistorySettings,\n };\n }\n\n if (action.payload) {\n const { exploreId } = action.payload;\n if (exploreId !== undefined) {\n // @ts-ignore\n const explorePaneState = state[exploreId];\n return { ...state, [exploreId]: paneReducer(explorePaneState, action as any) };\n }\n }\n\n return state;\n};\n\nexport default {\n explore: exploreReducer,\n};\n","import { groupBy } from 'lodash';\nimport { Observable, of } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport {\n AbsoluteTimeRange,\n DataFrame,\n FieldType,\n getDisplayProcessor,\n PanelData,\n sortLogsResult,\n standardTransformers,\n DataQuery,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nimport { dataFrameToLogsModel } from '../../../core/logsModel';\nimport { refreshIntervalToSortOrder } from '../../../core/utils/explore';\nimport { ExplorePanelData } from '../../../types';\nimport { preProcessPanelData } from '../../query/state/runRequest';\n\n/**\n * When processing response first we try to determine what kind of dataframes we got as one query can return multiple\n * dataFrames with different type of data. This is later used for type specific processing. As we use this in\n * Observable pipeline, it decorates the existing panelData to pass the results to later processing stages.\n */\nexport const decorateWithFrameTypeMetadata = (data: PanelData): ExplorePanelData => {\n const graphFrames: DataFrame[] = [];\n const tableFrames: DataFrame[] = [];\n const logsFrames: DataFrame[] = [];\n const traceFrames: DataFrame[] = [];\n const nodeGraphFrames: DataFrame[] = [];\n\n for (const frame of data.series) {\n switch (frame.meta?.preferredVisualisationType) {\n case 'logs':\n logsFrames.push(frame);\n break;\n case 'graph':\n graphFrames.push(frame);\n break;\n case 'trace':\n traceFrames.push(frame);\n break;\n case 'table':\n tableFrames.push(frame);\n break;\n case 'nodeGraph':\n nodeGraphFrames.push(frame);\n break;\n default:\n if (isTimeSeries(frame)) {\n graphFrames.push(frame);\n tableFrames.push(frame);\n } else {\n // We fallback to table if we do not have any better meta info about the dataframe.\n tableFrames.push(frame);\n }\n }\n }\n\n return {\n ...data,\n graphFrames,\n tableFrames,\n logsFrames,\n traceFrames,\n nodeGraphFrames,\n graphResult: null,\n tableResult: null,\n logsResult: null,\n };\n};\n\nexport const decorateWithGraphResult = (data: ExplorePanelData): ExplorePanelData => {\n if (!data.graphFrames.length) {\n return { ...data, graphResult: null };\n }\n\n return { ...data, graphResult: data.graphFrames };\n};\n\n/**\n * This processing returns Observable because it uses Transformer internally which result type is also Observable.\n * In this case the transformer should return single result but it is possible that in the future it could return\n * multiple results and so this should be used with mergeMap or similar to unbox the internal observable.\n */\nexport const decorateWithTableResult = (data: ExplorePanelData): Observable<ExplorePanelData> => {\n if (data.tableFrames.length === 0) {\n return of({ ...data, tableResult: null });\n }\n\n data.tableFrames.sort((frameA: DataFrame, frameB: DataFrame) => {\n const frameARefId = frameA.refId!;\n const frameBRefId = frameB.refId!;\n\n if (frameARefId > frameBRefId) {\n return 1;\n }\n if (frameARefId < frameBRefId) {\n return -1;\n }\n return 0;\n });\n\n const hasOnlyTimeseries = data.tableFrames.every((df) => isTimeSeries(df));\n\n // If we have only timeseries we do join on default time column which makes more sense. If we are showing\n // non timeseries or some mix of data we are not trying to join on anything and just try to merge them in\n // single table, which may not make sense in most cases, but it's up to the user to query something sensible.\n const transformer = hasOnlyTimeseries\n ? of(data.tableFrames).pipe(standardTransformers.seriesToColumnsTransformer.operator({}))\n : of(data.tableFrames).pipe(standardTransformers.mergeTransformer.operator({}));\n\n return transformer.pipe(\n map((frames) => {\n const frame = frames[0];\n\n // set display processor\n for (const field of frame.fields) {\n field.display =\n field.display ??\n getDisplayProcessor({\n field,\n theme: config.theme2,\n timeZone: data.request?.timezone ?? 'browser',\n });\n }\n\n return { ...data, tableResult: frame };\n })\n );\n};\n\nexport const decorateWithLogsResult =\n (\n options: {\n absoluteRange?: AbsoluteTimeRange;\n refreshInterval?: string;\n queries?: DataQuery[];\n fullRangeLogsVolumeAvailable?: boolean;\n } = {}\n ) =>\n (data: ExplorePanelData): ExplorePanelData => {\n if (data.logsFrames.length === 0) {\n return { ...data, logsResult: null };\n }\n\n const intervalMs = data.request?.intervalMs;\n const newResults = dataFrameToLogsModel(data.logsFrames, intervalMs, options.absoluteRange, options.queries);\n const sortOrder = refreshIntervalToSortOrder(options.refreshInterval);\n const sortedNewResults = sortLogsResult(newResults, sortOrder);\n const rows = sortedNewResults.rows;\n const series = options.fullRangeLogsVolumeAvailable ? undefined : sortedNewResults.series;\n const logsResult = { ...sortedNewResults, rows, series };\n\n return { ...data, logsResult };\n };\n\n// decorateData applies all decorators\nexport function decorateData(\n data: PanelData,\n queryResponse: PanelData,\n absoluteRange: AbsoluteTimeRange,\n refreshInterval: string | undefined,\n queries: DataQuery[] | undefined,\n fullRangeLogsVolumeAvailable: boolean\n): Observable<ExplorePanelData> {\n return of(data).pipe(\n map((data: PanelData) => preProcessPanelData(data, queryResponse)),\n map(decorateWithFrameTypeMetadata),\n map(decorateWithGraphResult),\n map(decorateWithLogsResult({ absoluteRange, refreshInterval, queries, fullRangeLogsVolumeAvailable })),\n mergeMap(decorateWithTableResult)\n );\n}\n\n/**\n * Check if frame contains time series, which for our purpose means 1 time column and 1 or more numeric columns.\n */\nfunction isTimeSeries(frame: DataFrame): boolean {\n const grouped = groupBy(frame.fields, (field) => field.type);\n return Boolean(\n Object.keys(grouped).length === 2 && grouped[FieldType.time]?.length === 1 && grouped[FieldType.number]\n );\n}\n","import { AnyAction, createAction, PayloadAction } from '@reduxjs/toolkit';\nimport deepEqual from 'fast-deep-equal';\nimport { identity, Observable, of, SubscriptionLike, Unsubscribable } from 'rxjs';\nimport { mergeMap, throttleTime } from 'rxjs/operators';\n\nimport {\n AbsoluteTimeRange,\n CoreApp,\n DataQuery,\n DataQueryErrorType,\n DataQueryResponse,\n DataSourceApi,\n hasLogsVolumeSupport,\n hasQueryExportSupport,\n hasQueryImportSupport,\n HistoryItem,\n LoadingState,\n PanelData,\n PanelEvents,\n QueryFixAction,\n toLegacyResponseData,\n} from '@grafana/data';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport {\n buildQueryTransaction,\n ensureQueries,\n generateEmptyQuery,\n generateNewKeyAndAddRefIdIfMissing,\n getQueryKeys,\n hasNonEmptyQuery,\n stopQueryState,\n updateHistory,\n} from 'app/core/utils/explore';\nimport { getShiftedTimeRange } from 'app/core/utils/timePicker';\nimport { getTimeZone } from 'app/features/profile/state/selectors';\nimport { ExploreItemState, ExplorePanelData, ThunkDispatch, ThunkResult } from 'app/types';\nimport { ExploreId, ExploreState, QueryOptions } from 'app/types/explore';\n\nimport { notifyApp } from '../../../core/actions';\nimport { createErrorNotification } from '../../../core/copy/appNotification';\nimport { runRequest } from '../../query/state/runRequest';\nimport { decorateData } from '../utils/decorators';\n\nimport { addHistoryItem, historyUpdatedAction, loadRichHistory } from './history';\nimport { stateSave } from './main';\nimport { updateTime } from './time';\nimport { createCacheKey, getResultsFromCache } from './utils';\n\n//\n// Actions and Payloads\n//\n\n/**\n * Adds a query row after the row with the given index.\n */\nexport interface AddQueryRowPayload {\n exploreId: ExploreId;\n index: number;\n query: DataQuery;\n}\nexport const addQueryRowAction = createAction<AddQueryRowPayload>('explore/addQueryRow');\n\n/**\n * Query change handler for the query row with the given index.\n * If `override` is reset the query modifications and run the queries. Use this to set queries via a link.\n */\nexport interface ChangeQueriesPayload {\n exploreId: ExploreId;\n queries: DataQuery[];\n}\nexport const changeQueriesAction = createAction<ChangeQueriesPayload>('explore/changeQueries');\n\n/**\n * Cancel running queries.\n */\nexport interface CancelQueriesPayload {\n exploreId: ExploreId;\n}\nexport const cancelQueriesAction = createAction<CancelQueriesPayload>('explore/cancelQueries');\n\nexport interface QueriesImportedPayload {\n exploreId: ExploreId;\n queries: DataQuery[];\n}\nexport const queriesImportedAction = createAction<QueriesImportedPayload>('explore/queriesImported');\n\n/**\n * Action to modify a query given a datasource-specific modifier action.\n * @param exploreId Explore area\n * @param modification Action object with a type, e.g., ADD_FILTER\n * @param index Optional query row index. If omitted, the modification is applied to all query rows.\n * @param modifier Function that executes the modification, typically `datasourceInstance.modifyQueries`.\n */\nexport interface ModifyQueriesPayload {\n exploreId: ExploreId;\n modification: QueryFixAction;\n index?: number;\n modifier: (query: DataQuery, modification: QueryFixAction) => DataQuery;\n}\nexport const modifyQueriesAction = createAction<ModifyQueriesPayload>('explore/modifyQueries');\n\nexport interface QueryStoreSubscriptionPayload {\n exploreId: ExploreId;\n querySubscription: Unsubscribable;\n}\n\nexport const queryStoreSubscriptionAction = createAction<QueryStoreSubscriptionPayload>(\n 'explore/queryStoreSubscription'\n);\n\nexport interface StoreLogsVolumeDataProvider {\n exploreId: ExploreId;\n logsVolumeDataProvider?: Observable<DataQueryResponse>;\n}\n\n/**\n * Stores available logs volume provider after running the query. Used internally by runQueries().\n */\nexport const storeLogsVolumeDataProviderAction = createAction<StoreLogsVolumeDataProvider>(\n 'explore/storeLogsVolumeDataProviderAction'\n);\n\nexport const cleanLogsVolumeAction = createAction<{ exploreId: ExploreId }>('explore/cleanLogsVolumeAction');\n\nexport interface StoreLogsVolumeDataSubscriptionPayload {\n exploreId: ExploreId;\n logsVolumeDataSubscription?: SubscriptionLike;\n}\n\n/**\n * Stores current logs volume subscription for given explore pane.\n */\nconst storeLogsVolumeDataSubscriptionAction = createAction<StoreLogsVolumeDataSubscriptionPayload>(\n 'explore/storeLogsVolumeDataSubscriptionAction'\n);\n\n/**\n * Stores data returned by the provider. Used internally by loadLogsVolumeData().\n */\nconst updateLogsVolumeDataAction = createAction<{\n exploreId: ExploreId;\n logsVolumeData: DataQueryResponse;\n}>('explore/updateLogsVolumeDataAction');\n\nexport interface QueryEndedPayload {\n exploreId: ExploreId;\n response: ExplorePanelData;\n}\nexport const queryStreamUpdatedAction = createAction<QueryEndedPayload>('explore/queryStreamUpdated');\n\n/**\n * Reset queries to the given queries. Any modifications will be discarded.\n * Use this action for clicks on query examples. Triggers a query run.\n */\nexport interface SetQueriesPayload {\n exploreId: ExploreId;\n queries: DataQuery[];\n}\nexport const setQueriesAction = createAction<SetQueriesPayload>('explore/setQueries');\n\nexport interface ChangeLoadingStatePayload {\n exploreId: ExploreId;\n loadingState: LoadingState;\n}\nexport const changeLoadingStateAction = createAction<ChangeLoadingStatePayload>('changeLoadingState');\n\nexport interface SetPausedStatePayload {\n exploreId: ExploreId;\n isPaused: boolean;\n}\nexport const setPausedStateAction = createAction<SetPausedStatePayload>('explore/setPausedState');\n\n/**\n * Start a scan for more results using the given scanner.\n * @param exploreId Explore area\n * @param scanner Function that a) returns a new time range and b) triggers a query run for the new range\n */\nexport interface ScanStartPayload {\n exploreId: ExploreId;\n}\nexport const scanStartAction = createAction<ScanStartPayload>('explore/scanStart');\n\n/**\n * Stop any scanning for more results.\n */\nexport interface ScanStopPayload {\n exploreId: ExploreId;\n}\nexport const scanStopAction = createAction<ScanStopPayload>('explore/scanStop');\n\n/**\n * Adds query results to cache.\n * This is currently used to cache last 5 query results for log queries run from logs navigation (pagination).\n */\nexport interface AddResultsToCachePayload {\n exploreId: ExploreId;\n cacheKey: string;\n queryResponse: ExplorePanelData;\n}\nexport const addResultsToCacheAction = createAction<AddResultsToCachePayload>('explore/addResultsToCache');\n\n/**\n * Clears cache.\n */\nexport interface ClearCachePayload {\n exploreId: ExploreId;\n}\nexport const clearCacheAction = createAction<ClearCachePayload>('explore/clearCache');\n\n//\n// Action creators\n//\n\n/**\n * Adds a query row after the row with the given index.\n */\nexport function addQueryRow(\n exploreId: ExploreId,\n index: number,\n datasource: DataSourceApi | undefined | null\n): ThunkResult<void> {\n return (dispatch, getState) => {\n const queries = getState().explore[exploreId]!.queries;\n const query = {\n ...datasource?.getDefaultQuery?.(CoreApp.Explore),\n ...generateEmptyQuery(queries, index),\n };\n\n dispatch(addQueryRowAction({ exploreId, index, query }));\n };\n}\n\n/**\n * Cancel running queries\n */\nexport function cancelQueries(exploreId: ExploreId): ThunkResult<void> {\n return (dispatch, getState) => {\n dispatch(scanStopAction({ exploreId }));\n dispatch(cancelQueriesAction({ exploreId }));\n dispatch(\n storeLogsVolumeDataProviderAction({\n exploreId,\n logsVolumeDataProvider: undefined,\n })\n );\n // clear any incomplete data\n if (getState().explore[exploreId]!.logsVolumeData?.state !== LoadingState.Done) {\n dispatch(cleanLogsVolumeAction({ exploreId }));\n }\n dispatch(stateSave());\n };\n}\n\n/**\n * Import queries from previous datasource if possible eg Loki and Prometheus have similar query language so the\n * labels part can be reused to get similar data.\n * @param exploreId\n * @param queries\n * @param sourceDataSource\n * @param targetDataSource\n */\nexport const importQueries = (\n exploreId: ExploreId,\n queries: DataQuery[],\n sourceDataSource: DataSourceApi | undefined | null,\n targetDataSource: DataSourceApi\n): ThunkResult<void> => {\n return async (dispatch) => {\n if (!sourceDataSource) {\n // explore not initialized\n dispatch(queriesImportedAction({ exploreId, queries }));\n return;\n }\n\n let importedQueries = queries;\n // Check if queries can be imported from previously selected datasource\n if (sourceDataSource.meta?.id === targetDataSource.meta?.id) {\n // Keep same queries if same type of datasource, but delete datasource query property to prevent mismatch of new and old data source instance\n importedQueries = queries.map(({ datasource, ...query }) => query);\n } else if (hasQueryExportSupport(sourceDataSource) && hasQueryImportSupport(targetDataSource)) {\n const abstractQueries = await sourceDataSource.exportToAbstractQueries(queries);\n importedQueries = await targetDataSource.importFromAbstractQueries(abstractQueries);\n } else if (targetDataSource.importQueries) {\n // Datasource-specific importers\n importedQueries = await targetDataSource.importQueries(queries, sourceDataSource);\n } else {\n // Default is blank queries\n importedQueries = ensureQueries();\n }\n\n const nextQueries = ensureQueries(importedQueries);\n\n dispatch(queriesImportedAction({ exploreId, queries: nextQueries }));\n };\n};\n\n/**\n * Action to modify a query given a datasource-specific modifier action.\n * @param exploreId Explore area\n * @param modification Action object with a type, e.g., ADD_FILTER\n * @param index Optional query row index. If omitted, the modification is applied to all query rows.\n * @param modifier Function that executes the modification, typically `datasourceInstance.modifyQueries`.\n */\nexport function modifyQueries(\n exploreId: ExploreId,\n modification: QueryFixAction,\n modifier: any,\n index?: number\n): ThunkResult<void> {\n return (dispatch) => {\n dispatch(modifyQueriesAction({ exploreId, modification, index, modifier }));\n if (!modification.preventSubmit) {\n dispatch(runQueries(exploreId));\n }\n };\n}\n\nasync function handleHistory(\n dispatch: ThunkDispatch,\n state: ExploreState,\n history: Array<HistoryItem<DataQuery>>,\n datasource: DataSourceApi,\n queries: DataQuery[],\n exploreId: ExploreId\n) {\n const datasourceId = datasource.meta.id;\n const nextHistory = updateHistory(history, datasourceId, queries);\n dispatch(historyUpdatedAction({ exploreId, history: nextHistory }));\n\n dispatch(addHistoryItem(datasource.uid, datasource.name, queries));\n\n // Because filtering happens in the backend we cannot add a new entry without checking if it matches currently\n // used filters. Instead, we refresh the query history list.\n // TODO: run only if Query History list is opened (#47252)\n await dispatch(loadRichHistory(ExploreId.left));\n await dispatch(loadRichHistory(ExploreId.right));\n}\n\n/**\n * Main action to run queries and dispatches sub-actions based on which result viewers are active\n */\nexport const runQueries = (\n exploreId: ExploreId,\n options?: { replaceUrl?: boolean; preserveCache?: boolean }\n): ThunkResult<void> => {\n return (dispatch, getState) => {\n dispatch(updateTime({ exploreId }));\n\n // We always want to clear cache unless we explicitly pass preserveCache parameter\n const preserveCache = options?.preserveCache === true;\n if (!preserveCache) {\n dispatch(clearCache(exploreId));\n }\n\n const exploreItemState = getState().explore[exploreId]!;\n const {\n datasourceInstance,\n containerWidth,\n isLive: live,\n range,\n scanning,\n queryResponse,\n querySubscription,\n refreshInterval,\n absoluteRange,\n cache,\n } = exploreItemState;\n let newQuerySub;\n\n const queries = exploreItemState.queries.map((query) => ({\n ...query,\n datasource: query.datasource || datasourceInstance?.getRef(),\n }));\n\n if (datasourceInstance != null) {\n handleHistory(dispatch, getState().explore, exploreItemState.history, datasourceInstance, queries, exploreId);\n }\n\n dispatch(stateSave({ replace: options?.replaceUrl }));\n\n const cachedValue = getResultsFromCache(cache, absoluteRange);\n\n // If we have results saved in cache, we are going to use those results instead of running queries\n if (cachedValue) {\n newQuerySub = of(cachedValue)\n .pipe(\n mergeMap((data: PanelData) =>\n decorateData(\n data,\n queryResponse,\n absoluteRange,\n refreshInterval,\n queries,\n datasourceInstance != null && hasLogsVolumeSupport(datasourceInstance)\n )\n )\n )\n .subscribe((data) => {\n if (!data.error) {\n dispatch(stateSave());\n }\n\n dispatch(queryStreamUpdatedAction({ exploreId, response: data }));\n });\n\n // If we don't have results saved in cache, run new queries\n } else {\n if (!hasNonEmptyQuery(queries)) {\n dispatch(stateSave({ replace: options?.replaceUrl })); // Remember to save to state and update location\n return;\n }\n\n if (!datasourceInstance) {\n return;\n }\n\n // Some datasource's query builders allow per-query interval limits,\n // but we're using the datasource interval limit for now\n const minInterval = datasourceInstance?.interval;\n\n stopQueryState(querySubscription);\n\n const queryOptions: QueryOptions = {\n minInterval,\n // maxDataPoints is used in:\n // Loki - used for logs streaming for buffer size, with undefined it falls back to datasource config if it supports that.\n // Elastic - limits the number of datapoints for the counts query and for logs it has hardcoded limit.\n // Influx - used to correctly display logs in graph\n // TODO:unification\n // maxDataPoints: mode === ExploreMode.Logs && datasourceId === 'loki' ? undefined : containerWidth,\n maxDataPoints: containerWidth,\n liveStreaming: live,\n };\n\n const timeZone = getTimeZone(getState().user);\n const transaction = buildQueryTransaction(exploreId, queries, queryOptions, range, scanning, timeZone);\n\n dispatch(changeLoadingStateAction({ exploreId, loadingState: LoadingState.Loading }));\n\n newQuerySub = runRequest(datasourceInstance, transaction.request)\n .pipe(\n // Simple throttle for live tailing, in case of > 1000 rows per interval we spend about 200ms on processing and\n // rendering. In case this is optimized this can be tweaked, but also it should be only as fast as user\n // actually can see what is happening.\n live ? throttleTime(500) : identity,\n mergeMap((data: PanelData) =>\n decorateData(\n data,\n queryResponse,\n absoluteRange,\n refreshInterval,\n queries,\n datasourceInstance != null && hasLogsVolumeSupport(datasourceInstance)\n )\n )\n )\n .subscribe({\n next(data) {\n if (data.logsResult !== null) {\n reportInteraction('grafana_explore_logs_result_displayed', {\n datasourceType: datasourceInstance.type,\n });\n }\n dispatch(queryStreamUpdatedAction({ exploreId, response: data }));\n\n // Keep scanning for results if this was the last scanning transaction\n if (getState().explore[exploreId]!.scanning) {\n if (data.state === LoadingState.Done && data.series.length === 0) {\n const range = getShiftedTimeRange(-1, getState().explore[exploreId]!.range);\n dispatch(updateTime({ exploreId, absoluteRange: range }));\n dispatch(runQueries(exploreId));\n } else {\n // We can stop scanning if we have a result\n dispatch(scanStopAction({ exploreId }));\n }\n }\n },\n error(error) {\n dispatch(notifyApp(createErrorNotification('Query processing error', error)));\n dispatch(changeLoadingStateAction({ exploreId, loadingState: LoadingState.Error }));\n console.error(error);\n },\n complete() {\n // In case we don't get any response at all but the observable completed, make sure we stop loading state.\n // This is for cases when some queries are noop like running first query after load but we don't have any\n // actual query input.\n if (getState().explore[exploreId]!.queryResponse.state === LoadingState.Loading) {\n dispatch(changeLoadingStateAction({ exploreId, loadingState: LoadingState.Done }));\n }\n },\n });\n\n if (live) {\n dispatch(\n storeLogsVolumeDataProviderAction({\n exploreId,\n logsVolumeDataProvider: undefined,\n })\n );\n dispatch(cleanLogsVolumeAction({ exploreId }));\n } else if (hasLogsVolumeSupport(datasourceInstance)) {\n const sourceRequest = {\n ...transaction.request,\n requestId: transaction.request.requestId + '_log_volume',\n };\n const logsVolumeDataProvider = datasourceInstance.getLogsVolumeDataProvider(sourceRequest);\n dispatch(\n storeLogsVolumeDataProviderAction({\n exploreId,\n logsVolumeDataProvider,\n })\n );\n const { logsVolumeData, absoluteRange } = getState().explore[exploreId]!;\n if (!canReuseLogsVolumeData(logsVolumeData, queries, absoluteRange)) {\n dispatch(cleanLogsVolumeAction({ exploreId }));\n dispatch(loadLogsVolumeData(exploreId));\n }\n } else {\n dispatch(\n storeLogsVolumeDataProviderAction({\n exploreId,\n logsVolumeDataProvider: undefined,\n })\n );\n }\n }\n\n dispatch(queryStoreSubscriptionAction({ exploreId, querySubscription: newQuerySub }));\n };\n};\n\n/**\n * Checks if after changing the time range the existing data can be used to show logs volume.\n * It can happen if queries are the same and new time range is within existing data time range.\n */\nfunction canReuseLogsVolumeData(\n logsVolumeData: DataQueryResponse | undefined,\n queries: DataQuery[],\n selectedTimeRange: AbsoluteTimeRange\n): boolean {\n if (logsVolumeData && logsVolumeData.data[0]) {\n // check if queries are the same\n if (!deepEqual(logsVolumeData.data[0].meta?.custom?.targets, queries)) {\n return false;\n }\n const dataRange = logsVolumeData && logsVolumeData.data[0] && logsVolumeData.data[0].meta?.custom?.absoluteRange;\n // if selected range is within loaded logs volume\n if (dataRange && dataRange.from <= selectedTimeRange.from && selectedTimeRange.to <= dataRange.to) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Reset queries to the given queries. Any modifications will be discarded.\n * Use this action for clicks on query examples. Triggers a query run.\n */\nexport function setQueries(exploreId: ExploreId, rawQueries: DataQuery[]): ThunkResult<void> {\n return (dispatch, getState) => {\n // Inject react keys into query objects\n const queries = getState().explore[exploreId]!.queries;\n const nextQueries = rawQueries.map((query, index) => generateNewKeyAndAddRefIdIfMissing(query, queries, index));\n dispatch(setQueriesAction({ exploreId, queries: nextQueries }));\n dispatch(runQueries(exploreId));\n };\n}\n\n/**\n * Start a scan for more results using the given scanner.\n * @param exploreId Explore area\n * @param scanner Function that a) returns a new time range and b) triggers a query run for the new range\n */\nexport function scanStart(exploreId: ExploreId): ThunkResult<void> {\n return (dispatch, getState) => {\n // Register the scanner\n dispatch(scanStartAction({ exploreId }));\n // Scanning must trigger query run, and return the new range\n const range = getShiftedTimeRange(-1, getState().explore[exploreId]!.range);\n // Set the new range to be displayed\n dispatch(updateTime({ exploreId, absoluteRange: range }));\n dispatch(runQueries(exploreId));\n };\n}\n\nexport function addResultsToCache(exploreId: ExploreId): ThunkResult<void> {\n return (dispatch, getState) => {\n const queryResponse = getState().explore[exploreId]!.queryResponse;\n const absoluteRange = getState().explore[exploreId]!.absoluteRange;\n const cacheKey = createCacheKey(absoluteRange);\n\n // Save results to cache only when all results recived and loading is done\n if (queryResponse.state === LoadingState.Done) {\n dispatch(addResultsToCacheAction({ exploreId, cacheKey, queryResponse }));\n }\n };\n}\n\nexport function clearCache(exploreId: ExploreId): ThunkResult<void> {\n return (dispatch, getState) => {\n dispatch(clearCacheAction({ exploreId }));\n };\n}\n\n/**\n * Initializes loading logs volume data and stores emitted value.\n */\nexport function loadLogsVolumeData(exploreId: ExploreId): ThunkResult<void> {\n return (dispatch, getState) => {\n const { logsVolumeDataProvider } = getState().explore[exploreId]!;\n if (logsVolumeDataProvider) {\n const logsVolumeDataSubscription = logsVolumeDataProvider.subscribe({\n next: (logsVolumeData: DataQueryResponse) => {\n dispatch(updateLogsVolumeDataAction({ exploreId, logsVolumeData }));\n },\n });\n dispatch(storeLogsVolumeDataSubscriptionAction({ exploreId, logsVolumeDataSubscription }));\n }\n };\n}\n\n//\n// Reducer\n//\n\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because flot (Graph lib) would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const queryReducer = (state: ExploreItemState, action: AnyAction): ExploreItemState => {\n if (addQueryRowAction.match(action)) {\n const { queries } = state;\n const { index, query } = action.payload;\n\n // Add to queries, which will cause a new row to be rendered\n const nextQueries = [...queries.slice(0, index + 1), { ...query }, ...queries.slice(index + 1)];\n\n return {\n ...state,\n queries: nextQueries,\n queryKeys: getQueryKeys(nextQueries, state.datasourceInstance),\n };\n }\n\n if (changeQueriesAction.match(action)) {\n const { queries } = action.payload;\n\n return {\n ...state,\n queries,\n };\n }\n\n if (cancelQueriesAction.match(action)) {\n stopQueryState(state.querySubscription);\n\n return {\n ...state,\n loading: false,\n };\n }\n\n if (modifyQueriesAction.match(action)) {\n const { queries } = state;\n const { modification, index, modifier } = action.payload;\n let nextQueries: DataQuery[];\n if (index === undefined) {\n // Modify all queries\n nextQueries = queries.map((query, i) => {\n const nextQuery = modifier({ ...query }, modification);\n return generateNewKeyAndAddRefIdIfMissing(nextQuery, queries, i);\n });\n } else {\n // Modify query only at index\n nextQueries = queries.map((query, i) => {\n if (i === index) {\n const nextQuery = modifier({ ...query }, modification);\n return generateNewKeyAndAddRefIdIfMissing(nextQuery, queries, i);\n }\n\n return query;\n });\n }\n return {\n ...state,\n queries: nextQueries,\n queryKeys: getQueryKeys(nextQueries, state.datasourceInstance),\n };\n }\n\n if (setQueriesAction.match(action)) {\n const { queries } = action.payload;\n return {\n ...state,\n queries: queries.slice(),\n queryKeys: getQueryKeys(queries, state.datasourceInstance),\n };\n }\n\n if (queriesImportedAction.match(action)) {\n const { queries } = action.payload;\n return {\n ...state,\n queries,\n queryKeys: getQueryKeys(queries, state.datasourceInstance),\n };\n }\n\n if (queryStoreSubscriptionAction.match(action)) {\n const { querySubscription } = action.payload;\n return {\n ...state,\n querySubscription,\n };\n }\n\n if (storeLogsVolumeDataProviderAction.match(action)) {\n let { logsVolumeDataProvider } = action.payload;\n if (state.logsVolumeDataSubscription) {\n state.logsVolumeDataSubscription.unsubscribe();\n }\n return {\n ...state,\n logsVolumeDataProvider,\n logsVolumeDataSubscription: undefined,\n };\n }\n\n if (cleanLogsVolumeAction.match(action)) {\n return {\n ...state,\n logsVolumeData: undefined,\n };\n }\n\n if (storeLogsVolumeDataSubscriptionAction.match(action)) {\n const { logsVolumeDataSubscription } = action.payload;\n return {\n ...state,\n logsVolumeDataSubscription,\n };\n }\n\n if (updateLogsVolumeDataAction.match(action)) {\n let { logsVolumeData } = action.payload;\n\n return {\n ...state,\n logsVolumeData,\n };\n }\n\n if (queryStreamUpdatedAction.match(action)) {\n return processQueryResponse(state, action);\n }\n\n if (queriesImportedAction.match(action)) {\n const { queries } = action.payload;\n return {\n ...state,\n queries,\n queryKeys: getQueryKeys(queries, state.datasourceInstance),\n };\n }\n\n if (changeLoadingStateAction.match(action)) {\n const { loadingState } = action.payload;\n return {\n ...state,\n queryResponse: {\n ...state.queryResponse,\n state: loadingState,\n },\n loading: loadingState === LoadingState.Loading || loadingState === LoadingState.Streaming,\n };\n }\n\n if (setPausedStateAction.match(action)) {\n const { isPaused } = action.payload;\n return {\n ...state,\n isPaused: isPaused,\n };\n }\n\n if (scanStartAction.match(action)) {\n return { ...state, scanning: true };\n }\n\n if (scanStopAction.match(action)) {\n return {\n ...state,\n scanning: false,\n scanRange: undefined,\n };\n }\n\n if (addResultsToCacheAction.match(action)) {\n const CACHE_LIMIT = 5;\n const { cache } = state;\n const { queryResponse, cacheKey } = action.payload;\n\n let newCache = [...cache];\n const isDuplicateKey = newCache.some((c) => c.key === cacheKey);\n\n if (!isDuplicateKey) {\n const newCacheItem = { key: cacheKey, value: queryResponse };\n newCache = [newCacheItem, ...newCache].slice(0, CACHE_LIMIT);\n }\n\n return {\n ...state,\n cache: newCache,\n };\n }\n\n if (clearCacheAction.match(action)) {\n return {\n ...state,\n cache: [],\n };\n }\n\n return state;\n};\n\nexport const processQueryResponse = (\n state: ExploreItemState,\n action: PayloadAction<QueryEndedPayload>\n): ExploreItemState => {\n const { response } = action.payload;\n const {\n request,\n state: loadingState,\n series,\n error,\n graphResult,\n logsResult,\n tableResult,\n traceFrames,\n nodeGraphFrames,\n } = response;\n\n if (error) {\n if (error.type === DataQueryErrorType.Timeout) {\n return {\n ...state,\n queryResponse: response,\n loading: loadingState === LoadingState.Loading || loadingState === LoadingState.Streaming,\n };\n } else if (error.type === DataQueryErrorType.Cancelled) {\n return state;\n }\n\n // Send error to Angular editors\n // When angularSupportEnabled is removed we can remove this code and all references to eventBridge\n if (config.angularSupportEnabled && state.datasourceInstance?.components?.QueryCtrl) {\n state.eventBridge.emit(PanelEvents.dataError, error);\n }\n }\n\n if (!request) {\n return { ...state };\n }\n\n // Send legacy data to Angular editors\n // When angularSupportEnabled is removed we can remove this code and all references to eventBridge\n if (config.angularSupportEnabled && state.datasourceInstance?.components?.QueryCtrl) {\n const legacy = series.map((v) => toLegacyResponseData(v));\n state.eventBridge.emit(PanelEvents.dataReceived, legacy);\n }\n\n return {\n ...state,\n queryResponse: response,\n graphResult,\n tableResult,\n logsResult,\n loading: loadingState === LoadingState.Loading || loadingState === LoadingState.Streaming,\n showLogs: !!logsResult,\n showMetrics: !!graphResult,\n showTable: !!tableResult,\n showTrace: !!traceFrames.length,\n showNodeGraph: !!nodeGraphFrames.length,\n };\n};\n","import { AnyAction, createAction, PayloadAction } from '@reduxjs/toolkit';\n\nimport {\n AbsoluteTimeRange,\n dateTimeForTimeZone,\n LoadingState,\n RawTimeRange,\n sortLogsResult,\n TimeRange,\n} from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { RefreshPicker } from '@grafana/ui';\nimport { getTimeRange, refreshIntervalToSortOrder, stopQueryState } from 'app/core/utils/explore';\nimport { getFiscalYearStartMonth, getTimeZone } from 'app/features/profile/state/selectors';\nimport { ExploreItemState, ThunkResult } from 'app/types';\nimport { ExploreId } from 'app/types/explore';\n\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { TimeModel } from '../../dashboard/state/TimeModel';\n\nimport { syncTimesAction, stateSave } from './main';\nimport { runQueries } from './query';\n\n//\n// Actions and Payloads\n//\n\nexport interface ChangeRangePayload {\n exploreId: ExploreId;\n range: TimeRange;\n absoluteRange: AbsoluteTimeRange;\n}\nexport const changeRangeAction = createAction<ChangeRangePayload>('explore/changeRange');\n\n/**\n * Change the time range of Explore. Usually called from the Timepicker or a graph interaction.\n */\nexport interface ChangeRefreshIntervalPayload {\n exploreId: ExploreId;\n refreshInterval: string;\n}\nexport const changeRefreshIntervalAction = createAction<ChangeRefreshIntervalPayload>('explore/changeRefreshInterval');\n\nexport const updateTimeRange = (options: {\n exploreId: ExploreId;\n rawRange?: RawTimeRange;\n absoluteRange?: AbsoluteTimeRange;\n}): ThunkResult<void> => {\n return (dispatch, getState) => {\n const { syncedTimes } = getState().explore;\n if (syncedTimes) {\n dispatch(updateTime({ ...options, exploreId: ExploreId.left }));\n // When running query by updating time range, we want to preserve cache.\n // Cached results are currently used in Logs pagination.\n dispatch(runQueries(ExploreId.left, { preserveCache: true }));\n dispatch(updateTime({ ...options, exploreId: ExploreId.right }));\n dispatch(runQueries(ExploreId.right, { preserveCache: true }));\n } else {\n dispatch(updateTime({ ...options }));\n dispatch(runQueries(options.exploreId, { preserveCache: true }));\n }\n };\n};\n\n/**\n * Change the refresh interval of Explore. Called from the Refresh picker.\n */\nexport function changeRefreshInterval(\n exploreId: ExploreId,\n refreshInterval: string\n): PayloadAction<ChangeRefreshIntervalPayload> {\n return changeRefreshIntervalAction({ exploreId, refreshInterval });\n}\n\nexport const updateTime = (config: {\n exploreId: ExploreId;\n rawRange?: RawTimeRange;\n absoluteRange?: AbsoluteTimeRange;\n}): ThunkResult<void> => {\n return (dispatch, getState) => {\n const { exploreId, absoluteRange: absRange, rawRange: actionRange } = config;\n const itemState = getState().explore[exploreId]!;\n const timeZone = getTimeZone(getState().user);\n const fiscalYearStartMonth = getFiscalYearStartMonth(getState().user);\n const { range: rangeInState } = itemState;\n let rawRange: RawTimeRange = rangeInState.raw;\n\n if (absRange) {\n rawRange = {\n from: dateTimeForTimeZone(timeZone, absRange.from),\n to: dateTimeForTimeZone(timeZone, absRange.to),\n };\n }\n\n if (actionRange) {\n rawRange = actionRange;\n }\n\n const range = getTimeRange(timeZone, rawRange, fiscalYearStartMonth);\n const absoluteRange: AbsoluteTimeRange = { from: range.from.valueOf(), to: range.to.valueOf() };\n const timeModel: TimeModel = {\n time: range.raw,\n refresh: false,\n timepicker: {},\n getTimezone: () => timeZone,\n timeRangeUpdated: (rawTimeRange: RawTimeRange) => {\n dispatch(updateTimeRange({ exploreId: exploreId, rawRange: rawTimeRange }));\n },\n };\n\n // We need to re-initialize TimeSrv because it might have been triggered by the other Explore pane (when split)\n getTimeSrv().init(timeModel);\n // After re-initializing TimeSrv we need to update the time range in Template service for interpolation\n // of __from and __to variables\n getTemplateSrv().updateTimeRange(getTimeSrv().timeRange());\n\n dispatch(changeRangeAction({ exploreId, range, absoluteRange }));\n };\n};\n\n/**\n * Syncs time interval, if they are not synced on both panels in a split mode.\n * Unsyncs time interval, if they are synced on both panels in a split mode.\n */\nexport function syncTimes(exploreId: ExploreId): ThunkResult<void> {\n return (dispatch, getState) => {\n if (exploreId === ExploreId.left) {\n const leftState = getState().explore.left;\n dispatch(updateTimeRange({ exploreId: ExploreId.right, rawRange: leftState.range.raw }));\n } else {\n const rightState = getState().explore.right!;\n dispatch(updateTimeRange({ exploreId: ExploreId.left, rawRange: rightState.range.raw }));\n }\n const isTimeSynced = getState().explore.syncedTimes;\n dispatch(syncTimesAction({ syncedTimes: !isTimeSynced }));\n dispatch(stateSave());\n };\n}\n\n/**\n * Forces the timepicker's time into absolute time.\n * The conversion is applied to all Explore panes.\n * Useful to produce a bookmarkable URL that points to the same data.\n */\nexport function makeAbsoluteTime(): ThunkResult<void> {\n return (dispatch, getState) => {\n const timeZone = getTimeZone(getState().user);\n const fiscalYearStartMonth = getFiscalYearStartMonth(getState().user);\n const leftState = getState().explore.left;\n const leftRange = getTimeRange(timeZone, leftState.range.raw, fiscalYearStartMonth);\n const leftAbsoluteRange: AbsoluteTimeRange = { from: leftRange.from.valueOf(), to: leftRange.to.valueOf() };\n dispatch(updateTime({ exploreId: ExploreId.left, absoluteRange: leftAbsoluteRange }));\n const rightState = getState().explore.right!;\n if (rightState) {\n const rightRange = getTimeRange(timeZone, rightState.range.raw, fiscalYearStartMonth);\n const rightAbsoluteRange: AbsoluteTimeRange = { from: rightRange.from.valueOf(), to: rightRange.to.valueOf() };\n dispatch(updateTime({ exploreId: ExploreId.right, absoluteRange: rightAbsoluteRange }));\n }\n dispatch(stateSave());\n };\n}\n\n/**\n * Reducer for an Explore area, to be used by the global Explore reducer.\n */\n// Redux Toolkit uses ImmerJs as part of their solution to ensure that state objects are not mutated.\n// ImmerJs has an autoFreeze option that freezes objects from change which means this reducer can't be migrated to createSlice\n// because the state would become frozen and during run time we would get errors because flot (Graph lib) would try to mutate\n// the frozen state.\n// https://github.com/reduxjs/redux-toolkit/issues/242\nexport const timeReducer = (state: ExploreItemState, action: AnyAction): ExploreItemState => {\n if (changeRefreshIntervalAction.match(action)) {\n const { refreshInterval } = action.payload;\n const live = RefreshPicker.isLive(refreshInterval);\n const sortOrder = refreshIntervalToSortOrder(refreshInterval);\n const logsResult = sortLogsResult(state.logsResult, sortOrder);\n\n if (RefreshPicker.isLive(state.refreshInterval) && !live) {\n stopQueryState(state.querySubscription);\n }\n\n return {\n ...state,\n refreshInterval,\n queryResponse: {\n ...state.queryResponse,\n state: live ? LoadingState.Streaming : LoadingState.Done,\n },\n isLive: live,\n isPaused: live ? false : state.isPaused,\n loading: live,\n logsResult,\n };\n }\n\n if (changeRangeAction.match(action)) {\n const { range, absoluteRange } = action.payload;\n return {\n ...state,\n range,\n absoluteRange,\n };\n }\n\n return state;\n};\n","import { isDateTime, RawTimeRange, TimeRange } from '@grafana/data';\n\nexport const toRawTimeRange = (range: TimeRange): RawTimeRange => {\n let from = range.raw.from;\n if (isDateTime(from)) {\n from = from.valueOf().toString(10);\n }\n\n let to = range.raw.to;\n if (isDateTime(to)) {\n to = to.valueOf().toString(10);\n }\n\n return {\n from,\n to,\n };\n};\n","import { isEmpty, isObject, mapValues, omitBy } from 'lodash';\n\nimport {\n AbsoluteTimeRange,\n DataSourceApi,\n DataSourceRef,\n EventBusExtended,\n ExploreUrlState,\n getDefaultTimeRange,\n HistoryItem,\n LoadingState,\n PanelData,\n} from '@grafana/data';\nimport { ExplorePanelData } from 'app/types';\nimport { ExploreGraphStyle, ExploreItemState } from 'app/types/explore';\n\nimport store from '../../../core/store';\nimport { clearQueryKeys, lastUsedDatasourceKeyForOrgId, toGraphStyle } from '../../../core/utils/explore';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport { toRawTimeRange } from '../utils/time';\n\nexport const DEFAULT_RANGE = {\n from: 'now-6h',\n to: 'now',\n};\n\nconst GRAPH_STYLE_KEY = 'grafana.explore.style.graph';\nexport const storeGraphStyle = (graphStyle: string): void => {\n store.set(GRAPH_STYLE_KEY, graphStyle);\n};\n\nconst loadGraphStyle = (): ExploreGraphStyle => {\n const data = store.get(GRAPH_STYLE_KEY);\n return toGraphStyle(data);\n};\n\n/**\n * Returns a fresh Explore area state\n */\nexport const makeExplorePaneState = (): ExploreItemState => ({\n containerWidth: 0,\n datasourceInstance: null,\n datasourceMissing: false,\n history: [],\n queries: [],\n initialized: false,\n range: {\n from: null,\n to: null,\n raw: DEFAULT_RANGE,\n } as any,\n absoluteRange: {\n from: null,\n to: null,\n } as any,\n scanning: false,\n loading: false,\n queryKeys: [],\n isLive: false,\n isPaused: false,\n queryResponse: createEmptyQueryResponse(),\n tableResult: null,\n graphResult: null,\n logsResult: null,\n eventBridge: null as unknown as EventBusExtended,\n cache: [],\n richHistory: [],\n logsVolumeDataProvider: undefined,\n logsVolumeData: undefined,\n graphStyle: loadGraphStyle(),\n panelsState: {},\n});\n\nexport const createEmptyQueryResponse = (): ExplorePanelData => ({\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\n graphFrames: [],\n logsFrames: [],\n traceFrames: [],\n nodeGraphFrames: [],\n tableFrames: [],\n graphResult: null,\n logsResult: null,\n tableResult: null,\n});\n\nexport async function loadAndInitDatasource(\n orgId: number,\n datasource: DataSourceRef | string\n): Promise<{ history: HistoryItem[]; instance: DataSourceApi }> {\n let instance;\n try {\n // let datasource be a ref if we have the info, otherwise a name or uid will do for lookup\n instance = await getDatasourceSrv().get(datasource);\n } catch (error) {\n // Falling back to the default data source in case the provided data source was not found.\n // It may happen if last used data source or the data source provided in the URL has been\n // removed or it is not provisioned anymore.\n instance = await getDatasourceSrv().get();\n }\n if (instance.init) {\n try {\n instance.init();\n } catch (err) {\n // TODO: should probably be handled better\n console.error(err);\n }\n }\n\n const historyKey = `grafana.explore.history.${instance.meta?.id}`;\n const history = store.getObject<HistoryItem[]>(historyKey, []);\n // Save last-used datasource\n\n store.set(lastUsedDatasourceKeyForOrgId(orgId), instance.uid);\n return { history, instance };\n}\n\n// recursively walks an object, removing keys where the value is undefined\n// if the resulting object is empty, returns undefined\nfunction pruneObject(obj: object): object | undefined {\n let pruned = mapValues(obj, (value) => (isObject(value) ? pruneObject(value) : value));\n pruned = omitBy<typeof pruned>(pruned, isEmpty);\n if (isEmpty(pruned)) {\n return undefined;\n }\n return pruned;\n}\n\nexport function getUrlStateFromPaneState(pane: ExploreItemState): ExploreUrlState {\n return {\n // datasourceInstance should not be undefined anymore here but in case there is some path for it to be undefined\n // lets just fallback instead of crashing.\n datasource: pane.datasourceInstance?.uid || '',\n queries: pane.queries.map(clearQueryKeys),\n range: toRawTimeRange(pane.range),\n // don't include panelsState in the url unless a piece of state is actually set\n panelsState: pruneObject(pane.panelsState),\n };\n}\n\nexport function createCacheKey(absRange: AbsoluteTimeRange) {\n const params = {\n from: absRange.from,\n to: absRange.to,\n };\n\n const cacheKey = Object.entries(params)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v.toString())}`)\n .join('&');\n return cacheKey;\n}\n\nexport function getResultsFromCache(\n cache: Array<{ key: string; value: PanelData }>,\n absoluteRange: AbsoluteTimeRange\n): PanelData | undefined {\n const cacheKey = createCacheKey(absoluteRange);\n const cacheIdx = cache.findIndex((c) => c.key === cacheKey);\n const cacheValue = cacheIdx >= 0 ? cache[cacheIdx].value : undefined;\n return cacheValue;\n}\n","import { useCallback } from 'react';\n\nimport {\n Field,\n LinkModel,\n TimeRange,\n mapInternalLinkToExplore,\n InterpolateFunction,\n ScopedVars,\n DataFrame,\n getFieldDisplayValuesProxy,\n SplitOpen,\n} from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nimport { getLinkSrv } from '../../panel/panellinks/link_srv';\n\n/**\n * Get links from the field of a dataframe and in addition check if there is associated\n * metadata with datasource in which case we will add onClick to open the link in new split window. This assumes\n * that we just supply datasource name and field value and Explore split window will know how to render that\n * appropriately. This is for example used for transition from log with traceId to trace datasource to show that\n * trace.\n */\nexport const getFieldLinksForExplore = (options: {\n field: Field;\n rowIndex: number;\n splitOpenFn?: SplitOpen;\n range: TimeRange;\n vars?: ScopedVars;\n dataFrame?: DataFrame;\n}): Array<LinkModel<Field>> => {\n const { field, vars, splitOpenFn, range, rowIndex, dataFrame } = options;\n const scopedVars: any = { ...(vars || {}) };\n scopedVars['__value'] = {\n value: {\n raw: field.values.get(rowIndex),\n },\n text: 'Raw value',\n };\n\n // If we have a dataFrame we can allow referencing other columns and their values in the interpolation.\n if (dataFrame) {\n scopedVars['__data'] = {\n value: {\n name: dataFrame.name,\n refId: dataFrame.refId,\n fields: getFieldDisplayValuesProxy({\n frame: dataFrame,\n rowIndex,\n }),\n },\n text: 'Data',\n };\n }\n\n if (field.config.links) {\n const links = [];\n\n if (!contextSrv.hasAccessToExplore()) {\n links.push(...field.config.links.filter((l) => !l.internal));\n } else {\n links.push(...field.config.links);\n }\n\n return links.map((link) => {\n if (!link.internal) {\n const replace: InterpolateFunction = (value, vars) =>\n getTemplateSrv().replace(value, { ...vars, ...scopedVars });\n\n const linkModel = getLinkSrv().getDataLinkUIModel(link, replace, field);\n if (!linkModel.title) {\n linkModel.title = getTitleFromHref(linkModel.href);\n }\n return linkModel;\n } else {\n return mapInternalLinkToExplore({\n link,\n internalLink: link.internal,\n scopedVars: scopedVars,\n range,\n field,\n onClickFn: splitOpenFn,\n replaceVariables: getTemplateSrv().replace.bind(getTemplateSrv()),\n });\n }\n });\n }\n\n return [];\n};\n\nfunction getTitleFromHref(href: string): string {\n // The URL constructor needs the url to have protocol\n if (href.indexOf('://') < 0) {\n // Doesn't really matter what protocol we use.\n href = `http://${href}`;\n }\n let title;\n try {\n const parsedUrl = new URL(href);\n title = parsedUrl.hostname;\n } catch (_e) {\n // Should be good enough fallback, user probably did not input valid url.\n title = href;\n }\n return title;\n}\n\n/**\n * Hook that returns a function that can be used to retrieve all the links for a row. This returns all the links from\n * all the fields so is useful for visualisation where the whole row is represented as single clickable item like a\n * service map.\n */\nexport function useLinks(range: TimeRange, splitOpenFn?: SplitOpen) {\n return useCallback(\n (dataFrame: DataFrame, rowIndex: number) => {\n return dataFrame.fields.flatMap((f) => {\n if (f.config?.links && f.config?.links.length) {\n return getFieldLinksForExplore({\n field: f,\n rowIndex: rowIndex,\n range,\n dataFrame,\n splitOpenFn,\n });\n } else {\n return [];\n }\n });\n },\n [range, splitOpenFn]\n );\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC, FormEvent } from 'react';\n\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { Button, ButtonSelect, Icon, InlineFieldRow, Input, Select, useStyles } from '@grafana/ui';\n\nimport alertDef, { EvalFunction } from '../../alerting/state/alertDef';\nimport { ClassicCondition, ReducerType } from '../types';\n\ninterface Props {\n condition: ClassicCondition;\n onChange: (condition: ClassicCondition) => void;\n onRemoveCondition: (id: number) => void;\n index: number;\n refIds: Array<SelectableValue<string>>;\n}\n\nconst reducerFunctions = alertDef.reducerTypes.map((rt) => ({ label: rt.text, value: rt.value }));\nconst evalOperators = alertDef.evalOperators.map((eo) => ({ label: eo.text, value: eo.value }));\nconst evalFunctions = alertDef.evalFunctions.map((ef) => ({ label: ef.text, value: ef.value }));\n\nexport const Condition: FC<Props> = ({ condition, index, onChange, onRemoveCondition, refIds }) => {\n const styles = useStyles(getStyles);\n\n const onEvalOperatorChange = (evalOperator: SelectableValue<string>) => {\n onChange({\n ...condition,\n operator: { type: evalOperator.value! },\n });\n };\n\n const onReducerFunctionChange = (conditionFunction: SelectableValue<string>) => {\n onChange({\n ...condition,\n reducer: { type: conditionFunction.value! as ReducerType, params: [] },\n });\n };\n\n const onRefIdChange = (refId: SelectableValue<string>) => {\n onChange({\n ...condition,\n query: { params: [refId.value!] },\n });\n };\n\n const onEvalFunctionChange = (evalFunction: SelectableValue<EvalFunction>) => {\n onChange({\n ...condition,\n evaluator: { params: condition.evaluator.params, type: evalFunction.value! },\n });\n };\n\n const onEvaluateValueChange = (event: FormEvent<HTMLInputElement>, index: number) => {\n const newValue = parseFloat(event.currentTarget.value);\n const newParams = [...condition.evaluator.params];\n newParams[index] = newValue;\n\n onChange({\n ...condition,\n evaluator: { ...condition.evaluator, params: newParams },\n });\n };\n\n const buttonWidth = css`\n width: 60px;\n `;\n\n const isRange =\n condition.evaluator.type === EvalFunction.IsWithinRange || condition.evaluator.type === EvalFunction.IsOutsideRange;\n\n return (\n <InlineFieldRow>\n {index === 0 ? (\n <div className={cx(styles.button, buttonWidth)}>WHEN</div>\n ) : (\n <ButtonSelect\n className={cx(styles.buttonSelectText, buttonWidth)}\n options={evalOperators}\n onChange={onEvalOperatorChange}\n value={evalOperators.find((ea) => ea.value === condition.operator!.type)}\n />\n )}\n <Select\n options={reducerFunctions}\n onChange={onReducerFunctionChange}\n width={20}\n value={reducerFunctions.find((rf) => rf.value === condition.reducer.type)}\n />\n <div className={styles.button}>OF</div>\n <Select\n onChange={onRefIdChange}\n options={refIds}\n width={15}\n value={refIds.find((r) => r.value === condition.query.params[0])}\n />\n <ButtonSelect\n className={styles.buttonSelectText}\n options={evalFunctions}\n onChange={onEvalFunctionChange}\n value={evalFunctions.find((ef) => ef.value === condition.evaluator.type)}\n />\n {isRange ? (\n <>\n <Input\n type=\"number\"\n width={10}\n onChange={(event) => onEvaluateValueChange(event, 0)}\n value={condition.evaluator.params[0]}\n />\n <div className={styles.button}>TO</div>\n <Input\n type=\"number\"\n width={10}\n onChange={(event) => onEvaluateValueChange(event, 1)}\n value={condition.evaluator.params[1]}\n />\n </>\n ) : condition.evaluator.type !== EvalFunction.HasNoValue ? (\n <Input\n type=\"number\"\n width={10}\n onChange={(event) => onEvaluateValueChange(event, 0)}\n value={condition.evaluator.params[0]}\n />\n ) : null}\n\n <Button variant=\"secondary\" type=\"button\" onClick={() => onRemoveCondition(index)}>\n <Icon name=\"trash-alt\" />\n </Button>\n </InlineFieldRow>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n const buttonStyle = css`\n color: ${theme.colors.textBlue};\n font-size: ${theme.typography.size.sm};\n `;\n return {\n buttonSelectText: buttonStyle,\n button: cx(\n css`\n display: flex;\n align-items: center;\n border-radius: ${theme.border.radius.sm};\n font-weight: ${theme.typography.weight.semibold};\n border: 1px solid ${theme.colors.border1};\n white-space: nowrap;\n padding: 0 ${theme.spacing.sm};\n background-color: ${theme.colors.bodyBg};\n `,\n buttonStyle\n ),\n };\n};\n","import React, { FC } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Button, Icon, InlineField, InlineFieldRow } from '@grafana/ui';\n\nimport { ClassicCondition, ExpressionQuery } from '../types';\nimport { defaultCondition } from '../utils/expressionTypes';\n\nimport { Condition } from './Condition';\n\ninterface Props {\n query: ExpressionQuery;\n refIds: Array<SelectableValue<string>>;\n onChange: (query: ExpressionQuery) => void;\n}\n\nexport const ClassicConditions: FC<Props> = ({ onChange, query, refIds }) => {\n const onConditionChange = (condition: ClassicCondition, index: number) => {\n if (query.conditions) {\n onChange({\n ...query,\n conditions: [...query.conditions.slice(0, index), condition, ...query.conditions.slice(index + 1)],\n });\n }\n };\n\n const onAddCondition = () => {\n if (query.conditions) {\n const lastParams = query.conditions.at(-1)?.query?.params ?? [];\n const newCondition: ClassicCondition = { ...defaultCondition, query: { params: lastParams } };\n\n onChange({\n ...query,\n conditions: query.conditions.length > 0 ? [...query.conditions, newCondition] : [newCondition],\n });\n }\n };\n\n const onRemoveCondition = (index: number) => {\n if (query.conditions) {\n const condition = query.conditions[index];\n const conditions = query.conditions\n .filter((c) => c !== condition)\n .map((c, index) => {\n if (index === 0) {\n return {\n ...c,\n operator: {\n type: 'when',\n },\n };\n }\n return c;\n });\n onChange({\n ...query,\n conditions,\n });\n }\n };\n\n return (\n <div>\n <InlineFieldRow>\n <InlineField label=\"Conditions\" labelWidth={14}>\n <div>\n {query.conditions?.map((condition, index) => {\n if (!condition) {\n return;\n }\n return (\n <Condition\n key={index}\n index={index}\n condition={condition}\n onChange={(condition: ClassicCondition) => onConditionChange(condition, index)}\n onRemoveCondition={onRemoveCondition}\n refIds={refIds}\n />\n );\n })}\n </div>\n </InlineField>\n </InlineFieldRow>\n <Button variant=\"secondary\" type=\"button\" onClick={onAddCondition}>\n <Icon name=\"plus-circle\" />\n </Button>\n </div>\n );\n};\n","import { css } from '@emotion/css';\nimport React, { ChangeEvent, FC } from 'react';\nimport { useToggle } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Button, Icon, InlineField, TextArea, useStyles2 } from '@grafana/ui';\n\nimport { ExpressionQuery } from '../types';\n\ninterface Props {\n labelWidth: number;\n query: ExpressionQuery;\n onChange: (query: ExpressionQuery) => void;\n onRunQuery: () => void;\n}\n\nconst mathPlaceholder =\n 'Math operations on one or more queries. You reference the query by ${refId} ie. $A, $B, $C etc\\n' +\n 'The sum of two scalar values: $A + $B > 10';\n\nexport const Math: FC<Props> = ({ labelWidth, onChange, query, onRunQuery }) => {\n const [showHelp, toggleShowHelp] = useToggle(false);\n\n const onExpressionChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n onChange({ ...query, expression: event.target.value });\n };\n\n const styles = useStyles2((theme) => getStyles(theme, showHelp));\n\n const executeQuery = () => {\n if (query.expression) {\n onRunQuery();\n }\n };\n\n return (\n <Stack direction=\"row\">\n <InlineField\n label=\"Expression\"\n labelWidth={labelWidth}\n grow={true}\n shrink={true}\n className={css`\n align-items: flex-start;\n flex: 0.7;\n `}\n >\n <>\n <TextArea\n value={query.expression}\n onChange={onExpressionChange}\n rows={5}\n placeholder={mathPlaceholder}\n onBlur={executeQuery}\n />\n <Button variant=\"secondary\" size=\"sm\" onClick={toggleShowHelp}>\n {showHelp === false ? 'Show' : 'Hide'} help\n </Button>\n </>\n </InlineField>\n <div className={styles.documentationContainer}>\n <header className={styles.documentationHeader}>\n <Icon name=\"book-open\" /> Math operator\n </header>\n <div>\n Run math operations on one or more queries. You reference the query by {'${refId}'} ie. $A, $B, $C etc.\n <br />\n Example: <code>$A + $B</code>\n </div>\n <header className={styles.documentationHeader}>Available Math functions</header>\n <div className={styles.documentationFunctions}>\n <DocumentedFunction\n name=\"abs\"\n description=\"returns the absolute value of its argument which can be a number or a series\"\n />\n <DocumentedFunction\n name=\"is_inf\"\n description=\"returns 1 for Inf values (negative or positive) and 0 for other values. It's able to operate on series or scalar values.\"\n />\n <DocumentedFunction\n name=\"is_nan\"\n description=\"returns 1 for NaN values and 0 for other values. It's able to operate on series or scalar values.\"\n />\n <DocumentedFunction\n name=\"is_null\"\n description=\"returns 1 for null values and 0 for other values. It's able to operate on series or scalar values.\"\n />\n <DocumentedFunction\n name=\"is_number\"\n description=\"returns 1 for all real number values and 0 for non-number. It's able to operate on series or scalar values.\"\n />\n <DocumentedFunction\n name=\"log\"\n description=\"returns the natural logarithm of its argument, which can be a number or a series\"\n />\n <DocumentedFunction\n name=\"inf, infn, nan, and null\"\n description=\"The inf for infinity positive, infn for infinity negative, nan, and null functions all return a single scalar value that matches its name.\"\n />\n <DocumentedFunction\n name=\"round\"\n description=\"returns a rounded integer value. It's able to operate on series or escalar values.\"\n />\n <DocumentedFunction\n name=\"ceil\"\n description=\"rounds the number up to the nearest integer value. It's able to operate on series or escalar values.\"\n />\n <DocumentedFunction\n name=\"floor\"\n description=\"rounds the number down to the nearest integer value. It's able to operate on series or escalar values.\"\n />\n </div>\n <div>\n See our additional documentation on{' '}\n <a\n className={styles.documentationLink}\n target=\"_blank\"\n href=\"https://grafana.com/docs/grafana/latest/panels/query-a-data-source/use-expressions-to-manipulate-data/about-expressions/#math\"\n rel=\"noreferrer\"\n >\n <Icon size=\"xs\" name=\"external-link-alt\" /> Math expressions\n </a>\n .\n </div>\n </div>\n </Stack>\n );\n};\n\ninterface DocumentedFunctionProps {\n name: string;\n description: React.ReactNode;\n}\nconst DocumentedFunction = ({ name, description }: DocumentedFunctionProps) => {\n const styles = useStyles2(getDocumentedFunctionStyles);\n\n return (\n <>\n <span className={styles.name}>{name}</span>\n <span className={styles.description}>{description}</span>\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2, showHelp?: boolean) => ({\n documentationHeader: css`\n font-size: ${theme.typography.h5.fontSize};\n font-weight: ${theme.typography.h5.fontWeight};\n `,\n documentationLink: css`\n color: ${theme.colors.text.link};\n `,\n documentationContainer: css`\n display: ${showHelp ? 'flex' : 'none'};\n flex: 1;\n flex-direction: column;\n gap: ${theme.spacing(2)};\n `,\n documentationFunctions: css`\n display: grid;\n grid-template-columns: max-content auto;\n column-gap: ${theme.spacing(2)};\n `,\n});\n\nconst getDocumentedFunctionStyles = (theme: GrafanaTheme2) => ({\n name: css`\n font-weight: ${theme.typography.fontWeightBold};\n `,\n description: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n color: ${theme.colors.text.disabled};\n `,\n});\n","import React, { FC } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';\n\nimport { ExpressionQuery, ExpressionQuerySettings, ReducerMode, reducerMode, reducerTypes } from '../types';\n\ninterface Props {\n labelWidth: number;\n refIds: Array<SelectableValue<string>>;\n query: ExpressionQuery;\n onChange: (query: ExpressionQuery) => void;\n}\n\nexport const Reduce: FC<Props> = ({ labelWidth, onChange, refIds, query }) => {\n const reducer = reducerTypes.find((o) => o.value === query.reducer);\n\n const onRefIdChange = (value: SelectableValue<string>) => {\n onChange({ ...query, expression: value.value });\n };\n\n const onSelectReducer = (value: SelectableValue<string>) => {\n onChange({ ...query, reducer: value.value });\n };\n\n const onSettingsChanged = (settings: ExpressionQuerySettings) => {\n onChange({ ...query, settings: settings });\n };\n\n const onModeChanged = (value: SelectableValue<ReducerMode>) => {\n let newSettings: ExpressionQuerySettings;\n switch (value.value) {\n case ReducerMode.ReplaceNonNumbers:\n let replaceWithNumber = 0;\n if (query.settings?.mode === ReducerMode.ReplaceNonNumbers) {\n replaceWithNumber = query.settings?.replaceWithValue ?? 0;\n }\n newSettings = {\n mode: ReducerMode.ReplaceNonNumbers,\n replaceWithValue: replaceWithNumber,\n };\n break;\n default:\n newSettings = {\n mode: value.value,\n };\n }\n onSettingsChanged(newSettings);\n };\n\n const onReplaceWithChanged = (e: React.FormEvent<HTMLInputElement>) => {\n const value = e.currentTarget.valueAsNumber;\n onSettingsChanged({ mode: ReducerMode.ReplaceNonNumbers, replaceWithValue: value ?? 0 });\n };\n\n const mode = query.settings?.mode ?? ReducerMode.Strict;\n\n const replaceWithNumber = () => {\n if (mode !== ReducerMode.ReplaceNonNumbers) {\n return;\n }\n return (\n <InlineField label=\"Replace With\" labelWidth={labelWidth}>\n <Input type=\"number\" width={10} onChange={onReplaceWithChanged} value={query.settings?.replaceWithValue ?? 0} />\n </InlineField>\n );\n };\n\n return (\n <InlineFieldRow>\n <InlineField label=\"Function\" labelWidth={labelWidth}>\n <Select options={reducerTypes} value={reducer} onChange={onSelectReducer} width={25} />\n </InlineField>\n <InlineField label=\"Input\" labelWidth={labelWidth}>\n <Select onChange={onRefIdChange} options={refIds} value={query.expression} width={20} />\n </InlineField>\n <InlineField label=\"Mode\" labelWidth={labelWidth}>\n <Select onChange={onModeChanged} options={reducerMode} value={mode} width={25} />\n </InlineField>\n {replaceWithNumber()}\n </InlineFieldRow>\n );\n};\n","import React, { ChangeEvent, FC } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';\n\nimport { downsamplingTypes, ExpressionQuery, upsamplingTypes } from '../types';\n\ninterface Props {\n refIds: Array<SelectableValue<string>>;\n query: ExpressionQuery;\n labelWidth: number;\n onChange: (query: ExpressionQuery) => void;\n}\n\nexport const Resample: FC<Props> = ({ labelWidth, onChange, refIds, query }) => {\n const downsampler = downsamplingTypes.find((o) => o.value === query.downsampler);\n const upsampler = upsamplingTypes.find((o) => o.value === query.upsampler);\n\n const onWindowChange = (event: ChangeEvent<HTMLInputElement>) => {\n onChange({ ...query, window: event.target.value });\n };\n\n const onRefIdChange = (value: SelectableValue<string>) => {\n onChange({ ...query, expression: value.value });\n };\n\n const onSelectDownsampler = (value: SelectableValue<string>) => {\n onChange({ ...query, downsampler: value.value });\n };\n\n const onSelectUpsampler = (value: SelectableValue<string>) => {\n onChange({ ...query, upsampler: value.value });\n };\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Input\" labelWidth={labelWidth}>\n <Select onChange={onRefIdChange} options={refIds} value={query.expression} width={20} />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label=\"Resample to\" labelWidth={labelWidth} tooltip=\"10s, 1m, 30m, 1h\">\n <Input onChange={onWindowChange} value={query.window} width={15} />\n </InlineField>\n <InlineField label=\"Downsample\">\n <Select options={downsamplingTypes} value={downsampler} onChange={onSelectDownsampler} width={25} />\n </InlineField>\n <InlineField label=\"Upsample\">\n <Select options={upsamplingTypes} value={upsampler} onChange={onSelectUpsampler} width={25} />\n </InlineField>\n </InlineFieldRow>\n </>\n );\n};\n","import { Observable, from, mergeMap } from 'rxjs';\n\nimport {\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataSourcePluginMeta,\n PluginType,\n ScopedVars,\n} from '@grafana/data';\nimport { DataSourceWithBackend, getDataSourceSrv, getTemplateSrv } from '@grafana/runtime';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\n\nimport { ExpressionQueryEditor } from './ExpressionQueryEditor';\nimport { ExpressionQuery, ExpressionQueryType } from './types';\n\n/**\n * This is a singleton instance that just pretends to be a DataSource\n */\nexport class ExpressionDatasourceApi extends DataSourceWithBackend<ExpressionQuery> {\n constructor(public instanceSettings: DataSourceInstanceSettings) {\n super(instanceSettings);\n }\n\n applyTemplateVariables(query: ExpressionQuery, scopedVars: ScopedVars): Record<string, any> {\n const templateSrv = getTemplateSrv();\n return {\n ...query,\n expression: templateSrv.replace(query.expression, scopedVars),\n window: templateSrv.replace(query.window, scopedVars),\n };\n }\n\n getCollapsedText(query: ExpressionQuery) {\n return `Expression: ${query.type}`;\n }\n\n query(request: DataQueryRequest<ExpressionQuery>): Observable<DataQueryResponse> {\n let targets = request.targets.map(async (query: ExpressionQuery): Promise<ExpressionQuery> => {\n const ds = await getDataSourceSrv().get(query.datasource);\n\n if (!ds.interpolateVariablesInQueries) {\n return query;\n }\n\n return ds?.interpolateVariablesInQueries([query], request.scopedVars)[0] as ExpressionQuery;\n });\n\n let sub = from(Promise.all(targets));\n return sub.pipe(mergeMap((t) => super.query({ ...request, targets: t })));\n }\n\n newQuery(query?: Partial<ExpressionQuery>): ExpressionQuery {\n return {\n refId: '--', // Replaced with query\n datasource: ExpressionDatasourceRef,\n type: query?.type ?? ExpressionQueryType.math,\n ...query,\n };\n }\n}\n\n/**\n * MATCHES a constant in DataSourceWithBackend, this should be '__expr__'\n * @deprecated\n */\nexport const ExpressionDatasourceUID = '-100';\n\nexport const instanceSettings: DataSourceInstanceSettings = {\n id: -100,\n uid: ExpressionDatasourceUID,\n name: ExpressionDatasourceRef.name,\n type: ExpressionDatasourceRef.type,\n access: 'proxy',\n meta: {\n baseUrl: '',\n module: '',\n type: PluginType.datasource,\n name: ExpressionDatasourceRef.type,\n id: ExpressionDatasourceRef.type,\n info: {\n author: {\n name: 'Grafana Labs',\n },\n logos: {\n small: 'public/img/icn-datasource.svg',\n large: 'public/img/icn-datasource.svg',\n },\n description: 'Adds expression support to Grafana',\n screenshots: [],\n links: [],\n updated: '',\n version: '',\n },\n },\n jsonData: {},\n};\n\nexport const dataSource = new ExpressionDatasourceApi(instanceSettings);\ndataSource.meta = {\n id: ExpressionDatasourceRef.type,\n info: {\n logos: {\n small: 'public/img/icn-datasource.svg',\n large: 'public/img/icn-datasource.svg',\n },\n },\n} as DataSourcePluginMeta;\ndataSource.components = {\n QueryEditor: ExpressionQueryEditor,\n};\n","import React, { useCallback, useEffect, useRef } from 'react';\n\nimport { DataSourceApi, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\n\nimport { ClassicConditions } from './components/ClassicConditions';\nimport { Math } from './components/Math';\nimport { Reduce } from './components/Reduce';\nimport { Resample } from './components/Resample';\nimport { ExpressionQuery, ExpressionQueryType, gelTypes } from './types';\nimport { getDefaults } from './utils/expressionTypes';\n\ntype Props = QueryEditorProps<DataSourceApi<ExpressionQuery>, ExpressionQuery>;\n\nconst labelWidth = 14;\n\ntype NonClassicExpressionType = Exclude<ExpressionQueryType, ExpressionQueryType.classic>;\ntype ExpressionTypeConfigStorage = Partial<Record<NonClassicExpressionType, string>>;\n\nfunction useExpressionsCache() {\n const expressionCache = useRef<ExpressionTypeConfigStorage>({});\n\n const getCachedExpression = useCallback((queryType: ExpressionQueryType) => {\n switch (queryType) {\n case ExpressionQueryType.math:\n case ExpressionQueryType.reduce:\n case ExpressionQueryType.resample:\n return expressionCache.current[queryType];\n case ExpressionQueryType.classic:\n return undefined;\n }\n }, []);\n\n const setCachedExpression = useCallback((queryType: ExpressionQueryType, value: string | undefined) => {\n switch (queryType) {\n case ExpressionQueryType.math:\n expressionCache.current.math = value;\n break;\n\n // We want to use the same value for Reduce and Resample\n case ExpressionQueryType.reduce:\n case ExpressionQueryType.resample:\n expressionCache.current.reduce = value;\n expressionCache.current.resample = value;\n break;\n }\n }, []);\n\n return { getCachedExpression, setCachedExpression };\n}\n\nexport function ExpressionQueryEditor(props: Props) {\n const { query, queries, onRunQuery, onChange } = props;\n const { getCachedExpression, setCachedExpression } = useExpressionsCache();\n\n useEffect(() => {\n setCachedExpression(query.type, query.expression);\n }, [query.expression, query.type, setCachedExpression]);\n\n const onSelectExpressionType = useCallback(\n (item: SelectableValue<ExpressionQueryType>) => {\n const cachedExpression = getCachedExpression(item.value!);\n const defaults = getDefaults({ ...query, type: item.value! });\n\n onChange({ ...defaults, expression: cachedExpression ?? defaults.expression });\n },\n [query, onChange, getCachedExpression]\n );\n\n const renderExpressionType = () => {\n const refIds = queries!.filter((q) => query.refId !== q.refId).map((q) => ({ value: q.refId, label: q.refId }));\n\n switch (query.type) {\n case ExpressionQueryType.math:\n return <Math onChange={onChange} query={query} labelWidth={labelWidth} onRunQuery={onRunQuery} />;\n\n case ExpressionQueryType.reduce:\n return <Reduce refIds={refIds} onChange={onChange} labelWidth={labelWidth} query={query} />;\n\n case ExpressionQueryType.resample:\n return <Resample query={query} labelWidth={labelWidth} onChange={onChange} refIds={refIds} />;\n\n case ExpressionQueryType.classic:\n return <ClassicConditions onChange={onChange} query={query} refIds={refIds} />;\n }\n };\n\n const selected = gelTypes.find((o) => o.value === query.type);\n\n return (\n <div>\n <InlineField label=\"Operation\" labelWidth={labelWidth}>\n <Select options={gelTypes} value={selected} onChange={onSelectExpressionType} width={25} />\n </InlineField>\n {renderExpressionType()}\n </div>\n );\n}\n","import { DataQuery, ReducerID, SelectableValue } from '@grafana/data';\n\nimport { EvalFunction } from '../alerting/state/alertDef';\n\nexport enum ExpressionQueryType {\n math = 'math',\n reduce = 'reduce',\n resample = 'resample',\n classic = 'classic_conditions',\n}\n\nexport const gelTypes: Array<SelectableValue<ExpressionQueryType>> = [\n { value: ExpressionQueryType.math, label: 'Math' },\n { value: ExpressionQueryType.reduce, label: 'Reduce' },\n { value: ExpressionQueryType.resample, label: 'Resample' },\n { value: ExpressionQueryType.classic, label: 'Classic condition' },\n];\n\nexport const reducerTypes: Array<SelectableValue<string>> = [\n { value: ReducerID.min, label: 'Min', description: 'Get the minimum value' },\n { value: ReducerID.max, label: 'Max', description: 'Get the maximum value' },\n { value: ReducerID.mean, label: 'Mean', description: 'Get the average value' },\n { value: ReducerID.sum, label: 'Sum', description: 'Get the sum of all values' },\n { value: ReducerID.count, label: 'Count', description: 'Get the number of values' },\n { value: ReducerID.last, label: 'Last', description: 'Get the last value' },\n];\n\nexport enum ReducerMode {\n Strict = '', // backend API wants an empty string to support \"strict\" mode\n ReplaceNonNumbers = 'replaceNN',\n DropNonNumbers = 'dropNN',\n}\n\nexport const reducerMode: Array<SelectableValue<ReducerMode>> = [\n {\n value: ReducerMode.Strict,\n label: 'Strict',\n description: 'Result can be NaN if series contains non-numeric data',\n },\n {\n value: ReducerMode.DropNonNumbers,\n label: 'Drop Non-numeric Values',\n description: 'Drop NaN, +/-Inf and null from input series before reducing',\n },\n {\n value: ReducerMode.ReplaceNonNumbers,\n label: 'Replace Non-numeric Values',\n description: 'Replace NaN, +/-Inf and null with a constant value before reducing',\n },\n];\n\nexport const downsamplingTypes: Array<SelectableValue<string>> = [\n { value: ReducerID.min, label: 'Min', description: 'Fill with the minimum value' },\n { value: ReducerID.max, label: 'Max', description: 'Fill with the maximum value' },\n { value: ReducerID.mean, label: 'Mean', description: 'Fill with the average value' },\n { value: ReducerID.sum, label: 'Sum', description: 'Fill with the sum of all values' },\n];\n\nexport const upsamplingTypes: Array<SelectableValue<string>> = [\n { value: 'pad', label: 'pad', description: 'fill with the last known value' },\n { value: 'backfilling', label: 'backfilling', description: 'fill with the next known value' },\n { value: 'fillna', label: 'fillna', description: 'Fill with NaNs' },\n];\n\n/**\n * For now this is a single object to cover all the types.... would likely\n * want to split this up by type as the complexity increases\n */\nexport interface ExpressionQuery extends DataQuery {\n type: ExpressionQueryType;\n reducer?: string;\n expression?: string;\n window?: string;\n downsampler?: string;\n upsampler?: string;\n conditions?: ClassicCondition[];\n settings?: ExpressionQuerySettings;\n}\n\nexport interface ExpressionQuerySettings {\n mode?: ReducerMode;\n replaceWithValue?: number;\n}\n\nexport interface ClassicCondition {\n evaluator: {\n params: number[];\n type: EvalFunction;\n };\n operator?: {\n type: string;\n };\n query: {\n params: string[];\n };\n reducer: {\n params: [];\n type: ReducerType;\n };\n type: 'query';\n}\n\nexport type ReducerType =\n | 'avg'\n | 'min'\n | 'max'\n | 'sum'\n | 'count'\n | 'last'\n | 'median'\n | 'diff'\n | 'diff_abs'\n | 'percent_diff'\n | 'percent_diff_abs'\n | 'count_non_null';\n","import { ReducerID } from '@grafana/data';\n\nimport { EvalFunction } from '../../alerting/state/alertDef';\nimport { ClassicCondition, ExpressionQuery, ExpressionQueryType } from '../types';\n\nexport const getDefaults = (query: ExpressionQuery) => {\n switch (query.type) {\n case ExpressionQueryType.reduce:\n if (!query.reducer) {\n query.reducer = ReducerID.mean;\n }\n\n break;\n\n case ExpressionQueryType.resample:\n if (!query.downsampler) {\n query.downsampler = ReducerID.mean;\n }\n\n if (!query.upsampler) {\n query.upsampler = 'fillna';\n }\n\n query.reducer = undefined;\n break;\n\n case ExpressionQueryType.math:\n query.expression = undefined;\n break;\n\n case ExpressionQueryType.classic:\n if (!query.conditions) {\n query.conditions = [defaultCondition];\n }\n\n break;\n\n default:\n query.reducer = undefined;\n }\n\n return query;\n};\n\nexport const defaultCondition: ClassicCondition = {\n type: 'query',\n reducer: {\n params: [],\n type: 'avg',\n },\n operator: {\n type: 'and',\n },\n query: { params: [] },\n evaluator: {\n params: [0, 0],\n type: EvalFunction.IsAbove,\n },\n};\n","import { lastValueFrom } from 'rxjs';\n\nimport { locationUtil } from '@grafana/data';\nimport { getBackendSrv, isFetchError, locationService } from '@grafana/runtime';\nimport { notifyApp, updateNavIndex } from 'app/core/actions';\nimport { createSuccessNotification, createWarningNotification } from 'app/core/copy/appNotification';\nimport { contextSrv } from 'app/core/core';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { FolderState, ThunkResult } from 'app/types';\nimport { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLevel } from 'app/types/acl';\n\nimport { buildNavModel } from './navModel';\nimport { loadFolder, loadFolderPermissions, setCanViewFolderPermissions } from './reducers';\n\nexport function getFolderByUid(uid: string): ThunkResult<void> {\n return async (dispatch) => {\n const folder = await backendSrv.getFolderByUid(uid);\n dispatch(loadFolder(folder));\n dispatch(updateNavIndex(buildNavModel(folder)));\n };\n}\n\nexport function saveFolder(folder: FolderState): ThunkResult<void> {\n return async (dispatch) => {\n const res = await backendSrv.put(`/api/folders/${folder.uid}`, {\n title: folder.title,\n version: folder.version,\n });\n\n dispatch(notifyApp(createSuccessNotification('Folder saved')));\n locationService.push(`${res.url}/settings`);\n };\n}\n\nexport function deleteFolder(uid: string): ThunkResult<void> {\n return async () => {\n await backendSrv.delete(`/api/folders/${uid}?forceDeleteRules=false`);\n locationService.push('/dashboards');\n };\n}\n\nexport function getFolderPermissions(uid: string): ThunkResult<void> {\n return async (dispatch) => {\n const permissions = await backendSrv.get(`/api/folders/${uid}/permissions`);\n dispatch(loadFolderPermissions(permissions));\n };\n}\n\nexport function checkFolderPermissions(uid: string): ThunkResult<void> {\n return async (dispatch) => {\n try {\n await lastValueFrom(\n backendSrv.fetch({\n method: 'GET',\n showErrorAlert: false,\n showSuccessAlert: false,\n url: `/api/folders/${uid}/permissions`,\n })\n );\n dispatch(setCanViewFolderPermissions(true));\n } catch (err) {\n if (isFetchError(err) && err.status !== 403) {\n dispatch(notifyApp(createWarningNotification('Error checking folder permissions', err.data?.message)));\n }\n\n dispatch(setCanViewFolderPermissions(false));\n }\n };\n}\n\nfunction toUpdateItem(item: DashboardAcl): DashboardAclUpdateDTO {\n return {\n userId: item.userId,\n teamId: item.teamId,\n role: item.role,\n permission: item.permission,\n };\n}\n\nexport function updateFolderPermission(itemToUpdate: DashboardAcl, level: PermissionLevel): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const folder = getStore().folder;\n const itemsToUpdate = [];\n\n for (const item of folder.permissions) {\n if (item.inherited) {\n continue;\n }\n\n const updated = toUpdateItem(item);\n\n // if this is the item we want to update, update it's permission\n if (itemToUpdate === item) {\n updated.permission = level;\n }\n\n itemsToUpdate.push(updated);\n }\n\n await backendSrv.post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate });\n await dispatch(getFolderPermissions(folder.uid));\n };\n}\n\nexport function removeFolderPermission(itemToDelete: DashboardAcl): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const folder = getStore().folder;\n const itemsToUpdate = [];\n\n for (const item of folder.permissions) {\n if (item.inherited || item === itemToDelete) {\n continue;\n }\n itemsToUpdate.push(toUpdateItem(item));\n }\n\n await backendSrv.post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate });\n await dispatch(getFolderPermissions(folder.uid));\n };\n}\n\nexport function addFolderPermission(newItem: NewDashboardAclItem): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const folder = getStore().folder;\n const itemsToUpdate = [];\n\n for (const item of folder.permissions) {\n if (item.inherited) {\n continue;\n }\n itemsToUpdate.push(toUpdateItem(item));\n }\n\n itemsToUpdate.push({\n userId: newItem.userId,\n teamId: newItem.teamId,\n role: newItem.role,\n permission: newItem.permission,\n });\n\n await backendSrv.post(`/api/folders/${folder.uid}/permissions`, { items: itemsToUpdate });\n await dispatch(getFolderPermissions(folder.uid));\n };\n}\n\nexport function createNewFolder(folderName: string): ThunkResult<void> {\n return async (dispatch) => {\n const newFolder = await getBackendSrv().post('/api/folders', { title: folderName });\n await contextSrv.fetchUserPermissions();\n dispatch(notifyApp(createSuccessNotification('Folder Created', 'OK')));\n locationService.push(locationUtil.stripBaseFromUrl(newFolder.url));\n };\n}\n","import { NavModel, NavModelItem } from '@grafana/data';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction, FolderDTO } from 'app/types';\n\nexport function buildNavModel(folder: FolderDTO): NavModelItem {\n const model = {\n icon: 'folder',\n id: 'manage-folder',\n subTitle: 'Manage folder dashboards and permissions',\n url: '',\n text: folder.title,\n breadcrumbs: [{ title: 'Dashboards', url: 'dashboards' }],\n children: [\n {\n active: false,\n icon: 'apps',\n id: `folder-dashboards-${folder.uid}`,\n text: 'Dashboards',\n url: folder.url,\n },\n ],\n };\n\n model.children.push({\n active: false,\n icon: 'library-panel',\n id: `folder-library-panels-${folder.uid}`,\n text: 'Panels',\n url: `${folder.url}/library-panels`,\n });\n\n if (contextSrv.hasPermission(AccessControlAction.AlertingRuleRead)) {\n model.children.push({\n active: false,\n icon: 'bell',\n id: `folder-alerting-${folder.uid}`,\n text: 'Alert rules',\n url: `${folder.url}/alerting`,\n });\n }\n\n if (folder.canAdmin) {\n model.children.push({\n active: false,\n icon: 'lock',\n id: `folder-permissions-${folder.uid}`,\n text: 'Permissions',\n url: `${folder.url}/permissions`,\n });\n }\n\n if (folder.canSave) {\n model.children.push({\n active: false,\n icon: 'cog',\n id: `folder-settings-${folder.uid}`,\n text: 'Settings',\n url: `${folder.url}/settings`,\n });\n }\n\n return model;\n}\n\nexport function getLoadingNav(tabIndex: number): NavModel {\n const main = buildNavModel({\n id: 1,\n uid: 'loading',\n title: 'Loading',\n url: 'url',\n canSave: true,\n canEdit: true,\n canAdmin: true,\n canDelete: true,\n version: 0,\n });\n\n main.children![tabIndex].active = true;\n\n return {\n main: main,\n node: main.children![tabIndex],\n };\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { processAclItems } from 'app/core/utils/acl';\nimport { DashboardAclDTO, FolderDTO, FolderState } from 'app/types';\n\nexport const initialState: FolderState = {\n id: 0,\n uid: 'loading',\n title: 'loading',\n url: '',\n canSave: false,\n canDelete: false,\n hasChanged: false,\n version: 1,\n permissions: [],\n canViewFolderPermissions: false,\n};\n\nconst folderSlice = createSlice({\n name: 'folder',\n initialState,\n reducers: {\n loadFolder: (state, action: PayloadAction<FolderDTO>): FolderState => {\n return {\n ...state,\n ...action.payload,\n hasChanged: false,\n };\n },\n setFolderTitle: (state, action: PayloadAction<string>): FolderState => {\n return {\n ...state,\n title: action.payload,\n hasChanged: action.payload.trim().length > 0,\n };\n },\n loadFolderPermissions: (state, action: PayloadAction<DashboardAclDTO[]>): FolderState => {\n return {\n ...state,\n permissions: processAclItems(action.payload),\n };\n },\n setCanViewFolderPermissions: (state, action: PayloadAction<boolean>): FolderState => {\n state.canViewFolderPermissions = action.payload;\n return state;\n },\n },\n});\n\nexport const { loadFolderPermissions, loadFolder, setFolderTitle, setCanViewFolderPermissions } = folderSlice.actions;\n\nexport const folderReducer = folderSlice.reducer;\n\nexport default {\n folder: folderReducer,\n};\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo, useState, useEffect } from 'react';\n\nimport { StandardEditorProps, SelectableValue, GrafanaTheme2 } from '@grafana/data';\nimport { Alert, Select, stylesFactory, useTheme2 } from '@grafana/ui';\n\nimport { COUNTRIES_GAZETTEER_PATH, Gazetteer, getGazetteer } from '../gazetteer/gazetteer';\n\nconst defaultPaths: Array<SelectableValue<string>> = [\n {\n label: 'Countries',\n description: 'Lookup countries by name, two letter code, or three letter code',\n value: COUNTRIES_GAZETTEER_PATH,\n },\n {\n label: 'USA States',\n description: 'Lookup states by name or 2 ',\n value: 'public/gazetteer/usa-states.json',\n },\n {\n label: 'Airports',\n description: 'Lookup airports by id or code',\n value: 'public/gazetteer/airports.geojson',\n },\n];\n\nexport interface GazetteerPathEditorConfigSettings {\n options?: Array<SelectableValue<string>>;\n}\n\nexport const GazetteerPathEditor: FC<StandardEditorProps<string, any, any, GazetteerPathEditorConfigSettings>> = ({\n value,\n onChange,\n context,\n item,\n}) => {\n const styles = getStyles(useTheme2());\n const [gaz, setGaz] = useState<Gazetteer>();\n const settings = item.settings as any;\n\n useEffect(() => {\n async function fetchData() {\n const p = await getGazetteer(value);\n setGaz(p);\n }\n fetchData();\n }, [value, setGaz]);\n\n const { current, options } = useMemo(() => {\n let options = settings?.options ? [...settings.options] : [...defaultPaths];\n let current = options?.find((f) => f.value === gaz?.path);\n if (!current && gaz) {\n current = {\n label: gaz.path,\n value: gaz.path,\n };\n options.push(current);\n }\n return { options, current };\n }, [gaz, settings?.options]);\n\n return (\n <>\n <Select\n value={current}\n options={options}\n onChange={(v) => onChange(v.value)}\n allowCustomValue={true}\n formatCreateLabel={(txt) => `Load from URL: ${txt}`}\n />\n {gaz && (\n <>\n {gaz.error && <Alert title={gaz.error} severity={'warning'} />}\n {gaz.count && (\n <div className={styles.keys}>\n <b>({gaz.count})</b>\n {gaz.examples(10).map((k) => (\n <span key={k}>{k},</span>\n ))}\n {gaz.count > 10 && ' ...'}\n </div>\n )}\n </>\n )}\n </>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n keys: css`\n margin-top: 4px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n\n > span {\n margin-left: 4px;\n }\n `,\n };\n});\n","import {\n Field,\n FieldType,\n FrameGeometrySource,\n FrameGeometrySourceMode,\n PanelOptionsEditorBuilder,\n} from '@grafana/data';\nimport { GazetteerPathEditor } from 'app/features/geo/editor/GazetteerPathEditor';\n\nexport function addLocationFields<TOptions>(\n title: string,\n prefix: string,\n builder: PanelOptionsEditorBuilder<TOptions>,\n source?: FrameGeometrySource\n) {\n builder.addRadio({\n path: `${prefix}mode`,\n name: title,\n description: '',\n defaultValue: FrameGeometrySourceMode.Auto,\n settings: {\n options: [\n { value: FrameGeometrySourceMode.Auto, label: 'Auto' },\n { value: FrameGeometrySourceMode.Coords, label: 'Coords' },\n { value: FrameGeometrySourceMode.Geohash, label: 'Geohash' },\n { value: FrameGeometrySourceMode.Lookup, label: 'Lookup' },\n ],\n },\n });\n\n switch (source?.mode) {\n case FrameGeometrySourceMode.Coords:\n builder\n .addFieldNamePicker({\n path: `${prefix}latitude`,\n name: 'Latitude field',\n settings: {\n filter: (f: Field) => f.type === FieldType.number,\n noFieldsMessage: 'No numeric fields found',\n },\n })\n .addFieldNamePicker({\n path: `${prefix}longitude`,\n name: 'Longitude field',\n settings: {\n filter: (f: Field) => f.type === FieldType.number,\n noFieldsMessage: 'No numeric fields found',\n },\n });\n break;\n\n case FrameGeometrySourceMode.Geohash:\n builder.addFieldNamePicker({\n path: `${prefix}.geohash`,\n name: 'Geohash field',\n settings: {\n filter: (f: Field) => f.type === FieldType.string,\n noFieldsMessage: 'No strings fields found',\n },\n });\n break;\n\n case FrameGeometrySourceMode.Lookup:\n builder\n .addFieldNamePicker({\n path: `${prefix}lookup`,\n name: 'Lookup field',\n settings: {\n filter: (f: Field) => f.type === FieldType.string,\n noFieldsMessage: 'No strings fields found',\n },\n })\n .addCustomEditor({\n id: 'gazetteer',\n path: `${prefix}gazetteer`,\n name: 'Gazetteer',\n editor: GazetteerPathEditor,\n });\n }\n}\n","/**\n * Function that decodes input geohash into latitude and longitude\n */\nexport function decodeGeohash(geohash: string): [number, number] | undefined {\n if (!geohash?.length) {\n return undefined;\n }\n const BITS = [16, 8, 4, 2, 1];\n const BASE32 = '0123456789bcdefghjkmnpqrstuvwxyz';\n let isEven = true;\n const lat: number[] = [];\n const lon: number[] = [];\n lat[0] = -90.0;\n lat[1] = 90.0;\n lon[0] = -180.0;\n lon[1] = 180.0;\n let base32Decoded: number;\n\n geohash.split('').forEach((item: string) => {\n base32Decoded = BASE32.indexOf(item);\n BITS.forEach((mask) => {\n if (isEven) {\n refineInterval(lon, base32Decoded, mask);\n } else {\n refineInterval(lat, base32Decoded, mask);\n }\n isEven = !isEven;\n });\n });\n const latCenter = (lat[0] + lat[1]) / 2;\n const lonCenter = (lon[0] + lon[1]) / 2;\n\n return [lonCenter, latCenter];\n}\n\nfunction refineInterval(interval: any[], base32Decoded: number, mask: number) {\n /* tslint:disable no-bitwise*/\n if (base32Decoded & mask) {\n interval[0] = (interval[0] + interval[1]) / 2;\n } else {\n interval[1] = (interval[0] + interval[1]) / 2;\n }\n}\n","import { Geometry, GeometryCollection, LineString, Point } from 'ol/geom';\nimport { fromLonLat } from 'ol/proj';\n\nimport { ArrayVector, Field, FieldConfig, FieldType } from '@grafana/data';\nimport { getCenterPoint } from 'app/features/transformers/spatial/utils';\n\nimport { Gazetteer } from '../gazetteer/gazetteer';\n\nimport { decodeGeohash } from './geohash';\n\nexport function pointFieldFromGeohash(geohash: Field<string>): Field<Point> {\n return {\n name: geohash.name ?? 'Point',\n type: FieldType.geo,\n values: new ArrayVector<any>(\n geohash.values.toArray().map((v) => {\n const coords = decodeGeohash(v);\n if (coords) {\n return new Point(fromLonLat(coords));\n }\n return undefined;\n })\n ),\n config: hiddenTooltipField,\n };\n}\n\nexport function pointFieldFromLonLat(lon: Field, lat: Field): Field<Point> {\n const buffer = new Array<Point>(lon.values.length);\n for (let i = 0; i < lon.values.length; i++) {\n const longitude = lon.values.get(i);\n const latitude = lat.values.get(i);\n\n // TODO: Add unit tests to thoroughly test out edge cases\n // If longitude or latitude are null, don't add them to buffer\n if (longitude === null || latitude === null) {\n continue;\n }\n\n buffer[i] = new Point(fromLonLat([longitude, latitude]));\n }\n\n return {\n name: 'Point',\n type: FieldType.geo,\n values: new ArrayVector(buffer),\n config: hiddenTooltipField,\n };\n}\n\nexport function getGeoFieldFromGazetteer(gaz: Gazetteer, field: Field<string>): Field<Geometry | undefined> {\n const count = field.values.length;\n const geo = new Array<Geometry | undefined>(count);\n for (let i = 0; i < count; i++) {\n geo[i] = gaz.find(field.values.get(i))?.geometry();\n }\n return {\n name: 'Geometry',\n type: FieldType.geo,\n values: new ArrayVector(geo),\n config: hiddenTooltipField,\n };\n}\n\nexport function createGeometryCollection(\n src: Field<Geometry | undefined>,\n dest: Field<Geometry | undefined>\n): Field<Geometry | undefined> {\n const v0 = src.values.toArray();\n const v1 = dest.values.toArray();\n if (!v0 || !v1) {\n throw 'missing src/dest';\n }\n if (v0.length !== v1.length) {\n throw 'Source and destination field lengths do not match';\n }\n\n const count = src.values.length!;\n const geo = new Array<Geometry | undefined>(count);\n for (let i = 0; i < count; i++) {\n const a = v0[i];\n const b = v1[i];\n if (a && b) {\n geo[i] = new GeometryCollection([a, b]);\n } else if (a) {\n geo[i] = a;\n } else if (b) {\n geo[i] = b;\n }\n }\n return {\n name: 'Geometry',\n type: FieldType.geo,\n values: new ArrayVector(geo),\n config: hiddenTooltipField,\n };\n}\n\nexport function createLineBetween(\n src: Field<Geometry | undefined>,\n dest: Field<Geometry | undefined>\n): Field<Geometry | undefined> {\n const v0 = src.values.toArray();\n const v1 = dest.values.toArray();\n if (!v0 || !v1) {\n throw 'missing src/dest';\n }\n if (v0.length !== v1.length) {\n throw 'Source and destination field lengths do not match';\n }\n\n const count = src.values.length!;\n const geo = new Array<Geometry | undefined>(count);\n for (let i = 0; i < count; i++) {\n const a = v0[i];\n const b = v1[i];\n if (a && b) {\n geo[i] = new LineString([getCenterPoint(a), getCenterPoint(b)]);\n }\n }\n return {\n name: 'Geometry',\n type: FieldType.geo,\n values: new ArrayVector(geo),\n config: hiddenTooltipField,\n };\n}\n\nconst hiddenTooltipField: FieldConfig = Object.freeze({\n custom: {\n hideFrom: { tooltip: true },\n },\n});\n","import GeoJSON from 'ol/format/GeoJSON';\nimport { Geometry } from 'ol/geom';\n\nimport { ArrayVector, DataFrame, Field, FieldType, getFieldTypeFromValue } from '@grafana/data';\n\ninterface FieldInfo {\n values: any[];\n types: Set<FieldType>;\n count: number;\n}\n\n// http://geojson.xyz/\n\nexport function frameFromGeoJSON(body: Document | Element | Object | string): DataFrame {\n const data = new GeoJSON().readFeatures(body, { featureProjection: 'EPSG:3857' });\n const length = data.length;\n\n const geo: Geometry[] = new Array(length).fill(null);\n\n const fieldOrder: string[] = [];\n const lookup = new Map<string, FieldInfo>();\n const getField = (name: string) => {\n let f = lookup.get(name);\n if (!f) {\n f = {\n types: new Set<FieldType>(),\n values: new Array(length).fill(null),\n count: 0,\n };\n fieldOrder.push(name);\n lookup.set(name, f);\n }\n return f;\n };\n const getBestName = (...names: string[]) => {\n for (const k of names) {\n if (!lookup.has(k)) {\n return k;\n }\n }\n return '___' + names[0];\n };\n\n const idfield: FieldInfo = {\n types: new Set<FieldType>(),\n values: new Array(length).fill(null),\n count: 0,\n };\n for (let i = 0; i < length; i++) {\n const feature = data[i];\n geo[i] = feature.getGeometry()!;\n\n const id = feature.getId();\n if (id != null) {\n idfield.values[i] = id;\n idfield.types.add(getFieldTypeFromValue(id));\n idfield.count++;\n }\n\n for (const key of feature.getKeys()) {\n const val = feature.get(key);\n if (val === geo[i] || val == null) {\n continue;\n }\n const field = getField(key);\n field.values[i] = val;\n field.types.add(getFieldTypeFromValue(val));\n field.count++;\n }\n }\n\n const fields: Field[] = [];\n if (idfield.count > 0) {\n const type = ensureSingleType(idfield);\n fields.push({\n name: getBestName('id', '_id', '__id'),\n type,\n values: new ArrayVector(idfield.values),\n config: {},\n });\n }\n\n // Add a geometry field\n fields.push({\n name: getBestName('geo', 'geometry'),\n type: FieldType.geo,\n values: new ArrayVector(geo),\n config: {},\n });\n\n for (const name of fieldOrder) {\n const info = lookup.get(name);\n if (!info) {\n continue;\n }\n const type = ensureSingleType(info);\n fields.push({\n name,\n type,\n values: new ArrayVector(info.values),\n config: {},\n });\n }\n\n // Simple frame\n return {\n fields,\n length,\n };\n}\n\nfunction ensureSingleType(info: FieldInfo): FieldType {\n if (info.count < 1) {\n return FieldType.other;\n }\n if (info.types.size > 1) {\n info.values = info.values.map((v) => {\n if (v != null) {\n return `${v}`;\n }\n return v;\n });\n return FieldType.string;\n }\n return info.types.values().next().value;\n}\n","import { getCenter } from 'ol/extent';\nimport { Geometry, Point } from 'ol/geom';\n\nimport { DataFrame, Field, FieldType, KeyValue, toDataFrame } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\n\nimport { frameFromGeoJSON } from '../format/geojson';\nimport { pointFieldFromLonLat, pointFieldFromGeohash } from '../format/utils';\n\nimport { loadWorldmapPoints } from './worldmap';\n\nexport interface PlacenameInfo {\n point: () => Point | undefined; // lon, lat (WGS84)\n geometry: () => Geometry | undefined;\n frame?: DataFrame;\n index?: number;\n}\n\nexport interface Gazetteer {\n path: string;\n error?: string;\n find: (key: string) => PlacenameInfo | undefined;\n examples: (count: number) => string[];\n frame?: () => DataFrame;\n count?: number;\n}\n\n// Without knowing the datatype pick a good lookup function\nexport function loadGazetteer(path: string, data: any): Gazetteer {\n // try loading geojson\n let frame: DataFrame | undefined = undefined;\n\n if (Array.isArray(data)) {\n const first = data[0] as any;\n // Check for legacy worldmap syntax\n if (first.latitude && first.longitude && (first.key || first.keys)) {\n return loadWorldmapPoints(path, data);\n }\n } else {\n if (Array.isArray(data?.features) && data?.type === 'FeatureCollection') {\n frame = frameFromGeoJSON(data);\n }\n }\n\n if (!frame) {\n try {\n frame = toDataFrame(data);\n } catch (ex) {\n return {\n path,\n error: `${ex}`,\n find: (k) => undefined,\n examples: (v) => [],\n };\n }\n }\n\n return frameAsGazetter(frame, { path });\n}\n\nexport function frameAsGazetter(frame: DataFrame, opts: { path: string; keys?: string[] }): Gazetteer {\n const keys: Field[] = [];\n let geo: Field<Geometry> | undefined = undefined;\n let lat: Field | undefined = undefined;\n let lng: Field | undefined = undefined;\n let geohash: Field | undefined = undefined;\n let firstString: Field | undefined = undefined;\n for (const f of frame.fields) {\n if (f.type === FieldType.geo) {\n geo = f;\n }\n if (!firstString && f.type === FieldType.string) {\n firstString = f;\n }\n if (f.name) {\n if (opts.keys && opts.keys.includes(f.name)) {\n keys.push(f);\n }\n\n const name = f.name.toUpperCase();\n switch (name) {\n case 'LAT':\n case 'LATITUTE':\n lat = f;\n break;\n\n case 'LON':\n case 'LNG':\n case 'LONG':\n case 'LONGITUE':\n lng = f;\n break;\n\n case 'GEOHASH':\n geohash = f;\n break;\n\n case 'ID':\n case 'UID':\n case 'KEY':\n case 'CODE':\n if (!opts.keys) {\n keys.push(f);\n }\n break;\n\n default: {\n if (!opts.keys) {\n if (name.endsWith('_ID') || name.endsWith('_CODE')) {\n keys.push(f);\n }\n }\n }\n }\n }\n }\n\n // Use the first string field\n if (!keys.length && firstString) {\n keys.push(firstString);\n }\n\n let isPoint = false;\n\n // Create a geo field from lat+lng\n if (!geo) {\n if (geohash) {\n geo = pointFieldFromGeohash(geohash);\n isPoint = true;\n } else if (lat && lng) {\n geo = pointFieldFromLonLat(lng, lat);\n isPoint = true;\n }\n } else {\n isPoint = geo.values.get(0).getType() === 'Point';\n }\n\n const lookup = new Map<string, number>();\n keys.forEach((f) => {\n f.values.toArray().forEach((k, idx) => {\n const str = `${k}`;\n lookup.set(str.toUpperCase(), idx);\n lookup.set(str, idx);\n });\n });\n\n return {\n path: opts.path,\n find: (k) => {\n const index = lookup.get(k);\n if (index != null) {\n const g = geo?.values.get(index);\n return {\n frame,\n index,\n point: () => {\n if (!g || isPoint) {\n return g as Point;\n }\n return new Point(getCenter(g.getExtent()));\n },\n geometry: () => g,\n };\n }\n return undefined;\n },\n examples: (v) => {\n const ex: string[] = [];\n for (let k of lookup.keys()) {\n ex.push(k);\n if (ex.length > v) {\n break;\n }\n }\n return ex;\n },\n frame: () => frame,\n count: frame.length,\n };\n}\n\nconst registry: KeyValue<Gazetteer> = {};\n\nexport const COUNTRIES_GAZETTEER_PATH = 'public/gazetteer/countries.json';\n\n/**\n * Given a path to a file return a cached lookup function\n */\nexport async function getGazetteer(path?: string): Promise<Gazetteer> {\n // When not specified, use the default path\n if (!path) {\n path = COUNTRIES_GAZETTEER_PATH;\n }\n\n let lookup = registry[path];\n if (!lookup) {\n try {\n // block the async function\n const data = await getBackendSrv().get(path!);\n lookup = loadGazetteer(path, data);\n } catch (err) {\n console.warn('Error loading placename lookup', path, err);\n lookup = {\n path,\n error: 'Error loading URL',\n find: (k) => undefined,\n examples: (v) => [],\n };\n }\n registry[path] = lookup;\n }\n return lookup;\n}\n","import { Point } from 'ol/geom';\nimport { fromLonLat } from 'ol/proj';\n\nimport { PlacenameInfo, Gazetteer } from './gazetteer';\n\n// https://github.com/grafana/worldmap-panel/blob/master/src/data/countries.json\nexport interface WorldmapPoint {\n key?: string;\n keys?: string[]; // new in grafana 8.1+\n latitude: number;\n longitude: number;\n name?: string;\n}\n\nexport function loadWorldmapPoints(path: string, data: WorldmapPoint[]): Gazetteer {\n let count = 0;\n const values = new Map<string, PlacenameInfo>();\n for (const v of data) {\n const point = new Point(fromLonLat([v.longitude, v.latitude]));\n const info: PlacenameInfo = {\n point: () => point,\n geometry: () => point,\n };\n if (v.name) {\n values.set(v.name, info);\n values.set(v.name.toUpperCase(), info);\n }\n if (v.key) {\n values.set(v.key, info);\n values.set(v.key.toUpperCase(), info);\n }\n if (v.keys) {\n for (const key of v.keys) {\n values.set(key, info);\n values.set(key.toUpperCase(), info);\n }\n }\n count++;\n }\n return {\n path,\n find: (k) => {\n let v = values.get(k);\n if (!v && typeof k === 'string') {\n v = values.get(k.toUpperCase());\n }\n return v;\n },\n count,\n examples: (count) => {\n const first: string[] = [];\n if (values.size < 1) {\n first.push('no values found');\n } else {\n for (const key of values.keys()) {\n first.push(key);\n if (first.length >= count) {\n break;\n }\n }\n }\n return first;\n },\n };\n}\n","import { Geometry } from 'ol/geom';\n\nimport {\n FrameGeometrySource,\n FrameGeometrySourceMode,\n FieldMatcher,\n getFieldMatcher,\n FieldMatcherID,\n DataFrame,\n Field,\n getFieldDisplayName,\n FieldType,\n} from '@grafana/data';\n\nimport { getGeoFieldFromGazetteer, pointFieldFromGeohash, pointFieldFromLonLat } from '../format/utils';\nimport { getGazetteer, Gazetteer } from '../gazetteer/gazetteer';\n\nexport type FieldFinder = (frame: DataFrame) => Field | undefined;\n\nfunction getFieldFinder(matcher: FieldMatcher): FieldFinder {\n return (frame: DataFrame) => {\n for (const field of frame.fields) {\n if (matcher(field, frame, [])) {\n return field;\n }\n }\n return undefined;\n };\n}\n\nfunction matchLowerNames(names: Set<string>): FieldFinder {\n return (frame: DataFrame) => {\n for (const field of frame.fields) {\n if (names.has(field.name.toLowerCase())) {\n return field;\n }\n const disp = getFieldDisplayName(field, frame);\n if (names.has(disp)) {\n return field;\n }\n }\n return undefined;\n };\n}\n\nexport interface LocationFieldMatchers {\n mode: FrameGeometrySourceMode;\n\n // Field mappings\n geohash: FieldFinder;\n latitude: FieldFinder;\n longitude: FieldFinder;\n h3: FieldFinder;\n wkt: FieldFinder;\n lookup: FieldFinder;\n geo: FieldFinder;\n gazetteer?: Gazetteer;\n}\n\nconst defaultMatchers: LocationFieldMatchers = {\n mode: FrameGeometrySourceMode.Auto,\n geohash: matchLowerNames(new Set(['geohash'])),\n latitude: matchLowerNames(new Set(['latitude', 'lat'])),\n longitude: matchLowerNames(new Set(['longitude', 'lon', 'lng'])),\n h3: matchLowerNames(new Set(['h3'])),\n wkt: matchLowerNames(new Set(['wkt'])),\n lookup: matchLowerNames(new Set(['lookup'])),\n geo: (frame: DataFrame) => frame.fields.find((f) => f.type === FieldType.geo),\n};\n\nexport async function getLocationMatchers(src?: FrameGeometrySource): Promise<LocationFieldMatchers> {\n const info: LocationFieldMatchers = {\n ...defaultMatchers,\n mode: src?.mode ?? FrameGeometrySourceMode.Auto,\n };\n switch (info.mode) {\n case FrameGeometrySourceMode.Geohash:\n if (src?.geohash) {\n info.geohash = getFieldFinder(getFieldMatcher({ id: FieldMatcherID.byName, options: src.geohash }));\n }\n break;\n case FrameGeometrySourceMode.Lookup:\n if (src?.lookup) {\n info.lookup = getFieldFinder(getFieldMatcher({ id: FieldMatcherID.byName, options: src.lookup }));\n }\n info.gazetteer = await getGazetteer(src?.gazetteer);\n break;\n case FrameGeometrySourceMode.Coords:\n if (src?.latitude) {\n info.latitude = getFieldFinder(getFieldMatcher({ id: FieldMatcherID.byName, options: src.latitude }));\n }\n if (src?.longitude) {\n info.longitude = getFieldFinder(getFieldMatcher({ id: FieldMatcherID.byName, options: src.longitude }));\n }\n break;\n }\n return info;\n}\nexport interface LocationFields {\n mode: FrameGeometrySourceMode;\n\n // Field mappings\n geohash?: Field;\n latitude?: Field;\n longitude?: Field;\n h3?: Field;\n wkt?: Field;\n lookup?: Field;\n geo?: Field<Geometry>;\n}\n\nexport function getLocationFields(frame: DataFrame, location: LocationFieldMatchers): LocationFields {\n const fields: LocationFields = {\n mode: location.mode ?? FrameGeometrySourceMode.Auto,\n };\n\n // Find the best option\n if (fields.mode === FrameGeometrySourceMode.Auto) {\n fields.geo = location.geo(frame);\n if (fields.geo) {\n return fields;\n }\n\n fields.latitude = location.latitude(frame);\n fields.longitude = location.longitude(frame);\n if (fields.latitude && fields.longitude) {\n fields.mode = FrameGeometrySourceMode.Coords;\n return fields;\n }\n fields.geohash = location.geohash(frame);\n if (fields.geohash) {\n fields.mode = FrameGeometrySourceMode.Geohash;\n return fields;\n }\n fields.lookup = location.geohash(frame);\n if (fields.lookup) {\n fields.mode = FrameGeometrySourceMode.Lookup;\n return fields;\n }\n }\n\n switch (fields.mode) {\n case FrameGeometrySourceMode.Coords:\n fields.latitude = location.latitude(frame);\n fields.longitude = location.longitude(frame);\n break;\n case FrameGeometrySourceMode.Geohash:\n fields.geohash = location.geohash(frame);\n break;\n case FrameGeometrySourceMode.Lookup:\n fields.lookup = location.lookup(frame);\n break;\n }\n\n return fields;\n}\n\nexport interface FrameGeometryField {\n field?: Field<Geometry | undefined>;\n warning?: string;\n derived?: boolean;\n}\n\nexport function getGeometryField(frame: DataFrame, location: LocationFieldMatchers): FrameGeometryField {\n const fields = getLocationFields(frame, location);\n switch (fields.mode) {\n case FrameGeometrySourceMode.Auto:\n if (fields.geo) {\n return {\n field: fields.geo,\n };\n }\n return {\n warning: 'Unable to find location fields',\n };\n\n case FrameGeometrySourceMode.Coords:\n if (fields.latitude && fields.longitude) {\n return {\n field: pointFieldFromLonLat(fields.longitude, fields.latitude),\n derived: true,\n };\n }\n return {\n warning: 'Missing latitude/longitude fields',\n };\n\n case FrameGeometrySourceMode.Geohash:\n if (fields.geohash) {\n return {\n field: pointFieldFromGeohash(fields.geohash),\n derived: true,\n };\n }\n return {\n warning: 'Missing geohash field',\n };\n\n case FrameGeometrySourceMode.Lookup:\n if (fields.lookup) {\n if (location.gazetteer) {\n return {\n field: getGeoFieldFromGazetteer(location.gazetteer, fields.lookup),\n derived: true,\n };\n }\n return {\n warning: 'Gazetteer not found',\n };\n }\n return {\n warning: 'Missing lookup field',\n };\n }\n\n return { warning: 'unable to find geometry' };\n}\n","import { getBackendSrv } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/core';\nimport { FormModel } from 'app/features/org/UserInviteForm';\nimport { AccessControlAction, createAsyncThunk, Invitee } from 'app/types';\n\nexport const fetchInvitees = createAsyncThunk('users/fetchInvitees', async () => {\n if (!contextSrv.hasPermission(AccessControlAction.UsersCreate)) {\n return [];\n }\n\n const invitees: Invitee[] = await getBackendSrv().get('/api/org/invites');\n return invitees;\n});\n\nexport const addInvitee = createAsyncThunk('users/addInvitee', async (addInviteForm: FormModel, { dispatch }) => {\n await getBackendSrv().post(`/api/org/invites`, addInviteForm);\n await dispatch(fetchInvitees());\n});\n\nexport const revokeInvite = createAsyncThunk('users/revokeInvite', async (code: string) => {\n await getBackendSrv().patch(`/api/org/invites/${code}/revoke`, {});\n return code;\n});\n","import { createEntityAdapter, createSlice } from '@reduxjs/toolkit';\n\nimport { Invitee } from 'app/types';\n\nimport { fetchInvitees, revokeInvite } from './actions';\n\nexport type Status = 'idle' | 'loading' | 'succeeded' | 'failed';\n\nconst invitesAdapter = createEntityAdapter({ selectId: (invite: Invitee) => invite.code });\nexport const selectors = invitesAdapter.getSelectors();\nexport const initialState = invitesAdapter.getInitialState<{ status: Status }>({ status: 'idle' });\n\nconst invitesSlice = createSlice({\n name: 'invites',\n initialState,\n reducers: {},\n extraReducers: (builder) => {\n builder\n .addCase(fetchInvitees.pending, (state) => {\n state.status = 'loading';\n })\n .addCase(fetchInvitees.fulfilled, (state, { payload: invites }) => {\n invitesAdapter.setAll(state, invites);\n state.status = 'succeeded';\n })\n .addCase(fetchInvitees.rejected, (state) => {\n state.status = 'failed';\n })\n .addCase(revokeInvite.fulfilled, (state, { payload: inviteCode }) => {\n invitesAdapter.removeOne(state, inviteCode);\n state.status = 'succeeded';\n });\n },\n});\n\nexport const invitesReducer = invitesSlice.reducer;\n\nexport default {\n invites: invitesReducer,\n};\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useAsync, useDebounce } from 'react-use';\n\nimport { isFetchError } from '@grafana/runtime';\nimport { Button, Field, Input, Modal } from '@grafana/ui';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\n\nimport { PanelModel } from '../../../dashboard/state';\nimport { getLibraryPanelByName } from '../../state/api';\nimport { usePanelSave } from '../../utils/usePanelSave';\n\ninterface AddLibraryPanelContentsProps {\n onDismiss: () => void;\n panel: PanelModel;\n initialFolderId?: number;\n}\n\nexport const AddLibraryPanelContents = ({ panel, initialFolderId, onDismiss }: AddLibraryPanelContentsProps) => {\n const [folderId, setFolderId] = useState(initialFolderId);\n const [panelName, setPanelName] = useState(panel.title);\n const [debouncedPanelName, setDebouncedPanelName] = useState(panel.title);\n const [waiting, setWaiting] = useState(false);\n\n useEffect(() => setWaiting(true), [panelName]);\n useDebounce(() => setDebouncedPanelName(panelName), 350, [panelName]);\n\n const { saveLibraryPanel } = usePanelSave();\n const onCreate = useCallback(() => {\n panel.libraryPanel = { uid: undefined, name: panelName };\n saveLibraryPanel(panel, folderId!).then((res) => {\n if (!(res instanceof Error)) {\n onDismiss();\n }\n });\n }, [panel, panelName, folderId, onDismiss, saveLibraryPanel]);\n const isValidName = useAsync(async () => {\n try {\n return !(await getLibraryPanelByName(panelName)).some((lp) => lp.folderId === folderId);\n } catch (err) {\n if (isFetchError(err)) {\n err.isHandled = true;\n }\n return true;\n } finally {\n setWaiting(false);\n }\n }, [debouncedPanelName, folderId]);\n\n const invalidInput =\n !isValidName?.value && isValidName.value !== undefined && panelName === debouncedPanelName && !waiting;\n\n return (\n <>\n <Field\n label=\"Library panel name\"\n invalid={invalidInput}\n error={invalidInput ? 'Library panel with this name already exists' : ''}\n >\n <Input\n id=\"share-panel-library-panel-name-input\"\n name=\"name\"\n value={panelName}\n onChange={(e) => setPanelName(e.currentTarget.value)}\n />\n </Field>\n <Field label=\"Save in folder\" description=\"Library panel permissions are derived from the folder permissions\">\n <FolderPicker\n onChange={({ id }) => setFolderId(id)}\n initialFolderId={initialFolderId}\n inputId=\"share-panel-library-panel-folder-picker\"\n />\n </Field>\n\n <Modal.ButtonRow>\n <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n Cancel\n </Button>\n <Button onClick={onCreate} disabled={invalidInput}>\n Create library panel\n </Button>\n </Modal.ButtonRow>\n </>\n );\n};\n\ninterface Props extends AddLibraryPanelContentsProps {\n isOpen?: boolean;\n}\n\nexport const AddLibraryPanelModal: React.FC<Props> = ({ isOpen = false, panel, initialFolderId, ...props }) => {\n return (\n <Modal title=\"Create library panel\" isOpen={isOpen} onDismiss={props.onDismiss}>\n <AddLibraryPanelContents panel={panel} initialFolderId={initialFolderId} onDismiss={props.onDismiss} />\n </Modal>\n );\n};\n","import React from 'react';\n\nimport { ConfirmModal } from '@grafana/ui';\n\ninterface Props {\n isOpen: boolean;\n onConfirm: () => void;\n onDismiss: () => void;\n}\n\nexport const UnlinkModal: React.FC<Props> = ({ isOpen, onConfirm, onDismiss }) => {\n return (\n <ConfirmModal\n title=\"Do you really want to unlink this panel?\"\n icon=\"question-circle\"\n body=\"If you unlink this panel, you will be able to edit it without affecting any other dashboards.\n However, once you make a change you will not be able to revert to its original reusable panel.\"\n confirmText=\"Yes, unlink\"\n onConfirm={() => {\n onConfirm();\n onDismiss();\n }}\n onDismiss={onDismiss}\n isOpen={isOpen}\n />\n );\n};\n","import { PanelModel } from '../dashboard/state';\n\nimport { PanelModelWithLibraryPanel } from './types';\n\nexport function isPanelModelLibraryPanel(panel: PanelModel): panel is PanelModelWithLibraryPanel {\n return Boolean(panel.libraryPanel?.uid);\n}\n","import { lastValueFrom } from 'rxjs';\n\nimport { getBackendSrv } from '../../../core/services/backend_srv';\nimport { DashboardSearchHit } from '../../search/types';\nimport {\n LibraryElementConnectionDTO,\n LibraryElementDTO,\n LibraryElementKind,\n LibraryElementsSearchResult,\n PanelModelWithLibraryPanel,\n} from '../types';\n\nexport interface GetLibraryPanelsOptions {\n searchString?: string;\n perPage?: number;\n page?: number;\n excludeUid?: string;\n sortDirection?: string;\n typeFilter?: string[];\n folderFilter?: string[];\n}\n\nexport async function getLibraryPanels({\n searchString = '',\n perPage = 100,\n page = 1,\n excludeUid = '',\n sortDirection = '',\n typeFilter = [],\n folderFilter = [],\n}: GetLibraryPanelsOptions = {}): Promise<LibraryElementsSearchResult> {\n const params = new URLSearchParams();\n params.append('searchString', searchString);\n params.append('sortDirection', sortDirection);\n params.append('typeFilter', typeFilter.join(','));\n params.append('folderFilter', folderFilter.join(','));\n params.append('excludeUid', excludeUid);\n params.append('perPage', perPage.toString(10));\n params.append('page', page.toString(10));\n params.append('kind', LibraryElementKind.Panel.toString(10));\n\n const { result } = await getBackendSrv().get<{ result: LibraryElementsSearchResult }>(\n `/api/library-elements?${params.toString()}`\n );\n return result;\n}\n\nexport async function getLibraryPanel(uid: string, isHandled = false): Promise<LibraryElementDTO> {\n const response = await lastValueFrom(\n getBackendSrv().fetch<{ result: LibraryElementDTO }>({\n method: 'GET',\n url: `/api/library-elements/${uid}`,\n showSuccessAlert: !isHandled,\n showErrorAlert: !isHandled,\n })\n );\n return response.data.result;\n}\n\nexport async function getLibraryPanelByName(name: string): Promise<LibraryElementDTO[]> {\n const { result } = await getBackendSrv().get<{ result: LibraryElementDTO[] }>(`/api/library-elements/name/${name}`);\n return result;\n}\n\nexport async function addLibraryPanel(\n panelSaveModel: PanelModelWithLibraryPanel,\n folderId: number\n): Promise<LibraryElementDTO> {\n const { result } = await getBackendSrv().post(`/api/library-elements`, {\n folderId,\n name: panelSaveModel.libraryPanel.name,\n model: panelSaveModel,\n kind: LibraryElementKind.Panel,\n });\n return result;\n}\n\nexport async function updateLibraryPanel(panelSaveModel: PanelModelWithLibraryPanel): Promise<LibraryElementDTO> {\n const { uid, name, version } = panelSaveModel.libraryPanel;\n const kind = LibraryElementKind.Panel;\n const model = panelSaveModel;\n const { result } = await getBackendSrv().patch(`/api/library-elements/${uid}`, {\n name,\n model,\n version,\n kind,\n });\n return result;\n}\n\nexport function deleteLibraryPanel(uid: string): Promise<{ message: string }> {\n return getBackendSrv().delete(`/api/library-elements/${uid}`);\n}\n\nexport async function getLibraryPanelConnectedDashboards(\n libraryPanelUid: string\n): Promise<LibraryElementConnectionDTO[]> {\n const { result } = await getBackendSrv().get<{ result: LibraryElementConnectionDTO[] }>(\n `/api/library-elements/${libraryPanelUid}/connections`\n );\n return result;\n}\n\nexport async function getConnectedDashboards(uid: string): Promise<DashboardSearchHit[]> {\n const connections = await getLibraryPanelConnectedDashboards(uid);\n if (connections.length === 0) {\n return [];\n }\n\n const searchHits = await getBackendSrv().search({ dashboardIds: connections.map((c) => c.connectionId) });\n return searchHits;\n}\n","import { AnyAction } from '@reduxjs/toolkit';\nimport { Dispatch } from 'react';\n\nimport { PanelModel } from '../dashboard/state';\n\nexport enum LibraryElementKind {\n Panel = 1,\n Variable,\n}\n\nexport enum LibraryElementConnectionKind {\n Dashboard = 1,\n}\n\nexport interface LibraryElementConnectionDTO {\n id: number;\n kind: LibraryElementConnectionKind;\n elementId: number;\n connectionId: number;\n created: string;\n createdBy: LibraryElementDTOMetaUser;\n}\n\nexport interface LibraryElementsSearchResult {\n totalCount: number;\n elements: LibraryElementDTO[];\n perPage: number;\n page: number;\n}\n\nexport interface LibraryElementDTO {\n id: number;\n orgId: number;\n folderId: number;\n uid: string;\n name: string;\n kind: LibraryElementKind;\n type: string;\n description: string;\n model: any;\n version: number;\n meta: LibraryElementDTOMeta;\n}\n\nexport interface LibraryElementDTOMeta {\n folderName: string;\n folderUid: string;\n connectedDashboards: number;\n created: string;\n updated: string;\n createdBy: LibraryElementDTOMetaUser;\n updatedBy: LibraryElementDTOMetaUser;\n}\n\nexport interface LibraryElementDTOMetaUser {\n id: number;\n name: string;\n avatarUrl: string;\n}\n\nexport type PanelModelLibraryPanel = Pick<LibraryElementDTO, 'uid' | 'name' | 'meta' | 'version'>;\n\nexport interface PanelModelWithLibraryPanel extends PanelModel {\n libraryPanel: PanelModelLibraryPanel;\n}\n\nexport type DispatchResult = (dispatch: Dispatch<AnyAction>) => void;\n","import { createErrorNotification, createSuccessNotification } from '../../core/copy/appNotification';\nimport { AppNotification } from '../../types';\nimport { PanelModel } from '../dashboard/state';\n\nimport { addLibraryPanel, updateLibraryPanel } from './state/api';\nimport { LibraryElementDTO, PanelModelLibraryPanel } from './types';\n\nexport function createPanelLibraryErrorNotification(message: string): AppNotification {\n return createErrorNotification(message);\n}\n\nexport function createPanelLibrarySuccessNotification(message: string): AppNotification {\n return createSuccessNotification(message);\n}\n\nexport function toPanelModelLibraryPanel(libraryPanelDto: LibraryElementDTO): PanelModelLibraryPanel {\n const { uid, name, meta, version } = libraryPanelDto;\n return { uid, name, meta, version };\n}\n\nexport async function saveAndRefreshLibraryPanel(panel: PanelModel, folderId: number): Promise<LibraryElementDTO> {\n const panelSaveModel = toPanelSaveModel(panel);\n const savedPanel = await saveOrUpdateLibraryPanel(panelSaveModel, folderId);\n updatePanelModelWithUpdate(panel, savedPanel);\n return savedPanel;\n}\n\nfunction toPanelSaveModel(panel: PanelModel): any {\n let panelSaveModel = panel.getSaveModel();\n panelSaveModel = {\n libraryPanel: {\n name: panel.title,\n uid: undefined,\n },\n ...panelSaveModel,\n };\n\n return panelSaveModel;\n}\n\nfunction updatePanelModelWithUpdate(panel: PanelModel, updated: LibraryElementDTO): void {\n panel.restoreModel({\n ...updated.model,\n configRev: 0, // reset config rev, since changes have been saved\n libraryPanel: toPanelModelLibraryPanel(updated),\n title: panel.title,\n });\n panel.refresh();\n}\n\nfunction saveOrUpdateLibraryPanel(panel: any, folderId: number): Promise<LibraryElementDTO> {\n if (!panel.libraryPanel) {\n return Promise.reject();\n }\n\n if (panel.libraryPanel && panel.libraryPanel.uid === undefined) {\n return addLibraryPanel(panel, folderId!);\n }\n\n return updateLibraryPanel(panel);\n}\n","import { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\n\nimport { isFetchError } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport { PanelModel } from 'app/features/dashboard/state';\n\nimport {\n createPanelLibraryErrorNotification,\n createPanelLibrarySuccessNotification,\n saveAndRefreshLibraryPanel,\n} from '../utils';\n\nexport const usePanelSave = () => {\n const dispatch = useDispatch();\n const [state, saveLibraryPanel] = useAsyncFn(async (panel: PanelModel, folderId: number) => {\n try {\n return await saveAndRefreshLibraryPanel(panel, folderId);\n } catch (err) {\n if (isFetchError(err)) {\n err.isHandled = true;\n throw new Error(err.data.message);\n }\n throw err;\n }\n }, []);\n\n useEffect(() => {\n if (state.error) {\n dispatch(notifyApp(createPanelLibraryErrorNotification(`Error saving library panel: \"${state.error.message}\"`)));\n }\n if (state.value) {\n dispatch(notifyApp(createPanelLibrarySuccessNotification('Library panel saved')));\n }\n }, [dispatch, state]);\n\n return { state, saveLibraryPanel };\n};\n","export enum DashboardEventAction {\n Saved = 'saved',\n EditingStarted = 'editing-started', // Sent when someone (who can save!) opens the editor\n EditingCanceled = 'editing-cancelled', // Sent when someone discards changes, or unsubscribes while editing\n Deleted = 'deleted',\n}\n\nexport interface DashboardEvent {\n uid: string;\n action: DashboardEventAction;\n userId?: number;\n message?: string;\n sessionId?: string;\n timestamp?: number;\n}\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Modal, stylesFactory } from '@grafana/ui';\n\nimport { dashboardWatcher } from './dashboardWatcher';\nimport { DashboardEvent, DashboardEventAction } from './types';\n\ninterface Props {\n event?: DashboardEvent;\n}\n\ninterface State {\n dismiss?: boolean;\n}\n\ninterface ActionInfo {\n label: string;\n description: string;\n action: () => void;\n}\n\nexport class DashboardChangedModal extends PureComponent<Props, State> {\n state: State = {};\n\n discardAndReload: ActionInfo = {\n label: 'Discard local changes',\n description: 'Load the latest saved version for this dashboard',\n action: () => {\n dashboardWatcher.reloadPage();\n this.onDismiss();\n },\n };\n\n continueEditing: ActionInfo = {\n label: 'Continue editing',\n description:\n 'Keep your local changes and continue editing. Note: when you save, this will overwrite the most recent chages',\n action: () => {\n this.onDismiss();\n },\n };\n\n acceptDelete: ActionInfo = {\n label: 'Discard Local changes',\n description: 'view grafana homepage',\n action: () => {\n // Navigate to the root URL\n document.location.href = config.appUrl;\n },\n };\n\n onDismiss = () => {\n this.setState({ dismiss: true });\n };\n\n render() {\n const { event } = this.props;\n const { dismiss } = this.state;\n const styles = getStyles(config.theme);\n\n const isDelete = event?.action === DashboardEventAction.Deleted;\n\n const options = isDelete\n ? [this.continueEditing, this.acceptDelete]\n : [this.continueEditing, this.discardAndReload];\n\n return (\n <Modal\n isOpen={!dismiss}\n title=\"Dashboard Changed\"\n icon=\"copy\"\n onDismiss={this.onDismiss}\n onClickBackdrop={() => {}}\n className={styles.modal}\n >\n <div>\n {isDelete ? (\n <div>This dashboard has been deleted by another session</div>\n ) : (\n <div>This dashboard has been modifed by another session</div>\n )}\n <br />\n {options.map((opt) => {\n return (\n <div key={opt.label} onClick={opt.action} className={styles.radioItem}>\n <h3>{opt.label}</h3>\n {opt.description}\n </div>\n );\n })}\n <br />\n </div>\n </Modal>\n );\n }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n modal: css`\n width: 500px;\n `,\n radioItem: css`\n margin: 0;\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.textWeak};\n padding: 10px;\n cursor: pointer;\n width: 100%;\n\n &:hover {\n background: ${theme.colors.bgBlue1};\n color: ${theme.colors.text};\n }\n `,\n };\n});\n","import { Unsubscribable } from 'rxjs';\n\nimport {\n AppEvents,\n isLiveChannelMessageEvent,\n isLiveChannelStatusEvent,\n LiveChannelAddress,\n LiveChannelConnectionState,\n LiveChannelEvent,\n LiveChannelScope,\n} from '@grafana/data';\nimport { getGrafanaLiveSrv, locationService } from '@grafana/runtime';\nimport { appEvents, contextSrv } from 'app/core/core';\nimport { sessionId } from 'app/features/live';\n\nimport { ShowModalReactEvent } from '../../../types/events';\nimport { getDashboardSrv } from '../../dashboard/services/DashboardSrv';\n\nimport { DashboardChangedModal } from './DashboardChangedModal';\nimport { DashboardEvent, DashboardEventAction } from './types';\n\nclass DashboardWatcher {\n channel?: LiveChannelAddress; // path to the channel\n uid?: string;\n ignoreSave?: boolean;\n editing = false;\n lastEditing?: DashboardEvent;\n subscription?: Unsubscribable;\n hasSeenNotice?: boolean;\n\n setEditingState(state: boolean) {\n const changed = (this.editing = state);\n this.editing = state;\n this.hasSeenNotice = false;\n\n if (changed && contextSrv.isEditor) {\n this.sendEditingState();\n }\n }\n\n private sendEditingState() {\n const { channel, uid } = this;\n if (channel && uid) {\n getGrafanaLiveSrv().publish(channel, {\n sessionId,\n uid,\n action: this.editing ? DashboardEventAction.EditingStarted : DashboardEventAction.EditingCanceled,\n timestamp: Date.now(),\n });\n }\n }\n\n watch(uid: string) {\n const live = getGrafanaLiveSrv();\n if (!live) {\n return;\n }\n\n // Check for changes\n if (uid !== this.uid) {\n this.channel = {\n scope: LiveChannelScope.Grafana,\n namespace: 'dashboard',\n path: `uid/${uid}`,\n };\n this.leave();\n if (uid) {\n this.subscription = live.getStream<DashboardEvent>(this.channel).subscribe(this.observer);\n }\n this.uid = uid;\n }\n }\n\n leave() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n this.subscription = undefined;\n this.uid = undefined;\n }\n\n ignoreNextSave() {\n this.ignoreSave = true;\n }\n\n getRecentEditingEvent() {\n if (this.lastEditing && this.lastEditing.timestamp) {\n const elapsed = Date.now() - this.lastEditing.timestamp;\n if (elapsed > 5000) {\n this.lastEditing = undefined;\n }\n }\n return this.lastEditing;\n }\n\n observer = {\n next: (event: LiveChannelEvent<DashboardEvent>) => {\n // Send the editing state when connection starts\n if (isLiveChannelStatusEvent(event) && this.editing && event.state === LiveChannelConnectionState.Connected) {\n this.sendEditingState();\n }\n\n if (isLiveChannelMessageEvent(event)) {\n if (event.message.sessionId === sessionId) {\n return; // skip internal messages\n }\n\n const { action } = event.message;\n switch (action) {\n case DashboardEventAction.EditingStarted:\n case DashboardEventAction.Saved: {\n if (this.ignoreSave) {\n this.ignoreSave = false;\n return;\n }\n\n const dash = getDashboardSrv().getCurrent();\n if (dash?.uid !== event.message.uid) {\n console.log('dashboard event for different dashboard?', event, dash);\n return;\n }\n\n const showPopup = this.editing || dash.hasUnsavedChanges();\n\n if (action === DashboardEventAction.Saved) {\n if (showPopup) {\n appEvents.publish(\n new ShowModalReactEvent({\n component: DashboardChangedModal,\n props: { event },\n })\n );\n } else {\n appEvents.emit(AppEvents.alertSuccess, ['Dashboard updated']);\n this.reloadPage();\n }\n } else if (showPopup) {\n if (action === DashboardEventAction.EditingStarted && !this.hasSeenNotice) {\n const editingEvent = event.message;\n const recent = this.getRecentEditingEvent();\n if (!recent || recent.message !== editingEvent.message) {\n this.hasSeenNotice = true;\n appEvents.emit(AppEvents.alertWarning, [\n 'Another session is editing this dashboard',\n editingEvent.message,\n ]);\n }\n this.lastEditing = editingEvent;\n }\n }\n return;\n }\n }\n }\n },\n };\n\n reloadPage() {\n locationService.reload();\n }\n}\n\nexport const dashboardWatcher = new DashboardWatcher();\n","import {\n ArrayVector,\n DataFrame,\n DataFrameJSON,\n decodeFieldValueEntities,\n Field,\n FieldDTO,\n FieldSchema,\n FieldType,\n guessFieldTypeFromValue,\n Labels,\n parseLabels,\n QueryResultMeta,\n toFilteredDataFrameDTO,\n} from '@grafana/data';\nimport { join } from '@grafana/data/src/transformations/transformers/joinDataFrames';\nimport { StreamingFrameAction, StreamingFrameOptions } from '@grafana/runtime/src/services/live';\nimport { renderLegendFormat } from 'app/plugins/datasource/prometheus/legend';\nimport { AlignedData } from 'uplot';\n\n/**\n * Stream packet info is attached to StreamingDataFrames and indicate how many\n * rows were added to the end of the frame. The number of discarded rows can be\n * calculated from previous state\n */\nexport interface StreamPacketInfo {\n number: number;\n action: StreamingFrameAction;\n length: number;\n schemaChanged: boolean;\n}\n\nconst PROM_STYLE_METRIC_LABEL = '__name__';\n\nenum PushMode {\n wide,\n labels,\n // long\n}\n\nexport type SerializedStreamingDataFrame = {\n name?: string;\n fields: FieldDTO[];\n refId?: string;\n meta: QueryResultMeta;\n schemaFields: FieldSchema[];\n timeFieldIndex: number;\n pushMode: PushMode;\n length: number;\n packetInfo: StreamPacketInfo;\n options: StreamingFrameOptions;\n labels: Set<string>;\n};\n\n/**\n * Unlike a circular buffer, this will append and periodically slice the front\n */\nexport class StreamingDataFrame implements DataFrame {\n name?: string;\n refId?: string;\n meta: QueryResultMeta = {};\n\n fields: Array<Field<any, ArrayVector<any>>> = [];\n length = 0;\n\n private schemaFields: FieldSchema[] = [];\n private timeFieldIndex = -1;\n private pushMode = PushMode.wide;\n\n // current labels\n private labels: Set<string> = new Set();\n readonly packetInfo: StreamPacketInfo = {\n schemaChanged: true,\n number: 0,\n action: StreamingFrameAction.Replace,\n length: 0,\n };\n\n private constructor(public options: StreamingFrameOptions) {\n // Get Length to show up if you use spread\n Object.defineProperty(this, 'length', {\n enumerable: true,\n });\n\n // Get fields to show up if you use spread\n Object.defineProperty(this, 'fields', {\n enumerable: true,\n });\n }\n\n serialize = (\n fieldPredicate?: (f: Field) => boolean,\n optionsOverride?: Partial<StreamingFrameOptions>,\n trimValues?: {\n maxLength?: number;\n }\n ): SerializedStreamingDataFrame => {\n const options = optionsOverride ? Object.assign({}, { ...this.options, ...optionsOverride }) : this.options;\n const dataFrameDTO = toFilteredDataFrameDTO(this, fieldPredicate);\n\n const numberOfItemsToRemove = getNumberOfItemsToRemove(\n dataFrameDTO.fields.map((f) => f.values) as unknown[][],\n typeof trimValues?.maxLength === 'number' ? Math.min(trimValues.maxLength, options.maxLength) : options.maxLength,\n this.timeFieldIndex,\n options.maxDelta\n );\n\n dataFrameDTO.fields = dataFrameDTO.fields.map((f) => ({\n ...f,\n values: (f.values as unknown[]).slice(numberOfItemsToRemove),\n }));\n\n return {\n ...dataFrameDTO,\n // TODO: Labels and schema are not filtered by field\n labels: this.labels,\n schemaFields: this.schemaFields,\n\n name: this.name,\n refId: this.refId,\n meta: this.meta,\n length: this.length,\n timeFieldIndex: this.timeFieldIndex,\n pushMode: this.pushMode,\n packetInfo: this.packetInfo,\n options,\n };\n };\n\n private initFromSerialized = (serialized: Omit<SerializedStreamingDataFrame, 'options'>) => {\n this.name = serialized.name;\n this.refId = serialized.refId;\n this.meta = serialized.meta;\n this.length = serialized.length;\n this.labels = serialized.labels;\n this.schemaFields = serialized.schemaFields;\n this.timeFieldIndex = serialized.timeFieldIndex;\n this.pushMode = serialized.pushMode;\n this.packetInfo.length = serialized.packetInfo.length;\n this.packetInfo.number = serialized.packetInfo.number;\n this.packetInfo.action = StreamingFrameAction.Replace;\n this.packetInfo.schemaChanged = true;\n this.fields = serialized.fields.map((f) => ({\n ...f,\n type: f.type ?? FieldType.other,\n config: f.config ?? {},\n values: Array.isArray(f.values) ? new ArrayVector(f.values) : new ArrayVector(),\n }));\n\n assureValuesAreWithinLengthLimit(\n this.fields.map((f) => f.values.buffer),\n this.options.maxLength,\n this.timeFieldIndex,\n this.options.maxDelta\n );\n };\n\n static deserialize = (serialized: SerializedStreamingDataFrame) => {\n const frame = new StreamingDataFrame(serialized.options);\n frame.initFromSerialized(serialized);\n return frame;\n };\n\n static empty = (opts?: Partial<StreamingFrameOptions>): StreamingDataFrame =>\n new StreamingDataFrame(getStreamingFrameOptions(opts));\n\n static fromDataFrameJSON = (frame: DataFrameJSON, opts?: Partial<StreamingFrameOptions>): StreamingDataFrame => {\n const streamingDataFrame = new StreamingDataFrame(getStreamingFrameOptions(opts));\n streamingDataFrame.push(frame);\n return streamingDataFrame;\n };\n\n private get alwaysReplace() {\n return this.options.action === StreamingFrameAction.Replace;\n }\n\n needsResizing = ({ maxLength, maxDelta }: StreamingFrameOptions) => {\n const needsMoreLength = maxLength && this.options.maxLength < maxLength;\n const needsBiggerDelta = maxDelta && this.options.maxDelta < maxDelta;\n const needsToOverrideDefaultInfinityDelta = maxDelta && this.options.maxDelta === Infinity;\n return Boolean(needsMoreLength || needsBiggerDelta || needsToOverrideDefaultInfinityDelta);\n };\n\n resize = ({ maxLength, maxDelta }: Partial<StreamingFrameOptions>) => {\n if (maxDelta) {\n if (this.options.maxDelta === Infinity) {\n this.options.maxDelta = maxDelta;\n } else {\n this.options.maxDelta = Math.max(maxDelta, this.options.maxDelta);\n }\n }\n this.options.maxLength = Math.max(this.options.maxLength, maxLength ?? 0);\n };\n\n /**\n * apply the new message to the existing data. This will replace the existing schema\n * if a new schema is included in the message, or append data matching the current schema\n */\n push(msg: DataFrameJSON): StreamPacketInfo {\n const { schema, data } = msg;\n\n this.packetInfo.number++;\n this.packetInfo.length = 0;\n this.packetInfo.schemaChanged = false;\n\n if (schema) {\n this.pushMode = PushMode.wide;\n this.timeFieldIndex = schema.fields.findIndex((f) => f.type === FieldType.time);\n const firstField = schema.fields[0];\n if (\n this.timeFieldIndex === 1 &&\n firstField.type === FieldType.string &&\n (firstField.name === 'labels' || firstField.name === 'Labels')\n ) {\n this.pushMode = PushMode.labels;\n this.timeFieldIndex = 0; // after labels are removed!\n }\n\n const niceSchemaFields = this.pushMode === PushMode.labels ? schema.fields.slice(1) : schema.fields;\n\n this.refId = schema.refId;\n if (schema.meta) {\n this.meta = { ...schema.meta };\n }\n\n const { displayNameFormat } = this.options;\n if (hasSameStructure(this.schemaFields, niceSchemaFields)) {\n const len = niceSchemaFields.length;\n this.fields.forEach((f, idx) => {\n const sf = niceSchemaFields[idx % len];\n f.config = sf.config ?? {};\n f.labels = sf.labels;\n });\n if (displayNameFormat) {\n this.fields.forEach((f) => {\n const labels = { [PROM_STYLE_METRIC_LABEL]: f.name, ...f.labels };\n f.config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n });\n }\n } else {\n this.packetInfo.schemaChanged = true;\n const isWide = this.pushMode === PushMode.wide;\n this.fields = niceSchemaFields.map((f) => {\n const config = f.config ?? {};\n if (displayNameFormat) {\n const labels = { [PROM_STYLE_METRIC_LABEL]: f.name, ...f.labels };\n config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n }\n return {\n config,\n name: f.name,\n labels: f.labels,\n type: f.type ?? FieldType.other,\n // transfer old values by type & name, unless we relied on labels to match fields\n values: isWide\n ? this.fields.find((of) => of.name === f.name && f.type === of.type)?.values ??\n new ArrayVector(Array(this.length).fill(undefined))\n : new ArrayVector(),\n };\n });\n }\n\n this.schemaFields = niceSchemaFields;\n }\n\n if (data && data.values.length && data.values[0].length) {\n let { values, entities } = data;\n\n if (entities) {\n entities.forEach((ents, i) => {\n if (ents) {\n decodeFieldValueEntities(ents, values[i]);\n // TODO: append replacements to field\n }\n });\n }\n\n if (this.pushMode === PushMode.labels) {\n // augment and transform data to match current schema for standard circPush() path\n const labeledTables = transpose(values);\n\n // make sure fields are initalized for each label\n for (const label of labeledTables.keys()) {\n if (!this.labels.has(label)) {\n this.packetInfo.schemaChanged = true;\n this.addLabel(label);\n }\n }\n\n // TODO: cache higher up\n let dummyTable = Array(this.schemaFields.length).fill([]);\n\n let tables: AlignedData[] = [];\n this.labels.forEach((label) => {\n tables.push(labeledTables.get(label) ?? dummyTable);\n });\n\n values = join(tables);\n }\n\n if (values.length !== this.fields.length) {\n if (this.fields.length) {\n throw new Error(\n `push message mismatch. Expected: ${this.fields.length}, received: ${values.length} (labels=${\n this.pushMode === PushMode.labels\n })`\n );\n }\n\n this.fields = values.map((vals, idx) => {\n let name = `Field ${idx}`;\n let type = guessFieldTypeFromValue(vals[0]);\n const isTime = idx === 0 && type === FieldType.number && vals[0] > 1600016688632;\n if (isTime) {\n type = FieldType.time;\n name = 'Time';\n }\n\n return {\n name,\n type,\n config: {},\n values: new ArrayVector([]),\n };\n });\n }\n\n let appended = values;\n this.packetInfo.length = values[0].length;\n\n if (this.alwaysReplace || !this.length) {\n this.packetInfo.action = StreamingFrameAction.Replace;\n } else {\n this.packetInfo.action = StreamingFrameAction.Append;\n\n // mutates appended\n appended = this.fields.map((f) => f.values.buffer);\n circPush(appended, values, this.options.maxLength, this.timeFieldIndex, this.options.maxDelta);\n }\n\n appended.forEach((v, i) => {\n const { state, values } = this.fields[i];\n values.buffer = v;\n if (state) {\n state.calcs = undefined;\n }\n });\n\n // Update the frame length\n this.length = appended[0].length;\n }\n\n return {\n ...this.packetInfo,\n };\n }\n\n pushNewValues = (values: unknown[][]) => {\n if (!values?.length) {\n return;\n }\n\n this.packetInfo.action = this.options.action;\n this.packetInfo.number++;\n this.packetInfo.length = values[0].length;\n this.packetInfo.schemaChanged = false;\n\n if (this.options.action === StreamingFrameAction.Append) {\n circPush(\n this.fields.map((f) => f.values.buffer),\n values,\n this.options.maxLength,\n this.timeFieldIndex,\n this.options.maxDelta\n );\n } else {\n values.forEach((v, i) => {\n if (this.fields[i]?.values) {\n this.fields[i].values.buffer = v;\n }\n });\n\n assureValuesAreWithinLengthLimit(\n this.fields.map((f) => f.values.buffer),\n this.options.maxLength,\n this.timeFieldIndex,\n this.options.maxDelta\n );\n }\n const newLength = this.fields?.[0]?.values?.buffer?.length;\n if (newLength !== undefined) {\n this.length = newLength;\n }\n };\n\n resetStateCalculations = () => {\n this.fields.forEach((f) => {\n f.state = {\n ...(f.state ?? {}),\n calcs: undefined,\n range: undefined,\n };\n });\n };\n\n getMatchingFieldIndexes = (fieldPredicate: (f: Field) => boolean): number[] =>\n this.fields\n .map((f, index) => (fieldPredicate(f) ? index : undefined))\n .filter((val) => val !== undefined) as number[];\n\n getValuesFromLastPacket = (): unknown[][] =>\n this.fields.map((f) => {\n const values = f.values.buffer;\n return values.slice(Math.max(values.length - this.packetInfo.length));\n });\n\n hasAtLeastOnePacket = () => Boolean(this.packetInfo.length);\n\n // adds a set of fields for a new label\n private addLabel(label: string) {\n const { displayNameFormat } = this.options;\n const labelCount = this.labels.size;\n\n // parse labels\n const parsedLabels = parseLabelsFromField(label);\n\n if (labelCount === 0) {\n // mutate existing fields and add labels\n this.fields.forEach((f, i) => {\n if (i > 0) {\n f.labels = parsedLabels;\n if (displayNameFormat) {\n const labels = { [PROM_STYLE_METRIC_LABEL]: f.name, ...parsedLabels };\n f.config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n }\n }\n });\n } else {\n for (let i = 1; i < this.schemaFields.length; i++) {\n let proto = this.schemaFields[i] as Field;\n const config = proto.config ?? {};\n if (displayNameFormat) {\n const labels = { [PROM_STYLE_METRIC_LABEL]: proto.name, ...parsedLabels };\n config.displayNameFromDS = renderLegendFormat(displayNameFormat, labels);\n }\n this.fields.push({\n ...proto,\n config,\n labels: parsedLabels,\n values: new ArrayVector(Array(this.length).fill(undefined)),\n });\n }\n }\n\n this.labels.add(label);\n }\n\n getOptions = (): Readonly<StreamingFrameOptions> => this.options;\n}\n\nexport function getStreamingFrameOptions(opts?: Partial<StreamingFrameOptions>): StreamingFrameOptions {\n return {\n maxLength: opts?.maxLength ?? 1000,\n maxDelta: opts?.maxDelta ?? Infinity,\n action: opts?.action ?? StreamingFrameAction.Append,\n displayNameFormat: opts?.displayNameFormat,\n };\n}\n\n// converts vertical insertion records with table keys in [0] and column values in [1...N]\n// to join()-able tables with column arrays\nexport function transpose(vrecs: any[][]) {\n let tableKeys = new Set(vrecs[0]);\n let tables = new Map();\n\n tableKeys.forEach((key) => {\n let cols = Array(vrecs.length - 1)\n .fill(null)\n .map(() => []);\n\n tables.set(key, cols);\n });\n\n for (let r = 0; r < vrecs[0].length; r++) {\n let table = tables.get(vrecs[0][r]);\n for (let c = 1; c < vrecs.length; c++) {\n table[c - 1].push(vrecs[c][r]);\n }\n }\n\n return tables;\n}\n\n// binary search for index of closest value\nexport function closestIdx(num: number, arr: number[], lo?: number, hi?: number) {\n let mid;\n lo = lo || 0;\n hi = hi || arr.length - 1;\n let bitwise = hi <= 2147483647;\n\n while (hi - lo > 1) {\n mid = bitwise ? (lo + hi) >> 1 : Math.floor((lo + hi) / 2);\n\n if (arr[mid] < num) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n\n if (num - arr[lo] <= arr[hi] - num) {\n return lo;\n }\n\n return hi;\n}\n\nexport function parseLabelsFromField(str: string): Labels {\n if (!str.length) {\n return {};\n }\n if (str.charAt(0) === '{') {\n return parseLabels(str);\n }\n const parsedLabels: Labels = {};\n str.split(',').forEach((kv) => {\n const [key, val] = kv.trim().split('=');\n parsedLabels[key] = val;\n });\n return parsedLabels;\n}\n\n/**\n * @internal // not exported in yet\n */\nexport function getLastStreamingDataFramePacket(frame: DataFrame) {\n const pi = (frame as StreamingDataFrame).packetInfo;\n return pi?.action ? pi : undefined;\n}\n\n// mutable circular push\nfunction circPush(data: unknown[][], newData: unknown[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) {\n for (let i = 0; i < data.length; i++) {\n for (let k = 0; k < newData[i].length; k++) {\n data[i].push(newData[i][k]);\n }\n }\n\n return assureValuesAreWithinLengthLimit(data, maxLength, deltaIdx, maxDelta);\n}\n\nfunction assureValuesAreWithinLengthLimit(data: unknown[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) {\n const count = getNumberOfItemsToRemove(data, maxLength, deltaIdx, maxDelta);\n\n if (count) {\n for (let i = 0; i < data.length; i++) {\n data[i].splice(0, count);\n }\n }\n\n return count;\n}\n\nfunction getNumberOfItemsToRemove(data: unknown[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) {\n if (!data[0]?.length) {\n return 0;\n }\n\n const nlen = data[0].length;\n\n let sliceIdx = 0;\n\n if (nlen > maxLength) {\n sliceIdx = nlen - maxLength;\n }\n\n if (maxDelta !== Infinity && deltaIdx >= 0) {\n const deltaLookup = data[deltaIdx] as number[];\n\n const low = deltaLookup[sliceIdx];\n const high = deltaLookup[nlen - 1];\n\n if (high - low > maxDelta) {\n sliceIdx = closestIdx(high - maxDelta, deltaLookup, sliceIdx);\n }\n }\n\n return sliceIdx;\n}\n\nfunction hasSameStructure(a: FieldSchema[], b: FieldSchema[]): boolean {\n if (a?.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n const fA = a[i];\n const fB = b[i];\n if (fA.name !== fB.name || fA.type !== fB.type) {\n return false;\n }\n }\n return true;\n}\n","import { DataQueryResponseData, isDataFrame } from '@grafana/data';\nimport { StreamingDataFrame } from './StreamingDataFrame';\n\n/**\n * @alpha -- experimental\n */\nexport enum StreamingResponseDataType {\n NewValuesSameSchema = 'NewValuesSameSchema',\n FullFrame = 'FullFrame',\n}\n\n/**\n * @alpha -- experimental\n */\nexport type StreamingResponseDataTypeToData = {\n [StreamingResponseDataType.NewValuesSameSchema]: {\n values: unknown[][];\n };\n [StreamingResponseDataType.FullFrame]: {\n frame: ReturnType<StreamingDataFrame['serialize']>;\n };\n};\n\n/**\n * @alpha -- experimental\n */\nexport type StreamingResponseData<T = StreamingResponseDataType> = T extends StreamingResponseDataType\n ? {\n type: T;\n } & StreamingResponseDataTypeToData[T]\n : never;\n\n/**\n * @alpha -- experimental\n */\nexport const isStreamingResponseData = <T extends StreamingResponseDataType>(\n responseData: DataQueryResponseData,\n type: T\n): responseData is StreamingResponseData<T> => 'type' in responseData && responseData.type === type;\n\nconst AllStreamingResponseDataTypes = Object.values(StreamingResponseDataType);\n\n/**\n * @alpha -- experimental\n */\nexport const isAnyStreamingResponseData = (\n responseData: DataQueryResponseData\n): responseData is StreamingResponseData =>\n 'type' in responseData && AllStreamingResponseDataTypes.includes(responseData.type);\n\n/**\n * @alpha -- experimental\n */\nexport const isStreamingDataFrame = (data: DataQueryResponseData): data is StreamingDataFrame =>\n isDataFrame(data) && 'packetInfo' in data;\n","import * as comlink from 'comlink';\nimport { from, Observable, switchMap } from 'rxjs';\n\nexport const remoteObservableAsObservable = <T>(remoteObs: comlink.RemoteObject<Observable<T>>): Observable<T> =>\n new Observable((subscriber) => {\n // Passing the callbacks as 3 separate arguments is deprecated, but it's the only option for now\n //\n // RxJS recreates the functions via `Function.bind` https://github.com/ReactiveX/rxjs/blob/62aca850a37f598b5db6085661e0594b81ec4281/src/internal/Subscriber.ts#L169\n // and thus erases the ProxyMarker created via comlink.proxy(fN) when the callbacks\n // are grouped together in a Observer object (ie. { next: (v) => ..., error: (err) => ..., complete: () => ... })\n //\n // solution: TBD (autoproxy all functions?)\n const remoteSubPromise = remoteObs.subscribe(\n comlink.proxy((nextValueInRemoteObs: T) => {\n subscriber.next(nextValueInRemoteObs);\n }),\n comlink.proxy((err) => {\n subscriber.error(err);\n }),\n comlink.proxy(() => {\n subscriber.complete();\n })\n );\n return {\n unsubscribe: () => {\n remoteSubPromise.then((remoteSub) => remoteSub.unsubscribe());\n },\n };\n });\n\nexport const promiseWithRemoteObservableAsObservable = <T>(\n promiseWithProxyObservable: Promise<comlink.RemoteObject<Observable<T>>>\n): Observable<T> => from(promiseWithProxyObservable).pipe(switchMap((val) => remoteObservableAsObservable(val)));\n","import './transferHandlers';\n\nimport * as comlink from 'comlink';\nimport { asyncScheduler, Observable, observeOn } from 'rxjs';\n\nimport { LiveChannelAddress, LiveChannelEvent } from '@grafana/data';\n\nimport { createWorker } from './createCentrifugeServiceWorker';\nimport { promiseWithRemoteObservableAsObservable } from './remoteObservable';\nimport { CentrifugeSrv, CentrifugeSrvDeps } from './service';\nimport { RemoteCentrifugeService } from './service.worker';\n\nexport class CentrifugeServiceWorkerProxy implements CentrifugeSrv {\n private centrifugeWorker;\n\n constructor(deps: CentrifugeSrvDeps) {\n this.centrifugeWorker = comlink.wrap<RemoteCentrifugeService>(createWorker() as comlink.Endpoint);\n this.centrifugeWorker.initialize(deps, comlink.proxy(deps.dataStreamSubscriberReadiness));\n }\n\n getConnectionState: CentrifugeSrv['getConnectionState'] = () => {\n return promiseWithRemoteObservableAsObservable(this.centrifugeWorker.getConnectionState());\n };\n\n getDataStream: CentrifugeSrv['getDataStream'] = (options) => {\n return promiseWithRemoteObservableAsObservable(this.centrifugeWorker.getDataStream(options)).pipe(\n // async scheduler splits the synchronous task of deserializing data from web worker and\n // consuming the message (ie. updating react component) into two to avoid blocking the event loop\n observeOn(asyncScheduler)\n );\n };\n\n /**\n * Query over websocket\n */\n getQueryData: CentrifugeSrv['getQueryData'] = async (options) => {\n const optionsAsPlainSerializableObject = JSON.parse(JSON.stringify(options));\n return this.centrifugeWorker.getQueryData(optionsAsPlainSerializableObject);\n };\n\n getPresence: CentrifugeSrv['getPresence'] = (address) => {\n return this.centrifugeWorker.getPresence(address);\n };\n\n getStream: CentrifugeSrv['getStream'] = <T>(address: LiveChannelAddress) => {\n return promiseWithRemoteObservableAsObservable(\n this.centrifugeWorker.getStream(address) as Promise<comlink.Remote<Observable<LiveChannelEvent<T>>>>\n );\n };\n}\n","import { CorsWorker as Worker } from 'app/core/utils/CorsWorker';\n\nexport const createWorker = () => new Worker(new URL('./service.worker.ts', import.meta.url));\n","import { from, map, of, switchMap } from 'rxjs';\n\nimport { DataFrame, toLiveChannelId } from '@grafana/data';\nimport { BackendSrv, GrafanaLiveSrv, toDataQueryResponse } from '@grafana/runtime';\nimport {\n standardStreamOptionsProvider,\n toStreamingDataResponse,\n} from '@grafana/runtime/src/utils/DataSourceWithBackend';\n\nimport { CentrifugeSrv, StreamingDataQueryResponse } from './centrifuge/service';\nimport { StreamingDataFrame } from './data/StreamingDataFrame';\nimport { isStreamingResponseData, StreamingResponseDataType } from './data/utils';\n\ntype GrafanaLiveServiceDeps = {\n centrifugeSrv: CentrifugeSrv;\n backendSrv: BackendSrv;\n};\n\nexport class GrafanaLiveService implements GrafanaLiveSrv {\n constructor(private deps: GrafanaLiveServiceDeps) {}\n\n /**\n * Listen for changes to the connection state\n */\n getConnectionState = () => {\n return this.deps.centrifugeSrv.getConnectionState();\n };\n\n /**\n * Connect to a channel and return results as DataFrames\n */\n getDataStream: GrafanaLiveSrv['getDataStream'] = (options) => {\n let buffer: StreamingDataFrame;\n\n const updateBuffer = (next: StreamingDataQueryResponse): void => {\n const data = next.data[0];\n if (!buffer && !isStreamingResponseData(data, StreamingResponseDataType.FullFrame)) {\n console.warn(`expected first packet to contain a full frame, received ${data?.type}`);\n return;\n }\n\n switch (data.type) {\n case StreamingResponseDataType.FullFrame: {\n buffer = StreamingDataFrame.deserialize(data.frame);\n return;\n }\n case StreamingResponseDataType.NewValuesSameSchema: {\n buffer.pushNewValues(data.values);\n return;\n }\n }\n };\n\n return this.deps.centrifugeSrv.getDataStream(options).pipe(\n map((next) => {\n updateBuffer(next);\n return {\n ...next,\n data: [buffer ?? StreamingDataFrame.empty()],\n };\n })\n );\n };\n\n /**\n * Watch for messages in a channel\n */\n getStream: GrafanaLiveSrv['getStream'] = (address) => {\n return this.deps.centrifugeSrv.getStream(address);\n };\n\n /**\n * Execute a query over the live websocket and potentially subscribe to a live channel.\n *\n * Since the initial request and subscription are on the same socket, this will support HA setups\n */\n getQueryData: GrafanaLiveSrv['getQueryData'] = (options) => {\n return from(this.deps.centrifugeSrv.getQueryData(options)).pipe(\n switchMap((rawResponse) => {\n const parsedResponse = toDataQueryResponse(rawResponse, options.request.targets);\n\n const isSubscribable =\n parsedResponse.data?.length && parsedResponse.data.find((f: DataFrame) => f.meta?.channel);\n\n return isSubscribable\n ? toStreamingDataResponse(parsedResponse, options.request, standardStreamOptionsProvider)\n : of(parsedResponse);\n })\n );\n };\n\n /**\n * Publish into a channel\n *\n * @alpha -- experimental\n */\n publish: GrafanaLiveSrv['publish'] = async (address, data) => {\n return this.deps.backendSrv.post(`api/live/publish`, {\n channel: toLiveChannelId(address), // orgId is from user\n data,\n });\n };\n\n /**\n * For channels that support presence, this will request the current state from the server.\n *\n * Join and leave messages will be sent to the open stream\n */\n getPresence: GrafanaLiveSrv['getPresence'] = (address) => {\n return this.deps.centrifugeSrv.getPresence(address);\n };\n}\n","import { config, getBackendSrv, getGrafanaLiveSrv, setGrafanaLiveSrv } from '@grafana/runtime';\nimport { liveTimer } from 'app/features/dashboard/dashgrid/liveTimer';\n\nimport { contextSrv } from '../../core/services/context_srv';\n\nimport { CentrifugeService } from './centrifuge/service';\nimport { CentrifugeServiceWorkerProxy } from './centrifuge/serviceWorkerProxy';\nimport { GrafanaLiveService } from './live';\n\nexport const sessionId =\n (window as any)?.grafanaBootData?.user?.id +\n '/' +\n Date.now().toString(16) +\n '/' +\n Math.random().toString(36).substring(2, 15);\n\nexport function initGrafanaLive() {\n const centrifugeServiceDeps = {\n appUrl: `${window.location.origin}${config.appSubUrl}`,\n orgId: contextSrv.user.orgId,\n orgRole: contextSrv.user.orgRole,\n liveEnabled: config.liveEnabled,\n sessionId,\n dataStreamSubscriberReadiness: liveTimer.ok.asObservable(),\n };\n\n const centrifugeSrv = config.featureToggles['live-service-web-worker']\n ? new CentrifugeServiceWorkerProxy(centrifugeServiceDeps)\n : new CentrifugeService(centrifugeServiceDeps);\n\n setGrafanaLiveSrv(\n new GrafanaLiveService({\n centrifugeSrv,\n backendSrv: getBackendSrv(),\n })\n );\n}\n\nexport function getGrafanaLiveCentrifugeSrv() {\n return getGrafanaLiveSrv() as GrafanaLiveService;\n}\n","import { backendSrv } from 'app/core/services/backend_srv';\n\nconst hitTypes = {\n FOLDER: 'dash-folder',\n DASHBOARD: 'dash-db',\n};\n\nexport class ValidationSrv {\n rootName = 'general';\n\n validateNewDashboardName(folderId: any, name: string) {\n return this.validate(folderId, name, 'A dashboard or a folder with the same name already exists');\n }\n\n validateNewFolderName(name?: string) {\n return this.validate(0, name, 'A folder or dashboard in the general folder with the same name already exists');\n }\n\n private async validate(folderId: any, name: string | undefined, existingErrorMessage: string) {\n name = (name || '').trim();\n const nameLowerCased = name.toLowerCase();\n\n if (name.length === 0) {\n throw {\n type: 'REQUIRED',\n message: 'Name is required',\n };\n }\n\n if (folderId === 0 && nameLowerCased === this.rootName) {\n throw {\n type: 'EXISTING',\n message: 'This is a reserved name and cannot be used for a folder.',\n };\n }\n\n const promises = [];\n promises.push(backendSrv.search({ type: hitTypes.FOLDER, folderIds: [folderId], query: name }));\n promises.push(backendSrv.search({ type: hitTypes.DASHBOARD, folderIds: [folderId], query: name }));\n\n const res = await Promise.all(promises);\n let hits: any[] = [];\n\n if (res.length > 0 && res[0].length > 0) {\n hits = res[0];\n }\n\n if (res.length > 1 && res[1].length > 0) {\n hits = hits.concat(res[1]);\n }\n\n for (const hit of hits) {\n if (nameLowerCased === hit.title.toLowerCase()) {\n throw {\n type: 'EXISTING',\n message: existingErrorMessage,\n };\n }\n }\n\n return;\n }\n}\n\nexport const validationSrv = new ValidationSrv();\n","import { DataSourceInstanceSettings, locationUtil } from '@grafana/data';\nimport { getDataSourceSrv, locationService, getBackendSrv, isFetchError } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { SaveDashboardCommand } from 'app/features/dashboard/components/SaveDashboard/types';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { DashboardDTO, FolderInfo, PermissionLevelString, ThunkResult } from 'app/types';\n\nimport { LibraryElementExport } from '../../dashboard/components/DashExportModal/DashboardExporter';\nimport { getLibraryPanel } from '../../library-panels/state/api';\nimport { LibraryElementDTO, LibraryElementKind } from '../../library-panels/types';\nimport { DashboardSearchHit } from '../../search/types';\n\nimport {\n clearDashboard,\n fetchDashboard,\n fetchFailed,\n ImportDashboardDTO,\n InputType,\n LibraryPanelInput,\n LibraryPanelInputState,\n setGcomDashboard,\n setInputs,\n setJsonDashboard,\n setLibraryPanelInputs,\n} from './reducers';\n\nexport function fetchGcomDashboard(id: string): ThunkResult<void> {\n return async (dispatch) => {\n try {\n dispatch(fetchDashboard());\n const dashboard = await getBackendSrv().get(`/api/gnet/dashboards/${id}`);\n dispatch(setGcomDashboard(dashboard));\n dispatch(processInputs(dashboard.json));\n dispatch(processElements(dashboard.json));\n } catch (error) {\n dispatch(fetchFailed());\n if (isFetchError(error)) {\n dispatch(notifyApp(createErrorNotification(error.data.message || error)));\n }\n }\n };\n}\n\nexport function importDashboardJson(dashboard: any): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(setJsonDashboard(dashboard));\n dispatch(processInputs(dashboard));\n dispatch(processElements(dashboard));\n };\n}\n\nfunction processInputs(dashboardJson: any): ThunkResult<void> {\n return (dispatch) => {\n if (dashboardJson && dashboardJson.__inputs) {\n const inputs: any[] = [];\n dashboardJson.__inputs.forEach((input: any) => {\n const inputModel: any = {\n name: input.name,\n label: input.label,\n info: input.description,\n value: input.value,\n type: input.type,\n pluginId: input.pluginId,\n options: [],\n };\n\n if (input.type === InputType.DataSource) {\n getDataSourceOptions(input, inputModel);\n } else if (!inputModel.info) {\n inputModel.info = 'Specify a string constant';\n }\n\n inputs.push(inputModel);\n });\n dispatch(setInputs(inputs));\n }\n };\n}\n\nfunction processElements(dashboardJson?: { __elements?: Record<string, LibraryElementExport> }): ThunkResult<void> {\n return async function (dispatch) {\n if (!dashboardJson || !dashboardJson.__elements) {\n return;\n }\n\n const libraryPanelInputs: LibraryPanelInput[] = [];\n\n for (const element of Object.values(dashboardJson.__elements)) {\n if (element.kind !== LibraryElementKind.Panel) {\n continue;\n }\n\n const model = element.model;\n const { type, description } = model;\n const { uid, name } = element;\n const input: LibraryPanelInput = {\n model: {\n model,\n uid,\n name,\n version: 0,\n meta: {},\n id: 0,\n type,\n kind: LibraryElementKind.Panel,\n description,\n } as LibraryElementDTO,\n state: LibraryPanelInputState.New,\n };\n\n try {\n const panelInDb = await getLibraryPanel(uid, true);\n input.state = LibraryPanelInputState.Exists;\n input.model = panelInDb;\n } catch (e: any) {\n if (e.status !== 404) {\n throw e;\n }\n }\n\n libraryPanelInputs.push(input);\n }\n\n dispatch(setLibraryPanelInputs(libraryPanelInputs));\n };\n}\n\nexport function clearLoadedDashboard(): ThunkResult<void> {\n return (dispatch) => {\n dispatch(clearDashboard());\n };\n}\n\nexport function importDashboard(importDashboardForm: ImportDashboardDTO): ThunkResult<void> {\n return async (dispatch, getState) => {\n const dashboard = getState().importDashboard.dashboard;\n const inputs = getState().importDashboard.inputs;\n\n let inputsToPersist = [] as any[];\n importDashboardForm.dataSources?.forEach((dataSource: DataSourceInstanceSettings, index: number) => {\n const input = inputs.dataSources[index];\n inputsToPersist.push({\n name: input.name,\n type: input.type,\n pluginId: input.pluginId,\n value: dataSource.uid,\n });\n });\n\n importDashboardForm.constants?.forEach((constant: any, index: number) => {\n const input = inputs.constants[index];\n\n inputsToPersist.push({\n value: constant,\n name: input.name,\n type: input.type,\n });\n });\n\n const result = await getBackendSrv().post('api/dashboards/import', {\n // uid: if user changed it, take the new uid from importDashboardForm,\n // else read it from original dashboard\n // by default the uid input is disabled, onSubmit ignores values from disabled inputs\n dashboard: { ...dashboard, title: importDashboardForm.title, uid: importDashboardForm.uid || dashboard.uid },\n overwrite: true,\n inputs: inputsToPersist,\n folderId: importDashboardForm.folder.id,\n });\n\n const dashboardUrl = locationUtil.stripBaseFromUrl(result.importedUrl);\n locationService.push(dashboardUrl);\n };\n}\n\nconst getDataSourceOptions = (input: { pluginId: string; pluginName: string }, inputModel: any) => {\n const sources = getDataSourceSrv().getList({ pluginId: input.pluginId });\n\n if (sources.length === 0) {\n inputModel.info = 'No data sources of type ' + input.pluginName + ' found';\n } else if (!inputModel.info) {\n inputModel.info = 'Select a ' + input.pluginName + ' data source';\n }\n};\n\nexport function moveDashboards(dashboardUids: string[], toFolder: FolderInfo) {\n const tasks = [];\n\n for (const uid of dashboardUids) {\n tasks.push(createTask(moveDashboard, true, uid, toFolder));\n }\n\n return executeInOrder(tasks).then((result: any) => {\n return {\n totalCount: result.length,\n successCount: result.filter((res: any) => res.succeeded).length,\n alreadyInFolderCount: result.filter((res: any) => res.alreadyInFolder).length,\n };\n });\n}\n\nasync function moveDashboard(uid: string, toFolder: FolderInfo) {\n const fullDash: DashboardDTO = await getBackendSrv().get(`/api/dashboards/uid/${uid}`);\n\n if ((!fullDash.meta.folderId && toFolder.id === 0) || fullDash.meta.folderId === toFolder.id) {\n return { alreadyInFolder: true };\n }\n\n const options = {\n dashboard: fullDash.dashboard,\n folderId: toFolder.id,\n overwrite: false,\n };\n\n try {\n await saveDashboard(options);\n return { succeeded: true };\n } catch (err) {\n if (isFetchError(err)) {\n if (err.data?.status !== 'plugin-dashboard') {\n return { succeeded: false };\n }\n\n err.isHandled = true;\n }\n options.overwrite = true;\n\n try {\n await saveDashboard(options);\n return { succeeded: true };\n } catch (e) {\n return { succeeded: false };\n }\n }\n}\n\nfunction createTask(fn: (...args: any[]) => Promise<any>, ignoreRejections: boolean, ...args: any[]) {\n return async (result: any) => {\n try {\n const res = await fn(...args);\n return Array.prototype.concat(result, [res]);\n } catch (err) {\n if (ignoreRejections) {\n return result;\n }\n\n throw err;\n }\n };\n}\n\nexport function deleteFoldersAndDashboards(folderUids: string[], dashboardUids: string[]) {\n const tasks = [];\n\n for (const folderUid of folderUids) {\n tasks.push(createTask(deleteFolder, true, folderUid, true));\n }\n\n for (const dashboardUid of dashboardUids) {\n tasks.push(createTask(deleteDashboard, true, dashboardUid, true));\n }\n\n return executeInOrder(tasks);\n}\n\nexport function saveDashboard(options: SaveDashboardCommand) {\n dashboardWatcher.ignoreNextSave();\n\n return getBackendSrv().post('/api/dashboards/db/', {\n dashboard: options.dashboard,\n message: options.message ?? '',\n overwrite: options.overwrite ?? false,\n folderId: options.folderId,\n });\n}\n\nfunction deleteFolder(uid: string, showSuccessAlert: boolean) {\n return getBackendSrv().request({\n method: 'DELETE',\n url: `/api/folders/${uid}?forceDeleteRules=false`,\n showSuccessAlert: showSuccessAlert,\n });\n}\n\nexport function createFolder(payload: any) {\n return getBackendSrv().post('/api/folders', payload);\n}\n\nexport function searchFolders(\n query: any,\n permission?: PermissionLevelString,\n withAccessControl = false\n): Promise<DashboardSearchHit[]> {\n return getBackendSrv().get('/api/search', {\n query,\n type: 'dash-folder',\n permission,\n accesscontrol: withAccessControl,\n });\n}\n\nexport function getFolderById(id: number): Promise<{ id: number; title: string }> {\n return getBackendSrv().get(`/api/folders/id/${id}`);\n}\n\nexport function deleteDashboard(uid: string, showSuccessAlert: boolean) {\n return getBackendSrv().request({\n method: 'DELETE',\n url: `/api/dashboards/uid/${uid}`,\n showSuccessAlert: showSuccessAlert,\n });\n}\n\nfunction executeInOrder(tasks: any[]) {\n return tasks.reduce((acc, task) => {\n return Promise.resolve(acc).then(task);\n }, []);\n}\n","import { createSlice, Draft, PayloadAction } from '@reduxjs/toolkit';\n\nimport { DataSourceInstanceSettings, LoadingState } from '@grafana/data';\n\nimport { LibraryElementDTO } from '../../library-panels/types';\n\nexport enum DashboardSource {\n Gcom = 0,\n Json = 1,\n}\n\nexport interface ImportDashboardDTO {\n title: string;\n uid: string;\n gnetId: string;\n constants: string[];\n dataSources: DataSourceInstanceSettings[];\n elements: LibraryElementDTO[];\n folder: { id: number; title?: string };\n}\n\nexport enum InputType {\n DataSource = 'datasource',\n Constant = 'constant',\n LibraryPanel = 'libraryPanel',\n}\n\nexport enum LibraryPanelInputState {\n New = 'new',\n Exists = 'exists',\n Different = 'different',\n}\n\nexport interface DashboardInput {\n name: string;\n label: string;\n info: string;\n value: string;\n type: InputType;\n}\n\nexport interface DataSourceInput extends DashboardInput {\n pluginId: string;\n}\n\nexport interface LibraryPanelInput {\n model: LibraryElementDTO;\n state: LibraryPanelInputState;\n}\n\nexport interface DashboardInputs {\n dataSources: DataSourceInput[];\n constants: DashboardInput[];\n libraryPanels: LibraryPanelInput[];\n}\n\nexport interface ImportDashboardState {\n meta: { updatedAt: string; orgName: string };\n dashboard: any;\n source: DashboardSource;\n inputs: DashboardInputs;\n state: LoadingState;\n}\n\nexport const initialImportDashboardState: ImportDashboardState = {\n meta: { updatedAt: '', orgName: '' },\n dashboard: {},\n source: DashboardSource.Json,\n inputs: {} as DashboardInputs,\n state: LoadingState.NotStarted,\n};\n\nconst importDashboardSlice = createSlice({\n name: 'manageDashboards',\n initialState: initialImportDashboardState,\n reducers: {\n setGcomDashboard: (state: Draft<ImportDashboardState>, action: PayloadAction<any>) => {\n state.dashboard = {\n ...action.payload.json,\n id: null,\n };\n state.meta = { updatedAt: action.payload.updatedAt, orgName: action.payload.orgName };\n state.source = DashboardSource.Gcom;\n state.state = LoadingState.Done;\n },\n setJsonDashboard: (state: Draft<ImportDashboardState>, action: PayloadAction<any>) => {\n state.dashboard = {\n ...action.payload,\n id: null,\n };\n state.meta = initialImportDashboardState.meta;\n state.source = DashboardSource.Json;\n state.state = LoadingState.Done;\n },\n clearDashboard: (state: Draft<ImportDashboardState>) => {\n state.dashboard = {};\n state.state = LoadingState.NotStarted;\n },\n setInputs: (state: Draft<ImportDashboardState>, action: PayloadAction<any[]>) => {\n state.inputs = {\n dataSources: action.payload.filter((p) => p.type === InputType.DataSource),\n constants: action.payload.filter((p) => p.type === InputType.Constant),\n libraryPanels: [],\n };\n },\n setLibraryPanelInputs: (state: Draft<ImportDashboardState>, action: PayloadAction<LibraryPanelInput[]>) => {\n state.inputs.libraryPanels = action.payload;\n },\n fetchFailed: (state: Draft<ImportDashboardState>) => {\n state.dashboard = {};\n state.state = LoadingState.Error;\n },\n fetchDashboard: (state: Draft<ImportDashboardState>) => {\n state.state = LoadingState.Loading;\n },\n },\n});\n\nexport const {\n clearDashboard,\n setInputs,\n setGcomDashboard,\n setJsonDashboard,\n setLibraryPanelInputs,\n fetchFailed,\n fetchDashboard,\n} = importDashboardSlice.actions;\n\nexport const importDashboardReducer = importDashboardSlice.reducer;\n\nexport default {\n importDashboard: importDashboardReducer,\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Organization, OrganizationState, UserOrg } from 'app/types';\n\nexport const initialState: OrganizationState = {\n organization: {} as Organization,\n userOrgs: [] as UserOrg[],\n};\n\nconst organizationSlice = createSlice({\n name: 'organization',\n initialState,\n reducers: {\n organizationLoaded: (state, action: PayloadAction<Organization>): OrganizationState => {\n return { ...state, organization: action.payload };\n },\n setOrganizationName: (state, action: PayloadAction<string>): OrganizationState => {\n return { ...state, organization: { ...state.organization, name: action.payload } };\n },\n userOrganizationsLoaded: (state, action: PayloadAction<UserOrg[]>): OrganizationState => {\n return { ...state, userOrgs: action.payload };\n },\n },\n});\n\nexport const { setOrganizationName, organizationLoaded, userOrganizationsLoaded } = organizationSlice.actions;\n\nexport const organizationReducer = organizationSlice.reducer;\n\nexport default {\n organization: organizationReducer,\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { CoreApp, GrafanaTheme2, PanelDataSummary, VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { PanelDataErrorViewProps } from '@grafana/runtime';\nimport { usePanelContext, useStyles2 } from '@grafana/ui';\nimport { CardButton } from 'app/core/components/CardButton';\nimport { LS_VISUALIZATION_SELECT_TAB_KEY } from 'app/core/constants';\nimport store from 'app/core/store';\nimport { toggleVizPicker } from 'app/features/dashboard/components/PanelEditor/state/reducers';\nimport { VisualizationSelectPaneTab } from 'app/features/dashboard/components/PanelEditor/types';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\n\nimport { changePanelPlugin } from '../state/actions';\n\nexport function PanelDataErrorView(props: PanelDataErrorViewProps) {\n const styles = useStyles2(getStyles);\n const context = usePanelContext();\n const builder = new VisualizationSuggestionsBuilder(props.data);\n const { dataSummary } = builder;\n const message = getMessageFor(props, dataSummary);\n const dispatch = useDispatch();\n\n const openVizPicker = () => {\n store.setObject(LS_VISUALIZATION_SELECT_TAB_KEY, VisualizationSelectPaneTab.Suggestions);\n dispatch(toggleVizPicker(true));\n };\n\n const switchToTable = () => {\n const panel = getDashboardSrv().getCurrent()?.getPanelById(props.panelId);\n if (!panel) {\n return;\n }\n\n dispatch(\n changePanelPlugin({\n panel,\n pluginId: 'table',\n })\n );\n };\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.message}>{message}</div>\n {context.app === CoreApp.PanelEditor && dataSummary.hasData && (\n <div className={styles.actions}>\n <CardButton icon=\"table\" onClick={switchToTable}>\n Switch to table\n </CardButton>\n <CardButton icon=\"chart-line\" onClick={openVizPicker}>\n Open visualization suggestions\n </CardButton>\n </div>\n )}\n </div>\n );\n}\n\nfunction getMessageFor(\n { data, fieldConfig, message, needsNumberField, needsTimeField, needsStringField }: PanelDataErrorViewProps,\n dataSummary: PanelDataSummary\n): string {\n if (message) {\n return message;\n }\n\n // In some cases there is a data frame but with no fields\n if (!data.series || data.series.length === 0 || (data.series.length === 1 && data.series[0].length === 0)) {\n return fieldConfig?.defaults.noValue ?? 'No data';\n }\n\n if (needsStringField && !dataSummary.hasStringField) {\n return 'Data is missing a string field';\n }\n\n if (needsNumberField && !dataSummary.hasNumberField) {\n return 'Data is missing a number field';\n }\n\n if (needsTimeField && !dataSummary.hasTimeField) {\n return 'Data is missing a time field';\n }\n\n return 'Cannot visualize data';\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n height: '100%',\n width: '100%',\n }),\n message: css({\n textAlign: 'center',\n color: theme.colors.text.secondary,\n fontSize: theme.typography.size.lg,\n width: '100%',\n }),\n actions: css({\n marginTop: theme.spacing(2),\n display: 'flex',\n height: '50%',\n maxHeight: '150px',\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(1),\n width: '100%',\n maxWidth: '600px',\n }),\n };\n};\n","// Libraries\nimport React, { PureComponent, ReactNode } from 'react';\n\n// Types\nimport { PanelProps, PanelPlugin, PluginType, PanelPluginMeta } from '@grafana/data';\nimport { Alert } from '@grafana/ui';\nimport { AppNotificationSeverity } from 'app/types';\n\ninterface Props {\n title: string;\n text?: ReactNode;\n}\n\nclass PanelPluginError extends PureComponent<Props> {\n constructor(props: Props) {\n super(props);\n }\n\n render() {\n const style = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n };\n\n return (\n <div style={style}>\n <Alert severity={AppNotificationSeverity.Error} {...this.props} />\n </div>\n );\n }\n}\n\nexport function getPanelPluginLoadError(meta: PanelPluginMeta, err: any): PanelPlugin {\n const LoadError = class LoadError extends PureComponent<PanelProps> {\n render() {\n const text = (\n <>\n Check the server startup logs for more information. <br />\n If this plugin was loaded from Git, then make sure it was compiled.\n </>\n );\n return <PanelPluginError title={`Error loading: ${meta.id}`} text={text} />;\n }\n };\n const plugin = new PanelPlugin(LoadError);\n plugin.meta = meta;\n plugin.loadError = true;\n return plugin;\n}\n\nexport function getPanelPluginNotFound(id: string, silent?: boolean): PanelPlugin {\n const NotFound = class NotFound extends PureComponent<PanelProps> {\n render() {\n return <PanelPluginError title={`Panel plugin not found: ${id}`} />;\n }\n };\n\n const plugin = new PanelPlugin(silent ? () => null : NotFound);\n\n plugin.meta = {\n id: id,\n name: id,\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: 'public/img/grafana_icon.svg',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n return plugin;\n}\n","import React, { useState, useMemo, useEffect, useRef } from 'react';\n\nimport { applyFieldOverrides, FieldConfigSource, getTimeZone, PanelData, PanelPlugin } from '@grafana/data';\nimport { PanelRendererProps } from '@grafana/runtime';\nimport { ErrorBoundaryAlert, useTheme2 } from '@grafana/ui';\nimport { appEvents } from 'app/core/core';\n\nimport { getPanelOptionsWithDefaults, OptionDefaults } from '../../dashboard/state/getPanelOptionsWithDefaults';\nimport { importPanelPlugin, syncGetPanelPlugin } from '../../plugins/importPanelPlugin';\n\nconst defaultFieldConfig = { defaults: {}, overrides: [] };\n\nexport function PanelRenderer<P extends object = any, F extends object = any>(props: PanelRendererProps<P, F>) {\n const {\n pluginId,\n data,\n timeZone = getTimeZone(),\n options = {},\n width,\n height,\n title,\n onOptionsChange = () => {},\n onChangeTimeRange = () => {},\n onFieldConfigChange = () => {},\n fieldConfig = defaultFieldConfig,\n } = props;\n\n const [plugin, setPlugin] = useState(syncGetPanelPlugin(pluginId));\n const [error, setError] = useState<string | undefined>();\n const optionsWithDefaults = useOptionDefaults(plugin, options, fieldConfig);\n const dataWithOverrides = useFieldOverrides(plugin, optionsWithDefaults, data, timeZone);\n\n useEffect(() => {\n // If we already have a plugin and it's correct one do nothing\n if (plugin && plugin.hasPluginId(pluginId)) {\n return;\n }\n\n // Async load the plugin\n importPanelPlugin(pluginId)\n .then((result) => setPlugin(result))\n .catch((err: Error) => {\n setError(err.message);\n });\n }, [pluginId, plugin]);\n\n if (error) {\n return <div>Failed to load plugin: {error}</div>;\n }\n\n if (!plugin || !plugin.hasPluginId(pluginId)) {\n return <div>Loading plugin panel...</div>;\n }\n\n if (!plugin.panel) {\n return <div>Seems like the plugin you are trying to load does not have a panel component.</div>;\n }\n\n if (!dataWithOverrides) {\n return <div>No panel data</div>;\n }\n\n const PanelComponent = plugin.panel;\n\n return (\n <ErrorBoundaryAlert dependencies={[plugin, data]}>\n <PanelComponent\n id={1}\n data={dataWithOverrides}\n title={title}\n timeRange={dataWithOverrides.timeRange}\n timeZone={timeZone}\n options={optionsWithDefaults!.options}\n fieldConfig={fieldConfig}\n transparent={false}\n width={width}\n height={height}\n renderCounter={0}\n replaceVariables={(str: string) => str}\n onOptionsChange={onOptionsChange}\n onFieldConfigChange={onFieldConfigChange}\n onChangeTimeRange={onChangeTimeRange}\n eventBus={appEvents}\n />\n </ErrorBoundaryAlert>\n );\n}\n\nfunction useOptionDefaults<P extends object = any, F extends object = any>(\n plugin: PanelPlugin | undefined,\n options: P,\n fieldConfig: FieldConfigSource<F>\n): OptionDefaults | undefined {\n return useMemo(() => {\n if (!plugin) {\n return;\n }\n\n return getPanelOptionsWithDefaults({\n plugin,\n currentOptions: options,\n currentFieldConfig: fieldConfig,\n isAfterPluginChange: false,\n });\n }, [plugin, fieldConfig, options]);\n}\n\nfunction useFieldOverrides(\n plugin: PanelPlugin | undefined,\n defaultOptions: OptionDefaults | undefined,\n data: PanelData | undefined,\n timeZone: string\n): PanelData | undefined {\n const fieldConfig = defaultOptions?.fieldConfig;\n const series = data?.series;\n const fieldConfigRegistry = plugin?.fieldConfigRegistry;\n const theme = useTheme2();\n const structureRev = useRef(0);\n\n return useMemo(() => {\n if (!fieldConfigRegistry || !fieldConfig || !data) {\n return;\n }\n structureRev.current = structureRev.current + 1;\n\n return {\n ...data,\n series: applyFieldOverrides({\n data: series,\n fieldConfig,\n fieldConfigRegistry,\n replaceVariables: (str: string) => str,\n theme,\n timeZone,\n }),\n structureRev: structureRev.current,\n };\n }, [fieldConfigRegistry, fieldConfig, data, series, timeZone, theme]);\n}\n","import { chain } from 'lodash';\n\nimport {\n DataFrame,\n DataLink,\n DataLinkBuiltInVars,\n deprecationWarning,\n Field,\n FieldType,\n getFieldDisplayName,\n InterpolateFunction,\n KeyValue,\n LinkModel,\n locationUtil,\n ScopedVars,\n textUtil,\n urlUtil,\n VariableOrigin,\n VariableSuggestion,\n VariableSuggestionsScope,\n} from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { getConfig } from 'app/core/config';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\n\nimport { getVariablesUrlParams } from '../../variables/getAllVariableValuesForUrl';\n\nconst timeRangeVars = [\n {\n value: `${DataLinkBuiltInVars.keepTime}`,\n label: 'Time range',\n documentation: 'Adds current time range',\n origin: VariableOrigin.BuiltIn,\n },\n {\n value: `${DataLinkBuiltInVars.timeRangeFrom}`,\n label: 'Time range: from',\n documentation: \"Adds current time range's from value\",\n origin: VariableOrigin.BuiltIn,\n },\n {\n value: `${DataLinkBuiltInVars.timeRangeTo}`,\n label: 'Time range: to',\n documentation: \"Adds current time range's to value\",\n origin: VariableOrigin.BuiltIn,\n },\n];\n\nconst seriesVars = [\n {\n value: `${DataLinkBuiltInVars.seriesName}`,\n label: 'Name',\n documentation: 'Name of the series',\n origin: VariableOrigin.Series,\n },\n];\n\nconst valueVars = [\n {\n value: `${DataLinkBuiltInVars.valueNumeric}`,\n label: 'Numeric',\n documentation: 'Numeric representation of selected value',\n origin: VariableOrigin.Value,\n },\n {\n value: `${DataLinkBuiltInVars.valueText}`,\n label: 'Text',\n documentation: 'Text representation of selected value',\n origin: VariableOrigin.Value,\n },\n {\n value: `${DataLinkBuiltInVars.valueRaw}`,\n label: 'Raw',\n documentation: 'Raw value',\n origin: VariableOrigin.Value,\n },\n];\n\nconst buildLabelPath = (label: string) => {\n return label.includes('.') || label.trim().includes(' ') ? `[\"${label}\"]` : `.${label}`;\n};\n\nexport const getPanelLinksVariableSuggestions = (): VariableSuggestion[] => [\n ...getTemplateSrv()\n .getVariables()\n .map((variable) => ({\n value: variable.name as string,\n label: variable.name,\n origin: VariableOrigin.Template,\n })),\n {\n value: `${DataLinkBuiltInVars.includeVars}`,\n label: 'All variables',\n documentation: 'Adds current variables',\n origin: VariableOrigin.Template,\n },\n ...timeRangeVars,\n];\n\nconst getFieldVars = (dataFrames: DataFrame[]) => {\n const all = [];\n for (const df of dataFrames) {\n for (const f of df.fields) {\n if (f.labels) {\n for (const k of Object.keys(f.labels)) {\n all.push(k);\n }\n }\n }\n }\n\n const labels = chain(all).flatten().uniq().value();\n\n return [\n {\n value: `${DataLinkBuiltInVars.fieldName}`,\n label: 'Name',\n documentation: 'Field name of the clicked datapoint (in ms epoch)',\n origin: VariableOrigin.Field,\n },\n ...labels.map((label) => ({\n value: `__field.labels${buildLabelPath(label)}`,\n label: `labels.${label}`,\n documentation: `${label} label value`,\n origin: VariableOrigin.Field,\n })),\n ];\n};\n\nexport const getDataFrameVars = (dataFrames: DataFrame[]) => {\n let numeric: Field | undefined = undefined;\n let title: Field | undefined = undefined;\n const suggestions: VariableSuggestion[] = [];\n const keys: KeyValue<true> = {};\n\n if (dataFrames.length !== 1) {\n // It's not possible to access fields of other dataframes. So if there are multiple dataframes we need to skip these suggestions.\n // Also return early if there are no dataFrames.\n return [];\n }\n\n const frame = dataFrames[0];\n\n for (const field of frame.fields) {\n const displayName = getFieldDisplayName(field, frame, dataFrames);\n\n if (keys[displayName]) {\n continue;\n }\n\n suggestions.push({\n value: `__data.fields${buildLabelPath(displayName)}`,\n label: `${displayName}`,\n documentation: `Formatted value for ${displayName} on the same row`,\n origin: VariableOrigin.Fields,\n });\n\n keys[displayName] = true;\n\n if (!numeric && field.type === FieldType.number) {\n numeric = { ...field, name: displayName };\n }\n\n if (!title && field.config.displayName && field.config.displayName !== field.name) {\n title = { ...field, name: displayName };\n }\n }\n\n if (suggestions.length) {\n suggestions.push({\n value: `__data.fields[0]`,\n label: `Select by index`,\n documentation: `Enter the field order`,\n origin: VariableOrigin.Fields,\n });\n }\n\n if (numeric) {\n suggestions.push({\n value: `__data.fields${buildLabelPath(numeric.name)}.numeric`,\n label: `Show numeric value`,\n documentation: `the numeric field value`,\n origin: VariableOrigin.Fields,\n });\n suggestions.push({\n value: `__data.fields${buildLabelPath(numeric.name)}.text`,\n label: `Show text value`,\n documentation: `the text value`,\n origin: VariableOrigin.Fields,\n });\n }\n\n if (title) {\n suggestions.push({\n value: `__data.fields${buildLabelPath(title.name)}`,\n label: `Select by title`,\n documentation: `Use the title to pick the field`,\n origin: VariableOrigin.Fields,\n });\n }\n\n return suggestions;\n};\n\nexport const getDataLinksVariableSuggestions = (\n dataFrames: DataFrame[],\n scope?: VariableSuggestionsScope\n): VariableSuggestion[] => {\n const valueTimeVar = {\n value: `${DataLinkBuiltInVars.valueTime}`,\n label: 'Time',\n documentation: 'Time value of the clicked datapoint (in ms epoch)',\n origin: VariableOrigin.Value,\n };\n const includeValueVars = scope === VariableSuggestionsScope.Values;\n\n return includeValueVars\n ? [\n ...seriesVars,\n ...getFieldVars(dataFrames),\n ...valueVars,\n valueTimeVar,\n ...getDataFrameVars(dataFrames),\n ...getPanelLinksVariableSuggestions(),\n ]\n : [\n ...seriesVars,\n ...getFieldVars(dataFrames),\n ...getDataFrameVars(dataFrames),\n ...getPanelLinksVariableSuggestions(),\n ];\n};\n\nexport const getCalculationValueDataLinksVariableSuggestions = (dataFrames: DataFrame[]): VariableSuggestion[] => {\n const fieldVars = getFieldVars(dataFrames);\n const valueCalcVar = {\n value: `${DataLinkBuiltInVars.valueCalc}`,\n label: 'Calculation name',\n documentation: 'Name of the calculation the value is a result of',\n origin: VariableOrigin.Value,\n };\n return [...seriesVars, ...fieldVars, ...valueVars, valueCalcVar, ...getPanelLinksVariableSuggestions()];\n};\n\nexport interface LinkService {\n getDataLinkUIModel: <T>(link: DataLink, replaceVariables: InterpolateFunction | undefined, origin: T) => LinkModel<T>;\n getAnchorInfo: (link: any) => any;\n getLinkUrl: (link: any) => string;\n}\n\nexport class LinkSrv implements LinkService {\n getLinkUrl(link: any) {\n let url = locationUtil.assureBaseUrl(getTemplateSrv().replace(link.url || ''));\n let params: { [key: string]: any } = {};\n\n if (link.keepTime) {\n const range = getTimeSrv().timeRangeForUrl();\n params['from'] = range.from;\n params['to'] = range.to;\n }\n\n if (link.includeVars) {\n params = {\n ...params,\n ...getVariablesUrlParams(),\n };\n }\n\n url = urlUtil.appendQueryToUrl(url, urlUtil.toUrlParams(params));\n return getConfig().disableSanitizeHtml ? url : textUtil.sanitizeUrl(url);\n }\n\n getAnchorInfo(link: any) {\n const templateSrv = getTemplateSrv();\n const info: any = {};\n info.href = this.getLinkUrl(link);\n info.title = templateSrv.replace(link.title || '');\n info.tooltip = templateSrv.replace(link.tooltip || '');\n return info;\n }\n\n /**\n * Returns LinkModel which is basically a DataLink with all values interpolated through the templateSrv.\n */\n getDataLinkUIModel = <T>(\n link: DataLink,\n replaceVariables: InterpolateFunction | undefined,\n origin: T\n ): LinkModel<T> => {\n let href = link.url;\n\n if (link.onBuildUrl) {\n href = link.onBuildUrl({\n origin,\n replaceVariables,\n });\n }\n\n const info: LinkModel<T> = {\n href: locationUtil.assureBaseUrl(href.replace(/\\n/g, '')),\n title: link.title ?? '',\n target: link.targetBlank ? '_blank' : undefined,\n origin,\n };\n\n if (replaceVariables) {\n info.href = replaceVariables(info.href);\n info.title = replaceVariables(link.title);\n }\n\n if (link.onClick) {\n info.onClick = (e) => {\n link.onClick!({\n origin,\n replaceVariables,\n e,\n });\n };\n }\n\n info.href = getConfig().disableSanitizeHtml ? info.href : textUtil.sanitizeUrl(info.href);\n\n return info;\n };\n\n /**\n * getPanelLinkAnchorInfo method is left for plugins compatibility reasons\n *\n * @deprecated Drilldown links should be generated using getDataLinkUIModel method\n */\n getPanelLinkAnchorInfo(link: DataLink, scopedVars: ScopedVars) {\n deprecationWarning('link_srv.ts', 'getPanelLinkAnchorInfo', 'getDataLinkUIModel');\n const replace: InterpolateFunction = (value, vars, fmt) =>\n getTemplateSrv().replace(value, { ...scopedVars, ...vars }, fmt);\n\n return this.getDataLinkUIModel(link, replace, {});\n }\n}\n\nlet singleton: LinkService | undefined;\n\nexport function setLinkSrv(srv: LinkService) {\n singleton = srv;\n}\n\nexport function getLinkSrv(): LinkService {\n if (!singleton) {\n singleton = new LinkSrv();\n }\n return singleton;\n}\n","import { DataTransformerConfig, FieldConfigSource } from '@grafana/data';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { getPanelOptionsWithDefaults } from 'app/features/dashboard/state/getPanelOptionsWithDefaults';\nimport { LibraryElementDTO } from 'app/features/library-panels/types';\nimport { toPanelModelLibraryPanel } from 'app/features/library-panels/utils';\nimport { getPanelPluginNotFound } from 'app/features/panel/components/PanelPluginError';\nimport { loadPanelPlugin } from 'app/features/plugins/admin/state/actions';\nimport { ThunkResult } from 'app/types';\nimport { PanelOptionsChangedEvent, PanelQueriesChangedEvent } from 'app/types/events';\n\nimport {\n changePanelKey,\n cleanUpAngularComponent,\n panelModelAndPluginReady,\n removePanel,\n removePanels,\n} from './reducers';\n\nexport function initPanelState(panel: PanelModel): ThunkResult<void> {\n return async (dispatch, getStore) => {\n let pluginToLoad = panel.type;\n let plugin = getStore().plugins.panels[pluginToLoad];\n\n if (!plugin) {\n try {\n plugin = await dispatch(loadPanelPlugin(pluginToLoad));\n } catch (e) {\n // When plugin not found\n plugin = getPanelPluginNotFound(pluginToLoad, pluginToLoad === 'row');\n }\n }\n\n if (!panel.plugin) {\n panel.pluginLoaded(plugin);\n }\n\n dispatch(panelModelAndPluginReady({ key: panel.key, plugin }));\n };\n}\n\nexport function cleanUpPanelState(panelKey: string): ThunkResult<void> {\n return (dispatch, getStore) => {\n const store = getStore().panels;\n cleanUpAngularComponent(store[panelKey]);\n dispatch(removePanel({ key: panelKey }));\n };\n}\n\nexport function cleanAndRemoveMany(panelKeys: string[]): ThunkResult<void> {\n return (dispatch, getStore) => {\n const store = getStore().panels;\n for (const key of panelKeys) {\n cleanUpAngularComponent(store[key]);\n }\n dispatch(removePanels({ keys: panelKeys }));\n };\n}\n\nexport interface ChangePanelPluginAndOptionsArgs {\n panel: PanelModel;\n pluginId: string;\n options?: any;\n fieldConfig?: FieldConfigSource;\n transformations?: DataTransformerConfig[];\n}\n\nexport function changePanelPlugin({\n panel,\n pluginId,\n options,\n fieldConfig,\n}: ChangePanelPluginAndOptionsArgs): ThunkResult<void> {\n return async (dispatch, getStore) => {\n // ignore action is no change\n if (panel.type === pluginId && !options && !fieldConfig) {\n return;\n }\n\n const store = getStore();\n let plugin = store.plugins.panels[pluginId];\n\n if (!plugin) {\n plugin = await dispatch(loadPanelPlugin(pluginId));\n }\n\n let cleanUpKey = panel.key;\n\n if (panel.type !== pluginId) {\n panel.changePlugin(plugin);\n }\n\n if (options || fieldConfig) {\n const newOptions = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: options || panel.options,\n currentFieldConfig: fieldConfig || panel.fieldConfig,\n isAfterPluginChange: false,\n });\n\n panel.options = newOptions.options;\n panel.fieldConfig = newOptions.fieldConfig;\n panel.configRev++;\n }\n\n panel.generateNewKey();\n\n dispatch(panelModelAndPluginReady({ key: panel.key, plugin, cleanUpKey }));\n };\n}\n\nexport function changeToLibraryPanel(panel: PanelModel, libraryPanel: LibraryElementDTO): ThunkResult<void> {\n return async (dispatch, getStore) => {\n const newPluginId = libraryPanel.model.type;\n const oldType = panel.type;\n\n // Update model but preserve gridPos & id\n panel.restoreModel({\n ...libraryPanel.model,\n gridPos: panel.gridPos,\n id: panel.id,\n libraryPanel: toPanelModelLibraryPanel(libraryPanel),\n });\n\n // a new library panel usually means new queries, clear any current result\n panel.getQueryRunner().clearLastResult();\n\n // Handle plugin change\n if (oldType !== newPluginId) {\n const store = getStore();\n let plugin = store.plugins.panels[newPluginId];\n\n if (!plugin) {\n plugin = await dispatch(loadPanelPlugin(newPluginId));\n }\n\n const oldKey = panel.key;\n\n panel.pluginLoaded(plugin);\n panel.generateNewKey();\n\n await dispatch(panelModelAndPluginReady({ key: panel.key, plugin, cleanUpKey: oldKey }));\n } else {\n // Even if the plugin is the same, we want to change the key\n // to force a rerender\n const oldKey = panel.key;\n panel.generateNewKey();\n dispatch(changePanelKey({ oldKey, newKey: panel.key }));\n }\n\n panel.configRev = 0;\n panel.refresh();\n\n panel.events.publish(PanelQueriesChangedEvent);\n panel.events.publish(PanelOptionsChangedEvent);\n };\n}\n","import { createSlice, Draft, PayloadAction } from '@reduxjs/toolkit';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { AngularComponent } from '@grafana/runtime';\n\nexport type RootPanelsState = Record<string, PanelState>;\n\nexport interface PanelState {\n plugin?: PanelPlugin;\n angularComponent?: AngularComponent;\n instanceState?: any | null;\n}\n\nexport const initialState: RootPanelsState = {};\n\nconst panelsSlice = createSlice({\n name: 'panels',\n initialState,\n reducers: {\n panelModelAndPluginReady: (state, action: PayloadAction<PanelModelAndPluginReadyPayload>) => {\n if (action.payload.cleanUpKey) {\n cleanUpAngularComponent(state[action.payload.cleanUpKey]);\n delete state[action.payload.cleanUpKey];\n }\n\n state[action.payload.key] = {\n plugin: action.payload.plugin,\n };\n },\n changePanelKey: (state, action: PayloadAction<{ oldKey: string; newKey: string }>) => {\n state[action.payload.newKey] = state[action.payload.oldKey];\n delete state[action.payload.oldKey];\n },\n removePanel: (state, action: PayloadAction<{ key: string }>) => {\n delete state[action.payload.key];\n },\n removePanels: (state, action: PayloadAction<{ keys: string[] }>) => {\n for (const key of action.payload.keys) {\n delete state[key];\n }\n },\n setPanelInstanceState: (state, action: PayloadAction<SetPanelInstanceStatePayload>) => {\n state[action.payload.key].instanceState = action.payload.value;\n },\n setPanelAngularComponent: (state, action: PayloadAction<SetPanelAngularComponentPayload>) => {\n const panelState = state[action.payload.key];\n cleanUpAngularComponent(panelState);\n panelState.angularComponent = action.payload.angularComponent;\n },\n },\n});\n\nexport function cleanUpAngularComponent(panelState?: Draft<PanelState>) {\n if (panelState?.angularComponent) {\n panelState.angularComponent.destroy();\n }\n}\n\nexport interface PanelModelAndPluginReadyPayload {\n key: string;\n plugin: PanelPlugin;\n /** Used to cleanup previous state when we change key (used when switching panel plugin) */\n cleanUpKey?: string;\n}\n\nexport interface SetPanelAngularComponentPayload {\n key: string;\n angularComponent: AngularComponent;\n}\n\nexport interface SetPanelInstanceStatePayload {\n key: string;\n value: any;\n}\n\nexport const {\n panelModelAndPluginReady,\n setPanelAngularComponent,\n setPanelInstanceState,\n changePanelKey,\n removePanel,\n removePanels,\n} = panelsSlice.actions;\n\nexport const panelsReducer = panelsSlice.reducer;\n\nexport default {\n panels: panelsReducer,\n};\n","// Libraries\nimport { Location } from 'history';\nimport { pickBy } from 'lodash';\n\n// Utils\nimport { locationUtil, urlUtil, rangeUtil } from '@grafana/data';\nimport { getBackendSrv, locationService } from '@grafana/runtime';\n\nexport const queryParamsToPreserve: { [key: string]: boolean } = {\n kiosk: true,\n autofitpanels: true,\n orgId: true,\n};\n\nexport class PlaylistSrv {\n private nextTimeoutId: any;\n private declare dashboards: Array<{ url: string }>;\n private index = 0;\n private declare interval: number;\n private declare startUrl: string;\n private numberOfLoops = 0;\n private declare validPlaylistUrl: string;\n private locationListenerUnsub?: () => void;\n\n isPlaying = false;\n\n constructor() {\n this.locationUpdated = this.locationUpdated.bind(this);\n }\n\n next() {\n clearTimeout(this.nextTimeoutId);\n\n const playedAllDashboards = this.index > this.dashboards.length - 1;\n if (playedAllDashboards) {\n this.numberOfLoops++;\n\n // This does full reload of the playlist to keep memory in check due to existing leaks but at the same time\n // we do not want page to flicker after each full loop.\n if (this.numberOfLoops >= 3) {\n window.location.href = this.startUrl;\n return;\n }\n this.index = 0;\n }\n\n const dash = this.dashboards[this.index];\n const queryParams = locationService.getSearchObject();\n const filteredParams = pickBy(queryParams, (value: any, key: string) => queryParamsToPreserve[key]);\n const nextDashboardUrl = locationUtil.stripBaseFromUrl(dash.url);\n\n this.index++;\n this.validPlaylistUrl = nextDashboardUrl;\n this.nextTimeoutId = setTimeout(() => this.next(), this.interval);\n\n locationService.push(nextDashboardUrl + '?' + urlUtil.toUrlParams(filteredParams));\n }\n\n prev() {\n this.index = Math.max(this.index - 2, 0);\n this.next();\n }\n\n // Detect url changes not caused by playlist srv and stop playlist\n locationUpdated(location: Location) {\n if (location.pathname !== this.validPlaylistUrl) {\n this.stop();\n }\n }\n\n start(playlistUid: string) {\n this.stop();\n\n this.startUrl = window.location.href;\n this.index = 0;\n this.isPlaying = true;\n\n // setup location tracking\n this.locationListenerUnsub = locationService.getHistory().listen(this.locationUpdated);\n\n return getBackendSrv()\n .get(`/api/playlists/${playlistUid}`)\n .then((playlist: any) => {\n return getBackendSrv()\n .get(`/api/playlists/${playlistUid}/dashboards`)\n .then((dashboards: any) => {\n this.dashboards = dashboards;\n this.interval = rangeUtil.intervalToMs(playlist.interval);\n this.next();\n });\n });\n }\n\n stop() {\n if (!this.isPlaying) {\n return;\n }\n\n this.index = 0;\n this.isPlaying = false;\n\n if (this.locationListenerUnsub) {\n this.locationListenerUnsub();\n }\n\n if (this.nextTimeoutId) {\n clearTimeout(this.nextTimeoutId);\n }\n\n if (locationService.getSearchObject().kiosk) {\n locationService.partial({ kiosk: null });\n }\n }\n}\n\nexport const playlistSrv = new PlaylistSrv();\n","import { PluginError, PluginMeta, renderMarkdown } from '@grafana/data';\nimport { getBackendSrv, isFetchError } from '@grafana/runtime';\n\nimport { API_ROOT, GCOM_API_ROOT } from './constants';\nimport { isLocalPluginVisible, isRemotePluginVisible } from './helpers';\nimport { LocalPlugin, RemotePlugin, CatalogPluginDetails, Version, PluginVersion } from './types';\n\nexport async function getPluginDetails(id: string): Promise<CatalogPluginDetails> {\n const remote = await getRemotePlugin(id);\n const isPublished = Boolean(remote);\n\n const [localPlugins, versions, localReadme] = await Promise.all([\n getLocalPlugins(),\n getPluginVersions(id, isPublished),\n getLocalPluginReadme(id),\n ]);\n\n const local = localPlugins.find((p) => p.id === id);\n const dependencies = local?.dependencies || remote?.json?.dependencies;\n\n return {\n grafanaDependency: dependencies?.grafanaDependency ?? dependencies?.grafanaVersion ?? '',\n pluginDependencies: dependencies?.plugins || [],\n links: local?.info.links || remote?.json?.info.links || [],\n readme: localReadme || remote?.readme,\n versions,\n };\n}\n\nexport async function getRemotePlugins(): Promise<RemotePlugin[]> {\n const { items: remotePlugins }: { items: RemotePlugin[] } = await getBackendSrv().get(`${GCOM_API_ROOT}/plugins`);\n\n return remotePlugins.filter(isRemotePluginVisible);\n}\n\nexport async function getPluginErrors(): Promise<PluginError[]> {\n try {\n return await getBackendSrv().get(`${API_ROOT}/errors`);\n } catch (error) {\n return [];\n }\n}\n\nasync function getRemotePlugin(id: string): Promise<RemotePlugin | undefined> {\n try {\n return await getBackendSrv().get(`${GCOM_API_ROOT}/plugins/${id}`, {});\n } catch (error) {\n if (isFetchError(error)) {\n // It can happen that GCOM is not available, in that case we show a limited set of information to the user.\n error.isHandled = true;\n }\n return;\n }\n}\n\nasync function getPluginVersions(id: string, isPublished: boolean): Promise<Version[]> {\n try {\n if (!isPublished) {\n return [];\n }\n\n const versions: { items: PluginVersion[] } = await getBackendSrv().get(`${GCOM_API_ROOT}/plugins/${id}/versions`);\n\n return (versions.items || []).map((v) => ({\n version: v.version,\n createdAt: v.createdAt,\n isCompatible: v.isCompatible,\n grafanaDependency: v.grafanaDependency,\n }));\n } catch (error) {\n if (isFetchError(error)) {\n // It can happen that GCOM is not available, in that case we show a limited set of information to the user.\n error.isHandled = true;\n }\n return [];\n }\n}\n\nasync function getLocalPluginReadme(id: string): Promise<string> {\n try {\n const markdown: string = await getBackendSrv().get(`${API_ROOT}/${id}/markdown/help`);\n const markdownAsHtml = markdown ? renderMarkdown(markdown) : '';\n\n return markdownAsHtml;\n } catch (error) {\n if (isFetchError(error)) {\n error.isHandled = true;\n }\n return '';\n }\n}\n\nexport async function getLocalPlugins(): Promise<LocalPlugin[]> {\n const localPlugins: LocalPlugin[] = await getBackendSrv().get(`${API_ROOT}`, { embedded: 0 });\n\n return localPlugins.filter(isLocalPluginVisible);\n}\n\nexport async function installPlugin(id: string) {\n // This will install the latest compatible version based on the logic\n // on the backend.\n return await getBackendSrv().post(`${API_ROOT}/${id}/install`);\n}\n\nexport async function uninstallPlugin(id: string) {\n return await getBackendSrv().post(`${API_ROOT}/${id}/uninstall`);\n}\n\nexport async function updatePluginSettings(id: string, data: Partial<PluginMeta>) {\n const response = await getBackendSrv().datasourceRequest({\n url: `/api/plugins/${id}/settings`,\n method: 'POST',\n data,\n });\n\n return response?.data;\n}\n\nexport const api = {\n getRemotePlugins,\n getInstalledPlugins: getLocalPlugins,\n installPlugin,\n uninstallPlugin,\n};\n","export const API_ROOT = '/api/plugins';\nexport const GCOM_API_ROOT = '/api/gnet';\n\n// Used for prefixing the Redux actions\nexport const STATE_PREFIX = 'plugins';\n","import { PluginSignatureStatus, dateTimeParse, PluginError, PluginType, PluginErrorCode } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Settings } from 'app/core/config';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\n\nimport { CatalogPlugin, LocalPlugin, RemotePlugin, Version } from './types';\n\nexport function mergeLocalsAndRemotes(\n local: LocalPlugin[] = [],\n remote: RemotePlugin[] = [],\n errors?: PluginError[]\n): CatalogPlugin[] {\n const catalogPlugins: CatalogPlugin[] = [];\n const errorByPluginId = groupErrorsByPluginId(errors);\n\n // add locals\n local.forEach((l) => {\n const remotePlugin = remote.find((r) => r.slug === l.id);\n const error = errorByPluginId[l.id];\n\n if (!remotePlugin) {\n catalogPlugins.push(mergeLocalAndRemote(l, undefined, error));\n }\n });\n\n // add remote\n remote.forEach((r) => {\n const localPlugin = local.find((l) => l.id === r.slug);\n const error = errorByPluginId[r.slug];\n\n catalogPlugins.push(mergeLocalAndRemote(localPlugin, r, error));\n });\n\n return catalogPlugins;\n}\n\nexport function mergeLocalAndRemote(local?: LocalPlugin, remote?: RemotePlugin, error?: PluginError): CatalogPlugin {\n if (!local && remote) {\n return mapRemoteToCatalog(remote, error);\n }\n\n if (local && !remote) {\n return mapLocalToCatalog(local, error);\n }\n\n return mapToCatalogPlugin(local, remote, error);\n}\n\nexport function mapRemoteToCatalog(plugin: RemotePlugin, error?: PluginError): CatalogPlugin {\n const {\n name,\n slug: id,\n description,\n version,\n orgName,\n popularity,\n downloads,\n typeCode,\n updatedAt,\n createdAt: publishedAt,\n status,\n } = plugin;\n\n const isDisabled = !!error || isDisabledSecretsPlugin(typeCode);\n return {\n description,\n downloads,\n id,\n info: {\n logos: {\n small: `https://grafana.com/api/plugins/${id}/versions/${version}/logos/small`,\n large: `https://grafana.com/api/plugins/${id}/versions/${version}/logos/large`,\n },\n },\n name,\n orgName,\n popularity,\n publishedAt,\n signature: getPluginSignature({ remote: plugin, error }),\n updatedAt,\n hasUpdate: false,\n isPublished: true,\n isInstalled: isDisabled,\n isDisabled: isDisabled,\n isCore: plugin.internal,\n isDev: false,\n isEnterprise: status === 'enterprise',\n type: typeCode,\n error: error?.errorCode,\n };\n}\n\nexport function mapLocalToCatalog(plugin: LocalPlugin, error?: PluginError): CatalogPlugin {\n const {\n name,\n info: { description, version, logos, updated, author },\n id,\n dev,\n type,\n signature,\n signatureOrg,\n signatureType,\n hasUpdate,\n } = plugin;\n\n const isDisabled = !!error || isDisabledSecretsPlugin(type);\n return {\n description,\n downloads: 0,\n id,\n info: { logos },\n name,\n orgName: author.name,\n popularity: 0,\n publishedAt: '',\n signature: getPluginSignature({ local: plugin, error }),\n signatureOrg,\n signatureType,\n updatedAt: updated,\n installedVersion: version,\n hasUpdate,\n isInstalled: true,\n isDisabled: isDisabled,\n isCore: signature === 'internal',\n isPublished: false,\n isDev: Boolean(dev),\n isEnterprise: false,\n type,\n error: error?.errorCode,\n };\n}\n\n// TODO: change the signature by removing the optionals for local and remote.\nexport function mapToCatalogPlugin(local?: LocalPlugin, remote?: RemotePlugin, error?: PluginError): CatalogPlugin {\n const installedVersion = local?.info.version;\n const id = remote?.slug || local?.id || '';\n const type = local?.type || remote?.typeCode;\n const isDisabled = !!error || isDisabledSecretsPlugin(type);\n\n let logos = {\n small: `/public/img/icn-${type}.svg`,\n large: `/public/img/icn-${type}.svg`,\n };\n\n if (remote) {\n logos = {\n small: `https://grafana.com/api/plugins/${id}/versions/${remote.version}/logos/small`,\n large: `https://grafana.com/api/plugins/${id}/versions/${remote.version}/logos/large`,\n };\n } else if (local && local.info.logos) {\n logos = local.info.logos;\n }\n\n return {\n description: local?.info.description || remote?.description || '',\n downloads: remote?.downloads || 0,\n hasUpdate: local?.hasUpdate || false,\n id,\n info: {\n logos,\n },\n isCore: Boolean(remote?.internal || local?.signature === PluginSignatureStatus.internal),\n isDev: Boolean(local?.dev),\n isEnterprise: remote?.status === 'enterprise',\n isInstalled: Boolean(local) || isDisabled,\n isDisabled: isDisabled,\n isPublished: true,\n // TODO<check if we would like to keep preferring the remote version>\n name: remote?.name || local?.name || '',\n // TODO<check if we would like to keep preferring the remote version>\n orgName: remote?.orgName || local?.info.author.name || '',\n popularity: remote?.popularity || 0,\n publishedAt: remote?.createdAt || '',\n type,\n signature: getPluginSignature({ local, remote, error }),\n signatureOrg: local?.signatureOrg || remote?.versionSignedByOrgName,\n signatureType: local?.signatureType || remote?.versionSignatureType || remote?.signatureType || undefined,\n // TODO<check if we would like to keep preferring the remote version>\n updatedAt: remote?.updatedAt || local?.info.updated || '',\n installedVersion,\n error: error?.errorCode,\n };\n}\n\nexport const getExternalManageLink = (pluginId: string) => `${config.pluginCatalogURL}${pluginId}`;\n\nexport enum Sorters {\n nameAsc = 'nameAsc',\n nameDesc = 'nameDesc',\n updated = 'updated',\n published = 'published',\n downloads = 'downloads',\n}\n\nexport const sortPlugins = (plugins: CatalogPlugin[], sortBy: Sorters) => {\n const sorters: { [name: string]: (a: CatalogPlugin, b: CatalogPlugin) => number } = {\n nameAsc: (a: CatalogPlugin, b: CatalogPlugin) => a.name.localeCompare(b.name),\n nameDesc: (a: CatalogPlugin, b: CatalogPlugin) => b.name.localeCompare(a.name),\n updated: (a: CatalogPlugin, b: CatalogPlugin) =>\n dateTimeParse(b.updatedAt).valueOf() - dateTimeParse(a.updatedAt).valueOf(),\n published: (a: CatalogPlugin, b: CatalogPlugin) =>\n dateTimeParse(b.publishedAt).valueOf() - dateTimeParse(a.publishedAt).valueOf(),\n downloads: (a: CatalogPlugin, b: CatalogPlugin) => b.downloads - a.downloads,\n };\n\n if (sorters[sortBy]) {\n return plugins.sort(sorters[sortBy]);\n }\n\n return plugins;\n};\n\nfunction groupErrorsByPluginId(errors: PluginError[] = []): Record<string, PluginError | undefined> {\n return errors.reduce((byId, error) => {\n byId[error.pluginId] = error;\n return byId;\n }, {} as Record<string, PluginError | undefined>);\n}\n\nfunction getPluginSignature(options: {\n local?: LocalPlugin;\n remote?: RemotePlugin;\n error?: PluginError;\n}): PluginSignatureStatus {\n const { error, local, remote } = options;\n\n if (error) {\n switch (error.errorCode) {\n case PluginErrorCode.invalidSignature:\n return PluginSignatureStatus.invalid;\n case PluginErrorCode.missingSignature:\n return PluginSignatureStatus.missing;\n case PluginErrorCode.modifiedSignature:\n return PluginSignatureStatus.modified;\n }\n }\n\n if (local?.signature) {\n return local.signature;\n }\n\n if (remote?.signatureType || remote?.versionSignatureType) {\n return PluginSignatureStatus.valid;\n }\n\n return PluginSignatureStatus.missing;\n}\n\n// Updates the core Grafana config to have the correct list available panels\nexport const updatePanels = () =>\n getBackendSrv()\n .get('/api/frontend/settings')\n .then((settings: Settings) => {\n config.panels = settings.panels;\n });\n\nexport function getLatestCompatibleVersion(versions: Version[] | undefined): Version | undefined {\n if (!versions) {\n return;\n }\n const [latest] = versions.filter((v) => Boolean(v.isCompatible));\n\n return latest;\n}\n\nexport const isInstallControlsEnabled = () => config.pluginAdminEnabled;\n\nexport const isLocalPluginVisible = (p: LocalPlugin) => isPluginVisible(p.id);\n\nexport const isRemotePluginVisible = (p: RemotePlugin) => isPluginVisible(p.slug);\n\nfunction isPluginVisible(id: string) {\n const { pluginCatalogHiddenPlugins }: { pluginCatalogHiddenPlugins: string[] } = config;\n\n return !pluginCatalogHiddenPlugins.includes(id);\n}\n\nfunction isDisabledSecretsPlugin(type?: PluginType): boolean {\n return type === PluginType.secretsmanager && !config.secretsManagerPluginEnabled;\n}\n\nexport function isLocalCorePlugin(local?: LocalPlugin): boolean {\n return Boolean(local?.signature === 'internal');\n}\n","import { config } from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\n\nexport function isGrafanaAdmin(): boolean {\n return config.bootData.user.isGrafanaAdmin;\n}\n\nexport function isOrgAdmin() {\n return contextSrv.hasRole('Admin');\n}\n\nexport function isDataSourceEditor() {\n return (\n contextSrv.hasPermission(AccessControlAction.DataSourcesCreate) &&\n contextSrv.hasPermission(AccessControlAction.DataSourcesWrite)\n );\n}\n","import { createAction, createAsyncThunk, Update } from '@reduxjs/toolkit';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { getBackendSrv, isFetchError } from '@grafana/runtime';\nimport { importPanelPlugin } from 'app/features/plugins/importPanelPlugin';\nimport { StoreState, ThunkResult } from 'app/types';\n\nimport { invalidatePluginInCache } from '../../pluginCacheBuster';\nimport {\n getRemotePlugins,\n getPluginErrors,\n getLocalPlugins,\n getPluginDetails,\n installPlugin,\n uninstallPlugin,\n} from '../api';\nimport { STATE_PREFIX } from '../constants';\nimport { mergeLocalsAndRemotes, updatePanels } from '../helpers';\nimport { CatalogPlugin, RemotePlugin } from '../types';\n\nexport const fetchAll = createAsyncThunk(`${STATE_PREFIX}/fetchAll`, async (_, thunkApi) => {\n try {\n const { dispatch } = thunkApi;\n const [localPlugins, pluginErrors, { payload: remotePlugins }] = await Promise.all([\n getLocalPlugins(),\n getPluginErrors(),\n dispatch(fetchRemotePlugins()),\n ]);\n\n return mergeLocalsAndRemotes(localPlugins, remotePlugins, pluginErrors);\n } catch (e) {\n return thunkApi.rejectWithValue('Unknown error.');\n }\n});\n\nexport const fetchRemotePlugins = createAsyncThunk<RemotePlugin[], void, { rejectValue: RemotePlugin[] }>(\n `${STATE_PREFIX}/fetchRemotePlugins`,\n async (_, thunkApi) => {\n try {\n return await getRemotePlugins();\n } catch (error) {\n if (isFetchError(error)) {\n error.isHandled = true;\n }\n return thunkApi.rejectWithValue([]);\n }\n }\n);\n\nexport const fetchDetails = createAsyncThunk(`${STATE_PREFIX}/fetchDetails`, async (id: string, thunkApi) => {\n try {\n const details = await getPluginDetails(id);\n\n return {\n id,\n changes: { details },\n } as Update<CatalogPlugin>;\n } catch (e) {\n return thunkApi.rejectWithValue('Unknown error.');\n }\n});\n\n// We are also using the install API endpoint to update the plugin\nexport const install = createAsyncThunk(\n `${STATE_PREFIX}/install`,\n async ({ id, version, isUpdating = false }: { id: string; version?: string; isUpdating?: boolean }, thunkApi) => {\n const changes = isUpdating\n ? { isInstalled: true, installedVersion: version, hasUpdate: false }\n : { isInstalled: true, installedVersion: version };\n try {\n await installPlugin(id);\n await updatePanels();\n\n if (isUpdating) {\n invalidatePluginInCache(id);\n }\n\n return { id, changes } as Update<CatalogPlugin>;\n } catch (e) {\n console.error(e);\n\n return thunkApi.rejectWithValue('Unknown error.');\n }\n }\n);\n\nexport const uninstall = createAsyncThunk(`${STATE_PREFIX}/uninstall`, async (id: string, thunkApi) => {\n try {\n await uninstallPlugin(id);\n await updatePanels();\n\n invalidatePluginInCache(id);\n\n return {\n id,\n changes: { isInstalled: false, installedVersion: undefined },\n } as Update<CatalogPlugin>;\n } catch (e) {\n console.error(e);\n\n return thunkApi.rejectWithValue('Unknown error.');\n }\n});\n\n// We need this to be backwards-compatible with other parts of Grafana.\n// (Originally in \"public/app/features/plugins/state/actions.ts\")\n// TODO<remove once the \"plugin_admin_enabled\" feature flag is removed>\nexport const loadPluginDashboards = createAsyncThunk(`${STATE_PREFIX}/loadPluginDashboards`, async (_, thunkApi) => {\n const state = thunkApi.getState() as StoreState;\n const dataSourceType = state.dataSources.dataSource.type;\n const url = `api/plugins/${dataSourceType}/dashboards`;\n\n return getBackendSrv().get(url);\n});\n\nexport const panelPluginLoaded = createAction<PanelPlugin>(`${STATE_PREFIX}/panelPluginLoaded`);\n\n// We need this to be backwards-compatible with other parts of Grafana.\n// (Originally in \"public/app/features/plugins/state/actions.ts\")\n// It cannot be constructed with `createAsyncThunk()` as we need the return value on the call-site,\n// and we cannot easily change the call-site to unwrap the result.\n// TODO<remove once the \"plugin_admin_enabled\" feature flag is removed>\nexport const loadPanelPlugin = (id: string): ThunkResult<Promise<PanelPlugin>> => {\n return async (dispatch, getStore) => {\n let plugin = getStore().plugins.panels[id];\n\n if (!plugin) {\n plugin = await importPanelPlugin(id);\n\n // second check to protect against raise condition\n if (!getStore().plugins.panels[id]) {\n dispatch(panelPluginLoaded(plugin));\n }\n }\n\n return plugin;\n };\n};\n","import { createSlice, createEntityAdapter, Reducer, AnyAction, PayloadAction } from '@reduxjs/toolkit';\n\nimport { PanelPlugin } from '@grafana/data';\n\nimport { STATE_PREFIX } from '../constants';\nimport { CatalogPlugin, PluginListDisplayMode, ReducerState, RequestStatus } from '../types';\n\nimport { fetchAll, fetchDetails, install, uninstall, loadPluginDashboards, panelPluginLoaded } from './actions';\n\nexport const pluginsAdapter = createEntityAdapter<CatalogPlugin>();\n\nconst isPendingRequest = (action: AnyAction) => new RegExp(`${STATE_PREFIX}\\/(.*)\\/pending`).test(action.type);\n\nconst isFulfilledRequest = (action: AnyAction) => new RegExp(`${STATE_PREFIX}\\/(.*)\\/fulfilled`).test(action.type);\n\nconst isRejectedRequest = (action: AnyAction) => new RegExp(`${STATE_PREFIX}\\/(.*)\\/rejected`).test(action.type);\n\n// Extract the trailing '/pending', '/rejected', or '/fulfilled'\nconst getOriginalActionType = (type: string) => {\n const separator = type.lastIndexOf('/');\n\n return type.substring(0, separator);\n};\n\nexport const initialState: ReducerState = {\n items: pluginsAdapter.getInitialState(),\n requests: {},\n settings: {\n displayMode: PluginListDisplayMode.Grid,\n },\n // Backwards compatibility\n // (we need to have the following fields in the store as well to be backwards compatible with other parts of Grafana)\n // TODO<remove once the \"plugin_admin_enabled\" feature flag is removed>\n plugins: [],\n errors: [],\n searchQuery: '',\n hasFetched: false,\n dashboards: [],\n isLoadingPluginDashboards: false,\n panels: {},\n};\n\nconst slice = createSlice({\n name: 'plugins',\n initialState,\n reducers: {\n setDisplayMode(state, action: PayloadAction<PluginListDisplayMode>) {\n state.settings.displayMode = action.payload;\n },\n },\n extraReducers: (builder) =>\n builder\n // Fetch All\n .addCase(fetchAll.fulfilled, (state, action) => {\n pluginsAdapter.upsertMany(state.items, action.payload);\n })\n // Fetch Details\n .addCase(fetchDetails.fulfilled, (state, action) => {\n pluginsAdapter.updateOne(state.items, action.payload);\n })\n // Install\n .addCase(install.fulfilled, (state, action) => {\n pluginsAdapter.updateOne(state.items, action.payload);\n })\n // Uninstall\n .addCase(uninstall.fulfilled, (state, action) => {\n pluginsAdapter.updateOne(state.items, action.payload);\n })\n // Load a panel plugin (backward-compatibility)\n // TODO<remove once the \"plugin_admin_enabled\" feature flag is removed>\n .addCase(panelPluginLoaded, (state, action: PayloadAction<PanelPlugin>) => {\n state.panels[action.payload.meta.id] = action.payload;\n })\n // Start loading panel dashboards (backward-compatibility)\n // TODO<remove once the \"plugin_admin_enabled\" feature flag is removed>\n .addCase(loadPluginDashboards.pending, (state, action) => {\n state.isLoadingPluginDashboards = true;\n state.dashboards = [];\n })\n // Load panel dashboards (backward-compatibility)\n // TODO<remove once the \"plugin_admin_enabled\" feature flag is removed>\n .addCase(loadPluginDashboards.fulfilled, (state, action) => {\n state.isLoadingPluginDashboards = false;\n // eslint-disable-next-line\n state.dashboards = action.payload as any; // WritableDraft<PluginDashboard>[],...>\n })\n .addMatcher(isPendingRequest, (state, action) => {\n state.requests[getOriginalActionType(action.type)] = {\n status: RequestStatus.Pending,\n };\n })\n .addMatcher(isFulfilledRequest, (state, action) => {\n state.requests[getOriginalActionType(action.type)] = {\n status: RequestStatus.Fulfilled,\n };\n })\n .addMatcher(isRejectedRequest, (state, action) => {\n state.requests[getOriginalActionType(action.type)] = {\n status: RequestStatus.Rejected,\n error: action.payload,\n };\n }),\n});\n\nexport const { setDisplayMode } = slice.actions;\nexport const reducer: Reducer<ReducerState, AnyAction> = slice.reducer;\n","import { EntityState } from '@reduxjs/toolkit';\n\nimport {\n PluginType,\n PluginSignatureStatus,\n PluginSignatureType,\n PluginDependencies,\n PluginErrorCode,\n} from '@grafana/data';\nimport { IconName } from '@grafana/ui';\nimport { StoreState, PluginsState } from 'app/types';\n\nexport type PluginTypeCode = 'app' | 'panel' | 'datasource';\n\nexport enum PluginListDisplayMode {\n Grid = 'grid',\n List = 'list',\n}\n\nexport enum PluginAdminRoutes {\n Home = 'plugins-home',\n Browse = 'plugins-browse',\n Details = 'plugins-details',\n HomeAdmin = 'plugins-home-admin',\n BrowseAdmin = 'plugins-browse-admin',\n DetailsAdmin = 'plugins-details-admin',\n}\n\nexport enum PluginIconName {\n app = 'apps',\n datasource = 'database',\n panel = 'credit-card',\n renderer = 'capture',\n secretsmanager = 'key-skeleton-alt',\n}\n\nexport interface CatalogPlugin {\n description: string;\n downloads: number;\n hasUpdate: boolean;\n id: string;\n info: CatalogPluginInfo;\n isDev: boolean;\n isCore: boolean;\n isEnterprise: boolean;\n isInstalled: boolean;\n isDisabled: boolean;\n // `isPublished` is TRUE if the plugin is published to grafana.com\n isPublished: boolean;\n name: string;\n orgName: string;\n signature: PluginSignatureStatus;\n signatureType?: PluginSignatureType;\n signatureOrg?: string;\n popularity: number;\n publishedAt: string;\n type?: PluginType;\n updatedAt: string;\n installedVersion?: string;\n details?: CatalogPluginDetails;\n error?: PluginErrorCode;\n}\n\nexport interface CatalogPluginDetails {\n readme?: string;\n versions?: Version[];\n links: Array<{\n name: string;\n url: string;\n }>;\n grafanaDependency?: string;\n pluginDependencies?: PluginDependencies['plugins'];\n}\n\nexport interface CatalogPluginInfo {\n logos: {\n large: string;\n small: string;\n };\n}\n\nexport type RemotePlugin = {\n createdAt: string;\n description: string;\n downloads: number;\n downloadSlug: string;\n featured: number;\n id: number;\n internal: boolean;\n json?: {\n dependencies: PluginDependencies;\n info: {\n links: Array<{\n name: string;\n url: string;\n }>;\n };\n };\n links: Array<{ rel: string; href: string }>;\n name: string;\n orgId: number;\n orgName: string;\n orgSlug: string;\n orgUrl: string;\n packages: {\n [arch: string]: {\n packageName: string;\n downloadUrl: string;\n };\n };\n popularity: number;\n readme?: string;\n signatureType: PluginSignatureType | '';\n slug: string;\n status: string;\n typeCode: PluginType;\n typeId: number;\n typeName: string;\n updatedAt: string;\n url: string;\n userId: number;\n verified: boolean;\n version: string;\n versionSignatureType: PluginSignatureType | '';\n versionSignedByOrg: string;\n versionSignedByOrgName: string;\n versionStatus: string;\n};\n\nexport type LocalPlugin = {\n category: string;\n defaultNavUrl: string;\n dev?: boolean;\n enabled: boolean;\n hasUpdate: boolean;\n id: string;\n info: {\n author: Rel;\n description: string;\n links?: Rel[];\n logos: {\n small: string;\n large: string;\n };\n build: Build;\n screenshots?: Array<{\n path: string;\n name: string;\n }> | null;\n version: string;\n updated: string;\n };\n name: string;\n pinned: boolean;\n signature: PluginSignatureStatus;\n signatureOrg: string;\n signatureType: PluginSignatureType;\n state: string;\n type: PluginType;\n dependencies: PluginDependencies;\n};\n\ninterface Rel {\n name: string;\n url: string;\n}\n\nexport interface Build {\n time?: number;\n repo?: string;\n branch?: string;\n hash?: string;\n}\n\nexport interface Version {\n version: string;\n createdAt: string;\n isCompatible: boolean;\n grafanaDependency: string | null;\n}\n\nexport interface PluginDetails {\n remote?: RemotePlugin;\n remoteVersions?: Version[];\n local?: LocalPlugin;\n}\n\nexport interface Org {\n slug: string;\n name: string;\n url: string;\n createdAt: string;\n updatedAt: string;\n avatar: string;\n avatarUrl: string;\n}\n\nexport type CatalogPluginsState = {\n loading: boolean;\n error?: Error;\n plugins: CatalogPlugin[];\n};\n\nexport enum PluginStatus {\n INSTALL = 'INSTALL',\n UNINSTALL = 'UNINSTALL',\n UPDATE = 'UPDATE',\n REINSTALL = 'REINSTALL',\n}\n\nexport enum PluginTabLabels {\n OVERVIEW = 'Overview',\n VERSIONS = 'Version history',\n CONFIG = 'Config',\n DASHBOARDS = 'Dashboards',\n USAGE = 'Usage',\n}\n\nexport enum PluginTabIds {\n OVERVIEW = 'overview',\n VERSIONS = 'version-history',\n CONFIG = 'config',\n DASHBOARDS = 'dashboards',\n USAGE = 'usage',\n}\n\nexport enum RequestStatus {\n Pending = 'Pending',\n Fulfilled = 'Fulfilled',\n Rejected = 'Rejected',\n}\nexport type RemotePluginResponse = {\n plugins: RemotePlugin[];\n error?: Error;\n};\n\nexport type RequestInfo = {\n status: RequestStatus;\n // The whole error object\n error?: any;\n // An optional error message\n errorMessage?: string;\n};\n\nexport type PluginDetailsTab = {\n label: PluginTabLabels | string;\n icon?: IconName | string;\n id: PluginTabIds | string;\n href?: string;\n};\n\n// TODO<remove `PluginsState &` when the \"plugin_admin_enabled\" feature flag is removed>\nexport type ReducerState = PluginsState & {\n items: EntityState<CatalogPlugin>;\n requests: Record<string, RequestInfo>;\n settings: {\n displayMode: PluginListDisplayMode;\n };\n};\n\n// TODO<remove when the \"plugin_admin_enabled\" feature flag is removed>\nexport type PluginCatalogStoreState = StoreState & { plugins: ReducerState };\n\n// The data that we receive when fetching \"/api/gnet/plugins/<plugin>/versions\"\nexport type PluginVersion = {\n id: number;\n pluginId: number;\n pluginSlug: string;\n version: string;\n url: string;\n commit: string;\n description: string;\n createdAt: string;\n updatedAt?: string;\n downloads: number;\n verified: boolean;\n status: string;\n downloadSlug: string;\n links: Array<{ rel: string; href: string }>;\n isCompatible: boolean;\n grafanaDependency: string | null;\n};\n","import {\n AppEvents,\n DataSourceApi,\n DataSourceInstanceSettings,\n DataSourceRef,\n DataSourceSelectItem,\n ScopedVars,\n} from '@grafana/data';\nimport {\n GetDataSourceListFilters,\n DataSourceSrv as DataSourceService,\n getDataSourceSrv as getDataSourceService,\n TemplateSrv,\n getTemplateSrv,\n getLegacyAngularInjector,\n getBackendSrv,\n} from '@grafana/runtime';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\nimport {\n dataSource as expressionDatasource,\n ExpressionDatasourceUID,\n instanceSettings as expressionInstanceSettings,\n} from 'app/features/expressions/ExpressionDatasource';\n\nimport { isDataSource } from '../variables/guard';\n\nimport { importDataSourcePlugin } from './plugin_loader';\n\nexport class DatasourceSrv implements DataSourceService {\n private datasources: Record<string, DataSourceApi> = {}; // UID\n private settingsMapByName: Record<string, DataSourceInstanceSettings> = {};\n private settingsMapByUid: Record<string, DataSourceInstanceSettings> = {};\n private settingsMapById: Record<string, DataSourceInstanceSettings> = {};\n private defaultName = ''; // actually UID\n\n constructor(private templateSrv: TemplateSrv = getTemplateSrv()) {}\n\n init(settingsMapByName: Record<string, DataSourceInstanceSettings>, defaultName: string) {\n this.datasources = {};\n this.settingsMapByUid = {};\n this.settingsMapByName = settingsMapByName;\n this.defaultName = defaultName;\n\n for (const dsSettings of Object.values(settingsMapByName)) {\n if (!dsSettings.uid) {\n dsSettings.uid = dsSettings.name; // -- Grafana --, -- Mixed etc\n }\n\n this.settingsMapByUid[dsSettings.uid] = dsSettings;\n this.settingsMapById[dsSettings.id] = dsSettings;\n }\n\n // Preload expressions\n this.datasources[ExpressionDatasourceRef.type] = expressionDatasource as any;\n this.datasources[ExpressionDatasourceUID] = expressionDatasource as any;\n this.settingsMapByUid[ExpressionDatasourceRef.uid] = expressionInstanceSettings;\n this.settingsMapByUid[ExpressionDatasourceUID] = expressionInstanceSettings;\n }\n\n getDataSourceSettingsByUid(uid: string): DataSourceInstanceSettings | undefined {\n return this.settingsMapByUid[uid];\n }\n\n getInstanceSettings(\n ref: string | null | undefined | DataSourceRef,\n scopedVars?: ScopedVars\n ): DataSourceInstanceSettings | undefined {\n const isstring = typeof ref === 'string';\n let nameOrUid = isstring ? (ref as string) : ((ref as any)?.uid as string | undefined);\n\n if (nameOrUid === 'default' || nameOrUid === null || nameOrUid === undefined) {\n if (!isstring && ref) {\n const type = (ref as any)?.type as string;\n if (type === ExpressionDatasourceRef.type) {\n return expressionDatasource.instanceSettings;\n } else if (type) {\n console.log('FIND Default instance for datasource type?', ref);\n }\n }\n return this.settingsMapByUid[this.defaultName] ?? this.settingsMapByName[this.defaultName];\n }\n\n // Complex logic to support template variable data source names\n // For this we just pick the current or first data source in the variable\n if (nameOrUid[0] === '$') {\n const interpolatedName = this.templateSrv.replace(nameOrUid, scopedVars, variableInterpolation);\n\n let dsSettings;\n\n if (interpolatedName === 'default') {\n dsSettings = this.settingsMapByName[this.defaultName];\n } else {\n dsSettings = this.settingsMapByUid[interpolatedName] ?? this.settingsMapByName[interpolatedName];\n }\n\n if (!dsSettings) {\n return undefined;\n }\n\n // Return an instance with un-interpolated values for name and uid\n return {\n ...dsSettings,\n isDefault: false,\n name: nameOrUid,\n uid: nameOrUid,\n rawRef: { type: dsSettings.type, uid: dsSettings.uid },\n };\n }\n\n return this.settingsMapByUid[nameOrUid] ?? this.settingsMapByName[nameOrUid];\n }\n\n get(ref?: string | DataSourceRef | null, scopedVars?: ScopedVars): Promise<DataSourceApi> {\n let nameOrUid = typeof ref === 'string' ? (ref as string) : ((ref as any)?.uid as string | undefined);\n if (!nameOrUid) {\n return this.get(this.defaultName);\n }\n\n // Check if nameOrUid matches a uid and then get the name\n const byName = this.settingsMapByName[nameOrUid];\n if (byName) {\n nameOrUid = byName.uid;\n }\n\n // This check is duplicated below, this is here mainly as performance optimization to skip interpolation\n if (this.datasources[nameOrUid]) {\n return Promise.resolve(this.datasources[nameOrUid]);\n }\n\n // Interpolation here is to support template variable in data source selection\n nameOrUid = this.templateSrv.replace(nameOrUid, scopedVars, variableInterpolation);\n\n if (nameOrUid === 'default' && this.defaultName !== 'default') {\n return this.get(this.defaultName);\n }\n\n if (this.datasources[nameOrUid]) {\n return Promise.resolve(this.datasources[nameOrUid]);\n }\n\n return this.loadDatasource(nameOrUid);\n }\n\n async loadDatasource(key: string): Promise<DataSourceApi<any, any>> {\n if (this.datasources[key]) {\n return Promise.resolve(this.datasources[key]);\n }\n\n // find the metadata\n const instanceSettings = this.settingsMapByUid[key] ?? this.settingsMapByName[key] ?? this.settingsMapById[key];\n if (!instanceSettings) {\n return Promise.reject({ message: `Datasource ${key} was not found` });\n }\n\n try {\n const dsPlugin = await importDataSourcePlugin(instanceSettings.meta);\n // check if its in cache now\n if (this.datasources[key]) {\n return this.datasources[key];\n }\n\n // If there is only one constructor argument it is instanceSettings\n const useAngular = dsPlugin.DataSourceClass.length !== 1;\n let instance: DataSourceApi<any, any>;\n\n if (useAngular) {\n instance = getLegacyAngularInjector().instantiate(dsPlugin.DataSourceClass, {\n instanceSettings,\n });\n } else {\n instance = new dsPlugin.DataSourceClass(instanceSettings);\n }\n\n instance.components = dsPlugin.components;\n\n // Some old plugins does not extend DataSourceApi so we need to manually patch them\n if (!(instance instanceof DataSourceApi)) {\n const anyInstance = instance as any;\n anyInstance.name = instanceSettings.name;\n anyInstance.id = instanceSettings.id;\n anyInstance.type = instanceSettings.type;\n anyInstance.meta = instanceSettings.meta;\n anyInstance.uid = instanceSettings.uid;\n (instance as any).getRef = DataSourceApi.prototype.getRef;\n }\n\n // store in instance cache\n this.datasources[key] = instance;\n this.datasources[instance.uid] = instance;\n return instance;\n } catch (err) {\n if (err instanceof Error) {\n appEvents.emit(AppEvents.alertError, [instanceSettings.name + ' plugin failed', err.toString()]);\n }\n return Promise.reject({ message: `Datasource: ${key} was not found` });\n }\n }\n\n getAll(): DataSourceInstanceSettings[] {\n return Object.values(this.settingsMapByName);\n }\n\n getList(filters: GetDataSourceListFilters = {}): DataSourceInstanceSettings[] {\n const base = Object.values(this.settingsMapByName).filter((x) => {\n if (x.meta.id === 'grafana' || x.meta.id === 'mixed' || x.meta.id === 'dashboard') {\n return false;\n }\n if (filters.metrics && !x.meta.metrics) {\n return false;\n }\n if (filters.tracing && !x.meta.tracing) {\n return false;\n }\n if (filters.logs && x.meta.category !== 'logging' && !x.meta.logs) {\n return false;\n }\n if (filters.annotations && !x.meta.annotations) {\n return false;\n }\n if (filters.alerting && !x.meta.alerting) {\n return false;\n }\n if (filters.pluginId && x.meta.id !== filters.pluginId) {\n return false;\n }\n if (filters.filter && !filters.filter(x)) {\n return false;\n }\n if (filters.type && (Array.isArray(filters.type) ? !filters.type.includes(x.type) : filters.type !== x.type)) {\n return false;\n }\n if (\n !filters.all &&\n x.meta.metrics !== true &&\n x.meta.annotations !== true &&\n x.meta.tracing !== true &&\n x.meta.logs !== true &&\n x.meta.alerting !== true\n ) {\n return false;\n }\n return true;\n });\n\n if (filters.variables) {\n for (const variable of this.templateSrv.getVariables()) {\n if (!isDataSource(variable)) {\n continue;\n }\n let dsValue = variable.current.value === 'default' ? this.defaultName : variable.current.value;\n if (Array.isArray(dsValue) && dsValue.length === 1) {\n // Support for multi-value variables with only one selected datasource\n dsValue = dsValue[0];\n }\n const dsSettings = !Array.isArray(dsValue) && this.settingsMapByName[dsValue];\n\n if (dsSettings) {\n const key = `$\\{${variable.name}\\}`;\n base.push({\n ...dsSettings,\n name: key,\n uid: key,\n });\n }\n }\n }\n\n const sorted = base.sort((a, b) => {\n if (a.name.toLowerCase() > b.name.toLowerCase()) {\n return 1;\n }\n if (a.name.toLowerCase() < b.name.toLowerCase()) {\n return -1;\n }\n return 0;\n });\n\n if (!filters.pluginId && !filters.alerting) {\n if (filters.mixed) {\n const mixedInstanceSettings = this.getInstanceSettings('-- Mixed --');\n if (mixedInstanceSettings) {\n base.push(mixedInstanceSettings);\n }\n }\n\n if (filters.dashboard) {\n const dashboardInstanceSettings = this.getInstanceSettings('-- Dashboard --');\n if (dashboardInstanceSettings) {\n base.push(dashboardInstanceSettings);\n }\n }\n\n if (!filters.tracing) {\n const grafanaInstanceSettings = this.getInstanceSettings('-- Grafana --');\n if (grafanaInstanceSettings) {\n base.push(grafanaInstanceSettings);\n }\n }\n }\n\n return sorted;\n }\n\n /**\n * @deprecated use getList\n * */\n getExternal(): DataSourceInstanceSettings[] {\n return this.getList();\n }\n\n /**\n * @deprecated use getList\n * */\n getAnnotationSources() {\n return this.getList({ annotations: true, variables: true }).map((x) => {\n return {\n name: x.name,\n value: x.name,\n meta: x.meta,\n };\n });\n }\n\n /**\n * @deprecated use getList\n * */\n getMetricSources(options?: { skipVariables?: boolean }): DataSourceSelectItem[] {\n return this.getList({ metrics: true, variables: !options?.skipVariables }).map((x) => {\n return {\n name: x.name,\n value: x.name,\n meta: x.meta,\n };\n });\n }\n\n async reload() {\n const settings = await getBackendSrv().get('/api/frontend/settings');\n config.datasources = settings.datasources;\n config.defaultDatasource = settings.defaultDatasource;\n this.init(settings.datasources, settings.defaultDatasource);\n }\n}\n\nexport function variableInterpolation(value: any[]) {\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n}\n\nexport const getDatasourceSrv = (): DatasourceSrv => {\n return getDataSourceService() as DatasourceSrv;\n};\n","import { PanelPlugin, PanelPluginMeta } from '@grafana/data';\nimport config from 'app/core/config';\n\nimport { getPanelPluginLoadError } from '../panel/components/PanelPluginError';\n\nimport { importPluginModule } from './plugin_loader';\n\nconst promiseCache: Record<string, Promise<PanelPlugin>> = {};\nconst panelPluginCache: Record<string, PanelPlugin> = {};\n\nexport function importPanelPlugin(id: string): Promise<PanelPlugin> {\n const loaded = promiseCache[id];\n if (loaded) {\n return loaded;\n }\n\n const meta = config.panels[id];\n\n if (!meta) {\n throw new Error(`Plugin ${id} not found`);\n }\n\n promiseCache[id] = getPanelPlugin(meta);\n\n return promiseCache[id];\n}\n\nexport function importPanelPluginFromMeta(meta: PanelPluginMeta): Promise<PanelPlugin> {\n return getPanelPlugin(meta);\n}\n\nexport function syncGetPanelPlugin(id: string): PanelPlugin | undefined {\n return panelPluginCache[id];\n}\n\nfunction getPanelPlugin(meta: PanelPluginMeta): Promise<PanelPlugin> {\n return importPluginModule(meta.module, meta.info?.version)\n .then((pluginExports) => {\n if (pluginExports.plugin) {\n return pluginExports.plugin as PanelPlugin;\n } else if (pluginExports.PanelCtrl) {\n const plugin = new PanelPlugin(null);\n plugin.angularPanelCtrl = pluginExports.PanelCtrl;\n return plugin;\n }\n throw new Error('missing export: plugin or PanelCtrl');\n })\n .then((plugin) => {\n plugin.meta = meta;\n panelPluginCache[meta.id] = plugin;\n return plugin;\n })\n .catch((err) => {\n // TODO, maybe a different error plugin\n console.warn('Error loading panel plugin: ' + meta.id, err);\n return getPanelPluginLoadError(meta, err);\n });\n}\n","import { clearPluginSettingsCache } from './pluginSettings';\n\nconst cache: Record<string, string> = {};\nconst initializedAt: number = Date.now();\n\ntype CacheablePlugin = {\n path: string;\n version: string;\n};\n\nexport function registerPluginInCache({ path, version }: CacheablePlugin): void {\n if (!cache[path]) {\n cache[path] = encodeURI(version);\n }\n}\n\nexport function invalidatePluginInCache(pluginId: string): void {\n const path = `plugins/${pluginId}/module`;\n if (cache[path]) {\n delete cache[path];\n }\n clearPluginSettingsCache(pluginId);\n}\n\nexport function locateWithCache(load: { address: string }, defaultBust = initializedAt): string {\n const { address } = load;\n const path = extractPath(address);\n\n if (!path) {\n return `${address}?_cache=${defaultBust}`;\n }\n\n const version = cache[path];\n const bust = version || defaultBust;\n return `${address}?_cache=${bust}`;\n}\n\nfunction extractPath(address: string): string | undefined {\n const match = /\\/public\\/(plugins\\/.+\\/module)\\.js/i.exec(address);\n if (!match) {\n return;\n }\n const [_, path] = match;\n if (!path) {\n return;\n }\n return path;\n}\n","import { PluginMeta } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\n\ntype PluginCache = {\n [key: string]: PluginMeta;\n};\n\nconst pluginInfoCache: PluginCache = {};\n\nexport function getPluginSettings(pluginId: string): Promise<PluginMeta> {\n const v = pluginInfoCache[pluginId];\n if (v) {\n return Promise.resolve(v);\n }\n return getBackendSrv()\n .get(`/api/plugins/${pluginId}/settings`)\n .then((settings: any) => {\n pluginInfoCache[pluginId] = settings;\n return settings;\n })\n .catch((err: any) => {\n return Promise.reject(new Error('Unknown Plugin'));\n });\n}\n\nexport const clearPluginSettingsCache = (pluginId?: string) => {\n if (pluginId) {\n return delete pluginInfoCache[pluginId];\n }\n // clear all\n return Object.keys(pluginInfoCache).forEach((key) => delete pluginInfoCache[key]);\n};\n","import { css } from '@emotion/css';\nimport React, { useState, useEffect } from 'react';\n\nimport { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { useStyles2, LinkButton } from '@grafana/ui';\nimport { AlertLabels } from 'app/features/alerting/unified/components/AlertLabels';\nimport { CollapseToggle } from 'app/features/alerting/unified/components/CollapseToggle';\nimport { AlertGroupHeader } from 'app/features/alerting/unified/components/alert-groups/AlertGroupHeader';\nimport { getNotificationsTextColors } from 'app/features/alerting/unified/styles/notifications';\nimport { makeAMLink, makeLabelBasedSilenceLink } from 'app/features/alerting/unified/utils/misc';\nimport { AlertmanagerGroup, AlertState } from 'app/plugins/datasource/alertmanager/types';\n\ntype Props = {\n alertManagerSourceName: string;\n group: AlertmanagerGroup;\n expandAll: boolean;\n};\n\nexport const AlertGroup = ({ alertManagerSourceName, group, expandAll }: Props) => {\n const [showAlerts, setShowAlerts] = useState(expandAll);\n const styles = useStyles2(getStyles);\n const textStyles = useStyles2(getNotificationsTextColors);\n\n useEffect(() => setShowAlerts(expandAll), [expandAll]);\n\n return (\n <div className={styles.group} data-testid=\"alert-group\">\n {Object.keys(group.labels).length > 0 ? (\n <AlertLabels labels={group.labels} />\n ) : (\n <div className={styles.noGroupingText}>No grouping</div>\n )}\n <div className={styles.row}>\n <CollapseToggle isCollapsed={!showAlerts} onToggle={() => setShowAlerts(!showAlerts)} />{' '}\n <AlertGroupHeader group={group} />\n </div>\n {showAlerts && (\n <div className={styles.alerts}>\n {group.alerts.map((alert, index) => {\n const state = alert.status.state.toUpperCase();\n const interval = intervalToAbbreviatedDurationString({\n start: new Date(alert.startsAt),\n end: Date.now(),\n });\n\n return (\n <div data-testid={'alert-group-alert'} className={styles.alert} key={`${alert.fingerprint}-${index}`}>\n <div>\n <span className={textStyles[alert.status.state]}>{state} </span>for {interval}\n </div>\n <div>\n <AlertLabels labels={alert.labels} />\n </div>\n <div className={styles.actionsRow}>\n {alert.status.state === AlertState.Suppressed && (\n <LinkButton\n href={`${makeAMLink(\n '/alerting/silences',\n alertManagerSourceName\n )}&silenceIds=${alert.status.silencedBy.join(',')}`}\n className={styles.button}\n icon={'bell'}\n size={'sm'}\n >\n Manage silences\n </LinkButton>\n )}\n {alert.status.state === AlertState.Active && (\n <LinkButton\n href={makeLabelBasedSilenceLink(alertManagerSourceName, alert.labels)}\n className={styles.button}\n icon={'bell-slash'}\n size={'sm'}\n >\n Silence\n </LinkButton>\n )}\n {alert.generatorURL && (\n <LinkButton className={styles.button} href={alert.generatorURL} icon={'chart-line'} size={'sm'}>\n See source\n </LinkButton>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n noGroupingText: css`\n height: ${theme.spacing(4)};\n `,\n group: css`\n background-color: ${theme.colors.background.secondary};\n margin: ${theme.spacing(0.5, 1, 0.5, 1)};\n padding: ${theme.spacing(1)};\n `,\n row: css`\n display: flex;\n flex-direction: row;\n align-items: center;\n `,\n alerts: css`\n margin: ${theme.spacing(0, 2, 0, 4)};\n `,\n alert: css`\n padding: ${theme.spacing(1, 0)};\n & + & {\n border-top: 1px solid ${theme.colors.border.medium};\n }\n `,\n button: css`\n & + & {\n margin-left: ${theme.spacing(1)};\n }\n `,\n actionsRow: css`\n padding: ${theme.spacing(1, 0)};\n `,\n});\n","import React, { useMemo } from 'react';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { AlertManagerPicker } from 'app/features/alerting/unified/components/AlertManagerPicker';\nimport {\n getAllAlertManagerDataSources,\n GRAFANA_RULES_SOURCE_NAME,\n} from 'app/features/alerting/unified/utils/datasource';\n\nimport { AlertGroupsPanel } from './AlertGroupsPanel';\nimport { AlertGroupPanelOptions } from './types';\n\nexport const plugin = new PanelPlugin<AlertGroupPanelOptions>(AlertGroupsPanel).setPanelOptions((builder) => {\n return builder\n .addCustomEditor({\n name: 'Alertmanager',\n path: 'alertmanager',\n id: 'alertmanager',\n defaultValue: GRAFANA_RULES_SOURCE_NAME,\n category: ['Options'],\n editor: function RenderAlertmanagerPicker(props) {\n const alertManagers = useMemo(getAllAlertManagerDataSources, []);\n\n return (\n <AlertManagerPicker\n current={props.value}\n onChange={(alertManagerSourceName) => {\n return props.onChange(alertManagerSourceName);\n }}\n dataSources={alertManagers}\n />\n );\n },\n })\n .addBooleanSwitch({\n name: 'Expand all by default',\n path: 'expandAll',\n defaultValue: false,\n category: ['Options'],\n })\n .addTextInput({\n description: 'Filter results by matching labels, ex: env=production,severity=~critical|warning',\n name: 'Labels',\n path: 'labels',\n category: ['Filter'],\n });\n});\n","import React, { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { PanelProps } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { CustomScrollbar } from '@grafana/ui';\nimport { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector';\nimport { fetchAlertGroupsAction } from 'app/features/alerting/unified/state/actions';\nimport { parseMatchers } from 'app/features/alerting/unified/utils/alertmanager';\nimport { NOTIFICATIONS_POLL_INTERVAL_MS } from 'app/features/alerting/unified/utils/constants';\nimport { initialAsyncRequestState } from 'app/features/alerting/unified/utils/redux';\nimport { AlertmanagerGroup, Matcher } from 'app/plugins/datasource/alertmanager/types';\n\nimport { AlertGroup } from './AlertGroup';\nimport { AlertGroupPanelOptions } from './types';\nimport { useFilteredGroups } from './useFilteredGroups';\n\nexport const AlertGroupsPanel = (props: PanelProps<AlertGroupPanelOptions>) => {\n const dispatch = useDispatch();\n const isAlertingEnabled = config.unifiedAlertingEnabled;\n\n const expandAll = props.options.expandAll;\n const alertManagerSourceName = props.options.alertmanager;\n\n const alertGroups = useUnifiedAlertingSelector((state) => state.amAlertGroups) || initialAsyncRequestState;\n const results: AlertmanagerGroup[] = alertGroups[alertManagerSourceName || '']?.result || [];\n const matchers: Matcher[] = props.options.labels ? parseMatchers(props.options.labels) : [];\n\n const filteredResults = useFilteredGroups(results, matchers);\n\n useEffect(() => {\n function fetchNotifications() {\n if (alertManagerSourceName) {\n dispatch(fetchAlertGroupsAction(alertManagerSourceName));\n }\n }\n fetchNotifications();\n const interval = setInterval(fetchNotifications, NOTIFICATIONS_POLL_INTERVAL_MS);\n return () => {\n clearInterval(interval);\n };\n }, [dispatch, alertManagerSourceName]);\n\n const hasResults = filteredResults.length > 0;\n\n return (\n <CustomScrollbar autoHeightMax=\"100%\" autoHeightMin=\"100%\">\n {isAlertingEnabled && (\n <div>\n {hasResults &&\n filteredResults.map((group) => {\n return (\n <AlertGroup\n alertManagerSourceName={alertManagerSourceName}\n key={JSON.stringify(group.labels)}\n group={group}\n expandAll={expandAll}\n />\n );\n })}\n {!hasResults && 'No alerts'}\n </div>\n )}\n </CustomScrollbar>\n );\n};\n","import { useMemo } from 'react';\n\nimport { labelsMatchMatchers } from 'app/features/alerting/unified/utils/alertmanager';\nimport { AlertmanagerGroup, Matcher } from 'app/plugins/datasource/alertmanager/types';\n\nexport const useFilteredGroups = (groups: AlertmanagerGroup[], matchers: Matcher[]): AlertmanagerGroup[] => {\n return useMemo(() => {\n return groups.filter((group) => {\n return (\n labelsMatchMatchers(group.labels, matchers) ||\n group.alerts.some((alert) => labelsMatchMatchers(alert.labels, matchers))\n );\n });\n }, [groups, matchers]);\n};\n","import { SelectableValue } from '@grafana/data';\n\nimport { getFolderById, searchFolders } from '../../../../features/manage-dashboards/state/actions';\nimport { FolderInfo, PermissionLevelString } from '../../../../types';\n\nimport { PermissionLevel } from './types';\n\ninterface GetFoldersArgs {\n query: string;\n permissionLevel?: PermissionLevel;\n}\n\nasync function getFolders({ query, permissionLevel }: GetFoldersArgs): Promise<FolderInfo[]> {\n const searchHits = await searchFolders(query, permissionLevel);\n const folders: FolderInfo[] = searchHits.map((searchHit) => ({\n id: searchHit.id,\n title: searchHit.title,\n url: searchHit.url,\n }));\n\n return folders;\n}\n\nexport interface GetFoldersWithEntriesArgs extends GetFoldersArgs {\n extraFolders?: FolderInfo[];\n}\n\nasync function getFoldersWithEntries({\n query,\n permissionLevel,\n extraFolders,\n}: GetFoldersWithEntriesArgs): Promise<FolderInfo[]> {\n const folders = await getFolders({ query, permissionLevel });\n const extra: FolderInfo[] = extraFolders ?? [];\n const filteredExtra = query ? extra.filter((f) => f.title?.toLowerCase().includes(query.toLowerCase())) : extra;\n if (folders) {\n return filteredExtra.concat(folders);\n }\n\n return filteredExtra;\n}\n\nexport async function getFoldersAsOptions({\n query,\n permissionLevel = PermissionLevelString.View,\n extraFolders = [],\n}: GetFoldersWithEntriesArgs) {\n const folders = await getFoldersWithEntries({ query, permissionLevel, extraFolders });\n return folders.map((value) => {\n const option: SelectableValue<FolderInfo> = { value, label: value.title };\n return option;\n });\n}\n\nexport function findOptionWithId(\n options?: Array<SelectableValue<FolderInfo>>,\n id?: number\n): SelectableValue<FolderInfo> | undefined {\n return options?.find((o) => o.value?.id === id);\n}\n\nexport async function getFolderAsOption(folderId?: number): Promise<SelectableValue<FolderInfo> | undefined> {\n if (folderId === undefined || folderId === null) {\n return;\n }\n\n try {\n const { id, title } = await getFolderById(folderId);\n return { value: { id, title }, label: title };\n } catch (err) {\n console.error(`Could not find folder with id:${folderId}`);\n }\n\n return;\n}\n","import debouncePromise from 'debounce-promise';\nimport React, { ReactElement, useCallback, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { AsyncSelect } from '@grafana/ui';\n\nimport { GENERAL_FOLDER_ID, GENERAL_FOLDER_TITLE } from '../../../../features/search/constants';\nimport { FolderInfo, PermissionLevelString } from '../../../../types';\n\nimport { findOptionWithId, getFolderAsOption, getFoldersAsOptions } from './api';\nimport { PermissionLevel } from './types';\n\nexport const ALL_FOLDER: FolderInfo = { id: undefined, title: 'All' };\nexport const GENERAL_FOLDER: FolderInfo = { id: GENERAL_FOLDER_ID, title: GENERAL_FOLDER_TITLE };\n\nexport interface ReadonlyFolderPickerProps {\n onChange: (folder?: FolderInfo) => void;\n initialFolderId?: number;\n /**\n * By default the folders API doesn't include the General folder because it doesn't exist\n * Add any extra folders you need to appear in the folder picker with the extraFolders property\n */\n extraFolders?: FolderInfo[];\n permissionLevel?: PermissionLevel;\n}\n\nexport function ReadonlyFolderPicker({\n onChange: propsOnChange,\n extraFolders = [],\n initialFolderId,\n permissionLevel = PermissionLevelString.View,\n}: ReadonlyFolderPickerProps): ReactElement {\n const [initialized, setInitialized] = useState(false);\n const [option, setOption] = useState<SelectableValue<FolderInfo> | undefined>(undefined);\n const [options, setOptions] = useState<Array<SelectableValue<FolderInfo>> | undefined>(undefined);\n const initialize = useCallback(\n async (options: Array<SelectableValue<FolderInfo>>) => {\n let option = findOptionWithId(options, initialFolderId);\n if (!option) {\n // we didn't find the option with the initialFolderId\n // might be because the folder doesn't exist any longer\n // might be because the folder is outside of the search limit of the api\n option = (await getFolderAsOption(initialFolderId)) ?? options[0]; // get folder by id or select the first item in the options and call propsOnChange\n propsOnChange(option.value);\n }\n\n setInitialized(true);\n setOptions(options);\n setOption(option);\n },\n [initialFolderId, propsOnChange]\n );\n const loadOptions = useCallback(\n async (query: string) => {\n const options = await getFoldersAsOptions({ query, permissionLevel, extraFolders });\n if (!initialized) {\n await initialize(options);\n }\n return options;\n },\n [permissionLevel, extraFolders, initialized, initialize]\n );\n const debouncedLoadOptions = debouncePromise(loadOptions, 300, { leading: true });\n const onChange = useCallback(\n ({ value }: SelectableValue<FolderInfo>) => {\n const option = findOptionWithId(options, value?.id);\n setOption(option);\n propsOnChange(value);\n },\n [options, propsOnChange]\n );\n\n return (\n <div data-testid={selectors.components.ReadonlyFolderPicker.container}>\n <AsyncSelect\n loadingMessage=\"Loading folders...\"\n defaultOptions\n defaultValue={option}\n value={option}\n loadOptions={debouncedLoadOptions}\n onChange={onChange}\n />\n </div>\n );\n}\n","import { css, cx } from '@emotion/css';\nimport { sortBy } from 'lodash';\nimport React, { useState } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { dateMath, dateTime, GrafanaTheme, PanelProps } from '@grafana/data';\nimport { getBackendSrv, getTemplateSrv } from '@grafana/runtime';\nimport { Card, CustomScrollbar, Icon, stylesFactory, useStyles } from '@grafana/ui';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { AlertRuleDTO, AnnotationItemDTO } from 'app/types';\n\nimport { AlertListOptions, ShowOption, SortOrder } from './types';\n\nexport function AlertList(props: PanelProps<AlertListOptions>) {\n const [noAlertsMessage, setNoAlertsMessage] = useState('');\n\n const currentAlertState = useAsync(async () => {\n if (props.options.showOptions !== ShowOption.Current) {\n return;\n }\n\n const params: any = {\n state: getStateFilter(props.options.stateFilter),\n };\n const panel = getDashboardSrv().getCurrent()?.getPanelById(props.id)!;\n\n if (props.options.alertName) {\n params.query = getTemplateSrv().replace(props.options.alertName, panel.scopedVars);\n }\n\n if (props.options.folderId >= 0) {\n params.folderId = props.options.folderId;\n }\n\n if (props.options.dashboardTitle) {\n params.dashboardQuery = props.options.dashboardTitle;\n }\n\n if (props.options.dashboardAlerts) {\n params.dashboardId = getDashboardSrv().getCurrent()?.id;\n }\n\n if (props.options.tags) {\n params.dashboardTag = props.options.tags;\n }\n\n const alerts: AlertRuleDTO[] = await getBackendSrv().get(\n '/api/alerts',\n params,\n `alert-list-get-current-alert-state-${props.id}`\n );\n let currentAlerts = sortAlerts(\n props.options.sortOrder,\n alerts.map((al) => ({\n ...al,\n stateModel: alertDef.getStateDisplayModel(al.state),\n newStateDateAgo: dateTime(al.newStateDate).locale('en').fromNow(true),\n }))\n );\n\n if (currentAlerts.length > props.options.maxItems) {\n currentAlerts = currentAlerts.slice(0, props.options.maxItems);\n }\n setNoAlertsMessage(currentAlerts.length === 0 ? 'No alerts' : '');\n\n return currentAlerts;\n }, [\n props.options.showOptions,\n props.options.stateFilter.alerting,\n props.options.stateFilter.execution_error,\n props.options.stateFilter.no_data,\n props.options.stateFilter.ok,\n props.options.stateFilter.paused,\n props.options.stateFilter.pending,\n props.options.maxItems,\n props.options.tags,\n props.options.dashboardAlerts,\n props.options.dashboardTitle,\n props.options.folderId,\n props.options.alertName,\n props.options.sortOrder,\n props.timeRange,\n ]);\n\n const recentStateChanges = useAsync(async () => {\n if (props.options.showOptions !== ShowOption.RecentChanges) {\n return;\n }\n\n const params: any = {\n limit: props.options.maxItems,\n type: 'alert',\n newState: getStateFilter(props.options.stateFilter),\n };\n const currentDashboard = getDashboardSrv().getCurrent();\n\n if (props.options.dashboardAlerts) {\n params.dashboardId = currentDashboard?.id;\n }\n\n params.from = dateMath.parse(currentDashboard?.time.from)!.unix() * 1000;\n params.to = dateMath.parse(currentDashboard?.time.to)!.unix() * 1000;\n\n const data: AnnotationItemDTO[] = await getBackendSrv().get(\n '/api/annotations',\n params,\n `alert-list-get-state-changes-${props.id}`\n );\n const alertHistory = sortAlerts(\n props.options.sortOrder,\n data.map((al) => {\n return {\n ...al,\n time: currentDashboard?.formatDate(al.time, 'MMM D, YYYY HH:mm:ss'),\n stateModel: alertDef.getStateDisplayModel(al.newState),\n info: alertDef.getAlertAnnotationInfo(al),\n };\n })\n );\n\n setNoAlertsMessage(alertHistory.length === 0 ? 'No alerts in current time range' : '');\n return alertHistory;\n }, [\n props.options.showOptions,\n props.options.maxItems,\n props.options.stateFilter.alerting,\n props.options.stateFilter.execution_error,\n props.options.stateFilter.no_data,\n props.options.stateFilter.ok,\n props.options.stateFilter.paused,\n props.options.stateFilter.pending,\n props.options.dashboardAlerts,\n props.options.sortOrder,\n ]);\n\n const styles = useStyles(getStyles);\n\n return (\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n <div className={styles.container}>\n {noAlertsMessage && <div className={styles.noAlertsMessage}>{noAlertsMessage}</div>}\n <section>\n <ol className={styles.alertRuleList}>\n {props.options.showOptions === ShowOption.Current\n ? !currentAlertState.loading &&\n currentAlertState.value &&\n currentAlertState.value!.map((alert) => (\n <li className={styles.alertRuleItem} key={`alert-${alert.id}`}>\n <Card href={`${alert.url}?viewPanel=${alert.panelId}`} className={styles.cardContainer}>\n <Card.Heading>{alert.name}</Card.Heading>\n <Card.Figure className={cx(styles.alertRuleItemIcon, alert.stateModel.stateClass)}>\n <Icon name={alert.stateModel.iconClass} size=\"xl\" className={styles.alertIcon} />\n </Card.Figure>\n <Card.Meta>\n <div className={styles.alertRuleItemText}>\n <span className={alert.stateModel.stateClass}>{alert.stateModel.text}</span>\n <span className={styles.alertRuleItemTime}> for {alert.newStateDateAgo}</span>\n </div>\n </Card.Meta>\n </Card>\n </li>\n ))\n : !recentStateChanges.loading &&\n recentStateChanges.value &&\n recentStateChanges.value.map((alert) => (\n <li className={styles.alertRuleItem} key={`alert-${alert.id}`}>\n <Card className={styles.cardContainer}>\n <Card.Heading>{alert.alertName}</Card.Heading>\n <Card.Figure className={cx(styles.alertRuleItemIcon, alert.stateModel.stateClass)}>\n <Icon name={alert.stateModel.iconClass} size=\"xl\" />\n </Card.Figure>\n <Card.Meta>\n <span className={cx(styles.alertRuleItemText, alert.stateModel.stateClass)}>\n {alert.stateModel.text}\n </span>\n <span>{alert.time}</span>\n {alert.info && <span className={styles.alertRuleItemInfo}>{alert.info}</span>}\n </Card.Meta>\n </Card>\n </li>\n ))}\n </ol>\n </section>\n </div>\n </CustomScrollbar>\n );\n}\n\nfunction sortAlerts(sortOrder: SortOrder, alerts: any[]) {\n if (sortOrder === SortOrder.Importance) {\n // @ts-ignore\n return sortBy(alerts, (a) => alertDef.alertStateSortScore[a.state || a.newState]);\n } else if (sortOrder === SortOrder.TimeAsc) {\n return sortBy(alerts, (a) => new Date(a.newStateDate || a.time));\n } else if (sortOrder === SortOrder.TimeDesc) {\n return sortBy(alerts, (a) => new Date(a.newStateDate || a.time)).reverse();\n }\n\n const result = sortBy(alerts, (a) => (a.name || a.alertName).toLowerCase());\n if (sortOrder === SortOrder.AlphaDesc) {\n result.reverse();\n }\n\n return result;\n}\n\nfunction getStateFilter(stateFilter: Record<string, boolean>) {\n return Object.entries(stateFilter)\n .filter(([_, val]) => val)\n .map(([key, _]) => key);\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n cardContainer: css`\n padding: ${theme.spacing.xs} 0 ${theme.spacing.xxs} 0;\n line-height: ${theme.typography.lineHeight.md};\n margin-bottom: 0px;\n `,\n container: css`\n overflow-y: auto;\n height: 100%;\n `,\n alertRuleList: css`\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n list-style-type: none;\n `,\n alertRuleItem: css`\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n background: ${theme.colors.bg2};\n padding: ${theme.spacing.xs} ${theme.spacing.sm};\n border-radius: ${theme.border.radius.md};\n margin-bottom: ${theme.spacing.xs};\n `,\n alertRuleItemIcon: css`\n display: flex;\n justify-content: center;\n align-items: center;\n width: ${theme.spacing.xl};\n padding: 0 ${theme.spacing.xs} 0 ${theme.spacing.xxs};\n margin-right: 0px;\n `,\n alertRuleItemText: css`\n font-weight: ${theme.typography.weight.bold};\n font-size: ${theme.typography.size.sm};\n margin: 0;\n `,\n alertRuleItemTime: css`\n color: ${theme.colors.textWeak};\n font-weight: normal;\n white-space: nowrap;\n `,\n alertRuleItemInfo: css`\n font-weight: normal;\n flex-grow: 2;\n display: flex;\n align-items: flex-end;\n `,\n noAlertsMessage: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n `,\n alertIcon: css`\n margin-right: ${theme.spacing.xs};\n `,\n}));\n","/* Prometheus internal models */\n\nimport { AlertState, DataSourceInstanceSettings } from '@grafana/data';\n\nimport {\n PromAlertingRuleState,\n PromRuleType,\n RulerRuleDTO,\n Labels,\n Annotations,\n RulerRuleGroupDTO,\n GrafanaAlertState,\n GrafanaAlertStateWithReason,\n mapStateWithReasonToBaseState,\n} from './unified-alerting-dto';\n\nexport type Alert = {\n activeAt: string;\n annotations: { [key: string]: string };\n labels: { [key: string]: string };\n state: PromAlertingRuleState | GrafanaAlertStateWithReason;\n value: string;\n};\n\nexport function hasAlertState(alert: Alert, state: PromAlertingRuleState | GrafanaAlertState): boolean {\n return mapStateWithReasonToBaseState(alert.state as GrafanaAlertStateWithReason) === state;\n}\n\ninterface RuleBase {\n health: string;\n name: string;\n query: string;\n lastEvaluation?: string;\n evaluationTime?: number;\n lastError?: string;\n}\n\nexport interface AlertingRule extends RuleBase {\n alerts?: Alert[];\n labels: {\n [key: string]: string;\n };\n annotations?: {\n [key: string]: string;\n };\n state: PromAlertingRuleState;\n type: PromRuleType.Alerting;\n}\n\nexport interface RecordingRule extends RuleBase {\n type: PromRuleType.Recording;\n\n labels?: {\n [key: string]: string;\n };\n}\n\nexport type Rule = AlertingRule | RecordingRule;\n\nexport type BaseRuleGroup = { name: string };\n\nexport interface RuleGroup {\n name: string;\n interval: number;\n rules: Rule[];\n}\n\nexport interface RuleNamespace {\n dataSourceName: string;\n name: string;\n groups: RuleGroup[];\n}\n\nexport interface RulesSourceResult {\n dataSourceName: string;\n error?: unknown;\n namespaces?: RuleNamespace[];\n}\n\nexport type RulesSource = DataSourceInstanceSettings | 'grafana';\n\n// combined prom and ruler result\nexport interface CombinedRule {\n name: string;\n query: string;\n labels: Labels;\n annotations: Annotations;\n promRule?: Rule;\n rulerRule?: RulerRuleDTO;\n group: CombinedRuleGroup;\n namespace: CombinedRuleNamespace;\n}\n\nexport interface CombinedRuleGroup {\n name: string;\n interval?: string;\n source_tenants?: string[];\n rules: CombinedRule[];\n}\n\nexport interface CombinedRuleNamespace {\n rulesSource: RulesSource;\n name: string;\n groups: CombinedRuleGroup[];\n}\n\nexport interface RuleWithLocation<T = RulerRuleDTO> {\n ruleSourceName: string;\n namespace: string;\n group: RulerRuleGroupDTO;\n rule: T;\n}\n\nexport interface PromRuleWithLocation {\n rule: AlertingRule;\n dataSourceName: string;\n namespaceName: string;\n groupName: string;\n}\n\nexport interface CloudRuleIdentifier {\n ruleSourceName: string;\n namespace: string;\n groupName: string;\n rulerRuleHash: number;\n}\nexport interface GrafanaRuleIdentifier {\n ruleSourceName: 'grafana';\n uid: string;\n}\n\n// Rule read directly from Prometheus without existing in the ruler API\nexport interface PrometheusRuleIdentifier {\n ruleSourceName: string;\n namespace: string;\n groupName: string;\n ruleHash: number;\n}\n\nexport type RuleIdentifier = CloudRuleIdentifier | GrafanaRuleIdentifier | PrometheusRuleIdentifier;\nexport interface FilterState {\n queryString?: string;\n dataSource?: string;\n alertState?: string;\n groupBy?: string[];\n ruleType?: string;\n}\n\nexport interface SilenceFilterState {\n queryString?: string;\n silenceState?: string;\n}\n\ninterface EvalMatch {\n metric: string;\n tags?: any;\n value: number;\n}\n\nexport interface StateHistoryItemData {\n noData?: boolean;\n evalMatches?: EvalMatch[];\n}\n\nexport interface StateHistoryItem {\n id: number;\n alertId: number;\n alertName: string;\n dashboardId: number;\n panelId: number;\n userId: number;\n newState: AlertState;\n prevState: AlertState;\n created: number;\n updated: number;\n time: number;\n timeEnd: number;\n text: string;\n tags: any[];\n login: string;\n email: string;\n avatarUrl: string;\n data: StateHistoryItemData;\n}\n\nexport interface RulerDataSourceConfig {\n dataSourceName: string;\n apiVersion: 'legacy' | 'config';\n}\n\nexport interface PromBasedDataSource {\n name: string;\n id: string | number;\n rulerConfig?: RulerDataSourceConfig;\n}\n\nexport interface PaginationProps {\n itemsPerPage: number;\n}\n","import { isEmpty } from 'lodash';\n\nimport { PanelProps } from '@grafana/data';\nimport { Alert, hasAlertState } from 'app/types/unified-alerting';\nimport { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { UnifiedAlertListOptions } from './types';\n\nexport function filterAlerts(options: PanelProps<UnifiedAlertListOptions>['options'], alerts: Alert[]): Alert[] {\n const { stateFilter } = options;\n\n if (isEmpty(stateFilter)) {\n return alerts;\n }\n\n return alerts.filter((alert) => {\n return (\n (stateFilter.firing &&\n (hasAlertState(alert, GrafanaAlertState.Alerting) || hasAlertState(alert, PromAlertingRuleState.Firing))) ||\n (stateFilter.pending &&\n (hasAlertState(alert, GrafanaAlertState.Pending) || hasAlertState(alert, PromAlertingRuleState.Pending))) ||\n (stateFilter.noData && hasAlertState(alert, GrafanaAlertState.NoData)) ||\n (stateFilter.normal && hasAlertState(alert, GrafanaAlertState.Normal)) ||\n (stateFilter.error && hasAlertState(alert, GrafanaAlertState.Error)) ||\n (stateFilter.inactive && hasAlertState(alert, PromAlertingRuleState.Inactive))\n );\n });\n}\n\nexport function isPrivateLabel(label: string) {\n return !(label.startsWith('__') && label.endsWith('__'));\n}\n","import { isEmpty, uniq } from 'lodash';\nimport React, { FC, useEffect, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Icon, MultiSelect } from '@grafana/ui';\nimport { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector';\nimport { fetchAllPromRulesAction } from 'app/features/alerting/unified/state/actions';\nimport { getAllRulesSourceNames } from 'app/features/alerting/unified/utils/datasource';\nimport {\n isAsyncRequestMapSliceFulfilled,\n isAsyncRequestMapSlicePending,\n} from 'app/features/alerting/unified/utils/redux';\nimport { AlertingRule } from 'app/types/unified-alerting';\nimport { PromRuleType } from 'app/types/unified-alerting-dto';\n\nimport { isPrivateLabel } from './util';\n\ninterface Props {\n id: string;\n defaultValue: SelectableValue<string>;\n onChange: (keys: string[]) => void;\n}\n\nexport const GroupBy: FC<Props> = (props) => {\n const { onChange, id, defaultValue } = props;\n const dispatch = useDispatch();\n\n useEffect(() => {\n dispatch(fetchAllPromRulesAction());\n }, [dispatch]);\n\n const promRulesByDatasource = useUnifiedAlertingSelector((state) => state.promRules);\n const rulesDataSourceNames = useMemo(getAllRulesSourceNames, []);\n\n const allRequestsReady = isAsyncRequestMapSliceFulfilled(promRulesByDatasource);\n const loading = isAsyncRequestMapSlicePending(promRulesByDatasource);\n\n const labels = useMemo(() => {\n if (isEmpty(promRulesByDatasource)) {\n return [];\n }\n\n if (!allRequestsReady) {\n return [];\n }\n\n const allLabels = rulesDataSourceNames\n .flatMap((datasource) => promRulesByDatasource[datasource].result ?? [])\n .flatMap((rules) => rules.groups)\n .flatMap((group) => group.rules.filter((rule): rule is AlertingRule => rule.type === PromRuleType.Alerting))\n .flatMap((rule) => rule.alerts ?? [])\n .map((alert) => Object.keys(alert.labels ?? {}))\n .flatMap((labels) => labels.filter(isPrivateLabel));\n\n return uniq(allLabels);\n }, [allRequestsReady, promRulesByDatasource, rulesDataSourceNames]);\n\n return (\n <MultiSelect<string>\n id={id}\n isLoading={loading}\n defaultValue={defaultValue}\n aria-label={'group by label keys'}\n placeholder=\"Group by\"\n prefix={<Icon name={'tag-alt'} />}\n onChange={(items) => {\n onChange(items.map((item) => item.value ?? ''));\n }}\n options={labels.map<SelectableValue>((key) => ({\n label: key,\n value: key,\n }))}\n />\n );\n};\n","import { css } from '@emotion/css';\nimport { noop } from 'lodash';\nimport pluralize from 'pluralize';\nimport React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, PanelProps } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\nimport { AlertInstancesTable } from 'app/features/alerting/unified/components/rules/AlertInstancesTable';\nimport { sortAlerts } from 'app/features/alerting/unified/utils/misc';\nimport { Alert } from 'app/types/unified-alerting';\n\nimport { DEFAULT_PER_PAGE_PAGINATION } from '../../../core/constants';\n\nimport { GroupMode, UnifiedAlertListOptions } from './types';\nimport { filterAlerts } from './util';\n\ninterface Props {\n alerts: Alert[];\n options: PanelProps<UnifiedAlertListOptions>['options'];\n}\n\nexport const AlertInstances: FC<Props> = ({ alerts, options }) => {\n // when custom grouping is enabled, we will always uncollapse the list of alert instances\n const defaultShowInstances = options.groupMode === GroupMode.Custom ? true : options.showInstances;\n const [displayInstances, setDisplayInstances] = useState<boolean>(defaultShowInstances);\n const styles = useStyles2(getStyles);\n\n const toggleDisplayInstances = useCallback(() => {\n setDisplayInstances((display) => !display);\n }, []);\n\n // TODO Filtering instances here has some implications\n // If a rule has 0 instances after filtering there is no way not to show that rule\n const filteredAlerts = useMemo(\n (): Alert[] => filterAlerts(options, sortAlerts(options.sortOrder, alerts)) ?? [],\n [alerts, options]\n );\n\n const hiddenInstances = alerts.length - filteredAlerts.length;\n\n const uncollapsible = filteredAlerts.length > 0;\n const toggleShowInstances = uncollapsible ? toggleDisplayInstances : noop;\n\n useEffect(() => {\n if (filteredAlerts.length === 0) {\n setDisplayInstances(false);\n }\n }, [filteredAlerts]);\n\n return (\n <div>\n {options.groupMode === GroupMode.Default && (\n <div className={uncollapsible ? styles.clickable : ''} onClick={() => toggleShowInstances()}>\n {uncollapsible && <Icon name={displayInstances ? 'angle-down' : 'angle-right'} size={'md'} />}\n <span>{`${filteredAlerts.length} ${pluralize('instance', filteredAlerts.length)}`}</span>\n {hiddenInstances > 0 && <span>, {`${hiddenInstances} hidden by filters`}</span>}\n </div>\n )}\n {displayInstances && (\n <AlertInstancesTable\n instances={filteredAlerts}\n pagination={{ itemsPerPage: 2 * DEFAULT_PER_PAGE_PAGINATION }}\n />\n )}\n </div>\n );\n};\n\nconst getStyles = (_: GrafanaTheme2) => ({\n clickable: css`\n cursor: pointer;\n `,\n});\n","import React, { FC, useMemo } from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\nimport { AlertLabel } from 'app/features/alerting/unified/components/AlertLabel';\nimport { Alert, PromRuleWithLocation } from 'app/types/unified-alerting';\n\nimport { AlertInstances } from '../AlertInstances';\nimport { getStyles } from '../UnifiedAlertList';\nimport { GroupedRules, UnifiedAlertListOptions } from '../types';\nimport { filterAlerts } from '../util';\n\ntype GroupedModeProps = {\n rules: PromRuleWithLocation[];\n options: UnifiedAlertListOptions;\n};\n\nconst GroupedModeView: FC<GroupedModeProps> = ({ rules, options }) => {\n const styles = useStyles2(getStyles);\n\n const groupBy = options.groupBy;\n\n const groupedRules = useMemo<GroupedRules>(() => {\n const groupedRules = new Map<string, Alert[]>();\n\n const hasInstancesWithMatchingLabels = (rule: PromRuleWithLocation) =>\n groupBy ? alertHasEveryLabel(rule, groupBy) : true;\n\n const matchingRules = rules.filter(hasInstancesWithMatchingLabels);\n matchingRules.forEach((rule: PromRuleWithLocation) => {\n (rule.rule.alerts ?? []).forEach((alert) => {\n const mapKey = createMapKey(groupBy, alert.labels);\n const existingAlerts = groupedRules.get(mapKey) ?? [];\n groupedRules.set(mapKey, [...existingAlerts, alert]);\n });\n });\n\n // Remove groups having no instances\n // This is different from filtering Rules without instances that we do in UnifiedAlertList\n const filteredGroupedRules = Array.from(groupedRules.entries()).reduce((acc, [groupKey, groupAlerts]) => {\n const filteredAlerts = filterAlerts(options, groupAlerts);\n if (filteredAlerts.length > 0) {\n acc.set(groupKey, filteredAlerts);\n }\n\n return acc;\n }, new Map<string, Alert[]>());\n\n return filteredGroupedRules;\n }, [groupBy, rules, options]);\n\n return (\n <>\n {Array.from(groupedRules).map(([key, alerts]) => (\n <li className={styles.alertRuleItem} key={key}>\n <div>\n <div className={styles.customGroupDetails}>\n <div className={styles.alertLabels}>\n {key && parseMapKey(key).map(([key, value]) => <AlertLabel key={key} labelKey={key} value={value} />)}\n {!key && 'No grouping'}\n </div>\n </div>\n <AlertInstances alerts={alerts} options={options} />\n </div>\n </li>\n ))}\n </>\n );\n};\n\nfunction createMapKey(groupBy: string[], labels: Record<string, string>): string {\n return new URLSearchParams(groupBy.map((key) => [key, labels[key]])).toString();\n}\n\nfunction parseMapKey(key: string): Array<[string, string]> {\n return [...new URLSearchParams(key)];\n}\n\nfunction alertHasEveryLabel(rule: PromRuleWithLocation, groupByKeys: string[]) {\n return groupByKeys.every((key) => {\n return (rule.rule.alerts ?? []).some((alert) => alert.labels[key]);\n });\n}\n\nexport default GroupedModeView;\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { alertStateToReadable, alertStateToState, getFirstActiveAt } from 'app/features/alerting/unified/utils/rules';\nimport { PromRuleWithLocation } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { AlertInstances } from '../AlertInstances';\nimport { getStyles } from '../UnifiedAlertList';\nimport { UnifiedAlertListOptions } from '../types';\n\ntype UngroupedModeProps = {\n rules: PromRuleWithLocation[];\n options: UnifiedAlertListOptions;\n};\n\nconst UngroupedModeView: FC<UngroupedModeProps> = ({ rules, options }) => {\n const styles = useStyles2(getStyles);\n const stateStyle = useStyles2(getStateTagStyles);\n\n const rulesToDisplay = rules.length <= options.maxItems ? rules : rules.slice(0, options.maxItems);\n\n return (\n <>\n <ol className={styles.alertRuleList}>\n {rulesToDisplay.map((ruleWithLocation, index) => {\n const { rule, namespaceName, groupName } = ruleWithLocation;\n const firstActiveAt = getFirstActiveAt(rule);\n return (\n <li className={styles.alertRuleItem} key={`alert-${namespaceName}-${groupName}-${rule.name}-${index}`}>\n <div className={stateStyle.icon}>\n <Icon\n name={alertDef.getStateDisplayModel(rule.state).iconClass}\n className={stateStyle[alertStateToState(rule.state)]}\n size={'lg'}\n />\n </div>\n <div>\n <div className={styles.instanceDetails}>\n <div className={styles.alertName} title={rule.name}>\n {rule.name}\n </div>\n <div className={styles.alertDuration}>\n <span className={stateStyle[alertStateToState(rule.state)]}>\n {alertStateToReadable(rule.state)}\n </span>{' '}\n {firstActiveAt && rule.state !== PromAlertingRuleState.Inactive && (\n <>\n for{' '}\n <span>\n {intervalToAbbreviatedDurationString({\n start: firstActiveAt,\n end: Date.now(),\n })}\n </span>\n </>\n )}\n </div>\n </div>\n <AlertInstances alerts={ruleWithLocation.rule.alerts ?? []} options={options} />\n </div>\n </li>\n );\n })}\n </ol>\n </>\n );\n};\n\nconst getStateTagStyles = (theme: GrafanaTheme2) => ({\n common: css`\n width: 70px;\n text-align: center;\n align-self: stretch;\n\n display: inline-block;\n color: white;\n border-radius: ${theme.shape.borderRadius()};\n font-size: ${theme.v1.typography.size.sm};\n text-transform: capitalize;\n line-height: 1.2;\n flex-shrink: 0;\n\n display: flex;\n flex-direction: column;\n justify-content: center;\n `,\n icon: css`\n margin-top: ${theme.spacing(2.5)};\n align-self: flex-start;\n `,\n good: css`\n color: ${theme.colors.success.main};\n `,\n bad: css`\n color: ${theme.colors.error.main};\n `,\n warning: css`\n color: ${theme.colors.warning.main};\n `,\n neutral: css`\n color: ${theme.colors.secondary.main};\n `,\n info: css`\n color: ${theme.colors.primary.main};\n `,\n});\n\nexport default UngroupedModeView;\n","import { css } from '@emotion/css';\nimport { sortBy } from 'lodash';\nimport React, { useEffect, useMemo } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { GrafanaTheme2, PanelProps } from '@grafana/data';\nimport { Alert, CustomScrollbar, LoadingPlaceholder, useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector';\nimport { fetchAllPromRulesAction } from 'app/features/alerting/unified/state/actions';\nimport { labelsMatchMatchers, parseMatchers } from 'app/features/alerting/unified/utils/alertmanager';\nimport { Annotation, RULE_LIST_POLL_INTERVAL_MS } from 'app/features/alerting/unified/utils/constants';\nimport {\n getAllRulesSourceNames,\n GRAFANA_DATASOURCE_NAME,\n GRAFANA_RULES_SOURCE_NAME,\n} from 'app/features/alerting/unified/utils/datasource';\nimport { flattenRules, getFirstActiveAt } from 'app/features/alerting/unified/utils/rules';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { AccessControlAction } from 'app/types';\nimport { PromRuleWithLocation } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { GroupMode, SortOrder, UnifiedAlertListOptions } from './types';\nimport GroupedModeView from './unified-alerting/GroupedView';\nimport UngroupedModeView from './unified-alerting/UngroupedView';\nimport { filterAlerts } from './util';\n\nexport function UnifiedAlertList(props: PanelProps<UnifiedAlertListOptions>) {\n const dispatch = useDispatch();\n const rulesDataSourceNames = useMemo(getAllRulesSourceNames, []);\n\n // backwards compat for \"Inactive\" state filter\n useEffect(() => {\n if (props.options.stateFilter.inactive === true) {\n props.options.stateFilter.normal = true; // enable the normal filter\n }\n props.options.stateFilter.inactive = undefined; // now disable inactive\n }, [props.options.stateFilter]);\n\n useEffect(() => {\n dispatch(fetchAllPromRulesAction());\n const interval = setInterval(() => dispatch(fetchAllPromRulesAction()), RULE_LIST_POLL_INTERVAL_MS);\n return () => {\n clearInterval(interval);\n };\n }, [dispatch]);\n\n const promRulesRequests = useUnifiedAlertingSelector((state) => state.promRules);\n\n const dispatched = rulesDataSourceNames.some((name) => promRulesRequests[name]?.dispatched);\n const loading = rulesDataSourceNames.some((name) => promRulesRequests[name]?.loading);\n const haveResults = rulesDataSourceNames.some(\n (name) => promRulesRequests[name]?.result?.length && !promRulesRequests[name]?.error\n );\n\n const styles = useStyles2(getStyles);\n\n const rules = useMemo(\n () =>\n filterRules(\n props,\n sortRules(\n props.options.sortOrder,\n Object.values(promRulesRequests).flatMap(({ result = [] }) => flattenRules(result))\n )\n ),\n [props, promRulesRequests]\n );\n\n const noAlertsMessage = rules.length === 0 ? 'No alerts matching filters' : undefined;\n\n if (\n !contextSrv.hasPermission(AccessControlAction.AlertingRuleRead) &&\n !contextSrv.hasPermission(AccessControlAction.AlertingRuleExternalRead)\n ) {\n return (\n <Alert title=\"Permission required\">Sorry, you do not have the required permissions to read alert rules</Alert>\n );\n }\n\n return (\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n <div className={styles.container}>\n {dispatched && loading && !haveResults && <LoadingPlaceholder text=\"Loading...\" />}\n {noAlertsMessage && <div className={styles.noAlertsMessage}>{noAlertsMessage}</div>}\n <section>\n {props.options.groupMode === GroupMode.Custom && haveResults && (\n <GroupedModeView rules={rules} options={props.options} />\n )}\n {props.options.groupMode === GroupMode.Default && haveResults && (\n <UngroupedModeView rules={rules} options={props.options} />\n )}\n </section>\n </div>\n </CustomScrollbar>\n );\n}\n\nfunction sortRules(sortOrder: SortOrder, rules: PromRuleWithLocation[]) {\n if (sortOrder === SortOrder.Importance) {\n // @ts-ignore\n return sortBy(rules, (rule) => alertDef.alertStateSortScore[rule.state]);\n } else if (sortOrder === SortOrder.TimeAsc) {\n return sortBy(rules, (rule) => getFirstActiveAt(rule.rule) || new Date());\n } else if (sortOrder === SortOrder.TimeDesc) {\n return sortBy(rules, (rule) => getFirstActiveAt(rule.rule) || new Date()).reverse();\n }\n const result = sortBy(rules, (rule) => rule.rule.name.toLowerCase());\n if (sortOrder === SortOrder.AlphaDesc) {\n result.reverse();\n }\n\n return result;\n}\n\nfunction filterRules(props: PanelProps<UnifiedAlertListOptions>, rules: PromRuleWithLocation[]) {\n const { options, replaceVariables } = props;\n\n let filteredRules = [...rules];\n if (options.dashboardAlerts) {\n const dashboardUid = getDashboardSrv().getCurrent()?.uid;\n filteredRules = filteredRules.filter(({ rule: { annotations = {} } }) =>\n Object.entries(annotations).some(([key, value]) => key === Annotation.dashboardUID && value === dashboardUid)\n );\n }\n if (options.alertName) {\n const replacedName = replaceVariables(options.alertName);\n filteredRules = filteredRules.filter(({ rule: { name } }) =>\n name.toLocaleLowerCase().includes(replacedName.toLocaleLowerCase())\n );\n }\n\n filteredRules = filteredRules.filter((rule) => {\n return (\n (options.stateFilter.firing && rule.rule.state === PromAlertingRuleState.Firing) ||\n (options.stateFilter.pending && rule.rule.state === PromAlertingRuleState.Pending) ||\n (options.stateFilter.normal && rule.rule.state === PromAlertingRuleState.Inactive)\n );\n });\n\n if (options.alertInstanceLabelFilter) {\n const replacedLabelFilter = replaceVariables(options.alertInstanceLabelFilter);\n const matchers = parseMatchers(replacedLabelFilter);\n // Reduce rules and instances to only those that match\n filteredRules = filteredRules.reduce<PromRuleWithLocation[]>((rules, rule) => {\n const filteredAlerts = (rule.rule.alerts ?? []).filter(({ labels }) => labelsMatchMatchers(labels, matchers));\n if (filteredAlerts.length) {\n rules.push({ ...rule, rule: { ...rule.rule, alerts: filteredAlerts } });\n }\n return rules;\n }, []);\n }\n\n if (options.folder) {\n filteredRules = filteredRules.filter((rule) => {\n return rule.namespaceName === options.folder.title;\n });\n }\n if (options.datasource) {\n const isGrafanaDS = options.datasource === GRAFANA_DATASOURCE_NAME;\n\n filteredRules = filteredRules.filter(\n isGrafanaDS\n ? ({ dataSourceName }) => dataSourceName === GRAFANA_RULES_SOURCE_NAME\n : ({ dataSourceName }) => dataSourceName === options.datasource\n );\n }\n\n // Remove rules having 0 instances\n // AlertInstances filters instances and we need to prevent situation\n // when we display a rule with 0 instances\n filteredRules = filteredRules.reduce<PromRuleWithLocation[]>((rules, rule) => {\n const filteredAlerts = filterAlerts(options, rule.rule.alerts ?? []);\n if (filteredAlerts.length) {\n // We intentionally don't set alerts to filteredAlerts\n // because later we couldn't display that some alerts are hidden (ref AlertInstances filtering)\n rules.push(rule);\n }\n return rules;\n }, []);\n\n return filteredRules;\n}\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n cardContainer: css`\n padding: ${theme.v1.spacing.xs} 0 ${theme.v1.spacing.xxs} 0;\n line-height: ${theme.v1.typography.lineHeight.md};\n margin-bottom: 0px;\n `,\n container: css`\n overflow-y: auto;\n height: 100%;\n `,\n alertRuleList: css`\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n list-style-type: none;\n `,\n alertRuleItem: css`\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n background: ${theme.v1.colors.bg2};\n padding: ${theme.v1.spacing.xs} ${theme.v1.spacing.sm};\n border-radius: ${theme.v1.border.radius.md};\n margin-bottom: ${theme.v1.spacing.xs};\n\n & > * {\n margin-right: ${theme.v1.spacing.sm};\n }\n `,\n alertName: css`\n font-size: ${theme.v1.typography.size.md};\n font-weight: ${theme.v1.typography.weight.bold};\n `,\n alertLabels: css`\n > * {\n margin-right: ${theme.v1.spacing.xs};\n }\n `,\n alertDuration: css`\n font-size: ${theme.v1.typography.size.sm};\n `,\n alertRuleItemText: css`\n font-weight: ${theme.v1.typography.weight.bold};\n font-size: ${theme.v1.typography.size.sm};\n margin: 0;\n `,\n alertRuleItemTime: css`\n color: ${theme.v1.colors.textWeak};\n font-weight: normal;\n white-space: nowrap;\n `,\n alertRuleItemInfo: css`\n font-weight: normal;\n flex-grow: 2;\n display: flex;\n align-items: flex-end;\n `,\n noAlertsMessage: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n `,\n alertIcon: css`\n margin-right: ${theme.v1.spacing.xs};\n `,\n instanceDetails: css`\n min-width: 1px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n customGroupDetails: css`\n margin-bottom: ${theme.v1.spacing.xs};\n `,\n});\n","import React from 'react';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { config, DataSourcePicker } from '@grafana/runtime';\nimport { TagsInput } from '@grafana/ui';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport {\n ALL_FOLDER,\n GENERAL_FOLDER,\n ReadonlyFolderPicker,\n} from 'app/core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker';\nimport { PermissionLevelString } from 'app/types';\n\nimport { AlertList } from './AlertList';\nimport { alertListPanelMigrationHandler } from './AlertListMigrationHandler';\nimport { GroupBy } from './GroupByWithLoading';\nimport { UnifiedAlertList } from './UnifiedAlertList';\nimport { AlertListSuggestionsSupplier } from './suggestions';\nimport { AlertListOptions, GroupMode, ShowOption, SortOrder, UnifiedAlertListOptions } from './types';\n\nfunction showIfCurrentState(options: AlertListOptions) {\n return options.showOptions === ShowOption.Current;\n}\n\nconst alertList = new PanelPlugin<AlertListOptions>(AlertList)\n .setPanelOptions((builder) => {\n builder\n .addSelect({\n name: 'Show',\n path: 'showOptions',\n settings: {\n options: [\n { label: 'Current state', value: ShowOption.Current },\n { label: 'Recent state changes', value: ShowOption.RecentChanges },\n ],\n },\n defaultValue: ShowOption.Current,\n category: ['Options'],\n })\n .addNumberInput({\n name: 'Max items',\n path: 'maxItems',\n defaultValue: 10,\n category: ['Options'],\n })\n .addSelect({\n name: 'Sort order',\n path: 'sortOrder',\n settings: {\n options: [\n { label: 'Alphabetical (asc)', value: SortOrder.AlphaAsc },\n { label: 'Alphabetical (desc)', value: SortOrder.AlphaDesc },\n { label: 'Importance', value: SortOrder.Importance },\n { label: 'Time (asc)', value: SortOrder.TimeAsc },\n { label: 'Time (desc)', value: SortOrder.TimeDesc },\n ],\n },\n defaultValue: SortOrder.AlphaAsc,\n category: ['Options'],\n })\n .addBooleanSwitch({\n path: 'dashboardAlerts',\n name: 'Alerts from this dashboard',\n defaultValue: false,\n category: ['Options'],\n })\n .addTextInput({\n path: 'alertName',\n name: 'Alert name',\n defaultValue: '',\n category: ['Filter'],\n showIf: showIfCurrentState,\n })\n .addTextInput({\n path: 'dashboardTitle',\n name: 'Dashboard title',\n defaultValue: '',\n category: ['Filter'],\n showIf: showIfCurrentState,\n })\n .addCustomEditor({\n path: 'folderId',\n name: 'Folder',\n id: 'folderId',\n defaultValue: null,\n editor: function RenderFolderPicker({ value, onChange }) {\n return (\n <ReadonlyFolderPicker\n initialFolderId={value}\n onChange={(folder) => onChange(folder?.id)}\n extraFolders={[ALL_FOLDER, GENERAL_FOLDER]}\n />\n );\n },\n category: ['Filter'],\n showIf: showIfCurrentState,\n })\n .addCustomEditor({\n id: 'tags',\n path: 'tags',\n name: 'Tags',\n description: '',\n defaultValue: [],\n editor(props) {\n return <TagsInput tags={props.value} onChange={props.onChange} />;\n },\n category: ['Filter'],\n showIf: showIfCurrentState,\n })\n .addBooleanSwitch({\n path: 'stateFilter.ok',\n name: 'Ok',\n defaultValue: false,\n category: ['State filter'],\n showIf: showIfCurrentState,\n })\n .addBooleanSwitch({\n path: 'stateFilter.paused',\n name: 'Paused',\n defaultValue: false,\n category: ['State filter'],\n showIf: showIfCurrentState,\n })\n .addBooleanSwitch({\n path: 'stateFilter.no_data',\n name: 'No data',\n defaultValue: false,\n category: ['State filter'],\n showIf: showIfCurrentState,\n })\n .addBooleanSwitch({\n path: 'stateFilter.execution_error',\n name: 'Execution error',\n defaultValue: false,\n category: ['State filter'],\n showIf: showIfCurrentState,\n })\n .addBooleanSwitch({\n path: 'stateFilter.alerting',\n name: 'Alerting',\n defaultValue: false,\n category: ['State filter'],\n showIf: showIfCurrentState,\n })\n .addBooleanSwitch({\n path: 'stateFilter.pending',\n name: 'Pending',\n defaultValue: false,\n category: ['State filter'],\n showIf: showIfCurrentState,\n });\n })\n .setMigrationHandler(alertListPanelMigrationHandler)\n .setSuggestionsSupplier(new AlertListSuggestionsSupplier());\n\nconst unifiedAlertList = new PanelPlugin<UnifiedAlertListOptions>(UnifiedAlertList).setPanelOptions((builder) => {\n builder\n .addRadio({\n path: 'groupMode',\n name: 'Group mode',\n description: 'How alert instances should be grouped',\n defaultValue: GroupMode.Default,\n settings: {\n options: [\n { value: GroupMode.Default, label: 'Default grouping' },\n { value: GroupMode.Custom, label: 'Custom grouping' },\n ],\n },\n category: ['Options'],\n })\n .addCustomEditor({\n path: 'groupBy',\n name: 'Group by',\n description: 'Filter alerts using label querying',\n id: 'groupBy',\n defaultValue: [],\n showIf: (options) => options.groupMode === GroupMode.Custom,\n category: ['Options'],\n editor: (props) => {\n return (\n <GroupBy\n id={props.id ?? 'groupBy'}\n defaultValue={props.value.map((value: string) => ({ label: value, value }))}\n onChange={props.onChange}\n />\n );\n },\n })\n .addNumberInput({\n name: 'Max items',\n path: 'maxItems',\n description: 'Maximum alerts to display',\n defaultValue: 20,\n category: ['Options'],\n })\n .addSelect({\n name: 'Sort order',\n path: 'sortOrder',\n description: 'Sort order of alerts and alert instances',\n settings: {\n options: [\n { label: 'Alphabetical (asc)', value: SortOrder.AlphaAsc },\n { label: 'Alphabetical (desc)', value: SortOrder.AlphaDesc },\n { label: 'Importance', value: SortOrder.Importance },\n { label: 'Time (asc)', value: SortOrder.TimeAsc },\n { label: 'Time (desc)', value: SortOrder.TimeDesc },\n ],\n },\n defaultValue: SortOrder.AlphaAsc,\n category: ['Options'],\n })\n .addBooleanSwitch({\n path: 'dashboardAlerts',\n name: 'Alerts from this dashboard',\n description: 'Show alerts from this dashboard',\n defaultValue: false,\n category: ['Options'],\n })\n .addTextInput({\n path: 'alertName',\n name: 'Alert name',\n description: 'Filter for alerts containing this text',\n defaultValue: '',\n category: ['Filter'],\n })\n .addTextInput({\n path: 'alertInstanceLabelFilter',\n name: 'Alert instance label',\n description: 'Filter alert instances using label querying, ex: {severity=\"critical\", instance=~\"cluster-us-.+\"}',\n defaultValue: '',\n category: ['Filter'],\n })\n .addCustomEditor({\n path: 'folder',\n name: 'Folder',\n description: 'Filter for alerts in the selected folder',\n id: 'folder',\n defaultValue: null,\n editor: function RenderFolderPicker(props) {\n return (\n <FolderPicker\n enableReset={true}\n showRoot={false}\n allowEmpty={true}\n initialTitle={props.value?.title}\n initialFolderId={props.value?.id}\n permissionLevel={PermissionLevelString.View}\n onClear={() => props.onChange('')}\n {...props}\n />\n );\n },\n category: ['Filter'],\n })\n .addCustomEditor({\n path: 'datasource',\n name: 'Datasource',\n description: 'Filter alerts from selected datasource',\n id: 'datasource',\n defaultValue: null,\n editor: function RenderDatasourcePicker(props) {\n return (\n <DataSourcePicker\n {...props}\n type={['prometheus', 'loki', 'grafana']}\n noDefault\n current={props.value}\n onChange={(ds) => props.onChange(ds.name)}\n onClear={() => props.onChange('')}\n />\n );\n },\n category: ['Filter'],\n })\n .addBooleanSwitch({\n path: 'stateFilter.firing',\n name: 'Alerting / Firing',\n defaultValue: true,\n category: ['Alert state filter'],\n })\n .addBooleanSwitch({\n path: 'stateFilter.pending',\n name: 'Pending',\n defaultValue: true,\n category: ['Alert state filter'],\n })\n .addBooleanSwitch({\n path: 'stateFilter.noData',\n name: 'No Data',\n defaultValue: false,\n category: ['Alert state filter'],\n })\n .addBooleanSwitch({\n path: 'stateFilter.normal',\n name: 'Normal',\n defaultValue: false,\n category: ['Alert state filter'],\n })\n .addBooleanSwitch({\n path: 'stateFilter.error',\n name: 'Error',\n defaultValue: true,\n category: ['Alert state filter'],\n });\n});\n\nexport const plugin = config.unifiedAlertingEnabled ? unifiedAlertList : alertList;\n","import { PanelModel } from '@grafana/data';\n\nimport { AlertListOptions, ShowOption, SortOrder } from './types';\n\nexport const alertListPanelMigrationHandler = (\n panel: PanelModel<AlertListOptions> & Record<string, any>\n): Partial<AlertListOptions> => {\n const newOptions: AlertListOptions = {\n showOptions: panel.options.showOptions ?? panel.show ?? ShowOption.Current,\n maxItems: panel.options.maxItems ?? panel.limit ?? 10,\n sortOrder: panel.options.sortOrder ?? panel.sortOrder ?? SortOrder.AlphaAsc,\n dashboardAlerts: panel.options.dashboardAlerts ?? panel.onlyAlertsOnDashboard ?? false,\n alertName: panel.options.alertName ?? panel.nameFilter ?? '',\n dashboardTitle: panel.options.dashboardTitle ?? panel.dashboardFilter ?? '',\n folderId: panel.options.folderId ?? panel.folderId,\n tags: panel.options.tags ?? panel.dashboardTags ?? [],\n stateFilter:\n panel.options.stateFilter ??\n panel.stateFilter?.reduce((filterObj: any, curFilter: any) => ({ ...filterObj, [curFilter]: true }), {}) ??\n {},\n };\n\n const previousVersion = parseFloat(panel.pluginVersion || '7.4');\n if (previousVersion < 7.5) {\n const oldProps = [\n 'show',\n 'limit',\n 'sortOrder',\n 'onlyAlertsOnDashboard',\n 'nameFilter',\n 'dashboardFilter',\n 'folderId',\n 'dashboardTags',\n 'stateFilter',\n ];\n oldProps.forEach((prop) => delete panel[prop]);\n }\n\n return newOptions;\n};\n","import { VisualizationSuggestionsBuilder } from '@grafana/data';\n\nimport { AlertListOptions } from './types';\n\nexport class AlertListSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary } = builder;\n\n if (dataSummary.hasData) {\n return;\n }\n\n const list = builder.getListAppender<AlertListOptions, {}>({\n name: 'Dashboard list',\n pluginId: 'dashlist',\n options: {},\n });\n\n list.append({});\n }\n}\n","import { css } from '@emotion/css';\nimport React, { FC, MouseEvent } from 'react';\n\nimport { AnnotationEvent, DateTimeInput, GrafanaTheme2, PanelProps } from '@grafana/data';\nimport { Card, TagList, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { PanelOptions } from './models.gen';\n\ninterface Props extends Pick<PanelProps<PanelOptions>, 'options'> {\n annotation: AnnotationEvent;\n formatDate: (date: DateTimeInput, format?: string) => string;\n onClick: (annotation: AnnotationEvent) => void;\n onAvatarClick: (annotation: AnnotationEvent) => void;\n onTagClick: (tag: string, remove?: boolean) => void;\n}\n\nexport const AnnotationListItem: FC<Props> = ({\n options,\n annotation,\n formatDate,\n onClick,\n onAvatarClick,\n onTagClick,\n}) => {\n const styles = useStyles2(getStyles);\n const { showUser, showTags, showTime } = options;\n const { text, login, email, avatarUrl, tags, time, timeEnd } = annotation;\n const onItemClick = () => {\n onClick(annotation);\n };\n const onLoginClick = () => {\n onAvatarClick(annotation);\n };\n const showAvatar = login && showUser;\n const showTimeStamp = time && showTime;\n const showTimeStampEnd = timeEnd && timeEnd !== time && showTime;\n\n return (\n <Card className={styles.card} onClick={onItemClick}>\n <Card.Heading>\n <span>{text}</span>\n </Card.Heading>\n {showTimeStamp && (\n <Card.Description className={styles.timestamp}>\n <TimeStamp formatDate={formatDate} time={time!} />\n {showTimeStampEnd && (\n <>\n <span className={styles.time}>-</span>\n <TimeStamp formatDate={formatDate} time={timeEnd!} />{' '}\n </>\n )}\n </Card.Description>\n )}\n {showAvatar && (\n <Card.Meta className={styles.meta}>\n <Avatar email={email} login={login!} avatarUrl={avatarUrl} onClick={onLoginClick} />\n </Card.Meta>\n )}\n {showTags && tags && (\n <Card.Tags>\n <TagList tags={tags} onClick={(tag) => onTagClick(tag, false)} />\n </Card.Tags>\n )}\n </Card>\n );\n};\n\ninterface AvatarProps {\n login: string;\n onClick: () => void;\n avatarUrl?: string;\n email?: string;\n}\n\nconst Avatar: FC<AvatarProps> = ({ onClick, avatarUrl, login, email }) => {\n const styles = useStyles2(getStyles);\n const onAvatarClick = (e: MouseEvent) => {\n e.stopPropagation();\n onClick();\n };\n const tooltipContent = (\n <span>\n Created by:\n <br /> {email}\n </span>\n );\n\n return (\n <Tooltip content={tooltipContent} theme=\"info\" placement=\"top\">\n <button onClick={onAvatarClick} className={styles.avatar} aria-label={`Created by ${email}`}>\n <img src={avatarUrl} alt=\"avatar icon\" />\n </button>\n </Tooltip>\n );\n};\n\ninterface TimeStampProps {\n time: number;\n formatDate: (date: DateTimeInput, format?: string) => string;\n}\n\nconst TimeStamp: FC<TimeStampProps> = ({ time, formatDate }) => {\n const styles = useStyles2(getStyles);\n\n return (\n <span className={styles.time}>\n <span>{formatDate(time)}</span>\n </span>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n card: css({\n gridTemplateAreas: `\"Heading Description Meta Tags\"`,\n gridTemplateColumns: 'auto 1fr auto auto',\n padding: theme.spacing(1),\n margin: theme.spacing(0.5),\n width: 'inherit',\n }),\n meta: css({\n margin: 0,\n position: 'relative',\n justifyContent: 'end',\n }),\n timestamp: css({\n margin: 0,\n alignSelf: 'center',\n }),\n time: css({\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(1),\n fontSize: theme.typography.bodySmall.fontSize,\n color: theme.colors.text.secondary,\n }),\n avatar: css({\n border: 'none',\n background: 'inherit',\n margin: 0,\n padding: theme.spacing(0.5),\n img: {\n borderRadius: '50%',\n width: theme.spacing(2),\n height: theme.spacing(2),\n },\n }),\n };\n}\n","import { css } from '@emotion/css';\nimport { FocusScope } from '@react-aria/focus';\nimport React, { PureComponent } from 'react';\nimport { Subscription } from 'rxjs';\n\nimport {\n AnnotationChangeEvent,\n AnnotationEvent,\n AppEvents,\n dateTime,\n DurationUnit,\n GrafanaTheme,\n locationUtil,\n PanelProps,\n} from '@grafana/data';\nimport { config, getBackendSrv, locationService } from '@grafana/runtime';\nimport { CustomScrollbar, stylesFactory, TagList } from '@grafana/ui';\nimport { AbstractList } from '@grafana/ui/src/components/List/AbstractList';\nimport appEvents from 'app/core/app_events';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\n\nimport { AnnotationListItem } from './AnnotationListItem';\nimport { PanelOptions } from './models.gen';\n\ninterface UserInfo {\n id?: number;\n login?: string;\n email?: string;\n}\n\nexport interface Props extends PanelProps<PanelOptions> {}\ninterface State {\n annotations: AnnotationEvent[];\n timeInfo: string;\n loaded: boolean;\n queryUser?: UserInfo;\n queryTags: string[];\n}\nexport class AnnoListPanel extends PureComponent<Props, State> {\n style = getStyles(config.theme);\n subs = new Subscription();\n tagListRef = React.createRef<HTMLUListElement>();\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n annotations: [],\n timeInfo: '',\n loaded: false,\n queryTags: [],\n };\n }\n\n componentDidMount() {\n this.doSearch();\n\n // When an annotation on this dashboard changes, re-run the query\n this.subs.add(\n this.props.eventBus.getStream(AnnotationChangeEvent).subscribe({\n next: () => {\n this.doSearch();\n },\n })\n );\n }\n\n componentWillUnmount() {\n this.subs.unsubscribe();\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n const { options, timeRange } = this.props;\n const needsQuery =\n options !== prevProps.options ||\n this.state.queryTags !== prevState.queryTags ||\n this.state.queryUser !== prevState.queryUser ||\n (options.onlyInTimeRange && timeRange !== prevProps.timeRange);\n\n if (needsQuery) {\n this.doSearch();\n }\n }\n\n async doSearch() {\n // http://docs.grafana.org/http_api/annotations/\n // https://github.com/grafana/grafana/blob/main/public/app/core/services/backend_srv.ts\n // https://github.com/grafana/grafana/blob/main/public/app/features/annotations/annotations_srv.ts\n\n const { options } = this.props;\n const { queryUser, queryTags } = this.state;\n\n const params: any = {\n tags: options.tags,\n limit: options.limit,\n type: 'annotation', // Skip the Annotations that are really alerts. (Use the alerts panel!)\n };\n\n if (options.onlyFromThisDashboard) {\n params.dashboardUID = getDashboardSrv().getCurrent()?.uid;\n }\n\n let timeInfo = '';\n if (options.onlyInTimeRange) {\n const { timeRange } = this.props;\n params.from = timeRange.from.valueOf();\n params.to = timeRange.to.valueOf();\n } else {\n timeInfo = 'All Time';\n }\n\n if (queryUser) {\n params.userId = queryUser.id;\n }\n\n if (options.tags && options.tags.length) {\n params.tags = options.tags.map((tag) => this.props.replaceVariables(tag));\n }\n\n if (queryTags.length) {\n params.tags = params.tags ? [...params.tags, ...queryTags] : queryTags;\n }\n\n const annotations = await getBackendSrv().get('/api/annotations', params, `anno-list-panel-${this.props.id}`);\n\n this.setState({\n annotations,\n timeInfo,\n loaded: true,\n });\n }\n\n onAnnoClick = async (anno: AnnotationEvent) => {\n if (!anno.time) {\n return;\n }\n\n const { options } = this.props;\n const dashboardSrv = getDashboardSrv();\n const current = dashboardSrv.getCurrent();\n\n const params: any = {\n from: this._timeOffset(anno.time, options.navigateBefore, true),\n to: this._timeOffset(anno.timeEnd ?? anno.time, options.navigateAfter, false),\n };\n\n if (options.navigateToPanel) {\n params.viewPanel = anno.panelId;\n }\n\n if (current?.uid === anno.dashboardUID) {\n locationService.partial(params);\n return;\n }\n\n const result = await getBackendSrv().get('/api/search', { dashboardUIDs: anno.dashboardUID });\n if (result && result.length && result[0].uid === anno.dashboardUID) {\n const dash = result[0];\n const url = new URL(dash.url, window.location.origin);\n url.searchParams.set('from', params.from);\n url.searchParams.set('to', params.to);\n locationService.push(locationUtil.stripBaseFromUrl(url.toString()));\n return;\n }\n appEvents.emit(AppEvents.alertWarning, ['Unknown Dashboard: ' + anno.dashboardUID]);\n };\n\n _timeOffset(time: number, offset: string, subtract = false): number {\n let incr = 5;\n let unit = 'm';\n const parts = /^(\\d+)(\\w)/.exec(offset);\n if (parts && parts.length === 3) {\n incr = parseInt(parts[1], 10);\n unit = parts[2];\n }\n\n const t = dateTime(time);\n if (subtract) {\n incr *= -1;\n }\n return t.add(incr, unit as DurationUnit).valueOf();\n }\n\n onTagClick = (tag: string, remove?: boolean) => {\n if (!remove && this.state.queryTags.includes(tag)) {\n return;\n }\n\n const queryTags = remove ? this.state.queryTags.filter((item) => item !== tag) : [...this.state.queryTags, tag];\n\n // Logic to ensure keyboard focus isn't lost when the currently\n // focused tag is removed\n let nextTag: HTMLElement | undefined = undefined;\n if (remove) {\n const focusedTag = document.activeElement;\n const dataTagId = focusedTag?.getAttribute('data-tag-id');\n if (this.tagListRef.current?.contains(focusedTag) && dataTagId) {\n const parsedTagId = Number.parseInt(dataTagId, 10);\n const possibleNextTag =\n this.tagListRef.current.querySelector(`[data-tag-id=\"${parsedTagId + 1}\"]`) ??\n this.tagListRef.current.querySelector(`[data-tag-id=\"${parsedTagId - 1}\"]`);\n if (possibleNextTag instanceof HTMLElement) {\n nextTag = possibleNextTag;\n }\n }\n }\n\n this.setState({ queryTags }, () => nextTag?.focus());\n };\n\n onUserClick = (anno: AnnotationEvent) => {\n this.setState({\n queryUser: {\n id: anno.userId,\n login: anno.login,\n email: anno.email,\n },\n });\n };\n\n onClearUser = () => {\n this.setState({\n queryUser: undefined,\n });\n };\n\n renderItem = (anno: AnnotationEvent, index: number): JSX.Element => {\n const { options } = this.props;\n const dashboard = getDashboardSrv().getCurrent();\n if (!dashboard) {\n return <></>;\n }\n\n return (\n <AnnotationListItem\n annotation={anno}\n formatDate={dashboard.formatDate}\n onClick={this.onAnnoClick}\n onAvatarClick={this.onUserClick}\n onTagClick={this.onTagClick}\n options={options}\n />\n );\n };\n\n render() {\n const { loaded, annotations, queryUser, queryTags } = this.state;\n if (!loaded) {\n return <div>loading...</div>;\n }\n\n // Previously we showed inidication that it covered all time\n // { timeInfo && (\n // <span className=\"panel-time-info\">\n // <Icon name=\"clock-nine\" /> {timeInfo}\n // </span>\n // )}\n\n const hasFilter = queryUser || queryTags.length > 0;\n return (\n <CustomScrollbar autoHeightMin=\"100%\">\n {hasFilter && (\n <div className={this.style.filter}>\n <b>Filter:</b>\n {queryUser && (\n <span onClick={this.onClearUser} className=\"pointer\">\n {queryUser.email}\n </span>\n )}\n {queryTags.length > 0 && (\n <FocusScope restoreFocus>\n <TagList\n icon=\"times\"\n tags={queryTags}\n onClick={(tag) => this.onTagClick(tag, true)}\n getAriaLabel={(name) => `Remove ${name} tag`}\n className={this.style.tagList}\n ref={this.tagListRef}\n />\n </FocusScope>\n )}\n </div>\n )}\n\n {annotations.length < 1 && <div className={this.style.noneFound}>No Annotations Found</div>}\n\n <AbstractList items={annotations} renderItem={this.renderItem} getItemKey={(item) => `${item.id}`} />\n </CustomScrollbar>\n );\n }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n noneFound: css`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: calc(100% - 30px);\n `,\n filter: css({\n display: 'flex',\n padding: `0px ${theme.spacing.xs}`,\n b: {\n paddingRight: theme.spacing.sm,\n },\n }),\n tagList: css({\n justifyContent: 'flex-start',\n 'li > button': {\n paddingLeft: '3px',\n },\n }),\n}));\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\nexport const modelVersion = Object.freeze([0, 0]);\n\n\nexport interface PanelOptions {\n limit: number;\n navigateAfter: string;\n navigateBefore: string;\n navigateToPanel: boolean;\n onlyFromThisDashboard: boolean;\n onlyInTimeRange: boolean;\n showTags: boolean;\n showTime: boolean;\n showUser: boolean;\n tags: string[];\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n limit: 10,\n navigateAfter: '10m',\n navigateBefore: '10m',\n navigateToPanel: true,\n onlyFromThisDashboard: false,\n onlyInTimeRange: false,\n showTags: true,\n showTime: true,\n showUser: true,\n tags: [],\n};\n","import React from 'react';\n\nimport { PanelModel, PanelPlugin } from '@grafana/data';\nimport { TagsInput } from '@grafana/ui';\n\nimport { AnnoListPanel } from './AnnoListPanel';\nimport { defaultPanelOptions, PanelOptions } from './models.gen';\n\nexport const plugin = new PanelPlugin<PanelOptions>(AnnoListPanel)\n .setPanelOptions((builder) => {\n builder\n .addRadio({\n category: ['Annotation query'],\n path: 'onlyFromThisDashboard',\n name: 'Query filter',\n defaultValue: defaultPanelOptions.onlyFromThisDashboard,\n settings: {\n options: [\n { value: false, label: 'All dashboards' },\n { value: true, label: 'This dashboard' },\n ],\n },\n })\n .addRadio({\n category: ['Annotation query'],\n path: 'onlyInTimeRange',\n name: 'Time range',\n defaultValue: defaultPanelOptions.onlyInTimeRange,\n settings: {\n options: [\n { value: false, label: 'None' },\n { value: true, label: 'This dashboard' },\n ],\n },\n })\n .addCustomEditor({\n category: ['Annotation query'],\n id: 'tags',\n path: 'tags',\n name: 'Tags',\n description: 'Match annotation tags',\n editor(props) {\n return <TagsInput tags={props.value} onChange={props.onChange} />;\n },\n })\n .addNumberInput({\n category: ['Annotation query'],\n path: 'limit',\n name: 'Limit',\n defaultValue: defaultPanelOptions.limit,\n })\n .addBooleanSwitch({\n category: ['Display'],\n path: 'showUser',\n name: 'Show user',\n defaultValue: defaultPanelOptions.showUser,\n })\n .addBooleanSwitch({\n category: ['Display'],\n path: 'showTime',\n name: 'Show time',\n defaultValue: defaultPanelOptions.showTime,\n })\n .addBooleanSwitch({\n category: ['Display'],\n path: 'showTags',\n name: 'Show tags',\n defaultValue: defaultPanelOptions.showTags,\n })\n .addRadio({\n category: ['Link behavior'],\n path: 'navigateToPanel',\n name: 'Link target',\n defaultValue: defaultPanelOptions.navigateToPanel,\n settings: {\n options: [\n { value: true, label: 'Panel' },\n { value: false, label: 'Dashboard' },\n ],\n },\n })\n .addTextInput({\n category: ['Link behavior'],\n path: 'navigateBefore',\n name: 'Time before',\n defaultValue: defaultPanelOptions.navigateBefore,\n description: '',\n })\n .addTextInput({\n category: ['Link behavior'],\n path: 'navigateAfter',\n name: 'Time after',\n defaultValue: defaultPanelOptions.navigateAfter,\n description: '',\n });\n })\n // TODO, we should support this directly in the plugin infrastructure\n .setPanelChangeHandler((panel: PanelModel<PanelOptions>, prevPluginId: string, prevOptions: unknown) => {\n if (prevPluginId === 'ryantxu-annolist-panel') {\n return prevOptions as PanelOptions;\n }\n\n return panel.options;\n });\n","import { Dispatch, MutableRefObject, SetStateAction } from 'react';\n\nimport { CartesianCoords2D } from '@grafana/data';\n\nimport { positionTooltip } from '../plugins/TooltipPlugin';\n\nimport { UPlotConfigBuilder } from './UPlotConfigBuilder';\n\nexport type HoverEvent = {\n xIndex: number;\n yIndex: number;\n pageX: number;\n pageY: number;\n};\n\ntype SetupConfigParams = {\n config: UPlotConfigBuilder;\n onUPlotClick: () => void;\n setFocusedSeriesIdx: Dispatch<SetStateAction<number | null>>;\n setFocusedPointIdx: Dispatch<SetStateAction<number | null>>;\n setCoords: Dispatch<SetStateAction<{ viewport: CartesianCoords2D; canvas: CartesianCoords2D } | null>>;\n setHover: Dispatch<SetStateAction<HoverEvent | undefined>>;\n isToolTipOpen: MutableRefObject<boolean>;\n};\n\n// This applies config hooks to setup tooltip listener. Ideally this could happen in the same `prepConfig` function\n// however the GraphNG structures do not allow access to the `setHover` callback\nexport const addTooltipSupport = ({\n config,\n onUPlotClick,\n setFocusedSeriesIdx,\n setFocusedPointIdx,\n setCoords,\n setHover,\n isToolTipOpen,\n}: SetupConfigParams): UPlotConfigBuilder => {\n // Ensure tooltip is closed on config changes\n isToolTipOpen.current = false;\n\n const onMouseLeave = () => {\n if (!isToolTipOpen.current) {\n setCoords(null);\n }\n };\n\n let ref_parent: HTMLElement | null = null;\n let ref_over: HTMLElement | null = null;\n config.addHook('init', (u) => {\n ref_parent = u.root.parentElement;\n ref_over = u.over;\n ref_parent?.addEventListener('click', onUPlotClick);\n ref_over.addEventListener('mouseleave', onMouseLeave);\n });\n\n const clearPopupIfOpened = () => {\n if (isToolTipOpen.current) {\n setCoords(null);\n onUPlotClick();\n }\n };\n\n config.addHook('drawClear', clearPopupIfOpened);\n\n config.addHook('destroy', () => {\n ref_parent?.removeEventListener('click', onUPlotClick);\n ref_over?.removeEventListener('mouseleave', onMouseLeave);\n clearPopupIfOpened();\n });\n\n let rect: DOMRect;\n // rect of .u-over (grid area)\n config.addHook('syncRect', (u, r) => {\n rect = r;\n });\n\n const tooltipInterpolator = config.getTooltipInterpolator();\n if (tooltipInterpolator) {\n config.addHook('setCursor', (u) => {\n tooltipInterpolator(\n setFocusedSeriesIdx,\n setFocusedPointIdx,\n (clear) => {\n if (clear && !isToolTipOpen.current) {\n setCoords(null);\n return;\n }\n\n if (!rect) {\n return;\n }\n\n const { x, y } = positionTooltip(u, rect);\n if (x !== undefined && y !== undefined && !isToolTipOpen.current) {\n setCoords({ canvas: { x: u.cursor.left!, y: u.cursor.top! }, viewport: { x, y } });\n }\n },\n u\n );\n });\n }\n\n config.addHook('setLegend', (u) => {\n if (!isToolTipOpen.current) {\n setFocusedPointIdx(u.legend.idx!);\n }\n if (u.cursor.idxs != null) {\n for (let i = 0; i < u.cursor.idxs.length; i++) {\n const sel = u.cursor.idxs[i];\n if (sel != null) {\n const hover: HoverEvent = {\n xIndex: sel,\n yIndex: 0,\n pageX: rect.left + u.cursor.left!,\n pageY: rect.top + u.cursor.top!,\n };\n\n if (!isToolTipOpen.current || !hover) {\n setHover(hover);\n }\n\n return; // only show the first one\n }\n }\n }\n });\n\n config.addHook('setSeries', (_, idx) => {\n if (!isToolTipOpen.current) {\n setFocusedSeriesIdx(idx);\n }\n });\n\n return config;\n};\n","import uPlot, { Axis, AlignedData, Scale } from 'uplot';\n\nimport { DataFrame, GrafanaTheme2 } from '@grafana/data';\nimport { alpha } from '@grafana/data/src/themes/colorManipulator';\nimport {\n StackingMode,\n VisibilityMode,\n ScaleDirection,\n ScaleOrientation,\n VizTextDisplayOptions,\n VizLegendOptions,\n} from '@grafana/schema';\nimport { measureText, PlotTooltipInterpolator } from '@grafana/ui';\nimport { formatTime } from '@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder';\n\nimport { preparePlotData2, StackingGroup } from '../../../../../packages/grafana-ui/src/components/uPlot/utils';\n\nimport { distribute, SPACE_BETWEEN } from './distribute';\nimport { intersects, pointWithin, Quadtree, Rect } from './quadtree';\n\nconst groupDistr = SPACE_BETWEEN;\nconst barDistr = SPACE_BETWEEN;\n// min.max font size for value label\nconst VALUE_MIN_FONT_SIZE = 8;\nconst VALUE_MAX_FONT_SIZE = 30;\n// % of width/height of the bar that value should fit in when measuring size\nconst BAR_FONT_SIZE_RATIO = 0.65;\n// distance between label and a bar in % of bar width\nconst LABEL_OFFSET_FACTOR_VT = 0.1;\nconst LABEL_OFFSET_FACTOR_HZ = 0.15;\n// max distance\nconst LABEL_OFFSET_MAX_VT = 5;\nconst LABEL_OFFSET_MAX_HZ = 10;\n\n// text baseline middle runs through the middle of lowercase letters\n// since bar values are numbers and uppercase-like, we want the middle of uppercase\n// this is a cheap fudge factor that skips expensive and inconsistent cross-browser measuring\nconst MIDDLE_BASELINE_SHIFT = 0.1;\n\n/**\n * @internal\n */\nexport interface BarsOptions {\n xOri: ScaleOrientation;\n xDir: ScaleDirection;\n groupWidth: number;\n barWidth: number;\n barRadius: number;\n showValue: VisibilityMode;\n stacking: StackingMode;\n rawValue: (seriesIdx: number, valueIdx: number) => number | null;\n getColor?: (seriesIdx: number, valueIdx: number, value: any) => string | null;\n fillOpacity?: number;\n formatValue: (seriesIdx: number, value: any) => string;\n text?: VizTextDisplayOptions;\n onHover?: (seriesIdx: number, valueIdx: number) => void;\n onLeave?: (seriesIdx: number, valueIdx: number) => void;\n legend?: VizLegendOptions;\n xSpacing?: number;\n xTimeAuto?: boolean;\n}\n\n/**\n * @internal\n */\ninterface ValueLabelTable {\n [index: number]: ValueLabelArray;\n}\n\n/**\n * @internal\n */\ninterface ValueLabelArray {\n [index: number]: ValueLabel;\n}\n\n/**\n * @internal\n */\ninterface ValueLabel {\n text: string;\n value: number | null;\n hidden: boolean;\n bbox?: Rect;\n textMetrics?: TextMetrics;\n x?: number;\n y?: number;\n}\n\n/**\n * @internal\n */\nfunction calculateFontSizeWithMetrics(\n text: string,\n width: number,\n height: number,\n lineHeight: number,\n maxSize?: number\n) {\n // calculate width in 14px\n const textSize = measureText(text, 14);\n // how much bigger than 14px can we make it while staying within our width constraints\n const fontSizeBasedOnWidth = (width / (textSize.width + 2)) * 14;\n const fontSizeBasedOnHeight = height / lineHeight;\n\n // final fontSize\n const optimalSize = Math.min(fontSizeBasedOnHeight, fontSizeBasedOnWidth);\n return {\n fontSize: Math.min(optimalSize, maxSize ?? optimalSize),\n textMetrics: textSize,\n };\n}\n\n/**\n * @internal\n */\nexport function getConfig(opts: BarsOptions, theme: GrafanaTheme2) {\n const { xOri, xDir: dir, rawValue, getColor, formatValue, fillOpacity = 1, showValue, xSpacing = 0 } = opts;\n const isXHorizontal = xOri === ScaleOrientation.Horizontal;\n const hasAutoValueSize = !Boolean(opts.text?.valueSize);\n const isStacked = opts.stacking !== StackingMode.None;\n const pctStacked = opts.stacking === StackingMode.Percent;\n\n let { groupWidth, barWidth, barRadius = 0 } = opts;\n\n if (isStacked) {\n [groupWidth, barWidth] = [barWidth, groupWidth];\n }\n\n let qt: Quadtree;\n let hRect: Rect | null;\n\n const xSplits: Axis.Splits = (u: uPlot) => {\n const dim = isXHorizontal ? u.bbox.width : u.bbox.height;\n const _dir = dir * (isXHorizontal ? 1 : -1);\n\n let dataLen = u.data[0].length;\n let lastIdx = dataLen - 1;\n\n let skipMod = 0;\n\n if (xSpacing !== 0) {\n let cssDim = dim / devicePixelRatio;\n let maxTicks = Math.abs(Math.floor(cssDim / xSpacing));\n\n skipMod = dataLen < maxTicks ? 0 : Math.ceil(dataLen / maxTicks);\n }\n\n let splits: number[] = [];\n\n // for distr: 2 scales, the splits array should contain indices into data[0] rather than values\n u.data[0].forEach((v, i) => {\n let shouldSkip = skipMod !== 0 && (xSpacing > 0 ? i : lastIdx - i) % skipMod > 0;\n\n if (!shouldSkip) {\n splits.push(i);\n }\n });\n\n return _dir === 1 ? splits : splits.reverse();\n };\n\n // the splits passed into here are data[0] values looked up by the indices returned from splits()\n const xValues: Axis.Values = (u, splits, axisIdx, foundSpace, foundIncr) => {\n if (opts.xTimeAuto) {\n // bit of a hack:\n // temporarily set x scale range to temporal (as expected by formatTime()) rather than ordinal\n let xScale = u.scales.x;\n let oMin = xScale.min;\n let oMax = xScale.max;\n\n xScale.min = u.data[0][0];\n xScale.max = u.data[0][u.data[0].length - 1];\n\n let vals = formatTime(u, splits, axisIdx, foundSpace, foundIncr);\n\n // revert\n xScale.min = oMin;\n xScale.max = oMax;\n\n return vals;\n }\n\n return splits.map((v) => formatValue(0, v));\n };\n\n // this expands the distr: 2 scale so that the indicies of each data[0] land at the proper justified positions\n const xRange: Scale.Range = (u, min, max) => {\n min = 0;\n max = Math.max(1, u.data[0].length - 1);\n\n let pctOffset = 0;\n\n // how far in is the first tick in % of full dimension\n distribute(u.data[0].length, groupWidth, groupDistr, 0, (di, lftPct, widPct) => {\n pctOffset = lftPct + widPct / 2;\n });\n\n // expand scale range by equal amounts on both ends\n let rn = max - min;\n\n if (pctOffset === 0.5) {\n min -= rn;\n } else {\n let upScale = 1 / (1 - pctOffset * 2);\n let offset = (upScale * rn - rn) / 2;\n\n min -= offset;\n max += offset;\n }\n\n return [min, max];\n };\n\n let distrTwo = (groupCount: number, barCount: number) => {\n let out = Array.from({ length: barCount }, () => ({\n offs: Array(groupCount).fill(0),\n size: Array(groupCount).fill(0),\n }));\n\n distribute(groupCount, groupWidth, groupDistr, null, (groupIdx, groupOffPct, groupDimPct) => {\n distribute(barCount, barWidth, barDistr, null, (barIdx, barOffPct, barDimPct) => {\n out[barIdx].offs[groupIdx] = groupOffPct + groupDimPct * barOffPct;\n out[barIdx].size[groupIdx] = groupDimPct * barDimPct;\n });\n });\n\n return out;\n };\n\n let distrOne = (groupCount: number, barCount: number) => {\n let out = Array.from({ length: barCount }, () => ({\n offs: Array(groupCount).fill(0),\n size: Array(groupCount).fill(0),\n }));\n\n distribute(groupCount, groupWidth, groupDistr, null, (groupIdx, groupOffPct, groupDimPct) => {\n distribute(barCount, barWidth, barDistr, null, (barIdx, barOffPct, barDimPct) => {\n out[barIdx].offs[groupIdx] = groupOffPct;\n out[barIdx].size[groupIdx] = groupDimPct;\n });\n });\n\n return out;\n };\n\n const LABEL_OFFSET_FACTOR = isXHorizontal ? LABEL_OFFSET_FACTOR_VT : LABEL_OFFSET_FACTOR_HZ;\n const LABEL_OFFSET_MAX = isXHorizontal ? LABEL_OFFSET_MAX_VT : LABEL_OFFSET_MAX_HZ;\n\n let barsPctLayout: Array<null | { offs: number[]; size: number[] }> = [];\n let barsColors: Array<null | { fill: Array<string | null>; stroke: Array<string | null> }> = [];\n let scaleFactor = 1;\n let labels: ValueLabelTable;\n let fontSize = opts.text?.valueSize ?? VALUE_MAX_FONT_SIZE;\n let labelOffset = LABEL_OFFSET_MAX;\n\n // minimum available space for labels between bar end and plotting area bound (in canvas pixels)\n let vSpace = Infinity;\n let hSpace = Infinity;\n\n let useMappedColors = getColor != null;\n\n let mappedColorDisp = useMappedColors\n ? {\n fill: {\n unit: 3,\n values: (u: uPlot, seriesIdx: number) => barsColors[seriesIdx]!.fill,\n },\n stroke: {\n unit: 3,\n values: (u: uPlot, seriesIdx: number) => barsColors[seriesIdx]!.stroke,\n },\n }\n : {};\n\n let barsBuilder = uPlot.paths.bars!({\n radius: barRadius,\n disp: {\n x0: {\n unit: 2,\n values: (u, seriesIdx) => barsPctLayout[seriesIdx]!.offs,\n },\n size: {\n unit: 2,\n values: (u, seriesIdx) => barsPctLayout[seriesIdx]!.size,\n },\n ...mappedColorDisp,\n },\n // collect rendered bar geometry\n each: (u, seriesIdx, dataIdx, lft, top, wid, hgt) => {\n // we get back raw canvas coords (included axes & padding)\n // translate to the plotting area origin\n lft -= u.bbox.left;\n top -= u.bbox.top;\n\n let val = u.data[seriesIdx][dataIdx]!;\n // accum min space abvailable for labels\n if (isXHorizontal) {\n vSpace = Math.min(vSpace, val < 0 ? u.bbox.height - (top + hgt) : top);\n hSpace = wid;\n } else {\n vSpace = hgt;\n hSpace = Math.min(hSpace, val < 0 ? lft : u.bbox.width - (lft + wid));\n }\n\n let barRect = { x: lft, y: top, w: wid, h: hgt, sidx: seriesIdx, didx: dataIdx };\n qt.add(barRect);\n\n if (showValue !== VisibilityMode.Never) {\n const raw = rawValue(seriesIdx, dataIdx)!;\n let divider = 1;\n\n if (pctStacked && alignedTotals![seriesIdx][dataIdx]!) {\n divider = alignedTotals![seriesIdx][dataIdx]!;\n }\n\n const v = divider === 0 ? 0 : raw / divider;\n // Format Values and calculate label offsets\n const text = formatValue(seriesIdx, v);\n labelOffset = Math.min(labelOffset, Math.round(LABEL_OFFSET_FACTOR * (isXHorizontal ? wid : hgt)));\n\n if (labels[dataIdx] === undefined) {\n labels[dataIdx] = {};\n }\n labels[dataIdx][seriesIdx] = { text: text, value: rawValue(seriesIdx, dataIdx), hidden: false };\n\n // Calculate font size when it's set to be automatic\n if (hasAutoValueSize) {\n const { fontSize: calculatedSize, textMetrics } = calculateFontSizeWithMetrics(\n labels[dataIdx][seriesIdx].text,\n hSpace * (isXHorizontal ? BAR_FONT_SIZE_RATIO : 1) - (isXHorizontal ? 0 : labelOffset),\n vSpace * (isXHorizontal ? 1 : BAR_FONT_SIZE_RATIO) - (isXHorizontal ? labelOffset : 0),\n 1\n );\n\n // Save text metrics\n labels[dataIdx][seriesIdx].textMetrics = textMetrics;\n\n // Retrieve the new font size and use it\n let autoFontSize = Math.round(Math.min(fontSize, VALUE_MAX_FONT_SIZE, calculatedSize));\n\n // Calculate the scaling factor for bouding boxes\n // Take into account the fact that calculateFontSize\n // uses 14px measurement so we need to adjust the scale factor\n scaleFactor = (autoFontSize / fontSize) * (autoFontSize / 14);\n\n // Update the end font-size\n fontSize = autoFontSize;\n } else {\n labels[dataIdx][seriesIdx].textMetrics = measureText(labels[dataIdx][seriesIdx].text, fontSize);\n }\n\n let middleShift = isXHorizontal ? 0 : -Math.round(MIDDLE_BASELINE_SHIFT * fontSize);\n let value = rawValue(seriesIdx, dataIdx);\n\n if (value != null) {\n // Calculate final co-ordinates for text position\n const x =\n u.bbox.left + (isXHorizontal ? lft + wid / 2 : value < 0 ? lft - labelOffset : lft + wid + labelOffset);\n const y =\n u.bbox.top +\n (isXHorizontal ? (value < 0 ? top + hgt + labelOffset : top - labelOffset) : top + hgt / 2 - middleShift);\n\n // Retrieve textMetrics with necessary default values\n // These _shouldn't_ be undefined at this point\n // but they _could_ be.\n const {\n textMetrics = {\n width: 1,\n actualBoundingBoxAscent: 1,\n actualBoundingBoxDescent: 1,\n },\n } = labels[dataIdx][seriesIdx];\n\n // Adjust bounding boxes based on text scale\n // factor and orientation (which changes the baseline)\n let xAdjust = 0,\n yAdjust = 0;\n\n if (isXHorizontal) {\n // Adjust for baseline which is \"top\" in this case\n xAdjust = (textMetrics.width * scaleFactor) / 2;\n\n // yAdjust only matters when when the value isn't negative\n yAdjust =\n value > 0\n ? (textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent) * scaleFactor\n : 0;\n } else {\n // Adjust from the baseline which is \"middle\" in this case\n yAdjust = ((textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent) * scaleFactor) / 2;\n\n // Adjust for baseline being \"right\" in the x direction\n xAdjust = value < 0 ? textMetrics.width * scaleFactor : 0;\n }\n\n // Construct final bounding box for the label text\n labels[dataIdx][seriesIdx].x = x;\n labels[dataIdx][seriesIdx].y = y;\n labels[dataIdx][seriesIdx].bbox = {\n x: x - xAdjust,\n y: y - yAdjust,\n w: textMetrics.width * scaleFactor,\n h: (textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent) * scaleFactor,\n };\n }\n }\n },\n });\n\n const init = (u: uPlot) => {\n let over = u.over;\n over.style.overflow = 'hidden';\n u.root.querySelectorAll('.u-cursor-pt').forEach((el) => {\n (el as HTMLElement).style.borderRadius = '0';\n });\n };\n\n const cursor: uPlot.Cursor = {\n x: false,\n y: false,\n drag: {\n x: false,\n y: false,\n },\n dataIdx: (u, seriesIdx) => {\n if (seriesIdx === 1) {\n hRect = null;\n\n let cx = u.cursor.left! * devicePixelRatio;\n let cy = u.cursor.top! * devicePixelRatio;\n\n qt.get(cx, cy, 1, 1, (o) => {\n if (pointWithin(cx, cy, o.x, o.y, o.x + o.w, o.y + o.h)) {\n hRect = o;\n }\n });\n }\n\n return hRect && seriesIdx === hRect.sidx ? hRect.didx : null;\n },\n points: {\n fill: 'rgba(255,255,255,0.4)',\n bbox: (u, seriesIdx) => {\n let isHovered = hRect && seriesIdx === hRect.sidx;\n\n return {\n left: isHovered ? hRect!.x / devicePixelRatio : -10,\n top: isHovered ? hRect!.y / devicePixelRatio : -10,\n width: isHovered ? hRect!.w / devicePixelRatio : 0,\n height: isHovered ? hRect!.h / devicePixelRatio : 0,\n };\n },\n },\n };\n\n // Build bars\n const drawClear = (u: uPlot) => {\n qt = qt || new Quadtree(0, 0, u.bbox.width, u.bbox.height);\n qt.clear();\n\n // clear the path cache to force drawBars() to rebuild new quadtree\n u.series.forEach((s) => {\n // @ts-ignore\n s._paths = null;\n });\n\n if (isStacked) {\n //barsPctLayout = [null as any].concat(distrOne(u.data.length - 1, u.data[0].length));\n barsPctLayout = [null as any].concat(distrOne(u.data[0].length, u.data.length - 1));\n } else {\n barsPctLayout = [null as any].concat(distrTwo(u.data[0].length, u.data.length - 1));\n }\n\n if (useMappedColors) {\n barsColors = [null];\n\n // map per-bar colors\n for (let i = 1; i < u.data.length; i++) {\n let colors = (u.data[i] as Array<number | null>).map((value, valueIdx) => {\n if (value != null) {\n return getColor!(i, valueIdx, value);\n }\n\n return null;\n });\n\n barsColors.push({\n fill: fillOpacity < 1 ? colors.map((c) => (c != null ? alpha(c, fillOpacity) : null)) : colors,\n stroke: colors,\n });\n }\n }\n\n labels = {};\n fontSize = opts.text?.valueSize ?? VALUE_MAX_FONT_SIZE;\n labelOffset = LABEL_OFFSET_MAX;\n vSpace = hSpace = Infinity;\n };\n\n // uPlot hook to draw the labels on the bar chart.\n const draw = (u: uPlot) => {\n if (showValue === VisibilityMode.Never || fontSize < VALUE_MIN_FONT_SIZE) {\n return;\n }\n\n u.ctx.save();\n u.ctx.fillStyle = theme.colors.text.primary;\n u.ctx.font = `${fontSize}px ${theme.typography.fontFamily}`;\n\n let curAlign: CanvasTextAlign | undefined = undefined,\n curBaseline: CanvasTextBaseline | undefined = undefined;\n\n for (const didx in labels) {\n // exclude first label from overlap testing\n let first = true;\n\n for (const sidx in labels[didx]) {\n const label = labels[didx][sidx];\n const { text, value, x = 0, y = 0 } = label;\n\n let align: CanvasTextAlign = isXHorizontal ? 'center' : value !== null && value < 0 ? 'right' : 'left';\n let baseline: CanvasTextBaseline = isXHorizontal\n ? value !== null && value < 0\n ? 'top'\n : 'alphabetic'\n : 'middle';\n\n if (align !== curAlign) {\n u.ctx.textAlign = curAlign = align;\n }\n\n if (baseline !== curBaseline) {\n u.ctx.textBaseline = curBaseline = baseline;\n }\n\n if (showValue === VisibilityMode.Always) {\n u.ctx.fillText(text, x, y);\n } else if (showValue === VisibilityMode.Auto) {\n let { bbox } = label;\n\n let intersectsLabel = false;\n\n if (bbox == null) {\n intersectsLabel = true;\n label.hidden = true;\n } else if (!first) {\n // Test for any collisions\n for (const subsidx in labels[didx]) {\n if (subsidx === sidx) {\n continue;\n }\n\n const label2 = labels[didx][subsidx];\n const { bbox: bbox2, hidden } = label2;\n\n if (!hidden && bbox2 && intersects(bbox, bbox2)) {\n intersectsLabel = true;\n label.hidden = true;\n break;\n }\n }\n }\n\n first = false;\n\n !intersectsLabel && u.ctx.fillText(text, x, y);\n }\n }\n }\n\n u.ctx.restore();\n };\n\n // handle hover interaction with quadtree probing\n const interpolateTooltip: PlotTooltipInterpolator = (\n updateActiveSeriesIdx,\n updateActiveDatapointIdx,\n updateTooltipPosition,\n u\n ) => {\n if (hRect) {\n updateActiveSeriesIdx(hRect.sidx);\n updateActiveDatapointIdx(hRect.didx);\n updateTooltipPosition();\n } else {\n updateTooltipPosition(true);\n }\n };\n\n let alignedTotals: AlignedData | null = null;\n\n function prepData(frames: DataFrame[], stackingGroups: StackingGroup[]) {\n alignedTotals = null;\n return preparePlotData2(frames[0], stackingGroups, ({ totals }) => {\n alignedTotals = totals;\n });\n }\n\n return {\n cursor,\n // scale & axis opts\n xRange,\n xValues,\n xSplits,\n\n barsBuilder,\n\n // hooks\n init,\n drawClear,\n draw,\n interpolateTooltip,\n prepData,\n };\n}\n","import {\n OptionsWithLegend,\n OptionsWithTextFormatting,\n OptionsWithTooltip,\n AxisConfig,\n VisibilityMode,\n GraphGradientMode,\n HideableFieldConfig,\n StackingMode,\n} from '@grafana/schema';\nimport { VizOrientation } from '@grafana/data';\n\nexport interface PanelOptions extends OptionsWithLegend, OptionsWithTooltip, OptionsWithTextFormatting {\n xField?: string;\n colorByField?: string;\n orientation: VizOrientation;\n stacking: StackingMode;\n showValue: VisibilityMode;\n barWidth: number;\n barRadius?: number;\n groupWidth: number;\n xTickLabelRotation: number;\n xTickLabelMaxLength: number;\n xTickLabelSpacing?: number; // negative values indicate backwards skipping behavior\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n stacking: StackingMode.None,\n orientation: VizOrientation.Auto,\n xTickLabelRotation: 0,\n xTickLabelSpacing: 0,\n showValue: VisibilityMode.Auto,\n groupWidth: 0.7,\n barWidth: 0.97,\n barRadius: 0,\n};\n\nexport interface BarChartFieldConfig extends AxisConfig, HideableFieldConfig {\n lineWidth?: number; // 0\n fillOpacity?: number; // 100\n gradientMode?: GraphGradientMode;\n}\n\nexport const defaultBarChartFieldConfig: BarChartFieldConfig = {\n lineWidth: 1,\n fillOpacity: 80,\n gradientMode: GraphGradientMode.None,\n};\n","import { orderBy } from 'lodash';\nimport uPlot, { Padding } from 'uplot';\n\nimport {\n ArrayVector,\n DataFrame,\n Field,\n FieldType,\n formattedValueToString,\n getDisplayProcessor,\n getFieldColorModeForField,\n getFieldSeriesColor,\n GrafanaTheme2,\n outerJoinDataFrames,\n reduceField,\n VizOrientation,\n} from '@grafana/data';\nimport { maybeSortFrame } from '@grafana/data/src/transformations/transformers/joinDataFrames';\nimport {\n AxisPlacement,\n ScaleDirection,\n ScaleDistribution,\n ScaleOrientation,\n StackingMode,\n VizLegendOptions,\n} from '@grafana/schema';\nimport { FIXED_UNIT, measureText, UPlotConfigBuilder, UPlotConfigPrepFn, UPLOT_AXIS_FONT_SIZE } from '@grafana/ui';\nimport { getStackingGroups } from '@grafana/ui/src/components/uPlot/utils';\nimport { findField } from 'app/features/dimensions';\n\nimport { BarsOptions, getConfig } from './bars';\nimport { BarChartFieldConfig, PanelOptions, defaultBarChartFieldConfig } from './models.gen';\nimport { BarChartDisplayValues, BarChartDisplayWarning } from './types';\n\nfunction getBarCharScaleOrientation(orientation: VizOrientation) {\n if (orientation === VizOrientation.Vertical) {\n return {\n xOri: ScaleOrientation.Horizontal,\n xDir: ScaleDirection.Right,\n yOri: ScaleOrientation.Vertical,\n yDir: ScaleDirection.Up,\n };\n }\n\n return {\n xOri: ScaleOrientation.Vertical,\n xDir: ScaleDirection.Down,\n yOri: ScaleOrientation.Horizontal,\n yDir: ScaleDirection.Right,\n };\n}\n\nexport interface BarChartOptionsEX extends PanelOptions {\n rawValue: (seriesIdx: number, valueIdx: number) => number | null;\n getColor?: (seriesIdx: number, valueIdx: number, value: any) => string | null;\n fillOpacity?: number;\n}\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<BarChartOptionsEX> = ({\n frame,\n theme,\n orientation,\n showValue,\n groupWidth,\n barWidth,\n barRadius = 0,\n stacking,\n text,\n rawValue,\n getColor,\n fillOpacity,\n allFrames,\n xTickLabelRotation,\n xTickLabelMaxLength,\n xTickLabelSpacing = 0,\n legend,\n}) => {\n const builder = new UPlotConfigBuilder();\n const defaultValueFormatter = (seriesIdx: number, value: any) => {\n return shortenValue(formattedValueToString(frame.fields[seriesIdx].display!(value)), xTickLabelMaxLength);\n };\n\n // bar orientation -> x scale orientation & direction\n const vizOrientation = getBarCharScaleOrientation(orientation);\n\n const formatValue = defaultValueFormatter;\n\n // Use bar width when only one field\n if (frame.fields.length === 2) {\n groupWidth = barWidth;\n barWidth = 1;\n }\n\n const opts: BarsOptions = {\n xOri: vizOrientation.xOri,\n xDir: vizOrientation.xDir,\n groupWidth,\n barWidth,\n barRadius,\n stacking,\n rawValue,\n getColor,\n fillOpacity,\n formatValue,\n text,\n showValue,\n legend,\n xSpacing: xTickLabelSpacing,\n xTimeAuto: frame.fields[0]?.type === FieldType.time && !frame.fields[0].config.unit?.startsWith('time:'),\n };\n\n const config = getConfig(opts, theme);\n\n builder.setCursor(config.cursor);\n\n builder.addHook('init', config.init);\n builder.addHook('drawClear', config.drawClear);\n builder.addHook('draw', config.draw);\n\n builder.setTooltipInterpolator(config.interpolateTooltip);\n\n if (vizOrientation.xOri === ScaleOrientation.Horizontal && xTickLabelRotation !== 0) {\n builder.setPadding(getRotationPadding(frame, xTickLabelRotation, xTickLabelMaxLength));\n }\n\n builder.setPrepData(config.prepData);\n\n builder.addScale({\n scaleKey: 'x',\n isTime: false,\n range: config.xRange,\n distribution: ScaleDistribution.Ordinal,\n orientation: vizOrientation.xOri,\n direction: vizOrientation.xDir,\n });\n\n const xFieldAxisPlacement =\n frame.fields[0].config.custom?.axisPlacement !== AxisPlacement.Hidden\n ? vizOrientation.xOri === ScaleOrientation.Horizontal\n ? AxisPlacement.Bottom\n : AxisPlacement.Left\n : AxisPlacement.Hidden;\n const xFieldAxisShow = frame.fields[0].config.custom?.axisPlacement !== AxisPlacement.Hidden;\n\n builder.addAxis({\n scaleKey: 'x',\n isTime: false,\n placement: xFieldAxisPlacement,\n label: frame.fields[0].config.custom?.axisLabel,\n splits: config.xSplits,\n values: config.xValues,\n grid: { show: false },\n ticks: { show: false },\n gap: 15,\n tickLabelRotation: xTickLabelRotation * -1,\n theme,\n show: xFieldAxisShow,\n });\n\n let seriesIndex = 0;\n const legendOrdered = isLegendOrdered(legend);\n\n // iterate the y values\n for (let i = 1; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n\n seriesIndex++;\n\n const customConfig: BarChartFieldConfig = { ...defaultBarChartFieldConfig, ...field.config.custom };\n\n const scaleKey = field.config.unit || FIXED_UNIT;\n const colorMode = getFieldColorModeForField(field);\n const scaleColor = getFieldSeriesColor(field, theme);\n const seriesColor = scaleColor.color;\n\n // make barcharts start at 0 unless explicitly overridden\n let softMin = customConfig.axisSoftMin;\n let softMax = customConfig.axisSoftMax;\n\n if (softMin == null && field.config.min == null) {\n softMin = 0;\n }\n\n if (softMax == null && field.config.max == null) {\n softMax = 0;\n }\n\n builder.addSeries({\n scaleKey,\n pxAlign: true,\n lineWidth: customConfig.lineWidth,\n lineColor: seriesColor,\n fillOpacity: customConfig.fillOpacity,\n theme,\n colorMode,\n pathBuilder: config.barsBuilder,\n show: !customConfig.hideFrom?.viz,\n gradientMode: customConfig.gradientMode,\n thresholds: field.config.thresholds,\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin,\n softMax,\n\n // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n // PlotLegend currently gets unfiltered DataFrame[], so index must be into that field array, not the prepped frame's which we're iterating here\n dataFrameFieldIndex: {\n fieldIndex: legendOrdered\n ? i\n : allFrames[0].fields.findIndex(\n (f) => f.type === FieldType.number && f.state?.seriesIndex === seriesIndex - 1\n ),\n frameIndex: 0,\n },\n });\n\n // The builder will manage unique scaleKeys and combine where appropriate\n builder.addScale({\n scaleKey,\n min: field.config.min,\n max: field.config.max,\n softMin,\n softMax,\n orientation: vizOrientation.yOri,\n direction: vizOrientation.yDir,\n distribution: customConfig.scaleDistribution?.type,\n log: customConfig.scaleDistribution?.log,\n });\n\n if (customConfig.axisPlacement !== AxisPlacement.Hidden) {\n let placement = customConfig.axisPlacement;\n if (!placement || placement === AxisPlacement.Auto) {\n placement = AxisPlacement.Left;\n }\n if (vizOrientation.xOri === 1) {\n if (placement === AxisPlacement.Left) {\n placement = AxisPlacement.Bottom;\n }\n if (placement === AxisPlacement.Right) {\n placement = AxisPlacement.Top;\n }\n }\n\n builder.addAxis({\n scaleKey,\n label: customConfig.axisLabel,\n size: customConfig.axisWidth,\n placement,\n formatValue: (v, decimals) => formattedValueToString(field.display!(v, field.config.decimals ?? decimals)),\n theme,\n grid: { show: customConfig.axisGridShow },\n });\n }\n }\n\n let stackingGroups = getStackingGroups(frame);\n\n builder.setStackingGroups(stackingGroups);\n\n return builder;\n};\n\nfunction shortenValue(value: string, length: number) {\n if (value.length > length) {\n return value.substring(0, length).concat('...');\n } else {\n return value;\n }\n}\n\nfunction getRotationPadding(frame: DataFrame, rotateLabel: number, valueMaxLength: number): Padding {\n const values = frame.fields[0].values;\n const fontSize = UPLOT_AXIS_FONT_SIZE;\n const displayProcessor = frame.fields[0].display ?? ((v) => v);\n let maxLength = 0;\n for (let i = 0; i < values.length; i++) {\n let size = measureText(\n shortenValue(formattedValueToString(displayProcessor(values.get(i))), valueMaxLength),\n fontSize\n );\n maxLength = size.width > maxLength ? size.width : maxLength;\n }\n\n // Add padding to the right if the labels are rotated in a way that makes the last label extend outside the graph.\n const paddingRight =\n rotateLabel > 0\n ? Math.cos((rotateLabel * Math.PI) / 180) *\n measureText(\n shortenValue(formattedValueToString(displayProcessor(values.get(values.length - 1))), valueMaxLength),\n fontSize\n ).width\n : 0;\n\n // Add padding to the left if the labels are rotated in a way that makes the first label extend outside the graph.\n const paddingLeft =\n rotateLabel < 0\n ? Math.cos((rotateLabel * -1 * Math.PI) / 180) *\n measureText(shortenValue(formattedValueToString(displayProcessor(values.get(0))), valueMaxLength), fontSize)\n .width\n : 0;\n\n // Add padding to the bottom to avoid clipping the rotated labels.\n const paddingBottom = Math.sin(((rotateLabel >= 0 ? rotateLabel : rotateLabel * -1) * Math.PI) / 180) * maxLength;\n\n return [Math.round(UPLOT_AXIS_FONT_SIZE * uPlot.pxRatio), paddingRight, paddingBottom, paddingLeft];\n}\n\n/** @internal */\nexport function prepareBarChartDisplayValues(\n series: DataFrame[],\n theme: GrafanaTheme2,\n options: PanelOptions\n): BarChartDisplayValues | BarChartDisplayWarning {\n if (!series?.length) {\n return { warn: 'No data in response' };\n }\n\n // Bar chart requires a single frame\n const frame =\n series.length === 1\n ? maybeSortFrame(\n series[0],\n series[0].fields.findIndex((f) => f.type === FieldType.time)\n )\n : outerJoinDataFrames({ frames: series });\n if (!frame) {\n return { warn: 'Unable to join data' };\n }\n\n // Color by a field different than the input\n let colorByField: Field | undefined = undefined;\n if (options.colorByField) {\n colorByField = findField(frame, options.colorByField);\n if (!colorByField) {\n return { warn: 'Color field not found' };\n }\n }\n\n let xField: Field | undefined = undefined;\n if (options.xField) {\n xField = findField(frame, options.xField);\n if (!xField) {\n return { warn: 'Configured x field not found' };\n }\n }\n\n let stringField: Field | undefined = undefined;\n let timeField: Field | undefined = undefined;\n let fields: Field[] = [];\n for (const field of frame.fields) {\n if (field === xField) {\n continue;\n }\n\n switch (field.type) {\n case FieldType.string:\n if (!stringField) {\n stringField = field;\n }\n break;\n\n case FieldType.time:\n if (!timeField) {\n timeField = field;\n }\n break;\n\n case FieldType.number: {\n const copy = {\n ...field,\n state: {\n ...field.state,\n seriesIndex: fields.length, // off by one?\n },\n config: {\n ...field.config,\n custom: {\n ...field.config.custom,\n stacking: {\n group: '_',\n mode: options.stacking,\n },\n },\n },\n values: new ArrayVector(\n field.values.toArray().map((v) => {\n if (!(Number.isFinite(v) || v == null)) {\n return null;\n }\n return v;\n })\n ),\n };\n\n if (options.stacking === StackingMode.Percent) {\n copy.config.unit = 'percentunit';\n copy.display = getDisplayProcessor({ field: copy, theme });\n }\n\n fields.push(copy);\n }\n }\n }\n\n let firstField = xField;\n if (!firstField) {\n firstField = stringField || timeField;\n }\n\n if (!firstField) {\n return {\n warn: 'Bar charts requires a string or time field',\n };\n }\n\n if (!fields.length) {\n return {\n warn: 'No numeric fields found',\n };\n }\n\n // Show the first number value\n if (colorByField && fields.length > 1) {\n const firstNumber = fields.find((f) => f !== colorByField);\n if (firstNumber) {\n fields = [firstNumber];\n }\n }\n\n if (isLegendOrdered(options.legend)) {\n const sortKey = options.legend.sortBy!.toLowerCase();\n const reducers = options.legend.calcs ?? [sortKey];\n fields = orderBy(\n fields,\n (field) => {\n return reduceField({ field, reducers })[sortKey];\n },\n options.legend.sortDesc ? 'desc' : 'asc'\n );\n }\n\n // String field is first\n fields.unshift(firstField);\n\n return {\n aligned: frame,\n colorByField,\n viz: [\n {\n length: firstField.values.length,\n fields: fields, // ideally: fields.filter((f) => !Boolean(f.config.custom?.hideFrom?.viz)),\n },\n ],\n };\n}\n\nexport const isLegendOrdered = (options: VizLegendOptions) => Boolean(options?.sortBy && options.sortDesc !== null);\n","import React, { useMemo, useRef, useState } from 'react';\n\nimport {\n CartesianCoords2D,\n compareDataFrameStructures,\n DataFrame,\n getFieldDisplayName,\n PanelProps,\n TimeRange,\n VizOrientation,\n} from '@grafana/data';\nimport { PanelDataErrorView } from '@grafana/runtime';\nimport {\n GraphNG,\n GraphNGProps,\n measureText,\n PlotLegend,\n Portal,\n TooltipDisplayMode,\n UPlotConfigBuilder,\n UPLOT_AXIS_FONT_SIZE,\n usePanelContext,\n useTheme2,\n VizLayout,\n VizLegend,\n VizTooltipContainer,\n} from '@grafana/ui';\nimport { PropDiffFn } from '@grafana/ui/src/components/GraphNG/GraphNG';\nimport { HoverEvent, addTooltipSupport } from '@grafana/ui/src/components/uPlot/config/addTooltipSupport';\nimport { CloseButton } from 'app/core/components/CloseButton/CloseButton';\n\nimport { DataHoverView } from '../geomap/components/DataHoverView';\nimport { getFieldLegendItem } from '../state-timeline/utils';\n\nimport { PanelOptions } from './models.gen';\nimport { prepareBarChartDisplayValues, preparePlotConfigBuilder } from './utils';\n\nconst TOOLTIP_OFFSET = 10;\n\n/**\n * @alpha\n */\nexport interface BarChartProps\n extends PanelOptions,\n Omit<GraphNGProps, 'prepConfig' | 'propsToDiff' | 'renderLegend' | 'theme'> {}\n\nconst propsToDiff: Array<string | PropDiffFn> = [\n 'orientation',\n 'barWidth',\n 'barRadius',\n 'xTickLabelRotation',\n 'xTickLabelMaxLength',\n 'xTickLabelSpacing',\n 'groupWidth',\n 'stacking',\n 'showValue',\n 'xField',\n 'colorField',\n 'legend',\n (prev: BarChartProps, next: BarChartProps) => next.text?.valueSize === prev.text?.valueSize,\n];\n\ninterface Props extends PanelProps<PanelOptions> {}\n\nexport const BarChartPanel: React.FunctionComponent<Props> = ({\n data,\n options,\n fieldConfig,\n width,\n height,\n timeZone,\n id,\n}) => {\n const theme = useTheme2();\n const { eventBus } = usePanelContext();\n\n const oldConfig = useRef<UPlotConfigBuilder | undefined>(undefined);\n const isToolTipOpen = useRef<boolean>(false);\n\n const [hover, setHover] = useState<HoverEvent | undefined>(undefined);\n const [coords, setCoords] = useState<{ viewport: CartesianCoords2D; canvas: CartesianCoords2D } | null>(null);\n const [focusedSeriesIdx, setFocusedSeriesIdx] = useState<number | null>(null);\n const [focusedPointIdx, setFocusedPointIdx] = useState<number | null>(null);\n const [shouldDisplayCloseButton, setShouldDisplayCloseButton] = useState<boolean>(false);\n\n const onCloseToolTip = () => {\n isToolTipOpen.current = false;\n setCoords(null);\n setShouldDisplayCloseButton(false);\n };\n\n const onUPlotClick = () => {\n isToolTipOpen.current = !isToolTipOpen.current;\n\n // Linking into useState required to re-render tooltip\n setShouldDisplayCloseButton(isToolTipOpen.current);\n };\n\n const frame0Ref = useRef<DataFrame>();\n const info = useMemo(() => prepareBarChartDisplayValues(data?.series, theme, options), [data, theme, options]);\n const chartDisplay = 'viz' in info ? info : null;\n\n const structureRef = useRef(10000);\n\n useMemo(() => {\n structureRef.current++;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options]); // change every time the options object changes (while editing)\n\n const structureRev = useMemo(() => {\n const f0 = chartDisplay?.viz[0];\n const f1 = frame0Ref.current;\n if (!(f0 && f1 && compareDataFrameStructures(f0, f1, true))) {\n structureRef.current++;\n }\n frame0Ref.current = f0;\n return (data.structureRev ?? 0) + structureRef.current;\n }, [chartDisplay, data.structureRev]);\n\n const orientation = useMemo(() => {\n if (!options.orientation || options.orientation === VizOrientation.Auto) {\n return width < height ? VizOrientation.Horizontal : VizOrientation.Vertical;\n }\n return options.orientation;\n }, [width, height, options.orientation]);\n\n const xTickLabelMaxLength = useMemo(() => {\n // If no max length is set, limit the number of characters to a length where it will use a maximum of half of the height of the viz.\n if (!options.xTickLabelMaxLength) {\n const rotationAngle = options.xTickLabelRotation;\n const textSize = measureText('M', UPLOT_AXIS_FONT_SIZE).width; // M is usually the widest character so let's use that as an approximation.\n const maxHeightForValues = height / 2;\n\n return (\n maxHeightForValues /\n (Math.sin(((rotationAngle >= 0 ? rotationAngle : rotationAngle * -1) * Math.PI) / 180) * textSize) -\n 3 //Subtract 3 for the \"...\" added to the end.\n );\n } else {\n return options.xTickLabelMaxLength;\n }\n }, [height, options.xTickLabelRotation, options.xTickLabelMaxLength]);\n\n if ('warn' in info) {\n return (\n <PanelDataErrorView\n panelId={id}\n fieldConfig={fieldConfig}\n data={data}\n message={info.warn}\n needsNumberField={true}\n />\n );\n }\n\n const renderTooltip = (alignedFrame: DataFrame, seriesIdx: number | null, datapointIdx: number | null) => {\n const field = seriesIdx == null ? null : alignedFrame.fields[seriesIdx];\n if (field) {\n const disp = getFieldDisplayName(field, alignedFrame);\n seriesIdx = info.aligned.fields.findIndex((f) => disp === getFieldDisplayName(f, info.aligned));\n }\n\n return (\n <>\n {shouldDisplayCloseButton && (\n <div\n style={{\n width: '100%',\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n >\n <CloseButton\n onClick={onCloseToolTip}\n style={{\n position: 'relative',\n top: 'auto',\n right: 'auto',\n marginRight: 0,\n }}\n />\n </div>\n )}\n <DataHoverView\n data={info.aligned}\n rowIndex={datapointIdx}\n columnIndex={seriesIdx}\n sortOrder={options.tooltip.sort}\n mode={options.tooltip.mode}\n />\n </>\n );\n };\n\n const renderLegend = (config: UPlotConfigBuilder) => {\n const { legend } = options;\n if (!config || legend.showLegend === false) {\n return null;\n }\n\n if (info.colorByField) {\n const items = getFieldLegendItem([info.colorByField], theme);\n if (items?.length) {\n return (\n <VizLayout.Legend placement={legend.placement}>\n <VizLegend placement={legend.placement} items={items} displayMode={legend.displayMode} />\n </VizLayout.Legend>\n );\n }\n }\n\n return <PlotLegend data={info.viz} config={config} maxHeight=\"35%\" maxWidth=\"60%\" {...options.legend} />;\n };\n\n const rawValue = (seriesIdx: number, valueIdx: number) => {\n return frame0Ref.current!.fields[seriesIdx].values.get(valueIdx);\n };\n\n // Color by value\n let getColor: ((seriesIdx: number, valueIdx: number, value: any) => string) | undefined = undefined;\n\n let fillOpacity = 1;\n\n if (info.colorByField) {\n const colorByField = info.colorByField;\n const disp = colorByField.display!;\n fillOpacity = (colorByField.config.custom.fillOpacity ?? 100) / 100;\n // gradientMode? ignore?\n getColor = (seriesIdx: number, valueIdx: number, value: any) => disp(value).color!;\n }\n\n const prepConfig = (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => {\n const {\n barWidth,\n barRadius = 0,\n showValue,\n groupWidth,\n stacking,\n legend,\n tooltip,\n text,\n xTickLabelRotation,\n xTickLabelSpacing,\n } = options;\n\n return preparePlotConfigBuilder({\n frame: alignedFrame,\n getTimeRange,\n theme,\n timeZones: [timeZone],\n eventBus,\n orientation,\n barWidth,\n barRadius,\n showValue,\n groupWidth,\n xTickLabelRotation,\n xTickLabelMaxLength,\n xTickLabelSpacing,\n stacking,\n legend,\n tooltip,\n text,\n rawValue,\n getColor,\n fillOpacity,\n allFrames: info.viz,\n });\n };\n\n return (\n <GraphNG\n theme={theme}\n frames={info.viz}\n prepConfig={prepConfig}\n propsToDiff={propsToDiff}\n preparePlotFrame={(f) => f[0]} // already processed in by the panel above!\n renderLegend={renderLegend}\n legend={options.legend}\n timeZones={timeZone}\n timeRange={{ from: 1, to: 1 } as unknown as TimeRange} // HACK\n structureRev={structureRev}\n width={width}\n height={height}\n >\n {(config) => {\n if (oldConfig.current !== config) {\n oldConfig.current = addTooltipSupport({\n config,\n onUPlotClick,\n setFocusedSeriesIdx,\n setFocusedPointIdx,\n setCoords,\n setHover,\n isToolTipOpen,\n });\n }\n\n if (options.tooltip.mode === TooltipDisplayMode.None) {\n return null;\n }\n\n return (\n <Portal>\n {hover && coords && (\n <VizTooltipContainer\n position={{ x: coords.viewport.x, y: coords.viewport.y }}\n offset={{ x: TOOLTIP_OFFSET, y: TOOLTIP_OFFSET }}\n allowPointerEvents={isToolTipOpen.current}\n >\n {renderTooltip(info.aligned, focusedSeriesIdx, focusedPointIdx)}\n </VizTooltipContainer>\n )}\n </Portal>\n );\n }}\n </GraphNG>\n );\n};\n","import React from 'react';\n\nimport { SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { Checkbox, HorizontalGroup, RadioButtonGroup, Tooltip } from '@grafana/ui';\n\nconst GAPS_OPTIONS: Array<SelectableValue<number>> = [\n {\n label: 'None',\n value: 0,\n description: 'Show all tick marks',\n },\n {\n label: 'Small',\n value: 100,\n description: 'Require 100px spacing',\n },\n {\n label: 'Medium',\n value: 200,\n description: 'Require 200px spacing',\n },\n {\n label: 'Large',\n value: 300,\n description: 'Require 300px spacing',\n },\n];\n\nexport const TickSpacingEditor: React.FC<StandardEditorProps<number, any>> = (props) => {\n let value = props.value ?? 0;\n const isRTL = value < 0;\n if (isRTL) {\n value *= -1;\n }\n let gap = GAPS_OPTIONS[0];\n for (const v of GAPS_OPTIONS) {\n gap = v;\n if (value <= gap.value!) {\n break;\n }\n }\n\n const onSpacingChange = (val: number) => {\n props.onChange(val * (isRTL ? -1 : 1));\n };\n\n const onRTLChange = () => {\n props.onChange(props.value * -1);\n };\n\n return (\n <HorizontalGroup>\n <RadioButtonGroup value={gap.value} options={GAPS_OPTIONS} onChange={onSpacingChange} />\n {value !== 0 && (\n <Tooltip content=\"Require space from the right side\" placement=\"top\">\n <div>\n <Checkbox value={isRTL} onChange={onRTLChange} label=\"RTL\" />\n </div>\n </Tooltip>\n )}\n </HorizontalGroup>\n );\n};\n","import {\n DataFrame,\n FieldColorModeId,\n FieldConfigProperty,\n FieldType,\n getFieldDisplayName,\n PanelPlugin,\n VizOrientation,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { StackingMode, VisibilityMode } from '@grafana/schema';\nimport { graphFieldOptions, commonOptionsBuilder } from '@grafana/ui';\n\nimport { BarChartPanel } from './BarChartPanel';\nimport { TickSpacingEditor } from './TickSpacingEditor';\nimport { BarChartFieldConfig, PanelOptions, defaultBarChartFieldConfig, defaultPanelOptions } from './models.gen';\nimport { BarChartSuggestionsSupplier } from './suggestions';\nimport { prepareBarChartDisplayValues } from './utils';\n\nexport const plugin = new PanelPlugin<PanelOptions, BarChartFieldConfig>(BarChartPanel)\n .useFieldConfig({\n standardOptions: {\n [FieldConfigProperty.Color]: {\n settings: {\n byValueSupport: true,\n preferThresholdsMode: false,\n },\n defaultValue: {\n mode: FieldColorModeId.PaletteClassic,\n },\n },\n },\n useCustomConfig: (builder) => {\n const cfg = defaultBarChartFieldConfig;\n\n builder\n .addSliderInput({\n path: 'lineWidth',\n name: 'Line width',\n defaultValue: cfg.lineWidth,\n settings: {\n min: 0,\n max: 10,\n step: 1,\n },\n })\n .addSliderInput({\n path: 'fillOpacity',\n name: 'Fill opacity',\n defaultValue: cfg.fillOpacity,\n settings: {\n min: 0,\n max: 100,\n step: 1,\n },\n })\n .addRadio({\n path: 'gradientMode',\n name: 'Gradient mode',\n defaultValue: graphFieldOptions.fillGradient[0].value,\n settings: {\n options: graphFieldOptions.fillGradient,\n },\n });\n\n commonOptionsBuilder.addAxisConfig(builder, cfg, false);\n commonOptionsBuilder.addHideFrom(builder);\n },\n })\n .setPanelOptions((builder, context) => {\n const disp = prepareBarChartDisplayValues(context.data, config.theme2, context.options ?? ({} as any));\n let xaxisPlaceholder = 'First string or time field';\n const viz = 'viz' in disp ? disp.viz[0] : undefined;\n if (viz?.fields?.length) {\n const first = viz.fields[0];\n xaxisPlaceholder += ` (${getFieldDisplayName(first, viz)})`;\n }\n\n builder\n .addFieldNamePicker({\n path: 'xField',\n name: 'X Axis',\n settings: {\n placeholderText: xaxisPlaceholder,\n },\n })\n .addRadio({\n path: 'orientation',\n name: 'Orientation',\n settings: {\n options: [\n { value: VizOrientation.Auto, label: 'Auto' },\n { value: VizOrientation.Horizontal, label: 'Horizontal' },\n { value: VizOrientation.Vertical, label: 'Vertical' },\n ],\n },\n defaultValue: defaultPanelOptions.orientation,\n })\n .addSliderInput({\n path: 'xTickLabelRotation',\n name: 'Rotate bar labels',\n defaultValue: defaultPanelOptions.xTickLabelRotation,\n settings: {\n min: -90,\n max: 90,\n step: 15,\n marks: { '-90': '-90°', '-45': '-45°', 0: '0°', 45: '45°', 90: '90°' },\n included: false,\n },\n showIf: (opts) => {\n return opts.orientation === VizOrientation.Auto || opts.orientation === VizOrientation.Vertical;\n },\n })\n .addNumberInput({\n path: 'xTickLabelMaxLength',\n name: 'Bar label max length',\n description: 'Bar labels will be truncated to the length provided',\n settings: {\n placeholder: 'None',\n min: 0,\n },\n })\n .addCustomEditor({\n id: 'xTickLabelSpacing',\n path: 'xTickLabelSpacing',\n name: 'Bar labels minimum spacing',\n defaultValue: defaultPanelOptions.xTickLabelSpacing,\n editor: TickSpacingEditor,\n })\n .addRadio({\n path: 'showValue',\n name: 'Show values',\n settings: {\n options: [\n { value: VisibilityMode.Auto, label: 'Auto' },\n { value: VisibilityMode.Always, label: 'Always' },\n { value: VisibilityMode.Never, label: 'Never' },\n ],\n },\n defaultValue: defaultPanelOptions.showValue,\n })\n .addRadio({\n path: 'stacking',\n name: 'Stacking',\n settings: {\n options: graphFieldOptions.stacking,\n },\n defaultValue: defaultPanelOptions.stacking,\n })\n .addSliderInput({\n path: 'groupWidth',\n name: 'Group width',\n defaultValue: defaultPanelOptions.groupWidth,\n settings: {\n min: 0,\n max: 1,\n step: 0.01,\n },\n showIf: (c, data) => {\n if (c.stacking && c.stacking !== StackingMode.None) {\n return false;\n }\n return countNumberFields(data) !== 1;\n },\n })\n .addSliderInput({\n path: 'barWidth',\n name: 'Bar width',\n defaultValue: defaultPanelOptions.barWidth,\n settings: {\n min: 0,\n max: 1,\n step: 0.01,\n },\n })\n .addSliderInput({\n path: 'barRadius',\n name: 'Bar radius',\n defaultValue: defaultPanelOptions.barRadius,\n settings: {\n min: 0,\n max: 0.5,\n step: 0.05,\n },\n });\n\n builder.addFieldNamePicker({\n path: 'colorByField',\n name: 'Color by field',\n description: 'Use the color value for a sibling field to color each bar value.',\n });\n\n commonOptionsBuilder.addTooltipOptions(builder);\n commonOptionsBuilder.addLegendOptions(builder);\n commonOptionsBuilder.addTextSizeOptions(builder, false);\n })\n .setSuggestionsSupplier(new BarChartSuggestionsSupplier());\n\nfunction countNumberFields(data?: DataFrame[]): number {\n let count = 0;\n if (data) {\n for (const frame of data) {\n for (const field of frame.fields) {\n if (field.type === FieldType.number) {\n count++;\n }\n }\n }\n }\n return count;\n}\n","import { VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data';\nimport { StackingMode, VisibilityMode } from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { BarChartFieldConfig, PanelOptions } from './models.gen';\n\nexport class BarChartSuggestionsSupplier {\n getListWithDefaults(builder: VisualizationSuggestionsBuilder) {\n return builder.getListAppender<PanelOptions, BarChartFieldConfig>({\n name: SuggestionName.BarChart,\n pluginId: 'barchart',\n options: {\n showValue: VisibilityMode.Never,\n legend: {\n showLegend: true,\n placement: 'right',\n } as any,\n },\n fieldConfig: {\n defaults: {\n unit: 'short',\n custom: {},\n },\n overrides: [],\n },\n cardOptions: {\n previewModifier: (s) => {\n s.options!.barWidth = 0.8;\n },\n },\n });\n }\n\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const list = this.getListWithDefaults(builder);\n const { dataSummary } = builder;\n\n if (dataSummary.frameCount !== 1) {\n return;\n }\n\n if (!dataSummary.hasNumberField || !dataSummary.hasStringField) {\n return;\n }\n\n // if you have this many rows barchart might not be a good fit\n if (dataSummary.rowCountTotal > 50) {\n return;\n }\n\n // Vertical bars\n list.append({\n name: SuggestionName.BarChart,\n });\n\n if (dataSummary.numberFieldCount > 1) {\n list.append({\n name: SuggestionName.BarChartStacked,\n options: {\n stacking: StackingMode.Normal,\n },\n });\n list.append({\n name: SuggestionName.BarChartStackedPercent,\n options: {\n stacking: StackingMode.Percent,\n },\n });\n }\n\n // horizontal bars\n list.append({\n name: SuggestionName.BarChartHorizontal,\n options: {\n orientation: VizOrientation.Horizontal,\n },\n });\n\n if (dataSummary.numberFieldCount > 1) {\n list.append({\n name: SuggestionName.BarChartHorizontalStacked,\n options: {\n stacking: StackingMode.Normal,\n orientation: VizOrientation.Horizontal,\n },\n });\n\n list.append({\n name: SuggestionName.BarChartHorizontalStackedPercent,\n options: {\n orientation: VizOrientation.Horizontal,\n stacking: StackingMode.Percent,\n },\n });\n }\n }\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nimport * as ui from '@grafana/schema';\n\nexport const modelVersion = Object.freeze([0, 0]);\n\n\nexport interface PanelOptions extends ui.SingleStatBaseOptions {\n displayMode: ui.BarGaugeDisplayMode;\n minVizHeight: number;\n minVizWidth: number;\n showUnfilled: boolean;\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n displayMode: ui.BarGaugeDisplayMode.Gradient,\n minVizHeight: 10,\n minVizWidth: 0,\n showUnfilled: true,\n};\n","import { PanelPlugin, VizOrientation } from '@grafana/data';\nimport { BarGaugeDisplayMode } from '@grafana/schema';\nimport { commonOptionsBuilder, sharedSingleStatPanelChangedHandler } from '@grafana/ui';\n\nimport { addOrientationOption, addStandardDataReduceOptions } from '../stat/common';\n\nimport { barGaugePanelMigrationHandler } from './BarGaugeMigrations';\nimport { BarGaugePanel } from './BarGaugePanel';\nimport { PanelOptions, defaultPanelOptions } from './models.gen';\nimport { BarGaugeSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<PanelOptions>(BarGaugePanel)\n .useFieldConfig()\n .setPanelOptions((builder) => {\n addStandardDataReduceOptions(builder);\n addOrientationOption(builder);\n commonOptionsBuilder.addTextSizeOptions(builder);\n\n builder\n .addRadio({\n path: 'displayMode',\n name: 'Display mode',\n settings: {\n options: [\n { value: BarGaugeDisplayMode.Gradient, label: 'Gradient' },\n { value: BarGaugeDisplayMode.Lcd, label: 'Retro LCD' },\n { value: BarGaugeDisplayMode.Basic, label: 'Basic' },\n ],\n },\n defaultValue: defaultPanelOptions.displayMode,\n })\n .addBooleanSwitch({\n path: 'showUnfilled',\n name: 'Show unfilled area',\n description: 'When enabled renders the unfilled region as gray',\n defaultValue: defaultPanelOptions.showUnfilled,\n showIf: (options) => options.displayMode !== 'lcd',\n })\n .addNumberInput({\n path: 'minVizWidth',\n name: 'Min width',\n description: 'Minimum column width',\n defaultValue: defaultPanelOptions.minVizWidth,\n showIf: (options) => options.orientation === VizOrientation.Vertical,\n })\n .addNumberInput({\n path: 'minVizHeight',\n name: 'Min height',\n description: 'Minimum row height',\n defaultValue: defaultPanelOptions.minVizHeight,\n showIf: (options) => options.orientation === VizOrientation.Horizontal,\n });\n })\n .setPanelChangeHandler(sharedSingleStatPanelChangedHandler)\n .setMigrationHandler(barGaugePanelMigrationHandler)\n .setSuggestionsSupplier(new BarGaugeSuggestionsSupplier());\n","import { PanelModel } from '@grafana/data';\nimport { sharedSingleStatMigrationHandler } from '@grafana/ui';\n\nimport { PanelOptions } from './models.gen';\n\nexport const barGaugePanelMigrationHandler = (panel: PanelModel<PanelOptions>): Partial<PanelOptions> => {\n return sharedSingleStatMigrationHandler(panel);\n};\n","import { VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data';\nimport { BarGaugeDisplayMode } from '@grafana/ui';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { PanelOptions } from './models.gen';\n\nexport class BarGaugeSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary } = builder;\n\n if (!dataSummary.hasData || !dataSummary.hasNumberField) {\n return;\n }\n\n const list = builder.getListAppender<PanelOptions, {}>({\n name: '',\n pluginId: 'bargauge',\n options: {},\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n });\n\n // This is probably not a good option for many numeric fields\n if (dataSummary.numberFieldCount > 50) {\n return;\n }\n\n // To use show individual row values we also need a string field to give each value a name\n if (dataSummary.hasStringField && dataSummary.frameCount === 1 && dataSummary.rowCountTotal < 30) {\n list.append({\n name: SuggestionName.BarGaugeBasic,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n },\n displayMode: BarGaugeDisplayMode.Basic,\n orientation: VizOrientation.Horizontal,\n },\n fieldConfig: {\n defaults: {\n color: {\n mode: 'continuous-GrYlRd',\n },\n },\n overrides: [],\n },\n });\n\n list.append({\n name: SuggestionName.BarGaugeLCD,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n },\n displayMode: BarGaugeDisplayMode.Lcd,\n orientation: VizOrientation.Horizontal,\n },\n fieldConfig: {\n defaults: {\n color: {\n mode: 'continuous-GrYlRd',\n },\n },\n overrides: [],\n },\n });\n } else {\n list.append({\n name: SuggestionName.BarGaugeBasic,\n options: {\n displayMode: BarGaugeDisplayMode.Basic,\n orientation: VizOrientation.Horizontal,\n reduceOptions: {\n values: false,\n calcs: ['lastNotNull'],\n },\n },\n fieldConfig: {\n defaults: {\n color: {\n mode: 'continuous-GrYlRd',\n },\n },\n overrides: [],\n },\n });\n\n list.append({\n name: SuggestionName.BarGaugeLCD,\n options: {\n displayMode: BarGaugeDisplayMode.Lcd,\n orientation: VizOrientation.Horizontal,\n reduceOptions: {\n values: false,\n calcs: ['lastNotNull'],\n },\n },\n fieldConfig: {\n defaults: {\n color: {\n mode: 'continuous-GrYlRd',\n },\n },\n overrides: [],\n },\n });\n }\n }\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { DEFAULT_ANNOTATION_COLOR } from '@grafana/ui';\n\nexport const getCommonAnnotationStyles = (theme: GrafanaTheme2) => {\n return (annotation?: AnnotationsDataFrameViewDTO) => {\n const color = theme.visualization.getColorByName(annotation?.color || DEFAULT_ANNOTATION_COLOR);\n return {\n markerTriangle: css`\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-bottom: 4px solid ${color};\n `,\n markerBar: css`\n display: block;\n width: calc(100%);\n height: 5px;\n background: ${color};\n `,\n };\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes, useRef } from 'react';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport useClickAway from 'react-use/lib/useClickAway';\n\nimport { AnnotationEventUIModel, GrafanaTheme2 } from '@grafana/data';\nimport { Button, Field, Form, HorizontalGroup, InputControl, TextArea, usePanelContext, useStyles2 } from '@grafana/ui';\nimport { TagFilter } from 'app/core/components/TagFilter/TagFilter';\nimport { getAnnotationTags } from 'app/features/annotations/api';\n\ninterface AnnotationEditFormDTO {\n description: string;\n tags: string[];\n}\n\ninterface AnnotationEditorFormProps extends HTMLAttributes<HTMLDivElement> {\n annotation: AnnotationsDataFrameViewDTO;\n timeFormatter: (v: number) => string;\n onSave: () => void;\n onDismiss: () => void;\n}\n\nexport const AnnotationEditorForm = React.forwardRef<HTMLDivElement, AnnotationEditorFormProps>(\n ({ annotation, onSave, onDismiss, timeFormatter, className, ...otherProps }, ref) => {\n const styles = useStyles2(getStyles);\n const panelContext = usePanelContext();\n const clickAwayRef = useRef(null);\n\n useClickAway(clickAwayRef, () => {\n onDismiss();\n });\n\n const [createAnnotationState, createAnnotation] = useAsyncFn(async (event: AnnotationEventUIModel) => {\n const result = await panelContext.onAnnotationCreate!(event);\n if (onSave) {\n onSave();\n }\n return result;\n });\n\n const [updateAnnotationState, updateAnnotation] = useAsyncFn(async (event: AnnotationEventUIModel) => {\n const result = await panelContext.onAnnotationUpdate!(event);\n if (onSave) {\n onSave();\n }\n return result;\n });\n\n const isUpdatingAnnotation = annotation.id !== undefined;\n const isRegionAnnotation = annotation.time !== annotation.timeEnd;\n const operation = isUpdatingAnnotation ? updateAnnotation : createAnnotation;\n const stateIndicator = isUpdatingAnnotation ? updateAnnotationState : createAnnotationState;\n const ts = isRegionAnnotation\n ? `${timeFormatter(annotation.time)} - ${timeFormatter(annotation.timeEnd)}`\n : timeFormatter(annotation.time);\n\n const onSubmit = ({ tags, description }: AnnotationEditFormDTO) => {\n operation({\n id: annotation.id,\n tags,\n description,\n from: Math.round(annotation.time!),\n to: Math.round(annotation.timeEnd!),\n });\n };\n\n const form = (\n <div // Annotation editor\n ref={ref}\n className={cx(styles.editor, className)}\n {...otherProps}\n >\n <div className={styles.header}>\n <HorizontalGroup justify={'space-between'} align={'center'}>\n <div className={styles.title}>Add annotation</div>\n <div className={styles.ts}>{ts}</div>\n </HorizontalGroup>\n </div>\n <div className={styles.editorForm}>\n <Form<AnnotationEditFormDTO>\n onSubmit={onSubmit}\n defaultValues={{ description: annotation?.text, tags: annotation?.tags || [] }}\n >\n {({ register, errors, control }) => {\n return (\n <>\n <Field label={'Description'} invalid={!!errors.description} error={errors?.description?.message}>\n <TextArea\n {...register('description', {\n required: 'Annotation description is required',\n })}\n />\n </Field>\n <Field label={'Tags'}>\n <InputControl\n control={control}\n name=\"tags\"\n render={({ field: { ref, onChange, ...field } }) => {\n return (\n <TagFilter\n allowCustomValue\n placeholder=\"Add tags\"\n onChange={onChange}\n tagOptions={getAnnotationTags}\n tags={field.value}\n />\n );\n }}\n />\n </Field>\n <HorizontalGroup justify={'flex-end'}>\n <Button size={'sm'} variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n Cancel\n </Button>\n <Button size={'sm'} type={'submit'} disabled={stateIndicator?.loading}>\n {stateIndicator?.loading ? 'Saving' : 'Save'}\n </Button>\n </HorizontalGroup>\n </>\n );\n }}\n </Form>\n </div>\n </div>\n );\n\n return (\n <>\n <div className={styles.backdrop} />\n <div ref={clickAwayRef}>{form}</div>\n </>\n );\n }\n);\n\nAnnotationEditorForm.displayName = 'AnnotationEditorForm';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n backdrop: css`\n label: backdrop;\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n z-index: ${theme.zIndex.navbarFixed};\n `,\n editorContainer: css`\n position: absolute;\n top: calc(100% + 10px);\n transform: translate3d(-50%, 0, 0);\n `,\n editor: css`\n background: ${theme.colors.background.primary};\n box-shadow: ${theme.shadows.z3};\n z-index: ${theme.zIndex.dropdown};\n border: 1px solid ${theme.colors.border.weak};\n border-radius: ${theme.shape.borderRadius()};\n width: 460px;\n `,\n editorForm: css`\n padding: ${theme.spacing(1)};\n `,\n header: css`\n border-bottom: 1px solid ${theme.colors.border.weak};\n padding: ${theme.spacing(1.5, 1)};\n `,\n title: css`\n font-weight: ${theme.typography.fontWeightMedium};\n `,\n ts: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n color: ${theme.colors.text.secondary};\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { HTMLAttributes, useState } from 'react';\nimport { usePopper } from 'react-popper';\n\nimport { colorManipulator, DataFrame, getDisplayProcessor, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { PlotSelection, useStyles2, useTheme2, Portal, DEFAULT_ANNOTATION_COLOR } from '@grafana/ui';\n\nimport { getCommonAnnotationStyles } from '../styles';\n\nimport { AnnotationEditorForm } from './AnnotationEditorForm';\n\ninterface AnnotationEditorProps extends HTMLAttributes<HTMLDivElement> {\n data: DataFrame;\n timeZone: TimeZone;\n selection: PlotSelection;\n onSave: () => void;\n onDismiss: () => void;\n annotation?: AnnotationsDataFrameViewDTO;\n}\n\nexport const AnnotationEditor: React.FC<AnnotationEditorProps> = ({\n onDismiss,\n onSave,\n timeZone,\n data,\n selection,\n annotation,\n style,\n}) => {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n const commonStyles = useStyles2(getCommonAnnotationStyles);\n const [popperTrigger, setPopperTrigger] = useState<HTMLDivElement | null>(null);\n const [editorPopover, setEditorPopover] = useState<HTMLDivElement | null>(null);\n\n const popper = usePopper(popperTrigger, editorPopover, {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'preventOverflow',\n enabled: true,\n options: {\n rootBoundary: 'viewport',\n },\n },\n ],\n });\n\n let xField = data.fields[0];\n if (!xField) {\n return null;\n }\n const xFieldFmt = xField.display || getDisplayProcessor({ field: xField, timeZone, theme });\n const isRegionAnnotation = selection.min !== selection.max;\n\n return (\n <Portal>\n <>\n <div // div overlay matching uPlot canvas bbox\n style={style}\n >\n <div // Annotation marker\n className={cx(\n css`\n position: absolute;\n top: ${selection.bbox.top}px;\n left: ${selection.bbox.left}px;\n width: ${selection.bbox.width}px;\n height: ${selection.bbox.height}px;\n `,\n isRegionAnnotation ? styles.overlayRange(annotation) : styles.overlay(annotation)\n )}\n >\n <div\n ref={setPopperTrigger}\n className={\n isRegionAnnotation\n ? cx(commonStyles(annotation).markerBar, styles.markerBar)\n : cx(commonStyles(annotation).markerTriangle, styles.markerTriangle)\n }\n />\n </div>\n </div>\n\n <AnnotationEditorForm\n annotation={annotation || ({ time: selection.min, timeEnd: selection.max } as AnnotationsDataFrameViewDTO)}\n timeFormatter={(v) => xFieldFmt(v).text}\n onSave={onSave}\n onDismiss={onDismiss}\n ref={setEditorPopover}\n style={popper.styles.popper}\n {...popper.attributes.popper}\n />\n </>\n </Portal>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n overlay: (annotation?: AnnotationsDataFrameViewDTO) => {\n const color = theme.visualization.getColorByName(annotation?.color || DEFAULT_ANNOTATION_COLOR);\n return css`\n border-left: 1px dashed ${color};\n `;\n },\n overlayRange: (annotation?: AnnotationsDataFrameViewDTO) => {\n const color = theme.visualization.getColorByName(annotation?.color || DEFAULT_ANNOTATION_COLOR);\n return css`\n background: ${colorManipulator.alpha(color, 0.1)};\n border-left: 1px dashed ${color};\n border-right: 1px dashed ${color};\n `;\n },\n markerTriangle: css`\n top: calc(100% + 2px);\n left: -4px;\n position: absolute;\n `,\n markerBar: css`\n top: 100%;\n left: 0;\n position: absolute;\n `,\n };\n};\n","import React, { useCallback, useLayoutEffect, useRef, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport uPlot from 'uplot';\n\nimport { CartesianCoords2D, DataFrame, TimeZone } from '@grafana/data';\nimport { PlotSelection, UPlotConfigBuilder } from '@grafana/ui';\n\nimport { AnnotationEditor } from './annotations/AnnotationEditor';\n\ntype StartAnnotatingFn = (props: {\n // pixel coordinates of the clicked point on the uPlot canvas\n coords: { viewport: CartesianCoords2D; plotCanvas: CartesianCoords2D } | null;\n}) => void;\n\ninterface AnnotationEditorPluginProps {\n data: DataFrame;\n timeZone: TimeZone;\n config: UPlotConfigBuilder;\n children?: (props: { startAnnotating: StartAnnotatingFn }) => React.ReactNode;\n}\n\n/**\n * @alpha\n */\nexport const AnnotationEditorPlugin: React.FC<AnnotationEditorPluginProps> = ({ data, timeZone, config, children }) => {\n const plotInstance = useRef<uPlot>();\n const [bbox, setBbox] = useState<DOMRect>();\n const [isAddingAnnotation, setIsAddingAnnotation] = useState(false);\n const [selection, setSelection] = useState<PlotSelection | null>(null);\n const isMounted = useMountedState();\n\n const clearSelection = useCallback(() => {\n setSelection(null);\n\n if (plotInstance.current) {\n plotInstance.current.setSelect({ top: 0, left: 0, width: 0, height: 0 });\n }\n setIsAddingAnnotation(false);\n }, [setIsAddingAnnotation, setSelection]);\n\n useLayoutEffect(() => {\n let annotating = false;\n\n config.addHook('init', (u) => {\n plotInstance.current = u;\n // Wrap all setSelect hooks to prevent them from firing if user is annotating\n const setSelectHooks = u.hooks.setSelect;\n\n if (setSelectHooks) {\n for (let i = 0; i < setSelectHooks.length; i++) {\n const hook = setSelectHooks[i];\n\n if (hook !== setSelect) {\n setSelectHooks[i] = (...args) => {\n !annotating && hook!(...args);\n };\n }\n }\n }\n });\n\n // cache uPlot plotting area bounding box\n config.addHook('syncRect', (u, rect) => {\n if (!isMounted()) {\n return;\n }\n setBbox(rect);\n });\n\n const setSelect = (u: uPlot) => {\n if (annotating) {\n setIsAddingAnnotation(true);\n setSelection({\n min: u.posToVal(u.select.left, 'x'),\n max: u.posToVal(u.select.left + u.select.width, 'x'),\n bbox: {\n left: u.select.left,\n top: 0,\n height: u.select.height,\n width: u.select.width,\n },\n });\n annotating = false;\n }\n };\n\n config.addHook('setSelect', setSelect);\n\n config.setCursor({\n bind: {\n mousedown: (u, targ, handler) => (e) => {\n annotating = e.button === 0 && (e.metaKey || e.ctrlKey);\n handler(e);\n return null;\n },\n mouseup: (u, targ, handler) => (e) => {\n // uPlot will not fire setSelect hooks for 0-width && 0-height selections\n // so we force it to fire on single-point clicks by mutating left & height\n if (annotating && u.select.width === 0) {\n u.select.left = u.cursor.left!;\n u.select.height = u.bbox.height / window.devicePixelRatio;\n }\n handler(e);\n return null;\n },\n },\n });\n }, [config, setBbox, isMounted]);\n\n const startAnnotating = useCallback<StartAnnotatingFn>(\n ({ coords }) => {\n if (!plotInstance.current || !bbox || !coords) {\n return;\n }\n\n const min = plotInstance.current.posToVal(coords.plotCanvas.x, 'x');\n\n if (!min) {\n return;\n }\n\n setSelection({\n min,\n max: min,\n bbox: {\n left: coords.plotCanvas.x,\n top: 0,\n height: bbox.height,\n width: 0,\n },\n });\n setIsAddingAnnotation(true);\n },\n [bbox]\n );\n\n return (\n <>\n {isAddingAnnotation && selection && bbox && (\n <AnnotationEditor\n selection={selection}\n onDismiss={clearSelection}\n onSave={clearSelection}\n data={data}\n timeZone={timeZone}\n style={{\n position: 'absolute',\n top: `${bbox.top}px`,\n left: `${bbox.left}px`,\n width: `${bbox.width}px`,\n height: `${bbox.height}px`,\n }}\n />\n )}\n {children ? children({ startAnnotating }) : null}\n </>\n );\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, textUtil } from '@grafana/data';\nimport { HorizontalGroup, IconButton, Tag, useStyles2 } from '@grafana/ui';\nimport config from 'app/core/config';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { CommentManager } from 'app/features/comments/CommentManager';\n\ninterface AnnotationTooltipProps {\n annotation: AnnotationsDataFrameViewDTO;\n timeFormatter: (v: number) => string;\n canEdit: boolean;\n canDelete: boolean;\n onEdit: () => void;\n onDelete: () => void;\n}\n\nexport const AnnotationTooltip = ({\n annotation,\n timeFormatter,\n canEdit,\n canDelete,\n onEdit,\n onDelete,\n}: AnnotationTooltipProps) => {\n const styles = useStyles2(getStyles);\n const time = timeFormatter(annotation.time);\n const timeEnd = timeFormatter(annotation.timeEnd);\n let text = annotation.text;\n const tags = annotation.tags;\n let alertText = '';\n let avatar;\n let editControls;\n let state: React.ReactNode | null = null;\n\n const ts = <span className={styles.time}>{Boolean(annotation.isRegion) ? `${time} - ${timeEnd}` : time}</span>;\n\n if (annotation.login && annotation.avatarUrl) {\n avatar = <img className={styles.avatar} src={annotation.avatarUrl} />;\n }\n\n if (annotation.alertId !== undefined && annotation.newState) {\n const stateModel = alertDef.getStateDisplayModel(annotation.newState);\n state = (\n <div className={styles.alertState}>\n <i className={stateModel.stateClass}>{stateModel.text}</i>\n </div>\n );\n\n alertText = alertDef.getAlertAnnotationInfo(annotation);\n } else if (annotation.title) {\n text = annotation.title + '<br />' + (typeof text === 'string' ? text : '');\n }\n\n if (canEdit || canDelete) {\n editControls = (\n <div className={styles.editControls}>\n {canEdit && <IconButton name={'pen'} size={'sm'} onClick={onEdit} />}\n {canDelete && <IconButton name={'trash-alt'} size={'sm'} onClick={onDelete} />}\n </div>\n );\n }\n\n const areAnnotationCommentsEnabled = config.featureToggles.annotationComments;\n\n return (\n <div className={styles.wrapper} style={areAnnotationCommentsEnabled ? { minWidth: '300px' } : {}}>\n <div className={styles.header}>\n <HorizontalGroup justify={'space-between'} align={'center'} spacing={'md'}>\n <div className={styles.meta}>\n <span>\n {avatar}\n {state}\n </span>\n {ts}\n </div>\n {editControls}\n </HorizontalGroup>\n </div>\n\n <div className={styles.body}>\n {text && <div dangerouslySetInnerHTML={{ __html: textUtil.sanitize(text) }} />}\n {alertText}\n <>\n <HorizontalGroup spacing=\"xs\" wrap>\n {tags?.map((t, i) => (\n <Tag name={t} key={`${t}-${i}`} />\n ))}\n </HorizontalGroup>\n </>\n {areAnnotationCommentsEnabled && (\n <div className={styles.commentWrapper}>\n <CommentManager objectType={'annotation'} objectId={annotation.id.toString()} />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nAnnotationTooltip.displayName = 'AnnotationTooltip';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n max-width: 400px;\n `,\n commentWrapper: css`\n margin-top: 10px;\n border-top: 2px solid #2d2b34;\n height: 30vh;\n overflow-y: scroll;\n padding: 0 3px;\n `,\n header: css`\n padding: ${theme.spacing(0.5, 1)};\n border-bottom: 1px solid ${theme.colors.border.weak};\n font-size: ${theme.typography.bodySmall.fontSize};\n display: flex;\n `,\n meta: css`\n display: flex;\n justify-content: space-between;\n `,\n editControls: css`\n display: flex;\n align-items: center;\n > :last-child {\n margin-right: 0;\n }\n `,\n avatar: css`\n border-radius: 50%;\n width: 16px;\n height: 16px;\n margin-right: ${theme.spacing(1)};\n `,\n alertState: css`\n padding-right: ${theme.spacing(1)};\n font-weight: ${theme.typography.fontWeightMedium};\n `,\n time: css`\n color: ${theme.colors.text.secondary};\n font-weight: normal;\n display: inline-block;\n position: relative;\n top: 1px;\n `,\n body: css`\n padding: ${theme.spacing(1)};\n\n a {\n color: ${theme.colors.text.link};\n &:hover {\n text-decoration: underline;\n }\n }\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { HTMLAttributes, useCallback, useRef, useState } from 'react';\nimport { usePopper } from 'react-popper';\n\nimport { GrafanaTheme2, dateTimeFormat, systemDateFormats, TimeZone } from '@grafana/data';\nimport { Portal, useStyles2, usePanelContext } from '@grafana/ui';\nimport { getTooltipContainerStyles } from '@grafana/ui/src/themes/mixins';\n\nimport { getCommonAnnotationStyles } from '../styles';\n\nimport { AnnotationEditorForm } from './AnnotationEditorForm';\nimport { AnnotationTooltip } from './AnnotationTooltip';\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n timeZone: TimeZone;\n annotation: AnnotationsDataFrameViewDTO;\n width: number;\n}\n\nconst MIN_REGION_ANNOTATION_WIDTH = 6;\n\nconst POPPER_CONFIG = {\n modifiers: [\n { name: 'arrow', enabled: false },\n {\n name: 'preventOverflow',\n enabled: true,\n options: {\n rootBoundary: 'viewport',\n },\n },\n ],\n};\n\nexport function AnnotationMarker({ annotation, timeZone, width }: Props) {\n const { canAddAnnotations, canEditAnnotations, canDeleteAnnotations, ...panelCtx } = usePanelContext();\n const commonStyles = useStyles2(getCommonAnnotationStyles);\n const styles = useStyles2(getStyles);\n\n const [isOpen, setIsOpen] = useState(false);\n const [isEditing, setIsEditing] = useState(false);\n const [markerRef, setMarkerRef] = useState<HTMLDivElement | null>(null);\n const [tooltipRef, setTooltipRef] = useState<HTMLDivElement | null>(null);\n const [editorRef, setEditorRef] = useState<HTMLDivElement | null>(null);\n\n const popoverRenderTimeout = useRef<NodeJS.Timer>();\n\n const popper = usePopper(markerRef, tooltipRef, POPPER_CONFIG);\n const editorPopper = usePopper(markerRef, editorRef, POPPER_CONFIG);\n\n const onAnnotationEdit = useCallback(() => {\n setIsEditing(true);\n setIsOpen(false);\n }, [setIsEditing, setIsOpen]);\n\n const onAnnotationDelete = useCallback(() => {\n if (panelCtx.onAnnotationDelete) {\n panelCtx.onAnnotationDelete(annotation.id);\n }\n }, [annotation, panelCtx]);\n\n const onMouseEnter = useCallback(() => {\n if (popoverRenderTimeout.current) {\n clearTimeout(popoverRenderTimeout.current);\n }\n setIsOpen(true);\n }, [setIsOpen]);\n\n const onPopoverMouseEnter = useCallback(() => {\n if (popoverRenderTimeout.current) {\n clearTimeout(popoverRenderTimeout.current);\n }\n }, []);\n\n const onMouseLeave = useCallback(() => {\n popoverRenderTimeout.current = setTimeout(() => {\n setIsOpen(false);\n }, 100);\n }, [setIsOpen]);\n\n const timeFormatter = useCallback(\n (value: number) => {\n return dateTimeFormat(value, {\n format: systemDateFormats.fullDate,\n timeZone,\n });\n },\n [timeZone]\n );\n\n const renderTooltip = useCallback(() => {\n return (\n <AnnotationTooltip\n annotation={annotation}\n timeFormatter={timeFormatter}\n onEdit={onAnnotationEdit}\n onDelete={onAnnotationDelete}\n canEdit={canEditAnnotations!(annotation.dashboardUID)}\n canDelete={canDeleteAnnotations!(annotation.dashboardUID)}\n />\n );\n }, [canEditAnnotations, canDeleteAnnotations, onAnnotationDelete, onAnnotationEdit, timeFormatter, annotation]);\n\n const isRegionAnnotation = Boolean(annotation.isRegion) && width > MIN_REGION_ANNOTATION_WIDTH;\n\n let left = `${width / 2}px`;\n let marker = (\n <div\n className={commonStyles(annotation).markerTriangle}\n style={{ left, position: 'relative', transform: 'translate3d(-100%,-50%, 0)' }}\n />\n );\n\n if (isRegionAnnotation) {\n marker = (\n <div\n className={commonStyles(annotation).markerBar}\n style={{ width: `${width}px`, transform: 'translate3d(0,-50%, 0)' }}\n />\n );\n }\n return (\n <>\n <div\n ref={setMarkerRef}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n className={!isRegionAnnotation ? styles.markerWrapper : undefined}\n >\n {marker}\n </div>\n\n {isOpen && (\n <Portal>\n <div\n ref={setTooltipRef}\n style={popper.styles.popper}\n {...popper.attributes.popper}\n className={styles.tooltip}\n onMouseEnter={onPopoverMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {renderTooltip()}\n </div>\n </Portal>\n )}\n\n {isEditing && (\n <Portal>\n <AnnotationEditorForm\n onDismiss={() => setIsEditing(false)}\n onSave={() => setIsEditing(false)}\n timeFormatter={timeFormatter}\n annotation={annotation}\n ref={setEditorRef}\n style={editorPopper.styles.popper}\n {...editorPopper.attributes.popper}\n />\n </Portal>\n )}\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n markerWrapper: css`\n label: markerWrapper;\n padding: 0 4px 4px 4px;\n `,\n wrapper: css`\n max-width: 400px;\n `,\n tooltip: css`\n ${getTooltipContainerStyles(theme)};\n padding: 0;\n `,\n };\n};\n","import React, { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\nimport uPlot from 'uplot';\n\nimport { colorManipulator, DataFrame, DataFrameFieldIndex, DataFrameView, TimeZone } from '@grafana/data';\nimport { EventsCanvas, UPlotConfigBuilder, useTheme2 } from '@grafana/ui';\n\nimport { AnnotationMarker } from './annotations/AnnotationMarker';\n\ninterface AnnotationsPluginProps {\n config: UPlotConfigBuilder;\n annotations: DataFrame[];\n timeZone: TimeZone;\n}\n\nexport const AnnotationsPlugin: React.FC<AnnotationsPluginProps> = ({ annotations, timeZone, config }) => {\n const theme = useTheme2();\n const plotInstance = useRef<uPlot>();\n\n const annotationsRef = useRef<Array<DataFrameView<AnnotationsDataFrameViewDTO>>>();\n\n // Update annotations views when new annotations came\n useEffect(() => {\n const views: Array<DataFrameView<AnnotationsDataFrameViewDTO>> = [];\n\n for (const frame of annotations) {\n views.push(new DataFrameView(frame));\n }\n\n annotationsRef.current = views;\n }, [annotations]);\n\n useLayoutEffect(() => {\n config.addHook('init', (u) => {\n plotInstance.current = u;\n });\n\n config.addHook('draw', (u) => {\n // Render annotation lines on the canvas\n /**\n * We cannot rely on state value here, as it would require this effect to be dependent on the state value.\n */\n if (!annotationsRef.current) {\n return null;\n }\n\n const ctx = u.ctx;\n if (!ctx) {\n return;\n }\n ctx.save();\n ctx.beginPath();\n ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n ctx.clip();\n\n const renderLine = (x: number, color: string) => {\n ctx.beginPath();\n ctx.lineWidth = 2;\n ctx.strokeStyle = color;\n ctx.setLineDash([5, 5]);\n ctx.moveTo(x, u.bbox.top);\n ctx.lineTo(x, u.bbox.top + u.bbox.height);\n ctx.stroke();\n ctx.closePath();\n };\n\n for (let i = 0; i < annotationsRef.current.length; i++) {\n const annotationsView = annotationsRef.current[i];\n for (let j = 0; j < annotationsView.length; j++) {\n const annotation = annotationsView.get(j);\n\n if (!annotation.time) {\n continue;\n }\n\n let x0 = u.valToPos(annotation.time, 'x', true);\n const color = theme.visualization.getColorByName(annotation.color);\n\n renderLine(x0, color);\n\n if (annotation.isRegion && annotation.timeEnd) {\n let x1 = u.valToPos(annotation.timeEnd, 'x', true);\n\n renderLine(x1, color);\n\n ctx.fillStyle = colorManipulator.alpha(color, 0.1);\n ctx.rect(x0, u.bbox.top, x1 - x0, u.bbox.height);\n ctx.fill();\n }\n }\n }\n ctx.restore();\n return;\n });\n }, [config, theme]);\n\n const mapAnnotationToXYCoords = useCallback((frame: DataFrame, dataFrameFieldIndex: DataFrameFieldIndex) => {\n const view = new DataFrameView<AnnotationsDataFrameViewDTO>(frame);\n const annotation = view.get(dataFrameFieldIndex.fieldIndex);\n\n if (!annotation.time || !plotInstance.current) {\n return undefined;\n }\n let x = plotInstance.current.valToPos(annotation.time, 'x');\n\n if (x < 0) {\n x = 0;\n }\n return {\n x,\n y: plotInstance.current.bbox.height / window.devicePixelRatio + 4,\n };\n }, []);\n\n const renderMarker = useCallback(\n (frame: DataFrame, dataFrameFieldIndex: DataFrameFieldIndex) => {\n let width = 0;\n const view = new DataFrameView<AnnotationsDataFrameViewDTO>(frame);\n const annotation = view.get(dataFrameFieldIndex.fieldIndex);\n const isRegionAnnotation = Boolean(annotation.isRegion);\n\n if (isRegionAnnotation && plotInstance.current) {\n let x0 = plotInstance.current.valToPos(annotation.time, 'x');\n let x1 = plotInstance.current.valToPos(annotation.timeEnd, 'x');\n\n // markers are rendered relatively to uPlot canvas overly, not caring about axes width\n if (x0 < 0) {\n x0 = 0;\n }\n\n if (x1 > plotInstance.current.bbox.width / window.devicePixelRatio) {\n x1 = plotInstance.current.bbox.width / window.devicePixelRatio;\n }\n width = x1 - x0;\n }\n\n return <AnnotationMarker annotation={annotation} timeZone={timeZone} width={width} />;\n },\n [timeZone]\n );\n\n return (\n <EventsCanvas\n id=\"annotations\"\n config={config}\n events={annotations}\n renderEventMarker={renderMarker}\n mapEventToXYCoords={mapAnnotationToXYCoords}\n />\n );\n};\n","import { css as cssCore, Global } from '@emotion/react';\nimport React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useClickAway } from 'react-use';\n\nimport { CartesianCoords2D, DataFrame, getFieldDisplayName, InterpolateFunction, TimeZone } from '@grafana/data';\nimport {\n ContextMenu,\n GraphContextMenuHeader,\n IconName,\n MenuItemProps,\n MenuItemsGroup,\n MenuGroup,\n MenuItem,\n UPlotConfigBuilder,\n} from '@grafana/ui';\nimport { pluginLog } from '@grafana/ui/src/components/uPlot/utils';\n\ntype ContextMenuSelectionCoords = { viewport: CartesianCoords2D; plotCanvas: CartesianCoords2D };\ntype ContextMenuSelectionPoint = { seriesIdx: number | null; dataIdx: number | null };\n\nexport interface ContextMenuItemClickPayload {\n coords: ContextMenuSelectionCoords;\n}\n\ninterface ContextMenuPluginProps {\n data: DataFrame;\n config: UPlotConfigBuilder;\n defaultItems?: Array<MenuItemsGroup<ContextMenuItemClickPayload>>;\n timeZone: TimeZone;\n onOpen?: () => void;\n onClose?: () => void;\n replaceVariables?: InterpolateFunction;\n}\n\nexport const ContextMenuPlugin: React.FC<ContextMenuPluginProps> = ({\n data,\n config,\n onClose,\n timeZone,\n replaceVariables,\n ...otherProps\n}) => {\n const plotCanvas = useRef<HTMLDivElement>();\n const [coords, setCoords] = useState<ContextMenuSelectionCoords | null>(null);\n const [point, setPoint] = useState<ContextMenuSelectionPoint | null>(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const openMenu = useCallback(() => {\n setIsOpen(true);\n }, [setIsOpen]);\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n }, [setIsOpen]);\n\n const clearSelection = useCallback(() => {\n pluginLog('ContextMenuPlugin', false, 'clearing click selection');\n setPoint(null);\n }, [setPoint]);\n\n // Add uPlot hooks to the config, or re-add when the config changed\n useLayoutEffect(() => {\n let bbox: DOMRect | undefined = undefined;\n\n const onMouseCapture = (e: MouseEvent) => {\n let update = {\n viewport: {\n x: e.clientX,\n y: e.clientY,\n },\n plotCanvas: {\n x: 0,\n y: 0,\n },\n };\n if (bbox) {\n update = {\n ...update,\n plotCanvas: {\n x: e.clientX - bbox.left,\n y: e.clientY - bbox.top,\n },\n };\n }\n setCoords(update);\n };\n\n // cache uPlot plotting area bounding box\n config.addHook('syncRect', (u, rect) => {\n bbox = rect;\n });\n\n config.addHook('init', (u) => {\n const canvas = u.over;\n plotCanvas.current = canvas || undefined;\n plotCanvas.current?.addEventListener('mousedown', onMouseCapture);\n\n pluginLog('ContextMenuPlugin', false, 'init');\n // for naive click&drag check\n let isClick = false;\n\n // REF: https://github.com/leeoniya/uPlot/issues/239\n let pts = Array.from(u.root.querySelectorAll<HTMLDivElement>('.u-cursor-pt'));\n\n plotCanvas.current?.addEventListener('mousedown', () => {\n isClick = true;\n });\n\n plotCanvas.current?.addEventListener('mousemove', () => {\n isClick = false;\n });\n\n // TODO: remove listeners on unmount\n plotCanvas.current?.addEventListener('mouseup', (e: MouseEvent) => {\n // ignore cmd+click, this is handled by annotation editor\n if (!isClick || e.metaKey || e.ctrlKey) {\n setPoint(null);\n return;\n }\n isClick = true;\n\n if (e.target) {\n const target = e.target as HTMLElement;\n if (!target.classList.contains('u-cursor-pt')) {\n pluginLog('ContextMenuPlugin', false, 'canvas click');\n setPoint({ seriesIdx: null, dataIdx: null });\n }\n }\n\n openMenu();\n });\n\n if (pts.length > 0) {\n pts.forEach((pt, i) => {\n // TODO: remove listeners on unmount\n pt.addEventListener('click', () => {\n const seriesIdx = i + 1;\n const dataIdx = u.cursor.idx;\n pluginLog('ContextMenuPlugin', false, seriesIdx, dataIdx);\n setPoint({ seriesIdx, dataIdx: dataIdx ?? null });\n });\n });\n }\n });\n }, [config, openMenu, setCoords, setPoint]);\n\n const defaultItems = useMemo(() => {\n return otherProps.defaultItems\n ? otherProps.defaultItems.map((i) => {\n return {\n ...i,\n items: i.items.map((j) => {\n return {\n ...j,\n onClick: (e?: React.SyntheticEvent<HTMLElement>) => {\n if (!coords) {\n return;\n }\n if (j.onClick) {\n j.onClick(e, { coords });\n }\n },\n };\n }),\n };\n })\n : [];\n }, [coords, otherProps.defaultItems]);\n\n return (\n <>\n <Global\n styles={cssCore`\n .uplot .u-cursor-pt {\n pointer-events: auto !important;\n }\n `}\n />\n {isOpen && coords && (\n <ContextMenuView\n data={data}\n defaultItems={defaultItems}\n timeZone={timeZone}\n selection={{ point, coords }}\n replaceVariables={replaceVariables}\n onClose={() => {\n clearSelection();\n closeMenu();\n if (onClose) {\n onClose();\n }\n }}\n />\n )}\n </>\n );\n};\n\ninterface ContextMenuProps {\n data: DataFrame;\n defaultItems?: MenuItemsGroup[];\n timeZone: TimeZone;\n onClose?: () => void;\n selection: {\n point?: { seriesIdx: number | null; dataIdx: number | null } | null;\n coords: { plotCanvas: CartesianCoords2D; viewport: CartesianCoords2D };\n };\n replaceVariables?: InterpolateFunction;\n}\n\nexport const ContextMenuView: React.FC<ContextMenuProps> = ({\n selection,\n timeZone,\n defaultItems,\n replaceVariables,\n data,\n ...otherProps\n}) => {\n const ref = useRef(null);\n\n const onClose = () => {\n if (otherProps.onClose) {\n otherProps.onClose();\n }\n };\n\n useClickAway(ref, () => {\n onClose();\n });\n\n const xField = data.fields[0];\n\n if (!xField) {\n return null;\n }\n const items = defaultItems ? [...defaultItems] : [];\n let renderHeader: () => JSX.Element | null = () => null;\n\n if (selection.point) {\n const { seriesIdx, dataIdx } = selection.point;\n const xFieldFmt = xField.display!;\n\n if (seriesIdx && dataIdx !== null) {\n const field = data.fields[seriesIdx];\n\n const displayValue = field.display!(field.values.get(dataIdx));\n\n const hasLinks = field.config.links && field.config.links.length > 0;\n\n if (hasLinks) {\n if (field.getLinks) {\n items.push({\n items: field\n .getLinks({\n valueRowIndex: dataIdx,\n })\n .map<MenuItemProps>((link) => {\n return {\n label: link.title,\n ariaLabel: link.title,\n url: link.href,\n target: link.target,\n icon: `${link.target === '_self' ? 'link' : 'external-link-alt'}` as IconName,\n onClick: link.onClick,\n };\n }),\n });\n }\n }\n\n // eslint-disable-next-line react/display-name\n renderHeader = () => (\n <GraphContextMenuHeader\n timestamp={xFieldFmt(xField.values.get(dataIdx)).text}\n displayValue={displayValue}\n seriesColor={displayValue.color!}\n displayName={getFieldDisplayName(field, data)}\n />\n );\n }\n }\n\n const renderMenuGroupItems = () => {\n return items?.map((group, index) => (\n <MenuGroup key={`${group.label}${index}`} label={group.label}>\n {(group.items || []).map((item) => (\n <MenuItem\n key={item.label}\n url={item.url}\n label={item.label}\n target={item.target}\n icon={item.icon}\n active={item.active}\n onClick={item.onClick}\n />\n ))}\n </MenuGroup>\n ));\n };\n\n return (\n <ContextMenu\n renderMenuItems={renderMenuGroupItems}\n renderHeader={renderHeader}\n x={selection.coords.viewport.x}\n y={selection.coords.viewport.y}\n onClose={onClose}\n />\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { usePopper } from 'react-popper';\n\nimport {\n DataFrame,\n DataFrameFieldIndex,\n dateTimeFormat,\n Field,\n FieldType,\n GrafanaTheme,\n LinkModel,\n systemDateFormats,\n TimeZone,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { FieldLinkList, Portal, UPlotConfigBuilder, useStyles } from '@grafana/ui';\n\ninterface ExemplarMarkerProps {\n timeZone: TimeZone;\n dataFrame: DataFrame;\n dataFrameFieldIndex: DataFrameFieldIndex;\n config: UPlotConfigBuilder;\n getFieldLinks: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n}\n\nexport const ExemplarMarker: React.FC<ExemplarMarkerProps> = ({\n timeZone,\n dataFrame,\n dataFrameFieldIndex,\n config,\n getFieldLinks,\n}) => {\n const styles = useStyles(getExemplarMarkerStyles);\n const [isOpen, setIsOpen] = useState(false);\n const [markerElement, setMarkerElement] = React.useState<HTMLDivElement | null>(null);\n const [popperElement, setPopperElement] = React.useState<HTMLDivElement | null>(null);\n const { styles: popperStyles, attributes } = usePopper(markerElement, popperElement);\n const popoverRenderTimeout = useRef<NodeJS.Timer>();\n\n const getSymbol = () => {\n const symbols = [\n <rect key=\"diamond\" x=\"3.38672\" width=\"4.78985\" height=\"4.78985\" transform=\"rotate(45 3.38672 0)\" />,\n <path\n key=\"x\"\n d=\"M1.94444 3.49988L0 5.44432L1.55552 6.99984L3.49996 5.05539L5.4444 6.99983L6.99992 5.44431L5.05548 3.49988L6.99983 1.55552L5.44431 0L3.49996 1.94436L1.5556 0L8.42584e-05 1.55552L1.94444 3.49988Z\"\n />,\n <path key=\"triangle\" d=\"M4 0L7.4641 6H0.535898L4 0Z\" />,\n <rect key=\"rectangle\" width=\"5\" height=\"5\" />,\n <path key=\"pentagon\" d=\"M3 0.5L5.85317 2.57295L4.76336 5.92705H1.23664L0.146831 2.57295L3 0.5Z\" />,\n <path\n key=\"plus\"\n d=\"m2.35672,4.2425l0,2.357l1.88558,0l0,-2.357l2.3572,0l0,-1.88558l-2.3572,0l0,-2.35692l-1.88558,0l0,2.35692l-2.35672,0l0,1.88558l2.35672,0z\"\n />,\n ];\n return symbols[dataFrameFieldIndex.frameIndex % symbols.length];\n };\n\n const onMouseEnter = useCallback(() => {\n if (popoverRenderTimeout.current) {\n clearTimeout(popoverRenderTimeout.current);\n }\n setIsOpen(true);\n }, [setIsOpen]);\n\n const onMouseLeave = useCallback(() => {\n popoverRenderTimeout.current = setTimeout(() => {\n setIsOpen(false);\n }, 100);\n }, [setIsOpen]);\n\n const renderMarker = useCallback(() => {\n const timeFormatter = (value: number) => {\n return dateTimeFormat(value, {\n format: systemDateFormats.fullDate,\n timeZone,\n });\n };\n\n return (\n <div\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n className={styles.tooltip}\n ref={setPopperElement}\n style={popperStyles.popper}\n {...attributes.popper}\n >\n <div className={styles.wrapper}>\n <div className={styles.header}>\n <span className={styles.title}>Exemplar</span>\n </div>\n <div className={styles.body}>\n <div>\n <table className={styles.exemplarsTable}>\n <tbody>\n {dataFrame.fields.map((field, i) => {\n const value = field.values.get(dataFrameFieldIndex.fieldIndex);\n const links = field.config.links?.length\n ? getFieldLinks(field, dataFrameFieldIndex.fieldIndex)\n : undefined;\n return (\n <tr key={i}>\n <td valign=\"top\">{field.name}</td>\n <td>\n <div className={styles.valueWrapper}>\n <span>{field.type === FieldType.time ? timeFormatter(value) : value}</span>\n {links && <FieldLinkList links={links} />}\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n );\n }, [\n attributes.popper,\n dataFrame.fields,\n getFieldLinks,\n dataFrameFieldIndex,\n onMouseEnter,\n onMouseLeave,\n popperStyles.popper,\n styles,\n timeZone,\n ]);\n\n const seriesColor = config\n .getSeries()\n .find((s) => s.props.dataFrameFieldIndex?.frameIndex === dataFrameFieldIndex.frameIndex)?.props.lineColor;\n\n return (\n <>\n <div\n ref={setMarkerElement}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n className={styles.markerWrapper}\n aria-label={selectors.components.DataSource.Prometheus.exemplarMarker}\n >\n <svg\n viewBox=\"0 0 7 7\"\n width=\"7\"\n height=\"7\"\n style={{ fill: seriesColor }}\n className={cx(styles.marble, isOpen && styles.activeMarble)}\n >\n {getSymbol()}\n </svg>\n </div>\n {isOpen && <Portal>{renderMarker()}</Portal>}\n </>\n );\n};\n\nconst getExemplarMarkerStyles = (theme: GrafanaTheme) => {\n const bg = theme.isDark ? theme.palette.dark2 : theme.palette.white;\n const headerBg = theme.isDark ? theme.palette.dark9 : theme.palette.gray5;\n const shadowColor = theme.isDark ? theme.palette.black : theme.palette.white;\n const tableBgOdd = theme.isDark ? theme.palette.dark3 : theme.palette.gray6;\n\n return {\n markerWrapper: css`\n padding: 0 4px 4px 4px;\n width: 8px;\n height: 8px;\n box-sizing: content-box;\n transform: translate3d(-50%, 0, 0);\n\n &:hover {\n > svg {\n transform: scale(1.3);\n opacity: 1;\n filter: drop-shadow(0 0 8px rgba(0, 0, 0, 0.5));\n }\n }\n `,\n marker: css`\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-bottom: 4px solid ${theme.palette.red};\n pointer-events: none;\n `,\n wrapper: css`\n background: ${bg};\n border: 1px solid ${headerBg};\n border-radius: ${theme.border.radius.md};\n box-shadow: 0 0 20px ${shadowColor};\n `,\n exemplarsTable: css`\n width: 100%;\n\n tr td {\n padding: 5px 10px;\n white-space: nowrap;\n border-bottom: 4px solid ${theme.colors.panelBg};\n }\n\n tr {\n background-color: ${theme.colors.bg1};\n &:nth-child(even) {\n background-color: ${tableBgOdd};\n }\n }\n `,\n valueWrapper: css`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n column-gap: ${theme.spacing.sm};\n\n > span {\n flex-grow: 0;\n }\n\n > * {\n flex: 1 1;\n align-self: center;\n }\n `,\n tooltip: css`\n background: none;\n padding: 0;\n `,\n header: css`\n background: ${headerBg};\n padding: 6px 10px;\n display: flex;\n `,\n title: css`\n font-weight: ${theme.typography.weight.semibold};\n padding-right: ${theme.spacing.md};\n overflow: hidden;\n display: inline-block;\n white-space: nowrap;\n text-overflow: ellipsis;\n flex-grow: 1;\n `,\n body: css`\n padding: ${theme.spacing.sm};\n font-weight: ${theme.typography.weight.semibold};\n `,\n marble: css`\n display: block;\n opacity: 0.5;\n transition: transform 0.15s ease-out;\n `,\n activeMarble: css`\n transform: scale(1.3);\n opacity: 1;\n filter: drop-shadow(0 0 8px rgba(0, 0, 0, 0.5));\n `,\n };\n};\n","import React, { useCallback, useLayoutEffect, useRef } from 'react';\nimport uPlot from 'uplot';\n\nimport {\n DataFrame,\n DataFrameFieldIndex,\n Field,\n LinkModel,\n TimeZone,\n TIME_SERIES_TIME_FIELD_NAME,\n TIME_SERIES_VALUE_FIELD_NAME,\n} from '@grafana/data';\nimport { EventsCanvas, FIXED_UNIT, UPlotConfigBuilder } from '@grafana/ui';\n\nimport { ExemplarMarker } from './ExemplarMarker';\n\ninterface ExemplarsPluginProps {\n config: UPlotConfigBuilder;\n exemplars: DataFrame[];\n timeZone: TimeZone;\n getFieldLinks: (field: Field, rowIndex: number) => Array<LinkModel<Field>>;\n}\n\nexport const ExemplarsPlugin: React.FC<ExemplarsPluginProps> = ({ exemplars, timeZone, getFieldLinks, config }) => {\n const plotInstance = useRef<uPlot>();\n\n useLayoutEffect(() => {\n config.addHook('init', (u) => {\n plotInstance.current = u;\n });\n }, [config]);\n\n const mapExemplarToXYCoords = useCallback((dataFrame: DataFrame, dataFrameFieldIndex: DataFrameFieldIndex) => {\n const time = dataFrame.fields.find((f) => f.name === TIME_SERIES_TIME_FIELD_NAME);\n const value = dataFrame.fields.find((f) => f.name === TIME_SERIES_VALUE_FIELD_NAME);\n\n if (!time || !value || !plotInstance.current) {\n return undefined;\n }\n\n // Filter x, y scales out\n const yScale =\n Object.keys(plotInstance.current.scales).find((scale) => !['x', 'y'].some((key) => key === scale)) ?? FIXED_UNIT;\n\n const yMin = plotInstance.current.scales[yScale].min;\n const yMax = plotInstance.current.scales[yScale].max;\n\n let y = value.values.get(dataFrameFieldIndex.fieldIndex);\n // To not to show exemplars outside of the graph we set the y value to min if it is smaller and max if it is bigger than the size of the graph\n if (yMin != null && y < yMin) {\n y = yMin;\n }\n\n if (yMax != null && y > yMax) {\n y = yMax;\n }\n\n return {\n x: plotInstance.current.valToPos(time.values.get(dataFrameFieldIndex.fieldIndex), 'x'),\n y: plotInstance.current.valToPos(y, yScale),\n };\n }, []);\n\n const renderMarker = useCallback(\n (dataFrame: DataFrame, dataFrameFieldIndex: DataFrameFieldIndex) => {\n return (\n <ExemplarMarker\n timeZone={timeZone}\n getFieldLinks={getFieldLinks}\n dataFrame={dataFrame}\n dataFrameFieldIndex={dataFrameFieldIndex}\n config={config}\n />\n );\n },\n [config, timeZone, getFieldLinks]\n );\n\n return (\n <EventsCanvas\n config={config}\n id=\"exemplars\"\n events={exemplars}\n renderEventMarker={renderMarker}\n mapEventToXYCoords={mapExemplarToXYCoords}\n />\n );\n};\n","import React, { useLayoutEffect, useRef, useState } from 'react';\nimport uPlot, { TypedArray, Scale } from 'uplot';\n\nimport { AbsoluteTimeRange } from '@grafana/data';\nimport { UPlotConfigBuilder, Button } from '@grafana/ui';\n\ninterface ThresholdControlsPluginProps {\n config: UPlotConfigBuilder;\n onChangeTimeRange: (timeRange: AbsoluteTimeRange) => void;\n}\n\nexport const OutsideRangePlugin: React.FC<ThresholdControlsPluginProps> = ({ config, onChangeTimeRange }) => {\n const plotInstance = useRef<uPlot>();\n const [timevalues, setTimeValues] = useState<number[] | TypedArray>([]);\n const [timeRange, setTimeRange] = useState<Scale | undefined>();\n\n useLayoutEffect(() => {\n config.addHook('init', (u) => {\n plotInstance.current = u;\n });\n\n config.addHook('setScale', (u) => {\n setTimeValues(u.data?.[0] ?? []);\n setTimeRange(u.scales['x'] ?? undefined);\n });\n }, [config]);\n\n if (timevalues.length < 2 || !onChangeTimeRange) {\n return null;\n }\n\n if (!timeRange || !timeRange.time || !timeRange.min || !timeRange.max!) {\n return null;\n }\n\n // Time values are always sorted for uPlot to work\n const first = timevalues[0];\n const last = timevalues[timevalues.length - 1];\n const fromX = timeRange.min;\n const toX = timeRange.max;\n\n // (StartA <= EndB) and (EndA >= StartB)\n if (first <= toX && last >= fromX) {\n return null;\n }\n\n return (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n width: '100%',\n textAlign: 'center',\n }}\n >\n <div>\n <div>Data outside time range</div>\n <Button onClick={(v) => onChangeTimeRange({ from: first, to: last })} variant=\"secondary\">\n Zoom to data\n </Button>\n </div>\n </div>\n );\n};\n\nOutsideRangePlugin.displayName = 'OutsideRangePlugin';\n","import { css } from '@emotion/css';\nimport React, { useMemo, useState } from 'react';\nimport Draggable, { DraggableBounds } from 'react-draggable';\n\nimport { Threshold, GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, useTheme2 } from '@grafana/ui';\n\ntype OutOfBounds = 'top' | 'bottom' | 'none';\n\ninterface ThresholdDragHandleProps {\n step: Threshold;\n y: number;\n dragBounds: DraggableBounds;\n mapPositionToValue: (y: number) => number;\n onChange: (value: number) => void;\n formatValue: (value: number) => string;\n}\n\nexport const ThresholdDragHandle: React.FC<ThresholdDragHandleProps> = ({\n step,\n y,\n dragBounds,\n mapPositionToValue,\n formatValue,\n onChange,\n}) => {\n const theme = useTheme2();\n let yPos = y;\n let outOfBounds: OutOfBounds = 'none';\n\n if (y < (dragBounds.top ?? 0)) {\n outOfBounds = 'top';\n }\n\n // there seems to be a 22px offset at the bottom where the threshold line is still drawn\n // this is probably offset by the size of the x-axis component\n if (y > (dragBounds.bottom ?? 0) + 22) {\n outOfBounds = 'bottom';\n }\n\n if (outOfBounds === 'bottom') {\n yPos = dragBounds.bottom ?? y;\n }\n\n if (outOfBounds === 'top') {\n yPos = dragBounds.top ?? y;\n }\n\n const styles = useStyles2((theme) => getStyles(theme, step, outOfBounds));\n const [currentValue, setCurrentValue] = useState(step.value);\n\n const textColor = useMemo(() => {\n return theme.colors.getContrastText(theme.visualization.getColorByName(step.color));\n }, [step.color, theme]);\n\n return (\n <Draggable\n axis=\"y\"\n grid={[1, 1]}\n onStop={(_e, d) => {\n onChange(mapPositionToValue(d.lastY));\n // as of https://github.com/react-grid-layout/react-draggable/issues/390#issuecomment-623237835\n return false;\n }}\n onDrag={(_e, d) => setCurrentValue(mapPositionToValue(d.lastY))}\n position={{ x: 0, y: yPos }}\n bounds={dragBounds}\n >\n <div className={styles.handle} style={{ color: textColor }}>\n <span className={styles.handleText}>{formatValue(currentValue)}</span>\n </div>\n </Draggable>\n );\n};\n\nThresholdDragHandle.displayName = 'ThresholdDragHandle';\n\nconst getStyles = (theme: GrafanaTheme2, step: Threshold, outOfBounds: OutOfBounds) => {\n const mainColor = theme.visualization.getColorByName(step.color);\n const arrowStyles = getArrowStyles(outOfBounds);\n const isOutOfBounds = outOfBounds !== 'none';\n\n return {\n handle: css`\n display: flex;\n align-items: center;\n position: absolute;\n left: 0;\n width: calc(100% - 9px);\n height: 18px;\n margin-top: -9px;\n border-color: ${mainColor};\n cursor: grab;\n border-top-right-radius: ${theme.shape.borderRadius(1)};\n border-bottom-right-radius: ${theme.shape.borderRadius(1)};\n ${isOutOfBounds &&\n css`\n margin-top: 0;\n border-radius: ${theme.shape.borderRadius(1)};\n `}\n background: ${mainColor};\n font-size: ${theme.typography.bodySmall.fontSize};\n &:before {\n ${arrowStyles};\n }\n `,\n handleText: css`\n text-align: center;\n width: 100%;\n display: block;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n `,\n };\n};\n\nfunction getArrowStyles(outOfBounds: OutOfBounds) {\n const inBounds = outOfBounds === 'none';\n\n const triangle = (size: number) => css`\n content: '';\n position: absolute;\n\n bottom: 0;\n top: 0;\n width: 0;\n height: 0;\n left: 0;\n\n border-right-style: solid;\n border-right-width: ${size}px;\n border-right-color: inherit;\n border-top: ${size}px solid transparent;\n border-bottom: ${size}px solid transparent;\n `;\n\n if (inBounds) {\n return css`\n ${triangle(9)};\n left: -9px;\n `;\n }\n\n if (outOfBounds === 'top') {\n return css`\n ${triangle(5)};\n left: calc(50% - 2.5px);\n top: -7px;\n transform: rotate(90deg);\n `;\n }\n\n if (outOfBounds === 'bottom') {\n return css`\n ${triangle(5)};\n left: calc(50% - 2.5px);\n top: calc(100% - 2.5px);\n transform: rotate(-90deg);\n `;\n }\n\n return '';\n}\n","import React, { useState, useLayoutEffect, useMemo, useRef } from 'react';\nimport uPlot from 'uplot';\n\nimport { FieldConfigSource, ThresholdsConfig, getValueFormat } from '@grafana/data';\nimport { UPlotConfigBuilder, buildScaleKey } from '@grafana/ui';\n\nimport { ThresholdDragHandle } from './ThresholdDragHandle';\n\nconst GUTTER_SIZE = 60;\n\ninterface ThresholdControlsPluginProps {\n config: UPlotConfigBuilder;\n fieldConfig: FieldConfigSource;\n onThresholdsChange: (thresholds: ThresholdsConfig) => void;\n}\n\nexport const ThresholdControlsPlugin: React.FC<ThresholdControlsPluginProps> = ({\n config,\n fieldConfig,\n onThresholdsChange,\n}) => {\n const plotInstance = useRef<uPlot>();\n const [renderToken, setRenderToken] = useState(0);\n\n useLayoutEffect(() => {\n config.setPadding([0, GUTTER_SIZE, 0, 0]);\n\n config.addHook('init', (u) => {\n plotInstance.current = u;\n });\n // render token required to re-render handles when resizing uPlot\n config.addHook('draw', () => {\n setRenderToken((s) => s + 1);\n });\n }, [config]);\n\n const thresholdHandles = useMemo(() => {\n const plot = plotInstance.current;\n\n if (!plot) {\n return null;\n }\n const thresholds = fieldConfig.defaults.thresholds;\n if (!thresholds) {\n return null;\n }\n const scale = buildScaleKey(fieldConfig.defaults);\n\n const decimals = fieldConfig.defaults.decimals;\n const handles = [];\n\n for (let i = 0; i < thresholds.steps.length; i++) {\n const step = thresholds.steps[i];\n const yPos = plot.valToPos(step.value, scale);\n\n if (Number.isNaN(yPos) || !Number.isFinite(yPos)) {\n continue;\n }\n\n const height = plot.bbox.height / window.devicePixelRatio;\n\n const handle = (\n <ThresholdDragHandle\n key={`${step.value}-${i}`}\n step={step}\n y={yPos}\n dragBounds={{ top: 0, bottom: height }}\n mapPositionToValue={(y) => plot.posToVal(y, scale)}\n formatValue={(v) => getValueFormat(scale)(v, decimals).text}\n onChange={(value) => {\n const nextSteps = [\n ...thresholds.steps.slice(0, i),\n ...thresholds.steps.slice(i + 1),\n { ...thresholds.steps[i], value },\n ].sort((a, b) => a.value - b.value);\n\n onThresholdsChange({\n ...thresholds,\n steps: nextSteps,\n });\n }}\n />\n );\n\n handles.push(handle);\n }\n\n return handles;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [renderToken, fieldConfig, onThresholdsChange]);\n\n if (!plotInstance.current) {\n return null;\n }\n\n return (\n <div\n style={{\n position: 'absolute',\n overflow: 'visible',\n left: `${(plotInstance.current.bbox.left + plotInstance.current.bbox.width) / window.devicePixelRatio}px`,\n top: `${plotInstance.current.bbox.top / window.devicePixelRatio}px`,\n width: `${GUTTER_SIZE}px`,\n height: `${plotInstance.current.bbox.height / window.devicePixelRatio}px`,\n }}\n >\n {thresholdHandles}\n </div>\n );\n};\n\nThresholdControlsPlugin.displayName = 'ThresholdControlsPlugin';\n","import {\n ArrayVector,\n DataFrame,\n Field,\n FieldType,\n getDisplayProcessor,\n GrafanaTheme2,\n isBooleanUnit,\n TimeRange,\n} from '@grafana/data';\nimport { GraphFieldConfig, LineInterpolation } from '@grafana/schema';\nimport { applyNullInsertThreshold } from '@grafana/ui/src/components/GraphNG/nullInsertThreshold';\nimport { nullToValue } from '@grafana/ui/src/components/GraphNG/nullToValue';\n\n/**\n * Returns null if there are no graphable fields\n */\nexport function prepareGraphableFields(\n series: DataFrame[],\n theme: GrafanaTheme2,\n timeRange?: TimeRange\n): DataFrame[] | null {\n if (!series?.length) {\n return null;\n }\n\n let copy: Field;\n\n const frames: DataFrame[] = [];\n\n for (let frame of series) {\n const fields: Field[] = [];\n\n let hasTimeField = false;\n let hasValueField = false;\n\n let nulledFrame = applyNullInsertThreshold({\n frame,\n refFieldPseudoMin: timeRange?.from.valueOf(),\n refFieldPseudoMax: timeRange?.to.valueOf(),\n });\n\n for (const field of nullToValue(nulledFrame).fields) {\n switch (field.type) {\n case FieldType.time:\n hasTimeField = true;\n fields.push(field);\n break;\n case FieldType.number:\n hasValueField = true;\n copy = {\n ...field,\n values: new ArrayVector(\n field.values.toArray().map((v) => {\n if (!(Number.isFinite(v) || v == null)) {\n return null;\n }\n return v;\n })\n ),\n };\n\n fields.push(copy);\n break; // ok\n case FieldType.boolean:\n hasValueField = true;\n const custom: GraphFieldConfig = field.config?.custom ?? {};\n const config = {\n ...field.config,\n max: 1,\n min: 0,\n custom,\n };\n\n // smooth and linear do not make sense\n if (custom.lineInterpolation !== LineInterpolation.StepBefore) {\n custom.lineInterpolation = LineInterpolation.StepAfter;\n }\n\n copy = {\n ...field,\n config,\n type: FieldType.number,\n values: new ArrayVector(\n field.values.toArray().map((v) => {\n if (v == null) {\n return v;\n }\n return Boolean(v) ? 1 : 0;\n })\n ),\n };\n\n if (!isBooleanUnit(config.unit)) {\n config.unit = 'bool';\n copy.display = getDisplayProcessor({ field: copy, theme });\n }\n\n fields.push(copy);\n break;\n }\n }\n\n if (hasTimeField && hasValueField) {\n frames.push({\n ...frame,\n length: nulledFrame.length,\n fields,\n });\n }\n }\n\n if (frames.length) {\n return frames;\n }\n\n return null;\n}\n\nexport function getTimezones(timezones: string[] | undefined, defaultTimezone: string): string[] {\n if (!timezones || !timezones.length) {\n return [defaultTimezone];\n }\n return timezones.map((v) => (v?.length ? v : defaultTimezone));\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// NOTE: This file will be auto generated from models.cue\n// It is currenty hand written but will serve as the target for cuetsy\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nimport { LegendDisplayMode, OptionsWithLegend } from '@grafana/schema';\n\nexport const modelVersion = Object.freeze([1, 0]);\n\nexport enum VizDisplayMode {\n CandlesVolume = 'candles+volume',\n Candles = 'candles',\n Volume = 'volume',\n}\n\nexport enum CandleStyle {\n Candles = 'candles',\n OHLCBars = 'ohlcbars',\n}\n\nexport enum ColorStrategy {\n // up/down color depends on current close vs current open\n // filled always\n OpenClose = 'open-close',\n // up/down color depends on current close vs prior close\n // filled/hollow depends on current close vs current open\n CloseClose = 'close-close',\n}\n\nexport interface CandlestickFieldMap {\n open?: string;\n high?: string;\n low?: string;\n close?: string;\n volume?: string;\n}\n\nexport interface CandlestickColors {\n up: string;\n down: string;\n flat: string;\n}\n\nexport const defaultColors: CandlestickColors = {\n up: 'green',\n down: 'red',\n flat: 'gray',\n};\n\nexport interface CandlestickOptions extends OptionsWithLegend {\n mode: VizDisplayMode;\n candleStyle: CandleStyle;\n colorStrategy: ColorStrategy;\n fields: CandlestickFieldMap;\n colors: CandlestickColors;\n\n // When enabled, all fields will be sent to the graph\n includeAllFields?: boolean;\n}\n\nexport const defaultPanelOptions: CandlestickOptions = {\n mode: VizDisplayMode.CandlesVolume,\n candleStyle: CandleStyle.Candles,\n colorStrategy: ColorStrategy.OpenClose,\n colors: defaultColors,\n fields: {},\n legend: {\n displayMode: LegendDisplayMode.List,\n showLegend: true,\n placement: 'bottom',\n calcs: [],\n },\n includeAllFields: false,\n};\n","import {\n ArrayVector,\n DataFrame,\n Field,\n FieldType,\n getFieldDisplayName,\n GrafanaTheme2,\n outerJoinDataFrames,\n TimeRange,\n} from '@grafana/data';\nimport { maybeSortFrame } from '@grafana/data/src/transformations/transformers/joinDataFrames';\nimport { findField } from 'app/features/dimensions';\n\nimport { prepareGraphableFields } from '../timeseries/utils';\n\nimport { CandlestickOptions, CandlestickFieldMap, VizDisplayMode } from './models.gen';\n\nexport interface FieldPickerInfo {\n /** property name */\n key: keyof CandlestickFieldMap;\n\n /** The display name */\n name: string;\n\n /** by default pick these fields */\n defaults: string[];\n\n /** How is the field used */\n description: string;\n}\n\nexport const candlestickFieldsInfo: Record<keyof CandlestickFieldMap, FieldPickerInfo> = {\n open: {\n key: 'open',\n name: 'Open',\n defaults: ['open', 'o'],\n description: 'Value at the start of the period',\n },\n high: {\n key: 'high',\n name: 'High',\n defaults: ['high', 'h', 'max'],\n description: 'Maximum value within the period',\n },\n low: {\n key: 'low',\n name: 'Low',\n defaults: ['low', 'l', 'min'],\n description: 'Minimum value within the period',\n },\n close: {\n key: 'close',\n name: 'Close',\n defaults: ['close', 'c'],\n description: 'Value at the end of the period',\n },\n volume: {\n key: 'volume',\n name: 'Volume',\n defaults: ['volume', 'v'],\n description: 'Sample count within the period',\n },\n};\n\nexport interface CandlestickData {\n autoOpenClose?: boolean;\n\n // Special fields\n open?: Field;\n high?: Field;\n low?: Field;\n close?: Field;\n volume?: Field;\n\n // All incoming values\n aligned: DataFrame;\n\n // The stuff passed to GraphNG\n frame: DataFrame;\n\n // The real names used\n names: CandlestickFieldMap;\n}\n\nfunction findFieldOrAuto(frame: DataFrame, info: FieldPickerInfo, options: CandlestickFieldMap): Field | undefined {\n const field = findField(frame, options[info.key]);\n if (!field) {\n for (const field of frame.fields) {\n const name = getFieldDisplayName(field, frame).toLowerCase();\n if (info.defaults.includes(name) || info.defaults.includes(field.name)) {\n return field;\n }\n }\n }\n return field;\n}\n\nexport function prepareCandlestickFields(\n series: DataFrame[] | undefined,\n options: CandlestickOptions,\n theme: GrafanaTheme2,\n timeRange?: TimeRange\n): CandlestickData | null {\n if (!series?.length) {\n return null;\n }\n\n // All fields\n const fieldMap = options.fields ?? {};\n const aligned =\n series.length === 1\n ? maybeSortFrame(\n series[0],\n series[0].fields.findIndex((f) => f.type === FieldType.time)\n )\n : outerJoinDataFrames({ frames: series });\n if (!aligned?.length) {\n return null;\n }\n\n const data: CandlestickData = { aligned, frame: aligned, names: {} };\n\n // Apply same filter as everythign else in timeseries\n const timeSeriesFrames = prepareGraphableFields([aligned], theme, timeRange);\n if (!timeSeriesFrames) {\n return null;\n }\n\n const frame = (data.frame = timeSeriesFrames[0]);\n const timeIndex = frame.fields.findIndex((f) => f.type === FieldType.time);\n\n if (timeIndex < 0) {\n return null;\n }\n\n // Find the known fields\n const used = new Set<Field>();\n for (const info of Object.values(candlestickFieldsInfo)) {\n const field = findFieldOrAuto(frame, info, fieldMap);\n if (field) {\n data[info.key] = field;\n used.add(field);\n }\n }\n\n // Use first numeric value as open\n if (!data.open && !data.close) {\n data.open = frame.fields.find((f) => f.type === FieldType.number);\n if (data.open) {\n used.add(data.open);\n }\n }\n\n // Use next open as 'close' value\n if (data.open && !data.close && !fieldMap.close) {\n const values = data.open.values.toArray().slice(1);\n values.push(values[values.length - 1]); // duplicate last value\n data.close = {\n ...data.open,\n values: new ArrayVector(values),\n name: 'Next open',\n state: undefined,\n };\n used.add(data.close);\n frame.fields.push(data.close);\n data.autoOpenClose = true;\n }\n\n // Use previous close as 'open' value\n if (data.close && !data.open && !fieldMap.open) {\n const values = data.close.values.toArray().slice();\n values.unshift(values[0]); // duplicate first value\n values.length = frame.length;\n data.open = {\n ...data.close,\n values: new ArrayVector(values),\n name: 'Previous close',\n state: undefined,\n };\n used.add(data.open);\n frame.fields.push(data.open);\n data.autoOpenClose = true;\n }\n\n // Use the open field for min/max if nothing is set\n if (!data.high && !fieldMap.high) {\n data.high = data.open;\n }\n if (!data.low && !fieldMap.low) {\n data.low = data.open;\n }\n\n // unmap low and high fields in volume-only mode, and volume field in candles-only mode\n // so they fall through to unmapped fields and get appropriate includeAllFields treatment\n if (options.mode === VizDisplayMode.Volume) {\n if (data.high) {\n if (data.high !== data.open) {\n used.delete(data.high);\n }\n data.high = undefined;\n }\n if (data.low) {\n if (data.low !== data.open) {\n used.delete(data.low);\n }\n data.low = undefined;\n }\n } else if (options.mode === VizDisplayMode.Candles) {\n if (data.volume) {\n used.delete(data.volume);\n data.volume = undefined;\n }\n }\n\n // Register the name of each mapped field\n for (const info of Object.values(candlestickFieldsInfo)) {\n const f = data[info.key];\n if (f) {\n data.names[info.key] = getFieldDisplayName(f, data.frame);\n }\n }\n\n const timeField = frame.fields[timeIndex];\n\n // Make sure first field is time!\n const fields: Field[] = [timeField];\n\n if (!options.includeAllFields) {\n fields.push(...used);\n } else {\n fields.push(...frame.fields.filter((f) => f !== timeField));\n }\n\n data.frame = {\n ...data.frame,\n fields,\n };\n\n // Force update all the indicies\n for (let i = 0; i < data.frame.fields.length; i++) {\n const field = data.frame.fields[i];\n\n field.state = {\n ...field.state,\n\n // time is unused (-1), y series enumerate from 0\n seriesIndex: i - 1,\n\n origin: {\n fieldIndex: i,\n frameIndex: 0,\n },\n };\n }\n\n return data;\n}\n","import uPlot from 'uplot';\n\nimport { colorManipulator } from '@grafana/data';\n\nimport { VizDisplayMode, ColorStrategy, CandleStyle } from './models.gen';\n\nconst { alpha } = colorManipulator;\n\nexport type FieldIndices = Record<string, number>;\n\ninterface RendererOpts {\n mode: VizDisplayMode;\n candleStyle: CandleStyle;\n fields: FieldIndices;\n colorStrategy: ColorStrategy;\n upColor: string;\n downColor: string;\n flatColor: string;\n volumeAlpha: number;\n flatAsUp: boolean;\n}\n\nexport function drawMarkers(opts: RendererOpts) {\n let { mode, candleStyle, fields, colorStrategy, upColor, downColor, flatColor, volumeAlpha, flatAsUp = true } = opts;\n\n const drawPrice = mode !== VizDisplayMode.Volume && fields.high != null && fields.low != null;\n const asCandles = drawPrice && candleStyle === CandleStyle.Candles;\n const drawVolume = mode !== VizDisplayMode.Candles && fields.volume != null;\n\n function selectPath(priceDir: number, flatPath: Path2D, upPath: Path2D, downPath: Path2D, flatAsUp: boolean) {\n return priceDir > 0 ? upPath : priceDir < 0 ? downPath : flatAsUp ? upPath : flatPath;\n }\n\n let tIdx = 0,\n oIdx = fields.open,\n hIdx = fields.high,\n lIdx = fields.low,\n cIdx = fields.close,\n vIdx = fields.volume;\n\n return (u: uPlot) => {\n // split by discrete color to reduce draw calls\n let downPath, upPath, flatPath;\n // with adjusted reduced\n let downPathVol, upPathVol, flatPathVol;\n\n if (drawPrice) {\n flatPath = new Path2D();\n upPath = new Path2D();\n downPath = new Path2D();\n }\n\n if (drawVolume) {\n downPathVol = new Path2D();\n upPathVol = new Path2D();\n flatPathVol = new Path2D();\n }\n\n let hollowPath = new Path2D();\n\n let ctx = u.ctx;\n\n let tData = u.data[tIdx!];\n\n let oData = u.data[oIdx!];\n let cData = u.data[cIdx!];\n\n let hData = drawPrice ? u.data[hIdx!] : null;\n let lData = drawPrice ? u.data[lIdx!] : null;\n let vData = drawVolume ? u.data[vIdx!] : null;\n\n let zeroPx = vIdx != null ? Math.round(u.valToPos(0, u.series[vIdx!].scale!, true)) : null;\n\n let [idx0, idx1] = u.series[0].idxs!;\n\n let dataX = u.data[0];\n let dataY = oData;\n\n let colWidth = u.bbox.width;\n\n if (dataX.length > 1) {\n // prior index with non-undefined y data\n let prevIdx = null;\n\n // scan full dataset for smallest adjacent delta\n // will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end\n for (let i = 0, minDelta = Infinity; i < dataX.length; i++) {\n if (dataY[i] !== undefined) {\n if (prevIdx != null) {\n let delta = Math.abs(dataX[i] - dataX[prevIdx]);\n\n if (delta < minDelta) {\n minDelta = delta;\n colWidth = Math.abs(u.valToPos(dataX[i], 'x') - u.valToPos(dataX[prevIdx], 'x'));\n }\n }\n\n prevIdx = i;\n }\n }\n }\n\n let barWidth = Math.round(0.6 * colWidth);\n\n let stickWidth = 2;\n let outlineWidth = 2;\n\n if (barWidth <= 12) {\n stickWidth = outlineWidth = 1;\n }\n\n let halfWidth = Math.floor(barWidth / 2);\n\n for (let i = idx0; i <= idx1; i++) {\n let tPx = Math.round(u.valToPos(tData[i]!, 'x', true));\n\n // current close vs prior close\n let interDir = i === idx0 ? 0 : Math.sign(cData[i]! - cData[i - 1]!);\n // current close vs current open\n let intraDir = Math.sign(cData[i]! - oData[i]!);\n\n // volume\n if (drawVolume) {\n let outerPath = selectPath(\n colorStrategy === ColorStrategy.CloseClose ? interDir : intraDir,\n flatPathVol as Path2D,\n upPathVol as Path2D,\n downPathVol as Path2D,\n i === idx0 && ColorStrategy.CloseClose ? false : flatAsUp\n );\n\n let vPx = Math.round(u.valToPos(vData![i]!, u.series[vIdx!].scale!, true));\n outerPath.rect(tPx - halfWidth, vPx, barWidth, zeroPx! - vPx);\n }\n\n if (drawPrice) {\n let outerPath = selectPath(\n colorStrategy === ColorStrategy.CloseClose ? interDir : intraDir,\n flatPath as Path2D,\n upPath as Path2D,\n downPath as Path2D,\n i === idx0 && ColorStrategy.CloseClose ? false : flatAsUp\n );\n\n // stick\n let hPx = Math.round(u.valToPos(hData![i]!, u.series[hIdx!].scale!, true));\n let lPx = Math.round(u.valToPos(lData![i]!, u.series[lIdx!].scale!, true));\n outerPath.rect(tPx - Math.floor(stickWidth / 2), hPx, stickWidth, lPx - hPx);\n\n let oPx = Math.round(u.valToPos(oData[i]!, u.series[oIdx!].scale!, true));\n let cPx = Math.round(u.valToPos(cData[i]!, u.series[cIdx!].scale!, true));\n\n if (asCandles) {\n // rect\n let top = Math.min(oPx, cPx);\n let btm = Math.max(oPx, cPx);\n let hgt = Math.max(1, btm - top);\n outerPath.rect(tPx - halfWidth, top, barWidth, hgt);\n\n if (colorStrategy === ColorStrategy.CloseClose) {\n if (intraDir >= 0 && hgt > outlineWidth * 2) {\n hollowPath.rect(\n tPx - halfWidth + outlineWidth,\n top + outlineWidth,\n barWidth - outlineWidth * 2,\n hgt - outlineWidth * 2\n );\n }\n }\n } else {\n outerPath.rect(tPx - halfWidth, oPx, halfWidth, stickWidth);\n outerPath.rect(tPx, cPx, halfWidth, stickWidth);\n }\n }\n }\n\n ctx.save();\n\n ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n ctx.clip();\n\n if (drawVolume) {\n ctx.fillStyle = alpha(upColor, volumeAlpha);\n ctx.fill(upPathVol as Path2D);\n\n ctx.fillStyle = alpha(downColor, volumeAlpha);\n ctx.fill(downPathVol as Path2D);\n\n ctx.fillStyle = alpha(flatColor, volumeAlpha);\n ctx.fill(flatPathVol as Path2D);\n }\n\n if (drawPrice) {\n ctx.fillStyle = upColor;\n ctx.fill(upPath as Path2D);\n\n ctx.fillStyle = downColor;\n ctx.fill(downPath as Path2D);\n\n ctx.fillStyle = flatColor;\n ctx.fill(flatPath as Path2D);\n\n ctx.globalCompositeOperation = 'destination-out';\n ctx.fill(hollowPath);\n }\n\n ctx.restore();\n };\n}\n","import {\n Field,\n FieldType,\n getFieldDisplayName,\n PanelOptionsEditorBuilder,\n PanelPlugin,\n SelectableValue,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { GraphFieldConfig } from '@grafana/schema';\nimport { commonOptionsBuilder } from '@grafana/ui';\n\nimport { defaultGraphConfig, getGraphFieldConfig } from '../timeseries/config';\n\nimport { CandlestickPanel } from './CandlestickPanel';\nimport { CandlestickData, candlestickFieldsInfo, FieldPickerInfo, prepareCandlestickFields } from './fields';\nimport {\n defaultColors,\n CandlestickOptions,\n VizDisplayMode,\n ColorStrategy,\n defaultPanelOptions,\n CandleStyle,\n} from './models.gen';\nimport { CandlestickSuggestionsSupplier } from './suggestions';\n\nconst modeOptions = [\n { label: 'Candles', value: VizDisplayMode.Candles },\n { label: 'Volume', value: VizDisplayMode.Volume },\n { label: 'Both', value: VizDisplayMode.CandlesVolume },\n] as Array<SelectableValue<VizDisplayMode>>;\n\nconst candleStyles = [\n { label: 'Candles', value: CandleStyle.Candles },\n { label: 'OHLC Bars', value: CandleStyle.OHLCBars },\n] as Array<SelectableValue<CandleStyle>>;\n\nconst colorStrategies = [\n { label: 'Since Open', value: ColorStrategy.OpenClose },\n { label: 'Since Prior Close', value: ColorStrategy.CloseClose },\n] as Array<SelectableValue<ColorStrategy>>;\n\nconst numericFieldFilter = (f: Field) => f.type === FieldType.number;\n\nfunction addFieldPicker(\n builder: PanelOptionsEditorBuilder<CandlestickOptions>,\n info: FieldPickerInfo,\n data: CandlestickData | null\n) {\n let placeholderText = 'Auto ';\n\n if (data) {\n const current = data[info.key] as Field;\n\n if (current?.config) {\n placeholderText += '= ' + getFieldDisplayName(current);\n\n if (current === data?.open && info.key !== 'open') {\n placeholderText += ` (${info.defaults.join(',')})`;\n }\n } else {\n placeholderText += `(${info.defaults.join(',')})`;\n }\n }\n\n builder.addFieldNamePicker({\n path: `fields.${info.key}`,\n name: info.name,\n description: info.description,\n settings: {\n filter: numericFieldFilter,\n placeholderText,\n },\n });\n}\n\nexport const plugin = new PanelPlugin<CandlestickOptions, GraphFieldConfig>(CandlestickPanel)\n .useFieldConfig(getGraphFieldConfig(defaultGraphConfig))\n .setPanelOptions((builder, context) => {\n const opts = context.options ?? defaultPanelOptions;\n const info = prepareCandlestickFields(context.data, opts, config.theme2);\n\n builder\n .addRadio({\n path: 'mode',\n name: 'Mode',\n description: '',\n defaultValue: defaultPanelOptions.mode,\n settings: {\n options: modeOptions,\n },\n })\n .addRadio({\n path: 'candleStyle',\n name: 'Candle style',\n description: '',\n defaultValue: defaultPanelOptions.candleStyle,\n settings: {\n options: candleStyles,\n },\n showIf: (opts) => opts.mode !== VizDisplayMode.Volume,\n })\n .addRadio({\n path: 'colorStrategy',\n name: 'Color strategy',\n description: '',\n defaultValue: defaultPanelOptions.colorStrategy,\n settings: {\n options: colorStrategies,\n },\n })\n .addColorPicker({\n path: 'colors.up',\n name: 'Up color',\n defaultValue: defaultColors.up,\n })\n .addColorPicker({\n path: 'colors.down',\n name: 'Down color',\n defaultValue: defaultColors.down,\n });\n\n addFieldPicker(builder, candlestickFieldsInfo.open, info);\n if (opts.mode !== VizDisplayMode.Volume) {\n addFieldPicker(builder, candlestickFieldsInfo.high, info);\n addFieldPicker(builder, candlestickFieldsInfo.low, info);\n }\n addFieldPicker(builder, candlestickFieldsInfo.close, info);\n\n if (opts.mode !== VizDisplayMode.Candles) {\n addFieldPicker(builder, candlestickFieldsInfo.volume, info);\n }\n\n builder.addRadio({\n path: 'includeAllFields',\n name: 'Additional fields',\n description: 'Use standard timeseries options to configure any fields not mapped above',\n defaultValue: defaultPanelOptions.includeAllFields,\n settings: {\n options: [\n { label: 'Ignore', value: false },\n { label: 'Include', value: true },\n ],\n },\n });\n\n // commonOptionsBuilder.addTooltipOptions(builder);\n commonOptionsBuilder.addLegendOptions(builder);\n })\n .setDataSupport({ annotations: true, alertStates: true })\n .setSuggestionsSupplier(new CandlestickSuggestionsSupplier());\n","// this file is pretty much a copy-paste of TimeSeriesPanel.tsx :(\n// with some extra renderers passed to the <TimeSeries> component\n\nimport React, { useMemo } from 'react';\nimport uPlot from 'uplot';\n\nimport { Field, getDisplayProcessor, PanelProps } from '@grafana/data';\nimport { PanelDataErrorView } from '@grafana/runtime';\nimport { TooltipDisplayMode } from '@grafana/schema';\nimport { usePanelContext, TimeSeries, TooltipPlugin, ZoomPlugin, UPlotConfigBuilder, useTheme2 } from '@grafana/ui';\nimport { AxisProps } from '@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder';\nimport { ScaleProps } from '@grafana/ui/src/components/uPlot/config/UPlotScaleBuilder';\nimport { config } from 'app/core/config';\nimport { getFieldLinksForExplore } from 'app/features/explore/utils/links';\n\nimport { AnnotationEditorPlugin } from '../timeseries/plugins/AnnotationEditorPlugin';\nimport { AnnotationsPlugin } from '../timeseries/plugins/AnnotationsPlugin';\nimport { ContextMenuPlugin } from '../timeseries/plugins/ContextMenuPlugin';\nimport { ExemplarsPlugin } from '../timeseries/plugins/ExemplarsPlugin';\nimport { OutsideRangePlugin } from '../timeseries/plugins/OutsideRangePlugin';\nimport { ThresholdControlsPlugin } from '../timeseries/plugins/ThresholdControlsPlugin';\n\nimport { prepareCandlestickFields } from './fields';\nimport { defaultColors, CandlestickOptions, VizDisplayMode } from './models.gen';\nimport { drawMarkers, FieldIndices } from './utils';\n\ninterface CandlestickPanelProps extends PanelProps<CandlestickOptions> {}\n\nexport const CandlestickPanel: React.FC<CandlestickPanelProps> = ({\n data,\n id,\n timeRange,\n timeZone,\n width,\n height,\n options,\n fieldConfig,\n onChangeTimeRange,\n replaceVariables,\n}) => {\n const { sync, canAddAnnotations, onThresholdsChange, canEditThresholds, onSplitOpen } = usePanelContext();\n\n const getFieldLinks = (field: Field, rowIndex: number) => {\n return getFieldLinksForExplore({ field, rowIndex, splitOpenFn: onSplitOpen, range: timeRange });\n };\n\n const theme = useTheme2();\n\n const info = useMemo(() => {\n return prepareCandlestickFields(data?.series, options, theme, timeRange);\n }, [data, options, theme, timeRange]);\n\n const { renderers, tweakScale, tweakAxis } = useMemo(() => {\n let tweakScale = (opts: ScaleProps, forField: Field) => opts;\n let tweakAxis = (opts: AxisProps, forField: Field) => opts;\n\n let doNothing = {\n renderers: [],\n tweakScale,\n tweakAxis,\n };\n\n if (!info) {\n return doNothing;\n }\n\n // Un-encoding the already parsed special fields\n // This takes currently matched fields and saves the name so they can be looked up by name later\n // ¯\\_(ツ)_/¯ someday this can make more sense!\n const fieldMap = info.names;\n\n if (!Object.keys(fieldMap).length) {\n return doNothing;\n }\n\n const { mode, candleStyle, colorStrategy } = options;\n const colors = { ...defaultColors, ...options.colors };\n let { open, high, low, close, volume } = fieldMap; // names from matched fields\n\n if (open == null || close == null) {\n return doNothing;\n }\n\n let volumeAlpha = 0.5;\n\n let volumeIdx = -1;\n\n let shouldRenderVolume = false;\n\n // find volume field and set overrides\n if (volume != null && mode !== VizDisplayMode.Candles) {\n let volumeField = info.volume!;\n\n if (volumeField != null) {\n shouldRenderVolume = true;\n\n let { fillOpacity } = volumeField.config.custom;\n\n if (fillOpacity) {\n volumeAlpha = fillOpacity / 100;\n }\n\n // we only want to put volume on own shorter axis when rendered with price\n if (mode !== VizDisplayMode.Volume) {\n volumeField.config = { ...volumeField.config };\n volumeField.config.unit = 'short';\n volumeField.display = getDisplayProcessor({\n field: volumeField,\n theme: config.theme2,\n });\n\n tweakAxis = (opts: AxisProps, forField: Field) => {\n // we can't do forField === info.volume because of copies :(\n if (forField.name === info.volume?.name) {\n let filter = (u: uPlot, splits: number[]) => {\n let _splits = [];\n let max = u.series[volumeIdx].max as number;\n\n for (let i = 0; i < splits.length; i++) {\n _splits.push(splits[i]);\n\n if (splits[i] > max) {\n break;\n }\n }\n\n return _splits;\n };\n\n opts.space = 20; // reduce tick spacing\n opts.filter = filter; // hide tick labels\n opts.ticks = { ...opts.ticks, filter }; // hide tick marks\n }\n\n return opts;\n };\n\n tweakScale = (opts: ScaleProps, forField: Field) => {\n // we can't do forField === info.volume because of copies :(\n if (forField.name === info.volume?.name) {\n opts.range = (u: uPlot, min: number, max: number) => [0, max * 7];\n }\n\n return opts;\n };\n }\n }\n }\n\n let shouldRenderPrice = mode !== VizDisplayMode.Volume && high != null && low != null;\n\n if (!shouldRenderPrice && !shouldRenderVolume) {\n return doNothing;\n }\n\n let fields: Record<string, string> = {};\n let indicesOnly = [];\n\n if (shouldRenderPrice) {\n fields = { open, high: high!, low: low!, close };\n\n // hide series from legend that are rendered as composite markers\n for (let key in fields) {\n let field = (info as any)[key] as Field;\n field.config = {\n ...field.config,\n custom: {\n ...field.config.custom,\n hideFrom: { legend: true, tooltip: false, viz: false },\n },\n };\n }\n } else {\n // these fields should not be omitted from normal rendering if they arent rendered\n // as part of price markers. they're only here so we can get back their indicies in the\n // init callback below. TODO: remove this when field mapping happens in the panel instead of deep\n indicesOnly.push(open, close);\n }\n\n if (shouldRenderVolume) {\n fields.volume = volume!;\n fields.open = open;\n fields.close = close;\n }\n\n return {\n renderers: [\n {\n fieldMap: fields,\n indicesOnly,\n init: (builder: UPlotConfigBuilder, fieldIndices: FieldIndices) => {\n volumeIdx = fieldIndices.volume!;\n\n builder.addHook(\n 'drawAxes',\n drawMarkers({\n mode,\n fields: fieldIndices,\n upColor: config.theme2.visualization.getColorByName(colors.up),\n downColor: config.theme2.visualization.getColorByName(colors.down),\n flatColor: config.theme2.visualization.getColorByName(colors.flat),\n volumeAlpha,\n colorStrategy,\n candleStyle,\n flatAsUp: true,\n })\n );\n },\n },\n ],\n tweakScale,\n tweakAxis,\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options, data.structureRev]);\n\n if (!info) {\n return (\n <PanelDataErrorView\n panelId={id}\n fieldConfig={fieldConfig}\n data={data}\n needsTimeField={true}\n needsNumberField={true}\n />\n );\n }\n\n const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations());\n\n return (\n <TimeSeries\n frames={[info.frame]}\n structureRev={data.structureRev}\n timeRange={timeRange}\n timeZones={timeZone}\n width={width}\n height={height}\n legend={options.legend}\n renderers={renderers}\n tweakAxis={tweakAxis}\n tweakScale={tweakScale}\n options={options}\n >\n {(config, alignedDataFrame) => {\n return (\n <>\n <ZoomPlugin config={config} onZoom={onChangeTimeRange} />\n <TooltipPlugin\n data={alignedDataFrame}\n config={config}\n mode={TooltipDisplayMode.Multi}\n sync={sync}\n timeZone={timeZone}\n />\n {/* Renders annotation markers*/}\n {data.annotations && (\n <AnnotationsPlugin annotations={data.annotations} config={config} timeZone={timeZone} />\n )}\n {/* Enables annotations creation*/}\n {enableAnnotationCreation ? (\n <AnnotationEditorPlugin data={alignedDataFrame} timeZone={timeZone} config={config}>\n {({ startAnnotating }) => {\n return (\n <ContextMenuPlugin\n data={alignedDataFrame}\n config={config}\n timeZone={timeZone}\n replaceVariables={replaceVariables}\n defaultItems={\n enableAnnotationCreation\n ? [\n {\n items: [\n {\n label: 'Add annotation',\n ariaLabel: 'Add annotation',\n icon: 'comment-alt',\n onClick: (e, p) => {\n if (!p) {\n return;\n }\n startAnnotating({ coords: p.coords });\n },\n },\n ],\n },\n ]\n : []\n }\n />\n );\n }}\n </AnnotationEditorPlugin>\n ) : (\n <ContextMenuPlugin\n data={alignedDataFrame}\n config={config}\n timeZone={timeZone}\n replaceVariables={replaceVariables}\n defaultItems={[]}\n />\n )}\n {data.annotations && (\n <ExemplarsPlugin\n config={config}\n exemplars={data.annotations}\n timeZone={timeZone}\n getFieldLinks={getFieldLinks}\n />\n )}\n\n {canEditThresholds && onThresholdsChange && (\n <ThresholdControlsPlugin\n config={config}\n fieldConfig={fieldConfig}\n onThresholdsChange={onThresholdsChange}\n />\n )}\n\n <OutsideRangePlugin config={config} onChangeTimeRange={onChangeTimeRange} />\n </>\n );\n }}\n </TimeSeries>\n );\n};\n","import { VisualizationSuggestionsBuilder, VisualizationSuggestionScore } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { prepareCandlestickFields } from './fields';\nimport { CandlestickOptions, defaultPanelOptions } from './models.gen';\n\nexport class CandlestickSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary } = builder;\n\n if (\n !builder.data?.series ||\n !dataSummary.hasData ||\n dataSummary.timeFieldCount < 1 ||\n dataSummary.numberFieldCount < 2 ||\n dataSummary.numberFieldCount > 10\n ) {\n return;\n }\n\n const info = prepareCandlestickFields(builder.data.series, defaultPanelOptions, config.theme2);\n if (!info) {\n return;\n }\n\n // Regular timeseries\n if (info.open === info.high && info.open === info.low) {\n return;\n }\n\n const list = builder.getListAppender<CandlestickOptions, {}>({\n name: '',\n pluginId: 'candlestick',\n options: {},\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n });\n\n list.append({\n name: SuggestionName.Candlestick,\n options: defaultPanelOptions,\n fieldConfig: {\n defaults: {},\n overrides: [],\n },\n score: info.autoOpenClose ? VisualizationSuggestionScore.Good : VisualizationSuggestionScore.Best,\n });\n }\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\nexport const modelVersion = Object.freeze([0, 0]);\n\n\nexport enum PanelLayout {\n List = 'list',\n Previews = 'previews',\n}\n\nexport interface PanelOptions {\n folderId?: number;\n layout?: PanelLayout;\n maxItems: number;\n query: string;\n showHeadings: boolean;\n showRecentlyViewed: boolean;\n showSearch: boolean;\n showStarred: boolean;\n tags: string[];\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n layout: PanelLayout.List,\n maxItems: 10,\n query: '',\n showHeadings: true,\n showRecentlyViewed: false,\n showSearch: false,\n showStarred: true,\n tags: [],\n};\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { styleMixins } from '@grafana/ui';\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n dashlistSectionHeader: css`\n margin-bottom: ${theme.spacing(2)};\n color: ${theme.colors.secondary.text};\n `,\n\n dashlistSection: css`\n margin-bottom: ${theme.spacing(2)};\n padding-top: 3px;\n `,\n\n dashlistLink: css`\n ${styleMixins.listItem(theme)}\n display: flex;\n cursor: pointer;\n margin: 3px;\n padding: 7px;\n `,\n\n dashlistStar: css`\n align-self: center;\n margin-right: 0px;\n color: ${theme.colors.secondary.text};\n z-index: 1;\n `,\n\n dashlistFolder: css`\n color: ${theme.colors.secondary.text};\n font-size: ${theme.typography.bodySmall.fontSize};\n line-height: ${theme.typography.body.lineHeight};\n `,\n\n dashlistTitle: css`\n &::after {\n position: absolute;\n content: '';\n left: 0;\n top: 0;\n bottom: 0;\n right: 0;\n }\n `,\n\n dashlistLinkBody: css`\n flex-grow: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n\n dashlistItem: css`\n position: relative;\n list-style: none;\n `,\n\n gridContainer: css`\n display: grid;\n gap: ${theme.spacing(1)};\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n list-style: none;\n margin-bottom: ${theme.spacing(1)};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport { take } from 'lodash';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { GrafanaTheme2, InterpolateFunction, PanelProps } from '@grafana/data';\nimport { CustomScrollbar, stylesFactory, useStyles2 } from '@grafana/ui';\nimport { Icon, IconProps } from '@grafana/ui/src/components/Icon/Icon';\nimport { getFocusStyles } from '@grafana/ui/src/themes/mixins';\nimport { setStarred } from 'app/core/reducers/navBarTree';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { SearchCard } from 'app/features/search/components/SearchCard';\nimport { DashboardSearchHit } from 'app/features/search/types';\n\nimport { PanelLayout, PanelOptions } from './models.gen';\nimport { getStyles } from './styles';\n\ntype Dashboard = DashboardSearchHit & { isSearchResult?: boolean; isRecent?: boolean };\n\ninterface DashboardGroup {\n show: boolean;\n header: string;\n dashboards: Dashboard[];\n}\n\nasync function fetchDashboards(options: PanelOptions, replaceVars: InterpolateFunction) {\n let starredDashboards: Promise<Dashboard[]> = Promise.resolve([]);\n if (options.showStarred) {\n const params = { limit: options.maxItems, starred: 'true' };\n starredDashboards = getBackendSrv().search(params);\n }\n\n let recentDashboards: Promise<Dashboard[]> = Promise.resolve([]);\n let dashIds: number[] = [];\n if (options.showRecentlyViewed) {\n dashIds = take<number>(impressionSrv.getDashboardOpened(), options.maxItems);\n recentDashboards = getBackendSrv().search({ dashboardIds: dashIds, limit: options.maxItems });\n }\n\n let searchedDashboards: Promise<Dashboard[]> = Promise.resolve([]);\n if (options.showSearch) {\n const params = {\n limit: options.maxItems,\n query: replaceVars(options.query, {}, 'text'),\n folderIds: options.folderId,\n tag: options.tags.map((tag: string) => replaceVars(tag, {}, 'text')),\n type: 'dash-db',\n };\n\n searchedDashboards = getBackendSrv().search(params);\n }\n\n const [starred, searched, recent] = await Promise.all([starredDashboards, searchedDashboards, recentDashboards]);\n\n // We deliberately deal with recent dashboards first so that the order of dash IDs is preserved\n let dashMap = new Map<number, Dashboard>();\n for (const dashId of dashIds) {\n const dash = recent.find((d) => d.id === dashId);\n if (dash) {\n dashMap.set(dashId, { ...dash, isRecent: true });\n }\n }\n\n searched.forEach((dash) => {\n if (dashMap.has(dash.id)) {\n dashMap.get(dash.id)!.isSearchResult = true;\n } else {\n dashMap.set(dash.id, { ...dash, isSearchResult: true });\n }\n });\n\n starred.forEach((dash) => {\n if (dashMap.has(dash.id)) {\n dashMap.get(dash.id)!.isStarred = true;\n } else {\n dashMap.set(dash.id, { ...dash, isStarred: true });\n }\n });\n\n return dashMap;\n}\n\nexport function DashList(props: PanelProps<PanelOptions>) {\n const [dashboards, setDashboards] = useState(new Map<number, Dashboard>());\n const dispatch = useDispatch();\n useEffect(() => {\n fetchDashboards(props.options, props.replaceVariables).then((dashes) => {\n setDashboards(dashes);\n });\n }, [props.options, props.replaceVariables, props.renderCounter]);\n\n const toggleDashboardStar = async (e: React.SyntheticEvent, dash: Dashboard) => {\n const { uid, title, url } = dash;\n e.preventDefault();\n e.stopPropagation();\n\n const isStarred = await getDashboardSrv().starDashboard(dash.id.toString(), dash.isStarred);\n const updatedDashboards = new Map(dashboards);\n updatedDashboards.set(dash.id, { ...dash, isStarred });\n setDashboards(updatedDashboards);\n dispatch(setStarred({ id: uid ?? '', title, url, isStarred }));\n };\n\n const [starredDashboards, recentDashboards, searchedDashboards] = useMemo(() => {\n const dashboardList = [...dashboards.values()];\n return [\n dashboardList.filter((dash) => dash.isStarred).sort((a, b) => a.title.localeCompare(b.title)),\n dashboardList.filter((dash) => dash.isRecent),\n dashboardList.filter((dash) => dash.isSearchResult).sort((a, b) => a.title.localeCompare(b.title)),\n ];\n }, [dashboards]);\n\n const { showStarred, showRecentlyViewed, showHeadings, showSearch, layout } = props.options;\n\n const dashboardGroups: DashboardGroup[] = [\n {\n header: 'Starred dashboards',\n dashboards: starredDashboards,\n show: showStarred,\n },\n {\n header: 'Recently viewed dashboards',\n dashboards: recentDashboards,\n show: showRecentlyViewed,\n },\n {\n header: 'Search',\n dashboards: searchedDashboards,\n show: showSearch,\n },\n ];\n\n const css = useStyles2(getStyles);\n\n const renderList = (dashboards: Dashboard[]) => (\n <ul>\n {dashboards.map((dash) => (\n <li className={css.dashlistItem} key={`dash-${dash.id}`}>\n <div className={css.dashlistLink}>\n <div className={css.dashlistLinkBody}>\n <a className={css.dashlistTitle} href={dash.url}>\n {dash.title}\n </a>\n {dash.folderTitle && <div className={css.dashlistFolder}>{dash.folderTitle}</div>}\n </div>\n <IconToggle\n aria-label={`Star dashboard \"${dash.title}\".`}\n className={css.dashlistStar}\n enabled={{ name: 'favorite', type: 'mono' }}\n disabled={{ name: 'star', type: 'default' }}\n checked={dash.isStarred}\n onClick={(e) => toggleDashboardStar(e, dash)}\n />\n </div>\n </li>\n ))}\n </ul>\n );\n\n const renderPreviews = (dashboards: Dashboard[]) => (\n <ul className={css.gridContainer}>\n {dashboards.map((dash) => (\n <li key={dash.uid}>\n <SearchCard item={dash} />\n </li>\n ))}\n </ul>\n );\n\n return (\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n {dashboardGroups.map(\n ({ show, header, dashboards }, i) =>\n show && (\n <div className={css.dashlistSection} key={`dash-group-${i}`}>\n {showHeadings && <h6 className={css.dashlistSectionHeader}>{header}</h6>}\n {layout === PanelLayout.Previews ? renderPreviews(dashboards) : renderList(dashboards)}\n </div>\n )\n )}\n </CustomScrollbar>\n );\n}\n\ninterface IconToggleProps extends Partial<IconProps> {\n enabled: IconProps;\n disabled: IconProps;\n checked: boolean;\n}\n\nfunction IconToggle({\n enabled,\n disabled,\n checked,\n onClick,\n className,\n 'aria-label': ariaLabel,\n ...otherProps\n}: IconToggleProps) {\n const toggleCheckbox = useCallback(\n (e: React.MouseEvent<HTMLInputElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n onClick?.(e);\n },\n [onClick]\n );\n\n const iconPropsOverride = checked ? enabled : disabled;\n const iconProps = { ...otherProps, ...iconPropsOverride };\n const styles = useStyles2(getCheckboxStyles);\n return (\n <label className={styles.wrapper}>\n <input\n type=\"checkbox\"\n defaultChecked={checked}\n onClick={toggleCheckbox}\n className={styles.checkBox}\n aria-label={ariaLabel}\n />\n <Icon className={cx(styles.icon, className)} {...iconProps} />\n </label>\n );\n}\n\nexport const getCheckboxStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n wrapper: css({\n display: 'flex',\n alignSelf: 'center',\n cursor: 'pointer',\n zIndex: 1,\n }),\n checkBox: css({\n appearance: 'none',\n '&:focus-visible + *': {\n ...getFocusStyles(theme),\n borderRadius: theme.shape.borderRadius(1),\n },\n }),\n icon: css({\n marginBottom: 0,\n verticalAlign: 'baseline',\n display: 'flex',\n }),\n };\n});\n","import React from 'react';\n\nimport { PanelModel, PanelPlugin } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { TagsInput } from '@grafana/ui';\n\nimport {\n ALL_FOLDER,\n GENERAL_FOLDER,\n ReadonlyFolderPicker,\n} from '../../../core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker';\n\nimport { DashList } from './DashList';\nimport { defaultPanelOptions, PanelLayout, PanelOptions } from './models.gen';\n\nexport const plugin = new PanelPlugin<PanelOptions>(DashList)\n .setPanelOptions((builder) => {\n if (config.featureToggles.dashboardPreviews) {\n builder.addRadio({\n path: 'layout',\n name: 'Layout',\n defaultValue: PanelLayout.List,\n settings: {\n options: [\n { value: PanelLayout.List, label: 'List' },\n { value: PanelLayout.Previews, label: 'Preview' },\n ],\n },\n });\n }\n\n builder\n .addBooleanSwitch({\n path: 'showStarred',\n name: 'Starred',\n defaultValue: defaultPanelOptions.showStarred,\n })\n .addBooleanSwitch({\n path: 'showRecentlyViewed',\n name: 'Recently viewed',\n defaultValue: defaultPanelOptions.showRecentlyViewed,\n })\n .addBooleanSwitch({\n path: 'showSearch',\n name: 'Search',\n defaultValue: defaultPanelOptions.showSearch,\n })\n .addBooleanSwitch({\n path: 'showHeadings',\n name: 'Show headings',\n defaultValue: defaultPanelOptions.showHeadings,\n })\n .addNumberInput({\n path: 'maxItems',\n name: 'Max items',\n defaultValue: defaultPanelOptions.maxItems,\n })\n .addTextInput({\n path: 'query',\n name: 'Query',\n defaultValue: defaultPanelOptions.query,\n })\n .addCustomEditor({\n path: 'folderId',\n name: 'Folder',\n id: 'folderId',\n defaultValue: undefined,\n editor: function RenderFolderPicker({ value, onChange }) {\n return (\n <ReadonlyFolderPicker\n initialFolderId={value}\n onChange={(folder) => onChange(folder?.id)}\n extraFolders={[ALL_FOLDER, GENERAL_FOLDER]}\n />\n );\n },\n })\n .addCustomEditor({\n id: 'tags',\n path: 'tags',\n name: 'Tags',\n description: '',\n defaultValue: defaultPanelOptions.tags,\n editor(props) {\n return <TagsInput tags={props.value} onChange={props.onChange} />;\n },\n });\n })\n .setMigrationHandler((panel: PanelModel<PanelOptions> & Record<string, any>) => {\n const newOptions = {\n showStarred: panel.options.showStarred ?? panel.starred,\n showRecentlyViewed: panel.options.showRecentlyViewed ?? panel.recent,\n showSearch: panel.options.showSearch ?? panel.search,\n showHeadings: panel.options.showHeadings ?? panel.headings,\n maxItems: panel.options.maxItems ?? panel.limit,\n query: panel.options.query ?? panel.query,\n folderId: panel.options.folderId ?? panel.folderId,\n tags: panel.options.tags ?? panel.tags,\n };\n\n const previousVersion = parseFloat(panel.pluginVersion || '6.1');\n if (previousVersion < 6.3) {\n const oldProps = ['starred', 'recent', 'search', 'headings', 'limit', 'query', 'folderId'];\n oldProps.forEach((prop) => delete panel[prop]);\n }\n\n return newOptions;\n });\n","import React, { Component } from 'react';\nimport { Subscription } from 'rxjs';\n\nimport {\n EventBus,\n LegacyGraphHoverEvent,\n LegacyGraphHoverClearEvent,\n DataHoverEvent,\n DataHoverClearEvent,\n BusEventBase,\n} from '@grafana/data';\nimport { CustomScrollbar } from '@grafana/ui';\n\nimport { DataHoverView } from '../geomap/components/DataHoverView';\n\ninterface Props {\n eventBus: EventBus;\n}\n\ninterface State {\n event?: BusEventBase;\n}\nexport class CursorView extends Component<Props, State> {\n subscription = new Subscription();\n state: State = {};\n\n componentDidMount() {\n const { eventBus } = this.props;\n\n this.subscription.add(\n eventBus.subscribe(DataHoverEvent, (event) => {\n this.setState({ event });\n })\n );\n\n this.subscription.add(\n eventBus.subscribe(DataHoverClearEvent, (event) => {\n this.setState({ event });\n })\n );\n\n this.subscription.add(\n eventBus.subscribe(LegacyGraphHoverEvent, (event) => {\n this.setState({ event });\n })\n );\n\n this.subscription.add(\n eventBus.subscribe(LegacyGraphHoverClearEvent, (event) => {\n this.setState({ event });\n })\n );\n }\n\n componentWillUnmount() {\n this.subscription.unsubscribe();\n }\n\n render() {\n const { event } = this.state;\n if (!event) {\n return <div>no events yet</div>;\n }\n const { type, payload, origin } = event;\n return (\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n <h3>Origin: {(origin as any)?.path}</h3>\n <span>Type: {type}</span>\n {Boolean(payload) && (\n <>\n <pre>{JSON.stringify(payload.point, null, ' ')}</pre>\n {payload.data && (\n <DataHoverView data={payload.data} rowIndex={payload.rowIndex} columnIndex={payload.columnIndex} />\n )}\n </>\n )}\n </CustomScrollbar>\n );\n }\n}\n","import React, { PureComponent } from 'react';\nimport { PartialObserver, Unsubscribable } from 'rxjs';\n\nimport {\n BusEvent,\n CircularVector,\n DataHoverEvent,\n DataHoverClearEvent,\n DataSelectEvent,\n EventBus,\n} from '@grafana/data';\nimport { CustomScrollbar } from '@grafana/ui';\n\ninterface Props {\n eventBus: EventBus;\n}\n\ninterface State {\n isError?: boolean;\n counter: number;\n}\n\ninterface BusEventEx {\n key: number;\n type: string;\n path: string;\n payload: any;\n}\nlet counter = 100;\n\nexport class EventBusLoggerPanel extends PureComponent<Props, State> {\n history = new CircularVector<BusEventEx>({ capacity: 40, append: 'head' });\n subs: Unsubscribable[];\n\n constructor(props: Props) {\n super(props);\n\n this.state = { counter };\n\n const subs: Unsubscribable[] = [];\n subs.push(props.eventBus.getStream(DataHoverEvent).subscribe(this.eventObserver));\n subs.push(props.eventBus.getStream(DataHoverClearEvent).subscribe(this.eventObserver));\n subs.push(props.eventBus.getStream(DataSelectEvent).subscribe(this.eventObserver));\n this.subs = subs;\n }\n\n componentWillUnmount() {\n for (const sub of this.subs) {\n sub.unsubscribe();\n }\n }\n\n eventObserver: PartialObserver<BusEvent> = {\n next: (event: BusEvent) => {\n const origin = event.origin as any;\n this.history.add({\n key: counter++,\n type: event.type,\n path: origin?.path,\n payload: event.payload,\n });\n this.setState({ counter });\n },\n };\n\n render() {\n return (\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n {this.history.map((v, idx) => (\n <div key={v.key}>\n {JSON.stringify(v.path)} {v.type} / X:{JSON.stringify(v.payload.x)} / Y:{JSON.stringify(v.payload.y)}\n </div>\n ))}\n </CustomScrollbar>\n );\n }\n}\n","import React, { Component } from 'react';\n\nimport {\n compareArrayValues,\n compareDataFrameStructures,\n fieldReducers,\n getFieldDisplayName,\n getFrameDisplayName,\n PanelProps,\n ReducerID,\n} from '@grafana/data';\nimport { IconButton } from '@grafana/ui';\n\nimport { DebugPanelOptions, UpdateCounters, UpdateConfig } from './types';\n\ntype Props = PanelProps<DebugPanelOptions>;\n\nexport class RenderInfoViewer extends Component<Props> {\n // Intentionally not state to avoid overhead -- yes, things will be 1 tick behind\n lastRender = Date.now();\n counters: UpdateCounters = {\n render: 0,\n dataChanged: 0,\n schemaChanged: 0,\n };\n\n shouldComponentUpdate(prevProps: Props) {\n const { data, options } = this.props;\n\n if (prevProps.data !== data) {\n this.counters.dataChanged++;\n\n if (options.counters?.schemaChanged) {\n const oldSeries = prevProps.data?.series;\n const series = data.series;\n if (series && oldSeries) {\n const sameStructure = compareArrayValues(series, oldSeries, compareDataFrameStructures);\n if (!sameStructure) {\n this.counters.schemaChanged++;\n }\n }\n }\n }\n return true; // always render?\n }\n\n resetCounters = () => {\n this.counters = {\n render: 0,\n dataChanged: 0,\n schemaChanged: 0,\n };\n this.forceUpdate();\n };\n\n render() {\n const { data, options } = this.props;\n const showCounters = options.counters ?? ({} as UpdateConfig);\n this.counters.render++;\n const now = Date.now();\n const elapsed = now - this.lastRender;\n this.lastRender = now;\n\n const reducer = fieldReducers.get(ReducerID.lastNotNull);\n\n return (\n <div>\n <div>\n <IconButton name=\"step-backward\" title=\"reset counters\" onClick={this.resetCounters} />\n <span>\n {showCounters.render && <span>Render: {this.counters.render} </span>}\n {showCounters.dataChanged && <span>Data: {this.counters.dataChanged} </span>}\n {showCounters.schemaChanged && <span>Schema: {this.counters.schemaChanged} </span>}\n <span>TIME: {elapsed}ms</span>\n </span>\n </div>\n\n {data.series &&\n data.series.map((frame, idx) => (\n <div key={`${idx}/${frame.refId}`}>\n <h4>\n {getFrameDisplayName(frame, idx)} ({frame.length})\n </h4>\n <table className=\"filter-table\">\n <thead>\n <tr>\n <td>Field</td>\n <td>Type</td>\n <td>Last</td>\n </tr>\n </thead>\n <tbody>\n {frame.fields.map((field, idx) => {\n const v = reducer.reduce!(field, false, false)[reducer.id];\n return (\n <tr key={`${idx}/${field.name}`}>\n <td>{getFieldDisplayName(field, frame, data.series)}</td>\n <td>{field.type}</td>\n <td>{`${v}`}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n ))}\n </div>\n );\n }\n}\n","import React, { FormEvent } from 'react';\n\nimport { PanelOptionsEditorProps, PanelProps } from '@grafana/data';\nimport { Field, Input, usePanelContext } from '@grafana/ui';\n\nimport { DebugPanelOptions } from './types';\n\nexport function StateView(props: PanelProps<DebugPanelOptions>) {\n const context = usePanelContext();\n\n const onChangeName = (e: FormEvent<HTMLInputElement>) => {\n context.onInstanceStateChange!({\n name: e.currentTarget.value,\n });\n };\n\n return (\n <>\n <Field label=\"State name\">\n <Input value={context.instanceState?.name ?? ''} onChange={onChangeName} />\n </Field>\n </>\n );\n}\n\nexport function StateViewEditor({ value, context, onChange, item }: PanelOptionsEditorProps<string>) {\n return <div>Current value: {context.instanceState?.name} </div>;\n}\n","export type UpdateConfig = {\n [K in keyof UpdateCounters]: boolean;\n};\n\nexport type UpdateCounters = {\n render: number;\n dataChanged: number;\n schemaChanged: number;\n};\n\nexport enum DebugMode {\n Render = 'render',\n Events = 'events',\n Cursor = 'cursor',\n State = 'State',\n ThrowError = 'ThrowError',\n}\n\nexport interface DebugPanelOptions {\n mode: DebugMode;\n counters?: UpdateConfig;\n}\n","import React, { Component } from 'react';\n\nimport { PanelProps } from '@grafana/data';\n\nimport { CursorView } from './CursorView';\nimport { EventBusLoggerPanel } from './EventBusLogger';\nimport { RenderInfoViewer } from './RenderInfoViewer';\nimport { StateView } from './StateView';\nimport { DebugPanelOptions, DebugMode } from './types';\n\ntype Props = PanelProps<DebugPanelOptions>;\n\nexport class DebugPanel extends Component<Props> {\n render() {\n const { options } = this.props;\n\n switch (options.mode) {\n case DebugMode.Events:\n return <EventBusLoggerPanel eventBus={this.props.eventBus} />;\n case DebugMode.Cursor:\n return <CursorView eventBus={this.props.eventBus} />;\n case DebugMode.State:\n return <StateView {...this.props} />;\n case DebugMode.ThrowError:\n throw new Error('I failed you and for that i am deeply sorry');\n default:\n return <RenderInfoViewer {...this.props} />;\n }\n }\n}\n","import { PanelPlugin } from '@grafana/data';\n\nimport { DebugPanel } from './DebugPanel';\nimport { StateViewEditor } from './StateView';\nimport { DebugMode, DebugPanelOptions } from './types';\n\nexport const plugin = new PanelPlugin<DebugPanelOptions>(DebugPanel).useFieldConfig().setPanelOptions((builder) => {\n builder\n .addSelect({\n path: 'mode',\n name: 'Mode',\n defaultValue: DebugMode.Render,\n settings: {\n options: [\n { label: 'Render', value: DebugMode.Render },\n { label: 'Events', value: DebugMode.Events },\n { label: 'Cursor', value: DebugMode.Cursor },\n { label: 'Cursor', value: DebugMode.Cursor },\n { label: 'Share state', value: DebugMode.State },\n { label: 'Throw error', value: DebugMode.ThrowError },\n ],\n },\n })\n .addCustomEditor({\n id: 'stateView',\n path: 'stateView',\n name: 'State view',\n defaultValue: '',\n showIf: ({ mode }) => mode === DebugMode.State,\n editor: StateViewEditor,\n })\n .addBooleanSwitch({\n path: 'counters.render',\n name: 'Render Count',\n defaultValue: true,\n showIf: ({ mode }) => mode === DebugMode.Render,\n })\n .addBooleanSwitch({\n path: 'counters.dataChanged',\n name: 'Data Changed Count',\n defaultValue: true,\n showIf: ({ mode }) => mode === DebugMode.Render,\n })\n .addBooleanSwitch({\n path: 'counters.schemaChanged',\n name: 'Schema Changed Count',\n defaultValue: true,\n showIf: ({ mode }) => mode === DebugMode.Render,\n })\n .addDashboardPicker({\n path: 'dashboardUID',\n name: 'Dashboard',\n settings: {\n placeholder: 'Select dashboard',\n isClearable: true,\n },\n });\n});\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory } from '@grafana/ui';\n\nexport const cardStyle = stylesFactory((theme: GrafanaTheme, complete: boolean) => {\n const completeGradient = 'linear-gradient(to right, #5182CC 0%, #245BAF 100%)';\n const darkThemeGradients = complete ? completeGradient : 'linear-gradient(to right, #f05a28 0%, #fbca0a 100%)';\n const lightThemeGradients = complete ? completeGradient : 'linear-gradient(to right, #FBCA0A 0%, #F05A28 100%)';\n\n const borderGradient = theme.isDark ? darkThemeGradients : lightThemeGradients;\n\n return `\n background-color: ${theme.colors.bg2};\n margin-right: ${theme.spacing.xl};\n border: 1px solid ${theme.colors.border1};\n border-bottom-left-radius: ${theme.border.radius.md};\n border-bottom-right-radius: ${theme.border.radius.md};\n position: relative;\n max-height: 230px;\n\n @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n margin-right: ${theme.spacing.md};\n }\n &::before {\n display: block;\n content: ' ';\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n top: 0;\n background-image: ${borderGradient};\n }\n`;\n});\n\nexport const iconStyle = stylesFactory(\n (theme: GrafanaTheme, complete: boolean) => css`\n color: ${complete ? theme.palette.blue95 : theme.colors.textWeak};\n\n @media only screen and (max-width: ${theme.breakpoints.sm}) {\n display: none;\n }\n `\n);\n\nexport const cardContent = css`\n padding: 16px;\n`;\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, stylesFactory, useTheme } from '@grafana/ui';\n\nimport { Card } from '../types';\n\nimport { cardContent, cardStyle, iconStyle } from './sharedStyles';\n\ninterface Props {\n card: Card;\n}\n\nexport const DocsCard: FC<Props> = ({ card }) => {\n const theme = useTheme();\n const styles = getStyles(theme, card.done);\n\n return (\n <div className={styles.card}>\n <div className={cardContent}>\n <a href={`${card.href}?utm_source=grafana_gettingstarted`} className={styles.url}>\n <div className={styles.heading}>{card.done ? 'complete' : card.heading}</div>\n <h4 className={styles.title}>{card.title}</h4>\n <div>\n <Icon className={iconStyle(theme, card.done)} name={card.icon} size=\"xxl\" />\n </div>\n </a>\n </div>\n <a\n href={`${card.learnHref}?utm_source=grafana_gettingstarted`}\n className={styles.learnUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Learn how in the docs <Icon name=\"external-link-alt\" />\n </a>\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, complete: boolean) => {\n return {\n card: css`\n ${cardStyle(theme, complete)}\n\n min-width: 230px;\n\n @media only screen and (max-width: ${theme.breakpoints.md}) {\n min-width: 192px;\n }\n `,\n heading: css`\n text-transform: uppercase;\n color: ${complete ? theme.palette.blue95 : '#FFB357'};\n margin-bottom: ${theme.spacing.md};\n `,\n title: css`\n margin-bottom: ${theme.spacing.md};\n `,\n url: css`\n display: inline-block;\n `,\n learnUrl: css`\n border-top: 1px solid ${theme.colors.border1};\n position: absolute;\n bottom: 0;\n padding: 8px 16px;\n width: 100%;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { FC, MouseEvent } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, stylesFactory, useTheme } from '@grafana/ui';\nimport store from 'app/core/store';\n\nimport { TutorialCardType } from '../types';\n\nimport { cardContent, cardStyle, iconStyle } from './sharedStyles';\n\ninterface Props {\n card: TutorialCardType;\n}\n\nexport const TutorialCard: FC<Props> = ({ card }) => {\n const theme = useTheme();\n const styles = getStyles(theme, card.done);\n\n return (\n <a className={styles.card} onClick={(event: MouseEvent<HTMLAnchorElement>) => handleTutorialClick(event, card)}>\n <div className={cardContent}>\n <div className={styles.type}>{card.type}</div>\n <div className={styles.heading}>{card.done ? 'complete' : card.heading}</div>\n <h4 className={styles.cardTitle}>{card.title}</h4>\n <div className={styles.info}>{card.info}</div>\n <Icon className={iconStyle(theme, card.done)} name={card.icon} size=\"xxl\" />\n </div>\n </a>\n );\n};\n\nconst handleTutorialClick = (event: MouseEvent<HTMLAnchorElement>, card: TutorialCardType) => {\n event.preventDefault();\n const isSet = store.get(card.key);\n if (!isSet) {\n store.set(card.key, true);\n }\n window.open(`${card.href}?utm_source=grafana_gettingstarted`, '_blank');\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme, complete: boolean) => {\n return {\n card: css`\n ${cardStyle(theme, complete)}\n width: 460px;\n min-width: 460px;\n\n @media only screen and (max-width: ${theme.breakpoints.xl}) {\n min-width: 368px;\n }\n\n @media only screen and (max-width: ${theme.breakpoints.lg}) {\n min-width: 272px;\n }\n `,\n type: css`\n color: ${theme.colors.textBlue};\n text-transform: uppercase;\n `,\n heading: css`\n text-transform: uppercase;\n color: ${theme.colors.textBlue};\n margin-bottom: ${theme.spacing.sm};\n `,\n cardTitle: css`\n margin-bottom: ${theme.spacing.md};\n `,\n info: css`\n margin-bottom: ${theme.spacing.md};\n `,\n status: css`\n display: flex;\n justify-content: flex-end;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '@grafana/ui';\n\nimport { Card, SetupStep, TutorialCardType } from '../types';\n\nimport { DocsCard } from './DocsCard';\nimport { TutorialCard } from './TutorialCard';\n\ninterface Props {\n step: SetupStep;\n}\n\nexport const Step: FC<Props> = ({ step }) => {\n const theme = useTheme();\n const styles = getStyles(theme);\n\n return (\n <div className={styles.setup}>\n <div className={styles.info}>\n <h2 className={styles.title}>{step.title}</h2>\n <p>{step.info}</p>\n </div>\n <div className={styles.cards}>\n {step.cards.map((card: Card | TutorialCardType, index: number) => {\n const key = `${card.title}-${index}`;\n if (card.type === 'tutorial') {\n return <TutorialCard key={key} card={card as TutorialCardType} />;\n }\n return <DocsCard key={key} card={card} />;\n })}\n </div>\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n setup: css`\n display: flex;\n width: 95%;\n `,\n info: css`\n width: 172px;\n margin-right: 5%;\n\n @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n margin-right: ${theme.spacing.xl};\n }\n @media only screen and (max-width: ${theme.breakpoints.sm}) {\n display: none;\n }\n `,\n title: css`\n color: ${theme.palette.blue95};\n `,\n cards: css`\n overflow-x: scroll;\n overflow-y: hidden;\n width: 100%;\n display: flex;\n justify-content: center;\n\n @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n justify-content: flex-start;\n }\n `,\n };\n});\n","import { getBackendSrv } from 'app/core/services/backend_srv';\nimport store from 'app/core/store';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport { SetupStep } from './types';\n\nconst step1TutorialTitle = 'Grafana fundamentals';\nconst step2TutorialTitle = 'Create users and teams';\nconst keyPrefix = 'getting.started.';\nconst step1Key = `${keyPrefix}${step1TutorialTitle.replace(' ', '-').trim().toLowerCase()}`;\nconst step2Key = `${keyPrefix}${step2TutorialTitle.replace(' ', '-').trim().toLowerCase()}`;\n\nexport const getSteps = (): SetupStep[] => [\n {\n heading: 'Welcome to Grafana',\n subheading: 'The steps below will guide you to quickly finish setting up your Grafana installation.',\n title: 'Basic',\n info: 'The steps below will guide you to quickly finish setting up your Grafana installation.',\n done: false,\n cards: [\n {\n type: 'tutorial',\n heading: 'Data source and dashboards',\n title: step1TutorialTitle,\n info: 'Set up and understand Grafana if you have no prior experience. This tutorial guides you through the entire process and covers the “Data source” and “Dashboards” steps to the right.',\n href: 'https://grafana.com/tutorials/grafana-fundamentals',\n icon: 'grafana',\n check: () => Promise.resolve(store.get(step1Key)),\n key: step1Key,\n done: false,\n },\n {\n type: 'docs',\n title: 'Add your first data source',\n heading: 'data sources',\n icon: 'database',\n learnHref: 'https://grafana.com/docs/grafana/latest/features/datasources/add-a-data-source',\n href: 'datasources/new',\n check: () => {\n return new Promise((resolve) => {\n resolve(\n getDatasourceSrv()\n .getMetricSources()\n .filter((item) => {\n return item.meta.builtIn !== true;\n }).length > 0\n );\n });\n },\n done: false,\n },\n {\n type: 'docs',\n heading: 'dashboards',\n title: 'Create your first dashboard',\n icon: 'apps',\n href: 'dashboard/new',\n learnHref: 'https://grafana.com/docs/grafana/latest/guides/getting_started/#create-a-dashboard',\n check: async () => {\n const result = await getBackendSrv().search({ limit: 1 });\n return result.length > 0;\n },\n done: false,\n },\n ],\n },\n {\n heading: 'Setup complete!',\n subheading:\n 'All necessary steps to use Grafana are done. Now tackle advanced steps or make the best use of this home dashboard – it is, after all, a fully customizable dashboard – and remove this panel.',\n title: 'Advanced',\n info: ' Manage your users and teams and add plugins. These steps are optional',\n done: false,\n cards: [\n {\n type: 'tutorial',\n heading: 'Users',\n title: 'Create users and teams',\n info: 'Learn to organize your users in teams and manage resource access and roles.',\n href: 'https://grafana.com/tutorials/create-users-and-teams',\n icon: 'users-alt',\n key: step2Key,\n check: () => Promise.resolve(store.get(step2Key)),\n done: false,\n },\n {\n type: 'docs',\n heading: 'plugins',\n title: 'Find and install plugins',\n learnHref: 'https://grafana.com/docs/grafana/latest/plugins/installation',\n href: 'plugins',\n icon: 'plug',\n check: async () => {\n const plugins = await getBackendSrv().get('/api/plugins', { embedded: 0, core: 0 });\n return Promise.resolve(plugins.length > 0);\n },\n done: false,\n },\n ],\n },\n];\n","// Libraries\nimport { css, cx } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { PanelProps } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Button, Spinner, stylesFactory } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\n\nimport { Step } from './components/Step';\nimport { getSteps } from './steps';\nimport { Card, SetupStep } from './types';\n\ninterface State {\n checksDone: boolean;\n currentStep: number;\n steps: SetupStep[];\n}\n\nexport class GettingStarted extends PureComponent<PanelProps, State> {\n state = {\n checksDone: false,\n currentStep: 0,\n steps: getSteps(),\n };\n\n async componentDidMount() {\n const { steps } = this.state;\n\n const checkedStepsPromises: Array<Promise<SetupStep>> = steps.map(async (step: SetupStep) => {\n const checkedCardsPromises: Array<Promise<Card>> = step.cards.map((card: Card) => {\n return card.check().then((passed) => {\n return { ...card, done: passed };\n });\n });\n const checkedCards = await Promise.all(checkedCardsPromises);\n return {\n ...step,\n done: checkedCards.every((c) => c.done),\n cards: checkedCards,\n };\n });\n\n const checkedSteps = await Promise.all(checkedStepsPromises);\n\n this.setState({\n currentStep: !checkedSteps[0].done ? 0 : 1,\n steps: checkedSteps,\n checksDone: true,\n });\n }\n\n onForwardClick = () => {\n this.setState((prevState) => ({\n currentStep: prevState.currentStep + 1,\n }));\n };\n\n onPreviousClick = () => {\n this.setState((prevState) => ({\n currentStep: prevState.currentStep - 1,\n }));\n };\n\n dismiss = () => {\n const { id } = this.props;\n const dashboard = getDashboardSrv().getCurrent();\n const panel = dashboard?.getPanelById(id);\n\n dashboard?.removePanel(panel!);\n\n backendSrv\n .request({\n method: 'PUT',\n url: '/api/user/helpflags/1',\n showSuccessAlert: false,\n })\n .then((res: any) => {\n contextSrv.user.helpFlags1 = res.helpFlags1;\n });\n };\n\n render() {\n const { checksDone, currentStep, steps } = this.state;\n const styles = getStyles();\n const step = steps[currentStep];\n\n return (\n <div className={styles.container}>\n {!checksDone ? (\n <div className={styles.loading}>\n <div className={styles.loadingText}>Checking completed setup steps</div>\n <Spinner size={24} inline />\n </div>\n ) : (\n <>\n <div className={styles.dismiss}>\n <div onClick={this.dismiss}>Remove this panel</div>\n </div>\n {currentStep === steps.length - 1 && (\n <div className={cx(styles.backForwardButtons, styles.previous)} onClick={this.onPreviousClick}>\n <Button aria-label=\"To advanced tutorials\" icon=\"angle-left\" variant=\"secondary\" />\n </div>\n )}\n <div className={styles.content}>\n <Step step={step} />\n </div>\n {currentStep < steps.length - 1 && (\n <div className={cx(styles.backForwardButtons, styles.forward)} onClick={this.onForwardClick}>\n <Button aria-label=\"To basic tutorials\" icon=\"angle-right\" variant=\"secondary\" />\n </div>\n )}\n </>\n )}\n </div>\n );\n }\n}\n\nconst getStyles = stylesFactory(() => {\n const { theme } = config;\n return {\n container: css`\n display: flex;\n flex-direction: column;\n height: 100%;\n // background: url(public/img/getting_started_bg_${theme.type}.svg) no-repeat;\n background-size: cover;\n padding: ${theme.spacing.xl} ${theme.spacing.md} 0;\n `,\n content: css`\n label: content;\n display: flex;\n justify-content: center;\n\n @media only screen and (max-width: ${theme.breakpoints.xxl}) {\n margin-left: ${theme.spacing.lg};\n justify-content: flex-start;\n }\n `,\n header: css`\n label: header;\n margin-bottom: ${theme.spacing.lg};\n display: flex;\n flex-direction: column;\n\n @media only screen and (min-width: ${theme.breakpoints.lg}) {\n flex-direction: row;\n }\n `,\n headerLogo: css`\n height: 58px;\n padding-right: ${theme.spacing.md};\n display: none;\n\n @media only screen and (min-width: ${theme.breakpoints.md}) {\n display: block;\n }\n `,\n heading: css`\n label: heading;\n margin-right: ${theme.spacing.lg};\n margin-bottom: ${theme.spacing.lg};\n flex-grow: 1;\n display: flex;\n\n @media only screen and (min-width: ${theme.breakpoints.md}) {\n margin-bottom: 0;\n }\n `,\n backForwardButtons: css`\n position: absolute;\n bottom: 50%;\n top: 50%;\n height: 50px;\n `,\n previous: css`\n left: 10px;\n\n @media only screen and (max-width: ${theme.breakpoints.md}) {\n left: 0;\n }\n `,\n forward: css`\n right: 10px;\n\n @media only screen and (max-width: ${theme.breakpoints.md}) {\n right: 0;\n }\n `,\n dismiss: css`\n display: flex;\n justify-content: flex-end;\n cursor: pointer;\n text-decoration: underline;\n margin-right: ${theme.spacing.md};\n margin-bottom: ${theme.spacing.sm};\n `,\n loading: css`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n `,\n loadingText: css`\n margin-right: ${theme.spacing.sm};\n `,\n };\n});\n","import { PanelPlugin } from '@grafana/data';\n\nimport { GettingStarted } from './GettingStarted';\n\n// Simplest possible panel plugin\nexport const plugin = new PanelPlugin(GettingStarted).setNoPadding();\n","import React from 'react';\nimport uPlot, { AlignedData } from 'uplot';\n\nimport {\n DataFrame,\n formattedValueToString,\n getFieldColorModeForField,\n getFieldSeriesColor,\n GrafanaTheme2,\n} from '@grafana/data';\nimport {\n histogramBucketSizes,\n histogramFrameBucketMaxFieldName,\n} from '@grafana/data/src/transformations/transformers/histogram';\nimport { VizLegendOptions, ScaleDistribution, AxisPlacement, ScaleDirection, ScaleOrientation } from '@grafana/schema';\nimport {\n Themeable2,\n UPlotConfigBuilder,\n UPlotChart,\n VizLayout,\n PlotLegend,\n measureText,\n UPLOT_AXIS_FONT_SIZE,\n} from '@grafana/ui';\n\nimport { PanelOptions } from './models.gen';\n\nfunction incrRoundDn(num: number, incr: number) {\n return Math.floor(num / incr) * incr;\n}\n\nfunction incrRoundUp(num: number, incr: number) {\n return Math.ceil(num / incr) * incr;\n}\n\nexport interface HistogramProps extends Themeable2 {\n options: PanelOptions; // used for diff\n alignedFrame: DataFrame; // This could take HistogramFields\n bucketSize: number;\n width: number;\n height: number;\n structureRev?: number; // a number that will change when the frames[] structure changes\n legend: VizLegendOptions;\n rawSeries?: DataFrame[];\n children?: (builder: UPlotConfigBuilder, frame: DataFrame) => React.ReactNode;\n}\n\nexport function getBucketSize(frame: DataFrame) {\n // assumes BucketMin is fields[0] and BucktMax is fields[1]\n return frame.fields[1].values.get(0) - frame.fields[0].values.get(0);\n}\n\nconst prepConfig = (frame: DataFrame, theme: GrafanaTheme2) => {\n // todo: scan all values in BucketMin and BucketMax fields to assert if uniform bucketSize\n\n let builder = new UPlotConfigBuilder();\n\n // assumes BucketMin is fields[0] and BucktMax is fields[1]\n let bucketSize = getBucketSize(frame);\n\n // splits shifter, to ensure splits always start at first bucket\n let xSplits: uPlot.Axis.Splits = (u, axisIdx, scaleMin, scaleMax, foundIncr, foundSpace) => {\n /** @ts-ignore */\n let minSpace = u.axes[axisIdx]._space;\n let bucketWidth = u.valToPos(u.data[0][0] + bucketSize, 'x') - u.valToPos(u.data[0][0], 'x');\n\n let firstSplit = u.data[0][0];\n let lastSplit = u.data[0][u.data[0].length - 1] + bucketSize;\n\n let splits = [];\n let skip = Math.ceil(minSpace / bucketWidth);\n\n for (let i = 0, s = firstSplit; s <= lastSplit; i++, s += bucketSize) {\n !(i % skip) && splits.push(s);\n }\n\n return splits;\n };\n\n builder.addScale({\n scaleKey: 'x', // bukkits\n isTime: false,\n distribution: ScaleDistribution.Linear,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n range: (u, wantedMin, wantedMax) => {\n let fullRangeMin = u.data[0][0];\n let fullRangeMax = u.data[0][u.data[0].length - 1];\n\n // snap to bucket divisors...\n\n if (wantedMax === fullRangeMax) {\n wantedMax += bucketSize;\n } else {\n wantedMax = incrRoundUp(wantedMax, bucketSize);\n }\n\n if (wantedMin > fullRangeMin) {\n wantedMin = incrRoundDn(wantedMin, bucketSize);\n }\n\n return [wantedMin, wantedMax];\n },\n });\n\n builder.addScale({\n scaleKey: 'y', // counts\n isTime: false,\n distribution: ScaleDistribution.Linear,\n orientation: ScaleOrientation.Vertical,\n direction: ScaleDirection.Up,\n });\n\n const fmt = frame.fields[0].display!;\n const xAxisFormatter = (v: number) => {\n return formattedValueToString(fmt(v));\n };\n\n builder.addAxis({\n scaleKey: 'x',\n isTime: false,\n placement: AxisPlacement.Bottom,\n incrs: histogramBucketSizes,\n splits: xSplits,\n values: (u: uPlot, splits: any[]) => {\n const tickLabels = splits.map(xAxisFormatter);\n\n const maxWidth = tickLabels.reduce(\n (curMax, label) => Math.max(measureText(label, UPLOT_AXIS_FONT_SIZE).width, curMax),\n 0\n );\n\n const labelSpacing = 10;\n const maxCount = u.bbox.width / ((maxWidth + labelSpacing) * devicePixelRatio);\n const keepMod = Math.ceil(tickLabels.length / maxCount);\n\n return tickLabels.map((label, i) => (i % keepMod === 0 ? label : null));\n },\n //incrs: () => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((mult) => mult * bucketSize),\n //splits: config.xSplits,\n //values: config.xValues,\n //grid: false,\n //ticks: false,\n //gap: 15,\n theme,\n });\n\n // assumes BucketMax is [1]\n let countField = frame.fields[2];\n let dispY = countField.display;\n\n builder.addAxis({\n scaleKey: 'y',\n isTime: false,\n placement: AxisPlacement.Left,\n formatValue: (v, decimals) => formattedValueToString(dispY!(v, countField.config.decimals ?? decimals)),\n //splits: config.xSplits,\n //values: config.xValues,\n //grid: false,\n //ticks: false,\n //gap: 15,\n theme,\n });\n\n builder.setCursor({\n points: { show: false },\n drag: {\n x: true,\n y: false,\n setScale: true,\n },\n });\n\n let pathBuilder = uPlot.paths.bars!({ align: 1, size: [1, Infinity] });\n\n let seriesIndex = 0;\n\n // assumes BucketMax is [1]\n for (let i = 2; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n\n field.state = field.state ?? {};\n field.state.seriesIndex = seriesIndex++;\n\n const customConfig = { ...field.config.custom };\n\n const scaleKey = 'y';\n const colorMode = getFieldColorModeForField(field);\n const scaleColor = getFieldSeriesColor(field, theme);\n const seriesColor = scaleColor.color;\n\n builder.addSeries({\n scaleKey,\n lineWidth: customConfig.lineWidth,\n lineColor: seriesColor,\n //lineStyle: customConfig.lineStyle,\n fillOpacity: customConfig.fillOpacity,\n theme,\n colorMode,\n pathBuilder,\n //pointsBuilder: config.drawPoints,\n show: !customConfig.hideFrom?.vis,\n gradientMode: customConfig.gradientMode,\n thresholds: field.config.thresholds,\n\n hardMin: field.config.min,\n hardMax: field.config.max,\n softMin: customConfig.axisSoftMin,\n softMax: customConfig.axisSoftMax,\n\n // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n dataFrameFieldIndex: {\n fieldIndex: 1,\n frameIndex: i - 2,\n },\n });\n }\n\n return builder;\n};\n\nconst preparePlotData = (frame: DataFrame) => {\n let data = [];\n\n for (const field of frame.fields) {\n if (field.name !== histogramFrameBucketMaxFieldName) {\n data.push(field.values.toArray());\n }\n }\n\n // uPlot's bars pathBuilder will draw rects even if 0 (to distinguish them from nulls)\n // but for histograms we want to omit them, so remap 0s -> nulls\n for (let i = 1; i < data.length; i++) {\n let counts = data[i];\n for (let j = 0; j < counts.length; j++) {\n if (counts[j] === 0) {\n counts[j] = null;\n }\n }\n }\n\n return data as AlignedData;\n};\n\ninterface State {\n alignedData: AlignedData;\n config?: UPlotConfigBuilder;\n}\n\nexport class Histogram extends React.Component<HistogramProps, State> {\n constructor(props: HistogramProps) {\n super(props);\n this.state = this.prepState(props);\n }\n\n prepState(props: HistogramProps, withConfig = true) {\n let state: State = null as any;\n\n const { alignedFrame } = props;\n if (alignedFrame) {\n state = {\n alignedData: preparePlotData(alignedFrame),\n };\n\n if (withConfig) {\n state.config = prepConfig(alignedFrame, this.props.theme);\n }\n }\n\n return state;\n }\n\n renderLegend(config: UPlotConfigBuilder) {\n const { legend } = this.props;\n if (!config || legend.showLegend === false || !this.props.rawSeries) {\n return null;\n }\n\n return <PlotLegend data={this.props.rawSeries} config={config} maxHeight=\"35%\" maxWidth=\"60%\" {...legend} />;\n }\n\n componentDidUpdate(prevProps: HistogramProps) {\n const { structureRev, alignedFrame, bucketSize } = this.props;\n\n if (alignedFrame !== prevProps.alignedFrame) {\n let newState = this.prepState(this.props, false);\n\n if (newState) {\n const shouldReconfig =\n bucketSize !== prevProps.bucketSize ||\n this.props.options !== prevProps.options ||\n this.state.config === undefined ||\n structureRev !== prevProps.structureRev ||\n !structureRev;\n\n if (shouldReconfig) {\n newState.config = prepConfig(alignedFrame, this.props.theme);\n }\n }\n\n newState && this.setState(newState);\n }\n }\n\n render() {\n const { width, height, children, alignedFrame } = this.props;\n const { config } = this.state;\n\n if (!config) {\n return null;\n }\n\n return (\n <VizLayout width={width} height={height} legend={this.renderLegend(config)}>\n {(vizWidth: number, vizHeight: number) => (\n <UPlotChart\n config={this.state.config!}\n data={this.state.alignedData}\n width={vizWidth}\n height={vizHeight}\n timeRange={null as any}\n >\n {children ? children(config, alignedFrame) : null}\n </UPlotChart>\n )}\n </VizLayout>\n );\n }\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// NOTE: This file will be auto generated from models.cue\n// It is currenty hand written but will serve as the target for cuetsy\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nimport {\n LegendDisplayMode,\n OptionsWithLegend,\n OptionsWithTooltip,\n TooltipDisplayMode,\n GraphGradientMode,\n HideableFieldConfig,\n SortOrder,\n} from '@grafana/schema';\n\nexport const modelVersion = Object.freeze([1, 0]);\n\nexport interface PanelOptions extends OptionsWithLegend, OptionsWithTooltip {\n bucketSize?: number;\n bucketOffset?: number;\n combine?: boolean;\n}\n\nexport const defaultPanelOptions: PanelOptions = {\n bucketOffset: 0,\n legend: {\n displayMode: LegendDisplayMode.List,\n showLegend: true,\n placement: 'bottom',\n calcs: [],\n },\n tooltip: {\n mode: TooltipDisplayMode.Multi,\n sort: SortOrder.None,\n },\n};\n\n/**\n * @alpha\n */\nexport interface PanelFieldConfig extends HideableFieldConfig {\n lineWidth?: number; // 0\n fillOpacity?: number; // 100\n gradientMode?: GraphGradientMode;\n}\n\n/**\n * @alpha\n */\nexport const defaultPanelFieldConfig: PanelFieldConfig = {\n lineWidth: 1,\n fillOpacity: 80,\n //gradientMode: GraphGradientMode.None,\n};\n","import React, { useMemo } from 'react';\n\nimport { PanelProps, buildHistogram, getHistogramFields } from '@grafana/data';\nimport { histogramFieldsToFrame } from '@grafana/data/src/transformations/transformers/histogram';\nimport { useTheme2 } from '@grafana/ui';\n\nimport { Histogram, getBucketSize } from './Histogram';\nimport { PanelOptions } from './models.gen';\n\ntype Props = PanelProps<PanelOptions>;\n\nexport const HistogramPanel: React.FC<Props> = ({ data, options, width, height }) => {\n const theme = useTheme2();\n\n const histogram = useMemo(() => {\n if (!data?.series?.length) {\n return undefined;\n }\n if (data.series.length === 1) {\n const info = getHistogramFields(data.series[0]);\n if (info) {\n return histogramFieldsToFrame(info);\n }\n }\n const hist = buildHistogram(data.series, options);\n if (!hist) {\n return undefined;\n }\n\n return histogramFieldsToFrame(hist, theme);\n }, [data.series, options, theme]);\n\n if (!histogram || !histogram.fields.length) {\n return (\n <div className=\"panel-empty\">\n <p>No histogram found in response</p>\n </div>\n );\n }\n\n const bucketSize = getBucketSize(histogram);\n\n return (\n <Histogram\n options={options}\n theme={theme}\n legend={options.legend}\n rawSeries={data.series}\n structureRev={data.structureRev}\n width={width}\n height={height}\n alignedFrame={histogram}\n bucketSize={bucketSize}\n >\n {(config, alignedFrame) => {\n return null; // <TooltipPlugin data={alignedFrame} config={config} mode={options.tooltip.mode} timeZone={timeZone} />;\n }}\n </Histogram>\n );\n};\n","import { DataFrame, FieldType } from '@grafana/data';\nimport {\n histogramFrameBucketMinFieldName,\n histogramFrameBucketMaxFieldName,\n} from '@grafana/data/src/transformations/transformers/histogram';\n\nexport function originalDataHasHistogram(frames?: DataFrame[]): boolean {\n if (frames?.length !== 1) {\n return false;\n }\n const frame = frames[0];\n if (frame.fields.length < 3) {\n return false;\n }\n\n if (\n frame.fields[0].name !== histogramFrameBucketMinFieldName ||\n frame.fields[1].name !== histogramFrameBucketMaxFieldName\n ) {\n return false;\n }\n for (const field of frame.fields) {\n if (field.type !== FieldType.number) {\n return false;\n }\n }\n\n return true;\n}\n","import { FieldColorModeId, FieldConfigProperty, PanelPlugin } from '@grafana/data';\nimport { histogramFieldInfo } from '@grafana/data/src/transformations/transformers/histogram';\nimport { commonOptionsBuilder, graphFieldOptions } from '@grafana/ui';\n\nimport { HistogramPanel } from './HistogramPanel';\nimport { PanelFieldConfig, PanelOptions, defaultPanelFieldConfig, defaultPanelOptions } from './models.gen';\nimport { originalDataHasHistogram } from './utils';\n\nexport const plugin = new PanelPlugin<PanelOptions, PanelFieldConfig>(HistogramPanel)\n .setPanelOptions((builder) => {\n builder\n .addCustomEditor({\n id: '__calc__',\n path: '__calc__',\n name: 'Values',\n description: 'Showing frequencies that are calculated in the query',\n editor: () => null, // empty editor\n showIf: (opts, data) => originalDataHasHistogram(data),\n })\n .addNumberInput({\n path: 'bucketSize',\n name: histogramFieldInfo.bucketSize.name,\n description: histogramFieldInfo.bucketSize.description,\n settings: {\n placeholder: 'Auto',\n min: 0,\n },\n defaultValue: defaultPanelOptions.bucketSize,\n showIf: (opts, data) => !originalDataHasHistogram(data),\n })\n .addNumberInput({\n path: 'bucketOffset',\n name: histogramFieldInfo.bucketOffset.name,\n description: histogramFieldInfo.bucketOffset.description,\n settings: {\n placeholder: '0',\n min: 0,\n },\n defaultValue: defaultPanelOptions.bucketOffset,\n showIf: (opts, data) => !originalDataHasHistogram(data),\n })\n .addBooleanSwitch({\n path: 'combine',\n name: histogramFieldInfo.combine.name,\n description: histogramFieldInfo.combine.description,\n defaultValue: defaultPanelOptions.combine,\n showIf: (opts, data) => !originalDataHasHistogram(data),\n });\n\n // commonOptionsBuilder.addTooltipOptions(builder);\n commonOptionsBuilder.addLegendOptions(builder);\n })\n .useFieldConfig({\n standardOptions: {\n [FieldConfigProperty.Color]: {\n settings: {\n byValueSupport: true,\n },\n defaultValue: {\n mode: FieldColorModeId.PaletteClassic,\n },\n },\n },\n useCustomConfig: (builder) => {\n const cfg = defaultPanelFieldConfig;\n\n builder\n .addSliderInput({\n path: 'lineWidth',\n name: 'Line width',\n defaultValue: cfg.lineWidth,\n settings: {\n min: 0,\n max: 10,\n step: 1,\n },\n })\n .addSliderInput({\n path: 'fillOpacity',\n name: 'Fill opacity',\n defaultValue: cfg.fillOpacity,\n settings: {\n min: 0,\n max: 100,\n step: 1,\n },\n })\n .addRadio({\n path: 'gradientMode',\n name: 'Gradient mode',\n defaultValue: graphFieldOptions.fillGradient[0].value,\n settings: {\n options: graphFieldOptions.fillGradient,\n },\n });\n\n commonOptionsBuilder.addHideFrom(builder);\n },\n });\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport {\n LiveChannelScope,\n LiveChannelAddress,\n SelectableValue,\n StandardEditorProps,\n GrafanaTheme,\n} from '@grafana/data';\nimport { Select, Alert, Label, stylesFactory } from '@grafana/ui';\nimport { config } from 'app/core/config';\n\nimport { LivePanelOptions } from './types';\n\ntype Props = StandardEditorProps<LiveChannelAddress, any, LivePanelOptions>;\n\nconst scopes: Array<SelectableValue<LiveChannelScope>> = [\n { label: 'Grafana', value: LiveChannelScope.Grafana, description: 'Core grafana live features' },\n { label: 'Data Sources', value: LiveChannelScope.DataSource, description: 'Data sources with live support' },\n { label: 'Plugins', value: LiveChannelScope.Plugin, description: 'Plugins with live support' },\n];\n\ninterface State {\n namespaces: Array<SelectableValue<string>>;\n paths: Array<SelectableValue<string>>;\n}\n\nexport class LiveChannelEditor extends PureComponent<Props, State> {\n state: State = {\n namespaces: [],\n paths: [],\n };\n\n async componentDidMount() {\n this.updateSelectOptions();\n }\n\n async componentDidUpdate(oldProps: Props) {\n if (this.props.value !== oldProps.value) {\n this.updateSelectOptions();\n }\n }\n\n async updateSelectOptions() {\n this.setState({\n namespaces: [],\n paths: [],\n });\n }\n\n onScopeChanged = (v: SelectableValue<LiveChannelScope>) => {\n if (v.value) {\n this.props.onChange({\n scope: v.value,\n namespace: undefined as unknown as string,\n path: undefined as unknown as string,\n } as LiveChannelAddress);\n }\n };\n\n onNamespaceChanged = (v: SelectableValue<string>) => {\n const update = {\n scope: this.props.value?.scope,\n path: undefined as unknown as string,\n } as LiveChannelAddress;\n\n if (v.value) {\n update.namespace = v.value;\n }\n this.props.onChange(update);\n };\n\n onPathChanged = (v: SelectableValue<string>) => {\n const { value, onChange } = this.props;\n const update = {\n scope: value.scope,\n namespace: value.namespace,\n } as LiveChannelAddress;\n if (v.value) {\n update.path = v.value;\n }\n onChange(update);\n };\n\n render() {\n const { namespaces, paths } = this.state;\n const { scope, namespace, path } = this.props.value;\n const style = getStyles(config.theme);\n\n return (\n <>\n <Alert title=\"Grafana Live\" severity=\"info\">\n This supports real-time event streams in grafana core. This feature is under heavy development. Expect the\n intefaces and structures to change as this becomes more production ready.\n </Alert>\n\n <div>\n <div className={style.dropWrap}>\n <Label>Scope</Label>\n <Select options={scopes} value={scopes.find((s) => s.value === scope)} onChange={this.onScopeChanged} />\n </div>\n\n {scope && (\n <div className={style.dropWrap}>\n <Label>Namespace</Label>\n <Select\n options={namespaces}\n value={\n namespaces.find((s) => s.value === namespace) ??\n (namespace ? { label: namespace, value: namespace } : undefined)\n }\n onChange={this.onNamespaceChanged}\n allowCustomValue={true}\n backspaceRemovesValue={true}\n />\n </div>\n )}\n\n {scope && namespace && (\n <div className={style.dropWrap}>\n <Label>Path</Label>\n <Select\n options={paths}\n value={findPathOption(paths, path)}\n onChange={this.onPathChanged}\n allowCustomValue={true}\n backspaceRemovesValue={true}\n />\n </div>\n )}\n </div>\n </>\n );\n }\n}\n\nfunction findPathOption(paths: Array<SelectableValue<string>>, path?: string): SelectableValue<string> | undefined {\n const v = paths.find((s) => s.value === path);\n if (v) {\n return v;\n }\n if (path) {\n return { label: path, value: path };\n }\n return undefined;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n dropWrap: css`\n margin-bottom: ${theme.spacing.sm};\n `,\n}));\n","import {\n DataFrame,\n Field,\n FieldType,\n formattedValueToString,\n getDisplayProcessor,\n reduceField,\n fieldReducers,\n} from '@grafana/data';\nimport { FooterItem } from '@grafana/ui/src/components/Table/types';\nimport { config } from 'app/core/config';\n\nimport { TableFooterCalc } from './models.gen';\n\nexport function getFooterCells(frame: DataFrame, options?: TableFooterCalc): FooterItem[] {\n return frame.fields.map((field, i) => {\n if (field.type !== FieldType.number) {\n // show the reducer in the first column\n if (i === 0 && options && options.reducer.length > 0) {\n const reducer = fieldReducers.get(options.reducer[0]);\n return reducer.name;\n }\n return undefined;\n }\n if (options?.fields && options.fields.length > 0) {\n const f = options.fields.find((f) => f === field.name);\n if (f) {\n return getFormattedValue(field, options.reducer);\n }\n return undefined;\n }\n return getFormattedValue(field, options?.reducer || []);\n });\n}\n\nfunction getFormattedValue(field: Field, reducer: string[]) {\n const fmt = field.display ?? getDisplayProcessor({ field, theme: config.theme2 });\n const calc = reducer[0];\n const v = reduceField({ field, reducers: reducer })[calc];\n return formattedValueToString(fmt(v));\n}\n","import { css } from '@emotion/css';\nimport React, { Component } from 'react';\n\nimport {\n DataFrame,\n FieldMatcherID,\n getDataSourceRef,\n getFrameDisplayName,\n PanelProps,\n SelectableValue,\n} from '@grafana/data';\nimport { PanelDataErrorView } from '@grafana/runtime';\nimport { Select, Table } from '@grafana/ui';\nimport { FilterItem, TableSortByFieldState } from '@grafana/ui/src/components/Table/types';\nimport { config } from 'app/core/config';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport { getDashboardSrv } from '../../../features/dashboard/services/DashboardSrv';\nimport { applyFilterFromTable } from '../../../features/variables/adhoc/actions';\nimport { dispatch } from '../../../store/store';\n\nimport { getFooterCells } from './footer';\nimport { PanelOptions } from './models.gen';\n\ninterface Props extends PanelProps<PanelOptions> {}\n\nexport class TablePanel extends Component<Props> {\n constructor(props: Props) {\n super(props);\n }\n\n onColumnResize = (fieldDisplayName: string, width: number) => {\n const { fieldConfig } = this.props;\n const { overrides } = fieldConfig;\n\n const matcherId = FieldMatcherID.byName;\n const propId = 'custom.width';\n\n // look for existing override\n const override = overrides.find((o) => o.matcher.id === matcherId && o.matcher.options === fieldDisplayName);\n\n if (override) {\n // look for existing property\n const property = override.properties.find((prop) => prop.id === propId);\n if (property) {\n property.value = width;\n } else {\n override.properties.push({ id: propId, value: width });\n }\n } else {\n overrides.push({\n matcher: { id: matcherId, options: fieldDisplayName },\n properties: [{ id: propId, value: width }],\n });\n }\n\n this.props.onFieldConfigChange({\n ...fieldConfig,\n overrides,\n });\n };\n\n onSortByChange = (sortBy: TableSortByFieldState[]) => {\n this.props.onOptionsChange({\n ...this.props.options,\n sortBy,\n });\n };\n\n onChangeTableSelection = (val: SelectableValue<number>) => {\n this.props.onOptionsChange({\n ...this.props.options,\n frameIndex: val.value || 0,\n });\n\n // Force a redraw -- but no need to re-query\n this.forceUpdate();\n };\n\n onCellFilterAdded = (filter: FilterItem) => {\n const { key, value, operator } = filter;\n const panelModel = getDashboardSrv().getCurrent()?.getPanelById(this.props.id);\n if (!panelModel) {\n return;\n }\n\n // When the datasource is null/undefined (for a default datasource), we use getInstanceSettings\n // to find the real datasource ref for the default datasource.\n const datasourceInstance = getDatasourceSrv().getInstanceSettings(panelModel.datasource);\n const datasourceRef = datasourceInstance && getDataSourceRef(datasourceInstance);\n if (!datasourceRef) {\n return;\n }\n\n dispatch(applyFilterFromTable({ datasource: datasourceRef, key, operator, value }));\n };\n\n renderTable(frame: DataFrame, width: number, height: number) {\n const { options } = this.props;\n const footerValues = options.footer?.show ? getFooterCells(frame, options.footer) : undefined;\n\n return (\n <Table\n height={height}\n width={width}\n data={frame}\n noHeader={!options.showHeader}\n showTypeIcons={options.showTypeIcons}\n resizable={true}\n initialSortBy={options.sortBy}\n onSortByChange={this.onSortByChange}\n onColumnResize={this.onColumnResize}\n onCellFilterAdded={this.onCellFilterAdded}\n footerValues={footerValues}\n enablePagination={options.footer?.enablePagination}\n />\n );\n }\n\n getCurrentFrameIndex(frames: DataFrame[], options: PanelOptions) {\n return options.frameIndex > 0 && options.frameIndex < frames.length ? options.frameIndex : 0;\n }\n\n render() {\n const { data, height, width, options, fieldConfig, id } = this.props;\n\n const frames = data.series;\n const count = frames?.length;\n const hasFields = frames[0]?.fields.length;\n\n if (!count || !hasFields) {\n return <PanelDataErrorView panelId={id} fieldConfig={fieldConfig} data={data} />;\n }\n\n if (count > 1) {\n const inputHeight = config.theme.spacing.formInputHeight;\n const padding = 8 * 2;\n const currentIndex = this.getCurrentFrameIndex(frames, options);\n const names = frames.map((frame, index) => {\n return {\n label: getFrameDisplayName(frame),\n value: index,\n };\n });\n\n return (\n <div className={tableStyles.wrapper}>\n {this.renderTable(data.series[currentIndex], width, height - inputHeight - padding)}\n <div className={tableStyles.selectWrapper}>\n <Select options={names} value={names[currentIndex]} onChange={this.onChangeTableSelection} />\n </div>\n </div>\n );\n }\n\n return this.renderTable(data.series[0], width, height);\n }\n}\n\nconst tableStyles = {\n wrapper: css`\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n `,\n noData: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n selectWrapper: css`\n padding: 8px;\n `,\n};\n","import { LiveChannelAddress } from '@grafana/data';\n\nexport enum MessageDisplayMode {\n Raw = 'raw', // Raw JSON string\n JSON = 'json', // formatted JSON\n Auto = 'auto', // pick a good display\n None = 'none', // do not display\n}\n\nexport interface LivePanelOptions {\n channel?: LiveChannelAddress;\n message?: MessageDisplayMode;\n publish?: boolean;\n json?: any; // object\n}\n","import { css, cx } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport React, { PureComponent } from 'react';\nimport { Unsubscribable, PartialObserver } from 'rxjs';\n\nimport {\n GrafanaTheme,\n PanelProps,\n LiveChannelStatusEvent,\n isValidLiveChannelAddress,\n LiveChannelEvent,\n isLiveChannelStatusEvent,\n isLiveChannelMessageEvent,\n LiveChannelConnectionState,\n PanelData,\n LoadingState,\n applyFieldOverrides,\n LiveChannelAddress,\n} from '@grafana/data';\nimport { config, getGrafanaLiveSrv } from '@grafana/runtime';\nimport { Alert, stylesFactory, Button, JSONFormatter, CustomScrollbar, CodeEditor } from '@grafana/ui';\nimport { StreamingDataFrame } from 'app/features/live/data/StreamingDataFrame';\n\nimport { TablePanel } from '../table/TablePanel';\n\nimport { LivePanelOptions, MessageDisplayMode } from './types';\n\ninterface Props extends PanelProps<LivePanelOptions> {}\n\ninterface State {\n error?: any;\n addr?: LiveChannelAddress;\n status?: LiveChannelStatusEvent;\n message?: any;\n changed: number;\n}\n\nexport class LivePanel extends PureComponent<Props, State> {\n private readonly isValid: boolean;\n subscription?: Unsubscribable;\n styles = getStyles(config.theme);\n\n constructor(props: Props) {\n super(props);\n\n this.isValid = !!getGrafanaLiveSrv();\n this.state = { changed: 0 };\n }\n\n async componentDidMount() {\n this.loadChannel();\n }\n\n componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n componentDidUpdate(prevProps: Props): void {\n if (this.props.options?.channel !== prevProps.options?.channel) {\n this.loadChannel();\n }\n }\n\n streamObserver: PartialObserver<LiveChannelEvent> = {\n next: (event: LiveChannelEvent) => {\n if (isLiveChannelStatusEvent(event)) {\n this.setState({ status: event, changed: Date.now() });\n } else if (isLiveChannelMessageEvent(event)) {\n this.setState({ message: event.message, changed: Date.now() });\n } else {\n console.log('ignore', event);\n }\n },\n };\n\n unsubscribe = () => {\n if (this.subscription) {\n this.subscription.unsubscribe();\n this.subscription = undefined;\n }\n };\n\n async loadChannel() {\n const addr = this.props.options?.channel;\n if (!isValidLiveChannelAddress(addr)) {\n console.log('INVALID', addr);\n this.unsubscribe();\n this.setState({\n addr: undefined,\n });\n return;\n }\n\n if (isEqual(addr, this.state.addr)) {\n console.log('Same channel', this.state.addr);\n return;\n }\n\n const live = getGrafanaLiveSrv();\n if (!live) {\n console.log('INVALID', addr);\n this.unsubscribe();\n this.setState({\n addr: undefined,\n });\n return;\n }\n this.unsubscribe();\n\n console.log('LOAD', addr);\n\n // Subscribe to new events\n try {\n this.subscription = live.getStream(addr).subscribe(this.streamObserver);\n this.setState({ addr, error: undefined });\n } catch (err) {\n this.setState({ addr: undefined, error: err });\n }\n }\n\n renderNotEnabled() {\n const preformatted = `[feature_toggles]\n enable = live`;\n return (\n <Alert title=\"Grafana Live\" severity=\"info\">\n <p>Grafana live requires a feature flag to run</p>\n\n <b>custom.ini:</b>\n <pre>{preformatted}</pre>\n </Alert>\n );\n }\n\n onSaveJSON = (text: string) => {\n const { options, onOptionsChange } = this.props;\n\n try {\n const json = JSON.parse(text);\n onOptionsChange({ ...options, json });\n } catch (err) {\n console.log('Error reading JSON', err);\n }\n };\n\n onPublishClicked = async () => {\n const { addr } = this.state;\n if (!addr) {\n console.log('invalid address');\n return;\n }\n\n const data = this.props.options?.json;\n if (!data) {\n console.log('nothing to publish');\n return;\n }\n\n const rsp = await getGrafanaLiveSrv().publish(addr, data);\n console.log('onPublishClicked (response from publish)', rsp);\n };\n\n renderMessage(height: number) {\n const { options } = this.props;\n const { message } = this.state;\n\n if (!message) {\n return (\n <div>\n <h4>Waiting for data:</h4>\n {options.channel?.scope}/{options.channel?.namespace}/{options.channel?.path}\n </div>\n );\n }\n\n if (options.message === MessageDisplayMode.JSON) {\n return <JSONFormatter json={message} open={5} />;\n }\n\n if (options.message === MessageDisplayMode.Auto) {\n if (message instanceof StreamingDataFrame) {\n const data: PanelData = {\n series: applyFieldOverrides({\n data: [message],\n theme: config.theme2,\n replaceVariables: (v: string) => v,\n fieldConfig: {\n defaults: {},\n overrides: [],\n },\n }),\n state: LoadingState.Streaming,\n } as PanelData;\n const props = {\n ...this.props,\n options: { frameIndex: 0, showHeader: true },\n } as PanelProps<any>;\n return <TablePanel {...props} data={data} height={height} />;\n }\n }\n\n return <pre>{JSON.stringify(message)}</pre>;\n }\n\n renderPublish(height: number) {\n const { options } = this.props;\n return (\n <>\n <CodeEditor\n height={height - 32}\n language=\"json\"\n value={options.json ? JSON.stringify(options.json, null, 2) : '{ }'}\n onBlur={this.onSaveJSON}\n onSave={this.onSaveJSON}\n showMiniMap={false}\n showLineNumbers={true}\n />\n <div style={{ height: 32 }}>\n <Button onClick={this.onPublishClicked}>Publish</Button>\n </div>\n </>\n );\n }\n\n renderStatus() {\n const { status } = this.state;\n if (status?.state === LiveChannelConnectionState.Connected) {\n return; // nothing\n }\n\n let statusClass = '';\n if (status) {\n statusClass = this.styles.status[status.state];\n }\n return <div className={cx(statusClass, this.styles.statusWrap)}>{status?.state}</div>;\n }\n\n renderBody() {\n const { status } = this.state;\n const { options, height } = this.props;\n\n if (options.publish) {\n // Only the publish form\n if (options.message === MessageDisplayMode.None) {\n return <div>{this.renderPublish(height)}</div>;\n }\n // Both message and publish\n const halfHeight = height / 2;\n return (\n <div>\n <div style={{ height: halfHeight, overflow: 'hidden' }}>\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n {this.renderMessage(halfHeight)}\n </CustomScrollbar>\n </div>\n <div>{this.renderPublish(halfHeight)}</div>\n </div>\n );\n }\n if (options.message === MessageDisplayMode.None) {\n return <pre>{JSON.stringify(status)}</pre>;\n }\n\n // Only message\n return (\n <div style={{ overflow: 'hidden', height }}>\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n {this.renderMessage(height)}\n </CustomScrollbar>\n </div>\n );\n }\n\n render() {\n if (!this.isValid) {\n return this.renderNotEnabled();\n }\n const { addr, error } = this.state;\n if (!addr) {\n return (\n <Alert title=\"Grafana Live\" severity=\"info\">\n Use the panel editor to pick a channel\n </Alert>\n );\n }\n if (error) {\n return (\n <div>\n <h2>ERROR</h2>\n <div>{JSON.stringify(error)}</div>\n </div>\n );\n }\n return (\n <>\n {this.renderStatus()}\n {this.renderBody()}\n </>\n );\n }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n statusWrap: css`\n margin: auto;\n position: absolute;\n top: 0;\n right: 0;\n background: ${theme.colors.panelBg};\n padding: 10px;\n z-index: ${theme.zIndex.modal};\n `,\n status: {\n [LiveChannelConnectionState.Pending]: css`\n border: 1px solid ${theme.palette.brandPrimary};\n `,\n [LiveChannelConnectionState.Connected]: css`\n border: 1px solid ${theme.palette.brandSuccess};\n `,\n [LiveChannelConnectionState.Disconnected]: css`\n border: 1px solid ${theme.palette.brandWarning};\n `,\n [LiveChannelConnectionState.Shutdown]: css`\n border: 1px solid ${theme.palette.brandDanger};\n `,\n [LiveChannelConnectionState.Invalid]: css`\n border: 1px solid red;\n `,\n },\n}));\n","import { PanelPlugin } from '@grafana/data';\n\nimport { LiveChannelEditor } from './LiveChannelEditor';\nimport { LivePanel } from './LivePanel';\nimport { LivePanelOptions, MessageDisplayMode } from './types';\n\nexport const plugin = new PanelPlugin<LivePanelOptions>(LivePanel).setPanelOptions((builder) => {\n builder.addCustomEditor({\n category: ['Channel'],\n id: 'channel',\n path: 'channel',\n name: 'Channel',\n editor: LiveChannelEditor,\n defaultValue: {},\n });\n\n builder\n .addRadio({\n path: 'message',\n name: 'Show Message',\n description: 'Display the last message received on this channel',\n settings: {\n options: [\n { value: MessageDisplayMode.Raw, label: 'Raw Text' },\n { value: MessageDisplayMode.JSON, label: 'JSON' },\n { value: MessageDisplayMode.Auto, label: 'Auto' },\n { value: MessageDisplayMode.None, label: 'None' },\n ],\n },\n defaultValue: MessageDisplayMode.JSON,\n })\n .addBooleanSwitch({\n path: 'publish',\n name: 'Show Publish',\n description: 'Display a form to publish values',\n defaultValue: false,\n });\n});\n","import { css } from '@emotion/css';\nimport React, { useCallback, useMemo, useRef, useLayoutEffect, useState } from 'react';\n\nimport {\n PanelProps,\n Field,\n Labels,\n GrafanaTheme2,\n LogsSortOrder,\n LogRowModel,\n DataHoverClearEvent,\n DataHoverEvent,\n} from '@grafana/data';\nimport { LogRows, CustomScrollbar, LogLabels, useStyles2, usePanelContext } from '@grafana/ui';\nimport { dataFrameToLogsModel, dedupLogRows, COMMON_LABELS } from 'app/core/logsModel';\nimport { getFieldLinksForExplore } from 'app/features/explore/utils/links';\nimport { PanelDataErrorView } from 'app/features/panel/components/PanelDataErrorView';\n\nimport { Options } from './types';\n\ninterface LogsPanelProps extends PanelProps<Options> {}\n\nexport const LogsPanel: React.FunctionComponent<LogsPanelProps> = ({\n data,\n timeZone,\n fieldConfig,\n options: {\n showLabels,\n showTime,\n wrapLogMessage,\n showCommonLabels,\n prettifyLogMessage,\n sortOrder,\n dedupStrategy,\n enableLogDetails,\n },\n title,\n id,\n}) => {\n const isAscending = sortOrder === LogsSortOrder.Ascending;\n const style = useStyles2(getStyles(title, isAscending));\n const [scrollTop, setScrollTop] = useState(0);\n const logsContainerRef = useRef<HTMLDivElement>(null);\n\n const { eventBus } = usePanelContext();\n const onLogRowHover = useCallback(\n (row?: LogRowModel) => {\n if (!row) {\n eventBus.publish(new DataHoverClearEvent());\n } else {\n eventBus.publish(\n new DataHoverEvent({\n point: {\n time: row.timeEpochMs,\n },\n })\n );\n }\n },\n [eventBus]\n );\n\n // Important to memoize stuff here, as panel rerenders a lot for example when resizing.\n const [logRows, deduplicatedRows, commonLabels] = useMemo(() => {\n const newResults = data ? dataFrameToLogsModel(data.series, data.request?.intervalMs) : null;\n const logRows = newResults?.rows || [];\n const commonLabels = newResults?.meta?.find((m) => m.label === COMMON_LABELS);\n const deduplicatedRows = dedupLogRows(logRows, dedupStrategy);\n return [logRows, deduplicatedRows, commonLabels];\n }, [data, dedupStrategy]);\n\n useLayoutEffect(() => {\n if (isAscending && logsContainerRef.current) {\n setScrollTop(logsContainerRef.current.offsetHeight);\n } else {\n setScrollTop(0);\n }\n }, [isAscending, logRows]);\n\n const getFieldLinks = useCallback(\n (field: Field, rowIndex: number) => {\n return getFieldLinksForExplore({ field, rowIndex, range: data.timeRange });\n },\n [data]\n );\n\n if (!data || logRows.length === 0) {\n return <PanelDataErrorView fieldConfig={fieldConfig} panelId={id} data={data} needsStringField />;\n }\n\n const renderCommonLabels = () => (\n <div className={style.labelContainer}>\n <span className={style.label}>Common labels:</span>\n <LogLabels labels={commonLabels ? (commonLabels.value as Labels) : { labels: '(no common labels)' }} />\n </div>\n );\n\n return (\n <CustomScrollbar autoHide scrollTop={scrollTop}>\n <div className={style.container} ref={logsContainerRef}>\n {showCommonLabels && !isAscending && renderCommonLabels()}\n <LogRows\n logRows={logRows}\n deduplicatedRows={deduplicatedRows}\n dedupStrategy={dedupStrategy}\n showLabels={showLabels}\n showTime={showTime}\n wrapLogMessage={wrapLogMessage}\n prettifyLogMessage={prettifyLogMessage}\n timeZone={timeZone}\n getFieldLinks={getFieldLinks}\n logsSortOrder={sortOrder}\n enableLogDetails={enableLogDetails}\n previewLimit={isAscending ? logRows.length : undefined}\n onLogRowHover={onLogRowHover}\n />\n {showCommonLabels && isAscending && renderCommonLabels()}\n </div>\n </CustomScrollbar>\n );\n};\n\nconst getStyles = (title: string, isAscending: boolean) => (theme: GrafanaTheme2) => ({\n container: css`\n margin-bottom: ${theme.spacing(1.5)};\n //We can remove this hot-fix when we fix panel menu with no title overflowing top of all panels\n margin-top: ${theme.spacing(!title ? 2.5 : 0)};\n `,\n labelContainer: css`\n margin: ${isAscending ? theme.spacing(0.5, 0, 0.5, 0) : theme.spacing(0, 0, 0.5, 0.5)};\n display: flex;\n align-items: center;\n `,\n label: css`\n margin-right: ${theme.spacing(0.5)};\n font-size: ${theme.typography.bodySmall.fontSize};\n font-weight: ${theme.typography.fontWeightMedium};\n `,\n});\n","import { PanelPlugin, LogsSortOrder, LogsDedupStrategy, LogsDedupDescription } from '@grafana/data';\n\nimport { LogsPanel } from './LogsPanel';\nimport { LogsPanelSuggestionsSupplier } from './suggestions';\nimport { Options } from './types';\n\nexport const plugin = new PanelPlugin<Options>(LogsPanel)\n .setPanelOptions((builder) => {\n builder\n .addBooleanSwitch({\n path: 'showTime',\n name: 'Time',\n description: '',\n defaultValue: false,\n })\n .addBooleanSwitch({\n path: 'showLabels',\n name: 'Unique labels',\n description: '',\n defaultValue: false,\n })\n .addBooleanSwitch({\n path: 'showCommonLabels',\n name: 'Common labels',\n description: '',\n defaultValue: false,\n })\n .addBooleanSwitch({\n path: 'wrapLogMessage',\n name: 'Wrap lines',\n description: '',\n defaultValue: false,\n })\n .addBooleanSwitch({\n path: 'prettifyLogMessage',\n name: 'Prettify JSON',\n description: '',\n defaultValue: false,\n })\n .addBooleanSwitch({\n path: 'enableLogDetails',\n name: 'Enable log details',\n description: '',\n defaultValue: true,\n })\n .addRadio({\n path: 'dedupStrategy',\n name: 'Deduplication',\n description: '',\n settings: {\n options: [\n { value: LogsDedupStrategy.none, label: 'None', description: LogsDedupDescription[LogsDedupStrategy.none] },\n {\n value: LogsDedupStrategy.exact,\n label: 'Exact',\n description: LogsDedupDescription[LogsDedupStrategy.exact],\n },\n {\n value: LogsDedupStrategy.numbers,\n label: 'Numbers',\n description: LogsDedupDescription[LogsDedupStrategy.numbers],\n },\n {\n value: LogsDedupStrategy.signature,\n label: 'Signature',\n description: LogsDedupDescription[LogsDedupStrategy.signature],\n },\n ],\n },\n defaultValue: LogsDedupStrategy.none,\n })\n .addRadio({\n path: 'sortOrder',\n name: 'Order',\n description: '',\n settings: {\n options: [\n { value: LogsSortOrder.Descending, label: 'Newest first' },\n { value: LogsSortOrder.Ascending, label: 'Oldest first' },\n ],\n },\n defaultValue: LogsSortOrder.Descending,\n });\n })\n .setSuggestionsSupplier(new LogsPanelSuggestionsSupplier());\n","import { VisualizationSuggestionsBuilder, VisualizationSuggestionScore } from '@grafana/data';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { Options } from './types';\n\nexport class LogsPanelSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const list = builder.getListAppender<Options, {}>({\n name: '',\n pluginId: 'logs',\n options: {},\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n });\n\n const { dataSummary: ds } = builder;\n\n // Require a string & time field\n if (!ds.hasData || !ds.hasTimeField || !ds.hasStringField) {\n return;\n }\n\n if (ds.preferredVisualisationType === 'logs') {\n list.append({ name: SuggestionName.Logs, score: VisualizationSuggestionScore.Best });\n } else {\n list.append({ name: SuggestionName.Logs });\n }\n }\n}\n","export const DEFAULT_FEED_URL = 'https://grafana.com/blog/news.xml';\n","import { parseAtomFeed } from './atom';\nimport { parseRSSFeed } from './rss';\n\nexport async function fetchFeedText(url: string) {\n const rsp = await fetch(url);\n const txt = await rsp.text();\n return txt;\n}\n\nexport function isAtomFeed(txt: string) {\n const domParser = new DOMParser();\n const doc = domParser.parseFromString(txt, 'text/xml');\n return doc.querySelector('feed') !== null;\n}\n\nexport function getProperty(node: Element, property: string): string {\n const propNode = node.querySelector(property);\n return propNode?.textContent ?? '';\n}\n\nexport async function loadFeed(url: string) {\n const res = await fetchFeedText(url);\n const parsedFeed = isAtomFeed(res) ? parseAtomFeed(res) : parseRSSFeed(res);\n return parsedFeed;\n}\n","import { getProperty } from './feed';\nimport { Feed } from './types';\n\nexport function parseAtomFeed(txt: string): Feed {\n const domParser = new DOMParser();\n const doc = domParser.parseFromString(txt, 'text/xml');\n\n const feed: Feed = {\n items: Array.from(doc.querySelectorAll('entry')).map((node) => ({\n title: getProperty(node, 'title'),\n link: node.querySelector('link')?.getAttribute('href') ?? '',\n content: getProperty(node, 'content'),\n pubDate: getProperty(node, 'published'),\n ogImage: node.querySelector(\"meta[property='og:image']\")?.getAttribute('content'),\n })),\n };\n\n return feed;\n}\n","import { getProperty } from './feed';\nimport { Feed } from './types';\n\nexport function parseRSSFeed(txt: string): Feed {\n const domParser = new DOMParser();\n const doc = domParser.parseFromString(txt, 'text/xml');\n\n const feed: Feed = {\n items: Array.from(doc.querySelectorAll('item')).map((node) => ({\n title: getProperty(node, 'title'),\n link: getProperty(node, 'link'),\n content: getProperty(node, 'description'),\n pubDate: getProperty(node, 'pubDate'),\n ogImage: node.querySelector(\"meta[property='og:image']\")?.getAttribute('content'),\n })),\n };\n\n return feed;\n}\n","import { css, cx } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { Unsubscribable } from 'rxjs';\n\nimport { PanelProps, DataFrameView, dateTimeFormat, GrafanaTheme2, textUtil } from '@grafana/data';\nimport { RefreshEvent } from '@grafana/runtime';\nimport { CustomScrollbar, stylesFactory } from '@grafana/ui';\nimport config from 'app/core/config';\n\nimport { DEFAULT_FEED_URL } from './constants';\nimport { loadFeed } from './feed';\nimport { PanelOptions } from './models.gen';\nimport { NewsItem } from './types';\nimport { feedToDataFrame } from './utils';\n\ninterface Props extends PanelProps<PanelOptions> {}\n\ninterface State {\n news?: DataFrameView<NewsItem>;\n isError?: boolean;\n}\n\nexport class NewsPanel extends PureComponent<Props, State> {\n private refreshSubscription: Unsubscribable;\n\n constructor(props: Props) {\n super(props);\n this.refreshSubscription = this.props.eventBus.subscribe(RefreshEvent, this.loadChannel.bind(this));\n this.state = {};\n }\n\n componentDidMount(): void {\n this.loadChannel();\n }\n\n componentWillUnmount(): void {\n this.refreshSubscription.unsubscribe();\n }\n\n componentDidUpdate(prevProps: Props): void {\n if (this.props.options.feedUrl !== prevProps.options.feedUrl) {\n this.loadChannel();\n }\n }\n\n async loadChannel() {\n const { options } = this.props;\n try {\n const url = options.feedUrl || DEFAULT_FEED_URL;\n\n const feed = await loadFeed(url);\n const frame = feedToDataFrame(feed);\n\n this.setState({\n news: new DataFrameView<NewsItem>(frame),\n isError: false,\n });\n } catch (err) {\n console.error('Error Loading News', err);\n\n this.setState({\n news: undefined,\n isError: true,\n });\n }\n }\n\n render() {\n const { width } = this.props;\n const { showImage } = this.props.options;\n const { isError, news } = this.state;\n const styles = getStyles(config.theme2);\n const useWideLayout = width > 600;\n\n if (isError) {\n return <div>Error loading RSS feed.</div>;\n }\n if (!news) {\n return <div>Loading...</div>;\n }\n\n return (\n <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n {news.map((item, index) => {\n return (\n <article key={index} className={cx(styles.item, useWideLayout && styles.itemWide)}>\n {showImage && item.ogImage && (\n <a\n tabIndex={-1}\n href={textUtil.sanitizeUrl(item.link)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cx(styles.socialImage, useWideLayout && styles.socialImageWide)}\n aria-hidden\n >\n <img src={item.ogImage} alt={item.title} />\n </a>\n )}\n <div className={styles.body}>\n <time className={styles.date} dateTime={dateTimeFormat(item.date, { format: 'MMM DD' })}>\n {dateTimeFormat(item.date, { format: 'MMM DD' })}{' '}\n </time>\n <a\n className={styles.link}\n href={textUtil.sanitizeUrl(item.link)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <h3 className={styles.title}>{item.title}</h3>\n </a>\n <div className={styles.content} dangerouslySetInnerHTML={{ __html: textUtil.sanitize(item.content) }} />\n </div>\n </article>\n );\n })}\n </CustomScrollbar>\n );\n }\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n container: css`\n height: 100%;\n `,\n item: css`\n display: flex;\n padding: ${theme.spacing(1)};\n position: relative;\n margin-bottom: 4px;\n margin-right: ${theme.spacing(1)};\n border-bottom: 2px solid ${theme.colors.border.weak};\n background: ${theme.colors.background.primary};\n flex-direction: column;\n flex-shrink: 0;\n `,\n itemWide: css`\n flex-direction: row;\n `,\n body: css`\n display: flex;\n flex-direction: column;\n `,\n socialImage: css`\n display: flex;\n align-items: center;\n margin-bottom: ${theme.spacing(1)};\n > img {\n width: 100%;\n border-radius: ${theme.shape.borderRadius(2)} ${theme.shape.borderRadius(2)} 0 0;\n }\n `,\n socialImageWide: css`\n margin-right: ${theme.spacing(2)};\n margin-bottom: 0;\n > img {\n width: 250px;\n border-radius: ${theme.shape.borderRadius()};\n }\n `,\n link: css`\n color: ${theme.colors.text.link};\n display: inline-block;\n\n &:hover {\n color: ${theme.colors.text.link};\n text-decoration: underline;\n }\n `,\n title: css`\n font-size: 16px;\n margin-bottom: ${theme.spacing(0.5)};\n `,\n content: css`\n p {\n margin-bottom: 4px;\n color: ${theme.colors.text};\n }\n `,\n date: css`\n margin-bottom: ${theme.spacing(0.5)};\n font-weight: 500;\n border-radius: 0 0 0 3px;\n color: ${theme.colors.text.secondary};\n `,\n}));\n","import { ArrayVector, FieldType, DataFrame, dateTime } from '@grafana/data';\n\nimport { Feed } from './types';\n\nexport function feedToDataFrame(feed: Feed): DataFrame {\n const date = new ArrayVector<number>([]);\n const title = new ArrayVector<string>([]);\n const link = new ArrayVector<string>([]);\n const content = new ArrayVector<string>([]);\n const ogImage = new ArrayVector<string | undefined | null>([]);\n\n for (const item of feed.items) {\n const val = dateTime(item.pubDate);\n\n try {\n date.buffer.push(val.valueOf());\n title.buffer.push(item.title);\n link.buffer.push(item.link);\n ogImage.buffer.push(item.ogImage);\n\n if (item.content) {\n const body = item.content.replace(/<\\/?[^>]+(>|$)/g, '');\n content.buffer.push(body);\n }\n } catch (err) {\n console.warn('Error reading news item:', err, item);\n }\n }\n\n return {\n fields: [\n { name: 'date', type: FieldType.time, config: { displayName: 'Date' }, values: date },\n { name: 'title', type: FieldType.string, config: {}, values: title },\n { name: 'link', type: FieldType.string, config: {}, values: link },\n { name: 'content', type: FieldType.string, config: {}, values: content },\n { name: 'ogImage', type: FieldType.string, config: {}, values: ogImage },\n ],\n length: date.length,\n };\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\nexport const modelVersion = Object.freeze([0, 0]);\n\n\nexport interface PanelOptions {\n feedUrl?: string;\n showImage?: boolean;\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n showImage: true,\n};\n","import { PanelPlugin } from '@grafana/data';\n\nimport { NewsPanel } from './NewsPanel';\nimport { DEFAULT_FEED_URL } from './constants';\nimport { PanelOptions, defaultPanelOptions } from './models.gen';\n\nexport const plugin = new PanelPlugin<PanelOptions>(NewsPanel).setPanelOptions((builder) => {\n builder\n .addTextInput({\n path: 'feedUrl',\n name: 'URL',\n description: 'Supports RSS and Atom feeds',\n settings: {\n placeholder: DEFAULT_FEED_URL,\n },\n defaultValue: defaultPanelOptions.feedUrl,\n })\n .addBooleanSwitch({\n path: 'showImage',\n name: 'Show image',\n description: 'Controls if the news item social (og:image) image is shown above text content',\n defaultValue: defaultPanelOptions.showImage,\n });\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Field, StandardEditorProps } from '@grafana/data';\nimport { Button, ColorPicker, useStyles2 } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\n\nimport { ArcOption, NodeGraphOptions } from '../types';\n\ntype Settings = { filter: (field: Field) => boolean };\ntype ArcOptionsEditorProps = StandardEditorProps<ArcOption[], Settings, NodeGraphOptions, undefined>;\n\nexport const ArcOptionsEditor = ({ value, onChange, context }: ArcOptionsEditorProps) => {\n const styles = useStyles2(getStyles);\n\n const addArc = () => {\n const newArc = { field: '', color: '' };\n onChange(value ? [...value, newArc] : [newArc]);\n };\n\n const removeArc = (idx: number) => {\n const copy = value?.slice();\n copy.splice(idx, 1);\n onChange(copy);\n };\n\n const updateField = <K extends keyof ArcOption>(idx: number, field: K, newValue: ArcOption[K]) => {\n let arcs = value?.slice() ?? [];\n arcs[idx][field] = newValue;\n onChange(arcs);\n };\n\n return (\n <>\n {value?.map((arc, i) => {\n return (\n <div className={styles.section} key={i}>\n <FieldNamePicker\n context={context}\n value={arc.field ?? ''}\n onChange={(val) => {\n updateField(i, 'field', val);\n }}\n item={{\n settings: {\n filter: (field: Field) => field.name.includes('arc__'),\n },\n id: `arc-field-${i}`,\n name: `arc-field-${i}`,\n editor: () => null,\n }}\n />\n <ColorPicker\n color={arc.color || '#808080'}\n onChange={(val) => {\n updateField(i, 'color', val);\n }}\n />\n <Button size=\"sm\" icon=\"minus\" variant=\"secondary\" onClick={() => removeArc(i)} title=\"Remove arc\" />\n </div>\n );\n })}\n <Button size={'sm'} icon=\"plus\" onClick={addArc} variant=\"secondary\">\n Add arc\n </Button>\n </>\n );\n};\n\nconst getStyles = () => {\n return {\n section: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0 8px;\n margin-bottom: 8px;\n `,\n };\n};\n","import { PanelPlugin } from '@grafana/data';\n\nimport { NodeGraphPanel } from './NodeGraphPanel';\nimport { ArcOptionsEditor } from './editor/ArcOptionsEditor';\nimport { NodeGraphOptions } from './types';\n\nexport const plugin = new PanelPlugin<NodeGraphOptions>(NodeGraphPanel).setPanelOptions((builder, context) => {\n builder.addNestedOptions({\n category: ['Nodes'],\n path: 'nodes',\n build: (builder) => {\n builder.addUnitPicker({\n name: 'Main stat unit',\n path: 'mainStatUnit',\n });\n builder.addUnitPicker({\n name: 'Secondary stat unit',\n path: 'secondaryStatUnit',\n });\n builder.addCustomEditor({\n name: 'Arc sections',\n path: 'arcs',\n id: 'arcs',\n editor: ArcOptionsEditor,\n });\n },\n });\n builder.addNestedOptions({\n category: ['Edges'],\n path: 'edges',\n build: (builder) => {\n builder.addUnitPicker({\n name: 'Main stat unit',\n path: 'mainStatUnit',\n });\n builder.addUnitPicker({\n name: 'Secondary stat unit',\n path: 'secondaryStatUnit',\n });\n },\n });\n});\n","import memoizeOne from 'memoize-one';\nimport React from 'react';\n\nimport { PanelProps } from '@grafana/data';\n\nimport { useLinks } from '../../../features/explore/utils/links';\n\nimport { NodeGraph } from './NodeGraph';\nimport { NodeGraphOptions } from './types';\nimport { getNodeGraphDataFrames } from './utils';\n\nexport const NodeGraphPanel: React.FunctionComponent<PanelProps<NodeGraphOptions>> = ({\n width,\n height,\n data,\n options,\n}) => {\n const getLinks = useLinks(data.timeRange);\n if (!data || !data.series.length) {\n return (\n <div className=\"panel-empty\">\n <p>No data found in response</p>\n </div>\n );\n }\n\n const memoizedGetNodeGraphDataFrames = memoizeOne(getNodeGraphDataFrames);\n return (\n <div style={{ width, height }}>\n <NodeGraph dataFrames={memoizedGetNodeGraphDataFrames(data.series, options)} getLinks={getLinks} />\n </div>\n );\n};\n","import { useRef } from 'react';\n\nlet uniqueId = 0;\nconst getUniqueId = () => uniqueId++;\n\nexport function useComponentInstanceId(prefix: string): string {\n const idRef = useRef<string | null>(null);\n\n if (idRef.current === null) {\n idRef.current = prefix + getUniqueId();\n }\n\n return idRef.current!.toString();\n}\n","import { VizLegendOptions, OptionsWithTooltip } from '@grafana/schema';\nimport { SingleStatBaseOptions } from '@grafana/ui';\n\n/**\n * @beta\n */\nexport enum PieChartType {\n Pie = 'pie',\n Donut = 'donut',\n}\n\n/**\n * @beta\n */\nexport enum PieChartLegendValues {\n Value = 'value',\n Percent = 'percent',\n}\n\n/**\n * @beta\n */\nexport enum PieChartLabels {\n Name = 'name',\n Value = 'value',\n Percent = 'percent',\n}\n\n/**\n * @beta\n */\nexport interface PieChartLegendOptions extends VizLegendOptions {\n values: PieChartLegendValues[];\n}\n\nexport interface PieChartOptions extends SingleStatBaseOptions, OptionsWithTooltip {\n pieType: PieChartType;\n displayLabels: PieChartLabels[];\n legend: PieChartLegendOptions;\n}\n","import { FieldDisplay } from '@grafana/data';\n\nexport function filterDisplayItems(item: FieldDisplay) {\n return !item.field.custom?.hideFrom?.viz && !isNaN(item.display.numeric);\n}\n\nexport function sumDisplayItemsReducer(acc: number, item: FieldDisplay) {\n return item.display.numeric + acc;\n}\n","import { css } from '@emotion/css';\nimport { localPoint } from '@visx/event';\nimport { RadialGradient } from '@visx/gradient';\nimport { Group } from '@visx/group';\nimport Pie, { PieArcDatum, ProvidedProps } from '@visx/shape/lib/shapes/Pie';\nimport { useTooltip, useTooltipInPortal } from '@visx/tooltip';\nimport { UseTooltipParams } from '@visx/tooltip/lib/hooks/useTooltip';\nimport React, { FC, useCallback } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport {\n FieldDisplay,\n FALLBACK_COLOR,\n formattedValueToString,\n GrafanaTheme2,\n DataHoverClearEvent,\n DataHoverEvent,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { VizTooltipOptions } from '@grafana/schema';\nimport {\n useTheme2,\n useStyles2,\n SeriesTableRowProps,\n DataLinksContextMenu,\n SeriesTable,\n usePanelContext,\n} from '@grafana/ui';\nimport { getTooltipContainerStyles } from '@grafana/ui/src/themes/mixins';\nimport { useComponentInstanceId } from '@grafana/ui/src/utils/useComponetInstanceId';\n\nimport { PieChartType, PieChartLabels } from './types';\nimport { filterDisplayItems, sumDisplayItemsReducer } from './utils';\n\n/**\n * @beta\n */\ninterface PieChartProps {\n height: number;\n width: number;\n fieldDisplayValues: FieldDisplay[];\n pieType: PieChartType;\n highlightedTitle?: string;\n displayLabels?: PieChartLabels[];\n useGradients?: boolean; // not used?\n tooltipOptions: VizTooltipOptions;\n}\n\nexport const PieChart: FC<PieChartProps> = ({\n fieldDisplayValues,\n pieType,\n width,\n height,\n highlightedTitle,\n displayLabels = [],\n tooltipOptions,\n}) => {\n const theme = useTheme2();\n const componentInstanceId = useComponentInstanceId('PieChart');\n const styles = useStyles2(getStyles);\n const tooltip = useTooltip<SeriesTableRowProps[]>();\n const { containerRef, TooltipInPortal } = useTooltipInPortal({\n detectBounds: true,\n scroll: true,\n });\n\n const filteredFieldDisplayValues = fieldDisplayValues.filter(filterDisplayItems);\n\n const getValue = (d: FieldDisplay) => d.display.numeric;\n const getGradientId = (color: string) => `${componentInstanceId}-${tinycolor(color).toHex()}`;\n const getGradientColor = (color: string) => {\n return `url(#${getGradientId(color)})`;\n };\n\n const showLabel = displayLabels.length > 0;\n const showTooltip = tooltipOptions.mode !== 'none' && tooltip.tooltipOpen;\n const total = filteredFieldDisplayValues.reduce(sumDisplayItemsReducer, 0);\n const layout = getPieLayout(width, height, pieType);\n const colors = [\n ...new Set(\n filteredFieldDisplayValues.map((fieldDisplayValue) => fieldDisplayValue.display.color ?? FALLBACK_COLOR)\n ),\n ];\n\n return (\n <div className={styles.container}>\n <svg width={layout.size} height={layout.size} ref={containerRef}>\n <Group top={layout.position} left={layout.position}>\n {colors.map((color) => {\n return (\n <RadialGradient\n key={color}\n id={getGradientId(color)}\n from={getGradientColorFrom(color, theme)}\n to={getGradientColorTo(color, theme)}\n fromOffset={layout.gradientFromOffset}\n toOffset=\"1\"\n gradientUnits=\"userSpaceOnUse\"\n cx={0}\n cy={0}\n radius={layout.outerRadius}\n />\n );\n })}\n <Pie\n data={filteredFieldDisplayValues}\n pieValue={getValue}\n outerRadius={layout.outerRadius}\n innerRadius={layout.innerRadius}\n cornerRadius={3}\n padAngle={0.005}\n >\n {(pie) => (\n <>\n {pie.arcs.map((arc) => {\n const color = arc.data.display.color ?? FALLBACK_COLOR;\n const highlightState = getHighlightState(highlightedTitle, arc);\n\n if (arc.data.hasLinks && arc.data.getLinks) {\n return (\n <DataLinksContextMenu key={arc.index} links={arc.data.getLinks}>\n {(api) => (\n <PieSlice\n tooltip={tooltip}\n highlightState={highlightState}\n arc={arc}\n pie={pie}\n fill={getGradientColor(color)}\n openMenu={api.openMenu}\n tooltipOptions={tooltipOptions}\n />\n )}\n </DataLinksContextMenu>\n );\n } else {\n return (\n <PieSlice\n key={arc.index}\n highlightState={highlightState}\n tooltip={tooltip}\n arc={arc}\n pie={pie}\n fill={getGradientColor(color)}\n tooltipOptions={tooltipOptions}\n />\n );\n }\n })}\n {showLabel &&\n pie.arcs.map((arc) => {\n const highlightState = getHighlightState(highlightedTitle, arc);\n return (\n <PieLabel\n arc={arc}\n key={arc.index}\n highlightState={highlightState}\n outerRadius={layout.outerRadius}\n innerRadius={layout.innerRadius}\n displayLabels={displayLabels}\n total={total}\n color={theme.colors.text.primary}\n />\n );\n })}\n </>\n )}\n </Pie>\n </Group>\n </svg>\n {showTooltip ? (\n <TooltipInPortal\n key={Math.random()}\n top={tooltip.tooltipTop}\n className={styles.tooltipPortal}\n left={tooltip.tooltipLeft}\n unstyled={true}\n applyPositionStyle={true}\n >\n <SeriesTable series={tooltip.tooltipData!} />\n </TooltipInPortal>\n ) : null}\n </div>\n );\n};\n\ninterface SliceProps {\n arc: PieArcDatum<FieldDisplay>;\n pie: ProvidedProps<FieldDisplay>;\n highlightState: HighLightState;\n fill: string;\n tooltip: UseTooltipParams<SeriesTableRowProps[]>;\n tooltipOptions: VizTooltipOptions;\n openMenu?: (event: React.MouseEvent<SVGElement>) => void;\n}\n\nfunction PieSlice({ arc, pie, highlightState, openMenu, fill, tooltip, tooltipOptions }: SliceProps) {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n const { eventBus } = usePanelContext();\n\n const onMouseOut = useCallback(\n (event: any) => {\n eventBus?.publish({\n type: DataHoverClearEvent.type,\n payload: {\n raw: event,\n x: 0,\n y: 0,\n dataId: arc.data.display.title,\n },\n });\n tooltip.hideTooltip();\n },\n [eventBus, arc, tooltip]\n );\n\n const onMouseMoveOverArc = useCallback(\n (event: any) => {\n eventBus?.publish({\n type: DataHoverEvent.type,\n payload: {\n raw: event,\n x: 0,\n y: 0,\n dataId: arc.data.display.title,\n },\n });\n\n const coords = localPoint(event.target.ownerSVGElement, event);\n tooltip.showTooltip({\n tooltipLeft: coords!.x,\n tooltipTop: coords!.y,\n tooltipData: getTooltipData(pie, arc, tooltipOptions),\n });\n },\n [eventBus, arc, tooltip, pie, tooltipOptions]\n );\n\n const pieStyle = getSvgStyle(highlightState, styles);\n\n return (\n <g\n key={arc.data.display.title}\n className={pieStyle}\n onMouseMove={tooltipOptions.mode !== 'none' ? onMouseMoveOverArc : undefined}\n onMouseOut={onMouseOut}\n onClick={openMenu}\n aria-label={selectors.components.Panels.Visualization.PieChart.svgSlice}\n >\n <path d={pie.path({ ...arc })!} fill={fill} stroke={theme.colors.background.primary} strokeWidth={1} />\n </g>\n );\n}\n\ninterface LabelProps {\n arc: PieArcDatum<FieldDisplay>;\n outerRadius: number;\n innerRadius: number;\n displayLabels: PieChartLabels[];\n highlightState: HighLightState;\n total: number;\n color: string;\n}\n\nfunction PieLabel({ arc, outerRadius, innerRadius, displayLabels, total, color, highlightState }: LabelProps) {\n const styles = useStyles2(getStyles);\n const labelRadius = innerRadius === 0 ? outerRadius / 6 : innerRadius;\n const [labelX, labelY] = getLabelPos(arc, outerRadius, labelRadius);\n const hasSpaceForLabel = arc.endAngle - arc.startAngle >= 0.3;\n\n if (!hasSpaceForLabel) {\n return null;\n }\n\n let labelFontSize = displayLabels.includes(PieChartLabels.Name)\n ? Math.min(Math.max((outerRadius / 150) * 14, 12), 30)\n : Math.min(Math.max((outerRadius / 100) * 14, 12), 36);\n\n return (\n <g className={getSvgStyle(highlightState, styles)}>\n <text\n fill={color}\n x={labelX}\n y={labelY}\n dy=\".33em\"\n fontSize={labelFontSize}\n fontWeight={500}\n textAnchor=\"middle\"\n pointerEvents=\"none\"\n >\n {displayLabels.includes(PieChartLabels.Name) && (\n <tspan x={labelX} dy=\"1.2em\">\n {arc.data.display.title}\n </tspan>\n )}\n {displayLabels.includes(PieChartLabels.Value) && (\n <tspan x={labelX} dy=\"1.2em\">\n {formattedValueToString(arc.data.display)}\n </tspan>\n )}\n {displayLabels.includes(PieChartLabels.Percent) && (\n <tspan x={labelX} dy=\"1.2em\">\n {((arc.data.display.numeric / total) * 100).toFixed(arc.data.field.decimals ?? 0) + '%'}\n </tspan>\n )}\n </text>\n </g>\n );\n}\n\nfunction getTooltipData(\n pie: ProvidedProps<FieldDisplay>,\n arc: PieArcDatum<FieldDisplay>,\n tooltipOptions: VizTooltipOptions\n) {\n if (tooltipOptions.mode === 'multi') {\n return pie.arcs\n .filter((pa) => {\n const field = pa.data.field;\n return field && !field.custom?.hideFrom?.tooltip && !field.custom?.hideFrom?.viz;\n })\n .map((pieArc) => {\n return {\n color: pieArc.data.display.color ?? FALLBACK_COLOR,\n label: pieArc.data.display.title,\n value: formattedValueToString(pieArc.data.display),\n isActive: pieArc.index === arc.index,\n };\n });\n }\n return [\n {\n color: arc.data.display.color ?? FALLBACK_COLOR,\n label: arc.data.display.title,\n value: formattedValueToString(arc.data.display),\n },\n ];\n}\n\nfunction getLabelPos(arc: PieArcDatum<FieldDisplay>, outerRadius: number, innerRadius: number) {\n const r = (outerRadius + innerRadius) / 2;\n const a = (+arc.startAngle + +arc.endAngle) / 2 - Math.PI / 2;\n return [Math.cos(a) * r, Math.sin(a) * r];\n}\n\nfunction getGradientColorFrom(color: string, theme: GrafanaTheme2) {\n return tinycolor(color)\n .darken(20 * (theme.isDark ? 1 : -0.7))\n .spin(4)\n .toRgbString();\n}\n\nfunction getGradientColorTo(color: string, theme: GrafanaTheme2) {\n return tinycolor(color)\n .darken(10 * (theme.isDark ? 1 : -0.7))\n .spin(-4)\n .toRgbString();\n}\n\ninterface PieLayout {\n position: number;\n size: number;\n outerRadius: number;\n innerRadius: number;\n gradientFromOffset: number;\n}\n\nfunction getPieLayout(height: number, width: number, pieType: PieChartType, margin = 16): PieLayout {\n const size = Math.min(width, height);\n const outerRadius = (size - margin * 2) / 2;\n const donutThickness = pieType === PieChartType.Pie ? outerRadius : Math.max(outerRadius / 3, 20);\n const innerRadius = outerRadius - donutThickness;\n const centerOffset = (size - margin * 2) / 2;\n // for non donut pie charts shift gradient out a bit\n const gradientFromOffset = 1 - (outerRadius - innerRadius) / outerRadius;\n return {\n position: centerOffset + margin,\n size: size,\n outerRadius: outerRadius,\n innerRadius: innerRadius,\n gradientFromOffset: gradientFromOffset,\n };\n}\n\nenum HighLightState {\n Highlighted,\n Deemphasized,\n Normal,\n}\n\nfunction getHighlightState(highlightedTitle: string | undefined, arc: PieArcDatum<FieldDisplay>) {\n if (highlightedTitle) {\n if (highlightedTitle === arc.data.display.title) {\n return HighLightState.Highlighted;\n } else {\n return HighLightState.Deemphasized;\n }\n }\n return HighLightState.Normal;\n}\n\nfunction getSvgStyle(\n highlightState: HighLightState,\n styles: {\n svgArg: { normal: string; highlighted: string; deemphasized: string };\n }\n) {\n switch (highlightState) {\n case HighLightState.Highlighted:\n return styles.svgArg.highlighted;\n case HighLightState.Deemphasized:\n return styles.svgArg.deemphasized;\n case HighLightState.Normal:\n default:\n return styles.svgArg.normal;\n }\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n svgArg: {\n normal: css`\n transition: all 200ms ease-in-out;\n `,\n highlighted: css`\n transition: all 200ms ease-in-out;\n transform: scale3d(1.03, 1.03, 1);\n `,\n deemphasized: css`\n transition: all 200ms ease-in-out;\n fill-opacity: 0.5;\n `,\n },\n tooltipPortal: css`\n ${getTooltipContainerStyles(theme)}\n `,\n };\n};\n","import React, { useEffect, useState } from 'react';\nimport { Subscription } from 'rxjs';\n\nimport {\n DataHoverClearEvent,\n DataHoverEvent,\n FALLBACK_COLOR,\n FieldDisplay,\n formattedValueToString,\n getFieldDisplayValues,\n PanelProps,\n} from '@grafana/data';\nimport { PanelDataErrorView } from '@grafana/runtime';\nimport { HideSeriesConfig, LegendDisplayMode } from '@grafana/schema';\nimport {\n SeriesVisibilityChangeBehavior,\n usePanelContext,\n useTheme2,\n VizLayout,\n VizLegend,\n VizLegendItem,\n} from '@grafana/ui';\n\nimport { PieChart } from './PieChart';\nimport { PieChartLegendOptions, PieChartLegendValues, PieChartOptions } from './types';\nimport { filterDisplayItems, sumDisplayItemsReducer } from './utils';\n\nconst defaultLegendOptions: PieChartLegendOptions = {\n displayMode: LegendDisplayMode.List,\n showLegend: true,\n placement: 'right',\n calcs: [],\n values: [PieChartLegendValues.Percent],\n};\n\ninterface Props extends PanelProps<PieChartOptions> {}\n\n/**\n * @beta\n */\nexport function PieChartPanel(props: Props) {\n const { data, timeZone, fieldConfig, replaceVariables, width, height, options, id } = props;\n\n const theme = useTheme2();\n const highlightedTitle = useSliceHighlightState();\n const fieldDisplayValues = getFieldDisplayValues({\n fieldConfig,\n reduceOptions: options.reduceOptions,\n data: data.series,\n theme: theme,\n replaceVariables,\n timeZone,\n });\n\n if (!hasFrames(fieldDisplayValues)) {\n return <PanelDataErrorView panelId={id} fieldConfig={fieldConfig} data={data} />;\n }\n\n return (\n <VizLayout width={width} height={height} legend={getLegend(props, fieldDisplayValues)}>\n {(vizWidth: number, vizHeight: number) => {\n return (\n <PieChart\n width={vizWidth}\n height={vizHeight}\n highlightedTitle={highlightedTitle}\n fieldDisplayValues={fieldDisplayValues}\n tooltipOptions={options.tooltip}\n pieType={options.pieType}\n displayLabels={options.displayLabels}\n />\n );\n }}\n </VizLayout>\n );\n}\n\nfunction getLegend(props: Props, displayValues: FieldDisplay[]) {\n const legendOptions = props.options.legend ?? defaultLegendOptions;\n\n if (legendOptions.showLegend === false) {\n return undefined;\n }\n const total = displayValues.filter(filterDisplayItems).reduce(sumDisplayItemsReducer, 0);\n\n const legendItems: VizLegendItem[] = displayValues\n // Since the pie chart is always sorted, let's sort the legend as well.\n .sort((a, b) => {\n if (isNaN(a.display.numeric)) {\n return 1;\n } else if (isNaN(b.display.numeric)) {\n return -1;\n } else {\n return b.display.numeric - a.display.numeric;\n }\n })\n .map<VizLegendItem | undefined>((value: FieldDisplay, idx: number) => {\n const hideFrom: HideSeriesConfig = value.field.custom?.hideFrom ?? {};\n\n if (hideFrom.legend) {\n return undefined;\n }\n\n const hideFromViz = Boolean(hideFrom.viz);\n\n const display = value.display;\n return {\n label: display.title ?? '',\n color: display.color ?? FALLBACK_COLOR,\n yAxis: 1,\n disabled: hideFromViz,\n getItemKey: () => (display.title ?? '') + idx,\n getDisplayValues: () => {\n const valuesToShow = legendOptions.values ?? [];\n let displayValues = [];\n\n if (valuesToShow.includes(PieChartLegendValues.Value)) {\n displayValues.push({ numeric: display.numeric, text: formattedValueToString(display), title: 'Value' });\n }\n\n if (valuesToShow.includes(PieChartLegendValues.Percent)) {\n const fractionOfTotal = hideFromViz ? 0 : display.numeric / total;\n const percentOfTotal = fractionOfTotal * 100;\n\n displayValues.push({\n numeric: fractionOfTotal,\n percent: percentOfTotal,\n text:\n hideFromViz || isNaN(fractionOfTotal)\n ? props.fieldConfig.defaults.noValue ?? '-'\n : percentOfTotal.toFixed(value.field.decimals ?? 0) + '%',\n title: valuesToShow.length > 1 ? 'Percent' : '',\n });\n }\n\n return displayValues;\n },\n };\n })\n .filter((i): i is VizLegendItem => !!i);\n\n return (\n <VizLegend\n items={legendItems}\n seriesVisibilityChangeBehavior={SeriesVisibilityChangeBehavior.Hide}\n placement={legendOptions.placement}\n displayMode={legendOptions.displayMode}\n />\n );\n}\n\nfunction hasFrames(fieldDisplayValues: FieldDisplay[]) {\n return fieldDisplayValues.some((fd) => fd.view?.dataFrame.length);\n}\n\nfunction useSliceHighlightState() {\n const [highlightedTitle, setHighlightedTitle] = useState<string>();\n const { eventBus } = usePanelContext();\n\n useEffect(() => {\n const setHighlightedSlice = (event: DataHoverEvent) => {\n setHighlightedTitle(event.payload.dataId);\n };\n\n const resetHighlightedSlice = (event: DataHoverClearEvent) => {\n setHighlightedTitle(undefined);\n };\n\n const subs = new Subscription();\n subs.add(eventBus.getStream(DataHoverEvent).subscribe({ next: setHighlightedSlice }));\n subs.add(eventBus.getStream(DataHoverClearEvent).subscribe({ next: resetHighlightedSlice }));\n\n return () => {\n subs.unsubscribe();\n };\n }, [setHighlightedTitle, eventBus]);\n\n return highlightedTitle;\n}\n","import { FieldColorModeId, FieldConfigProperty, PanelPlugin } from '@grafana/data';\nimport { commonOptionsBuilder } from '@grafana/ui';\n\nimport { addStandardDataReduceOptions } from '../stat/common';\n\nimport { PieChartPanel } from './PieChartPanel';\nimport { PieChartPanelChangedHandler } from './migrations';\nimport { PieChartSuggestionsSupplier } from './suggestions';\nimport { PieChartOptions, PieChartType, PieChartLabels, PieChartLegendValues } from './types';\n\nexport const plugin = new PanelPlugin<PieChartOptions>(PieChartPanel)\n .setPanelChangeHandler(PieChartPanelChangedHandler)\n .useFieldConfig({\n disableStandardOptions: [FieldConfigProperty.Thresholds],\n standardOptions: {\n [FieldConfigProperty.Color]: {\n settings: {\n byValueSupport: false,\n bySeriesSupport: true,\n preferThresholdsMode: false,\n },\n defaultValue: {\n mode: FieldColorModeId.PaletteClassic,\n },\n },\n },\n useCustomConfig: (builder) => {\n commonOptionsBuilder.addHideFrom(builder);\n },\n })\n .setPanelOptions((builder) => {\n addStandardDataReduceOptions(builder);\n builder\n .addRadio({\n name: 'Piechart type',\n description: 'How the piechart should be rendered',\n path: 'pieType',\n settings: {\n options: [\n { value: PieChartType.Pie, label: 'Pie' },\n { value: PieChartType.Donut, label: 'Donut' },\n ],\n },\n defaultValue: PieChartType.Pie,\n })\n .addMultiSelect({\n name: 'Labels',\n path: 'displayLabels',\n description: 'Select the labels to be displayed in the pie chart',\n settings: {\n options: [\n { value: PieChartLabels.Percent, label: 'Percent' },\n { value: PieChartLabels.Name, label: 'Name' },\n { value: PieChartLabels.Value, label: 'Value' },\n ],\n },\n });\n\n commonOptionsBuilder.addTooltipOptions(builder);\n commonOptionsBuilder.addLegendOptions(builder, false);\n\n builder.addMultiSelect({\n name: 'Legend values',\n path: 'legend.values',\n category: ['Legend'],\n settings: {\n options: [\n { value: PieChartLegendValues.Percent, label: 'Percent' },\n { value: PieChartLegendValues.Value, label: 'Value' },\n ],\n },\n showIf: (c) => c.legend.showLegend !== false,\n });\n })\n .setSuggestionsSupplier(new PieChartSuggestionsSupplier());\n","import { FieldColorModeId, FieldConfigProperty, FieldMatcherID, PanelModel } from '@grafana/data';\nimport { LegendDisplayMode } from '@grafana/schema';\n\nimport { PieChartOptions, PieChartLabels, PieChartLegendValues, PieChartType } from './types';\n\nexport const PieChartPanelChangedHandler = (\n panel: PanelModel<Partial<PieChartOptions>> | any,\n prevPluginId: string,\n prevOptions: any\n) => {\n if (prevPluginId === 'grafana-piechart-panel' && prevOptions.angular) {\n const angular = prevOptions.angular;\n const overrides = [];\n let options: PieChartOptions = panel.options;\n\n // Migrate color overrides for series\n if (angular.aliasColors) {\n for (const alias of Object.keys(angular.aliasColors)) {\n const color = angular.aliasColors[alias];\n if (color) {\n overrides.push({\n matcher: {\n id: FieldMatcherID.byName,\n options: alias,\n },\n properties: [\n {\n id: FieldConfigProperty.Color,\n value: {\n mode: FieldColorModeId.Fixed,\n fixedColor: color,\n },\n },\n ],\n });\n }\n }\n }\n\n panel.fieldConfig = {\n overrides,\n defaults: {\n unit: angular.format,\n decimals: angular.decimals ? angular.decimals : 0, // Old piechart defaults to 0 decimals while the new one defaults to 1\n },\n };\n\n options.legend = {\n placement: 'right',\n values: [],\n displayMode: LegendDisplayMode.Table,\n showLegend: true,\n calcs: [],\n };\n\n if (angular.valueName) {\n options.reduceOptions = { calcs: [] };\n switch (angular.valueName) {\n case 'current':\n options.reduceOptions.calcs = ['lastNotNull'];\n break;\n case 'min':\n options.reduceOptions.calcs = ['min'];\n break;\n case 'max':\n options.reduceOptions.calcs = ['max'];\n break;\n case 'avg':\n options.reduceOptions.calcs = ['mean'];\n break;\n case 'total':\n options.reduceOptions.calcs = ['sum'];\n break;\n }\n }\n\n switch (angular.legendType) {\n case 'Under graph':\n options.legend.placement = 'bottom';\n break;\n case 'Right side':\n options.legend.placement = 'right';\n break;\n }\n\n switch (angular.pieType) {\n case 'pie':\n options.pieType = PieChartType.Pie;\n break;\n case 'donut':\n options.pieType = PieChartType.Donut;\n break;\n }\n\n if (angular.legend) {\n if (!angular.legend.show) {\n options.legend.showLegend = false;\n }\n if (angular.legend.values) {\n options.legend.values.push(PieChartLegendValues.Value);\n }\n if (angular.legend.percentage) {\n options.legend.values.push(PieChartLegendValues.Percent);\n }\n if (!angular.legend.percentage && !angular.legend.values) {\n // If you deselect both value and percentage in the old pie chart plugin, the legend is hidden.\n options.legend.showLegend = false;\n }\n }\n\n // Set up labels when the old piechart is using 'on graph', for the legend option.\n if (angular.legendType === 'On graph') {\n options.legend.showLegend = false;\n options.displayLabels = [PieChartLabels.Name];\n if (angular.legend.values) {\n options.displayLabels.push(PieChartLabels.Value);\n }\n if (angular.legend.percentage) {\n options.displayLabels.push(PieChartLabels.Percent);\n }\n }\n\n return options;\n }\n return {};\n};\n","import { VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { PieChartLabels, PieChartOptions, PieChartType } from './types';\n\nexport class PieChartSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const list = builder.getListAppender<PieChartOptions, {}>({\n name: SuggestionName.PieChart,\n pluginId: 'piechart',\n options: {\n reduceOptions: {\n values: false,\n calcs: ['lastNotNull'],\n },\n displayLabels: [PieChartLabels.Percent],\n legend: {\n placement: 'right',\n values: [],\n } as any,\n },\n cardOptions: {\n previewModifier: (s) => {\n // Hide labels in preview\n s.options!.legend.showLegend = false;\n },\n },\n });\n\n const { dataSummary } = builder;\n\n if (!dataSummary.hasNumberField) {\n return;\n }\n\n if (dataSummary.hasStringField && dataSummary.frameCount === 1) {\n // if many values this or single value PieChart is not a good option\n if (dataSummary.rowCountTotal > 30 || dataSummary.rowCountTotal < 2) {\n return;\n }\n\n list.append({\n name: SuggestionName.PieChart,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n },\n },\n });\n\n list.append({\n name: SuggestionName.PieChartDonut,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n },\n pieType: PieChartType.Donut,\n },\n });\n\n return;\n }\n\n if (dataSummary.numberFieldCount > 30 || dataSummary.numberFieldCount < 2) {\n return;\n }\n\n list.append({\n name: SuggestionName.PieChart,\n });\n\n list.append({\n name: SuggestionName.PieChartDonut,\n options: {\n pieType: PieChartType.Donut,\n },\n });\n }\n}\n","import React from 'react';\n\nimport {\n DataFrame,\n FALLBACK_COLOR,\n Field,\n getDisplayProcessor,\n getFieldDisplayName,\n TimeZone,\n LinkModel,\n} from '@grafana/data';\nimport { MenuItem, SeriesTableRow, useTheme2 } from '@grafana/ui';\n\nimport { findNextStateIndex, fmtDuration } from './utils';\n\ninterface StateTimelineTooltipProps {\n data: DataFrame[];\n alignedData: DataFrame;\n seriesIdx: number;\n datapointIdx: number;\n timeZone: TimeZone;\n onAnnotationAdd?: () => void;\n}\n\nexport const StateTimelineTooltip: React.FC<StateTimelineTooltipProps> = ({\n data,\n alignedData,\n seriesIdx,\n datapointIdx,\n timeZone,\n onAnnotationAdd,\n}) => {\n const theme = useTheme2();\n\n if (!data || datapointIdx == null) {\n return null;\n }\n\n const field = alignedData.fields[seriesIdx!];\n\n const links: Array<LinkModel<Field>> = [];\n const linkLookup = new Set<string>();\n\n if (field.getLinks) {\n const v = field.values.get(datapointIdx);\n const disp = field.display ? field.display(v) : { text: `${v}`, numeric: +v };\n field.getLinks({ calculatedValue: disp, valueRowIndex: datapointIdx }).forEach((link) => {\n const key = `${link.title}/${link.href}`;\n if (!linkLookup.has(key)) {\n links.push(link);\n linkLookup.add(key);\n }\n });\n }\n\n const xField = alignedData.fields[0];\n const xFieldFmt = xField.display || getDisplayProcessor({ field: xField, timeZone, theme });\n\n const dataFrameFieldIndex = field.state?.origin;\n const fieldFmt = field.display || getDisplayProcessor({ field, timeZone, theme });\n const value = field.values.get(datapointIdx!);\n const display = fieldFmt(value);\n const fieldDisplayName = dataFrameFieldIndex\n ? getFieldDisplayName(\n data[dataFrameFieldIndex.frameIndex].fields[dataFrameFieldIndex.fieldIndex],\n data[dataFrameFieldIndex.frameIndex],\n data\n )\n : null;\n\n const nextStateIdx = findNextStateIndex(field, datapointIdx!);\n let nextStateTs;\n if (nextStateIdx) {\n nextStateTs = xField.values.get(nextStateIdx!);\n }\n\n const stateTs = xField.values.get(datapointIdx!);\n\n let toFragment = null;\n let durationFragment = null;\n\n if (nextStateTs) {\n const duration = nextStateTs && fmtDuration(nextStateTs - stateTs);\n durationFragment = (\n <>\n <br />\n <strong>Duration:</strong> {duration}\n </>\n );\n toFragment = (\n <>\n {' to'} <strong>{xFieldFmt(xField.values.get(nextStateIdx!)).text}</strong>\n </>\n );\n }\n\n return (\n <div>\n <div style={{ fontSize: theme.typography.bodySmall.fontSize }}>\n {fieldDisplayName}\n <br />\n <SeriesTableRow label={display.text} color={display.color || FALLBACK_COLOR} isActive />\n From <strong>{xFieldFmt(xField.values.get(datapointIdx!)).text}</strong>\n {toFragment}\n {durationFragment}\n </div>\n <div\n style={{\n margin: theme.spacing(1, -1, -1, -1),\n borderTop: `1px solid ${theme.colors.border.weak}`,\n }}\n >\n {onAnnotationAdd && <MenuItem label={'Add annotation'} icon={'comment-alt'} onClick={onAnnotationAdd} />}\n {links.length > 0 &&\n links.map((link, i) => (\n <MenuItem\n key={i}\n icon={'external-link-alt'}\n target={link.target}\n label={link.title}\n url={link.href}\n onClick={link.onClick}\n />\n ))}\n </div>\n </div>\n );\n};\n\nStateTimelineTooltip.displayName = 'StateTimelineTooltip';\n","import React from 'react';\n\nimport { DataFrame, FALLBACK_COLOR, FieldType, TimeRange } from '@grafana/data';\nimport { VisibilityMode } from '@grafana/schema';\nimport {\n PanelContext,\n PanelContextRoot,\n GraphNG,\n GraphNGProps,\n UPlotConfigBuilder,\n VizLayout,\n VizLegend,\n VizLegendItem,\n} from '@grafana/ui';\n\nimport { TimelineMode, TimelineOptions, TimelineValueAlignment } from './types';\nimport { preparePlotConfigBuilder } from './utils';\n\n/**\n * @alpha\n */\nexport interface TimelineProps\n extends TimelineOptions,\n Omit<GraphNGProps, 'prepConfig' | 'propsToDiff' | 'renderLegend'> {\n mode: TimelineMode;\n rowHeight: number;\n showValue: VisibilityMode;\n alignValue?: TimelineValueAlignment;\n colWidth?: number;\n legendItems?: VizLegendItem[];\n}\n\nconst propsToDiff = ['rowHeight', 'colWidth', 'showValue', 'mergeValues', 'alignValue'];\n\nexport class TimelineChart extends React.Component<TimelineProps> {\n static contextType = PanelContextRoot;\n panelContext: PanelContext = {} as PanelContext;\n\n getValueColor = (frameIdx: number, fieldIdx: number, value: any) => {\n const field = this.props.frames[frameIdx].fields[fieldIdx];\n\n if (field.display) {\n const disp = field.display(value); // will apply color modes\n if (disp.color) {\n return disp.color;\n }\n }\n\n return FALLBACK_COLOR;\n };\n\n prepConfig = (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => {\n this.panelContext = this.context as PanelContext;\n const { eventBus, sync } = this.panelContext;\n\n return preparePlotConfigBuilder({\n frame: alignedFrame,\n getTimeRange,\n eventBus,\n sync,\n allFrames: this.props.frames,\n ...this.props,\n\n // Ensure timezones is passed as an array\n timeZones: Array.isArray(this.props.timeZones) ? this.props.timeZones : [this.props.timeZones],\n\n // When there is only one row, use the full space\n rowHeight: alignedFrame.fields.length > 2 ? this.props.rowHeight : 1,\n getValueColor: this.getValueColor,\n });\n };\n\n renderLegend = (config: UPlotConfigBuilder) => {\n const { legend, legendItems } = this.props;\n\n if (!config || !legendItems || !legend || legend.showLegend === false) {\n return null;\n }\n\n return (\n <VizLayout.Legend placement={legend.placement}>\n <VizLegend placement={legend.placement} items={legendItems} displayMode={legend.displayMode} readonly />\n </VizLayout.Legend>\n );\n };\n\n render() {\n return (\n <GraphNG\n {...this.props}\n fields={{\n x: (f) => f.type === FieldType.time,\n y: (f) => f.type === FieldType.number || f.type === FieldType.boolean || f.type === FieldType.string,\n }}\n prepConfig={this.prepConfig}\n propsToDiff={propsToDiff}\n renderLegend={this.renderLegend}\n />\n );\n }\n}\n","import {\n FieldColorModeId,\n FieldConfigProperty,\n FieldType,\n identityOverrideProcessor,\n PanelPlugin,\n} from '@grafana/data';\nimport { VisibilityMode } from '@grafana/schema';\nimport { commonOptionsBuilder } from '@grafana/ui';\n\nimport { SpanNullsEditor } from '../timeseries/SpanNullsEditor';\n\nimport { StateTimelinePanel } from './StateTimelinePanel';\nimport { timelinePanelChangedHandler } from './migrations';\nimport { StatTimelineSuggestionsSupplier } from './suggestions';\nimport { TimelineOptions, TimelineFieldConfig, defaultPanelOptions, defaultTimelineFieldConfig } from './types';\n\nexport const plugin = new PanelPlugin<TimelineOptions, TimelineFieldConfig>(StateTimelinePanel)\n .setPanelChangeHandler(timelinePanelChangedHandler)\n .useFieldConfig({\n standardOptions: {\n [FieldConfigProperty.Color]: {\n settings: {\n byValueSupport: true,\n },\n defaultValue: {\n mode: FieldColorModeId.ContinuousGrYlRd,\n },\n },\n },\n useCustomConfig: (builder) => {\n builder\n .addSliderInput({\n path: 'lineWidth',\n name: 'Line width',\n defaultValue: defaultTimelineFieldConfig.lineWidth,\n settings: {\n min: 0,\n max: 10,\n step: 1,\n },\n })\n .addSliderInput({\n path: 'fillOpacity',\n name: 'Fill opacity',\n defaultValue: defaultTimelineFieldConfig.fillOpacity,\n settings: {\n min: 0,\n max: 100,\n step: 1,\n },\n })\n .addCustomEditor<void, boolean>({\n id: 'spanNulls',\n path: 'spanNulls',\n name: 'Connect null values',\n defaultValue: false,\n editor: SpanNullsEditor,\n override: SpanNullsEditor,\n shouldApply: (f) => f.type !== FieldType.time,\n process: identityOverrideProcessor,\n });\n },\n })\n .setPanelOptions((builder) => {\n builder\n .addBooleanSwitch({\n path: 'mergeValues',\n name: 'Merge equal consecutive values',\n defaultValue: defaultPanelOptions.mergeValues,\n })\n .addRadio({\n path: 'showValue',\n name: 'Show values',\n settings: {\n options: [\n { value: VisibilityMode.Auto, label: 'Auto' },\n { value: VisibilityMode.Always, label: 'Always' },\n { value: VisibilityMode.Never, label: 'Never' },\n ],\n },\n defaultValue: defaultPanelOptions.showValue,\n })\n .addRadio({\n path: 'alignValue',\n name: 'Align values',\n settings: {\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n ],\n },\n defaultValue: defaultPanelOptions.alignValue,\n })\n .addSliderInput({\n path: 'rowHeight',\n name: 'Row height',\n settings: {\n min: 0,\n max: 1,\n step: 0.01,\n },\n defaultValue: defaultPanelOptions.rowHeight,\n });\n\n commonOptionsBuilder.addLegendOptions(builder, false);\n commonOptionsBuilder.addTooltipOptions(builder, true);\n })\n .setSuggestionsSupplier(new StatTimelineSuggestionsSupplier())\n .setDataSupport({ annotations: true });\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { CartesianCoords2D, DataFrame, FieldType, PanelProps } from '@grafana/data';\nimport { Portal, UPlotConfigBuilder, usePanelContext, useTheme2, VizTooltipContainer, ZoomPlugin } from '@grafana/ui';\nimport { HoverEvent, addTooltipSupport } from '@grafana/ui/src/components/uPlot/config/addTooltipSupport';\nimport { CloseButton } from 'app/core/components/CloseButton/CloseButton';\nimport { getLastStreamingDataFramePacket } from 'app/features/live/data/StreamingDataFrame';\n\nimport { AnnotationEditorPlugin } from '../timeseries/plugins/AnnotationEditorPlugin';\nimport { AnnotationsPlugin } from '../timeseries/plugins/AnnotationsPlugin';\nimport { OutsideRangePlugin } from '../timeseries/plugins/OutsideRangePlugin';\nimport { getTimezones } from '../timeseries/utils';\n\nimport { StateTimelineTooltip } from './StateTimelineTooltip';\nimport { TimelineChart } from './TimelineChart';\nimport { TimelineMode, TimelineOptions } from './types';\nimport { prepareTimelineFields, prepareTimelineLegendItems } from './utils';\n\nconst TOOLTIP_OFFSET = 10;\n\ninterface TimelinePanelProps extends PanelProps<TimelineOptions> {}\n\n/**\n * @alpha\n */\nexport const StateTimelinePanel: React.FC<TimelinePanelProps> = ({\n data,\n timeRange,\n timeZone,\n options,\n width,\n height,\n replaceVariables,\n onChangeTimeRange,\n}) => {\n const theme = useTheme2();\n\n const oldConfig = useRef<UPlotConfigBuilder | undefined>(undefined);\n const isToolTipOpen = useRef<boolean>(false);\n\n const [hover, setHover] = useState<HoverEvent | undefined>(undefined);\n const [coords, setCoords] = useState<{ viewport: CartesianCoords2D; canvas: CartesianCoords2D } | null>(null);\n const [focusedSeriesIdx, setFocusedSeriesIdx] = useState<number | null>(null);\n const [focusedPointIdx, setFocusedPointIdx] = useState<number | null>(null);\n const [shouldDisplayCloseButton, setShouldDisplayCloseButton] = useState<boolean>(false);\n const { canAddAnnotations } = usePanelContext();\n\n const onCloseToolTip = () => {\n isToolTipOpen.current = false;\n setCoords(null);\n setShouldDisplayCloseButton(false);\n };\n\n const onUPlotClick = () => {\n isToolTipOpen.current = !isToolTipOpen.current;\n // Linking into useState required to re-render tooltip\n setShouldDisplayCloseButton(isToolTipOpen.current);\n };\n\n const { frames, warn } = useMemo(\n () => prepareTimelineFields(data?.series, options.mergeValues ?? true, timeRange, theme),\n [data, options.mergeValues, timeRange, theme]\n );\n\n const legendItems = useMemo(\n () => prepareTimelineLegendItems(frames, options.legend, theme),\n [frames, options.legend, theme]\n );\n\n const timezones = useMemo(() => getTimezones(options.timezones, timeZone), [options.timezones, timeZone]);\n\n const renderCustomTooltip = useCallback(\n (alignedData: DataFrame, seriesIdx: number | null, datapointIdx: number | null, onAnnotationAdd?: () => void) => {\n const data = frames ?? [];\n // Count value fields in the state-timeline-ready frame\n const valueFieldsCount = data.reduce(\n (acc, frame) => acc + frame.fields.filter((field) => field.type !== FieldType.time).length,\n 0\n );\n\n // Not caring about multi mode in StateTimeline\n if (seriesIdx === null || datapointIdx === null) {\n return null;\n }\n\n /**\n * There could be a case when the tooltip shows a data from one of a multiple query and the other query finishes first\n * from refreshing. This causes data to be out of sync. alignedData - 1 because Time field doesn't count.\n * Render nothing in this case to prevent error.\n * See https://github.com/grafana/support-escalations/issues/932\n */\n if (\n (!alignedData.meta?.transformations?.length && alignedData.fields.length - 1 !== valueFieldsCount) ||\n !alignedData.fields[seriesIdx]\n ) {\n return null;\n }\n\n return (\n <>\n {shouldDisplayCloseButton && (\n <div\n style={{\n width: '100%',\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n >\n <CloseButton\n onClick={onCloseToolTip}\n style={{\n position: 'relative',\n top: 'auto',\n right: 'auto',\n marginRight: 0,\n }}\n />\n </div>\n )}\n <StateTimelineTooltip\n data={data}\n alignedData={alignedData}\n seriesIdx={seriesIdx}\n datapointIdx={datapointIdx}\n timeZone={timeZone}\n onAnnotationAdd={onAnnotationAdd}\n />\n </>\n );\n },\n [timeZone, frames, shouldDisplayCloseButton]\n );\n\n if (!frames || warn) {\n return (\n <div className=\"panel-empty\">\n <p>{warn ?? 'No data found in response'}</p>\n </div>\n );\n }\n\n if (frames.length === 1) {\n const packet = getLastStreamingDataFramePacket(frames[0]);\n if (packet) {\n // console.log('STREAM Packet', packet);\n }\n }\n const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations());\n\n return (\n <TimelineChart\n theme={theme}\n frames={frames}\n structureRev={data.structureRev}\n timeRange={timeRange}\n timeZones={timezones}\n width={width}\n height={height}\n legendItems={legendItems}\n {...options}\n mode={TimelineMode.Changes}\n >\n {(config, alignedFrame) => {\n if (oldConfig.current !== config) {\n oldConfig.current = addTooltipSupport({\n config,\n onUPlotClick,\n setFocusedSeriesIdx,\n setFocusedPointIdx,\n setCoords,\n setHover,\n isToolTipOpen,\n });\n }\n return (\n <>\n <ZoomPlugin config={config} onZoom={onChangeTimeRange} />\n\n <OutsideRangePlugin config={config} onChangeTimeRange={onChangeTimeRange} />\n\n {data.annotations && (\n <AnnotationsPlugin annotations={data.annotations} config={config} timeZone={timeZone} />\n )}\n\n {enableAnnotationCreation ? (\n <AnnotationEditorPlugin data={alignedFrame} timeZone={timeZone} config={config}>\n {({ startAnnotating }) => {\n return (\n <Portal>\n {hover && coords && (\n <VizTooltipContainer\n position={{ x: coords.viewport.x, y: coords.viewport.y }}\n offset={{ x: TOOLTIP_OFFSET, y: TOOLTIP_OFFSET }}\n allowPointerEvents={isToolTipOpen.current}\n >\n {renderCustomTooltip(alignedFrame, focusedSeriesIdx, focusedPointIdx, () => {\n startAnnotating({ coords: { plotCanvas: coords.canvas, viewport: coords.viewport } });\n onCloseToolTip();\n })}\n </VizTooltipContainer>\n )}\n </Portal>\n );\n }}\n </AnnotationEditorPlugin>\n ) : (\n <Portal>\n {hover && coords && (\n <VizTooltipContainer\n position={{ x: coords.viewport.x, y: coords.viewport.y }}\n offset={{ x: TOOLTIP_OFFSET, y: TOOLTIP_OFFSET }}\n allowPointerEvents={isToolTipOpen.current}\n >\n {renderCustomTooltip(alignedFrame, focusedSeriesIdx, focusedPointIdx)}\n </VizTooltipContainer>\n )}\n </Portal>\n )}\n </>\n );\n }}\n </TimelineChart>\n );\n};\n","import { isArray } from 'lodash';\n\nimport { FieldConfigSource, MappingType, PanelModel, ValueMap } from '@grafana/data';\n\nimport { TimelineFieldConfig, TimelineOptions } from './types';\n\n// This is called when the panel changes from another panel\nexport const timelinePanelChangedHandler = (\n panel: PanelModel<Partial<TimelineOptions>> | any,\n prevPluginId: string,\n prevOptions: any\n) => {\n let options = (panel.options ?? {}) as TimelineOptions;\n\n // Changing from angular singlestat\n if (prevPluginId === 'natel-discrete-panel' && prevOptions.angular) {\n const oldOptions = prevOptions.angular;\n const fieldConfig: FieldConfigSource = panel.fieldConfig ?? { defaults: {}, overrides: [] };\n\n if (oldOptions.units) {\n fieldConfig.defaults.unit = oldOptions.units;\n }\n\n const custom: TimelineFieldConfig = {\n fillOpacity: 100,\n lineWidth: 0,\n };\n fieldConfig.defaults.custom = custom;\n options.mergeValues = true;\n\n // Convert mappings\n const valuemap: ValueMap = { type: MappingType.ValueToText, options: {} };\n fieldConfig.defaults.mappings = [valuemap];\n\n if (isArray(oldOptions.colorMaps)) {\n for (const p of oldOptions.colorMaps) {\n const color = p.color as string;\n if (color) {\n valuemap.options[p.text as string] = { color };\n }\n }\n }\n\n if (isArray(oldOptions.valueMaps)) {\n for (const p of oldOptions.valueMaps) {\n const text = p.text as string;\n const value = p.value as string;\n if (text && value) {\n let old = valuemap.options[value];\n if (old) {\n old.text = text;\n } else {\n valuemap.options[value] = { text };\n }\n }\n }\n }\n\n if (isArray(oldOptions.rangeMaps)) {\n for (const p of oldOptions.rangeMaps) {\n let from = +p.from;\n let to = +p.to;\n const text = p.text as string;\n if (text) {\n fieldConfig.defaults.mappings.push({\n type: MappingType.RangeToText,\n options: {\n from,\n to,\n result: { text },\n },\n });\n }\n }\n }\n\n // mutates the input\n panel.fieldConfig = fieldConfig;\n }\n\n return options;\n};\n","import { VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { TimelineFieldConfig, TimelineOptions } from './types';\n\nexport class StatTimelineSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary: ds } = builder;\n\n if (!ds.hasData) {\n return;\n }\n\n // This panel needs a time field and a string or number field\n if (!ds.hasTimeField || (!ds.hasStringField && !ds.hasNumberField)) {\n return;\n }\n\n // If there are many series then they won't fit on y-axis so this panel is not good fit\n if (ds.numberFieldCount >= 30) {\n return;\n }\n\n // Probably better ways to filter out this by inspecting the types of string values so view this as temporary\n if (ds.preferredVisualisationType === 'logs') {\n return;\n }\n\n const list = builder.getListAppender<TimelineOptions, TimelineFieldConfig>({\n name: '',\n pluginId: 'state-timeline',\n options: {},\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n });\n\n list.append({ name: SuggestionName.StateTimeline });\n }\n}\n","import React from 'react';\n\nimport {\n DataFrame,\n FALLBACK_COLOR,\n Field,\n getDisplayProcessor,\n getFieldDisplayName,\n TimeZone,\n LinkModel,\n} from '@grafana/data';\nimport { MenuItem, SeriesTableRow, useTheme2 } from '@grafana/ui';\n\ninterface StatusHistoryTooltipProps {\n data: DataFrame[];\n alignedData: DataFrame;\n seriesIdx: number;\n datapointIdx: number;\n timeZone: TimeZone;\n}\n\nexport const StatusHistoryTooltip: React.FC<StatusHistoryTooltipProps> = ({\n data,\n alignedData,\n seriesIdx,\n datapointIdx,\n timeZone,\n}) => {\n const theme = useTheme2();\n\n if (!data || datapointIdx == null) {\n return null;\n }\n\n const field = alignedData.fields[seriesIdx!];\n\n const links: Array<LinkModel<Field>> = [];\n const linkLookup = new Set<string>();\n\n if (field.getLinks) {\n const v = field.values.get(datapointIdx);\n const disp = field.display ? field.display(v) : { text: `${v}`, numeric: +v };\n field.getLinks({ calculatedValue: disp, valueRowIndex: datapointIdx }).forEach((link) => {\n const key = `${link.title}/${link.href}`;\n if (!linkLookup.has(key)) {\n links.push(link);\n linkLookup.add(key);\n }\n });\n }\n\n const dataFrameFieldIndex = field.state?.origin;\n const fieldFmt = field.display || getDisplayProcessor({ field, timeZone, theme });\n const value = field.values.get(datapointIdx!);\n const display = fieldFmt(value);\n const fieldDisplayName = dataFrameFieldIndex\n ? getFieldDisplayName(\n data[dataFrameFieldIndex.frameIndex].fields[dataFrameFieldIndex.fieldIndex],\n data[dataFrameFieldIndex.frameIndex],\n data\n )\n : null;\n\n return (\n <div>\n <div style={{ fontSize: theme.typography.bodySmall.fontSize }}>\n {fieldDisplayName}\n <br />\n <SeriesTableRow label={display.text} color={display.color || FALLBACK_COLOR} isActive />\n </div>\n {links.length > 0 && (\n <div\n style={{\n margin: theme.spacing(1, -1, -1, -1),\n borderTop: `1px solid ${theme.colors.border.weak}`,\n }}\n >\n {links.map((link, i) => (\n <MenuItem\n key={i}\n icon={'external-link-alt'}\n target={link.target}\n label={link.title}\n url={link.href}\n onClick={link.onClick}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nStatusHistoryTooltip.displayName = 'StatusHistoryTooltip';\n","import {\n HideableFieldConfig,\n VisibilityMode,\n OptionsWithTooltip,\n OptionsWithLegend,\n OptionsWithTimezones,\n} from '@grafana/schema';\n\n/**\n * @alpha\n */\nexport interface StatusPanelOptions extends OptionsWithTooltip, OptionsWithLegend, OptionsWithTimezones {\n showValue: VisibilityMode;\n rowHeight: number;\n colWidth?: number;\n}\n\n/**\n * @alpha\n */\nexport interface StatusFieldConfig extends HideableFieldConfig {\n lineWidth?: number; // 0\n fillOpacity?: number; // 100\n}\n\n/**\n * @alpha\n */\nexport const defaultStatusFieldConfig: StatusFieldConfig = {\n lineWidth: 1,\n fillOpacity: 70,\n};\n","import { FieldColorModeId, FieldConfigProperty, PanelPlugin } from '@grafana/data';\nimport { VisibilityMode } from '@grafana/schema';\nimport { commonOptionsBuilder } from '@grafana/ui';\n\nimport { StatusHistoryPanel } from './StatusHistoryPanel';\nimport { StatusHistorySuggestionsSupplier } from './suggestions';\nimport { StatusPanelOptions, StatusFieldConfig, defaultStatusFieldConfig } from './types';\n\nexport const plugin = new PanelPlugin<StatusPanelOptions, StatusFieldConfig>(StatusHistoryPanel)\n .useFieldConfig({\n standardOptions: {\n [FieldConfigProperty.Color]: {\n settings: {\n byValueSupport: true,\n },\n defaultValue: {\n mode: FieldColorModeId.Thresholds,\n },\n },\n },\n useCustomConfig: (builder) => {\n builder\n .addSliderInput({\n path: 'lineWidth',\n name: 'Line width',\n defaultValue: defaultStatusFieldConfig.lineWidth,\n settings: {\n min: 0,\n max: 10,\n step: 1,\n },\n })\n .addSliderInput({\n path: 'fillOpacity',\n name: 'Fill opacity',\n defaultValue: defaultStatusFieldConfig.fillOpacity,\n settings: {\n min: 0,\n max: 100,\n step: 1,\n },\n });\n },\n })\n .setPanelOptions((builder) => {\n builder\n .addRadio({\n path: 'showValue',\n name: 'Show values',\n settings: {\n options: [\n { value: VisibilityMode.Auto, label: 'Auto' },\n { value: VisibilityMode.Always, label: 'Always' },\n { value: VisibilityMode.Never, label: 'Never' },\n ],\n },\n defaultValue: VisibilityMode.Auto,\n })\n .addSliderInput({\n path: 'rowHeight',\n name: 'Row height',\n defaultValue: 0.9,\n settings: {\n min: 0,\n max: 1,\n step: 0.01,\n },\n })\n .addSliderInput({\n path: 'colWidth',\n name: 'Column width',\n defaultValue: 0.9,\n settings: {\n min: 0,\n max: 1,\n step: 0.01,\n },\n });\n\n commonOptionsBuilder.addLegendOptions(builder, false);\n commonOptionsBuilder.addTooltipOptions(builder, true);\n })\n .setSuggestionsSupplier(new StatusHistorySuggestionsSupplier());\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { CartesianCoords2D, DataFrame, FieldType, PanelProps } from '@grafana/data';\nimport { Portal, UPlotConfigBuilder, useTheme2, VizTooltipContainer, ZoomPlugin } from '@grafana/ui';\nimport { HoverEvent, addTooltipSupport } from '@grafana/ui/src/components/uPlot/config/addTooltipSupport';\nimport { CloseButton } from 'app/core/components/CloseButton/CloseButton';\n\nimport { TimelineChart } from '../state-timeline/TimelineChart';\nimport { TimelineMode } from '../state-timeline/types';\nimport { prepareTimelineFields, prepareTimelineLegendItems } from '../state-timeline/utils';\nimport { OutsideRangePlugin } from '../timeseries/plugins/OutsideRangePlugin';\nimport { getTimezones } from '../timeseries/utils';\n\nimport { StatusHistoryTooltip } from './StatusHistoryTooltip';\nimport { StatusPanelOptions } from './types';\n\nconst TOOLTIP_OFFSET = 10;\n\ninterface TimelinePanelProps extends PanelProps<StatusPanelOptions> {}\n\n/**\n * @alpha\n */\nexport const StatusHistoryPanel: React.FC<TimelinePanelProps> = ({\n data,\n timeRange,\n timeZone,\n options,\n width,\n height,\n onChangeTimeRange,\n}) => {\n const theme = useTheme2();\n\n const oldConfig = useRef<UPlotConfigBuilder | undefined>(undefined);\n const isToolTipOpen = useRef<boolean>(false);\n\n const [hover, setHover] = useState<HoverEvent | undefined>(undefined);\n const [coords, setCoords] = useState<{ viewport: CartesianCoords2D; canvas: CartesianCoords2D } | null>(null);\n const [focusedSeriesIdx, setFocusedSeriesIdx] = useState<number | null>(null);\n const [focusedPointIdx, setFocusedPointIdx] = useState<number | null>(null);\n const [shouldDisplayCloseButton, setShouldDisplayCloseButton] = useState<boolean>(false);\n\n const onCloseToolTip = () => {\n isToolTipOpen.current = false;\n setCoords(null);\n setShouldDisplayCloseButton(false);\n };\n\n const onUPlotClick = () => {\n isToolTipOpen.current = !isToolTipOpen.current;\n\n // Linking into useState required to re-render tooltip\n setShouldDisplayCloseButton(isToolTipOpen.current);\n };\n\n const { frames, warn } = useMemo(\n () => prepareTimelineFields(data?.series, false, timeRange, theme),\n [data, timeRange, theme]\n );\n\n const legendItems = useMemo(\n () => prepareTimelineLegendItems(frames, options.legend, theme),\n [frames, options.legend, theme]\n );\n\n const renderCustomTooltip = useCallback(\n (alignedData: DataFrame, seriesIdx: number | null, datapointIdx: number | null) => {\n const data = frames ?? [];\n\n // Count value fields in the state-timeline-ready frame\n const valueFieldsCount = data.reduce(\n (acc, frame) => acc + frame.fields.filter((field) => field.type !== FieldType.time).length,\n 0\n );\n\n // Not caring about multi mode in StatusHistory\n if (seriesIdx === null || datapointIdx === null) {\n return null;\n }\n\n /**\n * There could be a case when the tooltip shows a data from one of a multiple query and the other query finishes first\n * from refreshing. This causes data to be out of sync. alignedData - 1 because Time field doesn't count.\n * Render nothing in this case to prevent error.\n * See https://github.com/grafana/support-escalations/issues/932\n */\n if (\n (!alignedData.meta?.transformations?.length && alignedData.fields.length - 1 !== valueFieldsCount) ||\n !alignedData.fields[seriesIdx]\n ) {\n return null;\n }\n\n return (\n <>\n {shouldDisplayCloseButton && (\n <div\n style={{\n width: '100%',\n display: 'flex',\n justifyContent: 'flex-end',\n }}\n >\n <CloseButton\n onClick={onCloseToolTip}\n style={{\n position: 'relative',\n top: 'auto',\n right: 'auto',\n marginRight: 0,\n }}\n />\n </div>\n )}\n <StatusHistoryTooltip\n data={data}\n alignedData={alignedData}\n seriesIdx={seriesIdx}\n datapointIdx={datapointIdx}\n timeZone={timeZone}\n />\n </>\n );\n },\n [timeZone, frames, shouldDisplayCloseButton]\n );\n\n const timezones = useMemo(() => getTimezones(options.timezones, timeZone), [options.timezones, timeZone]);\n\n if (!frames || warn) {\n return (\n <div className=\"panel-empty\">\n <p>{warn ?? 'No data found in response'}</p>\n </div>\n );\n }\n\n // Status grid requires some space between values\n if (frames[0].length > width / 2) {\n return (\n <div className=\"panel-empty\">\n <p>\n Too many points to visualize properly. <br />\n Update the query to return fewer points. <br />({frames[0].length} points received)\n </p>\n </div>\n );\n }\n\n return (\n <TimelineChart\n theme={theme}\n frames={frames}\n structureRev={data.structureRev}\n timeRange={timeRange}\n timeZones={timezones}\n width={width}\n height={height}\n legendItems={legendItems}\n {...options}\n // hardcoded\n mode={TimelineMode.Samples}\n >\n {(config, alignedFrame) => {\n if (oldConfig.current !== config) {\n oldConfig.current = addTooltipSupport({\n config,\n onUPlotClick,\n setFocusedSeriesIdx,\n setFocusedPointIdx,\n setCoords,\n setHover,\n isToolTipOpen,\n });\n }\n return (\n <>\n <ZoomPlugin config={config} onZoom={onChangeTimeRange} />\n <Portal>\n {hover && coords && (\n <VizTooltipContainer\n position={{ x: coords.viewport.x, y: coords.viewport.y }}\n offset={{ x: TOOLTIP_OFFSET, y: TOOLTIP_OFFSET }}\n allowPointerEvents={isToolTipOpen.current}\n >\n {renderCustomTooltip(alignedFrame, focusedSeriesIdx, focusedPointIdx)}\n </VizTooltipContainer>\n )}\n </Portal>\n <OutsideRangePlugin config={config} onChangeTimeRange={onChangeTimeRange} />\n </>\n );\n }}\n </TimelineChart>\n );\n};\n","import { FieldColorModeId, VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { StatusPanelOptions, StatusFieldConfig } from './types';\n\nexport class StatusHistorySuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary: ds } = builder;\n\n if (!ds.hasData) {\n return;\n }\n\n // This panel needs a time field and a string or number field\n if (!ds.hasTimeField || (!ds.hasStringField && !ds.hasNumberField)) {\n return;\n }\n\n // If there are many series then they won't fit on y-axis so this panel is not good fit\n if (ds.numberFieldCount >= 30) {\n return;\n }\n\n // if there a lot of data points for each series then this is not a good match\n if (ds.rowCountMax > 100) {\n return;\n }\n\n // Probably better ways to filter out this by inspecting the types of string values so view this as temporary\n if (ds.preferredVisualisationType === 'logs') {\n return;\n }\n\n const list = builder.getListAppender<StatusPanelOptions, StatusFieldConfig>({\n name: '',\n pluginId: 'status-history',\n options: {},\n fieldConfig: {\n defaults: {\n color: {\n mode: FieldColorModeId.ContinuousGrYlRd,\n },\n custom: {},\n },\n overrides: [],\n },\n cardOptions: {\n previewModifier: (s) => {\n s.options!.colWidth = 0.7;\n },\n },\n });\n\n list.append({ name: SuggestionName.StatusHistory });\n }\n}\n","import React from 'react';\n\nimport { StandardEditorProps } from '@grafana/data';\nimport { Switch } from '@grafana/ui';\n\nexport function PaginationEditor({ onChange, value, context }: StandardEditorProps<boolean>) {\n const changeValue = (event: React.FormEvent<HTMLInputElement> | undefined) => {\n if (event?.currentTarget.checked) {\n context.options.footer.show = false;\n }\n onChange(event?.currentTarget.checked);\n };\n\n return <Switch value={Boolean(value)} onChange={changeValue} />;\n}\n","import { omitBy, isNil, isNumber, defaultTo } from 'lodash';\n\nimport {\n PanelModel,\n FieldMatcherID,\n ConfigOverrideRule,\n ThresholdsMode,\n ThresholdsConfig,\n FieldConfig,\n} from '@grafana/data';\nimport { ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce';\n\nimport { PanelOptions } from './models.gen';\n\n/**\n * At 7.0, the `table` panel was swapped from an angular implementation to a react one.\n * The models do not match, so this process will delegate to the old implementation when\n * a saved table configuration exists.\n */\nexport const tableMigrationHandler = (panel: PanelModel<PanelOptions>): Partial<PanelOptions> => {\n // Table was saved as an angular table, lets just swap to the 'table-old' panel\n if (!panel.pluginVersion && (panel as any).columns) {\n console.log('Was angular table', panel);\n }\n\n // Nothing changed\n return panel.options;\n};\n\nconst transformsMap = {\n timeseries_to_rows: 'seriesToRows',\n timeseries_to_columns: 'seriesToColumns',\n timeseries_aggregations: 'reduce',\n table: 'merge',\n};\n\nconst columnsMap = {\n avg: 'mean',\n min: 'min',\n max: 'max',\n total: 'sum',\n current: 'lastNotNull',\n count: 'count',\n};\n\nconst colorModeMap = {\n cell: 'color-background',\n row: 'color-background',\n value: 'color-text',\n};\n\ntype Transformations = keyof typeof transformsMap;\n\ntype Transformation = {\n id: string;\n options: ReduceTransformerOptions;\n};\n\ntype Columns = keyof typeof columnsMap;\n\ntype Column = {\n value: Columns;\n text: string;\n};\n\ntype ColorModes = keyof typeof colorModeMap;\n\nconst generateThresholds = (thresholds: string[], colors: string[]) => {\n return [-Infinity, ...thresholds].map((threshold, idx) => ({\n color: colors[idx],\n value: isNumber(threshold) ? threshold : parseInt(threshold, 10),\n }));\n};\n\nconst migrateTransformations = (\n panel: PanelModel<Partial<PanelOptions>> | any,\n oldOpts: { columns: any; transform: Transformations }\n) => {\n const transformations: Transformation[] = panel.transformations ?? [];\n if (Object.keys(transformsMap).includes(oldOpts.transform)) {\n const opts: ReduceTransformerOptions = {\n reducers: [],\n };\n if (oldOpts.transform === 'timeseries_aggregations') {\n opts.includeTimeField = false;\n opts.reducers = oldOpts.columns.map((column: Column) => columnsMap[column.value]);\n }\n transformations.push({\n id: transformsMap[oldOpts.transform],\n options: opts,\n });\n }\n return transformations;\n};\n\ntype Style = {\n unit: string;\n type: string;\n alias: string;\n decimals: number;\n colors: string[];\n colorMode: ColorModes;\n pattern: string;\n thresholds: string[];\n align?: string;\n dateFormat: string;\n link: boolean;\n linkTargetBlank?: boolean;\n linkTooltip?: string;\n linkUrl?: string;\n};\n\nconst migrateTableStyleToOverride = (style: Style) => {\n const fieldMatcherId = /^\\/.*\\/$/.test(style.pattern) ? FieldMatcherID.byRegexp : FieldMatcherID.byName;\n const override: ConfigOverrideRule = {\n matcher: {\n id: fieldMatcherId,\n options: style.pattern,\n },\n properties: [],\n };\n\n if (style.alias) {\n override.properties.push({\n id: 'displayName',\n value: style.alias,\n });\n }\n\n if (style.unit) {\n override.properties.push({\n id: 'unit',\n value: style.unit,\n });\n }\n\n if (style.decimals) {\n override.properties.push({\n id: 'decimals',\n value: style.decimals,\n });\n }\n\n if (style.type === 'date') {\n override.properties.push({\n id: 'unit',\n value: `time: ${style.dateFormat}`,\n });\n }\n\n if (style.link) {\n override.properties.push({\n id: 'links',\n value: [\n {\n title: defaultTo(style.linkTooltip, ''),\n url: defaultTo(style.linkUrl, ''),\n targetBlank: defaultTo(style.linkTargetBlank, false),\n },\n ],\n });\n }\n\n if (style.colorMode) {\n override.properties.push({\n id: 'custom.displayMode',\n value: colorModeMap[style.colorMode],\n });\n }\n\n if (style.align) {\n override.properties.push({\n id: 'custom.align',\n value: style.align === 'auto' ? null : style.align,\n });\n }\n\n if (style.thresholds?.length) {\n override.properties.push({\n id: 'thresholds',\n value: {\n mode: ThresholdsMode.Absolute,\n steps: generateThresholds(style.thresholds, style.colors),\n },\n });\n }\n\n return override;\n};\n\nconst migrateDefaults = (prevDefaults: Style) => {\n let defaults: FieldConfig = {\n custom: {},\n };\n if (prevDefaults) {\n defaults = omitBy(\n {\n unit: prevDefaults.unit,\n decimals: prevDefaults.decimals,\n displayName: prevDefaults.alias,\n custom: {\n align: prevDefaults.align === 'auto' ? null : prevDefaults.align,\n displayMode: colorModeMap[prevDefaults.colorMode],\n },\n },\n isNil\n );\n if (prevDefaults.thresholds.length) {\n const thresholds: ThresholdsConfig = {\n mode: ThresholdsMode.Absolute,\n steps: generateThresholds(prevDefaults.thresholds, prevDefaults.colors),\n };\n defaults.thresholds = thresholds;\n }\n }\n return defaults;\n};\n\n/**\n * This is called when the panel changes from another panel\n */\nexport const tablePanelChangedHandler = (\n panel: PanelModel<Partial<PanelOptions>> | any,\n prevPluginId: string,\n prevOptions: any\n) => {\n // Changing from angular table panel\n if (prevPluginId === 'table-old' && prevOptions.angular) {\n const oldOpts = prevOptions.angular;\n const transformations = migrateTransformations(panel, oldOpts);\n const prevDefaults = oldOpts.styles.find((style: any) => style.pattern === '/.*/');\n const defaults = migrateDefaults(prevDefaults);\n const overrides = oldOpts.styles.filter((style: any) => style.pattern !== '/.*/').map(migrateTableStyleToOverride);\n\n panel.transformations = transformations;\n panel.fieldConfig = {\n defaults,\n overrides,\n };\n }\n\n return {};\n};\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// NOTE: This file will be auto generated from models.cue\n// It is currenty hand written but will serve as the target for cuetsy\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nimport { TableCellDisplayMode, TableSortByFieldState } from '@grafana/ui';\nimport { TableFieldOptions } from '@grafana/schema';\n\n// Only the latest schema version is translated to TypeScript, on the premise\n// that either the dashboard loading process, or (eventually) CUE-defined\n// migrations ensure that bulk of the frontend application only ever\n// need directly consider the most recent version of the schema.\nexport const modelVersion = Object.freeze([1, 0]);\n\nexport interface PanelOptions {\n frameIndex: number;\n showHeader: boolean;\n showTypeIcons?: boolean;\n sortBy?: TableSortByFieldState[];\n footer?: TableFooterCalc; // TODO: should be array (options builder is limited)\n}\n\nexport interface TableFooterCalc {\n show: boolean;\n reducer: string[]; // actually 1 value\n fields?: string[];\n enablePagination?: boolean;\n}\n\nexport const defaultPanelOptions: PanelOptions = {\n frameIndex: 0,\n showHeader: true,\n showTypeIcons: false,\n footer: {\n show: false,\n reducer: [],\n },\n};\n\nexport const defaultPanelFieldConfig: TableFieldOptions = {\n displayMode: TableCellDisplayMode.Auto,\n align: 'auto',\n inspect: false,\n};\n","import {\n FieldOverrideContext,\n FieldType,\n getFieldDisplayName,\n PanelPlugin,\n ReducerID,\n standardEditorsRegistry,\n} from '@grafana/data';\nimport { TableFieldOptions } from '@grafana/schema';\nimport { TableCellDisplayMode } from '@grafana/ui';\n\nimport { PaginationEditor } from './PaginationEditor';\nimport { TablePanel } from './TablePanel';\nimport { tableMigrationHandler, tablePanelChangedHandler } from './migrations';\nimport { PanelOptions, defaultPanelOptions, defaultPanelFieldConfig } from './models.gen';\nimport { TableSuggestionsSupplier } from './suggestions';\n\nconst footerCategory = 'Table footer';\n\nexport const plugin = new PanelPlugin<PanelOptions, TableFieldOptions>(TablePanel)\n .setPanelChangeHandler(tablePanelChangedHandler)\n .setMigrationHandler(tableMigrationHandler)\n .setNoPadding()\n .useFieldConfig({\n useCustomConfig: (builder) => {\n builder\n .addNumberInput({\n path: 'minWidth',\n name: 'Minimum column width',\n description: 'The minimum width for column auto resizing',\n settings: {\n placeholder: '150',\n min: 50,\n max: 500,\n },\n shouldApply: () => true,\n defaultValue: defaultPanelFieldConfig.minWidth,\n })\n .addNumberInput({\n path: 'width',\n name: 'Column width',\n settings: {\n placeholder: 'auto',\n min: 20,\n max: 300,\n },\n shouldApply: () => true,\n defaultValue: defaultPanelFieldConfig.width,\n })\n .addRadio({\n path: 'align',\n name: 'Column alignment',\n settings: {\n options: [\n { label: 'auto', value: 'auto' },\n { label: 'left', value: 'left' },\n { label: 'center', value: 'center' },\n { label: 'right', value: 'right' },\n ],\n },\n defaultValue: defaultPanelFieldConfig.align,\n })\n .addSelect({\n path: 'displayMode',\n name: 'Cell display mode',\n description: 'Color text, background, show as gauge, etc',\n settings: {\n options: [\n { value: TableCellDisplayMode.Auto, label: 'Auto' },\n { value: TableCellDisplayMode.ColorText, label: 'Color text' },\n { value: TableCellDisplayMode.ColorBackground, label: 'Color background (gradient)' },\n { value: TableCellDisplayMode.ColorBackgroundSolid, label: 'Color background (solid)' },\n { value: TableCellDisplayMode.GradientGauge, label: 'Gradient gauge' },\n { value: TableCellDisplayMode.LcdGauge, label: 'LCD gauge' },\n { value: TableCellDisplayMode.BasicGauge, label: 'Basic gauge' },\n { value: TableCellDisplayMode.JSONView, label: 'JSON View' },\n { value: TableCellDisplayMode.Image, label: 'Image' },\n ],\n },\n defaultValue: defaultPanelFieldConfig.displayMode,\n })\n .addBooleanSwitch({\n path: 'inspect',\n name: 'Cell value inspect',\n description: 'Enable cell value inspection in a modal window',\n defaultValue: false,\n showIf: (cfg) => {\n return (\n cfg.displayMode === TableCellDisplayMode.Auto ||\n cfg.displayMode === TableCellDisplayMode.JSONView ||\n cfg.displayMode === TableCellDisplayMode.ColorText ||\n cfg.displayMode === TableCellDisplayMode.ColorBackground ||\n cfg.displayMode === TableCellDisplayMode.ColorBackgroundSolid\n );\n },\n })\n .addBooleanSwitch({\n path: 'filterable',\n name: 'Column filter',\n description: 'Enables/disables field filters in table',\n defaultValue: defaultPanelFieldConfig.filterable,\n })\n .addBooleanSwitch({\n path: 'hidden',\n name: 'Hide in table',\n defaultValue: undefined,\n hideFromDefaults: true,\n });\n },\n })\n .setPanelOptions((builder) => {\n builder\n .addBooleanSwitch({\n path: 'showHeader',\n name: 'Show table header',\n defaultValue: defaultPanelOptions.showHeader,\n })\n .addBooleanSwitch({\n path: 'footer.show',\n category: [footerCategory],\n name: 'Show table footer',\n defaultValue: defaultPanelOptions.footer?.show,\n })\n .addCustomEditor({\n id: 'footer.reducer',\n category: [footerCategory],\n path: 'footer.reducer',\n name: 'Calculation',\n description: 'Choose a reducer function / calculation',\n editor: standardEditorsRegistry.get('stats-picker').editor as any,\n defaultValue: [ReducerID.sum],\n showIf: (cfg) => cfg.footer?.show,\n })\n .addMultiSelect({\n path: 'footer.fields',\n category: [footerCategory],\n name: 'Fields',\n description: 'Select the fields that should be calculated',\n settings: {\n allowCustomValue: false,\n options: [],\n placeholder: 'All Numeric Fields',\n getOptions: async (context: FieldOverrideContext) => {\n const options = [];\n if (context && context.data && context.data.length > 0) {\n const frame = context.data[0];\n for (const field of frame.fields) {\n if (field.type === FieldType.number) {\n const name = getFieldDisplayName(field, frame, context.data);\n const value = field.name;\n options.push({ value, label: name } as any);\n }\n }\n }\n return options;\n },\n },\n defaultValue: '',\n showIf: (cfg) => cfg.footer?.show,\n })\n .addCustomEditor({\n id: 'footer.enablePagination',\n path: 'footer.enablePagination',\n name: 'Enable pagination',\n editor: PaginationEditor,\n });\n })\n .setSuggestionsSupplier(new TableSuggestionsSupplier());\n","import { VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { TableFieldOptions } from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { PanelOptions } from './models.gen';\n\nexport class TableSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const list = builder.getListAppender<PanelOptions, TableFieldOptions>({\n name: SuggestionName.Table,\n pluginId: 'table',\n options: {},\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n cardOptions: {\n previewModifier: (s) => {\n s.fieldConfig!.defaults.custom!.minWidth = 50;\n },\n },\n });\n\n // If there are not data suggest table anyway but use icon instead of real preview\n if (builder.dataSummary.fieldCount === 0) {\n list.append({\n cardOptions: {\n imgSrc: 'public/app/plugins/panel/table/img/icn-table-panel.svg',\n },\n });\n } else {\n list.append({});\n }\n }\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n\nexport const modelVersion = Object.freeze([0, 0]);\n\n\nexport enum TextMode {\n HTML = 'html',\n Markdown = 'markdown',\n}\n\nexport interface PanelOptions {\n content: string;\n mode: TextMode;\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n content: `# Title\n\nFor markdown syntax help: [commonmark.org/help](https://commonmark.org/help/)`,\n mode: TextMode.Markdown,\n};\n","// Libraries\nimport { css, cx } from '@emotion/css';\nimport DangerouslySetHtmlContent from 'dangerously-set-html-content';\nimport { debounce } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport { PanelProps, renderTextPanelMarkdown, textUtil } from '@grafana/data';\n// Utils\nimport { CustomScrollbar, stylesFactory } from '@grafana/ui';\nimport config from 'app/core/config';\n\n// Types\nimport { PanelOptions, TextMode } from './models.gen';\n\nexport interface Props extends PanelProps<PanelOptions> {}\n\ninterface State {\n html: string;\n}\n\nexport class TextPanel extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n html: this.processContent(props.options),\n };\n }\n\n updateHTML = debounce(() => {\n const html = this.processContent(this.props.options);\n if (html !== this.state.html) {\n this.setState({ html });\n }\n }, 150);\n\n componentDidUpdate(prevProps: Props) {\n // Since any change could be referenced in a template variable,\n // This needs to process every time (with debounce)\n this.updateHTML();\n }\n\n prepareHTML(html: string): string {\n const result = this.interpolateString(html);\n return config.disableSanitizeHtml ? result : this.sanitizeString(result);\n }\n\n prepareMarkdown(content: string): string {\n // Always interpolate variables before converting to markdown\n // because `marked` replaces '{' and '}' in URLs with '%7B' and '%7D'\n // See https://marked.js.org/demo\n let result = this.interpolateString(content);\n\n if (config.disableSanitizeHtml) {\n result = renderTextPanelMarkdown(result, {\n noSanitize: true,\n });\n return result;\n }\n\n result = renderTextPanelMarkdown(result);\n return this.sanitizeString(result);\n }\n\n interpolateString(content: string): string {\n const { replaceVariables } = this.props;\n return replaceVariables(content, {}, 'html');\n }\n\n sanitizeString(content: string): string {\n return textUtil.sanitizeTextPanelContent(content);\n }\n\n processContent(options: PanelOptions): string {\n const { mode, content } = options;\n\n if (!content) {\n return '';\n }\n\n if (mode === TextMode.HTML) {\n return this.prepareHTML(content);\n }\n\n return this.prepareMarkdown(content);\n }\n\n render() {\n const { html } = this.state;\n const styles = getStyles();\n return (\n <CustomScrollbar autoHeightMin=\"100%\">\n <DangerouslySetHtmlContent\n html={html}\n className={cx('markdown-html', styles.content)}\n data-testid=\"TextPanel-converted-content\"\n />\n </CustomScrollbar>\n );\n }\n}\n\nconst getStyles = stylesFactory(() => {\n return {\n content: css`\n height: 100%;\n `,\n };\n});\n","import { css, cx } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { GrafanaTheme, StandardEditorProps } from '@grafana/data';\nimport {\n CodeEditor,\n stylesFactory,\n useTheme,\n CodeEditorSuggestionItem,\n variableSuggestionToCodeEditorSuggestion,\n} from '@grafana/ui';\n\nimport { PanelOptions, TextMode } from './models.gen';\n\nexport const TextPanelEditor: FC<StandardEditorProps<string, any, PanelOptions>> = ({ value, onChange, context }) => {\n const language = useMemo(() => context.options?.mode ?? TextMode.Markdown, [context]);\n const theme = useTheme();\n const styles = getStyles(theme);\n\n const getSuggestions = (): CodeEditorSuggestionItem[] => {\n if (!context.getSuggestions) {\n return [];\n }\n return context.getSuggestions().map((v) => variableSuggestionToCodeEditorSuggestion(v));\n };\n\n return (\n <div className={cx(styles.editorBox)}>\n <AutoSizer disableHeight>\n {({ width }) => {\n if (width === 0) {\n return null;\n }\n return (\n <CodeEditor\n value={value}\n onBlur={onChange}\n onSave={onChange}\n language={language}\n width={width}\n showMiniMap={false}\n showLineNumbers={false}\n height=\"500px\"\n getSuggestions={getSuggestions}\n />\n );\n }}\n </AutoSizer>\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n editorBox: css`\n label: editorBox;\n border: ${theme.border.width.sm} solid ${theme.colors.border2};\n border-radius: ${theme.border.radius.sm};\n margin: ${theme.spacing.xs} 0;\n width: 100%;\n `,\n}));\n","import { PanelPlugin } from '@grafana/data';\n\nimport { TextPanel } from './TextPanel';\nimport { TextPanelEditor } from './TextPanelEditor';\nimport { defaultPanelOptions, PanelOptions, TextMode } from './models.gen';\nimport { textPanelMigrationHandler } from './textPanelMigrationHandler';\n\nexport const plugin = new PanelPlugin<PanelOptions>(TextPanel)\n .setPanelOptions((builder) => {\n builder\n .addRadio({\n path: 'mode',\n name: 'Mode',\n description: 'text mode of the panel',\n settings: {\n options: [\n { value: TextMode.Markdown, label: 'Markdown' },\n { value: TextMode.HTML, label: 'HTML' },\n ],\n },\n defaultValue: defaultPanelOptions.mode,\n })\n .addCustomEditor({\n id: 'content',\n path: 'content',\n name: 'Content',\n description: 'Content of the panel',\n editor: TextPanelEditor,\n defaultValue: defaultPanelOptions.content,\n });\n })\n .setMigrationHandler(textPanelMigrationHandler);\n","import { PanelModel } from '@grafana/data';\n\nimport { TextMode, PanelOptions } from './models.gen';\n\nexport const textPanelMigrationHandler = (panel: PanelModel<PanelOptions>): Partial<PanelOptions> => {\n const previousVersion = parseFloat(panel.pluginVersion || '6.1');\n let options = panel.options;\n\n // Migrates old Angular based text panel props to new props\n if (panel.hasOwnProperty('content') && panel.hasOwnProperty('mode')) {\n const oldTextPanel: any = panel as any;\n const content = oldTextPanel.content;\n const mode = oldTextPanel.mode as TextMode;\n\n delete oldTextPanel.content;\n delete oldTextPanel.mode;\n\n if (previousVersion < 7.1) {\n options = { content, mode };\n }\n }\n\n // The 'text' mode has been removed so we need to update any panels still using it to markdown\n if (options.mode !== 'html' && options.mode !== 'markdown') {\n options = { ...options, mode: TextMode.Markdown };\n }\n\n return options;\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, InternalTimeZones, StandardEditorProps } from '@grafana/data';\nimport { OptionsWithTimezones } from '@grafana/schema';\nimport { IconButton, TimeZonePicker, useStyles2 } from '@grafana/ui';\n\ntype Props = StandardEditorProps<string[], unknown, OptionsWithTimezones>;\n\nexport const TimezonesEditor = ({ value, onChange }: Props) => {\n const styles = useStyles2(getStyles);\n\n if (!value || value.length < 1) {\n value = [''];\n }\n\n const addTimezone = () => {\n onChange([...value, InternalTimeZones.default]);\n };\n\n const removeTimezone = (idx: number) => {\n const copy = value.slice();\n copy.splice(idx, 1);\n onChange(copy);\n };\n\n const setTimezone = (idx: number, tz?: string) => {\n const copy = value.slice();\n copy[idx] = tz ?? InternalTimeZones.default;\n if (copy.length === 0 || (copy.length === 1 && copy[0] === '')) {\n onChange(undefined);\n } else {\n onChange(copy);\n }\n };\n\n return (\n <div>\n {value.map((tz, idx) => (\n <div className={styles.wrapper} key={`${idx}.${tz}`}>\n <span className={styles.first}>\n <TimeZonePicker\n onChange={(v) => setTimezone(idx, v)}\n includeInternal={true}\n value={tz ?? InternalTimeZones.default}\n />\n </span>\n {idx === value.length - 1 ? (\n <IconButton ariaLabel=\"Add timezone\" name=\"plus\" onClick={addTimezone} />\n ) : (\n <IconButton ariaLabel=\"Remove timezone\" name=\"times\" onClick={() => removeTimezone(idx)} />\n )}\n </div>\n ))}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n width: 100%;\n display: flex;\n flex-direction: rows;\n align-items: center;\n `,\n first: css`\n margin-right: 8px;\n flex-grow: 2;\n `,\n});\n","import { omitBy, pickBy, isNil, isNumber, isString } from 'lodash';\n\nimport {\n ConfigOverrideRule,\n DynamicConfigValue,\n FieldColorModeId,\n FieldConfig,\n FieldConfigProperty,\n FieldConfigSource,\n FieldMatcherID,\n fieldReducers,\n FieldType,\n NullValueMode,\n PanelTypeChangedHandler,\n Threshold,\n ThresholdsMode,\n} from '@grafana/data';\nimport {\n LegendDisplayMode,\n TooltipDisplayMode,\n AxisPlacement,\n GraphDrawStyle,\n GraphFieldConfig,\n GraphGradientMode,\n GraphTresholdsStyleMode,\n LineInterpolation,\n LineStyle,\n VisibilityMode,\n ScaleDistribution,\n StackingMode,\n SortOrder,\n GraphTransform,\n} from '@grafana/schema';\n\nimport { defaultGraphConfig } from './config';\nimport { TimeSeriesOptions } from './types';\n\n/**\n * This is called when the panel changes from another panel\n */\nexport const graphPanelChangedHandler: PanelTypeChangedHandler = (\n panel,\n prevPluginId,\n prevOptions,\n prevFieldConfig\n) => {\n // Changing from angular/flot panel to react/uPlot\n if (prevPluginId === 'graph' && prevOptions.angular) {\n const { fieldConfig, options } = flotToGraphOptions({\n ...prevOptions.angular,\n fieldConfig: prevFieldConfig,\n });\n panel.fieldConfig = fieldConfig; // Mutates the incoming panel\n panel.alert = prevOptions.angular.alert;\n return options;\n }\n\n //fixes graph -> viz renaming in custom.hideFrom field config by mutation.\n migrateHideFrom(panel);\n\n return {};\n};\n\nexport function flotToGraphOptions(angular: any): { fieldConfig: FieldConfigSource; options: TimeSeriesOptions } {\n const overrides: ConfigOverrideRule[] = angular.fieldConfig?.overrides ?? [];\n const yaxes = angular.yaxes ?? [];\n let y1 = getFieldConfigFromOldAxis(yaxes[0]);\n if (angular.fieldConfig?.defaults) {\n y1 = {\n ...angular.fieldConfig?.defaults,\n ...y1, // Keep the y-axis unit and custom\n };\n }\n\n // Dashes\n const dash: LineStyle = {\n fill: angular.dashes ? 'dash' : 'solid',\n dash: [angular.dashLength ?? 10, angular.spaceLength ?? 10],\n };\n\n // \"seriesOverrides\": [\n // {\n // \"$$hashKey\": \"object:183\",\n // \"alias\": \"B-series\",\n // \"fill\": 3,\n // \"nullPointMode\": \"null as zero\",\n // \"lines\": true,\n // \"linewidth\": 2\n // }\n // ],\n\n if (angular.aliasColors) {\n for (const alias of Object.keys(angular.aliasColors)) {\n const color = angular.aliasColors[alias];\n if (color) {\n overrides.push({\n matcher: {\n id: FieldMatcherID.byName,\n options: alias,\n },\n properties: [\n {\n id: FieldConfigProperty.Color,\n value: {\n mode: FieldColorModeId.Fixed,\n fixedColor: color,\n },\n },\n ],\n });\n }\n }\n }\n\n let hasFillBelowTo = false;\n\n if (angular.seriesOverrides?.length) {\n for (const seriesOverride of angular.seriesOverrides) {\n if (!seriesOverride.alias) {\n continue; // the matcher config\n }\n const aliasIsRegex = /^([/~@;%#'])(.*?)\\1([gimsuy]*)$/.test(seriesOverride.alias);\n const rule: ConfigOverrideRule = {\n matcher: {\n id: aliasIsRegex ? FieldMatcherID.byRegexp : FieldMatcherID.byName,\n options: seriesOverride.alias,\n },\n properties: [],\n };\n let dashOverride: LineStyle | undefined = undefined;\n\n for (const p of Object.keys(seriesOverride)) {\n const v = seriesOverride[p];\n switch (p) {\n // Ignore\n case 'alias':\n case '$$hashKey':\n break;\n // Link to y axis settings\n case 'yaxis':\n if (2 === v) {\n const y2 = getFieldConfigFromOldAxis(yaxes[1]);\n fillY2DynamicValues(y1, y2, rule.properties);\n }\n break;\n case 'fill':\n rule.properties.push({\n id: 'custom.fillOpacity',\n value: v * 10, // was 0-10, new graph is 0 - 100\n });\n break;\n case 'fillBelowTo':\n hasFillBelowTo = true;\n rule.properties.push({\n id: 'custom.fillBelowTo',\n value: v,\n });\n break;\n case 'fillGradient':\n if (v) {\n rule.properties.push({\n id: 'custom.fillGradient',\n value: 'opacity', // was 0-10\n });\n rule.properties.push({\n id: 'custom.fillOpacity',\n value: v * 10, // was 0-10, new graph is 0 - 100\n });\n }\n break;\n case 'points':\n rule.properties.push({\n id: 'custom.showPoints',\n value: v ? VisibilityMode.Always : VisibilityMode.Never,\n });\n break;\n case 'bars':\n if (v) {\n rule.properties.push({\n id: 'custom.drawStyle',\n value: GraphDrawStyle.Bars,\n });\n rule.properties.push({\n id: 'custom.fillOpacity',\n value: 100, // solid bars\n });\n } else {\n rule.properties.push({\n id: 'custom.drawStyle',\n value: GraphDrawStyle.Line, // Change from bars\n });\n }\n break;\n case 'lines':\n rule.properties.push({\n id: 'custom.lineWidth',\n value: 0, // don't show lines\n });\n break;\n case 'linewidth':\n rule.properties.push({\n id: 'custom.lineWidth',\n value: v,\n });\n break;\n case 'pointradius':\n rule.properties.push({\n id: 'custom.pointSize',\n value: 2 + v * 2,\n });\n break;\n case 'dashLength':\n case 'spaceLength':\n case 'dashes':\n if (!dashOverride) {\n dashOverride = {\n fill: dash.fill,\n dash: [...dash.dash!],\n };\n }\n switch (p) {\n case 'dashLength':\n dashOverride.dash![0] = v;\n break;\n case 'spaceLength':\n dashOverride.dash![1] = v;\n break;\n case 'dashes':\n dashOverride.fill = v ? 'dash' : 'solid';\n break;\n }\n break;\n case 'stack':\n rule.properties.push({\n id: 'custom.stacking',\n value: { mode: StackingMode.Normal, group: v },\n });\n break;\n case 'color':\n rule.properties.push({\n id: 'color',\n value: {\n fixedColor: v,\n mode: FieldColorModeId.Fixed,\n },\n });\n break;\n case 'transform':\n rule.properties.push({\n id: 'custom.transform',\n value: v === 'negative-Y' ? GraphTransform.NegativeY : GraphTransform.Constant,\n });\n break;\n default:\n console.log('Ignore override migration:', seriesOverride.alias, p, v);\n }\n }\n if (dashOverride) {\n rule.properties.push({\n id: 'custom.lineStyle',\n value: dashOverride,\n });\n }\n if (rule.properties.length) {\n overrides.push(rule);\n }\n }\n }\n\n const graph = y1.custom ?? ({} as GraphFieldConfig);\n graph.drawStyle = angular.bars ? GraphDrawStyle.Bars : angular.lines ? GraphDrawStyle.Line : GraphDrawStyle.Points;\n\n if (angular.points) {\n graph.showPoints = VisibilityMode.Always;\n\n if (isNumber(angular.pointradius)) {\n graph.pointSize = 2 + angular.pointradius * 2;\n }\n } else if (graph.drawStyle !== GraphDrawStyle.Points) {\n graph.showPoints = VisibilityMode.Never;\n }\n\n graph.lineWidth = angular.linewidth;\n if (dash.fill !== 'solid') {\n graph.lineStyle = dash;\n }\n\n if (hasFillBelowTo) {\n graph.fillOpacity = 35; // bands are hardcoded in flot\n } else if (isNumber(angular.fill)) {\n graph.fillOpacity = angular.fill * 10; // fill was 0 - 10, new is 0 to 100\n }\n\n if (isNumber(angular.fillGradient) && angular.fillGradient > 0) {\n graph.gradientMode = GraphGradientMode.Opacity;\n graph.fillOpacity = angular.fillGradient * 10; // fill is 0-10\n }\n\n graph.spanNulls = angular.nullPointMode === NullValueMode.Ignore;\n\n if (angular.steppedLine) {\n graph.lineInterpolation = LineInterpolation.StepAfter;\n }\n\n if (graph.drawStyle === GraphDrawStyle.Bars) {\n graph.fillOpacity = 100; // bars were always\n }\n\n if (angular.stack) {\n graph.stacking = {\n mode: StackingMode.Normal,\n group: defaultGraphConfig.stacking!.group,\n };\n }\n\n y1.custom = omitBy(graph, isNil);\n y1.nullValueMode = angular.nullPointMode as NullValueMode;\n\n const options: TimeSeriesOptions = {\n legend: {\n displayMode: LegendDisplayMode.List,\n showLegend: true,\n placement: 'bottom',\n calcs: [],\n },\n tooltip: {\n mode: TooltipDisplayMode.Single,\n sort: SortOrder.None,\n },\n };\n\n // Legend config migration\n const legendConfig = angular.legend;\n if (legendConfig) {\n if (legendConfig.show) {\n options.legend.displayMode = legendConfig.alignAsTable ? LegendDisplayMode.Table : LegendDisplayMode.List;\n } else {\n options.legend.showLegend = false;\n }\n\n if (legendConfig.rightSide) {\n options.legend.placement = 'right';\n }\n\n if (angular.legend.values) {\n const enabledLegendValues = pickBy(angular.legend);\n options.legend.calcs = getReducersFromLegend(enabledLegendValues);\n }\n\n if (angular.legend.sideWidth) {\n options.legend.width = angular.legend.sideWidth;\n }\n }\n\n const tooltipConfig = angular.tooltip;\n if (tooltipConfig) {\n if (tooltipConfig.shared !== undefined) {\n options.tooltip.mode = tooltipConfig.shared ? TooltipDisplayMode.Multi : TooltipDisplayMode.Single;\n }\n\n if (tooltipConfig.sort !== undefined && tooltipConfig.shared) {\n switch (tooltipConfig.sort) {\n case 1:\n options.tooltip.sort = SortOrder.Ascending;\n break;\n case 2:\n options.tooltip.sort = SortOrder.Descending;\n break;\n default:\n options.tooltip.sort = SortOrder.None;\n }\n }\n }\n\n if (angular.thresholds && angular.thresholds.length > 0) {\n let steps: Threshold[] = [];\n let area = false;\n let line = false;\n\n const sorted = (angular.thresholds as AngularThreshold[]).sort((a, b) => (a.value > b.value ? 1 : -1));\n\n for (let idx = 0; idx < sorted.length; idx++) {\n const threshold = sorted[idx];\n const next = sorted.length > idx + 1 ? sorted[idx + 1] : null;\n\n if (threshold.fill) {\n area = true;\n }\n\n if (threshold.line) {\n line = true;\n }\n\n if (threshold.op === 'gt') {\n steps.push({\n value: threshold.value,\n color: getThresholdColor(threshold),\n });\n }\n\n if (threshold.op === 'lt') {\n if (steps.length === 0) {\n steps.push({\n value: -Infinity,\n color: getThresholdColor(threshold),\n });\n }\n\n // next op is gt and there is a gap set color to transparent\n if (next && next.op === 'gt' && next.value > threshold.value) {\n steps.push({\n value: threshold.value,\n color: 'transparent',\n });\n // if next is a lt we need to use it's color\n } else if (next && next.op === 'lt') {\n steps.push({\n value: threshold.value,\n color: getThresholdColor(next),\n });\n } else {\n steps.push({\n value: threshold.value,\n color: 'transparent',\n });\n }\n }\n }\n\n // if now less then threshold add an -Infinity base that is transparent\n if (steps.length > 0 && steps[0].value !== -Infinity) {\n steps.unshift({\n color: 'transparent',\n value: -Infinity,\n });\n }\n\n let displayMode = area ? GraphTresholdsStyleMode.Area : GraphTresholdsStyleMode.Line;\n if (line && area) {\n displayMode = GraphTresholdsStyleMode.LineAndArea;\n }\n\n // TODO move into standard ThresholdConfig ?\n y1.custom.thresholdsStyle = { mode: displayMode };\n\n y1.thresholds = {\n mode: ThresholdsMode.Absolute,\n steps,\n };\n }\n\n if (angular.xaxis && angular.xaxis.show === false && angular.xaxis.mode === 'time') {\n overrides.push({\n matcher: {\n id: FieldMatcherID.byType,\n options: FieldType.time,\n },\n properties: [\n {\n id: 'custom.axisPlacement',\n value: AxisPlacement.Hidden,\n },\n ],\n });\n }\n return {\n fieldConfig: {\n defaults: omitBy(y1, isNil),\n overrides,\n },\n options,\n };\n}\n\nfunction getThresholdColor(threshold: AngularThreshold): string {\n if (threshold.colorMode === 'critical') {\n return 'red';\n }\n\n if (threshold.colorMode === 'warning') {\n return 'orange';\n }\n\n if (threshold.colorMode === 'custom') {\n return threshold.fillColor || threshold.lineColor;\n }\n\n return 'red';\n}\n\ninterface AngularThreshold {\n op: string;\n fill: boolean;\n line: boolean;\n value: number;\n colorMode: 'critical' | 'warning' | 'custom';\n yaxis?: 'left' | 'right';\n fillColor: string;\n lineColor: string;\n}\n\n// {\n// \"label\": \"Y111\",\n// \"show\": true,\n// \"logBase\": 10,\n// \"min\": \"0\",\n// \"max\": \"1000\",\n// \"format\": \"areaMI2\",\n// \"$$hashKey\": \"object:19\",\n// \"decimals\": 3\n// },\nfunction getFieldConfigFromOldAxis(obj: any): FieldConfig<GraphFieldConfig> {\n if (!obj) {\n return {};\n }\n const graph: GraphFieldConfig = {\n axisPlacement: obj.show ? AxisPlacement.Auto : AxisPlacement.Hidden,\n };\n if (obj.label) {\n graph.axisLabel = obj.label;\n }\n if (obj.logBase) {\n const log = obj.logBase as number;\n if (log === 2 || log === 10) {\n graph.scaleDistribution = {\n type: ScaleDistribution.Log,\n log,\n };\n }\n }\n return omitBy(\n {\n unit: obj.format,\n decimals: validNumber(obj.decimals),\n min: validNumber(obj.min),\n max: validNumber(obj.max),\n custom: graph,\n },\n isNil\n );\n}\n\nfunction fillY2DynamicValues(\n y1: FieldConfig<GraphFieldConfig>,\n y2: FieldConfig<GraphFieldConfig>,\n props: DynamicConfigValue[]\n) {\n // The standard properties\n for (const key of Object.keys(y2)) {\n const value = (y2 as any)[key];\n if (key !== 'custom' && value !== (y1 as any)[key]) {\n props.push({\n id: key,\n value,\n });\n }\n }\n\n // Add any custom property\n const y1G = y1.custom ?? {};\n const y2G = y2.custom ?? {};\n for (const key of Object.keys(y2G)) {\n const value = (y2G as any)[key];\n if (value !== (y1G as any)[key]) {\n props.push({\n id: `custom.${key}`,\n value,\n });\n }\n }\n}\n\nfunction validNumber(val: any): number | undefined {\n if (isNumber(val)) {\n return val;\n }\n if (isString(val)) {\n const num = Number(val);\n if (!isNaN(num)) {\n return num;\n }\n }\n return undefined;\n}\n\nfunction getReducersFromLegend(obj: Record<string, any>): string[] {\n const ids: string[] = [];\n for (const key of Object.keys(obj)) {\n const r = fieldReducers.getIfExists(key);\n if (r) {\n ids.push(r.id);\n }\n }\n return ids;\n}\n\nfunction migrateHideFrom(panel: {\n fieldConfig?: { defaults?: { custom?: { hideFrom?: any } }; overrides: ConfigOverrideRule[] };\n}) {\n if (panel.fieldConfig?.defaults?.custom?.hideFrom?.graph !== undefined) {\n panel.fieldConfig.defaults.custom.hideFrom.viz = panel.fieldConfig.defaults.custom.hideFrom.graph;\n delete panel.fieldConfig.defaults.custom.hideFrom.graph;\n }\n if (panel.fieldConfig?.overrides) {\n panel.fieldConfig.overrides = panel.fieldConfig.overrides.map((fr) => {\n fr.properties = fr.properties.map((p) => {\n if (p.id === 'custom.hideFrom' && p.value.graph) {\n p.value.viz = p.value.graph;\n delete p.value.graph;\n }\n return p;\n });\n return fr;\n });\n }\n}\n","import { PanelPlugin } from '@grafana/data';\nimport { GraphFieldConfig } from '@grafana/schema';\nimport { commonOptionsBuilder } from '@grafana/ui';\n\nimport { TimeSeriesPanel } from './TimeSeriesPanel';\nimport { TimezonesEditor } from './TimezonesEditor';\nimport { defaultGraphConfig, getGraphFieldConfig } from './config';\nimport { graphPanelChangedHandler } from './migrations';\nimport { TimeSeriesSuggestionsSupplier } from './suggestions';\nimport { TimeSeriesOptions } from './types';\n\nexport const plugin = new PanelPlugin<TimeSeriesOptions, GraphFieldConfig>(TimeSeriesPanel)\n .setPanelChangeHandler(graphPanelChangedHandler)\n .useFieldConfig(getGraphFieldConfig(defaultGraphConfig))\n .setPanelOptions((builder) => {\n commonOptionsBuilder.addTooltipOptions(builder);\n commonOptionsBuilder.addLegendOptions(builder);\n\n builder.addCustomEditor({\n id: 'timezones',\n name: 'Time zone',\n path: 'timezones',\n category: ['Axis'],\n editor: TimezonesEditor,\n defaultValue: undefined,\n });\n })\n .setSuggestionsSupplier(new TimeSeriesSuggestionsSupplier())\n .setDataSupport({ annotations: true, alertStates: true });\n","import React, { useMemo } from 'react';\n\nimport { Field, PanelProps } from '@grafana/data';\nimport { PanelDataErrorView } from '@grafana/runtime';\nimport { TooltipDisplayMode } from '@grafana/schema';\nimport { usePanelContext, TimeSeries, TooltipPlugin, ZoomPlugin, KeyboardPlugin } from '@grafana/ui';\nimport { config } from 'app/core/config';\nimport { getFieldLinksForExplore } from 'app/features/explore/utils/links';\n\nimport { AnnotationEditorPlugin } from './plugins/AnnotationEditorPlugin';\nimport { AnnotationsPlugin } from './plugins/AnnotationsPlugin';\nimport { ContextMenuPlugin } from './plugins/ContextMenuPlugin';\nimport { ExemplarsPlugin } from './plugins/ExemplarsPlugin';\nimport { OutsideRangePlugin } from './plugins/OutsideRangePlugin';\nimport { ThresholdControlsPlugin } from './plugins/ThresholdControlsPlugin';\nimport { TimeSeriesOptions } from './types';\nimport { getTimezones, prepareGraphableFields } from './utils';\n\ninterface TimeSeriesPanelProps extends PanelProps<TimeSeriesOptions> {}\n\nexport const TimeSeriesPanel: React.FC<TimeSeriesPanelProps> = ({\n data,\n timeRange,\n timeZone,\n width,\n height,\n options,\n fieldConfig,\n onChangeTimeRange,\n replaceVariables,\n id,\n}) => {\n const { sync, canAddAnnotations, onThresholdsChange, canEditThresholds, onSplitOpen } = usePanelContext();\n\n const getFieldLinks = (field: Field, rowIndex: number) => {\n return getFieldLinksForExplore({ field, rowIndex, splitOpenFn: onSplitOpen, range: timeRange });\n };\n\n const frames = useMemo(() => prepareGraphableFields(data.series, config.theme2, timeRange), [data, timeRange]);\n const timezones = useMemo(() => getTimezones(options.timezones, timeZone), [options.timezones, timeZone]);\n\n if (!frames) {\n return (\n <PanelDataErrorView\n panelId={id}\n fieldConfig={fieldConfig}\n data={data}\n needsTimeField={true}\n needsNumberField={true}\n />\n );\n }\n\n const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations());\n\n return (\n <TimeSeries\n frames={frames}\n structureRev={data.structureRev}\n timeRange={timeRange}\n timeZones={timezones}\n width={width}\n height={height}\n legend={options.legend}\n options={options}\n >\n {(config, alignedDataFrame) => {\n return (\n <>\n <KeyboardPlugin config={config} />\n <ZoomPlugin config={config} onZoom={onChangeTimeRange} />\n {options.tooltip.mode === TooltipDisplayMode.None || (\n <TooltipPlugin\n data={alignedDataFrame}\n config={config}\n mode={options.tooltip.mode}\n sortOrder={options.tooltip.sort}\n sync={sync}\n timeZone={timeZone}\n />\n )}\n {/* Renders annotation markers*/}\n {data.annotations && (\n <AnnotationsPlugin annotations={data.annotations} config={config} timeZone={timeZone} />\n )}\n {/* Enables annotations creation*/}\n {enableAnnotationCreation ? (\n <AnnotationEditorPlugin data={alignedDataFrame} timeZone={timeZone} config={config}>\n {({ startAnnotating }) => {\n return (\n <ContextMenuPlugin\n data={alignedDataFrame}\n config={config}\n timeZone={timeZone}\n replaceVariables={replaceVariables}\n defaultItems={[\n {\n items: [\n {\n label: 'Add annotation',\n ariaLabel: 'Add annotation',\n icon: 'comment-alt',\n onClick: (e, p) => {\n if (!p) {\n return;\n }\n startAnnotating({ coords: p.coords });\n },\n },\n ],\n },\n ]}\n />\n );\n }}\n </AnnotationEditorPlugin>\n ) : (\n <ContextMenuPlugin\n data={alignedDataFrame}\n config={config}\n timeZone={timeZone}\n replaceVariables={replaceVariables}\n defaultItems={[]}\n />\n )}\n {data.annotations && (\n <ExemplarsPlugin\n config={config}\n exemplars={data.annotations}\n timeZone={timeZone}\n getFieldLinks={getFieldLinks}\n />\n )}\n\n {canEditThresholds && onThresholdsChange && (\n <ThresholdControlsPlugin\n config={config}\n fieldConfig={fieldConfig}\n onThresholdsChange={onThresholdsChange}\n />\n )}\n\n <OutsideRangePlugin config={config} onChangeTimeRange={onChangeTimeRange} />\n </>\n );\n }}\n </TimeSeries>\n );\n};\n","import { FieldColorModeId, VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { GraphDrawStyle, GraphFieldConfig, GraphGradientMode, LineInterpolation, StackingMode } from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { TimeSeriesOptions } from './types';\n\nexport class TimeSeriesSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary } = builder;\n\n if (!dataSummary.hasTimeField || !dataSummary.hasNumberField || dataSummary.rowCountTotal < 2) {\n return;\n }\n\n const list = builder.getListAppender<TimeSeriesOptions, GraphFieldConfig>({\n name: SuggestionName.LineChart,\n pluginId: 'timeseries',\n options: {\n legend: {} as any,\n },\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n cardOptions: {\n previewModifier: (s) => {\n s.options!.legend.showLegend = false;\n\n if (s.fieldConfig?.defaults.custom?.drawStyle !== GraphDrawStyle.Bars) {\n s.fieldConfig!.defaults.custom!.lineWidth = Math.max(s.fieldConfig!.defaults.custom!.lineWidth ?? 1, 2);\n }\n },\n },\n });\n\n const maxBarsCount = 100;\n\n list.append({\n name: SuggestionName.LineChart,\n });\n\n if (dataSummary.rowCountMax < 200) {\n list.append({\n name: SuggestionName.LineChartSmooth,\n fieldConfig: {\n defaults: {\n custom: {\n lineInterpolation: LineInterpolation.Smooth,\n },\n },\n overrides: [],\n },\n });\n }\n\n // Single series suggestions\n if (dataSummary.numberFieldCount === 1) {\n list.append({\n name: SuggestionName.AreaChart,\n fieldConfig: {\n defaults: {\n custom: {\n fillOpacity: 25,\n },\n },\n overrides: [],\n },\n });\n\n list.append({\n name: SuggestionName.LineChartGradientColorScheme,\n fieldConfig: {\n defaults: {\n color: {\n mode: FieldColorModeId.ContinuousGrYlRd,\n },\n custom: {\n gradientMode: GraphGradientMode.Scheme,\n lineInterpolation: LineInterpolation.Smooth,\n lineWidth: 3,\n fillOpacity: 20,\n },\n },\n overrides: [],\n },\n });\n\n if (dataSummary.rowCountMax < maxBarsCount) {\n list.append({\n name: SuggestionName.BarChart,\n fieldConfig: {\n defaults: {\n custom: {\n drawStyle: GraphDrawStyle.Bars,\n fillOpacity: 100,\n lineWidth: 1,\n gradientMode: GraphGradientMode.Hue,\n },\n },\n overrides: [],\n },\n });\n\n list.append({\n name: SuggestionName.BarChartGradientColorScheme,\n fieldConfig: {\n defaults: {\n color: {\n mode: FieldColorModeId.ContinuousGrYlRd,\n },\n custom: {\n drawStyle: GraphDrawStyle.Bars,\n fillOpacity: 90,\n lineWidth: 1,\n gradientMode: GraphGradientMode.Scheme,\n },\n },\n overrides: [],\n },\n });\n }\n\n return;\n }\n\n // Multiple series suggestions\n\n list.append({\n name: SuggestionName.AreaChartStacked,\n fieldConfig: {\n defaults: {\n custom: {\n fillOpacity: 25,\n stacking: {\n mode: StackingMode.Normal,\n group: 'A',\n },\n },\n },\n overrides: [],\n },\n });\n\n list.append({\n name: SuggestionName.AreaChartStackedPercent,\n fieldConfig: {\n defaults: {\n custom: {\n fillOpacity: 25,\n stacking: {\n mode: StackingMode.Percent,\n group: 'A',\n },\n },\n },\n overrides: [],\n },\n });\n\n if (dataSummary.rowCountTotal / dataSummary.numberFieldCount < maxBarsCount) {\n list.append({\n name: SuggestionName.BarChartStacked,\n fieldConfig: {\n defaults: {\n custom: {\n drawStyle: GraphDrawStyle.Bars,\n fillOpacity: 100,\n lineWidth: 1,\n gradientMode: GraphGradientMode.Hue,\n stacking: {\n mode: StackingMode.Normal,\n group: 'A',\n },\n },\n },\n overrides: [],\n },\n });\n\n list.append({\n name: SuggestionName.BarChartStackedPercent,\n fieldConfig: {\n defaults: {\n custom: {\n drawStyle: GraphDrawStyle.Bars,\n fillOpacity: 100,\n lineWidth: 1,\n gradientMode: GraphGradientMode.Hue,\n stacking: {\n mode: StackingMode.Percent,\n group: 'A',\n },\n },\n },\n overrides: [],\n },\n });\n }\n }\n}\n","import { css } from '@emotion/css';\nimport TracePageSearchBar from '@jaegertracing/jaeger-ui-components/src/TracePageHeader/TracePageSearchBar';\nimport { TopOfViewRefType } from '@jaegertracing/jaeger-ui-components/src/TraceTimelineViewer/VirtualizedTraceView';\nimport React, { useMemo, useState, createRef } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { PanelProps } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { TraceView } from 'app/features/explore/TraceView/TraceView';\nimport { useSearch } from 'app/features/explore/TraceView/useSearch';\nimport { transformDataFrames } from 'app/features/explore/TraceView/utils/transform';\n\nconst styles = {\n wrapper: css`\n height: 100%;\n overflow: scroll;\n `,\n};\n\nexport const TracesPanel: React.FunctionComponent<PanelProps> = ({ data }) => {\n const topOfViewRef = createRef<HTMLDivElement>();\n const traceProp = useMemo(() => transformDataFrames(data.series[0]), [data.series]);\n const { search, setSearch, spanFindMatches } = useSearch(traceProp?.spans);\n const [focusedSpanIdForSearch, setFocusedSpanIdForSearch] = useState('');\n const [searchBarSuffix, setSearchBarSuffix] = useState('');\n const dataSource = useAsync(async () => {\n return await getDataSourceSrv().get(data.request?.targets[0].datasource?.uid);\n });\n const scrollElement = document.getElementsByClassName(styles.wrapper)[0];\n\n if (!data || !data.series.length || !traceProp) {\n return (\n <div className=\"panel-empty\">\n <p>No data found in response</p>\n </div>\n );\n }\n\n return (\n <div className={styles.wrapper}>\n <div ref={topOfViewRef}></div>\n {data.series[0]?.meta?.preferredVisualisationType === 'trace' ? (\n <TracePageSearchBar\n navigable={true}\n searchValue={search}\n setSearch={setSearch}\n spanFindMatches={spanFindMatches}\n searchBarSuffix={searchBarSuffix}\n setSearchBarSuffix={setSearchBarSuffix}\n focusedSpanIdForSearch={focusedSpanIdForSearch}\n setFocusedSpanIdForSearch={setFocusedSpanIdForSearch}\n />\n ) : null}\n\n <TraceView\n dataFrames={data.series}\n scrollElement={scrollElement}\n traceProp={traceProp}\n spanFindMatches={spanFindMatches}\n search={search}\n focusedSpanIdForSearch={focusedSpanIdForSearch}\n queryResponse={data}\n datasource={dataSource.value}\n topOfViewRef={topOfViewRef}\n topOfViewRefType={TopOfViewRefType.Panel}\n />\n </div>\n );\n};\n","import { PanelPlugin } from '@grafana/data';\n\nimport { TracesPanel } from './TracesPanel';\n\nexport const plugin = new PanelPlugin(TracesPanel);\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '@grafana/ui';\n\nconst helpOptions = [\n { value: 0, label: 'Documentation', href: 'https://grafana.com/docs/grafana/latest' },\n { value: 1, label: 'Tutorials', href: 'https://grafana.com/tutorials' },\n { value: 2, label: 'Community', href: 'https://community.grafana.com' },\n { value: 3, label: 'Public Slack', href: 'http://slack.grafana.com' },\n];\n\nexport const WelcomeBanner: FC = () => {\n const styles = getStyles(useTheme());\n\n return (\n <div className={styles.container}>\n <h1 className={styles.title}>Welcome to Grafana</h1>\n <div className={styles.help}>\n <h3 className={styles.helpText}>Need help?</h3>\n <div className={styles.helpLinks}>\n {helpOptions.map((option, index) => {\n return (\n <a\n key={`${option.label}-${index}`}\n className={styles.helpLink}\n href={`${option.href}?utm_source=grafana_gettingstarted`}\n >\n {option.label}\n </a>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n container: css`\n display: flex;\n /// background: url(public/img/g8_home_v2.svg) no-repeat;\n background-size: cover;\n height: 100%;\n align-items: center;\n padding: 0 16px;\n justify-content: space-between;\n padding: 0 ${theme.spacing.lg};\n\n @media only screen and (max-width: ${theme.breakpoints.lg}) {\n background-position: 0px;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n }\n\n @media only screen and (max-width: ${theme.breakpoints.sm}) {\n padding: 0 ${theme.spacing.sm};\n }\n `,\n title: css`\n margin-bottom: 0;\n\n @media only screen and (max-width: ${theme.breakpoints.lg}) {\n margin-bottom: ${theme.spacing.sm};\n }\n\n @media only screen and (max-width: ${theme.breakpoints.md}) {\n font-size: ${theme.typography.heading.h2};\n }\n @media only screen and (max-width: ${theme.breakpoints.sm}) {\n font-size: ${theme.typography.heading.h3};\n }\n `,\n help: css`\n display: flex;\n align-items: baseline;\n `,\n helpText: css`\n margin-right: ${theme.spacing.md};\n margin-bottom: 0;\n\n @media only screen and (max-width: ${theme.breakpoints.md}) {\n font-size: ${theme.typography.heading.h4};\n }\n\n @media only screen and (max-width: ${theme.breakpoints.sm}) {\n display: none;\n }\n `,\n helpLinks: css`\n display: flex;\n flex-wrap: wrap;\n `,\n helpLink: css`\n margin-right: ${theme.spacing.md};\n text-decoration: underline;\n text-wrap: no-wrap;\n\n @media only screen and (max-width: ${theme.breakpoints.sm}) {\n margin-right: 8px;\n }\n `,\n };\n});\n","import { PanelPlugin } from '@grafana/data';\n\nimport { WelcomeBanner } from './Welcome';\n\nexport const plugin = new PanelPlugin(WelcomeBanner).setNoPadding();\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { DataFrame, Field, formattedValueToString, getFieldDisplayName, GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory } from '@grafana/ui';\nimport { config } from 'app/core/config';\n\nimport { ScatterSeries } from './types';\n\nexport interface Props {\n series: ScatterSeries;\n data: DataFrame[]; // source data\n rowIndex?: number; // the hover row\n}\n\nexport class TooltipView extends PureComponent<Props> {\n style = getStyles(config.theme2);\n\n render() {\n const { series, data, rowIndex } = this.props;\n if (!series || rowIndex == null) {\n return null;\n }\n const frame = series.frame(data);\n const y = undefined; // series.y(frame);\n\n return (\n <table className={this.style.infoWrap}>\n <tbody>\n {frame.fields.map((f, i) => (\n <tr key={`${i}/${rowIndex}`} className={f === y ? this.style.highlight : ''}>\n <th>{getFieldDisplayName(f, frame)}:</th>\n <td>{fmt(f, rowIndex)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n}\n\nfunction fmt(field: Field, row: number): string {\n const v = field.values.get(row);\n if (field.display) {\n return formattedValueToString(field.display(v));\n }\n return `${v}`;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n infoWrap: css`\n padding: 8px;\n th {\n font-weight: ${theme.typography.fontWeightMedium};\n padding: ${theme.spacing(0.25, 2)};\n }\n `,\n highlight: css`\n background: ${theme.colors.action.hover};\n `,\n}));\n","import { DataFrame, Field, FieldMatcher, FieldType, getFieldDisplayName } from '@grafana/data';\nimport { XYFieldMatchers } from '@grafana/ui/src/components/GraphNG/types';\n\nimport { XYDimensionConfig } from './models.gen';\n\n// TODO: fix import\n\nexport enum DimensionError {\n NoData,\n BadFrameSelection,\n XNotFound,\n}\n\nexport interface XYDimensions {\n frame: DataFrame; // matches order from configs, excluds non-graphable values\n x: Field;\n fields: XYFieldMatchers;\n error?: DimensionError;\n hasData?: boolean;\n hasTime?: boolean;\n}\n\nexport function isGraphable(field: Field) {\n return field.type === FieldType.number;\n}\n\nexport function getXYDimensions(cfg?: XYDimensionConfig, data?: DataFrame[]): XYDimensions {\n if (!data || !data.length) {\n return { error: DimensionError.NoData } as XYDimensions;\n }\n if (!cfg) {\n cfg = {\n frame: 0,\n };\n }\n\n let frame = data[cfg.frame ?? 0];\n if (!frame) {\n return { error: DimensionError.BadFrameSelection } as XYDimensions;\n }\n\n let xIndex = -1;\n for (let i = 0; i < frame.fields.length; i++) {\n const f = frame.fields[i];\n if (cfg.x && cfg.x === getFieldDisplayName(f, frame, data)) {\n xIndex = i;\n break;\n }\n if (isGraphable(f) && !cfg.x) {\n xIndex = i;\n break;\n }\n }\n\n let hasTime = false;\n const x = frame.fields[xIndex];\n const fields: Field[] = [x];\n for (const f of frame.fields) {\n if (f.type === FieldType.time) {\n hasTime = true;\n }\n if (f === x || !isGraphable(f)) {\n continue;\n }\n if (cfg.exclude) {\n const name = getFieldDisplayName(f, frame, data);\n if (cfg.exclude.includes(name)) {\n continue;\n }\n }\n fields.push(f);\n }\n\n return {\n x,\n fields: {\n x: getSimpleFieldMatcher(x),\n y: getSimpleFieldNotMatcher(x), // Not x\n },\n frame: {\n ...frame,\n fields,\n },\n hasData: frame.fields.length > 0,\n hasTime,\n };\n}\n\nfunction getSimpleFieldMatcher(f: Field): FieldMatcher {\n if (!f) {\n return () => false;\n }\n // the field may change if sorted\n return (field) => f === field || !!(f.state && f.state === field.state);\n}\n\nfunction getSimpleFieldNotMatcher(f: Field): FieldMatcher {\n if (!f) {\n return () => false;\n }\n const m = getSimpleFieldMatcher(f);\n return (field) => !m(field, undefined as any, undefined as any);\n}\n","import {\n OptionsWithTooltip,\n OptionsWithLegend,\n LineStyle,\n VisibilityMode,\n HideableFieldConfig,\n AxisConfig,\n AxisPlacement,\n} from '@grafana/schema';\nimport {\n ColorDimensionConfig,\n DimensionSupplier,\n ScaleDimensionConfig,\n TextDimensionConfig,\n} from 'app/features/dimensions';\n\nexport enum ScatterLineMode {\n None = 'none',\n Linear = 'linear',\n // Smooth\n // r2, etc\n}\n\nexport interface ScatterFieldConfig extends HideableFieldConfig, AxisConfig {\n line?: ScatterLineMode;\n lineWidth?: number;\n lineStyle?: LineStyle;\n lineColor?: ColorDimensionConfig;\n\n point?: VisibilityMode;\n pointSize?: ScaleDimensionConfig; // only 'fixed' is exposed in the UI\n pointColor?: ColorDimensionConfig;\n pointSymbol?: DimensionSupplier<string>;\n\n label?: VisibilityMode;\n labelValue?: TextDimensionConfig;\n}\n\n/** Configured in the panel level */\nexport interface ScatterSeriesConfig extends ScatterFieldConfig {\n x?: string;\n y?: string;\n}\n\nexport const defaultScatterConfig: ScatterFieldConfig = {\n line: ScatterLineMode.None, // no line\n lineWidth: 1,\n lineStyle: {\n fill: 'solid',\n },\n point: VisibilityMode.Auto,\n pointSize: {\n fixed: 5,\n min: 1,\n max: 20,\n },\n axisPlacement: AxisPlacement.Auto,\n};\n\n/** Old config saved with 8.0+ */\nexport interface XYDimensionConfig {\n frame: number;\n x?: string; // name | first\n exclude?: string[]; // all other numbers except\n}\n\nexport interface XYChartOptions extends OptionsWithLegend, OptionsWithTooltip {\n mode?: 'xy' | 'explicit';\n dims: XYDimensionConfig;\n\n series?: ScatterSeriesConfig[];\n}\n","import uPlot from 'uplot';\n\nimport {\n DataFrame,\n FieldColorModeId,\n fieldColorModeRegistry,\n getDisplayProcessor,\n getFieldColorModeForField,\n getFieldDisplayName,\n getFieldSeriesColor,\n GrafanaTheme2,\n} from '@grafana/data';\nimport { alpha } from '@grafana/data/src/themes/colorManipulator';\nimport { config } from '@grafana/runtime';\nimport { AxisPlacement, ScaleDirection, ScaleOrientation, VisibilityMode } from '@grafana/schema';\nimport { UPlotConfigBuilder } from '@grafana/ui';\nimport { FacetedData, FacetSeries } from '@grafana/ui/src/components/uPlot/types';\nimport {\n findFieldIndex,\n getScaledDimensionForField,\n ScaleDimensionConfig,\n ScaleDimensionMode,\n} from 'app/features/dimensions';\n\nimport { pointWithin, Quadtree, Rect } from '../barchart/quadtree';\n\nimport { isGraphable } from './dims';\nimport { defaultScatterConfig, ScatterFieldConfig, ScatterLineMode, XYChartOptions } from './models.gen';\nimport { DimensionValues, ScatterHoverCallback, ScatterSeries } from './types';\n\nexport interface ScatterPanelInfo {\n error?: string;\n series: ScatterSeries[];\n builder?: UPlotConfigBuilder;\n}\n\n/**\n * This is called when options or structure rev changes\n */\nexport function prepScatter(\n options: XYChartOptions,\n getData: () => DataFrame[],\n theme: GrafanaTheme2,\n ttip: ScatterHoverCallback\n): ScatterPanelInfo {\n let series: ScatterSeries[];\n let builder: UPlotConfigBuilder;\n\n try {\n series = prepSeries(options, getData());\n builder = prepConfig(getData, series, theme, ttip);\n } catch (e) {\n console.log('prepScatter ERROR', e);\n const errorMessage = e instanceof Error ? e.message : 'Unknown error in prepScatter';\n return {\n error: errorMessage,\n series: [],\n };\n }\n\n return {\n series,\n builder,\n };\n}\n\ninterface Dims {\n pointColorIndex?: number;\n pointColorFixed?: string;\n\n pointSizeIndex?: number;\n pointSizeConfig?: ScaleDimensionConfig;\n}\n\nfunction getScatterSeries(\n seriesIndex: number,\n frames: DataFrame[],\n frameIndex: number,\n xIndex: number,\n yIndex: number,\n dims: Dims\n): ScatterSeries {\n const frame = frames[frameIndex];\n const y = frame.fields[yIndex];\n let state = y.state ?? {};\n state.seriesIndex = seriesIndex;\n y.state = state;\n\n // Color configs\n //----------------\n let seriesColor = dims.pointColorFixed\n ? config.theme2.visualization.getColorByName(dims.pointColorFixed)\n : getFieldSeriesColor(y, config.theme2).color;\n let pointColor: DimensionValues<string> = () => seriesColor;\n const fieldConfig: ScatterFieldConfig = { ...defaultScatterConfig, ...y.config.custom };\n let pointColorMode = fieldColorModeRegistry.get(FieldColorModeId.PaletteClassic);\n if (dims.pointColorIndex) {\n const f = frames[frameIndex].fields[dims.pointColorIndex];\n if (f) {\n const disp =\n f.display ??\n getDisplayProcessor({\n field: f,\n theme: config.theme2,\n });\n pointColorMode = getFieldColorModeForField(y);\n if (pointColorMode.isByValue) {\n const index = dims.pointColorIndex;\n pointColor = (frame: DataFrame) => {\n // Yes we can improve this later\n return frame.fields[index].values.toArray().map((v) => disp(v).color!);\n };\n } else {\n seriesColor = pointColorMode.getCalculator(f, config.theme2)(f.values.get(0), 1);\n pointColor = () => seriesColor;\n }\n }\n }\n\n // Size configs\n //----------------\n let pointSizeHints = dims.pointSizeConfig;\n let pointSizeFixed = dims.pointSizeConfig?.fixed ?? y.config.custom?.pointSizeConfig?.fixed ?? 5;\n let pointSize: DimensionValues<number> = () => pointSizeFixed;\n if (dims.pointSizeIndex) {\n pointSize = (frame) => {\n const s = getScaledDimensionForField(\n frame.fields[dims.pointSizeIndex!],\n dims.pointSizeConfig!,\n ScaleDimensionMode.Quadratic\n );\n const vals = Array(frame.length);\n for (let i = 0; i < frame.length; i++) {\n vals[i] = s.get(i);\n }\n return vals;\n };\n } else {\n pointSizeHints = {\n fixed: pointSizeFixed,\n min: pointSizeFixed,\n max: pointSizeFixed,\n };\n }\n\n // Series config\n //----------------\n const name = getFieldDisplayName(y, frame, frames);\n return {\n name,\n\n frame: (frames) => frames[frameIndex],\n\n x: (frame) => frame.fields[xIndex],\n y: (frame) => frame.fields[yIndex],\n legend: (frame) => {\n return [\n {\n label: name,\n color: seriesColor, // single color for series?\n getItemKey: () => name,\n yAxis: yIndex, // << but not used\n },\n ];\n },\n\n line: fieldConfig.line ?? ScatterLineMode.None,\n lineWidth: fieldConfig.lineWidth ?? 2,\n lineStyle: fieldConfig.lineStyle!,\n lineColor: () => seriesColor,\n\n point: fieldConfig.point!,\n pointSize,\n pointColor,\n pointSymbol: (frame: DataFrame, from?: number) => 'circle', // single field, multiple symbols.... kinda equals multiple series 🤔\n\n label: VisibilityMode.Never,\n labelValue: () => '',\n\n hints: {\n pointSize: pointSizeHints!,\n pointColor: {\n mode: pointColorMode,\n },\n },\n };\n}\n\nfunction prepSeries(options: XYChartOptions, frames: DataFrame[]): ScatterSeries[] {\n let seriesIndex = 0;\n if (!frames.length) {\n throw 'missing data';\n }\n\n if (options.mode === 'explicit') {\n if (options.series?.length) {\n for (const series of options.series) {\n if (!series?.x) {\n throw 'Select X dimension';\n }\n\n if (!series?.y) {\n throw 'Select Y dimension';\n }\n\n for (let frameIndex = 0; frameIndex < frames.length; frameIndex++) {\n const frame = frames[frameIndex];\n const xIndex = findFieldIndex(frame, series.x);\n\n if (xIndex != null) {\n // TODO: this should find multiple y fields\n const yIndex = findFieldIndex(frame, series.y);\n\n if (yIndex == null) {\n throw 'Y must be in the same frame as X';\n }\n\n const dims: Dims = {\n pointColorFixed: series.pointColor?.fixed,\n pointColorIndex: findFieldIndex(frame, series.pointColor?.field),\n pointSizeConfig: series.pointSize,\n pointSizeIndex: findFieldIndex(frame, series.pointSize?.field),\n };\n return [getScatterSeries(seriesIndex++, frames, frameIndex, xIndex, yIndex, dims)];\n }\n }\n }\n }\n }\n\n // Default behavior\n const dims = options.dims ?? {};\n const frameIndex = dims.frame ?? 0;\n const frame = frames[frameIndex];\n const numericIndicies: number[] = [];\n\n let xIndex = findFieldIndex(frame, dims.x);\n for (let i = 0; i < frame.fields.length; i++) {\n if (isGraphable(frame.fields[i])) {\n if (xIndex == null || i === xIndex) {\n xIndex = i;\n continue;\n }\n if (dims.exclude && dims.exclude.includes(getFieldDisplayName(frame.fields[i], frame, frames))) {\n continue; // skip\n }\n\n numericIndicies.push(i);\n }\n }\n\n if (xIndex == null) {\n throw 'Missing X dimension';\n }\n\n if (!numericIndicies.length) {\n throw 'No Y values';\n }\n return numericIndicies.map((yIndex) => getScatterSeries(seriesIndex++, frames, frameIndex, xIndex!, yIndex, {}));\n}\n\ninterface DrawBubblesOpts {\n each: (u: uPlot, seriesIdx: number, dataIdx: number, lft: number, top: number, wid: number, hgt: number) => void;\n disp: {\n //unit: 3,\n size: {\n values: (u: uPlot, seriesIdx: number) => number[];\n };\n color: {\n values: (u: uPlot, seriesIdx: number) => string[];\n alpha: (u: uPlot, seriesIdx: number) => string[];\n };\n };\n}\n\n//const prepConfig: UPlotConfigPrepFnXY<XYChartOptions> = ({ frames, series, theme }) => {\nconst prepConfig = (\n getData: () => DataFrame[],\n scatterSeries: ScatterSeries[],\n theme: GrafanaTheme2,\n ttip: ScatterHoverCallback\n) => {\n let qt: Quadtree;\n let hRect: Rect | null;\n\n function drawBubblesFactory(opts: DrawBubblesOpts) {\n const drawBubbles: uPlot.Series.PathBuilder = (u, seriesIdx, idx0, idx1) => {\n uPlot.orient(\n u,\n seriesIdx,\n (\n series,\n dataX,\n dataY,\n scaleX,\n scaleY,\n valToPosX,\n valToPosY,\n xOff,\n yOff,\n xDim,\n yDim,\n moveTo,\n lineTo,\n rect,\n arc\n ) => {\n const scatterInfo = scatterSeries[seriesIdx - 1];\n let d = u.data[seriesIdx] as unknown as FacetSeries;\n\n let showLine = scatterInfo.line !== ScatterLineMode.None;\n let showPoints = scatterInfo.point === VisibilityMode.Always;\n if (!showPoints && scatterInfo.point === VisibilityMode.Auto) {\n showPoints = d[0].length < 1000;\n }\n\n // always show something\n if (!showPoints && !showLine) {\n showLine = true;\n }\n\n let strokeWidth = 1;\n\n u.ctx.save();\n\n u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n u.ctx.clip();\n\n u.ctx.fillStyle = (series.fill as any)(); // assumes constant\n u.ctx.strokeStyle = (series.stroke as any)();\n u.ctx.lineWidth = strokeWidth;\n\n let deg360 = 2 * Math.PI;\n\n let xKey = scaleX.key!;\n let yKey = scaleY.key!;\n\n let pointHints = scatterInfo.hints.pointSize;\n const colorByValue = scatterInfo.hints.pointColor.mode.isByValue;\n\n let maxSize = (pointHints.max ?? pointHints.fixed) * devicePixelRatio;\n\n // todo: this depends on direction & orientation\n // todo: calc once per redraw, not per path\n let filtLft = u.posToVal(-maxSize / 2, xKey);\n let filtRgt = u.posToVal(u.bbox.width / devicePixelRatio + maxSize / 2, xKey);\n let filtBtm = u.posToVal(u.bbox.height / devicePixelRatio + maxSize / 2, yKey);\n let filtTop = u.posToVal(-maxSize / 2, yKey);\n\n let sizes = opts.disp.size.values(u, seriesIdx);\n let pointColors = opts.disp.color.values(u, seriesIdx);\n let pointAlpha = opts.disp.color.alpha(u, seriesIdx);\n\n let linePath: Path2D | null = showLine ? new Path2D() : null;\n\n for (let i = 0; i < d[0].length; i++) {\n let xVal = d[0][i];\n let yVal = d[1][i];\n let size = sizes[i] * devicePixelRatio;\n\n if (xVal >= filtLft && xVal <= filtRgt && yVal >= filtBtm && yVal <= filtTop) {\n let cx = valToPosX(xVal, scaleX, xDim, xOff);\n let cy = valToPosY(yVal, scaleY, yDim, yOff);\n\n if (showLine) {\n linePath!.lineTo(cx, cy);\n }\n\n if (showPoints) {\n u.ctx.moveTo(cx + size / 2, cy);\n u.ctx.beginPath();\n u.ctx.arc(cx, cy, size / 2, 0, deg360);\n\n if (colorByValue) {\n u.ctx.fillStyle = pointAlpha[i];\n u.ctx.strokeStyle = pointColors[i];\n }\n\n u.ctx.fill();\n u.ctx.stroke();\n opts.each(\n u,\n seriesIdx,\n i,\n cx - size / 2 - strokeWidth / 2,\n cy - size / 2 - strokeWidth / 2,\n size + strokeWidth,\n size + strokeWidth\n );\n }\n }\n }\n\n if (showLine) {\n let frame = scatterInfo.frame(getData());\n u.ctx.strokeStyle = scatterInfo.lineColor(frame);\n u.ctx.lineWidth = scatterInfo.lineWidth * devicePixelRatio;\n\n const { lineStyle } = scatterInfo;\n if (lineStyle && lineStyle.fill !== 'solid') {\n if (lineStyle.fill === 'dot') {\n u.ctx.lineCap = 'round';\n }\n u.ctx.setLineDash(lineStyle.dash ?? [10, 10]);\n }\n\n u.ctx.stroke(linePath!);\n }\n\n u.ctx.restore();\n }\n );\n\n return null;\n };\n\n return drawBubbles;\n }\n\n let drawBubbles = drawBubblesFactory({\n disp: {\n size: {\n //unit: 3, // raw CSS pixels\n values: (u, seriesIdx) => {\n return u.data[seriesIdx][2] as any; // already contains final pixel geometry\n //let [minValue, maxValue] = getSizeMinMax(u);\n //return u.data[seriesIdx][2].map(v => getSize(v, minValue, maxValue));\n },\n },\n color: {\n // string values\n values: (u, seriesIdx) => {\n return u.data[seriesIdx][3] as any;\n },\n alpha: (u, seriesIdx) => {\n return u.data[seriesIdx][4] as any;\n },\n },\n },\n each: (u, seriesIdx, dataIdx, lft, top, wid, hgt) => {\n // we get back raw canvas coords (included axes & padding). translate to the plotting area origin\n lft -= u.bbox.left;\n top -= u.bbox.top;\n qt.add({ x: lft, y: top, w: wid, h: hgt, sidx: seriesIdx, didx: dataIdx });\n },\n });\n\n const builder = new UPlotConfigBuilder();\n\n builder.setCursor({\n drag: { setScale: true },\n dataIdx: (u, seriesIdx) => {\n if (seriesIdx === 1) {\n hRect = null;\n\n let dist = Infinity;\n let cx = u.cursor.left! * devicePixelRatio;\n let cy = u.cursor.top! * devicePixelRatio;\n\n qt.get(cx, cy, 1, 1, (o) => {\n if (pointWithin(cx, cy, o.x, o.y, o.x + o.w, o.y + o.h)) {\n let ocx = o.x + o.w / 2;\n let ocy = o.y + o.h / 2;\n\n let dx = ocx - cx;\n let dy = ocy - cy;\n\n let d = Math.sqrt(dx ** 2 + dy ** 2);\n\n // test against radius for actual hover\n if (d <= o.w / 2) {\n // only hover bbox with closest distance\n if (d <= dist) {\n dist = d;\n hRect = o;\n }\n }\n }\n });\n }\n\n return hRect && seriesIdx === hRect.sidx ? hRect.didx : null;\n },\n points: {\n size: (u, seriesIdx) => {\n return hRect && seriesIdx === hRect.sidx ? hRect.w / devicePixelRatio : 0;\n },\n fill: (u, seriesIdx) => 'rgba(255,255,255,0.4)',\n },\n });\n\n // clip hover points/bubbles to plotting area\n builder.addHook('init', (u, r) => {\n u.over.style.overflow = 'hidden';\n });\n\n let rect: DOMRect;\n\n // rect of .u-over (grid area)\n builder.addHook('syncRect', (u, r) => {\n rect = r;\n });\n\n builder.addHook('setLegend', (u) => {\n // console.log('TTIP???', u.cursor.idxs);\n if (u.cursor.idxs != null) {\n for (let i = 0; i < u.cursor.idxs.length; i++) {\n const sel = u.cursor.idxs[i];\n if (sel != null) {\n ttip({\n scatterIndex: i - 1,\n xIndex: sel,\n pageX: rect.left + u.cursor.left!,\n pageY: rect.top + u.cursor.top!,\n });\n return; // only show the first one\n }\n }\n }\n ttip(undefined);\n });\n\n builder.addHook('drawClear', (u) => {\n qt = qt || new Quadtree(0, 0, u.bbox.width, u.bbox.height);\n\n qt.clear();\n\n // force-clear the path cache to cause drawBars() to rebuild new quadtree\n u.series.forEach((s, i) => {\n if (i > 0) {\n // @ts-ignore\n s._paths = null;\n }\n });\n });\n\n builder.setMode(2);\n\n const frames = getData();\n let xField = scatterSeries[0].x(scatterSeries[0].frame(frames));\n\n builder.addScale({\n scaleKey: 'x',\n isTime: false,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n range: (u, min, max) => [min, max],\n });\n\n builder.addAxis({\n scaleKey: 'x',\n placement:\n xField.config.custom?.axisPlacement !== AxisPlacement.Hidden ? AxisPlacement.Bottom : AxisPlacement.Hidden,\n show: xField.config.custom?.axisPlacement !== AxisPlacement.Hidden,\n theme,\n label: xField.config.custom.axisLabel,\n });\n\n scatterSeries.forEach((s) => {\n let frame = s.frame(frames);\n let field = s.y(frame);\n\n const lineColor = s.lineColor(frame);\n const pointColor = asSingleValue(frame, s.pointColor) as string;\n //const lineColor = s.lineColor(frame);\n //const lineWidth = s.lineWidth;\n\n let scaleKey = field.config.unit ?? 'y';\n\n builder.addScale({\n scaleKey,\n orientation: ScaleOrientation.Vertical,\n direction: ScaleDirection.Up,\n range: (u, min, max) => [min, max],\n });\n\n if (field.config.custom?.axisPlacement !== AxisPlacement.Hidden) {\n builder.addAxis({\n scaleKey,\n theme,\n placement: field.config.custom?.axisPlacement,\n label: field.config.custom.axisLabel,\n values: (u, splits) => splits.map((s) => field.display!(s).text),\n });\n }\n\n builder.addSeries({\n facets: [\n {\n scale: 'x',\n auto: true,\n },\n {\n scale: scaleKey,\n auto: true,\n },\n ],\n pathBuilder: drawBubbles, // drawBubbles({disp: {size: {values: () => }}})\n theme,\n scaleKey: '', // facets' scales used (above)\n lineColor: lineColor as string,\n fillColor: alpha(pointColor, 0.5),\n });\n });\n\n /*\n builder.setPrepData((frames) => {\n let seriesData = lookup.fieldMaps.flatMap((f, i) => {\n let { fields } = frames[i];\n\n return f.y.map((yIndex, frameSeriesIndex) => {\n let xValues = fields[f.x[frameSeriesIndex]].values.toArray();\n let yValues = fields[f.y[frameSeriesIndex]].values.toArray();\n let sizeValues = f.size;\n\n if (!Array.isArray(sizeValues)) {\n sizeValues = Array(xValues.length).fill(sizeValues);\n }\n\n return [xValues, yValues, sizeValues];\n });\n });\n\n return [null, ...seriesData];\n });\n */\n\n return builder;\n};\n\n/**\n * This is called everytime the data changes\n *\n * from? is this where we would support that? -- need the previous values\n */\nexport function prepData(info: ScatterPanelInfo, data: DataFrame[], from?: number): FacetedData {\n if (info.error) {\n return [null];\n }\n return [\n null,\n ...info.series.map((s, idx) => {\n const frame = s.frame(data);\n\n let colorValues;\n let colorAlphaValues;\n const r = s.pointColor(frame);\n if (Array.isArray(r)) {\n colorValues = r;\n colorAlphaValues = r.map((c) => alpha(c as string, 0.5));\n } else {\n colorValues = Array(frame.length).fill(r);\n colorAlphaValues = Array(frame.length).fill(alpha(r as string, 0.5));\n }\n return [\n s.x(frame).values.toArray(), // X\n s.y(frame).values.toArray(), // Y\n asArray(frame, s.pointSize),\n colorValues,\n colorAlphaValues,\n ];\n }),\n ];\n}\n\nfunction asArray<T>(frame: DataFrame, lookup: DimensionValues<T>): T[] {\n const r = lookup(frame);\n if (Array.isArray(r)) {\n return r;\n }\n return Array(frame.length).fill(r);\n}\n\nfunction asSingleValue<T>(frame: DataFrame, lookup: DimensionValues<T>): T {\n const r = lookup(frame);\n if (Array.isArray(r)) {\n return r[0];\n }\n return r;\n}\n","import React, { PureComponent } from 'react';\n\nimport { PanelProps } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport {\n LegendDisplayMode,\n Portal,\n UPlotChart,\n UPlotConfigBuilder,\n VizLayout,\n VizLegend,\n VizLegendItem,\n VizTooltipContainer,\n} from '@grafana/ui';\nimport { FacetedData } from '@grafana/ui/src/components/uPlot/types';\n\nimport { TooltipView } from './TooltipView';\nimport { XYChartOptions } from './models.gen';\nimport { prepData, prepScatter } from './scatter';\nimport { ScatterHoverEvent, ScatterSeries } from './types';\n\ntype Props = PanelProps<XYChartOptions>;\ntype State = {\n error?: string;\n series: ScatterSeries[];\n builder?: UPlotConfigBuilder;\n facets?: FacetedData;\n hover?: ScatterHoverEvent;\n};\n\nexport class XYChartPanel2 extends PureComponent<Props, State> {\n state: State = {\n series: [],\n };\n\n componentDidMount() {\n this.initSeries(); // also data\n }\n\n componentDidUpdate(oldProps: Props) {\n const { options, data } = this.props;\n const configsChanged = options !== oldProps.options || data.structureRev !== oldProps.data.structureRev;\n\n if (configsChanged) {\n this.initSeries();\n } else if (data !== oldProps.data) {\n this.initFacets();\n }\n }\n\n scatterHoverCallback = (hover?: ScatterHoverEvent) => {\n this.setState({ hover });\n };\n\n getData = () => {\n return this.props.data.series;\n };\n\n initSeries = () => {\n const { options, data } = this.props;\n const info: State = prepScatter(options, this.getData, config.theme2, this.scatterHoverCallback);\n if (info.series.length && data.series) {\n info.facets = prepData(info, data.series);\n info.error = undefined;\n }\n this.setState(info);\n };\n\n initFacets = () => {\n this.setState({\n facets: prepData(this.state, this.props.data.series),\n });\n };\n\n renderLegend = () => {\n const { data } = this.props;\n const { series } = this.state;\n const items: VizLegendItem[] = [];\n for (const s of series) {\n const frame = s.frame(data.series);\n if (frame) {\n for (const item of s.legend(frame)) {\n items.push(item);\n }\n }\n }\n\n return (\n <VizLayout.Legend placement=\"bottom\">\n <VizLegend placement=\"bottom\" items={items} displayMode={LegendDisplayMode.List} />\n </VizLayout.Legend>\n );\n };\n\n render() {\n const { width, height, timeRange, data } = this.props;\n const { error, facets, builder, hover, series } = this.state;\n if (error || !builder) {\n return (\n <div className=\"panel-empty\">\n <p>{error}</p>\n </div>\n );\n }\n\n return (\n <>\n <VizLayout width={width} height={height} legend={this.renderLegend()}>\n {(vizWidth: number, vizHeight: number) => (\n // <pre style={{ width: vizWidth, height: vizHeight, border: '1px solid green', margin: '0px' }}>\n // {JSON.stringify(scatterData, null, 2)}\n // </pre>\n <UPlotChart config={builder} data={facets!} width={vizWidth} height={vizHeight} timeRange={timeRange}>\n {/*children ? children(config, alignedFrame) : null*/}\n </UPlotChart>\n )}\n </VizLayout>\n <Portal>\n {hover && (\n <VizTooltipContainer position={{ x: hover.pageX, y: hover.pageY }} offset={{ x: 10, y: 10 }}>\n <TooltipView series={series[hover.scatterIndex]} rowIndex={hover.xIndex} data={data.series} />\n </VizTooltipContainer>\n )}\n </Portal>\n </>\n );\n }\n}\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport {\n SelectableValue,\n getFrameDisplayName,\n GrafanaTheme,\n StandardEditorProps,\n getFieldDisplayName,\n} from '@grafana/data';\nimport { IconButton, Label, Select, stylesFactory, useTheme } from '@grafana/ui';\n\nimport { getXYDimensions, isGraphable } from './dims';\nimport { XYDimensionConfig, XYChartOptions } from './models.gen';\n\ninterface XYInfo {\n numberFields: Array<SelectableValue<string>>;\n xAxis: SelectableValue<string>;\n yFields: Array<SelectableValue<boolean>>;\n}\n\nexport const XYDimsEditor: FC<StandardEditorProps<XYDimensionConfig, any, XYChartOptions>> = ({\n value,\n onChange,\n context,\n}) => {\n const frameNames = useMemo(() => {\n if (context?.data?.length) {\n return context.data.map((f, idx) => ({\n value: idx,\n label: getFrameDisplayName(f, idx),\n }));\n }\n return [{ value: 0, label: 'First result' }];\n }, [context.data]);\n\n const dims = useMemo(() => getXYDimensions(value, context.data), [context.data, value]);\n\n const info = useMemo(() => {\n const first = {\n label: '?',\n value: undefined, // empty\n };\n const v: XYInfo = {\n numberFields: [first],\n yFields: [],\n xAxis: value?.x\n ? {\n label: `${value.x} (Not found)`,\n value: value.x, // empty\n }\n : first,\n };\n const frame = context.data ? context.data[value?.frame ?? 0] : undefined;\n if (frame) {\n const xName = dims.x ? getFieldDisplayName(dims.x, dims.frame, context.data) : undefined;\n for (let field of frame.fields) {\n if (isGraphable(field)) {\n const name = getFieldDisplayName(field, frame, context.data);\n const sel = {\n label: name,\n value: name,\n };\n v.numberFields.push(sel);\n if (first.label === '?') {\n first.label = `${name} (First)`;\n }\n if (value?.x && name === value.x) {\n v.xAxis = sel;\n }\n if (xName !== name) {\n v.yFields.push({\n label: name,\n value: value?.exclude?.includes(name),\n });\n }\n }\n }\n }\n\n return v;\n }, [dims, context.data, value]);\n\n const theme = useTheme();\n const styles = getStyles(theme);\n\n if (!context.data) {\n return <div>No data...</div>;\n }\n\n return (\n <div>\n <Select\n options={frameNames}\n value={frameNames.find((v) => v.value === value?.frame) ?? frameNames[0]}\n onChange={(v) => {\n onChange({\n ...value,\n frame: v.value!,\n });\n }}\n />\n <br />\n <Label>X Field</Label>\n <Select\n options={info.numberFields}\n value={info.xAxis}\n onChange={(v) => {\n onChange({\n ...value,\n x: v.value,\n });\n }}\n />\n <br />\n <Label>Y Fields</Label>\n <div>\n {info.yFields.map((v) => (\n <div key={v.label} className={styles.row}>\n <IconButton\n name={v.value ? 'eye-slash' : 'eye'}\n onClick={() => {\n const exclude: string[] = value?.exclude ? [...value.exclude] : [];\n let idx = exclude.indexOf(v.label!);\n if (idx < 0) {\n exclude.push(v.label!);\n } else {\n exclude.splice(idx, 1);\n }\n onChange({\n ...value,\n exclude,\n });\n }}\n />\n {v.label}\n </div>\n ))}\n </div>\n <br /> <br />\n </div>\n );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n sorter: css`\n margin-top: 10px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n cursor: pointer;\n `,\n\n row: css`\n padding: ${theme.spacing.xs} ${theme.spacing.sm};\n border-radius: ${theme.border.radius.sm};\n background: ${theme.colors.bg2};\n min-height: ${theme.spacing.formInputHeight}px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: center;\n margin-bottom: 3px;\n border: 1px solid ${theme.colors.formInputBorder};\n `,\n}));\n","import {\n FieldColorModeId,\n FieldConfigProperty,\n FieldType,\n identityOverrideProcessor,\n SetFieldConfigOptionsArgs,\n} from '@grafana/data';\nimport { LineStyle, VisibilityMode } from '@grafana/schema';\nimport { commonOptionsBuilder, graphFieldOptions } from '@grafana/ui';\n\nimport { LineStyleEditor } from '../timeseries/LineStyleEditor';\n\nimport { ScatterFieldConfig, ScatterLineMode } from './models.gen';\n\nconst categoryStyles = undefined; // ['Scatter styles'];\n\nexport function getScatterFieldConfig(cfg: ScatterFieldConfig): SetFieldConfigOptionsArgs<ScatterFieldConfig> {\n return {\n standardOptions: {\n [FieldConfigProperty.Color]: {\n settings: {\n byValueSupport: true,\n bySeriesSupport: true,\n preferThresholdsMode: false,\n },\n defaultValue: {\n mode: FieldColorModeId.PaletteClassic,\n },\n },\n },\n\n useCustomConfig: (builder) => {\n builder\n .addRadio({\n path: 'point',\n name: 'Points',\n category: categoryStyles,\n defaultValue: cfg.point,\n settings: {\n options: graphFieldOptions.showPoints,\n },\n })\n .addSliderInput({\n path: 'pointSize.fixed',\n name: 'Point size',\n category: categoryStyles,\n defaultValue: cfg.pointSize?.fixed,\n settings: {\n min: 1,\n max: 100,\n step: 1,\n },\n showIf: (c) => c.point !== VisibilityMode.Never,\n })\n .addRadio({\n path: 'line',\n name: 'Lines',\n category: categoryStyles,\n defaultValue: cfg.line,\n settings: {\n options: [\n { label: 'None', value: ScatterLineMode.None },\n { label: 'Linear', value: ScatterLineMode.Linear },\n ],\n },\n })\n .addCustomEditor<void, LineStyle>({\n id: 'lineStyle',\n path: 'lineStyle',\n name: 'Line style',\n category: categoryStyles,\n showIf: (c) => c.line !== ScatterLineMode.None,\n editor: LineStyleEditor,\n override: LineStyleEditor,\n process: identityOverrideProcessor,\n shouldApply: (f) => f.type === FieldType.number,\n })\n .addSliderInput({\n path: 'lineWidth',\n name: 'Line width',\n category: categoryStyles,\n defaultValue: cfg.lineWidth,\n settings: {\n min: 0,\n max: 10,\n step: 1,\n },\n showIf: (c) => c.line !== ScatterLineMode.None,\n });\n\n commonOptionsBuilder.addAxisConfig(builder, cfg);\n commonOptionsBuilder.addHideFrom(builder);\n },\n };\n}\n","import { PanelPlugin } from '@grafana/data';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { ColorDimensionEditor, ScaleDimensionEditor } from 'app/features/dimensions/editors';\n\nimport { XYChartPanel2 } from './XYChartPanel2';\nimport { XYDimsEditor } from './XYDimsEditor';\nimport { getScatterFieldConfig } from './config';\nimport { defaultScatterConfig, XYChartOptions, ScatterFieldConfig } from './models.gen';\n\nexport const plugin = new PanelPlugin<XYChartOptions, ScatterFieldConfig>(XYChartPanel2)\n .useFieldConfig(getScatterFieldConfig(defaultScatterConfig))\n .setPanelOptions((builder) => {\n builder\n .addRadio({\n path: 'mode',\n name: 'Mode',\n defaultValue: 'single',\n settings: {\n options: [\n { value: 'xy', label: 'XY', description: 'No changes to saved model since 8.0' },\n { value: 'explicit', label: 'Explicit' },\n ],\n },\n })\n .addCustomEditor({\n id: 'xyPlotConfig',\n path: 'dims',\n name: 'Data',\n editor: XYDimsEditor,\n showIf: (cfg) => cfg.mode === 'xy',\n })\n .addFieldNamePicker({\n path: 'series[0].x',\n name: 'X Field',\n showIf: (cfg) => cfg.mode === 'explicit',\n })\n .addFieldNamePicker({\n path: 'series[0].y',\n name: 'Y Field',\n showIf: (cfg) => cfg.mode === 'explicit',\n })\n .addCustomEditor({\n id: 'seriesZerox.pointColor',\n path: 'series[0].pointColor',\n name: 'Point color',\n editor: ColorDimensionEditor,\n settings: {},\n defaultValue: {},\n showIf: (cfg) => cfg.mode === 'explicit',\n })\n .addCustomEditor({\n id: 'seriesZerox.pointSize',\n path: 'series[0].pointSize',\n name: 'Point size',\n editor: ScaleDimensionEditor,\n settings: {\n min: 1,\n max: 50,\n },\n defaultValue: {\n fixed: 5,\n min: 1,\n max: 50,\n },\n showIf: (cfg) => cfg.mode === 'explicit',\n });\n\n commonOptionsBuilder.addTooltipOptions(builder);\n commonOptionsBuilder.addLegendOptions(builder);\n });\n","const graphitePlugin = async () =>\n await import(/* webpackChunkName: \"graphitePlugin\" */ 'app/plugins/datasource/graphite/module');\nconst cloudwatchPlugin = async () =>\n await import(/* webpackChunkName: \"cloudwatchPlugin\" */ 'app/plugins/datasource/cloudwatch/module');\nconst dashboardDSPlugin = async () =>\n await import(/* webpackChunkName \"dashboardDSPlugin\" */ 'app/plugins/datasource/dashboard/module');\nconst elasticsearchPlugin = async () =>\n await import(/* webpackChunkName: \"elasticsearchPlugin\" */ 'app/plugins/datasource/elasticsearch/module');\nconst opentsdbPlugin = async () =>\n await import(/* webpackChunkName: \"opentsdbPlugin\" */ 'app/plugins/datasource/opentsdb/module');\nconst grafanaPlugin = async () =>\n await import(/* webpackChunkName: \"grafanaPlugin\" */ 'app/plugins/datasource/grafana/module');\nconst influxdbPlugin = async () =>\n await import(/* webpackChunkName: \"influxdbPlugin\" */ 'app/plugins/datasource/influxdb/module');\nconst lokiPlugin = async () => await import(/* webpackChunkName: \"lokiPlugin\" */ 'app/plugins/datasource/loki/module');\nconst jaegerPlugin = async () =>\n await import(/* webpackChunkName: \"jaegerPlugin\" */ 'app/plugins/datasource/jaeger/module');\nconst zipkinPlugin = async () =>\n await import(/* webpackChunkName: \"zipkinPlugin\" */ 'app/plugins/datasource/zipkin/module');\nconst mixedPlugin = async () =>\n await import(/* webpackChunkName: \"mixedPlugin\" */ 'app/plugins/datasource/mixed/module');\nconst mysqlPlugin = async () =>\n await import(/* webpackChunkName: \"mysqlPlugin\" */ 'app/plugins/datasource/mysql/module');\nconst postgresPlugin = async () =>\n await import(/* webpackChunkName: \"postgresPlugin\" */ 'app/plugins/datasource/postgres/module');\nconst prometheusPlugin = async () =>\n await import(/* webpackChunkName: \"prometheusPlugin\" */ 'app/plugins/datasource/prometheus/module');\nconst mssqlPlugin = async () =>\n await import(/* webpackChunkName: \"mssqlPlugin\" */ 'app/plugins/datasource/mssql/module');\nconst testDataDSPlugin = async () =>\n await import(/* webpackChunkName: \"testDataDSPlugin\" */ 'app/plugins/datasource/testdata/module');\nconst cloudMonitoringPlugin = async () =>\n await import(/* webpackChunkName: \"cloudMonitoringPlugin\" */ 'app/plugins/datasource/cloud-monitoring/module');\nconst azureMonitorPlugin = async () =>\n await import(\n /* webpackChunkName: \"azureMonitorPlugin\" */ 'app/plugins/datasource/grafana-azure-monitor-datasource/module'\n );\nconst tempoPlugin = async () =>\n await import(/* webpackChunkName: \"tempoPlugin\" */ 'app/plugins/datasource/tempo/module');\nconst alertmanagerPlugin = async () =>\n await import(/* webpackChunkName: \"alertmanagerPlugin\" */ 'app/plugins/datasource/alertmanager/module');\n\nimport { config } from '@grafana/runtime';\nimport * as alertGroupsPanel from 'app/plugins/panel/alertGroups/module';\nimport * as alertListPanel from 'app/plugins/panel/alertlist/module';\nimport * as annoListPanel from 'app/plugins/panel/annolist/module';\nimport * as barChartPanel from 'app/plugins/panel/barchart/module';\nimport * as barGaugePanel from 'app/plugins/panel/bargauge/module';\nimport * as candlestickPanel from 'app/plugins/panel/candlestick/module';\nimport * as dashListPanel from 'app/plugins/panel/dashlist/module';\nimport * as debugPanel from 'app/plugins/panel/debug/module';\nimport * as gaugePanel from 'app/plugins/panel/gauge/module';\nimport * as gettingStartedPanel from 'app/plugins/panel/gettingstarted/module';\nimport * as histogramPanel from 'app/plugins/panel/histogram/module';\nimport * as livePanel from 'app/plugins/panel/live/module';\nimport * as logsPanel from 'app/plugins/panel/logs/module';\nimport * as newsPanel from 'app/plugins/panel/news/module';\nimport * as nodeGraph from 'app/plugins/panel/nodeGraph/module';\nimport * as pieChartPanel from 'app/plugins/panel/piechart/module';\nimport * as statPanel from 'app/plugins/panel/stat/module';\nimport * as stateTimelinePanel from 'app/plugins/panel/state-timeline/module';\nimport * as statusHistoryPanel from 'app/plugins/panel/status-history/module';\nimport * as tablePanel from 'app/plugins/panel/table/module';\nimport * as textPanel from 'app/plugins/panel/text/module';\nimport * as timeseriesPanel from 'app/plugins/panel/timeseries/module';\nimport * as tracesPanel from 'app/plugins/panel/traces/module';\nimport * as welcomeBanner from 'app/plugins/panel/welcome/module';\nimport * as xyChartPanel from 'app/plugins/panel/xychart/module';\n\n// Async loaded panels\nconst geomapPanel = async () => await import(/* webpackChunkName: \"geomapPanel\" */ 'app/plugins/panel/geomap/module');\nconst canvasPanel = async () => await import(/* webpackChunkName: \"canvasPanel\" */ 'app/plugins/panel/canvas/module');\nconst iconPanel = async () => await import(/* webpackChunkName: \"iconPanel\" */ 'app/plugins/panel/icon/module');\nconst graphPanel = async () => await import(/* webpackChunkName: \"graphPlugin\" */ 'app/plugins/panel/graph/module');\nconst heatmapPanel = async () =>\n await import(/* webpackChunkName: \"heatmapPanel\" */ 'app/plugins/panel/heatmap/module');\nconst heatmapPanelOLD = async () =>\n await import(/* webpackChunkName: \"heatmapPanelOLD\" */ 'app/plugins/panel/heatmap-old/module');\n\nconst tableOldPanel = async () =>\n await import(/* webpackChunkName: \"tableOldPlugin\" */ 'app/plugins/panel/table-old/module');\n\n// Automatically migrate heatmap panel.\nif (config.featureToggles.useLegacyHeatmapPanel) {\n const heatmap = config.panels['heatmap'];\n const legacy = config.panels['heatmap-old'];\n legacy.id = heatmap.id;\n legacy.module = heatmap.module;\n legacy.state = heatmap.state;\n config.panels['heatmap'] = legacy;\n}\ndelete config.panels['heatmap-old'];\n\nconst builtInPlugins: any = {\n 'app/plugins/datasource/graphite/module': graphitePlugin,\n 'app/plugins/datasource/cloudwatch/module': cloudwatchPlugin,\n 'app/plugins/datasource/dashboard/module': dashboardDSPlugin,\n 'app/plugins/datasource/elasticsearch/module': elasticsearchPlugin,\n 'app/plugins/datasource/opentsdb/module': opentsdbPlugin,\n 'app/plugins/datasource/grafana/module': grafanaPlugin,\n 'app/plugins/datasource/influxdb/module': influxdbPlugin,\n 'app/plugins/datasource/loki/module': lokiPlugin,\n 'app/plugins/datasource/jaeger/module': jaegerPlugin,\n 'app/plugins/datasource/zipkin/module': zipkinPlugin,\n 'app/plugins/datasource/mixed/module': mixedPlugin,\n 'app/plugins/datasource/mysql/module': mysqlPlugin,\n 'app/plugins/datasource/postgres/module': postgresPlugin,\n 'app/plugins/datasource/mssql/module': mssqlPlugin,\n 'app/plugins/datasource/prometheus/module': prometheusPlugin,\n 'app/plugins/datasource/testdata/module': testDataDSPlugin,\n 'app/plugins/datasource/cloud-monitoring/module': cloudMonitoringPlugin,\n 'app/plugins/datasource/grafana-azure-monitor-datasource/module': azureMonitorPlugin,\n 'app/plugins/datasource/tempo/module': tempoPlugin,\n 'app/plugins/datasource/alertmanager/module': alertmanagerPlugin,\n\n 'app/plugins/panel/text/module': textPanel,\n 'app/plugins/panel/timeseries/module': timeseriesPanel,\n 'app/plugins/panel/state-timeline/module': stateTimelinePanel,\n 'app/plugins/panel/status-history/module': statusHistoryPanel,\n 'app/plugins/panel/candlestick/module': candlestickPanel,\n 'app/plugins/panel/graph/module': graphPanel,\n 'app/plugins/panel/xychart/module': xyChartPanel,\n 'app/plugins/panel/geomap/module': geomapPanel,\n 'app/plugins/panel/canvas/module': canvasPanel,\n 'app/plugins/panel/icon/module': iconPanel,\n 'app/plugins/panel/dashlist/module': dashListPanel,\n 'app/plugins/panel/alertlist/module': alertListPanel,\n 'app/plugins/panel/annolist/module': annoListPanel,\n 'app/plugins/panel/heatmap/module': config.featureToggles.useLegacyHeatmapPanel ? heatmapPanelOLD : heatmapPanel,\n 'app/plugins/panel/table/module': tablePanel,\n 'app/plugins/panel/table-old/module': tableOldPanel,\n 'app/plugins/panel/news/module': newsPanel,\n 'app/plugins/panel/live/module': livePanel,\n 'app/plugins/panel/stat/module': statPanel,\n 'app/plugins/panel/debug/module': debugPanel,\n 'app/plugins/panel/gettingstarted/module': gettingStartedPanel,\n 'app/plugins/panel/gauge/module': gaugePanel,\n 'app/plugins/panel/piechart/module': pieChartPanel,\n 'app/plugins/panel/bargauge/module': barGaugePanel,\n 'app/plugins/panel/barchart/module': barChartPanel,\n 'app/plugins/panel/logs/module': logsPanel,\n 'app/plugins/panel/traces/module': tracesPanel,\n 'app/plugins/panel/welcome/module': welcomeBanner,\n 'app/plugins/panel/nodeGraph/module': nodeGraph,\n 'app/plugins/panel/histogram/module': histogramPanel,\n 'app/plugins/panel/alertGroups/module': alertGroupsPanel,\n};\n\nexport default builtInPlugins;\n","import * as emotion from '@emotion/css';\nimport * as d3 from 'd3';\nimport jquery from 'jquery';\nimport _ from 'lodash'; // eslint-disable-line lodash/import-scope\nimport moment from 'moment'; // eslint-disable-line no-restricted-imports\nimport prismjs from 'prismjs';\nimport react from 'react';\nimport reactDom from 'react-dom';\nimport * as reactRedux from 'react-redux';\nimport * as reactRouter from 'react-router-dom';\nimport * as redux from 'redux';\nimport * as rxjs from 'rxjs';\nimport * as rxjsOperators from 'rxjs/operators';\nimport slate from 'slate';\nimport slatePlain from 'slate-plain-serializer';\n\nimport * as grafanaData from '@grafana/data';\nimport * as grafanaRuntime from '@grafana/runtime';\nimport slateReact from '@grafana/slate-react';\nimport * as grafanaUIraw from '@grafana/ui';\nimport config from 'app/core/config';\nimport { appEvents, contextSrv } from 'app/core/core';\nimport { BackendSrv, getBackendSrv } from 'app/core/services/backend_srv';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport TableModel from 'app/core/table_model';\nimport TimeSeries from 'app/core/time_series2';\nimport * as flatten from 'app/core/utils/flatten';\nimport kbn from 'app/core/utils/kbn';\nimport * as ticks from 'app/core/utils/ticks';\n\nimport { GenericDataSourcePlugin } from '../datasources/types';\n\nimport builtInPlugins from './built_in_plugins';\nimport { locateWithCache, registerPluginInCache } from './pluginCacheBuster';\n\n// Help the 6.4 to 6.5 migration\n// The base classes were moved from @grafana/ui to @grafana/data\n// This exposes the same classes on both import paths\nconst grafanaUI = grafanaUIraw as any;\ngrafanaUI.PanelPlugin = grafanaData.PanelPlugin;\ngrafanaUI.DataSourcePlugin = grafanaData.DataSourcePlugin;\ngrafanaUI.AppPlugin = grafanaData.AppPlugin;\ngrafanaUI.DataSourceApi = grafanaData.DataSourceApi;\n\ngrafanaRuntime.SystemJS.registry.set('plugin-loader', grafanaRuntime.SystemJS.newModule({ locate: locateWithCache }));\n\ngrafanaRuntime.SystemJS.config({\n baseURL: 'public',\n defaultExtension: 'js',\n packages: {\n plugins: {\n defaultExtension: 'js',\n },\n },\n map: {\n text: 'vendor/plugin-text/text.js',\n css: 'vendor/plugin-css/css.js',\n },\n meta: {\n '/*': {\n esModule: true,\n authorization: true,\n loader: 'plugin-loader',\n },\n },\n});\n\nexport function exposeToPlugin(name: string, component: any) {\n grafanaRuntime.SystemJS.registerDynamic(name, [], true, (require: any, exports: any, module: { exports: any }) => {\n module.exports = component;\n });\n}\n\nexposeToPlugin('@grafana/data', grafanaData);\nexposeToPlugin('@grafana/ui', grafanaUI);\nexposeToPlugin('@grafana/runtime', grafanaRuntime);\nexposeToPlugin('lodash', _);\nexposeToPlugin('moment', moment);\nexposeToPlugin('jquery', jquery);\nexposeToPlugin('d3', d3);\nexposeToPlugin('rxjs', rxjs);\nexposeToPlugin('rxjs/operators', rxjsOperators);\nexposeToPlugin('react-router-dom', reactRouter);\n\n// Experimental modules\nexposeToPlugin('prismjs', prismjs);\nexposeToPlugin('slate', slate);\nexposeToPlugin('@grafana/slate-react', slateReact);\nexposeToPlugin('slate-plain-serializer', slatePlain);\nexposeToPlugin('react', react);\nexposeToPlugin('react-dom', reactDom);\nexposeToPlugin('react-redux', reactRedux);\nexposeToPlugin('redux', redux);\nexposeToPlugin('emotion', emotion);\nexposeToPlugin('@emotion/css', emotion);\n\nexposeToPlugin('app/features/dashboard/impression_store', {\n impressions: impressionSrv,\n __esModule: true,\n});\n\n/**\n * NOTE: this is added temporarily while we explore a long term solution\n * If you use this export, only use the:\n * get/delete/post/patch/request methods\n */\nexposeToPlugin('app/core/services/backend_srv', {\n BackendSrv,\n getBackendSrv,\n});\n\nexposeToPlugin('app/core/utils/datemath', grafanaData.dateMath);\nexposeToPlugin('app/core/utils/flatten', flatten);\nexposeToPlugin('app/core/utils/kbn', kbn);\nexposeToPlugin('app/core/utils/ticks', ticks);\nexposeToPlugin('app/core/config', config);\nexposeToPlugin('app/core/time_series', TimeSeries);\nexposeToPlugin('app/core/time_series2', TimeSeries);\nexposeToPlugin('app/core/table_model', TableModel);\nexposeToPlugin('app/core/app_events', appEvents);\nexposeToPlugin('app/core/core', {\n appEvents: appEvents,\n contextSrv: contextSrv,\n __esModule: true,\n});\n\nimport 'vendor/flot/jquery.flot';\nimport 'vendor/flot/jquery.flot.selection';\nimport 'vendor/flot/jquery.flot.time';\nimport 'vendor/flot/jquery.flot.stack';\nimport 'vendor/flot/jquery.flot.stackpercent';\nimport 'vendor/flot/jquery.flot.fillbelow';\nimport 'vendor/flot/jquery.flot.crosshair';\nimport 'vendor/flot/jquery.flot.dashes';\nimport 'vendor/flot/jquery.flot.gauge';\n\nconst flotDeps = [\n 'jquery.flot',\n 'jquery.flot.pie',\n 'jquery.flot.time',\n 'jquery.flot.fillbelow',\n 'jquery.flot.crosshair',\n 'jquery.flot.stack',\n 'jquery.flot.selection',\n 'jquery.flot.stackpercent',\n 'jquery.flot.events',\n 'jquery.flot.gauge',\n];\n\nfor (const flotDep of flotDeps) {\n exposeToPlugin(flotDep, { fakeDep: 1 });\n}\n\nexport async function importPluginModule(path: string, version?: string): Promise<any> {\n if (version) {\n registerPluginInCache({ path, version });\n }\n\n const builtIn = builtInPlugins[path];\n if (builtIn) {\n // for handling dynamic imports\n if (typeof builtIn === 'function') {\n return await builtIn();\n } else {\n return builtIn;\n }\n }\n return grafanaRuntime.SystemJS.import(path);\n}\n\nexport function importDataSourcePlugin(meta: grafanaData.DataSourcePluginMeta): Promise<GenericDataSourcePlugin> {\n return importPluginModule(meta.module, meta.info?.version).then((pluginExports) => {\n if (pluginExports.plugin) {\n const dsPlugin = pluginExports.plugin as GenericDataSourcePlugin;\n dsPlugin.meta = meta;\n return dsPlugin;\n }\n\n if (pluginExports.Datasource) {\n const dsPlugin = new grafanaData.DataSourcePlugin<\n grafanaData.DataSourceApi<grafanaData.DataQuery, grafanaData.DataSourceJsonData>,\n grafanaData.DataQuery,\n grafanaData.DataSourceJsonData\n >(pluginExports.Datasource);\n dsPlugin.setComponentsFromLegacyExports(pluginExports);\n dsPlugin.meta = meta;\n return dsPlugin;\n }\n\n throw new Error('Plugin module is missing DataSourcePlugin or Datasource constructor export');\n });\n}\n\nexport function importAppPlugin(meta: grafanaData.PluginMeta): Promise<grafanaData.AppPlugin> {\n return importPluginModule(meta.module, meta.info?.version).then((pluginExports) => {\n const plugin = pluginExports.plugin ? (pluginExports.plugin as grafanaData.AppPlugin) : new grafanaData.AppPlugin();\n plugin.init(meta);\n plugin.meta = meta;\n plugin.setComponentsFromLegacyExports(pluginExports);\n return plugin;\n });\n}\n","import { getBackendSrv } from '@grafana/runtime';\n\nimport { Team, UserDTO, UserOrg, UserSession } from '../../types';\n\nimport { ChangePasswordFields, ProfileUpdateFields } from './types';\n\nasync function changePassword(payload: ChangePasswordFields): Promise<void> {\n try {\n await getBackendSrv().put('/api/user/password', payload);\n } catch (err) {\n console.error(err);\n }\n}\n\nfunction loadUser(): Promise<UserDTO> {\n return getBackendSrv().get('/api/user');\n}\n\nfunction loadTeams(): Promise<Team[]> {\n return getBackendSrv().get('/api/user/teams');\n}\n\nfunction loadOrgs(): Promise<UserOrg[]> {\n return getBackendSrv().get('/api/user/orgs');\n}\n\nfunction loadSessions(): Promise<UserSession[]> {\n return getBackendSrv().get('/api/user/auth-tokens');\n}\n\nasync function revokeUserSession(tokenId: number): Promise<void> {\n await getBackendSrv().post('/api/user/revoke-auth-token', {\n authTokenId: tokenId,\n });\n}\n\nasync function setUserOrg(org: UserOrg): Promise<void> {\n await getBackendSrv().post('/api/user/using/' + org.orgId, {});\n}\n\nasync function updateUserProfile(payload: ProfileUpdateFields): Promise<void> {\n try {\n await getBackendSrv().put('/api/user', payload);\n } catch (err) {\n console.error(err);\n }\n}\n\nexport const api = {\n changePassword,\n revokeUserSession,\n loadUser,\n loadSessions,\n loadOrgs,\n loadTeams,\n setUserOrg,\n updateUserProfile,\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { isEmpty, isString, set } from 'lodash';\n\nimport { dateTimeFormatTimeAgo, setWeekStart, TimeZone } from '@grafana/data';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/core';\nimport { Team, ThunkResult, UserDTO, UserOrg, UserSession } from 'app/types';\n\nexport interface UserState {\n orgId: number;\n timeZone: TimeZone;\n weekStart: string;\n fiscalYearStartMonth: number;\n user: UserDTO | null;\n teams: Team[];\n orgs: UserOrg[];\n sessions: UserSession[];\n teamsAreLoading: boolean;\n orgsAreLoading: boolean;\n sessionsAreLoading: boolean;\n isUpdating: boolean;\n}\n\nexport const initialUserState: UserState = {\n orgId: config.bootData.user.orgId,\n timeZone: config.bootData.user.timezone,\n weekStart: config.bootData.user.weekStart,\n fiscalYearStartMonth: 0,\n orgsAreLoading: false,\n sessionsAreLoading: false,\n teamsAreLoading: false,\n isUpdating: false,\n orgs: [],\n sessions: [],\n teams: [],\n user: null,\n};\n\nexport const slice = createSlice({\n name: 'user/profile',\n initialState: initialUserState,\n reducers: {\n updateTimeZone: (state, action: PayloadAction<{ timeZone: TimeZone }>) => {\n state.timeZone = action.payload.timeZone;\n },\n updateWeekStart: (state, action: PayloadAction<{ weekStart: string }>) => {\n state.weekStart = action.payload.weekStart;\n },\n updateFiscalYearStartMonth: (state, action: PayloadAction<{ fiscalYearStartMonth: number }>) => {\n state.fiscalYearStartMonth = action.payload.fiscalYearStartMonth;\n },\n setUpdating: (state, action: PayloadAction<{ updating: boolean }>) => {\n state.isUpdating = action.payload.updating;\n },\n userLoaded: (state, action: PayloadAction<{ user: UserDTO }>) => {\n state.user = action.payload.user;\n },\n initLoadTeams: (state, action: PayloadAction<undefined>) => {\n state.teamsAreLoading = true;\n },\n teamsLoaded: (state, action: PayloadAction<{ teams: Team[] }>) => {\n state.teams = action.payload.teams;\n state.teamsAreLoading = false;\n },\n initLoadOrgs: (state, action: PayloadAction<undefined>) => {\n state.orgsAreLoading = true;\n },\n orgsLoaded: (state, action: PayloadAction<{ orgs: UserOrg[] }>) => {\n state.orgs = action.payload.orgs;\n state.orgsAreLoading = false;\n },\n initLoadSessions: (state, action: PayloadAction<undefined>) => {\n state.sessionsAreLoading = true;\n },\n sessionsLoaded: (state, action: PayloadAction<{ sessions: UserSession[] }>) => {\n const sorted = action.payload.sessions.sort((a, b) => Number(b.isActive) - Number(a.isActive)); // Show active sessions first\n state.sessions = sorted.map((session) => ({\n id: session.id,\n isActive: session.isActive,\n seenAt: dateTimeFormatTimeAgo(session.seenAt),\n createdAt: session.createdAt,\n clientIp: session.clientIp,\n browser: session.browser,\n browserVersion: session.browserVersion,\n os: session.os,\n osVersion: session.osVersion,\n device: session.device,\n }));\n state.sessionsAreLoading = false;\n },\n userSessionRevoked: (state, action: PayloadAction<{ tokenId: number }>) => {\n state.sessions = state.sessions.filter((session: UserSession) => {\n return session.id !== action.payload.tokenId;\n });\n state.isUpdating = false;\n },\n },\n});\n\nexport const updateFiscalYearStartMonthForSession = (fiscalYearStartMonth: number): ThunkResult<void> => {\n return async (dispatch) => {\n set(contextSrv, 'user.fiscalYearStartMonth', fiscalYearStartMonth);\n dispatch(updateFiscalYearStartMonth({ fiscalYearStartMonth }));\n };\n};\n\nexport const updateTimeZoneForSession = (timeZone: TimeZone): ThunkResult<void> => {\n return async (dispatch) => {\n if (!isString(timeZone) || isEmpty(timeZone)) {\n timeZone = config?.bootData?.user?.timezone;\n }\n\n set(contextSrv, 'user.timezone', timeZone);\n dispatch(updateTimeZone({ timeZone }));\n };\n};\n\nexport const updateWeekStartForSession = (weekStart: string): ThunkResult<void> => {\n return async (dispatch) => {\n if (!isString(weekStart) || isEmpty(weekStart)) {\n weekStart = config?.bootData?.user?.weekStart;\n }\n\n set(contextSrv, 'user.weekStart', weekStart);\n dispatch(updateWeekStart({ weekStart }));\n setWeekStart(weekStart);\n };\n};\n\nexport const {\n setUpdating,\n initLoadOrgs,\n orgsLoaded,\n initLoadTeams,\n teamsLoaded,\n userLoaded,\n userSessionRevoked,\n initLoadSessions,\n sessionsLoaded,\n updateTimeZone,\n updateWeekStart,\n updateFiscalYearStartMonth,\n} = slice.actions;\n\nexport const userReducer = slice.reducer;\nexport default { user: slice.reducer };\n","import { UserState } from './reducers';\n\nexport const getTimeZone = (state: UserState) => state.timeZone;\nexport const getFiscalYearStartMonth = (state: UserState) => state.fiscalYearStartMonth;\n","import { DataQuery, DataSourceInstanceSettings, TimeRange } from '@grafana/data';\n\ninterface ActionComponentProps {\n query?: DataQuery;\n queries?: Array<Partial<DataQuery>>;\n onAddQuery?: (q: DataQuery) => void;\n onChangeDataSource?: (ds: DataSourceInstanceSettings) => void;\n timeRange?: TimeRange;\n dataSource?: DataSourceInstanceSettings;\n key: string | number;\n}\n\ntype QueryActionComponent = (props: ActionComponentProps) => JSX.Element | null;\n\nclass QueryActionComponents {\n extraRenderActions: QueryActionComponent[] = [];\n\n addExtraRenderAction(extra: QueryActionComponent) {\n this.extraRenderActions = this.extraRenderActions.concat(extra);\n }\n\n getAllExtraRenderAction(): QueryActionComponent[] {\n return this.extraRenderActions;\n }\n}\n\n/**\n * @internal and experimental\n */\nexport const GroupActionComponents = new QueryActionComponents();\n\n/**\n * @internal and experimental\n */\nexport const RowActionComponents = new QueryActionComponents();\n","import { css, cx } from '@emotion/css';\nimport React, { ReactNode, useState } from 'react';\n\nimport { DataQuery, DataSourceInstanceSettings, GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { DataSourcePicker } from '@grafana/runtime';\nimport { Icon, Input, FieldValidationMessage, useStyles } from '@grafana/ui';\n\nexport interface Props<TQuery extends DataQuery = DataQuery> {\n query: TQuery;\n queries: TQuery[];\n disabled?: boolean;\n dataSource: DataSourceInstanceSettings;\n renderExtras?: () => ReactNode;\n onChangeDataSource?: (settings: DataSourceInstanceSettings) => void;\n onChange: (query: TQuery) => void;\n onClick: (e: React.MouseEvent) => void;\n collapsedText: string | null;\n alerting?: boolean;\n}\n\nexport const QueryEditorRowHeader = <TQuery extends DataQuery>(props: Props<TQuery>) => {\n const { query, queries, onClick, onChange, collapsedText, renderExtras, disabled } = props;\n\n const styles = useStyles(getStyles);\n const [isEditing, setIsEditing] = useState<boolean>(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const onEditQuery = (event: React.SyntheticEvent) => {\n setIsEditing(true);\n };\n\n const onEndEditName = (newName: string) => {\n setIsEditing(false);\n\n // Ignore change if invalid\n if (validationError) {\n setValidationError(null);\n return;\n }\n\n if (query.refId !== newName) {\n onChange({\n ...query,\n refId: newName,\n });\n }\n };\n\n const onInputChange = (event: React.SyntheticEvent<HTMLInputElement>) => {\n const newName = event.currentTarget.value.trim();\n\n if (newName.length === 0) {\n setValidationError('An empty query name is not allowed');\n return;\n }\n\n for (const otherQuery of queries) {\n if (otherQuery !== query && newName === otherQuery.refId) {\n setValidationError('Query name already exists');\n return;\n }\n }\n\n if (validationError) {\n setValidationError(null);\n }\n };\n\n const onEditQueryBlur = (event: React.SyntheticEvent<HTMLInputElement>) => {\n onEndEditName(event.currentTarget.value.trim());\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n onEndEditName((event.target as any).value);\n }\n };\n\n const onFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n event.target.select();\n };\n\n return (\n <>\n <div className={styles.wrapper}>\n {!isEditing && (\n <button\n className={styles.queryNameWrapper}\n aria-label={selectors.components.QueryEditorRow.title(query.refId)}\n title=\"Edit query name\"\n onClick={onEditQuery}\n data-testid=\"query-name-div\"\n >\n <span className={styles.queryName}>{query.refId}</span>\n <Icon name=\"pen\" className={styles.queryEditIcon} size=\"sm\" />\n </button>\n )}\n\n {isEditing && (\n <>\n <Input\n type=\"text\"\n defaultValue={query.refId}\n onBlur={onEditQueryBlur}\n autoFocus\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n invalid={validationError !== null}\n onChange={onInputChange}\n className={styles.queryNameInput}\n data-testid=\"query-name-input\"\n />\n {validationError && <FieldValidationMessage horizontal>{validationError}</FieldValidationMessage>}\n </>\n )}\n {renderDataSource(props, styles)}\n {renderExtras && <div className={styles.itemWrapper}>{renderExtras()}</div>}\n {disabled && <em className={styles.contextInfo}>Disabled</em>}\n </div>\n\n {collapsedText && (\n <div className={styles.collapsedText} onClick={onClick}>\n {collapsedText}\n </div>\n )}\n </>\n );\n};\n\nconst renderDataSource = <TQuery extends DataQuery>(\n props: Props<TQuery>,\n styles: ReturnType<typeof getStyles>\n): ReactNode => {\n const { alerting, dataSource, onChangeDataSource } = props;\n\n if (!onChangeDataSource) {\n return <em className={styles.contextInfo}>({dataSource.name})</em>;\n }\n\n return (\n <div className={styles.itemWrapper}>\n <DataSourcePicker variables={true} alerting={alerting} current={dataSource.name} onChange={onChangeDataSource} />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme) => {\n return {\n wrapper: css`\n label: Wrapper;\n display: flex;\n align-items: center;\n margin-left: ${theme.spacing.xs};\n `,\n queryNameWrapper: css`\n display: flex;\n cursor: pointer;\n border: 1px solid transparent;\n border-radius: ${theme.border.radius.md};\n align-items: center;\n padding: 0 0 0 ${theme.spacing.xs};\n margin: 0;\n background: transparent;\n\n &:hover {\n background: ${theme.colors.bg3};\n border: 1px dashed ${theme.colors.border3};\n }\n\n &:focus {\n border: 2px solid ${theme.colors.formInputBorderActive};\n }\n\n &:hover,\n &:focus {\n .query-name-edit-icon {\n visibility: visible;\n }\n }\n `,\n queryName: css`\n font-weight: ${theme.typography.weight.semibold};\n color: ${theme.colors.textBlue};\n cursor: pointer;\n overflow: hidden;\n margin-left: ${theme.spacing.xs};\n `,\n queryEditIcon: cx(\n css`\n margin-left: ${theme.spacing.md};\n visibility: hidden;\n `,\n 'query-name-edit-icon'\n ),\n queryNameInput: css`\n max-width: 300px;\n margin: -4px 0;\n `,\n collapsedText: css`\n font-weight: ${theme.typography.weight.regular};\n font-size: ${theme.typography.size.sm};\n color: ${theme.colors.textWeak};\n padding-left: ${theme.spacing.sm};\n align-items: center;\n overflow: hidden;\n font-style: italic;\n white-space: nowrap;\n text-overflow: ellipsis;\n `,\n contextInfo: css`\n font-size: ${theme.typography.size.sm};\n font-style: italic;\n color: ${theme.colors.textWeak};\n padding-left: 10px;\n `,\n itemWrapper: css`\n display: flex;\n margin-left: 4px;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { DataQueryError, GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nexport interface Props {\n error: DataQueryError;\n}\n\nexport function QueryErrorAlert({ error }: Props) {\n const styles = useStyles2(getStyles);\n\n const message = error?.message ?? error?.data?.message ?? 'Query error';\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.icon}>\n <Icon name=\"exclamation-triangle\" />\n </div>\n <div className={styles.message}>{message}</div>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n marginTop: theme.spacing(0.5),\n background: theme.colors.background.secondary,\n display: 'flex',\n }),\n icon: css({\n background: theme.colors.error.main,\n color: theme.colors.error.contrastText,\n padding: theme.spacing(1),\n }),\n message: css({\n fontSize: theme.typography.bodySmall.fontSize,\n fontFamily: theme.typography.fontFamilyMonospace,\n padding: theme.spacing(1),\n }),\n});\n","// Libraries\nimport classNames from 'classnames';\nimport { cloneDeep, filter, has, uniqBy } from 'lodash';\nimport pluralize from 'pluralize';\nimport React, { PureComponent, ReactNode } from 'react';\n\n// Utils & Services\nimport {\n CoreApp,\n DataQuery,\n DataSourceApi,\n DataSourceInstanceSettings,\n EventBusExtended,\n EventBusSrv,\n HistoryItem,\n LoadingState,\n PanelData,\n PanelEvents,\n QueryResultMetaNotice,\n TimeRange,\n toLegacyResponseData,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\nimport { Badge, ErrorBoundaryAlert, HorizontalGroup } from '@grafana/ui';\nimport { OperationRowHelp } from 'app/core/components/QueryOperationRow/OperationRowHelp';\nimport { QueryOperationAction } from 'app/core/components/QueryOperationRow/QueryOperationAction';\nimport {\n QueryOperationRow,\n QueryOperationRowRenderProps,\n} from 'app/core/components/QueryOperationRow/QueryOperationRow';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport { RowActionComponents } from './QueryActionComponent';\nimport { QueryEditorRowHeader } from './QueryEditorRowHeader';\nimport { QueryErrorAlert } from './QueryErrorAlert';\n\ninterface Props<TQuery extends DataQuery> {\n data: PanelData;\n query: TQuery;\n queries: TQuery[];\n id: string;\n index: number;\n dataSource: DataSourceInstanceSettings;\n onChangeDataSource?: (dsSettings: DataSourceInstanceSettings) => void;\n renderHeaderExtras?: () => ReactNode;\n onAddQuery: (query: TQuery) => void;\n onRemoveQuery: (query: TQuery) => void;\n onChange: (query: TQuery) => void;\n onRunQuery: () => void;\n visualization?: ReactNode;\n hideDisableQuery?: boolean;\n app?: CoreApp;\n history?: Array<HistoryItem<TQuery>>;\n eventBus?: EventBusExtended;\n alerting?: boolean;\n}\n\ninterface State<TQuery extends DataQuery> {\n loadedDataSourceIdentifier?: string | null;\n datasource: DataSourceApi<TQuery> | null;\n hasTextEditMode: boolean;\n data?: PanelData;\n isOpen?: boolean;\n showingHelp: boolean;\n}\n\nexport class QueryEditorRow<TQuery extends DataQuery> extends PureComponent<Props<TQuery>, State<TQuery>> {\n element: HTMLElement | null = null;\n angularScope: AngularQueryComponentScope<TQuery> | null = null;\n angularQueryEditor: AngularComponent | null = null;\n\n state: State<TQuery> = {\n datasource: null,\n hasTextEditMode: false,\n data: undefined,\n isOpen: true,\n showingHelp: false,\n };\n\n componentDidMount() {\n this.loadDatasource();\n }\n\n componentWillUnmount() {\n if (this.angularQueryEditor) {\n this.angularQueryEditor.destroy();\n }\n }\n\n getAngularQueryComponentScope(): AngularQueryComponentScope<TQuery> {\n const { query, queries } = this.props;\n const { datasource } = this.state;\n const panel = new PanelModel({ targets: queries });\n const dashboard = {} as DashboardModel;\n\n const me = this;\n\n return {\n datasource: datasource,\n target: query,\n panel: panel,\n dashboard: dashboard,\n refresh: () => {\n // Old angular editors modify the query model and just call refresh\n // Important that this use this.props here so that as this function is only created on mount and it's\n // important not to capture old prop functions in this closure\n\n // the \"hide\" attribute of the queries can be changed from the \"outside\",\n // it will be applied to \"this.props.query.hide\", but not to \"query.hide\".\n // so we have to apply it.\n if (query.hide !== me.props.query.hide) {\n query.hide = me.props.query.hide;\n }\n\n this.props.onChange(query);\n this.props.onRunQuery();\n },\n render: () => () => console.log('legacy render function called, it does nothing'),\n events: this.props.eventBus || new EventBusSrv(),\n range: getTimeSrv().timeRange(),\n };\n }\n\n getQueryDataSourceIdentifier(): string | null | undefined {\n const { query, dataSource: dsSettings } = this.props;\n return query.datasource?.uid ?? dsSettings.uid;\n }\n\n async loadDatasource() {\n const dataSourceSrv = getDatasourceSrv();\n let datasource: DataSourceApi;\n const dataSourceIdentifier = this.getQueryDataSourceIdentifier();\n\n try {\n datasource = await dataSourceSrv.get(dataSourceIdentifier);\n } catch (error) {\n datasource = await dataSourceSrv.get();\n }\n\n this.setState({\n datasource: datasource as unknown as DataSourceApi<TQuery>,\n loadedDataSourceIdentifier: dataSourceIdentifier,\n hasTextEditMode: has(datasource, 'components.QueryCtrl.prototype.toggleEditorMode'),\n });\n }\n\n componentDidUpdate(prevProps: Props<TQuery>) {\n const { datasource, loadedDataSourceIdentifier } = this.state;\n const { data, query } = this.props;\n\n if (data !== prevProps.data) {\n const dataFilteredByRefId = filterPanelDataToQuery(data, query.refId);\n\n this.setState({ data: dataFilteredByRefId });\n\n if (this.angularScope) {\n this.angularScope.range = getTimeSrv().timeRange();\n }\n\n if (this.angularQueryEditor && dataFilteredByRefId) {\n notifyAngularQueryEditorsOfData(this.angularScope!, dataFilteredByRefId, this.angularQueryEditor);\n }\n }\n\n // check if we need to load another datasource\n if (datasource && loadedDataSourceIdentifier !== this.getQueryDataSourceIdentifier()) {\n if (this.angularQueryEditor) {\n this.angularQueryEditor.destroy();\n this.angularQueryEditor = null;\n }\n this.loadDatasource();\n return;\n }\n\n if (!this.element || this.angularQueryEditor) {\n return;\n }\n\n this.renderAngularQueryEditor();\n }\n\n renderAngularQueryEditor = () => {\n if (!this.element) {\n return;\n }\n\n if (this.angularQueryEditor) {\n this.angularQueryEditor.destroy();\n this.angularQueryEditor = null;\n }\n\n const loader = getAngularLoader();\n const template = '<plugin-component type=\"query-ctrl\" />';\n const scopeProps = { ctrl: this.getAngularQueryComponentScope() };\n\n this.angularQueryEditor = loader.load(this.element, scopeProps, template);\n this.angularScope = scopeProps.ctrl;\n };\n\n onOpen = () => {\n this.renderAngularQueryEditor();\n };\n\n getReactQueryEditor(ds: DataSourceApi<TQuery>) {\n if (!ds) {\n return;\n }\n\n switch (this.props.app) {\n case CoreApp.Explore:\n return (\n ds.components?.ExploreMetricsQueryField ||\n ds.components?.ExploreLogsQueryField ||\n ds.components?.ExploreQueryField ||\n ds.components?.QueryEditor\n );\n case CoreApp.PanelEditor:\n case CoreApp.Dashboard:\n default:\n return ds.components?.QueryEditor;\n }\n }\n\n renderPluginEditor = () => {\n const { query, onChange, queries, onRunQuery, app = CoreApp.PanelEditor, history } = this.props;\n const { datasource, data } = this.state;\n\n if (datasource?.components?.QueryCtrl) {\n return <div ref={(element) => (this.element = element)} />;\n }\n\n if (datasource) {\n let QueryEditor = this.getReactQueryEditor(datasource);\n\n if (QueryEditor) {\n return (\n <QueryEditor\n key={datasource?.name}\n query={query}\n datasource={datasource}\n onChange={onChange}\n onRunQuery={onRunQuery}\n data={data}\n range={getTimeSrv().timeRange()}\n queries={queries}\n app={app}\n history={history}\n />\n );\n }\n }\n\n return <div>Data source plugin does not export any Query Editor component</div>;\n };\n\n onToggleEditMode = (e: React.MouseEvent, props: QueryOperationRowRenderProps) => {\n e.stopPropagation();\n if (this.angularScope && this.angularScope.toggleEditorMode) {\n this.angularScope.toggleEditorMode();\n this.angularQueryEditor?.digest();\n if (!props.isOpen) {\n props.onOpen();\n }\n }\n };\n\n onRemoveQuery = () => {\n this.props.onRemoveQuery(this.props.query);\n };\n\n onCopyQuery = () => {\n const copy = cloneDeep(this.props.query);\n this.props.onAddQuery(copy);\n };\n\n onDisableQuery = () => {\n const { query } = this.props;\n this.props.onChange({ ...query, hide: !query.hide });\n this.props.onRunQuery();\n };\n\n onToggleHelp = () => {\n this.setState((state) => ({\n showingHelp: !state.showingHelp,\n }));\n };\n\n onClickExample = (query: TQuery) => {\n this.props.onChange({\n ...query,\n refId: this.props.query.refId,\n });\n this.onToggleHelp();\n };\n\n renderCollapsedText(): string | null {\n const { datasource } = this.state;\n if (datasource?.getQueryDisplayText) {\n return datasource.getQueryDisplayText(this.props.query);\n }\n\n if (this.angularScope && this.angularScope.getCollapsedText) {\n return this.angularScope.getCollapsedText();\n }\n return null;\n }\n\n renderWarnings = (): JSX.Element | null => {\n const { data, query } = this.props;\n const dataFilteredByRefId = filterPanelDataToQuery(data, query.refId)?.series ?? [];\n\n const allWarnings = dataFilteredByRefId.reduce((acc: QueryResultMetaNotice[], serie) => {\n if (!serie.meta?.notices) {\n return acc;\n }\n\n const warnings = filter(serie.meta.notices, { severity: 'warning' }) ?? [];\n return acc.concat(warnings);\n }, []);\n\n const uniqueWarnings = uniqBy(allWarnings, 'text');\n\n const hasWarnings = uniqueWarnings.length > 0;\n if (!hasWarnings) {\n return null;\n }\n\n const serializedWarnings = uniqueWarnings.map((warning) => warning.text).join('\\n');\n\n return (\n <Badge\n color=\"orange\"\n icon=\"exclamation-triangle\"\n text={\n <>\n {uniqueWarnings.length} {pluralize('warning', uniqueWarnings.length)}\n </>\n }\n tooltip={serializedWarnings}\n />\n );\n };\n\n renderExtraActions = () => {\n const { query, queries, data, onAddQuery, dataSource } = this.props;\n\n const extraActions = RowActionComponents.getAllExtraRenderAction()\n .map((action, index) =>\n action({\n query,\n queries,\n timeRange: data.timeRange,\n onAddQuery: onAddQuery as (query: DataQuery) => void,\n dataSource,\n key: index,\n })\n )\n .filter(Boolean);\n\n extraActions.push(this.renderWarnings());\n\n return extraActions;\n };\n\n renderActions = (props: QueryOperationRowRenderProps) => {\n const { query, hideDisableQuery = false } = this.props;\n const { hasTextEditMode, datasource, showingHelp } = this.state;\n const isDisabled = query.hide;\n\n const hasEditorHelp = datasource?.components?.QueryEditorHelp;\n\n return (\n <HorizontalGroup width=\"auto\">\n {hasEditorHelp && (\n <QueryOperationAction\n title=\"Toggle data source help\"\n icon=\"question-circle\"\n onClick={this.onToggleHelp}\n active={showingHelp}\n />\n )}\n {hasTextEditMode && (\n <QueryOperationAction\n title=\"Toggle text edit mode\"\n icon=\"pen\"\n onClick={(e) => {\n this.onToggleEditMode(e, props);\n }}\n />\n )}\n {this.renderExtraActions()}\n <QueryOperationAction title=\"Duplicate query\" icon=\"copy\" onClick={this.onCopyQuery} />\n {!hideDisableQuery ? (\n <QueryOperationAction\n title=\"Disable/enable query\"\n icon={isDisabled ? 'eye-slash' : 'eye'}\n active={isDisabled}\n onClick={this.onDisableQuery}\n />\n ) : null}\n <QueryOperationAction title=\"Remove query\" icon=\"trash-alt\" onClick={this.onRemoveQuery} />\n </HorizontalGroup>\n );\n };\n\n renderHeader = (props: QueryOperationRowRenderProps) => {\n const { alerting, query, dataSource, onChangeDataSource, onChange, queries, renderHeaderExtras } = this.props;\n\n return (\n <QueryEditorRowHeader\n query={query}\n queries={queries}\n onChangeDataSource={onChangeDataSource}\n dataSource={dataSource}\n disabled={query.hide}\n onClick={(e) => this.onToggleEditMode(e, props)}\n onChange={onChange}\n collapsedText={!props.isOpen ? this.renderCollapsedText() : null}\n renderExtras={renderHeaderExtras}\n alerting={alerting}\n />\n );\n };\n\n render() {\n const { query, id, index, visualization } = this.props;\n const { datasource, showingHelp, data } = this.state;\n const isDisabled = query.hide;\n\n const rowClasses = classNames('query-editor-row', {\n 'query-editor-row--disabled': isDisabled,\n 'gf-form-disabled': isDisabled,\n });\n\n if (!datasource) {\n return null;\n }\n\n const editor = this.renderPluginEditor();\n const DatasourceCheatsheet = datasource.components?.QueryEditorHelp;\n\n return (\n <div aria-label={selectors.components.QueryEditorRows.rows}>\n <QueryOperationRow\n id={id}\n draggable={true}\n index={index}\n headerElement={this.renderHeader}\n actions={this.renderActions}\n onOpen={this.onOpen}\n >\n <div className={rowClasses}>\n <ErrorBoundaryAlert>\n {showingHelp && DatasourceCheatsheet && (\n <OperationRowHelp>\n <DatasourceCheatsheet\n onClickExample={(query) => this.onClickExample(query)}\n query={this.props.query}\n datasource={datasource}\n />\n </OperationRowHelp>\n )}\n {editor}\n </ErrorBoundaryAlert>\n {data?.error && data.error.refId === query.refId && <QueryErrorAlert error={data.error} />}\n {visualization}\n </div>\n </QueryOperationRow>\n </div>\n );\n }\n}\n\nfunction notifyAngularQueryEditorsOfData<TQuery extends DataQuery>(\n scope: AngularQueryComponentScope<TQuery>,\n data: PanelData,\n editor: AngularComponent\n) {\n if (data.state === LoadingState.Done) {\n const legacy = data.series.map((v) => toLegacyResponseData(v));\n scope.events.emit(PanelEvents.dataReceived, legacy);\n } else if (data.state === LoadingState.Error) {\n scope.events.emit(PanelEvents.dataError, data.error);\n }\n\n // Some query controllers listen to data error events and need a digest\n // for some reason this needs to be done in next tick\n setTimeout(editor.digest);\n}\n\nexport interface AngularQueryComponentScope<TQuery extends DataQuery> {\n target: TQuery;\n panel: PanelModel;\n dashboard: DashboardModel;\n events: EventBusExtended;\n refresh: () => void;\n render: () => void;\n datasource: DataSourceApi<TQuery> | null;\n toggleEditorMode?: () => void;\n getCollapsedText?: () => string;\n range: TimeRange;\n}\n\n/**\n * Get a version of the PanelData limited to the query we are looking at\n */\nexport function filterPanelDataToQuery(data: PanelData, refId: string): PanelData | undefined {\n const series = data.series.filter((series) => series.refId === refId);\n\n // If there was an error with no data, pass it to the QueryEditors\n if (data.error && !data.series.length) {\n return {\n ...data,\n state: LoadingState.Error,\n };\n }\n\n // Only say this is an error if the error links to the query\n let state = data.state;\n const error = data.error && data.error.refId === refId ? data.error : undefined;\n if (error) {\n state = LoadingState.Error;\n } else if (!error && data.state === LoadingState.Error) {\n state = LoadingState.Done;\n }\n\n const timeRange = data.timeRange;\n\n return {\n ...data,\n state,\n series,\n error,\n timeRange,\n };\n}\n","import { concat, every, find, groupBy, head, map, partition } from 'lodash';\n\nexport function dedupAnnotations(annotations: any) {\n let dedup = [];\n\n // Split events by annotationId property existence\n const events = partition(annotations, 'id');\n\n const eventsById = groupBy(events[0], 'id');\n dedup = map(eventsById, (eventGroup) => {\n if (eventGroup.length > 1 && !every(eventGroup, isPanelAlert)) {\n // Get first non-panel alert\n return find(eventGroup, (event) => {\n return event.eventType !== 'panel-alert';\n });\n } else {\n return head(eventGroup);\n }\n });\n\n dedup = concat(dedup, events[1]);\n return dedup;\n}\n\nfunction isPanelAlert(event: { eventType: string }) {\n return event.eventType === 'panel-alert';\n}\n","import { from, Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { getBackendSrv } from '@grafana/runtime';\n\nimport { DashboardQueryRunnerOptions, DashboardQueryRunnerWorker, DashboardQueryRunnerWorkerResult } from './types';\nimport { emptyResult, handleDashboardQueryRunnerWorkerError } from './utils';\n\nexport class AlertStatesWorker implements DashboardQueryRunnerWorker {\n canWork({ dashboard, range }: DashboardQueryRunnerOptions): boolean {\n if (!dashboard.id) {\n return false;\n }\n\n if (range.raw.to !== 'now') {\n return false;\n }\n\n // if dashboard has no alerts, no point to query alert states\n if (!dashboard.panels.find((panel) => !!panel.alert)) {\n return false;\n }\n\n return true;\n }\n\n work(options: DashboardQueryRunnerOptions): Observable<DashboardQueryRunnerWorkerResult> {\n if (!this.canWork(options)) {\n return emptyResult();\n }\n\n const { dashboard } = options;\n return from(\n getBackendSrv().get(\n '/api/alerts/states-for-dashboard',\n {\n dashboardId: dashboard.id,\n },\n `dashboard-query-runner-alert-states-${dashboard.id}`\n )\n ).pipe(\n map((alertStates) => {\n return { alertStates, annotations: [] };\n }),\n catchError(handleDashboardQueryRunnerWorkerError)\n );\n }\n}\n","import { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { AnnotationEvent, DataSourceApi } from '@grafana/data';\n\nimport { executeAnnotationQuery } from '../../../annotations/executeAnnotationQuery';\nimport { PanelModel } from '../../../dashboard/state';\n\nimport { AnnotationQueryRunner, AnnotationQueryRunnerOptions } from './types';\nimport { handleAnnotationQueryRunnerError } from './utils';\n\nexport class AnnotationsQueryRunner implements AnnotationQueryRunner {\n canRun(datasource?: DataSourceApi): boolean {\n if (!datasource) {\n return false;\n }\n\n return Boolean(!datasource.annotationQuery || datasource.annotations);\n }\n\n run({ annotation, datasource, dashboard, range }: AnnotationQueryRunnerOptions): Observable<AnnotationEvent[]> {\n if (!this.canRun(datasource)) {\n return of([]);\n }\n\n const panel: PanelModel = {} as unknown as PanelModel; // deliberate setting panel to empty object because executeAnnotationQuery shouldn't depend on panelModel\n\n return executeAnnotationQuery({ dashboard, range, panel }, datasource!, annotation).pipe(\n map((result) => {\n return result.events ?? [];\n }),\n catchError(handleAnnotationQueryRunnerError)\n );\n }\n}\n","import { from, Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\n\nimport { AnnotationEvent, DataSourceApi } from '@grafana/data';\nimport { shouldUseLegacyRunner } from 'app/features/annotations/standardAnnotationSupport';\n\nimport { AnnotationQueryRunner, AnnotationQueryRunnerOptions } from './types';\nimport { handleAnnotationQueryRunnerError } from './utils';\n\nexport class LegacyAnnotationQueryRunner implements AnnotationQueryRunner {\n canRun(datasource?: DataSourceApi): boolean {\n if (!datasource) {\n return false;\n }\n\n if (shouldUseLegacyRunner(datasource)) {\n return true;\n }\n\n return Boolean(datasource.annotationQuery && !datasource.annotations);\n }\n\n run({ annotation, datasource, dashboard, range }: AnnotationQueryRunnerOptions): Observable<AnnotationEvent[]> {\n if (!this.canRun(datasource)) {\n return of([]);\n }\n\n return from(datasource!.annotationQuery!({ range, rangeRaw: range.raw, annotation, dashboard })).pipe(\n catchError(handleAnnotationQueryRunnerError)\n );\n }\n}\n","import { cloneDeep } from 'lodash';\nimport { from, merge, Observable, of } from 'rxjs';\nimport { catchError, filter, finalize, map, mergeAll, mergeMap, reduce, takeUntil } from 'rxjs/operators';\n\nimport { AnnotationQuery, DataSourceApi } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { AnnotationQueryFinished, AnnotationQueryStarted } from '../../../../types/events';\nimport { DashboardModel } from '../../../dashboard/state';\n\nimport { AnnotationsQueryRunner } from './AnnotationsQueryRunner';\nimport { getDashboardQueryRunner } from './DashboardQueryRunner';\nimport { LegacyAnnotationQueryRunner } from './LegacyAnnotationQueryRunner';\nimport {\n AnnotationQueryRunner,\n DashboardQueryRunnerOptions,\n DashboardQueryRunnerWorker,\n DashboardQueryRunnerWorkerResult,\n} from './types';\nimport { emptyResult, handleDatasourceSrvError, translateQueryResult } from './utils';\n\nexport class AnnotationsWorker implements DashboardQueryRunnerWorker {\n constructor(\n private readonly runners: AnnotationQueryRunner[] = [\n new LegacyAnnotationQueryRunner(),\n new AnnotationsQueryRunner(),\n ]\n ) {}\n\n canWork({ dashboard }: DashboardQueryRunnerOptions): boolean {\n const annotations = dashboard.annotations.list.find(AnnotationsWorker.getAnnotationsToProcessFilter);\n // We shouldn't return annotations for public dashboards v1\n return Boolean(annotations) && !this.publicDashboardViewMode(dashboard);\n }\n\n work(options: DashboardQueryRunnerOptions): Observable<DashboardQueryRunnerWorkerResult> {\n if (!this.canWork(options)) {\n return emptyResult();\n }\n\n const { dashboard, range } = options;\n const annotations = dashboard.annotations.list.filter(AnnotationsWorker.getAnnotationsToProcessFilter);\n const observables = annotations.map((annotation) => {\n const datasourceObservable = from(getDataSourceSrv().get(annotation.datasource)).pipe(\n catchError(handleDatasourceSrvError) // because of the reduce all observables need to be completed, so an erroneous observable wont do\n );\n return datasourceObservable.pipe(\n mergeMap((datasource?: DataSourceApi) => {\n const runner = this.runners.find((r) => r.canRun(datasource));\n if (!runner) {\n return of([]);\n }\n\n dashboard.events.publish(new AnnotationQueryStarted(annotation));\n\n return runner.run({ annotation, datasource, dashboard, range }).pipe(\n takeUntil(\n getDashboardQueryRunner()\n .cancellations()\n .pipe(filter((a) => a === annotation))\n ),\n map((results) => {\n // store response in annotation object if this is a snapshot call\n if (dashboard.snapshot) {\n annotation.snapshotData = cloneDeep(results);\n }\n // translate result\n return translateQueryResult(annotation, results);\n }),\n finalize(() => {\n dashboard.events.publish(new AnnotationQueryFinished(annotation));\n })\n );\n })\n );\n });\n\n return merge(observables).pipe(\n mergeAll(),\n reduce((acc, value) => {\n // should we use scan or reduce here\n // reduce will only emit when all observables are completed\n // scan will emit when any observable is completed\n // choosing reduce to minimize re-renders\n return acc.concat(value);\n }),\n map((annotations) => {\n return { annotations, alertStates: [] };\n })\n );\n }\n\n private static getAnnotationsToProcessFilter(annotation: AnnotationQuery): boolean {\n return annotation.enable && !Boolean(annotation.snapshotData);\n }\n\n publicDashboardViewMode(dashboard: DashboardModel): boolean {\n return dashboard.meta.publicDashboardAccessToken !== undefined && dashboard.meta.publicDashboardAccessToken !== '';\n }\n}\n","import { from, Observable } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport { AlertState, AlertStateInfo } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { Annotation } from 'app/features/alerting/unified/utils/constants';\nimport { isAlertingRule } from 'app/features/alerting/unified/utils/rules';\nimport { AccessControlAction } from 'app/types';\nimport { PromAlertingRuleState, PromRulesResponse } from 'app/types/unified-alerting-dto';\n\nimport { DashboardQueryRunnerOptions, DashboardQueryRunnerWorker, DashboardQueryRunnerWorkerResult } from './types';\nimport { emptyResult, handleDashboardQueryRunnerWorkerError } from './utils';\n\nexport class UnifiedAlertStatesWorker implements DashboardQueryRunnerWorker {\n // maps dashboard uid to wether it has alert rules.\n // if it is determined that a dashboard does not have alert rules,\n // further attempts to get alert states for it will not be made\n private hasAlertRules: Record<string, boolean> = {};\n\n canWork({ dashboard, range }: DashboardQueryRunnerOptions): boolean {\n if (!dashboard.uid) {\n return false;\n }\n\n if (range.raw.to !== 'now') {\n return false;\n }\n\n if (this.hasAlertRules[dashboard.uid] === false) {\n return false;\n }\n\n const hasRuleReadPermission =\n contextSrv.hasPermission(AccessControlAction.AlertingRuleRead) &&\n contextSrv.hasPermission(AccessControlAction.AlertingRuleExternalRead);\n\n if (!hasRuleReadPermission) {\n return false;\n }\n\n return true;\n }\n\n work(options: DashboardQueryRunnerOptions): Observable<DashboardQueryRunnerWorkerResult> {\n if (!this.canWork(options)) {\n return emptyResult();\n }\n\n const { dashboard } = options;\n return from(\n getBackendSrv().get(\n '/api/prometheus/grafana/api/v1/rules',\n {\n dashboard_uid: dashboard.uid,\n },\n `dashboard-query-runner-unified-alert-states-${dashboard.id}`\n )\n ).pipe(\n map((result: PromRulesResponse) => {\n if (result.status === 'success') {\n this.hasAlertRules[dashboard.uid] = false;\n const panelIdToAlertState: Record<number, AlertStateInfo> = {};\n result.data.groups.forEach((group) =>\n group.rules.forEach((rule) => {\n if (isAlertingRule(rule) && rule.annotations && rule.annotations[Annotation.panelID]) {\n this.hasAlertRules[dashboard.uid] = true;\n const panelId = Number(rule.annotations[Annotation.panelID]);\n const state = promAlertStateToAlertState(rule.state);\n\n // there can be multiple alerts per panel, so we make sure we get the most severe state:\n // alerting > pending > ok\n if (!panelIdToAlertState[panelId]) {\n panelIdToAlertState[panelId] = {\n state,\n id: Object.keys(panelIdToAlertState).length,\n panelId,\n dashboardId: dashboard.id,\n };\n } else if (\n state === AlertState.Alerting &&\n panelIdToAlertState[panelId].state !== AlertState.Alerting\n ) {\n panelIdToAlertState[panelId].state = AlertState.Alerting;\n } else if (\n state === AlertState.Pending &&\n panelIdToAlertState[panelId].state !== AlertState.Alerting &&\n panelIdToAlertState[panelId].state !== AlertState.Pending\n ) {\n panelIdToAlertState[panelId].state = AlertState.Pending;\n }\n }\n })\n );\n return { alertStates: Object.values(panelIdToAlertState), annotations: [] };\n }\n throw new Error(`Unexpected alert rules response.`);\n }),\n catchError(handleDashboardQueryRunnerWorkerError)\n );\n }\n}\n\nfunction promAlertStateToAlertState(state: PromAlertingRuleState): AlertState {\n if (state === PromAlertingRuleState.Firing) {\n return AlertState.Alerting;\n } else if (state === PromAlertingRuleState.Pending) {\n return AlertState.Pending;\n }\n return AlertState.OK;\n}\n","import { merge, Observable, ReplaySubject, Subject, Subscription, timer, Unsubscribable } from 'rxjs';\nimport { finalize, map, mapTo, mergeAll, reduce, share, takeUntil } from 'rxjs/operators';\n\nimport { AnnotationQuery } from '@grafana/data';\nimport { RefreshEvent } from '@grafana/runtime';\nimport { config } from 'app/core/config';\nimport { dedupAnnotations } from 'app/features/annotations/events_processing';\n\nimport { getTimeSrv, TimeSrv } from '../../../dashboard/services/TimeSrv';\nimport { DashboardModel } from '../../../dashboard/state';\n\nimport { AlertStatesWorker } from './AlertStatesWorker';\nimport { AnnotationsWorker } from './AnnotationsWorker';\nimport { SnapshotWorker } from './SnapshotWorker';\nimport { UnifiedAlertStatesWorker } from './UnifiedAlertStatesWorker';\nimport {\n DashboardQueryRunner,\n DashboardQueryRunnerOptions,\n DashboardQueryRunnerResult,\n DashboardQueryRunnerWorker,\n DashboardQueryRunnerWorkerResult,\n} from './types';\nimport { getAnnotationsByPanelId } from './utils';\n\nclass DashboardQueryRunnerImpl implements DashboardQueryRunner {\n private readonly results: ReplaySubject<DashboardQueryRunnerWorkerResult>;\n private readonly runs: Subject<DashboardQueryRunnerOptions>;\n private readonly cancellationStream: Subject<AnnotationQuery>;\n private readonly runsSubscription: Unsubscribable;\n private readonly eventsSubscription: Unsubscribable;\n\n constructor(\n private readonly dashboard: DashboardModel,\n private readonly timeSrv: TimeSrv = getTimeSrv(),\n private readonly workers: DashboardQueryRunnerWorker[] = [\n config.unifiedAlertingEnabled ? new UnifiedAlertStatesWorker() : new AlertStatesWorker(),\n new SnapshotWorker(),\n new AnnotationsWorker(),\n ]\n ) {\n this.run = this.run.bind(this);\n this.getResult = this.getResult.bind(this);\n this.cancel = this.cancel.bind(this);\n this.destroy = this.destroy.bind(this);\n this.executeRun = this.executeRun.bind(this);\n this.results = new ReplaySubject<DashboardQueryRunnerWorkerResult>(1);\n this.runs = new Subject<DashboardQueryRunnerOptions>();\n this.cancellationStream = new Subject<any>();\n this.runsSubscription = this.runs.subscribe((options) => this.executeRun(options));\n this.eventsSubscription = dashboard.events.subscribe(RefreshEvent, (event) => {\n this.run({ dashboard: this.dashboard, range: this.timeSrv.timeRange() });\n });\n }\n\n run(options: DashboardQueryRunnerOptions): void {\n this.runs.next(options);\n }\n\n getResult(panelId?: number): Observable<DashboardQueryRunnerResult> {\n return this.results.asObservable().pipe(\n map((result) => {\n const annotations = getAnnotationsByPanelId(result.annotations, panelId);\n const alertState = result.alertStates.find((res) => Boolean(panelId) && res.panelId === panelId);\n return { annotations: dedupAnnotations(annotations), alertState };\n })\n );\n }\n\n private executeRun(options: DashboardQueryRunnerOptions) {\n const workers = this.workers.filter((w) => w.canWork(options));\n const workerObservables = workers.map((w) => w.work(options));\n\n const resultSubscription = new Subscription();\n const resultObservable = merge(workerObservables).pipe(\n takeUntil(this.runs.asObservable()),\n mergeAll(),\n reduce((acc: DashboardQueryRunnerWorkerResult, value: DashboardQueryRunnerWorkerResult) => {\n // console.log({ acc: acc.annotations.length, value: value.annotations.length });\n // should we use scan or reduce here\n // reduce will only emit when all observables are completed\n // scan will emit when any observable is completed\n // choosing reduce to minimize re-renders\n acc.annotations = acc.annotations.concat(value.annotations);\n acc.alertStates = acc.alertStates.concat(value.alertStates);\n return acc;\n }),\n finalize(() => {\n resultSubscription.unsubscribe(); // important to avoid memory leaks\n }),\n share() // shared because we're using it in takeUntil below\n );\n\n const timerSubscription = new Subscription();\n const timerObservable = timer(200).pipe(\n mapTo({ annotations: [], alertStates: [] }),\n takeUntil(resultObservable),\n finalize(() => {\n timerSubscription.unsubscribe(); // important to avoid memory leaks\n })\n );\n\n // if the result takes longer than 200ms we just publish an empty result\n timerSubscription.add(\n timerObservable.subscribe((result) => {\n this.results.next(result);\n })\n );\n\n resultSubscription.add(\n resultObservable.subscribe((result: DashboardQueryRunnerWorkerResult) => {\n this.results.next(result);\n })\n );\n }\n\n cancel(annotation: AnnotationQuery): void {\n this.cancellationStream.next(annotation);\n }\n\n cancellations(): Observable<AnnotationQuery> {\n return this.cancellationStream.asObservable().pipe(share());\n }\n\n destroy(): void {\n this.results.complete();\n this.runs.complete();\n this.cancellationStream.complete();\n this.runsSubscription.unsubscribe();\n this.eventsSubscription.unsubscribe();\n }\n}\n\nlet dashboardQueryRunner: DashboardQueryRunner | undefined;\n\nfunction setDashboardQueryRunner(runner: DashboardQueryRunner): void {\n if (dashboardQueryRunner) {\n dashboardQueryRunner.destroy();\n }\n dashboardQueryRunner = runner;\n}\n\nexport function getDashboardQueryRunner(): DashboardQueryRunner {\n if (!dashboardQueryRunner) {\n throw new Error('getDashboardQueryRunner can only be used after Grafana instance has started.');\n }\n return dashboardQueryRunner;\n}\n\nexport interface DashboardQueryRunnerFactoryArgs {\n dashboard: DashboardModel;\n timeSrv?: TimeSrv;\n workers?: DashboardQueryRunnerWorker[];\n}\n\nexport type DashboardQueryRunnerFactory = (args: DashboardQueryRunnerFactoryArgs) => DashboardQueryRunner;\n\nlet factory: DashboardQueryRunnerFactory | undefined;\n\nexport function setDashboardQueryRunnerFactory(instance: DashboardQueryRunnerFactory) {\n factory = instance;\n}\n\nexport function createDashboardQueryRunner(args: DashboardQueryRunnerFactoryArgs): DashboardQueryRunner {\n if (!factory) {\n factory = ({ dashboard, timeSrv, workers }: DashboardQueryRunnerFactoryArgs) =>\n new DashboardQueryRunnerImpl(dashboard, timeSrv, workers);\n }\n\n const runner = factory(args);\n setDashboardQueryRunner(runner);\n return runner;\n}\n","import { Observable, of } from 'rxjs';\n\nimport { AnnotationEvent } from '@grafana/data';\n\nimport { DashboardModel } from '../../../dashboard/state';\n\nimport { DashboardQueryRunnerOptions, DashboardQueryRunnerWorker, DashboardQueryRunnerWorkerResult } from './types';\nimport { emptyResult, getAnnotationsByPanelId, translateQueryResult } from './utils';\n\nexport class SnapshotWorker implements DashboardQueryRunnerWorker {\n canWork({ dashboard }: DashboardQueryRunnerOptions): boolean {\n return dashboard?.annotations?.list?.some((a) => a.enable && Boolean(a.snapshotData));\n }\n\n work(options: DashboardQueryRunnerOptions): Observable<DashboardQueryRunnerWorkerResult> {\n if (!this.canWork(options)) {\n return emptyResult();\n }\n\n const annotations = this.getAnnotationsFromSnapshot(options.dashboard);\n return of({ annotations, alertStates: [] });\n }\n\n private getAnnotationsFromSnapshot(dashboard: DashboardModel): AnnotationEvent[] {\n const dashAnnotations = dashboard?.annotations?.list?.filter((a) => a.enable);\n const snapshots = dashAnnotations.filter((a) => Boolean(a.snapshotData));\n const annotations = snapshots.reduce(\n (acc, curr) => acc.concat(translateQueryResult(curr, curr.snapshotData)),\n [] as AnnotationEvent[]\n );\n\n return annotations;\n }\n\n getAnnotationsInSnapshot(dashboard: DashboardModel, panelId?: number): AnnotationEvent[] {\n const annotations = this.getAnnotationsFromSnapshot(dashboard);\n return getAnnotationsByPanelId(annotations, panelId);\n }\n}\n","import { cloneDeep } from 'lodash';\nimport { Observable, of } from 'rxjs';\n\nimport { AnnotationEvent, AnnotationQuery, DataFrame, DataFrameView, DataSourceApi } from '@grafana/data';\nimport { config, toDataQueryError } from '@grafana/runtime';\nimport { dispatch } from 'app/store/store';\n\nimport { createErrorNotification } from '../../../../core/copy/appNotification';\nimport { notifyApp } from '../../../../core/reducers/appNotification';\n\nimport { DashboardQueryRunnerWorkerResult } from './types';\n\nexport function handleAnnotationQueryRunnerError(err: any): Observable<AnnotationEvent[]> {\n if (err.cancelled) {\n return of([]);\n }\n\n notifyWithError('AnnotationQueryRunner failed', err);\n return of([]);\n}\n\nexport function handleDatasourceSrvError(err: any): Observable<DataSourceApi | undefined> {\n notifyWithError('Failed to retrieve datasource', err);\n return of(undefined);\n}\n\nexport const emptyResult: () => Observable<DashboardQueryRunnerWorkerResult> = () =>\n of({ annotations: [], alertStates: [] });\n\nexport function handleDashboardQueryRunnerWorkerError(err: any): Observable<DashboardQueryRunnerWorkerResult> {\n if (err.cancelled) {\n return emptyResult();\n }\n\n notifyWithError('DashboardQueryRunner failed', err);\n return emptyResult();\n}\n\nfunction notifyWithError(title: string, err: any) {\n const error = toDataQueryError(err);\n console.error('handleAnnotationQueryRunnerError', error);\n const notification = createErrorNotification(title, error.message);\n dispatch(notifyApp(notification));\n}\n\nexport function getAnnotationsByPanelId(annotations: AnnotationEvent[], panelId?: number) {\n return annotations.filter((item) => {\n if (panelId !== undefined && item.panelId && item.source?.type === 'dashboard') {\n return item.panelId === panelId;\n }\n return true;\n });\n}\n\nexport function translateQueryResult(annotation: AnnotationQuery, results: AnnotationEvent[]): AnnotationEvent[] {\n // if annotation has snapshotData\n // make clone and remove it\n if (annotation.snapshotData) {\n annotation = cloneDeep(annotation);\n delete annotation.snapshotData;\n }\n\n for (const item of results) {\n item.source = annotation;\n item.color = config.theme2.visualization.getColorByName(annotation.iconColor);\n item.type = annotation.name;\n item.isRegion = Boolean(item.timeEnd && item.time !== item.timeEnd);\n\n switch (item.newState?.toLowerCase()) {\n case 'pending':\n item.color = 'yellow';\n break;\n case 'alerting':\n item.color = 'red';\n break;\n case 'ok':\n item.color = 'green';\n break;\n case 'normal': // ngalert (\"normal\" instead of \"ok\")\n item.color = 'green';\n break;\n case 'no_data':\n item.color = 'gray';\n break;\n case 'nodata': // ngalert\n item.color = 'gray';\n break;\n }\n }\n\n return results;\n}\n\nexport function annotationsFromDataFrames(data?: DataFrame[]): AnnotationEvent[] {\n if (!data || !data.length) {\n return [];\n }\n\n const annotations: AnnotationEvent[] = [];\n for (const frame of data) {\n const view = new DataFrameView<AnnotationEvent>(frame);\n for (let index = 0; index < frame.length; index++) {\n const annotation = cloneDeep(view.get(index));\n annotations.push(annotation);\n }\n }\n\n return annotations;\n}\n","import { catchError, Observable, of, switchMap } from 'rxjs';\n\nimport {\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourcePluginMeta,\n DataSourceRef,\n} from '@grafana/data';\nimport { BackendDataSourceResponse, getBackendSrv, toDataQueryResponse } from '@grafana/runtime';\n\nimport { MIXED_DATASOURCE_NAME } from '../../../plugins/datasource/mixed/MixedDataSource';\n\nexport const PUBLIC_DATASOURCE = '-- Public --';\n\nexport class PublicDashboardDataSource extends DataSourceApi<any> {\n constructor(datasource: DataSourceRef | string | DataSourceApi | null) {\n let meta = {} as DataSourcePluginMeta;\n if (PublicDashboardDataSource.isMixedDatasource(datasource)) {\n meta.mixed = true;\n }\n\n super({\n name: 'public-ds',\n id: 0,\n type: 'public-ds',\n meta,\n uid: PublicDashboardDataSource.resolveUid(datasource),\n jsonData: {},\n access: 'proxy',\n });\n\n this.interval = '1min';\n }\n\n /**\n * Get the datasource uid based on the many types a datasource can be.\n */\n private static resolveUid(datasource: DataSourceRef | string | DataSourceApi | null): string {\n if (typeof datasource === 'string') {\n return datasource;\n }\n\n return datasource?.uid ?? PUBLIC_DATASOURCE;\n }\n\n private static isMixedDatasource(datasource: DataSourceRef | string | DataSourceApi | null): boolean {\n if (typeof datasource === 'string' || datasource === null) {\n return false;\n }\n\n return datasource?.uid === MIXED_DATASOURCE_NAME;\n }\n\n /**\n * Ideally final -- any other implementation may not work as expected\n */\n query(request: DataQueryRequest<any>): Observable<DataQueryResponse> {\n const { intervalMs, maxDataPoints, range, requestId, publicDashboardAccessToken, panelId } = request;\n let targets = request.targets;\n\n const queries = targets.map((q) => {\n return {\n ...q,\n publicDashboardAccessToken,\n intervalMs,\n maxDataPoints,\n };\n });\n\n // Return early if no queries exist\n if (!queries.length) {\n return of({ data: [] });\n }\n\n const body: any = { queries, publicDashboardAccessToken, panelId };\n\n if (range) {\n body.range = range;\n body.from = range.from.valueOf().toString();\n body.to = range.to.valueOf().toString();\n }\n\n return getBackendSrv()\n .fetch<BackendDataSourceResponse>({\n url: `/api/public/dashboards/${publicDashboardAccessToken}/panels/${panelId}/query`,\n method: 'POST',\n data: body,\n requestId,\n })\n .pipe(\n switchMap((raw) => {\n return of(toDataQueryResponse(raw, queries as DataQuery[]));\n }),\n catchError((err) => {\n return of(toDataQueryResponse(err));\n })\n );\n }\n\n testDatasource(): Promise<any> {\n return Promise.resolve(null);\n }\n}\n","import { cloneDeep } from 'lodash';\nimport { MonoTypeOperatorFunction, Observable, of, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport {\n applyFieldOverrides,\n compareArrayValues,\n compareDataFrameStructures,\n CoreApp,\n DataConfigSource,\n DataFrame,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n DataSourceJsonData,\n DataSourceRef,\n DataTransformerConfig,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n rangeUtil,\n ScopedVars,\n TimeRange,\n TimeZone,\n toDataFrame,\n transformDataFrame,\n} from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\nimport { StreamingDataFrame } from 'app/features/live/data/StreamingDataFrame';\nimport { isStreamingDataFrame } from 'app/features/live/data/utils';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport { isSharedDashboardQuery, runSharedRequest } from '../../../plugins/datasource/dashboard';\nimport { PublicDashboardDataSource } from '../../dashboard/services/PublicDashboardDataSource';\nimport { PanelModel } from '../../dashboard/state';\n\nimport { getDashboardQueryRunner } from './DashboardQueryRunner/DashboardQueryRunner';\nimport { mergePanelAndDashData } from './mergePanelAndDashData';\nimport { preProcessPanelData, runRequest } from './runRequest';\n\nexport interface QueryRunnerOptions<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> {\n datasource: DataSourceRef | DataSourceApi<TQuery, TOptions> | null;\n queries: TQuery[];\n panelId?: number;\n dashboardId?: number;\n publicDashboardAccessToken?: string;\n timezone: TimeZone;\n timeRange: TimeRange;\n timeInfo?: string; // String description of time range for display\n maxDataPoints: number;\n minInterval: string | undefined | null;\n scopedVars?: ScopedVars;\n cacheTimeout?: string | null;\n transformations?: DataTransformerConfig[];\n}\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'Q' + counter++;\n}\n\nexport interface GetDataOptions {\n withTransforms: boolean;\n withFieldConfig: boolean;\n}\n\nexport class PanelQueryRunner {\n private subject: ReplaySubject<PanelData>;\n private subscription?: Unsubscribable;\n private lastResult?: PanelData;\n private dataConfigSource: DataConfigSource;\n private lastRequest?: DataQueryRequest;\n\n constructor(dataConfigSource: DataConfigSource) {\n this.subject = new ReplaySubject(1);\n this.dataConfigSource = dataConfigSource;\n }\n\n /**\n * Returns an observable that subscribes to the shared multi-cast subject (that reply last result).\n */\n getData(options: GetDataOptions): Observable<PanelData> {\n const { withFieldConfig, withTransforms } = options;\n let structureRev = 1;\n let lastData: DataFrame[] = [];\n let isFirstPacket = true;\n let lastConfigRev = -1;\n\n if (this.dataConfigSource.snapshotData) {\n const snapshotPanelData: PanelData = {\n state: LoadingState.Done,\n series: this.dataConfigSource.snapshotData.map((v) => toDataFrame(v)),\n timeRange: getDefaultTimeRange(), // Don't need real time range for snapshots\n };\n return of(snapshotPanelData);\n }\n\n return this.subject.pipe(\n this.getTransformationsStream(withTransforms),\n map((data: PanelData) => {\n let processedData = data;\n let streamingPacketWithSameSchema = false;\n\n if (withFieldConfig && data.series?.length) {\n if (lastConfigRev === this.dataConfigSource.configRev) {\n const streamingDataFrame = data.series.find((data) => isStreamingDataFrame(data)) as\n | StreamingDataFrame\n | undefined;\n\n if (\n streamingDataFrame &&\n !streamingDataFrame.packetInfo.schemaChanged &&\n // TODO: remove the condition below after fixing\n // https://github.com/grafana/grafana/pull/41492#issuecomment-970281430\n lastData[0].fields.length === streamingDataFrame.fields.length\n ) {\n processedData = {\n ...processedData,\n series: lastData.map((frame, frameIndex) => ({\n ...frame,\n length: data.series[frameIndex].length,\n fields: frame.fields.map((field, fieldIndex) => ({\n ...field,\n values: data.series[frameIndex].fields[fieldIndex].values,\n state: {\n ...field.state,\n calcs: undefined,\n range: undefined,\n },\n })),\n })),\n };\n\n streamingPacketWithSameSchema = true;\n }\n }\n\n // Apply field defaults and overrides\n let fieldConfig = this.dataConfigSource.getFieldOverrideOptions();\n\n if (fieldConfig != null && (isFirstPacket || !streamingPacketWithSameSchema)) {\n lastConfigRev = this.dataConfigSource.configRev!;\n processedData = {\n ...processedData,\n series: applyFieldOverrides({\n timeZone: data.request?.timezone ?? 'browser',\n data: processedData.series,\n ...fieldConfig!,\n }),\n };\n isFirstPacket = false;\n }\n }\n\n if (\n !streamingPacketWithSameSchema &&\n !compareArrayValues(lastData, processedData.series, compareDataFrameStructures)\n ) {\n structureRev++;\n }\n lastData = processedData.series;\n\n return { ...processedData, structureRev };\n })\n );\n }\n\n private getTransformationsStream = (withTransforms: boolean): MonoTypeOperatorFunction<PanelData> => {\n return (inputStream) =>\n inputStream.pipe(\n mergeMap((data) => {\n if (!withTransforms) {\n return of(data);\n }\n\n const transformations = this.dataConfigSource.getTransformations();\n\n if (!transformations || transformations.length === 0) {\n return of(data);\n }\n\n const replace = (option: string): string => {\n return getTemplateSrv().replace(option, data?.request?.scopedVars);\n };\n transformations.forEach((transform: any) => {\n transform.replace = replace;\n });\n\n return transformDataFrame(transformations, data.series).pipe(map((series) => ({ ...data, series })));\n })\n );\n };\n\n async run(options: QueryRunnerOptions) {\n const {\n queries,\n timezone,\n datasource,\n panelId,\n dashboardId,\n publicDashboardAccessToken,\n timeRange,\n timeInfo,\n cacheTimeout,\n maxDataPoints,\n scopedVars,\n minInterval,\n } = options;\n\n if (isSharedDashboardQuery(datasource)) {\n this.pipeToSubject(runSharedRequest(options), panelId);\n return;\n }\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: getNextRequestId(),\n timezone,\n panelId,\n dashboardId,\n publicDashboardAccessToken,\n range: timeRange,\n timeInfo,\n interval: '',\n intervalMs: 0,\n targets: cloneDeep(queries),\n maxDataPoints: maxDataPoints,\n scopedVars: scopedVars || {},\n cacheTimeout,\n startTime: Date.now(),\n };\n\n // Add deprecated property\n (request as any).rangeRaw = timeRange.raw;\n\n try {\n const ds = await getDataSource(datasource, request.scopedVars, publicDashboardAccessToken);\n const isMixedDS = ds.meta?.mixed;\n\n // Attach the data source to each query\n request.targets = request.targets.map((query) => {\n const isExpressionQuery = query.datasource?.type === ExpressionDatasourceRef.type;\n // When using a data source variable, the panel might have the incorrect datasource\n // stored, so when running the query make sure it is done with the correct one\n if (!query.datasource || (query.datasource.uid !== ds.uid && !isMixedDS && !isExpressionQuery)) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n const lowerIntervalLimit = minInterval ? getTemplateSrv().replace(minInterval, request.scopedVars) : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange, maxDataPoints, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n this.lastRequest = request;\n\n this.pipeToSubject(runRequest(ds, request), panelId);\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n }\n }\n\n private pipeToSubject(observable: Observable<PanelData>, panelId?: number) {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n let panelData = observable;\n const dataSupport = this.dataConfigSource.getDataSupport();\n\n if (dataSupport.alertStates || dataSupport.annotations) {\n const panel = this.dataConfigSource as unknown as PanelModel;\n panelData = mergePanelAndDashData(observable, getDashboardQueryRunner().getResult(panel.id));\n }\n\n this.subscription = panelData.subscribe({\n next: (data) => {\n this.lastResult = preProcessPanelData(data, this.lastResult);\n // Store preprocessed query results for applying overrides later on in the pipeline\n this.subject.next(this.lastResult);\n },\n });\n }\n\n cancelQuery() {\n if (!this.subscription) {\n return;\n }\n\n this.subscription.unsubscribe();\n\n // If we have an old result with loading state, send it with done state\n if (this.lastResult && this.lastResult.state === LoadingState.Loading) {\n this.subject.next({\n ...this.lastResult,\n state: LoadingState.Done,\n });\n }\n }\n\n resendLastResult = () => {\n if (this.lastResult) {\n this.subject.next(this.lastResult);\n }\n };\n\n clearLastResult() {\n this.lastResult = undefined;\n // A new subject is also needed since it's a replay subject that remembers/sends last value\n this.subject = new ReplaySubject(1);\n }\n\n /**\n * Called when the panel is closed\n */\n destroy() {\n // Tell anyone listening that we are done\n if (this.subject) {\n this.subject.complete();\n }\n\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n useLastResultFrom(runner: PanelQueryRunner) {\n this.lastResult = runner.getLastResult();\n\n if (this.lastResult) {\n // The subject is a replay subject so anyone subscribing will get this last result\n this.subject.next(this.lastResult);\n }\n }\n\n getLastResult(): PanelData | undefined {\n return this.lastResult;\n }\n\n getLastRequest(): DataQueryRequest | undefined {\n return this.lastRequest;\n }\n}\n\nasync function getDataSource(\n datasource: DataSourceRef | string | DataSourceApi | null,\n scopedVars: ScopedVars,\n publicDashboardAccessToken?: string\n): Promise<DataSourceApi> {\n if (publicDashboardAccessToken) {\n return new PublicDashboardDataSource(datasource);\n }\n\n if (datasource && (datasource as any).query) {\n return datasource as DataSourceApi;\n }\n\n return await getDatasourceSrv().get(datasource as string, scopedVars);\n}\n","import { combineLatest, Observable, of } from 'rxjs';\nimport { mergeMap } from 'rxjs/operators';\n\nimport { ArrayDataFrame, PanelData } from '@grafana/data';\n\nimport { DashboardQueryRunnerResult } from './DashboardQueryRunner/types';\n\nexport function mergePanelAndDashData(\n panelObservable: Observable<PanelData>,\n dashObservable: Observable<DashboardQueryRunnerResult>\n): Observable<PanelData> {\n return combineLatest([panelObservable, dashObservable]).pipe(\n mergeMap((combined) => {\n const [panelData, dashData] = combined;\n\n if (Boolean(dashData.annotations?.length) || Boolean(dashData.alertState)) {\n if (!panelData.annotations) {\n panelData.annotations = [];\n }\n\n const annotations = panelData.annotations.concat(new ArrayDataFrame(dashData.annotations));\n const alertState = dashData.alertState;\n return of({ ...panelData, annotations, alertState });\n }\n\n return of(panelData);\n })\n );\n}\n","import { MonoTypeOperatorFunction } from 'rxjs';\nimport { finalize } from 'rxjs/operators';\n\nimport { BackendSrv } from 'app/core/services/backend_srv';\n\nexport function cancelNetworkRequestsOnUnsubscribe<T>(\n backendSrv: BackendSrv,\n requestId: string | undefined\n): MonoTypeOperatorFunction<T> {\n return finalize(() => {\n if (requestId) {\n backendSrv.resolveCancelerIfExists(requestId);\n }\n });\n}\n","import { compareArrayValues, compareDataFrameStructures, PanelData } from '@grafana/data';\n\nexport const setStructureRevision = (result: PanelData, lastResult: PanelData | undefined) => {\n let structureRev = 1;\n\n if (lastResult?.structureRev && lastResult.series) {\n structureRev = lastResult.structureRev;\n const sameStructure = compareArrayValues(result.series, lastResult.series, compareDataFrameStructures);\n if (!sameStructure) {\n structureRev++;\n }\n }\n\n result.structureRev = structureRev;\n return result;\n};\n","// Libraries\nimport { isString, map as isArray } from 'lodash';\nimport { from, merge, Observable, of, timer } from 'rxjs';\nimport { catchError, map, mapTo, share, takeUntil, tap } from 'rxjs/operators';\n\n// Utils & Services\n// Types\nimport {\n DataFrame,\n DataQueryError,\n DataQueryRequest,\n DataQueryResponse,\n DataQueryResponseData,\n DataSourceApi,\n DataTopic,\n dateMath,\n guessFieldTypes,\n LoadingState,\n PanelData,\n TimeRange,\n toDataFrame,\n} from '@grafana/data';\nimport { toDataQueryError } from '@grafana/runtime';\nimport { isExpressionReference } from '@grafana/runtime/src/utils/DataSourceWithBackend';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { dataSource as expressionDatasource } from 'app/features/expressions/ExpressionDatasource';\nimport { ExpressionQuery } from 'app/features/expressions/types';\n\nimport { cancelNetworkRequestsOnUnsubscribe } from './processing/canceler';\nimport { emitDataRequestEvent } from './queryAnalytics';\n\ntype MapOfResponsePackets = { [str: string]: DataQueryResponse };\n\ninterface RunningQueryState {\n packets: { [key: string]: DataQueryResponse };\n panelData: PanelData;\n}\n\n/*\n * This function should handle composing a PanelData from multiple responses\n */\nexport function processResponsePacket(packet: DataQueryResponse, state: RunningQueryState): RunningQueryState {\n const request = state.panelData.request!;\n const packets: MapOfResponsePackets = {\n ...state.packets,\n };\n\n // updates to the same key will replace previous values\n const key = packet.key ?? packet.data?.[0]?.refId ?? 'A';\n packets[key] = packet;\n\n let loadingState = packet.state || LoadingState.Done;\n let error: DataQueryError | undefined = undefined;\n\n const series: DataQueryResponseData[] = [];\n const annotations: DataQueryResponseData[] = [];\n\n for (const key in packets) {\n const packet = packets[key];\n\n if (packet.error) {\n loadingState = LoadingState.Error;\n error = packet.error;\n }\n\n if (packet.data && packet.data.length) {\n for (const dataItem of packet.data) {\n if (dataItem.meta?.dataTopic === DataTopic.Annotations) {\n annotations.push(dataItem);\n continue;\n }\n\n series.push(dataItem);\n }\n }\n }\n\n const timeRange = getRequestTimeRange(request, loadingState);\n\n const panelData = {\n state: loadingState,\n series,\n annotations,\n error,\n request,\n timeRange,\n };\n\n return { packets, panelData };\n}\n\nfunction getRequestTimeRange(request: DataQueryRequest, loadingState: LoadingState): TimeRange {\n const range = request.range;\n\n if (!isString(range.raw.from) || loadingState !== LoadingState.Streaming) {\n return range;\n }\n\n return {\n ...range,\n from: dateMath.parse(range.raw.from, false)!,\n to: dateMath.parse(range.raw.to, true)!,\n };\n}\n\n/**\n * This function handles the execution of requests & and processes the single or multiple response packets into\n * a combined PanelData response. It will\n * Merge multiple responses into a single DataFrame array based on the packet key\n * Will emit a loading state if no response after 50ms\n * Cancel any still running network requests on unsubscribe (using request.requestId)\n */\nexport function runRequest(\n datasource: DataSourceApi,\n request: DataQueryRequest,\n queryFunction?: typeof datasource.query\n): Observable<PanelData> {\n let state: RunningQueryState = {\n panelData: {\n state: LoadingState.Loading,\n series: [],\n request: request,\n timeRange: request.range,\n },\n packets: {},\n };\n\n // Return early if there are no queries to run\n if (!request.targets.length) {\n request.endTime = Date.now();\n state.panelData.state = LoadingState.Done;\n return of(state.panelData);\n }\n\n const dataObservable = callQueryMethod(datasource, request, queryFunction).pipe(\n // Transform response packets into PanelData with merged results\n map((packet: DataQueryResponse) => {\n if (!isArray(packet.data)) {\n throw new Error(`Expected response data to be array, got ${typeof packet.data}.`);\n }\n\n request.endTime = Date.now();\n\n state = processResponsePacket(packet, state);\n\n return state.panelData;\n }),\n // handle errors\n catchError((err) => {\n const errLog = typeof err === 'string' ? err : JSON.stringify(err);\n console.error('runRequest.catchError', errLog);\n return of({\n ...state.panelData,\n state: LoadingState.Error,\n error: toDataQueryError(err),\n });\n }),\n tap(emitDataRequestEvent(datasource)),\n // finalize is triggered when subscriber unsubscribes\n // This makes sure any still running network requests are cancelled\n cancelNetworkRequestsOnUnsubscribe(backendSrv, request.requestId),\n // this makes it possible to share this observable in takeUntil\n share()\n );\n\n // If 50ms without a response emit a loading state\n // mapTo will translate the timer event into state.panelData (which has state set to loading)\n // takeUntil will cancel the timer emit when first response packet is received on the dataObservable\n return merge(timer(200).pipe(mapTo(state.panelData), takeUntil(dataObservable)), dataObservable);\n}\n\nexport function callQueryMethod(\n datasource: DataSourceApi,\n request: DataQueryRequest,\n queryFunction?: typeof datasource.query\n) {\n // If any query has an expression, use the expression endpoint\n for (const target of request.targets) {\n if (isExpressionReference(target.datasource)) {\n return expressionDatasource.query(request as DataQueryRequest<ExpressionQuery>);\n }\n }\n\n // Otherwise it is a standard datasource request\n const returnVal = queryFunction ? queryFunction(request) : datasource.query(request);\n return from(returnVal);\n}\n\nfunction getProcessedDataFrame(data: DataQueryResponseData): DataFrame {\n const dataFrame = guessFieldTypes(toDataFrame(data));\n\n if (dataFrame.fields && dataFrame.fields.length) {\n // clear out the cached info\n for (const field of dataFrame.fields) {\n field.state = null;\n }\n }\n\n return dataFrame;\n}\n\n/**\n * All panels will be passed tables that have our best guess at column type set\n *\n * This is also used by PanelChrome for snapshot support\n */\nexport function getProcessedDataFrames(results?: DataQueryResponseData[]): DataFrame[] {\n if (!results || !isArray(results)) {\n return [];\n }\n\n return results.map((data) => getProcessedDataFrame(data));\n}\n\nexport function preProcessPanelData(data: PanelData, lastResult?: PanelData): PanelData {\n const { series, annotations } = data;\n\n // for loading states with no data, use last result\n if (data.state === LoadingState.Loading && series.length === 0) {\n if (!lastResult) {\n lastResult = data;\n }\n\n return {\n ...lastResult,\n state: LoadingState.Loading,\n request: data.request,\n };\n }\n\n // Make sure the data frames are properly formatted\n const STARTTIME = performance.now();\n const processedDataFrames = series.map((data) => getProcessedDataFrame(data));\n const annotationsProcessed = getProcessedDataFrames(annotations);\n const STOPTIME = performance.now();\n\n return {\n ...data,\n series: processedDataFrames,\n annotations: annotationsProcessed,\n timings: { dataProcessingTime: STOPTIME - STARTTIME },\n };\n}\n","import { PanelData, LoadingState, DataSourceApi, CoreApp, urlUtil } from '@grafana/data';\nimport { reportMetaAnalytics, MetaAnalyticsEventName, DataRequestEventPayload } from '@grafana/runtime';\n\nimport { getDashboardSrv } from '../../dashboard/services/DashboardSrv';\n\nexport function emitDataRequestEvent(datasource: DataSourceApi) {\n let done = false;\n\n return (data: PanelData) => {\n if (!data.request || done || data.request.app === CoreApp.Explore) {\n return;\n }\n\n const params = urlUtil.getUrlSearchParams();\n if (params.editPanel != null) {\n return;\n }\n\n if (data.state !== LoadingState.Done && data.state !== LoadingState.Error) {\n return;\n }\n\n const queryCacheStatus: { [key: string]: boolean } = {};\n for (let i = 0; i < data.series.length; i++) {\n const refId = data.series[i].refId;\n if (refId && !queryCacheStatus[refId]) {\n queryCacheStatus[refId] = data.series[i].meta?.isCachedResponse ?? false;\n }\n }\n const totalQueries = Object.keys(queryCacheStatus).length;\n const cachedQueries = Object.values(queryCacheStatus).filter((val) => val === true).length;\n\n const eventData: DataRequestEventPayload = {\n eventName: MetaAnalyticsEventName.DataRequest,\n datasourceName: datasource.name,\n datasourceId: datasource.id,\n datasourceType: datasource.type,\n panelId: data.request.panelId,\n dashboardId: data.request.dashboardId,\n dataSize: 0,\n duration: data.request.endTime! - data.request.startTime,\n totalQueries,\n cachedQueries,\n };\n\n // enrich with dashboard info\n const dashboard = getDashboardSrv().getCurrent();\n if (dashboard) {\n eventData.dashboardId = dashboard.id;\n eventData.dashboardName = dashboard.title;\n eventData.dashboardUid = dashboard.uid;\n eventData.folderName = dashboard.meta.folderTitle;\n }\n\n if (data.series && data.series.length > 0) {\n // estimate size\n eventData.dataSize = data.series.length;\n }\n\n if (data.error) {\n eventData.error = data.error.message;\n }\n\n reportMetaAnalytics(eventData);\n\n // this done check is to make sure we do not double emit events in case\n // there are multiple responses with done state\n done = true;\n };\n}\n","import { css } from '@emotion/css';\nimport classNames from 'classnames';\nimport React, { useState } from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, Spinner, TagList, useTheme2 } from '@grafana/ui';\n\nimport { DashboardSectionItem } from '../types';\n\nimport { getThumbnailURL } from './SearchCard';\n\nexport interface Props {\n className?: string;\n imageHeight: number;\n imageWidth: number;\n item: DashboardSectionItem;\n lastUpdated?: string | null;\n onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\nexport function SearchCardExpanded({ className, imageHeight, imageWidth, item, lastUpdated, onClick }: Props) {\n const theme = useTheme2();\n const [hasImage, setHasImage] = useState(true);\n const imageSrc = getThumbnailURL(item.uid!, theme.isLight);\n const styles = getStyles(theme, imageHeight, imageWidth);\n\n const folderTitle = item.folderTitle || 'General';\n\n return (\n <a className={classNames(className, styles.card)} key={item.uid} href={item.url} onClick={onClick}>\n <div className={styles.imageContainer}>\n {hasImage ? (\n <img\n loading=\"lazy\"\n className={styles.image}\n src={imageSrc}\n onLoad={() => setHasImage(true)}\n onError={() => setHasImage(false)}\n />\n ) : (\n <div className={styles.imagePlaceholder}>\n {item.icon ? (\n <SVG src={item.icon} width={36} height={36} title={item.title} />\n ) : (\n <Icon name=\"apps\" size=\"xl\" />\n )}\n </div>\n )}\n </div>\n <div className={styles.info}>\n <div className={styles.infoHeader}>\n <div className={styles.titleContainer}>\n <div>{item.title}</div>\n <div className={styles.folder}>\n <Icon name={'folder'} />\n {folderTitle}\n </div>\n </div>\n {lastUpdated !== null && (\n <div className={styles.updateContainer}>\n <div>Last updated</div>\n {lastUpdated ? <div className={styles.update}>{lastUpdated}</div> : <Spinner />}\n </div>\n )}\n </div>\n <div>\n <TagList className={styles.tagList} tags={item.tags} />\n </div>\n </div>\n </a>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2, imageHeight: Props['imageHeight'], imageWidth: Props['imageWidth']) => {\n const IMAGE_HORIZONTAL_MARGIN = theme.spacing(4);\n\n return {\n card: css`\n background-color: ${theme.colors.background.secondary};\n border: 1px solid ${theme.colors.border.medium};\n border-radius: 4px;\n box-shadow: ${theme.shadows.z3};\n display: flex;\n flex-direction: column;\n height: 100%;\n max-width: calc(${imageWidth}px + (${IMAGE_HORIZONTAL_MARGIN} * 2))};\n width: 100%;\n `,\n folder: css`\n align-items: center;\n color: ${theme.colors.text.secondary};\n display: flex;\n font-size: ${theme.typography.size.sm};\n gap: ${theme.spacing(0.5)};\n `,\n image: css`\n box-shadow: ${theme.shadows.z2};\n height: ${imageHeight}px;\n margin: ${theme.spacing(1)} calc(${IMAGE_HORIZONTAL_MARGIN} - 1px) 0;\n width: ${imageWidth}px;\n `,\n imageContainer: css`\n flex: 1;\n position: relative;\n\n &:after {\n background: linear-gradient(180deg, rgba(196, 196, 196, 0) 0%, rgba(127, 127, 127, 0.25) 100%);\n bottom: 0;\n content: '';\n left: 0;\n margin: ${theme.spacing(1)} calc(${IMAGE_HORIZONTAL_MARGIN} - 1px) 0;\n position: absolute;\n right: 0;\n top: 0;\n }\n `,\n imagePlaceholder: css`\n align-items: center;\n color: ${theme.colors.text.secondary};\n display: flex;\n height: ${imageHeight}px;\n justify-content: center;\n margin: ${theme.spacing(1)} ${IMAGE_HORIZONTAL_MARGIN} 0;\n width: ${imageWidth}px;\n `,\n info: css`\n background-color: ${theme.colors.background.canvas};\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n display: flex;\n flex-direction: column;\n min-height: ${theme.spacing(7)};\n gap: ${theme.spacing(1)};\n padding: ${theme.spacing(1)} ${theme.spacing(2)};\n z-index: 1;\n `,\n infoHeader: css`\n display: flex;\n gap: ${theme.spacing(1)};\n justify-content: space-between;\n `,\n tagList: css`\n justify-content: flex-start;\n `,\n titleContainer: css`\n display: flex;\n flex-direction: column;\n gap: ${theme.spacing(0.5)};\n `,\n updateContainer: css`\n align-items: flex-end;\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n font-size: ${theme.typography.bodySmall.fontSize};\n gap: ${theme.spacing(0.5)};\n `,\n update: css`\n color: ${theme.colors.text.secondary};\n text-align: right;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { useCallback, useRef, useState } from 'react';\nimport SVG from 'react-inlinesvg';\nimport { usePopper } from 'react-popper';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, Portal, TagList, useTheme2 } from '@grafana/ui';\nimport { backendSrv } from 'app/core/services/backend_srv';\n\nimport { DashboardSectionItem, OnToggleChecked } from '../types';\n\nimport { SearchCardExpanded } from './SearchCardExpanded';\nimport { SearchCheckbox } from './SearchCheckbox';\n\nconst DELAY_BEFORE_EXPANDING = 500;\n\nexport interface Props {\n editable?: boolean;\n item: DashboardSectionItem;\n onTagSelected?: (name: string) => any;\n onToggleChecked?: OnToggleChecked;\n onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\nexport function getThumbnailURL(uid: string, isLight?: boolean) {\n return `/api/dashboards/uid/${uid}/img/thumb/${isLight ? 'light' : 'dark'}`;\n}\n\nexport function SearchCard({ editable, item, onTagSelected, onToggleChecked, onClick }: Props) {\n const [hasImage, setHasImage] = useState(true);\n const [lastUpdated, setLastUpdated] = useState<string | null>(null);\n const [showExpandedView, setShowExpandedView] = useState(false);\n const timeout = useRef<number | null>(null);\n\n // Popper specific logic\n const offsetCallback = useCallback(({ placement, reference, popper }) => {\n let result: [number, number] = [0, 0];\n if (placement === 'bottom' || placement === 'top') {\n result = [0, -(reference.height + popper.height) / 2];\n } else if (placement === 'left' || placement === 'right') {\n result = [-(reference.width + popper.width) / 2, 0];\n }\n return result;\n }, []);\n const [markerElement, setMarkerElement] = React.useState<HTMLDivElement | null>(null);\n const [popperElement, setPopperElement] = React.useState<HTMLDivElement | null>(null);\n const { styles: popperStyles, attributes } = usePopper(markerElement, popperElement, {\n modifiers: [\n {\n name: 'offset',\n options: {\n offset: offsetCallback,\n },\n },\n ],\n });\n\n const theme = useTheme2();\n const imageSrc = getThumbnailURL(item.uid!, theme.isLight);\n const styles = getStyles(\n theme,\n markerElement?.getBoundingClientRect().width,\n popperElement?.getBoundingClientRect().width\n );\n\n const onShowExpandedView = async () => {\n setShowExpandedView(true);\n if (item.uid && !lastUpdated) {\n const dashboard = await backendSrv.getDashboardByUid(item.uid);\n const { updated } = dashboard.meta;\n if (updated) {\n setLastUpdated(new Date(updated).toLocaleString());\n } else {\n setLastUpdated(null);\n }\n }\n };\n\n const onMouseEnter = () => {\n timeout.current = window.setTimeout(onShowExpandedView, DELAY_BEFORE_EXPANDING);\n };\n\n const onMouseMove = () => {\n if (timeout.current) {\n window.clearTimeout(timeout.current);\n }\n timeout.current = window.setTimeout(onShowExpandedView, DELAY_BEFORE_EXPANDING);\n };\n\n const onMouseLeave = () => {\n if (timeout.current) {\n window.clearTimeout(timeout.current);\n }\n setShowExpandedView(false);\n };\n\n const onCheckboxClick = (ev: React.MouseEvent) => {\n ev.stopPropagation();\n ev.preventDefault();\n\n onToggleChecked?.(item);\n };\n\n const onTagClick = (tag: string, ev: React.MouseEvent) => {\n ev.stopPropagation();\n ev.preventDefault();\n\n onTagSelected?.(tag);\n };\n\n return (\n <a\n data-testid={selectors.components.Search.dashboardCard(item.title)}\n className={styles.card}\n key={item.uid}\n href={item.url}\n ref={(ref) => setMarkerElement(ref as unknown as HTMLDivElement)}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseMove={onMouseMove}\n onClick={onClick}\n >\n <div className={styles.imageContainer}>\n <SearchCheckbox\n className={styles.checkbox}\n aria-label={`Select dashboard ${item.title}`}\n editable={editable}\n checked={item.checked}\n onClick={onCheckboxClick}\n />\n {hasImage ? (\n <img loading=\"lazy\" className={styles.image} src={imageSrc} onError={() => setHasImage(false)} />\n ) : (\n <div className={styles.imagePlaceholder}>\n {item.icon ? (\n <SVG src={item.icon} width={36} height={36} title={item.title} />\n ) : (\n <Icon name=\"apps\" size=\"xl\" />\n )}\n </div>\n )}\n </div>\n <div className={styles.info}>\n <div className={styles.title}>{item.title}</div>\n <TagList displayMax={1} tags={item.tags} onClick={onTagClick} />\n </div>\n {showExpandedView && (\n <Portal className={styles.portal}>\n <div ref={setPopperElement} style={popperStyles.popper} {...attributes.popper}>\n <SearchCardExpanded\n className={styles.expandedView}\n imageHeight={240}\n imageWidth={320}\n item={item}\n lastUpdated={lastUpdated}\n onClick={onClick}\n />\n </div>\n </Portal>\n )}\n </a>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2, markerWidth = 0, popperWidth = 0) => {\n const IMAGE_HORIZONTAL_MARGIN = theme.spacing(4);\n\n return {\n card: css`\n background-color: ${theme.colors.background.secondary};\n border: 1px solid ${theme.colors.border.medium};\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n\n &:hover {\n background-color: ${theme.colors.emphasize(theme.colors.background.secondary, 0.03)};\n }\n `,\n checkbox: css`\n left: 0;\n margin: ${theme.spacing(1)};\n position: absolute;\n top: 0;\n `,\n expandedView: css`\n @keyframes expand {\n 0% {\n transform: scale(${markerWidth / popperWidth});\n }\n 100% {\n transform: scale(1);\n }\n }\n\n animation: expand ${theme.transitions.duration.shortest}ms ease-in-out 0s 1 normal;\n background-color: ${theme.colors.emphasize(theme.colors.background.secondary, 0.03)};\n `,\n image: css`\n aspect-ratio: 4 / 3;\n box-shadow: ${theme.shadows.z1};\n margin: ${theme.spacing(1)} ${IMAGE_HORIZONTAL_MARGIN} 0;\n width: calc(100% - (2 * ${IMAGE_HORIZONTAL_MARGIN}));\n `,\n imageContainer: css`\n flex: 1;\n position: relative;\n\n &:after {\n background: linear-gradient(180deg, rgba(196, 196, 196, 0) 0%, rgba(127, 127, 127, 0.25) 100%);\n bottom: 0;\n content: '';\n left: 0;\n margin: ${theme.spacing(1)} ${IMAGE_HORIZONTAL_MARGIN} 0;\n position: absolute;\n right: 0;\n top: 0;\n }\n `,\n imagePlaceholder: css`\n align-items: center;\n aspect-ratio: 4 / 3;\n color: ${theme.colors.text.secondary};\n display: flex;\n justify-content: center;\n margin: ${theme.spacing(1)} ${IMAGE_HORIZONTAL_MARGIN} 0;\n width: calc(100% - (2 * ${IMAGE_HORIZONTAL_MARGIN}));\n `,\n info: css`\n align-items: center;\n background-color: ${theme.colors.background.canvas};\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n display: flex;\n height: ${theme.spacing(7)};\n gap: ${theme.spacing(1)};\n padding: 0 ${theme.spacing(2)};\n z-index: 1;\n `,\n portal: css`\n pointer-events: none;\n `,\n title: css`\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n `,\n };\n};\n","import React, { FC, memo } from 'react';\n\nimport { Checkbox } from '@grafana/ui';\n\ninterface Props {\n checked?: boolean;\n onClick?: React.MouseEventHandler<HTMLInputElement>;\n className?: string;\n editable?: boolean;\n 'aria-label'?: string;\n}\n\nexport const SearchCheckbox: FC<Props> = memo(\n ({ onClick, className, checked = false, editable = false, 'aria-label': ariaLabel }) => {\n return editable ? (\n <div onClick={onClick} className={className}>\n <Checkbox value={checked} aria-label={ariaLabel} />\n </div>\n ) : null;\n }\n);\n\nSearchCheckbox.displayName = 'SearchCheckbox';\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport { Card, Icon, IconName, TagList, useStyles2 } from '@grafana/ui';\n\nimport { SEARCH_ITEM_HEIGHT } from '../constants';\nimport { DashboardSectionItem, OnToggleChecked } from '../types';\n\nimport { SearchCheckbox } from './SearchCheckbox';\n\nexport interface Props {\n item: DashboardSectionItem;\n editable?: boolean;\n onTagSelected: (name: string) => any;\n onToggleChecked?: OnToggleChecked;\n onClickItem?: (event: React.MouseEvent<HTMLElement>) => void;\n}\n\nconst selectors = e2eSelectors.components.Search;\n\nconst getIconFromMeta = (meta = ''): IconName => {\n const metaIconMap = new Map<string, IconName>([\n ['errors', 'info-circle'],\n ['views', 'eye'],\n ]);\n\n return metaIconMap.has(meta) ? metaIconMap.get(meta)! : 'sort-amount-down';\n};\n\n/** @deprecated */\nexport const SearchItem: FC<Props> = ({ item, editable, onToggleChecked, onTagSelected, onClickItem }) => {\n const styles = useStyles2(getStyles);\n const tagSelected = useCallback(\n (tag: string, event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n event.preventDefault();\n onTagSelected(tag);\n },\n [onTagSelected]\n );\n\n const handleCheckboxClick = useCallback(\n (ev: React.MouseEvent) => {\n ev.stopPropagation();\n ev.preventDefault();\n\n if (onToggleChecked) {\n onToggleChecked(item);\n }\n },\n [item, onToggleChecked]\n );\n\n const folderTitle = item.folderTitle || 'General';\n return (\n <Card\n data-testid={selectors.dashboardItem(item.title)}\n href={item.url}\n style={{ minHeight: SEARCH_ITEM_HEIGHT }}\n className={styles.container}\n onClick={onClickItem}\n >\n <Card.Heading>{item.title}</Card.Heading>\n <Card.Figure align={'center'} className={styles.checkbox}>\n <SearchCheckbox\n aria-label=\"Select dashboard\"\n editable={editable}\n checked={item.checked}\n onClick={handleCheckboxClick}\n />\n </Card.Figure>\n <Card.Meta separator={''}>\n <span className={styles.metaContainer}>\n <Icon name={'folder'} aria-hidden />\n {folderTitle}\n </span>\n {item.sortMetaName && (\n <span className={styles.metaContainer}>\n <Icon name={getIconFromMeta(item.sortMetaName)} />\n {item.sortMeta} {item.sortMetaName}\n </span>\n )}\n </Card.Meta>\n <Card.Tags>\n <TagList tags={item.tags} onClick={tagSelected} getAriaLabel={(tag) => `Filter by tag \"${tag}\"`} />\n </Card.Tags>\n </Card>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css`\n margin-bottom: ${theme.spacing(0.75)};\n padding: ${theme.spacing(1)} ${theme.spacing(2)};\n `,\n metaContainer: css`\n display: flex;\n align-items: center;\n margin-right: ${theme.spacing(1)};\n\n svg {\n margin-right: ${theme.spacing(0.5)};\n }\n `,\n checkbox: css`\n margin-right: 0;\n `,\n };\n};\n","export const NO_ID_SECTIONS = ['Recent', 'Starred'];\n// Height of the search result item\nexport const SEARCH_ITEM_HEIGHT = 58;\nexport const SEARCH_ITEM_MARGIN = 8;\nexport const DEFAULT_SORT = { label: 'A\\u2013Z', value: 'alpha-asc' };\nexport const SECTION_STORAGE_KEY = 'search.sections';\nexport const GENERAL_FOLDER_ID = 0;\nexport const GENERAL_FOLDER_UID = 'general';\nexport const GENERAL_FOLDER_TITLE = 'General';\nexport const SEARCH_PANELS_LOCAL_STORAGE_KEY = 'grafana.search.include.panels';\nexport const SEARCH_SELECTED_LAYOUT = 'grafana.search.layout';\n","import { useEffect, useRef, useState } from 'react';\nimport { Observable, Subject } from 'rxjs';\n\nimport { Field, locationUtil } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\n\nimport { QueryResponse } from '../service';\n\nexport function useKeyNavigationListener() {\n const eventsRef = useRef(new Subject<React.KeyboardEvent>());\n return {\n keyboardEvents: eventsRef.current,\n onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.code) {\n case 'ArrowDown':\n case 'ArrowUp':\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'Enter':\n eventsRef.current.next(e);\n default:\n // ignore\n }\n },\n };\n}\n\ninterface ItemSelection {\n x: number;\n y: number;\n}\n\nexport function useSearchKeyboardNavigation(\n keyboardEvents: Observable<React.KeyboardEvent>,\n numColumns: number,\n response: QueryResponse\n): ItemSelection {\n const highlightIndexRef = useRef<ItemSelection>({ x: 0, y: -1 });\n const [highlightIndex, setHighlightIndex] = useState<ItemSelection>({ x: 0, y: -1 });\n const urlsRef = useRef<Field>();\n\n // Clear selection when the search results change\n useEffect(() => {\n urlsRef.current = response.view.fields.url;\n highlightIndexRef.current.x = 0;\n highlightIndexRef.current.y = -1;\n setHighlightIndex({ ...highlightIndexRef.current });\n }, [response]);\n\n useEffect(() => {\n const sub = keyboardEvents.subscribe({\n next: (keyEvent) => {\n switch (keyEvent?.code) {\n case 'ArrowDown': {\n highlightIndexRef.current.y++;\n setHighlightIndex({ ...highlightIndexRef.current });\n break;\n }\n case 'ArrowUp':\n highlightIndexRef.current.y = Math.max(0, highlightIndexRef.current.y - 1);\n setHighlightIndex({ ...highlightIndexRef.current });\n break;\n case 'ArrowRight': {\n if (numColumns > 0) {\n highlightIndexRef.current.x = Math.min(numColumns, highlightIndexRef.current.x + 1);\n setHighlightIndex({ ...highlightIndexRef.current });\n }\n break;\n }\n case 'ArrowLeft': {\n if (numColumns > 0) {\n highlightIndexRef.current.x = Math.max(0, highlightIndexRef.current.x - 1);\n setHighlightIndex({ ...highlightIndexRef.current });\n }\n break;\n }\n case 'Enter':\n if (!urlsRef.current) {\n break;\n }\n const idx = highlightIndexRef.current.x * numColumns + highlightIndexRef.current.y;\n if (idx < 0) {\n highlightIndexRef.current.x = 0;\n highlightIndexRef.current.y = 0;\n setHighlightIndex({ ...highlightIndexRef.current });\n break;\n }\n const url = urlsRef.current.values?.get(idx) as string;\n if (url) {\n locationService.push(locationUtil.stripBaseFromUrl(url));\n }\n }\n },\n });\n\n return () => sub.unsubscribe();\n }, [keyboardEvents, numColumns]);\n\n return highlightIndex;\n}\n","import { debounce } from 'lodash';\nimport { FormEvent, useCallback, useReducer } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\n\nimport { SEARCH_SELECTED_LAYOUT } from '../constants';\nimport {\n ADD_TAG,\n CLEAR_FILTERS,\n LAYOUT_CHANGE,\n QUERY_CHANGE,\n SET_TAGS,\n TOGGLE_SORT,\n TOGGLE_STARRED,\n DATASOURCE_CHANGE,\n} from '../reducers/actionTypes';\nimport { defaultQuery, defaultQueryParams, queryReducer } from '../reducers/searchQueryReducer';\nimport { DashboardQuery, SearchLayout } from '../types';\nimport { hasFilters, parseRouteParams } from '../utils';\n\nconst updateLocation = debounce((query) => locationService.partial(query, true), 300);\n\nexport const useSearchQuery = (defaults: Partial<DashboardQuery>) => {\n const queryParams = parseRouteParams(locationService.getSearchObject());\n const initialState = { ...defaultQuery, ...defaults, ...queryParams };\n const selectedLayout = localStorage.getItem(SEARCH_SELECTED_LAYOUT) as SearchLayout;\n if (!queryParams.layout?.length && selectedLayout?.length) {\n initialState.layout = selectedLayout;\n }\n const [query, dispatch] = useReducer(queryReducer, initialState);\n\n const onQueryChange = useCallback((query: string) => {\n dispatch({ type: QUERY_CHANGE, payload: query });\n updateLocation({ query });\n }, []);\n\n const onTagFilterChange = useCallback((tags: string[]) => {\n dispatch({ type: SET_TAGS, payload: tags });\n updateLocation({ tag: tags });\n }, []);\n\n const onDatasourceChange = useCallback((datasource?: string) => {\n dispatch({ type: DATASOURCE_CHANGE, payload: datasource });\n updateLocation({ datasource });\n }, []);\n\n const onTagAdd = useCallback(\n (tag: string) => {\n dispatch({ type: ADD_TAG, payload: tag });\n updateLocation({ tag: [...query.tag, tag] });\n },\n [query.tag]\n );\n\n const onClearFilters = useCallback(() => {\n dispatch({ type: CLEAR_FILTERS });\n updateLocation(defaultQueryParams);\n }, []);\n\n const onStarredFilterChange = useCallback((e: FormEvent<HTMLInputElement>) => {\n const starred = (e.target as HTMLInputElement).checked;\n dispatch({ type: TOGGLE_STARRED, payload: starred });\n updateLocation({ starred: starred || null });\n }, []);\n\n const onClearStarred = useCallback(() => {\n dispatch({ type: TOGGLE_STARRED, payload: false });\n updateLocation({ starred: null });\n }, []);\n\n const onSortChange = useCallback((sort: SelectableValue | null) => {\n dispatch({ type: TOGGLE_SORT, payload: sort });\n updateLocation({ sort: sort?.value, layout: SearchLayout.List });\n }, []);\n\n const onLayoutChange = useCallback((layout: SearchLayout) => {\n dispatch({ type: LAYOUT_CHANGE, payload: layout });\n if (layout === SearchLayout.Folders) {\n updateLocation({ layout, sort: null });\n return;\n }\n updateLocation({ layout });\n }, []);\n\n return {\n query,\n hasFilters: hasFilters(query),\n onQueryChange,\n onClearFilters,\n onTagFilterChange,\n onStarredFilterChange,\n onClearStarred,\n onTagAdd,\n onSortChange,\n onLayoutChange,\n onDatasourceChange,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\nimport { useDebounce, useLocalStorage } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { IconButton, stylesFactory, useStyles2 } from '@grafana/ui';\n\nimport { SEARCH_PANELS_LOCAL_STORAGE_KEY } from '../constants';\nimport { useKeyNavigationListener } from '../hooks/useSearchKeyboardSelection';\nimport { useSearchQuery } from '../hooks/useSearchQuery';\nimport { SearchView } from '../page/components/SearchView';\n\nexport interface Props {\n onCloseSearch: () => void;\n}\n\nexport function DashboardSearch({ onCloseSearch }: Props) {\n const styles = useStyles2(getStyles);\n const { query, onQueryChange } = useSearchQuery({});\n\n let [includePanels, setIncludePanels] = useLocalStorage<boolean>(SEARCH_PANELS_LOCAL_STORAGE_KEY, true);\n if (!config.featureToggles.panelTitleSearch) {\n includePanels = false;\n }\n\n const [inputValue, setInputValue] = useState(query.query ?? '');\n const onSearchQueryChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue(e.currentTarget.value);\n };\n\n useDebounce(() => onQueryChange(inputValue), 200, [inputValue]);\n\n const { onKeyDown, keyboardEvents } = useKeyNavigationListener();\n\n return (\n <div tabIndex={0} className={styles.overlay}>\n <div className={styles.container}>\n <div className={styles.searchField}>\n <div>\n <input\n type=\"text\"\n placeholder={includePanels ? 'Search dashboards and panels by name' : 'Search dashboards by name'}\n value={inputValue}\n onChange={onSearchQueryChange}\n onKeyDown={onKeyDown}\n tabIndex={0}\n spellCheck={false}\n className={styles.input}\n autoFocus\n />\n </div>\n\n <div className={styles.closeBtn}>\n <IconButton name=\"times\" onClick={onCloseSearch} size=\"xxl\" tooltip=\"Close search\" />\n </div>\n </div>\n <div className={styles.search}>\n <SearchView\n onQueryTextChange={(newQueryText) => {\n setInputValue(newQueryText);\n }}\n showManage={false}\n queryText={query.query}\n includePanels={includePanels!}\n setIncludePanels={setIncludePanels}\n keyboardEvents={keyboardEvents}\n />\n </div>\n </div>\n </div>\n );\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n overlay: css`\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: ${theme.zIndex.sidemenu};\n position: fixed;\n background: ${theme.colors.background.canvas};\n padding: ${theme.spacing(1)};\n\n ${theme.breakpoints.up('md')} {\n left: ${theme.components.sidemenu.width}px;\n z-index: ${theme.zIndex.navbarFixed + 1};\n padding: ${theme.spacing(2)};\n }\n `,\n container: css`\n display: flex;\n flex-direction: column;\n max-width: 1400px;\n margin: 0 auto;\n padding: ${theme.spacing(1)};\n background: ${theme.colors.background.primary};\n border: 1px solid ${theme.components.panel.borderColor};\n height: 100%;\n\n ${theme.breakpoints.up('md')} {\n padding: ${theme.spacing(3)};\n }\n `,\n closeBtn: css`\n right: -5px;\n top: 2px;\n z-index: 1;\n position: absolute;\n `,\n searchField: css`\n position: relative;\n `,\n search: css`\n display: flex;\n flex-direction: column;\n overflow: hidden;\n height: 100%;\n padding: ${theme.spacing(2, 0, 3, 0)};\n `,\n input: css`\n box-sizing: border-box;\n outline: none;\n background-color: transparent;\n background: transparent;\n border-bottom: 2px solid ${theme.v1.colors.border1};\n font-size: 20px;\n line-height: 38px;\n width: 100%;\n\n &::placeholder {\n color: ${theme.v1.colors.textWeak};\n }\n `,\n };\n});\n","import React, { FC, memo } from 'react';\n\nimport { useUrlParams } from 'app/core/navigation/hooks';\n\nimport { defaultQueryParams } from '../reducers/searchQueryReducer';\n\nimport { DashboardSearch } from './DashboardSearch';\n\nexport const SearchWrapper: FC = memo(() => {\n const [params, updateUrlParams] = useUrlParams();\n const isOpen = params.get('search') === 'open';\n\n const closeSearch = () => {\n if (isOpen) {\n updateUrlParams({ search: null, folder: null, ...defaultQueryParams });\n }\n };\n\n return isOpen ? <DashboardSearch onCloseSearch={closeSearch} /> : null;\n});\n\nSearchWrapper.displayName = 'SearchWrapper';\n","import React, { useState } from 'react';\n\nimport { DataFrame } from '@grafana/data';\nimport { CodeEditor, Modal, ModalTabsHeader, TabContent } from '@grafana/ui';\nimport { DataHoverView } from 'app/plugins/panel/geomap/components/DataHoverView';\n\nexport interface Props {\n name: string;\n explain: {};\n frame: DataFrame;\n row: number;\n}\n\nconst tabs = [\n { label: 'Score', value: 'score' },\n { label: 'Fields', value: 'fields' },\n { label: 'Allowed actions', value: 'allowed_actions' },\n];\n\nexport function ExplainScorePopup({ name, explain, frame, row }: Props) {\n const [isOpen, setOpen] = useState<boolean>(true);\n const [activeTab, setActiveTab] = useState('score');\n\n const modalHeader = (\n <ModalTabsHeader\n title={name}\n icon={'info'}\n tabs={tabs}\n activeTab={activeTab}\n onChangeTab={(t) => {\n setActiveTab(t.value);\n }}\n />\n );\n\n return (\n <Modal title={modalHeader} isOpen={isOpen} onDismiss={() => setOpen(false)} closeOnBackdropClick closeOnEscape>\n <TabContent>\n {activeTab === tabs[0].value && (\n <CodeEditor\n width=\"100%\"\n height=\"70vh\"\n language=\"json\"\n showLineNumbers={false}\n showMiniMap={true}\n value={JSON.stringify(explain, null, 2)}\n readOnly={false}\n />\n )}\n {activeTab === tabs[1].value && (\n <div>\n <DataHoverView data={frame} rowIndex={row} />\n </div>\n )}\n {activeTab === tabs[2].value && (\n <CodeEditor\n width=\"100%\"\n height=\"70vh\"\n language=\"json\"\n showLineNumbers={false}\n showMiniMap={false}\n value={(() => {\n const allowedActions = frame.fields.find((f) => f.name === 'allowed_actions')?.values?.get(row);\n const dsUids = frame.fields.find((f) => f.name === 'ds_uid')?.values?.get(row);\n return JSON.stringify({ dsUids: dsUids ?? [], allowedActions: allowedActions ?? [] }, null, 2);\n })()}\n readOnly={false}\n />\n )}\n </TabContent>\n </Modal>\n );\n}\n","import { cx } from '@emotion/css';\nimport React from 'react';\nimport SVG from 'react-inlinesvg';\n\nimport {\n DisplayProcessor,\n Field,\n FieldType,\n formattedValueToString,\n getDisplayProcessor,\n getFieldDisplayName,\n} from '@grafana/data';\nimport { config, getDataSourceSrv } from '@grafana/runtime';\nimport { Checkbox, Icon, IconButton, IconName, TagList } from '@grafana/ui';\nimport appEvents from 'app/core/app_events';\nimport { PluginIconName } from 'app/features/plugins/admin/types';\nimport { ShowModalReactEvent } from 'app/types/events';\n\nimport { QueryResponse, SearchResultMeta } from '../../service';\nimport { SelectionChecker, SelectionToggle } from '../selection';\n\nimport { ExplainScorePopup } from './ExplainScorePopup';\nimport { TableColumn } from './SearchResultsTable';\n\nconst TYPE_COLUMN_WIDTH = 175;\nconst DATASOURCE_COLUMN_WIDTH = 200;\n\nexport const generateColumns = (\n response: QueryResponse,\n availableWidth: number,\n selection: SelectionChecker | undefined,\n selectionToggle: SelectionToggle | undefined,\n clearSelection: () => void,\n styles: { [key: string]: string },\n onTagSelected: (tag: string) => void,\n onDatasourceChange?: (datasource?: string) => void,\n showingEverything?: boolean\n): TableColumn[] => {\n const columns: TableColumn[] = [];\n const access = response.view.fields;\n const uidField = access.uid;\n const kindField = access.kind;\n let sortFieldWith = 0;\n const sortField = (access as any)[response.view.dataFrame.meta?.custom?.sortBy] as Field;\n if (sortField) {\n sortFieldWith = 175;\n if (sortField.type === FieldType.time) {\n sortFieldWith += 25;\n }\n availableWidth -= sortFieldWith; // pre-allocate the space for the last column\n }\n\n if (access.explain && access.score) {\n availableWidth -= 100; // pre-allocate the space for the last column\n }\n\n let width = 50;\n if (selection && selectionToggle) {\n width = 30;\n columns.push({\n id: `column-checkbox`,\n width,\n Header: () => {\n if (selection('*', '*')) {\n return (\n <div className={styles.checkboxHeader}>\n <IconButton name={'check-square' as any} onClick={clearSelection} />\n </div>\n );\n }\n return (\n <div className={styles.checkboxHeader}>\n <Checkbox\n checked={false}\n onChange={(e) => {\n e.stopPropagation();\n e.preventDefault();\n const { view } = response;\n const count = Math.min(view.length, 50);\n for (let i = 0; i < count; i++) {\n const item = view.get(i);\n if (item.uid && item.kind) {\n if (!selection(item.kind, item.uid)) {\n selectionToggle(item.kind, item.uid);\n }\n }\n }\n }}\n />\n </div>\n );\n },\n Cell: (p) => {\n const uid = uidField.values.get(p.row.index);\n const kind = kindField ? kindField.values.get(p.row.index) : 'dashboard'; // HACK for now\n const selected = selection(kind, uid);\n const hasUID = uid != null; // Panels don't have UID! Likely should not be shown on pages with manage options\n return (\n <div {...p.cellProps}>\n <div className={styles.checkbox}>\n <Checkbox\n disabled={!hasUID}\n value={selected && hasUID}\n onChange={(e) => {\n selectionToggle(kind, uid);\n }}\n />\n </div>\n </div>\n );\n },\n field: uidField,\n });\n availableWidth -= width;\n }\n\n // Name column\n width = Math.max(availableWidth * 0.2, 300);\n columns.push({\n Cell: (p) => {\n let classNames = cx(styles.nameCellStyle);\n let name = access.name.values.get(p.row.index);\n if (!name?.length) {\n const loading = p.row.index >= response.view.dataFrame.length;\n name = loading ? 'Loading...' : 'Missing title'; // normal for panels\n classNames += ' ' + styles.missingTitleText;\n }\n return (\n <a {...p.cellProps} href={p.userProps.href} onClick={p.userProps.onClick} className={classNames} title={name}>\n {name}\n </a>\n );\n },\n id: `column-name`,\n field: access.name!,\n Header: () => {\n return <div className={styles.headerNameStyle}>Name</div>;\n },\n width,\n });\n availableWidth -= width;\n\n width = TYPE_COLUMN_WIDTH;\n columns.push(makeTypeColumn(access.kind, access.panel_type, width, styles));\n availableWidth -= width;\n\n // Show datasources if we have any\n if (access.ds_uid && onDatasourceChange) {\n width = Math.min(availableWidth / 2.5, DATASOURCE_COLUMN_WIDTH);\n columns.push(\n makeDataSourceColumn(\n access.ds_uid,\n width,\n styles.typeIcon,\n styles.datasourceItem,\n styles.invalidDatasourceItem,\n onDatasourceChange\n )\n );\n availableWidth -= width;\n }\n\n const showTags = !showingEverything || hasValue(response.view.fields.tags);\n const meta = response.view.dataFrame.meta?.custom as SearchResultMeta;\n if (meta?.locationInfo && availableWidth > 0) {\n width = showTags ? Math.max(availableWidth / 1.75, 300) : availableWidth;\n availableWidth -= width;\n columns.push({\n Cell: (p) => {\n const parts = (access.location?.values.get(p.row.index) ?? '').split('/');\n return (\n <div {...p.cellProps} className={cx(styles.locationCellStyle)}>\n {parts.map((p) => {\n const info = meta.locationInfo[p];\n return info ? (\n <a key={p} href={info.url} className={styles.locationItem}>\n <Icon name={getIconForKind(info.kind)} /> {info.name}\n </a>\n ) : (\n <span key={p}>{p}</span>\n );\n })}\n </div>\n );\n },\n id: `column-location`,\n field: access.location ?? access.url,\n Header: 'Location',\n width,\n });\n }\n\n if (availableWidth > 0 && showTags) {\n columns.push(makeTagsColumn(access.tags, availableWidth, styles.tagList, onTagSelected));\n }\n\n if (sortField && sortFieldWith) {\n const disp = sortField.display ?? getDisplayProcessor({ field: sortField, theme: config.theme2 });\n\n columns.push({\n Header: () => <div className={styles.sortedHeader}>{getFieldDisplayName(sortField)}</div>,\n Cell: (p) => {\n return (\n <div {...p.cellProps} className={styles.sortedItems}>\n {getDisplayValue({\n sortField,\n getDisplay: disp,\n index: p.row.index,\n kind: access.kind,\n })}\n </div>\n );\n },\n id: `column-sort-field`,\n field: sortField,\n width: sortFieldWith,\n });\n }\n\n if (access.explain && access.score) {\n const vals = access.score.values;\n const showExplainPopup = (row: number) => {\n appEvents.publish(\n new ShowModalReactEvent({\n component: ExplainScorePopup,\n props: {\n name: access.name.values.get(row),\n explain: access.explain.values.get(row),\n frame: response.view.dataFrame,\n row: row,\n },\n })\n );\n };\n\n columns.push({\n Header: () => <div className={styles.sortedHeader}>Score</div>,\n Cell: (p) => {\n return (\n <div {...p.cellProps} className={styles.explainItem} onClick={() => showExplainPopup(p.row.index)}>\n {vals.get(p.row.index)}\n </div>\n );\n },\n id: `column-score-field`,\n field: access.score,\n width: 100,\n });\n }\n\n return columns;\n};\n\nfunction getIconForKind(v: string): IconName {\n if (v === 'dashboard') {\n return 'apps';\n }\n if (v === 'folder') {\n return 'folder';\n }\n return 'question-circle';\n}\n\nfunction hasValue(f: Field): boolean {\n for (let i = 0; i < f.values.length; i++) {\n if (f.values.get(i) != null) {\n return true;\n }\n }\n return false;\n}\n\nfunction makeDataSourceColumn(\n field: Field<string[]>,\n width: number,\n iconClass: string,\n datasourceItemClass: string,\n invalidDatasourceItemClass: string,\n onDatasourceChange: (datasource?: string) => void\n): TableColumn {\n const srv = getDataSourceSrv();\n return {\n id: `column-datasource`,\n field,\n Header: 'Data source',\n Cell: (p) => {\n const dslist = field.values.get(p.row.index);\n if (!dslist?.length) {\n return null;\n }\n return (\n <div {...p.cellProps} className={cx(datasourceItemClass)}>\n {dslist.map((v, i) => {\n const settings = srv.getInstanceSettings(v);\n const icon = settings?.meta?.info?.logos?.small;\n if (icon) {\n return (\n <span\n key={i}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onDatasourceChange(settings.uid);\n }}\n >\n <img src={icon} width={14} height={14} title={settings.type} className={iconClass} />\n {settings.name}\n </span>\n );\n }\n return (\n <span className={invalidDatasourceItemClass} key={i}>\n {v}\n </span>\n );\n })}\n </div>\n );\n },\n width,\n };\n}\n\nfunction makeTypeColumn(\n kindField: Field<string>,\n typeField: Field<string>,\n width: number,\n styles: Record<string, string>\n): TableColumn {\n return {\n id: `column-type`,\n field: kindField ?? typeField,\n Header: 'Type',\n Cell: (p) => {\n const i = p.row.index;\n const kind = kindField?.values.get(i) ?? 'dashboard';\n let icon = 'public/img/icons/unicons/apps.svg';\n let txt = 'Dashboard';\n if (kind) {\n txt = kind;\n switch (txt) {\n case 'dashboard':\n txt = 'Dashboard';\n break;\n\n case 'folder':\n icon = 'public/img/icons/unicons/folder.svg';\n txt = 'Folder';\n break;\n\n case 'panel':\n icon = `public/img/icons/unicons/${PluginIconName.panel}.svg`;\n const type = typeField.values.get(i);\n if (type) {\n txt = type;\n const info = config.panels[txt];\n if (info?.name) {\n txt = info.name;\n } else {\n switch (type) {\n case 'row':\n txt = 'Row';\n icon = `public/img/icons/unicons/bars.svg`;\n break;\n case 'singlestat': // auto-migration\n txt = 'Singlestat';\n break;\n default:\n icon = `public/img/icons/unicons/question.svg`; // plugin not found\n }\n }\n }\n break;\n }\n }\n return (\n <div {...p.cellProps} className={styles.typeText}>\n <SVG src={icon} width={14} height={14} title={txt} className={styles.typeIcon} />\n {txt}\n </div>\n );\n },\n width,\n };\n}\n\nfunction makeTagsColumn(\n field: Field<string[]>,\n width: number,\n tagListClass: string,\n onTagSelected: (tag: string) => void\n): TableColumn {\n return {\n Cell: (p) => {\n const tags = field.values.get(p.row.index);\n return tags ? (\n <div {...p.cellProps}>\n <TagList className={tagListClass} tags={tags} onClick={onTagSelected} />\n </div>\n ) : null;\n },\n id: `column-tags`,\n field: field,\n Header: 'Tags',\n width,\n };\n}\n\nfunction getDisplayValue({\n kind,\n sortField,\n index,\n getDisplay,\n}: {\n kind: Field;\n sortField: Field;\n index: number;\n getDisplay: DisplayProcessor;\n}) {\n const value = sortField.values.get(index);\n if (['folder', 'panel'].includes(kind.values.get(index)) && value === 0) {\n return '-';\n }\n return formattedValueToString(getDisplay(value));\n}\n","/* eslint-disable react/jsx-no-undef */\nimport { css } from '@emotion/css';\nimport React, { useEffect, useMemo, useRef, useCallback, useState } from 'react';\nimport { useTable, Column, TableOptions, Cell, useAbsoluteLayout } from 'react-table';\nimport { FixedSizeList } from 'react-window';\nimport InfiniteLoader from 'react-window-infinite-loader';\nimport { Observable } from 'rxjs';\n\nimport { Field, GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { TableCell } from '@grafana/ui/src/components/Table/TableCell';\nimport { getTableStyles } from '@grafana/ui/src/components/Table/styles';\n\nimport { useSearchKeyboardNavigation } from '../../hooks/useSearchKeyboardSelection';\nimport { QueryResponse } from '../../service';\nimport { SelectionChecker, SelectionToggle } from '../selection';\n\nimport { generateColumns } from './columns';\n\nexport type SearchResultsProps = {\n response: QueryResponse;\n width: number;\n height: number;\n selection?: SelectionChecker;\n selectionToggle?: SelectionToggle;\n clearSelection: () => void;\n onTagSelected: (tag: string) => void;\n onDatasourceChange?: (datasource?: string) => void;\n onClickItem?: (event: React.MouseEvent<HTMLElement>) => void;\n keyboardEvents: Observable<React.KeyboardEvent>;\n};\n\nexport type TableColumn = Column & {\n field?: Field;\n};\n\nconst HEADER_HEIGHT = 36; // pixels\n\nexport const SearchResultsTable = React.memo(\n ({\n response,\n width,\n height,\n selection,\n selectionToggle,\n clearSelection,\n onTagSelected,\n onDatasourceChange,\n onClickItem,\n keyboardEvents,\n }: SearchResultsProps) => {\n const styles = useStyles2(getStyles);\n const columnStyles = useStyles2(getColumnStyles);\n const tableStyles = useStyles2(getTableStyles);\n const infiniteLoaderRef = useRef<InfiniteLoader>(null);\n const [listEl, setListEl] = useState<FixedSizeList | null>(null);\n const highlightIndex = useSearchKeyboardNavigation(keyboardEvents, 0, response);\n\n const memoizedData = useMemo(() => {\n if (!response?.view?.dataFrame.fields.length) {\n return [];\n }\n\n // as we only use this to fake the length of our data set for react-table we need to make sure we always return an array\n // filled with values at each index otherwise we'll end up trying to call accessRow for null|undefined value in\n // https://github.com/tannerlinsley/react-table/blob/7be2fc9d8b5e223fc998af88865ae86a88792fdb/src/hooks/useTable.js#L585\n return Array(response.totalRows).fill(0);\n }, [response]);\n\n // Scroll to the top and clear loader cache when the query results change\n useEffect(() => {\n if (infiniteLoaderRef.current) {\n infiniteLoaderRef.current.resetloadMoreItemsCache();\n }\n if (listEl) {\n listEl.scrollTo(0);\n }\n }, [memoizedData, listEl]);\n\n // React-table column definitions\n const memoizedColumns = useMemo(() => {\n return generateColumns(\n response,\n width,\n selection,\n selectionToggle,\n clearSelection,\n columnStyles,\n onTagSelected,\n onDatasourceChange,\n response.view?.length >= response.totalRows\n );\n }, [response, width, columnStyles, selection, selectionToggle, clearSelection, onTagSelected, onDatasourceChange]);\n\n const options: TableOptions<{}> = useMemo(\n () => ({\n columns: memoizedColumns,\n data: memoizedData,\n }),\n [memoizedColumns, memoizedData]\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } = useTable(options, useAbsoluteLayout);\n\n const RenderRow = useCallback(\n ({ index: rowIndex, style }) => {\n const row = rows[rowIndex];\n prepareRow(row);\n\n const url = response.view.fields.url?.values.get(rowIndex);\n let className = styles.rowContainer;\n if (rowIndex === highlightIndex.y) {\n className += ' ' + styles.selectedRow;\n }\n\n return (\n <div {...row.getRowProps({ style })} className={className}>\n {row.cells.map((cell: Cell, index: number) => {\n return (\n <TableCell\n key={index}\n tableStyles={tableStyles}\n cell={cell}\n columnIndex={index}\n columnCount={row.cells.length}\n userProps={{ href: url, onClick: onClickItem }}\n />\n );\n })}\n </div>\n );\n },\n [rows, prepareRow, response.view.fields.url?.values, highlightIndex, styles, tableStyles, onClickItem]\n );\n\n if (!rows.length) {\n return <div className={styles.noData}>No data</div>;\n }\n\n return (\n <div {...getTableProps()} aria-label=\"Search results table\" role=\"table\">\n <div>\n {headerGroups.map((headerGroup) => {\n const { key, ...headerGroupProps } = headerGroup.getHeaderGroupProps();\n\n return (\n <div key={key} {...headerGroupProps} className={styles.headerRow}>\n {headerGroup.headers.map((column) => {\n const { key, ...headerProps } = column.getHeaderProps();\n return (\n <div key={key} {...headerProps} role=\"columnheader\" className={styles.headerCell}>\n {column.render('Header')}\n </div>\n );\n })}\n </div>\n );\n })}\n </div>\n\n <div {...getTableBodyProps()}>\n <InfiniteLoader\n ref={infiniteLoaderRef}\n isItemLoaded={response.isItemLoaded}\n itemCount={rows.length}\n loadMoreItems={response.loadMoreItems}\n >\n {({ onItemsRendered, ref }) => (\n <FixedSizeList\n ref={(innerRef) => {\n ref(innerRef);\n setListEl(innerRef);\n }}\n onItemsRendered={onItemsRendered}\n height={height - HEADER_HEIGHT}\n itemCount={rows.length}\n itemSize={tableStyles.rowHeight}\n width=\"100%\"\n style={{ overflow: 'hidden auto' }}\n >\n {RenderRow}\n </FixedSizeList>\n )}\n </InfiniteLoader>\n </div>\n </div>\n );\n }\n);\nSearchResultsTable.displayName = 'SearchResultsTable';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const rowHoverBg = theme.colors.emphasize(theme.colors.background.primary, 0.03);\n\n return {\n noData: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n headerCell: css`\n padding: ${theme.spacing(1)};\n `,\n headerRow: css`\n background-color: ${theme.colors.background.secondary};\n height: ${HEADER_HEIGHT}px;\n align-items: center;\n `,\n selectedRow: css`\n background-color: ${rowHoverBg};\n box-shadow: inset 3px 0px ${theme.colors.primary.border};\n `,\n rowContainer: css`\n label: row;\n &:hover {\n background-color: ${rowHoverBg};\n }\n\n &:not(:hover) div[role='cell'] {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n `,\n };\n};\n\n// CSS for columns from react table\nconst getColumnStyles = (theme: GrafanaTheme2) => {\n return {\n nameCellStyle: css`\n border-right: none;\n padding: ${theme.spacing(1)} ${theme.spacing(1)} ${theme.spacing(1)} ${theme.spacing(2)};\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: text;\n white-space: nowrap;\n &:hover {\n box-shadow: none;\n }\n `,\n headerNameStyle: css`\n padding-left: ${theme.spacing(1)};\n `,\n\n typeIcon: css`\n margin-left: 5px;\n margin-right: 9.5px;\n vertical-align: middle;\n display: inline-block;\n margin-bottom: ${theme.v1.spacing.xxs};\n fill: ${theme.colors.text.secondary};\n `,\n datasourceItem: css`\n span {\n &:hover {\n color: ${theme.colors.text.link};\n }\n }\n `,\n missingTitleText: css`\n color: ${theme.colors.text.disabled};\n font-style: italic;\n `,\n invalidDatasourceItem: css`\n color: ${theme.colors.error.main};\n text-decoration: line-through;\n `,\n typeText: css`\n color: ${theme.colors.text.secondary};\n padding-top: ${theme.spacing(1)};\n `,\n locationItem: css`\n color: ${theme.colors.text.secondary};\n margin-right: 12px;\n `,\n sortedHeader: css`\n text-align: right;\n padding-right: ${theme.spacing(2)};\n `,\n sortedItems: css`\n text-align: right;\n padding: ${theme.spacing(1)} ${theme.spacing(3)} ${theme.spacing(1)} ${theme.spacing(1)};\n `,\n explainItem: css`\n text-align: right;\n padding: ${theme.spacing(1)} ${theme.spacing(3)} ${theme.spacing(1)} ${theme.spacing(1)};\n cursor: pointer;\n `,\n locationCellStyle: css`\n padding-top: ${theme.spacing(1)};\n padding-right: ${theme.spacing(1)};\n `,\n checkboxHeader: css`\n margin-left: 2px;\n `,\n checkbox: css`\n margin-left: 10px;\n margin-right: 10px;\n margin-top: 5px;\n `,\n tagList: css`\n padding-top: ${theme.spacing(0.5)};\n justify-content: flex-start;\n flex-wrap: nowrap;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { config } from '@grafana/runtime/src';\nimport { Alert, useStyles2 } from '@grafana/ui';\n\nexport interface Props {\n showPreviews?: boolean;\n /** On click handler for alert button, mostly used for dismissing the alert */\n onRemove?: (event: React.MouseEvent) => void;\n topSpacing?: number;\n bottomSpacing?: number;\n}\n\nconst MessageLink = ({ text }: { text: string }) => (\n <a\n href=\"https://grafana.com/grafana/plugins/grafana-image-renderer\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"external-link\"\n >\n {text}\n </a>\n);\n\nconst Message = ({ requiredImageRendererPluginVersion }: { requiredImageRendererPluginVersion?: string }) => {\n if (requiredImageRendererPluginVersion) {\n return (\n <>\n You must update the <MessageLink text=\"Grafana image renderer plugin\" /> to version{' '}\n {requiredImageRendererPluginVersion} to enable dashboard previews. Please contact your Grafana administrator to\n update the plugin.\n </>\n );\n }\n\n return (\n <>\n You must install the <MessageLink text=\"Grafana image renderer plugin\" /> to enable dashboard previews. Please\n contact your Grafana administrator to install the plugin.\n </>\n );\n};\n\nexport const PreviewsSystemRequirements = ({ showPreviews, onRemove, topSpacing, bottomSpacing }: Props) => {\n const styles = useStyles2(getStyles);\n\n const previewsEnabled = config.featureToggles.dashboardPreviews;\n const rendererAvailable = config.rendererAvailable;\n\n const {\n systemRequirements: { met: systemRequirementsMet, requiredImageRendererPluginVersion },\n thumbnailsExist,\n } = config.dashboardPreviews;\n\n const arePreviewsEnabled = previewsEnabled && showPreviews;\n const areRequirementsMet = (rendererAvailable && systemRequirementsMet) || thumbnailsExist;\n const shouldDisplayRequirements = arePreviewsEnabled && !areRequirementsMet;\n\n const title = requiredImageRendererPluginVersion\n ? 'Image renderer plugin needs to be updated'\n : 'Image renderer plugin not installed';\n\n return (\n <>\n {shouldDisplayRequirements && (\n <div className={styles.wrapper}>\n <Alert\n className={styles.alert}\n topSpacing={topSpacing}\n bottomSpacing={bottomSpacing}\n severity=\"info\"\n title={title}\n onRemove={onRemove}\n >\n <Message requiredImageRendererPluginVersion={requiredImageRendererPluginVersion} />\n </Alert>\n </div>\n )}\n </>\n );\n};\n\nconst getStyles = () => {\n return {\n wrapper: css`\n display: flex;\n justify-content: center;\n `,\n alert: css`\n max-width: 800px;\n `,\n };\n};\n","import { config, reportInteraction } from '@grafana/runtime';\n\nimport { SearchLayout } from '../types';\n\ninterface QueryProps {\n layout: SearchLayout;\n starred: boolean;\n sortValue: string;\n query: string;\n tagCount: number;\n includePanels: boolean;\n}\n\ntype DashboardListType = 'manage_dashboards' | 'dashboard_search';\n\nexport const reportDashboardListViewed = (dashboardListType: DashboardListType, query: QueryProps) => {\n reportInteraction(`${dashboardListType}_viewed`, getQuerySearchContext(query));\n};\n\nexport const reportSearchResultInteraction = (dashboardListType: DashboardListType, query: QueryProps) => {\n reportInteraction(`${dashboardListType}_result_clicked`, getQuerySearchContext(query));\n};\n\nexport const reportSearchQueryInteraction = (dashboardListType: DashboardListType, query: QueryProps) => {\n reportInteraction(`${dashboardListType}_query_submitted`, getQuerySearchContext(query));\n};\n\nexport const reportSearchFailedQueryInteraction = (\n dashboardListType: DashboardListType,\n { error, ...query }: QueryProps & { error?: string }\n) => {\n reportInteraction(`${dashboardListType}_query_failed`, { ...getQuerySearchContext(query), error });\n};\n\nconst getQuerySearchContext = (query: QueryProps) => {\n const showPreviews = query.layout === SearchLayout.Grid;\n const previewsEnabled = Boolean(config.featureToggles.panelTitleSearch);\n const previews = previewsEnabled ? (showPreviews ? 'on' : 'off') : 'feature_disabled';\n\n return {\n previews,\n layout: query.layout,\n starredFilter: query.starred ?? false,\n sort: query.sortValue ?? '',\n tagCount: query.tagCount ?? 0,\n queryLength: query.query?.length ?? 0,\n includePanels: query.includePanels ?? false,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { FC, FormEvent, useEffect } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { HorizontalGroup, RadioButtonGroup, useStyles2, Checkbox, Button } from '@grafana/ui';\nimport { SortPicker } from 'app/core/components/Select/SortPicker';\nimport { TagFilter, TermCount } from 'app/core/components/TagFilter/TagFilter';\n\nimport { SEARCH_SELECTED_LAYOUT } from '../../constants';\nimport { DashboardQuery, SearchLayout } from '../../types';\n\nexport const layoutOptions = [\n { value: SearchLayout.Folders, icon: 'folder', ariaLabel: 'View by folders' },\n { value: SearchLayout.List, icon: 'list-ul', ariaLabel: 'View as list' },\n];\n\nif (config.featureToggles.dashboardPreviews) {\n layoutOptions.push({ value: SearchLayout.Grid, icon: 'apps', ariaLabel: 'Grid view' });\n}\n\ninterface Props {\n onLayoutChange: (layout: SearchLayout) => void;\n onSortChange: (value: SelectableValue) => void;\n onStarredFilterChange?: (event: FormEvent<HTMLInputElement>) => void;\n onTagFilterChange: (tags: string[]) => void;\n getTagOptions: () => Promise<TermCount[]>;\n getSortOptions: () => Promise<SelectableValue[]>;\n onDatasourceChange: (ds?: string) => void;\n includePanels: boolean;\n setIncludePanels: (v: boolean) => void;\n query: DashboardQuery;\n showStarredFilter?: boolean;\n hideLayout?: boolean;\n}\n\nexport function getValidQueryLayout(q: DashboardQuery): SearchLayout {\n const layout = q.layout ?? SearchLayout.Folders;\n\n // Folders is not valid when a query exists\n if (layout === SearchLayout.Folders) {\n if (q.query || q.sort || q.starred) {\n return SearchLayout.List;\n }\n }\n\n if (layout === SearchLayout.Grid && !config.featureToggles.dashboardPreviews) {\n return SearchLayout.List;\n }\n return layout;\n}\n\nexport const ActionRow: FC<Props> = ({\n onLayoutChange,\n onSortChange,\n onStarredFilterChange = () => {},\n onTagFilterChange,\n getTagOptions,\n getSortOptions,\n onDatasourceChange,\n query,\n showStarredFilter,\n hideLayout,\n includePanels,\n setIncludePanels,\n}) => {\n const styles = useStyles2(getStyles);\n const layout = getValidQueryLayout(query);\n\n // Disabled folder layout option when query is present\n const disabledOptions = query.query ? [SearchLayout.Folders] : [];\n\n const updateLayoutPreference = (layout: SearchLayout) => {\n localStorage.setItem(SEARCH_SELECTED_LAYOUT, layout);\n onLayoutChange(layout);\n };\n\n useEffect(() => {\n if (includePanels && layout === SearchLayout.Folders) {\n setIncludePanels(false);\n }\n }, [layout, includePanels, setIncludePanels]);\n\n return (\n <div className={styles.actionRow}>\n <HorizontalGroup spacing=\"md\" width=\"auto\">\n <TagFilter isClearable={false} tags={query.tag} tagOptions={getTagOptions} onChange={onTagFilterChange} />\n {config.featureToggles.panelTitleSearch && (\n <Checkbox\n data-testid=\"include-panels\"\n disabled={layout === SearchLayout.Folders}\n value={includePanels}\n onChange={() => setIncludePanels(!includePanels)}\n label=\"Include panels\"\n />\n )}\n\n {showStarredFilter && (\n <div className={styles.checkboxWrapper}>\n <Checkbox label=\"Starred\" onChange={onStarredFilterChange} value={query.starred} />\n </div>\n )}\n {query.datasource && (\n <Button icon=\"times\" variant=\"secondary\" onClick={() => onDatasourceChange(undefined)}>\n Datasource: {query.datasource}\n </Button>\n )}\n </HorizontalGroup>\n <div className={styles.rowContainer}>\n <HorizontalGroup spacing=\"md\" width=\"auto\">\n {!hideLayout && (\n <RadioButtonGroup\n options={layoutOptions}\n disabledOptions={disabledOptions}\n onChange={updateLayoutPreference}\n value={layout}\n />\n )}\n <SortPicker onChange={onSortChange} value={query.sort?.value} getSortOptions={getSortOptions} isClearable />\n </HorizontalGroup>\n </div>\n </div>\n );\n};\n\nActionRow.displayName = 'ActionRow';\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n actionRow: css`\n display: none;\n\n ${theme.breakpoints.up('md')} {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: ${theme.spacing(2)};\n width: 100%;\n }\n `,\n rowContainer: css`\n margin-right: ${theme.v1.spacing.md};\n `,\n checkboxWrapper: css`\n label {\n line-height: 1.2;\n }\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\nimport { useAsync, useLocalStorage } from 'react-use';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Card, Checkbox, CollapsableSection, Icon, IconName, Spinner, stylesFactory, useTheme } from '@grafana/ui';\nimport { getSectionStorageKey } from 'app/features/search/utils';\nimport { useUniqueId } from 'app/plugins/datasource/influxdb/components/useUniqueId';\n\nimport { SearchItem } from '../..';\nimport { getGrafanaSearcher, SearchQuery } from '../../service';\nimport { DashboardSearchItemType, DashboardSectionItem } from '../../types';\nimport { SelectionChecker, SelectionToggle } from '../selection';\n\nexport interface DashboardSection {\n kind: string; // folder | query!\n uid: string;\n title: string;\n selected?: boolean; // not used ? keyboard\n url?: string;\n icon?: IconName;\n itemsUIDs?: string[]; // for pseudo folders\n}\n\ninterface SectionHeaderProps {\n selection?: SelectionChecker;\n selectionToggle?: SelectionToggle;\n onClickItem?: (e: React.MouseEvent<HTMLElement>) => void;\n onTagSelected: (tag: string) => void;\n section: DashboardSection;\n renderStandaloneBody?: boolean; // render the body on its own\n tags?: string[];\n}\n\nexport const FolderSection: FC<SectionHeaderProps> = ({\n section,\n selectionToggle,\n onClickItem,\n onTagSelected,\n selection,\n renderStandaloneBody,\n tags,\n}) => {\n const editable = selectionToggle != null;\n const theme = useTheme();\n const styles = getSectionHeaderStyles(theme, section.selected, editable);\n const [sectionExpanded, setSectionExpanded] = useLocalStorage(getSectionStorageKey(section.title), false);\n\n const results = useAsync(async () => {\n if (!sectionExpanded && !renderStandaloneBody) {\n return Promise.resolve([]);\n }\n let folderUid: string | undefined = section.uid;\n let folderTitle: string | undefined = section.title;\n let query: SearchQuery = {\n query: '*',\n kind: ['dashboard'],\n location: section.uid,\n sort: 'name_sort',\n };\n if (section.itemsUIDs) {\n query = {\n uid: section.itemsUIDs, // array of UIDs\n };\n folderUid = undefined;\n folderTitle = undefined;\n }\n\n const raw = await getGrafanaSearcher().search({ ...query, tags });\n const v = raw.view.map<DashboardSectionItem>((item) => ({\n uid: item.uid,\n title: item.name,\n url: item.url,\n uri: item.url,\n type: item.kind === 'folder' ? DashboardSearchItemType.DashFolder : DashboardSearchItemType.DashDB,\n id: 666, // do not use me!\n isStarred: false,\n tags: item.tags ?? [],\n folderUid,\n folderTitle,\n }));\n return v;\n }, [sectionExpanded, section, tags]);\n\n const onSectionExpand = () => {\n setSectionExpanded(!sectionExpanded);\n };\n\n const onToggleFolder = (evt: React.FormEvent) => {\n evt.preventDefault();\n evt.stopPropagation();\n if (selectionToggle && selection) {\n const checked = !selection(section.kind, section.uid);\n selectionToggle(section.kind, section.uid);\n const sub = results.value ?? [];\n for (const item of sub) {\n if (selection('dashboard', item.uid!) !== checked) {\n selectionToggle('dashboard', item.uid!);\n }\n }\n }\n };\n\n const id = useUniqueId();\n const labelId = `section-header-label-${id}`;\n\n let icon = section.icon;\n if (!icon) {\n icon = sectionExpanded ? 'folder-open' : 'folder';\n }\n\n const renderResults = () => {\n if (!results.value) {\n return null;\n } else if (results.value.length === 0 && !results.loading) {\n return (\n <Card>\n <Card.Heading>No results found</Card.Heading>\n </Card>\n );\n }\n\n return results.value.map((v) => {\n if (selection && selectionToggle) {\n const type = v.type === DashboardSearchItemType.DashFolder ? 'folder' : 'dashboard';\n v = {\n ...v,\n checked: selection(type, v.uid!),\n };\n }\n return (\n <SearchItem\n key={v.uid}\n item={v}\n onTagSelected={onTagSelected}\n onToggleChecked={(item) => {\n if (selectionToggle) {\n selectionToggle('dashboard', item.uid!);\n }\n }}\n editable={Boolean(selection != null)}\n onClickItem={onClickItem}\n />\n );\n });\n };\n\n // Skip the folder wrapper\n if (renderStandaloneBody) {\n return (\n <div className={styles.folderViewResults}>\n {!results.value?.length && results.loading ? <Spinner className={styles.spinner} /> : renderResults()}\n </div>\n );\n }\n\n return (\n <CollapsableSection\n isOpen={sectionExpanded ?? false}\n onToggle={onSectionExpand}\n className={styles.wrapper}\n contentClassName={styles.content}\n loading={results.loading}\n labelId={labelId}\n label={\n <>\n {selectionToggle && selection && (\n <div className={styles.checkbox} onClick={onToggleFolder}>\n <Checkbox value={selection(section.kind, section.uid)} aria-label=\"Select folder\" />\n </div>\n )}\n\n <div className={styles.icon}>\n <Icon name={icon} />\n </div>\n\n <div className={styles.text}>\n <span id={labelId}>{section.title}</span>\n {section.url && section.uid !== 'general' && (\n <a href={section.url} className={styles.link}>\n <span className={styles.separator}>|</span> <Icon name=\"folder-upload\" /> Go to folder\n </a>\n )}\n </div>\n </>\n }\n >\n {results.value && <ul className={styles.sectionItems}>{renderResults()}</ul>}\n </CollapsableSection>\n );\n};\n\nconst getSectionHeaderStyles = stylesFactory((theme: GrafanaTheme, selected = false, editable: boolean) => {\n const { sm } = theme.spacing;\n return {\n wrapper: cx(\n css`\n align-items: center;\n font-size: ${theme.typography.size.base};\n padding: 12px;\n border-bottom: none;\n color: ${theme.colors.textWeak};\n z-index: 1;\n\n &:hover,\n &.selected {\n color: ${theme.colors.text};\n }\n\n &:hover,\n &:focus-visible,\n &:focus-within {\n a {\n opacity: 1;\n }\n }\n `,\n 'pointer',\n { selected }\n ),\n sectionItems: css`\n margin: 0 24px 0 32px;\n `,\n checkbox: css`\n padding: 0 ${sm} 0 0;\n `,\n icon: css`\n padding: 0 ${sm} 0 ${editable ? 0 : sm};\n `,\n folderViewResults: css`\n overflow: auto;\n `,\n text: css`\n flex-grow: 1;\n line-height: 24px;\n `,\n link: css`\n padding: 2px 10px 0;\n color: ${theme.colors.textWeak};\n opacity: 0;\n transition: opacity 150ms ease-in-out;\n `,\n separator: css`\n margin-right: 6px;\n `,\n content: css`\n padding-top: 0px;\n padding-bottom: 0px;\n `,\n spinner: css`\n display: grid;\n place-content: center;\n padding-bottom: 1rem;\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { Alert, Spinner, useStyles2 } from '@grafana/ui';\n\nimport { contextSrv } from '../../../../core/services/context_srv';\nimport impressionSrv from '../../../../core/services/impression_srv';\nimport { GENERAL_FOLDER_UID } from '../../constants';\nimport { getGrafanaSearcher } from '../../service';\nimport { SearchResultsProps } from '../components/SearchResultsTable';\n\nimport { DashboardSection, FolderSection } from './FolderSection';\n\ntype Props = Pick<SearchResultsProps, 'selection' | 'selectionToggle' | 'onTagSelected' | 'onClickItem'> & {\n tags?: string[];\n hidePseudoFolders?: boolean;\n};\nexport const FolderView = ({\n selection,\n selectionToggle,\n onTagSelected,\n tags,\n hidePseudoFolders,\n onClickItem,\n}: Props) => {\n const styles = useStyles2(getStyles);\n\n const results = useAsync(async () => {\n const folders: DashboardSection[] = [];\n if (!hidePseudoFolders) {\n if (contextSrv.isSignedIn) {\n const stars = await getBackendSrv().get('api/user/stars');\n if (stars.length > 0) {\n folders.push({ title: 'Starred', icon: 'star', kind: 'query-star', uid: '__starred', itemsUIDs: stars });\n }\n }\n\n const ids = impressionSrv.getDashboardOpened();\n if (ids.length) {\n const itemsUIDs = await getBackendSrv().get(`/api/dashboards/ids/${ids.slice(0, 30).join(',')}`);\n if (itemsUIDs.length) {\n folders.push({ title: 'Recent', icon: 'clock-nine', kind: 'query-recent', uid: '__recent', itemsUIDs });\n }\n }\n }\n folders.push({ title: 'General', url: '/dashboards', kind: 'folder', uid: GENERAL_FOLDER_UID });\n\n const rsp = await getGrafanaSearcher().search({\n query: '*',\n kind: ['folder'],\n });\n for (const row of rsp.view) {\n folders.push({\n title: row.name,\n url: row.url,\n uid: row.uid,\n kind: row.kind,\n });\n }\n\n return folders;\n }, []);\n\n const renderResults = () => {\n if (results.loading) {\n return <Spinner className={styles.spinner} />;\n } else if (!results.value) {\n return <Alert className={styles.error} title={results.error ? results.error.message : 'Something went wrong'} />;\n } else {\n return results.value.map((section) => (\n <div data-testid={selectors.components.Search.sectionV2} className={styles.section} key={section.title}>\n {section.title && (\n <FolderSection\n selection={selection}\n selectionToggle={selectionToggle}\n onTagSelected={onTagSelected}\n section={section}\n tags={tags}\n onClickItem={onClickItem}\n />\n )}\n </div>\n ));\n }\n };\n\n return <div className={styles.wrapper}>{renderResults()}</div>;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrapper: css`\n display: flex;\n flex-direction: column;\n overflow: auto;\n\n > ul {\n list-style: none;\n }\n\n border: solid 1px ${theme.v1.colors.border2};\n `,\n section: css`\n display: flex;\n flex-direction: column;\n background: ${theme.v1.colors.panelBg};\n\n &:not(:last-child) {\n border-bottom: solid 1px ${theme.v1.colors.border2};\n }\n `,\n spinner: css`\n align-items: center;\n display: flex;\n justify-content: center;\n min-height: 100px;\n `,\n error: css`\n margin: ${theme.spacing(4)} auto;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { ConfirmModal, stylesFactory, useTheme } from '@grafana/ui';\nimport { deleteFoldersAndDashboards } from 'app/features/manage-dashboards/state/actions';\n\nimport { OnMoveOrDeleleSelectedItems } from '../../types';\n\ninterface Props {\n onDeleteItems: OnMoveOrDeleleSelectedItems;\n results: Map<string, Set<string>>;\n isOpen: boolean;\n onDismiss: () => void;\n}\n\nexport const ConfirmDeleteModal: FC<Props> = ({ results, onDeleteItems, isOpen, onDismiss }) => {\n const theme = useTheme();\n const styles = getStyles(theme);\n\n const dashboards = Array.from(results.get('dashboard') ?? []);\n const folders = Array.from(results.get('folder') ?? []);\n\n const folderCount = folders.length;\n const dashCount = dashboards.length;\n\n let text = 'Do you want to delete the ';\n let subtitle;\n const dashEnding = dashCount === 1 ? '' : 's';\n const folderEnding = folderCount === 1 ? '' : 's';\n\n if (folderCount > 0 && dashCount > 0) {\n text += `selected folder${folderEnding} and dashboard${dashEnding}?\\n`;\n subtitle = `All dashboards and alerts of the selected folder${folderEnding} will also be deleted`;\n } else if (folderCount > 0) {\n text += `selected folder${folderEnding} and all ${folderCount === 1 ? 'its' : 'their'} dashboards and alerts?`;\n } else {\n text += `${dashCount} selected dashboard${dashEnding}?`;\n }\n\n const deleteItems = () => {\n deleteFoldersAndDashboards(folders, dashboards).then(() => {\n onDeleteItems();\n onDismiss();\n });\n };\n\n return isOpen ? (\n <ConfirmModal\n isOpen={isOpen}\n title=\"Delete\"\n body={\n <>\n {text} {subtitle && <div className={styles.subtitle}>{subtitle}</div>}\n </>\n }\n confirmText=\"Delete\"\n onConfirm={deleteItems}\n onDismiss={onDismiss}\n />\n ) : null;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n subtitle: css`\n font-size: ${theme.typography.size.base};\n padding-top: ${theme.spacing.md};\n `,\n };\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useState } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Button, HorizontalGroup, Modal, stylesFactory, useTheme } from '@grafana/ui';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { useAppNotification } from 'app/core/copy/appNotification';\nimport { moveDashboards } from 'app/features/manage-dashboards/state/actions';\nimport { FolderInfo } from 'app/types';\n\nimport { OnMoveOrDeleleSelectedItems } from '../../types';\n\ninterface Props {\n onMoveItems: OnMoveOrDeleleSelectedItems;\n results: Map<string, Set<string>>;\n isOpen: boolean;\n onDismiss: () => void;\n}\n\nexport const MoveToFolderModal: FC<Props> = ({ results, onMoveItems, isOpen, onDismiss }) => {\n const [folder, setFolder] = useState<FolderInfo | null>(null);\n const theme = useTheme();\n const styles = getStyles(theme);\n const notifyApp = useAppNotification();\n const selectedDashboards = Array.from(results.get('dashboard') ?? []);\n const [moving, setMoving] = useState(false);\n\n const moveTo = () => {\n if (folder && selectedDashboards.length) {\n const folderTitle = folder.title ?? 'General';\n setMoving(true);\n moveDashboards(selectedDashboards, folder).then((result: any) => {\n if (result.successCount > 0) {\n const ending = result.successCount === 1 ? '' : 's';\n const header = `Dashboard${ending} Moved`;\n const msg = `${result.successCount} dashboard${ending} moved to ${folderTitle}`;\n notifyApp.success(header, msg);\n }\n\n if (result.totalCount === result.alreadyInFolderCount) {\n notifyApp.error('Error', `Dashboard already belongs to folder ${folderTitle}`);\n } else {\n //update the list\n onMoveItems();\n }\n\n setMoving(false);\n onDismiss();\n });\n }\n };\n\n return isOpen ? (\n <Modal\n className={styles.modal}\n title=\"Choose Dashboard Folder\"\n icon=\"folder-plus\"\n isOpen={isOpen}\n onDismiss={onDismiss}\n >\n <>\n <div className={styles.content}>\n <p>\n Move the {selectedDashboards.length} selected dashboard{selectedDashboards.length === 1 ? '' : 's'} to the\n following folder:\n </p>\n <FolderPicker onChange={(f) => setFolder(f as FolderInfo)} />\n </div>\n\n <HorizontalGroup justify=\"center\">\n <Button icon={moving ? 'fa fa-spinner' : undefined} variant=\"primary\" onClick={moveTo}>\n Move\n </Button>\n <Button variant=\"secondary\" onClick={onDismiss}>\n Cancel\n </Button>\n </HorizontalGroup>\n </>\n </Modal>\n ) : null;\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n modal: css`\n width: 500px;\n `,\n content: css`\n margin-bottom: ${theme.spacing.lg};\n `,\n };\n});\n","import React, { useState } from 'react';\n\nimport { Button, HorizontalGroup, IconButton, IconName, useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { FolderDTO } from 'app/types';\n\nimport { GENERAL_FOLDER_UID } from '../../constants';\nimport { OnMoveOrDeleleSelectedItems } from '../../types';\n\nimport { getStyles } from './ActionRow';\nimport { ConfirmDeleteModal } from './ConfirmDeleteModal';\nimport { MoveToFolderModal } from './MoveToFolderModal';\n\ntype Props = {\n items: Map<string, Set<string>>;\n folder?: FolderDTO; // when we are loading in folder page\n onChange: OnMoveOrDeleleSelectedItems;\n clearSelection: () => void;\n};\n\nexport function ManageActions({ items, folder, onChange, clearSelection }: Props) {\n const styles = useStyles2(getStyles);\n\n const canSave = folder?.canSave;\n const hasEditPermissionInFolders = folder ? canSave : contextSrv.hasEditPermissionInFolders;\n\n const canMove = hasEditPermissionInFolders;\n\n const selectedFolders = Array.from(items.get('folder') ?? []);\n const includesGeneralFolder = selectedFolders.find((result) => result === GENERAL_FOLDER_UID);\n\n const canDelete = hasEditPermissionInFolders && !includesGeneralFolder;\n const [isMoveModalOpen, setIsMoveModalOpen] = useState(false);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n\n const onMove = () => {\n setIsMoveModalOpen(true);\n };\n\n const onDelete = () => {\n setIsDeleteModalOpen(true);\n };\n\n return (\n <div className={styles.actionRow} data-testid=\"manage-actions\">\n <div className={styles.rowContainer}>\n <HorizontalGroup spacing=\"md\" width=\"auto\">\n <IconButton name={'check-square' as IconName} onClick={clearSelection} title=\"Uncheck everything\" />\n <Button disabled={!canMove} onClick={onMove} icon=\"exchange-alt\" variant=\"secondary\">\n Move\n </Button>\n <Button disabled={!canDelete} onClick={onDelete} icon=\"trash-alt\" variant=\"destructive\">\n Delete\n </Button>\n </HorizontalGroup>\n </div>\n\n <ConfirmDeleteModal\n onDeleteItems={onChange}\n results={items}\n isOpen={isDeleteModalOpen}\n onDismiss={() => setIsDeleteModalOpen(false)}\n />\n <MoveToFolderModal\n onMoveItems={onChange}\n results={items}\n isOpen={isMoveModalOpen}\n onDismiss={() => setIsMoveModalOpen(false)}\n />\n </div>\n );\n}\n","/* eslint-disable react/jsx-no-undef */\nimport { css } from '@emotion/css';\nimport React, { useEffect, useRef, useCallback, useState } from 'react';\nimport { FixedSizeList } from 'react-window';\nimport InfiniteLoader from 'react-window-infinite-loader';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { SearchItem } from '../../components/SearchItem';\nimport { useSearchKeyboardNavigation } from '../../hooks/useSearchKeyboardSelection';\nimport { SearchResultMeta } from '../../service';\nimport { DashboardSearchItemType, DashboardSectionItem } from '../../types';\n\nimport { SearchResultsProps } from './SearchResultsTable';\n\nexport const SearchResultsCards = React.memo(\n ({\n response,\n width,\n height,\n selection,\n selectionToggle,\n onTagSelected,\n keyboardEvents,\n onClickItem,\n }: SearchResultsProps) => {\n const styles = useStyles2(getStyles);\n const infiniteLoaderRef = useRef<InfiniteLoader>(null);\n const [listEl, setListEl] = useState<FixedSizeList | null>(null);\n const highlightIndex = useSearchKeyboardNavigation(keyboardEvents, 0, response);\n\n // Scroll to the top and clear loader cache when the query results change\n useEffect(() => {\n if (infiniteLoaderRef.current) {\n infiniteLoaderRef.current.resetloadMoreItemsCache();\n }\n if (listEl) {\n listEl.scrollTo(0);\n }\n }, [response, listEl]);\n\n const RenderRow = useCallback(\n ({ index: rowIndex, style }) => {\n const meta = response.view.dataFrame.meta?.custom as SearchResultMeta;\n\n let className = '';\n if (rowIndex === highlightIndex.y) {\n className += ' ' + styles.selectedRow;\n }\n\n const item = response.view.get(rowIndex);\n let v: DashboardSectionItem = {\n uid: item.uid,\n title: item.name,\n url: item.url,\n uri: item.url,\n type: item.kind === 'folder' ? DashboardSearchItemType.DashFolder : DashboardSearchItemType.DashDB,\n id: 666, // do not use me!\n isStarred: false,\n tags: item.tags ?? [],\n };\n\n if (item.location) {\n const first = item.location.split('/')[0];\n const finfo = meta.locationInfo[first];\n if (finfo) {\n v.folderUid = item.location;\n v.folderTitle = finfo.name;\n }\n }\n\n if (selection && selectionToggle) {\n const type = v.type === DashboardSearchItemType.DashFolder ? 'folder' : 'dashboard';\n v = {\n ...v,\n checked: selection(type, v.uid!),\n };\n }\n return (\n <div style={style} key={item.uid} className={className} role=\"row\">\n <SearchItem\n item={v}\n onTagSelected={onTagSelected}\n onToggleChecked={(item) => {\n if (selectionToggle) {\n selectionToggle('dashboard', item.uid!);\n }\n }}\n editable={Boolean(selection != null)}\n onClickItem={onClickItem}\n />\n </div>\n );\n },\n [response.view, highlightIndex, styles, onTagSelected, selection, selectionToggle, onClickItem]\n );\n\n if (!response.totalRows) {\n return (\n <div className={styles.noData} style={{ width }}>\n No data\n </div>\n );\n }\n\n return (\n <div aria-label=\"Search results list\" style={{ width }} role=\"list\">\n <InfiniteLoader\n ref={infiniteLoaderRef}\n isItemLoaded={response.isItemLoaded}\n itemCount={response.totalRows}\n loadMoreItems={response.loadMoreItems}\n >\n {({ onItemsRendered, ref }) => (\n <FixedSizeList\n ref={(innerRef) => {\n ref(innerRef);\n setListEl(innerRef);\n }}\n onItemsRendered={onItemsRendered}\n height={height}\n itemCount={response.totalRows}\n itemSize={72}\n width=\"100%\"\n style={{ overflow: 'hidden auto' }}\n >\n {RenderRow}\n </FixedSizeList>\n )}\n </InfiniteLoader>\n </div>\n );\n }\n);\nSearchResultsCards.displayName = 'SearchResultsCards';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n noData: css`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n `,\n selectedRow: css`\n border-left: 3px solid ${theme.colors.primary.border};\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { FixedSizeGrid } from 'react-window';\nimport InfiniteLoader from 'react-window-infinite-loader';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { SearchCard } from '../../components/SearchCard';\nimport { useSearchKeyboardNavigation } from '../../hooks/useSearchKeyboardSelection';\nimport { DashboardSearchItemType, DashboardSectionItem } from '../../types';\n\nimport { SearchResultsProps } from './SearchResultsTable';\n\nexport const SearchResultsGrid = ({\n response,\n width,\n height,\n selection,\n selectionToggle,\n onTagSelected,\n onClickItem,\n keyboardEvents,\n}: SearchResultsProps) => {\n const styles = useStyles2(getStyles);\n\n // Hacked to reuse existing SearchCard (and old DashboardSectionItem)\n const itemProps = {\n editable: selection != null,\n onToggleChecked: (item: any) => {\n const d = item as DashboardSectionItem;\n const t = d.type === DashboardSearchItemType.DashFolder ? 'folder' : 'dashboard';\n if (selectionToggle) {\n selectionToggle(t, d.uid!);\n }\n },\n onTagSelected,\n onClick: onClickItem,\n };\n\n const itemCount = response.totalRows ?? response.view.length;\n const view = response.view;\n const numColumns = Math.ceil(width / 320);\n const cellWidth = width / numColumns;\n const cellHeight = (cellWidth - 64) * 0.75 + 56 + 8;\n const numRows = Math.ceil(itemCount / numColumns);\n const highlightIndex = useSearchKeyboardNavigation(keyboardEvents, numColumns, response);\n\n return (\n <InfiniteLoader isItemLoaded={response.isItemLoaded} itemCount={itemCount} loadMoreItems={response.loadMoreItems}>\n {({ onItemsRendered, ref }) => (\n <FixedSizeGrid\n ref={ref}\n onItemsRendered={(v) => {\n onItemsRendered({\n visibleStartIndex: v.visibleRowStartIndex * numColumns,\n visibleStopIndex: v.visibleRowStopIndex * numColumns,\n overscanStartIndex: v.overscanRowStartIndex * numColumns,\n overscanStopIndex: v.overscanColumnStopIndex * numColumns,\n });\n }}\n columnCount={numColumns}\n columnWidth={cellWidth}\n rowCount={numRows}\n rowHeight={cellHeight}\n className={styles.wrapper}\n innerElementType=\"ul\"\n height={height}\n width={width - 2}\n >\n {({ columnIndex, rowIndex, style }) => {\n const index = rowIndex * numColumns + columnIndex;\n if (index >= view.length) {\n return null;\n }\n const item = view.get(index);\n const kind = item.kind ?? 'dashboard';\n\n const facade: DashboardSectionItem = {\n uid: item.uid,\n title: item.name,\n url: item.url,\n uri: item.url,\n type: kind === 'folder' ? DashboardSearchItemType.DashFolder : DashboardSearchItemType.DashDB,\n id: 666, // do not use me!\n isStarred: false,\n tags: item.tags ?? [],\n checked: selection ? selection(kind, item.uid) : false,\n };\n\n if (kind === 'panel') {\n const type = item.panel_type;\n facade.icon = 'public/img/icons/unicons/graph-bar.svg';\n if (type) {\n const info = config.panels[type];\n if (info?.name) {\n const v = info.info?.logos.small;\n if (v && v.endsWith('.svg')) {\n facade.icon = v;\n }\n }\n }\n }\n\n let className = styles.virtualizedGridItemWrapper;\n if (rowIndex === highlightIndex.y && columnIndex === highlightIndex.x) {\n className += ' ' + styles.selectedItem;\n }\n\n // The wrapper div is needed as the inner SearchItem has margin-bottom spacing\n // And without this wrapper there is no room for that margin\n return item ? (\n <li style={style} className={className}>\n <SearchCard key={item.uid} {...itemProps} item={facade} />\n </li>\n ) : null;\n }}\n </FixedSizeGrid>\n )}\n </InfiniteLoader>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n virtualizedGridItemWrapper: css`\n padding: 4px;\n `,\n wrapper: css`\n display: flex;\n flex-direction: column;\n\n > ul {\n list-style: none;\n }\n `,\n selectedItem: css`\n box-shadow: inset 1px 1px 3px 3px ${theme.colors.primary.border};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { useAsync, useDebounce } from 'react-use';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { Observable } from 'rxjs';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, Spinner, Button } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { TermCount } from 'app/core/components/TagFilter/TagFilter';\nimport { FolderDTO } from 'app/types';\n\nimport { PreviewsSystemRequirements } from '../../components/PreviewsSystemRequirements';\nimport { useSearchQuery } from '../../hooks/useSearchQuery';\nimport { getGrafanaSearcher, SearchQuery } from '../../service';\nimport { SearchLayout } from '../../types';\nimport {\n reportDashboardListViewed,\n reportSearchResultInteraction,\n reportSearchQueryInteraction,\n reportSearchFailedQueryInteraction,\n} from '../reporting';\nimport { newSearchSelection, updateSearchSelection } from '../selection';\n\nimport { ActionRow, getValidQueryLayout } from './ActionRow';\nimport { FolderSection } from './FolderSection';\nimport { FolderView } from './FolderView';\nimport { ManageActions } from './ManageActions';\nimport { SearchResultsCards } from './SearchResultsCards';\nimport { SearchResultsGrid } from './SearchResultsGrid';\nimport { SearchResultsTable, SearchResultsProps } from './SearchResultsTable';\n\nexport type SearchViewProps = {\n queryText: string; // odd that it is not from query.query\n showManage: boolean;\n folderDTO?: FolderDTO;\n hidePseudoFolders?: boolean; // Recent + starred\n onQueryTextChange: (newQueryText: string) => void;\n includePanels: boolean;\n setIncludePanels: (v: boolean) => void;\n keyboardEvents: Observable<React.KeyboardEvent>;\n};\n\nexport const SearchView = ({\n showManage,\n folderDTO,\n queryText,\n onQueryTextChange,\n hidePseudoFolders,\n includePanels,\n setIncludePanels,\n keyboardEvents,\n}: SearchViewProps) => {\n const styles = useStyles2(getStyles);\n\n const {\n query,\n onTagFilterChange,\n onStarredFilterChange,\n onTagAdd,\n onDatasourceChange,\n onSortChange,\n onLayoutChange,\n onClearStarred,\n } = useSearchQuery({});\n query.query = queryText; // Use the query value passed in from parent rather than from URL\n\n const [searchSelection, setSearchSelection] = useState(newSearchSelection());\n const layout = getValidQueryLayout(query);\n const isFolders = layout === SearchLayout.Folders;\n\n const [listKey, setListKey] = useState(Date.now());\n const eventTrackingNamespace = folderDTO ? 'manage_dashboards' : 'dashboard_search';\n\n const searchQuery = useMemo(() => {\n const q: SearchQuery = {\n query: queryText,\n tags: query.tag as string[],\n ds_uid: query.datasource as string,\n location: folderDTO?.uid, // This will scope all results to the prefix\n sort: query.sort?.value,\n explain: query.explain,\n withAllowedActions: query.explain, // allowedActions are currently not used for anything on the UI and added only in `explain` mode\n starred: query.starred,\n };\n\n // Only dashboards have additional properties\n if (q.sort?.length && !q.sort.includes('name')) {\n q.kind = ['dashboard', 'folder']; // skip panels\n }\n\n if (!q.query?.length) {\n q.query = '*';\n if (!q.location) {\n q.kind = ['dashboard', 'folder']; // skip panels\n }\n }\n\n if (!includePanels && !q.kind) {\n q.kind = ['dashboard', 'folder']; // skip panels\n }\n\n if (q.query === '*' && !q.sort?.length) {\n q.sort = 'name_sort';\n }\n return q;\n }, [query, queryText, folderDTO, includePanels]);\n\n // Search usage reporting\n useDebounce(\n () => {\n reportDashboardListViewed(eventTrackingNamespace, {\n layout: query.layout,\n starred: query.starred,\n sortValue: query.sort?.value,\n query: query.query,\n tagCount: query.tag?.length,\n includePanels,\n });\n },\n 1000,\n []\n );\n\n const onClickItem = () => {\n reportSearchResultInteraction(eventTrackingNamespace, {\n layout: query.layout,\n starred: query.starred,\n sortValue: query.sort?.value,\n query: query.query,\n tagCount: query.tag?.length,\n includePanels,\n });\n };\n\n const results = useAsync(() => {\n const trackingInfo = {\n layout: query.layout,\n starred: query.starred,\n sortValue: query.sort?.value,\n query: query.query,\n tagCount: query.tag?.length,\n includePanels,\n };\n\n reportSearchQueryInteraction(eventTrackingNamespace, trackingInfo);\n\n if (searchQuery.starred) {\n return getGrafanaSearcher()\n .starred(searchQuery)\n .catch((error) =>\n reportSearchFailedQueryInteraction(eventTrackingNamespace, { ...trackingInfo, error: error?.message })\n );\n }\n\n return getGrafanaSearcher()\n .search(searchQuery)\n .catch((error) =>\n reportSearchFailedQueryInteraction(eventTrackingNamespace, { ...trackingInfo, error: error?.message })\n );\n }, [searchQuery]);\n\n const clearSelection = useCallback(() => {\n searchSelection.items.clear();\n setSearchSelection({ ...searchSelection });\n }, [searchSelection]);\n\n const toggleSelection = useCallback(\n (kind: string, uid: string) => {\n const current = searchSelection.isSelected(kind, uid);\n setSearchSelection(updateSearchSelection(searchSelection, !current, kind, [uid]));\n },\n [searchSelection]\n );\n\n // This gets the possible tags from within the query results\n const getTagOptions = (): Promise<TermCount[]> => {\n return getGrafanaSearcher().tags(searchQuery);\n };\n\n // function to update items when dashboards or folders are moved or deleted\n const onChangeItemsList = async () => {\n // clean up search selection\n clearSelection();\n setListKey(Date.now());\n // trigger again the search to the backend\n onQueryTextChange(query.query);\n };\n\n const getStarredItems = useCallback(\n (e) => {\n onStarredFilterChange(e);\n },\n [onStarredFilterChange]\n );\n\n const renderResults = () => {\n const value = results.value;\n\n if ((!value || !value.totalRows) && !isFolders) {\n if (results.loading && !value) {\n return <Spinner />;\n }\n\n return (\n <div className={styles.noResults}>\n <div>No results found for your query.</div>\n <br />\n <Button\n variant=\"secondary\"\n onClick={() => {\n if (query.query) {\n onQueryTextChange('');\n }\n if (query.tag?.length) {\n onTagFilterChange([]);\n }\n if (query.datasource) {\n onDatasourceChange(undefined);\n }\n }}\n >\n Clear search and filters\n </Button>\n </div>\n );\n }\n\n const selection = showManage ? searchSelection.isSelected : undefined;\n if (layout === SearchLayout.Folders) {\n if (folderDTO) {\n return (\n <FolderSection\n section={{ uid: folderDTO.uid, kind: 'folder', title: folderDTO.title }}\n selection={selection}\n selectionToggle={toggleSelection}\n onTagSelected={onTagAdd}\n renderStandaloneBody={true}\n tags={query.tag}\n key={listKey}\n onClickItem={onClickItem}\n />\n );\n }\n return (\n <FolderView\n key={listKey}\n selection={selection}\n selectionToggle={toggleSelection}\n tags={query.tag}\n onTagSelected={onTagAdd}\n hidePseudoFolders={hidePseudoFolders}\n onClickItem={onClickItem}\n />\n );\n }\n\n return (\n <div style={{ height: '100%', width: '100%' }}>\n <AutoSizer>\n {({ width, height }) => {\n const props: SearchResultsProps = {\n response: value!,\n selection,\n selectionToggle: toggleSelection,\n clearSelection,\n width: width,\n height: height,\n onTagSelected: onTagAdd,\n keyboardEvents,\n onDatasourceChange: query.datasource ? onDatasourceChange : undefined,\n onClickItem: onClickItem,\n };\n\n if (layout === SearchLayout.Grid) {\n return <SearchResultsGrid {...props} />;\n }\n\n if (width < 800) {\n return <SearchResultsCards {...props} />;\n }\n\n return <SearchResultsTable {...props} />;\n }}\n </AutoSizer>\n </div>\n );\n };\n\n if (folderDTO && !results.loading && !results.value?.totalRows && !queryText.length) {\n return (\n <EmptyListCTA\n title=\"This folder doesn't have any dashboards yet\"\n buttonIcon=\"plus\"\n buttonTitle=\"Create Dashboard\"\n buttonLink={`dashboard/new?folderId=${folderDTO.id}`}\n proTip=\"Add/move dashboards to your folder at ->\"\n proTipLink=\"dashboards\"\n proTipLinkTitle=\"Manage dashboards\"\n proTipTarget=\"\"\n />\n );\n }\n\n return (\n <>\n {Boolean(searchSelection.items.size > 0) ? (\n <ManageActions items={searchSelection.items} onChange={onChangeItemsList} clearSelection={clearSelection} />\n ) : (\n <ActionRow\n onLayoutChange={(v) => {\n if (v === SearchLayout.Folders) {\n if (query.query) {\n onQueryTextChange(''); // parent will clear the sort\n }\n if (query.starred) {\n onClearStarred();\n }\n }\n onLayoutChange(v);\n }}\n showStarredFilter={hidePseudoFolders}\n onStarredFilterChange={!hidePseudoFolders ? undefined : getStarredItems}\n onSortChange={onSortChange}\n onTagFilterChange={onTagFilterChange}\n getTagOptions={getTagOptions}\n getSortOptions={getGrafanaSearcher().getSortOptions}\n onDatasourceChange={onDatasourceChange}\n query={query}\n includePanels={includePanels!}\n setIncludePanels={setIncludePanels}\n />\n )}\n\n {layout === SearchLayout.Grid && (\n <PreviewsSystemRequirements\n bottomSpacing={3}\n showPreviews={true}\n onRemove={() => onLayoutChange(SearchLayout.List)}\n />\n )}\n {renderResults()}\n </>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n searchInput: css`\n margin-bottom: 6px;\n min-height: ${theme.spacing(4)};\n `,\n unsupported: css`\n padding: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n font-size: 18px;\n `,\n noResults: css`\n padding: ${theme.v1.spacing.md};\n background: ${theme.v1.colors.bg2};\n font-style: italic;\n margin-top: ${theme.v1.spacing.md};\n `,\n});\n","// Using '*' for uid will return true if anything is selected\nexport type SelectionChecker = (kind: string, uid: string) => boolean;\nexport type SelectionToggle = (kind: string, uid: string) => void;\n\nexport interface SearchSelection {\n // Check if an item is selected\n isSelected: SelectionChecker;\n\n // Selected items by kind\n items: Map<string, Set<string>>;\n}\n\nexport function newSearchSelection(): SearchSelection {\n // the check is called often, on potentially large (all) results so using Map/Set is better than simple array\n const items = new Map<string, Set<string>>();\n\n const isSelected = (kind: string, uid: string) => {\n return Boolean(items.get(kind)?.has(uid));\n };\n\n return {\n items,\n isSelected,\n };\n}\n\nexport function updateSearchSelection(\n old: SearchSelection,\n selected: boolean,\n kind: string,\n uids: string[]\n): SearchSelection {\n const items = old.items; // mutate! :/\n\n if (uids.length) {\n const k = items.get(kind);\n if (k) {\n for (const uid of uids) {\n if (selected) {\n k.add(uid);\n } else {\n k.delete(uid);\n }\n }\n if (k.size < 1) {\n items.delete(kind);\n }\n } else if (selected) {\n items.set(kind, new Set<string>(uids));\n }\n }\n\n return {\n items,\n isSelected: (kind: string, uid: string) => {\n if (uid === '*') {\n if (kind === '*') {\n for (const k of items.keys()) {\n if (items.get(k)?.size) {\n return true;\n }\n }\n return false;\n }\n return Boolean(items.get(kind)?.size);\n }\n return Boolean(items.get(kind)?.has(uid));\n },\n };\n}\n","// Search Query\nexport const TOGGLE_STARRED = 'TOGGLE_STARRED';\nexport const REMOVE_STARRED = 'REMOVE_STARRED';\nexport const QUERY_CHANGE = 'QUERY_CHANGE';\nexport const DATASOURCE_CHANGE = 'DATASOURCE_CHANGE';\nexport const REMOVE_TAG = 'REMOVE_TAG';\nexport const CLEAR_FILTERS = 'CLEAR_FILTERS';\nexport const SET_TAGS = 'SET_TAGS';\nexport const ADD_TAG = 'ADD_TAG';\nexport const TOGGLE_SORT = 'TOGGLE_SORT';\nexport const LAYOUT_CHANGE = 'LAYOUT_CHANGE';\n","import { DashboardQuery, SearchQueryParams, SearchAction, SearchLayout } from '../types';\n\nimport {\n ADD_TAG,\n CLEAR_FILTERS,\n LAYOUT_CHANGE,\n QUERY_CHANGE,\n REMOVE_STARRED,\n REMOVE_TAG,\n SET_TAGS,\n DATASOURCE_CHANGE,\n TOGGLE_SORT,\n TOGGLE_STARRED,\n} from './actionTypes';\n\nexport const defaultQuery: DashboardQuery = {\n query: '',\n tag: [],\n starred: false,\n sort: null,\n layout: SearchLayout.Folders,\n prevSort: null,\n};\n\nexport const defaultQueryParams: SearchQueryParams = {\n sort: null,\n starred: null,\n query: null,\n tag: null,\n layout: null,\n};\n\nexport const queryReducer = (state: DashboardQuery, action: SearchAction) => {\n switch (action.type) {\n case QUERY_CHANGE:\n return { ...state, query: action.payload };\n case REMOVE_TAG:\n return { ...state, tag: state.tag.filter((t) => t !== action.payload) };\n case SET_TAGS:\n return { ...state, tag: action.payload };\n case ADD_TAG: {\n const tag = action.payload;\n return tag && !state.tag.includes(tag) ? { ...state, tag: [...state.tag, tag] } : state;\n }\n case DATASOURCE_CHANGE:\n return { ...state, datasource: action.payload };\n case TOGGLE_STARRED:\n return { ...state, starred: action.payload };\n case REMOVE_STARRED:\n return { ...state, starred: false };\n case CLEAR_FILTERS:\n return { ...state, query: '', tag: [], starred: false, sort: null };\n case TOGGLE_SORT: {\n const sort = action.payload;\n if (state.layout === SearchLayout.Folders) {\n return { ...state, sort, layout: SearchLayout.List };\n }\n return { ...state, sort };\n }\n case LAYOUT_CHANGE: {\n const layout = action.payload;\n if (state.sort && layout === SearchLayout.Folders) {\n return { ...state, layout, sort: null, prevSort: state.sort };\n }\n return { ...state, layout, sort: state.prevSort };\n }\n default:\n return state;\n }\n};\n","import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\n\nimport { SearchQuery } from './types';\n\n/** prepare the query replacing folder:current */\nexport async function replaceCurrentFolderQuery(query: SearchQuery): Promise<SearchQuery> {\n if (query.query && query.query.indexOf('folder:current') >= 0) {\n query = {\n ...query,\n location: await getCurrentFolderUID(),\n query: query.query.replace('folder:current', '').trim(),\n };\n if (!query.query?.length) {\n query.query = '*';\n }\n }\n return Promise.resolve(query);\n}\n\nasync function getCurrentFolderUID(): Promise<string | undefined> {\n try {\n let dash = getDashboardSrv().getCurrent();\n if (!dash) {\n await delay(500); // may not be loaded yet\n dash = getDashboardSrv().getCurrent();\n }\n return Promise.resolve(dash?.meta?.folderUid);\n } catch (e) {\n console.error(e);\n }\n return undefined;\n}\n\nfunction delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { lastValueFrom } from 'rxjs';\n\nimport { ArrayVector, DataFrame, DataFrameView, getDisplayProcessor, SelectableValue } from '@grafana/data';\nimport { config, getBackendSrv } from '@grafana/runtime';\nimport { TermCount } from 'app/core/components/TagFilter/TagFilter';\nimport { getGrafanaDatasource } from 'app/plugins/datasource/grafana/datasource';\nimport { GrafanaQueryType } from 'app/plugins/datasource/grafana/types';\n\nimport { replaceCurrentFolderQuery } from './utils';\n\nimport { DashboardQueryResult, GrafanaSearcher, QueryResponse, SearchQuery, SearchResultMeta } from '.';\n\nexport class BlugeSearcher implements GrafanaSearcher {\n async search(query: SearchQuery): Promise<QueryResponse> {\n if (query.facet?.length) {\n throw new Error('facets not supported!');\n }\n return doSearchQuery(query);\n }\n\n async starred(query: SearchQuery): Promise<QueryResponse> {\n if (query.facet?.length) {\n throw new Error('facets not supported!');\n }\n // get the starred dashboards\n const starsUIDS = await getBackendSrv().get('api/user/stars');\n const starredQuery = {\n uid: starsUIDS,\n query: query.query ?? '*',\n };\n return doSearchQuery(starredQuery);\n }\n\n async tags(query: SearchQuery): Promise<TermCount[]> {\n const ds = await getGrafanaDatasource();\n const target = {\n refId: 'TagsQuery',\n queryType: GrafanaQueryType.Search,\n search: {\n ...query,\n query: query.query ?? '*',\n sort: undefined, // no need to sort the initial query results (not used)\n facet: [{ field: 'tag' }],\n limit: 1, // 0 would be better, but is ignored by the backend\n },\n };\n\n const data = (\n await lastValueFrom(\n ds.query({\n targets: [target],\n } as any)\n )\n ).data as DataFrame[];\n for (const frame of data) {\n if (frame.fields[0].name === 'tag') {\n return getTermCountsFrom(frame);\n }\n }\n return [];\n }\n\n // This should eventually be filled by an API call, but hardcoded is a good start\n getSortOptions(): Promise<SelectableValue[]> {\n const opts: SelectableValue[] = [\n { value: 'name_sort', label: 'Alphabetically (A-Z)' },\n { value: '-name_sort', label: 'Alphabetically (Z-A)' },\n ];\n\n if (config.licenseInfo.enabledFeatures.analytics) {\n for (const sf of sortFields) {\n opts.push({ value: `-${sf.name}`, label: `${sf.display} (most)` });\n opts.push({ value: `${sf.name}`, label: `${sf.display} (least)` });\n }\n for (const sf of sortTimeFields) {\n opts.push({ value: `-${sf.name}`, label: `${sf.display} (recent)` });\n opts.push({ value: `${sf.name}`, label: `${sf.display} (oldest)` });\n }\n }\n\n return Promise.resolve(opts);\n }\n}\n\nconst firstPageSize = 50;\nconst nextPageSizes = 100;\n\nasync function doSearchQuery(query: SearchQuery): Promise<QueryResponse> {\n query = await replaceCurrentFolderQuery(query);\n const ds = await getGrafanaDatasource();\n const target = {\n refId: 'Search',\n queryType: GrafanaQueryType.Search,\n search: {\n ...query,\n query: query.query ?? '*',\n limit: query.limit ?? firstPageSize,\n },\n };\n const rsp = await lastValueFrom(\n ds.query({\n targets: [target],\n } as any)\n );\n\n const first = (rsp.data?.[0] as DataFrame) ?? { fields: [], length: 0 };\n for (const field of first.fields) {\n field.display = getDisplayProcessor({ field, theme: config.theme2 });\n }\n\n // Make sure the object exists\n if (!first.meta?.custom) {\n first.meta = {\n ...first.meta,\n custom: {\n count: first.length,\n max_score: 1,\n },\n };\n }\n\n const meta = first.meta.custom as SearchResultMeta;\n if (!meta.locationInfo) {\n meta.locationInfo = {}; // always set it so we can append\n }\n\n // Set the field name to a better display name\n if (meta.sortBy?.length) {\n const field = first.fields.find((f) => f.name === meta.sortBy);\n if (field) {\n const name = getSortFieldDisplayName(field.name);\n meta.sortBy = name;\n field.name = name; // make it look nicer\n }\n }\n\n let loadMax = 0;\n let pending: Promise<void> | undefined = undefined;\n const getNextPage = async () => {\n while (loadMax > view.dataFrame.length) {\n const from = view.dataFrame.length;\n if (from >= meta.count) {\n return;\n }\n const frame = (\n await lastValueFrom(\n ds.query({\n targets: [\n {\n ...target,\n search: {\n ...(target?.search ?? {}),\n from,\n limit: nextPageSizes,\n },\n refId: 'Page',\n facet: undefined,\n },\n ],\n } as any)\n )\n ).data?.[0] as DataFrame;\n\n if (!frame) {\n console.log('no results', frame);\n return;\n }\n if (frame.fields.length !== view.dataFrame.fields.length) {\n console.log('invalid shape', frame, view.dataFrame);\n return;\n }\n\n // Append the raw values to the same array buffer\n const length = frame.length + view.dataFrame.length;\n for (let i = 0; i < frame.fields.length; i++) {\n const values = (view.dataFrame.fields[i].values as ArrayVector).buffer;\n values.push(...frame.fields[i].values.toArray());\n }\n view.dataFrame.length = length;\n\n // Add all the location lookup info\n const submeta = frame.meta?.custom as SearchResultMeta;\n if (submeta?.locationInfo && meta) {\n for (const [key, value] of Object.entries(submeta.locationInfo)) {\n meta.locationInfo[key] = value;\n }\n }\n }\n pending = undefined;\n };\n\n const view = new DataFrameView<DashboardQueryResult>(first);\n return {\n totalRows: meta.count ?? first.length,\n view,\n loadMoreItems: async (startIndex: number, stopIndex: number): Promise<void> => {\n loadMax = Math.max(loadMax, stopIndex);\n if (!pending) {\n pending = getNextPage();\n }\n return pending;\n },\n isItemLoaded: (index: number): boolean => {\n return index < view.dataFrame.length;\n },\n };\n}\n\nfunction getTermCountsFrom(frame: DataFrame): TermCount[] {\n const keys = frame.fields[0].values;\n const vals = frame.fields[1].values;\n const counts: TermCount[] = [];\n for (let i = 0; i < frame.length; i++) {\n counts.push({ term: keys.get(i), count: vals.get(i) });\n }\n return counts;\n}\n\n// Enterprise only sort field values for dashboards\nconst sortFields = [\n { name: 'views_total', display: 'Views total' },\n { name: 'views_last_30_days', display: 'Views 30 days' },\n { name: 'errors_total', display: 'Errors total' },\n { name: 'errors_last_30_days', display: 'Errors 30 days' },\n];\n\n// Enterprise only time sort field values for dashboards\nconst sortTimeFields = [\n { name: 'created_at', display: 'Created time' },\n { name: 'updated_at', display: 'Updated time' },\n];\n\n/** Given the internal field name, this gives a reasonable display name for the table colum header */\nfunction getSortFieldDisplayName(name: string) {\n for (const sf of sortFields) {\n if (sf.name === name) {\n return sf.display;\n }\n }\n for (const sf of sortTimeFields) {\n if (sf.name === name) {\n return sf.display;\n }\n }\n return name;\n}\n","import { ArrayVector, DataFrame, DataFrameView, FieldType, getDisplayProcessor, SelectableValue } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { TermCount } from 'app/core/components/TagFilter/TagFilter';\nimport { backendSrv } from 'app/core/services/backend_srv';\n\nimport { DashboardSearchHit } from '../types';\n\nimport { LocationInfo } from './types';\nimport { replaceCurrentFolderQuery } from './utils';\n\nimport { DashboardQueryResult, GrafanaSearcher, QueryResponse, SearchQuery } from '.';\n\ninterface APIQuery {\n query?: string;\n tag?: string[];\n limit?: number;\n page?: number;\n type?: string;\n // DashboardIds []int64\n dashboardUID?: string[];\n folderIds?: number[];\n sort?: string;\n starred?: boolean;\n}\n\n// Internal object to hold folderId\ninterface LocationInfoEXT extends LocationInfo {\n folderId?: number;\n}\n\nexport class SQLSearcher implements GrafanaSearcher {\n locationInfo: Record<string, LocationInfoEXT> = {\n general: {\n kind: 'folder',\n name: 'General',\n url: '/dashboards',\n folderId: 0,\n },\n }; // share location info with everyone\n\n async search(query: SearchQuery): Promise<QueryResponse> {\n if (query.facet?.length) {\n throw new Error('facets not supported!');\n }\n const q: APIQuery = {\n limit: query.limit ?? 1000, // default 1k max values\n tag: query.tags,\n sort: query.sort,\n };\n\n query = await replaceCurrentFolderQuery(query);\n if (query.query === '*') {\n if (query.kind?.length === 1 && query.kind[0] === 'folder') {\n q.type = 'dash-folder';\n }\n } else if (query.query?.length) {\n q.query = query.query;\n }\n\n if (query.uid) {\n q.dashboardUID = query.uid;\n } else if (query.location?.length) {\n let info = this.locationInfo[query.location];\n if (!info) {\n // This will load all folder folders\n await this.doAPIQuery({ type: 'dash-folder', limit: 999 });\n info = this.locationInfo[query.location];\n }\n q.folderIds = [info.folderId ?? 0];\n }\n return this.doAPIQuery(q);\n }\n\n async starred(query: SearchQuery): Promise<QueryResponse> {\n if (query.facet?.length) {\n throw new Error('facets not supported!');\n }\n const q: APIQuery = {\n limit: query.limit ?? 1000, // default 1k max values\n tag: query.tags,\n sort: query.sort,\n starred: query.starred,\n };\n\n query = await replaceCurrentFolderQuery(query);\n if (query.query === '*') {\n if (query.kind?.length === 1 && query.kind[0] === 'folder') {\n q.type = 'dash-folder';\n }\n } else if (query.query?.length) {\n q.query = query.query;\n }\n\n if (query.uid) {\n q.dashboardUID = query.uid;\n } else if (query.location?.length) {\n let info = this.locationInfo[query.location];\n if (!info) {\n // This will load all folder folders\n await this.doAPIQuery({ type: 'dash-folder', limit: 999 });\n info = this.locationInfo[query.location];\n }\n q.folderIds = [info.folderId ?? 0];\n }\n return this.doAPIQuery(q);\n }\n\n // returns the appropriate sorting options\n async getSortOptions(): Promise<SelectableValue[]> {\n // {\n // \"sortOptions\": [\n // {\n // \"description\": \"Sort results in an alphabetically ascending order\",\n // \"displayName\": \"Alphabetically (A–Z)\",\n // \"meta\": \"\",\n // \"name\": \"alpha-asc\"\n // },\n // {\n // \"description\": \"Sort results in an alphabetically descending order\",\n // \"displayName\": \"Alphabetically (Z–A)\",\n // \"meta\": \"\",\n // \"name\": \"alpha-desc\"\n // }\n // ]\n // }\n const opts = await backendSrv.get('/api/search/sorting');\n return opts.sortOptions.map((v: any) => ({\n value: v.name,\n label: v.displayName,\n }));\n }\n\n // NOTE: the bluge query will find tags within the current results, the SQL based one does not\n async tags(query: SearchQuery): Promise<TermCount[]> {\n const terms = await backendSrv.get<TermCount[]>('/api/dashboards/tags');\n return terms.sort((a, b) => b.count - a.count);\n }\n\n async doAPIQuery(query: APIQuery): Promise<QueryResponse> {\n const rsp = await backendSrv.get<DashboardSearchHit[]>('/api/search', query);\n\n // Field values (columnar)\n const kind: string[] = [];\n const name: string[] = [];\n const uid: string[] = [];\n const url: string[] = [];\n const tags: string[][] = [];\n const location: string[] = [];\n const sortBy: number[] = [];\n let sortMetaName: string | undefined;\n\n for (let hit of rsp) {\n const k = hit.type === 'dash-folder' ? 'folder' : 'dashboard';\n kind.push(k);\n name.push(hit.title);\n uid.push(hit.uid!);\n url.push(hit.url);\n tags.push(hit.tags);\n sortBy.push(hit.sortMeta!);\n\n let v = hit.folderUid;\n if (!v && k === 'dashboard') {\n v = 'general';\n }\n location.push(v!);\n\n if (hit.sortMetaName?.length) {\n sortMetaName = hit.sortMetaName;\n }\n\n if (hit.folderUid && hit.folderTitle) {\n this.locationInfo[hit.folderUid] = {\n kind: 'folder',\n name: hit.folderTitle,\n url: hit.folderUrl!,\n folderId: hit.folderId,\n };\n } else if (k === 'folder') {\n this.locationInfo[hit.uid!] = {\n kind: k,\n name: hit.title!,\n url: hit.url,\n folderId: hit.id,\n };\n }\n }\n\n const data: DataFrame = {\n fields: [\n { name: 'kind', type: FieldType.string, config: {}, values: new ArrayVector(kind) },\n { name: 'name', type: FieldType.string, config: {}, values: new ArrayVector(name) },\n { name: 'uid', type: FieldType.string, config: {}, values: new ArrayVector(uid) },\n { name: 'url', type: FieldType.string, config: {}, values: new ArrayVector(url) },\n { name: 'tags', type: FieldType.other, config: {}, values: new ArrayVector(tags) },\n { name: 'location', type: FieldType.string, config: {}, values: new ArrayVector(location) },\n ],\n length: name.length,\n meta: {\n custom: {\n count: name.length,\n max_score: 1,\n locationInfo: this.locationInfo,\n },\n },\n };\n\n // Add enterprise sort fields as a field in the frame\n if (sortMetaName?.length && sortBy.length) {\n data.meta!.custom!.sortBy = sortMetaName;\n data.fields.push({\n name: sortMetaName, // Used in display\n type: FieldType.number,\n config: {},\n values: new ArrayVector(sortBy),\n });\n }\n\n for (const field of data.fields) {\n field.display = getDisplayProcessor({ field, theme: config.theme2 });\n }\n\n const view = new DataFrameView<DashboardQueryResult>(data);\n return {\n totalRows: data.length,\n view,\n\n // Paging not supported with this version\n loadMoreItems: async (startIndex: number, stopIndex: number): Promise<void> => {},\n isItemLoaded: (index: number): boolean => true,\n };\n }\n}\n","import { config } from '@grafana/runtime';\n\nimport { BlugeSearcher } from './bluge';\nimport { SQLSearcher } from './sql';\nimport { GrafanaSearcher } from './types';\n\nlet searcher: GrafanaSearcher | undefined = undefined;\n\nexport function getGrafanaSearcher(): GrafanaSearcher {\n if (!searcher) {\n const useBluge = config.featureToggles.panelTitleSearch;\n searcher = useBluge ? new BlugeSearcher() : new SQLSearcher();\n }\n return searcher!;\n}\n","import { Action } from 'redux';\n\nimport { SelectableValue, WithAccessControlMetadata } from '@grafana/data';\n\nexport enum DashboardSearchItemType {\n DashDB = 'dash-db',\n DashHome = 'dash-home',\n DashFolder = 'dash-folder',\n}\n\n/**\n * @deprecated\n */\nexport interface DashboardSection {\n id: number;\n uid?: string;\n title: string;\n expanded?: boolean;\n url: string;\n icon?: string;\n score?: number;\n checked?: boolean;\n items: DashboardSectionItem[];\n toggle?: (section: DashboardSection) => Promise<DashboardSection>;\n selected?: boolean;\n type: DashboardSearchItemType;\n slug?: string;\n itemsFetching?: boolean;\n}\n\n/**\n * @deprecated\n */\nexport interface DashboardSectionItem {\n checked?: boolean;\n folderId?: number;\n folderTitle?: string;\n folderUid?: string;\n folderUrl?: string;\n id: number;\n isStarred: boolean;\n selected?: boolean;\n tags: string[];\n title: string;\n type: DashboardSearchItemType;\n icon?: string; // used for grid view\n uid?: string;\n uri: string;\n url: string;\n sortMeta?: number;\n sortMetaName?: string;\n}\n\n/**\n * @deprecated - It uses dashboard ID which is depreacted in favor of dashboard UID. Please, use DashboardSearchItem instead.\n */\nexport interface DashboardSearchHit extends DashboardSectionItem, DashboardSection, WithAccessControlMetadata {}\n\nexport interface DashboardSearchItem extends Omit<DashboardSearchHit, 'id'> {}\n\nexport interface SearchAction extends Action {\n payload?: any;\n}\n\nexport interface DashboardQuery {\n query: string;\n tag: string[];\n starred: boolean;\n explain?: boolean; // adds debug info\n datasource?: string;\n sort: SelectableValue | null;\n // Save sorting data between layouts\n prevSort: SelectableValue | null;\n layout: SearchLayout;\n}\n\nexport type OnToggleChecked = (item: DashboardSectionItem | DashboardSection) => void;\n\nexport enum SearchLayout {\n List = 'list',\n Folders = 'folders',\n Grid = 'grid', // preview\n}\n\nexport interface SearchQueryParams {\n query?: string | null;\n sort?: string | null;\n starred?: boolean | null;\n tag?: string[] | null;\n layout?: SearchLayout | null;\n folder?: string | null;\n}\n\n// new Search Types\nexport type OnMoveOrDeleleSelectedItems = () => void;\n","import { UrlQueryMap } from '@grafana/data';\n\nimport { SECTION_STORAGE_KEY } from './constants';\nimport { DashboardQuery } from './types';\n\n/**\n * Check if search query has filters enabled. Excludes folderId\n * @param query\n */\nexport const hasFilters = (query: DashboardQuery) => {\n if (!query) {\n return false;\n }\n return Boolean(query.query || query.tag?.length > 0 || query.starred || query.sort);\n};\n\n/**\n * Get storage key for a dashboard folder by its title\n * @param title\n */\nexport const getSectionStorageKey = (title = 'General') => {\n return `${SECTION_STORAGE_KEY}.${title.toLowerCase()}`;\n};\n\n/**\n * Remove undefined keys from url params object and format non-primitive values\n * @param params\n * @param folder\n */\nexport const parseRouteParams = (params: UrlQueryMap) => {\n const cleanedParams = Object.entries(params).reduce((obj, [key, val]) => {\n if (!val) {\n return obj;\n } else if (key === 'tag' && !Array.isArray(val)) {\n return { ...obj, tag: [val] as string[] };\n } else if (key === 'sort') {\n return { ...obj, sort: { value: val } };\n }\n return { ...obj, [key]: val };\n }, {} as Partial<DashboardQuery>);\n\n if (params.folder) {\n const folderStr = `folder:${params.folder}`;\n return {\n ...cleanedParams,\n query: `${folderStr} ${(cleanedParams.query ?? '').replace(folderStr, '')}`,\n };\n }\n\n return { ...cleanedParams };\n};\n","import { css } from '@emotion/css';\nimport React, { useEffect, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport {\n Button,\n ClipboardButton,\n DatePickerWithInput,\n Field,\n Input,\n Modal,\n RadioButtonGroup,\n useStyles2,\n} from '@grafana/ui';\n\nconst EXPIRATION_OPTIONS = [\n { label: 'No expiration', value: false },\n { label: 'Set expiration date', value: true },\n];\n\nexport type ServiceAccountToken = {\n name: string;\n secondsToLive?: number;\n};\n\ninterface Props {\n isOpen: boolean;\n token: string;\n serviceAccountLogin: string;\n onCreateToken: (token: ServiceAccountToken) => void;\n onClose: () => void;\n}\n\nexport const CreateTokenModal = ({ isOpen, token, serviceAccountLogin, onCreateToken, onClose }: Props) => {\n let tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n\n const [defaultTokenName, setDefaultTokenName] = useState('');\n const [newTokenName, setNewTokenName] = useState('');\n const [isWithExpirationDate, setIsWithExpirationDate] = useState(false);\n const [newTokenExpirationDate, setNewTokenExpirationDate] = useState<Date | string>(tomorrow);\n const [isExpirationDateValid, setIsExpirationDateValid] = useState(newTokenExpirationDate !== '');\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n // Generate new token name every time we open modal\n if (isOpen) {\n setDefaultTokenName(`${serviceAccountLogin}-${uuidv4()}`);\n }\n }, [serviceAccountLogin, isOpen]);\n\n const onExpirationDateChange = (value: Date | string) => {\n const isValid = value !== '';\n setIsExpirationDateValid(isValid);\n setNewTokenExpirationDate(value);\n };\n\n const onGenerateToken = () => {\n onCreateToken({\n name: newTokenName || defaultTokenName,\n secondsToLive: isWithExpirationDate ? getSecondsToLive(newTokenExpirationDate) : undefined,\n });\n };\n\n const onCloseInternal = () => {\n setNewTokenName('');\n setDefaultTokenName('');\n setIsWithExpirationDate(false);\n setNewTokenExpirationDate(tomorrow);\n setIsExpirationDateValid(newTokenExpirationDate !== '');\n onClose();\n };\n\n const modalTitle = !token ? 'Add service account token' : 'Service account token created';\n\n return (\n <Modal\n isOpen={isOpen}\n title={modalTitle}\n onDismiss={onCloseInternal}\n className={styles.modal}\n contentClassName={styles.modalContent}\n >\n {!token ? (\n <div>\n <Field\n label=\"Display name\"\n description=\"Name to easily identify the token\"\n // for now this is required\n // need to make this optional in backend as well\n required={true}\n >\n <Input\n name=\"tokenName\"\n value={newTokenName}\n placeholder={defaultTokenName}\n onChange={(e) => {\n setNewTokenName(e.currentTarget.value);\n }}\n />\n </Field>\n <Field label=\"Expiration\">\n <RadioButtonGroup\n options={EXPIRATION_OPTIONS}\n value={isWithExpirationDate}\n onChange={setIsWithExpirationDate}\n size=\"md\"\n />\n </Field>\n {isWithExpirationDate && (\n <Field label=\"Expiration date\">\n <DatePickerWithInput\n onChange={onExpirationDateChange}\n value={newTokenExpirationDate}\n placeholder=\"\"\n minDate={tomorrow}\n />\n </Field>\n )}\n <Modal.ButtonRow>\n <Button onClick={onGenerateToken} disabled={isWithExpirationDate && !isExpirationDateValid}>\n Generate token\n </Button>\n </Modal.ButtonRow>\n </div>\n ) : (\n <>\n <Field\n label=\"Token\"\n description=\"Copy the token now as you will not be able to see it again. Loosing a token requires creating a new one.\"\n >\n <div className={styles.modalTokenRow}>\n <Input name=\"tokenValue\" value={token} readOnly />\n <ClipboardButton\n className={styles.modalCopyToClipboardButton}\n variant=\"primary\"\n size=\"md\"\n icon=\"copy\"\n getText={() => token}\n >\n Copy clipboard\n </ClipboardButton>\n </div>\n </Field>\n <Modal.ButtonRow>\n <ClipboardButton variant=\"primary\" getText={() => token} onClipboardCopy={onCloseInternal}>\n Copy to clipboard and close\n </ClipboardButton>\n <Button variant=\"secondary\" onClick={onCloseInternal}>\n Close\n </Button>\n </Modal.ButtonRow>\n </>\n )}\n </Modal>\n );\n};\n\nconst getSecondsToLive = (date: Date | string) => {\n const dateAsDate = new Date(date);\n const now = new Date();\n\n return Math.ceil((dateAsDate.getTime() - now.getTime()) / 1000);\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n modal: css`\n width: 550px;\n `,\n modalContent: css`\n overflow: visible;\n `,\n modalTokenRow: css`\n display: flex;\n `,\n modalCopyToClipboardButton: css`\n margin-left: ${theme.spacing(0.5)};\n `,\n };\n};\n","export const API_KEYS_MIGRATION_INFO_STORAGE_KEY = 'grafana.serviceaccounts.showApiKeysMigrationInfo';\n","import { debounce } from 'lodash';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { fetchBuiltinRoles, fetchRoleOptions } from 'app/core/components/RolePicker/api';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport store from 'app/core/store';\nimport { AccessControlAction, ServiceAccountDTO, ServiceAccountStateFilter, ThunkResult } from 'app/types';\n\nimport { ServiceAccountToken } from '../components/CreateTokenModal';\nimport { API_KEYS_MIGRATION_INFO_STORAGE_KEY } from '../constants';\n\nimport {\n acOptionsLoaded,\n builtInRolesLoaded,\n pageChanged,\n queryChanged,\n serviceAccountsFetchBegin,\n serviceAccountsFetched,\n serviceAccountsFetchEnd,\n apiKeysMigrationStatusLoaded,\n stateFilterChanged,\n showApiKeysMigrationInfoLoaded,\n} from './reducers';\n\nconst BASE_URL = `/api/serviceaccounts`;\n\nexport function fetchACOptions(): ThunkResult<void> {\n return async (dispatch) => {\n try {\n if (contextSrv.licensedAccessControlEnabled() && contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {\n const options = await fetchRoleOptions();\n dispatch(acOptionsLoaded(options));\n }\n if (\n contextSrv.accessControlBuiltInRoleAssignmentEnabled() &&\n contextSrv.licensedAccessControlEnabled() &&\n contextSrv.hasPermission(AccessControlAction.ActionBuiltinRolesList)\n ) {\n const builtInRoles = await fetchBuiltinRoles();\n dispatch(builtInRolesLoaded(builtInRoles));\n }\n } catch (error) {\n console.error(error);\n }\n };\n}\n\nexport function getApiKeysMigrationStatus(): ThunkResult<void> {\n return async (dispatch) => {\n if (contextSrv.hasPermission(AccessControlAction.ServiceAccountsRead)) {\n const result = await getBackendSrv().get('/api/serviceaccounts/migrationstatus');\n dispatch(apiKeysMigrationStatusLoaded(!!result?.migrated));\n }\n };\n}\n\ninterface FetchServiceAccountsParams {\n withLoadingIndicator: boolean;\n}\n\nexport function fetchServiceAccounts(\n { withLoadingIndicator }: FetchServiceAccountsParams = { withLoadingIndicator: false }\n): ThunkResult<void> {\n return async (dispatch, getState) => {\n try {\n if (contextSrv.hasPermission(AccessControlAction.ServiceAccountsRead)) {\n if (withLoadingIndicator) {\n dispatch(serviceAccountsFetchBegin());\n }\n const { perPage, page, query, serviceAccountStateFilter } = getState().serviceAccounts;\n const result = await getBackendSrv().get(\n `/api/serviceaccounts/search?perpage=${perPage}&page=${page}&query=${query}${getStateFilter(\n serviceAccountStateFilter\n )}&accesscontrol=true`\n );\n dispatch(serviceAccountsFetched(result));\n }\n } catch (error) {\n console.error(error);\n } finally {\n dispatch(serviceAccountsFetchEnd());\n }\n };\n}\n\nconst fetchServiceAccountsWithDebounce = debounce((dispatch) => dispatch(fetchServiceAccounts()), 500, {\n leading: true,\n});\n\nexport function updateServiceAccount(serviceAccount: ServiceAccountDTO): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().patch(`${BASE_URL}/${serviceAccount.id}?accesscontrol=true`, {\n ...serviceAccount,\n });\n dispatch(fetchServiceAccounts());\n };\n}\n\nexport function deleteServiceAccount(serviceAccountId: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().delete(`${BASE_URL}/${serviceAccountId}`);\n dispatch(fetchServiceAccounts());\n };\n}\n\nexport function createServiceAccountToken(\n saID: number,\n token: ServiceAccountToken,\n onTokenCreated: (key: string) => void\n): ThunkResult<void> {\n return async (dispatch) => {\n const result = await getBackendSrv().post(`${BASE_URL}/${saID}/tokens`, token);\n onTokenCreated(result.key);\n dispatch(fetchServiceAccounts());\n };\n}\n\n// search / filtering of serviceAccounts\nconst getStateFilter = (value: ServiceAccountStateFilter) => {\n switch (value) {\n case ServiceAccountStateFilter.WithExpiredTokens:\n return '&expiredTokens=true';\n case ServiceAccountStateFilter.Disabled:\n return '&disabled=true';\n default:\n return '';\n }\n};\n\nexport function changeQuery(query: string): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(queryChanged(query));\n fetchServiceAccountsWithDebounce(dispatch);\n };\n}\n\nexport function changeStateFilter(filter: ServiceAccountStateFilter): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(stateFilterChanged(filter));\n dispatch(fetchServiceAccounts());\n };\n}\n\nexport function changePage(page: number): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(pageChanged(page));\n dispatch(fetchServiceAccounts());\n };\n}\n\nexport function getApiKeysMigrationInfo(): ThunkResult<void> {\n return async (dispatch) => {\n const showApiKeysMigrationInfo = store.getBool(API_KEYS_MIGRATION_INFO_STORAGE_KEY, false);\n dispatch(showApiKeysMigrationInfoLoaded(showApiKeysMigrationInfo));\n };\n}\n\nexport function closeApiKeysMigrationInfo(): ThunkResult<void> {\n return async (dispatch) => {\n store.set(API_KEYS_MIGRATION_INFO_STORAGE_KEY, false);\n dispatch(getApiKeysMigrationInfo());\n };\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport {\n ApiKey,\n Role,\n ServiceAccountDTO,\n ServiceAccountProfileState,\n ServiceAccountsState,\n ServiceAccountStateFilter,\n} from 'app/types';\n\n// serviceAccountsProfilePage\nexport const initialStateProfile: ServiceAccountProfileState = {\n serviceAccount: {} as ServiceAccountDTO,\n isLoading: true,\n tokens: [] as ApiKey[],\n};\n\nexport const serviceAccountProfileSlice = createSlice({\n name: 'serviceaccount',\n initialState: initialStateProfile,\n reducers: {\n serviceAccountFetchBegin: (state) => {\n return { ...state, isLoading: true };\n },\n serviceAccountFetchEnd: (state) => {\n return { ...state, isLoading: false };\n },\n serviceAccountLoaded: (state, action: PayloadAction<ServiceAccountDTO>): ServiceAccountProfileState => {\n return { ...state, serviceAccount: action.payload, isLoading: false };\n },\n serviceAccountTokensLoaded: (state, action: PayloadAction<ApiKey[]>): ServiceAccountProfileState => {\n return { ...state, tokens: action.payload, isLoading: false };\n },\n },\n});\n\nexport const serviceAccountProfileReducer = serviceAccountProfileSlice.reducer;\nexport const { serviceAccountLoaded, serviceAccountTokensLoaded, serviceAccountFetchBegin, serviceAccountFetchEnd } =\n serviceAccountProfileSlice.actions;\n\n// serviceAccountsListPage\nexport const initialStateList: ServiceAccountsState = {\n serviceAccounts: [] as ServiceAccountDTO[],\n isLoading: true,\n builtInRoles: {},\n roleOptions: [],\n query: '',\n page: 0,\n perPage: 50,\n totalPages: 1,\n showPaging: false,\n serviceAccountStateFilter: ServiceAccountStateFilter.All,\n apiKeysMigrated: false,\n showApiKeysMigrationInfo: false,\n};\n\ninterface ServiceAccountsFetched {\n serviceAccounts: ServiceAccountDTO[];\n perPage: number;\n page: number;\n totalCount: number;\n}\n\nconst serviceAccountsSlice = createSlice({\n name: 'serviceaccounts',\n initialState: initialStateList,\n reducers: {\n serviceAccountsFetched: (state, action: PayloadAction<ServiceAccountsFetched>): ServiceAccountsState => {\n const { totalCount, perPage, ...rest } = action.payload;\n const totalPages = Math.ceil(totalCount / perPage);\n\n return {\n ...state,\n ...rest,\n totalPages,\n perPage,\n showPaging: totalPages > 1,\n isLoading: false,\n };\n },\n serviceAccountsFetchBegin: (state) => {\n return { ...state, isLoading: true };\n },\n serviceAccountsFetchEnd: (state) => {\n return { ...state, isLoading: false };\n },\n acOptionsLoaded: (state, action: PayloadAction<Role[]>): ServiceAccountsState => {\n return { ...state, roleOptions: action.payload };\n },\n builtInRolesLoaded: (state, action: PayloadAction<Record<string, Role[]>>): ServiceAccountsState => {\n return { ...state, builtInRoles: action.payload };\n },\n apiKeysMigrationStatusLoaded: (state, action): ServiceAccountsState => {\n return { ...state, apiKeysMigrated: action.payload };\n },\n showApiKeysMigrationInfoLoaded: (state, action): ServiceAccountsState => {\n return { ...state, showApiKeysMigrationInfo: action.payload };\n },\n queryChanged: (state, action: PayloadAction<string>) => {\n return {\n ...state,\n query: action.payload,\n page: 0,\n };\n },\n pageChanged: (state, action: PayloadAction<number>) => ({\n ...state,\n page: action.payload,\n }),\n stateFilterChanged: (state, action: PayloadAction<ServiceAccountStateFilter>) => ({\n ...state,\n serviceAccountStateFilter: action.payload,\n }),\n },\n});\nexport const serviceAccountsReducer = serviceAccountsSlice.reducer;\n\nexport const {\n serviceAccountsFetchBegin,\n serviceAccountsFetchEnd,\n serviceAccountsFetched,\n acOptionsLoaded,\n builtInRolesLoaded,\n apiKeysMigrationStatusLoaded,\n showApiKeysMigrationInfoLoaded,\n pageChanged,\n stateFilterChanged,\n queryChanged,\n} = serviceAccountsSlice.actions;\n\nexport default {\n serviceAccountProfile: serviceAccountProfileReducer,\n serviceAccounts: serviceAccountsReducer,\n};\n","import { DataFrame, dataFrameFromJSON, DataFrameJSON, getDisplayProcessor } from '@grafana/data';\nimport { config, getBackendSrv } from '@grafana/runtime';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardDTO } from 'app/types';\n\nimport { UploadReponse, StorageInfo, ItemOptions, WriteValueRequest, WriteValueResponse } from './types';\n\n// Likely should be built into the search interface!\nexport interface GrafanaStorage {\n get: <T = any>(path: string) => Promise<T>;\n list: (path: string) => Promise<DataFrame | undefined>;\n upload: (folder: string, file: File, overwriteExistingFile: boolean) => Promise<UploadReponse>;\n createFolder: (path: string) => Promise<{ error?: string }>;\n delete: (path: { isFolder: boolean; path: string }) => Promise<{ error?: string }>;\n\n /** Admin only */\n getConfig: () => Promise<StorageInfo[]>;\n\n /** Called before save */\n getOptions: (path: string) => Promise<ItemOptions>;\n\n /**\n * Temporary shim that will return a DashboardDTO shape for files in storage\n * Longer term, this will call an \"Entity API\" that is eventually backed by storage\n */\n getDashboard: (path: string) => Promise<DashboardDTO>;\n\n /** Saves dashbaords */\n write: (path: string, options: WriteValueRequest) => Promise<WriteValueResponse>;\n}\n\nclass SimpleStorage implements GrafanaStorage {\n constructor() {}\n\n async get<T = any>(path: string): Promise<T> {\n const storagePath = `api/storage/read/${path}`.replace('//', '/');\n return getBackendSrv().get<T>(storagePath);\n }\n\n async list(path: string): Promise<DataFrame | undefined> {\n let url = 'api/storage/list/';\n if (path) {\n url += path + '/';\n }\n const rsp = await getBackendSrv().get<DataFrameJSON>(url);\n if (rsp?.data) {\n const f = dataFrameFromJSON(rsp);\n for (const field of f.fields) {\n field.display = getDisplayProcessor({ field, theme: config.theme2 });\n }\n return f;\n }\n return undefined;\n }\n\n async createFolder(path: string): Promise<{ error?: string }> {\n const res = await getBackendSrv().post<{ success: boolean; message: string }>(\n '/api/storage/createFolder',\n JSON.stringify({ path })\n );\n\n if (!res.success) {\n return {\n error: res.message ?? 'unknown error',\n };\n }\n\n return {};\n }\n\n async deleteFolder(req: { path: string; force: boolean }): Promise<{ error?: string }> {\n const res = await getBackendSrv().post<{ success: boolean; message: string }>(\n `/api/storage/deleteFolder`,\n JSON.stringify(req)\n );\n\n if (!res.success) {\n return {\n error: res.message ?? 'unknown error',\n };\n }\n\n return {};\n }\n\n async deleteFile(req: { path: string }): Promise<{ error?: string }> {\n const res = await getBackendSrv().post<{ success: boolean; message: string }>(`/api/storage/delete/${req.path}`);\n\n if (!res.success) {\n return {\n error: res.message ?? 'unknown error',\n };\n }\n\n return {};\n }\n\n async delete(req: { isFolder: boolean; path: string }): Promise<{ error?: string }> {\n return req.isFolder ? this.deleteFolder({ path: req.path, force: true }) : this.deleteFile({ path: req.path });\n }\n\n async upload(folder: string, file: File, overwriteExistingFile: boolean): Promise<UploadReponse> {\n const formData = new FormData();\n formData.append('folder', folder);\n formData.append('file', file);\n formData.append('overwriteExistingFile', String(overwriteExistingFile));\n const res = await fetch('/api/storage/upload', {\n method: 'POST',\n body: formData,\n });\n\n let body = (await res.json()) as UploadReponse;\n if (!body) {\n body = {} as any;\n }\n body.status = res.status;\n body.statusText = res.statusText;\n if (res.status !== 200 && !body.err) {\n body.err = true;\n }\n return body;\n }\n\n // Temporary shim that can be loaded into the existing dashboard page structure\n async getDashboard(path: string): Promise<DashboardDTO> {\n if (!config.featureToggles.dashboardsFromStorage) {\n return Promise.reject('Dashboards from storage is not enabled');\n }\n\n if (!path.endsWith('.json')) {\n path += '.json';\n }\n\n const result = await backendSrv.get(`/api/storage/read/${path}`);\n result.uid = path;\n delete result.id; // Saved with the dev dashboards!\n\n return {\n meta: {\n uid: path,\n slug: path,\n canEdit: true,\n canSave: true,\n canStar: false, // needs id\n },\n dashboard: result,\n };\n }\n\n async write(path: string, options: WriteValueRequest): Promise<WriteValueResponse> {\n return backendSrv.post<WriteValueResponse>(`/api/storage/write/${path}`, options);\n }\n\n async getConfig() {\n return getBackendSrv().get<StorageInfo[]>('/api/storage/config');\n }\n\n async getOptions(path: string) {\n return getBackendSrv().get<ItemOptions>(`/api/storage/options/${path}`);\n }\n}\n\nexport function filenameAlreadyExists(folderName: string, fileNames: string[]) {\n const lowerCase = folderName.toLowerCase();\n const trimmedLowerCase = lowerCase.trim();\n const existingTrimmedLowerCaseNames = fileNames.map((f) => f.trim().toLowerCase());\n\n return existingTrimmedLowerCaseNames.includes(trimmedLowerCase);\n}\n\nlet storage: GrafanaStorage | undefined;\n\nexport function getGrafanaStorage() {\n if (!storage) {\n storage = new SimpleStorage();\n }\n return storage;\n}\n","import { QueryResultMetaNotice, SelectableValue } from '@grafana/data';\n\nexport enum StorageView {\n Data = 'data',\n Config = 'config',\n Perms = 'perms',\n Export = 'export',\n History = 'history',\n AddRoot = 'add',\n}\n\nexport interface UploadReponse {\n status: number;\n statusText: string;\n\n err?: boolean;\n message: string;\n path: string;\n}\n\nexport interface StorageInfo {\n editable?: boolean;\n builtin?: boolean;\n ready?: boolean;\n notice?: QueryResultMetaNotice[];\n config: StorageConfig;\n}\n\nexport interface StorageConfig {\n type: string;\n prefix: string;\n name: string;\n description: string;\n disk?: {\n path: string;\n };\n git?: {\n remote: string;\n branch: string;\n root: string;\n requirePullRequest: boolean;\n accessToken: string;\n };\n sql?: {};\n}\n\nexport enum WorkflowID {\n Save = 'save',\n PR = 'pr',\n Push = 'push',\n}\n\nexport interface WriteValueRequest {\n kind: string;\n body: {}; // json body\n message?: string;\n title?: string;\n workflow: WorkflowID;\n}\n\nexport interface WriteValueResponse {\n code: number;\n message?: string;\n url?: string;\n hash?: string;\n branch?: string;\n pending?: boolean;\n size?: number;\n}\n\nexport interface ItemOptions {\n path: string;\n workflows: Array<SelectableValue<WorkflowID>>;\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Team, TeamGroup, TeamMember, TeamsState, TeamState } from 'app/types';\n\nexport const initialTeamsState: TeamsState = { teams: [], searchQuery: '', searchPage: 1, hasFetched: false };\n\nconst teamsSlice = createSlice({\n name: 'teams',\n initialState: initialTeamsState,\n reducers: {\n teamsLoaded: (state, action: PayloadAction<Team[]>): TeamsState => {\n return { ...state, hasFetched: true, teams: action.payload };\n },\n setSearchQuery: (state, action: PayloadAction<string>): TeamsState => {\n return { ...state, searchQuery: action.payload, searchPage: initialTeamsState.searchPage };\n },\n setTeamsSearchPage: (state, action: PayloadAction<number>): TeamsState => {\n return { ...state, searchPage: action.payload };\n },\n },\n});\n\nexport const { teamsLoaded, setSearchQuery, setTeamsSearchPage } = teamsSlice.actions;\n\nexport const teamsReducer = teamsSlice.reducer;\n\nexport const initialTeamState: TeamState = {\n team: {} as Team,\n members: [] as TeamMember[],\n groups: [] as TeamGroup[],\n searchMemberQuery: '',\n};\n\nconst teamSlice = createSlice({\n name: 'team',\n initialState: initialTeamState,\n reducers: {\n teamLoaded: (state, action: PayloadAction<Team>): TeamState => {\n return { ...state, team: action.payload };\n },\n teamMembersLoaded: (state, action: PayloadAction<TeamMember[]>): TeamState => {\n return { ...state, members: action.payload };\n },\n setSearchMemberQuery: (state, action: PayloadAction<string>): TeamState => {\n return { ...state, searchMemberQuery: action.payload };\n },\n teamGroupsLoaded: (state, action: PayloadAction<TeamGroup[]>): TeamState => {\n return { ...state, groups: action.payload };\n },\n },\n});\n\nexport const { teamLoaded, teamGroupsLoaded, teamMembersLoaded, setSearchMemberQuery } = teamSlice.actions;\n\nexport const teamReducer = teamSlice.reducer;\n\nexport default {\n teams: teamsReducer,\n team: teamReducer,\n};\n","import { isArray, map, replace } from 'lodash';\n\nimport { dateTime, Registry, RegistryItem, textUtil, VariableModel } from '@grafana/data';\nimport kbn from 'app/core/utils/kbn';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../variables/constants';\nimport { formatVariableLabel } from '../variables/shared/formatVariable';\n\nexport interface FormatOptions {\n value: any;\n text: string;\n args: string[];\n}\n\nexport interface FormatRegistryItem extends RegistryItem {\n formatter(options: FormatOptions, variable: VariableModel): string;\n}\n\nexport enum FormatRegistryID {\n lucene = 'lucene',\n raw = 'raw',\n regex = 'regex',\n pipe = 'pipe',\n distributed = 'distributed',\n csv = 'csv',\n html = 'html',\n json = 'json',\n percentEncode = 'percentencode',\n singleQuote = 'singlequote',\n doubleQuote = 'doublequote',\n sqlString = 'sqlstring',\n date = 'date',\n glob = 'glob',\n text = 'text',\n queryParam = 'queryparam',\n}\n\nexport const formatRegistry = new Registry<FormatRegistryItem>(() => {\n const formats: FormatRegistryItem[] = [\n {\n id: FormatRegistryID.lucene,\n name: 'Lucene',\n description: 'Values are lucene escaped and multi-valued variables generate an OR expression',\n formatter: ({ value }) => {\n if (typeof value === 'string') {\n return luceneEscape(value);\n }\n\n if (value instanceof Array && value.length === 0) {\n return '__empty__';\n }\n\n const quotedValues = map(value, (val: string) => {\n return '\"' + luceneEscape(val) + '\"';\n });\n\n return '(' + quotedValues.join(' OR ') + ')';\n },\n },\n {\n id: FormatRegistryID.raw,\n name: 'raw',\n description: 'Keep value as is',\n formatter: ({ value }) => value,\n },\n {\n id: FormatRegistryID.regex,\n name: 'Regex',\n description: 'Values are regex escaped and multi-valued variables generate a (<value>|<value>) expression',\n formatter: ({ value }) => {\n if (typeof value === 'string') {\n return kbn.regexEscape(value);\n }\n\n const escapedValues = map(value, kbn.regexEscape);\n if (escapedValues.length === 1) {\n return escapedValues[0];\n }\n return '(' + escapedValues.join('|') + ')';\n },\n },\n {\n id: FormatRegistryID.pipe,\n name: 'Pipe',\n description: 'Values are separated by | character',\n formatter: ({ value }) => {\n if (typeof value === 'string') {\n return value;\n }\n return value.join('|');\n },\n },\n {\n id: FormatRegistryID.distributed,\n name: 'Distributed',\n description: 'Multiple values are formatted like variable=value',\n formatter: ({ value }, variable) => {\n if (typeof value === 'string') {\n return value;\n }\n\n value = map(value, (val: any, index: number) => {\n if (index !== 0) {\n return variable.name + '=' + val;\n } else {\n return val;\n }\n });\n return value.join(',');\n },\n },\n {\n id: FormatRegistryID.csv,\n name: 'Csv',\n description: 'Comma-separated values',\n formatter: ({ value }) => {\n if (isArray(value)) {\n return value.join(',');\n }\n return value;\n },\n },\n {\n id: FormatRegistryID.html,\n name: 'HTML',\n description: 'HTML escaping of values',\n formatter: ({ value }) => {\n if (isArray(value)) {\n return textUtil.escapeHtml(value.join(', '));\n }\n return textUtil.escapeHtml(value);\n },\n },\n {\n id: FormatRegistryID.json,\n name: 'JSON',\n description: 'JSON stringify valu',\n formatter: ({ value }) => {\n return JSON.stringify(value);\n },\n },\n {\n id: FormatRegistryID.percentEncode,\n name: 'Percent encode',\n description: 'Useful for URL escaping values',\n formatter: ({ value }) => {\n // like glob, but url escaped\n if (isArray(value)) {\n return encodeURIComponentStrict('{' + value.join(',') + '}');\n }\n return encodeURIComponentStrict(value);\n },\n },\n {\n id: FormatRegistryID.singleQuote,\n name: 'Single quote',\n description: 'Single quoted values',\n formatter: ({ value }) => {\n // escape single quotes with backslash\n const regExp = new RegExp(`'`, 'g');\n if (isArray(value)) {\n return map(value, (v: string) => `'${replace(v, regExp, `\\\\'`)}'`).join(',');\n }\n return `'${replace(value, regExp, `\\\\'`)}'`;\n },\n },\n {\n id: FormatRegistryID.doubleQuote,\n name: 'Double quote',\n description: 'Double quoted values',\n formatter: ({ value }) => {\n // escape double quotes with backslash\n const regExp = new RegExp('\"', 'g');\n if (isArray(value)) {\n return map(value, (v: string) => `\"${replace(v, regExp, '\\\\\"')}\"`).join(',');\n }\n return `\"${replace(value, regExp, '\\\\\"')}\"`;\n },\n },\n {\n id: FormatRegistryID.sqlString,\n name: 'SQL string',\n description: 'SQL string quoting and commas for use in IN statements and other scenarios',\n formatter: ({ value }) => {\n // escape single quotes by pairing them\n const regExp = new RegExp(`'`, 'g');\n if (isArray(value)) {\n return map(value, (v) => `'${replace(v, regExp, \"''\")}'`).join(',');\n }\n return `'${replace(value, regExp, \"''\")}'`;\n },\n },\n {\n id: FormatRegistryID.date,\n name: 'Date',\n description: 'Format date in different ways',\n formatter: ({ value, args }) => {\n const arg = args[0] ?? 'iso';\n\n switch (arg) {\n case 'ms':\n return value;\n case 'seconds':\n return `${Math.round(parseInt(value, 10)! / 1000)}`;\n case 'iso':\n return dateTime(parseInt(value, 10)).toISOString();\n default:\n return dateTime(parseInt(value, 10)).format(arg);\n }\n },\n },\n {\n id: FormatRegistryID.glob,\n name: 'Glob',\n description: 'Format multi-valued variables using glob syntax, example {value1,value2}',\n formatter: ({ value }) => {\n if (isArray(value) && value.length > 1) {\n return '{' + value.join(',') + '}';\n }\n return value;\n },\n },\n {\n id: FormatRegistryID.text,\n name: 'Text',\n description: 'Format variables in their text representation. Example in multi-variable scenario A + B + C.',\n formatter: (options, variable) => {\n if (typeof options.text === 'string') {\n return options.value === ALL_VARIABLE_VALUE ? ALL_VARIABLE_TEXT : options.text;\n }\n\n const current = (variable as any)?.current;\n\n if (!current) {\n return options.value;\n }\n\n return formatVariableLabel(variable);\n },\n },\n {\n id: FormatRegistryID.queryParam,\n name: 'Query parameter',\n description:\n 'Format variables as URL parameters. Example in multi-variable scenario A + B + C => var-foo=A&var-foo=B&var-foo=C.',\n formatter: (options, variable) => {\n const { value } = options;\n const { name } = variable;\n\n if (Array.isArray(value)) {\n return value.map((v) => formatQueryParameter(name, v)).join('&');\n }\n\n return formatQueryParameter(name, value);\n },\n },\n ];\n\n return formats;\n});\n\nfunction luceneEscape(value: string) {\n return value.replace(/([\\!\\*\\+\\-\\=<>\\s\\&\\|\\(\\)\\[\\]\\{\\}\\^\\~\\?\\:\\\\/\"])/g, '\\\\$1');\n}\n\n/**\n * encode string according to RFC 3986; in contrast to encodeURIComponent()\n * also the sub-delims \"!\", \"'\", \"(\", \")\" and \"*\" are encoded;\n * unicode handling uses UTF-8 as in ECMA-262.\n */\nfunction encodeURIComponentStrict(str: string) {\n return encodeURIComponent(str).replace(/[!'()*]/g, (c) => {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n\nfunction formatQueryParameter(name: string, value: string): string {\n return `var-${name}=${encodeURIComponentStrict(value)}`;\n}\n\nexport function isAllValue(value: any) {\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n}\n","import { escape, isString, property } from 'lodash';\n\nimport { deprecationWarning, ScopedVars, TimeRange } from '@grafana/data';\nimport { getDataSourceSrv, setTemplateSrv, TemplateSrv as BaseTemplateSrv } from '@grafana/runtime';\n\nimport { variableAdapters } from '../variables/adapters';\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../variables/constants';\nimport { isAdHoc } from '../variables/guard';\nimport { getFilteredVariables, getVariables, getVariableWithName } from '../variables/state/selectors';\nimport { AdHocVariableFilter, AdHocVariableModel, VariableModel } from '../variables/types';\nimport { variableRegex } from '../variables/utils';\n\nimport { FormatOptions, formatRegistry, FormatRegistryID } from './formatRegistry';\n\ninterface FieldAccessorCache {\n [key: string]: (obj: any) => any;\n}\n\nexport interface TemplateSrvDependencies {\n getFilteredVariables: typeof getFilteredVariables;\n getVariables: typeof getVariables;\n getVariableWithName: typeof getVariableWithName;\n}\n\nconst runtimeDependencies: TemplateSrvDependencies = {\n getFilteredVariables,\n getVariables,\n getVariableWithName,\n};\n\nexport class TemplateSrv implements BaseTemplateSrv {\n private _variables: any[];\n private regex = variableRegex;\n private index: any = {};\n private grafanaVariables: any = {};\n private timeRange?: TimeRange | null = null;\n private fieldAccessorCache: FieldAccessorCache = {};\n\n constructor(private dependencies: TemplateSrvDependencies = runtimeDependencies) {\n this._variables = [];\n }\n\n init(variables: any, timeRange?: TimeRange) {\n this._variables = variables;\n this.timeRange = timeRange;\n this.updateIndex();\n }\n\n /**\n * @deprecated: this instance variable should not be used and will be removed in future releases\n *\n * Use getVariables function instead\n */\n get variables(): any[] {\n deprecationWarning('template_srv.ts', 'variables', 'getVariables');\n return this.getVariables();\n }\n\n getVariables(): VariableModel[] {\n return this.dependencies.getVariables();\n }\n\n updateIndex() {\n const existsOrEmpty = (value: any) => value || value === '';\n\n this.index = this._variables.reduce((acc, currentValue) => {\n if (currentValue.current && (currentValue.current.isNone || existsOrEmpty(currentValue.current.value))) {\n acc[currentValue.name] = currentValue;\n }\n return acc;\n }, {});\n\n if (this.timeRange) {\n const from = this.timeRange.from.valueOf().toString();\n const to = this.timeRange.to.valueOf().toString();\n\n this.index = {\n ...this.index,\n ['__from']: {\n current: { value: from, text: from },\n },\n ['__to']: {\n current: { value: to, text: to },\n },\n };\n }\n }\n\n updateTimeRange(timeRange: TimeRange) {\n this.timeRange = timeRange;\n this.updateIndex();\n }\n\n variableInitialized(variable: any) {\n this.index[variable.name] = variable;\n }\n\n getAdhocFilters(datasourceName: string): AdHocVariableFilter[] {\n let filters: any = [];\n let ds = getDataSourceSrv().getInstanceSettings(datasourceName);\n\n if (!ds) {\n return [];\n }\n\n for (const variable of this.getAdHocVariables()) {\n const variableUid = variable.datasource?.uid;\n\n if (variableUid === ds.uid) {\n filters = filters.concat(variable.filters);\n } else if (variableUid?.indexOf('$') === 0) {\n if (this.replace(variableUid) === datasourceName) {\n filters = filters.concat(variable.filters);\n }\n }\n }\n\n return filters;\n }\n\n formatValue(value: any, format: any, variable: any, text?: string): string {\n // for some scopedVars there is no variable\n variable = variable || {};\n\n if (value === null || value === undefined) {\n return '';\n }\n\n if (isAdHoc(variable) && format !== FormatRegistryID.queryParam) {\n return '';\n }\n\n // if it's an object transform value to string\n if (!Array.isArray(value) && typeof value === 'object') {\n value = `${value}`;\n }\n\n if (typeof format === 'function') {\n return format(value, variable, this.formatValue);\n }\n\n if (!format) {\n format = FormatRegistryID.glob;\n }\n\n // some formats have arguments that come after ':' character\n let args = format.split(':');\n if (args.length > 1) {\n format = args[0];\n args = args.slice(1);\n } else {\n args = [];\n }\n\n let formatItem = formatRegistry.getIfExists(format);\n\n if (!formatItem) {\n console.error(`Variable format ${format} not found. Using glob format as fallback.`);\n formatItem = formatRegistry.get(FormatRegistryID.glob);\n }\n\n const options: FormatOptions = { value, args, text: text ?? value };\n return formatItem.formatter(options, variable);\n }\n\n setGrafanaVariable(name: string, value: any) {\n this.grafanaVariables[name] = value;\n }\n\n /**\n * @deprecated: setGlobalVariable function should not be used and will be removed in future releases\n *\n * Use addVariable action to add variables to Redux instead\n */\n setGlobalVariable(name: string, variable: any) {\n deprecationWarning('template_srv.ts', 'setGlobalVariable', '');\n this.index = {\n ...this.index,\n [name]: {\n current: variable,\n },\n };\n }\n\n getVariableName(expression: string) {\n this.regex.lastIndex = 0;\n const match = this.regex.exec(expression);\n if (!match) {\n return null;\n }\n const variableName = match.slice(1).find((match) => match !== undefined);\n return variableName;\n }\n\n containsTemplate(target: string | undefined): boolean {\n if (!target) {\n return false;\n }\n const name = this.getVariableName(target);\n const variable = name && this.getVariableAtIndex(name);\n return variable !== null && variable !== undefined;\n }\n\n variableExists(expression: string): boolean {\n deprecationWarning('template_srv.ts', 'variableExists', 'containsTemplate');\n return this.containsTemplate(expression);\n }\n\n highlightVariablesAsHtml(str: string) {\n if (!str || !isString(str)) {\n return str;\n }\n\n str = escape(str);\n this.regex.lastIndex = 0;\n return str.replace(this.regex, (match, var1, var2, fmt2, var3) => {\n if (this.getVariableAtIndex(var1 || var2 || var3)) {\n return '<span class=\"template-variable\">' + match + '</span>';\n }\n return match;\n });\n }\n\n getAllValue(variable: any) {\n if (variable.allValue) {\n return variable.allValue;\n }\n const values = [];\n for (let i = 1; i < variable.options.length; i++) {\n values.push(variable.options[i].value);\n }\n return values;\n }\n\n private getFieldAccessor(fieldPath: string) {\n const accessor = this.fieldAccessorCache[fieldPath];\n if (accessor) {\n return accessor;\n }\n\n return (this.fieldAccessorCache[fieldPath] = property(fieldPath));\n }\n\n private getVariableValue(variableName: string, fieldPath: string | undefined, scopedVars: ScopedVars) {\n const scopedVar = scopedVars[variableName];\n if (!scopedVar) {\n return null;\n }\n\n if (fieldPath) {\n return this.getFieldAccessor(fieldPath)(scopedVar.value);\n }\n\n return scopedVar.value;\n }\n\n private getVariableText(variableName: string, value: any, scopedVars: ScopedVars) {\n const scopedVar = scopedVars[variableName];\n\n if (!scopedVar) {\n return null;\n }\n\n if (scopedVar.value === value || typeof value !== 'string') {\n return scopedVar.text;\n }\n\n return value;\n }\n\n replace(target?: string, scopedVars?: ScopedVars, format?: string | Function): string {\n if (!target) {\n return target ?? '';\n }\n\n this.regex.lastIndex = 0;\n\n return target.replace(this.regex, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {\n const variableName = var1 || var2 || var3;\n const variable = this.getVariableAtIndex(variableName);\n const fmt = fmt2 || fmt3 || format;\n\n if (scopedVars) {\n const value = this.getVariableValue(variableName, fieldPath, scopedVars);\n const text = this.getVariableText(variableName, value, scopedVars);\n\n if (value !== null && value !== undefined) {\n return this.formatValue(value, fmt, variable, text);\n }\n }\n\n if (!variable) {\n return match;\n }\n\n if (fmt === FormatRegistryID.queryParam || isAdHoc(variable)) {\n const value = variableAdapters.get(variable.type).getValueForUrl(variable);\n const text = isAdHoc(variable) ? variable.id : variable.current.text;\n\n return this.formatValue(value, fmt, variable, text);\n }\n\n const systemValue = this.grafanaVariables[variable.current.value];\n if (systemValue) {\n return this.formatValue(systemValue, fmt, variable);\n }\n\n let value = variable.current.value;\n let text = variable.current.text;\n\n if (this.isAllValue(value)) {\n value = this.getAllValue(variable);\n text = ALL_VARIABLE_TEXT;\n // skip formatting of custom all values\n if (variable.allValue && fmt !== FormatRegistryID.text) {\n return this.replace(value);\n }\n }\n\n if (fieldPath) {\n const fieldValue = this.getVariableValue(variableName, fieldPath, {\n [variableName]: { value, text },\n });\n if (fieldValue !== null && fieldValue !== undefined) {\n return this.formatValue(fieldValue, fmt, variable, text);\n }\n }\n\n const res = this.formatValue(value, fmt, variable, text);\n return res;\n });\n }\n\n isAllValue(value: any) {\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n }\n\n replaceWithText(target: string, scopedVars?: ScopedVars) {\n deprecationWarning('template_srv.ts', 'replaceWithText()', 'replace(), and specify the :text format');\n return this.replace(target, scopedVars, 'text');\n }\n\n private getVariableAtIndex(name: string) {\n if (!name) {\n return;\n }\n\n if (!this.index[name]) {\n return this.dependencies.getVariableWithName(name);\n }\n\n return this.index[name];\n }\n\n private getAdHocVariables(): AdHocVariableModel[] {\n return this.dependencies.getFilteredVariables(isAdHoc) as AdHocVariableModel[];\n }\n}\n\n// Expose the template srv\nconst srv = new TemplateSrv();\n\nsetTemplateSrv(srv);\n\nexport const getTemplateSrv = () => srv;\n","import React from 'react';\n\nimport { SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { HorizontalGroup, Input, RadioButtonGroup, ScaleDistribution } from '@grafana/ui';\n\nimport { HeatmapCalculationBucketConfig, HeatmapCalculationMode } from '../models.gen';\n\nconst modeOptions: Array<SelectableValue<HeatmapCalculationMode>> = [\n {\n label: 'Size',\n value: HeatmapCalculationMode.Size,\n description: 'Split the buckets based on size',\n },\n {\n label: 'Count',\n value: HeatmapCalculationMode.Count,\n description: 'Split the buckets based on count',\n },\n];\n\nconst logModeOptions: Array<SelectableValue<HeatmapCalculationMode>> = [\n {\n label: 'Split',\n value: HeatmapCalculationMode.Size,\n description: 'Split the buckets based on size',\n },\n];\n\nexport const AxisEditor: React.FC<StandardEditorProps<HeatmapCalculationBucketConfig, any>> = ({\n value,\n onChange,\n item,\n}) => {\n return (\n <HorizontalGroup>\n <RadioButtonGroup\n value={value?.mode || HeatmapCalculationMode.Size}\n options={value?.scale?.type === ScaleDistribution.Log ? logModeOptions : modeOptions}\n onChange={(mode) => {\n onChange({\n ...value,\n mode,\n });\n }}\n />\n <Input\n value={value?.value ?? ''}\n placeholder=\"Auto\"\n onChange={(v) => {\n onChange({\n ...value,\n value: v.currentTarget.value,\n });\n }}\n />\n </HorizontalGroup>\n );\n};\n","import { PanelOptionsEditorBuilder } from '@grafana/data';\nimport { ScaleDistribution } from '@grafana/schema';\nimport { ScaleDistributionEditor } from '@grafana/ui/src/options/builder';\n\nimport { HeatmapCalculationMode, HeatmapCalculationOptions } from '../models.gen';\n\nimport { AxisEditor } from './AxisEditor';\n\nexport function addHeatmapCalculationOptions(\n prefix: string,\n builder: PanelOptionsEditorBuilder<any>,\n source?: HeatmapCalculationOptions,\n category?: string[]\n) {\n builder.addCustomEditor({\n id: 'xBuckets',\n path: `${prefix}xBuckets`,\n name: 'X Bucket',\n editor: AxisEditor,\n category,\n defaultValue: {\n mode: HeatmapCalculationMode.Size,\n },\n });\n\n builder.addCustomEditor({\n id: 'yBuckets',\n path: `${prefix}yBuckets`,\n name: 'Y Bucket',\n editor: AxisEditor,\n category,\n defaultValue: {\n mode: HeatmapCalculationMode.Size,\n },\n });\n\n builder.addCustomEditor({\n id: 'yBuckets-scale',\n path: `${prefix}yBuckets.scale`,\n name: 'Y Bucket scale',\n category,\n editor: ScaleDistributionEditor,\n defaultValue: { type: ScaleDistribution.Linear },\n });\n}\n","import { guessDecimals, roundDecimals } from '@grafana/data';\n\nconst { abs, pow } = Math;\n\nexport const fixedDec = new Map();\n\nexport function genIncrs(base: number, minExp: number, maxExp: number, mults: number[]) {\n let incrs = [];\n\n let multDec = mults.map(guessDecimals);\n\n for (let exp = minExp; exp < maxExp; exp++) {\n let expa = abs(exp);\n let mag = roundDecimals(pow(base, exp), expa);\n\n for (let i = 0; i < mults.length; i++) {\n let _incr = mults[i] * mag;\n let dec = (_incr >= 0 && exp >= 0 ? 0 : expa) + (exp >= multDec[i] ? 0 : multDec[i]);\n let incr = roundDecimals(_incr, dec);\n incrs.push(incr);\n fixedDec.set(incr, dec);\n }\n }\n\n return incrs;\n}\n\nconst onlyWhole = (v: number) => v % 1 === 0;\n\nconst allMults = [1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5];\n\n// ...0.01, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.2, 0.25, 0.3, 0.4, 0.5...\nexport const decIncrs = genIncrs(10, -16, 0, allMults);\n\n// 1, 2, 2.5, 3, 4, 5, 6, 7, 8, 9, 10, 20, 25, 30, 40, 50...\nexport const oneIncrs = genIncrs(10, 0, 16, allMults);\n\n// 1, 2, 3, 4, 5, 10, 20, 25, 50...\nexport const wholeIncrs = oneIncrs.filter(onlyWhole);\n\nexport const numIncrs = decIncrs.concat(oneIncrs);\n\nexport const niceLinearIncrs = decIncrs.concat(wholeIncrs);\n\nconst sec = 1 * 1e3;\nconst min = 60 * sec;\nconst hour = 60 * min;\nconst day = 24 * hour;\nconst year = 365 * day;\n\n// in milliseconds\nexport const niceTimeIncrs = [\n 1,\n 2,\n 4,\n 5,\n 10,\n 20,\n 25,\n 40,\n 50,\n 100,\n 200,\n 250,\n 400,\n 500,\n\n sec,\n 2 * sec,\n 4 * sec,\n 5 * sec,\n 10 * sec,\n 15 * sec,\n 20 * sec,\n 30 * sec,\n\n min,\n 2 * min,\n 4 * min,\n 5 * min,\n 10 * min,\n 15 * min,\n 20 * min,\n 30 * min,\n\n hour,\n 2 * hour,\n 4 * hour,\n 6 * hour,\n 8 * hour,\n 12 * hour,\n 18 * hour,\n\n day,\n 2 * day,\n 3 * day,\n 4 * day,\n 5 * day,\n 6 * day,\n 7 * day,\n 10 * day,\n 15 * day,\n 30 * day,\n 45 * day,\n 60 * day,\n 90 * day,\n 180 * day,\n\n year,\n 2 * year,\n 3 * year,\n 4 * year,\n 5 * year,\n 6 * year,\n 7 * year,\n 8 * year,\n 9 * year,\n 10 * year,\n];\n","import { map } from 'rxjs';\n\nimport {\n ArrayVector,\n DataFrame,\n DataTransformerID,\n FieldType,\n incrRoundUp,\n incrRoundDn,\n SynchronousDataTransformerInfo,\n DataFrameType,\n getFieldDisplayName,\n Field,\n getValueFormat,\n formattedValueToString,\n durationToMilliseconds,\n parseDuration,\n} from '@grafana/data';\nimport { ScaleDistribution } from '@grafana/schema';\n\nimport { HeatmapCellLayout, HeatmapCalculationMode, HeatmapCalculationOptions } from './models.gen';\nimport { niceLinearIncrs, niceTimeIncrs } from './utils';\n\nexport interface HeatmapTransformerOptions extends HeatmapCalculationOptions {\n /** the raw values will still exist in results after transformation */\n keepOriginalData?: boolean;\n}\n\nexport const heatmapTransformer: SynchronousDataTransformerInfo<HeatmapTransformerOptions> = {\n id: DataTransformerID.heatmap,\n name: 'Create heatmap',\n description: 'calculate heatmap from source data',\n defaultOptions: {},\n\n operator: (options) => (source) => source.pipe(map((data) => heatmapTransformer.transformer(options)(data))),\n\n transformer: (options: HeatmapTransformerOptions) => {\n return (data: DataFrame[]) => {\n const v = calculateHeatmapFromData(data, options);\n if (options.keepOriginalData) {\n return [v, ...data];\n }\n return [v];\n };\n },\n};\n\nfunction parseNumeric(v?: string | null) {\n return v === '+Inf' ? Infinity : v === '-Inf' ? -Infinity : +(v ?? 0);\n}\n\nexport function sortAscStrInf(aName?: string | null, bName?: string | null) {\n return parseNumeric(aName) - parseNumeric(bName);\n}\n\nexport interface HeatmapRowsCustomMeta {\n /** This provides the lookup values */\n yOrdinalDisplay: string[];\n yOrdinalLabel?: string[];\n yMatchWithLabel?: string;\n yMinDisplay?: string;\n}\n\n/** simple utility to get heatmap metadata from a frame */\nexport function readHeatmapRowsCustomMeta(frame?: DataFrame): HeatmapRowsCustomMeta {\n return (frame?.meta?.custom ?? {}) as HeatmapRowsCustomMeta;\n}\n\nexport function isHeatmapCellsDense(frame: DataFrame) {\n let foundY = false;\n\n for (let field of frame.fields) {\n // dense heatmap frames can only have one of these fields\n switch (field.name) {\n case 'y':\n case 'yMin':\n case 'yMax':\n if (foundY) {\n return false;\n }\n\n foundY = true;\n }\n }\n\n return foundY;\n}\n\nexport interface RowsHeatmapOptions {\n frame: DataFrame;\n value?: string; // the field value name\n unit?: string;\n decimals?: number;\n layout?: HeatmapCellLayout;\n}\n\n/** Given existing buckets, create a values style frame */\n// Assumes frames have already been sorted ASC and de-accumulated.\nexport function rowsToCellsHeatmap(opts: RowsHeatmapOptions): DataFrame {\n // TODO: handle null-filling w/ fields[0].config.interval?\n const xField = opts.frame.fields[0];\n const xValues = xField.values.toArray();\n const yFields = opts.frame.fields.filter((f, idx) => f.type === FieldType.number && idx > 0);\n\n // similar to initBins() below\n const len = xValues.length * yFields.length;\n const xs = new Array(len);\n const ys = new Array(len);\n const counts2 = new Array(len);\n\n const counts = yFields.map((field) => field.values.toArray().slice());\n\n // transpose\n counts.forEach((bucketCounts, bi) => {\n for (let i = 0; i < bucketCounts.length; i++) {\n counts2[counts.length * i + bi] = bucketCounts[i];\n }\n });\n\n const bucketBounds = Array.from({ length: yFields.length }, (v, i) => i);\n\n // fill flat/repeating array\n for (let i = 0, yi = 0, xi = 0; i < len; yi = ++i % bucketBounds.length) {\n ys[i] = bucketBounds[yi];\n\n if (yi === 0 && i >= bucketBounds.length) {\n xi++;\n }\n\n xs[i] = xValues[xi];\n }\n\n // this name determines whether cells are drawn above, below, or centered on the values\n let ordinalFieldName = yFields[0].labels?.le != null ? 'yMax' : 'y';\n switch (opts.layout) {\n case HeatmapCellLayout.le:\n ordinalFieldName = 'yMax';\n break;\n case HeatmapCellLayout.ge:\n ordinalFieldName = 'yMin';\n break;\n case HeatmapCellLayout.unknown:\n ordinalFieldName = 'y';\n break;\n }\n\n const custom: HeatmapRowsCustomMeta = {\n yOrdinalDisplay: yFields.map((f) => getFieldDisplayName(f, opts.frame)),\n yMatchWithLabel: Object.keys(yFields[0].labels ?? {})[0],\n };\n if (custom.yMatchWithLabel) {\n custom.yOrdinalLabel = yFields.map((f) => f.labels?.[custom.yMatchWithLabel!] ?? '');\n if (custom.yMatchWithLabel === 'le') {\n custom.yMinDisplay = '0.0';\n }\n }\n\n // Format the labels as a value\n // TODO: this leaves the internally prepended '0.0' without this formatting treatment\n if (opts.unit?.length || opts.decimals != null) {\n const fmt = getValueFormat(opts.unit ?? 'short');\n if (custom.yMinDisplay) {\n custom.yMinDisplay = formattedValueToString(fmt(0, opts.decimals));\n }\n custom.yOrdinalDisplay = custom.yOrdinalDisplay.map((name) => {\n let num = +name;\n\n if (!Number.isNaN(num)) {\n return formattedValueToString(fmt(num, opts.decimals));\n }\n\n return name;\n });\n }\n\n return {\n length: xs.length,\n refId: opts.frame.refId,\n meta: {\n type: DataFrameType.HeatmapCells,\n custom,\n },\n fields: [\n {\n name: 'xMax',\n type: xField.type,\n values: new ArrayVector(xs),\n config: xField.config,\n },\n {\n name: ordinalFieldName,\n type: FieldType.number,\n values: new ArrayVector(ys),\n config: {\n unit: 'short', // ordinal lookup\n },\n },\n {\n name: opts.value?.length ? opts.value : 'Value',\n type: FieldType.number,\n values: new ArrayVector(counts2),\n config: yFields[0].config,\n display: yFields[0].display,\n },\n ],\n };\n}\n\n// Sorts frames ASC by numeric bucket name and de-accumulates values in each frame's Value field [1]\n// similar to Prometheus result_transformer.ts -> transformToHistogramOverTime()\nexport function prepBucketFrames(frames: DataFrame[]): DataFrame[] {\n frames = frames.slice();\n\n // sort ASC by frame.name (Prometheus bucket bound)\n // or use frame.fields[1].config.displayNameFromDS ?\n frames.sort((a, b) => sortAscStrInf(a.name, b.name));\n\n // cumulative counts\n const counts = frames.map((frame) => frame.fields[1].values.toArray().slice());\n\n // de-accumulate\n counts.reverse();\n counts.forEach((bucketCounts, bi) => {\n if (bi < counts.length - 1) {\n for (let i = 0; i < bucketCounts.length; i++) {\n bucketCounts[i] -= counts[bi + 1][i];\n }\n }\n });\n counts.reverse();\n\n return frames.map((frame, i) => ({\n ...frame,\n fields: [\n frame.fields[0],\n {\n ...frame.fields[1],\n values: new ArrayVector(counts[i]),\n },\n ],\n }));\n}\n\nexport function calculateHeatmapFromData(frames: DataFrame[], options: HeatmapCalculationOptions): DataFrame {\n //console.time('calculateHeatmapFromData');\n\n // optimization\n //let xMin = Infinity;\n //let xMax = -Infinity;\n\n let xField: Field | undefined = undefined;\n let yField: Field | undefined = undefined;\n\n let dataLen = 0;\n // pre-allocate arrays\n for (let frame of frames) {\n // TODO: assumes numeric timestamps, ordered asc, without nulls\n const x = frame.fields.find((f) => f.type === FieldType.time);\n if (x) {\n dataLen += frame.length;\n }\n }\n\n let xs: number[] = Array(dataLen);\n let ys: number[] = Array(dataLen);\n let j = 0;\n\n for (let frame of frames) {\n // TODO: assumes numeric timestamps, ordered asc, without nulls\n const x = frame.fields.find((f) => f.type === FieldType.time);\n if (!x) {\n continue;\n }\n\n if (!xField) {\n xField = x; // the first X\n }\n\n const xValues = x.values.toArray();\n for (let field of frame.fields) {\n if (field !== x && field.type === FieldType.number) {\n const yValues = field.values.toArray();\n\n for (let i = 0; i < xValues.length; i++, j++) {\n xs[j] = xValues[i];\n ys[j] = yValues[i];\n }\n\n if (!yField) {\n yField = field;\n }\n }\n }\n }\n\n if (!xField || !yField) {\n throw 'no heatmap fields found';\n }\n\n if (!xs.length || !ys.length) {\n throw 'no values found';\n }\n\n const xBucketsCfg = options.xBuckets ?? {};\n const yBucketsCfg = options.yBuckets ?? {};\n\n if (xBucketsCfg.scale?.type === ScaleDistribution.Log) {\n throw 'X axis only supports linear buckets';\n }\n\n const scaleDistribution = options.yBuckets?.scale ?? {\n type: ScaleDistribution.Linear,\n };\n\n const heat2d = heatmap(xs, ys, {\n xSorted: true,\n xTime: xField.type === FieldType.time,\n xMode: xBucketsCfg.mode,\n xSize:\n xBucketsCfg.mode === HeatmapCalculationMode.Size\n ? durationToMilliseconds(parseDuration(xBucketsCfg.value ?? ''))\n : xBucketsCfg.value\n ? +xBucketsCfg.value\n : undefined,\n yMode: yBucketsCfg.mode,\n ySize: yBucketsCfg.value ? +yBucketsCfg.value : undefined,\n yLog: scaleDistribution?.type === ScaleDistribution.Log ? (scaleDistribution?.log as any) : undefined,\n });\n\n const frame = {\n length: heat2d.x.length,\n name: getFieldDisplayName(yField),\n meta: {\n type: DataFrameType.HeatmapCells,\n },\n fields: [\n {\n name: 'xMin',\n type: xField.type,\n values: new ArrayVector(heat2d.x),\n config: xField.config,\n },\n {\n name: 'yMin',\n type: FieldType.number,\n values: new ArrayVector(heat2d.y),\n config: {\n ...yField.config, // keep units from the original source\n custom: {\n scaleDistribution,\n },\n },\n },\n {\n name: 'Count',\n type: FieldType.number,\n values: new ArrayVector(heat2d.count),\n config: {\n unit: 'short', // always integer\n },\n },\n ],\n };\n\n //console.timeEnd('calculateHeatmapFromData');\n return frame;\n}\n\ninterface HeatmapOpts {\n // default is 10% of data range, snapped to a \"nice\" increment\n xMode?: HeatmapCalculationMode;\n yMode?: HeatmapCalculationMode;\n xSize?: number;\n ySize?: number;\n\n // use Math.ceil instead of Math.floor for bucketing\n xCeil?: boolean;\n yCeil?: boolean;\n\n // log2 or log10 buckets\n xLog?: 2 | 10;\n yLog?: 2 | 10;\n\n xTime?: boolean;\n yTime?: boolean;\n\n // optimization hints for known data ranges (sorted, pre-scanned, etc)\n xMin?: number;\n xMax?: number;\n yMin?: number;\n yMax?: number;\n\n xSorted?: boolean;\n ySorted?: boolean;\n}\n\n// TODO: handle NaN, Inf, -Inf, null, undefined values in xs & ys\nfunction heatmap(xs: number[], ys: number[], opts?: HeatmapOpts) {\n let len = xs.length;\n\n let xSorted = opts?.xSorted ?? false;\n let ySorted = opts?.ySorted ?? false;\n\n // find x and y limits to pre-compute buckets struct\n let minX = xSorted ? xs[0] : Infinity;\n let minY = ySorted ? ys[0] : Infinity;\n let maxX = xSorted ? xs[len - 1] : -Infinity;\n let maxY = ySorted ? ys[len - 1] : -Infinity;\n\n let yExp = opts?.yLog;\n\n for (let i = 0; i < len; i++) {\n if (!xSorted) {\n minX = Math.min(minX, xs[i]);\n maxX = Math.max(maxX, xs[i]);\n }\n\n if (!ySorted) {\n if (!yExp || ys[i] > 0) {\n minY = Math.min(minY, ys[i]);\n maxY = Math.max(maxY, ys[i]);\n }\n }\n }\n\n //let scaleX = opts?.xLog === 10 ? Math.log10 : opts?.xLog === 2 ? Math.log2 : (v: number) => v;\n //let scaleY = opts?.yLog === 10 ? Math.log10 : opts?.yLog === 2 ? Math.log2 : (v: number) => v;\n\n let xBinIncr = opts?.xSize ?? 0;\n let yBinIncr = opts?.ySize ?? 0;\n let xMode = opts?.xMode;\n let yMode = opts?.yMode;\n\n // fall back to 10 buckets if invalid settings\n if (!Number.isFinite(xBinIncr) || xBinIncr <= 0) {\n xMode = HeatmapCalculationMode.Count;\n xBinIncr = 20;\n }\n if (!Number.isFinite(yBinIncr) || yBinIncr <= 0) {\n yMode = HeatmapCalculationMode.Count;\n yBinIncr = 10;\n }\n\n if (xMode === HeatmapCalculationMode.Count) {\n // TODO: optionally use view range min/max instead of data range for bucket sizing\n let approx = (maxX - minX) / Math.max(xBinIncr - 1, 1);\n // nice-ify\n let xIncrs = opts?.xTime ? niceTimeIncrs : niceLinearIncrs;\n let xIncrIdx = xIncrs.findIndex((bucketSize) => bucketSize > approx) - 1;\n xBinIncr = xIncrs[Math.max(xIncrIdx, 0)];\n }\n\n if (yMode === HeatmapCalculationMode.Count) {\n // TODO: optionally use view range min/max instead of data range for bucket sizing\n let approx = (maxY - minY) / Math.max(yBinIncr - 1, 1);\n // nice-ify\n let yIncrs = opts?.yTime ? niceTimeIncrs : niceLinearIncrs;\n let yIncrIdx = yIncrs.findIndex((bucketSize) => bucketSize > approx) - 1;\n yBinIncr = yIncrs[Math.max(yIncrIdx, 0)];\n }\n\n // console.log({\n // yBinIncr,\n // xBinIncr,\n // });\n\n let binX = opts?.xCeil ? (v: number) => incrRoundUp(v, xBinIncr) : (v: number) => incrRoundDn(v, xBinIncr);\n let binY = opts?.yCeil ? (v: number) => incrRoundUp(v, yBinIncr) : (v: number) => incrRoundDn(v, yBinIncr);\n\n if (yExp) {\n yBinIncr = 1 / (opts?.ySize ?? 1); // sub-divides log exponents\n let yLog = yExp === 2 ? Math.log2 : Math.log10;\n binY = opts?.yCeil ? (v: number) => incrRoundUp(yLog(v), yBinIncr) : (v: number) => incrRoundDn(yLog(v), yBinIncr);\n }\n\n let minXBin = binX(minX);\n let maxXBin = binX(maxX);\n let minYBin = binY(minY);\n let maxYBin = binY(maxY);\n\n let xBinQty = Math.round((maxXBin - minXBin) / xBinIncr) + 1;\n let yBinQty = Math.round((maxYBin - minYBin) / yBinIncr) + 1;\n\n let [xs2, ys2, counts] = initBins(xBinQty, yBinQty, minXBin, xBinIncr, minYBin, yBinIncr, yExp);\n\n for (let i = 0; i < len; i++) {\n if (yExp && ys[i] <= 0) {\n continue;\n }\n\n const xi = (binX(xs[i]) - minXBin) / xBinIncr;\n const yi = (binY(ys[i]) - minYBin) / yBinIncr;\n const ci = xi * yBinQty + yi;\n\n counts[ci]++;\n }\n\n return {\n x: xs2,\n y: ys2,\n count: counts,\n };\n}\n\nfunction initBins(xQty: number, yQty: number, xMin: number, xIncr: number, yMin: number, yIncr: number, yExp?: number) {\n const len = xQty * yQty;\n const xs = new Array<number>(len);\n const ys = new Array<number>(len);\n const counts = new Array<number>(len);\n\n for (let i = 0, yi = 0, x = xMin; i < len; yi = ++i % yQty) {\n counts[i] = 0;\n\n if (yExp) {\n ys[i] = yExp ** (yMin + yi * yIncr);\n } else {\n ys[i] = yMin + yi * yIncr;\n }\n\n if (yi === 0 && i >= yQty) {\n x += xIncr;\n }\n\n xs[i] = x;\n }\n\n return [xs, ys, counts];\n}\n","import { ScaleDistributionConfig } from '@grafana/schema';\n\nexport enum HeatmapCalculationMode {\n Size = 'size', // When exponential, this is \"splitFactor\"\n Count = 'count',\n}\n\nexport const enum HeatmapCellLayout {\n le = 'le',\n ge = 'ge',\n unknown = 'unknown', // unknown\n auto = 'auto', // becomes unknown\n}\n\nexport interface HeatmapCalculationBucketConfig {\n mode?: HeatmapCalculationMode;\n value?: string; // number or interval string ie 10s, or log \"split\" divisor\n scale?: ScaleDistributionConfig;\n}\n\nexport interface HeatmapCalculationOptions {\n xBuckets?: HeatmapCalculationBucketConfig;\n yBuckets?: HeatmapCalculationBucketConfig;\n}\n","import { FrameGeometrySource, FrameGeometrySourceMode } from '@grafana/data';\n\n// This file should be generated by cue schema\n\nexport enum SpatialAction {\n Prepare = 'prepare',\n Calculate = 'calculate',\n Modify = 'modify',\n}\n\nexport enum SpatialCalculation {\n Heading = 'heading',\n Distance = 'distance',\n Area = 'area',\n}\n\nexport enum SpatialOperation {\n AsLine = 'asLine',\n LineBuilder = 'lineBuilder',\n}\n\nexport interface SpatialCalculationOption {\n calc?: SpatialCalculation;\n field?: string;\n}\n\nexport interface ModifyOptions {\n op: SpatialOperation;\n target?: FrameGeometrySource;\n}\n\n/** The main transformer options */\nexport interface SpatialTransformOptions {\n action?: SpatialAction;\n source?: FrameGeometrySource;\n calculate?: SpatialCalculationOption;\n modify?: ModifyOptions;\n}\n\nexport const defaultOptions: SpatialTransformOptions = {\n action: SpatialAction.Prepare,\n source: {\n mode: FrameGeometrySourceMode.Auto,\n },\n};\n","import { getCenter } from 'ol/extent';\nimport { Geometry, LineString, Point } from 'ol/geom';\nimport { toLonLat } from 'ol/proj';\nimport { getArea, getLength } from 'ol/sphere';\n\nimport { ArrayVector, Field, FieldType } from '@grafana/data';\n\nimport { SpatialCalculation, SpatialCalculationOption } from './models.gen';\n\n/** Will return a field with a single row */\nexport function toLineString(field: Field<Geometry | undefined>): LineString {\n const coords: number[][] = [];\n for (const geo of field.values.toArray()) {\n if (geo) {\n coords.push(getCenterPoint(geo));\n }\n }\n return new LineString(coords);\n}\n\n/** Will return a field with a single row */\nexport function calculateBearings(values: Array<Geometry | undefined>): number[] {\n const bearing = new Array(values.length);\n if (values.length > 1) {\n let prev: number[] | undefined = getCenterPointWGS84(values[0]);\n for (let i = 1; i < values.length; i++) {\n let next: number[] | undefined = getCenterPointWGS84(values[i]);\n if (prev && next) {\n let degrees = (Math.atan2(next[0] - prev[0], next[1] - prev[1]) * 180) / Math.PI;\n if (degrees < 0.0) {\n degrees += 360.0;\n }\n bearing[i - 1] = bearing[i] = degrees;\n }\n }\n } else {\n bearing.fill(0);\n }\n return bearing;\n}\n\nexport function getCenterPoint(geo: Geometry): number[] {\n if (geo instanceof Point) {\n return (geo as Point).getCoordinates();\n }\n return getCenter(geo.getExtent());\n}\n\nexport function getCenterPointWGS84(geo?: Geometry): number[] | undefined {\n if (!geo) {\n return undefined;\n }\n return toLonLat(getCenterPoint(geo));\n}\n\n/** Will return a new field with calculated values */\nexport function doGeomeryCalculation(field: Field<Geometry | undefined>, options: SpatialCalculationOption): Field {\n const values = field.values.toArray();\n const buffer = new Array(field.values.length);\n const op = options.calc ?? SpatialCalculation.Heading;\n const name = options.field ?? op;\n\n switch (op) {\n case SpatialCalculation.Area: {\n for (let i = 0; i < values.length; i++) {\n const geo = values[i];\n if (geo) {\n buffer[i] = getArea(geo);\n }\n }\n return {\n name,\n type: FieldType.number,\n config: {\n unit: 'areaM2',\n },\n values: new ArrayVector(buffer),\n };\n }\n case SpatialCalculation.Distance: {\n for (let i = 0; i < values.length; i++) {\n const geo = values[i];\n if (geo) {\n buffer[i] = getLength(geo);\n }\n }\n return {\n name,\n type: FieldType.number,\n config: {\n unit: 'lengthm',\n },\n values: new ArrayVector(buffer),\n };\n }\n\n // Use heading as default\n case SpatialCalculation.Heading:\n default: {\n return {\n name,\n type: FieldType.number,\n config: {\n unit: 'degree',\n },\n values: new ArrayVector(calculateBearings(values)),\n };\n }\n }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport config from 'app/core/config';\nimport { OrgUser, UsersState } from 'app/types';\n\nexport const initialState: UsersState = {\n users: [] as OrgUser[],\n searchQuery: '',\n searchPage: 1,\n canInvite: !config.externalUserMngLinkName,\n externalUserMngInfo: config.externalUserMngInfo,\n externalUserMngLinkName: config.externalUserMngLinkName,\n externalUserMngLinkUrl: config.externalUserMngLinkUrl,\n hasFetched: false,\n};\n\nconst usersSlice = createSlice({\n name: 'users',\n initialState,\n reducers: {\n usersLoaded: (state, action: PayloadAction<OrgUser[]>): UsersState => {\n return { ...state, hasFetched: true, users: action.payload };\n },\n setUsersSearchQuery: (state, action: PayloadAction<string>): UsersState => {\n // reset searchPage otherwise search results won't appear\n return { ...state, searchQuery: action.payload, searchPage: initialState.searchPage };\n },\n setUsersSearchPage: (state, action: PayloadAction<number>): UsersState => {\n return { ...state, searchPage: action.payload };\n },\n },\n});\n\nexport const { setUsersSearchQuery, setUsersSearchPage, usersLoaded } = usersSlice.actions;\n\nexport const usersReducer = usersSlice.reducer;\n\nexport default {\n users: usersReducer,\n};\n","import { ComponentType } from 'react';\nimport { Reducer } from 'redux';\n\nimport { Registry, UrlQueryValue, VariableType } from '@grafana/data';\n\nimport { VariableEditorProps } from './editor/types';\nimport { VariablePickerProps } from './pickers/types';\nimport { VariablesState } from './state/types';\nimport { VariableModel, VariableOption } from './types';\n\nexport interface VariableAdapter<Model extends VariableModel> {\n id: VariableType;\n description: string;\n name: string;\n initialState: Model;\n dependsOn: (variable: Model, variableToTest: Model) => boolean;\n setValue: (variable: Model, option: VariableOption, emitChanges?: boolean) => Promise<void>;\n setValueFromUrl: (variable: Model, urlValue: UrlQueryValue) => Promise<void>;\n updateOptions: (variable: Model, searchFilter?: string) => Promise<void>;\n getSaveModel: (variable: Model, saveCurrentAsDefault?: boolean) => Partial<Model>;\n getValueForUrl: (variable: Model) => string | string[];\n picker: ComponentType<VariablePickerProps<Model>>;\n editor: ComponentType<VariableEditorProps<Model>>;\n reducer: Reducer<VariablesState>;\n beforeAdding?: (model: any) => any;\n}\n\nexport const variableAdapters = new Registry<VariableAdapter<any>>();\n","import { cloneDeep } from 'lodash';\n\nimport { DataSourceRef, getDataSourceRef } from '@grafana/data';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { AdHocVariableFilter, AdHocVariableModel } from 'app/features/variables/types';\nimport { StoreState, ThunkResult } from 'app/types';\n\nimport { changeVariableEditorExtended } from '../editor/reducer';\nimport { getAdhocVariableEditorState } from '../editor/selectors';\nimport { isAdHoc } from '../guard';\nimport { variableUpdated } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getLastKey, getNewVariableIndex, getVariable, getVariablesState } from '../state/selectors';\nimport { addVariable, changeVariableProp } from '../state/sharedReducer';\nimport { AddVariable, KeyedVariableIdentifier } from '../state/types';\nimport { toKeyedVariableIdentifier, toVariablePayload } from '../utils';\n\nimport {\n AdHocVariabelFilterUpdate,\n filterAdded,\n filterRemoved,\n filtersRestored,\n filterUpdated,\n initialAdHocVariableModelState,\n} from './reducer';\n\nexport interface AdHocTableOptions {\n datasource: DataSourceRef;\n key: string;\n value: string;\n operator: string;\n}\n\nconst filterTableName = 'Filters';\n\nexport const applyFilterFromTable = (options: AdHocTableOptions): ThunkResult<void> => {\n return async (dispatch, getState) => {\n let variable = getVariableByOptions(options, getState());\n\n if (!variable) {\n dispatch(createAdHocVariable(options));\n variable = getVariableByOptions(options, getState());\n if (!variable) {\n return;\n }\n }\n\n const index = variable.filters.findIndex((f) => f.key === options.key && f.value === options.value);\n\n if (index === -1) {\n const { value, key, operator } = options;\n const filter = { value, key, operator, condition: '' };\n return await dispatch(addFilter(toKeyedVariableIdentifier(variable), filter));\n }\n\n const filter = { ...variable.filters[index], operator: options.operator };\n return await dispatch(changeFilter(toKeyedVariableIdentifier(variable), { index, filter }));\n };\n};\n\nexport const changeFilter = (\n identifier: KeyedVariableIdentifier,\n update: AdHocVariabelFilterUpdate\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const variable = getVariable(identifier, getState());\n dispatch(toKeyedAction(identifier.rootStateKey, filterUpdated(toVariablePayload(variable, update))));\n await dispatch(variableUpdated(toKeyedVariableIdentifier(variable), true));\n };\n};\n\nexport const removeFilter = (identifier: KeyedVariableIdentifier, index: number): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const variable = getVariable(identifier, getState());\n dispatch(toKeyedAction(identifier.rootStateKey, filterRemoved(toVariablePayload(variable, index))));\n await dispatch(variableUpdated(toKeyedVariableIdentifier(variable), true));\n };\n};\n\nexport const addFilter = (identifier: KeyedVariableIdentifier, filter: AdHocVariableFilter): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const variable = getVariable(identifier, getState());\n dispatch(toKeyedAction(identifier.rootStateKey, filterAdded(toVariablePayload(variable, filter))));\n await dispatch(variableUpdated(toKeyedVariableIdentifier(variable), true));\n };\n};\n\nexport const setFiltersFromUrl = (\n identifier: KeyedVariableIdentifier,\n filters: AdHocVariableFilter[]\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const variable = getVariable(identifier, getState());\n dispatch(toKeyedAction(identifier.rootStateKey, filtersRestored(toVariablePayload(variable, filters))));\n await dispatch(variableUpdated(toKeyedVariableIdentifier(variable), true));\n };\n};\n\nexport const changeVariableDatasource = (\n identifier: KeyedVariableIdentifier,\n datasource?: DataSourceRef\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const { editor } = getVariablesState(identifier.rootStateKey, getState());\n const extended = getAdhocVariableEditorState(editor);\n const variable = getVariable(identifier, getState());\n dispatch(\n toKeyedAction(\n identifier.rootStateKey,\n changeVariableProp(toVariablePayload(variable, { propName: 'datasource', propValue: datasource }))\n )\n );\n\n const ds = await getDatasourceSrv().get(datasource);\n\n // TS TODO: ds is not typed to be optional - is this check unnecessary or is the type incorrect?\n const message = ds?.getTagKeys\n ? 'Ad hoc filters are applied automatically to all queries that target this data source'\n : 'This data source does not support ad hoc filters yet.';\n\n dispatch(\n toKeyedAction(\n identifier.rootStateKey,\n changeVariableEditorExtended({\n infoText: message,\n dataSources: extended?.dataSources ?? [],\n })\n )\n );\n };\n};\n\nexport const initAdHocVariableEditor =\n (key: string): ThunkResult<void> =>\n (dispatch) => {\n const dataSources = getDatasourceSrv().getList({ metrics: true, variables: true });\n const selectable = dataSources.reduce(\n (all: Array<{ text: string; value: DataSourceRef | null }>, ds) => {\n if (ds.meta.mixed) {\n return all;\n }\n\n const text = ds.isDefault ? `${ds.name} (default)` : ds.name;\n const value = getDataSourceRef(ds);\n all.push({ text, value });\n\n return all;\n },\n [{ text: '', value: {} }]\n );\n\n dispatch(\n toKeyedAction(\n key,\n changeVariableEditorExtended({\n dataSources: selectable,\n })\n )\n );\n };\n\nconst createAdHocVariable = (options: AdHocTableOptions): ThunkResult<void> => {\n return (dispatch, getState) => {\n const key = getLastKey(getState());\n\n const model: AdHocVariableModel = {\n ...cloneDeep(initialAdHocVariableModelState),\n datasource: options.datasource,\n name: filterTableName,\n id: filterTableName,\n rootStateKey: key,\n };\n\n const global = false;\n const index = getNewVariableIndex(key, getState());\n const identifier: KeyedVariableIdentifier = { type: 'adhoc', id: model.id, rootStateKey: key };\n\n dispatch(toKeyedAction(key, addVariable(toVariablePayload<AddVariable>(identifier, { global, model, index }))));\n };\n};\n\nconst getVariableByOptions = (options: AdHocTableOptions, state: StoreState): AdHocVariableModel | undefined => {\n const key = getLastKey(state);\n const templatingState = getVariablesState(key, state);\n return Object.values(templatingState.variables).find(\n (v) => isAdHoc(v) && v.datasource?.uid === options.datasource.uid\n ) as AdHocVariableModel;\n};\n","import React, { FC, ReactElement } from 'react';\n\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\nimport { Icon, SegmentAsync } from '@grafana/ui';\n\nimport { getDatasourceSrv } from '../../../plugins/datasource_srv';\n\ninterface Props {\n datasource: DataSourceRef;\n filterKey: string | null;\n onChange: (item: SelectableValue<string | null>) => void;\n getTagKeysOptions?: any;\n disabled?: boolean;\n}\n\nconst MIN_WIDTH = 90;\nexport const AdHocFilterKey: FC<Props> = ({ datasource, onChange, disabled, filterKey, getTagKeysOptions }) => {\n const loadKeys = () => fetchFilterKeys(datasource, getTagKeysOptions);\n const loadKeysWithRemove = () => fetchFilterKeysWithRemove(datasource, getTagKeysOptions);\n\n if (filterKey === null) {\n return (\n <div className=\"gf-form\" data-testid=\"AdHocFilterKey-add-key-wrapper\">\n <SegmentAsync\n disabled={disabled}\n className=\"query-segment-key\"\n Component={plusSegment}\n value={filterKey}\n onChange={onChange}\n loadOptions={loadKeys}\n inputMinWidth={MIN_WIDTH}\n />\n </div>\n );\n }\n\n return (\n <div className=\"gf-form\" data-testid=\"AdHocFilterKey-key-wrapper\">\n <SegmentAsync\n disabled={disabled}\n className=\"query-segment-key\"\n value={filterKey}\n onChange={onChange}\n loadOptions={loadKeysWithRemove}\n inputMinWidth={MIN_WIDTH}\n />\n </div>\n );\n};\n\nexport const REMOVE_FILTER_KEY = '-- remove filter --';\nconst REMOVE_VALUE = { label: REMOVE_FILTER_KEY, value: REMOVE_FILTER_KEY };\n\nconst plusSegment: ReactElement = (\n <a className=\"gf-form-label query-part\" aria-label=\"Add Filter\">\n <Icon name=\"plus\" />\n </a>\n);\n\nconst fetchFilterKeys = async (\n datasource: DataSourceRef,\n getTagKeysOptions?: any\n): Promise<Array<SelectableValue<string>>> => {\n const ds = await getDatasourceSrv().get(datasource);\n\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const metrics = await ds.getTagKeys(getTagKeysOptions);\n return metrics.map((m) => ({ label: m.text, value: m.text }));\n};\n\nconst fetchFilterKeysWithRemove = async (\n datasource: DataSourceRef,\n getTagKeysOptions?: any\n): Promise<Array<SelectableValue<string>>> => {\n const keys = await fetchFilterKeys(datasource, getTagKeysOptions);\n return [REMOVE_VALUE, ...keys];\n};\n","import React, { FC } from 'react';\n\nimport { DataSourceRef, MetricFindValue, SelectableValue } from '@grafana/data';\nimport { SegmentAsync } from '@grafana/ui';\n\nimport { getDatasourceSrv } from '../../../plugins/datasource_srv';\n\ninterface Props {\n datasource: DataSourceRef;\n filterKey: string;\n filterValue?: string;\n onChange: (item: SelectableValue<string>) => void;\n placeHolder?: string;\n disabled?: boolean;\n}\n\nexport const AdHocFilterValue: FC<Props> = ({\n datasource,\n disabled,\n onChange,\n filterKey,\n filterValue,\n placeHolder,\n}) => {\n const loadValues = () => fetchFilterValues(datasource, filterKey);\n\n return (\n <div className=\"gf-form\" data-testid=\"AdHocFilterValue-value-wrapper\">\n <SegmentAsync\n className=\"query-segment-value\"\n disabled={disabled}\n placeholder={placeHolder}\n value={filterValue}\n onChange={onChange}\n loadOptions={loadValues}\n />\n </div>\n );\n};\n\nconst fetchFilterValues = async (datasource: DataSourceRef, key: string): Promise<Array<SelectableValue<string>>> => {\n const ds = await getDatasourceSrv().get(datasource);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const metrics = await ds.getTagValues({ key });\n return metrics.map((m: MetricFindValue) => ({ label: m.text, value: m.text }));\n};\n","import React, { FC } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Segment } from '@grafana/ui';\n\ninterface Props {\n value: string;\n onChange: (item: SelectableValue<string>) => void;\n disabled?: boolean;\n}\n\nconst options = ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>((value) => ({\n label: value,\n value,\n}));\n\nexport const OperatorSegment: FC<Props> = ({ value, disabled, onChange }) => {\n return (\n <Segment\n className=\"query-segment-operator\"\n value={value}\n disabled={disabled}\n options={options}\n onChange={onChange}\n />\n );\n};\n","import React, { FC } from 'react';\n\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\nimport { AdHocVariableFilter } from 'app/features/variables/types';\n\nimport { AdHocFilterKey } from './AdHocFilterKey';\nimport { AdHocFilterValue } from './AdHocFilterValue';\nimport { OperatorSegment } from './OperatorSegment';\n\ninterface Props {\n datasource: DataSourceRef;\n filter: AdHocVariableFilter;\n onKeyChange: (item: SelectableValue<string | null>) => void;\n onOperatorChange: (item: SelectableValue<string>) => void;\n onValueChange: (item: SelectableValue<string>) => void;\n placeHolder?: string;\n getTagKeysOptions?: any;\n disabled?: boolean;\n}\n\nexport const AdHocFilterRenderer: FC<Props> = ({\n datasource,\n filter: { key, operator, value },\n onKeyChange,\n onOperatorChange,\n onValueChange,\n placeHolder,\n getTagKeysOptions,\n disabled,\n}) => {\n return (\n <>\n <AdHocFilterKey\n disabled={disabled}\n datasource={datasource}\n filterKey={key}\n onChange={onKeyChange}\n getTagKeysOptions={getTagKeysOptions}\n />\n <div className=\"gf-form\">\n <OperatorSegment disabled={disabled} value={operator} onChange={onOperatorChange} />\n </div>\n <AdHocFilterValue\n disabled={disabled}\n datasource={datasource}\n filterKey={key}\n filterValue={value}\n onChange={onValueChange}\n placeHolder={placeHolder}\n />\n </>\n );\n};\n","import React, { FC, useCallback, useState } from 'react';\n\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\nimport { AdHocVariableFilter } from 'app/features/variables/types';\n\nimport { AdHocFilterKey, REMOVE_FILTER_KEY } from './AdHocFilterKey';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\n\ninterface Props {\n datasource: DataSourceRef;\n onCompleted: (filter: AdHocVariableFilter) => void;\n appendBefore?: React.ReactNode;\n getTagKeysOptions?: any;\n}\n\nexport const AdHocFilterBuilder: FC<Props> = ({ datasource, appendBefore, onCompleted, getTagKeysOptions }) => {\n const [key, setKey] = useState<string | null>(null);\n const [operator, setOperator] = useState<string>('=');\n\n const onKeyChanged = useCallback(\n (item: SelectableValue<string | null>) => {\n if (item.value !== REMOVE_FILTER_KEY) {\n setKey(item.value ?? '');\n return;\n }\n setKey(null);\n },\n [setKey]\n );\n\n const onOperatorChanged = useCallback(\n (item: SelectableValue<string>) => setOperator(item.value ?? ''),\n [setOperator]\n );\n\n const onValueChanged = useCallback(\n (item: SelectableValue<string>) => {\n onCompleted({\n value: item.value ?? '',\n operator: operator,\n condition: '',\n key: key!,\n });\n setKey(null);\n setOperator('=');\n },\n [onCompleted, operator, key]\n );\n\n if (key === null) {\n return (\n <AdHocFilterKey\n datasource={datasource}\n filterKey={key}\n onChange={onKeyChanged}\n getTagKeysOptions={getTagKeysOptions}\n />\n );\n }\n\n return (\n <React.Fragment key=\"filter-builder\">\n {appendBefore}\n <AdHocFilterRenderer\n datasource={datasource}\n filter={{ key, value: '', operator, condition: '' }}\n placeHolder=\"select value\"\n onKeyChange={onKeyChanged}\n onOperatorChange={onOperatorChanged}\n onValueChange={onValueChanged}\n getTagKeysOptions={getTagKeysOptions}\n />\n </React.Fragment>\n );\n};\n","import React, { FC } from 'react';\n\ninterface Props {\n label: string;\n}\n\nexport const ConditionSegment: FC<Props> = ({ label }) => {\n return (\n <div className=\"gf-form\">\n <span className=\"gf-form-label query-keyword\">{label}</span>\n </div>\n );\n};\n","import React, { PureComponent, ReactNode } from 'react';\n\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\nimport { Segment } from '@grafana/ui';\nimport { AdHocVariableFilter } from 'app/features/variables/types';\n\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { REMOVE_FILTER_KEY } from './AdHocFilterKey';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { ConditionSegment } from './ConditionSegment';\n\ninterface Props {\n datasource: DataSourceRef | null;\n filters: AdHocVariableFilter[];\n addFilter: (filter: AdHocVariableFilter) => void;\n removeFilter: (index: number) => void;\n changeFilter: (index: number, newFilter: AdHocVariableFilter) => void;\n // Passes options to the datasources getTagKeys(options?: any) method\n // which is called to fetch the available filter key options in AdHocFilterKey.tsx\n getTagKeysOptions?: any;\n disabled?: boolean;\n}\n\n/**\n * Simple filtering component that automatically uses datasource APIs to get available labels and it's values, for\n * dynamic visual filtering without need for much setup. Instead of having single onChange prop this reports all the\n * change events with separate props so it is usable with AdHocPicker.\n *\n * Note: There isn't API on datasource to suggest the operators here so that is hardcoded to use prometheus style\n * operators. Also filters are assumed to be joined with `AND` operator, which is also hardcoded.\n */\nexport class AdHocFilter extends PureComponent<Props> {\n onChange = (index: number, prop: string) => (key: SelectableValue<string | null>) => {\n const { filters } = this.props;\n const { value } = key;\n\n if (key.value === REMOVE_FILTER_KEY) {\n return this.props.removeFilter(index);\n }\n\n return this.props.changeFilter(index, {\n ...filters[index],\n [prop]: value,\n });\n };\n\n appendFilterToVariable = (filter: AdHocVariableFilter) => {\n this.props.addFilter(filter);\n };\n\n render() {\n const { filters, disabled } = this.props;\n\n return (\n <div className=\"gf-form-inline\">\n {this.renderFilters(filters, disabled)}\n\n {!disabled && (\n <AdHocFilterBuilder\n datasource={this.props.datasource!}\n appendBefore={filters.length > 0 ? <ConditionSegment label=\"AND\" /> : null}\n onCompleted={this.appendFilterToVariable}\n getTagKeysOptions={this.props.getTagKeysOptions}\n />\n )}\n </div>\n );\n }\n\n renderFilters(filters: AdHocVariableFilter[], disabled?: boolean) {\n if (filters.length === 0 && disabled) {\n return <Segment disabled={disabled} value=\"No filters\" options={[]} onChange={() => {}} />;\n }\n\n return filters.reduce((segments: ReactNode[], filter, index) => {\n if (segments.length > 0) {\n segments.push(<ConditionSegment label=\"AND\" key={`condition-${index}`} />);\n }\n segments.push(this.renderFilterSegments(filter, index, disabled));\n return segments;\n }, []);\n }\n\n renderFilterSegments(filter: AdHocVariableFilter, index: number, disabled?: boolean) {\n return (\n <React.Fragment key={`filter-${index}`}>\n <AdHocFilterRenderer\n disabled={disabled}\n datasource={this.props.datasource!}\n filter={filter}\n onKeyChange={this.onChange(index, 'key')}\n onOperatorChange={this.onChange(index, 'operator')}\n onValueChange={this.onChange(index, 'value')}\n getTagKeysOptions={this.props.getTagKeysOptions}\n />\n </React.Fragment>\n );\n }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { AdHocVariableFilter, AdHocVariableModel, initialVariableModelState } from 'app/features/variables/types';\n\nimport { getInstanceState } from '../state/selectors';\nimport { initialVariablesState, VariablePayload, VariablesState } from '../state/types';\n\nexport interface AdHocVariabelFilterUpdate {\n index: number;\n filter: AdHocVariableFilter;\n}\n\nexport const initialAdHocVariableModelState: AdHocVariableModel = {\n ...initialVariableModelState,\n type: 'adhoc',\n datasource: null,\n filters: [],\n};\n\nexport const adHocVariableSlice = createSlice({\n name: 'templating/adhoc',\n initialState: initialVariablesState,\n reducers: {\n filterAdded: (state: VariablesState, action: PayloadAction<VariablePayload<AdHocVariableFilter>>) => {\n const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n instanceState.filters.push(action.payload.data);\n },\n filterRemoved: (state: VariablesState, action: PayloadAction<VariablePayload<number>>) => {\n const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n const index = action.payload.data;\n\n instanceState.filters.splice(index, 1);\n },\n filterUpdated: (state: VariablesState, action: PayloadAction<VariablePayload<AdHocVariabelFilterUpdate>>) => {\n const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n const { filter, index } = action.payload.data;\n\n instanceState.filters[index] = filter;\n },\n filtersRestored: (state: VariablesState, action: PayloadAction<VariablePayload<AdHocVariableFilter[]>>) => {\n const instanceState = getInstanceState<AdHocVariableModel>(state, action.payload.id);\n instanceState.filters = action.payload.data;\n },\n },\n});\n\nexport const { filterAdded, filterRemoved, filterUpdated, filtersRestored } = adHocVariableSlice.actions;\nexport const adHocVariableReducer = adHocVariableSlice.reducer;\n","export const NEW_VARIABLE_ID = '00000000-0000-0000-0000-000000000000';\nexport const ALL_VARIABLE_TEXT = 'All';\nexport const ALL_VARIABLE_VALUE = '$__all';\nexport const NONE_VARIABLE_TEXT = 'None';\nexport const NONE_VARIABLE_VALUE = '';\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback, useState } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useStyles } from '@grafana/ui';\n\nimport { VariableQueryEditorProps } from '../types';\n\nimport { VariableTextAreaField } from './VariableTextAreaField';\n\nexport const LEGACY_VARIABLE_QUERY_EDITOR_NAME = 'Grafana-LegacyVariableQueryEditor';\n\nexport const LegacyVariableQueryEditor: FC<VariableQueryEditorProps> = ({ onChange, query }) => {\n const styles = useStyles(getStyles);\n const [value, setValue] = useState(query);\n const onValueChange = (event: React.FormEvent<HTMLTextAreaElement>) => {\n setValue(event.currentTarget.value);\n };\n\n const onBlur = useCallback(\n (event: React.FormEvent<HTMLTextAreaElement>) => {\n onChange(event.currentTarget.value, event.currentTarget.value);\n },\n [onChange]\n );\n\n return (\n <div className={styles.container}>\n <VariableTextAreaField\n name=\"Query\"\n value={value}\n placeholder=\"metric name or tags query\"\n width={100}\n onChange={onValueChange}\n onBlur={onBlur}\n required\n labelWidth={20}\n ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsQueryInput}\n />\n </div>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n container: css`\n margin-bottom: ${theme.spacing.xs};\n `,\n };\n}\n\nLegacyVariableQueryEditor.displayName = LEGACY_VARIABLE_QUERY_EDITOR_NAME;\n","import { css } from '@emotion/css';\nimport React, { PropsWithChildren, ReactElement } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\n\ninterface VariableSectionHeaderProps {\n name: string;\n}\n\nexport function VariableSectionHeader({ name }: PropsWithChildren<VariableSectionHeaderProps>): ReactElement {\n const styles = useStyles(getStyles);\n\n return <h5 className={styles.sectionHeading}>{name}</h5>;\n}\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n sectionHeading: css`\n label: sectionHeading;\n font-size: ${theme.typography.size.md};\n margin-bottom: ${theme.spacing.sm};\n `,\n };\n}\n","import { css } from '@emotion/css';\nimport React, { PropsWithChildren, ReactElement } from 'react';\n\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { InlineFormLabel, Select, useStyles } from '@grafana/ui';\nimport { useUniqueId } from 'app/plugins/datasource/influxdb/components/useUniqueId';\n\ninterface VariableSelectFieldProps<T> {\n name: string;\n value: SelectableValue<T>;\n options: Array<SelectableValue<T>>;\n onChange: (option: SelectableValue<T>) => void;\n tooltip?: string;\n testId?: string;\n width?: number;\n labelWidth?: number;\n}\n\nexport function VariableSelectField({\n name,\n value,\n options,\n tooltip,\n onChange,\n testId,\n width,\n labelWidth,\n}: PropsWithChildren<VariableSelectFieldProps<any>>): ReactElement {\n const styles = useStyles(getStyles);\n const uniqueId = useUniqueId();\n const inputId = `variable-select-input-${name}-${uniqueId}`;\n\n return (\n <>\n <InlineFormLabel width={labelWidth ?? 6} tooltip={tooltip} htmlFor={inputId}>\n {name}\n </InlineFormLabel>\n <div data-testid={testId}>\n <Select\n inputId={inputId}\n onChange={onChange}\n value={value}\n width={width ?? 25}\n options={options}\n className={styles.selectContainer}\n />\n </div>\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n selectContainer: css`\n margin-right: ${theme.spacing.xs};\n `,\n };\n}\n","import { css } from '@emotion/css';\nimport React, { FormEvent, PropsWithChildren, ReactElement, useCallback } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { InlineField, TextArea, useStyles } from '@grafana/ui';\n\ninterface VariableTextAreaFieldProps<T> {\n name: string;\n value: string;\n placeholder: string;\n onChange: (event: FormEvent<HTMLTextAreaElement>) => void;\n width: number;\n tooltip?: string;\n ariaLabel?: string;\n required?: boolean;\n labelWidth?: number;\n testId?: string;\n onBlur?: (event: FormEvent<HTMLTextAreaElement>) => void;\n}\n\nexport function VariableTextAreaField({\n name,\n value,\n placeholder,\n tooltip,\n onChange,\n onBlur,\n ariaLabel,\n required,\n width,\n labelWidth,\n testId,\n}: PropsWithChildren<VariableTextAreaFieldProps<any>>): ReactElement {\n const styles = useStyles(getStyles);\n const getLineCount = useCallback((value: any) => {\n if (value && typeof value === 'string') {\n return value.split('\\n').length;\n }\n\n return 1;\n }, []);\n\n return (\n <InlineField label={name} labelWidth={labelWidth ?? 12} tooltip={tooltip}>\n <TextArea\n rows={getLineCount(value)}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n placeholder={placeholder}\n required={required}\n aria-label={ariaLabel}\n cols={width}\n className={styles.textarea}\n data-testid={testId}\n />\n </InlineField>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n textarea: css`\n white-space: pre-wrap;\n min-height: 32px;\n height: auto;\n overflow: auto;\n padding: 6px 8px;\n `,\n };\n}\n","import React, { FormEvent, PropsWithChildren, ReactElement } from 'react';\n\nimport { InlineField, Input, PopoverContent } from '@grafana/ui';\n\ninterface VariableTextFieldProps {\n value: string;\n name: string;\n placeholder: string;\n onChange: (event: FormEvent<HTMLInputElement>) => void;\n testId?: string;\n tooltip?: PopoverContent;\n required?: boolean;\n width?: number;\n labelWidth?: number;\n grow?: boolean;\n onBlur?: (event: FormEvent<HTMLInputElement>) => void;\n interactive?: boolean;\n}\n\nexport function VariableTextField({\n value,\n name,\n placeholder,\n onChange,\n testId,\n width,\n labelWidth,\n required,\n onBlur,\n tooltip,\n grow,\n interactive,\n}: PropsWithChildren<VariableTextFieldProps>): ReactElement {\n return (\n <InlineField interactive={interactive} label={name} labelWidth={labelWidth ?? 12} tooltip={tooltip} grow={grow}>\n <Input\n type=\"text\"\n id={name}\n name={name}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onBlur={onBlur}\n width={grow ? undefined : width ?? 25}\n data-testid={testId}\n required={required}\n />\n </InlineField>\n );\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { DataSourceApi, DataSourceRef } from '@grafana/data';\n\nimport { VariablePayload } from '../state/types';\nimport { VariableQueryEditorType } from '../types';\n\nexport interface AdHocVariableEditorState {\n infoText?: string;\n dataSources: Array<{ text: string; value: DataSourceRef | null }>;\n}\n\nexport interface DataSourceVariableEditorState {\n dataSourceTypes: Array<{ text: string; value: string }>;\n}\n\nexport interface QueryVariableEditorState {\n VariableQueryEditor: VariableQueryEditorType;\n dataSource: DataSourceApi | null;\n}\n\ntype VariableEditorExtension = AdHocVariableEditorState | DataSourceVariableEditorState | QueryVariableEditorState;\n\nexport interface VariableEditorState {\n id: string;\n name: string;\n errors: Record<string, string>;\n isValid: boolean;\n extended: VariableEditorExtension | null;\n}\n\nexport const initialVariableEditorState: VariableEditorState = {\n id: '',\n isValid: true,\n errors: {},\n name: '',\n extended: null,\n};\n\nconst variableEditorReducerSlice = createSlice({\n name: 'templating/editor',\n initialState: initialVariableEditorState,\n reducers: {\n setIdInEditor: (state: VariableEditorState, action: PayloadAction<{ id: string }>) => {\n state.id = action.payload.id;\n },\n clearIdInEditor: (state: VariableEditorState, action: PayloadAction<undefined>) => {\n state.id = '';\n },\n variableEditorMounted: (state: VariableEditorState, action: PayloadAction<{ name: string }>) => {\n state.name = action.payload.name;\n },\n variableEditorUnMounted: (state: VariableEditorState, action: PayloadAction<VariablePayload>) => {\n return initialVariableEditorState;\n },\n changeVariableNameSucceeded: (\n state: VariableEditorState,\n action: PayloadAction<VariablePayload<{ newName: string }>>\n ) => {\n state.name = action.payload.data.newName;\n delete state.errors['name'];\n state.isValid = Object.keys(state.errors).length === 0;\n },\n changeVariableNameFailed: (\n state: VariableEditorState,\n action: PayloadAction<{ newName: string; errorText: string }>\n ) => {\n state.name = action.payload.newName;\n state.errors.name = action.payload.errorText;\n state.isValid = Object.keys(state.errors).length === 0;\n },\n addVariableEditorError: (\n state: VariableEditorState,\n action: PayloadAction<{ errorProp: string; errorText: any }>\n ) => {\n state.errors[action.payload.errorProp] = action.payload.errorText;\n state.isValid = Object.keys(state.errors).length === 0;\n },\n removeVariableEditorError: (state: VariableEditorState, action: PayloadAction<{ errorProp: string }>) => {\n delete state.errors[action.payload.errorProp];\n state.isValid = Object.keys(state.errors).length === 0;\n },\n changeVariableEditorExtended: (state: VariableEditorState, action: PayloadAction<VariableEditorExtension>) => {\n state.extended = {\n ...state.extended,\n ...action.payload,\n };\n },\n cleanEditorState: () => initialVariableEditorState,\n },\n});\n\nexport const variableEditorReducer = variableEditorReducerSlice.reducer;\n\nexport const {\n setIdInEditor,\n clearIdInEditor,\n changeVariableNameSucceeded,\n changeVariableNameFailed,\n variableEditorMounted,\n variableEditorUnMounted,\n changeVariableEditorExtended,\n addVariableEditorError,\n removeVariableEditorError,\n cleanEditorState,\n} = variableEditorReducerSlice.actions;\n","import {\n AdHocVariableEditorState,\n DataSourceVariableEditorState,\n QueryVariableEditorState,\n VariableEditorState,\n} from './reducer';\n\n/**\n * Narrows generic variable editor state down to specific Adhoc variable extended editor state\n */\nexport function getAdhocVariableEditorState(editorState: VariableEditorState): AdHocVariableEditorState | null {\n if (editorState.extended && 'dataSources' in editorState.extended) {\n return editorState.extended;\n }\n\n return null;\n}\n\n/**\n * Narrows generic variable editor state down to specific Datasource variable extended editor state\n */\nexport function getDatasourceVariableEditorState(\n editorState: VariableEditorState\n): DataSourceVariableEditorState | null {\n if (editorState.extended && 'dataSourceTypes' in editorState.extended) {\n return editorState.extended;\n }\n\n return null;\n}\n\n/**\n * Narrows generic variable editor state down to specific Query variable extended editor state\n */\nexport function getQueryVariableEditorState(editorState: VariableEditorState): QueryVariableEditorState | null {\n if (editorState.extended && 'dataSource' in editorState.extended) {\n return editorState.extended;\n }\n\n return null;\n}\n","import { ScopedVars, UrlQueryMap } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\n\nimport { variableAdapters } from './adapters';\n\nexport function getVariablesUrlParams(scopedVars?: ScopedVars): UrlQueryMap {\n const params: UrlQueryMap = {};\n const variables = getTemplateSrv().getVariables();\n\n for (let i = 0; i < variables.length; i++) {\n const variable = variables[i];\n if (scopedVars && scopedVars[variable.name] !== void 0) {\n if (scopedVars[variable.name].skipUrlSync) {\n continue;\n }\n params['var-' + variable.name] = scopedVars[variable.name].value;\n } else {\n // @ts-ignore\n if (variable.skipUrlSync) {\n continue;\n }\n params['var-' + variable.name] = variableAdapters.get(variable.type).getValueForUrl(variable as any);\n }\n }\n\n return params;\n}\n","import { ComponentType } from 'react';\nimport { Observable } from 'rxjs';\n\nimport {\n CustomVariableSupport,\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceJsonData,\n DataSourceRef,\n MetricFindValue,\n StandardVariableQuery,\n StandardVariableSupport,\n VariableModel,\n VariableSupportType,\n} from '@grafana/data';\n\nimport { LEGACY_VARIABLE_QUERY_EDITOR_NAME } from './editor/LegacyVariableQueryEditor';\nimport {\n AdHocVariableModel,\n ConstantVariableModel,\n QueryVariableModel,\n VariableQueryEditorType,\n VariableQueryEditorProps,\n VariableWithMultiSupport,\n VariableWithOptions,\n DataSourceVariableModel,\n} from './types';\n\nexport const isQuery = (model: VariableModel): model is QueryVariableModel => {\n return model.type === 'query';\n};\n\nexport const isAdHoc = (model: VariableModel): model is AdHocVariableModel => {\n return model.type === 'adhoc';\n};\n\nexport const isConstant = (model: VariableModel): model is ConstantVariableModel => {\n return model.type === 'constant';\n};\n\nexport const isDataSource = (model: VariableModel): model is DataSourceVariableModel => {\n return model.type === 'datasource';\n};\n\nexport const isMulti = (model: VariableModel): model is VariableWithMultiSupport => {\n const withMulti = model as VariableWithMultiSupport;\n return withMulti.hasOwnProperty('multi') && typeof withMulti.multi === 'boolean';\n};\n\nexport const hasOptions = (model: VariableModel): model is VariableWithOptions => {\n return hasObjectProperty(model, 'options');\n};\n\nexport const hasCurrent = (model: VariableModel): model is VariableWithOptions => {\n return hasObjectProperty(model, 'current');\n};\n\nfunction hasObjectProperty(model: VariableModel, property: string): model is VariableWithOptions {\n if (!model) {\n return false;\n }\n\n const withProperty = model as Record<string, any>;\n return withProperty.hasOwnProperty(property) && typeof withProperty[property] === 'object';\n}\n\nexport function isLegacyAdHocDataSource(datasource: null | DataSourceRef | string): datasource is string {\n if (datasource === null) {\n return false;\n }\n\n return typeof datasource === 'string';\n}\n\ninterface DataSourceWithLegacyVariableSupport<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n metricFindQuery(query: any, options?: any): Promise<MetricFindValue[]>;\n variables: undefined;\n}\n\ninterface DataSourceWithStandardVariableSupport<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n variables: {\n getType(): VariableSupportType;\n toDataQuery(query: StandardVariableQuery): TQuery;\n query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse>;\n };\n}\n\ninterface DataSourceWithCustomVariableSupport<\n VariableQuery extends DataQuery = any,\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n variables: {\n getType(): VariableSupportType;\n editor: VariableQueryEditorType;\n query(request: DataQueryRequest<TQuery>): Observable<DataQueryResponse>;\n };\n}\n\ninterface DataSourceWithDatasourceVariableSupport<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> extends DataSourceApi<TQuery, TOptions> {\n variables: {\n getType(): VariableSupportType;\n };\n}\n\n/*\n * The following guard function are both TypeScript type guards.\n * They also make the basis for the logic used by variableQueryRunner and determining which QueryEditor to use\n * */\nexport const hasLegacyVariableSupport = <\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n datasource: DataSourceApi<TQuery, TOptions>\n): datasource is DataSourceWithLegacyVariableSupport<TQuery, TOptions> => {\n return Boolean(datasource.metricFindQuery) && !Boolean(datasource.variables);\n};\n\nexport const hasStandardVariableSupport = <\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n datasource: DataSourceApi<TQuery, TOptions>\n): datasource is DataSourceWithStandardVariableSupport<TQuery, TOptions> => {\n if (!datasource.variables) {\n return false;\n }\n\n if (datasource.variables.getType() !== VariableSupportType.Standard) {\n return false;\n }\n\n const variableSupport = datasource.variables as StandardVariableSupport<DataSourceApi<TQuery, TOptions>>;\n\n return Boolean(variableSupport.toDataQuery);\n};\n\nexport const hasCustomVariableSupport = <\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n datasource: DataSourceApi<TQuery, TOptions>\n): datasource is DataSourceWithCustomVariableSupport<any, TQuery, TOptions> => {\n if (!datasource.variables) {\n return false;\n }\n\n if (datasource.variables.getType() !== VariableSupportType.Custom) {\n return false;\n }\n\n const variableSupport = datasource.variables as CustomVariableSupport<DataSourceApi<TQuery, TOptions>>;\n\n return Boolean(variableSupport.query) && Boolean(variableSupport.editor);\n};\n\nexport const hasDatasourceVariableSupport = <\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n datasource: DataSourceApi<TQuery, TOptions>\n): datasource is DataSourceWithDatasourceVariableSupport<TQuery, TOptions> => {\n if (!datasource.variables) {\n return false;\n }\n\n return datasource.variables.getType() === VariableSupportType.Datasource;\n};\n\nexport function isLegacyQueryEditor<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n component: VariableQueryEditorType,\n datasource: DataSourceApi<TQuery, TOptions>\n): component is ComponentType<VariableQueryEditorProps> {\n if (!component) {\n return false;\n }\n\n return component.displayName === LEGACY_VARIABLE_QUERY_EDITOR_NAME || hasLegacyVariableSupport(datasource);\n}\n\nexport function isQueryEditor<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>(\n component: VariableQueryEditorType,\n datasource: DataSourceApi<TQuery, TOptions>\n): component is VariableQueryEditorType {\n if (!component) {\n return false;\n }\n\n return (\n component.displayName !== LEGACY_VARIABLE_QUERY_EDITOR_NAME &&\n (hasDatasourceVariableSupport(datasource) ||\n hasStandardVariableSupport(datasource) ||\n hasCustomVariableSupport(datasource))\n );\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { UsagesToNetwork, VariableUsageTree } from './utils';\n\nexport interface VariableInspectState {\n usages: VariableUsageTree[];\n usagesNetwork: UsagesToNetwork[];\n}\n\nexport const initialVariableInspectState: VariableInspectState = {\n usages: [],\n usagesNetwork: [],\n};\n\nconst variableInspectReducerSlice = createSlice({\n name: 'templating/inspect',\n initialState: initialVariableInspectState,\n reducers: {\n initInspect: (state, action: PayloadAction<{ usages: VariableUsageTree[]; usagesNetwork: UsagesToNetwork[] }>) => {\n const { usages, usagesNetwork } = action.payload;\n state.usages = usages;\n state.usagesNetwork = usagesNetwork;\n },\n },\n});\n\nexport const variableInspectReducer = variableInspectReducerSlice.reducer;\n\nexport const { initInspect } = variableInspectReducerSlice.actions;\n","import { DataLinkBuiltInVars } from '@grafana/data';\nimport { Graph } from 'app/core/utils/dag';\nimport { mapSet } from 'app/core/utils/set';\nimport { stringifyPanelModel } from 'app/features/dashboard/state/PanelModel';\n\nimport { safeStringifyValue } from '../../../core/utils/explore';\nimport { DashboardModel, PanelModel } from '../../dashboard/state';\nimport { variableAdapters } from '../adapters';\nimport { isAdHoc } from '../guard';\nimport { VariableModel } from '../types';\nimport { containsVariable, variableRegex, variableRegexExec } from '../utils';\n\nexport interface GraphNode {\n id: string;\n label: string;\n}\n\nexport interface GraphEdge {\n from: string;\n to: string;\n}\n\nexport const createDependencyNodes = (variables: VariableModel[]): GraphNode[] => {\n const nodes: GraphNode[] = [];\n\n for (const variable of variables) {\n nodes.push({ id: variable.id, label: `${variable.id}` });\n }\n\n return nodes;\n};\n\nexport const filterNodesWithDependencies = (nodes: GraphNode[], edges: GraphEdge[]): GraphNode[] => {\n return nodes.filter((node) => edges.some((edge) => edge.from === node.id || edge.to === node.id));\n};\n\nexport const createDependencyEdges = (variables: VariableModel[]): GraphEdge[] => {\n const edges: GraphEdge[] = [];\n\n for (const variable of variables) {\n for (const other of variables) {\n if (variable === other) {\n continue;\n }\n\n const dependsOn = variableAdapters.get(variable.type).dependsOn(variable, other);\n\n if (dependsOn) {\n edges.push({ from: variable.id, to: other.id });\n }\n }\n }\n\n return edges;\n};\n\nexport function getVariableName(expression: string) {\n const match = variableRegexExec(expression);\n if (!match) {\n return undefined;\n }\n const variableName = match.slice(1).find((match) => match !== undefined);\n return variableName;\n}\n\nexport const getUnknownVariableStrings = (variables: VariableModel[], model: any) => {\n variableRegex.lastIndex = 0;\n const unknownVariableNames: string[] = [];\n const modelAsString = safeStringifyValue(model, 2);\n const matches = modelAsString.match(variableRegex);\n\n if (!matches) {\n return unknownVariableNames;\n }\n\n for (const match of matches) {\n if (!match) {\n continue;\n }\n\n if (match.indexOf('$__') !== -1) {\n // ignore builtin variables\n continue;\n }\n\n if (match.indexOf('${__') !== -1) {\n // ignore builtin variables\n continue;\n }\n\n if (match.indexOf('$hashKey') !== -1) {\n // ignore Angular props\n continue;\n }\n\n const variableName = getVariableName(match);\n\n if (variables.some((variable) => variable.id === variableName)) {\n // ignore defined variables\n continue;\n }\n\n if (unknownVariableNames.find((name) => name === variableName)) {\n continue;\n }\n\n if (variableName) {\n unknownVariableNames.push(variableName);\n }\n }\n\n return unknownVariableNames;\n};\n\nconst validVariableNames: Record<string, RegExp[]> = {\n alias: [/^m$/, /^measurement$/, /^col$/, /^tag_(\\w+|\\d+)$/],\n query: [/^timeFilter$/],\n};\n\nexport const getPropsWithVariable = (variableId: string, parent: { key: string; value: any }, result: any) => {\n const stringValues = Object.keys(parent.value).reduce((all, key) => {\n const value = parent.value[key];\n if (!value || typeof value !== 'string') {\n return all;\n }\n\n const isValidName = validVariableNames[key]\n ? validVariableNames[key].find((regex: RegExp) => regex.test(variableId))\n : undefined;\n\n let hasVariable = containsVariable(value, variableId);\n if (key === 'repeat' && value === variableId) {\n // repeat stores value without variable format\n hasVariable = true;\n }\n\n if (!isValidName && hasVariable) {\n all = {\n ...all,\n [key]: value,\n };\n }\n\n return all;\n }, {} as Record<string, any>);\n\n const objectValues = Object.keys(parent.value).reduce((all, key) => {\n const value = parent.value[key];\n if (value && typeof value === 'object' && Object.keys(value).length) {\n let id = value.title || value.name || value.id || key;\n if (Array.isArray(parent.value) && parent.key === 'panels') {\n id = `${id}[${value.id}]`;\n }\n\n const newResult = getPropsWithVariable(variableId, { key, value }, {});\n\n if (Object.keys(newResult).length) {\n all = {\n ...all,\n [id]: newResult,\n };\n }\n }\n\n return all;\n }, {} as Record<string, any>);\n\n if (Object.keys(stringValues).length || Object.keys(objectValues).length) {\n result = {\n ...result,\n ...stringValues,\n ...objectValues,\n };\n }\n\n return result;\n};\n\nexport interface VariableUsageTree {\n variable: VariableModel;\n tree: any;\n}\n\nexport interface VariableUsages {\n unUsed: VariableModel[];\n usages: VariableUsageTree[];\n}\n\nexport const createUsagesNetwork = (variables: VariableModel[], dashboard: DashboardModel | null): VariableUsages => {\n if (!dashboard) {\n return { unUsed: [], usages: [] };\n }\n\n const unUsed: VariableModel[] = [];\n let usages: VariableUsageTree[] = [];\n const model = dashboard.getSaveModelClone();\n\n for (const variable of variables) {\n const variableId = variable.id;\n const props = getPropsWithVariable(variableId, { key: 'model', value: model }, {});\n if (!Object.keys(props).length && !isAdHoc(variable)) {\n unUsed.push(variable);\n }\n\n if (Object.keys(props).length) {\n usages.push({ variable, tree: props });\n }\n }\n\n return { unUsed, usages };\n};\n\nexport async function getUnknownsNetwork(\n variables: VariableModel[],\n dashboard: DashboardModel | null\n): Promise<UsagesToNetwork[]> {\n return new Promise((resolve, reject) => {\n // can be an expensive call so we avoid blocking the main thread\n setTimeout(() => {\n try {\n const unknowns = createUnknownsNetwork(variables, dashboard);\n resolve(transformUsagesToNetwork(unknowns));\n } catch (e) {\n reject(e);\n }\n }, 200);\n });\n}\n\nfunction createUnknownsNetwork(variables: VariableModel[], dashboard: DashboardModel | null): VariableUsageTree[] {\n if (!dashboard) {\n return [];\n }\n\n let unknown: VariableUsageTree[] = [];\n const model = dashboard.getSaveModelClone();\n\n const unknownVariables = getUnknownVariableStrings(variables, model);\n for (const unknownVariable of unknownVariables) {\n const props = getPropsWithVariable(unknownVariable, { key: 'model', value: model }, {});\n if (Object.keys(props).length) {\n const variable = { id: unknownVariable, name: unknownVariable } as unknown as VariableModel;\n unknown.push({ variable, tree: props });\n }\n }\n\n return unknown;\n}\n\n/*\n getAllAffectedPanelIdsForVariableChange is a function that extracts all the panel ids that are affected by a single variable\n change. It will traverse all chained variables to identify all cascading changes too.\n\n This is done entirely by parsing the current dashboard json and doesn't take under consideration a user cancelling\n a variable query or any faulty variable queries.\n\n This doesn't take circular dependencies in consideration.\n */\n\nexport function getAllAffectedPanelIdsForVariableChange(\n variableIds: string[],\n variableGraph: Graph,\n panelsByVar: Record<string, Set<number>>\n): Set<number> {\n const allDependencies = mapSet(variableGraph.descendants(variableIds), (n) => n.name);\n allDependencies.add(DataLinkBuiltInVars.includeVars);\n for (const id of variableIds) {\n allDependencies.add(id);\n }\n\n const affectedPanelIds = getDependentPanels([...allDependencies], panelsByVar);\n return affectedPanelIds;\n}\n\n// Return an array of panel IDs depending on variables\nexport function getDependentPanels(variables: string[], panelsByVarUsage: Record<string, Set<number>>) {\n const thePanels: number[] = [];\n for (const varId of variables) {\n if (panelsByVarUsage[varId]) {\n thePanels.push(...panelsByVarUsage[varId]);\n }\n }\n\n return new Set(thePanels);\n}\n\nexport interface UsagesToNetwork {\n variable: VariableModel;\n nodes: GraphNode[];\n edges: GraphEdge[];\n showGraph: boolean;\n}\n\nexport const traverseTree = (usage: UsagesToNetwork, parent: { id: string; value: any }): UsagesToNetwork => {\n const { id, value } = parent;\n const { nodes, edges } = usage;\n\n if (value && typeof value === 'string') {\n const leafId = `${parent.id}-${value}`;\n nodes.push({ id: leafId, label: value });\n edges.push({ from: leafId, to: id });\n\n return usage;\n }\n\n if (value && typeof value === 'object') {\n const keys = Object.keys(value);\n for (const key of keys) {\n const leafId = `${parent.id}-${key}`;\n nodes.push({ id: leafId, label: key });\n edges.push({ from: leafId, to: id });\n usage = traverseTree(usage, { id: leafId, value: value[key] });\n }\n\n return usage;\n }\n\n return usage;\n};\n\nexport const transformUsagesToNetwork = (usages: VariableUsageTree[]): UsagesToNetwork[] => {\n const results: UsagesToNetwork[] = [];\n\n for (const usage of usages) {\n const { variable, tree } = usage;\n const result: UsagesToNetwork = {\n variable,\n nodes: [{ id: 'dashboard', label: 'dashboard' }],\n edges: [],\n showGraph: false,\n };\n results.push(traverseTree(result, { id: 'dashboard', value: tree }));\n }\n\n return results;\n};\n\nconst countLeaves = (object: any): number => {\n const total = Object.values(object).reduce((count: number, value: any) => {\n if (typeof value === 'object') {\n return count + countLeaves(value);\n }\n\n return count + 1;\n }, 0);\n\n return total as unknown as number;\n};\n\nexport const getVariableUsages = (variableId: string, usages: VariableUsageTree[]): number => {\n const usage = usages.find((usage) => usage.variable.id === variableId);\n if (!usage) {\n return 0;\n }\n\n return countLeaves(usage.tree);\n};\n\nexport function flattenPanels(panels: PanelModel[]): PanelModel[] {\n const result: PanelModel[] = [];\n\n for (const panel of panels) {\n result.push(panel);\n if (panel.panels?.length) {\n result.push(...flattenPanels(panel.panels.map((p: PanelModel) => new PanelModel(p))));\n }\n }\n\n return result;\n}\n\n// Accepts an array of panel models, and returns an array of panel IDs paired with\n// the names of any template variables found\nexport function getPanelVars(panels: PanelModel[]) {\n const panelsByVar: Record<string, Set<number>> = {};\n for (const p of panels) {\n const jsonString = stringifyPanelModel(p);\n const repeats = [...jsonString.matchAll(/\"repeat\":\"([^\"]+)\"/g)].map((m) => m[1]);\n const varRegexMatches = jsonString.match(variableRegex)?.map((m) => getVariableName(m)) ?? [];\n const varNames = [...repeats, ...varRegexMatches];\n for (const varName of varNames) {\n if (varName! in panelsByVar) {\n panelsByVar[varName!].add(p.id);\n } else {\n panelsByVar[varName!] = new Set([p.id]);\n }\n }\n }\n\n return panelsByVar;\n}\n","export function mapSet<T, R>(set: Set<T>, callback: (t: T) => R): Set<R> {\n const newSet = new Set<R>();\n for (const el of set) {\n newSet.add(callback(el));\n }\n\n return newSet;\n}\n","export type MutateStateFunc<S> = (state: S) => S;\n\nexport const applyStateChanges = <S>(state: S, ...args: Array<MutateStateFunc<S>>): S => {\n return args.reduce((all, cur) => {\n return cur(all);\n }, state);\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { cloneDeep, isString, trim } from 'lodash';\n\nimport { applyStateChanges } from '../../../../core/utils/applyStateChanges';\nimport { ALL_VARIABLE_VALUE } from '../../constants';\nimport { isMulti, isQuery } from '../../guard';\nimport { VariableOption, VariableWithOptions } from '../../types';\nimport { containsSearchFilter } from '../../utils';\n\nexport interface ToggleOption {\n option?: VariableOption;\n forceSelect: boolean;\n clearOthers: boolean;\n}\n\nexport interface OptionsPickerState {\n id: string;\n selectedValues: VariableOption[];\n queryValue: string;\n highlightIndex: number;\n options: VariableOption[];\n multi: boolean;\n}\n\nexport const initialOptionPickerState: OptionsPickerState = {\n id: '',\n highlightIndex: -1,\n queryValue: '',\n selectedValues: [],\n options: [],\n multi: false,\n};\n\nexport const OPTIONS_LIMIT = 1000;\n\nconst optionsToRecord = (options: VariableOption[]): Record<string, VariableOption> => {\n if (!Array.isArray(options)) {\n return {};\n }\n\n return options.reduce((all: Record<string, VariableOption>, option) => {\n if (isString(option.value)) {\n all[option.value] = option;\n }\n return all;\n }, {});\n};\n\nconst updateOptions = (state: OptionsPickerState): OptionsPickerState => {\n if (!Array.isArray(state.options)) {\n state.options = [];\n return state;\n }\n\n const selectedOptions = optionsToRecord(state.selectedValues);\n state.selectedValues = Object.values(selectedOptions);\n\n state.options = state.options.map((option) => {\n if (!isString(option.value)) {\n return option;\n }\n\n const selected = !!selectedOptions[option.value];\n\n if (option.selected === selected) {\n return option;\n }\n\n return { ...option, selected };\n });\n state.options = applyLimit(state.options);\n return state;\n};\n\nconst applyLimit = (options: VariableOption[]): VariableOption[] => {\n if (!Array.isArray(options)) {\n return [];\n }\n if (options.length <= OPTIONS_LIMIT) {\n return options;\n }\n return options.slice(0, OPTIONS_LIMIT);\n};\n\nconst updateDefaultSelection = (state: OptionsPickerState): OptionsPickerState => {\n const { options, selectedValues } = state;\n\n if (options.length === 0 || selectedValues.length > 0) {\n return state;\n }\n\n if (!options[0] || options[0].value !== ALL_VARIABLE_VALUE) {\n return state;\n }\n\n state.selectedValues = [{ ...options[0], selected: true }];\n return state;\n};\n\nconst updateAllSelection = (state: OptionsPickerState): OptionsPickerState => {\n const { selectedValues } = state;\n if (selectedValues.length > 1) {\n state.selectedValues = selectedValues.filter((option) => option.value !== ALL_VARIABLE_VALUE);\n }\n return state;\n};\n\nconst optionsPickerSlice = createSlice({\n name: 'templating/optionsPicker',\n initialState: initialOptionPickerState,\n reducers: {\n showOptions: (state, action: PayloadAction<VariableWithOptions>): OptionsPickerState => {\n const { query, options } = action.payload;\n\n state.highlightIndex = -1;\n state.options = cloneDeep(options);\n state.id = action.payload.id;\n state.queryValue = '';\n state.multi = false;\n\n if (isMulti(action.payload)) {\n state.multi = action.payload.multi ?? false;\n }\n\n if (isQuery(action.payload)) {\n const { queryValue } = action.payload;\n const queryHasSearchFilter = containsSearchFilter(query);\n state.queryValue = queryHasSearchFilter && queryValue ? queryValue : '';\n }\n\n state.selectedValues = state.options.filter((option) => option.selected);\n return applyStateChanges(state, updateDefaultSelection, updateOptions);\n },\n hideOptions: (state, action: PayloadAction): OptionsPickerState => {\n return { ...initialOptionPickerState };\n },\n toggleOption: (state, action: PayloadAction<ToggleOption>): OptionsPickerState => {\n const { option, clearOthers, forceSelect } = action.payload;\n const { multi, selectedValues } = state;\n\n if (option) {\n const selected = !selectedValues.find((o) => o.value === option.value && o.text === option.text);\n\n if (option.value === ALL_VARIABLE_VALUE || !multi || clearOthers) {\n if (selected || forceSelect) {\n state.selectedValues = [{ ...option, selected: true }];\n } else {\n state.selectedValues = [];\n }\n return applyStateChanges(state, updateDefaultSelection, updateAllSelection, updateOptions);\n }\n if (forceSelect || selected) {\n state.selectedValues.push({ ...option, selected: true });\n return applyStateChanges(state, updateDefaultSelection, updateAllSelection, updateOptions);\n }\n\n state.selectedValues = selectedValues.filter((o) => o.value !== option.value && o.text !== option.text);\n } else {\n state.selectedValues = [];\n }\n\n return applyStateChanges(state, updateDefaultSelection, updateAllSelection, updateOptions);\n },\n moveOptionsHighlight: (state, action: PayloadAction<number>): OptionsPickerState => {\n let nextIndex = state.highlightIndex + action.payload;\n\n if (nextIndex < 0) {\n nextIndex = 0;\n } else if (nextIndex >= state.options.length) {\n nextIndex = state.options.length - 1;\n }\n\n return {\n ...state,\n highlightIndex: nextIndex,\n };\n },\n toggleAllOptions: (state, action: PayloadAction): OptionsPickerState => {\n if (state.selectedValues.length > 0) {\n state.selectedValues = [];\n return applyStateChanges(state, updateOptions);\n }\n\n state.selectedValues = state.options\n .filter((option) => option.value !== ALL_VARIABLE_VALUE)\n .map((option) => ({\n ...option,\n selected: true,\n }));\n\n return applyStateChanges(state, updateOptions);\n },\n updateSearchQuery: (state, action: PayloadAction<string>): OptionsPickerState => {\n state.queryValue = action.payload;\n return state;\n },\n updateOptionsAndFilter: (state, action: PayloadAction<VariableOption[]>): OptionsPickerState => {\n const searchQuery = trim((state.queryValue ?? '').toLowerCase());\n\n state.options = action.payload.filter((option) => {\n const optionsText = option.text ?? '';\n const text = Array.isArray(optionsText) ? optionsText.toString() : optionsText;\n return text.toLowerCase().indexOf(searchQuery) !== -1;\n });\n\n state.highlightIndex = 0;\n\n return applyStateChanges(state, updateDefaultSelection, updateOptions);\n },\n updateOptionsFromSearch: (state, action: PayloadAction<VariableOption[]>): OptionsPickerState => {\n state.options = action.payload;\n state.highlightIndex = 0;\n\n return applyStateChanges(state, updateDefaultSelection, updateOptions);\n },\n cleanPickerState: () => initialOptionPickerState,\n },\n});\n\nexport const {\n toggleOption,\n showOptions,\n hideOptions,\n moveOptionsHighlight,\n toggleAllOptions,\n updateSearchQuery,\n updateOptionsAndFilter,\n updateOptionsFromSearch,\n cleanPickerState,\n} = optionsPickerSlice.actions;\n\nexport const optionsPickerReducer = optionsPickerSlice.reducer;\n","import { VariableModel } from '@grafana/data';\n\nimport { VariableWithOptions } from '../types';\n\nexport const formatVariableLabel = (variable: VariableModel) => {\n if (!isVariableWithOptions(variable)) {\n return variable.name;\n }\n\n const { current } = variable;\n\n if (Array.isArray(current.text)) {\n return current.text.join(' + ');\n }\n\n return current.text;\n};\n\nconst isVariableWithOptions = (variable: VariableModel): variable is VariableWithOptions => {\n return (\n Array.isArray((variable as VariableWithOptions)?.options) ||\n typeof (variable as VariableWithOptions)?.current === 'object'\n );\n};\n","import { VariableOption } from 'app/features/variables/types';\n\nexport const alignCurrentWithMulti = (current: VariableOption, value: boolean): VariableOption => {\n if (!current) {\n return current;\n }\n\n if (value && !Array.isArray(current.value)) {\n return {\n ...current,\n value: convertToMulti(current.value),\n text: convertToMulti(current.text),\n };\n }\n\n if (!value && Array.isArray(current.value)) {\n return {\n ...current,\n value: convertToSingle(current.value),\n text: convertToSingle(current.text),\n };\n }\n\n return current;\n};\n\nconst convertToSingle = (value: string | string[]): string => {\n if (!Array.isArray(value)) {\n return value;\n }\n\n if (value.length > 0) {\n return value[0];\n }\n\n return '';\n};\n\nconst convertToMulti = (value: string | string[]): string[] => {\n if (Array.isArray(value)) {\n return value;\n }\n return [value];\n};\n","export class Edge {\n inputNode?: Node;\n outputNode?: Node;\n\n _linkTo(node: Node, direction: number) {\n if (direction <= 0) {\n node.inputEdges.push(this);\n }\n\n if (direction >= 0) {\n node.outputEdges.push(this);\n }\n\n node.edges.push(this);\n }\n\n link(inputNode: Node, outputNode: Node) {\n if (!inputNode) {\n throw Error('inputNode is required');\n }\n\n if (!outputNode) {\n throw Error('outputNode is required');\n }\n\n this.unlink();\n this.inputNode = inputNode;\n this.outputNode = outputNode;\n\n this._linkTo(inputNode, 1);\n this._linkTo(outputNode, -1);\n return this;\n }\n\n unlink() {\n let pos;\n const inode = this.inputNode;\n const onode = this.outputNode;\n\n if (!(inode && onode)) {\n return;\n }\n\n pos = inode.edges.indexOf(this);\n if (pos > -1) {\n inode.edges.splice(pos, 1);\n }\n\n pos = onode.edges.indexOf(this);\n if (pos > -1) {\n onode.edges.splice(pos, 1);\n }\n\n pos = inode.outputEdges.indexOf(this);\n if (pos > -1) {\n inode.outputEdges.splice(pos, 1);\n }\n\n pos = onode.inputEdges.indexOf(this);\n if (pos > -1) {\n onode.inputEdges.splice(pos, 1);\n }\n }\n}\n\nexport class Node {\n name: string;\n edges: Edge[];\n inputEdges: Edge[];\n outputEdges: Edge[];\n\n constructor(name: string) {\n this.name = name;\n this.edges = [];\n this.inputEdges = [];\n this.outputEdges = [];\n }\n\n getEdgeFrom(from: string | Node): Edge | null | undefined {\n if (!from) {\n return null;\n }\n\n if (typeof from === 'object') {\n return this.inputEdges.find((e) => e.inputNode?.name === from.name);\n }\n\n return this.inputEdges.find((e) => e.inputNode?.name === from);\n }\n\n getEdgeTo(to: string | Node): Edge | null | undefined {\n if (!to) {\n return null;\n }\n\n if (typeof to === 'object') {\n return this.outputEdges.find((e) => e.outputNode?.name === to.name);\n }\n\n return this.outputEdges.find((e) => e.outputNode?.name === to);\n }\n\n getOptimizedInputEdges(): Edge[] {\n const toBeRemoved: any[] = [];\n this.inputEdges.forEach((e) => {\n const inputEdgesNodes = e.inputNode?.inputEdges.map((e) => e.inputNode);\n\n inputEdgesNodes?.forEach((n) => {\n const edgeToRemove = n?.getEdgeTo(this.name);\n if (edgeToRemove) {\n toBeRemoved.push(edgeToRemove);\n }\n });\n });\n\n return this.inputEdges.filter((e) => toBeRemoved.indexOf(e) === -1);\n }\n}\n\nexport class Graph {\n nodes: Record<string, Node> = {};\n\n constructor() {}\n\n createNode(name: string): Node {\n const n = new Node(name);\n this.nodes[name] = n;\n return n;\n }\n\n createNodes(names: string[]): Node[] {\n const nodes: Node[] = [];\n names.forEach((name) => {\n nodes.push(this.createNode(name));\n });\n return nodes;\n }\n\n link(input: string | string[] | Node | Node[], output: string | string[] | Node | Node[]): Edge[] {\n let inputArr = [];\n let outputArr = [];\n const inputNodes: Node[] = [];\n const outputNodes: Node[] = [];\n\n if (input instanceof Array) {\n inputArr = input;\n } else {\n inputArr = [input];\n }\n\n if (output instanceof Array) {\n outputArr = output;\n } else {\n outputArr = [output];\n }\n\n for (let n = 0; n < inputArr.length; n++) {\n const i = inputArr[n];\n if (typeof i === 'string') {\n const n = this.getNode(i);\n if (!n) {\n throw Error(`cannot link input node named ${i} since it doesn't exist in graph`);\n }\n inputNodes.push(n);\n } else {\n inputNodes.push(i);\n }\n }\n\n for (let n = 0; n < outputArr.length; n++) {\n const i = outputArr[n];\n if (typeof i === 'string') {\n const n = this.getNode(i);\n if (!n) {\n throw Error(`cannot link output node named ${i} since it doesn't exist in graph`);\n }\n outputNodes.push(n);\n } else {\n outputNodes.push(i);\n }\n }\n\n const edges: Edge[] = [];\n inputNodes.forEach((input) => {\n outputNodes.forEach((output) => {\n edges.push(this.createEdge().link(input, output));\n });\n });\n return edges;\n }\n\n descendants(nodes: Node[] | string[]): Set<Node> {\n if (!nodes.length) {\n return new Set();\n }\n\n const initialNodes = new Set(\n isStringArray(nodes) ? nodes.map((n) => this.nodes[n]).filter((n) => n !== undefined) : nodes\n );\n\n return this.descendantsRecursive(initialNodes);\n }\n\n private descendantsRecursive(nodes: Set<Node>, descendants = new Set<Node>()): Set<Node> {\n for (const node of nodes) {\n const newDescendants = new Set<Node>();\n for (const { inputNode } of node.inputEdges) {\n if (inputNode && !descendants.has(inputNode)) {\n descendants.add(inputNode);\n newDescendants.add(inputNode);\n }\n }\n\n this.descendantsRecursive(newDescendants, descendants);\n }\n\n return descendants;\n }\n\n createEdge(): Edge {\n return new Edge();\n }\n\n getNode(name: string): Node {\n return this.nodes[name];\n }\n}\n\nexport const printGraph = (g: Graph) => {\n Object.keys(g.nodes).forEach((name) => {\n const n = g.nodes[name];\n let outputEdges = n.outputEdges.map((e: Edge) => e.outputNode?.name).join(', ');\n if (!outputEdges) {\n outputEdges = '<none>';\n }\n let inputEdges = n.inputEdges.map((e: Edge) => e.inputNode?.name).join(', ');\n if (!inputEdges) {\n inputEdges = '<none>';\n }\n console.log(`${n.name}:\\n - links to: ${outputEdges}\\n - links from: ${inputEdges}`);\n });\n};\n\nfunction isStringArray(arr: unknown[]): arr is string[] {\n return arr.length > 0 && typeof arr[0] === 'string';\n}\n","import { castArray, isEqual } from 'lodash';\n\nimport {\n DataQuery,\n getDataSourceRef,\n isDataSourceRef,\n LoadingState,\n TimeRange,\n UrlQueryMap,\n UrlQueryValue,\n} from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { store } from 'app/store/store';\n\nimport { createErrorNotification } from '../../../core/copy/appNotification';\nimport { appEvents } from '../../../core/core';\nimport { getBackendSrv } from '../../../core/services/backend_srv';\nimport { Graph } from '../../../core/utils/dag';\nimport { AppNotification, StoreState, ThunkResult } from '../../../types';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport { getTemplateSrv, TemplateSrv } from '../../templating/template_srv';\nimport { variableAdapters } from '../adapters';\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\nimport { cleanEditorState } from '../editor/reducer';\nimport {\n hasCurrent,\n hasLegacyVariableSupport,\n hasOptions,\n hasStandardVariableSupport,\n isAdHoc,\n isConstant,\n isMulti,\n isQuery,\n} from '../guard';\nimport { getAllAffectedPanelIdsForVariableChange, getPanelVars } from '../inspect/utils';\nimport { cleanPickerState } from '../pickers/OptionsPicker/reducer';\nimport { alignCurrentWithMulti } from '../shared/multiOptions';\nimport {\n DashboardVariableModel,\n initialVariableModelState,\n OrgVariableModel,\n QueryVariableModel,\n TransactionStatus,\n UserVariableModel,\n VariableHide,\n VariableModel,\n VariableOption,\n VariableRefresh,\n VariablesChanged,\n VariablesChangedEvent,\n VariablesChangedInUrl,\n VariablesTimeRangeProcessDone,\n VariableWithMultiSupport,\n VariableWithOptions,\n} from '../types';\nimport {\n ensureStringValues,\n ExtendedUrlQueryMap,\n getCurrentText,\n getVariableRefresh,\n hasOngoingTransaction,\n toKeyedVariableIdentifier,\n toStateKey,\n toVariablePayload,\n} from '../utils';\n\nimport { toKeyedAction } from './keyedVariablesReducer';\nimport { getIfExistsLastKey, getVariable, getVariablesByKey, getVariablesState } from './selectors';\nimport {\n addVariable,\n changeVariableProp,\n setCurrentVariableValue,\n variableStateCompleted,\n variableStateFailed,\n variableStateFetching,\n variableStateNotStarted,\n} from './sharedReducer';\nimport {\n variablesClearTransaction,\n variablesCompleteTransaction,\n variablesInitTransaction,\n} from './transactionReducer';\nimport { KeyedVariableIdentifier } from './types';\nimport { cleanVariables } from './variablesReducer';\n\n// process flow queryVariable\n// thunk => processVariables\n// adapter => setValueFromUrl\n// thunk => setOptionFromUrl\n// adapter => updateOptions\n// thunk => updateQueryVariableOptions\n// action => updateVariableOptions\n// action => updateVariableTags\n// thunk => validateVariableSelectionState\n// adapter => setValue\n// thunk => setOptionAsCurrent\n// action => setCurrentVariableValue\n// thunk => variableUpdated\n// adapter => updateOptions for dependent nodes\n// adapter => setValue\n// thunk => setOptionAsCurrent\n// action => setCurrentVariableValue\n// thunk => variableUpdated\n// adapter => updateOptions for dependent nodes\n// adapter => updateOptions\n// thunk => updateQueryVariableOptions\n// action => updateVariableOptions\n// action => updateVariableTags\n// thunk => validateVariableSelectionState\n// adapter => setValue\n// thunk => setOptionAsCurrent\n// action => setCurrentVariableValue\n// thunk => variableUpdated\n// adapter => updateOptions for dependent nodes\n\nexport const initDashboardTemplating = (key: string, dashboard: DashboardModel): ThunkResult<void> => {\n return (dispatch, getState) => {\n let orderIndex = 0;\n const list = dashboard.templating.list;\n for (let index = 0; index < list.length; index++) {\n const model = fixSelectedInconsistency(list[index]);\n model.rootStateKey = key;\n if (!variableAdapters.getIfExists(model.type)) {\n continue;\n }\n\n dispatch(\n toKeyedAction(key, addVariable(toVariablePayload(model, { global: false, index: orderIndex++, model })))\n );\n }\n\n getTemplateSrv().updateTimeRange(getTimeSrv().timeRange());\n\n const variables = getVariablesByKey(key, getState());\n for (const variable of variables) {\n dispatch(toKeyedAction(key, variableStateNotStarted(toVariablePayload(variable))));\n }\n };\n};\n\nexport function fixSelectedInconsistency(model: VariableModel): VariableModel | VariableWithOptions {\n if (!hasOptions(model)) {\n return model;\n }\n\n let found = false;\n for (const option of model.options) {\n option.selected = false;\n if (Array.isArray(model.current.value)) {\n for (const value of model.current.value) {\n if (option.value === value) {\n option.selected = found = true;\n }\n }\n } else if (option.value === model.current.value) {\n option.selected = found = true;\n }\n }\n\n if (!found && model.options.length) {\n model.options[0].selected = true;\n }\n\n return model;\n}\n\nexport const addSystemTemplateVariables = (key: string, dashboard: DashboardModel): ThunkResult<void> => {\n return (dispatch) => {\n const dashboardModel: DashboardVariableModel = {\n ...initialVariableModelState,\n id: '__dashboard',\n name: '__dashboard',\n type: 'system',\n index: -3,\n skipUrlSync: true,\n hide: VariableHide.hideVariable,\n current: {\n value: {\n name: dashboard.title,\n uid: dashboard.uid,\n toString: () => dashboard.title,\n },\n },\n };\n\n dispatch(\n toKeyedAction(\n key,\n addVariable(\n toVariablePayload(dashboardModel, {\n global: dashboardModel.global,\n index: dashboardModel.index,\n model: dashboardModel,\n })\n )\n )\n );\n\n const orgModel: OrgVariableModel = {\n ...initialVariableModelState,\n id: '__org',\n name: '__org',\n type: 'system',\n index: -2,\n skipUrlSync: true,\n hide: VariableHide.hideVariable,\n current: {\n value: {\n name: contextSrv.user.orgName,\n id: contextSrv.user.orgId,\n toString: () => contextSrv.user.orgId.toString(),\n },\n },\n };\n\n dispatch(\n toKeyedAction(\n key,\n addVariable(toVariablePayload(orgModel, { global: orgModel.global, index: orgModel.index, model: orgModel }))\n )\n );\n\n const userModel: UserVariableModel = {\n ...initialVariableModelState,\n id: '__user',\n name: '__user',\n type: 'system',\n index: -1,\n skipUrlSync: true,\n hide: VariableHide.hideVariable,\n current: {\n value: {\n login: contextSrv.user.login,\n id: contextSrv.user.id,\n email: contextSrv.user.email,\n toString: () => contextSrv.user.id.toString(),\n },\n },\n };\n\n dispatch(\n toKeyedAction(\n key,\n addVariable(\n toVariablePayload(userModel, { global: userModel.global, index: userModel.index, model: userModel })\n )\n )\n );\n };\n};\n\nexport const changeVariableMultiValue = (identifier: KeyedVariableIdentifier, multi: boolean): ThunkResult<void> => {\n return (dispatch, getState) => {\n const { rootStateKey: key } = identifier;\n const variable = getVariable<VariableWithMultiSupport>(identifier, getState());\n const current = alignCurrentWithMulti(variable.current, multi);\n\n dispatch(\n toKeyedAction(key, changeVariableProp(toVariablePayload(identifier, { propName: 'multi', propValue: multi })))\n );\n dispatch(\n toKeyedAction(key, changeVariableProp(toVariablePayload(identifier, { propName: 'current', propValue: current })))\n );\n };\n};\n\nexport const processVariableDependencies = async (variable: VariableModel, state: StoreState) => {\n if (!variable.rootStateKey) {\n throw new Error(`rootStateKey not found for variable with id:${variable.id}`);\n }\n\n if (isDependencyGraphCircular(variable, state)) {\n throw new Error('Circular dependency in dashboard variables detected. Dashboard may not work as expected.');\n }\n\n const dependencies = getDirectDependencies(variable, state);\n\n if (!isWaitingForDependencies(variable.rootStateKey, dependencies, state)) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const unsubscribe = store.subscribe(() => {\n if (!variable.rootStateKey) {\n throw new Error(`rootStateKey not found for variable with id:${variable.id}`);\n }\n\n if (!isWaitingForDependencies(variable.rootStateKey, dependencies, store.getState())) {\n unsubscribe();\n resolve();\n }\n });\n });\n};\n\nconst isDependencyGraphCircular = (\n variable: VariableModel,\n state: StoreState,\n encounteredDependencyIds: Set<string> = new Set()\n): boolean => {\n if (encounteredDependencyIds.has(variable.id)) {\n return true;\n }\n\n encounteredDependencyIds = new Set([...encounteredDependencyIds, variable.id]);\n\n return getDirectDependencies(variable, state).some((dependency) => {\n return isDependencyGraphCircular(dependency, state, encounteredDependencyIds);\n });\n};\n\nconst getDirectDependencies = (variable: VariableModel, state: StoreState) => {\n if (!variable.rootStateKey) {\n return [];\n }\n\n const directDependencies: VariableModel[] = [];\n\n for (const otherVariable of getVariablesByKey(variable.rootStateKey, state)) {\n if (variable === otherVariable) {\n continue;\n }\n\n if (variableAdapters.getIfExists(variable.type)) {\n if (variableAdapters.get(variable.type).dependsOn(variable, otherVariable)) {\n directDependencies.push(otherVariable);\n }\n }\n }\n\n return directDependencies;\n};\n\nconst isWaitingForDependencies = (key: string, dependencies: VariableModel[], state: StoreState): boolean => {\n if (dependencies.length === 0) {\n return false;\n }\n\n const variables = getVariablesByKey(key, state);\n const notCompletedDependencies = dependencies.filter((d) =>\n variables.some((v) => v.id === d.id && (v.state === LoadingState.NotStarted || v.state === LoadingState.Loading))\n );\n\n return notCompletedDependencies.length > 0;\n};\n\nexport const processVariable = (\n identifier: KeyedVariableIdentifier,\n queryParams: UrlQueryMap\n): ThunkResult<Promise<void>> => {\n return async (dispatch, getState) => {\n const variable = getVariable(identifier, getState());\n await processVariableDependencies(variable, getState());\n\n const urlValue = queryParams['var-' + variable.name];\n if (urlValue !== void 0) {\n const stringUrlValue = ensureStringValues(urlValue);\n await variableAdapters.get(variable.type).setValueFromUrl(variable, stringUrlValue);\n return;\n }\n\n if (variable.hasOwnProperty('refresh')) {\n const refreshableVariable = variable as QueryVariableModel;\n if (\n refreshableVariable.refresh === VariableRefresh.onDashboardLoad ||\n refreshableVariable.refresh === VariableRefresh.onTimeRangeChanged\n ) {\n await dispatch(updateOptions(toKeyedVariableIdentifier(refreshableVariable)));\n return;\n }\n }\n\n // for variables that aren't updated via URL or refresh, let's simulate the same state changes\n dispatch(completeVariableLoading(identifier));\n };\n};\n\nexport const processVariables = (key: string): ThunkResult<Promise<void>> => {\n return async (dispatch, getState) => {\n const queryParams = locationService.getSearchObject();\n const promises = getVariablesByKey(key, getState()).map(\n async (variable: VariableModel) =>\n await dispatch(processVariable(toKeyedVariableIdentifier(variable), queryParams))\n );\n\n await Promise.all(promises);\n };\n};\n\nexport const setOptionFromUrl = (\n identifier: KeyedVariableIdentifier,\n urlValue: UrlQueryValue\n): ThunkResult<Promise<void>> => {\n return async (dispatch, getState) => {\n const stringUrlValue = ensureStringValues(urlValue);\n const variable = getVariable(identifier, getState());\n if (getVariableRefresh(variable) !== VariableRefresh.never) {\n // updates options\n await dispatch(updateOptions(toKeyedVariableIdentifier(variable)));\n }\n\n // get variable from state\n const variableFromState = getVariable<VariableWithOptions>(toKeyedVariableIdentifier(variable), getState());\n if (!variableFromState) {\n throw new Error(`Couldn't find variable with name: ${variable.name}`);\n }\n // Simple case. Value in URL matches existing options text or value.\n let option = variableFromState.options.find((op) => {\n return op.text === stringUrlValue || op.value === stringUrlValue;\n });\n\n if (!option && isMulti(variableFromState)) {\n if (variableFromState.allValue && stringUrlValue === variableFromState.allValue) {\n option = { text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false };\n }\n }\n\n if (!option) {\n let defaultText = stringUrlValue;\n const defaultValue = stringUrlValue;\n\n if (Array.isArray(stringUrlValue)) {\n // Multiple values in the url. We construct text as a list of texts from all matched options.\n defaultText = stringUrlValue.reduce((acc: string[], item: string) => {\n const foundOption = variableFromState.options.find((o) => o.value === item);\n if (!foundOption) {\n // @ts-ignore according to strict null errors this can never happen\n // TODO: investigate this further or refactor code\n return [].concat(acc, [item]);\n }\n\n // @ts-ignore according to strict null errors this can never happen\n // TODO: investigate this further or refactor code\n return [].concat(acc, [foundOption.text]);\n }, []);\n }\n\n // It is possible that we did not match the value to any existing option. In that case the URL value will be\n // used anyway for both text and value.\n option = { text: defaultText, value: defaultValue, selected: false };\n }\n\n if (isMulti(variableFromState)) {\n // In case variable is multiple choice, we cast to array to preserve the same behavior as when selecting\n // the option directly, which will return even single value in an array.\n option = alignCurrentWithMulti(\n { text: castArray(option.text), value: castArray(option.value), selected: false },\n variableFromState.multi\n );\n }\n\n await variableAdapters.get(variable.type).setValue(variableFromState, option);\n };\n};\n\nexport const selectOptionsForCurrentValue = (variable: VariableWithOptions): VariableOption[] => {\n let i, y, value, option;\n const selected: VariableOption[] = [];\n\n for (i = 0; i < variable.options.length; i++) {\n option = { ...variable.options[i] };\n option.selected = false;\n if (Array.isArray(variable.current.value)) {\n for (y = 0; y < variable.current.value.length; y++) {\n value = variable.current.value[y];\n if (option.value === value) {\n option.selected = true;\n selected.push(option);\n }\n }\n } else if (option.value === variable.current.value) {\n option.selected = true;\n selected.push(option);\n }\n }\n\n return selected;\n};\n\nexport const validateVariableSelectionState = (\n identifier: KeyedVariableIdentifier,\n defaultValue?: string\n): ThunkResult<Promise<void>> => {\n return (dispatch, getState) => {\n const variableInState = getVariable<VariableWithOptions>(identifier, getState());\n const current = variableInState.current || ({} as unknown as VariableOption);\n const setValue = variableAdapters.get(variableInState.type).setValue;\n\n if (Array.isArray(current.value)) {\n const selected = selectOptionsForCurrentValue(variableInState);\n\n // if none pick first\n if (selected.length === 0) {\n const option = variableInState.options[0];\n return setValue(variableInState, option);\n }\n\n const option: VariableOption = {\n value: selected.map((v) => v.value) as string[],\n text: selected.map((v) => v.text) as string[],\n selected: true,\n };\n return setValue(variableInState, option);\n }\n\n let option: VariableOption | undefined | null = null;\n\n // 1. find the current value\n const text = getCurrentText(variableInState);\n option = variableInState.options?.find((v) => v.text === text);\n if (option) {\n return setValue(variableInState, option);\n }\n\n // 2. find the default value\n if (defaultValue) {\n option = variableInState.options?.find((v) => v.text === defaultValue);\n if (option) {\n return setValue(variableInState, option);\n }\n }\n\n // 3. use the first value\n if (variableInState.options) {\n const option = variableInState.options[0];\n if (option) {\n return setValue(variableInState, option);\n }\n }\n\n // 4... give up\n return Promise.resolve();\n };\n};\n\nexport const setOptionAsCurrent = (\n identifier: KeyedVariableIdentifier,\n current: VariableOption,\n emitChanges: boolean\n): ThunkResult<Promise<void>> => {\n return async (dispatch) => {\n const { rootStateKey: key } = identifier;\n dispatch(toKeyedAction(key, setCurrentVariableValue(toVariablePayload(identifier, { option: current }))));\n return await dispatch(variableUpdated(identifier, emitChanges));\n };\n};\n\nexport const createGraph = (variables: VariableModel[]) => {\n const g = new Graph();\n\n variables.forEach((v) => {\n g.createNode(v.name);\n });\n\n variables.forEach((v1) => {\n variables.forEach((v2) => {\n if (v1 === v2) {\n return;\n }\n\n if (variableAdapters.get(v1.type).dependsOn(v1, v2)) {\n g.link(v1.name, v2.name);\n }\n });\n });\n\n return g;\n};\n\nexport const variableUpdated = (\n identifier: KeyedVariableIdentifier,\n emitChangeEvents: boolean,\n events: typeof appEvents = appEvents\n): ThunkResult<Promise<void>> => {\n return async (dispatch, getState) => {\n const state = getState();\n const { rootStateKey } = identifier;\n const variableInState = getVariable(identifier, state);\n\n // if we're initializing variables ignore cascading update because we are in a boot up scenario\n if (getVariablesState(rootStateKey, state).transaction.status === TransactionStatus.Fetching) {\n if (getVariableRefresh(variableInState) === VariableRefresh.never) {\n // for variable types with updates that go the setValueFromUrl path in the update let's make sure their state is set to Done.\n await dispatch(upgradeLegacyQueries(toKeyedVariableIdentifier(variableInState)));\n dispatch(completeVariableLoading(identifier));\n }\n return Promise.resolve();\n }\n\n const variables = getVariablesByKey(rootStateKey, state);\n const g = createGraph(variables);\n const panels = state.dashboard?.getModel()?.panels ?? [];\n const panelVars = getPanelVars(panels);\n\n const event: VariablesChangedEvent = isAdHoc(variableInState)\n ? { refreshAll: true, panelIds: [] } // for adhoc variables we don't know which panels that will be impacted\n : {\n refreshAll: false,\n panelIds: Array.from(getAllAffectedPanelIdsForVariableChange([variableInState.id], g, panelVars)),\n };\n\n const node = g.getNode(variableInState.name);\n let promises: Array<Promise<any>> = [];\n if (node) {\n promises = node.getOptimizedInputEdges().map((e) => {\n const variable = variables.find((v) => v.name === e.inputNode?.name);\n if (!variable) {\n return Promise.resolve();\n }\n\n return dispatch(updateOptions(toKeyedVariableIdentifier(variable)));\n });\n }\n\n return Promise.all(promises).then(() => {\n if (emitChangeEvents) {\n events.publish(new VariablesChanged(event));\n locationService.partial(getQueryWithVariables(rootStateKey, getState));\n }\n });\n };\n};\n\nexport interface OnTimeRangeUpdatedDependencies {\n templateSrv: TemplateSrv;\n events: typeof appEvents;\n}\n\nexport const onTimeRangeUpdated =\n (\n key: string,\n timeRange: TimeRange,\n dependencies: OnTimeRangeUpdatedDependencies = { templateSrv: getTemplateSrv(), events: appEvents }\n ): ThunkResult<Promise<void>> =>\n async (dispatch, getState) => {\n dependencies.templateSrv.updateTimeRange(timeRange);\n const variablesThatNeedRefresh = getVariablesByKey(key, getState()).filter((variable) => {\n if (variable.hasOwnProperty('refresh') && variable.hasOwnProperty('options')) {\n const variableWithRefresh = variable as unknown as QueryVariableModel;\n return variableWithRefresh.refresh === VariableRefresh.onTimeRangeChanged;\n }\n\n return false;\n }) as VariableWithOptions[];\n\n const variableIds = variablesThatNeedRefresh.map((variable) => variable.id);\n const promises = variablesThatNeedRefresh.map((variable) =>\n dispatch(timeRangeUpdated(toKeyedVariableIdentifier(variable)))\n );\n\n try {\n await Promise.all(promises);\n dependencies.events.publish(new VariablesTimeRangeProcessDone({ variableIds }));\n } catch (error) {\n console.error(error);\n dispatch(notifyApp(createVariableErrorNotification('Template variable service failed', error)));\n }\n };\n\nconst timeRangeUpdated =\n (identifier: KeyedVariableIdentifier): ThunkResult<Promise<void>> =>\n async (dispatch, getState) => {\n const variableInState = getVariable<VariableWithOptions>(identifier, getState());\n const previousOptions = variableInState.options.slice();\n\n await dispatch(updateOptions(toKeyedVariableIdentifier(variableInState), true));\n\n const updatedVariable = getVariable<VariableWithOptions>(identifier, getState());\n const updatedOptions = updatedVariable.options;\n\n if (JSON.stringify(previousOptions) !== JSON.stringify(updatedOptions)) {\n const dashboard = getState().dashboard.getModel();\n dashboard?.templateVariableValueUpdated();\n }\n };\n\nexport const templateVarsChangedInUrl =\n (key: string, vars: ExtendedUrlQueryMap, events: typeof appEvents = appEvents): ThunkResult<void> =>\n async (dispatch, getState) => {\n const update: Array<Promise<any>> = [];\n const dashboard = getState().dashboard.getModel();\n const variables = getVariablesByKey(key, getState());\n\n for (const variable of variables) {\n const key = `var-${variable.name}`;\n if (!vars.hasOwnProperty(key)) {\n // key not found quick exit\n continue;\n }\n\n if (!isVariableUrlValueDifferentFromCurrent(variable, vars[key].value)) {\n // variable values doesn't differ quick exit\n continue;\n }\n\n let value = vars[key].value; // as the default the value is set to the value passed into templateVarsChangedInUrl\n if (vars[key].removed) {\n // for some reason (panel|data link without variable) the variable url value (var-xyz) has been removed from the url\n // so we need to revert the value to the value stored in dashboard json\n const variableInModel = dashboard?.templating.list.find((v) => v.name === variable.name);\n if (variableInModel && hasCurrent(variableInModel)) {\n value = variableInModel.current.value; // revert value to the value stored in dashboard json\n }\n\n if (variableInModel && isConstant(variableInModel)) {\n value = variableInModel.query; // revert value to the value stored in dashboard json, constants don't store current values in dashboard json\n }\n }\n\n const promise = variableAdapters.get(variable.type).setValueFromUrl(variable, value);\n update.push(promise);\n }\n\n const filteredVars = variables.filter((v) => {\n const key = `var-${v.name}`;\n return vars.hasOwnProperty(key) && isVariableUrlValueDifferentFromCurrent(v, vars[key].value) && !isAdHoc(v);\n });\n const varGraph = createGraph(variables);\n const panelVars = getPanelVars(dashboard?.panels ?? []);\n const affectedPanels = getAllAffectedPanelIdsForVariableChange(\n filteredVars.map((v) => v.id),\n varGraph,\n panelVars\n );\n\n if (update.length) {\n await Promise.all(update);\n\n events.publish(\n new VariablesChangedInUrl({\n refreshAll: affectedPanels.size === 0,\n panelIds: Array.from(affectedPanels),\n })\n );\n }\n };\n\nexport function isVariableUrlValueDifferentFromCurrent(variable: VariableModel, urlValue: any): boolean {\n const variableValue = variableAdapters.get(variable.type).getValueForUrl(variable);\n let stringUrlValue = ensureStringValues(urlValue);\n if (Array.isArray(variableValue) && !Array.isArray(stringUrlValue)) {\n stringUrlValue = [stringUrlValue];\n }\n // lodash isEqual handles array of value equality checks as well\n return !isEqual(variableValue, stringUrlValue);\n}\n\nconst getQueryWithVariables = (key: string, getState: () => StoreState): UrlQueryMap => {\n const queryParams = locationService.getSearchObject();\n\n const queryParamsNew = Object.keys(queryParams)\n .filter((key) => key.indexOf('var-') === -1)\n .reduce((obj, key) => {\n obj[key] = queryParams[key];\n return obj;\n }, {} as UrlQueryMap);\n\n for (const variable of getVariablesByKey(key, getState())) {\n if (variable.skipUrlSync) {\n continue;\n }\n\n const adapter = variableAdapters.get(variable.type);\n queryParamsNew['var-' + variable.name] = adapter.getValueForUrl(variable);\n }\n\n return queryParamsNew;\n};\n\nexport const initVariablesTransaction =\n (urlUid: string, dashboard: DashboardModel): ThunkResult<Promise<void>> =>\n async (dispatch, getState) => {\n try {\n const uid = toStateKey(urlUid);\n const state = getState();\n const lastKey = getIfExistsLastKey(state);\n if (lastKey) {\n const transactionState = getVariablesState(lastKey, state).transaction;\n if (transactionState.status === TransactionStatus.Fetching) {\n // previous dashboard is still fetching variables, cancel all requests\n dispatch(cancelVariables(lastKey));\n }\n }\n\n // Start init transaction\n dispatch(toKeyedAction(uid, variablesInitTransaction({ uid })));\n // Add system variables like __dashboard and __user\n dispatch(addSystemTemplateVariables(uid, dashboard));\n // Load all variables into redux store\n dispatch(initDashboardTemplating(uid, dashboard));\n // Migrate data source name to ref\n dispatch(migrateVariablesDatasourceNameToRef(uid));\n // Process all variable updates\n await dispatch(processVariables(uid));\n // Set transaction as complete\n dispatch(toKeyedAction(uid, variablesCompleteTransaction({ uid })));\n } catch (err) {\n dispatch(notifyApp(createVariableErrorNotification('Templating init failed', err)));\n console.error(err);\n }\n };\n\nexport function migrateVariablesDatasourceNameToRef(\n key: string,\n getDatasourceSrvFunc = getDatasourceSrv\n): ThunkResult<void> {\n return (dispatch, getState) => {\n const variables = getVariablesByKey(key, getState());\n for (const variable of variables) {\n if (!isAdHoc(variable) && !isQuery(variable)) {\n continue;\n }\n\n const { datasource: nameOrRef } = variable;\n\n if (isDataSourceRef(nameOrRef)) {\n continue;\n }\n\n // the call to getInstanceSettings needs to be done after initDashboardTemplating because we might have\n // datasource variables that need to be resolved\n const ds = getDatasourceSrvFunc().getInstanceSettings(nameOrRef);\n const dsRef = ds ? getDataSourceRef(ds) : { uid: nameOrRef };\n dispatch(\n toKeyedAction(\n key,\n changeVariableProp(toVariablePayload(variable, { propName: 'datasource', propValue: dsRef }))\n )\n );\n }\n };\n}\n\nexport const cleanUpVariables =\n (key: string): ThunkResult<void> =>\n (dispatch) => {\n dispatch(toKeyedAction(key, cleanVariables()));\n dispatch(toKeyedAction(key, cleanEditorState()));\n dispatch(toKeyedAction(key, cleanPickerState()));\n dispatch(toKeyedAction(key, variablesClearTransaction()));\n };\n\ntype CancelVariablesDependencies = { getBackendSrv: typeof getBackendSrv };\nexport const cancelVariables =\n (key: string, dependencies: CancelVariablesDependencies = { getBackendSrv: getBackendSrv }): ThunkResult<void> =>\n (dispatch) => {\n dependencies.getBackendSrv().cancelAllInFlightRequests();\n dispatch(cleanUpVariables(key));\n };\n\nexport const updateOptions =\n (identifier: KeyedVariableIdentifier, rethrow = false): ThunkResult<Promise<void>> =>\n async (dispatch, getState) => {\n const { rootStateKey } = identifier;\n try {\n if (!hasOngoingTransaction(rootStateKey, getState())) {\n // we might have cancelled a batch so then variable state is removed\n return;\n }\n\n const variableInState = getVariable(identifier, getState());\n dispatch(toKeyedAction(rootStateKey, variableStateFetching(toVariablePayload(variableInState))));\n await dispatch(upgradeLegacyQueries(toKeyedVariableIdentifier(variableInState)));\n await variableAdapters.get(variableInState.type).updateOptions(variableInState);\n dispatch(completeVariableLoading(identifier));\n } catch (error) {\n dispatch(toKeyedAction(rootStateKey, variableStateFailed(toVariablePayload(identifier, { error }))));\n\n if (!rethrow) {\n console.error(error);\n dispatch(notifyApp(createVariableErrorNotification('Error updating options:', error, identifier)));\n }\n\n if (rethrow) {\n throw error;\n }\n }\n };\n\nexport const createVariableErrorNotification = (\n message: string,\n error: any,\n identifier?: KeyedVariableIdentifier\n): AppNotification =>\n createErrorNotification(\n `${identifier ? `Templating [${identifier.id}]` : 'Templating'}`,\n `${message} ${error.message}`\n );\n\nexport const completeVariableLoading =\n (identifier: KeyedVariableIdentifier): ThunkResult<void> =>\n (dispatch, getState) => {\n const { rootStateKey } = identifier;\n if (!hasOngoingTransaction(rootStateKey, getState())) {\n // we might have cancelled a batch so then variable state is removed\n return;\n }\n\n const variableInState = getVariable(identifier, getState());\n\n if (variableInState.state !== LoadingState.Done) {\n dispatch(toKeyedAction(identifier.rootStateKey, variableStateCompleted(toVariablePayload(variableInState))));\n }\n };\n\nexport function upgradeLegacyQueries(\n identifier: KeyedVariableIdentifier,\n getDatasourceSrvFunc: typeof getDatasourceSrv = getDatasourceSrv\n): ThunkResult<void> {\n return async function (dispatch, getState) {\n const { id, rootStateKey } = identifier;\n if (!hasOngoingTransaction(rootStateKey, getState())) {\n // we might have cancelled a batch so then variable state is removed\n return;\n }\n\n const variable = getVariable<QueryVariableModel>(identifier, getState());\n\n if (!isQuery(variable)) {\n return;\n }\n\n try {\n const datasource = await getDatasourceSrvFunc().get(variable.datasource ?? '');\n\n if (hasLegacyVariableSupport(datasource)) {\n return;\n }\n\n if (!hasStandardVariableSupport(datasource)) {\n return;\n }\n\n if (isDataQueryType(variable.query)) {\n return;\n }\n\n const query = {\n refId: `${datasource.name}-${id}-Variable-Query`,\n query: variable.query,\n };\n\n dispatch(\n toKeyedAction(\n rootStateKey,\n changeVariableProp(toVariablePayload(identifier, { propName: 'query', propValue: query }))\n )\n );\n } catch (err) {\n dispatch(notifyApp(createVariableErrorNotification('Failed to upgrade legacy queries', err)));\n console.error(err);\n }\n };\n}\n\nfunction isDataQueryType(query: any): query is DataQuery {\n if (!query) {\n return false;\n }\n\n return query.hasOwnProperty('refId') && typeof query.refId === 'string';\n}\n","import { PayloadAction } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\n\nimport { toStateKey } from '../utils';\n\nimport { getTemplatingReducers, TemplatingState } from './reducers';\nimport { variablesInitTransaction } from './transactionReducer';\n\nexport interface KeyedVariablesState {\n lastKey?: string;\n keys: Record<string, TemplatingState>;\n}\n\nexport const initialKeyedVariablesState: KeyedVariablesState = { keys: {} };\n\nexport interface KeyedAction {\n key: string;\n action: PayloadAction<any>;\n}\n\nconst keyedAction = (payload: KeyedAction) => ({\n type: `templating/keyed/${payload.action.type.replace(/^templating\\//, '')}`,\n payload,\n});\n\nexport function toKeyedAction(key: string, action: PayloadAction<any>): PayloadAction<KeyedAction> {\n const keyAsString = toStateKey(key);\n return keyedAction({ key: keyAsString, action });\n}\n\nconst isKeyedAction = (action: AnyAction): action is PayloadAction<KeyedAction> => {\n return (\n typeof action.type === 'string' &&\n action.type.startsWith('templating/keyed') &&\n 'payload' in action &&\n typeof action.payload.key === 'string'\n );\n};\n\nexport function keyedVariablesReducer(state = initialKeyedVariablesState, outerAction: AnyAction): KeyedVariablesState {\n if (isKeyedAction(outerAction)) {\n const { key, action } = outerAction.payload;\n const stringKey = toStateKey(key);\n const lastKey = variablesInitTransaction.match(action) ? stringKey : state.lastKey;\n const templatingReducers = getTemplatingReducers();\n const prevKeyState = state.keys[stringKey];\n const nextKeyState = templatingReducers(prevKeyState, action);\n\n return {\n ...state,\n lastKey,\n keys: {\n ...state.keys,\n [stringKey]: nextKeyState,\n },\n };\n }\n\n return state;\n}\n\nexport default {\n templating: keyedVariablesReducer,\n};\n","import { CombinedState, combineReducers, Reducer } from 'redux';\n\nimport { initialVariableEditorState, variableEditorReducer, VariableEditorState } from '../editor/reducer';\nimport { initialVariableInspectState, variableInspectReducer, VariableInspectState } from '../inspect/reducer';\nimport { initialOptionPickerState, optionsPickerReducer, OptionsPickerState } from '../pickers/OptionsPicker/reducer';\n\nimport { initialTransactionState, transactionReducer, TransactionState } from './transactionReducer';\nimport { initialVariablesState, VariablesState } from './types';\nimport { variablesReducer } from './variablesReducer';\n\nexport interface TemplatingState {\n editor: VariableEditorState;\n variables: VariablesState;\n optionsPicker: OptionsPickerState;\n transaction: TransactionState;\n inspect: VariableInspectState;\n}\n\nlet templatingReducers: Reducer<CombinedState<TemplatingState>>;\n\nexport function getTemplatingReducers() {\n if (!templatingReducers) {\n templatingReducers = combineReducers({\n editor: variableEditorReducer,\n variables: variablesReducer,\n optionsPicker: optionsPickerReducer,\n transaction: transactionReducer,\n inspect: variableInspectReducer,\n });\n }\n\n return templatingReducers;\n}\n\nexport function getInitialTemplatingState() {\n return {\n editor: initialVariableEditorState,\n variables: initialVariablesState,\n optionsPicker: initialOptionPickerState,\n transaction: initialTransactionState,\n inspect: initialVariableInspectState,\n };\n}\n","import memoizeOne from 'memoize-one';\n\nimport { getState } from '../../../store/store';\nimport { StoreState } from '../../../types';\nimport { VariableModel } from '../types';\nimport { toStateKey } from '../utils';\n\nimport { getInitialTemplatingState, TemplatingState } from './reducers';\nimport { KeyedVariableIdentifier, VariablesState } from './types';\n\nexport const getVariable = <T extends VariableModel = VariableModel>(\n identifier: KeyedVariableIdentifier,\n state: StoreState = getState(),\n throwWhenMissing = true\n): T => {\n const { id, rootStateKey } = identifier;\n const variablesState = getVariablesState(rootStateKey, state);\n if (!variablesState.variables[id]) {\n if (throwWhenMissing) {\n throw new Error(`Couldn't find variable with id:${id}`);\n }\n return undefined as unknown as T;\n }\n\n return variablesState.variables[id] as T;\n};\n\nfunction getFilteredVariablesByKey(\n filter: (model: VariableModel) => boolean,\n key: string,\n state: StoreState = getState()\n) {\n return Object.values(getVariablesState(key, state).variables)\n .filter(filter)\n .sort((s1, s2) => s1.index - s2.index);\n}\n\nexport function getVariablesState(key: string, state: StoreState = getState()): TemplatingState {\n return state.templating.keys[toStateKey(key)] ?? getInitialTemplatingState();\n}\n\nexport function getVariablesByKey(key: string, state: StoreState = getState()): VariableModel[] {\n return getFilteredVariablesByKey(defaultVariablesFilter, key, state);\n}\n\nfunction defaultVariablesFilter(variable: VariableModel): boolean {\n return variable.type !== 'system';\n}\n\nexport const getSubMenuVariables = memoizeOne(\n (key: string, variables: Record<string, VariableModel>): VariableModel[] => {\n return getVariablesByKey(key, getState());\n }\n);\n\nexport const getEditorVariables = (key: string, state: StoreState): VariableModel[] => {\n return getVariablesByKey(key, state);\n};\n\nexport type GetVariables = typeof getVariablesByKey;\n\nexport function getNewVariableIndex(key: string, state: StoreState = getState()): number {\n return getNextVariableIndex(Object.values(getVariablesState(key, state).variables));\n}\n\nexport function getNextVariableIndex(variables: VariableModel[]): number {\n const sorted = variables.filter(defaultVariablesFilter).sort((v1, v2) => v1.index - v2.index);\n return sorted.length > 0 ? sorted[sorted.length - 1].index + 1 : 0;\n}\n\nexport function getVariablesIsDirty(key: string, state: StoreState = getState()): boolean {\n return getVariablesState(key, state).transaction.isDirty;\n}\n\nexport function getIfExistsLastKey(state: StoreState = getState()): string | undefined {\n return state.templating?.lastKey;\n}\n\nexport function getLastKey(state: StoreState = getState()): string {\n if (!state.templating?.lastKey) {\n throw new Error('Accessing lastKey without initializing it variables');\n }\n\n return state.templating.lastKey;\n}\n\n// selectors used by template srv, assumes that lastKey is in state. Needs to change when/if dashboard redux state becomes keyed too.\nexport function getFilteredVariables(filter: (model: VariableModel) => boolean, state: StoreState = getState()) {\n const lastKey = getIfExistsLastKey(state);\n if (!lastKey) {\n return [];\n }\n return getFilteredVariablesByKey(filter, lastKey, state);\n}\n\nexport function getVariables(state: StoreState = getState()) {\n const lastKey = getIfExistsLastKey(state);\n if (!lastKey) {\n return [];\n }\n return getVariablesByKey(lastKey, state);\n}\n\nexport function getVariableWithName(name: string, state: StoreState = getState()) {\n const lastKey = getIfExistsLastKey(state);\n if (!lastKey) {\n return;\n }\n return getVariable({ id: name, rootStateKey: lastKey, type: 'query' }, state, false);\n}\n\nexport function getInstanceState<Model extends VariableModel = VariableModel>(state: VariablesState, id: string) {\n return state[id] as Model;\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { cloneDeep, defaults as lodashDefaults } from 'lodash';\n\nimport { LoadingState, VariableType } from '@grafana/data';\n\nimport { variableAdapters } from '../adapters';\nimport { changeVariableNameSucceeded } from '../editor/reducer';\nimport { VariableModel, VariableOption, VariableWithOptions } from '../types';\nimport { ensureStringValues } from '../utils';\n\nimport { getInstanceState, getNextVariableIndex } from './selectors';\nimport { AddVariable, initialVariablesState, VariablePayload, VariablesState } from './types';\n\nconst sharedReducerSlice = createSlice({\n name: 'templating/shared',\n initialState: initialVariablesState,\n reducers: {\n addVariable: (state: VariablesState, action: PayloadAction<VariablePayload<AddVariable>>) => {\n const id = action.payload.id ?? action.payload.data.model.name; // for testing purposes we can call this with an id\n const adapter = variableAdapters.get(action.payload.type);\n const initialState = cloneDeep(adapter.initialState);\n const model = adapter.beforeAdding\n ? adapter.beforeAdding(action.payload.data.model)\n : cloneDeep(action.payload.data.model);\n\n const variable = {\n ...lodashDefaults({}, model, initialState),\n id: id,\n index: action.payload.data.index,\n global: action.payload.data.global,\n };\n\n state[id] = variable;\n },\n variableStateNotStarted: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n const instanceState = getInstanceState(state, action.payload.id);\n instanceState.state = LoadingState.NotStarted;\n instanceState.error = null;\n },\n variableStateFetching: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n const instanceState = getInstanceState(state, action.payload.id);\n instanceState.state = LoadingState.Loading;\n instanceState.error = null;\n },\n variableStateCompleted: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n const instanceState = getInstanceState(state, action.payload.id);\n if (!instanceState) {\n // we might have cancelled a batch so then this state has been removed\n return;\n }\n instanceState.state = LoadingState.Done;\n instanceState.error = null;\n },\n variableStateFailed: (state: VariablesState, action: PayloadAction<VariablePayload<{ error: any }>>) => {\n const instanceState = getInstanceState(state, action.payload.id);\n if (!instanceState) {\n // we might have cancelled a batch so then this state has been removed\n return;\n }\n instanceState.state = LoadingState.Error;\n instanceState.error = action.payload.data.error;\n },\n removeVariable: (state: VariablesState, action: PayloadAction<VariablePayload<{ reIndex: boolean }>>) => {\n delete state[action.payload.id];\n if (!action.payload.data.reIndex) {\n return;\n }\n\n const variableStates = Object.values(state);\n for (let index = 0; index < variableStates.length; index++) {\n variableStates[index].index = index;\n }\n },\n duplicateVariable: (state: VariablesState, action: PayloadAction<VariablePayload<{ newId: string }>>) => {\n const original = cloneDeep<VariableModel>(state[action.payload.id]);\n const name = `copy_of_${original.name}`;\n const newId = action.payload.data?.newId ?? name;\n const index = getNextVariableIndex(Object.values(state));\n state[newId] = {\n ...cloneDeep(variableAdapters.get(action.payload.type).initialState),\n ...original,\n id: newId,\n name,\n index,\n };\n },\n changeVariableOrder: (\n state: VariablesState,\n action: PayloadAction<VariablePayload<{ fromIndex: number; toIndex: number }>>\n ) => {\n const { toIndex, fromIndex } = action.payload.data;\n const variableStates = Object.values(state);\n for (let index = 0; index < variableStates.length; index++) {\n const variable = variableStates[index];\n if (variable.index === fromIndex) {\n variable.index = toIndex;\n } else if (variable.index > fromIndex && variable.index <= toIndex) {\n variable.index--;\n } else if (variable.index < fromIndex && variable.index >= toIndex) {\n variable.index++;\n }\n }\n },\n changeVariableType: (state: VariablesState, action: PayloadAction<VariablePayload<{ newType: VariableType }>>) => {\n const { id } = action.payload;\n const { label, name, index, description, rootStateKey } = state[id];\n\n state[id] = {\n ...cloneDeep(variableAdapters.get(action.payload.data.newType).initialState),\n id,\n rootStateKey: rootStateKey,\n label,\n name,\n index,\n description,\n };\n },\n setCurrentVariableValue: (\n state: VariablesState,\n action: PayloadAction<VariablePayload<{ option: VariableOption | undefined }>>\n ) => {\n if (!action.payload.data.option) {\n return;\n }\n\n const instanceState = getInstanceState<VariableWithOptions>(state, action.payload.id);\n const { option } = action.payload.data;\n const current = { ...option, text: ensureStringValues(option?.text), value: ensureStringValues(option?.value) };\n\n instanceState.current = current;\n instanceState.options = instanceState.options.map((option) => {\n option.value = ensureStringValues(option.value);\n option.text = ensureStringValues(option.text);\n let selected = false;\n if (Array.isArray(current.value)) {\n for (let index = 0; index < current.value.length; index++) {\n const value = current.value[index];\n if (option.value === value) {\n selected = true;\n break;\n }\n }\n } else if (option.value === current.value) {\n selected = true;\n }\n option.selected = selected;\n return option;\n });\n },\n changeVariableProp: (\n state: VariablesState,\n action: PayloadAction<VariablePayload<{ propName: string; propValue: any }>>\n ) => {\n const instanceState = getInstanceState(state, action.payload.id);\n (instanceState as Record<string, any>)[action.payload.data.propName] = action.payload.data.propValue;\n },\n },\n extraReducers: (builder) =>\n builder.addCase(changeVariableNameSucceeded, (state, action) => {\n const instanceState = getInstanceState(state, action.payload.id);\n instanceState.name = action.payload.data.newName;\n }),\n});\n\nexport const sharedReducer = sharedReducerSlice.reducer;\n\nexport const {\n removeVariable,\n addVariable,\n changeVariableProp,\n changeVariableOrder,\n duplicateVariable,\n setCurrentVariableValue,\n changeVariableType,\n variableStateNotStarted,\n variableStateFetching,\n variableStateCompleted,\n variableStateFailed,\n} = sharedReducerSlice.actions;\n","import { AnyAction, createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { TransactionStatus } from '../types';\n\nimport {\n addVariable,\n changeVariableOrder,\n changeVariableProp,\n changeVariableType,\n duplicateVariable,\n removeVariable,\n} from './sharedReducer';\n\nexport interface TransactionState {\n uid: string | undefined | null;\n status: TransactionStatus;\n isDirty: boolean;\n}\n\nexport const initialTransactionState: TransactionState = {\n uid: null,\n status: TransactionStatus.NotStarted,\n isDirty: false,\n};\n\nconst transactionSlice = createSlice({\n name: 'templating/transaction',\n initialState: initialTransactionState,\n reducers: {\n variablesInitTransaction: (state, action: PayloadAction<{ uid: string | undefined | null }>) => {\n state.uid = action.payload.uid;\n state.status = TransactionStatus.Fetching;\n },\n variablesCompleteTransaction: (state, action: PayloadAction<{ uid: string | undefined | null }>) => {\n if (state.uid !== action.payload.uid) {\n // this might be an action from a cancelled batch\n return;\n }\n\n state.status = TransactionStatus.Completed;\n },\n variablesClearTransaction: (state, action: PayloadAction<undefined>) => {\n state.uid = null;\n state.status = TransactionStatus.NotStarted;\n state.isDirty = false;\n },\n },\n extraReducers: (builder) =>\n builder.addMatcher(actionAffectsDirtyState, (state, action) => {\n if (state.status === TransactionStatus.Completed) {\n state.isDirty = true;\n }\n }),\n});\n\nfunction actionAffectsDirtyState(action: AnyAction): boolean {\n return (\n removeVariable.match(action) ||\n addVariable.match(action) ||\n changeVariableProp.match(action) ||\n changeVariableOrder.match(action) ||\n duplicateVariable.match(action) ||\n changeVariableType.match(action)\n );\n}\n\nexport const { variablesInitTransaction, variablesClearTransaction, variablesCompleteTransaction } =\n transactionSlice.actions;\n\nexport const transactionReducer = transactionSlice.reducer;\n","import { VariableType } from '@grafana/data';\n\nimport { VariableModel } from '../types';\n\nexport interface VariablesState extends Record<string, VariableModel> {}\n\nexport const initialVariablesState: VariablesState = {};\n\nexport interface VariableIdentifier {\n type: VariableType;\n id: string;\n}\n\nexport interface KeyedVariableIdentifier {\n type: VariableType;\n id: string;\n rootStateKey: string;\n}\n\nexport interface VariablePayload<T extends any = undefined> extends VariableIdentifier {\n data: T;\n}\n\nexport interface AddVariable<T extends VariableModel = VariableModel> {\n global: boolean; // part of dashboard or global\n index: number; // the order in variables list\n model: T;\n}\n","import { createAction } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\n\nimport { variableAdapters } from '../adapters';\nimport { VariableModel } from '../types';\n\nimport { sharedReducer } from './sharedReducer';\nimport { initialVariablesState, VariablesState } from './types';\n\nexport const cleanVariables = createAction<undefined>('templating/cleanVariables');\n\nexport const variablesReducer = (state: VariablesState = initialVariablesState, action: AnyAction): VariablesState => {\n if (cleanVariables.match(action)) {\n const globalVariables = Object.values(state).filter((v) => v.global);\n if (!globalVariables) {\n return initialVariablesState;\n }\n\n const variables = globalVariables.reduce((allVariables, state) => {\n allVariables[state.id] = state;\n return allVariables;\n }, {} as Record<string, VariableModel>);\n\n return variables;\n }\n\n if (action?.payload?.type && variableAdapters.getIfExists(action?.payload?.type)) {\n // Now that we know we are dealing with a payload that is addressed for an adapted variable let's reduce state:\n // Firstly call the sharedTemplatingReducer that handles all shared actions between variable types\n // Secondly call the specific variable type's reducer\n return variableAdapters.get(action.payload.type).reducer(sharedReducer(state, action), action);\n }\n\n return state;\n};\n","import { ComponentType } from 'react';\n\nimport {\n BusEventWithPayload,\n DataQuery,\n DataSourceJsonData,\n DataSourceRef,\n LoadingState,\n QueryEditorProps,\n VariableModel as BaseVariableModel,\n VariableType,\n} from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\n\nimport { NEW_VARIABLE_ID } from './constants';\n\nexport enum TransactionStatus {\n NotStarted = 'Not started',\n Fetching = 'Fetching',\n Completed = 'Completed',\n}\n\nexport enum VariableRefresh {\n never, // removed from the UI\n onDashboardLoad,\n onTimeRangeChanged,\n}\n\nexport enum VariableHide {\n dontHide,\n hideLabel,\n hideVariable,\n}\n\nexport enum VariableSort {\n disabled,\n alphabeticalAsc,\n alphabeticalDesc,\n numericalAsc,\n numericalDesc,\n alphabeticalCaseInsensitiveAsc,\n alphabeticalCaseInsensitiveDesc,\n}\n\nexport interface VariableOption {\n selected: boolean;\n text: string | string[];\n value: string | string[];\n isNone?: boolean;\n}\n\nexport interface AdHocVariableFilter {\n key: string;\n operator: string;\n value: string;\n condition: string;\n}\n\nexport interface AdHocVariableModel extends VariableModel {\n datasource: DataSourceRef | null;\n filters: AdHocVariableFilter[];\n}\n\nexport interface IntervalVariableModel extends VariableWithOptions {\n auto: boolean;\n auto_min: string;\n auto_count: number;\n refresh: VariableRefresh;\n}\n\nexport interface CustomVariableModel extends VariableWithMultiSupport {}\n\nexport interface DataSourceVariableModel extends VariableWithMultiSupport {\n regex: string;\n refresh: VariableRefresh;\n}\n\nexport interface QueryVariableModel extends DataSourceVariableModel {\n datasource: DataSourceRef | null;\n definition: string;\n sort: VariableSort;\n queryValue?: string;\n query: any;\n}\n\nexport interface TextBoxVariableModel extends VariableWithOptions {\n originalQuery: string | null;\n}\n\nexport interface ConstantVariableModel extends VariableWithOptions {}\n\nexport interface VariableWithMultiSupport extends VariableWithOptions {\n multi: boolean;\n includeAll: boolean;\n allValue?: string | null;\n}\n\nexport interface VariableWithOptions extends VariableModel {\n current: VariableOption;\n options: VariableOption[];\n query: string;\n}\n\nexport interface DashboardProps {\n name: string;\n uid: string;\n toString: () => string;\n}\n\nexport interface DashboardVariableModel extends SystemVariable<DashboardProps> {}\n\nexport interface OrgProps {\n name: string;\n id: number;\n toString: () => string;\n}\n\nexport interface OrgVariableModel extends SystemVariable<OrgProps> {}\n\nexport interface UserProps {\n login: string;\n id: number;\n email?: string;\n toString: () => string;\n}\n\nexport interface UserVariableModel extends SystemVariable<UserProps> {}\n\nexport interface SystemVariable<TProps extends { toString: () => string }> extends VariableModel {\n current: { value: TProps };\n}\n\nexport interface VariableModel extends BaseVariableModel {\n id: string;\n rootStateKey: string | null;\n global: boolean;\n hide: VariableHide;\n skipUrlSync: boolean;\n index: number;\n state: LoadingState;\n error: any | null;\n description: string | null;\n}\n\nexport const initialVariableModelState: VariableModel = {\n id: NEW_VARIABLE_ID,\n rootStateKey: null,\n name: '',\n type: '' as unknown as VariableType,\n global: false,\n index: -1,\n hide: VariableHide.dontHide,\n skipUrlSync: false,\n state: LoadingState.NotStarted,\n error: null,\n description: null,\n};\n\nexport interface VariableQueryEditorProps {\n query: any;\n onChange: (query: any, definition: string) => void;\n datasource: any;\n templateSrv: TemplateSrv;\n}\n\nexport type VariableQueryEditorType<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n> = ComponentType<VariableQueryEditorProps> | ComponentType<QueryEditorProps<any, TQuery, TOptions, any>> | null;\n\nexport interface VariablesChangedEvent {\n refreshAll: boolean;\n panelIds: number[];\n}\n\nexport class VariablesChanged extends BusEventWithPayload<VariablesChangedEvent> {\n static type = 'variables-changed';\n}\n\nexport interface VariablesTimeRangeProcessDoneEvent {\n variableIds: string[];\n}\n\nexport class VariablesTimeRangeProcessDone extends BusEventWithPayload<VariablesTimeRangeProcessDoneEvent> {\n static type = 'variables-time-range-process-done';\n}\n\nexport class VariablesChangedInUrl extends BusEventWithPayload<VariablesChangedEvent> {\n static type = 'variables-changed-in-url';\n}\n","import { isArray, isEqual } from 'lodash';\n\nimport { ScopedVars, UrlQueryMap, UrlQueryValue, VariableType } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { safeStringifyValue } from 'app/core/utils/explore';\n\nimport { getState } from '../../store/store';\nimport { StoreState } from '../../types';\nimport { getTimeSrv } from '../dashboard/services/TimeSrv';\n\nimport { variableAdapters } from './adapters';\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from './constants';\nimport { getVariablesState } from './state/selectors';\nimport { KeyedVariableIdentifier, VariableIdentifier, VariablePayload } from './state/types';\nimport { QueryVariableModel, TransactionStatus, VariableModel, VariableRefresh, VariableWithOptions } from './types';\n\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * \\$(\\w+) $var1\n * \\[\\[(\\w+?)(?::(\\w+))?\\]\\] [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?::(\\w+))?} ${var3} or ${var3:fmt3}\n */\nexport const variableRegex = /\\$(\\w+)|\\[\\[(\\w+?)(?::(\\w+))?\\]\\]|\\${(\\w+)(?:\\.([^:^\\}]+))?(?::([^\\}]+))?}/g;\n\n// Helper function since lastIndex is not reset\nexport const variableRegexExec = (variableString: string) => {\n variableRegex.lastIndex = 0;\n return variableRegex.exec(variableString);\n};\n\nexport const SEARCH_FILTER_VARIABLE = '__searchFilter';\n\nexport const containsSearchFilter = (query: string | unknown): boolean =>\n query && typeof query === 'string' ? query.indexOf(SEARCH_FILTER_VARIABLE) !== -1 : false;\n\nexport const getSearchFilterScopedVar = (args: {\n query: string;\n wildcardChar: string;\n options: { searchFilter?: string };\n}): ScopedVars => {\n const { query, wildcardChar } = args;\n if (!containsSearchFilter(query)) {\n return {};\n }\n\n let { options } = args;\n\n options = options || { searchFilter: '' };\n const value = options.searchFilter ? `${options.searchFilter}${wildcardChar}` : `${wildcardChar}`;\n\n return {\n __searchFilter: {\n value,\n text: '',\n },\n };\n};\n\nexport function containsVariable(...args: any[]) {\n const variableName = args[args.length - 1];\n args[0] = typeof args[0] === 'string' ? args[0] : safeStringifyValue(args[0]);\n const variableString = args.slice(0, -1).join(' ');\n const matches = variableString.match(variableRegex);\n const isMatchingVariable =\n matches !== null\n ? matches.find((match) => {\n const varMatch = variableRegexExec(match);\n return varMatch !== null && varMatch.indexOf(variableName) > -1;\n })\n : false;\n\n return !!isMatchingVariable;\n}\n\nexport const isAllVariable = (variable: any): boolean => {\n if (!variable) {\n return false;\n }\n\n if (!variable.current) {\n return false;\n }\n\n if (variable.current.value) {\n const isArray = Array.isArray(variable.current.value);\n if (isArray && variable.current.value.length && variable.current.value[0] === ALL_VARIABLE_VALUE) {\n return true;\n }\n\n if (!isArray && variable.current.value === ALL_VARIABLE_VALUE) {\n return true;\n }\n }\n\n if (variable.current.text) {\n const isArray = Array.isArray(variable.current.text);\n if (isArray && variable.current.text.length && variable.current.text[0] === ALL_VARIABLE_TEXT) {\n return true;\n }\n\n if (!isArray && variable.current.text === ALL_VARIABLE_TEXT) {\n return true;\n }\n }\n\n return false;\n};\n\nexport const getCurrentText = (variable: any): string => {\n if (!variable) {\n return '';\n }\n\n if (!variable.current) {\n return '';\n }\n\n if (!variable.current.text) {\n return '';\n }\n\n if (Array.isArray(variable.current.text)) {\n return variable.current.text.toString();\n }\n\n if (typeof variable.current.text !== 'string') {\n return '';\n }\n\n return variable.current.text;\n};\n\nexport const getCurrentValue = (variable: VariableWithOptions): string | null => {\n if (!variable || !variable.current || variable.current.value === undefined || variable.current.value === null) {\n return null;\n }\n\n if (Array.isArray(variable.current.value)) {\n return variable.current.value.toString();\n }\n\n if (typeof variable.current.value !== 'string') {\n return null;\n }\n\n return variable.current.value;\n};\n\nexport function getTemplatedRegex(variable: QueryVariableModel, templateSrv = getTemplateSrv()): string {\n if (!variable) {\n return '';\n }\n\n if (!variable.regex) {\n return '';\n }\n\n return templateSrv.replace(variable.regex, {}, 'regex');\n}\n\nexport function getLegacyQueryOptions(variable: QueryVariableModel, searchFilter?: string, timeSrv = getTimeSrv()) {\n const queryOptions: any = { range: undefined, variable, searchFilter };\n if (variable.refresh === VariableRefresh.onTimeRangeChanged || variable.refresh === VariableRefresh.onDashboardLoad) {\n queryOptions.range = timeSrv.timeRange();\n }\n\n return queryOptions;\n}\n\nexport function getVariableRefresh(variable: VariableModel): VariableRefresh {\n if (!variable || !variable.hasOwnProperty('refresh')) {\n return VariableRefresh.never;\n }\n\n const queryVariable = variable as QueryVariableModel;\n\n if (\n queryVariable.refresh !== VariableRefresh.onTimeRangeChanged &&\n queryVariable.refresh !== VariableRefresh.onDashboardLoad &&\n queryVariable.refresh !== VariableRefresh.never\n ) {\n return VariableRefresh.never;\n }\n\n return queryVariable.refresh;\n}\n\nexport function getVariableTypes(): Array<{ label: string; value: VariableType }> {\n return variableAdapters\n .list()\n .filter((v) => v.id !== 'system')\n .map(({ id, name }) => ({\n label: name,\n value: id,\n }));\n}\n\nfunction getUrlValueForComparison(value: any): any {\n if (isArray(value)) {\n if (value.length === 0) {\n value = undefined;\n } else if (value.length === 1) {\n value = value[0];\n }\n }\n\n return value;\n}\n\nexport interface UrlQueryType {\n value: UrlQueryValue;\n removed?: boolean;\n}\n\nexport interface ExtendedUrlQueryMap extends Record<string, UrlQueryType> {}\n\nexport function findTemplateVarChanges(query: UrlQueryMap, old: UrlQueryMap): ExtendedUrlQueryMap | undefined {\n let count = 0;\n const changes: ExtendedUrlQueryMap = {};\n\n for (const key in query) {\n if (!key.startsWith('var-')) {\n continue;\n }\n\n let oldValue = getUrlValueForComparison(old[key]);\n let newValue = getUrlValueForComparison(query[key]);\n\n if (!isEqual(newValue, oldValue)) {\n changes[key] = { value: query[key] };\n count++;\n }\n }\n\n for (const key in old) {\n if (!key.startsWith('var-')) {\n continue;\n }\n\n const value = old[key];\n\n // ignore empty array values\n if (isArray(value) && value.length === 0) {\n continue;\n }\n\n if (!query.hasOwnProperty(key)) {\n changes[key] = { value: '', removed: true }; // removed\n count++;\n }\n }\n return count ? changes : undefined;\n}\n\nexport function ensureStringValues(value: any | any[]): string | string[] {\n if (Array.isArray(value)) {\n return value.map(String);\n }\n\n if (value === null || value === undefined) {\n return '';\n }\n\n if (typeof value === 'number') {\n return value.toString(10);\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (typeof value === 'boolean') {\n return value.toString();\n }\n\n return '';\n}\n\nexport function hasOngoingTransaction(key: string, state: StoreState = getState()): boolean {\n return getVariablesState(key, state).transaction.status !== TransactionStatus.NotStarted;\n}\n\nexport function toStateKey(key: string | null | undefined): string {\n return String(key);\n}\n\nexport const toKeyedVariableIdentifier = (variable: VariableModel): KeyedVariableIdentifier => {\n if (!variable.rootStateKey) {\n throw new Error(`rootStateKey not found for variable with id:${variable.id}`);\n }\n\n return { type: variable.type, id: variable.id, rootStateKey: variable.rootStateKey };\n};\n\nexport function toVariablePayload<T extends any = undefined>(\n identifier: VariableIdentifier,\n data?: T\n): VariablePayload<T>;\n// eslint-disable-next-line\nexport function toVariablePayload<T extends any = undefined>(model: VariableModel, data?: T): VariablePayload<T>;\n// eslint-disable-next-line\nexport function toVariablePayload<T extends any = undefined>(\n obj: VariableIdentifier | VariableModel,\n data?: T\n): VariablePayload<T> {\n return { type: obj.type, id: obj.id, data: data as T };\n}\n","import { isString, isUndefined } from 'lodash';\n\nimport { Field, FieldType } from '@grafana/data';\n\nexport function convertToType(value: any, field: Field): any {\n switch (field.type) {\n case FieldType.boolean:\n if (isUndefined(value)) {\n return false;\n }\n return convertToBool(value);\n\n case FieldType.number:\n if (isNaN(value)) {\n return 0;\n }\n return parseFloat(value);\n\n case FieldType.string:\n if (!value) {\n return '';\n }\n return String(value);\n\n default:\n return value;\n }\n}\n\nconst convertToBool = (value: any): boolean => {\n if (isString(value)) {\n return !(value[0] === 'F' || value[0] === 'f' || value[0] === '0');\n }\n return !!value;\n};\n","import React, { useCallback, useState } from 'react';\n\nimport { ValueMatcherID, BasicValueMatcherOptions } from '@grafana/data';\nimport { Input } from '@grafana/ui';\n\nimport { ValueMatcherEditorConfig, ValueMatcherUIProps, ValueMatcherUIRegistryItem } from './types';\nimport { convertToType } from './utils';\n\nexport function basicMatcherEditor<T = any>(\n config: ValueMatcherEditorConfig\n): React.FC<ValueMatcherUIProps<BasicValueMatcherOptions<T>>> {\n return function Render({ options, onChange, field }) {\n const { validator, converter = convertToType } = config;\n const { value } = options;\n const [isInvalid, setInvalid] = useState(!validator(value));\n\n const onChangeValue = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n setInvalid(!validator(event.currentTarget.value));\n },\n [setInvalid, validator]\n );\n\n const onChangeOptions = useCallback(\n (event: React.FocusEvent<HTMLInputElement>) => {\n if (isInvalid) {\n return;\n }\n\n const { value } = event.currentTarget;\n\n onChange({\n ...options,\n value: converter(value, field),\n });\n },\n [options, onChange, isInvalid, field, converter]\n );\n\n return (\n <Input\n className=\"flex-grow-1\"\n invalid={isInvalid}\n defaultValue={String(options.value)}\n placeholder=\"Value\"\n onChange={onChangeValue}\n onBlur={onChangeOptions}\n />\n );\n };\n}\n\nexport const getBasicValueMatchersUI = (): Array<ValueMatcherUIRegistryItem<BasicValueMatcherOptions>> => {\n return [\n {\n name: 'Is greater',\n id: ValueMatcherID.greater,\n component: basicMatcherEditor<number>({\n validator: (value) => !isNaN(value),\n }),\n },\n {\n name: 'Is greater or equal',\n id: ValueMatcherID.greaterOrEqual,\n component: basicMatcherEditor<number>({\n validator: (value) => !isNaN(value),\n }),\n },\n {\n name: 'Is lower',\n id: ValueMatcherID.lower,\n component: basicMatcherEditor<number>({\n validator: (value) => !isNaN(value),\n }),\n },\n {\n name: 'Is lower or equal',\n id: ValueMatcherID.lowerOrEqual,\n component: basicMatcherEditor<number>({\n validator: (value) => !isNaN(value),\n }),\n },\n {\n name: 'Is equal',\n id: ValueMatcherID.equal,\n component: basicMatcherEditor<any>({\n validator: () => true,\n }),\n },\n {\n name: 'Is not equal',\n id: ValueMatcherID.notEqual,\n component: basicMatcherEditor<any>({\n validator: () => true,\n }),\n },\n {\n name: 'Regex',\n id: ValueMatcherID.regex,\n component: basicMatcherEditor<string>({\n validator: () => true,\n converter: (value: any) => String(value),\n }),\n },\n ];\n};\n","import React from 'react';\n\nimport { ValueMatcherID } from '@grafana/data';\n\nimport { ValueMatcherUIProps, ValueMatcherUIRegistryItem } from './types';\n\nexport const NoopMatcherEditor: React.FC<ValueMatcherUIProps<any>> = () => {\n return null;\n};\n\nexport const getNoopValueMatchersUI = (): Array<ValueMatcherUIRegistryItem<any>> => {\n return [\n {\n name: 'Is null',\n id: ValueMatcherID.isNull,\n component: NoopMatcherEditor,\n },\n {\n name: 'Is not null',\n id: ValueMatcherID.isNotNull,\n component: NoopMatcherEditor,\n },\n ];\n};\n","import React, { useCallback, useState } from 'react';\n\nimport { ValueMatcherID, RangeValueMatcherOptions } from '@grafana/data';\nimport { Input } from '@grafana/ui';\n\nimport { ValueMatcherEditorConfig, ValueMatcherUIProps, ValueMatcherUIRegistryItem } from './types';\nimport { convertToType } from './utils';\n\ntype PropNames = 'from' | 'to';\n\nexport function rangeMatcherEditor<T = any>(\n config: ValueMatcherEditorConfig\n): React.FC<ValueMatcherUIProps<RangeValueMatcherOptions<T>>> {\n return function RangeMatcherEditor({ options, onChange, field }) {\n const { validator } = config;\n const [isInvalid, setInvalid] = useState({\n from: !validator(options.from),\n to: !validator(options.to),\n });\n\n const onChangeValue = useCallback(\n (event: React.FormEvent<HTMLInputElement>, prop: PropNames) => {\n setInvalid({\n ...isInvalid,\n [prop]: !validator(event.currentTarget.value),\n });\n },\n [setInvalid, validator, isInvalid]\n );\n\n const onChangeOptions = useCallback(\n (event: React.FocusEvent<HTMLInputElement>, prop: PropNames) => {\n if (isInvalid[prop]) {\n return;\n }\n\n const { value } = event.currentTarget;\n\n onChange({\n ...options,\n [prop]: convertToType(value, field),\n });\n },\n [options, onChange, isInvalid, field]\n );\n\n return (\n <>\n <Input\n className=\"flex-grow-1 gf-form-spacing\"\n invalid={isInvalid['from']}\n defaultValue={String(options.from)}\n placeholder=\"From\"\n onChange={(event) => onChangeValue(event, 'from')}\n onBlur={(event) => onChangeOptions(event, 'from')}\n />\n <div className=\"gf-form-label\">and</div>\n <Input\n className=\"flex-grow-1\"\n invalid={isInvalid['to']}\n defaultValue={String(options.to)}\n placeholder=\"To\"\n onChange={(event) => onChangeValue(event, 'to')}\n onBlur={(event) => onChangeOptions(event, 'to')}\n />\n </>\n );\n };\n}\n\nexport const getRangeValueMatchersUI = (): Array<ValueMatcherUIRegistryItem<RangeValueMatcherOptions>> => {\n return [\n {\n name: 'Is between',\n id: ValueMatcherID.between,\n component: rangeMatcherEditor<number>({\n validator: (value) => {\n return !isNaN(value);\n },\n }),\n },\n ];\n};\n","import { Registry } from '@grafana/data';\n\nimport { getBasicValueMatchersUI } from './BasicMatcherEditor';\nimport { getNoopValueMatchersUI } from './NoopMatcherEditor';\nimport { getRangeValueMatchersUI } from './RangeMatcherEditor';\nimport { ValueMatcherUIRegistryItem } from './types';\n\nexport const valueMatchersUI = new Registry<ValueMatcherUIRegistryItem<any>>(() => {\n return [...getBasicValueMatchersUI(), ...getNoopValueMatchersUI(), ...getRangeValueMatchersUI()];\n});\n","import React, { useCallback } from 'react';\n\nimport { Field, SelectableValue, valueMatchers } from '@grafana/data';\nimport { FilterByValueFilter } from '@grafana/data/src/transformations/transformers/filterByValue';\nimport { Button, Select } from '@grafana/ui';\n\nimport { valueMatchersUI } from './ValueMatchers/valueMatchersUI';\n\ninterface Props {\n onDelete: () => void;\n onChange: (filter: FilterByValueFilter) => void;\n filter: FilterByValueFilter;\n fieldsInfo: DataFrameFieldsInfo;\n}\n\nexport interface DataFrameFieldsInfo {\n fieldsAsOptions: Array<SelectableValue<string>>;\n fieldByDisplayName: Record<string, Field>;\n}\n\nexport const FilterByValueFilterEditor: React.FC<Props> = (props) => {\n const { onDelete, onChange, filter, fieldsInfo } = props;\n const { fieldsAsOptions, fieldByDisplayName } = fieldsInfo;\n const fieldName = getFieldName(filter, fieldsAsOptions) ?? '';\n const field = fieldByDisplayName[fieldName];\n const matcherOptions = field ? getMatcherOptions(field) : [];\n const matcherId = getSelectedMatcherId(filter, matcherOptions);\n const editor = valueMatchersUI.getIfExists(matcherId);\n\n const onChangeField = useCallback(\n (selectable?: SelectableValue<string>) => {\n if (!selectable?.value) {\n return;\n }\n onChange({\n ...filter,\n fieldName: selectable.value,\n });\n },\n [onChange, filter]\n );\n\n const onChangeMatcher = useCallback(\n (selectable?: SelectableValue<string>) => {\n if (!selectable?.value) {\n return;\n }\n\n const id = selectable.value;\n const options = valueMatchers.get(id).getDefaultOptions(field);\n\n onChange({\n ...filter,\n config: { id, options },\n });\n },\n [onChange, filter, field]\n );\n\n const onChangeMatcherOptions = useCallback(\n (options) => {\n onChange({\n ...filter,\n config: {\n ...filter.config,\n options,\n },\n });\n },\n [onChange, filter]\n );\n\n if (!field || !editor || !editor.component) {\n return null;\n }\n\n return (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form-spacing\">\n <div className=\"gf-form-label width-7\">Field</div>\n <Select\n className=\"min-width-15 max-width-24\"\n placeholder=\"Field Name\"\n options={fieldsAsOptions}\n value={filter.fieldName}\n onChange={onChangeField}\n />\n </div>\n <div className=\"gf-form gf-form-spacing\">\n <div className=\"gf-form-label\">Match</div>\n <Select\n className=\"width-12\"\n placeholder=\"Select test\"\n options={matcherOptions}\n value={matcherId}\n onChange={onChangeMatcher}\n />\n </div>\n <div className=\"gf-form gf-form--grow gf-form-spacing\">\n <div className=\"gf-form-label\">Value</div>\n <editor.component field={field} options={filter.config.options ?? {}} onChange={onChangeMatcherOptions} />\n </div>\n <div className=\"gf-form\">\n <Button icon=\"times\" onClick={onDelete} variant=\"secondary\" />\n </div>\n </div>\n );\n};\n\nconst getMatcherOptions = (field: Field): Array<SelectableValue<string>> => {\n const options = [];\n\n for (const matcher of valueMatchers.list()) {\n if (!matcher.isApplicable(field)) {\n continue;\n }\n\n const editor = valueMatchersUI.getIfExists(matcher.id);\n\n if (!editor) {\n continue;\n }\n\n options.push({\n value: matcher.id,\n label: matcher.name,\n description: matcher.description,\n });\n }\n\n return options;\n};\n\nconst getSelectedMatcherId = (\n filter: FilterByValueFilter,\n matcherOptions: Array<SelectableValue<string>>\n): string | undefined => {\n const matcher = matcherOptions.find((m) => m.value === filter.config.id);\n\n if (matcher && matcher.value) {\n return matcher.value;\n }\n\n if (matcherOptions[0]?.value) {\n return matcherOptions[0]?.value;\n }\n\n return;\n};\n\nconst getFieldName = (\n filter: FilterByValueFilter,\n fieldOptions: Array<SelectableValue<string>>\n): string | undefined => {\n const fieldName = fieldOptions.find((m) => m.value === filter.fieldName);\n\n if (fieldName && fieldName.value) {\n return fieldName.value;\n }\n\n if (fieldOptions[0]?.value) {\n return fieldOptions[0]?.value;\n }\n\n return;\n};\n","import { css } from '@emotion/css';\nimport { cloneDeep } from 'lodash';\nimport React, { useMemo, useCallback } from 'react';\n\nimport {\n DataTransformerID,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n getFieldDisplayName,\n DataFrame,\n SelectableValue,\n FieldType,\n ValueMatcherID,\n valueMatchers,\n} from '@grafana/data';\nimport {\n FilterByValueFilter,\n FilterByValueMatch,\n FilterByValueTransformerOptions,\n FilterByValueType,\n} from '@grafana/data/src/transformations/transformers/filterByValue';\nimport { Button, RadioButtonGroup, stylesFactory } from '@grafana/ui';\n\nimport { DataFrameFieldsInfo, FilterByValueFilterEditor } from './FilterByValueFilterEditor';\n\nconst filterTypes: Array<SelectableValue<FilterByValueType>> = [\n { label: 'Include', value: FilterByValueType.include },\n { label: 'Exclude', value: FilterByValueType.exclude },\n];\n\nconst filterMatch: Array<SelectableValue<FilterByValueMatch>> = [\n { label: 'Match all', value: FilterByValueMatch.all },\n { label: 'Match any', value: FilterByValueMatch.any },\n];\n\nexport const FilterByValueTransformerEditor: React.FC<TransformerUIProps<FilterByValueTransformerOptions>> = (\n props\n) => {\n const { input, options, onChange } = props;\n const styles = getEditorStyles();\n const fieldsInfo = useFieldsInfo(input);\n\n const onAddFilter = useCallback(() => {\n const frame = input[0];\n const field = frame.fields.find((f) => f.type !== FieldType.time);\n\n if (!field) {\n return;\n }\n\n const filters = cloneDeep(options.filters);\n const matcher = valueMatchers.get(ValueMatcherID.greater);\n\n filters.push({\n fieldName: getFieldDisplayName(field, frame, input),\n config: {\n id: matcher.id,\n options: matcher.getDefaultOptions(field),\n },\n });\n onChange({ ...options, filters });\n }, [onChange, options, input]);\n\n const onDeleteFilter = useCallback(\n (index: number) => {\n let filters = cloneDeep(options.filters);\n filters.splice(index, 1);\n onChange({ ...options, filters });\n },\n [options, onChange]\n );\n\n const onChangeFilter = useCallback(\n (filter: FilterByValueFilter, index: number) => {\n let filters = cloneDeep(options.filters);\n filters[index] = filter;\n onChange({ ...options, filters });\n },\n [options, onChange]\n );\n\n const onChangeType = useCallback(\n (type?: FilterByValueType) => {\n onChange({\n ...options,\n type: type ?? FilterByValueType.include,\n });\n },\n [options, onChange]\n );\n\n const onChangeMatch = useCallback(\n (match?: FilterByValueMatch) => {\n onChange({\n ...options,\n match: match ?? FilterByValueMatch.all,\n });\n },\n [options, onChange]\n );\n\n return (\n <div>\n <div className=\"gf-form gf-form-inline\">\n <div className=\"gf-form-label width-8\">Filter type</div>\n <div className=\"width-15\">\n <RadioButtonGroup options={filterTypes} value={options.type} onChange={onChangeType} fullWidth />\n </div>\n </div>\n <div className=\"gf-form gf-form-inline\">\n <div className=\"gf-form-label width-8\">Conditions</div>\n <div className=\"width-15\">\n <RadioButtonGroup options={filterMatch} value={options.match} onChange={onChangeMatch} fullWidth />\n </div>\n </div>\n <div className={styles.conditions}>\n {options.filters.map((filter, idx) => (\n <FilterByValueFilterEditor\n key={idx}\n filter={filter}\n fieldsInfo={fieldsInfo}\n onChange={(filter) => onChangeFilter(filter, idx)}\n onDelete={() => onDeleteFilter(idx)}\n />\n ))}\n <div className=\"gf-form\">\n <Button icon=\"plus\" size=\"sm\" onClick={onAddFilter} variant=\"secondary\">\n Add condition\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport const filterByValueTransformRegistryItem: TransformerRegistryItem<FilterByValueTransformerOptions> = {\n id: DataTransformerID.filterByValue,\n editor: FilterByValueTransformerEditor,\n transformation: standardTransformers.filterByValueTransformer,\n name: standardTransformers.filterByValueTransformer.name,\n description:\n 'Removes rows of the query results using user-defined filters. This is useful if you can not filter your data in the data source.',\n};\n\nconst getEditorStyles = stylesFactory(() => ({\n conditions: css`\n padding-left: 16px;\n `,\n}));\n\nconst useFieldsInfo = (data: DataFrame[]): DataFrameFieldsInfo => {\n return useMemo(() => {\n const meta = {\n fieldsAsOptions: [],\n fieldByDisplayName: {},\n };\n\n if (!Array.isArray(data)) {\n return meta;\n }\n\n return data.reduce((meta: DataFrameFieldsInfo, frame) => {\n return frame.fields.reduce((meta, field) => {\n const fieldName = getFieldDisplayName(field, frame, data);\n\n if (meta.fieldByDisplayName[fieldName]) {\n return meta;\n }\n\n meta.fieldsAsOptions.push({\n label: fieldName,\n value: fieldName,\n type: field.type,\n });\n\n meta.fieldByDisplayName[fieldName] = field;\n\n return meta;\n }, meta);\n }, meta);\n }, [data]);\n};\n","import { set, get as lodashGet } from 'lodash';\n\nimport { StandardEditorContext, TransformerUIProps, PanelOptionsEditorBuilder } from '@grafana/data';\nimport { PanelOptionsSupplier } from '@grafana/data/src/panel/PanelPlugin';\nimport { NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders';\nimport { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor';\nimport { fillOptionsPaneItems } from 'app/features/dashboard/components/PanelEditor/getVisualizationOptions';\nimport { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils';\n\nexport function getTransformerOptionPane<T = any>(\n props: TransformerUIProps<T>,\n supplier: PanelOptionsSupplier<T>\n): OptionsPaneCategoryDescriptor {\n const context: StandardEditorContext<unknown, unknown> = {\n data: props.input,\n options: props.options,\n };\n\n const root = new OptionsPaneCategoryDescriptor({ id: 'root', title: 'root' });\n const getOptionsPaneCategory = (categoryNames?: string[]): OptionsPaneCategoryDescriptor => {\n if (categoryNames?.length) {\n const key = categoryNames[0];\n let sub = root.categories.find((v) => v.props.id === key);\n if (!sub) {\n sub = new OptionsPaneCategoryDescriptor({ id: key, title: key });\n root.categories.push(sub);\n }\n return sub;\n }\n return root;\n };\n\n const access: NestedValueAccess = {\n getValue: (path: string) => lodashGet(props.options, path),\n onChange: (path: string, value: any) => {\n props.onChange(setOptionImmutably(props.options as any, path, value));\n },\n };\n\n // Use the panel options loader\n fillOptionsPaneItems(supplier, access, getOptionsPaneCategory, context);\n return root;\n}\n\nexport function getDefaultOptions<T = any>(supplier: PanelOptionsSupplier<T>): T {\n const context: StandardEditorContext<T, unknown> = {\n data: [],\n options: {} as T,\n };\n\n const results = {};\n const builder = new PanelOptionsEditorBuilder<T>();\n supplier(builder, context);\n for (const item of builder.getItems()) {\n if (item.defaultValue != null) {\n set(results, item.path, item.defaultValue);\n }\n }\n return results as T;\n}\n","import React, { useEffect } from 'react';\n\nimport {\n PanelOptionsEditorBuilder,\n PluginState,\n StandardEditorContext,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\n\nimport { getDefaultOptions, getTransformerOptionPane } from '../spatial/optionsHelper';\n\nimport { addHeatmapCalculationOptions } from './editor/helper';\nimport { HeatmapTransformerOptions, heatmapTransformer } from './heatmap';\n\n// Nothing defined in state\nconst supplier = (\n builder: PanelOptionsEditorBuilder<HeatmapTransformerOptions>,\n context: StandardEditorContext<HeatmapTransformerOptions>\n) => {\n const options = context.options ?? {};\n\n addHeatmapCalculationOptions('', builder, options);\n};\n\nexport const HeatmapTransformerEditor: React.FC<TransformerUIProps<HeatmapTransformerOptions>> = (props) => {\n useEffect(() => {\n if (!props.options.xBuckets?.mode) {\n const opts = getDefaultOptions(supplier);\n props.onChange({ ...opts, ...props.options });\n console.log('geometry useEffect', opts);\n }\n });\n\n // Shared with spatial transformer\n const pane = getTransformerOptionPane<HeatmapTransformerOptions>(props, supplier);\n return (\n <div>\n <div>{pane.items.map((v) => v.render())}</div>\n </div>\n );\n};\n\nexport const heatmapTransformRegistryItem: TransformerRegistryItem<HeatmapTransformerOptions> = {\n id: heatmapTransformer.id,\n editor: HeatmapTransformerEditor,\n transformation: heatmapTransformer,\n name: heatmapTransformer.name,\n description: heatmapTransformer.description,\n state: PluginState.alpha,\n};\n","import { isArray } from 'lodash';\n\nimport {\n anyToNumber,\n DataFrame,\n FieldColorModeId,\n FieldConfig,\n getFieldDisplayName,\n MappingType,\n ReducerID,\n ThresholdsMode,\n ValueMapping,\n ValueMap,\n Field,\n FieldType,\n} from '@grafana/data';\n\nexport interface FieldToConfigMapping {\n fieldName: string;\n reducerId?: ReducerID;\n handlerKey: string | null;\n}\n\n/**\n * Transforms a frame with fields to a map of field configs\n *\n * Input\n * | Unit | Min | Max |\n * --------------------------------\n * | Temperature | 0 | 30 |\n * | Pressure | 0 | 100 |\n *\n * Outputs\n * {\n { min: 0, max: 100 },\n * }\n */\n\nexport function getFieldConfigFromFrame(\n frame: DataFrame,\n rowIndex: number,\n evaluatedMappings: EvaluatedMappingResult\n): FieldConfig {\n const config: FieldConfig = {};\n const context: FieldToConfigContext = {};\n\n for (const field of frame.fields) {\n const fieldName = getFieldDisplayName(field, frame);\n const mapping = evaluatedMappings.index[fieldName];\n const handler = mapping.handler;\n\n if (!handler) {\n continue;\n }\n\n const configValue = field.values.get(rowIndex);\n\n if (configValue === null || configValue === undefined) {\n continue;\n }\n\n const newValue = handler.processor(configValue, config, context);\n if (newValue != null) {\n (config as any)[handler.targetProperty ?? handler.key] = newValue;\n }\n }\n\n if (context.mappingValues) {\n config.mappings = combineValueMappings(context);\n }\n\n return config;\n}\n\ninterface FieldToConfigContext {\n mappingValues?: any[];\n mappingColors?: string[];\n mappingTexts?: string[];\n}\n\ntype FieldToConfigMapHandlerProcessor = (value: any, config: FieldConfig, context: FieldToConfigContext) => any;\n\nexport interface FieldToConfigMapHandler {\n key: string;\n targetProperty?: string;\n name?: string;\n processor: FieldToConfigMapHandlerProcessor;\n defaultReducer?: ReducerID;\n}\n\nexport enum FieldConfigHandlerKey {\n Name = 'field.name',\n Value = 'field.value',\n Label = 'field.label',\n Ignore = '__ignore',\n}\n\nexport const configMapHandlers: FieldToConfigMapHandler[] = [\n {\n key: FieldConfigHandlerKey.Name,\n name: 'Field name',\n processor: () => {},\n },\n {\n key: FieldConfigHandlerKey.Value,\n name: 'Field value',\n processor: () => {},\n },\n {\n key: FieldConfigHandlerKey.Label,\n name: 'Field label',\n processor: () => {},\n },\n {\n key: FieldConfigHandlerKey.Ignore,\n name: 'Ignore',\n processor: () => {},\n },\n {\n key: 'max',\n processor: toNumericOrUndefined,\n },\n {\n key: 'min',\n processor: toNumericOrUndefined,\n },\n {\n key: 'unit',\n processor: (value) => value.toString(),\n },\n {\n key: 'decimals',\n processor: toNumericOrUndefined,\n },\n {\n key: 'displayName',\n name: 'Display name',\n processor: (value: any) => value.toString(),\n },\n {\n key: 'color',\n processor: (value) => ({ fixedColor: value, mode: FieldColorModeId.Fixed }),\n },\n {\n key: 'threshold1',\n targetProperty: 'thresholds',\n processor: (value, config) => {\n const numeric = anyToNumber(value);\n\n if (isNaN(numeric)) {\n return;\n }\n\n if (!config.thresholds) {\n config.thresholds = {\n mode: ThresholdsMode.Absolute,\n steps: [{ value: -Infinity, color: 'green' }],\n };\n }\n\n config.thresholds.steps.push({\n value: numeric,\n color: 'red',\n });\n\n return config.thresholds;\n },\n },\n {\n key: 'mappings.value',\n name: 'Value mappings / Value',\n targetProperty: 'mappings',\n defaultReducer: ReducerID.allValues,\n processor: (value, config, context) => {\n if (!isArray(value)) {\n return;\n }\n\n context.mappingValues = value;\n return config.mappings;\n },\n },\n {\n key: 'mappings.color',\n name: 'Value mappings / Color',\n targetProperty: 'mappings',\n defaultReducer: ReducerID.allValues,\n processor: (value, config, context) => {\n if (!isArray(value)) {\n return;\n }\n\n context.mappingColors = value;\n return config.mappings;\n },\n },\n {\n key: 'mappings.text',\n name: 'Value mappings / Display text',\n targetProperty: 'mappings',\n defaultReducer: ReducerID.allValues,\n processor: (value, config, context) => {\n if (!isArray(value)) {\n return;\n }\n\n context.mappingTexts = value;\n return config.mappings;\n },\n },\n];\n\nfunction combineValueMappings(context: FieldToConfigContext): ValueMapping[] {\n const valueMap: ValueMap = {\n type: MappingType.ValueToText,\n options: {},\n };\n\n if (!context.mappingValues) {\n return [];\n }\n\n for (let i = 0; i < context.mappingValues.length; i++) {\n const value = context.mappingValues[i];\n if (value != null) {\n valueMap.options[value.toString()] = {\n color: context.mappingColors && context.mappingColors[i],\n text: context.mappingTexts && context.mappingTexts[i],\n index: i,\n };\n }\n }\n\n return [valueMap];\n}\n\nlet configMapHandlersIndex: Record<string, FieldToConfigMapHandler> | null = null;\n\nexport function getConfigMapHandlersIndex() {\n if (configMapHandlersIndex === null) {\n configMapHandlersIndex = {};\n for (const def of configMapHandlers) {\n configMapHandlersIndex[def.key] = def;\n }\n }\n\n return configMapHandlersIndex;\n}\n\nfunction toNumericOrUndefined(value: any) {\n const numeric = anyToNumber(value);\n\n if (isNaN(numeric)) {\n return;\n }\n\n return numeric;\n}\n\nexport function getConfigHandlerKeyForField(fieldName: string, mappings: FieldToConfigMapping[]) {\n for (const map of mappings) {\n if (fieldName === map.fieldName) {\n return map.handlerKey;\n }\n }\n\n return fieldName.toLowerCase();\n}\n\nexport function lookUpConfigHandler(key: string | null): FieldToConfigMapHandler | null {\n if (!key) {\n return null;\n }\n\n return getConfigMapHandlersIndex()[key];\n}\n\nexport interface EvaluatedMapping {\n automatic: boolean;\n handler: FieldToConfigMapHandler | null;\n reducerId: ReducerID;\n}\nexport interface EvaluatedMappingResult {\n index: Record<string, EvaluatedMapping>;\n nameField?: Field;\n valueField?: Field;\n}\n\nexport function evaluteFieldMappings(\n frame: DataFrame,\n mappings: FieldToConfigMapping[],\n withNameAndValue?: boolean\n): EvaluatedMappingResult {\n const result: EvaluatedMappingResult = {\n index: {},\n };\n\n // Look up name and value field in mappings\n let nameFieldMappping = mappings.find((x) => x.handlerKey === FieldConfigHandlerKey.Name);\n let valueFieldMapping = mappings.find((x) => x.handlerKey === FieldConfigHandlerKey.Value);\n\n for (const field of frame.fields) {\n const fieldName = getFieldDisplayName(field, frame);\n const mapping = mappings.find((x) => x.fieldName === fieldName);\n const key = mapping ? mapping.handlerKey : fieldName.toLowerCase();\n let handler = lookUpConfigHandler(key);\n\n // Name and value handlers are a special as their auto logic is based on first matching criteria\n if (withNameAndValue) {\n // If we have a handler it means manually specified field\n if (handler) {\n if (handler.key === FieldConfigHandlerKey.Name) {\n result.nameField = field;\n }\n if (handler.key === FieldConfigHandlerKey.Value) {\n result.valueField = field;\n }\n } else if (!mapping) {\n // We have no name field and no mapping for it, pick first string\n if (!result.nameField && !nameFieldMappping && field.type === FieldType.string) {\n result.nameField = field;\n handler = lookUpConfigHandler(FieldConfigHandlerKey.Name);\n }\n\n if (!result.valueField && !valueFieldMapping && field.type === FieldType.number) {\n result.valueField = field;\n handler = lookUpConfigHandler(FieldConfigHandlerKey.Value);\n }\n }\n }\n\n // If no handle and when in name and value mode (Rows to fields) default to labels\n if (!handler && withNameAndValue) {\n handler = lookUpConfigHandler(FieldConfigHandlerKey.Label);\n }\n\n result.index[fieldName] = {\n automatic: !mapping,\n handler: handler,\n reducerId: mapping?.reducerId ?? handler?.defaultReducer ?? ReducerID.lastNotNull,\n };\n }\n\n return result;\n}\n","import { css } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport React from 'react';\n\nimport { DataFrame, getFieldDisplayName, GrafanaTheme2, ReducerID, SelectableValue } from '@grafana/data';\nimport { Select, StatsPicker, useStyles2 } from '@grafana/ui';\n\nimport {\n configMapHandlers,\n evaluteFieldMappings,\n FieldToConfigMapHandler,\n FieldToConfigMapping,\n lookUpConfigHandler as findConfigHandlerFor,\n} from '../fieldToConfigMapping/fieldToConfigMapping';\n\nexport interface Props {\n frame: DataFrame;\n mappings: FieldToConfigMapping[];\n onChange: (mappings: FieldToConfigMapping[]) => void;\n withReducers?: boolean;\n withNameAndValue?: boolean;\n}\n\nexport function FieldToConfigMappingEditor({ frame, mappings, onChange, withReducers, withNameAndValue }: Props) {\n const styles = useStyles2(getStyles);\n const rows = getViewModelRows(frame, mappings, withNameAndValue);\n const configProps = configMapHandlers.map((def) => configHandlerToSelectOption(def, false)) as Array<\n SelectableValue<string>\n >;\n\n const onChangeConfigProperty = (row: FieldToConfigRowViewModel, value: SelectableValue<string | null>) => {\n const existingIdx = mappings.findIndex((x) => x.fieldName === row.fieldName);\n\n if (value) {\n if (existingIdx !== -1) {\n const update = [...mappings];\n update.splice(existingIdx, 1, { ...mappings[existingIdx], handlerKey: value.value! });\n onChange(update);\n } else {\n onChange([...mappings, { fieldName: row.fieldName, handlerKey: value.value! }]);\n }\n } else {\n if (existingIdx !== -1) {\n onChange(mappings.filter((x, index) => index !== existingIdx));\n } else {\n onChange([...mappings, { fieldName: row.fieldName, handlerKey: '__ignore' }]);\n }\n }\n };\n\n const onChangeReducer = (row: FieldToConfigRowViewModel, reducerId: ReducerID) => {\n const existingIdx = mappings.findIndex((x) => x.fieldName === row.fieldName);\n\n if (existingIdx !== -1) {\n const update = [...mappings];\n update.splice(existingIdx, 1, { ...mappings[existingIdx], reducerId });\n onChange(update);\n } else {\n onChange([...mappings, { fieldName: row.fieldName, handlerKey: row.handlerKey, reducerId }]);\n }\n };\n\n return (\n <table className={styles.table}>\n <thead>\n <tr>\n <th>Field</th>\n <th>Use as</th>\n {withReducers && <th>Select</th>}\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.fieldName}>\n <td className={styles.labelCell}>{row.fieldName}</td>\n <td className={styles.selectCell} data-testid={`${row.fieldName}-config-key`}>\n <Select\n options={configProps}\n value={row.configOption}\n placeholder={row.placeholder}\n isClearable={true}\n onChange={(value) => onChangeConfigProperty(row, value)}\n />\n </td>\n {withReducers && (\n <td data-testid={`${row.fieldName}-reducer`} className={styles.selectCell}>\n <StatsPicker\n stats={[row.reducerId]}\n defaultStat={row.reducerId}\n onChange={(stats: string[]) => onChangeReducer(row, stats[0] as ReducerID)}\n />\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\ninterface FieldToConfigRowViewModel {\n handlerKey: string | null;\n fieldName: string;\n configOption: SelectableValue<string | null> | null;\n placeholder?: string;\n missingInFrame?: boolean;\n reducerId: string;\n}\n\nfunction getViewModelRows(\n frame: DataFrame,\n mappings: FieldToConfigMapping[],\n withNameAndValue?: boolean\n): FieldToConfigRowViewModel[] {\n const rows: FieldToConfigRowViewModel[] = [];\n const mappingResult = evaluteFieldMappings(frame, mappings ?? [], withNameAndValue);\n\n for (const field of frame.fields) {\n const fieldName = getFieldDisplayName(field, frame);\n const mapping = mappingResult.index[fieldName];\n const option = configHandlerToSelectOption(mapping.handler, mapping.automatic);\n\n rows.push({\n fieldName,\n configOption: mapping.automatic ? null : option,\n placeholder: mapping.automatic ? option?.label : 'Choose',\n handlerKey: mapping.handler?.key ?? null,\n reducerId: mapping.reducerId,\n });\n }\n\n // Add rows for mappings that have no matching field\n for (const mapping of mappings) {\n if (!rows.find((x) => x.fieldName === mapping.fieldName)) {\n const handler = findConfigHandlerFor(mapping.handlerKey);\n\n rows.push({\n fieldName: mapping.fieldName,\n handlerKey: mapping.handlerKey,\n configOption: configHandlerToSelectOption(handler, false),\n missingInFrame: true,\n reducerId: mapping.reducerId ?? ReducerID.lastNotNull,\n });\n }\n }\n\n return Object.values(rows);\n}\n\nfunction configHandlerToSelectOption(\n def: FieldToConfigMapHandler | null,\n isAutomatic: boolean\n): SelectableValue<string> | null {\n if (!def) {\n return null;\n }\n\n let name = def.name ?? capitalize(def.key);\n\n if (isAutomatic) {\n name = `${name} (auto)`;\n }\n\n return {\n label: name,\n value: def.key,\n };\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n table: css`\n margin-top: ${theme.spacing(1)};\n\n td,\n th {\n border-right: 4px solid ${theme.colors.background.primary};\n border-bottom: 4px solid ${theme.colors.background.primary};\n white-space: nowrap;\n }\n th {\n font-size: ${theme.typography.bodySmall.fontSize};\n line-height: ${theme.spacing(4)};\n padding: ${theme.spacing(0, 1)};\n }\n `,\n labelCell: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n background: ${theme.colors.background.secondary};\n padding: ${theme.spacing(0, 1)};\n max-width: 400px;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 140px;\n `,\n selectCell: css`\n padding: 0;\n min-width: 161px;\n `,\n});\n","import { map } from 'rxjs/operators';\n\nimport {\n ArrayVector,\n DataFrame,\n DataTransformerID,\n DataTransformerInfo,\n FieldMatcherID,\n getFieldDisplayName,\n getFieldMatcher,\n MatcherConfig,\n reduceField,\n} from '@grafana/data';\n\nimport {\n getFieldConfigFromFrame,\n FieldToConfigMapping,\n evaluteFieldMappings,\n} from '../fieldToConfigMapping/fieldToConfigMapping';\n\nexport interface ConfigFromQueryTransformOptions {\n configRefId?: string;\n mappings: FieldToConfigMapping[];\n applyTo?: MatcherConfig;\n}\n\nexport function extractConfigFromQuery(options: ConfigFromQueryTransformOptions, data: DataFrame[]) {\n let configFrame: DataFrame | null = null;\n\n for (const frame of data) {\n if (frame.refId === options.configRefId) {\n configFrame = frame;\n break;\n }\n }\n\n if (!configFrame) {\n return data;\n }\n\n const reducedConfigFrame: DataFrame = {\n fields: [],\n length: 1,\n };\n\n const mappingResult = evaluteFieldMappings(configFrame, options.mappings ?? [], false);\n\n // reduce config frame\n for (const field of configFrame.fields) {\n const newField = { ...field };\n const fieldName = getFieldDisplayName(field, configFrame);\n const fieldMapping = mappingResult.index[fieldName];\n const result = reduceField({ field, reducers: [fieldMapping.reducerId] });\n newField.values = new ArrayVector([result[fieldMapping.reducerId]]);\n reducedConfigFrame.fields.push(newField);\n }\n\n const output: DataFrame[] = [];\n const matcher = getFieldMatcher(options.applyTo || { id: FieldMatcherID.numeric });\n\n for (const frame of data) {\n // Skip config frame in output\n if (frame === configFrame && data.length > 1) {\n continue;\n }\n\n const outputFrame: DataFrame = {\n fields: [],\n length: frame.length,\n };\n\n for (const field of frame.fields) {\n if (matcher(field, frame, data)) {\n const dataConfig = getFieldConfigFromFrame(reducedConfigFrame, 0, mappingResult);\n outputFrame.fields.push({\n ...field,\n config: {\n ...field.config,\n ...dataConfig,\n },\n });\n } else {\n outputFrame.fields.push(field);\n }\n }\n\n output.push(outputFrame);\n }\n\n return output;\n}\n\nexport const configFromDataTransformer: DataTransformerInfo<ConfigFromQueryTransformOptions> = {\n id: DataTransformerID.configFromData,\n name: 'Config from query results',\n description: 'Set unit, min, max and more from data',\n defaultOptions: {\n configRefId: 'config',\n mappings: [],\n },\n\n /**\n * Return a modified copy of the series. If the transform is not or should not\n * be applied, just return the input series\n */\n operator: (options) => (source) => source.pipe(map((data) => extractConfigFromQuery(options, data))),\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n FieldMatcherID,\n GrafanaTheme2,\n PluginState,\n SelectableValue,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { fieldMatchersUI, InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';\n\nimport { FieldToConfigMappingEditor } from '../fieldToConfigMapping/FieldToConfigMappingEditor';\n\nimport { configFromDataTransformer, ConfigFromQueryTransformOptions } from './configFromQuery';\n\nexport interface Props extends TransformerUIProps<ConfigFromQueryTransformOptions> {}\n\nexport function ConfigFromQueryTransformerEditor({ input, onChange, options }: Props) {\n const styles = useStyles2(getStyles);\n\n const refIds = input\n .map((x) => x.refId)\n .filter((x) => x != null)\n .map((x) => ({ label: x, value: x }));\n\n const currentRefId = options.configRefId || 'config';\n const currentMatcher = options.applyTo ?? { id: FieldMatcherID.byType, options: 'number' };\n const matcherUI = fieldMatchersUI.get(currentMatcher.id);\n const configFrame = input.find((x) => x.refId === currentRefId);\n\n const onRefIdChange = (value: SelectableValue<string>) => {\n onChange({\n ...options,\n configRefId: value.value || 'config',\n });\n };\n\n const onMatcherChange = (value: SelectableValue<string>) => {\n onChange({ ...options, applyTo: { id: value.value! } });\n };\n\n const onMatcherConfigChange = (matcherOption: any) => {\n onChange({ ...options, applyTo: { id: currentMatcher.id, options: matcherOption } });\n };\n\n const matchers = fieldMatchersUI\n .list()\n .filter((o) => !o.excludeFromPicker)\n .map<SelectableValue<string>>((i) => ({ label: i.name, value: i.id, description: i.description }));\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Config query\" labelWidth={20}>\n <Select onChange={onRefIdChange} options={refIds} value={currentRefId} width={30} />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label=\"Apply to\" labelWidth={20}>\n <Select onChange={onMatcherChange} options={matchers} value={currentMatcher.id} width={30} />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label=\"Apply to options\" labelWidth={20} className={styles.matcherOptions}>\n <matcherUI.component\n matcher={matcherUI.matcher}\n data={input}\n options={currentMatcher.options}\n onChange={onMatcherConfigChange}\n />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n {configFrame && (\n <FieldToConfigMappingEditor\n frame={configFrame}\n mappings={options.mappings}\n onChange={(mappings) => onChange({ ...options, mappings })}\n withReducers\n />\n )}\n </InlineFieldRow>\n </>\n );\n}\n\nexport const configFromQueryTransformRegistryItem: TransformerRegistryItem<ConfigFromQueryTransformOptions> = {\n id: configFromDataTransformer.id,\n editor: ConfigFromQueryTransformerEditor,\n transformation: configFromDataTransformer,\n name: configFromDataTransformer.name,\n description: configFromDataTransformer.description,\n state: PluginState.beta,\n help: `\n### Use cases\n\nThis transformation allows you select one query and from it extract standard options such as\n**Min**, **Max**, **Unit**, and **Thresholds** and apply them to other query results.\nThis enables dynamic query driven visualization configuration.\n\n### Options\n\n- **Config query**: Selet the query that returns the data you want to use as configuration.\n- **Apply to**: Select what fields or series to apply the configuration to.\n- **Apply to options**: Usually a field type or field name regex depending on what option you selected in **Apply to**.\n\n### Field mapping table\n\nBelow the configuration listed above you will find the field table. Here all fields found in the data returned by the config query will be listed along with a **Use as** and **Select** option. This table gives you control over what field should be mapped to which config property and if there are multiple rows which value to select.\n\n## Example\n\nInput[0] (From query: A, name: ServerA)\n\n| Time | Value |\n| ------------- | ----- |\n| 1626178119127 | 10 |\n| 1626178119129 | 30 |\n\nInput[1] (From query: B)\n\n| Time | Value |\n| ------------- | ----- |\n| 1626178119127 | 100 |\n| 1626178119129 | 100 |\n\nOutput (Same as Input[0] but now with config on the Value field)\n\n| Time | Value (config: Max=100) |\n| ------------- | ----------------------- |\n| 1626178119127 | 10 |\n| 1626178119129 | 30 |\n\nEach row in the source data becomes a separate field. Each field now also has a maximum\nconfiguration option set. Options such as **min**, **max**, **unit**, and **thresholds** are all part of field configuration, and if they are set like this, they will be used by the visualization instead of any options that are manually configured.\nin the panel editor options pane.\n\n## Value mappings\n\nYou can also transform a query result into value mappings. This is is a bit different because every\nrow in the configuration query result is used to define a single value mapping row. See the following example.\n\nConfig query result:\n\n| Value | Text | Color |\n| ----- | ------ | ----- |\n| L | Low | blue |\n| M | Medium | green |\n| H | High | red |\n\nIn the field mapping specify:\n\n| Field | Use as | Select |\n| ----- | ----------------------- | ---------- |\n| Value | Value mappings / Value | All values |\n| Text | Value mappings / Text | All values |\n| Color | Value mappings / Ciolor | All values |\n\nGrafana will build the value mappings from you query result and apply it the the real data query results. You should see values being mapped and colored according to the config query results.\n`,\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n matcherOptions: css`\n min-width: 404px;\n `,\n});\n","import { defaults } from 'lodash';\nimport React, { ChangeEvent } from 'react';\nimport { of, OperatorFunction } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport {\n BinaryOperationID,\n binaryOperators,\n DataFrame,\n DataTransformerID,\n FieldType,\n getFieldDisplayName,\n KeyValue,\n ReducerID,\n SelectableValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport {\n BinaryOptions,\n CalculateFieldMode,\n CalculateFieldTransformerOptions,\n getNameFromOptions,\n ReduceOptions,\n} from '@grafana/data/src/transformations/transformers/calculateField';\nimport { FilterPill, HorizontalGroup, Input, LegacyForms, Select, StatsPicker } from '@grafana/ui';\n\ninterface CalculateFieldTransformerEditorProps extends TransformerUIProps<CalculateFieldTransformerOptions> {}\n\ninterface CalculateFieldTransformerEditorState {\n include: string[];\n names: string[];\n selected: string[];\n}\n\nconst calculationModes = [\n { value: CalculateFieldMode.BinaryOperation, label: 'Binary operation' },\n { value: CalculateFieldMode.ReduceRow, label: 'Reduce row' },\n];\n\nconst okTypes = new Set<FieldType>([FieldType.time, FieldType.number, FieldType.string]);\n\nexport class CalculateFieldTransformerEditor extends React.PureComponent<\n CalculateFieldTransformerEditorProps,\n CalculateFieldTransformerEditorState\n> {\n constructor(props: CalculateFieldTransformerEditorProps) {\n super(props);\n\n this.state = {\n include: props.options?.reduce?.include || [],\n names: [],\n selected: [],\n };\n }\n\n componentDidMount() {\n this.initOptions();\n }\n\n componentDidUpdate(oldProps: CalculateFieldTransformerEditorProps) {\n if (this.props.input !== oldProps.input) {\n this.initOptions();\n }\n }\n\n private initOptions() {\n const { options } = this.props;\n const configuredOptions = options?.reduce?.include || [];\n const subscription = of(this.props.input)\n .pipe(\n standardTransformers.ensureColumnsTransformer.operator(null),\n this.extractAllNames(),\n this.extractNamesAndSelected(configuredOptions)\n )\n .subscribe(({ selected, names }) => {\n this.setState({ names, selected }, () => subscription.unsubscribe());\n });\n }\n\n private extractAllNames(): OperatorFunction<DataFrame[], string[]> {\n return (source) =>\n source.pipe(\n map((input) => {\n const allNames: string[] = [];\n const byName: KeyValue<boolean> = {};\n\n for (const frame of input) {\n for (const field of frame.fields) {\n if (!okTypes.has(field.type)) {\n continue;\n }\n\n const displayName = getFieldDisplayName(field, frame, input);\n\n if (!byName[displayName]) {\n byName[displayName] = true;\n allNames.push(displayName);\n }\n }\n }\n\n return allNames;\n })\n );\n }\n\n private extractNamesAndSelected(\n configuredOptions: string[]\n ): OperatorFunction<string[], { names: string[]; selected: string[] }> {\n return (source) =>\n source.pipe(\n map((allNames) => {\n if (!configuredOptions.length) {\n return { names: allNames, selected: [] };\n }\n\n const names: string[] = [];\n const selected: string[] = [];\n\n for (const v of allNames) {\n if (configuredOptions.includes(v)) {\n selected.push(v);\n }\n names.push(v);\n }\n\n return { names, selected };\n })\n );\n }\n\n onToggleReplaceFields = () => {\n const { options } = this.props;\n this.props.onChange({\n ...options,\n replaceFields: !options.replaceFields,\n });\n };\n\n onModeChanged = (value: SelectableValue<CalculateFieldMode>) => {\n const { options, onChange } = this.props;\n const mode = value.value ?? CalculateFieldMode.BinaryOperation;\n onChange({\n ...options,\n mode,\n });\n };\n\n onAliasChanged = (evt: ChangeEvent<HTMLInputElement>) => {\n const { options } = this.props;\n this.props.onChange({\n ...options,\n alias: evt.target.value,\n });\n };\n\n //---------------------------------------------------------\n // Reduce by Row\n //---------------------------------------------------------\n\n updateReduceOptions = (v: ReduceOptions) => {\n const { options, onChange } = this.props;\n onChange({\n ...options,\n mode: CalculateFieldMode.ReduceRow,\n reduce: v,\n });\n };\n\n onFieldToggle = (fieldName: string) => {\n const { selected } = this.state;\n if (selected.indexOf(fieldName) > -1) {\n this.onChange(selected.filter((s) => s !== fieldName));\n } else {\n this.onChange([...selected, fieldName]);\n }\n };\n\n onChange = (selected: string[]) => {\n this.setState({ selected });\n const { reduce } = this.props.options;\n this.updateReduceOptions({\n ...reduce!,\n include: selected,\n });\n };\n\n onStatsChange = (stats: string[]) => {\n const reducer = stats.length ? (stats[0] as ReducerID) : ReducerID.sum;\n\n const { reduce } = this.props.options;\n this.updateReduceOptions({ ...reduce, reducer });\n };\n\n renderReduceRow(options?: ReduceOptions) {\n const { names, selected } = this.state;\n options = defaults(options, { reducer: ReducerID.sum });\n\n return (\n <>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\">Field name</div>\n <HorizontalGroup spacing=\"xs\" align=\"flex-start\" wrap>\n {names.map((o, i) => {\n return (\n <FilterPill\n key={`${o}/${i}`}\n onClick={() => {\n this.onFieldToggle(o);\n }}\n label={o}\n selected={selected.indexOf(o) > -1}\n />\n );\n })}\n </HorizontalGroup>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <div className=\"gf-form-label width-8\">Calculation</div>\n <StatsPicker\n allowMultiple={false}\n className=\"width-18\"\n stats={[options.reducer]}\n onChange={this.onStatsChange}\n defaultStat={ReducerID.sum}\n />\n </div>\n </div>\n </>\n );\n }\n\n //---------------------------------------------------------\n // Binary Operator\n //---------------------------------------------------------\n\n updateBinaryOptions = (v: BinaryOptions) => {\n const { options, onChange } = this.props;\n onChange({\n ...options,\n mode: CalculateFieldMode.BinaryOperation,\n binary: v,\n });\n };\n\n onBinaryLeftChanged = (v: SelectableValue<string>) => {\n const { binary } = this.props.options;\n this.updateBinaryOptions({\n ...binary!,\n left: v.value!,\n });\n };\n\n onBinaryRightChanged = (v: SelectableValue<string>) => {\n const { binary } = this.props.options;\n this.updateBinaryOptions({\n ...binary!,\n right: v.value!,\n });\n };\n\n onBinaryOperationChanged = (v: SelectableValue<string>) => {\n const { binary } = this.props.options;\n this.updateBinaryOptions({\n ...binary!,\n operator: v.value! as BinaryOperationID,\n });\n };\n\n renderBinaryOperation(options?: BinaryOptions) {\n options = defaults(options, { reducer: ReducerID.sum });\n\n let foundLeft = !options?.left;\n let foundRight = !options?.right;\n const names = this.state.names.map((v) => {\n if (v === options?.left) {\n foundLeft = true;\n }\n if (v === options?.right) {\n foundRight = true;\n }\n return { label: v, value: v };\n });\n const leftNames = foundLeft ? names : [...names, { label: options?.left, value: options?.left }];\n const rightNames = foundRight ? names : [...names, { label: options?.right, value: options?.right }];\n\n const ops = binaryOperators.list().map((v) => {\n return { label: v.id, value: v.id };\n });\n\n return (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <div className=\"gf-form-label width-8\">Operation</div>\n </div>\n <div className=\"gf-form\">\n <Select\n allowCustomValue={true}\n placeholder=\"Field or number\"\n options={leftNames}\n className=\"min-width-18 gf-form-spacing\"\n value={options?.left}\n onChange={this.onBinaryLeftChanged}\n />\n <Select\n className=\"width-8 gf-form-spacing\"\n options={ops}\n value={options.operator ?? ops[0].value}\n onChange={this.onBinaryOperationChanged}\n />\n <Select\n allowCustomValue={true}\n placeholder=\"Field or number\"\n className=\"min-width-10\"\n options={rightNames}\n value={options?.right}\n onChange={this.onBinaryRightChanged}\n />\n </div>\n </div>\n );\n }\n\n //---------------------------------------------------------\n // Render\n //---------------------------------------------------------\n\n render() {\n const { options } = this.props;\n\n const mode = options.mode ?? CalculateFieldMode.BinaryOperation;\n\n return (\n <div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <div className=\"gf-form-label width-8\">Mode</div>\n <Select\n className=\"width-18\"\n options={calculationModes}\n value={calculationModes.find((v) => v.value === mode)}\n onChange={this.onModeChanged}\n />\n </div>\n </div>\n {mode === CalculateFieldMode.BinaryOperation && this.renderBinaryOperation(options.binary)}\n {mode === CalculateFieldMode.ReduceRow && this.renderReduceRow(options.reduce)}\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <div className=\"gf-form-label width-8\">Alias</div>\n <Input\n className=\"width-18\"\n value={options.alias ?? ''}\n placeholder={getNameFromOptions(options)}\n onChange={this.onAliasChanged}\n />\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <LegacyForms.Switch\n label=\"Replace all fields\"\n labelClass=\"width-8\"\n checked={!!options.replaceFields}\n onChange={this.onToggleReplaceFields}\n />\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport const calculateFieldTransformRegistryItem: TransformerRegistryItem<CalculateFieldTransformerOptions> = {\n id: DataTransformerID.calculateField,\n editor: CalculateFieldTransformerEditor,\n transformation: standardTransformers.calculateFieldTransformer,\n name: 'Add field from calculation',\n description: 'Use the row values to calculate a new field',\n};\n","import React, { ChangeEvent } from 'react';\n\nimport {\n DataTransformerID,\n SelectableValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport {\n ConcatenateFrameNameMode,\n ConcatenateTransformerOptions,\n} from '@grafana/data/src/transformations/transformers/concat';\nimport { Input, Select } from '@grafana/ui';\n\ninterface ConcatenateTransformerEditorProps extends TransformerUIProps<ConcatenateTransformerOptions> {}\n\nconst nameModes: Array<SelectableValue<ConcatenateFrameNameMode>> = [\n { value: ConcatenateFrameNameMode.FieldName, label: 'Copy frame name to field name' },\n { value: ConcatenateFrameNameMode.Label, label: 'Add a label with the frame name' },\n { value: ConcatenateFrameNameMode.Drop, label: 'Ignore the frame name' },\n];\n\nexport class ConcatenateTransformerEditor extends React.PureComponent<ConcatenateTransformerEditorProps> {\n constructor(props: ConcatenateTransformerEditorProps) {\n super(props);\n }\n\n onModeChanged = (value: SelectableValue<ConcatenateFrameNameMode>) => {\n const { options, onChange } = this.props;\n const frameNameMode = value.value ?? ConcatenateFrameNameMode.FieldName;\n onChange({\n ...options,\n frameNameMode,\n });\n };\n\n onLabelChanged = (evt: ChangeEvent<HTMLInputElement>) => {\n const { options } = this.props;\n this.props.onChange({\n ...options,\n frameNameLabel: evt.target.value,\n });\n };\n\n //---------------------------------------------------------\n // Render\n //---------------------------------------------------------\n\n render() {\n const { options } = this.props;\n\n const frameNameMode = options.frameNameMode ?? ConcatenateFrameNameMode.FieldName;\n\n return (\n <div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <div className=\"gf-form-label width-8\">Name</div>\n <Select\n className=\"width-18\"\n options={nameModes}\n value={nameModes.find((v) => v.value === frameNameMode)}\n onChange={this.onModeChanged}\n />\n </div>\n </div>\n {frameNameMode === ConcatenateFrameNameMode.Label && (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <div className=\"gf-form-label width-8\">Label</div>\n <Input\n className=\"width-18\"\n value={options.frameNameLabel ?? ''}\n placeholder=\"frame\"\n onChange={this.onLabelChanged}\n />\n </div>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport const concatenateTransformRegistryItem: TransformerRegistryItem<ConcatenateTransformerOptions> = {\n id: DataTransformerID.concatenate,\n editor: ConcatenateTransformerEditor,\n transformation: standardTransformers.concatenateTransformer,\n name: 'Concatenate fields',\n description:\n 'Combine all fields into a single frame. Values will be appended with undefined values if not the same length.',\n};\n","import React, { ChangeEvent, useCallback } from 'react';\n\nimport {\n DataTransformerID,\n FieldNamePickerConfigSettings,\n FieldType,\n SelectableValue,\n StandardEditorsRegistryItem,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { ConvertFieldTypeTransformerOptions } from '@grafana/data/src/transformations/transformers/convertFieldType';\nimport { Button, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';\n\nimport { ConvertFieldTypeOptions } from '../../../../../packages/grafana-data/src/transformations/transformers/convertFieldType';\nimport { FieldNamePicker } from '../../../../../packages/grafana-ui/src/components/MatchersUI/FieldNamePicker';\n\nconst fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {\n settings: { width: 24 },\n} as any;\n\nexport const ConvertFieldTypeTransformerEditor: React.FC<TransformerUIProps<ConvertFieldTypeTransformerOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const allTypes: Array<SelectableValue<FieldType>> = [\n { value: FieldType.number, label: 'Numeric' },\n { value: FieldType.string, label: 'String' },\n { value: FieldType.time, label: 'Time' },\n { value: FieldType.boolean, label: 'Boolean' },\n { value: FieldType.other, label: 'JSON' },\n ];\n\n const onSelectField = useCallback(\n (idx) => (value: string | undefined) => {\n const conversions = options.conversions;\n conversions[idx] = { ...conversions[idx], targetField: value ?? '' };\n onChange({\n ...options,\n conversions: conversions,\n });\n },\n [onChange, options]\n );\n\n const onSelectDestinationType = useCallback(\n (idx) => (value: SelectableValue<FieldType>) => {\n const conversions = options.conversions;\n conversions[idx] = { ...conversions[idx], destinationType: value.value };\n onChange({\n ...options,\n conversions: conversions,\n });\n },\n [onChange, options]\n );\n\n const onInputFormat = useCallback(\n (idx) => (e: ChangeEvent<HTMLInputElement>) => {\n const conversions = options.conversions;\n conversions[idx] = { ...conversions[idx], dateFormat: e.currentTarget.value };\n onChange({\n ...options,\n conversions: conversions,\n });\n },\n [onChange, options]\n );\n\n const onAddConvertFieldType = useCallback(() => {\n onChange({\n ...options,\n conversions: [\n ...options.conversions,\n { targetField: undefined, destinationType: undefined, dateFormat: undefined },\n ],\n });\n }, [onChange, options]);\n\n const onRemoveConvertFieldType = useCallback(\n (idx) => {\n const removed = options.conversions;\n removed.splice(idx, 1);\n onChange({\n ...options,\n conversions: removed,\n });\n },\n [onChange, options]\n );\n\n return (\n <>\n {options.conversions.map((c: ConvertFieldTypeOptions, idx: number) => {\n return (\n <InlineFieldRow key={`${c.targetField}-${idx}`}>\n <InlineField label={'Field'}>\n <FieldNamePicker\n context={{ data: input }}\n value={c.targetField ?? ''}\n onChange={onSelectField(idx)}\n item={fieldNamePickerSettings}\n />\n </InlineField>\n <InlineField label={'as'}>\n <Select\n options={allTypes}\n value={c.destinationType}\n placeholder={'Type'}\n onChange={onSelectDestinationType(idx)}\n width={18}\n />\n </InlineField>\n {c.destinationType === FieldType.time && (\n <InlineField\n label=\"Input format\"\n tooltip=\"Specify the format of the input field so Grafana can parse the date string correctly.\"\n >\n <Input value={c.dateFormat} placeholder={'e.g. YYYY-MM-DD'} onChange={onInputFormat(idx)} width={24} />\n </InlineField>\n )}\n <Button\n size=\"md\"\n icon=\"trash-alt\"\n variant=\"secondary\"\n onClick={() => onRemoveConvertFieldType(idx)}\n aria-label={'Remove convert field type transformer'}\n />\n </InlineFieldRow>\n );\n })}\n <Button\n size=\"sm\"\n icon=\"plus\"\n onClick={onAddConvertFieldType}\n variant=\"secondary\"\n aria-label={'Add a convert field type transformer'}\n >\n {'Convert field type'}\n </Button>\n </>\n );\n};\n\nexport const convertFieldTypeTransformRegistryItem: TransformerRegistryItem<ConvertFieldTypeTransformerOptions> = {\n id: DataTransformerID.convertFieldType,\n editor: ConvertFieldTypeTransformerEditor,\n transformation: standardTransformers.convertFieldTypeTransformer,\n name: standardTransformers.convertFieldTypeTransformer.name,\n description: standardTransformers.convertFieldTypeTransformer.description,\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n DataTransformerID,\n KeyValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n getFieldDisplayName,\n stringToJsRegex,\n} from '@grafana/data';\nimport { FilterFieldsByNameTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByName';\nimport { Field, Input, FilterPill, HorizontalGroup } from '@grafana/ui';\n\ninterface FilterByNameTransformerEditorProps extends TransformerUIProps<FilterFieldsByNameTransformerOptions> {}\n\ninterface FilterByNameTransformerEditorState {\n include: string[];\n options: FieldNameInfo[];\n selected: string[];\n regex?: string;\n isRegexValid?: boolean;\n}\n\ninterface FieldNameInfo {\n name: string;\n count: number;\n}\nexport class FilterByNameTransformerEditor extends React.PureComponent<\n FilterByNameTransformerEditorProps,\n FilterByNameTransformerEditorState\n> {\n constructor(props: FilterByNameTransformerEditorProps) {\n super(props);\n this.state = {\n include: props.options.include?.names || [],\n regex: props.options.include?.pattern,\n options: [],\n selected: [],\n isRegexValid: true,\n };\n }\n\n componentDidMount() {\n this.initOptions();\n }\n\n componentDidUpdate(oldProps: FilterByNameTransformerEditorProps) {\n if (this.props.input !== oldProps.input) {\n this.initOptions();\n }\n }\n\n private initOptions() {\n const { input, options } = this.props;\n const configuredOptions = Array.from(options.include?.names ?? []);\n\n const allNames: FieldNameInfo[] = [];\n const byName: KeyValue<FieldNameInfo> = {};\n\n for (const frame of input) {\n for (const field of frame.fields) {\n const displayName = getFieldDisplayName(field, frame, input);\n let v = byName[displayName];\n\n if (!v) {\n v = byName[displayName] = {\n name: displayName,\n count: 0,\n };\n allNames.push(v);\n }\n\n v.count++;\n }\n }\n\n if (options.include?.pattern) {\n try {\n const regex = stringToJsRegex(options.include.pattern);\n\n for (const info of allNames) {\n if (regex.test(info.name)) {\n configuredOptions.push(info.name);\n }\n }\n } catch (error) {\n console.error(error);\n }\n }\n\n if (configuredOptions.length) {\n const selected: FieldNameInfo[] = allNames.filter((n) => configuredOptions.includes(n.name));\n\n this.setState({\n options: allNames,\n selected: selected.map((s) => s.name),\n regex: options.include?.pattern,\n });\n } else {\n this.setState({\n options: allNames,\n selected: allNames.map((n) => n.name),\n regex: options.include?.pattern,\n });\n }\n }\n\n onFieldToggle = (fieldName: string) => {\n const { selected } = this.state;\n if (selected.indexOf(fieldName) > -1) {\n this.onChange(selected.filter((s) => s !== fieldName));\n } else {\n this.onChange([...selected, fieldName]);\n }\n };\n\n onChange = (selected: string[]) => {\n const { regex, isRegexValid } = this.state;\n const options: FilterFieldsByNameTransformerOptions = {\n ...this.props.options,\n include: { names: selected },\n };\n\n if (regex && isRegexValid) {\n options.include = options.include ?? {};\n options.include.pattern = regex;\n }\n\n this.setState({ selected }, () => {\n this.props.onChange(options);\n });\n };\n\n onInputBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const { selected, regex } = this.state;\n let isRegexValid = true;\n\n try {\n if (regex) {\n stringToJsRegex(regex);\n }\n } catch (e) {\n isRegexValid = false;\n }\n\n if (isRegexValid) {\n this.props.onChange({\n ...this.props.options,\n include: { pattern: regex },\n });\n } else {\n this.props.onChange({\n ...this.props.options,\n include: { names: selected },\n });\n }\n\n this.setState({ isRegexValid });\n };\n\n render() {\n const { options, selected, isRegexValid } = this.state;\n return (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\">Identifier</div>\n <HorizontalGroup spacing=\"xs\" align=\"flex-start\" wrap>\n <Field\n invalid={!isRegexValid}\n error={!isRegexValid ? 'Invalid pattern' : undefined}\n className={css`\n margin-bottom: 0;\n `}\n >\n <Input\n placeholder=\"Regular expression pattern\"\n value={this.state.regex || ''}\n onChange={(e) => this.setState({ regex: e.currentTarget.value })}\n onBlur={this.onInputBlur}\n width={25}\n />\n </Field>\n {options.map((o, i) => {\n const label = `${o.name}${o.count > 1 ? ' (' + o.count + ')' : ''}`;\n const isSelected = selected.indexOf(o.name) > -1;\n return (\n <FilterPill\n key={`${o.name}/${i}`}\n onClick={() => {\n this.onFieldToggle(o.name);\n }}\n label={label}\n selected={isSelected}\n />\n );\n })}\n </HorizontalGroup>\n </div>\n </div>\n );\n }\n}\n\nexport const filterFieldsByNameTransformRegistryItem: TransformerRegistryItem<FilterFieldsByNameTransformerOptions> = {\n id: DataTransformerID.filterFieldsByName,\n editor: FilterByNameTransformerEditor,\n transformation: standardTransformers.filterFieldsByNameTransformer,\n name: 'Filter by name',\n description: 'Removes part of the query results using a regex pattern. The pattern can be inclusive or exclusive.',\n};\n","import React from 'react';\n\nimport {\n DataTransformerID,\n KeyValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { FilterFramesByRefIdTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByRefId';\nimport { HorizontalGroup, FilterPill } from '@grafana/ui';\n\ninterface FilterByRefIdTransformerEditorProps extends TransformerUIProps<FilterFramesByRefIdTransformerOptions> {}\n\ninterface FilterByRefIdTransformerEditorState {\n include: string;\n options: RefIdInfo[];\n selected: string[];\n}\n\ninterface RefIdInfo {\n refId: string;\n count: number;\n}\nexport class FilterByRefIdTransformerEditor extends React.PureComponent<\n FilterByRefIdTransformerEditorProps,\n FilterByRefIdTransformerEditorState\n> {\n constructor(props: FilterByRefIdTransformerEditorProps) {\n super(props);\n this.state = {\n include: props.options.include || '',\n options: [],\n selected: [],\n };\n }\n\n componentDidMount() {\n this.initOptions();\n }\n\n componentDidUpdate(oldProps: FilterByRefIdTransformerEditorProps) {\n if (this.props.input !== oldProps.input) {\n this.initOptions();\n }\n }\n\n private initOptions() {\n const { input, options } = this.props;\n const configuredOptions = options.include ? options.include.split('|') : [];\n\n const allNames: RefIdInfo[] = [];\n const byName: KeyValue<RefIdInfo> = {};\n for (const frame of input) {\n if (frame.refId) {\n let v = byName[frame.refId];\n if (!v) {\n v = byName[frame.refId] = {\n refId: frame.refId,\n count: 0,\n };\n allNames.push(v);\n }\n v.count++;\n }\n }\n\n if (configuredOptions.length) {\n const options: RefIdInfo[] = [];\n const selected: RefIdInfo[] = [];\n for (const v of allNames) {\n if (configuredOptions.includes(v.refId)) {\n selected.push(v);\n }\n options.push(v);\n }\n\n this.setState({\n options,\n selected: selected.map((s) => s.refId),\n });\n } else {\n this.setState({ options: allNames, selected: [] });\n }\n }\n\n onFieldToggle = (fieldName: string) => {\n const { selected } = this.state;\n if (selected.indexOf(fieldName) > -1) {\n this.onChange(selected.filter((s) => s !== fieldName));\n } else {\n this.onChange([...selected, fieldName]);\n }\n };\n\n onChange = (selected: string[]) => {\n this.setState({ selected });\n this.props.onChange({\n ...this.props.options,\n include: selected.join('|'),\n });\n };\n\n render() {\n const { options, selected } = this.state;\n return (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\">Series refId</div>\n <HorizontalGroup spacing=\"xs\" align=\"flex-start\" wrap>\n {options.map((o, i) => {\n const label = `${o.refId}${o.count > 1 ? ' (' + o.count + ')' : ''}`;\n const isSelected = selected.indexOf(o.refId) > -1;\n return (\n <FilterPill\n key={`${o.refId}/${i}`}\n onClick={() => {\n this.onFieldToggle(o.refId);\n }}\n label={label}\n selected={isSelected}\n />\n );\n })}\n </HorizontalGroup>\n </div>\n </div>\n );\n }\n}\n\nexport const filterFramesByRefIdTransformRegistryItem: TransformerRegistryItem<FilterFramesByRefIdTransformerOptions> =\n {\n id: DataTransformerID.filterByRefId,\n editor: FilterByRefIdTransformerEditor,\n transformation: standardTransformers.filterFramesByRefIdTransformer,\n name: 'Filter data by query',\n description:\n 'Filter data by query. This is useful if you are sharing the results from a different panel that has many queries and you want to only visualize a subset of that in this panel.',\n };\n","import { useMemo } from 'react';\n\nimport { DataFrame, getFieldDisplayName } from '@grafana/data';\n\nexport function useAllFieldNamesFromDataFrames(input: DataFrame[]): string[] {\n return useMemo(() => {\n if (!Array.isArray(input)) {\n return [];\n }\n\n return Object.keys(\n input.reduce((names, frame) => {\n if (!frame || !Array.isArray(frame.fields)) {\n return names;\n }\n\n return frame.fields.reduce((names, field) => {\n const t = getFieldDisplayName(field, frame, input);\n names[t] = true;\n return names;\n }, names);\n }, {} as Record<string, boolean>)\n );\n }, [input]);\n}\n\nexport function getDistinctLabels(input: DataFrame[]): Set<string> {\n const distinct = new Set<string>();\n for (const frame of input) {\n for (const field of frame.fields) {\n if (field.labels) {\n for (const k of Object.keys(field.labels)) {\n distinct.add(k);\n }\n }\n }\n }\n return distinct;\n}\n","import { css, cx } from '@emotion/css';\nimport React, { useCallback } from 'react';\n\nimport {\n DataTransformerID,\n ReducerID,\n SelectableValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport {\n GroupByFieldOptions,\n GroupByOperationID,\n GroupByTransformerOptions,\n} from '@grafana/data/src/transformations/transformers/groupBy';\nimport { Select, StatsPicker, stylesFactory } from '@grafana/ui';\n\nimport { useAllFieldNamesFromDataFrames } from '../utils';\n\ninterface FieldProps {\n fieldName: string;\n config?: GroupByFieldOptions;\n onConfigChange: (config: GroupByFieldOptions) => void;\n}\n\nexport const GroupByTransformerEditor: React.FC<TransformerUIProps<GroupByTransformerOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const fieldNames = useAllFieldNamesFromDataFrames(input);\n\n const onConfigChange = useCallback(\n (fieldName: string) => (config: GroupByFieldOptions) => {\n onChange({\n ...options,\n fields: {\n ...options.fields,\n [fieldName]: config,\n },\n });\n },\n // Adding options to the dependency array causes infinite loop here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onChange]\n );\n\n return (\n <div>\n {fieldNames.map((key) => (\n <GroupByFieldConfiguration\n onConfigChange={onConfigChange(key)}\n fieldName={key}\n config={options.fields[key]}\n key={key}\n />\n ))}\n </div>\n );\n};\n\nconst options = [\n { label: 'Group by', value: GroupByOperationID.groupBy },\n { label: 'Calculate', value: GroupByOperationID.aggregate },\n];\n\nexport const GroupByFieldConfiguration: React.FC<FieldProps> = ({ fieldName, config, onConfigChange }) => {\n const styles = getStyling();\n\n const onChange = useCallback(\n (value: SelectableValue<GroupByOperationID | null>) => {\n onConfigChange({\n aggregations: config?.aggregations ?? [],\n operation: value?.value ?? null,\n });\n },\n [config, onConfigChange]\n );\n\n return (\n <div className={cx('gf-form-inline', styles.row)}>\n <div className={cx('gf-form', styles.fieldName)}>\n <div className={cx('gf-form-label', styles.rowSpacing)}>{fieldName}</div>\n </div>\n\n <div className={cx('gf-form', styles.cell)}>\n <div className={cx('gf-form-spacing', styles.rowSpacing)}>\n <Select\n className=\"width-12\"\n options={options}\n value={config?.operation}\n placeholder=\"Ignored\"\n onChange={onChange}\n isClearable\n />\n </div>\n </div>\n\n {config?.operation === GroupByOperationID.aggregate && (\n <div className={cx('gf-form', 'gf-form--grow', styles.calculations)}>\n <StatsPicker\n className={cx('flex-grow-1', styles.rowSpacing)}\n placeholder=\"Select Stats\"\n allowMultiple\n stats={config.aggregations}\n onChange={(stats) => {\n onConfigChange({ ...config, aggregations: stats as ReducerID[] });\n }}\n />\n </div>\n )}\n </div>\n );\n};\n\nconst getStyling = stylesFactory(() => {\n const cell = css`\n display: table-cell;\n `;\n\n return {\n row: css`\n display: table-row;\n `,\n cell: cell,\n rowSpacing: css`\n margin-bottom: 4px;\n `,\n fieldName: css`\n ${cell}\n min-width: 250px;\n white-space: nowrap;\n `,\n calculations: css`\n ${cell}\n width: 99%;\n `,\n };\n});\n\nexport const groupByTransformRegistryItem: TransformerRegistryItem<GroupByTransformerOptions> = {\n id: DataTransformerID.groupBy,\n editor: GroupByTransformerEditor,\n transformation: standardTransformers.groupByTransformer,\n name: standardTransformers.groupByTransformer.name,\n description: standardTransformers.groupByTransformer.description,\n};\n","import React, { useCallback } from 'react';\n\nimport {\n DataTransformerID,\n SelectableValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n GroupingToMatrixTransformerOptions,\n} from '@grafana/data';\nimport { InlineField, InlineFieldRow, Select } from '@grafana/ui';\n\nimport { useAllFieldNamesFromDataFrames } from '../utils';\n\nexport const GroupingToMatrixTransformerEditor: React.FC<TransformerUIProps<GroupingToMatrixTransformerOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const fieldNames = useAllFieldNamesFromDataFrames(input).map((item: string) => ({ label: item, value: item }));\n\n const onSelectColumn = useCallback(\n (value: SelectableValue<string>) => {\n onChange({\n ...options,\n columnField: value.value,\n });\n },\n [onChange, options]\n );\n\n const onSelectRow = useCallback(\n (value: SelectableValue<string>) => {\n onChange({\n ...options,\n rowField: value.value,\n });\n },\n [onChange, options]\n );\n\n const onSelectValue = useCallback(\n (value: SelectableValue<string>) => {\n onChange({\n ...options,\n valueField: value.value,\n });\n },\n [onChange, options]\n );\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Column\" labelWidth={8}>\n <Select options={fieldNames} value={options.columnField} onChange={onSelectColumn} isClearable />\n </InlineField>\n <InlineField label=\"Row\" labelWidth={8}>\n <Select options={fieldNames} value={options.rowField} onChange={onSelectRow} isClearable />\n </InlineField>\n <InlineField label=\"Cell Value\" labelWidth={10}>\n <Select options={fieldNames} value={options.valueField} onChange={onSelectValue} isClearable />\n </InlineField>\n </InlineFieldRow>\n </>\n );\n};\n\nexport const groupingToMatrixTransformRegistryItem: TransformerRegistryItem<GroupingToMatrixTransformerOptions> = {\n id: DataTransformerID.groupingToMatrix,\n editor: GroupingToMatrixTransformerEditor,\n transformation: standardTransformers.groupingToMatrixTransformer,\n name: 'Grouping to matrix',\n description: `Takes a three fields combination and produces a Matrix`,\n};\n","import React, { useCallback } from 'react';\n\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport {\n HistogramTransformerOptions,\n histogramFieldInfo,\n} from '@grafana/data/src/transformations/transformers/histogram';\nimport { InlineField, InlineFieldRow, InlineSwitch } from '@grafana/ui';\nimport { NumberInput } from 'app/core/components/OptionsUI/NumberInput';\n\nexport const HistogramTransformerEditor: React.FC<TransformerUIProps<HistogramTransformerOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const labelWidth = 18;\n\n const onBucketSizeChanged = useCallback(\n (val?: number) => {\n onChange({\n ...options,\n bucketSize: val,\n });\n },\n [onChange, options]\n );\n\n const onBucketOffsetChanged = useCallback(\n (val?: number) => {\n onChange({\n ...options,\n bucketOffset: val,\n });\n },\n [onChange, options]\n );\n\n const onToggleCombine = useCallback(() => {\n onChange({\n ...options,\n combine: !options.combine,\n });\n }, [onChange, options]);\n\n return (\n <div>\n <InlineFieldRow>\n <InlineField\n labelWidth={labelWidth}\n label={histogramFieldInfo.bucketSize.name}\n tooltip={histogramFieldInfo.bucketSize.description}\n >\n <NumberInput value={options.bucketSize} placeholder=\"auto\" onChange={onBucketSizeChanged} min={0} />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField\n labelWidth={labelWidth}\n label={histogramFieldInfo.bucketOffset.name}\n tooltip={histogramFieldInfo.bucketOffset.description}\n >\n <NumberInput value={options.bucketOffset} placeholder=\"none\" onChange={onBucketOffsetChanged} min={0} />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField\n labelWidth={labelWidth}\n label={histogramFieldInfo.combine.name}\n tooltip={histogramFieldInfo.combine.description}\n >\n <InlineSwitch value={options.combine ?? false} onChange={onToggleCombine} />\n </InlineField>\n </InlineFieldRow>\n </div>\n );\n};\n\nexport const histogramTransformRegistryItem: TransformerRegistryItem<HistogramTransformerOptions> = {\n id: DataTransformerID.histogram,\n editor: HistogramTransformerEditor,\n transformation: standardTransformers.histogramTransformer,\n name: standardTransformers.histogramTransformer.name,\n description: standardTransformers.histogramTransformer.description,\n};\n","import React, { useMemo } from 'react';\n\nimport {\n DataTransformerID,\n SelectableValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport {\n LabelsToFieldsMode,\n LabelsToFieldsOptions,\n} from '@grafana/data/src/transformations/transformers/labelsToFields';\nimport { Stack } from '@grafana/experimental';\nimport { InlineField, InlineFieldRow, RadioButtonGroup, Select, FilterPill } from '@grafana/ui';\n\nconst modes: Array<SelectableValue<LabelsToFieldsMode>> = [\n { value: LabelsToFieldsMode.Columns, label: 'Columns' },\n { value: LabelsToFieldsMode.Rows, label: 'Rows' },\n];\n\nexport const LabelsAsFieldsTransformerEditor: React.FC<TransformerUIProps<LabelsToFieldsOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const labelWidth = 20;\n\n const { labelNames, selected } = useMemo(() => {\n let labelNames: Array<SelectableValue<string>> = [];\n let uniqueLabels: Record<string, boolean> = {};\n\n for (const frame of input) {\n for (const field of frame.fields) {\n if (!field.labels) {\n continue;\n }\n\n for (const labelName of Object.keys(field.labels)) {\n if (!uniqueLabels[labelName]) {\n labelNames.push({ value: labelName, label: labelName });\n uniqueLabels[labelName] = true;\n }\n }\n }\n }\n\n const selected = new Set(options.keepLabels?.length ? options.keepLabels : Object.keys(uniqueLabels));\n return { labelNames, selected };\n }, [options.keepLabels, input]);\n\n const onValueLabelChange = (value: SelectableValue<string> | null) => {\n onChange({ ...options, valueLabel: value?.value });\n };\n\n const onToggleSelection = (v: string) => {\n if (selected.has(v)) {\n selected.delete(v);\n } else {\n selected.add(v);\n }\n if (selected.size === labelNames.length || !selected.size) {\n const { keepLabels, ...rest } = options;\n onChange(rest);\n } else {\n onChange({ ...options, keepLabels: [...selected] });\n }\n };\n\n return (\n <div>\n <InlineFieldRow>\n <InlineField label={'Mode'} labelWidth={labelWidth}>\n <RadioButtonGroup\n options={modes}\n value={options.mode ?? LabelsToFieldsMode.Columns}\n onChange={(v) => onChange({ ...options, mode: v })}\n />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label={'Labels'} labelWidth={labelWidth}>\n <Stack gap={1} wrap>\n {labelNames.map((o, i) => {\n const label = o.label!;\n return (\n <FilterPill\n key={`${label}/${i}`}\n onClick={() => onToggleSelection(label)}\n label={label}\n selected={selected.has(label)}\n />\n );\n })}\n </Stack>\n </InlineField>\n </InlineFieldRow>\n {options.mode !== LabelsToFieldsMode.Rows && (\n <InlineFieldRow>\n <InlineField\n label={'Value field name'}\n labelWidth={labelWidth}\n tooltip=\"Replace the value field name with a label\"\n htmlFor=\"labels-to-fields-as-name\"\n >\n <Select\n inputId=\"labels-to-fields-as-name\"\n isClearable={true}\n allowCustomValue={false}\n placeholder=\"(Optional) Select label\"\n options={labelNames}\n value={options?.valueLabel}\n onChange={onValueLabelChange}\n className=\"min-width-16\"\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </div>\n );\n};\n\nexport const labelsToFieldsTransformerRegistryItem: TransformerRegistryItem<LabelsToFieldsOptions> = {\n id: DataTransformerID.labelsToFields,\n editor: LabelsAsFieldsTransformerEditor,\n transformation: standardTransformers.labelsToFieldsTransformer,\n name: 'Labels to fields',\n description: `Groups series by time and return labels or tags as fields.\n Useful for showing time series with labels in a table where each label key becomes a separate column`,\n};\n","import React, { FormEvent, useCallback } from 'react';\n\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { LimitTransformerOptions } from '@grafana/data/src/transformations/transformers/limit';\nimport { InlineField, InlineFieldRow, Input } from '@grafana/ui';\n\nexport const LimitTransformerEditor: React.FC<TransformerUIProps<LimitTransformerOptions>> = ({\n options,\n onChange,\n}) => {\n const onSetLimit = useCallback(\n (value: FormEvent<HTMLInputElement>) => {\n onChange({\n ...options,\n limitField: Number(value.currentTarget.value),\n });\n },\n [onChange, options]\n );\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Limit\" labelWidth={8}>\n <Input\n placeholder=\"Limit count\"\n pattern=\"[0-9]*\"\n value={options.limitField}\n onChange={onSetLimit}\n width={25}\n />\n </InlineField>\n </InlineFieldRow>\n </>\n );\n};\n\nexport const limitTransformRegistryItem: TransformerRegistryItem<LimitTransformerOptions> = {\n id: DataTransformerID.limit,\n editor: LimitTransformerEditor,\n transformation: standardTransformers.limitTransformer,\n name: 'Limit',\n description: `Limit the number of items displayed.`,\n};\n","import React from 'react';\n\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { FieldValidationMessage } from '@grafana/ui';\n\nimport { MergeTransformerOptions } from '../../../../../packages/grafana-data/src/transformations/transformers/merge';\n\nexport const MergeTransformerEditor: React.FC<TransformerUIProps<MergeTransformerOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n if (input.length <= 1) {\n // Show warning that merge is useless only apply on a single frame\n return <FieldValidationMessage>Merge has no effect when applied on a single frame.</FieldValidationMessage>;\n }\n return null;\n};\n\nexport const mergeTransformerRegistryItem: TransformerRegistryItem<MergeTransformerOptions> = {\n id: DataTransformerID.merge,\n editor: MergeTransformerEditor,\n transformation: standardTransformers.mergeTransformer,\n name: 'Merge',\n description: `Merge many series/tables and return a single table where mergeable values will be combined into the same row.\n Useful for showing multiple series, tables or a combination of both visualized in a table.`,\n};\n","import { css } from '@emotion/css';\nimport React, { useCallback, useMemo } from 'react';\nimport { DragDropContext, Draggable, Droppable, DropResult } from 'react-beautiful-dnd';\n\nimport {\n DataTransformerID,\n GrafanaTheme,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { createOrderFieldsComparer } from '@grafana/data/src/transformations/transformers/order';\nimport { OrganizeFieldsTransformerOptions } from '@grafana/data/src/transformations/transformers/organize';\nimport { stylesFactory, useTheme, Input, IconButton, Icon, FieldValidationMessage } from '@grafana/ui';\n\nimport { useAllFieldNamesFromDataFrames } from '../utils';\n\ninterface OrganizeFieldsTransformerEditorProps extends TransformerUIProps<OrganizeFieldsTransformerOptions> {}\n\nconst OrganizeFieldsTransformerEditor: React.FC<OrganizeFieldsTransformerEditorProps> = (props) => {\n const { options, input, onChange } = props;\n const { indexByName, excludeByName, renameByName } = options;\n\n const fieldNames = useAllFieldNamesFromDataFrames(input);\n const orderedFieldNames = useMemo(() => orderFieldNamesByIndex(fieldNames, indexByName), [fieldNames, indexByName]);\n\n const onToggleVisibility = useCallback(\n (field: string, shouldExclude: boolean) => {\n onChange({\n ...options,\n excludeByName: {\n ...excludeByName,\n [field]: shouldExclude,\n },\n });\n },\n [onChange, options, excludeByName]\n );\n\n const onDragEnd = useCallback(\n (result: DropResult) => {\n if (!result || !result.destination) {\n return;\n }\n\n const startIndex = result.source.index;\n const endIndex = result.destination.index;\n\n if (startIndex === endIndex) {\n return;\n }\n\n onChange({\n ...options,\n indexByName: reorderToIndex(fieldNames, startIndex, endIndex),\n });\n },\n [onChange, options, fieldNames]\n );\n\n const onRenameField = useCallback(\n (from: string, to: string) => {\n onChange({\n ...options,\n renameByName: {\n ...options.renameByName,\n [from]: to,\n },\n });\n },\n [onChange, options]\n );\n\n // Show warning that we only apply the first frame\n if (input.length > 1) {\n return (\n <FieldValidationMessage>\n Organize fields only works with a single frame. Consider applying a join transformation first.\n </FieldValidationMessage>\n );\n }\n\n return (\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"sortable-fields-transformer\" direction=\"vertical\">\n {(provided) => (\n <div ref={provided.innerRef} {...provided.droppableProps}>\n {orderedFieldNames.map((fieldName, index) => {\n return (\n <DraggableFieldName\n fieldName={fieldName}\n renamedFieldName={renameByName[fieldName]}\n index={index}\n onToggleVisibility={onToggleVisibility}\n onRenameField={onRenameField}\n visible={!excludeByName[fieldName]}\n key={fieldName}\n />\n );\n })}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n );\n};\n\nOrganizeFieldsTransformerEditor.displayName = 'OrganizeFieldsTransformerEditor';\n\ninterface DraggableFieldProps {\n fieldName: string;\n renamedFieldName?: string;\n index: number;\n visible: boolean;\n onToggleVisibility: (fieldName: string, isVisible: boolean) => void;\n onRenameField: (from: string, to: string) => void;\n}\n\nconst DraggableFieldName: React.FC<DraggableFieldProps> = ({\n fieldName,\n renamedFieldName,\n index,\n visible,\n onToggleVisibility,\n onRenameField,\n}) => {\n const theme = useTheme();\n const styles = getFieldNameStyles(theme);\n\n return (\n <Draggable draggableId={fieldName} index={index}>\n {(provided) => (\n <div className=\"gf-form-inline\" ref={provided.innerRef} {...provided.draggableProps}>\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label gf-form-label--justify-left width-30\">\n <Icon\n name=\"draggabledots\"\n title=\"Drag and drop to reorder\"\n size=\"lg\"\n className={styles.draggable}\n {...provided.dragHandleProps}\n />\n <IconButton\n className={styles.toggle}\n size=\"md\"\n name={visible ? 'eye' : 'eye-slash'}\n onClick={() => onToggleVisibility(fieldName, visible)}\n />\n <span className={styles.name} title={fieldName}>\n {fieldName}\n </span>\n </div>\n <Input\n className=\"flex-grow-1\"\n defaultValue={renamedFieldName || ''}\n placeholder={`Rename ${fieldName}`}\n onBlur={(event) => onRenameField(fieldName, event.currentTarget.value)}\n />\n </div>\n </div>\n )}\n </Draggable>\n );\n};\n\nDraggableFieldName.displayName = 'DraggableFieldName';\n\nconst getFieldNameStyles = stylesFactory((theme: GrafanaTheme) => ({\n toggle: css`\n margin: 0 8px;\n color: ${theme.colors.textWeak};\n `,\n draggable: css`\n opacity: 0.4;\n &:hover {\n color: ${theme.colors.textStrong};\n }\n `,\n name: css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.weight.semibold};\n `,\n}));\n\nconst reorderToIndex = (fieldNames: string[], startIndex: number, endIndex: number) => {\n const result = Array.from(fieldNames);\n const [removed] = result.splice(startIndex, 1);\n result.splice(endIndex, 0, removed);\n\n return result.reduce((nameByIndex, fieldName, index) => {\n nameByIndex[fieldName] = index;\n return nameByIndex;\n }, {} as Record<string, number>);\n};\n\nconst orderFieldNamesByIndex = (fieldNames: string[], indexByName: Record<string, number> = {}): string[] => {\n if (!indexByName || Object.keys(indexByName).length === 0) {\n return fieldNames;\n }\n const comparer = createOrderFieldsComparer(indexByName);\n return fieldNames.sort(comparer);\n};\n\nexport const organizeFieldsTransformRegistryItem: TransformerRegistryItem<OrganizeFieldsTransformerOptions> = {\n id: DataTransformerID.organize,\n editor: OrganizeFieldsTransformerEditor,\n transformation: standardTransformers.organizeFieldsTransformer,\n name: 'Organize fields',\n description:\n \"Allows the user to re-order, hide, or rename fields / columns. Useful when data source doesn't allow overrides for visualizing data.\",\n};\n","import React, { useCallback } from 'react';\n\nimport {\n DataTransformerID,\n ReducerID,\n SelectableValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { LegacyForms, Select, StatsPicker } from '@grafana/ui';\n\n// TODO: Minimal implementation, needs some <3\nexport const ReduceTransformerEditor: React.FC<TransformerUIProps<ReduceTransformerOptions>> = ({\n options,\n onChange,\n}) => {\n const modes: Array<SelectableValue<ReduceTransformerMode>> = [\n {\n label: 'Series to rows',\n value: ReduceTransformerMode.SeriesToRows,\n description: 'Create a table with one row for each series value',\n },\n {\n label: 'Reduce fields',\n value: ReduceTransformerMode.ReduceFields,\n description: 'Collapse each field into a single value',\n },\n ];\n\n const onSelectMode = useCallback(\n (value: SelectableValue<ReduceTransformerMode>) => {\n const mode = value.value!;\n onChange({\n ...options,\n mode,\n includeTimeField: mode === ReduceTransformerMode.ReduceFields ? !!options.includeTimeField : false,\n });\n },\n [onChange, options]\n );\n\n const onToggleTime = useCallback(() => {\n onChange({\n ...options,\n includeTimeField: !options.includeTimeField,\n });\n }, [onChange, options]);\n\n const onToggleLabels = useCallback(() => {\n onChange({\n ...options,\n labelsToFields: !options.labelsToFields,\n });\n }, [onChange, options]);\n\n return (\n <>\n <div>\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\" aria-label={selectors.components.Transforms.Reduce.modeLabel}>\n Mode\n </div>\n <Select\n options={modes}\n value={modes.find((v) => v.value === options.mode) || modes[0]}\n onChange={onSelectMode}\n className=\"flex-grow-1\"\n />\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\" aria-label={selectors.components.Transforms.Reduce.calculationsLabel}>\n Calculations\n </div>\n <StatsPicker\n className=\"flex-grow-1\"\n placeholder=\"Choose Stat\"\n allowMultiple\n stats={options.reducers || []}\n onChange={(stats) => {\n onChange({\n ...options,\n reducers: stats as ReducerID[],\n });\n }}\n />\n </div>\n </div>\n {options.mode === ReduceTransformerMode.ReduceFields && (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <LegacyForms.Switch\n label=\"Include time\"\n labelClass=\"width-8\"\n checked={!!options.includeTimeField}\n onChange={onToggleTime}\n />\n </div>\n </div>\n )}\n {options.mode !== ReduceTransformerMode.ReduceFields && (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form\">\n <LegacyForms.Switch\n label=\"Labels to fields\"\n labelClass=\"width-8\"\n checked={!!options.labelsToFields}\n onChange={onToggleLabels}\n />\n </div>\n </div>\n )}\n </>\n );\n};\n\nexport const reduceTransformRegistryItem: TransformerRegistryItem<ReduceTransformerOptions> = {\n id: DataTransformerID.reduce,\n editor: ReduceTransformerEditor,\n transformation: standardTransformers.reduceTransformer,\n name: standardTransformers.reduceTransformer.name,\n description: standardTransformers.reduceTransformer.description,\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n DataTransformerID,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n stringToJsRegex,\n} from '@grafana/data';\nimport { RenameByRegexTransformerOptions } from '@grafana/data/src/transformations/transformers/renameByRegex';\nimport { Field, Input } from '@grafana/ui';\n\ninterface RenameByRegexTransformerEditorProps extends TransformerUIProps<RenameByRegexTransformerOptions> {}\n\ninterface RenameByRegexTransformerEditorState {\n regex?: string;\n renamePattern?: string;\n isRegexValid?: boolean;\n}\n\nexport class RenameByRegexTransformerEditor extends React.PureComponent<\n RenameByRegexTransformerEditorProps,\n RenameByRegexTransformerEditorState\n> {\n constructor(props: RenameByRegexTransformerEditorProps) {\n super(props);\n this.state = {\n regex: props.options.regex,\n renamePattern: props.options.renamePattern,\n isRegexValid: true,\n };\n }\n\n handleRegexChange = (e: React.FormEvent<HTMLInputElement>) => {\n const regex = e.currentTarget.value;\n let isRegexValid = true;\n if (regex) {\n try {\n if (regex) {\n stringToJsRegex(regex);\n }\n } catch (e) {\n isRegexValid = false;\n }\n }\n this.setState((previous) => ({ ...previous, regex, isRegexValid }));\n };\n\n handleRenameChange = (e: React.FormEvent<HTMLInputElement>) => {\n const renamePattern = e.currentTarget.value;\n this.setState((previous) => ({ ...previous, renamePattern }));\n };\n\n handleRegexBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const regex = e.currentTarget.value;\n let isRegexValid = true;\n\n try {\n if (regex) {\n stringToJsRegex(regex);\n }\n } catch (e) {\n isRegexValid = false;\n }\n\n this.setState({ isRegexValid }, () => {\n if (isRegexValid) {\n this.props.onChange({ ...this.props.options, regex });\n }\n });\n };\n\n handleRenameBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n const renamePattern = e.currentTarget.value;\n this.setState({ renamePattern }, () => this.props.onChange({ ...this.props.options, renamePattern }));\n };\n\n render() {\n const { regex, renamePattern, isRegexValid } = this.state;\n return (\n <>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\">Match</div>\n <Field\n invalid={!isRegexValid}\n error={!isRegexValid ? 'Invalid pattern' : undefined}\n className={css`\n margin-bottom: 0;\n `}\n >\n <Input\n placeholder=\"Regular expression pattern\"\n value={regex || ''}\n onChange={this.handleRegexChange}\n onBlur={this.handleRegexBlur}\n width={25}\n />\n </Field>\n </div>\n </div>\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\">Replace</div>\n <Field\n className={css`\n margin-bottom: 0;\n `}\n >\n <Input\n placeholder=\"Replacement pattern\"\n value={renamePattern || ''}\n onChange={this.handleRenameChange}\n onBlur={this.handleRenameBlur}\n width={25}\n />\n </Field>\n </div>\n </div>\n </>\n );\n }\n}\n\nexport const renameByRegexTransformRegistryItem: TransformerRegistryItem<RenameByRegexTransformerOptions> = {\n id: DataTransformerID.renameByRegex,\n editor: RenameByRegexTransformerEditor,\n transformation: standardTransformers.renameByRegexTransformer,\n name: 'Rename by regex',\n description: 'Renames part of the query result by using regular expression with placeholders.',\n};\n","import React, { useCallback } from 'react';\n\nimport {\n DataTransformerID,\n SelectableValue,\n standardTransformers,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { SeriesToColumnsOptions } from '@grafana/data/src/transformations/transformers/seriesToColumns';\nimport { Select } from '@grafana/ui';\n\nimport { useAllFieldNamesFromDataFrames } from '../utils';\n\nexport const SeriesToFieldsTransformerEditor: React.FC<TransformerUIProps<SeriesToColumnsOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const fieldNames = useAllFieldNamesFromDataFrames(input).map((item: string) => ({ label: item, value: item }));\n\n const onSelectField = useCallback(\n (value: SelectableValue<string>) => {\n onChange({\n ...options,\n byField: value.value,\n });\n },\n [onChange, options]\n );\n\n return (\n <div className=\"gf-form-inline\">\n <div className=\"gf-form gf-form--grow\">\n <div className=\"gf-form-label width-8\">Field name</div>\n <Select options={fieldNames} value={options.byField} onChange={onSelectField} isClearable />\n </div>\n </div>\n );\n};\n\nexport const seriesToFieldsTransformerRegistryItem: TransformerRegistryItem<SeriesToColumnsOptions> = {\n id: DataTransformerID.seriesToColumns,\n editor: SeriesToFieldsTransformerEditor,\n transformation: standardTransformers.seriesToColumnsTransformer,\n name: 'Outer join',\n description:\n 'Joins many time series/tables by a field. This can be used to outer join multiple time series on the _time_ field to show many time series in one table.',\n};\n","import React from 'react';\n\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { SeriesToRowsTransformerOptions } from '@grafana/data/src/transformations/transformers/seriesToRows';\n\nexport const SeriesToRowsTransformerEditor: React.FC<TransformerUIProps<SeriesToRowsTransformerOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n return null;\n};\n\nexport const seriesToRowsTransformerRegistryItem: TransformerRegistryItem<SeriesToRowsTransformerOptions> = {\n id: DataTransformerID.seriesToRows,\n editor: SeriesToRowsTransformerEditor,\n transformation: standardTransformers.seriesToRowsTransformer,\n name: 'Series to rows',\n description: `Merge many series and return a single series with time, metric and value as columns.\n Useful for showing multiple time series visualized in a table.`,\n};\n","import React, { useCallback } from 'react';\n\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { SortByField, SortByTransformerOptions } from '@grafana/data/src/transformations/transformers/sortBy';\nimport { InlineField, InlineSwitch, InlineFieldRow, Select } from '@grafana/ui';\n\nimport { useAllFieldNamesFromDataFrames } from '../utils';\n\nexport const SortByTransformerEditor: React.FC<TransformerUIProps<SortByTransformerOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const fieldNames = useAllFieldNamesFromDataFrames(input).map((item: string) => ({ label: item, value: item }));\n\n // Only supports single sort for now\n const onSortChange = useCallback(\n (idx: number, cfg: SortByField) => {\n onChange({ ...options, sort: [cfg] });\n },\n [onChange, options]\n );\n\n const sorts = options.sort?.length ? options.sort : [{} as SortByField];\n\n return (\n <div>\n {sorts.map((s, index) => {\n return (\n <InlineFieldRow key={`${s.field}/${index}`}>\n <InlineField label=\"Field\" labelWidth={10} grow={true}>\n <Select\n options={fieldNames}\n value={s.field}\n placeholder=\"Select field\"\n onChange={(v) => {\n onSortChange(index, { ...s, field: v.value! });\n }}\n />\n </InlineField>\n <InlineField label=\"Reverse\">\n <InlineSwitch\n value={!!s.desc}\n onChange={() => {\n onSortChange(index, { ...s, desc: !!!s.desc });\n }}\n />\n </InlineField>\n </InlineFieldRow>\n );\n })}\n </div>\n );\n};\n\nexport const sortByTransformRegistryItem: TransformerRegistryItem<SortByTransformerOptions> = {\n id: DataTransformerID.sortBy,\n editor: SortByTransformerEditor,\n transformation: standardTransformers.sortByTransformer,\n name: standardTransformers.sortByTransformer.name,\n description: standardTransformers.sortByTransformer.description,\n};\n","import { Registry, RegistryItem } from '@grafana/data';\n\nexport enum FieldExtractorID {\n JSON = 'json',\n KeyValues = 'kvp',\n Auto = 'auto',\n}\n\nexport interface FieldExtractor extends RegistryItem {\n parse: (v: string) => Record<string, any> | undefined;\n}\n\nconst extJSON: FieldExtractor = {\n id: FieldExtractorID.JSON,\n name: 'JSON',\n description: 'Parse JSON string',\n parse: (v: string) => {\n return JSON.parse(v);\n },\n};\n\nfunction parseKeyValuePairs(raw: string): Record<string, string> {\n const buff: string[] = []; // array of characters\n let esc = '';\n let key = '';\n const obj: Record<string, string> = {};\n for (let i = 0; i < raw.length; i++) {\n let c = raw[i];\n if (c === esc) {\n esc = '';\n c = raw[++i];\n }\n\n const isEscaped = c === '\\\\';\n if (isEscaped) {\n c = raw[++i];\n }\n\n // When escaped just append\n if (isEscaped || esc.length) {\n buff.push(c);\n continue;\n }\n\n if (c === `\"` || c === `'`) {\n esc = c;\n }\n\n switch (c) {\n case ':':\n case '=':\n if (buff.length) {\n if (key) {\n obj[key] = '';\n }\n key = buff.join('');\n buff.length = 0; // clear values\n }\n break;\n\n // escape chars\n case `\"`:\n case `'`:\n // whitespace\n case ` `:\n case `\\n`:\n case `\\t`:\n case `\\r`:\n case `\\n`:\n if (buff.length && key === '') {\n obj[buff.join('')] = '';\n buff.length = 0;\n }\n // seperators\n case ',':\n case ';':\n case '&':\n case '{':\n case '}':\n if (buff.length) {\n const val = buff.join('');\n if (key.length) {\n obj[key] = val;\n key = '';\n } else {\n key = val;\n }\n buff.length = 0; // clear values\n }\n break;\n\n // append our buffer\n default:\n buff.push(c);\n if (i === raw.length - 1) {\n if (key === '' && buff.length) {\n obj[buff.join('')] = '';\n buff.length = 0;\n }\n }\n }\n }\n\n if (key.length) {\n obj[key] = buff.join('');\n }\n return obj;\n}\n\nconst extLabels: FieldExtractor = {\n id: FieldExtractorID.KeyValues,\n name: 'Key+value pairs',\n description: 'Look for a=b, c: d values in the line',\n parse: parseKeyValuePairs,\n};\n\nconst fmts = [extJSON, extLabels];\n\nconst extAuto: FieldExtractor = {\n id: FieldExtractorID.Auto,\n name: 'Auto',\n description: 'parse new fields automatically',\n parse: (v: string) => {\n for (const f of fmts) {\n try {\n const r = f.parse(v);\n if (r != null) {\n return r;\n }\n } catch {} // ignore errors\n }\n return undefined;\n },\n};\n\nexport const fieldExtractors = new Registry<FieldExtractor>(() => [...fmts, extAuto]);\n","import { isString } from 'lodash';\nimport { map } from 'rxjs/operators';\n\nimport {\n ArrayVector,\n DataFrame,\n DataTransformerID,\n Field,\n FieldType,\n getFieldTypeFromValue,\n SynchronousDataTransformerInfo,\n} from '@grafana/data';\nimport { findField } from 'app/features/dimensions';\n\nimport { FieldExtractorID, fieldExtractors } from './fieldExtractors';\n\nexport interface ExtractFieldsOptions {\n source?: string;\n format?: FieldExtractorID;\n replace?: boolean;\n}\n\nexport const extractFieldsTransformer: SynchronousDataTransformerInfo<ExtractFieldsOptions> = {\n id: DataTransformerID.extractFields,\n name: 'Extract fields',\n description: 'Parse fields from the contends of another',\n defaultOptions: {},\n\n operator: (options) => (source) => source.pipe(map((data) => extractFieldsTransformer.transformer(options)(data))),\n\n transformer: (options: ExtractFieldsOptions) => {\n return (data: DataFrame[]) => {\n return data.map((v) => addExtractedFields(v, options));\n };\n },\n};\n\nfunction addExtractedFields(frame: DataFrame, options: ExtractFieldsOptions): DataFrame {\n if (!options.source) {\n return frame;\n }\n const source = findField(frame, options.source);\n if (!source) {\n // this case can happen when there are multiple queries\n return frame;\n }\n\n const ext = fieldExtractors.getIfExists(options.format ?? FieldExtractorID.Auto);\n if (!ext) {\n throw new Error('unkonwn extractor');\n }\n\n const count = frame.length;\n const names: string[] = []; // keep order\n const values = new Map<string, any[]>();\n\n for (let i = 0; i < count; i++) {\n let obj = source.values.get(i);\n if (isString(obj)) {\n try {\n obj = ext.parse(obj);\n } catch {\n obj = {}; // empty\n }\n }\n for (const [key, val] of Object.entries(obj)) {\n let buffer = values.get(key);\n if (buffer == null) {\n buffer = new Array(count);\n values.set(key, buffer);\n names.push(key);\n }\n buffer[i] = val;\n }\n }\n\n const fields = names.map((name) => {\n const buffer = values.get(name);\n return {\n name,\n values: new ArrayVector(buffer),\n type: buffer ? getFieldTypeFromValue(buffer.find((v) => v != null)) : FieldType.other,\n config: {},\n } as Field;\n });\n\n if (!options.replace) {\n fields.unshift(...frame.fields);\n }\n return {\n ...frame,\n fields,\n };\n}\n","import React from 'react';\n\nimport {\n DataTransformerID,\n FieldNamePickerConfigSettings,\n SelectableValue,\n StandardEditorsRegistryItem,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { InlineField, InlineFieldRow, InlineSwitch, Select } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\n\nimport { ExtractFieldsOptions, extractFieldsTransformer } from './extractFields';\nimport { FieldExtractorID, fieldExtractors } from './fieldExtractors';\n\nconst fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {\n settings: {\n width: 30,\n placeholderText: 'Select field',\n },\n name: '',\n id: '',\n editor: () => null,\n};\n\nexport const extractFieldsTransformerEditor: React.FC<TransformerUIProps<ExtractFieldsOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const onPickSourceField = (source?: string) => {\n onChange({\n ...options,\n source,\n });\n };\n\n const onFormatChange = (format?: SelectableValue<FieldExtractorID>) => {\n onChange({\n ...options,\n format: format?.value,\n });\n };\n\n const onToggleReplace = () => {\n onChange({\n ...options,\n replace: !options.replace,\n });\n };\n\n const format = fieldExtractors.selectOptions(options.format ? [options.format] : undefined);\n\n return (\n <div>\n <InlineFieldRow>\n <InlineField label={'Source'} labelWidth={16}>\n <FieldNamePicker\n context={{ data: input }}\n value={options.source ?? ''}\n onChange={onPickSourceField}\n item={fieldNamePickerSettings as any}\n />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label={'Format'} labelWidth={16}>\n <Select\n value={format.current[0] as any}\n options={format.options as any}\n onChange={onFormatChange}\n width={24}\n placeholder={'Auto'}\n />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label={'Replace all fields'} labelWidth={16}>\n <InlineSwitch value={options.replace ?? false} onChange={onToggleReplace} />\n </InlineField>\n </InlineFieldRow>\n </div>\n );\n};\n\nexport const extractFieldsTransformRegistryItem: TransformerRegistryItem<ExtractFieldsOptions> = {\n id: DataTransformerID.extractFields,\n editor: extractFieldsTransformerEditor,\n transformation: extractFieldsTransformer,\n name: 'Extract fields',\n description: `Parse fields from content (JSON, labels, etc)`,\n};\n","import { map } from 'rxjs/operators';\n\nimport {\n ArrayVector,\n DataFrame,\n DataTransformerID,\n Field,\n FieldType,\n SynchronousDataTransformerInfo,\n} from '@grafana/data';\n\nimport { getDistinctLabels } from '../utils';\n\nexport interface JoinByLabelsTransformOptions {\n value: string; // something must be defined\n join?: string[];\n}\n\nexport const joinByLabelsTransformer: SynchronousDataTransformerInfo<JoinByLabelsTransformOptions> = {\n id: DataTransformerID.joinByLabels,\n name: 'Join by labels',\n description: 'Flatten labeled results into a table joined by labels',\n defaultOptions: {},\n\n operator: (options) => (source) => source.pipe(map((data) => joinByLabelsTransformer.transformer(options)(data))),\n\n transformer: (options: JoinByLabelsTransformOptions) => {\n return (data: DataFrame[]) => {\n if (!data || !data.length) {\n return data;\n }\n return [joinByLabels(options, data)];\n };\n },\n};\n\ninterface JoinValues {\n keys: string[];\n values: Record<string, number[]>;\n}\n\nexport function joinByLabels(options: JoinByLabelsTransformOptions, data: DataFrame[]): DataFrame {\n if (!options.value?.length) {\n return getErrorFrame('No value labele configured');\n }\n const distinctLabels = getDistinctLabels(data);\n if (distinctLabels.size < 1) {\n return getErrorFrame('No labels in result');\n }\n if (!distinctLabels.has(options.value)) {\n return getErrorFrame('Value label not found');\n }\n\n let join = options.join?.length ? options.join : Array.from(distinctLabels);\n join = join.filter((f) => f !== options.value);\n\n const names = new Set<string>();\n const found = new Map<string, JoinValues>();\n const inputFields: Record<string, Field> = {};\n for (const frame of data) {\n for (const field of frame.fields) {\n if (field.labels && field.type !== FieldType.time) {\n const keys = join.map((v) => field.labels![v]);\n const key = keys.join(',');\n let item = found.get(key);\n if (!item) {\n item = {\n keys,\n values: {},\n };\n found.set(key, item);\n }\n const name = field.labels[options.value];\n const vals = field.values.toArray();\n const old = item.values[name];\n if (old) {\n item.values[name] = old.concat(vals);\n } else {\n item.values[name] = vals;\n }\n if (!inputFields[name]) {\n inputFields[name] = field; // keep the config\n }\n names.add(name);\n }\n }\n }\n\n const allNames = Array.from(names);\n const joinValues = join.map((): string[] => []);\n const nameValues = allNames.map((): number[] => []);\n\n for (const item of found.values()) {\n let valueOffset = -1;\n let done = false;\n while (!done) {\n valueOffset++;\n done = true;\n for (let i = 0; i < join.length; i++) {\n joinValues[i].push(item.keys[i]);\n }\n for (let i = 0; i < allNames.length; i++) {\n const name = allNames[i];\n const values = item.values[name] ?? [];\n nameValues[i].push(values[valueOffset]);\n if (values.length > valueOffset + 1) {\n done = false;\n }\n }\n }\n }\n\n const frame: DataFrame = { fields: [], length: nameValues[0].length };\n for (let i = 0; i < join.length; i++) {\n frame.fields.push({\n name: join[i],\n config: {},\n type: FieldType.string,\n values: new ArrayVector(joinValues[i]),\n });\n }\n\n for (let i = 0; i < allNames.length; i++) {\n const old = inputFields[allNames[i]];\n frame.fields.push({\n name: allNames[i],\n config: {},\n type: old.type ?? FieldType.number,\n values: new ArrayVector(nameValues[i]),\n });\n }\n\n return frame;\n}\n\nfunction getErrorFrame(text: string): DataFrame {\n return {\n meta: {\n notices: [{ severity: 'error', text }],\n },\n fields: [{ name: 'Error', type: FieldType.string, config: {}, values: new ArrayVector([text]) }],\n length: 0,\n };\n}\n","import React, { useMemo } from 'react';\n\nimport { PluginState, SelectableValue, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { Alert, HorizontalGroup, InlineField, InlineFieldRow, Select, ValuePicker } from '@grafana/ui';\n\nimport { getDistinctLabels } from '../utils';\n\nimport { joinByLabelsTransformer, JoinByLabelsTransformOptions } from './joinByLabels';\n\nexport interface Props extends TransformerUIProps<JoinByLabelsTransformOptions> {}\n\nexport function JoinByLabelsTransformerEditor({ input, options, onChange }: Props) {\n const info = useMemo(() => {\n let warn: React.ReactNode = undefined;\n const distinct = getDistinctLabels(input);\n const valueOptions = Array.from(distinct).map((value) => ({ label: value, value }));\n let valueOption = valueOptions.find((v) => v.value === options.value);\n if (!valueOption && options.value) {\n valueOption = { label: `${options.value} (not found)`, value: options.value };\n valueOptions.push(valueOption);\n }\n\n if (!input.length) {\n warn = <Alert title=\"No input found\">No input (or labels) found</Alert>;\n } else if (distinct.size === 0) {\n warn = <Alert title=\"No labels found\">The input does not contain any labels</Alert>;\n }\n\n // Show the selected values\n distinct.delete(options.value);\n const joinOptions = Array.from(distinct).map((value) => ({ label: value, value }));\n\n let addOptions = joinOptions;\n const hasJoin = Boolean(options.join?.length);\n let addText = 'Join';\n if (hasJoin) {\n addOptions = joinOptions.filter((v) => !options.join!.includes(v.value));\n } else {\n addText = joinOptions.map((v) => v.value).join(', '); // all the fields\n }\n\n return { warn, valueOptions, valueOption, joinOptions, addOptions, addText, hasJoin, key: Date.now() };\n }, [options, input]);\n\n const updateJoinValue = (idx: number, value?: string) => {\n if (!options.join) {\n return; // nothing to do\n }\n\n const join = options.join.slice();\n if (!value) {\n join.splice(idx, 1);\n if (!join.length) {\n onChange({ ...options, join: undefined });\n return;\n }\n } else {\n join[idx] = value;\n }\n\n // Remove duplicates and the value field\n const t = new Set(join);\n if (options.value) {\n t.delete(options.value);\n }\n onChange({ ...options, join: Array.from(t) });\n };\n\n const addJoin = (sel: SelectableValue<string>) => {\n const v = sel?.value;\n if (!v) {\n return;\n }\n const join = options.join ? options.join.slice() : [];\n join.push(v);\n onChange({ ...options, join });\n };\n\n const labelWidth = 10;\n const noOptionsMessage = 'No labels found';\n\n return (\n <div>\n {info.warn}\n\n <InlineFieldRow>\n <InlineField\n error=\"required\"\n invalid={!Boolean(options.value?.length)}\n label={'Value'}\n labelWidth={labelWidth}\n tooltip=\"Select the label indicating the values name\"\n >\n <Select\n options={info.valueOptions}\n value={info.valueOption}\n onChange={(v) => onChange({ ...options, value: v.value! })}\n noOptionsMessage={noOptionsMessage}\n />\n </InlineField>\n </InlineFieldRow>\n {info.hasJoin ? (\n options.join!.map((v, idx) => (\n <InlineFieldRow key={v + idx}>\n <InlineField\n label={'Join'}\n labelWidth={labelWidth}\n error=\"Unable to join by the value label\"\n invalid={v === options.value}\n >\n <HorizontalGroup>\n <Select\n options={info.joinOptions}\n value={info.joinOptions.find((o) => o.value === v)}\n isClearable={true}\n onChange={(v) => updateJoinValue(idx, v?.value)}\n noOptionsMessage={noOptionsMessage}\n />\n {Boolean(info.addOptions.length && idx === options.join!.length - 1) && (\n <ValuePicker\n icon=\"plus\"\n label={''}\n options={info.addOptions}\n onChange={addJoin}\n variant=\"secondary\"\n />\n )}\n </HorizontalGroup>\n </InlineField>\n </InlineFieldRow>\n ))\n ) : (\n <>\n {Boolean(info.addOptions.length) && (\n <InlineFieldRow>\n <InlineField label={'Join'} labelWidth={labelWidth}>\n <Select\n options={info.addOptions}\n placeholder={info.addText}\n onChange={addJoin}\n noOptionsMessage={noOptionsMessage}\n />\n </InlineField>\n </InlineFieldRow>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport const joinByLabelsTransformRegistryItem: TransformerRegistryItem<JoinByLabelsTransformOptions> = {\n id: joinByLabelsTransformer.id,\n editor: JoinByLabelsTransformerEditor,\n transformation: joinByLabelsTransformer,\n name: joinByLabelsTransformer.name,\n description: joinByLabelsTransformer.description,\n state: PluginState.beta,\n // help: `\n // ### Use cases\n\n // This transforms labeled results into a table\n // `,\n};\n","import { mergeMap, from } from 'rxjs';\n\nimport {\n ArrayVector,\n DataFrame,\n DataTransformerID,\n Field,\n FieldMatcher,\n FieldMatcherID,\n fieldMatchers,\n DataTransformerInfo,\n} from '@grafana/data';\nimport { COUNTRIES_GAZETTEER_PATH, Gazetteer, getGazetteer } from 'app/features/geo/gazetteer/gazetteer';\n\nexport interface FieldLookupOptions {\n lookupField?: string;\n gazetteer?: string;\n}\n\nexport const fieldLookupTransformer: DataTransformerInfo<FieldLookupOptions> = {\n id: DataTransformerID.fieldLookup,\n name: 'Lookup fields from resource',\n description: 'Retrieve matching data based on specified field',\n defaultOptions: {},\n\n operator: (options) => (source) => source.pipe(mergeMap((data) => from(doGazetteerXform(data, options)))),\n};\n\nasync function doGazetteerXform(frames: DataFrame[], options: FieldLookupOptions): Promise<DataFrame[]> {\n const fieldMatches = fieldMatchers.get(FieldMatcherID.byName).get(options?.lookupField);\n\n const gaz = await getGazetteer(options?.gazetteer ?? COUNTRIES_GAZETTEER_PATH);\n\n if (!gaz.frame) {\n return Promise.reject('missing frame in gazetteer');\n }\n\n return addFieldsFromGazetteer(frames, gaz, fieldMatches);\n}\n\nexport function addFieldsFromGazetteer(frames: DataFrame[], gaz: Gazetteer, matcher: FieldMatcher): DataFrame[] {\n const src = gaz.frame!()?.fields;\n if (!src) {\n return frames;\n }\n\n return frames.map((frame) => {\n const length = frame.length;\n const fields: Field[] = [];\n\n for (const field of frame.fields) {\n fields.push(field);\n\n //if the field matches\n if (matcher(field, frame, frames)) {\n const values = field.values.toArray();\n const sub: any[][] = [];\n for (const f of src) {\n const buffer = new Array(length);\n sub.push(buffer);\n fields.push({ ...f, values: new ArrayVector(buffer) });\n }\n\n // Add all values to the buffer\n for (let v = 0; v < sub.length; v++) {\n const found = gaz.find(values[v]);\n if (found?.index != null) {\n for (let i = 0; i < src.length; i++) {\n sub[i][v] = src[i].values.get(found.index);\n }\n }\n }\n }\n }\n return {\n ...frame,\n fields,\n };\n });\n}\n","import React, { useCallback } from 'react';\n\nimport {\n DataTransformerID,\n FieldNamePickerConfigSettings,\n PluginState,\n StandardEditorsRegistryItem,\n TransformerRegistryItem,\n TransformerUIProps,\n FieldType,\n} from '@grafana/data';\nimport { InlineField, InlineFieldRow } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\nimport { GazetteerPathEditor, GazetteerPathEditorConfigSettings } from 'app/features/geo/editor/GazetteerPathEditor';\n\nimport { FieldLookupOptions, fieldLookupTransformer } from './fieldLookup';\n\nconst fieldNamePickerSettings: StandardEditorsRegistryItem<string, FieldNamePickerConfigSettings> = {\n settings: {\n width: 30,\n filter: (f) => f.type === FieldType.string,\n placeholderText: 'Select text field',\n noFieldsMessage: 'No text fields found',\n },\n name: '',\n id: '',\n editor: () => null,\n};\n\nconst fieldLookupSettings: StandardEditorsRegistryItem<string, GazetteerPathEditorConfigSettings> = {\n settings: {},\n} as any;\n\nexport const FieldLookupTransformerEditor: React.FC<TransformerUIProps<FieldLookupOptions>> = ({\n input,\n options,\n onChange,\n}) => {\n const onPickLookupField = useCallback(\n (value: string | undefined) => {\n onChange({\n ...options,\n lookupField: value,\n });\n },\n [onChange, options]\n );\n\n const onPickGazetteer = useCallback(\n (value: string | undefined) => {\n onChange({\n ...options,\n gazetteer: value,\n });\n },\n [onChange, options]\n );\n return (\n <div>\n <InlineFieldRow>\n <InlineField label={'Field'} labelWidth={12}>\n <FieldNamePicker\n context={{ data: input }}\n value={options?.lookupField ?? ''}\n onChange={onPickLookupField}\n item={fieldNamePickerSettings as any}\n />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label={'Lookup'} labelWidth={12}>\n <GazetteerPathEditor\n value={options?.gazetteer ?? ''}\n context={{ data: input }}\n item={fieldLookupSettings}\n onChange={onPickGazetteer}\n />\n </InlineField>\n </InlineFieldRow>\n </div>\n );\n};\n\nexport const fieldLookupTransformRegistryItem: TransformerRegistryItem<FieldLookupOptions> = {\n id: DataTransformerID.fieldLookup,\n editor: FieldLookupTransformerEditor,\n transformation: fieldLookupTransformer,\n name: 'Field lookup',\n description: `Use a field value to lookup additional fields from an external source. This currently supports spatial data, but will eventually support more formats`,\n state: PluginState.alpha,\n};\n","import { map } from 'rxjs/operators';\n\nimport {\n SynchronousDataTransformerInfo,\n DataFrame,\n DataFrameType,\n FieldType,\n DataTransformerID,\n outerJoinDataFrames,\n fieldMatchers,\n FieldMatcherID,\n Field,\n MutableDataFrame,\n ArrayVector,\n} from '@grafana/data';\nimport { Labels } from 'app/types/unified-alerting-dto';\n\n/**\n * There is currently an effort to figure out consistent names\n * for the various formats/types we produce and use.\n *\n * This transformer will eventually include the required metadata that can assert\n * a DataFrame[] is of a given type\n *\n * @internal -- TBD\n */\nexport enum timeSeriesFormat {\n TimeSeriesWide = 'wide', // [time,...values]\n TimeSeriesMany = 'many', // All frames have [time,number]\n TimeSeriesLong = 'long',\n}\n\nexport type PrepareTimeSeriesOptions = {\n format: timeSeriesFormat;\n};\n\n/**\n * Convert to [][time,number]\n */\nexport function toTimeSeriesMany(data: DataFrame[]): DataFrame[] {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n\n const result: DataFrame[] = [];\n for (const frame of toTimeSeriesLong(data)) {\n const timeField = frame.fields[0];\n if (!timeField || timeField.type !== FieldType.time) {\n continue;\n }\n const valueFields: Field[] = [];\n const labelFields: Field[] = [];\n for (const field of frame.fields) {\n switch (field.type) {\n case FieldType.number:\n case FieldType.boolean:\n valueFields.push(field);\n break;\n case FieldType.string:\n labelFields.push(field);\n break;\n }\n }\n\n for (const field of valueFields) {\n if (labelFields.length) {\n // new frame for each label key\n type frameBuilder = {\n time: number[];\n value: number[];\n key: string;\n labels: Labels;\n };\n const builders = new Map<string, frameBuilder>();\n for (let i = 0; i < frame.length; i++) {\n const time = timeField.values.get(i);\n const value = field.values.get(i);\n if (value === undefined || time == null) {\n continue; // skip values left over from join\n }\n\n const key = labelFields.map((f) => f.values.get(i)).join('/');\n let builder = builders.get(key);\n if (!builder) {\n builder = {\n key,\n time: [],\n value: [],\n labels: {},\n };\n for (const label of labelFields) {\n builder.labels[label.name] = label.values.get(i);\n }\n builders.set(key, builder);\n }\n builder.time.push(time);\n builder.value.push(value);\n }\n\n // Add a frame for each distinct value\n for (const b of builders.values()) {\n result.push({\n name: frame.name,\n refId: frame.refId,\n meta: {\n ...frame.meta,\n type: DataFrameType.TimeSeriesMany,\n },\n fields: [\n {\n ...timeField,\n values: new ArrayVector(b.time),\n },\n {\n ...field,\n values: new ArrayVector(b.value),\n labels: b.labels,\n },\n ],\n length: b.time.length,\n });\n }\n } else {\n result.push({\n name: frame.name,\n refId: frame.refId,\n meta: {\n ...frame.meta,\n type: DataFrameType.TimeSeriesMany,\n },\n fields: [timeField, field],\n length: frame.length,\n });\n }\n }\n }\n return result;\n}\n\nexport function toTimeSeriesLong(data: DataFrame[]): DataFrame[] {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n\n const result: DataFrame[] = [];\n for (const frame of data) {\n let timeField: Field | undefined;\n const uniqueValueNames: string[] = [];\n const uniqueValueNamesToType: Record<string, FieldType> = {};\n const uniqueLabelKeys: Record<string, boolean> = {};\n const labelKeyToWideIndices: Record<string, number[]> = {};\n const uniqueFactorNamesToWideIndex: Record<string, number> = {};\n\n for (let fieldIndex = 0; fieldIndex < frame.fields.length; fieldIndex++) {\n const field = frame.fields[fieldIndex];\n\n switch (field.type) {\n case FieldType.string:\n case FieldType.boolean:\n if (field.name in uniqueFactorNamesToWideIndex) {\n // TODO error?\n } else {\n uniqueFactorNamesToWideIndex[field.name] = fieldIndex;\n uniqueLabelKeys[field.name] = true;\n }\n break;\n case FieldType.time:\n if (!timeField) {\n timeField = field;\n break;\n }\n default:\n if (field.name in uniqueValueNamesToType) {\n const type = uniqueValueNamesToType[field.name];\n\n if (field.type !== type) {\n // TODO error?\n continue;\n }\n } else {\n uniqueValueNamesToType[field.name] = field.type;\n uniqueValueNames.push(field.name);\n }\n\n const tKey = JSON.stringify(field.labels);\n const wideIndices = labelKeyToWideIndices[tKey];\n\n if (wideIndices !== undefined) {\n wideIndices.push(fieldIndex);\n } else {\n labelKeyToWideIndices[tKey] = [fieldIndex];\n }\n\n if (field.labels != null) {\n for (const labelKey in field.labels) {\n uniqueLabelKeys[labelKey] = true;\n }\n }\n }\n }\n\n if (!timeField) {\n continue;\n }\n\n type TimeWideRowIndex = {\n time: any;\n wideRowIndex: number;\n };\n const sortedTimeRowIndices: TimeWideRowIndex[] = [];\n const sortedUniqueLabelKeys: string[] = [];\n const uniqueFactorNames: string[] = [];\n const uniqueFactorNamesWithWideIndices: string[] = [];\n\n for (let wideRowIndex = 0; wideRowIndex < frame.length; wideRowIndex++) {\n sortedTimeRowIndices.push({ time: timeField.values.get(wideRowIndex), wideRowIndex: wideRowIndex });\n }\n\n for (const labelKeys in labelKeyToWideIndices) {\n sortedUniqueLabelKeys.push(labelKeys);\n }\n for (const labelKey in uniqueLabelKeys) {\n uniqueFactorNames.push(labelKey);\n }\n for (const name in uniqueFactorNamesToWideIndex) {\n uniqueFactorNamesWithWideIndices.push(name);\n }\n\n sortedTimeRowIndices.sort((a, b) => a.time - b.time);\n sortedUniqueLabelKeys.sort();\n uniqueFactorNames.sort();\n uniqueValueNames.sort();\n\n const longFrame = new MutableDataFrame({\n ...frame,\n meta: { ...frame.meta, type: DataFrameType.TimeSeriesLong },\n fields: [{ name: timeField.name, type: timeField.type }],\n });\n\n for (const name of uniqueValueNames) {\n longFrame.addField({ name: name, type: uniqueValueNamesToType[name] });\n }\n\n for (const name of uniqueFactorNames) {\n longFrame.addField({ name: name, type: FieldType.string });\n }\n\n for (const timeWideRowIndex of sortedTimeRowIndices) {\n const { time, wideRowIndex } = timeWideRowIndex;\n\n for (const labelKeys of sortedUniqueLabelKeys) {\n const rowValues: Record<string, any> = {};\n\n for (const name of uniqueFactorNamesWithWideIndices) {\n rowValues[name] = frame.fields[uniqueFactorNamesToWideIndex[name]].values.get(wideRowIndex);\n }\n\n let index = 0;\n\n for (const wideFieldIndex of labelKeyToWideIndices[labelKeys]) {\n const wideField = frame.fields[wideFieldIndex];\n\n if (index++ === 0 && wideField.labels != null) {\n for (const labelKey in wideField.labels) {\n rowValues[labelKey] = wideField.labels[labelKey];\n }\n }\n\n rowValues[wideField.name] = wideField.values.get(wideRowIndex);\n }\n\n rowValues[timeField.name] = time;\n longFrame.add(rowValues);\n }\n }\n\n result.push(longFrame);\n }\n\n return result;\n}\n\nexport const prepareTimeSeriesTransformer: SynchronousDataTransformerInfo<PrepareTimeSeriesOptions> = {\n id: DataTransformerID.prepareTimeSeries,\n name: 'Prepare time series',\n description: `Will stretch data frames from the wide format into the long format. This is really helpful to be able to keep backwards compatibility for panels not supporting the new wide format.`,\n defaultOptions: {},\n\n operator: (options) => (source) =>\n source.pipe(map((data) => prepareTimeSeriesTransformer.transformer(options)(data))),\n\n transformer: (options: PrepareTimeSeriesOptions) => {\n const format = options?.format ?? timeSeriesFormat.TimeSeriesWide;\n if (format === timeSeriesFormat.TimeSeriesMany) {\n return toTimeSeriesMany;\n } else if (format === timeSeriesFormat.TimeSeriesLong) {\n return toTimeSeriesLong;\n }\n\n return (data: DataFrame[]) => {\n // Join by the first frame\n const frame = outerJoinDataFrames({\n frames: data,\n joinBy: fieldMatchers.get(FieldMatcherID.firstTimeField).get({}),\n keepOriginIndices: true,\n });\n return frame ? [frame] : [];\n };\n },\n};\n","import { css } from '@emotion/css';\nimport React, { useCallback } from 'react';\n\nimport { GrafanaTheme2, SelectableValue, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';\n\nimport { prepareTimeSeriesTransformer, PrepareTimeSeriesOptions, timeSeriesFormat } from './prepareTimeSeries';\n\nconst wideInfo = {\n label: 'Wide time series',\n value: timeSeriesFormat.TimeSeriesWide,\n description: 'Creates a single frame joined by time',\n info: (\n <ul>\n <li>Single frame</li>\n <li>1st field is shared time field</li>\n <li>Time in ascending order</li>\n <li>Multiple value fields of any type</li>\n </ul>\n ),\n};\n\nconst manyInfo = {\n label: 'Multi-frame time series',\n value: timeSeriesFormat.TimeSeriesMany,\n description: 'Creates a new frame for each time/number pair',\n info: (\n <ul>\n <li>Multiple frames</li>\n <li>Each frame has two fields: time, value</li>\n <li>Time in ascending order</li>\n <li>String values are represented as labels</li>\n <li>All values are numeric</li>\n </ul>\n ),\n};\n\nconst longInfo = {\n label: 'Long time series',\n value: timeSeriesFormat.TimeSeriesLong,\n description: 'Convert each frame to long format',\n info: (\n <ul>\n <li>Single frame</li>\n <li>1st field is time field</li>\n <li>Time in ascending order, but may have duplictes</li>\n <li>String values are represented as separate fields rather than as labels</li>\n <li>Multiple value fields may exist</li>\n </ul>\n ),\n};\n\nconst formats: Array<SelectableValue<timeSeriesFormat>> = [wideInfo, manyInfo, longInfo];\n\nexport function PrepareTimeSeriesEditor(props: TransformerUIProps<PrepareTimeSeriesOptions>): React.ReactElement {\n const { options, onChange } = props;\n const styles = useStyles2(getStyles);\n\n const onSelectFormat = useCallback(\n (value: SelectableValue<timeSeriesFormat>) => {\n onChange({\n ...options,\n format: value.value!,\n });\n },\n [onChange, options]\n );\n\n return (\n <>\n <InlineFieldRow>\n <InlineField label=\"Format\" labelWidth={12}>\n <Select\n width={35}\n options={formats}\n value={formats.find((v) => v.value === options.format) || formats[0]}\n onChange={onSelectFormat}\n className=\"flex-grow-1\"\n />\n </InlineField>\n </InlineFieldRow>\n <InlineFieldRow>\n <InlineField label=\"Info\" labelWidth={12}>\n <div className={styles.info}>{(formats.find((v) => v.value === options.format) || formats[0]).info}</div>\n </InlineField>\n </InlineFieldRow>\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n info: css`\n margin-left: 20px;\n `,\n});\n\nexport const prepareTimeseriesTransformerRegistryItem: TransformerRegistryItem<PrepareTimeSeriesOptions> = {\n id: prepareTimeSeriesTransformer.id,\n editor: PrepareTimeSeriesEditor,\n transformation: prepareTimeSeriesTransformer,\n name: prepareTimeSeriesTransformer.name,\n description: prepareTimeSeriesTransformer.description,\n help: `\n ### Use cases\n\n This takes query results and transforms them into a predictable timeseries format.\n This transformer may be especially useful when using old panels that only expect the\n many-frame timeseries format.\n `,\n};\n","import { map } from 'rxjs/operators';\n\nimport {\n ArrayVector,\n DataFrame,\n DataTransformerID,\n DataTransformerInfo,\n Field,\n getFieldDisplayName,\n Labels,\n} from '@grafana/data';\n\nimport {\n getFieldConfigFromFrame,\n FieldToConfigMapping,\n evaluteFieldMappings,\n EvaluatedMappingResult,\n FieldConfigHandlerKey,\n} from '../fieldToConfigMapping/fieldToConfigMapping';\n\nexport interface RowToFieldsTransformOptions {\n nameField?: string;\n valueField?: string;\n mappings?: FieldToConfigMapping[];\n}\n\nexport const rowsToFieldsTransformer: DataTransformerInfo<RowToFieldsTransformOptions> = {\n id: DataTransformerID.rowsToFields,\n name: 'Rows to fields',\n description: 'Convert each row into a field with dynamic config',\n defaultOptions: {},\n\n /**\n * Return a modified copy of the series. If the transform is not or should not\n * be applied, just return the input series\n */\n operator: (options) => (source) =>\n source.pipe(\n map((data) => {\n return data.map((frame) => rowsToFields(options, frame));\n })\n ),\n};\n\nexport function rowsToFields(options: RowToFieldsTransformOptions, data: DataFrame): DataFrame {\n const mappingResult = evaluteFieldMappings(data, options.mappings ?? [], true);\n const { nameField, valueField } = mappingResult;\n\n if (!nameField || !valueField) {\n return data;\n }\n\n const outFields: Field[] = [];\n\n for (let index = 0; index < nameField.values.length; index++) {\n const name = nameField.values.get(index);\n const value = valueField.values.get(index);\n const config = getFieldConfigFromFrame(data, index, mappingResult);\n const labels = getLabelsFromRow(data, index, mappingResult);\n\n const field: Field = {\n name: `${name}`,\n type: valueField.type,\n values: new ArrayVector([value]),\n config: config,\n labels,\n };\n\n outFields.push(field);\n }\n\n return {\n fields: outFields,\n length: 1,\n };\n}\n\nfunction getLabelsFromRow(frame: DataFrame, index: number, mappingResult: EvaluatedMappingResult): Labels {\n const labels = { ...mappingResult.nameField!.labels };\n\n for (let i = 0; i < frame.fields.length; i++) {\n const field = frame.fields[i];\n const fieldName = getFieldDisplayName(field, frame);\n const fieldMapping = mappingResult.index[fieldName];\n\n if (fieldMapping.handler && fieldMapping.handler.key !== FieldConfigHandlerKey.Label) {\n continue;\n }\n\n const value = field.values.get(index);\n if (value != null) {\n labels[fieldName] = value;\n }\n }\n\n return labels;\n}\n","import React from 'react';\n\nimport { PluginState, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\n\nimport { FieldToConfigMappingEditor } from '../fieldToConfigMapping/FieldToConfigMappingEditor';\n\nimport { rowsToFieldsTransformer, RowToFieldsTransformOptions } from './rowsToFields';\n\nexport interface Props extends TransformerUIProps<RowToFieldsTransformOptions> {}\n\nexport function RowsToFieldsTransformerEditor({ input, options, onChange }: Props) {\n if (input.length === 0) {\n return null;\n }\n\n return (\n <div>\n <FieldToConfigMappingEditor\n frame={input[0]}\n mappings={options.mappings ?? []}\n onChange={(mappings) => onChange({ ...options, mappings })}\n withNameAndValue={true}\n />\n </div>\n );\n}\n\nexport const rowsToFieldsTransformRegistryItem: TransformerRegistryItem<RowToFieldsTransformOptions> = {\n id: rowsToFieldsTransformer.id,\n editor: RowsToFieldsTransformerEditor,\n transformation: rowsToFieldsTransformer,\n name: rowsToFieldsTransformer.name,\n description: rowsToFieldsTransformer.description,\n state: PluginState.beta,\n help: `\n### Use cases \n\nThis transforms rows into separate fields. This can be useful as fields can be styled and configured \nindividually, something rows cannot. It can also use additional fields as sources for dynamic field \nconfiguration or map them to field labels. The additional labels can then be used to define better \ndisplay names for the resulting fields.\n\nUseful when visualization data in:\n- Gauge\n- Stat\n- Pie chart\n\n## Example\n\nInput:\n\n| Name | Value | Max |\n| ------- | ----- | --- |\n| ServerA | 10 | 100 |\n| ServerB | 20 | 200 |\n| ServerC | 30 | 300 |\n\nOutput:\n\n| ServerA (config: max=100) | ServerB (config: max=200) | ServerC (config: max=300) |\n| ------------------------- | ------------------------- | ------------------------- |\n| 10 | 20 | 30 |\n\nAs you can see each row in the source data becomes a separate field. Each field now also has a max \nconfig option set. Options like **Min**, **Max**, **Unit** and **Thresholds** are all part of field \nconfiguration and if set like this will be used by the visualization instead of any options manually \nconfigured in the panel editor options pane.\n\n`,\n};\n","import { mergeMap, from } from 'rxjs';\n\nimport { ArrayVector, DataFrame, DataTransformerID, DataTransformerInfo, FieldType } from '@grafana/data';\nimport { createGeometryCollection, createLineBetween } from 'app/features/geo/format/utils';\nimport { getGeometryField, getLocationMatchers } from 'app/features/geo/utils/location';\n\nimport { SpatialOperation, SpatialAction, SpatialTransformOptions } from './models.gen';\nimport { doGeomeryCalculation, toLineString } from './utils';\n\nexport const spatialTransformer: DataTransformerInfo<SpatialTransformOptions> = {\n id: DataTransformerID.spatial,\n name: 'Spatial operations',\n description: 'Apply spatial operations to query results',\n defaultOptions: {},\n\n operator: (options) => (source) => source.pipe(mergeMap((data) => from(doSetGeometry(data, options)))),\n};\n\nexport function isLineBuilderOption(options: SpatialTransformOptions): boolean {\n return options.action === SpatialAction.Modify && options.modify?.op === SpatialOperation.LineBuilder;\n}\n\nasync function doSetGeometry(frames: DataFrame[], options: SpatialTransformOptions): Promise<DataFrame[]> {\n const location = await getLocationMatchers(options.source);\n if (isLineBuilderOption(options)) {\n const targetLocation = await getLocationMatchers(options.modify?.target);\n return frames.map((frame) => {\n const src = getGeometryField(frame, location);\n const target = getGeometryField(frame, targetLocation);\n if (src.field && target.field) {\n const fields = [...frame.fields];\n const line = createLineBetween(src.field, target.field);\n const first = fields[0];\n if (first.type === FieldType.geo && first !== src.field && first !== target.field) {\n fields[0] = createGeometryCollection(first, line); //\n } else {\n fields.unshift(line);\n }\n return {\n ...frame,\n fields,\n };\n }\n return frame;\n });\n }\n\n return frames.map((frame) => {\n let info = getGeometryField(frame, location);\n if (info.field) {\n if (options.action === SpatialAction.Modify) {\n switch (options.modify?.op) {\n // SOON: extent, convex hull, etc\n case SpatialOperation.AsLine:\n let name = info.field.name;\n if (!name || name === 'Point') {\n name = 'Line';\n }\n return {\n ...frame,\n length: 1,\n fields: [\n {\n ...info.field,\n name,\n type: FieldType.geo,\n values: new ArrayVector([toLineString(info.field)]),\n },\n ],\n };\n }\n return frame;\n }\n\n const fields = info.derived ? [info.field, ...frame.fields] : frame.fields.slice(0);\n if (options.action === SpatialAction.Calculate) {\n fields.push(doGeomeryCalculation(info.field, options.calculate ?? {}));\n info.derived = true;\n }\n\n if (info.derived) {\n return {\n ...frame,\n fields,\n };\n }\n }\n return frame;\n });\n}\n","import { css } from '@emotion/css';\nimport React, { useEffect } from 'react';\n\nimport {\n DataTransformerID,\n FrameGeometrySource,\n FrameGeometrySourceMode,\n GrafanaTheme2,\n PanelOptionsEditorBuilder,\n PluginState,\n StandardEditorContext,\n TransformerRegistryItem,\n TransformerUIProps,\n} from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\nimport { addLocationFields } from 'app/features/geo/editor/locationEditor';\n\nimport { SpatialCalculation, SpatialOperation, SpatialAction, SpatialTransformOptions } from './models.gen';\nimport { getDefaultOptions, getTransformerOptionPane } from './optionsHelper';\nimport { isLineBuilderOption, spatialTransformer } from './spatialTransformer';\n\n// Nothing defined in state\nconst supplier = (\n builder: PanelOptionsEditorBuilder<SpatialTransformOptions>,\n context: StandardEditorContext<SpatialTransformOptions>\n) => {\n const options = context.options ?? {};\n\n builder.addSelect({\n path: `action`,\n name: 'Action',\n description: '',\n defaultValue: SpatialAction.Prepare,\n settings: {\n options: [\n {\n value: SpatialAction.Prepare,\n label: 'Prepare spatial field',\n description: 'Set a geometry field based on the results of other fields',\n },\n {\n value: SpatialAction.Calculate,\n label: 'Calculate value',\n description: 'Use the geometry to define a new field (heading/distance/area)',\n },\n { value: SpatialAction.Modify, label: 'Transform', description: 'Apply spatial operations to the geometry' },\n ],\n },\n });\n\n if (options.action === SpatialAction.Calculate) {\n builder.addSelect({\n path: `calculate.calc`,\n name: 'Function',\n description: '',\n defaultValue: SpatialCalculation.Heading,\n settings: {\n options: [\n { value: SpatialCalculation.Heading, label: 'Heading' },\n { value: SpatialCalculation.Area, label: 'Area' },\n { value: SpatialCalculation.Distance, label: 'Distance' },\n ],\n },\n });\n } else if (options.action === SpatialAction.Modify) {\n builder.addSelect({\n path: `modify.op`,\n name: 'Operation',\n description: '',\n defaultValue: SpatialOperation.AsLine,\n settings: {\n options: [\n {\n value: SpatialOperation.AsLine,\n label: 'As line',\n description: 'Create a single line feature with a vertex at each row',\n },\n {\n value: SpatialOperation.LineBuilder,\n label: 'Line builder',\n description: 'Create a line between two points',\n },\n ],\n },\n });\n }\n\n if (isLineBuilderOption(options)) {\n builder.addNestedOptions({\n category: ['Source'],\n path: 'source',\n build: (b, c) => {\n const loc = (options.source ?? {}) as FrameGeometrySource;\n if (!loc.mode) {\n loc.mode = FrameGeometrySourceMode.Auto;\n }\n addLocationFields('Point', '', b, loc);\n },\n });\n\n builder.addNestedOptions({\n category: ['Target'],\n path: 'modify',\n build: (b, c) => {\n const loc = (options.modify?.target ?? {}) as FrameGeometrySource;\n if (!loc.mode) {\n loc.mode = FrameGeometrySourceMode.Auto;\n }\n addLocationFields('Point', 'target.', b, loc);\n },\n });\n } else {\n addLocationFields('Location', 'source.', builder, options.source);\n }\n};\n\nexport const SetGeometryTransformerEditor: React.FC<TransformerUIProps<SpatialTransformOptions>> = (props) => {\n // a new component is created with every change :(\n useEffect(() => {\n if (!props.options.source?.mode) {\n const opts = getDefaultOptions(supplier);\n props.onChange({ ...opts, ...props.options });\n console.log('geometry useEffect', opts);\n }\n });\n\n const styles = getStyles(useTheme2());\n\n const pane = getTransformerOptionPane<SpatialTransformOptions>(props, supplier);\n return (\n <div>\n <div>{pane.items.map((v) => v.render())}</div>\n <div>\n {pane.categories.map((c) => {\n return (\n <div key={c.props.id} className={styles.wrap}>\n <h5>{c.props.title}</h5>\n <div className={styles.item}>{c.items.map((s) => s.render())}</div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n wrap: css`\n margin-bottom: 20px;\n `,\n item: css`\n border-left: 4px solid ${theme.colors.border.strong};\n padding-left: 10px;\n `,\n };\n};\n\nexport const spatialTransformRegistryItem: TransformerRegistryItem<SpatialTransformOptions> = {\n id: DataTransformerID.spatial,\n editor: SetGeometryTransformerEditor,\n transformation: spatialTransformer,\n name: spatialTransformer.name,\n description: spatialTransformer.description,\n state: PluginState.alpha,\n};\n","import { TransformerRegistryItem } from '@grafana/data';\n\nimport { filterByValueTransformRegistryItem } from './FilterByValueTransformer/FilterByValueTransformerEditor';\nimport { heatmapTransformRegistryItem } from './calculateHeatmap/HeatmapTransformerEditor';\nimport { configFromQueryTransformRegistryItem } from './configFromQuery/ConfigFromQueryTransformerEditor';\nimport { calculateFieldTransformRegistryItem } from './editors/CalculateFieldTransformerEditor';\nimport { concatenateTransformRegistryItem } from './editors/ConcatenateTransformerEditor';\nimport { convertFieldTypeTransformRegistryItem } from './editors/ConvertFieldTypeTransformerEditor';\nimport { filterFieldsByNameTransformRegistryItem } from './editors/FilterByNameTransformerEditor';\nimport { filterFramesByRefIdTransformRegistryItem } from './editors/FilterByRefIdTransformerEditor';\nimport { groupByTransformRegistryItem } from './editors/GroupByTransformerEditor';\nimport { groupingToMatrixTransformRegistryItem } from './editors/GroupingToMatrixTransformerEditor';\nimport { histogramTransformRegistryItem } from './editors/HistogramTransformerEditor';\nimport { labelsToFieldsTransformerRegistryItem } from './editors/LabelsToFieldsTransformerEditor';\nimport { limitTransformRegistryItem } from './editors/LimitTransformerEditor';\nimport { mergeTransformerRegistryItem } from './editors/MergeTransformerEditor';\nimport { organizeFieldsTransformRegistryItem } from './editors/OrganizeFieldsTransformerEditor';\nimport { reduceTransformRegistryItem } from './editors/ReduceTransformerEditor';\nimport { renameByRegexTransformRegistryItem } from './editors/RenameByRegexTransformer';\nimport { seriesToFieldsTransformerRegistryItem } from './editors/SeriesToFieldsTransformerEditor';\nimport { seriesToRowsTransformerRegistryItem } from './editors/SeriesToRowsTransformerEditor';\nimport { sortByTransformRegistryItem } from './editors/SortByTransformerEditor';\nimport { extractFieldsTransformRegistryItem } from './extractFields/ExtractFieldsTransformerEditor';\nimport { joinByLabelsTransformRegistryItem } from './joinByLabels/JoinByLabelsTransformerEditor';\nimport { fieldLookupTransformRegistryItem } from './lookupGazetteer/FieldLookupTransformerEditor';\nimport { prepareTimeseriesTransformerRegistryItem } from './prepareTimeSeries/PrepareTimeSeriesEditor';\nimport { rowsToFieldsTransformRegistryItem } from './rowsToFields/RowsToFieldsTransformerEditor';\nimport { spatialTransformRegistryItem } from './spatial/SpatialTransformerEditor';\n\nexport const getStandardTransformers = (): Array<TransformerRegistryItem<any>> => {\n return [\n reduceTransformRegistryItem,\n filterFieldsByNameTransformRegistryItem,\n renameByRegexTransformRegistryItem,\n filterFramesByRefIdTransformRegistryItem,\n filterByValueTransformRegistryItem,\n organizeFieldsTransformRegistryItem,\n seriesToFieldsTransformerRegistryItem,\n seriesToRowsTransformerRegistryItem,\n concatenateTransformRegistryItem,\n calculateFieldTransformRegistryItem,\n labelsToFieldsTransformerRegistryItem,\n groupByTransformRegistryItem,\n sortByTransformRegistryItem,\n mergeTransformerRegistryItem,\n histogramTransformRegistryItem,\n rowsToFieldsTransformRegistryItem,\n configFromQueryTransformRegistryItem,\n prepareTimeseriesTransformerRegistryItem,\n convertFieldTypeTransformRegistryItem,\n spatialTransformRegistryItem,\n fieldLookupTransformRegistryItem,\n extractFieldsTransformRegistryItem,\n heatmapTransformRegistryItem,\n groupingToMatrixTransformRegistryItem,\n limitTransformRegistryItem,\n joinByLabelsTransformRegistryItem,\n ];\n};\n","declare global {\n interface Window {\n __monacoKustoResolvePromise: (value: unknown) => void;\n __grafana_public_path__: string;\n }\n}\n\nconst monacoPath = (window.__grafana_public_path__ ?? 'public/') + 'lib/monaco/min/vs';\n\nconst scripts = [\n [`${monacoPath}/language/kusto/bridge.min.js`],\n [\n `${monacoPath}/language/kusto/kusto.javascript.client.min.js`,\n `${monacoPath}/language/kusto/newtonsoft.json.min.js`,\n `${monacoPath}/language/kusto/Kusto.Language.Bridge.min.js`,\n ],\n];\n\nfunction loadScript(script: HTMLScriptElement | string): Promise<void> {\n return new Promise((resolve, reject) => {\n let scriptEl: HTMLScriptElement;\n\n if (typeof script === 'string') {\n scriptEl = document.createElement('script');\n scriptEl.src = script;\n } else {\n scriptEl = script;\n }\n\n scriptEl.onload = () => resolve();\n scriptEl.onerror = (err) => reject(err);\n document.body.appendChild(scriptEl);\n });\n}\n\nconst loadMonacoKusto = () => {\n return new Promise((resolve) => {\n window.__monacoKustoResolvePromise = resolve;\n\n const script = document.createElement('script');\n script.innerHTML = `require(['vs/language/kusto/monaco.contribution'], function() {\n window.__monacoKustoResolvePromise();\n });`;\n\n return document.body.appendChild(script);\n });\n};\n\nexport default async function loadKusto() {\n let promise = Promise.resolve();\n\n for (const parallelScripts of scripts) {\n await promise;\n\n // Load all these scripts in parallel, then wait for them all to finish before continuing\n // to the next iteration\n const allPromises = parallelScripts\n .filter((src) => !document.querySelector(`script[src=\"${src}\"]`))\n .map((src) => loadScript(src));\n\n await Promise.all(allPromises);\n }\n\n await loadMonacoKusto();\n}\n","import loadKusto from './kusto';\n\nexport default function getDefaultMonacoLanguages() {\n const kusto = { id: 'kusto', name: 'kusto', init: loadKusto };\n return [kusto];\n}\n","import React, { PureComponent } from 'react';\nimport { connect, MapStateToProps } from 'react-redux';\n\nimport { NavModel } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Icon } from '@grafana/ui';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { StoreState } from 'app/types';\n\nimport { Page } from '../Page/Page';\n\ninterface ConnectedProps {\n navModel: NavModel;\n}\n\ninterface OwnProps {}\n\ntype Props = ConnectedProps;\n\nexport class ErrorPage extends PureComponent<Props> {\n render() {\n const { navModel } = this.props;\n return (\n <Page navModel={navModel}>\n <Page.Contents>\n <div className=\"page-container page-body\">\n <div className=\"panel-container error-container\">\n <div className=\"error-column graph-box\">\n <div className=\"error-row\">\n <div className=\"error-column error-space-between graph-percentage\">\n <p>100%</p>\n <p>80%</p>\n <p>60%</p>\n <p>40%</p>\n <p>20%</p>\n <p>0%</p>\n </div>\n <div className=\"error-column image-box\">\n <img src=\"public/img/graph404.svg\" width=\"100%\" alt=\"graph\" />\n <div className=\"error-row error-space-between\">\n <p className=\"graph-text\">Then</p>\n <p className=\"graph-text\">Now</p>\n </div>\n </div>\n </div>\n </div>\n <div className=\"error-column info-box\">\n <div className=\"error-row current-box\">\n <p className=\"current-text\">current</p>\n </div>\n <div className=\"error-row\" style={{ flex: 1 }}>\n <Icon name=\"minus-circle\" className=\"error-minus\" />\n <div className=\"error-column error-space-between error-full-width\">\n <div className=\"error-row error-space-between\">\n <p>Chances you are on the page you are looking for.</p>\n <p className=\"left-margin\">0%</p>\n </div>\n <div>\n <h3>Sorry for the inconvenience</h3>\n <p>\n Please go back to your{' '}\n <a href={config.appSubUrl} className=\"error-link\">\n home dashboard\n </a>{' '}\n and try again.\n </p>\n <p>\n If the error persists, seek help on the{' '}\n <a href=\"https://community.grafana.com\" target=\"_blank\" rel=\"noreferrer\" className=\"error-link\">\n community site\n </a>\n .\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </Page.Contents>\n </Page>\n );\n }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state) => {\n return {\n navModel: getNavModel(state.navIndex, 'not-found'),\n };\n};\n\nexport default connect(mapStateToProps)(ErrorPage);\n","import { css, cx } from '@emotion/css';\nimport { pickBy } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme, GrafanaTheme2, DEFAULT_SAML_NAME } from '@grafana/data';\nimport { Icon, IconName, LinkButton, useStyles, useTheme2, VerticalGroup } from '@grafana/ui';\nimport config from 'app/core/config';\n\nexport interface LoginService {\n bgColor: string;\n enabled: boolean;\n name: string;\n hrefName?: string;\n icon: IconName;\n}\n\nexport interface LoginServices {\n [key: string]: LoginService;\n}\n\nconst loginServices: () => LoginServices = () => {\n const oauthEnabled = !!config.oauth;\n\n return {\n saml: {\n bgColor: '#464646',\n enabled: config.samlEnabled,\n name: config.samlName || DEFAULT_SAML_NAME,\n icon: 'key-skeleton-alt',\n },\n google: {\n bgColor: '#e84d3c',\n enabled: oauthEnabled && Boolean(config.oauth.google),\n name: 'Google',\n icon: 'google',\n },\n azuread: {\n bgColor: '#2f2f2f',\n enabled: oauthEnabled && Boolean(config.oauth.azuread),\n name: 'Microsoft',\n icon: 'microsoft',\n },\n github: {\n bgColor: '#464646',\n enabled: oauthEnabled && Boolean(config.oauth.github),\n name: 'GitHub',\n icon: 'github',\n },\n gitlab: {\n bgColor: '#fc6d26',\n enabled: oauthEnabled && Boolean(config.oauth.gitlab),\n name: 'GitLab',\n icon: 'gitlab',\n },\n grafanacom: {\n bgColor: '#262628',\n enabled: oauthEnabled && Boolean(config.oauth.grafana_com),\n name: 'Grafana.com',\n icon: 'grafana',\n hrefName: 'grafana_com',\n },\n okta: {\n bgColor: '#2f2f2f',\n enabled: oauthEnabled && Boolean(config.oauth.okta),\n name: config.oauth?.okta?.name || 'Okta',\n icon: (config.oauth?.okta?.icon as IconName) || 'okta',\n },\n oauth: {\n bgColor: '#262628',\n enabled: oauthEnabled && Boolean(config.oauth.generic_oauth),\n name: config.oauth?.generic_oauth?.name || 'OAuth',\n icon: (config.oauth?.generic_oauth?.icon as IconName) || 'signin',\n hrefName: 'generic_oauth',\n },\n };\n};\n\nconst getServiceStyles = (theme: GrafanaTheme) => {\n return {\n button: css`\n color: #d8d9da;\n position: relative;\n `,\n buttonIcon: css`\n position: absolute;\n left: ${theme.spacing.sm};\n top: 50%;\n transform: translateY(-50%);\n `,\n divider: {\n base: css`\n color: ${theme.colors.text};\n display: flex;\n margin-bottom: ${theme.spacing.sm};\n justify-content: space-between;\n text-align: center;\n width: 100%;\n `,\n line: css`\n width: 100px;\n height: 10px;\n border-bottom: 1px solid ${theme.colors.text};\n `,\n },\n };\n};\n\nconst LoginDivider = () => {\n const styles = useStyles(getServiceStyles);\n return (\n <>\n <div className={styles.divider.base}>\n <div>\n <div className={styles.divider.line} />\n </div>\n <div>\n <span>{!config.disableLoginForm && <span>or</span>}</span>\n </div>\n <div>\n <div className={styles.divider.line} />\n </div>\n </div>\n <div className=\"clearfix\" />\n </>\n );\n};\n\nfunction getButtonStyleFor(service: LoginService, styles: ReturnType<typeof getServiceStyles>, theme: GrafanaTheme2) {\n return cx(\n styles.button,\n css`\n background-color: ${service.bgColor};\n color: ${theme.colors.getContrastText(service.bgColor)};\n\n &:hover {\n background-color: ${theme.colors.emphasize(service.bgColor, 0.15)};\n box-shadow: ${theme.shadows.z1};\n }\n `\n );\n}\n\nexport const LoginServiceButtons = () => {\n const enabledServices = pickBy(loginServices(), (service) => service.enabled);\n const hasServices = Object.keys(enabledServices).length > 0;\n const theme = useTheme2();\n const styles = useStyles(getServiceStyles);\n\n if (hasServices) {\n return (\n <VerticalGroup>\n <LoginDivider />\n {Object.entries(enabledServices).map(([key, service]) => (\n <LinkButton\n key={key}\n className={getButtonStyleFor(service, styles, theme)}\n href={`login/${service.hrefName ? service.hrefName : key}`}\n target=\"_self\"\n fullWidth\n >\n <Icon className={styles.buttonIcon} name={service.icon} />\n Sign in with {service.name}\n </LinkButton>\n ))}\n </VerticalGroup>\n );\n }\n\n return null;\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { LinkButton, VerticalGroup } from '@grafana/ui';\nimport { getConfig } from 'app/core/config';\n\nexport const UserSignup: FC<{}> = () => {\n const href = getConfig().verifyEmailEnabled ? `${getConfig().appSubUrl}/verify` : `${getConfig().appSubUrl}/signup`;\n const paddingTop = css({ paddingTop: '16px' });\n\n return (\n <VerticalGroup>\n <div className={paddingTop}>New to Grafana?</div>\n <LinkButton\n className={css`\n width: 100%;\n justify-content: center;\n `}\n href={href}\n variant=\"secondary\"\n fill=\"outline\"\n >\n Sign up\n </LinkButton>\n </VerticalGroup>\n );\n};\n","// Libraries\nimport { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\n// Components\nimport { HorizontalGroup, LinkButton } from '@grafana/ui';\nimport { Branding } from 'app/core/components/Branding/Branding';\nimport config from 'app/core/config';\n\nimport { ChangePassword } from '../ForgottenPassword/ChangePassword';\n\nimport LoginCtrl from './LoginCtrl';\nimport { LoginForm } from './LoginForm';\nimport { LoginLayout, InnerBox } from './LoginLayout';\nimport { LoginServiceButtons } from './LoginServiceButtons';\nimport { UserSignup } from './UserSignup';\n\nconst forgottenPasswordStyles = css`\n padding: 0;\n margin-top: 4px;\n`;\n\nexport const LoginPage: FC = () => {\n document.title = Branding.AppTitle;\n return (\n <LoginLayout>\n <LoginCtrl>\n {({\n loginHint,\n passwordHint,\n ldapEnabled,\n authProxyEnabled,\n disableLoginForm,\n disableUserSignUp,\n login,\n isLoggingIn,\n changePassword,\n skipPasswordChange,\n isChangingPassword,\n }) => (\n <>\n {!isChangingPassword && (\n <InnerBox>\n {!disableLoginForm && (\n <LoginForm\n onSubmit={login}\n loginHint={loginHint}\n passwordHint={passwordHint}\n isLoggingIn={isLoggingIn}\n >\n {!(ldapEnabled || authProxyEnabled) ? (\n <HorizontalGroup justify=\"flex-end\">\n <LinkButton\n className={forgottenPasswordStyles}\n fill=\"text\"\n href={`${config.appSubUrl}/user/password/send-reset-email`}\n >\n Forgot your password?\n </LinkButton>\n </HorizontalGroup>\n ) : (\n <></>\n )}\n </LoginForm>\n )}\n <LoginServiceButtons />\n {!disableUserSignUp && <UserSignup />}\n </InnerBox>\n )}\n {isChangingPassword && (\n <InnerBox>\n <ChangePassword onSubmit={changePassword} onSkip={() => skipPasswordChange()} />\n </InnerBox>\n )}\n </>\n )}\n </LoginCtrl>\n </LoginLayout>\n );\n};\n","import React, { PureComponent } from 'react';\n\nimport { dateTimeFormat } from '@grafana/data';\nimport { Button, LinkButton } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, SyncInfo, UserDTO } from 'app/types';\n\ninterface Props {\n ldapSyncInfo: SyncInfo;\n user: UserDTO;\n onUserSync: () => void;\n}\n\ninterface State {}\n\nconst format = 'dddd YYYY-MM-DD HH:mm zz';\nconst debugLDAPMappingBaseURL = '/admin/ldap';\n\nexport class UserLdapSyncInfo extends PureComponent<Props, State> {\n onUserSync = () => {\n this.props.onUserSync();\n };\n\n render() {\n const { ldapSyncInfo, user } = this.props;\n const nextSyncSuccessful = ldapSyncInfo && ldapSyncInfo.nextSync;\n const nextSyncTime = nextSyncSuccessful ? dateTimeFormat(ldapSyncInfo.nextSync, { format }) : '';\n const debugLDAPMappingURL = `${debugLDAPMappingBaseURL}?user=${user && user.login}`;\n const canReadLDAPUser = contextSrv.hasPermission(AccessControlAction.LDAPUsersRead);\n const canSyncLDAPUser = contextSrv.hasPermission(AccessControlAction.LDAPUsersSync);\n\n return (\n <>\n <h3 className=\"page-heading\">LDAP Synchronisation</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <tbody>\n <tr>\n <td>External sync</td>\n <td>User synced via LDAP. Some changes must be done in LDAP or mappings.</td>\n <td>\n <span className=\"label label-tag\">LDAP</span>\n </td>\n </tr>\n <tr>\n {ldapSyncInfo.enabled ? (\n <>\n <td>Next scheduled synchronization</td>\n <td colSpan={2}>{nextSyncTime}</td>\n </>\n ) : (\n <>\n <td>Next scheduled synchronization</td>\n <td colSpan={2}>Not enabled</td>\n </>\n )}\n </tr>\n </tbody>\n </table>\n </div>\n <div className=\"gf-form-button-row\">\n {canSyncLDAPUser && (\n <Button variant=\"secondary\" onClick={this.onUserSync}>\n Sync user\n </Button>\n )}\n {canReadLDAPUser && (\n <LinkButton variant=\"secondary\" href={debugLDAPMappingURL}>\n Debug LDAP Mapping\n </LinkButton>\n )}\n </div>\n </div>\n </>\n );\n }\n}\n","import React, { useEffect } from 'react';\nimport { useAsyncFn } from 'react-use';\n\nimport { SelectableValue } from '@grafana/data';\nimport { AsyncSelect } from '@grafana/ui';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { Organization, UserOrg } from 'app/types';\n\nexport type OrgSelectItem = SelectableValue<Organization>;\n\nexport interface Props {\n onSelected: (org: OrgSelectItem) => void;\n className?: string;\n inputId?: string;\n autoFocus?: boolean;\n excludeOrgs?: UserOrg[];\n}\n\nexport function OrgPicker({ onSelected, className, inputId, autoFocus, excludeOrgs }: Props) {\n // For whatever reason the autoFocus prop doesn't seem to work\n // with AsyncSelect, hence this workaround. Maybe fixed in a later version?\n useEffect(() => {\n if (autoFocus && inputId) {\n document.getElementById(inputId)?.focus();\n }\n }, [autoFocus, inputId]);\n\n const [orgOptionsState, getOrgOptions] = useAsyncFn(async () => {\n const orgs: Organization[] = await getBackendSrv().get('/api/orgs');\n const allOrgs = orgs.map((org) => ({ value: { id: org.id, name: org.name }, label: org.name }));\n if (excludeOrgs) {\n let idArray = excludeOrgs.map((anOrg) => anOrg.orgId);\n const filteredOrgs = allOrgs.filter((item) => {\n return !idArray.includes(item.value.id);\n });\n return filteredOrgs;\n } else {\n return allOrgs;\n }\n });\n\n return (\n <AsyncSelect\n inputId={inputId}\n className={className}\n isLoading={orgOptionsState.loading}\n defaultOptions={true}\n isSearchable={false}\n loadOptions={getOrgOptions}\n onChange={onSelected}\n placeholder=\"Select organization\"\n noOptionsMessage=\"No organizations found\"\n />\n );\n}\n","import { css, cx } from '@emotion/css';\nimport React, { PureComponent, ReactElement } from 'react';\n\nimport { GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\nimport {\n Button,\n ConfirmButton,\n Field,\n HorizontalGroup,\n Icon,\n Modal,\n stylesFactory,\n Themeable,\n Tooltip,\n useStyles2,\n useTheme,\n withTheme,\n} from '@grafana/ui';\nimport { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker';\nimport { fetchRoleOptions, updateUserRoles } from 'app/core/components/RolePicker/api';\nimport { OrgPicker, OrgSelectItem } from 'app/core/components/Select/OrgPicker';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, Organization, OrgRole, Role, UserDTO, UserOrg } from 'app/types';\n\nimport { OrgRolePicker } from './OrgRolePicker';\n\ninterface Props {\n orgs: UserOrg[];\n user?: UserDTO;\n isExternalUser?: boolean;\n\n onOrgRemove: (orgId: number) => void;\n onOrgRoleChange: (orgId: number, newRole: OrgRole) => void;\n onOrgAdd: (orgId: number, role: OrgRole) => void;\n}\n\ninterface State {\n showAddOrgModal: boolean;\n}\n\nexport class UserOrgs extends PureComponent<Props, State> {\n addToOrgButtonRef = React.createRef<HTMLButtonElement>();\n state = {\n showAddOrgModal: false,\n };\n\n showOrgAddModal = () => {\n this.setState({ showAddOrgModal: true });\n };\n\n dismissOrgAddModal = () => {\n this.setState({ showAddOrgModal: false }, () => {\n this.addToOrgButtonRef.current?.focus();\n });\n };\n\n render() {\n const { user, orgs, isExternalUser, onOrgRoleChange, onOrgRemove, onOrgAdd } = this.props;\n const { showAddOrgModal } = this.state;\n const addToOrgContainerClass = css`\n margin-top: 0.8rem;\n `;\n\n const canAddToOrg = contextSrv.hasPermission(AccessControlAction.OrgUsersAdd) && !isExternalUser;\n return (\n <>\n <h3 className=\"page-heading\">Organizations</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <tbody>\n {orgs.map((org, index) => (\n <OrgRow\n key={`${org.orgId}-${index}`}\n isExternalUser={isExternalUser}\n user={user}\n org={org}\n onOrgRoleChange={onOrgRoleChange}\n onOrgRemove={onOrgRemove}\n />\n ))}\n </tbody>\n </table>\n </div>\n <div className={addToOrgContainerClass}>\n {canAddToOrg && (\n <Button variant=\"secondary\" onClick={this.showOrgAddModal} ref={this.addToOrgButtonRef}>\n Add user to organization\n </Button>\n )}\n </div>\n <AddToOrgModal\n user={user}\n userOrgs={orgs}\n isOpen={showAddOrgModal}\n onOrgAdd={onOrgAdd}\n onDismiss={this.dismissOrgAddModal}\n />\n </div>\n </>\n );\n }\n}\n\nconst getOrgRowStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n removeButton: css`\n margin-right: 0.6rem;\n text-decoration: underline;\n color: ${theme.palette.blue95};\n `,\n label: css`\n font-weight: 500;\n `,\n disabledTooltip: css`\n display: flex;\n `,\n tooltipItem: css`\n margin-left: 5px;\n `,\n tooltipItemLink: css`\n color: ${theme.palette.blue95};\n `,\n rolePickerWrapper: css`\n display: flex;\n `,\n rolePicker: css`\n flex: auto;\n margin-right: ${theme.spacing.sm};\n `,\n };\n});\n\ninterface OrgRowProps extends Themeable {\n user?: UserDTO;\n org: UserOrg;\n isExternalUser?: boolean;\n onOrgRemove: (orgId: number) => void;\n onOrgRoleChange: (orgId: number, newRole: OrgRole) => void;\n}\n\nclass UnThemedOrgRow extends PureComponent<OrgRowProps> {\n state = {\n currentRole: this.props.org.role,\n isChangingRole: false,\n roleOptions: [],\n builtInRoles: {},\n };\n\n componentDidMount() {\n if (contextSrv.licensedAccessControlEnabled()) {\n if (contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {\n fetchRoleOptions(this.props.org.orgId)\n .then((roles) => this.setState({ roleOptions: roles }))\n .catch((e) => console.error(e));\n }\n }\n }\n\n onOrgRemove = async () => {\n const { org, user } = this.props;\n this.props.onOrgRemove(org.orgId);\n if (contextSrv.licensedAccessControlEnabled()) {\n if (\n contextSrv.hasPermission(AccessControlAction.ActionUserRolesRemove) &&\n contextSrv.hasPermission(AccessControlAction.ActionUserRolesAdd)\n ) {\n user && (await updateUserRoles([], user.id, org.orgId));\n }\n }\n };\n\n onChangeRoleClick = () => {\n const { org } = this.props;\n this.setState({ isChangingRole: true, currentRole: org.role });\n };\n\n onOrgRoleChange = (newRole: OrgRole) => {\n this.setState({ currentRole: newRole });\n };\n\n onOrgRoleSave = () => {\n this.props.onOrgRoleChange(this.props.org.orgId, this.state.currentRole);\n };\n\n onCancelClick = () => {\n this.setState({ isChangingRole: false });\n };\n\n onBuiltinRoleChange = (newRole: OrgRole) => {\n this.props.onOrgRoleChange(this.props.org.orgId, newRole);\n };\n\n render() {\n const { user, org, isExternalUser, theme } = this.props;\n const { currentRole, isChangingRole } = this.state;\n const styles = getOrgRowStyles(theme);\n const labelClass = cx('width-16', styles.label);\n const canChangeRole = contextSrv.hasPermission(AccessControlAction.OrgUsersWrite);\n const canRemoveFromOrg = contextSrv.hasPermission(AccessControlAction.OrgUsersRemove);\n const rolePickerDisabled = isExternalUser || !canChangeRole;\n\n const inputId = `${org.name}-input`;\n return (\n <tr>\n <td className={labelClass}>\n <label htmlFor={inputId}>{org.name}</label>\n </td>\n {contextSrv.licensedAccessControlEnabled() ? (\n <td>\n <div className={styles.rolePickerWrapper}>\n <div className={styles.rolePicker}>\n <UserRolePicker\n userId={user?.id || 0}\n orgId={org.orgId}\n builtInRole={org.role}\n roleOptions={this.state.roleOptions}\n builtInRoles={this.state.builtInRoles}\n onBuiltinRoleChange={this.onBuiltinRoleChange}\n builtinRolesDisabled={rolePickerDisabled}\n />\n </div>\n {isExternalUser && <ExternalUserTooltip />}\n </div>\n </td>\n ) : (\n <>\n {isChangingRole ? (\n <td>\n <OrgRolePicker inputId={inputId} value={currentRole} onChange={this.onOrgRoleChange} autoFocus />\n </td>\n ) : (\n <td className=\"width-25\">{org.role}</td>\n )}\n <td colSpan={1}>\n <div className=\"pull-right\">\n {canChangeRole && (\n <ChangeOrgButton\n isExternalUser={isExternalUser}\n onChangeRoleClick={this.onChangeRoleClick}\n onCancelClick={this.onCancelClick}\n onOrgRoleSave={this.onOrgRoleSave}\n />\n )}\n </div>\n </td>\n </>\n )}\n <td colSpan={1}>\n <div className=\"pull-right\">\n {canRemoveFromOrg && (\n <ConfirmButton\n confirmText=\"Confirm removal\"\n confirmVariant=\"destructive\"\n onCancel={this.onCancelClick}\n onConfirm={this.onOrgRemove}\n autoFocus\n >\n Remove from organization\n </ConfirmButton>\n )}\n </div>\n </td>\n </tr>\n );\n }\n}\n\nconst OrgRow = withTheme(UnThemedOrgRow);\n\nconst getAddToOrgModalStyles = stylesFactory(() => ({\n modal: css`\n width: 500px;\n `,\n buttonRow: css`\n text-align: center;\n `,\n modalContent: css`\n overflow: visible;\n `,\n}));\n\ninterface AddToOrgModalProps {\n isOpen: boolean;\n user?: UserDTO;\n userOrgs: UserOrg[];\n onOrgAdd(orgId: number, role: string): void;\n\n onDismiss?(): void;\n}\n\ninterface AddToOrgModalState {\n selectedOrg: Organization | null;\n role: OrgRole;\n roleOptions: Role[];\n pendingOrgId: number | null;\n pendingUserId: number | null;\n pendingRoles: Role[];\n}\n\nexport class AddToOrgModal extends PureComponent<AddToOrgModalProps, AddToOrgModalState> {\n state: AddToOrgModalState = {\n selectedOrg: null,\n role: OrgRole.Viewer,\n roleOptions: [],\n pendingOrgId: null,\n pendingUserId: null,\n pendingRoles: [],\n };\n\n onOrgSelect = (org: OrgSelectItem) => {\n const userOrg = this.props.userOrgs.find((userOrg) => userOrg.orgId === org.value?.id);\n this.setState({ selectedOrg: org.value!, role: userOrg?.role || OrgRole.Viewer });\n if (contextSrv.licensedAccessControlEnabled()) {\n if (contextSrv.hasPermission(AccessControlAction.ActionRolesList)) {\n fetchRoleOptions(org.value?.id)\n .then((roles) => this.setState({ roleOptions: roles }))\n .catch((e) => console.error(e));\n }\n }\n };\n\n onOrgRoleChange = (newRole: OrgRole) => {\n this.setState({\n role: newRole,\n });\n };\n\n onAddUserToOrg = async () => {\n const { selectedOrg, role } = this.state;\n this.props.onOrgAdd(selectedOrg!.id, role);\n // add the stored userRoles also\n if (contextSrv.licensedAccessControlEnabled()) {\n if (contextSrv.hasPermission(AccessControlAction.ActionUserRolesAdd)) {\n if (this.state.pendingUserId) {\n await updateUserRoles(this.state.pendingRoles, this.state.pendingUserId!, this.state.pendingOrgId!);\n // clear pending state\n this.state.pendingOrgId = null;\n this.state.pendingRoles = [];\n this.state.pendingUserId = null;\n }\n }\n }\n };\n\n onCancel = () => {\n // clear selectedOrg when modal is canceled\n this.setState({\n selectedOrg: null,\n pendingRoles: [],\n pendingOrgId: null,\n pendingUserId: null,\n });\n if (this.props.onDismiss) {\n this.props.onDismiss();\n }\n };\n\n onRoleUpdate = async (roles: Role[], userId: number, orgId: number | undefined) => {\n // keep the new role assignments for user\n this.setState({\n pendingRoles: roles,\n pendingOrgId: orgId!,\n pendingUserId: userId,\n });\n };\n\n render() {\n const { isOpen, user, userOrgs } = this.props;\n const { role, roleOptions, selectedOrg } = this.state;\n const styles = getAddToOrgModalStyles();\n return (\n <Modal\n className={styles.modal}\n contentClassName={styles.modalContent}\n title=\"Add to an organization\"\n isOpen={isOpen}\n onDismiss={this.onCancel}\n >\n <Field label=\"Organization\">\n <OrgPicker inputId=\"new-org-input\" onSelected={this.onOrgSelect} excludeOrgs={userOrgs} autoFocus />\n </Field>\n <Field label=\"Role\" disabled={selectedOrg === null}>\n {contextSrv.accessControlEnabled() ? (\n <UserRolePicker\n userId={user?.id || 0}\n orgId={selectedOrg?.id}\n builtInRole={role}\n onBuiltinRoleChange={this.onOrgRoleChange}\n builtinRolesDisabled={false}\n roleOptions={roleOptions}\n apply={true}\n onApplyRoles={this.onRoleUpdate}\n pendingRoles={this.state.pendingRoles}\n />\n ) : (\n <OrgRolePicker inputId=\"new-org-role-input\" value={role} onChange={this.onOrgRoleChange} />\n )}\n </Field>\n <Modal.ButtonRow>\n <HorizontalGroup spacing=\"md\" justify=\"center\">\n <Button variant=\"secondary\" fill=\"outline\" onClick={this.onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" disabled={selectedOrg === null} onClick={this.onAddUserToOrg}>\n Add to organization\n </Button>\n </HorizontalGroup>\n </Modal.ButtonRow>\n </Modal>\n );\n }\n}\n\ninterface ChangeOrgButtonProps {\n isExternalUser?: boolean;\n onChangeRoleClick: () => void;\n onCancelClick: () => void;\n onOrgRoleSave: () => void;\n}\n\nconst getChangeOrgButtonTheme = (theme: GrafanaTheme2) => ({\n disabledTooltip: css`\n display: flex;\n `,\n tooltipItemLink: css`\n color: ${theme.v1.palette.blue95};\n `,\n});\n\nexport function ChangeOrgButton({\n onChangeRoleClick,\n isExternalUser,\n onOrgRoleSave,\n onCancelClick,\n}: ChangeOrgButtonProps): ReactElement {\n const styles = useStyles2(getChangeOrgButtonTheme);\n return (\n <div className={styles.disabledTooltip}>\n <ConfirmButton\n confirmText=\"Save\"\n onClick={onChangeRoleClick}\n onCancel={onCancelClick}\n onConfirm={onOrgRoleSave}\n disabled={isExternalUser}\n >\n Change role\n </ConfirmButton>\n {isExternalUser && (\n <Tooltip\n placement=\"right-end\"\n content={\n <div>\n This user's role is not editable because it is synchronized from your auth provider. Refer to\n the \n <a\n className={styles.tooltipItemLink}\n href={'https://grafana.com/docs/grafana/latest/auth'}\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n Grafana authentication docs\n </a>\n for details.\n </div>\n }\n >\n <Icon name=\"question-circle\" />\n </Tooltip>\n )}\n </div>\n );\n}\n\nconst ExternalUserTooltip: React.FC = () => {\n const theme = useTheme();\n const styles = getTooltipStyles(theme);\n\n return (\n <div className={styles.disabledTooltip}>\n <Tooltip\n placement=\"right-end\"\n content={\n <div>\n This user's built-in role is not editable because it is synchronized from your auth provider. Refer to\n the \n <a\n className={styles.tooltipItemLink}\n href={'https://grafana.com/docs/grafana/latest/auth'}\n rel=\"noreferrer noopener\"\n target=\"_blank\"\n >\n Grafana authentication docs\n </a>\n for details.\n </div>\n }\n >\n <Icon name=\"question-circle\" />\n </Tooltip>\n </div>\n );\n};\n\nconst getTooltipStyles = stylesFactory((theme: GrafanaTheme) => ({\n disabledTooltip: css`\n display: flex;\n `,\n tooltipItemLink: css`\n color: ${theme.palette.blue95};\n `,\n}));\n","import React, { useState } from 'react';\n\nimport { ConfirmButton, RadioButtonGroup, Icon } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction } from 'app/types';\n\ninterface Props {\n isGrafanaAdmin: boolean;\n\n onGrafanaAdminChange: (isGrafanaAdmin: boolean) => void;\n}\n\nconst adminOptions = [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n];\n\nexport function UserPermissions({ isGrafanaAdmin, onGrafanaAdminChange }: Props) {\n const [isEditing, setIsEditing] = useState(false);\n const [currentAdminOption, setCurrentAdminOption] = useState(isGrafanaAdmin);\n\n const onChangeClick = () => setIsEditing(true);\n\n const onCancelClick = () => {\n setIsEditing(false);\n setCurrentAdminOption(isGrafanaAdmin);\n };\n\n const handleGrafanaAdminChange = () => onGrafanaAdminChange(currentAdminOption);\n\n const canChangePermissions = contextSrv.hasPermission(AccessControlAction.UsersPermissionsUpdate);\n\n return (\n <>\n <h3 className=\"page-heading\">Permissions</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <tbody>\n <tr>\n <td className=\"width-16\">Grafana Admin</td>\n {isEditing ? (\n <td colSpan={2}>\n <RadioButtonGroup\n options={adminOptions}\n value={currentAdminOption}\n onChange={setCurrentAdminOption}\n autoFocus\n />\n </td>\n ) : (\n <td colSpan={2}>\n {isGrafanaAdmin ? (\n <>\n <Icon name=\"shield\" /> Yes\n </>\n ) : (\n <>No</>\n )}\n </td>\n )}\n <td>\n {canChangePermissions && (\n <ConfirmButton\n onClick={onChangeClick}\n onConfirm={handleGrafanaAdminChange}\n onCancel={onCancelClick}\n confirmText=\"Change\"\n >\n Change\n </ConfirmButton>\n )}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n}\n","import { css, cx } from '@emotion/css';\nimport React, { FC, PureComponent, useRef, useState } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Button, ConfirmButton, ConfirmModal, Input, LegacyInputStatus, stylesFactory } from '@grafana/ui';\nimport { config } from 'app/core/config';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, UserDTO } from 'app/types';\n\ninterface Props {\n user: UserDTO;\n\n onUserUpdate: (user: UserDTO) => void;\n onUserDelete: (userId: number) => void;\n onUserDisable: (userId: number) => void;\n onUserEnable: (userId: number) => void;\n onPasswordChange(password: string): void;\n}\n\nexport function UserProfile({\n user,\n onUserUpdate,\n onUserDelete,\n onUserDisable,\n onUserEnable,\n onPasswordChange,\n}: Props) {\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [showDisableModal, setShowDisableModal] = useState(false);\n\n const deleteUserRef = useRef<HTMLButtonElement | null>(null);\n const showDeleteUserModal = (show: boolean) => () => {\n setShowDeleteModal(show);\n if (!show && deleteUserRef.current) {\n deleteUserRef.current.focus();\n }\n };\n\n const disableUserRef = useRef<HTMLButtonElement | null>(null);\n const showDisableUserModal = (show: boolean) => () => {\n setShowDisableModal(show);\n if (!show && disableUserRef.current) {\n disableUserRef.current.focus();\n }\n };\n\n const handleUserDelete = () => onUserDelete(user.id);\n\n const handleUserDisable = () => onUserDisable(user.id);\n\n const handleUserEnable = () => onUserEnable(user.id);\n\n const onUserNameChange = (newValue: string) => {\n onUserUpdate({\n ...user,\n name: newValue,\n });\n };\n\n const onUserEmailChange = (newValue: string) => {\n onUserUpdate({\n ...user,\n email: newValue,\n });\n };\n\n const onUserLoginChange = (newValue: string) => {\n onUserUpdate({\n ...user,\n login: newValue,\n });\n };\n\n const authSource = user.authLabels?.length && user.authLabels[0];\n const lockMessage = authSource ? `Synced via ${authSource}` : '';\n const styles = getStyles(config.theme);\n\n const editLocked = user.isExternal || !contextSrv.hasPermissionInMetadata(AccessControlAction.UsersWrite, user);\n const passwordChangeLocked =\n user.isExternal || !contextSrv.hasPermissionInMetadata(AccessControlAction.UsersPasswordUpdate, user);\n const canDelete = contextSrv.hasPermissionInMetadata(AccessControlAction.UsersDelete, user);\n const canDisable = contextSrv.hasPermissionInMetadata(AccessControlAction.UsersDisable, user);\n const canEnable = contextSrv.hasPermissionInMetadata(AccessControlAction.UsersEnable, user);\n\n return (\n <>\n <h3 className=\"page-heading\">User information</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <tbody>\n <UserProfileRow\n label=\"Name\"\n value={user.name}\n locked={editLocked}\n lockMessage={lockMessage}\n onChange={onUserNameChange}\n />\n <UserProfileRow\n label=\"Email\"\n value={user.email}\n locked={editLocked}\n lockMessage={lockMessage}\n onChange={onUserEmailChange}\n />\n <UserProfileRow\n label=\"Username\"\n value={user.login}\n locked={editLocked}\n lockMessage={lockMessage}\n onChange={onUserLoginChange}\n />\n <UserProfileRow\n label=\"Password\"\n value=\"********\"\n inputType=\"password\"\n locked={passwordChangeLocked}\n lockMessage={lockMessage}\n onChange={onPasswordChange}\n />\n </tbody>\n </table>\n </div>\n <div className={styles.buttonRow}>\n {canDelete && (\n <>\n <Button variant=\"destructive\" onClick={showDeleteUserModal(true)} ref={deleteUserRef}>\n Delete user\n </Button>\n <ConfirmModal\n isOpen={showDeleteModal}\n title=\"Delete user\"\n body=\"Are you sure you want to delete this user?\"\n confirmText=\"Delete user\"\n onConfirm={handleUserDelete}\n onDismiss={showDeleteUserModal(false)}\n />\n </>\n )}\n {user.isDisabled && canEnable && (\n <Button variant=\"secondary\" onClick={handleUserEnable}>\n Enable user\n </Button>\n )}\n {!user.isDisabled && canDisable && (\n <>\n <Button variant=\"secondary\" onClick={showDisableUserModal(true)} ref={disableUserRef}>\n Disable user\n </Button>\n <ConfirmModal\n isOpen={showDisableModal}\n title=\"Disable user\"\n body=\"Are you sure you want to disable this user?\"\n confirmText=\"Disable user\"\n onConfirm={handleUserDisable}\n onDismiss={showDisableUserModal(false)}\n />\n </>\n )}\n </div>\n </div>\n </>\n );\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n buttonRow: css`\n margin-top: 0.8rem;\n > * {\n margin-right: 16px;\n }\n `,\n };\n});\n\ninterface UserProfileRowProps {\n label: string;\n value?: string;\n locked?: boolean;\n lockMessage?: string;\n inputType?: string;\n onChange?: (value: string) => void;\n}\n\ninterface UserProfileRowState {\n value: string;\n editing: boolean;\n}\n\nexport class UserProfileRow extends PureComponent<UserProfileRowProps, UserProfileRowState> {\n inputElem?: HTMLInputElement;\n\n static defaultProps: Partial<UserProfileRowProps> = {\n value: '',\n locked: false,\n lockMessage: '',\n inputType: 'text',\n };\n\n state = {\n editing: false,\n value: this.props.value || '',\n };\n\n setInputElem = (elem: any) => {\n this.inputElem = elem;\n };\n\n onEditClick = () => {\n if (this.props.inputType === 'password') {\n // Reset value for password field\n this.setState({ editing: true, value: '' }, this.focusInput);\n } else {\n this.setState({ editing: true }, this.focusInput);\n }\n };\n\n onCancelClick = () => {\n this.setState({ editing: false, value: this.props.value || '' });\n };\n\n onInputChange = (event: React.ChangeEvent<HTMLInputElement>, status?: LegacyInputStatus) => {\n if (status === LegacyInputStatus.Invalid) {\n return;\n }\n\n this.setState({ value: event.target.value });\n };\n\n onInputBlur = (event: React.FocusEvent<HTMLInputElement>, status?: LegacyInputStatus) => {\n if (status === LegacyInputStatus.Invalid) {\n return;\n }\n\n this.setState({ value: event.target.value });\n };\n\n focusInput = () => {\n if (this.inputElem && this.inputElem.focus) {\n this.inputElem.focus();\n }\n };\n\n onSave = () => {\n if (this.props.onChange) {\n this.props.onChange(this.state.value);\n }\n };\n\n render() {\n const { label, locked, lockMessage, inputType } = this.props;\n const { value } = this.state;\n const labelClass = cx(\n 'width-16',\n css`\n font-weight: 500;\n `\n );\n\n if (locked) {\n return <LockedRow label={label} value={value} lockMessage={lockMessage} />;\n }\n\n const inputId = `${label}-input`;\n return (\n <tr>\n <td className={labelClass}>\n <label htmlFor={inputId}>{label}</label>\n </td>\n <td className=\"width-25\" colSpan={2}>\n {this.state.editing ? (\n <Input\n id={inputId}\n type={inputType}\n defaultValue={value}\n onBlur={this.onInputBlur}\n onChange={this.onInputChange}\n ref={this.setInputElem}\n width={30}\n />\n ) : (\n <span>{this.props.value}</span>\n )}\n </td>\n <td>\n <ConfirmButton\n confirmText=\"Save\"\n onClick={this.onEditClick}\n onConfirm={this.onSave}\n onCancel={this.onCancelClick}\n >\n Edit\n </ConfirmButton>\n </td>\n </tr>\n );\n }\n}\n\ninterface LockedRowProps {\n label: string;\n value?: any;\n lockMessage?: string;\n}\n\nexport const LockedRow: FC<LockedRowProps> = ({ label, value, lockMessage }) => {\n const lockMessageClass = css`\n font-style: italic;\n margin-right: 0.6rem;\n `;\n const labelClass = cx(\n 'width-16',\n css`\n font-weight: 500;\n `\n );\n\n return (\n <tr>\n <td className={labelClass}>{label}</td>\n <td className=\"width-25\" colSpan={2}>\n {value}\n </td>\n <td>\n <span className={lockMessageClass}>{lockMessage}</span>\n </td>\n </tr>\n );\n};\n","import { css } from '@emotion/css';\nimport { withI18n, withI18nProps } from '@lingui/react';\nimport React, { PureComponent } from 'react';\n\nimport { ConfirmButton, ConfirmModal, Button } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, UserSession } from 'app/types';\n\ninterface Props extends withI18nProps {\n sessions: UserSession[];\n\n onSessionRevoke: (id: number) => void;\n onAllSessionsRevoke: () => void;\n}\n\ninterface State {\n showLogoutModal: boolean;\n}\n\nclass BaseUserSessions extends PureComponent<Props, State> {\n forceAllLogoutButton = React.createRef<HTMLButtonElement>();\n state: State = {\n showLogoutModal: false,\n };\n\n showLogoutConfirmationModal = () => {\n this.setState({ showLogoutModal: true });\n };\n\n dismissLogoutConfirmationModal = () => {\n this.setState({ showLogoutModal: false }, () => {\n this.forceAllLogoutButton.current?.focus();\n });\n };\n\n onSessionRevoke = (id: number) => {\n return () => {\n this.props.onSessionRevoke(id);\n };\n };\n\n onAllSessionsRevoke = () => {\n this.setState({ showLogoutModal: false });\n this.props.onAllSessionsRevoke();\n };\n\n render() {\n const { sessions, i18n } = this.props;\n const { showLogoutModal } = this.state;\n\n const logoutFromAllDevicesClass = css`\n margin-top: 0.8rem;\n `;\n\n const canLogout = contextSrv.hasPermission(AccessControlAction.UsersLogout);\n\n return (\n <>\n <h3 className=\"page-heading\">Sessions</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n <th>Last seen</th>\n <th>Logged on</th>\n <th>IP address</th>\n <th colSpan={2}>Browser and OS</th>\n </tr>\n </thead>\n <tbody>\n {sessions &&\n sessions.map((session, index) => (\n <tr key={`${session.id}-${index}`}>\n <td>{session.isActive ? 'Now' : session.seenAt}</td>\n <td>{i18n.date(session.createdAt, { dateStyle: 'long' })}</td>\n <td>{session.clientIp}</td>\n <td>{`${session.browser} on ${session.os} ${session.osVersion}`}</td>\n <td>\n <div className=\"pull-right\">\n {canLogout && (\n <ConfirmButton\n confirmText=\"Confirm logout\"\n confirmVariant=\"destructive\"\n onConfirm={this.onSessionRevoke(session.id)}\n autoFocus\n >\n Force logout\n </ConfirmButton>\n )}\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div className={logoutFromAllDevicesClass}>\n {canLogout && sessions.length > 0 && (\n <Button variant=\"secondary\" onClick={this.showLogoutConfirmationModal} ref={this.forceAllLogoutButton}>\n Force logout from all devices\n </Button>\n )}\n <ConfirmModal\n isOpen={showLogoutModal}\n title=\"Force logout from all devices\"\n body=\"Are you sure you want to force logout from all devices?\"\n confirmText=\"Force logout\"\n onConfirm={this.onAllSessionsRevoke}\n onDismiss={this.dismissLogoutConfirmationModal}\n />\n </div>\n </div>\n </>\n );\n }\n}\n\nexport const UserSessions = withI18n()(BaseUserSessions);\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { NavModel } from '@grafana/data';\nimport { featureEnabled } from '@grafana/runtime';\nimport { Page } from 'app/core/components/Page/Page';\nimport { contextSrv } from 'app/core/core';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { StoreState, UserDTO, UserOrg, UserSession, SyncInfo, UserAdminError, AccessControlAction } from 'app/types';\n\nimport { UserLdapSyncInfo } from './UserLdapSyncInfo';\nimport { UserOrgs } from './UserOrgs';\nimport { UserPermissions } from './UserPermissions';\nimport { UserProfile } from './UserProfile';\nimport { UserSessions } from './UserSessions';\nimport {\n loadAdminUserPage,\n revokeSession,\n revokeAllSessions,\n updateUser,\n setUserPassword,\n disableUser,\n enableUser,\n deleteUser,\n updateUserPermissions,\n addOrgUser,\n updateOrgUserRole,\n deleteOrgUser,\n syncLdapUser,\n} from './state/actions';\n\ninterface OwnProps extends GrafanaRouteComponentProps<{ id: string }> {\n navModel: NavModel;\n user?: UserDTO;\n orgs: UserOrg[];\n sessions: UserSession[];\n ldapSyncInfo?: SyncInfo;\n isLoading: boolean;\n error?: UserAdminError;\n}\n\nexport class UserAdminPage extends PureComponent<Props> {\n async componentDidMount() {\n const { match, loadAdminUserPage } = this.props;\n loadAdminUserPage(parseInt(match.params.id, 10));\n }\n\n onUserUpdate = (user: UserDTO) => {\n this.props.updateUser(user);\n };\n\n onPasswordChange = (password: string) => {\n const { user, setUserPassword } = this.props;\n user && setUserPassword(user.id, password);\n };\n\n onUserDelete = (userId: number) => {\n this.props.deleteUser(userId);\n };\n\n onUserDisable = (userId: number) => {\n this.props.disableUser(userId);\n };\n\n onUserEnable = (userId: number) => {\n this.props.enableUser(userId);\n };\n\n onGrafanaAdminChange = (isGrafanaAdmin: boolean) => {\n const { user, updateUserPermissions } = this.props;\n user && updateUserPermissions(user.id, isGrafanaAdmin);\n };\n\n onOrgRemove = (orgId: number) => {\n const { user, deleteOrgUser } = this.props;\n user && deleteOrgUser(user.id, orgId);\n };\n\n onOrgRoleChange = (orgId: number, newRole: string) => {\n const { user, updateOrgUserRole } = this.props;\n user && updateOrgUserRole(user.id, orgId, newRole);\n };\n\n onOrgAdd = (orgId: number, role: string) => {\n const { user, addOrgUser } = this.props;\n user && addOrgUser(user, orgId, role);\n };\n\n onSessionRevoke = (tokenId: number) => {\n const { user, revokeSession } = this.props;\n user && revokeSession(tokenId, user.id);\n };\n\n onAllSessionsRevoke = () => {\n const { user, revokeAllSessions } = this.props;\n user && revokeAllSessions(user.id);\n };\n\n onUserSync = () => {\n const { user, syncLdapUser } = this.props;\n user && syncLdapUser(user.id);\n };\n\n render() {\n const { navModel, user, orgs, sessions, ldapSyncInfo, isLoading } = this.props;\n const isLDAPUser = user && user.isExternal && user.authLabels && user.authLabels.includes('LDAP');\n const canReadSessions = contextSrv.hasPermission(AccessControlAction.UsersAuthTokenList);\n const canReadLDAPStatus = contextSrv.hasPermission(AccessControlAction.LDAPStatusRead);\n\n return (\n <Page navModel={navModel}>\n <Page.Contents isLoading={isLoading}>\n {user && (\n <>\n <UserProfile\n user={user}\n onUserUpdate={this.onUserUpdate}\n onUserDelete={this.onUserDelete}\n onUserDisable={this.onUserDisable}\n onUserEnable={this.onUserEnable}\n onPasswordChange={this.onPasswordChange}\n />\n {isLDAPUser && featureEnabled('ldapsync') && ldapSyncInfo && canReadLDAPStatus && (\n <UserLdapSyncInfo ldapSyncInfo={ldapSyncInfo} user={user} onUserSync={this.onUserSync} />\n )}\n <UserPermissions isGrafanaAdmin={user.isGrafanaAdmin} onGrafanaAdminChange={this.onGrafanaAdminChange} />\n </>\n )}\n\n {orgs && (\n <UserOrgs\n user={user}\n orgs={orgs}\n isExternalUser={user?.isExternal}\n onOrgRemove={this.onOrgRemove}\n onOrgRoleChange={this.onOrgRoleChange}\n onOrgAdd={this.onOrgAdd}\n />\n )}\n\n {sessions && canReadSessions && (\n <UserSessions\n sessions={sessions}\n onSessionRevoke={this.onSessionRevoke}\n onAllSessionsRevoke={this.onAllSessionsRevoke}\n />\n )}\n </Page.Contents>\n </Page>\n );\n }\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n navModel: getNavModel(state.navIndex, 'global-users'),\n user: state.userAdmin.user,\n sessions: state.userAdmin.sessions,\n orgs: state.userAdmin.orgs,\n ldapSyncInfo: state.ldap.syncInfo,\n isLoading: state.userAdmin.isLoading,\n error: state.userAdmin.error,\n});\n\nconst mapDispatchToProps = {\n loadAdminUserPage,\n updateUser,\n setUserPassword,\n disableUser,\n enableUser,\n deleteUser,\n updateUserPermissions,\n addOrgUser,\n updateOrgUserRole,\n deleteOrgUser,\n revokeSession,\n revokeAllSessions,\n syncLdapUser,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\ntype Props = OwnProps & ConnectedProps<typeof connector>;\nexport default connector(UserAdminPage);\n","import React, { FC } from 'react';\n\nimport { Alert, Icon } from '@grafana/ui';\nimport { AppNotificationSeverity, LdapConnectionInfo, LdapServerInfo } from 'app/types';\n\ninterface Props {\n ldapConnectionInfo: LdapConnectionInfo;\n}\n\nexport const LdapConnectionStatus: FC<Props> = ({ ldapConnectionInfo }) => {\n return (\n <>\n <h3 className=\"page-heading\">LDAP Connection</h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n <th>Host</th>\n <th colSpan={2}>Port</th>\n </tr>\n </thead>\n <tbody>\n {ldapConnectionInfo &&\n ldapConnectionInfo.map((serverInfo, index) => (\n <tr key={index}>\n <td>{serverInfo.host}</td>\n <td>{serverInfo.port}</td>\n <td>\n {serverInfo.available ? (\n <Icon name=\"check\" className=\"pull-right\" />\n ) : (\n <Icon name=\"exclamation-triangle\" className=\"pull-right\" />\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div className=\"gf-form-group\">\n <LdapErrorBox ldapConnectionInfo={ldapConnectionInfo} />\n </div>\n </div>\n </>\n );\n};\n\ninterface LdapConnectionErrorProps {\n ldapConnectionInfo: LdapConnectionInfo;\n}\n\nexport const LdapErrorBox: FC<LdapConnectionErrorProps> = ({ ldapConnectionInfo }) => {\n const hasError = ldapConnectionInfo.some((info) => info.error);\n if (!hasError) {\n return null;\n }\n\n const connectionErrors: LdapServerInfo[] = [];\n ldapConnectionInfo.forEach((info) => {\n if (info.error) {\n connectionErrors.push(info);\n }\n });\n\n const errorElements = connectionErrors.map((info, index) => (\n <div key={index}>\n <span style={{ fontWeight: 500 }}>\n {info.host}:{info.port}\n <br />\n </span>\n <span>{info.error}</span>\n {index !== connectionErrors.length - 1 && (\n <>\n <br />\n <br />\n </>\n )}\n </div>\n ));\n\n return (\n <Alert title=\"Connection error\" severity={AppNotificationSeverity.Error}>\n {errorElements}\n </Alert>\n );\n};\n","import React, { PureComponent } from 'react';\n\nimport { dateTimeFormat } from '@grafana/data';\nimport { Button, Spinner } from '@grafana/ui';\nimport { SyncInfo } from 'app/types';\n\ninterface Props {\n ldapSyncInfo: SyncInfo;\n}\n\ninterface State {\n isSyncing: boolean;\n}\n\nconst format = 'dddd YYYY-MM-DD HH:mm zz';\n\nexport class LdapSyncInfo extends PureComponent<Props, State> {\n state = {\n isSyncing: false,\n };\n\n handleSyncClick = () => {\n this.setState({ isSyncing: !this.state.isSyncing });\n };\n\n render() {\n const { ldapSyncInfo } = this.props;\n const { isSyncing } = this.state;\n const nextSyncTime = dateTimeFormat(ldapSyncInfo.nextSync, { format });\n\n return (\n <>\n <h3 className=\"page-heading\">\n LDAP Synchronisation\n <Button className=\"pull-right\" onClick={this.handleSyncClick} hidden>\n <span className=\"btn-title\">Bulk-sync now</span>\n {isSyncing && <Spinner inline={true} />}\n </Button>\n </h3>\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <tbody>\n <tr>\n <td>Active synchronisation</td>\n <td colSpan={2}>{ldapSyncInfo.enabled ? 'Enabled' : 'Disabled'}</td>\n </tr>\n <tr>\n <td>Scheduled</td>\n <td>{ldapSyncInfo.schedule}</td>\n </tr>\n <tr>\n <td>Next scheduled synchronisation</td>\n <td>{nextSyncTime}</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n }\n}\n","import React, { FC } from 'react';\n\nimport { Tooltip, Icon } from '@grafana/ui';\nimport { LdapRole } from 'app/types';\n\ninterface Props {\n groups: LdapRole[];\n showAttributeMapping?: boolean;\n}\n\nexport const LdapUserGroups: FC<Props> = ({ groups, showAttributeMapping }) => {\n const items = showAttributeMapping ? groups : groups.filter((item) => item.orgRole);\n\n return (\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n {showAttributeMapping && <th>LDAP Group</th>}\n <th>\n Organization\n <Tooltip placement=\"top\" content=\"Only the first match for an Organization will be used\" theme={'info'}>\n <span className=\"gf-form-help-icon\">\n <Icon name=\"info-circle\" />\n </span>\n </Tooltip>\n </th>\n <th>Role</th>\n </tr>\n </thead>\n <tbody>\n {items.map((group, index) => {\n return (\n <tr key={`${group.orgId}-${index}`}>\n {showAttributeMapping && <td>{group.groupDN}</td>}\n {group.orgName && group.orgRole ? <td>{group.orgName}</td> : <td />}\n {group.orgRole ? (\n <td>{group.orgRole}</td>\n ) : (\n <td>\n <span className=\"text-warning\">\n No match\n <Tooltip placement=\"top\" content=\"No matching groups found\" theme={'info'}>\n <span className=\"gf-form-help-icon\">\n <Icon name=\"info-circle\" />\n </span>\n </Tooltip>\n </span>\n </td>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n","import React, { FC } from 'react';\n\nimport { LdapUserInfo } from 'app/types';\n\ninterface Props {\n info: LdapUserInfo;\n showAttributeMapping?: boolean;\n}\n\nexport const LdapUserMappingInfo: FC<Props> = ({ info, showAttributeMapping }) => {\n return (\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n <th colSpan={2}>User information</th>\n {showAttributeMapping && <th>LDAP attribute</th>}\n </tr>\n </thead>\n <tbody>\n <tr>\n <td className=\"width-16\">First name</td>\n <td>{info.name.ldapValue}</td>\n {showAttributeMapping && <td>{info.name.cfgAttrValue}</td>}\n </tr>\n <tr>\n <td className=\"width-16\">Surname</td>\n <td>{info.surname.ldapValue}</td>\n {showAttributeMapping && <td>{info.surname.cfgAttrValue}</td>}\n </tr>\n <tr>\n <td className=\"width-16\">Username</td>\n <td>{info.login.ldapValue}</td>\n {showAttributeMapping && <td>{info.login.cfgAttrValue}</td>}\n </tr>\n <tr>\n <td className=\"width-16\">Email</td>\n <td>{info.email.ldapValue}</td>\n {showAttributeMapping && <td>{info.email.cfgAttrValue}</td>}\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n","import React, { FC } from 'react';\n\nimport { Icon } from '@grafana/ui';\nimport { LdapPermissions } from 'app/types';\n\ninterface Props {\n permissions: LdapPermissions;\n}\n\nexport const LdapUserPermissions: FC<Props> = ({ permissions }) => {\n return (\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n <th colSpan={1}>Permissions</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td className=\"width-16\"> Grafana admin</td>\n <td>\n {permissions.isGrafanaAdmin ? (\n <>\n <Icon name=\"shield\" /> Yes\n </>\n ) : (\n 'No'\n )}\n </td>\n </tr>\n <tr>\n <td className=\"width-16\">Status</td>\n <td>\n {permissions.isDisabled ? (\n <>\n <Icon name=\"times\" /> Inactive\n </>\n ) : (\n <>\n <Icon name=\"check\" /> Active\n </>\n )}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n","import React, { FC } from 'react';\n\nimport { Tooltip, Icon } from '@grafana/ui';\nimport { LdapTeam } from 'app/types';\n\ninterface Props {\n teams: LdapTeam[];\n showAttributeMapping?: boolean;\n}\n\nexport const LdapUserTeams: FC<Props> = ({ teams, showAttributeMapping }) => {\n const items = showAttributeMapping ? teams : teams.filter((item) => item.teamName);\n\n return (\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n {showAttributeMapping && <th>LDAP Group</th>}\n <th>Organisation</th>\n <th>Team</th>\n </tr>\n </thead>\n <tbody>\n {items.map((team, index) => {\n return (\n <tr key={`${team.teamName}-${index}`}>\n {showAttributeMapping && (\n <>\n <td>{team.groupDN}</td>\n {!team.orgName && (\n <>\n <td />\n <td>\n <div className=\"text-warning\">\n No match\n <Tooltip placement=\"top\" content=\"No matching teams found\" theme={'info'}>\n <span className=\"gf-form-help-icon\">\n <Icon name=\"info-circle\" />\n </span>\n </Tooltip>\n </div>\n </td>\n </>\n )}\n </>\n )}\n {team.orgName && (\n <>\n <td>{team.orgName}</td>\n <td>{team.teamName}</td>\n </>\n )}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n","import React, { FC } from 'react';\n\nimport { LdapUser } from 'app/types';\n\nimport { LdapUserGroups } from './LdapUserGroups';\nimport { LdapUserMappingInfo } from './LdapUserMappingInfo';\nimport { LdapUserPermissions } from './LdapUserPermissions';\nimport { LdapUserTeams } from './LdapUserTeams';\n\ninterface Props {\n ldapUser: LdapUser;\n showAttributeMapping?: boolean;\n}\n\nexport const LdapUserInfo: FC<Props> = ({ ldapUser, showAttributeMapping }) => {\n return (\n <>\n <LdapUserMappingInfo info={ldapUser.info} showAttributeMapping={showAttributeMapping} />\n <LdapUserPermissions permissions={ldapUser.permissions} />\n {ldapUser.roles && ldapUser.roles.length > 0 && (\n <LdapUserGroups groups={ldapUser.roles} showAttributeMapping={showAttributeMapping} />\n )}\n\n {ldapUser.teams && ldapUser.teams.length > 0 ? (\n <LdapUserTeams teams={ldapUser.teams} showAttributeMapping={showAttributeMapping} />\n ) : (\n <div className=\"gf-form-group\">\n <div className=\"gf-form\">\n <table className=\"filter-table form-inline\">\n <tbody>\n <tr>\n <td>No teams found via LDAP</td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n )}\n </>\n );\n};\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { NavModel } from '@grafana/data';\nimport { featureEnabled } from '@grafana/runtime';\nimport { Alert, Button, LegacyForms } from '@grafana/ui';\nconst { FormField } = LegacyForms;\nimport { Page } from 'app/core/components/Page/Page';\nimport { contextSrv } from 'app/core/core';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport {\n AppNotificationSeverity,\n LdapError,\n LdapUser,\n StoreState,\n SyncInfo,\n LdapConnectionInfo,\n AccessControlAction,\n} from 'app/types';\n\nimport {\n loadLdapState,\n loadLdapSyncStatus,\n loadUserMapping,\n clearUserError,\n clearUserMappingInfo,\n} from '../state/actions';\n\nimport { LdapConnectionStatus } from './LdapConnectionStatus';\nimport { LdapSyncInfo } from './LdapSyncInfo';\nimport { LdapUserInfo } from './LdapUserInfo';\n\ninterface OwnProps extends GrafanaRouteComponentProps<{}, { username?: string }> {\n navModel: NavModel;\n ldapConnectionInfo: LdapConnectionInfo;\n ldapUser?: LdapUser;\n ldapSyncInfo?: SyncInfo;\n ldapError?: LdapError;\n userError?: LdapError;\n}\n\ninterface State {\n isLoading: boolean;\n}\n\nexport class LdapPage extends PureComponent<Props, State> {\n state = {\n isLoading: true,\n };\n\n async componentDidMount() {\n const { clearUserMappingInfo, queryParams } = this.props;\n await clearUserMappingInfo();\n await this.fetchLDAPStatus();\n\n if (queryParams.username) {\n await this.fetchUserMapping(queryParams.username);\n }\n\n this.setState({ isLoading: false });\n }\n\n async fetchLDAPStatus() {\n const { loadLdapState, loadLdapSyncStatus } = this.props;\n return Promise.all([loadLdapState(), loadLdapSyncStatus()]);\n }\n\n async fetchUserMapping(username: string) {\n const { loadUserMapping } = this.props;\n return await loadUserMapping(username);\n }\n\n search = (event: any) => {\n event.preventDefault();\n const username = event.target.elements['username'].value;\n if (username) {\n this.fetchUserMapping(username);\n }\n };\n\n onClearUserError = () => {\n this.props.clearUserError();\n };\n\n render() {\n const { ldapUser, userError, ldapError, ldapSyncInfo, ldapConnectionInfo, navModel, queryParams } = this.props;\n const { isLoading } = this.state;\n const canReadLDAPUser = contextSrv.hasPermission(AccessControlAction.LDAPUsersRead);\n\n return (\n <Page navModel={navModel}>\n <Page.Contents isLoading={isLoading}>\n <>\n {ldapError && ldapError.title && (\n <div className=\"gf-form-group\">\n <Alert title={ldapError.title} severity={AppNotificationSeverity.Error}>\n {ldapError.body}\n </Alert>\n </div>\n )}\n\n <LdapConnectionStatus ldapConnectionInfo={ldapConnectionInfo} />\n\n {featureEnabled('ldapsync') && ldapSyncInfo && <LdapSyncInfo ldapSyncInfo={ldapSyncInfo} />}\n\n {canReadLDAPUser && (\n <>\n <h3 className=\"page-heading\">Test user mapping</h3>\n <div className=\"gf-form-group\">\n <form onSubmit={this.search} className=\"gf-form-inline\">\n <FormField\n label=\"Username\"\n labelWidth={8}\n inputWidth={30}\n type=\"text\"\n id=\"username\"\n name=\"username\"\n defaultValue={queryParams.username}\n />\n <Button type=\"submit\">Run</Button>\n </form>\n </div>\n {userError && userError.title && (\n <div className=\"gf-form-group\">\n <Alert\n title={userError.title}\n severity={AppNotificationSeverity.Error}\n onRemove={this.onClearUserError}\n >\n {userError.body}\n </Alert>\n </div>\n )}\n {ldapUser && <LdapUserInfo ldapUser={ldapUser} showAttributeMapping={true} />}\n </>\n )}\n </>\n </Page.Contents>\n </Page>\n );\n }\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n navModel: getNavModel(state.navIndex, 'ldap'),\n ldapConnectionInfo: state.ldap.connectionInfo,\n ldapUser: state.ldap.user,\n ldapSyncInfo: state.ldap.syncInfo,\n userError: state.ldap.userError,\n ldapError: state.ldap.ldapError,\n});\n\nconst mapDispatchToProps = {\n loadLdapState,\n loadLdapSyncStatus,\n loadUserMapping,\n clearUserError,\n clearUserMappingInfo,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\ntype Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport default connector(LdapPage);\n","import { css } from '@emotion/css';\nimport React, { FunctionComponent } from 'react';\n\nimport { Button, stylesFactory } from '@grafana/ui';\nimport { useUrlParams } from 'app/core/navigation/hooks';\n\nconst getStyles = stylesFactory(() => {\n return css`\n width: 508px;\n margin: 128px auto;\n `;\n});\n\ninterface Props {\n error: Error | null;\n}\n\nexport const ErrorLoadingChunk: FunctionComponent<Props> = ({ error }) => {\n const [params, updateUrlParams] = useUrlParams();\n\n if (!params.get('chunkNotFound')) {\n updateUrlParams({ chunkNotFound: true }, true);\n window.location.reload();\n }\n\n return (\n <div className={getStyles()}>\n <h2>Unable to find application file</h2>\n <br />\n <h2 className=\"page-heading\">Grafana has likely been updated. Please try reloading the page.</h2>\n <br />\n <div className=\"gf-form-group\">\n <Button size=\"md\" variant=\"secondary\" icon=\"repeat\" onClick={() => window.location.reload()}>\n Reload\n </Button>\n </div>\n <details style={{ whiteSpace: 'pre-wrap' }}>\n {error && error.message ? error.message : 'Unexpected error occurred'}\n <br />\n {error && error.stack ? error.stack : null}\n </details>\n </div>\n );\n};\n\nErrorLoadingChunk.displayName = 'ErrorLoadingChunk';\n","import React, { FunctionComponent } from 'react';\n\nimport { LoadingPlaceholder } from '@grafana/ui';\n\nexport const LoadingChunkPlaceHolder: FunctionComponent = React.memo(() => (\n <div className=\"preloader\">\n <LoadingPlaceholder text={'Loading...'} />\n </div>\n));\n\nLoadingChunkPlaceHolder.displayName = 'LoadingChunkPlaceHolder';\n","import React from 'react';\nimport Loadable from 'react-loadable';\n\nimport { GrafanaRouteComponent } from 'app/core/navigation/types';\n\nimport { ErrorLoadingChunk } from './ErrorLoadingChunk';\nimport { LoadingChunkPlaceHolder } from './LoadingChunkPlaceHolder';\n\nexport const loadComponentHandler = (props: { error: Error; pastDelay: boolean }) => {\n const { error, pastDelay } = props;\n\n if (error) {\n return <ErrorLoadingChunk error={error} />;\n }\n\n if (pastDelay) {\n return <LoadingChunkPlaceHolder />;\n }\n\n return null;\n};\n\nexport const SafeDynamicImport = (loader: () => Promise<any>): GrafanaRouteComponent =>\n Loadable({\n loader: loader,\n loading: loadComponentHandler,\n });\n","import { uniq } from 'lodash';\nimport React from 'react';\nimport { Redirect } from 'react-router-dom';\n\nimport { OrgRole } from '@grafana/data';\nimport { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport';\nimport { config } from 'app/core/config';\nimport { RouteDescriptor } from 'app/core/navigation/types';\nimport { AccessControlAction } from 'app/types';\n\nimport { evaluateAccess } from './unified/utils/access-control';\n\nconst commonRoutes: RouteDescriptor[] = [\n {\n path: '/alerting',\n // eslint-disable-next-line react/display-name\n component: () => <Redirect to=\"/alerting/list\" />,\n },\n];\n\nconst legacyRoutes: RouteDescriptor[] = [\n ...commonRoutes,\n {\n path: '/alerting/list',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertRuleListIndex\" */ 'app/features/alerting/AlertRuleList')\n ),\n },\n {\n path: '/alerting/ng/list',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertRuleList\" */ 'app/features/alerting/AlertRuleList')\n ),\n },\n {\n path: '/alerting/notifications',\n roles: config.unifiedAlertingEnabled ? () => ['Editor', 'Admin'] : undefined,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/NotificationsListPage')\n ),\n },\n {\n path: '/alerting/notifications/templates/new',\n roles: () => ['Editor', 'Admin'],\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/NotificationsListPage')\n ),\n },\n {\n path: '/alerting/notifications/templates/:id/edit',\n roles: () => ['Editor', 'Admin'],\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/NotificationsListPage')\n ),\n },\n {\n path: '/alerting/notifications/receivers/new',\n roles: () => ['Editor', 'Admin'],\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/NotificationsListPage')\n ),\n },\n {\n path: '/alerting/notifications/receivers/:id/edit',\n roles: () => ['Editor', 'Admin'],\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/NotificationsListPage')\n ),\n },\n {\n path: '/alerting/notifications/global-config',\n roles: () => ['Admin', 'Editor'],\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/NotificationsListPage')\n ),\n },\n {\n path: '/alerting/notification/new',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NewNotificationChannel\" */ 'app/features/alerting/NewNotificationChannelPage')\n ),\n },\n {\n path: '/alerting/notification/:id/edit',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"EditNotificationChannel\"*/ 'app/features/alerting/EditNotificationChannelPage')\n ),\n },\n];\n\nconst unifiedRoutes: RouteDescriptor[] = [\n ...commonRoutes,\n {\n path: '/alerting/list',\n roles: evaluateAccess(\n [AccessControlAction.AlertingRuleRead, AccessControlAction.AlertingRuleExternalRead],\n [OrgRole.Viewer, OrgRole.Editor, OrgRole.Admin]\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertRuleListIndex\" */ 'app/features/alerting/unified/RuleList')\n ),\n },\n {\n path: '/alerting/routes',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsRead, AccessControlAction.AlertingNotificationsExternalRead],\n [OrgRole.Editor, OrgRole.Admin]\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertAmRoutes\" */ 'app/features/alerting/unified/AmRoutes')\n ),\n },\n {\n path: '/alerting/routes/mute-timing/new',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsWrite, AccessControlAction.AlertingNotificationsExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"MuteTimings\" */ 'app/features/alerting/unified/MuteTimings')\n ),\n },\n {\n path: '/alerting/routes/mute-timing/edit',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsWrite, AccessControlAction.AlertingNotificationsExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"MuteTimings\" */ 'app/features/alerting/unified/MuteTimings')\n ),\n },\n {\n path: '/alerting/silences',\n roles: evaluateAccess(\n [AccessControlAction.AlertingInstanceRead, AccessControlAction.AlertingInstancesExternalRead],\n ['Viewer', 'Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertSilences\" */ 'app/features/alerting/unified/Silences')\n ),\n },\n {\n path: '/alerting/silence/new',\n roles: evaluateAccess(\n [AccessControlAction.AlertingInstanceCreate, AccessControlAction.AlertingInstancesExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertSilences\" */ 'app/features/alerting/unified/Silences')\n ),\n },\n {\n path: '/alerting/silence/:id/edit',\n roles: evaluateAccess(\n [AccessControlAction.AlertingInstanceUpdate, AccessControlAction.AlertingInstancesExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertSilences\" */ 'app/features/alerting/unified/Silences')\n ),\n },\n {\n path: '/alerting/notifications',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsRead, AccessControlAction.AlertingNotificationsExternalRead],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n ),\n },\n {\n path: '/alerting/notifications/templates/new',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsWrite, AccessControlAction.AlertingNotificationsExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n ),\n },\n {\n path: '/alerting/notifications/templates/:id/edit',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsWrite, AccessControlAction.AlertingNotificationsExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n ),\n },\n {\n path: '/alerting/notifications/receivers/new',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsWrite, AccessControlAction.AlertingNotificationsExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n ),\n },\n {\n path: '/alerting/notifications/receivers/:id/edit',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsWrite, AccessControlAction.AlertingNotificationsExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n ),\n },\n {\n path: '/alerting/notifications/global-config',\n roles: evaluateAccess(\n [AccessControlAction.AlertingNotificationsWrite, AccessControlAction.AlertingNotificationsExternalWrite],\n ['Editor', 'Admin']\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n ),\n },\n {\n path: '/alerting/groups/',\n roles: evaluateAccess(\n [AccessControlAction.AlertingInstanceRead, AccessControlAction.AlertingInstancesExternalRead],\n [OrgRole.Viewer, OrgRole.Editor, OrgRole.Admin]\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertGroups\" */ 'app/features/alerting/unified/AlertGroups')\n ),\n },\n {\n path: '/alerting/new',\n pageClass: 'page-alerting',\n roles: evaluateAccess(\n [AccessControlAction.AlertingRuleCreate, AccessControlAction.AlertingRuleExternalWrite],\n [OrgRole.Viewer, OrgRole.Editor, OrgRole.Admin] // Needs to include viewer because there may be Viewers with Edit permissions in folders\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertingRuleForm\"*/ 'app/features/alerting/unified/RuleEditor')\n ),\n },\n {\n path: '/alerting/:id/edit',\n pageClass: 'page-alerting',\n roles: evaluateAccess(\n [AccessControlAction.AlertingRuleUpdate, AccessControlAction.AlertingRuleExternalWrite],\n [OrgRole.Viewer, OrgRole.Editor, OrgRole.Admin] // Needs to include viewer because there may be Viewers with Edit permissions in folders\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertingRuleForm\"*/ 'app/features/alerting/unified/RuleEditor')\n ),\n },\n {\n path: '/alerting/:sourceName/:id/view',\n pageClass: 'page-alerting',\n roles: evaluateAccess(\n [AccessControlAction.AlertingRuleRead, AccessControlAction.AlertingRuleExternalRead],\n [OrgRole.Viewer, OrgRole.Editor, OrgRole.Admin]\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertingRule\"*/ 'app/features/alerting/unified/RuleViewer')\n ),\n },\n {\n path: '/alerting/:sourceName/:name/find',\n pageClass: 'page-alerting',\n roles: evaluateAccess(\n [AccessControlAction.AlertingRuleRead, AccessControlAction.AlertingRuleExternalRead],\n [OrgRole.Viewer, OrgRole.Editor, OrgRole.Admin]\n ),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertingRedirectToRule\"*/ 'app/features/alerting/unified/RedirectToRuleViewer')\n ),\n },\n {\n path: '/alerting/admin',\n roles: () => ['Admin'],\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertingAdmin\" */ 'app/features/alerting/unified/Admin')\n ),\n },\n];\n\nexport function getAlertingRoutes(cfg = config): RouteDescriptor[] {\n if (cfg.unifiedAlertingEnabled) {\n return unifiedRoutes;\n } else if (cfg.alertingEnabled) {\n return legacyRoutes;\n }\n\n const uniquePaths = uniq([...legacyRoutes, ...unifiedRoutes].map((route) => route.path));\n return uniquePaths.map((path) => ({\n path,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AlertingFeatureTogglePage\"*/ 'app/features/alerting/FeatureTogglePage')\n ),\n }));\n}\n","import { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport';\nimport { config } from 'app/core/config';\nimport { RouteDescriptor } from 'app/core/navigation/types';\nimport { isGrafanaAdmin } from 'app/features/plugins/admin/permissions';\n\nconst liveRoutes = [\n {\n path: '/live',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"LiveStatusPage\" */ 'app/features/live/pages/LiveStatusPage')\n ),\n },\n {\n path: '/live/pipeline',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"PipelineAdminPage\" */ 'app/features/live/pages/PipelineAdminPage')\n ),\n },\n {\n path: '/live/cloud',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"CloudAdminPage\" */ 'app/features/live/pages/CloudAdminPage')\n ),\n },\n];\n\nexport function getLiveRoutes(cfg = config): RouteDescriptor[] {\n if (!isGrafanaAdmin()) {\n return [];\n }\n if (cfg.featureToggles['live-pipeline']) {\n return liveRoutes;\n }\n return liveRoutes.map((v) => ({\n ...v,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"FeatureTogglePage\" */ 'app/features/live/pages/FeatureTogglePage')\n ),\n }));\n}\n","import { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport';\nimport { RouteDescriptor } from 'app/core/navigation/types';\n\nimport { isGrafanaAdmin } from './permissions';\nimport { PluginAdminRoutes } from './types';\n\nconst DEFAULT_ROUTES = [\n {\n path: '/plugins',\n navId: 'plugins',\n routeName: PluginAdminRoutes.Home,\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n },\n {\n path: '/plugins/browse',\n navId: 'plugins',\n routeName: PluginAdminRoutes.Browse,\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n },\n {\n path: '/plugins/:pluginId/',\n navId: 'plugins',\n routeName: PluginAdminRoutes.Details,\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginPage\" */ './pages/PluginDetails')),\n },\n];\n\nconst ADMIN_ROUTES = [\n {\n path: '/admin/plugins',\n navId: 'admin-plugins',\n routeName: PluginAdminRoutes.HomeAdmin,\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n },\n {\n path: '/admin/plugins/browse',\n navId: 'admin-plugins',\n routeName: PluginAdminRoutes.BrowseAdmin,\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n },\n {\n path: '/admin/plugins/:pluginId/',\n navId: 'admin-plugins',\n routeName: PluginAdminRoutes.DetailsAdmin,\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginPage\" */ './pages/PluginDetails')),\n },\n];\n\nexport function getRoutes(): RouteDescriptor[] {\n if (isGrafanaAdmin()) {\n return [...DEFAULT_ROUTES, ...ADMIN_ROUTES];\n }\n\n return DEFAULT_ROUTES;\n}\n","import { uniq } from 'lodash';\n\nimport { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport';\nimport { config } from 'app/core/config';\nimport { RouteDescriptor } from 'app/core/navigation/types';\n\nconst profileRoutes: RouteDescriptor[] = [\n {\n path: '/profile',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"UserProfileEditPage\" */ 'app/features/profile/UserProfileEditPage')\n ),\n },\n {\n path: '/profile/password',\n component: SafeDynamicImport(\n () => import(/* webPackChunkName: \"ChangePasswordPage\" */ 'app/features/profile/ChangePasswordPage')\n ),\n },\n {\n path: '/profile/select-org',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"SelectOrgPage\" */ 'app/features/org/SelectOrgPage')\n ),\n },\n {\n path: '/profile/notifications',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsPage\"*/ 'app/features/notifications/NotificationsPage')\n ),\n },\n];\n\nexport function getProfileRoutes(cfg = config): RouteDescriptor[] {\n if (cfg.profileEnabled) {\n return profileRoutes;\n }\n\n const uniquePaths = uniq(profileRoutes.map((route) => route.path));\n return uniquePaths.map((path) => ({\n path,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"ProfileFeatureTogglePage\"*/ 'app/features/profile/FeatureTogglePage')\n ),\n }));\n}\n","import React from 'react';\n\nimport { Permissions } from 'app/core/components/AccessControl';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nimport { AccessControlAction, ServiceAccountDTO } from '../../types';\n\ntype ServiceAccountPermissionsProps = {\n serviceAccount: ServiceAccountDTO;\n};\n\nexport const ServiceAccountPermissions = (props: ServiceAccountPermissionsProps) => {\n const canSetPermissions = contextSrv.hasPermissionInMetadata(\n AccessControlAction.ServiceAccountsPermissionsWrite,\n props.serviceAccount\n );\n\n return (\n <Permissions\n title=\"Permissions\"\n addPermissionTitle=\"Add permission\"\n buttonLabel=\"Add permission\"\n resource=\"serviceaccounts\"\n resourceId={props.serviceAccount.id}\n canSetPermissions={canSetPermissions}\n />\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { ConfirmButton, Input, Label, LegacyInputStatus, useStyles2 } from '@grafana/ui';\n\ninterface Props {\n label: string;\n value?: string;\n inputType?: string;\n disabled?: boolean;\n onChange?: (value: string) => void;\n}\n\nexport const ServiceAccountProfileRow = ({ label, value, inputType, disabled, onChange }: Props): JSX.Element => {\n const inputElem = useRef<HTMLInputElement>(null);\n const [inputValue, setInputValue] = useState(value);\n const [isEditing, setIsEditing] = useState(false);\n const styles = useStyles2(getStyles);\n const inputId = `${label}-input`;\n\n useEffect(() => {\n if (isEditing) {\n focusInput();\n }\n }, [isEditing]);\n\n const onEditClick = () => {\n setIsEditing(true);\n };\n\n const onCancelClick = () => {\n setIsEditing(false);\n setInputValue(value || '');\n };\n\n const onInputChange = (event: React.ChangeEvent<HTMLInputElement>, status?: LegacyInputStatus) => {\n if (status === LegacyInputStatus.Invalid) {\n return;\n }\n setInputValue(event.target.value);\n };\n\n const onInputBlur = (event: React.FocusEvent<HTMLInputElement>, status?: LegacyInputStatus) => {\n if (status === LegacyInputStatus.Invalid) {\n return;\n }\n setInputValue(event.target.value);\n };\n\n const focusInput = () => {\n inputElem?.current?.focus();\n };\n\n const onSave = () => {\n setIsEditing(false);\n if (onChange) {\n onChange(inputValue!);\n }\n };\n\n return (\n <tr>\n <td>\n <Label htmlFor={inputId}>{label}</Label>\n </td>\n <td className=\"width-25\" colSpan={2}>\n {!disabled && isEditing ? (\n <Input\n id={inputId}\n type={inputType}\n defaultValue={value}\n onBlur={onInputBlur}\n onChange={onInputChange}\n ref={inputElem}\n width={30}\n />\n ) : (\n <span className={cx({ [styles.disabled]: disabled })}>{value}</span>\n )}\n </td>\n <td>\n {onChange && (\n <ConfirmButton\n closeOnConfirm\n confirmText=\"Save\"\n onConfirm={onSave}\n onClick={onEditClick}\n onCancel={onCancelClick}\n disabled={disabled}\n >\n Edit\n </ConfirmButton>\n )}\n </td>\n </tr>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n disabled: css`\n color: ${theme.colors.text.secondary};\n `,\n };\n};\n","import React from 'react';\n\nimport { Label } from '@grafana/ui';\nimport { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker';\nimport { contextSrv } from 'app/core/core';\nimport { OrgRolePicker } from 'app/features/admin/OrgRolePicker';\nimport { AccessControlAction, OrgRole, Role, ServiceAccountDTO } from 'app/types';\n\ninterface Props {\n label: string;\n serviceAccount: ServiceAccountDTO;\n onRoleChange: (role: OrgRole) => void;\n roleOptions: Role[];\n builtInRoles: Record<string, Role[]>;\n}\n\nexport const ServiceAccountRoleRow = ({\n label,\n serviceAccount,\n roleOptions,\n builtInRoles,\n onRoleChange,\n}: Props): JSX.Element => {\n const inputId = `${label}-input`;\n const canUpdateRole = contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsWrite, serviceAccount);\n\n return (\n <tr>\n <td>\n <Label htmlFor={inputId}>{label}</Label>\n </td>\n {contextSrv.licensedAccessControlEnabled() ? (\n <td className=\"width-25\" colSpan={3}>\n <UserRolePicker\n userId={serviceAccount.id}\n orgId={serviceAccount.orgId}\n builtInRole={serviceAccount.role}\n onBuiltinRoleChange={onRoleChange}\n roleOptions={roleOptions}\n builtInRoles={builtInRoles}\n builtinRolesDisabled={!canUpdateRole}\n disabled={serviceAccount.isDisabled}\n />\n </td>\n ) : (\n <>\n <td>\n <OrgRolePicker\n width={24}\n inputId={inputId}\n aria-label=\"Role\"\n value={serviceAccount.role}\n disabled={serviceAccount.isDisabled}\n onChange={onRoleChange}\n />\n </td>\n <td colSpan={2}></td>\n </>\n )}\n </tr>\n );\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { dateTimeFormat, GrafanaTheme2, OrgRole, TimeZone } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, Role, ServiceAccountDTO } from 'app/types';\n\nimport { ServiceAccountProfileRow } from './ServiceAccountProfileRow';\nimport { ServiceAccountRoleRow } from './ServiceAccountRoleRow';\n\ninterface Props {\n serviceAccount: ServiceAccountDTO;\n timeZone: TimeZone;\n roleOptions: Role[];\n builtInRoles: Record<string, Role[]>;\n onChange: (serviceAccount: ServiceAccountDTO) => void;\n}\n\nexport function ServiceAccountProfile({\n serviceAccount,\n timeZone,\n roleOptions,\n builtInRoles,\n onChange,\n}: Props): JSX.Element {\n const styles = useStyles2(getStyles);\n const ableToWrite = contextSrv.hasPermission(AccessControlAction.ServiceAccountsWrite);\n\n const onRoleChange = (role: OrgRole) => {\n onChange({ ...serviceAccount, role: role });\n };\n\n const onNameChange = (newValue: string) => {\n onChange({ ...serviceAccount, name: newValue });\n };\n\n return (\n <div className={styles.section}>\n <h3>Information</h3>\n <table className=\"filter-table\">\n <tbody>\n <ServiceAccountProfileRow\n label=\"Name\"\n value={serviceAccount.name}\n onChange={onNameChange}\n disabled={!ableToWrite || serviceAccount.isDisabled}\n />\n <ServiceAccountProfileRow label=\"ID\" value={serviceAccount.login} disabled={serviceAccount.isDisabled} />\n <ServiceAccountRoleRow\n label=\"Roles\"\n serviceAccount={serviceAccount}\n onRoleChange={onRoleChange}\n builtInRoles={builtInRoles}\n roleOptions={roleOptions}\n />\n <ServiceAccountProfileRow\n label=\"Creation date\"\n value={dateTimeFormat(serviceAccount.createdAt, { timeZone })}\n disabled={serviceAccount.isDisabled}\n />\n </tbody>\n </table>\n </div>\n );\n}\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n section: css`\n margin-bottom: ${theme.spacing(4)};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { dateTimeFormat, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { DeleteButton, Icon, Tooltip, useStyles2, useTheme2 } from '@grafana/ui';\nimport { ApiKey } from 'app/types';\n\ninterface Props {\n tokens: ApiKey[];\n timeZone: TimeZone;\n tokenActionsDisabled?: boolean;\n onDelete: (token: ApiKey) => void;\n}\n\nexport const ServiceAccountTokensTable = ({ tokens, timeZone, tokenActionsDisabled, onDelete }: Props): JSX.Element => {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <table className={cx(styles.section, 'filter-table')}>\n <thead>\n <tr>\n <th>Name</th>\n <th>Expires</th>\n <th>Created</th>\n <th>Last used at</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {tokens.map((key) => {\n return (\n <tr key={key.id} className={styles.tableRow(key.hasExpired)}>\n <td>{key.name}</td>\n <td>\n <TokenExpiration timeZone={timeZone} token={key} />\n </td>\n <td>{formatDate(timeZone, key.created)}</td>\n <td>{formatLastUsedAtDate(timeZone, key.lastUsedAt)}</td>\n <td>\n <DeleteButton\n aria-label={`Delete service account token ${key.name}`}\n size=\"sm\"\n onConfirm={() => onDelete(key)}\n disabled={tokenActionsDisabled}\n />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nfunction formatLastUsedAtDate(timeZone: TimeZone, lastUsedAt?: string): string {\n if (!lastUsedAt) {\n return 'Never';\n }\n return dateTimeFormat(lastUsedAt, { timeZone });\n}\n\nfunction formatDate(timeZone: TimeZone, expiration?: string): string {\n if (!expiration) {\n return 'No expiration date';\n }\n return dateTimeFormat(expiration, { timeZone });\n}\n\nfunction formatSecondsLeftUntilExpiration(secondsUntilExpiration: number): string {\n const days = Math.ceil(secondsUntilExpiration / (3600 * 24));\n const daysFormat = days > 1 ? `${days} days` : `${days} day`;\n return `Expires in ${daysFormat}`;\n}\n\ninterface TokenExpirationProps {\n timeZone: TimeZone;\n token: ApiKey;\n}\n\nconst TokenExpiration = ({ timeZone, token }: TokenExpirationProps) => {\n const styles = useStyles2(getStyles);\n if (!token.expiration) {\n return <span className={styles.neverExpire}>Never</span>;\n }\n if (token.secondsUntilExpiration) {\n return (\n <span className={styles.secondsUntilExpiration}>\n {formatSecondsLeftUntilExpiration(token.secondsUntilExpiration)}\n </span>\n );\n }\n if (token.hasExpired) {\n return (\n <span className={styles.hasExpired}>\n Expired\n <span className={styles.tooltipContainer}>\n <Tooltip content=\"This token has expired\">\n <Icon name=\"exclamation-triangle\" className={styles.toolTipIcon} />\n </Tooltip>\n </span>\n </span>\n );\n }\n return <span>{formatDate(timeZone, token.expiration)}</span>;\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n tableRow: (hasExpired: boolean | undefined) => css`\n color: ${hasExpired ? theme.colors.text.secondary : theme.colors.text.primary};\n `,\n tooltipContainer: css`\n margin-left: ${theme.spacing(1)};\n `,\n toolTipIcon: css`\n color: ${theme.colors.error.text};\n `,\n secondsUntilExpiration: css`\n color: ${theme.colors.warning.text};\n `,\n hasExpired: css`\n color: ${theme.colors.error.text};\n `,\n neverExpire: css`\n color: ${theme.colors.text.secondary};\n `,\n section: css`\n margin-bottom: ${theme.spacing(4)};\n `,\n});\n","import { getBackendSrv, locationService } from '@grafana/runtime';\nimport { accessControlQueryParam } from 'app/core/utils/accessControl';\nimport { ServiceAccountDTO, ThunkResult } from 'app/types';\n\nimport { ServiceAccountToken } from '../components/CreateTokenModal';\n\nimport {\n serviceAccountFetchBegin,\n serviceAccountFetchEnd,\n serviceAccountLoaded,\n serviceAccountTokensLoaded,\n} from './reducers';\n\nconst BASE_URL = `/api/serviceaccounts`;\n\nexport function loadServiceAccount(saID: number): ThunkResult<void> {\n return async (dispatch) => {\n dispatch(serviceAccountFetchBegin());\n try {\n const response = await getBackendSrv().get(`${BASE_URL}/${saID}`, accessControlQueryParam());\n dispatch(serviceAccountLoaded(response));\n } catch (error) {\n console.error(error);\n } finally {\n dispatch(serviceAccountFetchEnd());\n }\n };\n}\n\nexport function updateServiceAccount(serviceAccount: ServiceAccountDTO): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().patch(`${BASE_URL}/${serviceAccount.id}?accesscontrol=true`, {\n ...serviceAccount,\n });\n dispatch(loadServiceAccount(serviceAccount.id));\n };\n}\n\nexport function deleteServiceAccount(serviceAccountId: number): ThunkResult<void> {\n return async () => {\n await getBackendSrv().delete(`${BASE_URL}/${serviceAccountId}`);\n locationService.push('/org/serviceaccounts');\n };\n}\n\nexport function createServiceAccountToken(\n saID: number,\n token: ServiceAccountToken,\n onTokenCreated: (key: string) => void\n): ThunkResult<void> {\n return async (dispatch) => {\n const result = await getBackendSrv().post(`${BASE_URL}/${saID}/tokens`, token);\n onTokenCreated(result.key);\n dispatch(loadServiceAccountTokens(saID));\n };\n}\n\nexport function deleteServiceAccountToken(saID: number, id: number): ThunkResult<void> {\n return async (dispatch) => {\n await getBackendSrv().delete(`${BASE_URL}/${saID}/tokens/${id}`);\n dispatch(loadServiceAccountTokens(saID));\n };\n}\n\nexport function loadServiceAccountTokens(saID: number): ThunkResult<void> {\n return async (dispatch) => {\n try {\n const response = await getBackendSrv().get(`${BASE_URL}/${saID}/tokens`);\n dispatch(serviceAccountTokensLoaded(response));\n } catch (error) {\n console.error(error);\n }\n };\n}\n","import { css } from '@emotion/css';\nimport React, { useEffect, useState } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { getTimeZone, GrafanaTheme2 } from '@grafana/data';\nimport { Button, ConfirmModal, IconButton, useStyles2 } from '@grafana/ui';\nimport { Page } from 'app/core/components/Page/Page';\nimport { contextSrv } from 'app/core/core';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { AccessControlAction, ApiKey, Role, ServiceAccountDTO, StoreState } from 'app/types';\n\nimport { ServiceAccountPermissions } from './ServiceAccountPermissions';\nimport { CreateTokenModal, ServiceAccountToken } from './components/CreateTokenModal';\nimport { ServiceAccountProfile } from './components/ServiceAccountProfile';\nimport { ServiceAccountTokensTable } from './components/ServiceAccountTokensTable';\nimport { fetchACOptions } from './state/actions';\nimport {\n createServiceAccountToken,\n deleteServiceAccount,\n deleteServiceAccountToken,\n loadServiceAccount,\n loadServiceAccountTokens,\n updateServiceAccount,\n} from './state/actionsServiceAccountPage';\n\ninterface OwnProps extends GrafanaRouteComponentProps<{ id: string }> {\n serviceAccount?: ServiceAccountDTO;\n tokens: ApiKey[];\n isLoading: boolean;\n roleOptions: Role[];\n builtInRoles: Record<string, Role[]>;\n}\n\nfunction mapStateToProps(state: StoreState) {\n return {\n serviceAccount: state.serviceAccountProfile.serviceAccount,\n tokens: state.serviceAccountProfile.tokens,\n isLoading: state.serviceAccountProfile.isLoading,\n roleOptions: state.serviceAccounts.roleOptions,\n builtInRoles: state.serviceAccounts.builtInRoles,\n timezone: getTimeZone(state.user),\n };\n}\n\nconst mapDispatchToProps = {\n createServiceAccountToken,\n deleteServiceAccount,\n deleteServiceAccountToken,\n loadServiceAccount,\n loadServiceAccountTokens,\n updateServiceAccount,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport const ServiceAccountPageUnconnected = ({\n match,\n serviceAccount,\n tokens,\n timezone,\n isLoading,\n roleOptions,\n builtInRoles,\n createServiceAccountToken,\n deleteServiceAccount,\n deleteServiceAccountToken,\n loadServiceAccount,\n loadServiceAccountTokens,\n updateServiceAccount,\n}: Props): JSX.Element => {\n const [newToken, setNewToken] = useState('');\n const [isTokenModalOpen, setIsTokenModalOpen] = useState(false);\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n const [isDisableModalOpen, setIsDisableModalOpen] = useState(false);\n const styles = useStyles2(getStyles);\n const serviceAccountId = parseInt(match.params.id, 10);\n const tokenActionsDisabled =\n !contextSrv.hasPermission(AccessControlAction.ServiceAccountsWrite) || serviceAccount.isDisabled;\n\n const ableToWrite = contextSrv.hasPermission(AccessControlAction.ServiceAccountsWrite);\n const canReadPermissions = contextSrv.hasAccessInMetadata(\n AccessControlAction.ServiceAccountsPermissionsRead,\n serviceAccount!,\n false\n );\n\n useEffect(() => {\n loadServiceAccount(serviceAccountId);\n loadServiceAccountTokens(serviceAccountId);\n if (contextSrv.licensedAccessControlEnabled()) {\n fetchACOptions();\n }\n }, [loadServiceAccount, loadServiceAccountTokens, serviceAccountId]);\n\n const onProfileChange = (serviceAccount: ServiceAccountDTO) => {\n updateServiceAccount(serviceAccount);\n };\n\n const showDeleteServiceAccountModal = (show: boolean) => () => {\n setIsDeleteModalOpen(show);\n };\n\n const showDisableServiceAccountModal = (show: boolean) => () => {\n setIsDisableModalOpen(show);\n };\n\n const handleServiceAccountDelete = () => {\n deleteServiceAccount(serviceAccount.id);\n };\n\n const handleServiceAccountDisable = () => {\n updateServiceAccount({ ...serviceAccount, isDisabled: true });\n setIsDisableModalOpen(false);\n };\n\n const handleServiceAccountEnable = () => {\n updateServiceAccount({ ...serviceAccount, isDisabled: false });\n };\n\n const onDeleteServiceAccountToken = (key: ApiKey) => {\n deleteServiceAccountToken(serviceAccount?.id, key.id!);\n };\n\n const onCreateToken = (token: ServiceAccountToken) => {\n createServiceAccountToken(serviceAccount?.id, token, setNewToken);\n };\n\n const onTokenModalClose = () => {\n setIsTokenModalOpen(false);\n setNewToken('');\n };\n\n return (\n <Page navId=\"serviceaccounts\">\n <Page.Contents isLoading={isLoading}>\n {serviceAccount && (\n <div className={styles.headerContainer}>\n <a href=\"org/serviceaccounts\">\n <IconButton\n size=\"xxl\"\n variant=\"secondary\"\n name=\"arrow-left\"\n className={styles.returnButton}\n aria-label=\"Back to service accounts list\"\n />\n </a>\n <div className={styles.headerAvatar}>\n <img src={serviceAccount.avatarUrl} alt={`Avatar for user ${serviceAccount.name}`} />\n </div>\n <h3>{serviceAccount.name}</h3>\n <div className={styles.buttonRow}>\n <Button\n type={'button'}\n variant=\"destructive\"\n onClick={showDeleteServiceAccountModal(true)}\n disabled={!contextSrv.hasPermission(AccessControlAction.ServiceAccountsDelete)}\n >\n Delete service account\n </Button>\n {serviceAccount.isDisabled ? (\n <Button\n type={'button'}\n variant=\"secondary\"\n onClick={handleServiceAccountEnable}\n disabled={!ableToWrite}\n >\n Enable service account\n </Button>\n ) : (\n <Button\n type={'button'}\n variant=\"secondary\"\n onClick={showDisableServiceAccountModal(true)}\n disabled={!ableToWrite}\n >\n Disable service account\n </Button>\n )}\n </div>\n </div>\n )}\n <div className={styles.pageBody}>\n {serviceAccount && (\n <ServiceAccountProfile\n serviceAccount={serviceAccount}\n timeZone={timezone}\n roleOptions={roleOptions}\n builtInRoles={builtInRoles}\n onChange={onProfileChange}\n />\n )}\n <div className={styles.tokensListHeader}>\n <h3>Tokens</h3>\n <Button onClick={() => setIsTokenModalOpen(true)} disabled={tokenActionsDisabled}>\n Add service account token\n </Button>\n </div>\n {tokens && (\n <ServiceAccountTokensTable\n tokens={tokens}\n timeZone={timezone}\n onDelete={onDeleteServiceAccountToken}\n tokenActionsDisabled={tokenActionsDisabled}\n />\n )}\n {canReadPermissions && <ServiceAccountPermissions serviceAccount={serviceAccount} />}\n </div>\n <ConfirmModal\n isOpen={isDeleteModalOpen}\n title=\"Delete service account\"\n body=\"Are you sure you want to delete this service account?\"\n confirmText=\"Delete service account\"\n onConfirm={handleServiceAccountDelete}\n onDismiss={showDeleteServiceAccountModal(false)}\n />\n <ConfirmModal\n isOpen={isDisableModalOpen}\n title=\"Disable service account\"\n body=\"Are you sure you want to disable this service account?\"\n confirmText=\"Disable service account\"\n onConfirm={handleServiceAccountDisable}\n onDismiss={showDisableServiceAccountModal(false)}\n />\n <CreateTokenModal\n isOpen={isTokenModalOpen}\n token={newToken}\n serviceAccountLogin={serviceAccount.login}\n onCreateToken={onCreateToken}\n onClose={onTokenModalClose}\n />\n </Page.Contents>\n </Page>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n headerContainer: css`\n display: flex;\n margin-bottom: ${theme.spacing(2)};\n align-items: center;\n\n h3 {\n margin-bottom: ${theme.spacing(0.5)};\n flex-grow: 1;\n }\n `,\n headerAvatar: css`\n margin-right: ${theme.spacing(1)};\n margin-bottom: ${theme.spacing(0.6)};\n img {\n width: 25px;\n height: 25px;\n border-radius: 50%;\n }\n `,\n returnButton: css`\n margin-right: ${theme.spacing(1)};\n `,\n buttonRow: css`\n > * {\n margin-right: ${theme.spacing(2)};\n }\n `,\n pageBody: css`\n padding-left: ${theme.spacing(5.5)};\n `,\n tokensListHeader: css`\n display: flex;\n justify-content: space-between;\n align-items: center;\n `,\n };\n};\n\nexport const ServiceAccountPage = connector(ServiceAccountPageUnconnected);\n","import React from 'react';\nimport { Redirect } from 'react-router-dom';\n\nimport ErrorPage from 'app/core/components/ErrorPage/ErrorPage';\nimport { LoginPage } from 'app/core/components/Login/LoginPage';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport UserAdminPage from 'app/features/admin/UserAdminPage';\nimport LdapPage from 'app/features/admin/ldap/LdapPage';\nimport { getAlertingRoutes } from 'app/features/alerting/routes';\nimport { getRoutes as getDataConnectionsRoutes } from 'app/features/data-connections/routes';\nimport { DATASOURCES_ROUTES } from 'app/features/datasources/constants';\nimport { getLiveRoutes } from 'app/features/live/pages/routes';\nimport { getRoutes as getPluginCatalogRoutes } from 'app/features/plugins/admin/routes';\nimport { getProfileRoutes } from 'app/features/profile/routes';\nimport { ServiceAccountPage } from 'app/features/serviceaccounts/ServiceAccountPage';\nimport { AccessControlAction, DashboardRoutes } from 'app/types';\n\nimport { SafeDynamicImport } from '../core/components/DynamicImports/SafeDynamicImport';\nimport { RouteDescriptor } from '../core/navigation/types';\nimport { getPublicDashboardRoutes } from '../features/dashboard/routes';\n\nexport const extraRoutes: RouteDescriptor[] = [];\n\nexport function getAppRoutes(): RouteDescriptor[] {\n return [\n {\n path: '/',\n pageClass: 'page-dashboard',\n routeName: DashboardRoutes.Home,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardPage\" */ '../features/dashboard/containers/DashboardPage')\n ),\n },\n {\n path: '/d/:uid/:slug?',\n pageClass: 'page-dashboard',\n routeName: DashboardRoutes.Normal,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardPage\" */ '../features/dashboard/containers/DashboardPage')\n ),\n },\n {\n path: '/dashboard/:type/:slug',\n pageClass: 'page-dashboard',\n routeName: DashboardRoutes.Normal,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardPage\" */ '../features/dashboard/containers/DashboardPage')\n ),\n },\n {\n path: '/dashboard/new',\n pageClass: 'page-dashboard',\n routeName: DashboardRoutes.New,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardPage\" */ '../features/dashboard/containers/DashboardPage')\n ),\n },\n {\n path: '/d-solo/:uid/:slug',\n pageClass: 'dashboard-solo',\n routeName: DashboardRoutes.Normal,\n chromeless: true,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"SoloPanelPage\" */ '../features/dashboard/containers/SoloPanelPage')\n ),\n },\n // This route handles embedding of snapshot/scripted dashboard panels\n {\n path: '/dashboard-solo/:type/:slug',\n pageClass: 'dashboard-solo',\n routeName: DashboardRoutes.Normal,\n chromeless: true,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"SoloPanelPage\" */ '../features/dashboard/containers/SoloPanelPage')\n ),\n },\n {\n path: '/d-solo/:uid',\n pageClass: 'dashboard-solo',\n routeName: DashboardRoutes.Normal,\n chromeless: true,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"SoloPanelPage\" */ '../features/dashboard/containers/SoloPanelPage')\n ),\n },\n {\n path: '/dashboard/import',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardImport\"*/ 'app/features/manage-dashboards/DashboardImportPage')\n ),\n },\n {\n path: DATASOURCES_ROUTES.List,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DataSourcesListPage\"*/ 'app/features/datasources/pages/DataSourcesListPage')\n ),\n },\n {\n path: DATASOURCES_ROUTES.Edit,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"EditDataSourcePage\"*/ '../features/datasources/pages/EditDataSourcePage')\n ),\n },\n {\n path: DATASOURCES_ROUTES.Dashboards,\n component: SafeDynamicImport(\n () =>\n import(\n /* webpackChunkName: \"DataSourceDashboards\"*/ 'app/features/datasources/pages/DataSourceDashboardsPage'\n )\n ),\n },\n {\n path: DATASOURCES_ROUTES.New,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NewDataSourcePage\"*/ '../features/datasources/pages/NewDataSourcePage')\n ),\n },\n {\n path: '/dashboards',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardListPage\"*/ 'app/features/search/components/DashboardListPage')\n ),\n },\n {\n path: '/dashboards/folder/new',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NewDashboardsFolder\"*/ 'app/features/folders/components/NewDashboardsFolder')\n ),\n },\n {\n path: '/dashboards/f/:uid/:slug/permissions',\n component:\n config.rbacEnabled && contextSrv.hasPermission(AccessControlAction.FoldersPermissionsRead)\n ? SafeDynamicImport(\n () =>\n import(/* webpackChunkName: \"FolderPermissions\"*/ 'app/features/folders/AccessControlFolderPermissions')\n )\n : SafeDynamicImport(\n () => import(/* webpackChunkName: \"FolderPermissions\"*/ 'app/features/folders/FolderPermissions')\n ),\n },\n {\n path: '/dashboards/f/:uid/:slug/settings',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"FolderSettingsPage\"*/ 'app/features/folders/FolderSettingsPage')\n ),\n },\n {\n path: '/dashboards/f/:uid/:slug',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardListPage\"*/ 'app/features/search/components/DashboardListPage')\n ),\n },\n {\n path: '/dashboards/f/:uid',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardListPage\"*/ 'app/features/search/components/DashboardListPage')\n ),\n },\n {\n path: '/explore',\n pageClass: 'page-explore',\n roles: () =>\n contextSrv.evaluatePermission(\n () => (config.viewersCanEdit ? [] : ['Editor', 'Admin']),\n [AccessControlAction.DataSourcesExplore]\n ),\n component: SafeDynamicImport(() =>\n config.exploreEnabled\n ? import(/* webpackChunkName: \"explore\" */ 'app/features/explore/Wrapper')\n : import(/* webpackChunkName: \"explore-feature-toggle-page\" */ 'app/features/explore/FeatureTogglePage')\n ),\n },\n {\n path: '/a/:pluginId/',\n exact: false,\n // Someday * and will get a ReactRouter under that path!\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AppRootPage\" */ 'app/features/plugins/components/AppRootPage')\n ),\n },\n {\n path: '/org',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"OrgDetailsPage\" */ '../features/org/OrgDetailsPage')\n ),\n },\n {\n path: '/org/new',\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"NewOrgPage\" */ 'app/features/org/NewOrgPage')),\n },\n {\n path: '/org/users',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"UsersListPage\" */ 'app/features/users/UsersListPage')\n ),\n },\n {\n path: '/org/users/invite',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"UserInvitePage\" */ 'app/features/org/UserInvitePage')\n ),\n },\n {\n path: '/org/apikeys',\n roles: () => contextSrv.evaluatePermission(() => ['Admin'], [AccessControlAction.ActionAPIKeysRead]),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"ApiKeysPage\" */ 'app/features/api-keys/ApiKeysPage')\n ),\n },\n {\n path: '/org/serviceaccounts',\n roles: () =>\n contextSrv.evaluatePermission(\n () => ['Admin'],\n [AccessControlAction.ServiceAccountsRead, AccessControlAction.ServiceAccountsCreate]\n ),\n component: SafeDynamicImport(\n () =>\n import(/* webpackChunkName: \"ServiceAccountsPage\" */ 'app/features/serviceaccounts/ServiceAccountsListPage')\n ),\n },\n {\n path: '/org/serviceaccounts/create',\n component: SafeDynamicImport(\n () =>\n import(\n /* webpackChunkName: \"ServiceAccountCreatePage\" */ 'app/features/serviceaccounts/ServiceAccountCreatePage'\n )\n ),\n },\n {\n path: '/org/serviceaccounts/:id',\n component: ServiceAccountPage,\n },\n {\n path: '/org/teams',\n roles: () =>\n contextSrv.evaluatePermission(\n () => (config.editorsCanAdmin ? ['Editor', 'Admin'] : ['Admin']),\n [AccessControlAction.ActionTeamsRead, AccessControlAction.ActionTeamsCreate]\n ),\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"TeamList\" */ 'app/features/teams/TeamList')),\n },\n {\n path: '/org/teams/new',\n roles: () =>\n contextSrv.evaluatePermission(\n () => (config.editorsCanAdmin ? ['Editor', 'Admin'] : ['Admin']),\n [AccessControlAction.ActionTeamsCreate]\n ),\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"CreateTeam\" */ 'app/features/teams/CreateTeam')),\n },\n {\n path: '/org/teams/edit/:id/:page?',\n roles: () =>\n contextSrv.evaluatePermission(\n () => (config.editorsCanAdmin ? ['Editor', 'Admin'] : ['Admin']),\n [AccessControlAction.ActionTeamsRead, AccessControlAction.ActionTeamsCreate]\n ),\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"TeamPages\" */ 'app/features/teams/TeamPages')),\n },\n // ADMIN\n\n {\n path: '/admin',\n // eslint-disable-next-line react/display-name\n component: () => <Redirect to=\"/admin/users\" />,\n },\n {\n path: '/admin/settings',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AdminSettings\" */ 'app/features/admin/AdminSettings')\n ),\n },\n {\n path: '/admin/upgrading',\n component: SafeDynamicImport(() => import('app/features/admin/UpgradePage')),\n },\n {\n path: '/admin/users',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"UserListAdminPage\" */ 'app/features/admin/UserListAdminPage')\n ),\n },\n {\n path: '/admin/users/create',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"UserCreatePage\" */ 'app/features/admin/UserCreatePage')\n ),\n },\n {\n path: '/admin/users/edit/:id',\n component: UserAdminPage,\n },\n {\n path: '/admin/orgs',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AdminListOrgsPage\" */ 'app/features/admin/AdminListOrgsPage')\n ),\n },\n {\n path: '/admin/orgs/edit/:id',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"AdminEditOrgPage\" */ 'app/features/admin/AdminEditOrgPage')\n ),\n },\n {\n path: '/admin/storage/:path*',\n roles: () => ['Admin'],\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"StoragePage\" */ 'app/features/storage/StoragePage')\n ),\n },\n {\n path: '/admin/stats',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"ServerStats\" */ 'app/features/admin/ServerStats')\n ),\n },\n {\n path: '/admin/ldap',\n component: LdapPage,\n },\n // LOGIN / SIGNUP\n {\n path: '/login',\n component: LoginPage,\n pageClass: 'login-page sidemenu-hidden',\n chromeless: true,\n },\n {\n path: '/invite/:code',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"SignupInvited\" */ 'app/features/invites/SignupInvited')\n ),\n pageClass: 'sidemenu-hidden',\n chromeless: true,\n },\n {\n path: '/verify',\n component: !config.verifyEmailEnabled\n ? () => <Redirect to=\"/signup\" />\n : SafeDynamicImport(\n () => import(/* webpackChunkName \"VerifyEmailPage\"*/ 'app/core/components/Signup/VerifyEmailPage')\n ),\n pageClass: 'login-page sidemenu-hidden',\n chromeless: true,\n },\n {\n path: '/signup',\n component: config.disableUserSignUp\n ? () => <Redirect to=\"/login\" />\n : SafeDynamicImport(() => import(/* webpackChunkName \"SignupPage\"*/ 'app/core/components/Signup/SignupPage')),\n pageClass: 'sidemenu-hidden login-page',\n chromeless: true,\n },\n {\n path: '/user/password/send-reset-email',\n pageClass: 'sidemenu-hidden',\n chromeless: true,\n component: SafeDynamicImport(\n () =>\n import(/* webpackChunkName: \"SendResetMailPage\" */ 'app/core/components/ForgottenPassword/SendResetMailPage')\n ),\n },\n {\n path: '/user/password/reset',\n component: SafeDynamicImport(\n () =>\n import(\n /* webpackChunkName: \"ChangePasswordPage\" */ 'app/core/components/ForgottenPassword/ChangePasswordPage'\n )\n ),\n pageClass: 'sidemenu-hidden login-page',\n chromeless: true,\n },\n {\n path: '/dashboard/snapshots',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"SnapshotListPage\" */ 'app/features/manage-dashboards/SnapshotListPage')\n ),\n },\n {\n path: '/playlists',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"PlaylistPage\"*/ 'app/features/playlist/PlaylistPage')\n ),\n },\n {\n path: '/playlists/play/:uid',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"PlaylistStartPage\"*/ 'app/features/playlist/PlaylistStartPage')\n ),\n },\n {\n path: '/playlists/new',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"PlaylistNewPage\"*/ 'app/features/playlist/PlaylistNewPage')\n ),\n },\n {\n path: '/playlists/edit/:uid',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"PlaylistEditPage\"*/ 'app/features/playlist/PlaylistEditPage')\n ),\n },\n {\n path: '/sandbox/benchmarks',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"BenchmarksPage\"*/ 'app/features/sandbox/BenchmarksPage')\n ),\n },\n {\n path: '/sandbox/test',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"TestStuffPage\"*/ 'app/features/sandbox/TestStuffPage')\n ),\n },\n {\n path: '/dashboards/f/:uid/:slug/library-panels',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"FolderLibraryPanelsPage\"*/ 'app/features/folders/FolderLibraryPanelsPage')\n ),\n },\n {\n path: '/dashboards/f/:uid/:slug/alerting',\n roles: () =>\n contextSrv.evaluatePermission(() => ['Viewer', 'Editor', 'Admin'], [AccessControlAction.AlertingRuleRead]),\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"FolderAlerting\"*/ 'app/features/folders/FolderAlerting')\n ),\n },\n {\n path: '/library-panels',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"LibraryPanelsPage\"*/ 'app/features/library-panels/LibraryPanelsPage')\n ),\n },\n {\n path: '/notifications',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"NotificationsPage\"*/ 'app/features/notifications/NotificationsPage')\n ),\n },\n ...getBrowseStorageRoutes(),\n ...getDynamicDashboardRoutes(),\n ...getPluginCatalogRoutes(),\n ...getLiveRoutes(),\n ...getAlertingRoutes(),\n ...getProfileRoutes(),\n ...extraRoutes,\n ...getPublicDashboardRoutes(),\n ...getDataConnectionsRoutes(),\n {\n path: '/*',\n component: ErrorPage,\n },\n // TODO[Router]\n // ...playlistRoutes,\n ];\n}\n\nexport function getBrowseStorageRoutes(cfg = config): RouteDescriptor[] {\n if (!cfg.featureToggles.dashboardsFromStorage) {\n return [];\n }\n return [\n {\n path: '/g/:slug*.json', // suffix will eventually include dashboard\n pageClass: 'page-dashboard',\n routeName: DashboardRoutes.Path,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DashboardPage\" */ '../features/dashboard/containers/DashboardPage')\n ),\n },\n {\n path: '/g/:slug*',\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"StorageFolderPage\" */ '../features/storage/StorageFolderPage')\n ),\n },\n ];\n}\n\nexport function getDynamicDashboardRoutes(cfg = config): RouteDescriptor[] {\n if (!cfg.featureToggles.scenes) {\n return [];\n }\n return [\n {\n path: '/scenes',\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"scenes\"*/ 'app/features/scenes/SceneListPage')),\n },\n {\n path: '/scenes/:name',\n component: SafeDynamicImport(() => import(/* webpackChunkName: \"scenes\"*/ 'app/features/scenes/ScenePage')),\n },\n ];\n}\n","import React from 'react';\n\nexport const AngularRoot = React.forwardRef<HTMLDivElement, {}>((props, ref) => {\n return (\n <div\n id=\"ngRoot\"\n ref={ref}\n dangerouslySetInnerHTML={{\n __html: '<grafana-app ng-cloak></grafana-app>',\n }}\n />\n );\n});\n\nAngularRoot.displayName = 'AngularRoot';\n","import { Location } from 'history';\n\nimport { locationUtil, NavModelItem, NavSection } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime';\nimport { getConfig } from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nimport { ShowModalReactEvent } from '../../../types/events';\nimport appEvents from '../../app_events';\nimport { getFooterLinks } from '../Footer/Footer';\nimport { HelpModal } from '../help/HelpModal';\n\nexport const SEARCH_ITEM_ID = 'search';\nexport const NAV_MENU_PORTAL_CONTAINER_ID = 'navbar-menu-portal-container';\n\nexport const getNavMenuPortalContainer = () => document.getElementById(NAV_MENU_PORTAL_CONTAINER_ID) ?? document.body;\n\nexport const getForcedLoginUrl = (url: string) => {\n const queryParams = new URLSearchParams(url.split('?')[1]);\n queryParams.append('forceLogin', 'true');\n\n return `${getConfig().appSubUrl}${url.split('?')[0]}?${queryParams.toString()}`;\n};\n\nexport const enrichConfigItems = (\n items: NavModelItem[],\n location: Location<unknown>,\n toggleOrgSwitcher: () => void\n) => {\n const { isSignedIn, user } = contextSrv;\n const onOpenShortcuts = () => {\n appEvents.publish(new ShowModalReactEvent({ component: HelpModal }));\n };\n\n if (user && user.orgCount > 1) {\n const profileNode = items.find((bottomNavItem) => bottomNavItem.id === 'profile');\n if (profileNode) {\n profileNode.showOrgSwitcher = true;\n profileNode.subTitle = `Current Org.: ${user?.orgName}`;\n }\n }\n\n if (!isSignedIn) {\n const forcedLoginUrl = getForcedLoginUrl(location.pathname + location.search);\n\n items.unshift({\n icon: 'signout',\n id: 'signin',\n section: NavSection.Config,\n target: '_self',\n text: 'Sign in',\n url: forcedLoginUrl,\n });\n }\n\n items.forEach((link, index) => {\n let menuItems = link.children || [];\n\n if (link.id === 'help') {\n link.children = [\n ...getFooterLinks(),\n {\n id: 'keyboard-shortcuts',\n text: 'Keyboard shortcuts',\n icon: 'keyboard',\n onClick: onOpenShortcuts,\n },\n ];\n }\n\n if (link.showOrgSwitcher) {\n link.children = [\n ...menuItems,\n {\n id: 'switch-organization',\n text: 'Switch organization',\n icon: 'arrow-random',\n onClick: toggleOrgSwitcher,\n },\n ];\n }\n });\n return items;\n};\n\nexport const enrichWithInteractionTracking = (item: NavModelItem, expandedState: boolean) => {\n const onClick = item.onClick;\n item.onClick = () => {\n reportInteraction('grafana_navigation_item_clicked', {\n path: item.url ?? item.id,\n state: expandedState ? 'expanded' : 'collapsed',\n });\n onClick?.();\n };\n if (item.children) {\n item.children = item.children.map((item) => enrichWithInteractionTracking(item, expandedState));\n }\n return item;\n};\n\nexport const isMatchOrChildMatch = (itemToCheck: NavModelItem, searchItem?: NavModelItem) => {\n return Boolean(itemToCheck === searchItem || itemToCheck.children?.some((child) => child === searchItem));\n};\n\nconst stripQueryParams = (url?: string) => {\n return url?.split('?')[0] ?? '';\n};\n\nconst isBetterMatch = (newMatch: NavModelItem, currentMatch?: NavModelItem) => {\n const currentMatchUrl = stripQueryParams(currentMatch?.url);\n const newMatchUrl = stripQueryParams(newMatch.url);\n return newMatchUrl && newMatchUrl.length > currentMatchUrl?.length;\n};\n\nexport const getActiveItem = (\n navTree: NavModelItem[],\n pathname: string,\n currentBestMatch?: NavModelItem\n): NavModelItem | undefined => {\n const dashboardLinkMatch = '/dashboards';\n\n for (const link of navTree) {\n const linkWithoutParams = stripQueryParams(link.url);\n const linkPathname = locationUtil.stripBaseFromUrl(linkWithoutParams);\n if (linkPathname) {\n if (linkPathname === pathname) {\n // exact match\n currentBestMatch = link;\n break;\n } else if (linkPathname !== '/' && pathname.startsWith(linkPathname)) {\n // partial match\n if (isBetterMatch(link, currentBestMatch)) {\n currentBestMatch = link;\n }\n } else if (linkPathname === '/alerting/list' && pathname.startsWith('/alerting/notification/')) {\n // alert channel match\n // TODO refactor routes such that we don't need this custom logic\n currentBestMatch = link;\n break;\n } else if (linkPathname === dashboardLinkMatch && pathname.startsWith('/d/')) {\n // dashboard match\n // TODO refactor routes such that we don't need this custom logic\n if (isBetterMatch(link, currentBestMatch)) {\n currentBestMatch = link;\n }\n }\n }\n if (link.children) {\n currentBestMatch = getActiveItem(link.children, pathname, currentBestMatch);\n }\n if (stripQueryParams(currentBestMatch?.url) === pathname) {\n return currentBestMatch;\n }\n }\n return currentBestMatch;\n};\n\nexport const isSearchActive = (location: Location<unknown>) => {\n const query = new URLSearchParams(location.search);\n return query.get('search') === 'open';\n};\n\nexport function getNavModelItemKey(item: NavModelItem) {\n return item.id ?? item.text;\n}\n","import { NavModelItem } from '@grafana/data';\n\nexport const TOP_BAR_LEVEL_HEIGHT = 40;\n\nexport interface ToolbarUpdateProps {\n pageNav?: NavModelItem;\n actions?: React.ReactNode;\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nexport interface Props {\n children: JSX.Element;\n}\n\nexport const NavFeatureHighlight = ({ children }: Props): JSX.Element => {\n const styles = useStyles2(getStyles);\n return (\n <div>\n {children}\n <span className={styles.highlight} />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n highlight: css`\n background-color: ${theme.colors.success.main};\n border-radius: 50%;\n width: 6px;\n height: 6px;\n display: inline-block;\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n `,\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { ReactNode } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Link, useTheme2 } from '@grafana/ui';\n\nimport { NavFeatureHighlight } from './NavFeatureHighlight';\n\nexport interface NavBarItemWithoutMenuProps {\n label: string;\n children: ReactNode;\n className?: string;\n elClassName?: string;\n url?: string;\n target?: string;\n isActive?: boolean;\n onClick?: () => void;\n highlightText?: string;\n}\n\nexport function NavBarItemWithoutMenu({\n label,\n children,\n url,\n target,\n isActive = false,\n onClick,\n highlightText,\n className,\n elClassName,\n}: NavBarItemWithoutMenuProps) {\n const theme = useTheme2();\n const styles = getNavBarItemWithoutMenuStyles(theme, isActive);\n\n const content = highlightText ? (\n <NavFeatureHighlight>\n <div className={styles.icon}>{children}</div>\n </NavFeatureHighlight>\n ) : (\n <div className={styles.icon}>{children}</div>\n );\n\n const elStyle = cx(styles.element, elClassName);\n\n const renderContents = () => {\n if (!url) {\n return (\n <button className={elStyle} onClick={onClick} aria-label={label}>\n {content}\n </button>\n );\n } else if (!target && url.startsWith('/')) {\n return (\n <Link className={elStyle} href={url} target={target} aria-label={label} onClick={onClick} aria-haspopup=\"true\">\n {content}\n </Link>\n );\n } else {\n return (\n <a href={url} target={target} className={elStyle} onClick={onClick} aria-label={label}>\n {content}\n </a>\n );\n }\n };\n\n return <div className={cx(styles.container, className)}>{renderContents()}</div>;\n}\n\nexport function getNavBarItemWithoutMenuStyles(theme: GrafanaTheme2, isActive?: boolean) {\n return {\n container: css({\n position: 'relative',\n color: isActive ? theme.colors.text.primary : theme.colors.text.secondary,\n display: 'grid',\n\n '&:hover': {\n backgroundColor: theme.colors.action.hover,\n color: theme.colors.text.primary,\n },\n }),\n element: css({\n backgroundColor: 'transparent',\n border: 'none',\n color: 'inherit',\n display: 'block',\n padding: 0,\n overflowWrap: 'anywhere',\n\n '&::before': {\n display: isActive ? 'block' : 'none',\n content: \"' '\",\n position: 'absolute',\n left: theme.spacing(1),\n top: theme.spacing(1.5),\n bottom: theme.spacing(1.5),\n width: theme.spacing(0.5),\n borderRadius: theme.shape.borderRadius(1),\n backgroundImage: theme.colors.gradients.brandVertical,\n },\n\n '&:focus-visible': {\n backgroundColor: theme.colors.action.hover,\n boxShadow: 'none',\n color: theme.colors.text.primary,\n outline: `${theme.shape.borderRadius(1)} solid ${theme.colors.primary.main}`,\n outlineOffset: `-${theme.shape.borderRadius(1)}`,\n transition: 'none',\n },\n }),\n\n icon: css({\n height: '100%',\n width: '100%',\n\n img: {\n borderRadius: '50%',\n height: theme.spacing(3),\n width: theme.spacing(3),\n },\n }),\n };\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, IconName, Link, useTheme2 } from '@grafana/ui';\n\nexport interface Props {\n icon?: IconName;\n isActive?: boolean;\n isDivider?: boolean;\n onClick?: () => void;\n styleOverrides?: string;\n target?: HTMLAnchorElement['target'];\n text: React.ReactNode;\n url?: string;\n adjustHeightForBorder?: boolean;\n isMobile?: boolean;\n}\n\nexport function NavBarMenuItem({\n icon,\n isActive,\n isDivider,\n onClick,\n styleOverrides,\n target,\n text,\n url,\n isMobile = false,\n}: Props) {\n const theme = useTheme2();\n const styles = getStyles(theme, isActive);\n const elStyle = cx(styles.element, styleOverrides);\n const linkContent = (\n <div className={styles.linkContent}>\n {icon && <Icon data-testid=\"dropdown-child-icon\" name={icon} />}\n <div className={styles.linkText}>{text}</div>\n {target === '_blank' && (\n <Icon data-testid=\"external-link-icon\" name=\"external-link-alt\" className={styles.externalLinkIcon} />\n )}\n </div>\n );\n\n let element = (\n <button className={elStyle} onClick={onClick} tabIndex={-1}>\n {linkContent}\n </button>\n );\n\n if (url) {\n element =\n !target && url.startsWith('/') ? (\n <Link className={elStyle} href={url} target={target} onClick={onClick} tabIndex={!isMobile ? -1 : 0}>\n {linkContent}\n </Link>\n ) : (\n <a href={url} target={target} className={elStyle} onClick={onClick} tabIndex={!isMobile ? -1 : 0}>\n {linkContent}\n </a>\n );\n }\n\n if (isMobile) {\n return isDivider ? (\n <li data-testid=\"dropdown-child-divider\" className={styles.divider} tabIndex={-1} aria-disabled />\n ) : (\n <li className={styles.listItem}>{element}</li>\n );\n }\n\n return isDivider ? (\n <div data-testid=\"dropdown-child-divider\" className={styles.divider} tabIndex={-1} aria-disabled />\n ) : (\n <div style={{ position: 'relative' }}>{element}</div>\n );\n}\n\nNavBarMenuItem.displayName = 'NavBarMenuItem';\n\nconst getStyles = (theme: GrafanaTheme2, isActive: Props['isActive']) => ({\n linkContent: css({\n alignItems: 'center',\n display: 'flex',\n gap: '0.5rem',\n width: '100%',\n }),\n linkText: css({\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n }),\n externalLinkIcon: css({\n color: theme.colors.text.secondary,\n gridColumnStart: 3,\n }),\n element: css({\n alignItems: 'center',\n background: 'none',\n border: 'none',\n color: isActive ? theme.colors.text.primary : theme.colors.text.secondary,\n display: 'flex',\n flex: 1,\n fontSize: 'inherit',\n height: '100%',\n overflowWrap: 'anywhere',\n padding: theme.spacing(0.5, 2),\n textAlign: 'left',\n width: '100%',\n '&:hover, &:focus-visible': {\n backgroundColor: theme.colors.action.hover,\n color: theme.colors.text.primary,\n },\n '&:focus-visible': {\n boxShadow: 'none',\n outline: `2px solid ${theme.colors.primary.main}`,\n outlineOffset: '-2px',\n transition: 'none',\n },\n '&::before': {\n display: isActive ? 'block' : 'none',\n content: '\" \"',\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: theme.spacing(0.5),\n borderRadius: theme.shape.borderRadius(1),\n backgroundImage: theme.colors.gradients.brandVertical,\n },\n }),\n listItem: css({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n\n '&:hover, &:focus-within': {\n color: theme.colors.text.primary,\n\n '> *:first-child::after': {\n backgroundColor: theme.colors.action.hover,\n },\n },\n }),\n divider: css({\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n height: '1px',\n margin: `${theme.spacing(1)} 0`,\n overflow: 'hidden',\n }),\n});\n","import { css } from '@emotion/css';\nimport classnames from 'classnames';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { IconButton, useTheme2 } from '@grafana/ui';\n\nexport interface Props {\n className?: string;\n isExpanded: boolean;\n onClick: () => void;\n}\n\nexport const NavBarToggle = ({ className, isExpanded, onClick }: Props) => {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <IconButton\n aria-label={isExpanded ? 'Close navigation menu' : 'Open navigation menu'}\n name={isExpanded ? 'angle-left' : 'angle-right'}\n className={classnames(className, styles.icon)}\n size=\"xl\"\n onClick={onClick}\n />\n );\n};\n\nNavBarToggle.displayName = 'NavBarToggle';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n icon: css({\n backgroundColor: theme.colors.background.secondary,\n border: `1px solid ${theme.colors.border.weak}`,\n borderRadius: '50%',\n marginRight: 0,\n zIndex: theme.zIndex.sidemenu + 1,\n\n [theme.breakpoints.down('md')]: {\n display: 'none',\n },\n }),\n});\n","import { MessageDescriptor } from '@lingui/core';\nimport { defineMessage } from '@lingui/macro';\n\n// Maps the ID of the nav item to a translated phrase to later pass to <Trans />\n// Because the navigation content is dynamic (defined in the backend), we can not use\n// the normal inline message definition method.\n\n// The keys of the TRANSLATED_MENU_ITEMS object (NOT the id inside the defineMessage function)\n// must match the ID of the navigation item, as defined in the backend nav model\n\n// see pkg/api/index.go\nconst TRANSLATED_MENU_ITEMS: Record<string, MessageDescriptor> = {\n home: defineMessage({ id: 'nav.home', message: 'Home' }),\n\n create: defineMessage({ id: 'nav.create', message: 'Create' }),\n 'create-dashboard': defineMessage({ id: 'nav.create-dashboard', message: 'Dashboard' }),\n folder: defineMessage({ id: 'nav.create-folder', message: 'Folder' }),\n import: defineMessage({ id: 'nav.create-import', message: 'Import' }),\n alert: defineMessage({ id: 'nav.create-alert', message: 'New alert rule' }),\n\n starred: defineMessage({ id: 'nav.starred', message: 'Starred' }),\n 'starred-empty': defineMessage({ id: 'nav.starred-empty', message: 'Your starred dashboards will appear here' }),\n dashboards: defineMessage({ id: 'nav.dashboards', message: 'Dashboards' }),\n 'dashboards/browse': defineMessage({ id: 'nav.manage-dashboards', message: 'Browse' }),\n 'dashboards/playlists': defineMessage({ id: 'nav.playlists', message: 'Playlists' }),\n 'dashboards/snapshots': defineMessage({ id: 'nav.snapshots', message: 'Snapshots' }),\n 'dashboards/library-panels': defineMessage({ id: 'nav.library-panels', message: 'Library panels' }),\n 'dashboards/new': defineMessage({ id: 'nav.new-dashboard', message: 'New dashboard' }),\n 'dashboards/folder/new': defineMessage({ id: 'nav.new-folder', message: 'New folder' }),\n\n explore: defineMessage({ id: 'nav.explore', message: 'Explore' }),\n\n alerting: defineMessage({ id: 'nav.alerting', message: 'Alerting' }),\n 'alerting-legacy': defineMessage({ id: 'nav.alerting-legacy', message: 'Alerting (legacy)' }),\n 'alert-list': defineMessage({ id: 'nav.alerting-list', message: 'Alert rules' }),\n receivers: defineMessage({ id: 'nav.alerting-receivers', message: 'Contact points' }),\n 'am-routes': defineMessage({ id: 'nav.alerting-am-routes', message: 'Notification policies' }),\n channels: defineMessage({ id: 'nav.alerting-channels', message: 'Notification channels' }),\n\n silences: defineMessage({ id: 'nav.alerting-silences', message: 'Silences' }),\n groups: defineMessage({ id: 'nav.alerting-groups', message: 'Groups' }),\n 'alerting-admin': defineMessage({ id: 'nav.alerting-admin', message: 'Admin' }),\n\n cfg: defineMessage({ id: 'nav.config', message: 'Configuration' }),\n datasources: defineMessage({ id: 'nav.datasources', message: 'Data sources' }),\n users: defineMessage({ id: 'nav.users', message: 'Users' }),\n teams: defineMessage({ id: 'nav.teams', message: 'Teams' }),\n plugins: defineMessage({ id: 'nav.plugins', message: 'Plugins' }),\n 'org-settings': defineMessage({ id: 'nav.org-settings', message: 'Preferences' }),\n apikeys: defineMessage({ id: 'nav.api-keys', message: 'API keys' }),\n serviceaccounts: defineMessage({ id: 'nav.service-accounts', message: 'Service accounts' }),\n\n live: defineMessage({ id: 'nav.live', message: 'Event streaming' }),\n 'live-status': defineMessage({ id: 'nav.live-status', message: 'Status' }),\n 'live-pipeline': defineMessage({ id: 'nav.live-pipeline', message: 'Pipeline' }),\n 'live-cloud': defineMessage({ id: 'nav.live-cloud', message: 'Cloud' }),\n\n help: defineMessage({ id: 'nav.help', message: 'Help' }),\n\n 'profile-settings': defineMessage({ id: 'nav.profile/settings', message: 'Preferences' }),\n 'change-password': defineMessage({ id: 'nav.profile/password', message: 'Change password' }),\n 'sign-out': defineMessage({ id: 'nav.sign-out', message: 'Sign out' }),\n};\n\nexport default TRANSLATED_MENU_ITEMS;\n","import { css, cx } from '@emotion/css';\nimport { useLingui } from '@lingui/react';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { OverlayContainer, useOverlay } from '@react-aria/overlays';\nimport React, { useRef } from 'react';\nimport CSSTransition from 'react-transition-group/CSSTransition';\nimport { useLocalStorage } from 'react-use';\n\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime';\nimport { CollapsableSection, CustomScrollbar, Icon, IconButton, IconName, useStyles2, useTheme2 } from '@grafana/ui';\n\nimport { Branding } from '../Branding/Branding';\n\nimport { NavBarItemWithoutMenu } from './NavBarItemWithoutMenu';\nimport { NavBarMenuItem } from './NavBarMenuItem';\nimport { NavBarToggle } from './NavBarToggle';\nimport { NavFeatureHighlight } from './NavFeatureHighlight';\nimport menuItemTranslations from './navBarItem-translations';\nimport { isMatchOrChildMatch } from './utils';\n\nconst MENU_WIDTH = '350px';\n\nexport interface Props {\n activeItem?: NavModelItem;\n isOpen: boolean;\n navItems: NavModelItem[];\n setMenuAnimationInProgress: (isInProgress: boolean) => void;\n onClose: () => void;\n}\n\nexport function NavBarMenu({ activeItem, isOpen, navItems, onClose, setMenuAnimationInProgress }: Props) {\n const theme = useTheme2();\n const styles = getStyles(theme);\n const ANIMATION_DURATION = theme.transitions.duration.standard;\n const animStyles = getAnimStyles(theme, ANIMATION_DURATION);\n const ref = useRef(null);\n const { dialogProps } = useDialog({}, ref);\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isDismissable: true,\n isOpen,\n onClose,\n },\n ref\n );\n\n return (\n <OverlayContainer>\n <FocusScope contain restoreFocus autoFocus>\n <CSSTransition\n onEnter={() => setMenuAnimationInProgress(true)}\n onExited={() => setMenuAnimationInProgress(false)}\n appear={isOpen}\n in={isOpen}\n classNames={animStyles.overlay}\n timeout={ANIMATION_DURATION}\n >\n <div data-testid=\"navbarmenu\" ref={ref} {...overlayProps} {...dialogProps} className={styles.container}>\n <div className={styles.mobileHeader}>\n <Icon name=\"bars\" size=\"xl\" />\n <IconButton\n aria-label=\"Close navigation menu\"\n name=\"times\"\n onClick={onClose}\n size=\"xl\"\n variant=\"secondary\"\n />\n </div>\n <NavBarToggle\n className={styles.menuCollapseIcon}\n isExpanded={isOpen}\n onClick={() => {\n reportInteraction('grafana_navigation_collapsed');\n onClose();\n }}\n />\n <nav className={styles.content}>\n <CustomScrollbar hideHorizontalTrack>\n <ul className={styles.itemList}>\n {navItems.map((link) => (\n <NavItem link={link} onClose={onClose} activeItem={activeItem} key={link.text} />\n ))}\n </ul>\n </CustomScrollbar>\n </nav>\n </div>\n </CSSTransition>\n </FocusScope>\n <CSSTransition appear={isOpen} in={isOpen} classNames={animStyles.backdrop} timeout={ANIMATION_DURATION}>\n <div className={styles.backdrop} {...underlayProps} />\n </CSSTransition>\n </OverlayContainer>\n );\n}\n\nNavBarMenu.displayName = 'NavBarMenu';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n backdrop: css({\n backdropFilter: 'blur(1px)',\n backgroundColor: theme.components.overlay.background,\n bottom: 0,\n left: 0,\n position: 'fixed',\n right: 0,\n top: 0,\n zIndex: theme.zIndex.modalBackdrop,\n }),\n container: css({\n display: 'flex',\n bottom: 0,\n flexDirection: 'column',\n left: 0,\n paddingTop: theme.spacing(1),\n marginRight: theme.spacing(1.5),\n right: 0,\n zIndex: theme.zIndex.modal,\n position: 'fixed',\n top: 0,\n boxSizing: 'content-box',\n [theme.breakpoints.up('md')]: {\n borderRight: `1px solid ${theme.colors.border.weak}`,\n right: 'unset',\n },\n }),\n content: css({\n display: 'flex',\n flexDirection: 'column',\n overflow: 'auto',\n }),\n mobileHeader: css({\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n display: 'flex',\n justifyContent: 'space-between',\n padding: theme.spacing(1, 2, 2),\n [theme.breakpoints.up('md')]: {\n display: 'none',\n },\n }),\n itemList: css({\n display: 'grid',\n gridAutoRows: `minmax(${theme.spacing(6)}, auto)`,\n minWidth: MENU_WIDTH,\n }),\n menuCollapseIcon: css({\n position: 'absolute',\n top: '43px',\n right: '0px',\n transform: `translateX(50%)`,\n }),\n});\n\nconst getAnimStyles = (theme: GrafanaTheme2, animationDuration: number) => {\n const commonTransition = {\n transitionDuration: `${animationDuration}ms`,\n transitionTimingFunction: theme.transitions.easing.easeInOut,\n [theme.breakpoints.down('md')]: {\n overflow: 'hidden',\n },\n };\n\n const overlayTransition = {\n ...commonTransition,\n transitionProperty: 'background-color, box-shadow, width',\n // this is needed to prevent a horizontal scrollbar during the animation on firefox\n '.scrollbar-view': {\n overflow: 'hidden !important',\n },\n };\n\n const backdropTransition = {\n ...commonTransition,\n transitionProperty: 'opacity',\n };\n\n const overlayOpen = {\n backgroundColor: theme.colors.background.canvas,\n boxShadow: theme.shadows.z3,\n width: '100%',\n [theme.breakpoints.up('md')]: {\n width: MENU_WIDTH,\n },\n };\n\n const overlayClosed = {\n boxShadow: 'none',\n width: 0,\n [theme.breakpoints.up('md')]: {\n backgroundColor: theme.colors.background.primary,\n width: theme.spacing(7),\n },\n };\n\n const backdropOpen = {\n opacity: 1,\n };\n\n const backdropClosed = {\n opacity: 0,\n };\n\n return {\n backdrop: {\n appear: css(backdropClosed),\n appearActive: css(backdropTransition, backdropOpen),\n appearDone: css(backdropOpen),\n exit: css(backdropOpen),\n exitActive: css(backdropTransition, backdropClosed),\n },\n overlay: {\n appear: css(overlayClosed),\n appearActive: css(overlayTransition, overlayOpen),\n appearDone: css(overlayOpen),\n exit: css(overlayOpen),\n exitActive: css(overlayTransition, overlayClosed),\n },\n };\n};\n\nexport function NavItem({\n link,\n activeItem,\n onClose,\n}: {\n link: NavModelItem;\n activeItem?: NavModelItem;\n onClose: () => void;\n}) {\n const { i18n } = useLingui();\n const styles = useStyles2(getNavItemStyles);\n\n if (linkHasChildren(link)) {\n return (\n <CollapsibleNavItem onClose={onClose} link={link} isActive={isMatchOrChildMatch(link, activeItem)}>\n <ul className={styles.children}>\n {link.children.map(\n (childLink) =>\n !childLink.divider && (\n <NavBarMenuItem\n key={`${link.text}-${childLink.text}`}\n isActive={activeItem === childLink}\n isDivider={childLink.divider}\n icon={childLink.showIconInNavbar ? (childLink.icon as IconName) : undefined}\n onClick={() => {\n childLink.onClick?.();\n onClose();\n }}\n styleOverrides={styles.item}\n target={childLink.target}\n text={childLink.text}\n url={childLink.url}\n isMobile={true}\n />\n )\n )}\n </ul>\n </CollapsibleNavItem>\n );\n } else if (link.emptyMessageId) {\n const emptyMessageTranslated = i18n._(menuItemTranslations[link.emptyMessageId]);\n return (\n <CollapsibleNavItem onClose={onClose} link={link} isActive={isMatchOrChildMatch(link, activeItem)}>\n <ul className={styles.children}>\n <div className={styles.emptyMessage}>{emptyMessageTranslated}</div>\n </ul>\n </CollapsibleNavItem>\n );\n } else {\n const FeatureHighlightWrapper = link.highlightText ? NavFeatureHighlight : React.Fragment;\n return (\n <li className={styles.flex}>\n <NavBarItemWithoutMenu\n className={styles.itemWithoutMenu}\n elClassName={styles.fullWidth}\n label={link.text}\n url={link.url}\n target={link.target}\n onClick={() => {\n link.onClick?.();\n onClose();\n }}\n isActive={link === activeItem}\n >\n <div className={styles.itemWithoutMenuContent}>\n <div className={styles.iconContainer}>\n <FeatureHighlightWrapper>{getLinkIcon(link)}</FeatureHighlightWrapper>\n </div>\n <span className={styles.linkText}>{link.text}</span>\n </div>\n </NavBarItemWithoutMenu>\n </li>\n );\n }\n}\n\nconst getNavItemStyles = (theme: GrafanaTheme2) => ({\n children: css({\n display: 'flex',\n flexDirection: 'column',\n }),\n item: css({\n padding: `${theme.spacing(1)} ${theme.spacing(1.5)}`,\n width: `calc(100% - ${theme.spacing(3)})`,\n '&::before': {\n display: 'none',\n },\n }),\n flex: css({\n display: 'flex',\n }),\n itemWithoutMenu: css({\n position: 'relative',\n placeItems: 'inherit',\n justifyContent: 'start',\n display: 'flex',\n flexGrow: 1,\n alignItems: 'center',\n }),\n fullWidth: css({\n height: '100%',\n width: '100%',\n }),\n iconContainer: css({\n display: 'flex',\n placeContent: 'center',\n }),\n itemWithoutMenuContent: css({\n display: 'grid',\n gridAutoFlow: 'column',\n gridTemplateColumns: `${theme.spacing(7)} auto`,\n alignItems: 'center',\n height: '100%',\n }),\n linkText: css({\n fontSize: theme.typography.pxToRem(14),\n justifySelf: 'start',\n padding: theme.spacing(0.5, 4.25, 0.5, 0.5),\n }),\n emptyMessage: css({\n color: theme.colors.text.secondary,\n fontStyle: 'italic',\n padding: theme.spacing(1, 1.5),\n }),\n});\n\nfunction CollapsibleNavItem({\n link,\n isActive,\n children,\n className,\n onClose,\n}: {\n link: NavModelItem;\n isActive?: boolean;\n children: React.ReactNode;\n className?: string;\n onClose: () => void;\n}) {\n const styles = useStyles2(getCollapsibleStyles);\n const [sectionExpanded, setSectionExpanded] = useLocalStorage(`grafana.navigation.expanded[${link.text}]`, false);\n const FeatureHighlightWrapper = link.highlightText ? NavFeatureHighlight : React.Fragment;\n\n return (\n <li className={cx(styles.menuItem, className)}>\n <NavBarItemWithoutMenu\n isActive={isActive}\n label={link.text}\n url={link.url}\n target={link.target}\n onClick={() => {\n link.onClick?.();\n onClose();\n }}\n className={styles.collapsibleMenuItem}\n elClassName={styles.collapsibleIcon}\n >\n <FeatureHighlightWrapper>{getLinkIcon(link)}</FeatureHighlightWrapper>\n </NavBarItemWithoutMenu>\n <div className={styles.collapsibleSectionWrapper}>\n <CollapsableSection\n isOpen={Boolean(sectionExpanded)}\n onToggle={(isOpen) => setSectionExpanded(isOpen)}\n className={styles.collapseWrapper}\n contentClassName={styles.collapseContent}\n label={\n <div className={cx(styles.labelWrapper, { [styles.primary]: isActive })}>\n <span className={styles.linkText}>{link.text}</span>\n </div>\n }\n >\n {children}\n </CollapsableSection>\n </div>\n </li>\n );\n}\n\nconst getCollapsibleStyles = (theme: GrafanaTheme2) => ({\n menuItem: css({\n position: 'relative',\n display: 'grid',\n gridAutoFlow: 'column',\n gridTemplateColumns: `${theme.spacing(7)} minmax(calc(${MENU_WIDTH} - ${theme.spacing(7)}), auto)`,\n }),\n collapsibleMenuItem: css({\n height: theme.spacing(6),\n width: theme.spacing(7),\n display: 'grid',\n }),\n collapsibleIcon: css({\n display: 'grid',\n placeContent: 'center',\n }),\n collapsibleSectionWrapper: css({\n display: 'flex',\n flexGrow: 1,\n alignSelf: 'start',\n flexDirection: 'column',\n }),\n collapseWrapper: css({\n paddingLeft: theme.spacing(0.5),\n paddingRight: theme.spacing(4.25),\n minHeight: theme.spacing(6),\n overflowWrap: 'anywhere',\n alignItems: 'center',\n color: theme.colors.text.secondary,\n '&:hover, &:focus-within': {\n backgroundColor: theme.colors.action.hover,\n color: theme.colors.text.primary,\n },\n '&:focus-within': {\n boxShadow: 'none',\n outline: `2px solid ${theme.colors.primary.main}`,\n outlineOffset: '-2px',\n transition: 'none',\n },\n }),\n collapseContent: css({\n padding: 0,\n }),\n labelWrapper: css({\n fontSize: '15px',\n }),\n primary: css({\n color: theme.colors.text.primary,\n }),\n linkText: css({\n fontSize: theme.typography.pxToRem(14),\n justifySelf: 'start',\n }),\n});\n\nfunction linkHasChildren(link: NavModelItem): link is NavModelItem & { children: NavModelItem[] } {\n return Boolean(link.children && link.children.length > 0);\n}\n\nfunction getLinkIcon(link: NavModelItem) {\n if (link.icon === 'grafana') {\n return <Branding.MenuLogo />;\n } else if (link.icon) {\n return <Icon name={link.icon as IconName} size=\"xl\" />;\n } else {\n return <img src={link.img} alt={`${link.text} logo`} height=\"24\" width=\"24\" style={{ borderRadius: '50%' }} />;\n }\n}\n","import { css } from '@emotion/css';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { OverlayContainer, useOverlay } from '@react-aria/overlays';\nimport React, { useRef } from 'react';\nimport CSSTransition from 'react-transition-group/CSSTransition';\n\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime';\nimport { CustomScrollbar, Icon, IconButton, useTheme2 } from '@grafana/ui';\n\nimport { TOP_BAR_LEVEL_HEIGHT } from '../AppChrome/types';\nimport { NavItem } from '../NavBar/NavBarMenu';\nimport { NavBarToggle } from '../NavBar/NavBarToggle';\n\nconst MENU_WIDTH = '350px';\n\nexport interface Props {\n activeItem?: NavModelItem;\n navItems: NavModelItem[];\n searchBarHidden?: boolean;\n onClose: () => void;\n}\n\nexport function NavBarMenu({ activeItem, navItems, searchBarHidden, onClose }: Props) {\n const theme = useTheme2();\n const styles = getStyles(theme, searchBarHidden);\n const animationSpeed = theme.transitions.duration.shortest;\n const animStyles = getAnimStyles(theme, animationSpeed);\n const ref = useRef(null);\n const { dialogProps } = useDialog({}, ref);\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isDismissable: true,\n isOpen: true,\n onClose,\n },\n ref\n );\n\n return (\n <OverlayContainer>\n <FocusScope contain autoFocus>\n <CSSTransition appear={true} in={true} classNames={animStyles.overlay} timeout={animationSpeed}>\n <div data-testid=\"navbarmenu\" ref={ref} {...overlayProps} {...dialogProps} className={styles.container}>\n <div className={styles.mobileHeader}>\n <Icon name=\"bars\" size=\"xl\" />\n <IconButton\n aria-label=\"Close navigation menu\"\n name=\"times\"\n onClick={onClose}\n size=\"xl\"\n variant=\"secondary\"\n />\n </div>\n <NavBarToggle\n className={styles.menuCollapseIcon}\n isExpanded={true}\n onClick={() => {\n reportInteraction('grafana_navigation_collapsed');\n onClose();\n }}\n />\n <nav className={styles.content}>\n <CustomScrollbar hideHorizontalTrack>\n <ul className={styles.itemList}>\n {navItems.map((link) => (\n <NavItem link={link} onClose={onClose} activeItem={activeItem} key={link.text} />\n ))}\n </ul>\n </CustomScrollbar>\n </nav>\n </div>\n </CSSTransition>\n <CSSTransition appear={true} in={true} classNames={animStyles.backdrop} timeout={animationSpeed}>\n <div className={styles.backdrop} {...underlayProps} />\n </CSSTransition>\n </FocusScope>\n </OverlayContainer>\n );\n}\n\nNavBarMenu.displayName = 'NavBarMenu';\n\nconst getStyles = (theme: GrafanaTheme2, searchBarHidden?: boolean) => {\n const topPosition = (searchBarHidden ? TOP_BAR_LEVEL_HEIGHT : TOP_BAR_LEVEL_HEIGHT * 2) + 1;\n\n return {\n backdrop: css({\n backdropFilter: 'blur(1px)',\n backgroundColor: theme.components.overlay.background,\n bottom: 0,\n left: 0,\n position: 'fixed',\n right: 0,\n top: topPosition,\n zIndex: theme.zIndex.navbarFixed - 2,\n }),\n container: css({\n display: 'flex',\n bottom: 0,\n flexDirection: 'column',\n left: 0,\n paddingTop: theme.spacing(1),\n marginRight: theme.spacing(1.5),\n right: 0,\n // Needs to below navbar should we change the navbarFixed? add add a new level?\n zIndex: theme.zIndex.navbarFixed - 1,\n position: 'fixed',\n top: topPosition,\n boxSizing: 'content-box',\n [theme.breakpoints.up('md')]: {\n borderRight: `1px solid ${theme.colors.border.weak}`,\n right: 'unset',\n },\n }),\n content: css({\n display: 'flex',\n flexDirection: 'column',\n overflow: 'auto',\n }),\n mobileHeader: css({\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n display: 'flex',\n justifyContent: 'space-between',\n padding: theme.spacing(1, 2, 2),\n [theme.breakpoints.up('md')]: {\n display: 'none',\n },\n }),\n itemList: css({\n display: 'grid',\n gridAutoRows: `minmax(${theme.spacing(6)}, auto)`,\n minWidth: MENU_WIDTH,\n }),\n menuCollapseIcon: css({\n position: 'absolute',\n top: '43px',\n right: '0px',\n transform: `translateX(50%)`,\n }),\n };\n};\n\nconst getAnimStyles = (theme: GrafanaTheme2, animationDuration: number) => {\n const commonTransition = {\n transitionDuration: `${animationDuration}ms`,\n transitionTimingFunction: theme.transitions.easing.easeInOut,\n [theme.breakpoints.down('md')]: {\n overflow: 'hidden',\n },\n };\n\n const overlayTransition = {\n ...commonTransition,\n transitionProperty: 'background-color, box-shadow, width',\n // this is needed to prevent a horizontal scrollbar during the animation on firefox\n '.scrollbar-view': {\n overflow: 'hidden !important',\n },\n };\n\n const backdropTransition = {\n ...commonTransition,\n transitionProperty: 'opacity',\n };\n\n const overlayOpen = {\n backgroundColor: theme.colors.background.primary,\n boxShadow: theme.shadows.z3,\n width: '100%',\n [theme.breakpoints.up('md')]: {\n width: MENU_WIDTH,\n },\n };\n\n const overlayClosed = {\n boxShadow: 'none',\n width: 0,\n [theme.breakpoints.up('md')]: {\n backgroundColor: theme.colors.background.primary,\n width: theme.spacing(7),\n },\n };\n\n const backdropOpen = {\n opacity: 1,\n };\n\n const backdropClosed = {\n opacity: 0,\n };\n\n return {\n backdrop: {\n appear: css(backdropClosed),\n appearActive: css(backdropTransition, backdropOpen),\n appearDone: css(backdropOpen),\n exit: css(backdropOpen),\n exitActive: css(backdropTransition, backdropClosed),\n },\n overlay: {\n appear: css(overlayClosed),\n appearActive: css(overlayTransition, overlayOpen),\n appearDone: css(overlayOpen),\n exit: css(overlayOpen),\n exitActive: css(overlayTransition, overlayClosed),\n },\n };\n};\n","import { css } from '@emotion/css';\nimport { cloneDeep } from 'lodash';\nimport React, { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { GrafanaTheme2, NavModelItem, NavSection } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { useTheme2 } from '@grafana/ui';\nimport { StoreState } from 'app/types';\n\nimport { enrichConfigItems, enrichWithInteractionTracking, getActiveItem } from '../NavBar/utils';\n\nimport { NavBarMenu } from './NavBarMenu';\n\nexport interface Props {\n onClose: () => void;\n searchBarHidden?: boolean;\n}\n\nexport const MegaMenu = React.memo<Props>(({ onClose, searchBarHidden }) => {\n const navBarTree = useSelector((state: StoreState) => state.navBarTree);\n const theme = useTheme2();\n const styles = getStyles(theme);\n const location = useLocation();\n const [showSwitcherModal, setShowSwitcherModal] = useState(false);\n\n const toggleSwitcherModal = () => {\n setShowSwitcherModal(!showSwitcherModal);\n };\n\n const homeItem: NavModelItem = enrichWithInteractionTracking(\n {\n id: 'home',\n text: 'Home',\n url: config.appSubUrl || '/',\n icon: 'home-alt',\n },\n true\n );\n\n const navTree = cloneDeep(navBarTree);\n\n const coreItems = navTree\n .filter((item) => item.section === NavSection.Core)\n .map((item) => enrichWithInteractionTracking(item, true));\n const pluginItems = navTree\n .filter((item) => item.section === NavSection.Plugin)\n .map((item) => enrichWithInteractionTracking(item, true));\n const configItems = enrichConfigItems(\n navTree.filter((item) => item.section === NavSection.Config && item && item.id !== 'help' && item.id !== 'profile'),\n location,\n toggleSwitcherModal\n ).map((item) => enrichWithInteractionTracking(item, true));\n\n const activeItem = getActiveItem(navTree, location.pathname);\n\n return (\n <div className={styles.menuWrapper}>\n <NavBarMenu\n activeItem={activeItem}\n navItems={[homeItem, ...coreItems, ...pluginItems, ...configItems]}\n onClose={onClose}\n searchBarHidden={searchBarHidden}\n />\n </div>\n );\n});\n\nMegaMenu.displayName = 'MegaMenu';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n menuWrapper: css({\n position: 'fixed',\n display: 'grid',\n gridAutoFlow: 'column',\n height: '100%',\n zIndex: theme.zIndex.sidemenu,\n }),\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { useStyles2, Icon, IconName } from '@grafana/ui';\n\nexport interface Props {\n sectionNav: NavModelItem;\n pageNav?: NavModelItem;\n}\n\nexport interface Breadcrumb {\n text?: string;\n icon?: IconName;\n href?: string;\n}\n\nexport function Breadcrumbs({ sectionNav, pageNav }: Props) {\n const styles = useStyles2(getStyles);\n const crumbs: Breadcrumb[] = [{ icon: 'home-alt', href: '/' }];\n\n function addCrumbs(node: NavModelItem) {\n if (node.parentItem) {\n addCrumbs(node.parentItem);\n }\n\n crumbs.push({ text: node.text, href: node.url });\n }\n\n addCrumbs(sectionNav);\n\n if (pageNav) {\n addCrumbs(pageNav);\n }\n\n return (\n <ul className={styles.breadcrumbs}>\n {crumbs.map((breadcrumb, index) => (\n <li className={styles.breadcrumb} key={index}>\n {breadcrumb.href && (\n <a className={styles.breadcrumbLink} href={breadcrumb.href}>\n {breadcrumb.text}\n {breadcrumb.icon && <Icon name={breadcrumb.icon} />}\n </a>\n )}\n {!breadcrumb.href && <span className={styles.breadcrumbLink}>{breadcrumb.text}</span>}\n {index + 1 < crumbs.length && (\n <div className={styles.separator}>\n <Icon name=\"angle-right\" />\n </div>\n )}\n </li>\n ))}\n </ul>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n breadcrumbs: css({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'nowrap',\n fontWeight: theme.typography.fontWeightMedium,\n }),\n breadcrumb: css({\n display: 'flex',\n alignItems: 'center',\n }),\n separator: css({\n color: theme.colors.text.secondary,\n padding: theme.spacing(0, 0.5),\n }),\n breadcrumbLink: css({\n color: theme.colors.text.primary,\n whiteSpace: 'nowrap',\n '&:hover': {\n textDecoration: 'underline',\n },\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { Icon, IconButton, ToolbarButton, useStyles2 } from '@grafana/ui';\n\nimport { Breadcrumbs } from './Breadcrumbs';\nimport { NavToolbarSeparator } from './NavToolbarSeparator';\nimport { TOP_BAR_LEVEL_HEIGHT } from './types';\n\nexport interface Props {\n onToggleSearchBar(): void;\n onToggleMegaMenu(): void;\n searchBarHidden?: boolean;\n sectionNav: NavModelItem;\n pageNav?: NavModelItem;\n actions: React.ReactNode;\n}\n\nexport function NavToolbar({\n actions,\n searchBarHidden,\n sectionNav,\n pageNav,\n onToggleMegaMenu,\n onToggleSearchBar,\n}: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.pageToolbar}>\n <div className={styles.menuButton}>\n <IconButton name=\"bars\" tooltip=\"Toggle menu\" tooltipPlacement=\"bottom\" size=\"xl\" onClick={onToggleMegaMenu} />\n </div>\n <Breadcrumbs sectionNav={sectionNav} pageNav={pageNav} />\n <div className={styles.actions}>\n {actions}\n {actions && <NavToolbarSeparator />}\n <ToolbarButton onClick={onToggleSearchBar} narrow tooltip=\"Toggle top search bar\">\n <Icon name={searchBarHidden ? 'angle-down' : 'angle-up'} size=\"xl\" />\n </ToolbarButton>\n </div>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n pageToolbar: css({\n height: TOP_BAR_LEVEL_HEIGHT,\n display: 'flex',\n padding: theme.spacing(0, 2),\n alignItems: 'center',\n justifyContent: 'space-between',\n }),\n menuButton: css({\n display: 'flex',\n alignItems: 'center',\n paddingRight: theme.spacing(1),\n }),\n actions: css({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'nowrap',\n justifyContent: 'flex-end',\n paddingLeft: theme.spacing(1),\n flexGrow: 1,\n gap: theme.spacing(0.5),\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Dropdown, FilterInput, Icon, Menu, MenuItem, Tooltip, useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\n\nimport { TOP_BAR_LEVEL_HEIGHT } from './types';\n\nexport function TopSearchBar() {\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.searchBar}>\n <a className={styles.logo} href=\"/\" title=\"Go to home\">\n <Icon name=\"grafana\" size=\"xl\" />\n </a>\n <div className={styles.searchWrapper}>\n <FilterInput\n width={50}\n placeholder=\"Search grafana\"\n value={''}\n onChange={() => {}}\n className={styles.searchInput}\n />\n </div>\n <div className={styles.actions}>\n <Tooltip placement=\"bottom\" content=\"Help menu (todo)\">\n <button className={styles.actionItem}>\n <Icon name=\"question-circle\" size=\"lg\" />\n </button>\n </Tooltip>\n <Tooltip placement=\"bottom\" content=\"Grafana news (todo)\">\n <button className={styles.actionItem}>\n <Icon name=\"rss\" size=\"lg\" />\n </button>\n </Tooltip>\n <Tooltip placement=\"bottom\" content=\"User profile (todo)\">\n <Dropdown overlay={ProfileMenu}>\n <button className={styles.actionItem}>\n <img src={contextSrv.user.gravatarUrl} />\n </button>\n </Dropdown>\n </Tooltip>\n </div>\n </div>\n );\n}\n\n/**\n * This is just temporary, needs syncing with the backend option like DisableSignoutMenu\n */\nexport function ProfileMenu() {\n return (\n <Menu>\n <MenuItem url=\"profile\" label=\"Your profile\" />\n <MenuItem url=\"profile/notifications\" label=\"Your notifications\" />\n <MenuItem url=\"logout\" label=\"Sign out\" />\n </Menu>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n searchBar: css({\n height: TOP_BAR_LEVEL_HEIGHT,\n display: 'flex',\n padding: theme.spacing(0, 2),\n alignItems: 'center',\n justifyContent: 'space-between',\n border: `1px solid ${theme.colors.border.weak}`,\n }),\n logo: css({\n display: 'flex',\n }),\n searchWrapper: css({}),\n searchInput: css({}),\n actions: css({\n display: 'flex',\n flexGrow: 0,\n gap: theme.spacing(1),\n position: 'relative',\n width: 25, // this and the left pos is to make search input perfectly centered\n left: -83,\n }),\n actionItem: css({\n display: 'flex',\n flexGrow: 0,\n border: 'none',\n boxShadow: 'none',\n background: 'none',\n alignItems: 'center',\n\n color: theme.colors.text.secondary,\n '&:hover': {\n background: theme.colors.background.secondary,\n },\n img: {\n borderRadius: '50%',\n width: '24px',\n height: '24px',\n },\n }),\n };\n};\n","import { css, cx } from '@emotion/css';\nimport React, { PropsWithChildren } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\nimport { useGrafana } from 'app/core/context/GrafanaContext';\n\nimport { MegaMenu } from '../MegaMenu/MegaMenu';\n\nimport { NavToolbar } from './NavToolbar';\nimport { TopSearchBar } from './TopSearchBar';\nimport { TOP_BAR_LEVEL_HEIGHT } from './types';\n\nexport interface Props extends PropsWithChildren<{}> {}\n\nexport function AppChrome({ children }: Props) {\n const styles = useStyles2(getStyles);\n const { chrome } = useGrafana();\n const state = chrome.useState();\n\n if (state.chromeless || !config.featureToggles.topnav) {\n return <main className=\"main-view\">{children} </main>;\n }\n\n return (\n <main className=\"main-view\">\n <div className={styles.topNav}>\n {!state.searchBarHidden && <TopSearchBar />}\n <NavToolbar\n searchBarHidden={state.searchBarHidden}\n sectionNav={state.sectionNav}\n pageNav={state.pageNav}\n actions={state.actions}\n onToggleSearchBar={chrome.toggleSearchBar}\n onToggleMegaMenu={chrome.toggleMegaMenu}\n />\n </div>\n <div className={cx(styles.content, state.searchBarHidden && styles.contentNoSearchBar)}>{children}</div>\n {state.megaMenuOpen && <MegaMenu searchBarHidden={state.searchBarHidden} onClose={chrome.toggleMegaMenu} />}\n </main>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const shadow = theme.isDark\n ? `0 0.6px 1.5px rgb(0 0 0), 0 2px 4px rgb(0 0 0 / 40%), 0 5px 10px rgb(0 0 0 / 23%)`\n : '0 0.6px 1.5px rgb(0 0 0 / 8%), 0 2px 4px rgb(0 0 0 / 6%), 0 5px 10px rgb(0 0 0 / 5%)';\n\n return {\n content: css({\n display: 'flex',\n flexDirection: 'column',\n paddingTop: TOP_BAR_LEVEL_HEIGHT * 2,\n flexGrow: 1,\n height: '100%',\n }),\n contentNoSearchBar: css({\n paddingTop: TOP_BAR_LEVEL_HEIGHT,\n }),\n topNav: css({\n display: 'flex',\n position: 'fixed',\n zIndex: theme.zIndex.navbarFixed,\n left: 0,\n right: 0,\n boxShadow: shadow,\n background: theme.colors.background.primary,\n flexDirection: 'column',\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Alert, useStyles2 } from '@grafana/ui';\nimport { AppNotification, timeoutMap } from 'app/types';\n\ninterface Props {\n appNotification: AppNotification;\n onClearNotification: (id: string) => void;\n}\n\nexport default function AppNotificationItem({ appNotification, onClearNotification }: Props) {\n const styles = useStyles2(getStyles);\n\n useEffectOnce(() => {\n setTimeout(() => {\n onClearNotification(appNotification.id);\n }, timeoutMap[appNotification.severity]);\n });\n\n const showTraceId = config.featureToggles.tracing && appNotification.traceId;\n\n return (\n <Alert\n severity={appNotification.severity}\n title={appNotification.title}\n onRemove={() => onClearNotification(appNotification.id)}\n elevated\n >\n <div className={styles.wrapper}>\n <span>{appNotification.component || appNotification.text}</span>\n {showTraceId && <span className={styles.trace}>Trace ID: {appNotification.traceId}</span>}\n </div>\n </Alert>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n wrapper: css({\n display: 'flex',\n flexDirection: 'column',\n }),\n trace: css({\n fontSize: theme.typography.pxToRem(10),\n }),\n };\n}\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { AppEvents } from '@grafana/data';\nimport { VerticalGroup } from '@grafana/ui';\nimport { notifyApp, hideAppNotification } from 'app/core/actions';\nimport appEvents from 'app/core/app_events';\nimport { selectVisible } from 'app/core/reducers/appNotification';\nimport { StoreState } from 'app/types';\n\nimport {\n createErrorNotification,\n createSuccessNotification,\n createWarningNotification,\n} from '../../copy/appNotification';\n\nimport AppNotificationItem from './AppNotificationItem';\n\nexport interface OwnProps {}\n\nconst mapStateToProps = (state: StoreState, props: OwnProps) => ({\n appNotifications: selectVisible(state.appNotifications),\n});\n\nconst mapDispatchToProps = {\n notifyApp,\n hideAppNotification,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport class AppNotificationListUnConnected extends PureComponent<Props> {\n componentDidMount() {\n const { notifyApp } = this.props;\n\n appEvents.on(AppEvents.alertWarning, (payload) => notifyApp(createWarningNotification(...payload)));\n appEvents.on(AppEvents.alertSuccess, (payload) => notifyApp(createSuccessNotification(...payload)));\n appEvents.on(AppEvents.alertError, (payload) => notifyApp(createErrorNotification(...payload)));\n }\n\n onClearAppNotification = (id: string) => {\n this.props.hideAppNotification(id);\n };\n\n render() {\n const { appNotifications } = this.props;\n\n return (\n <div className=\"page-alert-list\">\n <VerticalGroup>\n {appNotifications.map((appNotification, index) => {\n return (\n <AppNotificationItem\n key={`${appNotification.id}-${index}`}\n appNotification={appNotification}\n onClearNotification={(id) => this.onClearAppNotification(id)}\n />\n );\n })}\n </VerticalGroup>\n </div>\n );\n }\n}\n\nexport const AppNotificationList = connector(AppNotificationListUnConnected);\n","import { css } from '@emotion/css';\nimport React, { ReactElement } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { UserOrgDTO } from '@grafana/data';\nimport { Button, CustomScrollbar, Modal } from '@grafana/ui';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nimport { api } from '../../features/profile/api';\n\ninterface Props {\n onDismiss: () => void;\n}\n\nexport function OrgSwitcher({ onDismiss }: Props): ReactElement {\n const { value: orgs = [] } = useAsync(() => {\n return api.loadOrgs();\n }, []);\n const currentOrgId = contextSrv.user.orgId;\n const contentClassName = css({\n display: 'flex',\n maxHeight: 'calc(85vh - 42px)',\n });\n const setCurrentOrg = async (org: UserOrgDTO) => {\n await api.setUserOrg(org);\n window.location.href = `${config.appSubUrl}${config.appSubUrl.endsWith('/') ? '' : '/'}?orgId=${org.orgId}`;\n };\n\n return (\n <Modal\n title=\"Switch Organization\"\n icon=\"arrow-random\"\n onDismiss={onDismiss}\n isOpen={true}\n contentClassName={contentClassName}\n >\n <CustomScrollbar autoHeightMin=\"100%\">\n <table className=\"filter-table form-inline\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Role</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {orgs.map((org) => (\n <tr key={org.orgId}>\n <td>{org.name}</td>\n <td>{org.role}</td>\n <td className=\"text-right\">\n {org.orgId === currentOrgId ? (\n <Button size=\"sm\">Current</Button>\n ) : (\n <Button variant=\"secondary\" size=\"sm\" onClick={() => setCurrentOrg(org)}>\n Switch to\n </Button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </CustomScrollbar>\n </Modal>\n );\n}\n","import { createContext, HTMLAttributes, useContext } from 'react';\n\nexport interface NavBarItemMenuContextProps {\n menuHasFocus: boolean;\n onClose: () => void;\n onLeft: () => void;\n menuProps?: HTMLAttributes<HTMLElement>;\n}\n\nexport const NavBarItemMenuContext = createContext<NavBarItemMenuContextProps>({\n menuHasFocus: false,\n onClose: () => undefined,\n onLeft: () => undefined,\n});\n\nexport function useNavBarItemMenuContext(): NavBarItemMenuContextProps {\n return useContext(NavBarItemMenuContext);\n}\n\nexport interface NavBarContextProps {\n menuIdOpen: string | undefined;\n setMenuIdOpen: (id: string | undefined) => void;\n}\n\nexport const NavBarContext = createContext<NavBarContextProps>({\n menuIdOpen: undefined,\n setMenuIdOpen: () => undefined,\n});\n\nexport function useNavBarContext(): NavBarContextProps {\n return useContext(NavBarContext);\n}\n","import { css } from '@emotion/css';\nimport { useFocus, useKeyboard } from '@react-aria/interactions';\nimport { useMenuItem } from '@react-aria/menu';\nimport { mergeProps } from '@react-aria/utils';\nimport { TreeState } from '@react-stately/tree';\nimport { Node } from '@react-types/shared';\nimport React, { ReactElement, useRef, useState } from 'react';\n\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\nimport { useNavBarItemMenuContext, useNavBarContext } from './context';\n\nexport interface NavBarItemMenuItemProps {\n item: Node<NavModelItem>;\n state: TreeState<NavModelItem>;\n onNavigate: (item: NavModelItem) => void;\n}\n\nexport function NavBarItemMenuItem({ item, state, onNavigate }: NavBarItemMenuItemProps): ReactElement {\n const { onClose, onLeft } = useNavBarItemMenuContext();\n const { setMenuIdOpen } = useNavBarContext();\n const { key, rendered } = item;\n const ref = useRef<HTMLLIElement>(null);\n const isDisabled = state.disabledKeys.has(key);\n\n // style to the focused menu item\n const [isFocused, setFocused] = useState(false);\n const { focusProps } = useFocus({ onFocusChange: setFocused, isDisabled });\n const theme = useTheme2();\n const isSection = item.value.menuItemType === 'section';\n const styles = getStyles(theme, isFocused, isSection);\n const onAction = () => {\n setMenuIdOpen(undefined);\n onNavigate(item.value);\n onClose();\n };\n\n let { menuItemProps } = useMenuItem(\n {\n isDisabled,\n 'aria-label': item['aria-label'],\n key,\n closeOnSelect: true,\n onClose,\n onAction,\n },\n state,\n ref\n );\n\n const { keyboardProps } = useKeyboard({\n onKeyDown: (e) => {\n if (e.key === 'ArrowLeft') {\n onLeft();\n }\n e.continuePropagation();\n },\n });\n\n return (\n <>\n <li {...mergeProps(menuItemProps, focusProps, keyboardProps)} ref={ref} className={styles.menuItem}>\n {rendered}\n </li>\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2, isFocused: boolean, isSection: boolean) {\n let backgroundColor = 'transparent';\n if (isFocused) {\n backgroundColor = theme.colors.action.hover;\n } else if (isSection) {\n backgroundColor = theme.colors.background.secondary;\n }\n return {\n menuItem: css`\n background-color: ${backgroundColor};\n color: ${theme.colors.text.primary};\n\n &:focus-visible {\n background-color: ${theme.colors.action.hover};\n box-shadow: none;\n color: ${theme.colors.text.primary};\n outline: 2px solid ${theme.colors.primary.main};\n outline-offset: -2px;\n transition: none;\n }\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { CustomScrollbar, Icon, useTheme2 } from '@grafana/ui';\n\nexport interface Props {\n children: React.ReactNode;\n}\n\nexport const NavBarScrollContainer = ({ children }: Props) => {\n const [showScrollTopIndicator, setShowTopScrollIndicator] = useState(false);\n const [showScrollBottomIndicator, setShowBottomScrollIndicator] = useState(false);\n const scrollTopMarker = useRef<HTMLDivElement>(null);\n const scrollBottomMarker = useRef<HTMLDivElement>(null);\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n // Here we observe the top and bottom markers to determine if we should show the scroll indicators\n useEffect(() => {\n const intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.target === scrollTopMarker.current) {\n setShowTopScrollIndicator(!entry.isIntersecting);\n } else if (entry.target === scrollBottomMarker.current) {\n setShowBottomScrollIndicator(!entry.isIntersecting);\n }\n });\n });\n [scrollTopMarker, scrollBottomMarker].forEach((ref) => {\n if (ref.current) {\n intersectionObserver.observe(ref.current);\n }\n });\n return () => intersectionObserver.disconnect();\n }, []);\n\n return (\n <CustomScrollbar className={styles.scrollContainer} hideVerticalTrack hideHorizontalTrack>\n <div\n className={cx(styles.scrollTopIndicator, {\n [styles.scrollIndicatorVisible]: showScrollTopIndicator,\n })}\n >\n <Icon className={styles.scrollTopIcon} name=\"angle-up\" />\n </div>\n <div className={styles.scrollContent}>\n <div className={styles.scrollTopMarker} ref={scrollTopMarker}></div>\n {children}\n <div className={styles.scrollBottomMarker} ref={scrollBottomMarker}></div>\n </div>\n <div\n className={cx(styles.scrollBottomIndicator, {\n [styles.scrollIndicatorVisible]: showScrollBottomIndicator,\n })}\n >\n <Icon className={styles.scrollBottomIcon} name=\"angle-down\" />\n </div>\n </CustomScrollbar>\n );\n};\n\nNavBarScrollContainer.displayName = 'NavBarScrollContainer';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n 'scrollTopMarker, scrollBottomMarker': css({\n height: theme.spacing(1),\n left: 0,\n position: 'absolute',\n pointerEvents: 'none',\n right: 0,\n }),\n scrollTopMarker: css({\n top: 0,\n }),\n scrollBottomMarker: css({\n bottom: 0,\n }),\n scrollContent: css({\n flex: 1,\n position: 'relative',\n }),\n // override the scroll container position so that the scroll indicators\n // are positioned at the top and bottom correctly.\n // react-custom-scrollbars doesn't provide any way for us to hook in nicely,\n // so we have to override with !important. feelsbad.\n scrollContainer: css`\n .scrollbar-view {\n position: static !important;\n }\n `,\n scrollTopIndicator: css({\n background: `linear-gradient(0deg, transparent, ${theme.colors.background.canvas})`,\n height: theme.spacing(6),\n left: 0,\n opacity: 0,\n pointerEvents: 'none',\n position: 'absolute',\n right: 0,\n top: 0,\n transition: theme.transitions.create('opacity'),\n zIndex: theme.zIndex.sidemenu,\n }),\n scrollBottomIndicator: css({\n background: `linear-gradient(0deg, ${theme.colors.background.canvas}, transparent)`,\n bottom: 0,\n height: theme.spacing(6),\n left: 0,\n opacity: 0,\n pointerEvents: 'none',\n position: 'absolute',\n right: 0,\n transition: theme.transitions.create('opacity'),\n zIndex: theme.zIndex.sidemenu,\n }),\n scrollIndicatorVisible: css({\n opacity: 1,\n }),\n scrollTopIcon: css({\n left: '50%',\n position: 'absolute',\n top: 0,\n transform: 'translateX(-50%)',\n }),\n scrollBottomIcon: css({\n bottom: 0,\n left: '50%',\n position: 'absolute',\n transform: 'translateX(-50%)',\n }),\n});\n","import { css } from '@emotion/css';\nimport { useLingui } from '@lingui/react';\nimport { useMenu } from '@react-aria/menu';\nimport { mergeProps } from '@react-aria/utils';\nimport { useTreeState } from '@react-stately/tree';\nimport { SpectrumMenuProps } from '@react-types/menu';\nimport React, { ReactElement, useEffect, useRef } from 'react';\n\nimport { GrafanaTheme2, NavMenuItemType, NavModelItem } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\nimport { NavBarItemMenuItem } from './NavBarItemMenuItem';\nimport { NavBarScrollContainer } from './NavBarScrollContainer';\nimport { useNavBarItemMenuContext } from './context';\nimport menuItemTranslations from './navBarItem-translations';\nimport { getNavModelItemKey } from './utils';\n\nexport interface NavBarItemMenuProps extends SpectrumMenuProps<NavModelItem> {\n onNavigate: (item: NavModelItem) => void;\n adjustHeightForBorder: boolean;\n reverseMenuDirection?: boolean;\n}\n\nexport function NavBarItemMenu(props: NavBarItemMenuProps): ReactElement | null {\n const { reverseMenuDirection, adjustHeightForBorder, disabledKeys, onNavigate, ...rest } = props;\n const { i18n } = useLingui();\n const contextProps = useNavBarItemMenuContext();\n const completeProps = {\n ...mergeProps(contextProps, rest),\n };\n const { menuHasFocus, menuProps: contextMenuProps = {} } = contextProps;\n const theme = useTheme2();\n const styles = getStyles(theme, reverseMenuDirection);\n const state = useTreeState<NavModelItem>({ ...rest, disabledKeys });\n const ref = useRef(null);\n const { menuProps } = useMenu(completeProps, { ...state }, ref);\n const allItems = [...state.collection];\n const items = allItems.filter((item) => item.value.menuItemType === NavMenuItemType.Item);\n const section = allItems.find((item) => item.value.menuItemType === NavMenuItemType.Section);\n\n useEffect(() => {\n if (menuHasFocus && !state.selectionManager.isFocused) {\n state.selectionManager.setFocusedKey(section?.key ?? '');\n state.selectionManager.setFocused(true);\n } else if (!menuHasFocus) {\n state.selectionManager.setFocused(false);\n state.selectionManager.setFocusedKey('');\n state.selectionManager.clearSelection();\n }\n }, [menuHasFocus, state.selectionManager, reverseMenuDirection, section?.key]);\n\n if (!section) {\n return null;\n }\n\n const menuSubTitle = section.value.subTitle;\n\n const headerComponent = <NavBarItemMenuItem key={section.key} item={section} state={state} onNavigate={onNavigate} />;\n\n const itemComponents = items.map((item) => (\n <NavBarItemMenuItem key={getNavModelItemKey(item.value)} item={item} state={state} onNavigate={onNavigate} />\n ));\n\n if (itemComponents.length === 0 && section.value.emptyMessageId) {\n const emptyMessageTranslated = i18n._(menuItemTranslations[section.value.emptyMessageId]);\n itemComponents.push(\n <div key=\"empty-message\" className={styles.emptyMessage}>\n {emptyMessageTranslated}\n </div>\n );\n }\n\n const subTitleComponent = menuSubTitle && (\n <li key={menuSubTitle} className={styles.subtitle}>\n {menuSubTitle}\n </li>\n );\n\n const contents = [itemComponents, subTitleComponent];\n const contentComponent = (\n <NavBarScrollContainer key=\"scrollContainer\">\n {reverseMenuDirection ? contents.reverse() : contents}\n </NavBarScrollContainer>\n );\n\n const menu = [headerComponent, contentComponent];\n\n return (\n <ul className={styles.menu} ref={ref} {...mergeProps(menuProps, contextMenuProps)} tabIndex={menuHasFocus ? 0 : -1}>\n {reverseMenuDirection ? menu.reverse() : menu}\n </ul>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2, reverseDirection?: boolean) {\n return {\n menu: css`\n background-color: ${theme.colors.background.primary};\n border: 1px solid ${theme.components.panel.borderColor};\n box-shadow: ${theme.shadows.z3};\n display: flex;\n flex-direction: column;\n list-style: none;\n max-height: 400px;\n max-width: 300px;\n min-width: 140px;\n transition: ${theme.transitions.create('opacity')};\n z-index: ${theme.zIndex.sidemenu};\n `,\n subtitle: css`\n background-color: transparent;\n border-${reverseDirection ? 'bottom' : 'top'}: 1px solid ${theme.colors.border.weak};\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.bodySmall.fontSize};\n font-weight: ${theme.typography.bodySmall.fontWeight};\n padding: ${theme.spacing(1)} ${theme.spacing(2)} ${theme.spacing(1)};\n text-align: left;\n white-space: nowrap;\n `,\n emptyMessage: css`\n font-style: italic;\n padding: ${theme.spacing(0.5, 2)};\n `,\n };\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\nconst NAV_MENU_PORTAL_CONTAINER_ID = 'navbar-menu-portal-container';\n\nexport const getNavMenuPortalContainer = () => document.getElementById(NAV_MENU_PORTAL_CONTAINER_ID) ?? document.body;\n\nexport const NavBarMenuPortalContainer = () => {\n const theme = useTheme2();\n const styles = getStyles(theme);\n return <div className={styles.menuPortalContainer} id={NAV_MENU_PORTAL_CONTAINER_ID} />;\n};\n\nNavBarMenuPortalContainer.displayName = 'NavBarMenuPortalContainer';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n menuPortalContainer: css({\n left: 0,\n position: 'fixed',\n right: 0,\n top: 0,\n zIndex: theme.zIndex.sidemenu,\n }),\n});\n","import { css, cx } from '@emotion/css';\nimport { useButton } from '@react-aria/button';\nimport { useDialog } from '@react-aria/dialog';\nimport { FocusScope } from '@react-aria/focus';\nimport { useFocusWithin, useHover, useKeyboard } from '@react-aria/interactions';\nimport { useMenuTrigger } from '@react-aria/menu';\nimport { DismissButton, OverlayContainer, useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { useMenuTriggerState } from '@react-stately/menu';\nimport { MenuTriggerProps } from '@react-types/menu';\nimport React, { ReactElement, useEffect, useState } from 'react';\n\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { reportExperimentView } from '@grafana/runtime';\nimport { Icon, IconName, Link, useTheme2 } from '@grafana/ui';\n\nimport { getNavMenuPortalContainer } from './NavBarMenuPortalContainer';\nimport { NavFeatureHighlight } from './NavFeatureHighlight';\nimport { NavBarItemMenuContext, useNavBarContext } from './context';\n\nexport interface NavBarItemMenuTriggerProps extends MenuTriggerProps {\n children: ReactElement;\n item: NavModelItem;\n isActive?: boolean;\n label: string;\n reverseMenuDirection: boolean;\n}\n\nexport function NavBarItemMenuTrigger(props: NavBarItemMenuTriggerProps): ReactElement {\n const { item, isActive, label, children: menu, reverseMenuDirection, ...rest } = props;\n const [menuHasFocus, setMenuHasFocus] = useState(false);\n const { menuIdOpen, setMenuIdOpen } = useNavBarContext();\n const theme = useTheme2();\n const styles = getStyles(theme, isActive);\n\n // Create state based on the incoming props\n const state = useMenuTriggerState({ ...rest });\n\n // Get props for the menu trigger and menu elements\n const ref = React.useRef<HTMLElement>(null);\n const { menuTriggerProps, menuProps } = useMenuTrigger({}, state, ref);\n\n useEffect(() => {\n if (item.highlightId) {\n reportExperimentView(`feature-highlights-${item.highlightId}-nav`, 'test', '');\n }\n }, [item.highlightId]);\n\n const { hoverProps } = useHover({\n onHoverChange: (isHovering) => {\n if (isHovering) {\n state.open();\n setMenuIdOpen(item.id);\n } else {\n state.close();\n setMenuIdOpen(undefined);\n }\n },\n });\n\n useEffect(() => {\n // close the menu when changing submenus\n if (menuIdOpen !== item.id) {\n state.close();\n setMenuHasFocus(false);\n } else {\n state.open();\n }\n }, [menuIdOpen, state, item.id]);\n\n const { keyboardProps } = useKeyboard({\n onKeyDown: (e) => {\n switch (e.key) {\n case 'ArrowRight':\n if (!state.isOpen) {\n state.open();\n setMenuIdOpen(item.id);\n }\n setMenuHasFocus(true);\n break;\n case 'Tab':\n setMenuIdOpen(undefined);\n break;\n default:\n break;\n }\n },\n });\n\n // Get props for the button based on the trigger props from useMenuTrigger\n const { buttonProps } = useButton(menuTriggerProps, ref);\n const Wrapper = item.highlightText ? NavFeatureHighlight : React.Fragment;\n const itemContent = (\n <Wrapper>\n <span className={styles.icon}>\n {item?.icon && <Icon name={item.icon as IconName} size=\"xl\" />}\n {item?.img && <img src={item.img} alt={`${item.text} logo`} />}\n </span>\n </Wrapper>\n );\n let element = (\n <button\n className={styles.element}\n {...buttonProps}\n {...keyboardProps}\n {...hoverProps}\n ref={ref as React.RefObject<HTMLButtonElement>}\n onClick={item?.onClick}\n aria-label={label}\n >\n {itemContent}\n </button>\n );\n\n if (item?.url) {\n element =\n !item.target && item.url.startsWith('/') ? (\n <Link\n {...buttonProps}\n {...keyboardProps}\n {...hoverProps}\n ref={ref as React.RefObject<HTMLAnchorElement>}\n href={item.url}\n target={item.target}\n onClick={item?.onClick}\n className={styles.element}\n aria-label={label}\n >\n {itemContent}\n </Link>\n ) : (\n <a\n href={item.url}\n target={item.target}\n onClick={item?.onClick}\n {...buttonProps}\n {...keyboardProps}\n {...hoverProps}\n ref={ref as React.RefObject<HTMLAnchorElement>}\n className={styles.element}\n aria-label={label}\n >\n {itemContent}\n </a>\n );\n }\n\n const overlayRef = React.useRef<HTMLDivElement>(null);\n const { dialogProps } = useDialog({}, overlayRef);\n const { overlayProps } = useOverlay(\n {\n onClose: () => {\n state.close();\n setMenuIdOpen(undefined);\n },\n isOpen: state.isOpen,\n isDismissable: true,\n },\n overlayRef\n );\n\n let { overlayProps: overlayPositionProps } = useOverlayPosition({\n targetRef: ref,\n overlayRef,\n placement: reverseMenuDirection ? 'right bottom' : 'right top',\n isOpen: state.isOpen,\n });\n\n const { focusWithinProps } = useFocusWithin({\n onFocusWithin: (e) => {\n if (e.target.id === ref.current?.id) {\n // If focussing on the trigger itself, set the menu id that is open\n setMenuIdOpen(item.id);\n state.open();\n }\n e.target.scrollIntoView?.({\n block: 'nearest',\n });\n },\n onBlurWithin: (e) => {\n if (e.target?.getAttribute('role') === 'menuitem' && !overlayRef.current?.contains(e.relatedTarget)) {\n // If it is blurring from a menuitem to an element outside the current overlay\n // close the menu that is open\n setMenuIdOpen(undefined);\n }\n },\n });\n\n return (\n <div className={cx(styles.element, 'dropdown')} {...focusWithinProps}>\n {element}\n {state.isOpen && (\n <OverlayContainer portalContainer={getNavMenuPortalContainer()}>\n <NavBarItemMenuContext.Provider\n value={{\n menuProps,\n menuHasFocus,\n onClose: () => state.close(),\n onLeft: () => {\n setMenuHasFocus(false);\n ref.current?.focus();\n },\n }}\n >\n <FocusScope restoreFocus>\n <div {...overlayProps} {...overlayPositionProps} {...dialogProps} {...hoverProps} ref={overlayRef}>\n <DismissButton onDismiss={() => state.close()} />\n {menu}\n <DismissButton onDismiss={() => state.close()} />\n </div>\n </FocusScope>\n </NavBarItemMenuContext.Provider>\n </OverlayContainer>\n )}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2, isActive?: boolean) => ({\n element: css({\n backgroundColor: 'transparent',\n border: 'none',\n color: 'inherit',\n display: 'grid',\n padding: 0,\n placeContent: 'center',\n height: theme.spacing(6),\n width: theme.spacing(7),\n\n '&::before': {\n display: isActive ? 'block' : 'none',\n content: '\" \"',\n position: 'absolute',\n left: theme.spacing(1),\n top: theme.spacing(1.5),\n bottom: theme.spacing(1.5),\n width: theme.spacing(0.5),\n borderRadius: theme.shape.borderRadius(1),\n backgroundImage: theme.colors.gradients.brandVertical,\n },\n\n '&:focus-visible': {\n backgroundColor: theme.colors.action.hover,\n boxShadow: 'none',\n color: theme.colors.text.primary,\n outline: `${theme.shape.borderRadius(1)} solid ${theme.colors.primary.main}`,\n outlineOffset: `-${theme.shape.borderRadius(1)}`,\n transition: 'none',\n },\n }),\n icon: css({\n height: '100%',\n width: '100%',\n\n img: {\n borderRadius: '50%',\n height: theme.spacing(3),\n width: theme.spacing(3),\n },\n }),\n});\n","import { css, cx } from '@emotion/css';\nimport { useLingui } from '@lingui/react';\nimport { Item } from '@react-stately/collections';\nimport React from 'react';\n\nimport { GrafanaTheme2, locationUtil, NavMenuItemType, NavModelItem } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { IconName, useTheme2 } from '@grafana/ui';\n\nimport { NavBarItemMenu } from './NavBarItemMenu';\nimport { NavBarItemMenuTrigger } from './NavBarItemMenuTrigger';\nimport { getNavBarItemWithoutMenuStyles } from './NavBarItemWithoutMenu';\nimport { NavBarMenuItem } from './NavBarMenuItem';\nimport { useNavBarContext } from './context';\nimport menuItemTranslations from './navBarItem-translations';\nimport { getNavModelItemKey } from './utils';\n\nexport interface Props {\n isActive?: boolean;\n className?: string;\n reverseMenuDirection?: boolean;\n link: NavModelItem;\n}\n\nconst NavBarItem = ({ isActive = false, className, reverseMenuDirection = false, link }: Props) => {\n const { i18n } = useLingui();\n const theme = useTheme2();\n const menuItems = link.children ?? [];\n const { menuIdOpen } = useNavBarContext();\n\n // Spreading `menuItems` here as otherwise we'd be mutating props\n const menuItemsSorted = reverseMenuDirection ? [...menuItems].reverse() : menuItems;\n const filteredItems = menuItemsSorted\n .filter((item) => !item.hideFromMenu)\n .map((i) => ({ ...i, menuItemType: NavMenuItemType.Item }));\n const adjustHeightForBorder = filteredItems.length === 0;\n const styles = getStyles(theme, adjustHeightForBorder, isActive);\n const section: NavModelItem = {\n ...link,\n children: filteredItems,\n menuItemType: NavMenuItemType.Section,\n };\n const items: NavModelItem[] = [section].concat(filteredItems);\n\n const onNavigate = (item: NavModelItem) => {\n const { url, target, onClick } = item;\n onClick?.();\n\n if (url) {\n if (!target && url.startsWith('/')) {\n locationService.push(locationUtil.stripBaseFromUrl(url));\n } else {\n window.open(url, target);\n }\n }\n };\n\n const translationKey = link.id && menuItemTranslations[link.id];\n const linkText = translationKey ? i18n._(translationKey) : link.text;\n\n return (\n <li className={cx(styles.container, { [styles.containerHover]: section.id === menuIdOpen }, className)}>\n <NavBarItemMenuTrigger\n item={section}\n isActive={isActive}\n label={linkText}\n reverseMenuDirection={reverseMenuDirection}\n >\n <NavBarItemMenu\n items={items}\n reverseMenuDirection={reverseMenuDirection}\n adjustHeightForBorder={adjustHeightForBorder}\n disabledKeys={['divider', 'subtitle']}\n aria-label={section.text}\n onNavigate={onNavigate}\n >\n {(item: NavModelItem) => {\n const translationKey = item.id && menuItemTranslations[item.id];\n const itemText = translationKey ? i18n._(translationKey) : item.text;\n const isSection = item.menuItemType === NavMenuItemType.Section;\n const icon = item.showIconInNavbar && !isSection ? (item.icon as IconName) : undefined;\n\n return (\n <Item key={getNavModelItemKey(item)} textValue={item.text}>\n <NavBarMenuItem\n isDivider={!isSection && item.divider}\n icon={icon}\n target={item.target}\n text={itemText}\n url={item.url}\n onClick={item.onClick}\n styleOverrides={cx(styles.primaryText, { [styles.header]: isSection })}\n />\n </Item>\n );\n }}\n </NavBarItemMenu>\n </NavBarItemMenuTrigger>\n </li>\n );\n};\n\nexport default NavBarItem;\n\nconst getStyles = (theme: GrafanaTheme2, adjustHeightForBorder: boolean, isActive?: boolean) => ({\n ...getNavBarItemWithoutMenuStyles(theme, isActive),\n containerHover: css({\n backgroundColor: theme.colors.action.hover,\n color: theme.colors.text.primary,\n }),\n primaryText: css({\n color: theme.colors.text.primary,\n }),\n header: css({\n height: `calc(${theme.spacing(6)} - ${adjustHeightForBorder ? 2 : 1}px)`,\n fontSize: theme.typography.h4.fontSize,\n fontWeight: theme.typography.h4.fontWeight,\n padding: `${theme.spacing(1)} ${theme.spacing(2)}`,\n whiteSpace: 'nowrap',\n width: '100%',\n }),\n});\n","import { css, cx } from '@emotion/css';\nimport { FocusScope } from '@react-aria/focus';\nimport { cloneDeep } from 'lodash';\nimport React, { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { GrafanaTheme2, NavModelItem, NavSection } from '@grafana/data';\nimport { config, locationService, reportInteraction } from '@grafana/runtime';\nimport { Icon, useTheme2 } from '@grafana/ui';\nimport { Branding } from 'app/core/components/Branding/Branding';\nimport { getKioskMode } from 'app/core/navigation/kiosk';\nimport { KioskMode, StoreState } from 'app/types';\n\nimport { OrgSwitcher } from '../OrgSwitcher';\n\nimport NavBarItem from './NavBarItem';\nimport { NavBarItemWithoutMenu } from './NavBarItemWithoutMenu';\nimport { NavBarMenu } from './NavBarMenu';\nimport { NavBarMenuPortalContainer } from './NavBarMenuPortalContainer';\nimport { NavBarScrollContainer } from './NavBarScrollContainer';\nimport { NavBarToggle } from './NavBarToggle';\nimport { NavBarContext } from './context';\nimport {\n enrichConfigItems,\n enrichWithInteractionTracking,\n getActiveItem,\n isMatchOrChildMatch,\n isSearchActive,\n SEARCH_ITEM_ID,\n} from './utils';\n\nconst onOpenSearch = () => {\n locationService.partial({ search: 'open' });\n};\n\nexport const NavBar = React.memo(() => {\n const navBarTree = useSelector((state: StoreState) => state.navBarTree);\n const theme = useTheme2();\n const styles = getStyles(theme);\n const location = useLocation();\n const kiosk = getKioskMode();\n const [showSwitcherModal, setShowSwitcherModal] = useState(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const [menuAnimationInProgress, setMenuAnimationInProgress] = useState(false);\n const [menuIdOpen, setMenuIdOpen] = useState<string | undefined>(undefined);\n\n const toggleSwitcherModal = () => {\n setShowSwitcherModal(!showSwitcherModal);\n };\n\n // Here we need to hack in a \"home\" and \"search\" NavModelItem since this is constructed in the frontend\n const searchItem: NavModelItem = enrichWithInteractionTracking(\n {\n id: SEARCH_ITEM_ID,\n onClick: onOpenSearch,\n text: 'Search dashboards',\n icon: 'search',\n },\n menuOpen\n );\n\n const homeItem: NavModelItem = enrichWithInteractionTracking(\n {\n id: 'home',\n text: 'Home',\n url: config.appSubUrl || '/',\n icon: 'grafana',\n },\n menuOpen\n );\n\n const navTree = cloneDeep(navBarTree);\n\n const coreItems = navTree\n .filter((item) => item.section === NavSection.Core)\n .map((item) => enrichWithInteractionTracking(item, menuOpen));\n const pluginItems = navTree\n .filter((item) => item.section === NavSection.Plugin)\n .map((item) => enrichWithInteractionTracking(item, menuOpen));\n const configItems = enrichConfigItems(\n navTree.filter((item) => item.section === NavSection.Config),\n location,\n toggleSwitcherModal\n ).map((item) => enrichWithInteractionTracking(item, menuOpen));\n\n const activeItem = isSearchActive(location) ? searchItem : getActiveItem(navTree, location.pathname);\n\n if (kiosk !== KioskMode.Off) {\n return null;\n }\n return (\n <div className={styles.navWrapper}>\n <nav className={cx(styles.sidemenu, 'sidemenu')} data-testid=\"sidemenu\" aria-label=\"Main menu\">\n <NavBarContext.Provider\n value={{\n menuIdOpen: menuIdOpen,\n setMenuIdOpen: setMenuIdOpen,\n }}\n >\n <FocusScope>\n <div className={styles.mobileSidemenuLogo} onClick={() => setMenuOpen(!menuOpen)} key=\"hamburger\">\n <Icon name=\"bars\" size=\"xl\" />\n </div>\n\n <NavBarToggle\n className={styles.menuExpandIcon}\n isExpanded={menuOpen}\n onClick={() => {\n reportInteraction('grafana_navigation_expanded');\n setMenuOpen(true);\n }}\n />\n\n <NavBarMenuPortalContainer />\n\n <NavBarItemWithoutMenu\n elClassName={styles.grafanaLogoInner}\n label={homeItem.text}\n className={styles.grafanaLogo}\n url={homeItem.url}\n onClick={homeItem.onClick}\n >\n <Branding.MenuLogo />\n </NavBarItemWithoutMenu>\n\n <NavBarScrollContainer>\n <ul className={styles.itemList}>\n <NavBarItem className={styles.search} isActive={activeItem === searchItem} link={searchItem} />\n\n {coreItems.map((link, index) => (\n <NavBarItem\n key={`${link.id}-${index}`}\n isActive={isMatchOrChildMatch(link, activeItem)}\n link={{ ...link, subTitle: undefined }}\n />\n ))}\n\n {pluginItems.length > 0 &&\n pluginItems.map((link, index) => (\n <NavBarItem\n key={`${link.id}-${index}`}\n isActive={isMatchOrChildMatch(link, activeItem)}\n link={link}\n />\n ))}\n\n {configItems.map((link, index) => (\n <NavBarItem\n key={`${link.id}-${index}`}\n isActive={isMatchOrChildMatch(link, activeItem)}\n reverseMenuDirection\n link={link}\n className={cx({ [styles.verticalSpacer]: index === 0 })}\n />\n ))}\n </ul>\n </NavBarScrollContainer>\n </FocusScope>\n </NavBarContext.Provider>\n </nav>\n {showSwitcherModal && <OrgSwitcher onDismiss={toggleSwitcherModal} />}\n {(menuOpen || menuAnimationInProgress) && (\n <div className={styles.menuWrapper}>\n <NavBarMenu\n activeItem={activeItem}\n isOpen={menuOpen}\n setMenuAnimationInProgress={setMenuAnimationInProgress}\n navItems={[homeItem, searchItem, ...coreItems, ...pluginItems, ...configItems]}\n onClose={() => setMenuOpen(false)}\n />\n </div>\n )}\n </div>\n );\n});\n\nNavBar.displayName = 'NavBar';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n navWrapper: css({\n position: 'relative',\n display: 'flex',\n\n '.sidemenu-hidden &': {\n display: 'none',\n },\n }),\n sidemenu: css({\n label: 'sidemenu',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: theme.colors.background.primary,\n zIndex: theme.zIndex.sidemenu,\n padding: `${theme.spacing(1)} 0`,\n position: 'relative',\n width: theme.components.sidemenu.width,\n borderRight: `1px solid ${theme.colors.border.weak}`,\n\n [theme.breakpoints.down('md')]: {\n height: theme.spacing(7),\n position: 'fixed',\n paddingTop: '0px',\n backgroundColor: 'inherit',\n borderRight: 0,\n },\n }),\n mobileSidemenuLogo: css({\n alignItems: 'center',\n cursor: 'pointer',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n padding: theme.spacing(2),\n\n [theme.breakpoints.up('md')]: {\n display: 'none',\n },\n }),\n itemList: css({\n backgroundColor: 'inherit',\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n\n [theme.breakpoints.down('md')]: {\n visibility: 'hidden',\n },\n }),\n grafanaLogo: css({\n alignItems: 'stretch',\n display: 'flex',\n flexShrink: 0,\n height: theme.spacing(6),\n justifyContent: 'stretch',\n\n [theme.breakpoints.down('md')]: {\n visibility: 'hidden',\n },\n }),\n grafanaLogoInner: css({\n alignItems: 'center',\n display: 'flex',\n height: '100%',\n justifyContent: 'center',\n width: '100%',\n\n '> div': {\n height: 'auto',\n width: 'auto',\n },\n }),\n search: css({\n display: 'none',\n marginTop: 0,\n\n [theme.breakpoints.up('md')]: {\n display: 'grid',\n },\n }),\n verticalSpacer: css({\n marginTop: 'auto',\n }),\n hideFromMobile: css({\n [theme.breakpoints.down('md')]: {\n display: 'none',\n },\n }),\n menuWrapper: css({\n position: 'fixed',\n display: 'grid',\n gridAutoFlow: 'column',\n height: '100%',\n zIndex: theme.zIndex.sidemenu,\n }),\n menuExpandIcon: css({\n position: 'absolute',\n top: '43px',\n right: '0px',\n transform: `translateX(50%)`,\n }),\n menuPortalContainer: css({\n zIndex: theme.zIndex.sidemenu,\n }),\n});\n","import { I18n, i18n } from '@lingui/core';\nimport { I18nProvider as LinguiI18nProvider } from '@lingui/react';\nimport React, { useEffect } from 'react';\n\nimport config from 'app/core/config';\n\nimport { messages as fallbackMessages } from '../../../locales/en-US/messages';\n\nimport { DEFAULT_LOCALE, FRENCH_FRANCE, SPANISH_SPAIN, VALID_LOCALES } from './constants';\n\nlet i18nInstance: I18n;\n\nexport async function getI18n(localInput = DEFAULT_LOCALE) {\n if (i18nInstance) {\n return i18nInstance;\n }\n\n const validatedLocale = VALID_LOCALES.includes(localInput) ? localInput : DEFAULT_LOCALE;\n\n // Dynamically load the messages for the user's locale\n const imp =\n config.featureToggles.internationalization &&\n (await import(`../../../locales/${validatedLocale}/messages`).catch((err) => {\n // TODO: Properly return an error if we can't find the messages for a locale\n return err;\n }));\n\n i18n.load(validatedLocale, imp?.messages || fallbackMessages);\n\n // Browser support for Intl.PluralRules is good and covers what we support in .browserlistrc,\n // but because this could potentially be in a the critical path of loading the frontend lets\n // be extra careful\n // If this isnt loaded, Lingui will log a warning and plurals will not be translated correctly.\n const supportsPluralRules = 'Intl' in window && 'PluralRules' in Intl;\n if (supportsPluralRules) {\n const pluralsOrdinal = new Intl.PluralRules(validatedLocale, { type: 'ordinal' });\n const pluralsCardinal = new Intl.PluralRules(validatedLocale, { type: 'cardinal' });\n i18n.loadLocaleData(validatedLocale, {\n plurals(count: number, ordinal: boolean) {\n return (ordinal ? pluralsOrdinal : pluralsCardinal).select(count);\n },\n });\n }\n\n i18n.activate(validatedLocale);\n i18nInstance = i18n;\n\n return i18nInstance;\n}\n\ninterface I18nProviderProps {\n children: React.ReactNode;\n}\nexport function I18nProvider({ children }: I18nProviderProps) {\n useEffect(() => {\n let loc;\n if (config.featureToggles.internationalization) {\n // TODO: Use locale preference instead of weekStart\n switch (config.bootData.user.weekStart) {\n case 'saturday':\n loc = SPANISH_SPAIN;\n break;\n case 'sunday':\n loc = FRENCH_FRANCE;\n break;\n default:\n loc = DEFAULT_LOCALE;\n break;\n }\n }\n\n getI18n(loc);\n }, []);\n\n return (\n <LinguiI18nProvider i18n={i18n} forceRenderOnLocaleChange={false}>\n {children}\n </LinguiI18nProvider>\n );\n}\n\n// This is only really used for ModalManager, as that creates a new react root we need to make sure is localisable.\nexport function provideI18n<P>(WrappedWithI18N: React.ComponentType<P>) {\n const I18nProviderWrapper = (props: P) => {\n return (\n <I18nProvider>\n <WrappedWithI18N {...props} />\n </I18nProvider>\n );\n };\n return I18nProviderWrapper;\n}\n","import React, { useEffect } from 'react';\n// @ts-ignore\nimport Drop from 'tether-drop';\n\nimport { locationSearchToObject, navigationLogger, reportPageview } from '@grafana/runtime';\n\nimport { useGrafana } from '../context/GrafanaContext';\nimport { keybindingSrv } from '../services/keybindingSrv';\n\nimport { GrafanaRouteComponentProps, RouteDescriptor } from './types';\n\nexport interface Props extends Omit<GrafanaRouteComponentProps, 'queryParams'> {}\n\nexport function GrafanaRoute(props: Props) {\n const { chrome } = useGrafana();\n\n chrome.registerRouteRender(props.route);\n\n useEffect(() => {\n updateBodyClassNames(props.route);\n cleanupDOM();\n reportPageview();\n navigationLogger('GrafanaRoute', false, 'Mounted', props.match);\n\n return () => {\n navigationLogger('GrafanaRoute', false, 'Unmounted', props.route);\n updateBodyClassNames(props.route, true);\n };\n // props.match instance change even though only query params changed so to make this effect only trigger on route mount we have to disable exhaustive-deps\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n // unbinds all and re-bind global keybindins\n keybindingSrv.reset();\n keybindingSrv.initGlobals();\n }, [chrome, props.route]);\n\n useEffect(() => {\n cleanupDOM();\n reportPageview();\n navigationLogger('GrafanaRoute', false, 'Updated', props);\n });\n\n navigationLogger('GrafanaRoute', false, 'Rendered', props.route);\n\n return <props.route.component {...props} queryParams={locationSearchToObject(props.location.search)} />;\n}\n\nfunction getPageClasses(route: RouteDescriptor) {\n return route.pageClass ? route.pageClass.split(' ') : [];\n}\n\nfunction updateBodyClassNames(route: RouteDescriptor, clear = false) {\n for (const cls of getPageClasses(route)) {\n if (clear) {\n document.body.classList.remove(cls);\n } else {\n document.body.classList.add(cls);\n }\n }\n}\n\nfunction cleanupDOM() {\n document.body.classList.remove('sidemenu-open--xs');\n\n // cleanup tooltips\n const tooltipById = document.getElementById('tooltip');\n tooltipById?.parentElement?.removeChild(tooltipById);\n\n const tooltipsByClass = document.querySelectorAll('.tooltip');\n for (let i = 0; i < tooltipsByClass.length; i++) {\n const tooltip = tooltipsByClass[i];\n tooltip.parentElement?.removeChild(tooltip);\n }\n\n // cleanup tether-drop\n for (const drop of Drop.drops) {\n drop.destroy();\n }\n}\n","import { css } from '@emotion/css';\nimport { ActionId, ActionImpl } from 'kbar';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\nexport const ResultItem = React.forwardRef(\n (\n {\n action,\n active,\n currentRootActionId,\n }: {\n action: ActionImpl;\n active: boolean;\n currentRootActionId: ActionId;\n },\n ref: React.Ref<HTMLDivElement>\n ) => {\n const ancestors = React.useMemo(() => {\n if (!currentRootActionId) {\n return action.ancestors;\n }\n\n const index = action.ancestors.findIndex((ancestor) => ancestor.id === currentRootActionId);\n // +1 removes the currentRootAction; e.g.\n // if we are on the \"Set theme\" parent action,\n // the UI should not display \"Set theme… > Dark\"\n // but rather just \"Dark\"\n return action.ancestors.slice(index + 1);\n }, [action.ancestors, currentRootActionId]);\n\n const theme = useTheme2();\n const styles = getResultItemStyles(theme, active);\n\n return (\n <div ref={ref} className={styles.row}>\n <div className={styles.actionContainer}>\n {action.icon}\n <div className={styles.textContainer}>\n <div>\n {ancestors.length > 0 &&\n ancestors.map((ancestor) => (\n <React.Fragment key={ancestor.id}>\n <span className={styles.breadcrumbAncestor}>{ancestor.name}</span>\n <span className={styles.breadcrumbAncestor}>›</span>\n </React.Fragment>\n ))}\n <span>{action.name}</span>\n </div>\n </div>\n {action.subtitle && <span className={styles.subtitleText}>{action.subtitle}</span>}\n </div>\n {action.shortcut?.length ? (\n <div aria-hidden className={styles.shortcutContainer}>\n {action.shortcut.map((sc) => (\n <kbd key={sc} className={styles.shortcut}>\n {sc}\n </kbd>\n ))}\n </div>\n ) : null}\n </div>\n );\n }\n);\nResultItem.displayName = 'ResultItem';\n\nconst getResultItemStyles = (theme: GrafanaTheme2, isActive: boolean) => {\n const textColor = isActive ? theme.colors.text.maxContrast : theme.colors.text.primary;\n const rowBackgroundColor = isActive ? theme.colors.background.primary : 'transparent';\n const shortcutBackgroundColor = isActive ? theme.colors.background.secondary : theme.colors.background.primary;\n return {\n row: css({\n color: textColor,\n padding: theme.spacing(1, 2),\n background: rowBackgroundColor,\n display: 'flex',\n alightItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n '&:before': {\n display: isActive ? 'block' : 'none',\n content: '\" \"',\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: theme.spacing(0.5),\n borderRadius: theme.shape.borderRadius(1),\n backgroundImage: theme.colors.gradients.brandVertical,\n },\n }),\n actionContainer: css({\n display: 'flex',\n gap: theme.spacing(2),\n alignitems: 'center',\n fontsize: theme.typography.fontSize,\n }),\n textContainer: css({\n display: 'flex',\n flexDirection: 'column',\n }),\n shortcut: css({\n padding: theme.spacing(0, 1),\n background: shortcutBackgroundColor,\n borderRadius: theme.shape.borderRadius(),\n fontsize: theme.typography.fontSize,\n }),\n breadcrumbAncestor: css({\n opacity: 0.5,\n marginRight: theme.spacing(1),\n }),\n subtitleText: css({\n fontSize: theme.typography.fontSize - 2,\n }),\n shortcutContainer: css({\n display: 'grid',\n gridAutoFlow: 'column',\n gap: theme.spacing(1),\n }),\n };\n};\n","import { Action } from 'kbar';\n\nimport { locationUtil } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { getGrafanaSearcher } from 'app/features/search/service';\n\nasync function getDashboardNav(parentId: string): Promise<Action[]> {\n const data = await getGrafanaSearcher().search({\n kind: ['dashboard'],\n query: '*',\n limit: 500,\n });\n\n const goToDashboardActions: Action[] = data.view.map((item) => {\n const { url, name } = item; // items are backed by DataFrameView, so must hold the url in a closure\n return {\n parent: parentId,\n id: `go/dashboard/${url}`,\n name: `${name}`,\n perform: () => {\n locationService.push(locationUtil.stripBaseFromUrl(url));\n },\n };\n });\n\n return goToDashboardActions;\n}\n\nexport default async (parentId: string) => {\n const dashboardNav = await getDashboardNav(parentId);\n return dashboardNav;\n};\n","import { Priority } from 'kbar';\n\nimport { locationService } from '@grafana/runtime';\n\nimport { NavBarActions } from './global.static.actions';\n\n// Grafana Alerting and alerting sub navigation items\nconst alertingCommandPaletteStaticActions: NavBarActions[] = [\n {\n url: '/alerting/list',\n actions: [\n {\n id: 'go/alerting',\n name: 'Go to alerting',\n keywords: 'alerting navigate',\n perform: () => locationService.push('/alerting'),\n section: 'Navigation',\n priority: Priority.NORMAL,\n },\n ],\n },\n {\n url: '/alerting/list',\n actions: [\n {\n id: 'go/alerting/rules',\n name: 'Go to alert rules',\n keywords: 'alerting navigate rules',\n perform: () => locationService.push('/alerting/list'),\n section: 'Navigation',\n parent: 'go/alerting',\n },\n ],\n },\n {\n url: '/alerting/notifications',\n actions: [\n {\n id: 'go/alerting/contact-points',\n name: 'Go to contact points',\n keywords: 'alerting navigate contact-points',\n perform: () => locationService.push('/alerting/notifications'),\n parent: 'go/alerting',\n },\n ],\n },\n {\n url: '/alerting/routes',\n actions: [\n {\n id: 'go/alerting/notification-policies',\n name: 'Go to notification policies',\n keywords: 'alerting navigate notification-policies',\n perform: () => locationService.push('/alerting/routes'),\n parent: 'go/alerting',\n },\n ],\n },\n {\n url: '/alerting/silences',\n actions: [\n {\n id: 'go/alerting/silences',\n name: 'Go to silences',\n keywords: 'alerting navigate silences',\n perform: () => locationService.push('/alerting/silences'),\n parent: 'go/alerting',\n },\n ],\n },\n];\n\nexport { alertingCommandPaletteStaticActions };\n","import { css } from '@emotion/css';\nimport { FocusScope } from '@react-aria/focus';\nimport {\n KBarAnimator,\n KBarPortal,\n KBarPositioner,\n KBarResults,\n KBarSearch,\n useMatches,\n Action,\n VisualState,\n useRegisterActions,\n useKBar,\n} from 'kbar';\nimport React, { useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { reportInteraction, locationService } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\nimport { StoreState } from 'app/types';\n\nimport { keybindingSrv } from '../../core/services/keybindingSrv';\n\nimport { ResultItem } from './ResultItem';\nimport getDashboardNavActions from './actions/dashboard.nav.actions';\nimport getGlobalActions from './actions/global.static.actions';\n\n/**\n * Wrap all the components from KBar here.\n * @constructor\n */\n\nexport const CommandPalette = () => {\n const styles = useStyles2(getSearchStyles);\n const [actions, setActions] = useState<Action[]>([]);\n const [staticActions, setStaticActions] = useState<Action[]>([]);\n const { query, showing } = useKBar((state) => ({\n showing: state.visualState === VisualState.showing,\n }));\n const isNotLogin = locationService.getLocation().pathname !== '/login';\n\n const { navBarTree } = useSelector((state: StoreState) => {\n return {\n navBarTree: state.navBarTree,\n };\n });\n\n useEffect(() => {\n if (isNotLogin) {\n const staticActionsResp = getGlobalActions(navBarTree);\n setStaticActions(staticActionsResp);\n setActions([...staticActionsResp]);\n }\n }, [isNotLogin, navBarTree]);\n\n useEffect(() => {\n if (showing) {\n reportInteraction('commandPalette_opened');\n\n // Do dashboard search on demand\n getDashboardNavActions('go/dashboard').then((dashAct) => {\n setActions([...staticActions, ...dashAct]);\n });\n\n keybindingSrv.bindGlobal('esc', () => {\n query.setVisualState(VisualState.animatingOut);\n });\n }\n\n return () => {\n keybindingSrv.bindGlobal('esc', () => {\n keybindingSrv.globalEsc();\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showing]);\n\n useRegisterActions(actions, [actions]);\n\n return actions.length > 0 ? (\n <KBarPortal>\n <KBarPositioner className={styles.positioner}>\n <KBarAnimator className={styles.animator}>\n <FocusScope contain>\n <KBarSearch className={styles.search} />\n <RenderResults />\n </FocusScope>\n </KBarAnimator>\n </KBarPositioner>\n </KBarPortal>\n ) : null;\n};\n\nconst RenderResults = () => {\n const { results, rootActionId } = useMatches();\n const styles = useStyles2(getSearchStyles);\n\n return (\n <div className={styles.resultsContainer}>\n <KBarResults\n items={results}\n onRender={({ item, active }) =>\n typeof item === 'string' ? (\n <div className={styles.sectionHeader}>{item}</div>\n ) : (\n <ResultItem action={item} active={active} currentRootActionId={rootActionId!} />\n )\n }\n />\n </div>\n );\n};\n\nconst getSearchStyles = (theme: GrafanaTheme2) => ({\n positioner: css({\n zIndex: theme.zIndex.portal,\n marginTop: '0px',\n '&::before': {\n content: '\"\"',\n position: 'fixed',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n background: theme.components.overlay.background,\n backdropFilter: 'blur(1px)',\n },\n }),\n animator: css({\n maxWidth: theme.breakpoints.values.sm, // supposed to be 600...\n width: '100%',\n background: theme.colors.background.canvas,\n color: theme.colors.text.primary,\n borderRadius: theme.shape.borderRadius(4),\n overflow: 'hidden',\n boxShadow: theme.shadows.z3,\n }),\n search: css({\n padding: theme.spacing(2, 3),\n fontSize: theme.typography.fontSize,\n width: '100%',\n boxSizing: 'border-box',\n outline: 'none',\n border: 'none',\n background: theme.colors.background.canvas,\n color: theme.colors.text.primary,\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n }),\n sectionHeader: css({\n padding: theme.spacing(1, 2),\n fontSize: theme.typography.h6.fontSize,\n fontWeight: theme.typography.body.fontWeight,\n color: theme.colors.text.secondary,\n }),\n resultsContainer: css({\n padding: theme.spacing(2, 0),\n }),\n});\n","import { Action, Priority } from 'kbar';\nimport { flatMapDeep } from 'lodash';\n\nimport { NavModelItem } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\n\nimport { alertingCommandPaletteStaticActions } from './alerting.static.actions';\n\nexport interface NavBarActions {\n url: string;\n actions: Action[];\n}\n\nexport default (navBarTree: NavModelItem[]) => {\n const globalActions: Action[] = [\n {\n id: 'go/search',\n name: 'Go to dashboard search',\n keywords: 'navigate',\n perform: () => locationService.push('?search=open'),\n section: 'Navigation',\n shortcut: ['s', 'o'],\n },\n {\n id: 'go/dashboard',\n name: 'Go to dashboard...',\n keywords: 'navigate',\n section: 'Navigation',\n priority: Priority.NORMAL,\n },\n {\n id: 'preferences/theme',\n name: 'Change theme...',\n keywords: 'interface color dark light',\n section: 'Preferences',\n },\n {\n id: 'preferences/dark-theme',\n name: 'Dark',\n keywords: 'dark theme',\n section: '',\n perform: () => {\n locationService.push({ search: '?theme=dark' });\n location.reload();\n },\n parent: 'preferences/theme',\n },\n {\n id: 'preferences/light-theme',\n name: 'Light',\n keywords: 'light theme',\n section: '',\n perform: () => {\n locationService.push({ search: '?theme=light' });\n location.reload();\n },\n parent: 'preferences/theme',\n },\n ];\n\n // this maps actions to navbar by URL items for showing/hiding\n // actions is an array for multiple child actions that would be under one navbar item\n const navBarActionMap: NavBarActions[] = [\n {\n url: '/dashboard/new',\n actions: [\n {\n id: 'management/create-folder',\n name: 'Create folder',\n keywords: 'new add',\n perform: () => locationService.push('/dashboards/folder/new'),\n section: 'Management',\n },\n {\n id: 'management/create-dashboard',\n name: 'Create dashboard',\n keywords: 'new add',\n perform: () => locationService.push('/dashboard/new'),\n section: 'Management',\n },\n ],\n },\n {\n url: '/',\n actions: [\n {\n id: 'go/home',\n name: 'Go to home',\n keywords: 'navigate',\n perform: () => locationService.push('/'),\n section: 'Navigation',\n shortcut: ['g', 'h'],\n priority: Priority.HIGH,\n },\n ],\n },\n {\n url: '/explore',\n actions: [\n {\n id: 'go/explore',\n name: 'Go to explore',\n keywords: 'navigate',\n perform: () => locationService.push('/explore'),\n section: 'Navigation',\n priority: Priority.NORMAL,\n },\n ],\n },\n ...alertingCommandPaletteStaticActions,\n {\n url: '/profile',\n actions: [\n {\n id: 'go/profile',\n name: 'Go to profile',\n keywords: 'navigate preferences',\n perform: () => locationService.push('/profile'),\n section: 'Navigation',\n shortcut: ['g', 'p'],\n priority: Priority.LOW,\n },\n ],\n },\n {\n url: '/datasources',\n actions: [\n {\n id: 'go/configuration',\n name: 'Go to data sources configuration',\n keywords: 'navigate settings ds',\n perform: () => locationService.push('/datasources'),\n section: 'Navigation',\n },\n ],\n },\n ];\n\n const navBarActions: Action[] = [];\n const navBarFlatUrls = flatMapDeep(navBarTree, (nbt) => nbt.children)\n .map((nbf) => nbf?.url)\n .filter((url) => url !== undefined);\n\n navBarActionMap.forEach((navBarAction) => {\n const navBarItem = navBarFlatUrls.find((url) => navBarAction.url === url);\n if (navBarItem) {\n navBarActions.push(...navBarAction.actions);\n }\n });\n\n return [...globalActions, ...navBarActions];\n};\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { Unsubscribable } from 'rxjs';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config, getGrafanaLiveSrv } from '@grafana/runtime';\nimport { Alert, stylesFactory } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\n\nexport interface Props {}\n\nexport interface State {\n show?: boolean;\n}\n\nexport class LiveConnectionWarning extends PureComponent<Props, State> {\n subscription?: Unsubscribable;\n styles = getStyle(config.theme2);\n state: State = {};\n\n componentDidMount() {\n // Only show the error in development mode\n if (process.env.NODE_ENV === 'development') {\n // Wait a second to listen for server errors\n setTimeout(this.initListener, 1500);\n }\n }\n\n initListener = () => {\n const live = getGrafanaLiveSrv();\n if (live) {\n this.subscription = live.getConnectionState().subscribe({\n next: (v) => {\n this.setState({ show: !v });\n },\n });\n }\n };\n\n componentWillUnmount() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n\n render() {\n const { show } = this.state;\n if (show) {\n if (!contextSrv.isSignedIn || !config.liveEnabled || contextSrv.user.orgRole === '') {\n return null; // do not show the warning for anonymous users or ones with no org (and /login page etc)\n }\n\n return (\n <div className={this.styles.foot}>\n <Alert severity={'warning'} className={this.styles.warn} title=\"connection to server is lost...\" />\n </div>\n );\n }\n return null;\n }\n}\n\nconst getStyle = stylesFactory((theme: GrafanaTheme2) => {\n return {\n foot: css`\n position: absolute;\n bottom: 0px;\n left: 0px;\n right: 0px;\n z-index: 10000;\n cursor: wait;\n margin: 16px;\n `,\n warn: css`\n border: 2px solid ${theme.colors.warning.main};\n max-width: 400px;\n margin: auto;\n height: 3em;\n `,\n };\n});\n","import { Action, KBarProvider } from 'kbar';\nimport React, { ComponentType } from 'react';\nimport { Provider } from 'react-redux';\nimport { Router, Route, Redirect, Switch } from 'react-router-dom';\n\nimport { config, locationService, navigationLogger, reportInteraction } from '@grafana/runtime';\nimport { ErrorBoundaryAlert, GlobalStyles, ModalRoot, ModalsProvider, PortalContainer } from '@grafana/ui';\nimport { SearchWrapper } from 'app/features/search';\nimport { getAppRoutes } from 'app/routes/routes';\nimport { store } from 'app/store/store';\n\nimport { AngularRoot } from './angular/AngularRoot';\nimport { loadAndInitAngularIfEnabled } from './angular/loadAndInitAngularIfEnabled';\nimport { GrafanaApp } from './app';\nimport { AppChrome } from './core/components/AppChrome/AppChrome';\nimport { AppNotificationList } from './core/components/AppNotifications/AppNotificationList';\nimport { NavBar } from './core/components/NavBar/NavBar';\nimport { GrafanaContext } from './core/context/GrafanaContext';\nimport { I18nProvider } from './core/internationalization';\nimport { GrafanaRoute } from './core/navigation/GrafanaRoute';\nimport { RouteDescriptor } from './core/navigation/types';\nimport { contextSrv } from './core/services/context_srv';\nimport { ThemeProvider } from './core/utils/ConfigProvider';\nimport { CommandPalette } from './features/commandPalette/CommandPalette';\nimport { LiveConnectionWarning } from './features/live/LiveConnectionWarning';\n\ninterface AppWrapperProps {\n app: GrafanaApp;\n}\n\ninterface AppWrapperState {\n ready?: boolean;\n}\n\n/** Used by enterprise */\nlet bodyRenderHooks: ComponentType[] = [];\nlet pageBanners: ComponentType[] = [];\n\nexport function addBodyRenderHook(fn: ComponentType) {\n bodyRenderHooks.push(fn);\n}\n\nexport function addPageBanner(fn: ComponentType) {\n pageBanners.push(fn);\n}\n\nexport class AppWrapper extends React.Component<AppWrapperProps, AppWrapperState> {\n constructor(props: AppWrapperProps) {\n super(props);\n this.state = {};\n }\n\n async componentDidMount() {\n await loadAndInitAngularIfEnabled();\n this.setState({ ready: true });\n $('.preloader').remove();\n }\n\n renderRoute = (route: RouteDescriptor) => {\n const roles = route.roles ? route.roles() : [];\n\n return (\n <Route\n exact={route.exact === undefined ? true : route.exact}\n path={route.path}\n key={route.path}\n render={(props) => {\n navigationLogger('AppWrapper', false, 'Rendering route', route, 'with match', props.location);\n // TODO[Router]: test this logic\n if (roles?.length) {\n if (!roles.some((r: string) => contextSrv.hasRole(r))) {\n return <Redirect to=\"/\" />;\n }\n }\n\n return <GrafanaRoute {...props} route={route} />;\n }}\n />\n );\n };\n\n renderRoutes() {\n return <Switch>{getAppRoutes().map((r) => this.renderRoute(r))}</Switch>;\n }\n\n renderNavBar() {\n if (config.isPublicDashboardView || !this.state.ready || config.featureToggles.topnav) {\n return null;\n }\n\n return <NavBar />;\n }\n\n commandPaletteEnabled() {\n return config.featureToggles.commandPalette && !config.isPublicDashboardView;\n }\n\n searchBarEnabled() {\n return !config.isPublicDashboardView;\n }\n\n render() {\n const { app } = this.props;\n const { ready } = this.state;\n\n navigationLogger('AppWrapper', false, 'rendering');\n\n const commandPaletteActionSelected = (action: Action) => {\n reportInteraction('commandPalette_action_selected', {\n actionId: action.id,\n actionName: action.name,\n });\n };\n\n return (\n <Provider store={store}>\n <I18nProvider>\n <ErrorBoundaryAlert style=\"page\">\n <GrafanaContext.Provider value={app.context}>\n <ThemeProvider value={config.theme2}>\n <KBarProvider\n actions={[]}\n options={{ enableHistory: true, callbacks: { onSelectAction: commandPaletteActionSelected } }}\n >\n <ModalsProvider>\n <GlobalStyles />\n {this.commandPaletteEnabled() && <CommandPalette />}\n <div className=\"grafana-app\">\n <Router history={locationService.getHistory()}>\n {this.renderNavBar()}\n <AppChrome>\n {pageBanners.map((Banner, index) => (\n <Banner key={index.toString()} />\n ))}\n\n <AngularRoot />\n <AppNotificationList />\n {this.searchBarEnabled() && <SearchWrapper />}\n {ready && this.renderRoutes()}\n {bodyRenderHooks.map((Hook, index) => (\n <Hook key={index.toString()} />\n ))}\n </AppChrome>\n </Router>\n </div>\n <LiveConnectionWarning />\n <ModalRoot />\n <PortalContainer />\n </ModalsProvider>\n </KBarProvider>\n </ThemeProvider>\n </GrafanaContext.Provider>\n </ErrorBoundaryAlert>\n </I18nProvider>\n </Provider>\n );\n }\n}\n","import { config, setAngularLoader } from '@grafana/runtime';\n\nexport async function loadAndInitAngularIfEnabled() {\n if (config.angularSupportEnabled) {\n const { AngularApp } = await import(/* webpackChunkName: \"AngularApp\" */ './index');\n const app = new AngularApp();\n app.init();\n app.bootstrap();\n } else {\n setAngularLoader({\n load: (elem, scopeProps, template) => {\n return {\n destroy: () => {},\n digest: () => {},\n getScope: () => {\n return {};\n },\n };\n },\n });\n }\n}\n","import { SafeDynamicImport } from '../../core/components/DynamicImports/SafeDynamicImport';\nimport { config } from '../../core/config';\nimport { RouteDescriptor } from '../../core/navigation/types';\nimport { DashboardRoutes } from '../../types';\n\nexport const getPublicDashboardRoutes = (): RouteDescriptor[] => {\n if (config.featureToggles.publicDashboards) {\n return [\n {\n path: '/public-dashboards/:accessToken',\n pageClass: 'page-dashboard',\n routeName: DashboardRoutes.Public,\n component: SafeDynamicImport(\n () =>\n import(\n /* webpackChunkName: \"PublicDashboardPage\" */ '../../features/dashboard/containers/PublicDashboardPage'\n )\n ),\n },\n ];\n }\n\n return [];\n};\n","import { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport';\nimport { config } from 'app/core/config';\nimport { RouteDescriptor } from 'app/core/navigation/types';\n\nimport { ROUTE_BASE_ID } from './constants';\n\nexport function getRoutes(): RouteDescriptor[] {\n if (config.featureToggles.dataConnectionsConsole) {\n return [\n {\n path: `/${ROUTE_BASE_ID}`,\n exact: false,\n component: SafeDynamicImport(\n () => import(/* webpackChunkName: \"DataConnectionsPage\"*/ 'app/features/data-connections/DataConnectionsPage')\n ),\n },\n ];\n }\n\n return [];\n}\n","import { useObservable } from 'react-use';\nimport { BehaviorSubject } from 'rxjs';\n\nimport { NavModelItem } from '@grafana/data';\nimport store from 'app/core/store';\nimport { isShallowEqual } from 'app/core/utils/isShallowEqual';\n\nimport { RouteDescriptor } from '../../navigation/types';\n\nexport interface AppChromeState {\n chromeless?: boolean;\n sectionNav: NavModelItem;\n pageNav?: NavModelItem;\n actions?: React.ReactNode;\n searchBarHidden?: boolean;\n megaMenuOpen?: boolean;\n}\n\nconst defaultSection: NavModelItem = { text: 'Grafana' };\n\nexport class AppChromeService {\n searchBarStorageKey = 'SearchBar_Hidden';\n private currentRoute?: RouteDescriptor;\n private routeChangeHandled?: boolean;\n\n readonly state = new BehaviorSubject<AppChromeState>({\n chromeless: true, // start out hidden to not flash it on pages without chrome\n sectionNav: defaultSection,\n searchBarHidden: store.getBool(this.searchBarStorageKey, false),\n });\n\n registerRouteRender(route: RouteDescriptor) {\n if (this.currentRoute !== route) {\n this.currentRoute = route;\n this.routeChangeHandled = false;\n }\n }\n\n update(update: Partial<AppChromeState>) {\n const current = this.state.getValue();\n const newState: AppChromeState = {\n ...current,\n };\n\n // when route change update props from route and clear fields\n if (!this.routeChangeHandled) {\n newState.actions = undefined;\n newState.pageNav = undefined;\n newState.sectionNav = defaultSection;\n newState.chromeless = this.currentRoute?.chromeless;\n this.routeChangeHandled = true;\n }\n\n Object.assign(newState, update);\n\n if (!isShallowEqual(current, newState)) {\n this.state.next(newState);\n }\n }\n\n toggleMegaMenu = () => {\n this.update({ megaMenuOpen: !this.state.getValue().megaMenuOpen });\n };\n\n toggleSearchBar = () => {\n const searchBarHidden = !this.state.getValue().searchBarHidden;\n store.set(this.searchBarStorageKey, searchBarHidden);\n this.update({ searchBarHidden });\n };\n\n useState() {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useObservable(this.state, this.state.getValue());\n }\n}\n","// From https://github.com/streamich/fast-shallow-equal\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isShallowEqual(a: any, b: any) {\n if (a === b) {\n return true;\n }\n\n if (!(a instanceof Object) || !(b instanceof Object)) {\n return false;\n }\n\n var keys = Object.keys(a);\n var length = keys.length;\n\n for (let i = 0; i < length; i++) {\n if (!(keys[i] in b)) {\n return false;\n }\n }\n\n for (let i = 0; i < length; i++) {\n if (a[keys[i]] !== b[keys[i]]) {\n return false;\n }\n }\n\n return length === Object.keys(b).length;\n}\n","import { locationUtil } from '@grafana/data';\nimport { locationService, navigationLogger } from '@grafana/runtime';\n\nexport function interceptLinkClicks(e: MouseEvent) {\n const anchor = getParentAnchor(e.target as HTMLElement);\n\n // Ignore if opening new tab or already default prevented\n if (e.ctrlKey || e.metaKey || e.defaultPrevented) {\n return;\n }\n\n if (anchor) {\n let href = anchor.getAttribute('href');\n const target = anchor.getAttribute('target');\n\n if (href && !target) {\n navigationLogger('utils', false, 'intercepting link click', e);\n e.preventDefault();\n\n href = locationUtil.stripBaseFromUrl(href);\n\n // Ensure old angular urls with no starting '/' are handled the same as before\n // Make sure external links are handled correctly\n // That is they where seen as being absolute from app root\n if (href[0] !== '/') {\n // if still contains protocol or is a mailto link, it's an absolute link to another domain or web application\n if (href.indexOf('://') > 0 || href.indexOf('mailto:') === 0) {\n window.location.href = href;\n return;\n } else if (href.indexOf('#') === 0) {\n // If it is a hash click, update the hash instead of trying to update the history\n window.location.hash = href;\n return;\n } else {\n href = `/${href}`;\n }\n }\n locationService.push(href);\n }\n }\n}\n\nfunction getParentAnchor(element: HTMLElement | null): HTMLElement | null {\n while (element !== null && element.tagName) {\n if (element.tagName.toUpperCase() === 'A') {\n return element;\n }\n element = element.parentNode as HTMLElement;\n }\n\n return null;\n}\n","import React from 'react';\n\nimport { ModalRoot, ModalsProvider } from '@grafana/ui';\n\nimport { connectWithProvider } from '../../utils/connectWithReduxStore';\n\n/**\n * Component that enables rendering React modals from Angular\n */\nexport const AngularModalProxy = connectWithProvider((props: any) => {\n return (\n <>\n <ModalsProvider {...props}>\n <ModalRoot />\n </ModalsProvider>\n </>\n );\n});\n","import React from 'react';\nimport { connect, Provider } from 'react-redux';\n\nimport { store } from '../../store/store';\n\nexport function connectWithStore(WrappedComponent: any, ...args: any[]) {\n const ConnectedWrappedComponent = (connect as any)(...args)(WrappedComponent);\n\n // eslint-disable-next-line react/display-name\n return (props: any) => {\n return <ConnectedWrappedComponent {...props} store={store} />;\n };\n}\n\nexport function connectWithProvider(WrappedComponent: any, ...args: any[]) {\n const ConnectedWrappedComponent = (connect as any)(...args)(WrappedComponent);\n\n // eslint-disable-next-line react/display-name\n return (props: any) => {\n return (\n <Provider store={store}>\n <ConnectedWrappedComponent {...props} store={store} />\n </Provider>\n );\n };\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { textUtil } from '@grafana/data';\nimport { config, CopyPanelEvent } from '@grafana/runtime';\nimport { ConfirmModal, ConfirmModalProps } from '@grafana/ui';\nimport appEvents from 'app/core/app_events';\nimport { copyPanel } from 'app/features/dashboard/utils/panel';\n\nimport { ShowConfirmModalEvent, ShowConfirmModalPayload, ShowModalReactEvent } from '../../types/events';\nimport { AngularModalProxy } from '../components/modals/AngularModalProxy';\nimport { provideI18n } from '../internationalization';\nimport { provideTheme } from '../utils/ConfigProvider';\n\nexport class ModalManager {\n reactModalRoot = document.body;\n reactModalNode = document.createElement('div');\n\n init() {\n appEvents.subscribe(ShowConfirmModalEvent, (e) => this.showConfirmModal(e.payload));\n appEvents.subscribe(ShowModalReactEvent, (e) => this.showModalReact(e.payload));\n appEvents.subscribe(CopyPanelEvent, (e) => copyPanel(e.payload));\n }\n\n showModalReact(options: any) {\n const { component, props } = options;\n const modalProps = {\n component,\n props: {\n ...props,\n isOpen: true,\n onDismiss: this.onReactModalDismiss,\n },\n };\n\n const elem = React.createElement(provideI18n(provideTheme(AngularModalProxy, config.theme2)), modalProps);\n this.reactModalRoot.appendChild(this.reactModalNode);\n ReactDOM.render(elem, this.reactModalNode);\n }\n\n onReactModalDismiss = () => {\n ReactDOM.unmountComponentAtNode(this.reactModalNode);\n this.reactModalRoot.removeChild(this.reactModalNode);\n };\n\n showConfirmModal(payload: ShowConfirmModalPayload) {\n const {\n confirmText,\n onConfirm = () => undefined,\n text2,\n altActionText,\n onAltAction,\n noText,\n text,\n text2htmlBind,\n yesText = 'Yes',\n icon,\n title = 'Confirm',\n } = payload;\n const props: ConfirmModalProps = {\n confirmText: yesText,\n confirmationText: confirmText,\n icon,\n title,\n body: text,\n description: text2 && text2htmlBind ? textUtil.sanitize(text2) : text2,\n isOpen: true,\n dismissText: noText,\n onConfirm: () => {\n onConfirm();\n this.onReactModalDismiss();\n },\n onDismiss: this.onReactModalDismiss,\n onAlternative: onAltAction\n ? () => {\n onAltAction();\n this.onReactModalDismiss();\n }\n : undefined,\n alternativeText: altActionText,\n };\n const modalProps = {\n component: ConfirmModal,\n props,\n };\n\n const elem = React.createElement(provideTheme(AngularModalProxy, config.theme2), modalProps);\n this.reactModalRoot.appendChild(this.reactModalNode);\n ReactDOM.render(elem, this.reactModalNode);\n }\n}\n","import { CurrentUserDTO } from '@grafana/data';\nimport { attachDebugger, createLogger } from '@grafana/ui';\n\n/**\n * Returns an opaque identifier for a user, for reporting purposes.\n * Because this is for use when reporting across multiple Grafana installations\n * It cannot simply be user.id because that's not unique across two installations.\n */\nexport function getUserIdentifier(user: CurrentUserDTO) {\n if (user.externalUserId.length) {\n return user.externalUserId;\n }\n\n return user.email;\n}\n\n/** @internal */\nexport const echoLogger = createLogger('EchoSrv');\nexport const echoLog = echoLogger.logger;\n\nattachDebugger('echo', undefined, echoLogger);\n","import { EchoBackend, EchoMeta, EchoEvent, EchoSrv } from '@grafana/runtime';\n\nimport { contextSrv } from '../context_srv';\n\nimport { echoLog } from './utils';\n\ninterface EchoConfig {\n // How often should metrics be reported\n flushInterval: number;\n // Enables debug mode\n debug: boolean;\n}\n\n/**\n * Echo is a service for collecting events from Grafana client-app\n * It collects events, distributes them across registered backend and flushes once per configured interval\n * It's up to the registered backend to decide what to do with a given type of metric\n */\nexport class Echo implements EchoSrv {\n private config: EchoConfig = {\n flushInterval: 10000, // By default Echo flushes every 10s\n debug: false,\n };\n\n private backends: EchoBackend[] = [];\n // meta data added to every event collected\n\n constructor(config?: Partial<EchoConfig>) {\n this.config = {\n ...this.config,\n ...config,\n };\n setInterval(this.flush, this.config.flushInterval);\n }\n\n flush = () => {\n for (const backend of this.backends) {\n backend.flush();\n }\n };\n\n addBackend = (backend: EchoBackend) => {\n echoLog('Adding backend', false, backend);\n this.backends.push(backend);\n };\n\n addEvent = <T extends EchoEvent>(event: Omit<T, 'meta'>, _meta?: {}) => {\n const meta = this.getMeta();\n const _event = {\n ...event,\n meta: {\n ...meta,\n ..._meta,\n },\n };\n\n for (const backend of this.backends) {\n if (backend.supportedEvents.length === 0 || backend.supportedEvents.indexOf(_event.type) > -1) {\n backend.addEvent(_event);\n }\n }\n echoLog('Reporting event', false, _event);\n };\n\n getMeta = (): EchoMeta => {\n return {\n sessionId: '',\n userId: contextSrv.user.id,\n userLogin: contextSrv.user.login,\n userSignedIn: contextSrv.user.isSignedIn,\n screenSize: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n windowSize: {\n width: window.screen.width,\n height: window.screen.height,\n },\n userAgent: window.navigator.userAgent,\n ts: new Date().getTime(),\n timeSinceNavigationStart: performance.now(),\n url: window.location.href,\n };\n };\n}\n","import { captureException } from '@sentry/browser';\n\nimport { getEchoSrv, EchoEventType } from '@grafana/runtime';\n\nimport { PerformanceEvent } from './backends/PerformanceBackend';\n\nexport const reportPerformance = (metric: string, value: number) => {\n getEchoSrv().addEvent<PerformanceEvent>({\n type: EchoEventType.Performance,\n payload: {\n name: metric,\n value: value,\n },\n });\n};\n\n// Sentry will process the error, adding it's own metadata, applying any sampling rules,\n// then push it to EchoSrv as SentryEvent\nexport const reportError = (error: Error) => captureException(error);\n","import { EchoBackend, EchoEvent, EchoEventType } from '@grafana/runtime';\n\nimport { backendSrv } from '../../backend_srv';\n\nexport interface PerformanceEventPayload {\n name: string;\n value: number;\n}\n\nexport interface PerformanceEvent extends EchoEvent<EchoEventType.Performance, PerformanceEventPayload> {}\n\nexport interface PerformanceBackendOptions {\n url?: string;\n}\n\n/**\n * Echo's performance metrics consumer\n * Reports performance metrics to given url (TODO)\n */\nexport class PerformanceBackend implements EchoBackend<PerformanceEvent, PerformanceBackendOptions> {\n private buffer: PerformanceEventPayload[] = [];\n supportedEvents = [EchoEventType.Performance];\n\n constructor(public options: PerformanceBackendOptions) {}\n\n addEvent = (e: EchoEvent) => {\n this.buffer.push(e.payload);\n };\n\n flush = () => {\n if (this.buffer.length === 0) {\n return;\n }\n\n // Currently we don't have an API for sending the metrics hence logging to console in dev environment\n if (process.env.NODE_ENV === 'development') {\n console.log('PerformanceBackend flushing:', this.buffer);\n }\n\n backendSrv.post('/api/frontend-metrics', {\n events: this.buffer,\n });\n\n this.buffer = [];\n };\n}\n","import $ from 'jquery';\n\nimport {\n EchoBackend,\n EchoEventType,\n InteractionEchoEvent,\n isInteractionEvent,\n isPageviewEvent,\n PageviewEchoEvent,\n} from '@grafana/runtime';\n\nexport interface ApplicationInsightsBackendOptions {\n connectionString: string;\n endpointUrl?: string;\n}\n\nexport class ApplicationInsightsBackend implements EchoBackend<PageviewEchoEvent, ApplicationInsightsBackendOptions> {\n supportedEvents = [EchoEventType.Pageview, EchoEventType.Interaction];\n\n constructor(public options: ApplicationInsightsBackendOptions) {\n $.ajax({\n url: 'https://js.monitor.azure.com/scripts/b/ai.2.min.js',\n dataType: 'script',\n cache: true,\n }).done(function () {\n var applicationInsightsOpts = {\n config: {\n connectionString: options.connectionString,\n endpointUrl: options.endpointUrl,\n },\n };\n var init = new (window as any).Microsoft.ApplicationInsights.ApplicationInsights(applicationInsightsOpts);\n (window as any).applicationInsights = init.loadAppInsights();\n });\n }\n\n addEvent = (e: PageviewEchoEvent | InteractionEchoEvent) => {\n if (!(window as any).applicationInsights) {\n return;\n }\n\n if (isPageviewEvent(e)) {\n (window as any).applicationInsights.trackPageView();\n }\n\n if (isInteractionEvent(e)) {\n (window as any).applicationInsights.trackEvent({\n name: e.payload.interactionName,\n properties: e.payload.properties,\n });\n }\n };\n\n // Not using Echo buffering, addEvent above sends events to Application Insights as soon as they appear\n flush = () => {};\n}\n","import $ from 'jquery';\n\nimport { EchoBackend, EchoEventType, PageviewEchoEvent } from '@grafana/runtime';\n\nexport interface GAEchoBackendOptions {\n googleAnalyticsId: string;\n debug?: boolean;\n}\n\nexport class GAEchoBackend implements EchoBackend<PageviewEchoEvent, GAEchoBackendOptions> {\n supportedEvents = [EchoEventType.Pageview];\n trackedUserId: number | null = null;\n\n constructor(public options: GAEchoBackendOptions) {\n const url = `https://www.google-analytics.com/analytics${options.debug ? '_debug' : ''}.js`;\n\n $.ajax({\n url,\n dataType: 'script',\n cache: true,\n });\n\n const ga = (window.ga =\n window.ga ||\n // this had the equivalent of `eslint-disable-next-line prefer-arrow/prefer-arrow-functions`\n function () {\n (ga.q = ga.q || []).push(arguments);\n });\n ga.l = +new Date();\n ga('create', options.googleAnalyticsId, 'auto');\n ga('set', 'anonymizeIp', true);\n }\n\n addEvent = (e: PageviewEchoEvent) => {\n if (!window.ga) {\n return;\n }\n\n window.ga('set', { page: e.payload.page });\n window.ga('send', 'pageview');\n\n const { userSignedIn, userId } = e.meta;\n if (userSignedIn && userId !== this.trackedUserId) {\n this.trackedUserId = userId;\n window.ga('set', 'userId', userId);\n }\n };\n\n // Not using Echo buffering, addEvent above sends events to GA as soon as they appear\n flush = () => {};\n}\n","import $ from 'jquery';\n\nimport { CurrentUserDTO } from '@grafana/data';\nimport {\n EchoBackend,\n EchoEventType,\n isExperimentViewEvent,\n isInteractionEvent,\n isPageviewEvent,\n PageviewEchoEvent,\n} from '@grafana/runtime';\n\nimport { getUserIdentifier } from '../../utils';\n\nexport interface RudderstackBackendOptions {\n writeKey: string;\n dataPlaneUrl: string;\n user?: CurrentUserDTO;\n sdkUrl?: string;\n configUrl?: string;\n}\n\nexport class RudderstackBackend implements EchoBackend<PageviewEchoEvent, RudderstackBackendOptions> {\n supportedEvents = [EchoEventType.Pageview, EchoEventType.Interaction, EchoEventType.ExperimentView];\n\n constructor(public options: RudderstackBackendOptions) {\n const url = options.sdkUrl || `https://cdn.rudderlabs.com/v1/rudder-analytics.min.js`;\n\n $.ajax({\n url,\n dataType: 'script',\n cache: true,\n });\n\n const rds = ((window as any).rudderanalytics = []);\n\n var methods = [\n 'load',\n 'page',\n 'track',\n 'identify',\n 'alias',\n 'group',\n 'ready',\n 'reset',\n 'getAnonymousId',\n 'setAnonymousId',\n ];\n\n for (let i = 0; i < methods.length; i++) {\n const method = methods[i];\n (rds as Record<string, any>)[method] = (function (methodName) {\n return function () {\n // @ts-ignore\n rds.push([methodName].concat(Array.prototype.slice.call(arguments)));\n };\n })(method);\n }\n\n (rds as any).load(options.writeKey, options.dataPlaneUrl, { configUrl: options.configUrl });\n\n if (options.user) {\n const identifier = getUserIdentifier(options.user);\n\n (rds as any).identify(identifier, {\n email: options.user.email,\n orgId: options.user.orgId,\n });\n }\n }\n\n addEvent = (e: PageviewEchoEvent) => {\n if (!(window as any).rudderanalytics) {\n return;\n }\n\n if (isPageviewEvent(e)) {\n (window as any).rudderanalytics.page();\n }\n\n if (isInteractionEvent(e)) {\n (window as any).rudderanalytics.track(e.payload.interactionName, e.payload.properties);\n }\n\n if (isExperimentViewEvent(e)) {\n (window as any).rudderanalytics.track('experiment_viewed', {\n experiment_id: e.payload.experimentId,\n experiment_group: e.payload.experimentGroup,\n experiment_variant: e.payload.experimentVariant,\n });\n }\n };\n\n // Not using Echo buffering, addEvent above sends events to GA as soon as they appear\n flush = () => {};\n}\n","import { BaseTransport, TransportItem } from '@grafana/agent-core';\nimport { getEchoSrv, EchoEventType } from '@grafana/runtime';\nexport class EchoSrvTransport extends BaseTransport {\n send(event: TransportItem) {\n getEchoSrv().addEvent({\n type: EchoEventType.GrafanaJavascriptAgent,\n payload: event,\n });\n }\n getIgnoreUrls() {\n return [];\n }\n}\n","import { BaseTransport } from '@grafana/agent-core';\nimport {\n initializeAgent,\n BrowserConfig,\n ErrorsInstrumentation,\n ConsoleInstrumentation,\n WebVitalsInstrumentation,\n FetchTransport,\n} from '@grafana/agent-web';\nimport { BuildInfo } from '@grafana/data';\nimport { EchoBackend, EchoEvent, EchoEventType } from '@grafana/runtime';\n\nimport { EchoSrvTransport } from './EchoSrvTransport';\nimport { GrafanaJavascriptAgentEchoEvent, User } from './types';\n\nexport interface GrafanaJavascriptAgentBackendOptions extends BrowserConfig {\n buildInfo: BuildInfo;\n customEndpoint: string;\n user: User;\n errorInstrumentalizationEnabled: boolean;\n consoleInstrumentalizationEnabled: boolean;\n webVitalsInstrumentalizationEnabled: boolean;\n}\n\nexport class GrafanaJavascriptAgentBackend\n implements EchoBackend<GrafanaJavascriptAgentEchoEvent, GrafanaJavascriptAgentBackendOptions>\n{\n supportedEvents = [EchoEventType.GrafanaJavascriptAgent];\n private agentInstance;\n transports: BaseTransport[];\n\n constructor(public options: GrafanaJavascriptAgentBackendOptions) {\n // configure instrumentalizations\n const instrumentations = [];\n this.transports = [];\n\n if (options.customEndpoint) {\n this.transports.push(new FetchTransport({ url: options.customEndpoint, apiKey: options.apiKey }));\n }\n\n if (options.errorInstrumentalizationEnabled) {\n instrumentations.push(new ErrorsInstrumentation());\n }\n if (options.consoleInstrumentalizationEnabled) {\n instrumentations.push(new ConsoleInstrumentation());\n }\n if (options.webVitalsInstrumentalizationEnabled) {\n instrumentations.push(new WebVitalsInstrumentation());\n }\n\n // initialize GrafanaJavascriptAgent so it can set up it's hooks and start collecting errors\n const grafanaJavaScriptAgentOptions: BrowserConfig = {\n globalObjectKey: options.globalObjectKey || 'grafanaAgent',\n preventGlobalExposure: options.preventGlobalExposure || false,\n app: {\n version: options.buildInfo.version,\n environment: options.buildInfo.env,\n },\n instrumentations,\n transports: [new EchoSrvTransport()],\n };\n this.agentInstance = initializeAgent(grafanaJavaScriptAgentOptions);\n\n if (options.user) {\n this.agentInstance.api.setUser({\n email: options.user.email,\n id: options.user.id,\n attributes: {\n orgId: String(options.user.orgId) || '',\n },\n });\n }\n }\n\n addEvent = (e: EchoEvent) => {\n this.transports.forEach((t) => t.send(e.payload));\n };\n\n // backend will log events to stdout, and at least in case of hosted grafana they will be\n // ingested into Loki. Due to Loki limitations logs cannot be backdated,\n // so not using buffering for this backend to make sure that events are logged as close\n // to their context as possible\n flush = () => {};\n}\n","import { Event, Severity } from '@sentry/browser';\nimport { Response } from '@sentry/types';\nimport {\n logger,\n makePromiseBuffer,\n parseRetryAfterHeader,\n PromiseBuffer,\n supportsReferrerPolicy,\n SyncPromise,\n} from '@sentry/utils';\n\nimport { BaseTransport } from '../types';\n\nexport interface CustomEndpointTransportOptions {\n endpoint: string;\n fetchParameters?: Partial<RequestInit>;\n maxConcurrentRequests?: number;\n}\n\nconst DEFAULT_MAX_CONCURRENT_REQUESTS = 3;\n\nconst DEFAULT_RATE_LIMIT_TIMEOUT_MS = 5000;\n\n/**\n * This is a copy of sentry's FetchTransport, edited to be able to push to any custom url\n * instead of using Sentry-specific endpoint logic.\n * Also transforms some of the payload values to be parseable by go.\n * Sends events sequentially and implements back-off in case of rate limiting.\n */\n\nexport class CustomEndpointTransport implements BaseTransport {\n /** Locks transport after receiving 429 response */\n private _disabledUntil: Date = new Date(Date.now());\n\n private readonly _buffer: PromiseBuffer<Response>;\n\n constructor(public options: CustomEndpointTransportOptions) {\n this._buffer = makePromiseBuffer(options.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT_REQUESTS);\n }\n\n sendEvent(event: Event): PromiseLike<Response> {\n if (new Date(Date.now()) < this._disabledUntil) {\n const reason = `Dropping frontend event due to too many requests.`;\n console.warn(reason);\n return Promise.resolve({\n event,\n reason,\n status: 'skipped',\n });\n }\n\n const sentryReq = {\n // convert all timestamps to iso string, so it's parseable by backend\n body: JSON.stringify({\n ...event,\n level: event.level ?? (event.exception ? Severity.Error : Severity.Info),\n exception: event.exception\n ? {\n values: event.exception.values?.map((value) => ({\n ...value,\n // according to both typescript and go types, value is supposed to be string.\n // but in some odd cases at runtime it turns out to be an empty object {}\n // let's fix it here\n value: fmtSentryErrorValue(value.value),\n })),\n }\n : event.exception,\n breadcrumbs: event.breadcrumbs?.map((breadcrumb) => ({\n ...breadcrumb,\n timestamp: makeTimestamp(breadcrumb.timestamp),\n })),\n timestamp: makeTimestamp(event.timestamp),\n }),\n url: this.options.endpoint,\n };\n\n const options: RequestInit = {\n body: sentryReq.body,\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n // https://caniuse.com/#feat=referrer-policy\n // It doesn't. And it throw exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n referrerPolicy: (supportsReferrerPolicy() ? 'origin' : '') as ReferrerPolicy,\n };\n\n if (this.options.fetchParameters !== undefined) {\n Object.assign(options, this.options.fetchParameters);\n }\n\n return this._buffer\n .add(\n () =>\n new SyncPromise<Response>((resolve, reject) => {\n window\n .fetch(sentryReq.url, options)\n .then((response) => {\n if (response.status === 200) {\n resolve({ status: 'success' });\n return;\n }\n\n if (response.status === 429) {\n const now = Date.now();\n const retryAfterHeader = response.headers.get('Retry-After');\n if (retryAfterHeader) {\n this._disabledUntil = new Date(now + parseRetryAfterHeader(retryAfterHeader, now));\n } else {\n this._disabledUntil = new Date(now + DEFAULT_RATE_LIMIT_TIMEOUT_MS);\n }\n logger.warn(`Too many requests, backing off till: ${this._disabledUntil}`);\n }\n\n reject(response);\n })\n .catch(reject);\n })\n )\n .then(undefined, (reason) => {\n if (reason.message === 'Not adding Promise due to buffer limit reached.') {\n const msg = `Dropping frontend log event due to too many requests in flight.`;\n console.warn(msg);\n return {\n event,\n reason: msg,\n status: 'skipped',\n };\n }\n throw reason;\n });\n }\n}\n\nfunction makeTimestamp(time: number | undefined): string {\n if (time) {\n return new Date(time * 1000).toISOString();\n }\n return new Date().toISOString();\n}\n\nfunction fmtSentryErrorValue(value: unknown): string | undefined {\n if (typeof value === 'string' || value === undefined) {\n return value;\n } else if (value && typeof value === 'object' && Object.keys(value).length === 0) {\n return '';\n }\n return String(value);\n}\n","import { Event } from '@sentry/browser';\nimport { BaseTransport } from '@sentry/browser/dist/transports';\nimport { EventStatus, Request, Session, Response } from '@sentry/types';\n\nimport { getEchoSrv, EchoEventType } from '@grafana/runtime';\n\nexport class EchoSrvTransport extends BaseTransport {\n sendEvent(event: Event) {\n getEchoSrv().addEvent({\n type: EchoEventType.Sentry,\n payload: event,\n });\n return Promise.resolve({ status: 'success' as EventStatus, event });\n }\n // not recording sessions for now\n sendSession(session: Session): PromiseLike<Response> {\n return Promise.resolve({ status: 'skipped' });\n }\n // required by BaseTransport definition but not used by this implementation\n _sendRequest(sentryRequest: Request, originalPayload: Event | Session): PromiseLike<Response> {\n throw new Error('should not happen');\n }\n}\n","import { BrowserOptions, init as initSentry, setUser as sentrySetUser } from '@sentry/browser';\nimport { FetchTransport } from '@sentry/browser/dist/transports';\n\nimport { BuildInfo } from '@grafana/data';\nimport { SentryConfig } from '@grafana/data/src/types/config';\nimport { EchoBackend, EchoEventType } from '@grafana/runtime';\n\nimport { CustomEndpointTransport } from './transports/CustomEndpointTransport';\nimport { EchoSrvTransport } from './transports/EchoSrvTransport';\nimport { SentryEchoEvent, User, BaseTransport } from './types';\n\nexport interface SentryEchoBackendOptions extends SentryConfig {\n user?: User;\n buildInfo: BuildInfo;\n}\n\nexport class SentryEchoBackend implements EchoBackend<SentryEchoEvent, SentryEchoBackendOptions> {\n supportedEvents = [EchoEventType.Sentry];\n\n transports: BaseTransport[];\n\n constructor(public options: SentryEchoBackendOptions) {\n // set up transports to post events to grafana backend and/or Sentry\n this.transports = [];\n if (options.dsn) {\n this.transports.push(new FetchTransport({ dsn: options.dsn }, fetch));\n }\n if (options.customEndpoint) {\n this.transports.push(new CustomEndpointTransport({ endpoint: options.customEndpoint }));\n }\n\n // initialize Sentry so it can set up it's hooks and start collecting errors\n const sentryOptions: BrowserOptions = {\n release: options.buildInfo.version,\n environment: options.buildInfo.env,\n // seems Sentry won't attempt to send events to transport unless a valid DSN is defined :shrug:\n dsn: options.dsn || 'https://examplePublicKey@o0.ingest.sentry.io/0',\n sampleRate: options.sampleRate,\n transport: EchoSrvTransport, // will dump errors to EchoSrv\n ignoreErrors: [\n 'ResizeObserver loop limit exceeded',\n 'ResizeObserver loop completed',\n 'Non-Error exception captured with keys',\n ],\n };\n\n if (options.user) {\n sentrySetUser({\n email: options.user.email,\n id: String(options.user.id),\n });\n }\n\n initSentry(sentryOptions);\n }\n\n addEvent = (e: SentryEchoEvent) => {\n this.transports.forEach((t) => t.sendEvent(e.payload));\n };\n\n // backend will log events to stdout, and at least in case of hosted grafana they will be\n // ingested into Loki. Due to Loki limitations logs cannot be backdated,\n // so not using buffering for this backend to make sure that events are logged as close\n // to their context as possible\n flush = () => {};\n}\n","import { PreloadPlugin } from '@grafana/data';\n\nimport { importPluginModule } from './plugin_loader';\n\nexport async function preloadPlugins(pluginsToPreload: PreloadPlugin[] = []): Promise<void> {\n await Promise.all(pluginsToPreload.map(preloadPlugin));\n}\n\nasync function preloadPlugin(plugin: PreloadPlugin): Promise<void> {\n const { path, version } = plugin;\n try {\n await importPluginModule(path, version);\n } catch (error: unknown) {\n console.error(`Failed to load plugin: ${path} (version: ${version})`, error);\n }\n}\n","import { cloneDeep } from 'lodash';\nimport { from, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\nimport {\n CoreApp,\n DataQueryRequest,\n DataSourceApi,\n PanelData,\n rangeUtil,\n ScopedVars,\n QueryRunnerOptions,\n QueryRunner as QueryRunnerSrv,\n LoadingState,\n DataSourceRef,\n} from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\n\nimport { getNextRequestId } from './PanelQueryRunner';\nimport { setStructureRevision } from './processing/revision';\nimport { preProcessPanelData, runRequest } from './runRequest';\n\nexport class QueryRunner implements QueryRunnerSrv {\n private subject: ReplaySubject<PanelData>;\n private subscription?: Unsubscribable;\n private lastResult?: PanelData;\n\n constructor() {\n this.subject = new ReplaySubject(1);\n }\n\n get(): Observable<PanelData> {\n return this.subject.asObservable();\n }\n\n run(options: QueryRunnerOptions): void {\n const {\n queries,\n timezone,\n datasource,\n panelId,\n app,\n dashboardId,\n timeRange,\n timeInfo,\n cacheTimeout,\n maxDataPoints,\n scopedVars,\n minInterval,\n } = options;\n\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n\n const request: DataQueryRequest = {\n app: app ?? CoreApp.Unknown,\n requestId: getNextRequestId(),\n timezone,\n panelId,\n dashboardId,\n range: timeRange,\n timeInfo,\n interval: '',\n intervalMs: 0,\n targets: cloneDeep(queries),\n maxDataPoints: maxDataPoints,\n scopedVars: scopedVars || {},\n cacheTimeout,\n startTime: Date.now(),\n };\n\n // Add deprecated property\n request.rangeRaw = timeRange.raw;\n\n from(getDataSource(datasource, request.scopedVars))\n .pipe(first())\n .subscribe({\n next: (ds) => {\n // Attach the datasource name to each query\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n const lowerIntervalLimit = minInterval\n ? getTemplateSrv().replace(minInterval, request.scopedVars)\n : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange, maxDataPoints, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n this.subscription = runRequest(ds, request).subscribe({\n next: (data) => {\n const results = preProcessPanelData(data, this.lastResult);\n this.lastResult = setStructureRevision(results, this.lastResult);\n // Store preprocessed query results for applying overrides later on in the pipeline\n this.subject.next(this.lastResult);\n },\n });\n },\n error: (error) => console.error('PanelQueryRunner Error', error),\n });\n }\n\n cancel(): void {\n if (!this.subscription) {\n return;\n }\n\n this.subscription.unsubscribe();\n\n // If we have an old result with loading state, send it with done state\n if (this.lastResult && this.lastResult.state === LoadingState.Loading) {\n this.subject.next({\n ...this.lastResult,\n state: LoadingState.Done,\n });\n }\n }\n\n destroy(): void {\n // Tell anyone listening that we are done\n if (this.subject) {\n this.subject.complete();\n }\n\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n}\n\nasync function getDataSource(\n datasource: DataSourceRef | DataSourceApi | null,\n scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n if (datasource && 'query' in datasource) {\n return datasource;\n }\n\n return getDatasourceSrv().get(datasource, scopedVars);\n}\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\nimport { Alert, InlineFieldRow, VerticalGroup } from '@grafana/ui';\nimport { StoreState } from 'app/types';\n\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { initialVariableEditorState } from '../editor/reducer';\nimport { getAdhocVariableEditorState } from '../editor/selectors';\nimport { VariableEditorProps } from '../editor/types';\nimport { getVariablesState } from '../state/selectors';\nimport { AdHocVariableModel } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nimport { changeVariableDatasource, initAdHocVariableEditor } from './actions';\n\nconst mapStateToProps = (state: StoreState, ownProps: OwnProps) => {\n const { rootStateKey } = ownProps.variable;\n\n if (!rootStateKey) {\n console.error('AdHocVariableEditor: variable has no rootStateKey');\n return {\n extended: getAdhocVariableEditorState(initialVariableEditorState),\n };\n }\n\n const { editor } = getVariablesState(rootStateKey, state);\n\n return {\n extended: getAdhocVariableEditorState(editor),\n };\n};\n\nconst mapDispatchToProps = {\n initAdHocVariableEditor,\n changeVariableDatasource,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport interface OwnProps extends VariableEditorProps<AdHocVariableModel> {}\n\ntype Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport class AdHocVariableEditorUnConnected extends PureComponent<Props> {\n componentDidMount() {\n const { rootStateKey } = this.props.variable;\n if (!rootStateKey) {\n console.error('AdHocVariableEditor: variable has no rootStateKey');\n return;\n }\n\n this.props.initAdHocVariableEditor(rootStateKey);\n }\n\n onDatasourceChanged = (option: SelectableValue<DataSourceRef>) => {\n this.props.changeVariableDatasource(toKeyedVariableIdentifier(this.props.variable), option.value);\n };\n\n render() {\n const { variable, extended } = this.props;\n const dataSources = extended?.dataSources ?? [];\n const infoText = extended?.infoText ?? null;\n const options = dataSources.map((ds) => ({ label: ds.text, value: ds.value }));\n const value = options.find((o) => o.value?.uid === variable.datasource?.uid) ?? options[0];\n\n return (\n <VerticalGroup spacing=\"xs\">\n <VariableSectionHeader name=\"Options\" />\n <VerticalGroup spacing=\"sm\">\n <InlineFieldRow>\n <VariableSelectField\n name=\"Data source\"\n value={value}\n options={options}\n onChange={this.onDatasourceChanged}\n labelWidth={10}\n />\n </InlineFieldRow>\n\n {infoText ? <Alert title={infoText} severity=\"info\" /> : null}\n </VerticalGroup>\n </VerticalGroup>\n );\n }\n}\n\nexport const AdHocVariableEditor = connector(AdHocVariableEditorUnConnected);\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { AdHocVariableFilter, AdHocVariableModel } from 'app/features/variables/types';\n\nimport { VariablePickerProps } from '../../pickers/types';\nimport { toKeyedVariableIdentifier } from '../../utils';\nimport { addFilter, changeFilter, removeFilter } from '../actions';\n\nimport { AdHocFilter } from './AdHocFilter';\n\nconst mapDispatchToProps = {\n addFilter,\n removeFilter,\n changeFilter,\n};\n\nconst connector = connect(null, mapDispatchToProps);\n\ninterface OwnProps extends VariablePickerProps<AdHocVariableModel> {}\n\ntype Props = OwnProps & ConnectedProps<typeof connector>;\n\n/**\n * Thin wrapper over AdHocFilter to add redux actions and change the props so it can be used for ad hoc variable\n * control.\n */\nexport class AdHocPickerUnconnected extends PureComponent<Props> {\n addFilter = (filter: AdHocVariableFilter) => {\n this.props.addFilter(toKeyedVariableIdentifier(this.props.variable), filter);\n };\n\n removeFilter = (index: number) => {\n this.props.removeFilter(toKeyedVariableIdentifier(this.props.variable), index);\n };\n\n changeFilter = (index: number, filter: AdHocVariableFilter) => {\n this.props.changeFilter(toKeyedVariableIdentifier(this.props.variable), {\n index,\n filter,\n });\n };\n\n render() {\n const { filters, datasource } = this.props.variable;\n\n return (\n <AdHocFilter\n datasource={datasource}\n filters={filters}\n disabled={this.props.readOnly}\n addFilter={this.addFilter}\n removeFilter={this.removeFilter}\n changeFilter={this.changeFilter}\n />\n );\n }\n}\n\nexport const AdHocPicker = connector(AdHocPickerUnconnected);\nAdHocPicker.displayName = 'AdHocPicker';\n","import { isArray, isString } from 'lodash';\n\nimport { UrlQueryValue } from '@grafana/data';\nimport { AdHocVariableFilter } from 'app/features/variables/types';\n\nexport const toUrl = (filters: AdHocVariableFilter[]): string[] => {\n return filters.map((filter) => toArray(filter).map(escapeDelimiter).join('|'));\n};\n\nexport const toFilters = (value: UrlQueryValue): AdHocVariableFilter[] => {\n if (isArray(value)) {\n const values = value as any[];\n return values.map(toFilter).filter(isFilter);\n }\n\n const filter = toFilter(value);\n return filter === null ? [] : [filter];\n};\n\nfunction escapeDelimiter(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return /\\|/g[Symbol.replace](value, '__gfp__');\n}\n\nfunction unescapeDelimiter(value: string | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n return /__gfp__/g[Symbol.replace](value, '|');\n}\n\nfunction toArray(filter: AdHocVariableFilter): string[] {\n return [filter.key, filter.operator, filter.value];\n}\n\nfunction toFilter(value: string | number | boolean | undefined | null): AdHocVariableFilter | null {\n if (!isString(value) || value.length === 0) {\n return null;\n }\n\n const parts = value.split('|').map(unescapeDelimiter);\n\n return {\n key: parts[0],\n operator: parts[1],\n value: parts[2],\n condition: '',\n };\n}\n\nfunction isFilter(filter: AdHocVariableFilter | null): filter is AdHocVariableFilter {\n return filter !== null && isString(filter.value);\n}\n","import { cloneDeep } from 'lodash';\n\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { AdHocVariableModel } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nimport { AdHocVariableEditor } from './AdHocVariableEditor';\nimport { setFiltersFromUrl } from './actions';\nimport { AdHocPicker } from './picker/AdHocPicker';\nimport { adHocVariableReducer, initialAdHocVariableModelState } from './reducer';\nimport * as urlParser from './urlParser';\n\nconst noop = async () => {};\n\nexport const createAdHocVariableAdapter = (): VariableAdapter<AdHocVariableModel> => {\n return {\n id: 'adhoc',\n description: 'Add key/value filters on the fly.',\n name: 'Ad hoc filters',\n initialState: initialAdHocVariableModelState,\n reducer: adHocVariableReducer,\n picker: AdHocPicker,\n editor: AdHocVariableEditor,\n dependsOn: () => false,\n setValue: noop,\n setValueFromUrl: async (variable, urlValue) => {\n const filters = urlParser.toFilters(urlValue);\n await dispatch(setFiltersFromUrl(toKeyedVariableIdentifier(variable), filters));\n },\n updateOptions: noop,\n getSaveModel: (variable) => {\n const { index, id, state, global, rootStateKey, ...rest } = cloneDeep(variable);\n return rest;\n },\n getValueForUrl: (variable) => {\n const filters = variable?.filters ?? [];\n return urlParser.toUrl(filters);\n },\n };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { isNumber, sortBy, toLower, uniqBy } from 'lodash';\n\nimport { MetricFindValue, stringToJsRegex } from '@grafana/data';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE, NONE_VARIABLE_TEXT, NONE_VARIABLE_VALUE } from '../constants';\nimport { getInstanceState } from '../state/selectors';\nimport { initialVariablesState, VariablePayload, VariablesState } from '../state/types';\nimport { initialVariableModelState, QueryVariableModel, VariableOption, VariableRefresh, VariableSort } from '../types';\n\ninterface VariableOptionsUpdate {\n templatedRegex: string;\n results: MetricFindValue[];\n}\n\nexport const initialQueryVariableModelState: QueryVariableModel = {\n ...initialVariableModelState,\n type: 'query',\n datasource: null,\n query: '',\n regex: '',\n sort: VariableSort.disabled,\n refresh: VariableRefresh.onDashboardLoad,\n multi: false,\n includeAll: false,\n allValue: null,\n options: [],\n current: {} as VariableOption,\n definition: '',\n};\n\nexport const sortVariableValues = (options: any[], sortOrder: VariableSort) => {\n if (sortOrder === VariableSort.disabled) {\n return options;\n }\n\n const sortType = Math.ceil(sortOrder / 2);\n const reverseSort = sortOrder % 2 === 0;\n\n if (sortType === 1) {\n options = sortBy(options, 'text');\n } else if (sortType === 2) {\n options = sortBy(options, (opt) => {\n if (!opt.text) {\n return -1;\n }\n\n const matches = opt.text.match(/.*?(\\d+).*/);\n if (!matches || matches.length < 2) {\n return -1;\n } else {\n return parseInt(matches[1], 10);\n }\n });\n } else if (sortType === 3) {\n options = sortBy(options, (opt) => {\n return toLower(opt.text);\n });\n }\n\n if (reverseSort) {\n options = options.reverse();\n }\n\n return options;\n};\n\nconst getAllMatches = (str: string, regex: RegExp): RegExpExecArray[] => {\n const results: RegExpExecArray[] = [];\n let matches = null;\n\n regex.lastIndex = 0;\n\n do {\n matches = regex.exec(str);\n if (matches) {\n results.push(matches);\n }\n } while (regex.global && matches && matches[0] !== '' && matches[0] !== undefined);\n\n return results;\n};\n\nexport const metricNamesToVariableValues = (variableRegEx: string, sort: VariableSort, metricNames: any[]) => {\n let regex;\n let options: VariableOption[] = [];\n\n if (variableRegEx) {\n regex = stringToJsRegex(variableRegEx);\n }\n\n for (let i = 0; i < metricNames.length; i++) {\n const item = metricNames[i];\n let text = item.text === undefined || item.text === null ? item.value : item.text;\n let value = item.value === undefined || item.value === null ? item.text : item.value;\n\n if (isNumber(value)) {\n value = value.toString();\n }\n\n if (isNumber(text)) {\n text = text.toString();\n }\n\n if (regex) {\n const matches = getAllMatches(value, regex);\n if (!matches.length) {\n continue;\n }\n\n const valueGroup = matches.find((m) => m.groups && m.groups.value);\n const textGroup = matches.find((m) => m.groups && m.groups.text);\n const firstMatch = matches.find((m) => m.length > 1);\n const manyMatches = matches.length > 1 && firstMatch;\n\n if (valueGroup || textGroup) {\n value = valueGroup?.groups?.value ?? textGroup?.groups?.text;\n text = textGroup?.groups?.text ?? valueGroup?.groups?.value;\n } else if (manyMatches) {\n for (let j = 0; j < matches.length; j++) {\n const match = matches[j];\n options.push({ text: match[1], value: match[1], selected: false });\n }\n continue;\n } else if (firstMatch) {\n text = firstMatch[1];\n value = firstMatch[1];\n }\n }\n\n options.push({ text: text, value: value, selected: false });\n }\n\n options = uniqBy(options, 'value');\n return sortVariableValues(options, sort);\n};\n\nexport const queryVariableSlice = createSlice({\n name: 'templating/query',\n initialState: initialVariablesState,\n reducers: {\n updateVariableOptions: (state: VariablesState, action: PayloadAction<VariablePayload<VariableOptionsUpdate>>) => {\n const { results, templatedRegex } = action.payload.data;\n const instanceState = getInstanceState<QueryVariableModel>(state, action.payload.id);\n const { includeAll, sort } = instanceState;\n const options = metricNamesToVariableValues(templatedRegex, sort, results);\n\n if (includeAll) {\n options.unshift({ text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false });\n }\n\n if (!options.length) {\n options.push({ text: NONE_VARIABLE_TEXT, value: NONE_VARIABLE_VALUE, isNone: true, selected: false });\n }\n\n instanceState.options = options;\n },\n },\n});\n\nexport const queryVariableReducer = queryVariableSlice.reducer;\n\nexport const { updateVariableOptions } = queryVariableSlice.actions;\n","import { from, of, OperatorFunction } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport { FieldType, getFieldDisplayName, isDataFrame, MetricFindValue, PanelData } from '@grafana/data';\nimport { getProcessedDataFrames } from 'app/features/query/state/runRequest';\n\nimport { ThunkDispatch } from '../../../types';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { QueryVariableModel } from '../types';\nimport { getTemplatedRegex, toKeyedVariableIdentifier, toVariablePayload } from '../utils';\n\nimport { updateVariableOptions } from './reducer';\n\nexport function toMetricFindValues(): OperatorFunction<PanelData, MetricFindValue[]> {\n return (source) =>\n source.pipe(\n map((panelData) => {\n const frames = panelData.series;\n if (!frames || !frames.length) {\n return [];\n }\n\n if (areMetricFindValues(frames)) {\n return frames;\n }\n\n const processedDataFrames = getProcessedDataFrames(frames);\n const metrics: MetricFindValue[] = [];\n\n let valueIndex = -1;\n let textIndex = -1;\n let stringIndex = -1;\n let expandableIndex = -1;\n\n for (const frame of processedDataFrames) {\n for (let index = 0; index < frame.fields.length; index++) {\n const field = frame.fields[index];\n const fieldName = getFieldDisplayName(field, frame, frames).toLowerCase();\n\n if (field.type === FieldType.string && stringIndex === -1) {\n stringIndex = index;\n }\n\n if (fieldName === 'text' && field.type === FieldType.string && textIndex === -1) {\n textIndex = index;\n }\n\n if (fieldName === 'value' && field.type === FieldType.string && valueIndex === -1) {\n valueIndex = index;\n }\n\n if (\n fieldName === 'expandable' &&\n (field.type === FieldType.boolean || field.type === FieldType.number) &&\n expandableIndex === -1\n ) {\n expandableIndex = index;\n }\n }\n }\n\n if (stringIndex === -1) {\n throw new Error(\"Couldn't find any field of type string in the results.\");\n }\n\n for (const frame of frames) {\n for (let index = 0; index < frame.length; index++) {\n const expandable = expandableIndex !== -1 ? frame.fields[expandableIndex].values.get(index) : undefined;\n const string = frame.fields[stringIndex].values.get(index);\n const text = textIndex !== -1 ? frame.fields[textIndex].values.get(index) : null;\n const value = valueIndex !== -1 ? frame.fields[valueIndex].values.get(index) : null;\n\n if (valueIndex === -1 && textIndex === -1) {\n metrics.push({ text: string, value: string, expandable });\n continue;\n }\n\n if (valueIndex === -1 && textIndex !== -1) {\n metrics.push({ text, value: text, expandable });\n continue;\n }\n\n if (valueIndex !== -1 && textIndex === -1) {\n metrics.push({ text: value, value, expandable });\n continue;\n }\n\n metrics.push({ text, value, expandable });\n }\n }\n\n return metrics;\n })\n );\n}\n\nexport function updateOptionsState(args: {\n variable: QueryVariableModel;\n dispatch: ThunkDispatch;\n getTemplatedRegexFunc: typeof getTemplatedRegex;\n}): OperatorFunction<MetricFindValue[], void> {\n return (source) =>\n source.pipe(\n map((results) => {\n const { variable, dispatch, getTemplatedRegexFunc } = args;\n if (!variable.rootStateKey) {\n console.error('updateOptionsState: variable.rootStateKey is not defined');\n return;\n }\n const templatedRegex = getTemplatedRegexFunc(variable);\n const payload = toVariablePayload(variable, { results, templatedRegex });\n dispatch(toKeyedAction(variable.rootStateKey, updateVariableOptions(payload)));\n })\n );\n}\n\nexport function validateVariableSelection(args: {\n variable: QueryVariableModel;\n dispatch: ThunkDispatch;\n searchFilter?: string;\n}): OperatorFunction<void, void> {\n return (source) =>\n source.pipe(\n mergeMap(() => {\n const { dispatch, variable, searchFilter } = args;\n\n // If we are searching options there is no need to validate selection state\n // This condition was added to as validateVariableSelectionState will update the current value of the variable\n // So after search and selection the current value is already update so no setValue, refresh and URL update is performed\n // The if statement below fixes https://github.com/grafana/grafana/issues/25671\n if (!searchFilter) {\n return from(dispatch(validateVariableSelectionState(toKeyedVariableIdentifier(variable))));\n }\n\n return of<void>();\n })\n );\n}\n\nexport function areMetricFindValues(data: any[]): data is MetricFindValue[] {\n if (!data) {\n return false;\n }\n\n if (!data.length) {\n return true;\n }\n\n const firstValue: any = data[0];\n\n if (isDataFrame(firstValue)) {\n return false;\n }\n\n for (const firstValueKey in firstValue) {\n if (!firstValue.hasOwnProperty(firstValueKey)) {\n continue;\n }\n\n if (\n firstValue[firstValueKey] !== null &&\n typeof firstValue[firstValueKey] !== 'string' &&\n typeof firstValue[firstValueKey] !== 'number'\n ) {\n continue;\n }\n\n const key = firstValueKey.toLowerCase();\n\n if (key === 'text' || key === 'value') {\n return true;\n }\n }\n\n return false;\n}\n","import { from, Observable, of } from 'rxjs';\nimport { mergeMap } from 'rxjs/operators';\n\nimport {\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n VariableSupportType,\n} from '@grafana/data';\n\nimport { TimeSrv } from '../../dashboard/services/TimeSrv';\nimport {\n hasCustomVariableSupport,\n hasDatasourceVariableSupport,\n hasLegacyVariableSupport,\n hasStandardVariableSupport,\n} from '../guard';\nimport { QueryVariableModel } from '../types';\nimport { getLegacyQueryOptions } from '../utils';\n\nexport interface RunnerArgs {\n variable: QueryVariableModel;\n datasource: DataSourceApi;\n timeSrv: TimeSrv;\n runRequest: (\n datasource: DataSourceApi,\n request: DataQueryRequest,\n queryFunction?: typeof datasource.query\n ) => Observable<PanelData>;\n searchFilter?: string;\n}\n\ntype GetTargetArgs = { datasource: DataSourceApi; variable: QueryVariableModel };\n\nexport interface QueryRunner {\n type: VariableSupportType;\n canRun: (dataSource: DataSourceApi) => boolean;\n getTarget: (args: GetTargetArgs) => DataQuery;\n runRequest: (args: RunnerArgs, request: DataQueryRequest) => Observable<PanelData>;\n}\n\nexport class QueryRunners {\n private readonly runners: QueryRunner[];\n constructor() {\n this.runners = [\n new LegacyQueryRunner(),\n new StandardQueryRunner(),\n new CustomQueryRunner(),\n new DatasourceQueryRunner(),\n ];\n }\n\n getRunnerForDatasource(datasource: DataSourceApi): QueryRunner {\n const runner = this.runners.find((runner) => runner.canRun(datasource));\n if (runner) {\n return runner;\n }\n\n throw new Error(\"Couldn't find a query runner that matches supplied arguments.\");\n }\n}\n\nclass LegacyQueryRunner implements QueryRunner {\n type = VariableSupportType.Legacy;\n\n canRun(dataSource: DataSourceApi) {\n return hasLegacyVariableSupport(dataSource);\n }\n\n getTarget({ datasource, variable }: GetTargetArgs) {\n if (hasLegacyVariableSupport(datasource)) {\n return variable.query;\n }\n\n throw new Error(\"Couldn't create a target with supplied arguments.\");\n }\n\n runRequest({ datasource, variable, searchFilter, timeSrv }: RunnerArgs, request: DataQueryRequest) {\n if (!hasLegacyVariableSupport(datasource)) {\n return getEmptyMetricFindValueObservable();\n }\n\n const queryOptions: any = getLegacyQueryOptions(variable, searchFilter, timeSrv);\n\n return from(datasource.metricFindQuery(variable.query, queryOptions)).pipe(\n mergeMap((values) => {\n if (!values || !values.length) {\n return getEmptyMetricFindValueObservable();\n }\n\n const series: any = values;\n return of({ series, state: LoadingState.Done, timeRange: queryOptions.range });\n })\n );\n }\n}\n\nclass StandardQueryRunner implements QueryRunner {\n type = VariableSupportType.Standard;\n\n canRun(dataSource: DataSourceApi) {\n return hasStandardVariableSupport(dataSource);\n }\n\n getTarget({ datasource, variable }: GetTargetArgs) {\n if (hasStandardVariableSupport(datasource)) {\n return datasource.variables.toDataQuery(variable.query);\n }\n\n throw new Error(\"Couldn't create a target with supplied arguments.\");\n }\n\n runRequest({ datasource, runRequest }: RunnerArgs, request: DataQueryRequest) {\n if (!hasStandardVariableSupport(datasource)) {\n return getEmptyMetricFindValueObservable();\n }\n\n if (!datasource.variables.query) {\n return runRequest(datasource, request);\n }\n\n return runRequest(datasource, request, datasource.variables.query);\n }\n}\n\nclass CustomQueryRunner implements QueryRunner {\n type = VariableSupportType.Custom;\n\n canRun(dataSource: DataSourceApi) {\n return hasCustomVariableSupport(dataSource);\n }\n\n getTarget({ datasource, variable }: GetTargetArgs) {\n if (hasCustomVariableSupport(datasource)) {\n return variable.query;\n }\n\n throw new Error(\"Couldn't create a target with supplied arguments.\");\n }\n\n runRequest({ datasource, runRequest }: RunnerArgs, request: DataQueryRequest) {\n if (!hasCustomVariableSupport(datasource)) {\n return getEmptyMetricFindValueObservable();\n }\n\n return runRequest(datasource, request, datasource.variables.query);\n }\n}\n\nexport const variableDummyRefId = 'variable-query';\n\nclass DatasourceQueryRunner implements QueryRunner {\n type = VariableSupportType.Datasource;\n\n canRun(dataSource: DataSourceApi) {\n return hasDatasourceVariableSupport(dataSource);\n }\n\n getTarget({ datasource, variable }: GetTargetArgs) {\n if (hasDatasourceVariableSupport(datasource)) {\n return { ...variable.query, refId: variable.query.refId ?? variableDummyRefId };\n }\n\n throw new Error(\"Couldn't create a target with supplied arguments.\");\n }\n\n runRequest({ datasource, runRequest }: RunnerArgs, request: DataQueryRequest) {\n if (!hasDatasourceVariableSupport(datasource)) {\n return getEmptyMetricFindValueObservable();\n }\n\n return runRequest(datasource, request);\n }\n}\n\nfunction getEmptyMetricFindValueObservable(): Observable<PanelData> {\n return of({ state: LoadingState.Done, series: [], timeRange: getDefaultTimeRange() });\n}\n","import { merge, Observable, of, Subject, throwError, Unsubscribable } from 'rxjs';\nimport { catchError, filter, finalize, mergeMap, take, takeUntil } from 'rxjs/operators';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n ScopedVars,\n} from '@grafana/data';\n\nimport { dispatch, getState } from '../../../store/store';\nimport { StoreState, ThunkDispatch } from '../../../types';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { runRequest } from '../../query/state/runRequest';\nimport { getLastKey, getVariable } from '../state/selectors';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { QueryVariableModel, VariableRefresh } from '../types';\nimport { getTemplatedRegex } from '../utils';\n\nimport { toMetricFindValues, updateOptionsState, validateVariableSelection } from './operators';\nimport { QueryRunners } from './queryRunners';\n\ninterface UpdateOptionsArgs {\n identifier: KeyedVariableIdentifier;\n datasource: DataSourceApi;\n searchFilter?: string;\n}\n\nexport interface UpdateOptionsResults {\n state: LoadingState;\n identifier: KeyedVariableIdentifier;\n error?: any;\n cancelled?: boolean;\n}\n\ninterface VariableQueryRunnerArgs {\n dispatch: ThunkDispatch;\n getState: () => StoreState;\n getVariable: typeof getVariable;\n getTemplatedRegex: typeof getTemplatedRegex;\n getTimeSrv: typeof getTimeSrv;\n queryRunners: QueryRunners;\n runRequest: typeof runRequest;\n}\n\nexport class VariableQueryRunner {\n private readonly updateOptionsRequests: Subject<UpdateOptionsArgs>;\n private readonly updateOptionsResults: Subject<UpdateOptionsResults>;\n private readonly cancelRequests: Subject<{ identifier: KeyedVariableIdentifier }>;\n private readonly subscription: Unsubscribable;\n\n constructor(\n private dependencies: VariableQueryRunnerArgs = {\n dispatch,\n getState,\n getVariable,\n getTemplatedRegex,\n getTimeSrv,\n queryRunners: new QueryRunners(),\n runRequest,\n }\n ) {\n this.updateOptionsRequests = new Subject<UpdateOptionsArgs>();\n this.updateOptionsResults = new Subject<UpdateOptionsResults>();\n this.cancelRequests = new Subject<{ identifier: KeyedVariableIdentifier }>();\n this.onNewRequest = this.onNewRequest.bind(this);\n this.subscription = this.updateOptionsRequests.subscribe(this.onNewRequest);\n }\n\n queueRequest(args: UpdateOptionsArgs): void {\n this.updateOptionsRequests.next(args);\n }\n\n getResponse(identifier: KeyedVariableIdentifier): Observable<UpdateOptionsResults> {\n return this.updateOptionsResults.asObservable().pipe(filter((result) => result.identifier === identifier));\n }\n\n cancelRequest(identifier: KeyedVariableIdentifier): void {\n this.cancelRequests.next({ identifier });\n }\n\n destroy(): void {\n this.subscription.unsubscribe();\n }\n\n private onNewRequest(args: UpdateOptionsArgs): void {\n const { datasource, identifier, searchFilter } = args;\n try {\n const {\n dispatch,\n runRequest,\n getTemplatedRegex: getTemplatedRegexFunc,\n getVariable,\n queryRunners,\n getTimeSrv,\n getState,\n } = this.dependencies;\n\n const beforeKey = getLastKey(getState());\n\n this.updateOptionsResults.next({ identifier, state: LoadingState.Loading });\n\n const variable = getVariable<QueryVariableModel>(identifier, getState());\n const timeSrv = getTimeSrv();\n const runnerArgs = { variable, datasource, searchFilter, timeSrv, runRequest };\n const runner = queryRunners.getRunnerForDatasource(datasource);\n const target = runner.getTarget({ datasource, variable });\n const request = this.getRequest(variable, args, target);\n\n runner\n .runRequest(runnerArgs, request)\n .pipe(\n filter(() => {\n // Lets check if we started another batch during the execution of the observable. If so we just want to abort the rest.\n const afterKey = getLastKey(getState());\n\n return beforeKey === afterKey;\n }),\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error), // we only care about done or error for now\n take(1), // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n\n return of(data);\n }),\n toMetricFindValues(),\n updateOptionsState({ variable, dispatch, getTemplatedRegexFunc }),\n validateVariableSelection({ variable, dispatch, searchFilter }),\n takeUntil(\n merge(this.updateOptionsRequests, this.cancelRequests).pipe(\n filter((args) => {\n let cancelRequest = false;\n\n if (args.identifier.id === identifier.id) {\n cancelRequest = true;\n this.updateOptionsResults.next({ identifier, state: LoadingState.Loading, cancelled: cancelRequest });\n }\n\n return cancelRequest;\n })\n )\n ),\n catchError((error) => {\n if (error.cancelled) {\n return of({});\n }\n\n this.updateOptionsResults.next({ identifier, state: LoadingState.Error, error });\n return throwError(() => error);\n }),\n finalize(() => {\n this.updateOptionsResults.next({ identifier, state: LoadingState.Done });\n })\n )\n .subscribe();\n } catch (error) {\n this.updateOptionsResults.next({ identifier, state: LoadingState.Error, error });\n }\n }\n\n private getRequest(variable: QueryVariableModel, args: UpdateOptionsArgs, target: DataQuery) {\n const { searchFilter } = args;\n const variableAsVars = { variable: { text: variable.current.text, value: variable.current.value } };\n const searchFilterScope = { searchFilter: { text: searchFilter, value: searchFilter } };\n const searchFilterAsVars = searchFilter ? searchFilterScope : {};\n const scopedVars = { ...searchFilterAsVars, ...variableAsVars } as ScopedVars;\n const range =\n variable.refresh === VariableRefresh.onTimeRangeChanged\n ? this.dependencies.getTimeSrv().timeRange()\n : getDefaultTimeRange();\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n\n return request;\n }\n}\n\nlet singleton: VariableQueryRunner;\n\nexport function setVariableQueryRunner(runner: VariableQueryRunner): void {\n singleton = runner;\n}\n\nexport function getVariableQueryRunner(): VariableQueryRunner {\n return singleton;\n}\n","import { VariableModel } from '../types';\n\nexport interface VariablePickerProps<Model extends VariableModel = VariableModel> {\n variable: Model;\n readOnly: boolean;\n onVariableChange?: (variable: Model) => void;\n}\n\nexport enum NavigationKey {\n moveUp = 38,\n moveDown = 40,\n select = 32,\n cancel = 27,\n selectAndClose = 13,\n}\n","import React, { PureComponent } from 'react';\n\nimport { NavigationKey } from '../types';\n\nexport interface Props extends Omit<React.HTMLProps<HTMLInputElement>, 'onChange' | 'value'> {\n onChange: (value: string) => void;\n onNavigate: (key: NavigationKey, clearOthers: boolean) => void;\n value: string | null;\n}\n\nexport class VariableInput extends PureComponent<Props> {\n onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (NavigationKey[event.keyCode]) {\n const clearOthers = event.ctrlKey || event.metaKey || event.shiftKey;\n this.props.onNavigate(event.keyCode as NavigationKey, clearOthers);\n event.preventDefault();\n }\n };\n\n onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n this.props.onChange(event.target.value);\n };\n\n render() {\n const { value, id, onNavigate, ...restProps } = this.props;\n return (\n <input\n {...restProps}\n ref={(instance) => {\n if (instance) {\n instance.focus();\n instance.setAttribute('style', `width:${Math.max(instance.width, 150)}px`);\n }\n }}\n type=\"text\"\n className=\"gf-form-input\"\n value={value ?? ''}\n onChange={this.onChange}\n onKeyDown={this.onKeyDown}\n placeholder=\"Enter variable value\"\n />\n );\n }\n}\n","import { css } from '@emotion/css';\nimport React, { FC, MouseEvent, useCallback } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\n\ninterface Props {\n onClick: () => void;\n text: string;\n loading: boolean;\n onCancel: () => void;\n disabled: boolean; // todo: optional?\n /**\n * htmlFor, needed for the label\n */\n id: string;\n}\n\nexport const VariableLink: FC<Props> = ({ loading, disabled, onClick: propsOnClick, text, onCancel, id }) => {\n const styles = useStyles2(getStyles);\n const onClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n event.preventDefault();\n propsOnClick();\n },\n [propsOnClick]\n );\n\n if (loading) {\n return (\n <div\n className={styles.container}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${text}`)}\n title={text}\n id={id}\n >\n <VariableLinkText text={text} />\n <LoadingIndicator onCancel={onCancel} />\n </div>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={styles.container}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${text}`)}\n aria-expanded={false}\n aria-controls={`options-${id}`}\n id={id}\n title={text}\n disabled={disabled}\n >\n <VariableLinkText text={text} />\n <Icon aria-hidden name=\"angle-down\" size=\"sm\" />\n </button>\n );\n};\n\ninterface VariableLinkTextProps {\n text: string;\n}\n\nconst VariableLinkText: FC<VariableLinkTextProps> = ({ text }) => {\n const styles = useStyles2(getStyles);\n return <span className={styles.textAndTags}>{text}</span>;\n};\n\nconst LoadingIndicator: FC<Pick<Props, 'onCancel'>> = ({ onCancel }) => {\n const onClick = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n onCancel();\n },\n [onCancel]\n );\n\n return (\n <Tooltip content=\"Cancel query\">\n <Icon\n className=\"spin-clockwise\"\n name=\"sync\"\n size=\"xs\"\n onClick={onClick}\n aria-label={selectors.components.LoadingIndicator.icon}\n />\n </Tooltip>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css`\n max-width: 500px;\n padding-right: 10px;\n padding: 0 ${theme.spacing(1)};\n background-color: ${theme.components.input.background};\n border: 1px solid ${theme.components.input.borderColor};\n border-radius: ${theme.shape.borderRadius(1)};\n display: flex;\n align-items: center;\n color: ${theme.colors.text};\n height: ${theme.spacing(theme.components.height.md)};\n\n .label-tag {\n margin: 0 5px;\n }\n\n &:disabled {\n background-color: ${theme.colors.action.disabledBackground};\n color: ${theme.colors.action.disabledText};\n border: 1px solid ${theme.colors.action.disabledBackground};\n }\n `,\n textAndTags: css`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: ${theme.spacing(0.25)};\n user-select: none;\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Tooltip } from '@grafana/ui';\n\nimport { VariableOption } from '../../types';\n\nexport interface Props extends React.HTMLProps<HTMLUListElement> {\n multi: boolean;\n values: VariableOption[];\n selectedValues: VariableOption[];\n highlightIndex: number;\n onToggle: (option: VariableOption, clearOthers: boolean) => void;\n onToggleAll: () => void;\n /**\n * Used for aria-controls\n */\n id: string;\n}\n\nexport class VariableOptions extends PureComponent<Props> {\n onToggle = (option: VariableOption) => (event: React.MouseEvent<HTMLAnchorElement>) => {\n const clearOthers = event.shiftKey || event.ctrlKey || event.metaKey;\n this.handleEvent(event);\n this.props.onToggle(option, clearOthers);\n };\n\n onToggleAll = (event: React.MouseEvent<HTMLAnchorElement>) => {\n this.handleEvent(event);\n this.props.onToggleAll();\n };\n\n handleEvent(event: React.MouseEvent<HTMLAnchorElement>) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n render() {\n // Don't want to pass faulty rest props to the div\n const { multi, values, highlightIndex, selectedValues, onToggle, onToggleAll, ...restProps } = this.props;\n\n return (\n <div className={`${multi ? 'variable-value-dropdown multi' : 'variable-value-dropdown single'}`}>\n <div className=\"variable-options-wrapper\">\n <ul\n className={listStyles}\n aria-label={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown}\n {...restProps}\n >\n {this.renderMultiToggle()}\n {values.map((option, index) => this.renderOption(option, index))}\n </ul>\n </div>\n </div>\n );\n }\n\n renderOption(option: VariableOption, index: number) {\n const { highlightIndex } = this.props;\n const selectClass = option.selected ? 'variable-option pointer selected' : 'variable-option pointer';\n const highlightClass = index === highlightIndex ? `${selectClass} highlighted` : selectClass;\n\n return (\n <li key={`${option.value}`}>\n <a role=\"checkbox\" aria-checked={option.selected} className={highlightClass} onClick={this.onToggle(option)}>\n <span className=\"variable-option-icon\"></span>\n <span data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(`${option.text}`)}>\n {option.text}\n </span>\n </a>\n </li>\n );\n }\n\n renderMultiToggle() {\n const { multi, selectedValues } = this.props;\n\n if (!multi) {\n return null;\n }\n\n return (\n <Tooltip content={'Clear selections'} placement={'top'}>\n <a\n className={`${\n selectedValues.length > 1\n ? 'variable-options-column-header many-selected'\n : 'variable-options-column-header'\n }`}\n role=\"checkbox\"\n aria-checked={selectedValues.length > 1 ? 'mixed' : 'false'}\n onClick={this.onToggleAll}\n aria-label=\"Toggle all values\"\n data-placement=\"top\"\n >\n <span className=\"variable-option-icon\"></span>\n Selected ({selectedValues.length})\n </a>\n </Tooltip>\n );\n }\n}\n\nconst listStyles = cx(\n 'variable-options-column',\n css`\n list-style-type: none;\n `\n);\n","import { debounce, trim } from 'lodash';\n\nimport { StoreState, ThunkDispatch, ThunkResult } from 'app/types';\n\nimport { variableAdapters } from '../../adapters';\nimport { toKeyedAction } from '../../state/keyedVariablesReducer';\nimport { getVariable, getVariablesState } from '../../state/selectors';\nimport { changeVariableProp, setCurrentVariableValue } from '../../state/sharedReducer';\nimport { KeyedVariableIdentifier } from '../../state/types';\nimport { VariableOption, VariableWithMultiSupport, VariableWithOptions } from '../../types';\nimport { containsSearchFilter, getCurrentValue, toVariablePayload } from '../../utils';\nimport { NavigationKey } from '../types';\n\nimport {\n hideOptions,\n moveOptionsHighlight,\n OptionsPickerState,\n showOptions,\n toggleOption,\n updateOptionsAndFilter,\n updateOptionsFromSearch,\n updateSearchQuery,\n} from './reducer';\n\nexport const navigateOptions = (rootStateKey: string, key: NavigationKey, clearOthers: boolean): ThunkResult<void> => {\n return async (dispatch, getState) => {\n if (key === NavigationKey.cancel) {\n return await dispatch(commitChangesToVariable(rootStateKey));\n }\n\n if (key === NavigationKey.select) {\n return dispatch(toggleOptionByHighlight(rootStateKey, clearOthers));\n }\n\n if (key === NavigationKey.selectAndClose) {\n dispatch(toggleOptionByHighlight(rootStateKey, clearOthers, true));\n return await dispatch(commitChangesToVariable(rootStateKey));\n }\n\n if (key === NavigationKey.moveDown) {\n return dispatch(toKeyedAction(rootStateKey, moveOptionsHighlight(1)));\n }\n\n if (key === NavigationKey.moveUp) {\n return dispatch(toKeyedAction(rootStateKey, moveOptionsHighlight(-1)));\n }\n\n return undefined;\n };\n};\n\nexport const filterOrSearchOptions = (\n passedIdentifier: KeyedVariableIdentifier,\n searchQuery = ''\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const { rootStateKey } = passedIdentifier;\n const { id, queryValue } = getVariablesState(rootStateKey, getState()).optionsPicker;\n const identifier: KeyedVariableIdentifier = { id, rootStateKey: rootStateKey, type: 'query' };\n const { query, options } = getVariable<VariableWithOptions>(identifier, getState());\n dispatch(toKeyedAction(rootStateKey, updateSearchQuery(searchQuery)));\n\n if (trim(queryValue) === trim(searchQuery)) {\n return;\n }\n\n if (containsSearchFilter(query)) {\n return searchForOptionsWithDebounce(dispatch, getState, searchQuery, rootStateKey);\n }\n return dispatch(toKeyedAction(rootStateKey, updateOptionsAndFilter(options)));\n };\n};\n\nconst setVariable = async (updated: VariableWithMultiSupport) => {\n const adapter = variableAdapters.get(updated.type);\n await adapter.setValue(updated, updated.current, true);\n return;\n};\n\nexport const commitChangesToVariable = (key: string, callback?: (updated: any) => void): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const picker = getVariablesState(key, getState()).optionsPicker;\n const identifier: KeyedVariableIdentifier = { id: picker.id, rootStateKey: key, type: 'query' };\n const existing = getVariable<VariableWithMultiSupport>(identifier, getState());\n const currentPayload = { option: mapToCurrent(picker) };\n const searchQueryPayload = { propName: 'queryValue', propValue: picker.queryValue };\n\n dispatch(toKeyedAction(key, setCurrentVariableValue(toVariablePayload(existing, currentPayload))));\n dispatch(toKeyedAction(key, changeVariableProp(toVariablePayload(existing, searchQueryPayload))));\n const updated = getVariable<VariableWithMultiSupport>(identifier, getState());\n dispatch(toKeyedAction(key, hideOptions()));\n\n if (getCurrentValue(existing) === getCurrentValue(updated)) {\n return;\n }\n\n if (callback) {\n return callback(updated);\n }\n\n return await setVariable(updated);\n };\n};\n\nexport const openOptions =\n (identifier: KeyedVariableIdentifier, callback?: (updated: any) => void): ThunkResult<void> =>\n async (dispatch, getState) => {\n const { id, rootStateKey: uid } = identifier;\n const picker = getVariablesState(uid, getState()).optionsPicker;\n\n if (picker.id && picker.id !== id) {\n await dispatch(commitChangesToVariable(uid, callback));\n }\n\n const variable = getVariable<VariableWithMultiSupport>(identifier, getState());\n dispatch(toKeyedAction(uid, showOptions(variable)));\n };\n\nexport const toggleOptionByHighlight = (key: string, clearOthers: boolean, forceSelect = false): ThunkResult<void> => {\n return (dispatch, getState) => {\n const { highlightIndex, options } = getVariablesState(key, getState()).optionsPicker;\n const option = options[highlightIndex];\n dispatch(toKeyedAction(key, toggleOption({ option, forceSelect, clearOthers })));\n };\n};\n\nconst searchForOptions = async (\n dispatch: ThunkDispatch,\n getState: () => StoreState,\n searchQuery: string,\n key: string\n) => {\n try {\n const { id } = getVariablesState(key, getState()).optionsPicker;\n const identifier: KeyedVariableIdentifier = { id, rootStateKey: key, type: 'query' };\n const existing = getVariable<VariableWithOptions>(identifier, getState());\n\n const adapter = variableAdapters.get(existing.type);\n await adapter.updateOptions(existing, searchQuery);\n\n const updated = getVariable<VariableWithOptions>(identifier, getState());\n dispatch(toKeyedAction(key, updateOptionsFromSearch(updated.options)));\n } catch (error) {\n console.error(error);\n }\n};\n\nconst searchForOptionsWithDebounce = debounce(searchForOptions, 500);\n\nexport function mapToCurrent(picker: OptionsPickerState): VariableOption | undefined {\n const { options, selectedValues, queryValue: searchQuery, multi } = picker;\n\n if (options.length === 0 && searchQuery && searchQuery.length > 0) {\n return { text: searchQuery, value: searchQuery, selected: false };\n }\n\n if (!multi) {\n return selectedValues.find((o) => o.selected);\n }\n\n const texts: string[] = [];\n const values: string[] = [];\n\n for (const option of selectedValues) {\n if (!option.selected) {\n continue;\n }\n\n texts.push(option.text.toString());\n values.push(option.value.toString());\n }\n\n return {\n value: values,\n text: texts,\n selected: true,\n };\n}\n","import React, { ComponentType, PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { bindActionCreators } from 'redux';\n\nimport { LoadingState } from '@grafana/data';\nimport { ClickOutsideWrapper } from '@grafana/ui';\nimport { StoreState, ThunkDispatch } from 'app/types';\n\nimport { isMulti } from '../../guard';\nimport { getVariableQueryRunner } from '../../query/VariableQueryRunner';\nimport { formatVariableLabel } from '../../shared/formatVariable';\nimport { toKeyedAction } from '../../state/keyedVariablesReducer';\nimport { getVariablesState } from '../../state/selectors';\nimport { KeyedVariableIdentifier } from '../../state/types';\nimport { VariableOption, VariableWithMultiSupport, VariableWithOptions } from '../../types';\nimport { toKeyedVariableIdentifier } from '../../utils';\nimport { VariableInput } from '../shared/VariableInput';\nimport { VariableLink } from '../shared/VariableLink';\nimport { VariableOptions } from '../shared/VariableOptions';\nimport { NavigationKey, VariablePickerProps } from '../types';\n\nimport { commitChangesToVariable, filterOrSearchOptions, navigateOptions, openOptions } from './actions';\nimport { initialOptionPickerState, OptionsPickerState, toggleAllOptions, toggleOption } from './reducer';\n\nexport const optionPickerFactory = <Model extends VariableWithOptions | VariableWithMultiSupport>(): ComponentType<\n VariablePickerProps<Model>\n> => {\n const mapDispatchToProps = (dispatch: ThunkDispatch) => {\n return {\n ...bindActionCreators({ openOptions, commitChangesToVariable, navigateOptions }, dispatch),\n filterOrSearchOptions: (identifier: KeyedVariableIdentifier, filter = '') => {\n dispatch(filterOrSearchOptions(identifier, filter));\n },\n toggleAllOptions: (identifier: KeyedVariableIdentifier) =>\n dispatch(toKeyedAction(identifier.rootStateKey, toggleAllOptions())),\n toggleOption: (\n identifier: KeyedVariableIdentifier,\n option: VariableOption,\n clearOthers: boolean,\n forceSelect: boolean\n ) => dispatch(toKeyedAction(identifier.rootStateKey, toggleOption({ option, clearOthers, forceSelect }))),\n };\n };\n\n const mapStateToProps = (state: StoreState, ownProps: OwnProps) => {\n const { rootStateKey } = ownProps.variable;\n if (!rootStateKey) {\n console.error('OptionPickerFactory: variable has no rootStateKey');\n return {\n picker: initialOptionPickerState,\n };\n }\n\n return {\n picker: getVariablesState(rootStateKey, state).optionsPicker,\n };\n };\n\n const connector = connect(mapStateToProps, mapDispatchToProps);\n\n interface OwnProps extends VariablePickerProps<Model> {}\n\n type Props = OwnProps & ConnectedProps<typeof connector>;\n\n class OptionsPickerUnconnected extends PureComponent<Props> {\n onShowOptions = () =>\n this.props.openOptions(toKeyedVariableIdentifier(this.props.variable), this.props.onVariableChange);\n onHideOptions = () => {\n if (!this.props.variable.rootStateKey) {\n console.error('Variable has no rootStateKey');\n return;\n }\n\n this.props.commitChangesToVariable(this.props.variable.rootStateKey, this.props.onVariableChange);\n };\n\n onToggleOption = (option: VariableOption, clearOthers: boolean) => {\n const toggleFunc =\n isMulti(this.props.variable) && this.props.variable.multi\n ? this.onToggleMultiValueVariable\n : this.onToggleSingleValueVariable;\n toggleFunc(option, clearOthers);\n };\n\n onToggleSingleValueVariable = (option: VariableOption, clearOthers: boolean) => {\n this.props.toggleOption(toKeyedVariableIdentifier(this.props.variable), option, clearOthers, false);\n this.onHideOptions();\n };\n\n onToggleMultiValueVariable = (option: VariableOption, clearOthers: boolean) => {\n this.props.toggleOption(toKeyedVariableIdentifier(this.props.variable), option, clearOthers, false);\n };\n\n onToggleAllOptions = () => {\n this.props.toggleAllOptions(toKeyedVariableIdentifier(this.props.variable));\n };\n\n onFilterOrSearchOptions = (filter: string) => {\n this.props.filterOrSearchOptions(toKeyedVariableIdentifier(this.props.variable), filter);\n };\n\n onNavigate = (key: NavigationKey, clearOthers: boolean) => {\n if (!this.props.variable.rootStateKey) {\n console.error('Variable has no rootStateKey');\n return;\n }\n\n this.props.navigateOptions(this.props.variable.rootStateKey, key, clearOthers);\n };\n\n render() {\n const { variable, picker } = this.props;\n const showOptions = picker.id === variable.id;\n\n return (\n <div className=\"variable-link-wrapper\">\n {showOptions ? this.renderOptions(picker) : this.renderLink(variable)}\n </div>\n );\n }\n\n renderLink(variable: VariableWithOptions) {\n const linkText = formatVariableLabel(variable);\n const loading = variable.state === LoadingState.Loading;\n\n return (\n <VariableLink\n id={`var-${variable.id}`}\n text={linkText}\n onClick={this.onShowOptions}\n loading={loading}\n onCancel={this.onCancel}\n disabled={this.props.readOnly}\n />\n );\n }\n\n onCancel = () => {\n getVariableQueryRunner().cancelRequest(toKeyedVariableIdentifier(this.props.variable));\n };\n\n renderOptions(picker: OptionsPickerState) {\n const { id } = this.props.variable;\n return (\n <ClickOutsideWrapper onClick={this.onHideOptions}>\n <VariableInput\n id={`var-${id}`}\n value={picker.queryValue}\n onChange={this.onFilterOrSearchOptions}\n onNavigate={this.onNavigate}\n aria-expanded={true}\n aria-controls={`options-${id}`}\n />\n <VariableOptions\n values={picker.options}\n onToggle={this.onToggleOption}\n onToggleAll={this.onToggleAllOptions}\n highlightIndex={picker.highlightIndex}\n multi={picker.multi}\n selectedValues={picker.selectedValues}\n id={`options-${id}`}\n />\n </ClickOutsideWrapper>\n );\n }\n }\n\n const OptionsPicker = connector(OptionsPickerUnconnected);\n OptionsPicker.displayName = 'OptionsPicker';\n\n return OptionsPicker;\n};\n","import React, { FormEvent, PureComponent } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { VerticalGroup } from '@grafana/ui';\n\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { VariableEditorProps } from '../editor/types';\nimport { ConstantVariableModel } from '../types';\n\nexport interface Props extends VariableEditorProps<ConstantVariableModel> {}\n\nexport class ConstantVariableEditor extends PureComponent<Props> {\n onChange = (event: FormEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'query',\n propValue: event.currentTarget.value,\n });\n };\n\n onBlur = (event: FormEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'query',\n propValue: event.currentTarget.value,\n updateOptions: true,\n });\n };\n\n render() {\n return (\n <VerticalGroup spacing=\"xs\">\n <VariableSectionHeader name=\"Constant options\" />\n <VariableTextField\n value={this.props.variable.query}\n name=\"Value\"\n placeholder=\"your metric prefix\"\n onChange={this.onChange}\n onBlur={this.onBlur}\n labelWidth={20}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.ConstantVariable.constantOptionsQueryInputV2}\n grow\n />\n </VerticalGroup>\n );\n }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { getInstanceState } from '../state/selectors';\nimport { initialVariablesState, VariablePayload, VariablesState } from '../state/types';\nimport { ConstantVariableModel, initialVariableModelState, VariableHide, VariableOption } from '../types';\n\nexport const initialConstantVariableModelState: ConstantVariableModel = {\n ...initialVariableModelState,\n type: 'constant',\n hide: VariableHide.hideVariable,\n query: '',\n current: {} as VariableOption,\n options: [],\n};\n\nexport const constantVariableSlice = createSlice({\n name: 'templating/constant',\n initialState: initialVariablesState,\n reducers: {\n createConstantOptionsFromQuery: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n const instanceState = getInstanceState<ConstantVariableModel>(state, action.payload.id);\n instanceState.options = [\n { text: instanceState.query.trim(), value: instanceState.query.trim(), selected: false },\n ];\n },\n },\n});\n\nexport const constantVariableReducer = constantVariableSlice.reducer;\n\nexport const { createConstantOptionsFromQuery } = constantVariableSlice.actions;\n","import { cloneDeep } from 'lodash';\n\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { optionPickerFactory } from '../pickers';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { ConstantVariableModel } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nimport { ConstantVariableEditor } from './ConstantVariableEditor';\nimport { updateConstantVariableOptions } from './actions';\nimport { constantVariableReducer, initialConstantVariableModelState } from './reducer';\n\nexport const createConstantVariableAdapter = (): VariableAdapter<ConstantVariableModel> => {\n return {\n id: 'constant',\n description: 'Define a hidden constant variable, useful for metric prefixes in dashboards you want to share.',\n name: 'Constant',\n initialState: initialConstantVariableModelState,\n reducer: constantVariableReducer,\n picker: optionPickerFactory<ConstantVariableModel>(),\n editor: ConstantVariableEditor,\n dependsOn: () => {\n return false;\n },\n setValue: async (variable, option, emitChanges = false) => {\n await dispatch(setOptionAsCurrent(toKeyedVariableIdentifier(variable), option, emitChanges));\n },\n setValueFromUrl: async (variable, urlValue) => {\n await dispatch(setOptionFromUrl(toKeyedVariableIdentifier(variable), urlValue));\n },\n updateOptions: async (variable) => {\n await dispatch(updateConstantVariableOptions(toKeyedVariableIdentifier(variable)));\n },\n getSaveModel: (variable) => {\n const { index, id, state, global, current, options, rootStateKey, ...rest } = cloneDeep(variable);\n return rest;\n },\n getValueForUrl: (variable) => {\n return variable.current.value;\n },\n beforeAdding: (model) => {\n const { current, options, query, ...rest } = cloneDeep(model);\n const option = { selected: true, text: query, value: query };\n\n return { ...rest, current: option, options: [option], query };\n },\n };\n};\n","import { ThunkResult } from 'app/types';\n\nimport { validateVariableSelectionState } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { toVariablePayload } from '../utils';\n\nimport { createConstantOptionsFromQuery } from './reducer';\n\nexport const updateConstantVariableOptions = (identifier: KeyedVariableIdentifier): ThunkResult<void> => {\n return async (dispatch) => {\n const { rootStateKey } = identifier;\n await dispatch(toKeyedAction(rootStateKey, createConstantOptionsFromQuery(toVariablePayload(identifier))));\n await dispatch(validateVariableSelectionState(identifier));\n };\n};\n","import React, { ChangeEvent, PropsWithChildren, ReactElement } from 'react';\n\nimport { InlineField, InlineSwitch } from '@grafana/ui';\nimport { useUniqueId } from 'app/plugins/datasource/influxdb/components/useUniqueId';\ninterface VariableSwitchFieldProps {\n value: boolean;\n name: string;\n onChange: (event: ChangeEvent<HTMLInputElement>) => void;\n tooltip?: string;\n ariaLabel?: string;\n}\n\nexport function VariableSwitchField({\n value,\n name,\n tooltip,\n onChange,\n ariaLabel,\n}: PropsWithChildren<VariableSwitchFieldProps>): ReactElement {\n const uniqueId = useUniqueId();\n return (\n <InlineField label={name} labelWidth={20} tooltip={tooltip}>\n <InlineSwitch\n id={`var-switch-${uniqueId}`}\n label={name}\n value={value}\n onChange={onChange}\n aria-label={ariaLabel}\n />\n </InlineField>\n );\n}\n","import React, { ChangeEvent, FormEvent, FunctionComponent, useCallback } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { InlineFieldRow, VerticalGroup } from '@grafana/ui';\n\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { VariableWithMultiSupport } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nimport { VariableSectionHeader } from './VariableSectionHeader';\nimport { VariableSwitchField } from './VariableSwitchField';\nimport { VariableTextField } from './VariableTextField';\nimport { VariableEditorProps } from './types';\n\nexport interface SelectionOptionsEditorProps<Model extends VariableWithMultiSupport = VariableWithMultiSupport>\n extends VariableEditorProps<Model> {\n onMultiChanged: (identifier: KeyedVariableIdentifier, value: boolean) => void;\n}\n\nexport const SelectionOptionsEditor: FunctionComponent<SelectionOptionsEditorProps> = ({\n onMultiChanged: onMultiChangedProps,\n onPropChange,\n variable,\n}) => {\n const onMultiChanged = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onMultiChangedProps(toKeyedVariableIdentifier(variable), event.target.checked);\n },\n [onMultiChangedProps, variable]\n );\n\n const onIncludeAllChanged = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n onPropChange({ propName: 'includeAll', propValue: event.target.checked });\n },\n [onPropChange]\n );\n\n const onAllValueChanged = useCallback(\n (event: FormEvent<HTMLInputElement>) => {\n onPropChange({ propName: 'allValue', propValue: event.currentTarget.value });\n },\n [onPropChange]\n );\n\n return (\n <VerticalGroup spacing=\"none\">\n <VariableSectionHeader name=\"Selection options\" />\n <InlineFieldRow>\n <VariableSwitchField\n value={variable.multi}\n name=\"Multi-value\"\n tooltip=\"Enables multiple values to be selected at the same time\"\n onChange={onMultiChanged}\n ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsMultiSwitch}\n />\n </InlineFieldRow>\n <InlineFieldRow>\n <VariableSwitchField\n value={variable.includeAll}\n name=\"Include All option\"\n tooltip=\"Enables an option to include all variables\"\n onChange={onIncludeAllChanged}\n ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsIncludeAllSwitch}\n />\n </InlineFieldRow>\n {variable.includeAll && (\n <InlineFieldRow>\n <VariableTextField\n value={variable.allValue ?? ''}\n onChange={onAllValueChanged}\n name=\"Custom all value\"\n placeholder=\"blank = auto\"\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsCustomAllInputV2}\n labelWidth={20}\n />\n </InlineFieldRow>\n )}\n </VerticalGroup>\n );\n};\nSelectionOptionsEditor.displayName = 'SelectionOptionsEditor';\n","import React, { FormEvent, PureComponent } from 'react';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { VerticalGroup } from '@grafana/ui';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\nimport { StoreState } from 'app/types';\n\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextAreaField } from '../editor/VariableTextAreaField';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { changeVariableMultiValue } from '../state/actions';\nimport { CustomVariableModel, VariableWithMultiSupport } from '../types';\n\ninterface OwnProps extends VariableEditorProps<CustomVariableModel> {}\n\ninterface ConnectedProps {}\n\ninterface DispatchProps {\n changeVariableMultiValue: typeof changeVariableMultiValue;\n}\n\nexport type Props = OwnProps & ConnectedProps & DispatchProps;\n\nclass CustomVariableEditorUnconnected extends PureComponent<Props> {\n onChange = (event: FormEvent<HTMLTextAreaElement>) => {\n this.props.onPropChange({\n propName: 'query',\n propValue: event.currentTarget.value,\n });\n };\n\n onSelectionOptionsChange = async ({ propName, propValue }: OnPropChangeArguments<VariableWithMultiSupport>) => {\n this.props.onPropChange({ propName, propValue, updateOptions: true });\n };\n\n onBlur = (event: FormEvent<HTMLTextAreaElement>) => {\n this.props.onPropChange({\n propName: 'query',\n propValue: event.currentTarget.value,\n updateOptions: true,\n });\n };\n\n render() {\n return (\n <VerticalGroup spacing=\"xs\">\n <VariableSectionHeader name=\"Custom options\" />\n <VerticalGroup spacing=\"md\">\n <VerticalGroup spacing=\"none\">\n <VariableTextAreaField\n name=\"Values separated by comma\"\n value={this.props.variable.query}\n placeholder=\"1, 10, mykey : myvalue, myvalue, escaped\\,value\"\n onChange={this.onChange}\n onBlur={this.onBlur}\n required\n width={50}\n labelWidth={27}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.CustomVariable.customValueInput}\n />\n </VerticalGroup>\n <SelectionOptionsEditor\n variable={this.props.variable}\n onPropChange={this.onSelectionOptionsChange}\n onMultiChanged={this.props.changeVariableMultiValue}\n />{' '}\n </VerticalGroup>\n </VerticalGroup>\n );\n }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => ({});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n changeVariableMultiValue,\n};\n\nexport const CustomVariableEditor = connectWithStore(\n CustomVariableEditorUnconnected,\n mapStateToProps,\n mapDispatchToProps\n);\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\nimport { getInstanceState } from '../state/selectors';\nimport { initialVariablesState, VariablePayload, VariablesState } from '../state/types';\nimport { CustomVariableModel, initialVariableModelState, VariableOption } from '../types';\n\nexport const initialCustomVariableModelState: CustomVariableModel = {\n ...initialVariableModelState,\n type: 'custom',\n multi: false,\n includeAll: false,\n allValue: null,\n query: '',\n options: [],\n current: {} as VariableOption,\n};\n\nexport const customVariableSlice = createSlice({\n name: 'templating/custom',\n initialState: initialVariablesState,\n reducers: {\n createCustomOptionsFromQuery: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n const instanceState = getInstanceState<CustomVariableModel>(state, action.payload.id);\n const { includeAll, query } = instanceState;\n\n const match = query.match(/(?:\\\\,|[^,])+/g) ?? [];\n const options = match.map((text) => {\n text = text.replace(/\\\\,/g, ',');\n const textMatch = /^(.+)\\s:\\s(.+)$/g.exec(text) ?? [];\n if (textMatch.length === 3) {\n const [, key, value] = textMatch;\n return { text: key.trim(), value: value.trim(), selected: false };\n } else {\n return { text: text.trim(), value: text.trim(), selected: false };\n }\n });\n\n if (includeAll) {\n options.unshift({ text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false });\n }\n\n instanceState.options = options;\n },\n },\n});\n\nexport const customVariableReducer = customVariableSlice.reducer;\n\nexport const { createCustomOptionsFromQuery } = customVariableSlice.actions;\n","import { cloneDeep } from 'lodash';\n\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { ALL_VARIABLE_TEXT } from '../constants';\nimport { optionPickerFactory } from '../pickers';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { CustomVariableModel } from '../types';\nimport { isAllVariable, toKeyedVariableIdentifier } from '../utils';\n\nimport { CustomVariableEditor } from './CustomVariableEditor';\nimport { updateCustomVariableOptions } from './actions';\nimport { customVariableReducer, initialCustomVariableModelState } from './reducer';\n\nexport const createCustomVariableAdapter = (): VariableAdapter<CustomVariableModel> => {\n return {\n id: 'custom',\n description: 'Define variable values manually',\n name: 'Custom',\n initialState: initialCustomVariableModelState,\n reducer: customVariableReducer,\n picker: optionPickerFactory<CustomVariableModel>(),\n editor: CustomVariableEditor,\n dependsOn: () => {\n return false;\n },\n setValue: async (variable, option, emitChanges = false) => {\n await dispatch(setOptionAsCurrent(toKeyedVariableIdentifier(variable), option, emitChanges));\n },\n setValueFromUrl: async (variable, urlValue) => {\n await dispatch(setOptionFromUrl(toKeyedVariableIdentifier(variable), urlValue));\n },\n updateOptions: async (variable) => {\n await dispatch(updateCustomVariableOptions(toKeyedVariableIdentifier(variable)));\n },\n getSaveModel: (variable) => {\n const { index, id, state, global, rootStateKey, ...rest } = cloneDeep(variable);\n return rest;\n },\n getValueForUrl: (variable) => {\n if (isAllVariable(variable)) {\n return ALL_VARIABLE_TEXT;\n }\n return variable.current.value;\n },\n };\n};\n","import { ThunkResult } from 'app/types';\n\nimport { validateVariableSelectionState } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { toVariablePayload } from '../utils';\n\nimport { createCustomOptionsFromQuery } from './reducer';\n\nexport const updateCustomVariableOptions = (identifier: KeyedVariableIdentifier): ThunkResult<void> => {\n return async (dispatch) => {\n const { rootStateKey } = identifier;\n await dispatch(toKeyedAction(rootStateKey, createCustomOptionsFromQuery(toVariablePayload(identifier))));\n await dispatch(validateVariableSelectionState(identifier));\n };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { DataSourceInstanceSettings } from '@grafana/data';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\nimport { getInstanceState } from '../state/selectors';\nimport { initialVariablesState, VariablePayload, VariablesState } from '../state/types';\nimport { DataSourceVariableModel, initialVariableModelState, VariableOption, VariableRefresh } from '../types';\n\nexport const initialDataSourceVariableModelState: DataSourceVariableModel = {\n ...initialVariableModelState,\n type: 'datasource',\n current: {} as VariableOption,\n regex: '',\n options: [],\n query: '',\n multi: false,\n includeAll: false,\n refresh: VariableRefresh.onDashboardLoad,\n};\n\nexport const dataSourceVariableSlice = createSlice({\n name: 'templating/datasource',\n initialState: initialVariablesState,\n reducers: {\n createDataSourceOptions: (\n state: VariablesState,\n action: PayloadAction<VariablePayload<{ sources: DataSourceInstanceSettings[]; regex: RegExp | undefined }>>\n ) => {\n const { sources, regex } = action.payload.data;\n const options: VariableOption[] = [];\n const instanceState = getInstanceState<DataSourceVariableModel>(state, action.payload.id);\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i];\n // must match on type\n if (source.meta.id !== instanceState.query) {\n continue;\n }\n\n if (isValid(source, regex)) {\n options.push({ text: source.name, value: source.name, selected: false });\n }\n\n if (isDefault(source, regex)) {\n options.push({ text: 'default', value: 'default', selected: false });\n }\n }\n\n if (options.length === 0) {\n options.push({ text: 'No data sources found', value: '', selected: false });\n }\n\n if (instanceState.includeAll) {\n options.unshift({ text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false });\n }\n\n instanceState.options = options;\n },\n },\n});\n\nfunction isValid(source: DataSourceInstanceSettings, regex?: RegExp) {\n if (!regex) {\n return true;\n }\n\n return regex.exec(source.name);\n}\n\nfunction isDefault(source: DataSourceInstanceSettings, regex?: RegExp) {\n if (!source.isDefault) {\n return false;\n }\n\n if (!regex) {\n return true;\n }\n\n return regex.exec('default');\n}\n\nexport const dataSourceVariableReducer = dataSourceVariableSlice.reducer;\nexport const { createDataSourceOptions } = dataSourceVariableSlice.actions;\n","import React, { FormEvent, PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { InlineFieldRow, VerticalGroup } from '@grafana/ui';\n\nimport { StoreState } from '../../../types';\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { initialVariableEditorState } from '../editor/reducer';\nimport { getDatasourceVariableEditorState } from '../editor/selectors';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { changeVariableMultiValue } from '../state/actions';\nimport { getVariablesState } from '../state/selectors';\nimport { DataSourceVariableModel, VariableWithMultiSupport } from '../types';\n\nimport { initDataSourceVariableEditor } from './actions';\n\nconst mapStateToProps = (state: StoreState, ownProps: OwnProps) => {\n const {\n variable: { rootStateKey },\n } = ownProps;\n if (!rootStateKey) {\n console.error('DataSourceVariableEditor: variable has no rootStateKey');\n return {\n extended: getDatasourceVariableEditorState(initialVariableEditorState),\n };\n }\n\n const { editor } = getVariablesState(rootStateKey, state);\n return {\n extended: getDatasourceVariableEditorState(editor),\n };\n};\n\nconst mapDispatchToProps = {\n initDataSourceVariableEditor,\n changeVariableMultiValue,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport interface OwnProps extends VariableEditorProps<DataSourceVariableModel> {}\n\ntype Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport class DataSourceVariableEditorUnConnected extends PureComponent<Props> {\n componentDidMount() {\n const { rootStateKey } = this.props.variable;\n if (!rootStateKey) {\n console.error('DataSourceVariableEditor: variable has no rootStateKey');\n return;\n }\n\n this.props.initDataSourceVariableEditor(rootStateKey);\n }\n\n onRegExChange = (event: FormEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'regex',\n propValue: event.currentTarget.value,\n });\n };\n\n onRegExBlur = (event: FormEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'regex',\n propValue: event.currentTarget.value,\n updateOptions: true,\n });\n };\n\n onSelectionOptionsChange = async ({ propValue, propName }: OnPropChangeArguments<VariableWithMultiSupport>) => {\n this.props.onPropChange({ propName, propValue, updateOptions: true });\n };\n\n getSelectedDataSourceTypeValue = (): string => {\n const { extended } = this.props;\n\n if (!extended?.dataSourceTypes.length) {\n return '';\n }\n\n const foundItem = extended.dataSourceTypes.find((ds) => ds.value === this.props.variable.query);\n const value = foundItem ? foundItem.value : extended.dataSourceTypes[0].value;\n return value ?? '';\n };\n\n onDataSourceTypeChanged = (option: SelectableValue<string>) => {\n this.props.onPropChange({ propName: 'query', propValue: option.value, updateOptions: true });\n };\n\n render() {\n const { variable, extended, changeVariableMultiValue } = this.props;\n\n const typeOptions = extended?.dataSourceTypes?.length\n ? extended.dataSourceTypes?.map((ds) => ({ value: ds.value ?? '', label: ds.text }))\n : [];\n\n const typeValue = typeOptions.find((o) => o.value === variable.query) ?? typeOptions[0];\n\n return (\n <VerticalGroup spacing=\"xs\">\n <VariableSectionHeader name=\"Data source options\" />\n <VerticalGroup spacing=\"md\">\n <VerticalGroup spacing=\"xs\">\n <InlineFieldRow>\n <VariableSelectField\n name=\"Type\"\n value={typeValue}\n options={typeOptions}\n onChange={this.onDataSourceTypeChanged}\n labelWidth={10}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.DatasourceVariable.datasourceSelect}\n />\n </InlineFieldRow>\n <InlineFieldRow>\n <VariableTextField\n value={this.props.variable.regex}\n name=\"Instance name filter\"\n placeholder=\"/.*-(.*)-.*/\"\n onChange={this.onRegExChange}\n onBlur={this.onRegExBlur}\n labelWidth={20}\n tooltip={\n <div>\n Regex filter for which data source instances to choose from in the variable value list. Leave empty\n for all.\n <br />\n <br />\n Example: <code>/^prod/</code>\n </div>\n }\n />\n </InlineFieldRow>\n </VerticalGroup>\n\n <SelectionOptionsEditor\n variable={variable}\n onPropChange={this.onSelectionOptionsChange}\n onMultiChanged={changeVariableMultiValue}\n />\n </VerticalGroup>\n </VerticalGroup>\n );\n }\n}\n\nexport const DataSourceVariableEditor = connector(DataSourceVariableEditorUnConnected);\n","import { chain } from 'lodash';\n\nimport { stringToJsRegex } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\n\nimport { ThunkResult } from '../../../types';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport { changeVariableEditorExtended } from '../editor/reducer';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getVariable } from '../state/selectors';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { DataSourceVariableModel } from '../types';\nimport { toVariablePayload } from '../utils';\n\nimport { createDataSourceOptions } from './reducer';\n\nexport interface DataSourceVariableActionDependencies {\n getDatasourceSrv: typeof getDatasourceSrv;\n}\n\nexport const updateDataSourceVariableOptions =\n (\n identifier: KeyedVariableIdentifier,\n dependencies: DataSourceVariableActionDependencies = { getDatasourceSrv: getDatasourceSrv }\n ): ThunkResult<void> =>\n async (dispatch, getState) => {\n const { rootStateKey } = identifier;\n const sources = dependencies.getDatasourceSrv().getList({ metrics: true, variables: false });\n const variableInState = getVariable<DataSourceVariableModel>(identifier, getState());\n let regex;\n\n if (variableInState.regex) {\n regex = getTemplateSrv().replace(variableInState.regex, undefined, 'regex');\n regex = stringToJsRegex(regex);\n }\n\n dispatch(toKeyedAction(rootStateKey, createDataSourceOptions(toVariablePayload(identifier, { sources, regex }))));\n await dispatch(validateVariableSelectionState(identifier));\n };\n\nexport const initDataSourceVariableEditor =\n (\n key: string,\n dependencies: DataSourceVariableActionDependencies = { getDatasourceSrv: getDatasourceSrv }\n ): ThunkResult<void> =>\n (dispatch) => {\n const dataSources = dependencies.getDatasourceSrv().getList({ metrics: true, variables: true });\n const dataSourceTypes = chain(dataSources)\n .uniqBy('meta.id')\n .map((ds: any) => {\n return { text: ds.meta.name, value: ds.meta.id };\n })\n .value();\n\n dataSourceTypes.unshift({ text: '', value: '' });\n\n dispatch(toKeyedAction(key, changeVariableEditorExtended({ dataSourceTypes })));\n };\n","import { cloneDeep } from 'lodash';\n\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { ALL_VARIABLE_TEXT } from '../constants';\nimport { optionPickerFactory } from '../pickers';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { DataSourceVariableModel } from '../types';\nimport { containsVariable, isAllVariable, toKeyedVariableIdentifier } from '../utils';\n\nimport { DataSourceVariableEditor } from './DataSourceVariableEditor';\nimport { updateDataSourceVariableOptions } from './actions';\nimport { dataSourceVariableReducer, initialDataSourceVariableModelState } from './reducer';\n\nexport const createDataSourceVariableAdapter = (): VariableAdapter<DataSourceVariableModel> => {\n return {\n id: 'datasource',\n description: 'Enabled you to dynamically switch the data source for multiple panels.',\n name: 'Data source',\n initialState: initialDataSourceVariableModelState,\n reducer: dataSourceVariableReducer,\n picker: optionPickerFactory<DataSourceVariableModel>(),\n editor: DataSourceVariableEditor,\n dependsOn: (variable, variableToTest) => {\n if (variable.regex) {\n return containsVariable(variable.regex, variableToTest.name);\n }\n return false;\n },\n setValue: async (variable, option, emitChanges = false) => {\n await dispatch(setOptionAsCurrent(toKeyedVariableIdentifier(variable), option, emitChanges));\n },\n setValueFromUrl: async (variable, urlValue) => {\n await dispatch(setOptionFromUrl(toKeyedVariableIdentifier(variable), urlValue));\n },\n updateOptions: async (variable) => {\n await dispatch(updateDataSourceVariableOptions(toKeyedVariableIdentifier(variable)));\n },\n getSaveModel: (variable) => {\n const { index, id, state, global, rootStateKey, ...rest } = cloneDeep(variable);\n return { ...rest, options: [] };\n },\n getValueForUrl: (variable) => {\n if (isAllVariable(variable)) {\n return ALL_VARIABLE_TEXT;\n }\n return variable.current.value;\n },\n };\n};\n","import React, { ChangeEvent, FormEvent, PureComponent } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { InlineFieldRow, VerticalGroup } from '@grafana/ui';\n\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { VariableSwitchField } from '../editor/VariableSwitchField';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { VariableEditorProps } from '../editor/types';\nimport { IntervalVariableModel } from '../types';\n\nexport interface Props extends VariableEditorProps<IntervalVariableModel> {}\n\nexport class IntervalVariableEditor extends PureComponent<Props> {\n onAutoChange = (event: ChangeEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'auto',\n propValue: event.target.checked,\n updateOptions: true,\n });\n };\n\n onQueryChanged = (event: FormEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'query',\n propValue: event.currentTarget.value,\n });\n };\n\n onQueryBlur = (event: FormEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'query',\n propValue: event.currentTarget.value,\n updateOptions: true,\n });\n };\n\n onAutoCountChanged = (option: SelectableValue<number>) => {\n this.props.onPropChange({\n propName: 'auto_count',\n propValue: option.value,\n updateOptions: true,\n });\n };\n\n onAutoMinChanged = (event: FormEvent<HTMLInputElement>) => {\n this.props.onPropChange({\n propName: 'auto_min',\n propValue: event.currentTarget.value,\n updateOptions: true,\n });\n };\n\n render() {\n const { variable } = this.props;\n const stepOptions = [1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 100, 200, 300, 400, 500].map((count) => ({\n label: `${count}`,\n value: count,\n }));\n const stepValue = stepOptions.find((o) => o.value === variable.auto_count) ?? stepOptions[0];\n\n return (\n <VerticalGroup spacing=\"xs\">\n <VariableSectionHeader name=\"Interval options\" />\n <VerticalGroup spacing=\"none\">\n <VariableTextField\n value={this.props.variable.query}\n name=\"Values\"\n placeholder=\"1m,10m,1h,6h,1d,7d\"\n onChange={this.onQueryChanged}\n onBlur={this.onQueryBlur}\n labelWidth={20}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.IntervalVariable.intervalsValueInput}\n grow\n required\n />\n <InlineFieldRow>\n <VariableSwitchField\n value={this.props.variable.auto}\n name=\"Auto option\"\n tooltip=\"Dynamically calculates interval by dividing time range by the count specified.\"\n onChange={this.onAutoChange}\n />\n {this.props.variable.auto ? (\n <>\n <VariableSelectField\n name=\"Step count\"\n value={stepValue}\n options={stepOptions}\n onChange={this.onAutoCountChanged}\n tooltip=\"How many times the current time range should be divided to calculate the value.\"\n labelWidth={7}\n width={9}\n />\n <VariableTextField\n value={this.props.variable.auto_min}\n name=\"Min interval\"\n placeholder=\"10s\"\n onChange={this.onAutoMinChanged}\n tooltip=\"The calculated value will not go below this threshold.\"\n labelWidth={13}\n width={11}\n />\n </>\n ) : null}\n </InlineFieldRow>\n </VerticalGroup>\n </VerticalGroup>\n );\n }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { map } from 'lodash';\n\nimport { getInstanceState } from '../state/selectors';\nimport { initialVariablesState, VariablePayload, VariablesState } from '../state/types';\nimport { initialVariableModelState, IntervalVariableModel, VariableOption, VariableRefresh } from '../types';\n\nexport const initialIntervalVariableModelState: IntervalVariableModel = {\n ...initialVariableModelState,\n type: 'interval',\n auto_count: 30,\n auto_min: '10s',\n options: [],\n auto: false,\n query: '1m,10m,30m,1h,6h,12h,1d,7d,14d,30d',\n refresh: VariableRefresh.onTimeRangeChanged,\n current: {} as VariableOption,\n};\n\nexport const intervalVariableSlice = createSlice({\n name: 'templating/interval',\n initialState: initialVariablesState,\n reducers: {\n createIntervalOptions: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n const instanceState = getInstanceState<IntervalVariableModel>(state, action.payload.id);\n const options: VariableOption[] = map(instanceState.query.match(/([\"'])(.*?)\\1|\\w+/g), (text) => {\n text = text.replace(/[\"']+/g, '');\n return { text: text.trim(), value: text.trim(), selected: false };\n });\n\n if (instanceState.auto) {\n // add auto option if missing\n if (options.length && options[0].text !== 'auto') {\n options.unshift({\n text: 'auto',\n value: '$__auto_interval_' + instanceState.name,\n selected: false,\n });\n }\n }\n\n instanceState.options = options;\n },\n },\n});\n\nexport const intervalVariableReducer = intervalVariableSlice.reducer;\n\nexport const { createIntervalOptions } = intervalVariableSlice.actions;\n","import { rangeUtil } from '@grafana/data';\n\nimport { ThunkResult } from '../../../types';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { getTemplateSrv, TemplateSrv } from '../../templating/template_srv';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getVariable } from '../state/selectors';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { IntervalVariableModel } from '../types';\nimport { toVariablePayload } from '../utils';\n\nimport { createIntervalOptions } from './reducer';\n\nexport const updateIntervalVariableOptions =\n (identifier: KeyedVariableIdentifier): ThunkResult<void> =>\n async (dispatch) => {\n const { rootStateKey } = identifier;\n await dispatch(toKeyedAction(rootStateKey, createIntervalOptions(toVariablePayload(identifier))));\n await dispatch(updateAutoValue(identifier));\n await dispatch(validateVariableSelectionState(identifier));\n };\n\nexport interface UpdateAutoValueDependencies {\n calculateInterval: typeof rangeUtil.calculateInterval;\n getTimeSrv: typeof getTimeSrv;\n templateSrv: TemplateSrv;\n}\n\nexport const updateAutoValue =\n (\n identifier: KeyedVariableIdentifier,\n dependencies: UpdateAutoValueDependencies = {\n calculateInterval: rangeUtil.calculateInterval,\n getTimeSrv: getTimeSrv,\n templateSrv: getTemplateSrv(),\n }\n ): ThunkResult<void> =>\n (dispatch, getState) => {\n const variableInState = getVariable<IntervalVariableModel>(identifier, getState());\n if (variableInState.auto) {\n const res = dependencies.calculateInterval(\n dependencies.getTimeSrv().timeRange(),\n variableInState.auto_count,\n variableInState.auto_min\n );\n dependencies.templateSrv.setGrafanaVariable('$__auto_interval_' + variableInState.name, res.interval);\n // for backward compatibility, to be removed eventually\n dependencies.templateSrv.setGrafanaVariable('$__auto_interval', res.interval);\n }\n };\n","import { cloneDeep } from 'lodash';\n\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { optionPickerFactory } from '../pickers';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { IntervalVariableModel } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nimport { IntervalVariableEditor } from './IntervalVariableEditor';\nimport { updateAutoValue, updateIntervalVariableOptions } from './actions';\nimport { initialIntervalVariableModelState, intervalVariableReducer } from './reducer';\n\nexport const createIntervalVariableAdapter = (): VariableAdapter<IntervalVariableModel> => {\n return {\n id: 'interval',\n description: 'Define a timespan interval (ex 1m, 1h, 1d)',\n name: 'Interval',\n initialState: initialIntervalVariableModelState,\n reducer: intervalVariableReducer,\n picker: optionPickerFactory<IntervalVariableModel>(),\n editor: IntervalVariableEditor,\n dependsOn: () => {\n return false;\n },\n setValue: async (variable, option, emitChanges = false) => {\n await dispatch(updateAutoValue(toKeyedVariableIdentifier(variable)));\n await dispatch(setOptionAsCurrent(toKeyedVariableIdentifier(variable), option, emitChanges));\n },\n setValueFromUrl: async (variable, urlValue) => {\n await dispatch(updateAutoValue(toKeyedVariableIdentifier(variable)));\n await dispatch(setOptionFromUrl(toKeyedVariableIdentifier(variable), urlValue));\n },\n updateOptions: async (variable) => {\n await dispatch(updateIntervalVariableOptions(toKeyedVariableIdentifier(variable)));\n },\n getSaveModel: (variable) => {\n const { index, id, state, global, rootStateKey, ...rest } = cloneDeep(variable);\n return rest;\n },\n getValueForUrl: (variable) => {\n return variable.current.value;\n },\n };\n};\n","import React, { PropsWithChildren, useMemo } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { VariableRefresh } from '../types';\n\ninterface Props {\n onChange: (option: SelectableValue<VariableRefresh>) => void;\n refresh: VariableRefresh;\n}\n\nconst REFRESH_OPTIONS = [\n { label: 'On dashboard load', value: VariableRefresh.onDashboardLoad },\n { label: 'On time range change', value: VariableRefresh.onTimeRangeChanged },\n];\n\nexport function QueryVariableRefreshSelect({ onChange, refresh }: PropsWithChildren<Props>) {\n const value = useMemo(() => REFRESH_OPTIONS.find((o) => o.value === refresh) ?? REFRESH_OPTIONS[0], [refresh]);\n\n return (\n <VariableSelectField\n name=\"Refresh\"\n value={value}\n options={REFRESH_OPTIONS}\n onChange={onChange}\n labelWidth={10}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRefreshSelectV2}\n tooltip=\"When to update the values of this variable.\"\n />\n );\n}\n","import React, { PropsWithChildren, useMemo } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { VariableSort } from '../types';\n\ninterface Props {\n onChange: (option: SelectableValue<VariableSort>) => void;\n sort: VariableSort;\n}\n\nconst SORT_OPTIONS = [\n { label: 'Disabled', value: VariableSort.disabled },\n { label: 'Alphabetical (asc)', value: VariableSort.alphabeticalAsc },\n { label: 'Alphabetical (desc)', value: VariableSort.alphabeticalDesc },\n { label: 'Numerical (asc)', value: VariableSort.numericalAsc },\n { label: 'Numerical (desc)', value: VariableSort.numericalDesc },\n { label: 'Alphabetical (case-insensitive, asc)', value: VariableSort.alphabeticalCaseInsensitiveAsc },\n { label: 'Alphabetical (case-insensitive, desc)', value: VariableSort.alphabeticalCaseInsensitiveDesc },\n];\n\nexport function QueryVariableSortSelect({ onChange, sort }: PropsWithChildren<Props>) {\n const value = useMemo(() => SORT_OPTIONS.find((o) => o.value === sort) ?? SORT_OPTIONS[0], [sort]);\n\n return (\n <VariableSelectField\n name=\"Sort\"\n value={value}\n options={SORT_OPTIONS}\n onChange={onChange}\n labelWidth={10}\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsSortSelectV2}\n tooltip=\"How to sort the values of this variable.\"\n />\n );\n}\n","import React, { useCallback } from 'react';\n\nimport { DataQuery, DataSourceApi, DataSourceJsonData, QueryEditorProps, StandardVariableQuery } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\n\nimport { importDataSourcePlugin } from '../../plugins/plugin_loader';\nimport {\n hasCustomVariableSupport,\n hasDatasourceVariableSupport,\n hasLegacyVariableSupport,\n hasStandardVariableSupport,\n} from '../guard';\nimport { VariableQueryEditorType } from '../types';\n\nimport { LegacyVariableQueryEditor } from './LegacyVariableQueryEditor';\n\nexport async function getVariableQueryEditor<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData,\n VariableQuery extends DataQuery = TQuery\n>(\n datasource: DataSourceApi<TQuery, TOptions>,\n importDataSourcePluginFunc = importDataSourcePlugin\n): Promise<VariableQueryEditorType> {\n if (hasCustomVariableSupport(datasource)) {\n return datasource.variables.editor;\n }\n\n if (hasDatasourceVariableSupport(datasource)) {\n const dsPlugin = await importDataSourcePluginFunc(datasource.meta!);\n\n if (!dsPlugin.components.QueryEditor) {\n throw new Error('Missing QueryEditor in plugin definition.');\n }\n\n return dsPlugin.components.QueryEditor ?? null;\n }\n\n if (hasStandardVariableSupport(datasource)) {\n return StandardVariableQueryEditor;\n }\n\n if (hasLegacyVariableSupport(datasource)) {\n const dsPlugin = await importDataSourcePluginFunc(datasource.meta!);\n return dsPlugin.components.VariableQueryEditor ?? LegacyVariableQueryEditor;\n }\n\n return null;\n}\n\nexport function StandardVariableQueryEditor<\n TQuery extends DataQuery = DataQuery,\n TOptions extends DataSourceJsonData = DataSourceJsonData\n>({\n datasource: propsDatasource,\n query: propsQuery,\n onChange: propsOnChange,\n}: QueryEditorProps<any, TQuery, TOptions, StandardVariableQuery>) {\n const onChange = useCallback(\n (query: any) => {\n propsOnChange({ refId: 'StandardVariableQuery', query });\n },\n [propsOnChange]\n );\n\n return (\n <LegacyVariableQueryEditor\n query={propsQuery.query}\n onChange={onChange}\n datasource={propsDatasource}\n templateSrv={getTemplateSrv()}\n />\n );\n}\n","import { Subscription } from 'rxjs';\n\nimport { DataSourceRef } from '@grafana/data';\nimport { getDataSourceSrv, toDataQueryError } from '@grafana/runtime';\n\nimport { ThunkResult } from '../../../types';\nimport { getVariableQueryEditor } from '../editor/getVariableQueryEditor';\nimport { addVariableEditorError, changeVariableEditorExtended, removeVariableEditorError } from '../editor/reducer';\nimport { getQueryVariableEditorState } from '../editor/selectors';\nimport { updateOptions } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getVariable, getVariablesState } from '../state/selectors';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { QueryVariableModel } from '../types';\nimport { hasOngoingTransaction, toKeyedVariableIdentifier, toVariablePayload } from '../utils';\n\nimport { getVariableQueryRunner } from './VariableQueryRunner';\nimport { variableQueryObserver } from './variableQueryObserver';\n\nexport const updateQueryVariableOptions = (\n identifier: KeyedVariableIdentifier,\n searchFilter?: string\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n try {\n const { rootStateKey } = identifier;\n if (!hasOngoingTransaction(rootStateKey, getState())) {\n // we might have cancelled a batch so then variable state is removed\n return;\n }\n\n const variableInState = getVariable<QueryVariableModel>(identifier, getState());\n if (getVariablesState(rootStateKey, getState()).editor.id === variableInState.id) {\n dispatch(toKeyedAction(rootStateKey, removeVariableEditorError({ errorProp: 'update' })));\n }\n const datasource = await getDataSourceSrv().get(variableInState.datasource ?? '');\n\n // We need to await the result from variableQueryRunner before moving on otherwise variables dependent on this\n // variable will have the wrong current value as input\n await new Promise((resolve, reject) => {\n const subscription: Subscription = new Subscription();\n const observer = variableQueryObserver(resolve, reject, subscription);\n const responseSubscription = getVariableQueryRunner().getResponse(identifier).subscribe(observer);\n subscription.add(responseSubscription);\n\n getVariableQueryRunner().queueRequest({ identifier, datasource, searchFilter });\n });\n } catch (err) {\n if (err instanceof Error) {\n const error = toDataQueryError(err);\n const { rootStateKey } = identifier;\n if (getVariablesState(rootStateKey, getState()).editor.id === identifier.id) {\n dispatch(\n toKeyedAction(rootStateKey, addVariableEditorError({ errorProp: 'update', errorText: error.message }))\n );\n }\n\n throw error;\n }\n }\n };\n};\n\nexport const initQueryVariableEditor =\n (identifier: KeyedVariableIdentifier): ThunkResult<void> =>\n async (dispatch, getState) => {\n const variable = getVariable<QueryVariableModel>(identifier, getState());\n await dispatch(changeQueryVariableDataSource(toKeyedVariableIdentifier(variable), variable.datasource));\n };\n\nexport const changeQueryVariableDataSource = (\n identifier: KeyedVariableIdentifier,\n name: DataSourceRef | null\n): ThunkResult<void> => {\n return async (dispatch, getState) => {\n try {\n const { rootStateKey } = identifier;\n const { editor } = getVariablesState(rootStateKey, getState());\n const extendedEditorState = getQueryVariableEditorState(editor);\n const previousDatasource = extendedEditorState?.dataSource;\n const dataSource = await getDataSourceSrv().get(name ?? '');\n\n if (previousDatasource && previousDatasource.type !== dataSource?.type) {\n dispatch(\n toKeyedAction(\n rootStateKey,\n changeVariableProp(toVariablePayload(identifier, { propName: 'query', propValue: '' }))\n )\n );\n }\n\n const VariableQueryEditor = await getVariableQueryEditor(dataSource);\n\n dispatch(\n toKeyedAction(\n rootStateKey,\n changeVariableEditorExtended({\n dataSource,\n VariableQueryEditor,\n })\n )\n );\n } catch (err) {\n console.error(err);\n }\n };\n};\n\nexport const changeQueryVariableQuery =\n (identifier: KeyedVariableIdentifier, query: any, definition?: string): ThunkResult<void> =>\n async (dispatch, getState) => {\n const { rootStateKey } = identifier;\n const variableInState = getVariable<QueryVariableModel>(identifier, getState());\n if (hasSelfReferencingQuery(variableInState.name, query)) {\n const errorText = 'Query cannot contain a reference to itself. Variable: $' + variableInState.name;\n dispatch(toKeyedAction(rootStateKey, addVariableEditorError({ errorProp: 'query', errorText })));\n return;\n }\n\n dispatch(toKeyedAction(rootStateKey, removeVariableEditorError({ errorProp: 'query' })));\n dispatch(\n toKeyedAction(\n rootStateKey,\n changeVariableProp(toVariablePayload(identifier, { propName: 'query', propValue: query }))\n )\n );\n\n if (definition) {\n dispatch(\n toKeyedAction(\n rootStateKey,\n changeVariableProp(toVariablePayload(identifier, { propName: 'definition', propValue: definition }))\n )\n );\n } else if (typeof query === 'string') {\n dispatch(\n toKeyedAction(\n rootStateKey,\n changeVariableProp(toVariablePayload(identifier, { propName: 'definition', propValue: query }))\n )\n );\n }\n\n await dispatch(updateOptions(identifier));\n };\n\nexport function hasSelfReferencingQuery(name: string, query: any): boolean {\n if (typeof query === 'string' && query.match(new RegExp('\\\\$' + name + '(/| |$)'))) {\n return true;\n }\n\n const flattened = flattenQuery(query);\n\n for (let prop in flattened) {\n if (flattened.hasOwnProperty(prop)) {\n const value = flattened[prop];\n if (typeof value === 'string' && value.match(new RegExp('\\\\$' + name + '(/| |$)'))) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/*\n * Function that takes any object and flattens all props into one level deep object\n * */\nexport function flattenQuery(query: any): any {\n if (typeof query !== 'object') {\n return { query };\n }\n\n const keys = Object.keys(query);\n const flattened = keys.reduce((all, key) => {\n const value = query[key];\n if (typeof value !== 'object') {\n all[key] = value;\n return all;\n }\n\n const result = flattenQuery(value);\n for (let childProp in result) {\n if (result.hasOwnProperty(childProp)) {\n all[`${key}_${childProp}`] = result[childProp];\n }\n }\n\n return all;\n }, {} as Record<string, any>);\n\n return flattened;\n}\n","import { Observer, Subscription } from 'rxjs';\n\nimport { LoadingState } from '@grafana/data';\n\nimport { UpdateOptionsResults } from './VariableQueryRunner';\n\nexport function variableQueryObserver(\n resolve: (value?: any) => void,\n reject: (value?: any) => void,\n subscription: Subscription\n): Observer<UpdateOptionsResults> {\n const observer: Observer<UpdateOptionsResults> = {\n next: (results) => {\n if (results.state === LoadingState.Error) {\n subscription.unsubscribe();\n reject(results.error);\n return;\n }\n\n if (results.state === LoadingState.Done) {\n subscription.unsubscribe();\n resolve();\n return;\n }\n },\n error: (err) => {\n subscription.unsubscribe();\n reject(err);\n },\n complete: () => {\n subscription.unsubscribe();\n resolve();\n },\n };\n\n return observer;\n}\n","import { css } from '@emotion/css';\nimport React, { FormEvent, PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { DataSourceInstanceSettings, getDataSourceRef, LoadingState, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { DataSourcePicker, getTemplateSrv } from '@grafana/runtime';\nimport { InlineField, InlineFieldRow, VerticalGroup } from '@grafana/ui';\n\nimport { StoreState } from '../../../types';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { initialVariableEditorState } from '../editor/reducer';\nimport { getQueryVariableEditorState } from '../editor/selectors';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { isLegacyQueryEditor, isQueryEditor } from '../guard';\nimport { changeVariableMultiValue } from '../state/actions';\nimport { getVariablesState } from '../state/selectors';\nimport { QueryVariableModel, VariableRefresh, VariableSort, VariableWithMultiSupport } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nimport { QueryVariableRefreshSelect } from './QueryVariableRefreshSelect';\nimport { QueryVariableSortSelect } from './QueryVariableSortSelect';\nimport { changeQueryVariableDataSource, changeQueryVariableQuery, initQueryVariableEditor } from './actions';\n\nconst mapStateToProps = (state: StoreState, ownProps: OwnProps) => {\n const { rootStateKey } = ownProps.variable;\n if (!rootStateKey) {\n console.error('QueryVariableEditor: variable has no rootStateKey');\n return {\n extended: getQueryVariableEditorState(initialVariableEditorState),\n };\n }\n\n const { editor } = getVariablesState(rootStateKey, state);\n\n return {\n extended: getQueryVariableEditorState(editor),\n };\n};\n\nconst mapDispatchToProps = {\n initQueryVariableEditor,\n changeQueryVariableDataSource,\n changeQueryVariableQuery,\n changeVariableMultiValue,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport interface OwnProps extends VariableEditorProps<QueryVariableModel> {}\n\nexport type Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport interface State {\n regex: string | null;\n tagsQuery: string | null;\n tagValuesQuery: string | null;\n}\n\nexport class QueryVariableEditorUnConnected extends PureComponent<Props, State> {\n state: State = {\n regex: null,\n tagsQuery: null,\n tagValuesQuery: null,\n };\n\n async componentDidMount() {\n await this.props.initQueryVariableEditor(toKeyedVariableIdentifier(this.props.variable));\n }\n\n componentDidUpdate(prevProps: Readonly<Props>): void {\n if (prevProps.variable.datasource !== this.props.variable.datasource) {\n this.props.changeQueryVariableDataSource(\n toKeyedVariableIdentifier(this.props.variable),\n this.props.variable.datasource\n );\n }\n }\n\n onDataSourceChange = (dsSettings: DataSourceInstanceSettings) => {\n this.props.onPropChange({\n propName: 'datasource',\n propValue: dsSettings.isDefault ? null : getDataSourceRef(dsSettings),\n });\n };\n\n onLegacyQueryChange = async (query: any, definition: string) => {\n if (this.props.variable.query !== query) {\n this.props.changeQueryVariableQuery(toKeyedVariableIdentifier(this.props.variable), query, definition);\n }\n };\n\n onQueryChange = async (query: any) => {\n if (this.props.variable.query !== query) {\n let definition = '';\n\n if (query && query.hasOwnProperty('query') && typeof query.query === 'string') {\n definition = query.query;\n }\n\n this.props.changeQueryVariableQuery(toKeyedVariableIdentifier(this.props.variable), query, definition);\n }\n };\n\n onRegExChange = (event: FormEvent<HTMLInputElement>) => {\n this.setState({ regex: event.currentTarget.value });\n };\n\n onRegExBlur = async (event: FormEvent<HTMLInputElement>) => {\n const regex = event.currentTarget.value;\n if (this.props.variable.regex !== regex) {\n this.props.onPropChange({ propName: 'regex', propValue: regex, updateOptions: true });\n }\n };\n\n onRefreshChange = (option: SelectableValue<VariableRefresh>) => {\n this.props.onPropChange({ propName: 'refresh', propValue: option.value });\n };\n\n onSortChange = async (option: SelectableValue<VariableSort>) => {\n this.props.onPropChange({ propName: 'sort', propValue: option.value, updateOptions: true });\n };\n\n onSelectionOptionsChange = async ({ propValue, propName }: OnPropChangeArguments<VariableWithMultiSupport>) => {\n this.props.onPropChange({ propName, propValue, updateOptions: true });\n };\n\n renderQueryEditor = () => {\n const { extended, variable } = this.props;\n\n if (!extended || !extended.dataSource || !extended.VariableQueryEditor) {\n return null;\n }\n\n const query = variable.query;\n const datasource = extended.dataSource;\n const VariableQueryEditor = extended.VariableQueryEditor;\n\n if (isLegacyQueryEditor(VariableQueryEditor, datasource)) {\n return (\n <VariableQueryEditor\n datasource={datasource}\n query={query}\n templateSrv={getTemplateSrv()}\n onChange={this.onLegacyQueryChange}\n />\n );\n }\n\n const range = getTimeSrv().timeRange();\n\n if (isQueryEditor(VariableQueryEditor, datasource)) {\n return (\n <VariableQueryEditor\n datasource={datasource}\n query={query}\n onChange={this.onQueryChange}\n onRunQuery={() => {}}\n data={{ series: [], state: LoadingState.Done, timeRange: range }}\n range={range}\n onBlur={() => {}}\n history={[]}\n />\n );\n }\n\n return null;\n };\n\n render() {\n return (\n <VerticalGroup spacing=\"xs\">\n <VariableSectionHeader name=\"Query Options\" />\n <VerticalGroup spacing=\"lg\">\n <VerticalGroup spacing=\"none\">\n <InlineFieldRow>\n <InlineField label=\"Data source\" labelWidth={20} htmlFor=\"data-source-picker\">\n <DataSourcePicker\n current={this.props.variable.datasource}\n onChange={this.onDataSourceChange}\n variables={true}\n />\n </InlineField>\n <QueryVariableRefreshSelect onChange={this.onRefreshChange} refresh={this.props.variable.refresh} />\n </InlineFieldRow>\n <div\n className={css`\n flex-direction: column;\n width: 100%;\n `}\n >\n {this.renderQueryEditor()}\n </div>\n <VariableTextField\n value={this.state.regex ?? this.props.variable.regex}\n name=\"Regex\"\n placeholder=\"/.*-(?<text>.*)-(?<value>.*)-.*/\"\n onChange={this.onRegExChange}\n onBlur={this.onRegExBlur}\n labelWidth={20}\n interactive={true}\n tooltip={\n <div>\n Optional, if you want to extract part of a series name or metric node segment. Named capture groups\n can be used to separate the display text and value (\n <a\n className=\"external-link\"\n href=\"https://grafana.com/docs/grafana/latest/variables/filter-variables-with-regex#filter-and-modify-using-named-text-and-value-capture-groups\"\n target=\"__blank\"\n >\n see examples\n </a>\n ).\n </div>\n }\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRegExInputV2}\n grow\n />\n <QueryVariableSortSelect onChange={this.onSortChange} sort={this.props.variable.sort} />\n </VerticalGroup>\n\n <SelectionOptionsEditor\n variable={this.props.variable}\n onPropChange={this.onSelectionOptionsChange}\n onMultiChanged={this.props.changeVariableMultiValue}\n />\n </VerticalGroup>\n </VerticalGroup>\n );\n }\n}\n\nexport const QueryVariableEditor = connector(QueryVariableEditorUnConnected);\n","import { cloneDeep } from 'lodash';\n\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { ALL_VARIABLE_TEXT } from '../constants';\nimport { optionPickerFactory } from '../pickers';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { QueryVariableModel, VariableRefresh } from '../types';\nimport { containsVariable, isAllVariable, toKeyedVariableIdentifier } from '../utils';\n\nimport { QueryVariableEditor } from './QueryVariableEditor';\nimport { updateQueryVariableOptions } from './actions';\nimport { initialQueryVariableModelState, queryVariableReducer } from './reducer';\n\nexport const createQueryVariableAdapter = (): VariableAdapter<QueryVariableModel> => {\n return {\n id: 'query',\n description: 'Variable values are fetched from a datasource query',\n name: 'Query',\n initialState: initialQueryVariableModelState,\n reducer: queryVariableReducer,\n picker: optionPickerFactory<QueryVariableModel>(),\n editor: QueryVariableEditor,\n dependsOn: (variable, variableToTest) => {\n return containsVariable(variable.query, variable.datasource?.uid, variable.regex, variableToTest.name);\n },\n setValue: async (variable, option, emitChanges = false) => {\n await dispatch(setOptionAsCurrent(toKeyedVariableIdentifier(variable), option, emitChanges));\n },\n setValueFromUrl: async (variable, urlValue) => {\n await dispatch(setOptionFromUrl(toKeyedVariableIdentifier(variable), urlValue));\n },\n updateOptions: async (variable, searchFilter) => {\n await dispatch(updateQueryVariableOptions(toKeyedVariableIdentifier(variable), searchFilter));\n },\n getSaveModel: (variable) => {\n const { index, id, state, global, queryValue, rootStateKey, ...rest } = cloneDeep(variable);\n // remove options\n if (variable.refresh !== VariableRefresh.never) {\n return { ...rest, options: [] };\n }\n\n return rest;\n },\n getValueForUrl: (variable) => {\n if (isAllVariable(variable)) {\n return ALL_VARIABLE_TEXT;\n }\n return variable.current.value;\n },\n };\n};\n","import React, { FormEvent, ReactElement, useCallback } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { VerticalGroup } from '@grafana/ui';\n\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { VariableEditorProps } from '../editor/types';\nimport { TextBoxVariableModel } from '../types';\n\nexport interface Props extends VariableEditorProps<TextBoxVariableModel> {}\n\nexport function TextBoxVariableEditor({ onPropChange, variable: { query } }: Props): ReactElement {\n const updateVariable = useCallback(\n (event: FormEvent<HTMLInputElement>, updateOptions: boolean) => {\n event.preventDefault();\n onPropChange({ propName: 'originalQuery', propValue: event.currentTarget.value, updateOptions: false });\n onPropChange({ propName: 'query', propValue: event.currentTarget.value, updateOptions });\n },\n [onPropChange]\n );\n\n const onChange = useCallback((e: FormEvent<HTMLInputElement>) => updateVariable(e, false), [updateVariable]);\n const onBlur = useCallback((e: FormEvent<HTMLInputElement>) => updateVariable(e, true), [updateVariable]);\n\n return (\n <VerticalGroup spacing=\"xs\">\n <VariableSectionHeader name=\"Text options\" />\n <VariableTextField\n value={query}\n name=\"Default value\"\n placeholder=\"default value, if any\"\n onChange={onChange}\n onBlur={onBlur}\n labelWidth={20}\n grow\n testId={selectors.pages.Dashboard.Settings.Variables.Edit.TextBoxVariable.textBoxOptionsQueryInputV2}\n />\n </VerticalGroup>\n );\n}\n","import React, { ChangeEvent, FocusEvent, KeyboardEvent, ReactElement, useCallback, useEffect, useState } from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { Input } from '@grafana/ui';\n\nimport { variableAdapters } from '../adapters';\nimport { VariablePickerProps } from '../pickers/types';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { TextBoxVariableModel } from '../types';\nimport { toVariablePayload } from '../utils';\n\nexport interface Props extends VariablePickerProps<TextBoxVariableModel> {}\n\nexport function TextBoxVariablePicker({ variable, onVariableChange, readOnly }: Props): ReactElement {\n const dispatch = useDispatch();\n const [updatedValue, setUpdatedValue] = useState(variable.current.value);\n useEffect(() => {\n setUpdatedValue(variable.current.value);\n }, [variable]);\n\n const updateVariable = useCallback(() => {\n if (!variable.rootStateKey) {\n console.error('Cannot update variable without rootStateKey');\n return;\n }\n\n if (variable.current.value === updatedValue) {\n return;\n }\n\n dispatch(\n toKeyedAction(\n variable.rootStateKey,\n changeVariableProp(\n toVariablePayload({ id: variable.id, type: variable.type }, { propName: 'query', propValue: updatedValue })\n )\n )\n );\n\n if (onVariableChange) {\n onVariableChange({\n ...variable,\n current: { ...variable.current, value: updatedValue },\n });\n return;\n }\n\n variableAdapters.get(variable.type).updateOptions(variable);\n }, [variable, updatedValue, dispatch, onVariableChange]);\n\n const onChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => setUpdatedValue(event.target.value),\n [setUpdatedValue]\n );\n\n const onBlur = (e: FocusEvent<HTMLInputElement>) => updateVariable();\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.keyCode === 13) {\n event.preventDefault();\n updateVariable();\n }\n };\n\n return (\n <Input\n type=\"text\"\n value={updatedValue}\n onChange={onChange}\n onBlur={onBlur}\n disabled={readOnly}\n onKeyDown={onKeyDown}\n placeholder=\"Enter variable value\"\n id={`var-${variable.id}`}\n />\n );\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { getInstanceState } from '../state/selectors';\nimport { initialVariablesState, VariablePayload, VariablesState } from '../state/types';\nimport { initialVariableModelState, TextBoxVariableModel, VariableOption } from '../types';\n\nexport const initialTextBoxVariableModelState: TextBoxVariableModel = {\n ...initialVariableModelState,\n type: 'textbox',\n query: '',\n current: {} as VariableOption,\n options: [],\n originalQuery: null,\n};\n\nexport const textBoxVariableSlice = createSlice({\n name: 'templating/textbox',\n initialState: initialVariablesState,\n reducers: {\n createTextBoxOptions: (state: VariablesState, action: PayloadAction<VariablePayload>) => {\n const instanceState = getInstanceState<TextBoxVariableModel>(state, action.payload.id);\n const option = { text: instanceState.query.trim(), value: instanceState.query.trim(), selected: false };\n instanceState.options = [option];\n instanceState.current = option;\n },\n },\n});\n\nexport const textBoxVariableReducer = textBoxVariableSlice.reducer;\n\nexport const { createTextBoxOptions } = textBoxVariableSlice.actions;\n","import { cloneDeep } from 'lodash';\n\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { setOptionAsCurrent } from '../state/actions';\nimport { TextBoxVariableModel } from '../types';\nimport { toKeyedVariableIdentifier } from '../utils';\n\nimport { TextBoxVariableEditor } from './TextBoxVariableEditor';\nimport { TextBoxVariablePicker } from './TextBoxVariablePicker';\nimport { setTextBoxVariableOptionsFromUrl, updateTextBoxVariableOptions } from './actions';\nimport { initialTextBoxVariableModelState, textBoxVariableReducer } from './reducer';\n\nexport const createTextBoxVariableAdapter = (): VariableAdapter<TextBoxVariableModel> => {\n return {\n id: 'textbox',\n description: 'Define a textbox variable, where users can enter any arbitrary string',\n name: 'Text box',\n initialState: initialTextBoxVariableModelState,\n reducer: textBoxVariableReducer,\n picker: TextBoxVariablePicker,\n editor: TextBoxVariableEditor,\n dependsOn: (variable, variableToTest) => {\n return false;\n },\n setValue: async (variable, option, emitChanges = false) => {\n await dispatch(setOptionAsCurrent(toKeyedVariableIdentifier(variable), option, emitChanges));\n },\n setValueFromUrl: async (variable, urlValue) => {\n await dispatch(setTextBoxVariableOptionsFromUrl(toKeyedVariableIdentifier(variable), urlValue));\n },\n updateOptions: async (variable) => {\n await dispatch(updateTextBoxVariableOptions(toKeyedVariableIdentifier(variable)));\n },\n getSaveModel: (variable, saveCurrentAsDefault) => {\n const { index, id, state, global, originalQuery, rootStateKey, ...rest } = cloneDeep(variable);\n\n if (variable.query !== originalQuery && !saveCurrentAsDefault) {\n const origQuery = originalQuery ?? '';\n const current = { selected: false, text: origQuery, value: origQuery };\n return { ...rest, query: origQuery, current, options: [current] };\n }\n\n return rest;\n },\n getValueForUrl: (variable) => {\n return variable.current.value;\n },\n beforeAdding: (model) => {\n return { ...cloneDeep(model), originalQuery: model.query };\n },\n };\n};\n","import { UrlQueryValue } from '@grafana/data';\n\nimport { ThunkResult } from '../../../types';\nimport { variableAdapters } from '../adapters';\nimport { setOptionFromUrl } from '../state/actions';\nimport { toKeyedAction } from '../state/keyedVariablesReducer';\nimport { getVariable } from '../state/selectors';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { KeyedVariableIdentifier } from '../state/types';\nimport { TextBoxVariableModel } from '../types';\nimport { ensureStringValues, toKeyedVariableIdentifier, toVariablePayload } from '../utils';\n\nimport { createTextBoxOptions } from './reducer';\n\nexport const updateTextBoxVariableOptions = (identifier: KeyedVariableIdentifier): ThunkResult<void> => {\n return async (dispatch, getState) => {\n const { rootStateKey, type } = identifier;\n dispatch(toKeyedAction(rootStateKey, createTextBoxOptions(toVariablePayload(identifier))));\n\n const variableInState = getVariable<TextBoxVariableModel>(identifier, getState());\n await variableAdapters.get(type).setValue(variableInState, variableInState.options[0], true);\n };\n};\n\nexport const setTextBoxVariableOptionsFromUrl =\n (identifier: KeyedVariableIdentifier, urlValue: UrlQueryValue): ThunkResult<void> =>\n async (dispatch, getState) => {\n const { rootStateKey } = identifier;\n const variableInState = getVariable<TextBoxVariableModel>(identifier, getState());\n\n const stringUrlValue = ensureStringValues(urlValue);\n dispatch(\n toKeyedAction(\n rootStateKey,\n changeVariableProp(toVariablePayload(variableInState, { propName: 'query', propValue: stringUrlValue }))\n )\n );\n\n await dispatch(setOptionFromUrl(toKeyedVariableIdentifier(variableInState), stringUrlValue));\n };\n","import { appNotificationsReducer as appNotifications } from './appNotification';\nimport { navTreeReducer as navBarTree } from './navBarTree';\nimport { navIndexReducer as navIndex } from './navModel';\n\nexport default {\n navBarTree,\n navIndex,\n appNotifications,\n};\n","import { AnyAction, combineReducers } from 'redux';\n\nimport sharedReducers from 'app/core/reducers';\nimport ldapReducers from 'app/features/admin/state/reducers';\nimport alertingReducers from 'app/features/alerting/state/reducers';\nimport apiKeysReducers from 'app/features/api-keys/state/reducers';\nimport panelEditorReducers from 'app/features/dashboard/components/PanelEditor/state/reducers';\nimport dashboardReducers from 'app/features/dashboard/state/reducers';\nimport dataSourcesReducers from 'app/features/datasources/state/reducers';\nimport exploreReducers from 'app/features/explore/state/main';\nimport foldersReducers from 'app/features/folders/state/reducers';\nimport invitesReducers from 'app/features/invites/state/reducers';\nimport importDashboardReducers from 'app/features/manage-dashboards/state/reducers';\nimport organizationReducers from 'app/features/org/state/reducers';\nimport panelsReducers from 'app/features/panel/state/reducers';\nimport { reducer as pluginsReducer } from 'app/features/plugins/admin/state/reducer';\nimport userReducers from 'app/features/profile/state/reducers';\nimport serviceAccountsReducer from 'app/features/serviceaccounts/state/reducers';\nimport teamsReducers from 'app/features/teams/state/reducers';\nimport usersReducers from 'app/features/users/state/reducers';\nimport templatingReducers from 'app/features/variables/state/keyedVariablesReducer';\n\nimport { CleanUp, cleanUpAction } from '../actions/cleanUp';\n\nconst rootReducers = {\n ...sharedReducers,\n ...alertingReducers,\n ...teamsReducers,\n ...apiKeysReducers,\n ...foldersReducers,\n ...dashboardReducers,\n ...exploreReducers,\n ...dataSourcesReducers,\n ...usersReducers,\n ...serviceAccountsReducer,\n ...userReducers,\n ...invitesReducers,\n ...organizationReducers,\n ...ldapReducers,\n ...importDashboardReducers,\n ...panelEditorReducers,\n ...panelsReducers,\n ...templatingReducers,\n plugins: pluginsReducer,\n};\n\nconst addedReducers = {};\n\nexport const addReducer = (newReducers: any) => {\n Object.assign(addedReducers, newReducers);\n};\n\nexport const createRootReducer = () => {\n const appReducer = combineReducers({\n ...rootReducers,\n ...addedReducers,\n });\n\n return (state: any, action: AnyAction) => {\n if (action.type !== cleanUpAction.type) {\n return appReducer(state, action);\n }\n\n const { stateSelector } = action.payload as CleanUp<any>;\n const stateSlice = stateSelector(state);\n recursiveCleanState(state, stateSlice);\n\n return appReducer(state, action);\n };\n};\n\nexport const recursiveCleanState = (state: any, stateSlice: any): boolean => {\n for (const stateKey in state) {\n if (!state.hasOwnProperty(stateKey)) {\n continue;\n }\n\n const slice = state[stateKey];\n if (slice === stateSlice) {\n state[stateKey] = undefined;\n return true;\n }\n\n if (typeof slice === 'object') {\n const cleaned = recursiveCleanState(slice, stateSlice);\n if (cleaned) {\n return true;\n }\n }\n }\n\n return false;\n};\n","import 'symbol-observable';\nimport 'core-js';\nimport 'regenerator-runtime/runtime';\n\nimport 'whatwg-fetch'; // fetch polyfill needed for PhantomJs rendering\nimport './polyfills/old-mediaquerylist'; // Safari < 14 does not have mql.addEventListener()\nimport 'file-saver';\nimport 'jquery';\n\nimport 'app/features/all';\n\nimport _ from 'lodash'; // eslint-disable-line lodash/import-scope\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport {\n locationUtil,\n monacoLanguageRegistry,\n setLocale,\n setTimeZoneResolver,\n setWeekStart,\n standardEditorsRegistry,\n standardFieldConfigEditorRegistry,\n standardTransformersRegistry,\n} from '@grafana/data';\nimport {\n locationService,\n registerEchoBackend,\n setBackendSrv,\n setDataSourceSrv,\n setEchoSrv,\n setLocationSrv,\n setQueryRunnerFactory,\n} from '@grafana/runtime';\nimport { setPanelDataErrorView } from '@grafana/runtime/src/components/PanelDataErrorView';\nimport { setPanelRenderer } from '@grafana/runtime/src/components/PanelRenderer';\nimport { getScrollbarWidth } from '@grafana/ui';\nimport config from 'app/core/config';\nimport { arrayMove } from 'app/core/utils/arrayMove';\nimport { getStandardTransformers } from 'app/features/transformers/standardTransformers';\n\nimport getDefaultMonacoLanguages from '../lib/monaco-languages';\n\nimport { AppWrapper } from './AppWrapper';\nimport { AppChromeService } from './core/components/AppChrome/AppChromeService';\nimport { getAllOptionEditors, getAllStandardFieldConfigs } from './core/components/OptionsUI/registry';\nimport { GrafanaContextType } from './core/context/GrafanaContext';\nimport { interceptLinkClicks } from './core/navigation/patch/interceptLinkClicks';\nimport { ModalManager } from './core/services/ModalManager';\nimport { backendSrv } from './core/services/backend_srv';\nimport { contextSrv } from './core/services/context_srv';\nimport { Echo } from './core/services/echo/Echo';\nimport { reportPerformance } from './core/services/echo/EchoSrv';\nimport { PerformanceBackend } from './core/services/echo/backends/PerformanceBackend';\nimport { ApplicationInsightsBackend } from './core/services/echo/backends/analytics/ApplicationInsightsBackend';\nimport { GAEchoBackend } from './core/services/echo/backends/analytics/GABackend';\nimport { RudderstackBackend } from './core/services/echo/backends/analytics/RudderstackBackend';\nimport { GrafanaJavascriptAgentBackend } from './core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend';\nimport { SentryEchoBackend } from './core/services/echo/backends/sentry/SentryBackend';\nimport { initDevFeatures } from './dev';\nimport { getTimeSrv } from './features/dashboard/services/TimeSrv';\nimport { PanelDataErrorView } from './features/panel/components/PanelDataErrorView';\nimport { PanelRenderer } from './features/panel/components/PanelRenderer';\nimport { DatasourceSrv } from './features/plugins/datasource_srv';\nimport { preloadPlugins } from './features/plugins/pluginPreloader';\nimport { QueryRunner } from './features/query/state/QueryRunner';\nimport { initWindowRuntime } from './features/runtime/init';\nimport { variableAdapters } from './features/variables/adapters';\nimport { createAdHocVariableAdapter } from './features/variables/adhoc/adapter';\nimport { createConstantVariableAdapter } from './features/variables/constant/adapter';\nimport { createCustomVariableAdapter } from './features/variables/custom/adapter';\nimport { createDataSourceVariableAdapter } from './features/variables/datasource/adapter';\nimport { getVariablesUrlParams } from './features/variables/getAllVariableValuesForUrl';\nimport { createIntervalVariableAdapter } from './features/variables/interval/adapter';\nimport { setVariableQueryRunner, VariableQueryRunner } from './features/variables/query/VariableQueryRunner';\nimport { createQueryVariableAdapter } from './features/variables/query/adapter';\nimport { createSystemVariableAdapter } from './features/variables/system/adapter';\nimport { createTextBoxVariableAdapter } from './features/variables/textbox/adapter';\nimport { configureStore } from './store/configureStore';\n\n// add move to lodash for backward compatabilty with plugins\n// @ts-ignore\n_.move = arrayMove;\n\n// import symlinked extensions\nconst extensionsIndex = require.context('.', true, /extensions\\/index.ts/);\nconst extensionsExports = extensionsIndex.keys().map((key) => {\n return extensionsIndex(key);\n});\n\nif (process.env.NODE_ENV === 'development') {\n initDevFeatures();\n}\n\nexport class GrafanaApp {\n context!: GrafanaContextType;\n\n async init() {\n try {\n setBackendSrv(backendSrv);\n initEchoSrv();\n addClassIfNoOverlayScrollbar();\n setLocale(config.bootData.user.locale);\n setWeekStart(config.bootData.user.weekStart);\n setPanelRenderer(PanelRenderer);\n setPanelDataErrorView(PanelDataErrorView);\n setLocationSrv(locationService);\n setTimeZoneResolver(() => config.bootData.user.timezone);\n // Important that extension reducers are initialized before store\n addExtensionReducers();\n configureStore();\n initExtensions();\n\n standardEditorsRegistry.setInit(getAllOptionEditors);\n standardFieldConfigEditorRegistry.setInit(getAllStandardFieldConfigs);\n standardTransformersRegistry.setInit(getStandardTransformers);\n variableAdapters.setInit(() => [\n createQueryVariableAdapter(),\n createCustomVariableAdapter(),\n createTextBoxVariableAdapter(),\n createConstantVariableAdapter(),\n createDataSourceVariableAdapter(),\n createIntervalVariableAdapter(),\n createAdHocVariableAdapter(),\n createSystemVariableAdapter(),\n ]);\n monacoLanguageRegistry.setInit(getDefaultMonacoLanguages);\n\n setQueryRunnerFactory(() => new QueryRunner());\n setVariableQueryRunner(new VariableQueryRunner());\n\n locationUtil.initialize({\n config,\n getTimeRangeForUrl: getTimeSrv().timeRangeForUrl,\n getVariablesUrlParams: getVariablesUrlParams,\n });\n\n // intercept anchor clicks and forward it to custom history instead of relying on browser's history\n document.addEventListener('click', interceptLinkClicks);\n\n // Init DataSourceSrv\n const dataSourceSrv = new DatasourceSrv();\n dataSourceSrv.init(config.datasources, config.defaultDatasource);\n setDataSourceSrv(dataSourceSrv);\n initWindowRuntime();\n\n // init modal manager\n const modalManager = new ModalManager();\n modalManager.init();\n\n // Preload selected app plugins\n await preloadPlugins(config.pluginsToPreload);\n\n this.context = {\n backend: backendSrv,\n location: locationService,\n chrome: new AppChromeService(),\n config,\n };\n\n ReactDOM.render(\n React.createElement(AppWrapper, {\n app: this,\n }),\n document.getElementById('reactRoot')\n );\n } catch (error) {\n console.error('Failed to start Grafana', error);\n window.__grafana_load_failed();\n }\n }\n}\n\nfunction addExtensionReducers() {\n if (extensionsExports.length > 0) {\n extensionsExports[0].addExtensionReducers();\n }\n}\n\nfunction initExtensions() {\n if (extensionsExports.length > 0) {\n extensionsExports[0].init();\n }\n}\n\nfunction initEchoSrv() {\n setEchoSrv(new Echo({ debug: process.env.NODE_ENV === 'development' }));\n\n window.addEventListener('load', (e) => {\n const loadMetricName = 'frontend_boot_load_time_seconds';\n // Metrics below are marked in public/views/index-template.html\n const jsLoadMetricName = 'frontend_boot_js_done_time_seconds';\n const cssLoadMetricName = 'frontend_boot_css_time_seconds';\n\n if (performance) {\n performance.mark(loadMetricName);\n reportMetricPerformanceMark('first-paint', 'frontend_boot_', '_time_seconds');\n reportMetricPerformanceMark('first-contentful-paint', 'frontend_boot_', '_time_seconds');\n reportMetricPerformanceMark(loadMetricName);\n reportMetricPerformanceMark(jsLoadMetricName);\n reportMetricPerformanceMark(cssLoadMetricName);\n }\n });\n\n if (contextSrv.user.orgRole !== '') {\n registerEchoBackend(new PerformanceBackend({}));\n }\n\n if (config.sentry.enabled) {\n registerEchoBackend(\n new SentryEchoBackend({\n ...config.sentry,\n user: config.bootData.user,\n buildInfo: config.buildInfo,\n })\n );\n }\n if (config.grafanaJavascriptAgent.enabled) {\n registerEchoBackend(\n new GrafanaJavascriptAgentBackend({\n ...config.grafanaJavascriptAgent,\n app: {\n version: config.buildInfo.version,\n environment: config.buildInfo.env,\n },\n buildInfo: config.buildInfo,\n user: {\n id: String(config.bootData.user?.id),\n email: config.bootData.user?.email,\n },\n })\n );\n }\n\n if (config.googleAnalyticsId) {\n registerEchoBackend(\n new GAEchoBackend({\n googleAnalyticsId: config.googleAnalyticsId,\n })\n );\n }\n\n if (config.rudderstackWriteKey && config.rudderstackDataPlaneUrl) {\n registerEchoBackend(\n new RudderstackBackend({\n writeKey: config.rudderstackWriteKey,\n dataPlaneUrl: config.rudderstackDataPlaneUrl,\n user: config.bootData.user,\n sdkUrl: config.rudderstackSdkUrl,\n configUrl: config.rudderstackConfigUrl,\n })\n );\n }\n\n if (config.applicationInsightsConnectionString) {\n registerEchoBackend(\n new ApplicationInsightsBackend({\n connectionString: config.applicationInsightsConnectionString,\n endpointUrl: config.applicationInsightsEndpointUrl,\n })\n );\n }\n}\n\nfunction addClassIfNoOverlayScrollbar() {\n if (getScrollbarWidth() > 0) {\n document.body.classList.add('no-overlay-scrollbar');\n }\n}\n\n/**\n * Report when a metric of a given name was marked during the document lifecycle. Works for markers with no duration,\n * like PerformanceMark or PerformancePaintTiming (e.g. created with performance.mark, or first-contentful-paint)\n */\nfunction reportMetricPerformanceMark(metricName: string, prefix = '', suffix = ''): void {\n const metric = _.first(performance.getEntriesByName(metricName));\n if (metric) {\n const metricName = metric.name.replace(/-/g, '_');\n reportPerformance(`${prefix}${metricName}${suffix}`, Math.round(metric.startTime) / 1000);\n }\n}\n\nexport default new GrafanaApp();\n","import { configureStore as reduxConfigureStore, MiddlewareArray } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\nimport { ThunkMiddleware } from 'redux-thunk';\n\nimport { StoreState } from 'app/types/store';\n\nimport { buildInitialState } from '../core/reducers/navModel';\nimport { addReducer, createRootReducer } from '../core/reducers/root';\n\nimport { setStore } from './store';\n\nexport function addRootReducer(reducers: any) {\n // this is ok now because we add reducers before configureStore is called\n // in the future if we want to add reducers during runtime\n // we'll have to solve this in a more dynamic way\n addReducer(reducers);\n}\n\nexport function configureStore(initialState?: Partial<StoreState>) {\n const store = reduxConfigureStore<StoreState, AnyAction, MiddlewareArray<[ThunkMiddleware<StoreState, AnyAction>]>>({\n reducer: createRootReducer(),\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({ thunk: true, serializableCheck: false, immutableCheck: false }),\n devTools: process.env.NODE_ENV !== 'production',\n preloadedState: {\n navIndex: buildInitialState(),\n ...initialState,\n },\n });\n\n setStore(store);\n return store;\n}\n\n/*\nfunction getActionsToIgnoreSerializableCheckOn() {\n return [\n 'dashboard/setPanelAngularComponent',\n 'dashboard/panelModelAndPluginReady',\n 'dashboard/dashboardInitCompleted',\n 'plugins/panelPluginLoaded',\n 'explore/initializeExplore',\n 'explore/changeRange',\n 'explore/updateDatasourceInstance',\n 'explore/queryStoreSubscription',\n 'explore/queryStreamUpdated',\n ];\n}\n\nfunction getPathsToIgnoreMutationAndSerializableCheckOn() {\n return [\n 'plugins.panels',\n 'dashboard.panels',\n 'dashboard.getModel',\n 'payload.plugin',\n 'panelEditorNew.getPanel',\n 'panelEditorNew.getSourcePanel',\n 'panelEditorNew.getData',\n 'explore.left.queryResponse',\n 'explore.right.queryResponse',\n 'explore.left.datasourceInstance',\n 'explore.right.datasourceInstance',\n 'explore.left.range',\n 'explore.left.eventBridge',\n 'explore.right.eventBridge',\n 'explore.right.range',\n 'explore.left.querySubscription',\n 'explore.right.querySubscription',\n ];\n}\n*/\n","import { ComponentType } from 'react';\n\nimport { LoadingState } from '@grafana/data';\n\nimport { VariableAdapter } from '../adapters';\nimport { VariableEditorProps } from '../editor/types';\nimport { VariablePickerProps } from '../pickers/types';\nimport { initialVariableModelState, SystemVariable, VariableHide } from '../types';\n\nexport const createSystemVariableAdapter = (): VariableAdapter<SystemVariable<any>> => {\n return {\n id: 'system',\n description: '',\n name: 'system',\n initialState: {\n ...initialVariableModelState,\n type: 'system',\n hide: VariableHide.hideVariable,\n skipUrlSync: true,\n current: { value: { toString: () => '' } },\n state: LoadingState.Done,\n },\n reducer: (state: any, action: any) => state,\n picker: null as unknown as ComponentType<VariablePickerProps<SystemVariable<any>>>,\n editor: null as unknown as ComponentType<VariableEditorProps<SystemVariable<any>>>,\n dependsOn: () => {\n return false;\n },\n setValue: async (variable, option, emitChanges = false) => {\n return;\n },\n setValueFromUrl: async (variable, urlValue) => {\n return;\n },\n updateOptions: async (variable) => {\n return;\n },\n getSaveModel: (variable) => {\n return {};\n },\n getValueForUrl: (variable) => {\n return '';\n },\n };\n};\n","import { PanelData } from '@grafana/data';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\n\n/**\n * This will setup features that are accessible through the root window location\n *\n * This is useful for manipulating the application from external drivers like puppetter/cypress\n *\n * @internal and subject to change\n */\nexport function initWindowRuntime() {\n (window as any).grafanaRuntime = {\n /** Get info for the current dashboard. This will include the migrated dashboard JSON */\n getDashboardSaveModel: () => {\n const d = getDashboardSrv().getCurrent();\n if (!d) {\n return undefined;\n }\n return d.getSaveModelClone();\n },\n\n /** The selected time range */\n getDashboardTimeRange: () => {\n const tr = getTimeSrv().timeRange();\n return {\n from: tr.from.valueOf(),\n to: tr.to.valueOf(),\n raw: tr.raw,\n };\n },\n\n /** Get the query results for the last loaded data */\n getPanelData: () => {\n const d = getDashboardSrv().getCurrent();\n if (!d) {\n return undefined;\n }\n return d.panels.reduce((acc, panel) => {\n acc[panel.id] = panel.getQueryRunner().getLastResult();\n return acc;\n }, {} as Record<number, PanelData | undefined>);\n },\n };\n}\n","declare let __webpack_public_path__: string;\ndeclare let __webpack_nonce__: string;\n\n// Check if we are hosting files on cdn and set webpack public path\nif (window.public_cdn_path) {\n __webpack_public_path__ = window.public_cdn_path;\n}\n\n// This is a path to the public folder without '/build'\nwindow.__grafana_public_path__ =\n __webpack_public_path__.substring(0, __webpack_public_path__.lastIndexOf('build/')) || __webpack_public_path__;\n\nif (window.nonce) {\n __webpack_nonce__ = window.nonce;\n}\n\n// This is an indication to the window.onLoad failure check that the app bundle has loaded.\nwindow.__grafana_app_bundle_loaded = true;\n\nimport app from './app';\napp.init();\n","//DOCS: https://prometheus.io/docs/alerting/latest/configuration/\n\nimport { DataSourceJsonData } from '@grafana/data';\n\nexport type AlertManagerCortexConfig = {\n template_files: Record<string, string>;\n alertmanager_config: AlertmanagerConfig;\n /** { [name]: provenance } */\n template_file_provenances?: Record<string, string>;\n};\n\nexport type TLSConfig = {\n ca_file: string;\n cert_file: string;\n key_file: string;\n server_name?: string;\n insecure_skip_verify?: boolean;\n};\n\nexport type HTTPConfigCommon = {\n proxy_url?: string;\n tls_config?: TLSConfig;\n};\n\nexport type HTTPConfigBasicAuth = {\n basic_auth: {\n username: string;\n } & ({ password: string } | { password_file: string });\n};\n\nexport type HTTPConfigBearerToken = {\n bearer_token: string;\n};\n\nexport type HTTPConfigBearerTokenFile = {\n bearer_token_file: string;\n};\n\nexport type HTTPConfig = HTTPConfigCommon & (HTTPConfigBasicAuth | HTTPConfigBearerToken | HTTPConfigBearerTokenFile);\n\nexport type EmailConfig = {\n to: string;\n\n send_resolved?: string;\n from?: string;\n smarthost?: string;\n hello?: string;\n auth_username?: string;\n auth_password?: string;\n auth_secret?: string;\n auth_identity?: string;\n require_tls?: boolean;\n tls_config?: TLSConfig;\n html?: string;\n text?: string;\n headers?: Record<string, string>;\n};\n\nexport type WebhookConfig = {\n url: string;\n\n send_resolved?: boolean;\n http_config?: HTTPConfig;\n max_alerts?: number;\n};\n\nexport type GrafanaManagedReceiverConfig = {\n uid?: string;\n disableResolveMessage: boolean;\n secureFields?: Record<string, boolean>;\n secureSettings?: Record<string, any>;\n settings: Record<string, any>;\n type: string;\n name: string;\n updated?: string;\n created?: string;\n provenance?: string;\n};\n\nexport type Receiver = {\n name: string;\n\n email_configs?: EmailConfig[];\n pagerduty_configs?: any[];\n pushover_configs?: any[];\n slack_configs?: any[];\n opsgenie_configs?: any[];\n webhook_configs?: WebhookConfig[];\n victorops_configs?: any[];\n wechat_configs?: any[];\n grafana_managed_receiver_configs?: GrafanaManagedReceiverConfig[];\n [key: string]: any;\n};\n\ntype ObjectMatcher = [name: string, operator: MatcherOperator, value: string];\n\nexport type Route = {\n receiver?: string;\n group_by?: string[];\n continue?: boolean;\n object_matchers?: ObjectMatcher[];\n matchers?: string[];\n /** @deprecated use `object_matchers` */\n match?: Record<string, string>;\n /** @deprecated use `object_matchers` */\n match_re?: Record<string, string>;\n group_wait?: string;\n group_interval?: string;\n repeat_interval?: string;\n routes?: Route[];\n mute_time_intervals?: string[];\n /** only the root policy might have a provenance field defined */\n provenance?: string;\n};\n\nexport type InhibitRule = {\n target_match: Record<string, string>;\n target_match_re: Record<string, string>;\n source_match: Record<string, string>;\n source_match_re: Record<string, string>;\n equal?: string[];\n};\n\nexport type AlertmanagerConfig = {\n global?: {\n smtp_from?: string;\n smtp_smarthost?: string;\n smtp_hello?: string;\n smtp_auth_username?: string;\n smtp_auth_password?: string;\n smtp_auth_identity?: string;\n smtp_auth_secret?: string;\n smtp_require_tls?: boolean;\n slack_api_url?: string;\n victorops_api_key?: string;\n victorops_api_url?: string;\n pagerduty_url?: string;\n opsgenie_api_key?: string;\n opsgenie_api_url?: string;\n wechat_api_url?: string;\n wechat_api_secret?: string;\n wechat_api_corp_id?: string;\n http_config?: HTTPConfig;\n resolve_timeout?: string;\n };\n templates?: string[];\n route?: Route;\n inhibit_rules?: InhibitRule[];\n receivers?: Receiver[];\n mute_time_intervals?: MuteTimeInterval[];\n /** { [name]: provenance } */\n muteTimeProvenances?: Record<string, string>;\n};\n\nexport type Matcher = {\n name: string;\n value: string;\n isRegex: boolean;\n isEqual: boolean;\n};\n\nexport enum SilenceState {\n Active = 'active',\n Expired = 'expired',\n Pending = 'pending',\n}\n\nexport enum AlertState {\n Unprocessed = 'unprocessed',\n Active = 'active',\n Suppressed = 'suppressed',\n}\n\nexport enum MatcherOperator {\n equal = '=',\n notEqual = '!=',\n regex = '=~',\n notRegex = '!~',\n}\n\nexport type Silence = {\n id: string;\n matchers?: Matcher[];\n startsAt: string;\n endsAt: string;\n updatedAt: string;\n createdBy: string;\n comment: string;\n status: {\n state: SilenceState;\n };\n};\n\nexport type SilenceCreatePayload = {\n id?: string;\n matchers?: Matcher[];\n startsAt: string;\n endsAt: string;\n createdBy: string;\n comment: string;\n};\n\nexport type AlertmanagerAlert = {\n startsAt: string;\n updatedAt: string;\n endsAt: string;\n generatorURL?: string;\n labels: { [key: string]: string };\n annotations: { [key: string]: string };\n receivers: [\n {\n name: string;\n }\n ];\n fingerprint: string;\n status: {\n state: AlertState;\n silencedBy: string[];\n inhibitedBy: string[];\n };\n};\n\nexport type AlertmanagerGroup = {\n labels: { [key: string]: string };\n receiver: { name: string };\n alerts: AlertmanagerAlert[];\n};\n\nexport interface AlertmanagerStatus {\n cluster: {\n peers: unknown;\n status: string;\n };\n config: AlertmanagerConfig;\n uptime: string;\n versionInfo: {\n branch: string;\n buildDate: string;\n buildUser: string;\n goVersion: string;\n revision: string;\n version: string;\n };\n}\n\nexport type TestReceiversAlert = Pick<AlertmanagerAlert, 'annotations' | 'labels'>;\n\nexport interface TestReceiversPayload {\n receivers?: Receiver[];\n alert?: TestReceiversAlert;\n}\n\ninterface TestReceiversResultGrafanaReceiverConfig {\n name: string;\n uid?: string;\n error?: string;\n status: 'ok' | 'failed';\n}\n\ninterface TestReceiversResultReceiver {\n name: string;\n grafana_managed_receiver_configs: TestReceiversResultGrafanaReceiverConfig[];\n}\nexport interface TestReceiversResult {\n notified_at: string;\n receivers: TestReceiversResultReceiver[];\n}\n\nexport interface ExternalAlertmanagers {\n activeAlertManagers: AlertmanagerUrl[];\n droppedAlertManagers: AlertmanagerUrl[];\n}\n\nexport interface AlertmanagerUrl {\n url: string;\n}\n\nexport interface ExternalAlertmanagersResponse {\n data: ExternalAlertmanagers;\n}\n\nexport enum AlertmanagerChoice {\n Internal = 'internal',\n External = 'external',\n All = 'all',\n}\n\nexport interface ExternalAlertmanagerConfig {\n alertmanagers: string[];\n alertmanagersChoice: AlertmanagerChoice;\n}\n\nexport enum AlertManagerImplementation {\n cortex = 'cortex',\n mimir = 'mimir',\n prometheus = 'prometheus',\n}\n\nexport interface TimeRange {\n /** Times are in format `HH:MM` in UTC */\n start_time: string;\n end_time: string;\n}\nexport interface TimeInterval {\n times?: TimeRange[];\n weekdays?: string[];\n days_of_month?: string[];\n months?: string[];\n years?: string[];\n}\n\nexport type MuteTimeInterval = {\n name: string;\n time_intervals: TimeInterval[];\n provenance?: string;\n};\n\nexport interface AlertManagerDataSourceJsonData extends DataSourceJsonData {\n implementation?: AlertManagerImplementation;\n handleGrafanaManagedAlerts?: boolean;\n}\n","import { AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData } from '@grafana/aws-sdk';\nimport { DataQuery, DataSourceRef, SelectableValue } from '@grafana/data';\n\nimport {\n QueryEditorArrayExpression,\n QueryEditorFunctionExpression,\n QueryEditorPropertyExpression,\n} from './expressions';\n\nexport interface Dimensions {\n [key: string]: string | string[];\n}\n\nexport interface MultiFilters {\n [key: string]: string[];\n}\n\nexport type CloudWatchQueryMode = 'Metrics' | 'Logs' | 'Annotations';\n\nexport enum MetricQueryType {\n 'Search',\n 'Query',\n}\n\nexport enum MetricEditorMode {\n 'Builder',\n 'Code',\n}\n\nexport type Direction = 'ASC' | 'DESC';\n\nexport interface SQLExpression {\n select?: QueryEditorFunctionExpression;\n from?: QueryEditorPropertyExpression | QueryEditorFunctionExpression;\n where?: QueryEditorArrayExpression;\n groupBy?: QueryEditorArrayExpression;\n orderBy?: QueryEditorFunctionExpression;\n orderByDirection?: string;\n limit?: number;\n}\n\nexport interface CloudWatchMetricsQuery extends MetricStat, DataQuery {\n queryMode?: 'Metrics';\n metricQueryType?: MetricQueryType;\n metricEditorMode?: MetricEditorMode;\n\n //common props\n id: string;\n\n alias?: string;\n label?: string;\n\n // Math expression query\n expression?: string;\n\n sqlExpression?: string;\n sql?: SQLExpression;\n}\n\nexport interface MetricStat {\n region: string;\n namespace: string;\n metricName?: string;\n dimensions?: Dimensions;\n matchExact?: boolean;\n period?: string;\n statistic?: string;\n /**\n * @deprecated use statistic\n */\n statistics?: string[];\n}\n\nexport interface CloudWatchMathExpressionQuery extends DataQuery {\n expression: string;\n}\n\nexport type LogAction =\n | 'DescribeLogGroups'\n | 'GetQueryResults'\n | 'GetLogGroupFields'\n | 'GetLogEvents'\n | 'StartQuery'\n | 'StopQuery';\n\nexport enum CloudWatchLogsQueryStatus {\n Scheduled = 'Scheduled',\n Running = 'Running',\n Complete = 'Complete',\n Failed = 'Failed',\n Cancelled = 'Cancelled',\n Timeout = 'Timeout',\n}\n\nexport interface CloudWatchLogsQuery extends DataQuery {\n queryMode: 'Logs';\n id: string;\n region: string;\n expression?: string;\n logGroupNames?: string[];\n statsGroups?: string[];\n}\n\nexport type CloudWatchQuery = CloudWatchMetricsQuery | CloudWatchLogsQuery | CloudWatchAnnotationQuery;\n\nexport interface CloudWatchAnnotationQuery extends MetricStat, DataQuery {\n queryMode: 'Annotations';\n prefixMatching?: boolean;\n actionPrefix?: string;\n alarmNamePrefix?: string;\n}\n\nexport type SelectableStrings = Array<SelectableValue<string>>;\n\nexport interface CloudWatchJsonData extends AwsAuthDataSourceJsonData {\n timeField?: string;\n database?: string;\n customMetricsNamespaces?: string;\n endpoint?: string;\n // Time string like 15s, 10m etc, see rangeUtils.intervalToMs.\n logsTimeout?: string;\n // Used to create links if logs contain traceId.\n tracingDatasourceUid?: string;\n defaultLogGroups?: string[];\n}\n\nexport interface CloudWatchSecureJsonData extends AwsAuthDataSourceSecureJsonData {\n accessKey?: string;\n secretKey?: string;\n}\n\nexport interface GetQueryResultsRequest {\n /**\n * The ID number of the query.\n */\n queryId: string;\n}\n\nexport interface ResultField {\n /**\n * The log event field.\n */\n field?: string;\n /**\n * The value of this field.\n */\n value?: string;\n}\n\nexport interface QueryStatistics {\n /**\n * The number of log events that matched the query string.\n */\n recordsMatched?: number;\n /**\n * The total number of log events scanned during the query.\n */\n recordsScanned?: number;\n /**\n * The total number of bytes in the log events scanned during the query.\n */\n bytesScanned?: number;\n}\n\nexport type QueryStatus = 'Scheduled' | 'Running' | 'Complete' | 'Failed' | 'Cancelled' | string;\n\nexport type CloudWatchLogsRequest =\n | GetLogEventsRequest\n | StartQueryRequest\n | DescribeLogGroupsRequest\n | GetLogGroupFieldsRequest;\n\nexport interface GetLogEventsRequest {\n /**\n * The name of the log group.\n */\n logGroupName: string;\n /**\n * The name of the log stream.\n */\n logStreamName: string;\n /**\n * The start of the time range, expressed as the number of milliseconds after Jan 1, 1970 00:00:00 UTC. Events with a timestamp equal to this time or later than this time are included. Events with a timestamp earlier than this time are not included.\n */\n startTime?: number;\n /**\n * The end of the time range, expressed as the number of milliseconds after Jan 1, 1970 00:00:00 UTC. Events with a timestamp equal to or later than this time are not included.\n */\n endTime?: number;\n /**\n * The token for the next set of items to return. (You received this token from a previous call.) Using this token works only when you specify true for startFromHead.\n */\n nextToken?: string;\n /**\n * The maximum number of log events returned. If you don't specify a value, the maximum is as many log events as can fit in a response size of 1 MB, up to 10,000 log events.\n */\n limit?: number;\n /**\n * If the value is true, the earliest log events are returned first. If the value is false, the latest log events are returned first. The default value is false. If you are using nextToken in this operation, you must specify true for startFromHead.\n */\n startFromHead?: boolean;\n region?: string;\n}\n\nexport interface GetQueryResultsResponse {\n /**\n * The log events that matched the query criteria during the most recent time it ran. The results value is an array of arrays. Each log event is one object in the top-level array. Each of these log event objects is an array of field/value pairs.\n */\n results?: ResultField[][];\n /**\n * Includes the number of log events scanned by the query, the number of log events that matched the query criteria, and the total number of bytes in the log events that were scanned.\n */\n statistics?: QueryStatistics;\n /**\n * The status of the most recent running of the query. Possible values are Cancelled, Complete, Failed, Running, Scheduled, Timeout, and Unknown. Queries time out after 15 minutes of execution. To avoid having your queries time out, reduce the time range being searched, or partition your query into a number of queries.\n */\n status?: QueryStatus;\n}\n\nexport interface DescribeLogGroupsRequest {\n /**\n * The prefix to match.\n */\n logGroupNamePrefix?: string;\n /**\n * The token for the next set of items to return. (You received this token from a previous call.)\n */\n nextToken?: string;\n /**\n * The maximum number of items returned. If you don't specify a value, the default is up to 50 items.\n */\n limit?: number;\n refId?: string;\n region: string;\n}\n\nexport interface TSDBResponse<T = any> {\n results: Record<string, TSDBQueryResult<T>>;\n message?: string;\n}\n\nexport interface TSDBQueryResult<T = any> {\n refId: string;\n series: TSDBTimeSeries[];\n tables: Array<TSDBTable<T>>;\n\n error?: string;\n meta?: any;\n}\n\nexport interface TSDBTable<T = any> {\n columns: Array<{ text: string }>;\n rows: T[];\n}\n\nexport interface TSDBTimeSeries {\n name: string;\n points: TSDBTimePoint[];\n tags?: Record<string, string>;\n}\nexport type TSDBTimePoint = [number, number];\n\nexport interface LogGroup {\n /**\n * The name of the log group.\n */\n logGroupName?: string;\n /**\n * The creation time of the log group, expressed as the number of milliseconds after Jan 1, 1970 00:00:00 UTC.\n */\n creationTime?: number;\n retentionInDays?: number;\n /**\n * The number of metric filters.\n */\n metricFilterCount?: number;\n /**\n * The Amazon Resource Name (ARN) of the log group.\n */\n arn?: string;\n /**\n * The number of bytes stored.\n */\n storedBytes?: number;\n /**\n * The Amazon Resource Name (ARN) of the CMK to use when encrypting log data.\n */\n kmsKeyId?: string;\n}\n\nexport interface DescribeLogGroupsResponse {\n /**\n * The log groups.\n */\n logGroups?: LogGroup[];\n nextToken?: string;\n}\n\nexport interface GetLogGroupFieldsRequest {\n /**\n * The name of the log group to search.\n */\n logGroupName: string;\n /**\n * The time to set as the center of the query. If you specify time, the 8 minutes before and 8 minutes after this time are searched. If you omit time, the past 15 minutes are queried. The time value is specified as epoch time, the number of seconds since January 1, 1970, 00:00:00 UTC.\n */\n time?: number;\n region: string;\n}\n\nexport interface LogGroupField {\n /**\n * The name of a log field.\n */\n name?: string;\n /**\n * The percentage of log events queried that contained the field.\n */\n percent?: number;\n}\n\nexport interface GetLogGroupFieldsResponse {\n /**\n * The array of fields found in the query. Each object in the array contains the name of the field, along with the percentage of time it appeared in the log events that were queried.\n */\n logGroupFields?: LogGroupField[];\n}\n\nexport interface StartQueryRequest {\n /**\n * The log group on which to perform the query. A StartQuery operation must include a logGroupNames or a logGroupName parameter, but not both.\n */\n logGroupName?: string;\n /**\n * The list of log groups to be queried. You can include up to 20 log groups. A StartQuery operation must include a logGroupNames or a logGroupName parameter, but not both.\n */\n logGroupNames?: string[];\n /**\n * The query string to use. For more information, see CloudWatch Logs Insights Query Syntax.\n */\n queryString: string;\n /**\n * The maximum number of log events to return in the query. If the query string uses the fields command, only the specified fields and their values are returned. The default is 1000.\n */\n limit?: number;\n refId: string;\n region: string;\n}\nexport interface StartQueryResponse {\n /**\n * The unique ID of the query.\n */\n queryId?: string;\n}\n\nexport interface MetricRequest {\n from: string;\n to: string;\n queries: MetricQuery[];\n debug?: boolean;\n}\n\nexport interface MetricQuery {\n [key: string]: any;\n datasource?: DataSourceRef;\n refId?: string;\n maxDataPoints?: number;\n intervalMs?: number;\n}\n\nexport enum VariableQueryType {\n Regions = 'regions',\n Namespaces = 'namespaces',\n Metrics = 'metrics',\n DimensionKeys = 'dimensionKeys',\n DimensionValues = 'dimensionValues',\n EBSVolumeIDs = 'ebsVolumeIDs',\n EC2InstanceAttributes = 'ec2InstanceAttributes',\n ResourceArns = 'resourceARNs',\n Statistics = 'statistics',\n LogGroups = 'logGroups',\n}\n\nexport interface OldVariableQuery extends DataQuery {\n queryType: VariableQueryType;\n namespace: string;\n region: string;\n metricName: string;\n dimensionKey: string;\n dimensionFilters: string;\n ec2Filters: string;\n instanceID: string;\n attributeName: string;\n resourceType: string;\n tags: string;\n}\n\nexport interface VariableQuery extends DataQuery {\n queryType: VariableQueryType;\n namespace: string;\n region: string;\n metricName: string;\n dimensionKey: string;\n dimensionFilters?: Dimensions;\n ec2Filters?: MultiFilters;\n instanceID: string;\n attributeName: string;\n resourceType: string;\n tags?: MultiFilters;\n logGroupPrefix?: string;\n}\n\nexport interface LegacyAnnotationQuery extends MetricStat, DataQuery {\n actionPrefix: string;\n alarmNamePrefix: string;\n alias: string;\n builtIn: number;\n datasource: any;\n dimensions: Dimensions;\n enable: boolean;\n expression: string;\n hide: boolean;\n iconColor: string;\n id: string;\n matchExact: boolean;\n metricName: string;\n name: string;\n namespace: string;\n period: string;\n prefixMatching: boolean;\n region: string;\n statistic: string;\n statistics: string[];\n target: {\n limit: number;\n matchAny: boolean;\n tags: any[];\n type: string;\n };\n type: string;\n}\n","import { DataFrame, DataQuery, DataQueryError } from '@grafana/data';\n\nexport const SHARED_DASHBOARD_QUERY = '-- Dashboard --';\n\nexport interface DashboardQuery extends DataQuery {\n panelId?: number;\n}\n\nexport type ResultInfo = {\n img: string; // The Datasource\n refId: string;\n query: string; // As text\n data: DataFrame[];\n error?: DataQueryError;\n};\n","import { Observable } from 'rxjs';\n\nimport {\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n DataSourceRef,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n} from '@grafana/data';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { QueryRunnerOptions } from 'app/features/query/state/PanelQueryRunner';\n\nimport { DashboardQuery, SHARED_DASHBOARD_QUERY } from './types';\n\nexport function isSharedDashboardQuery(datasource: string | DataSourceRef | DataSourceApi | null) {\n if (!datasource) {\n // default datasource\n return false;\n }\n\n if (typeof datasource === 'string') {\n return datasource === SHARED_DASHBOARD_QUERY;\n }\n\n if ('meta' in datasource) {\n return datasource.meta.name === SHARED_DASHBOARD_QUERY || datasource.uid === SHARED_DASHBOARD_QUERY;\n }\n\n return datasource.uid === SHARED_DASHBOARD_QUERY;\n}\n\nexport function runSharedRequest(options: QueryRunnerOptions): Observable<PanelData> {\n return new Observable<PanelData>((subscriber) => {\n const dashboard = getDashboardSrv().getCurrent();\n const listenToPanelId = getPanelIdFromQuery(options.queries);\n\n if (!listenToPanelId) {\n subscriber.next(getQueryError('Missing panel reference ID'));\n return undefined;\n }\n\n const listenToPanel = dashboard?.getPanelById(listenToPanelId);\n\n if (!listenToPanel) {\n subscriber.next(getQueryError('Unknown Panel: ' + listenToPanelId));\n return undefined;\n }\n\n const listenToRunner = listenToPanel.getQueryRunner();\n const subscription = listenToRunner.getData({ withTransforms: false, withFieldConfig: false }).subscribe({\n next: (data: PanelData) => {\n subscriber.next(data);\n },\n });\n\n // If we are in fullscreen the other panel will not execute any queries\n // So we have to trigger it from here\n if (!listenToPanel.isInView) {\n const { datasource, targets } = listenToPanel;\n const modified = {\n ...options,\n datasource,\n panelId: listenToPanelId,\n queries: targets,\n };\n listenToRunner.run(modified);\n }\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n\nfunction getPanelIdFromQuery(queries: DataQuery[]): number | undefined {\n if (!queries || !queries.length) {\n return undefined;\n }\n return (queries[0] as DashboardQuery).panelId;\n}\n\nfunction getQueryError(msg: string): PanelData {\n return {\n state: LoadingState.Error,\n series: [],\n request: {} as DataQueryRequest,\n error: { message: msg },\n timeRange: getDefaultTimeRange(),\n };\n}\n","import { css } from '@emotion/css';\nimport React, { ReactElement } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, useStyles } from '@grafana/ui';\n\nimport { ResultInfo } from './types';\n\ninterface Props {\n editURL: string;\n target: ResultInfo;\n}\n\nexport function DashboardQueryRow({ editURL, target }: Props): ReactElement {\n const style = useStyles(getStyles);\n\n return (\n <div className={style.queryEditorRowHeader}>\n <div>\n <img src={target.img} width={16} className={style.logo} />\n <span>{`${target.refId}:`}</span>\n </div>\n <div>\n <a href={editURL}>\n {target.query}\n \n <Icon name=\"external-link-alt\" />\n </a>\n </div>\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n logo: css`\n label: logo;\n margin-right: ${theme.spacing.sm};\n `,\n queryEditorRowHeader: css`\n label: queryEditorRowHeader;\n display: flex;\n padding: 4px 8px;\n flex-flow: row wrap;\n background: ${theme.colors.bg2};\n align-items: center;\n `,\n };\n}\n","import { css } from '@emotion/css';\nimport { useId } from '@react-aria/utils';\nimport pluralize from 'pluralize';\nimport React, { useCallback, useMemo } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { DataQuery, GrafanaTheme2, PanelData, SelectableValue } from '@grafana/data';\nimport { InlineField, Select, useStyles2, VerticalGroup } from '@grafana/ui';\nimport config from 'app/core/config';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { filterPanelDataToQuery } from 'app/features/query/components/QueryEditorRow';\n\nimport { DashboardQueryRow } from './DashboardQueryRow';\nimport { DashboardQuery, ResultInfo, SHARED_DASHBOARD_QUERY } from './types';\n\nfunction getQueryDisplayText(query: DataQuery): string {\n return JSON.stringify(query);\n}\n\ninterface Props {\n queries: DataQuery[];\n panelData: PanelData;\n onChange: (queries: DataQuery[]) => void;\n onRunQueries: () => void;\n}\n\nexport function DashboardQueryEditor({ panelData, queries, onChange, onRunQueries }: Props) {\n const { value: defaultDatasource } = useAsync(() => getDatasourceSrv().get());\n const { value: results, loading: loadingResults } = useAsync(async (): Promise<ResultInfo[]> => {\n const query = queries[0] as DashboardQuery;\n const dashboard = getDashboardSrv().getCurrent();\n const panel = dashboard?.getPanelById(query.panelId ?? -124134);\n\n if (!panel) {\n return [];\n }\n\n const mainDS = await getDatasourceSrv().get(panel.datasource);\n return Promise.all(\n panel.targets.map(async (query) => {\n const ds = query.datasource ? await getDatasourceSrv().get(query.datasource) : mainDS;\n const fmt = ds.getQueryDisplayText || getQueryDisplayText;\n\n const queryData = filterPanelDataToQuery(panelData, query.refId) ?? panelData;\n\n return {\n refId: query.refId,\n query: fmt(query),\n img: ds.meta.info.logos.small,\n data: queryData.series,\n error: queryData.error,\n };\n })\n );\n }, [panelData, queries]);\n\n const query = queries[0] as DashboardQuery;\n\n const onPanelChanged = useCallback(\n (id: number) => {\n onChange([\n {\n ...query,\n panelId: id,\n } as DashboardQuery,\n ]);\n onRunQueries();\n },\n [query, onChange, onRunQueries]\n );\n\n const getPanelDescription = useCallback(\n (panel: PanelModel): string => {\n const datasource = panel.datasource ?? defaultDatasource;\n const dsname = getDatasourceSrv().getInstanceSettings(datasource)?.name;\n const queryCount = panel.targets.length;\n return `${queryCount} ${pluralize('query', queryCount)} to ${dsname}`;\n },\n [defaultDatasource]\n );\n\n const dashboard = getDashboardSrv().getCurrent();\n const panels: Array<SelectableValue<number>> = useMemo(\n () =>\n dashboard?.panels\n .filter(\n (panel) =>\n config.panels[panel.type] &&\n panel.targets &&\n panel.id !== dashboard.panelInEdit?.id &&\n panel.datasource?.uid !== SHARED_DASHBOARD_QUERY\n )\n .map((panel) => ({\n value: panel.id,\n label: panel.title ?? 'Panel ' + panel.id,\n description: getPanelDescription(panel),\n imgUrl: config.panels[panel.type].info.logos.small,\n })) ?? [],\n [dashboard, getPanelDescription]\n );\n\n const styles = useStyles2(getStyles);\n const selectId = useId();\n\n if (!dashboard) {\n return null;\n }\n\n if (panels.length < 1) {\n return (\n <p className={styles.noQueriesText}>\n This dashboard does not have any other panels. Add queries to other panels and try again.\n </p>\n );\n }\n\n const selected = panels.find((panel) => panel.value === query.panelId);\n // Same as current URL, but different panelId\n const editURL = `d/${dashboard.uid}/${dashboard.title}?&editPanel=${query.panelId}`;\n\n return (\n <>\n <InlineField label=\"Use results from panel\" grow>\n <Select\n inputId={selectId}\n placeholder=\"Choose panel\"\n isSearchable={true}\n options={panels}\n value={selected}\n onChange={(item) => onPanelChanged(item.value!)}\n />\n </InlineField>\n\n {results && !loadingResults && (\n <div className={styles.results}>\n {query.panelId && (\n <VerticalGroup spacing=\"sm\">\n {results.map((target, i) => (\n <DashboardQueryRow editURL={editURL} target={target} key={`DashboardQueryRow-${i}`} />\n ))}\n </VerticalGroup>\n )}\n </div>\n )}\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n results: css({\n padding: theme.spacing(2),\n }),\n noQueriesText: css({\n padding: theme.spacing(1.25),\n }),\n };\n}\n","import { isValidElement } from 'react';\n\nimport { AzureMonitorErrorish } from '../types';\n\nexport function messageFromElement(error: AzureMonitorErrorish): AzureMonitorErrorish | undefined {\n if (isValidElement(error)) {\n return error;\n } else {\n return messageFromError(error);\n }\n}\n\nexport default function messageFromError(error: any): string | undefined {\n if (!error || typeof error !== 'object') {\n return undefined;\n }\n\n if (typeof error.message === 'string') {\n return error.message;\n }\n\n if (typeof error.data?.error?.message === 'string') {\n return error.data.error.message;\n }\n\n // Copied from the old Angular code - this might be checking for errors in places\n // that the new code just doesnt use.\n // As new error objects are discovered they should be added to the above code, rather\n // than below\n const maybeAMessage =\n error.error?.data?.error?.innererror?.innererror?.message ||\n error.error?.data?.error?.innererror?.message ||\n error.error?.data?.error?.message ||\n error.error?.data?.message ||\n error.data?.message ||\n error;\n\n if (typeof maybeAMessage === 'string') {\n return maybeAMessage;\n } else if (maybeAMessage && maybeAMessage.toString) {\n return maybeAMessage.toString();\n }\n\n return undefined;\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Field, FieldSet, Select, Switch } from '@grafana/ui';\nimport { TagFilter } from 'app/core/components/TagFilter/TagFilter';\nimport { getAnnotationTags } from 'app/features/annotations/api';\n\nimport { GrafanaAnnotationQuery, GrafanaAnnotationType, GrafanaQuery } from '../types';\n\nconst matchTooltipContent = 'Enabling this returns annotations that match any of the tags specified below';\n\nconst tagsTooltipContent = (\n <div>Specify a list of tags to match. To specify a key and value tag use `key:value` syntax.</div>\n);\n\nconst annotationTypes = [\n {\n label: 'Dashboard',\n value: GrafanaAnnotationType.Dashboard,\n description: 'Query for events created on this dashboard and show them in the panels where they where created',\n },\n {\n label: 'Tags',\n value: GrafanaAnnotationType.Tags,\n description: 'This will fetch any annotation events that match the tags filter',\n },\n];\n\nconst limitOptions = [10, 50, 100, 200, 300, 500, 1000, 2000].map((limit) => ({\n label: String(limit),\n value: limit,\n}));\n\ninterface Props {\n query: GrafanaQuery;\n onChange: (newValue: GrafanaAnnotationQuery) => void;\n}\n\nexport default function AnnotationQueryEditor({ query, onChange }: Props) {\n const annotationQuery = query as GrafanaAnnotationQuery;\n const { limit, matchAny, tags, type } = annotationQuery;\n const styles = getStyles();\n\n const onFilterByChange = (newValue: SelectableValue<GrafanaAnnotationType>) =>\n onChange({\n ...annotationQuery,\n type: newValue.value!,\n });\n\n const onMaxLimitChange = (newValue: SelectableValue<number>) =>\n onChange({\n ...annotationQuery,\n limit: newValue.value!,\n });\n\n const onMatchAnyChange = (newValue: React.ChangeEvent<HTMLInputElement>) =>\n onChange({\n ...annotationQuery,\n matchAny: newValue.target.checked,\n });\n\n const onTagsChange = (tags: string[]) =>\n onChange({\n ...annotationQuery,\n tags,\n });\n\n return (\n <FieldSet className={styles.container}>\n <Field label=\"Filter by\">\n <Select\n inputId=\"grafana-annotations__filter-by\"\n options={annotationTypes}\n value={type}\n onChange={onFilterByChange}\n />\n </Field>\n <Field label=\"Max limit\">\n <Select\n inputId=\"grafana-annotations__limit\"\n width={16}\n options={limitOptions}\n value={limit}\n onChange={onMaxLimitChange}\n />\n </Field>\n {type === GrafanaAnnotationType.Tags && (\n <>\n <Field label=\"Match any\" description={matchTooltipContent}>\n <Switch id=\"grafana-annotations__match-any\" value={matchAny} onChange={onMatchAnyChange} />\n </Field>\n <Field label=\"Tags\" description={tagsTooltipContent}>\n <TagFilter\n allowCustomValue\n inputId=\"grafana-annotations__tags\"\n onChange={onTagsChange}\n tagOptions={getAnnotationTags}\n tags={tags ?? []}\n />\n </Field>\n </>\n )}\n </FieldSet>\n );\n}\n\nconst getStyles = () => {\n return {\n container: css`\n max-width: 600px;\n `,\n };\n};\n","import { isString } from 'lodash';\nimport { from, merge, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport {\n AnnotationQuery,\n AnnotationQueryRequest,\n DataFrameView,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceInstanceSettings,\n DataSourceRef,\n isValidLiveChannelAddress,\n MutableDataFrame,\n parseLiveChannelAddress,\n toDataFrame,\n} from '@grafana/data';\nimport {\n DataSourceWithBackend,\n getBackendSrv,\n getDataSourceSrv,\n getGrafanaLiveSrv,\n getTemplateSrv,\n StreamingFrameOptions,\n} from '@grafana/runtime';\nimport { migrateDatasourceNameToRef } from 'app/features/dashboard/state/DashboardMigrator';\n\nimport { getDashboardSrv } from '../../../features/dashboard/services/DashboardSrv';\n\nimport AnnotationQueryEditor from './components/AnnotationQueryEditor';\nimport { GrafanaAnnotationQuery, GrafanaAnnotationType, GrafanaQuery, GrafanaQueryType } from './types';\n\nlet counter = 100;\n\nexport class GrafanaDatasource extends DataSourceWithBackend<GrafanaQuery> {\n constructor(instanceSettings: DataSourceInstanceSettings) {\n super(instanceSettings);\n this.annotations = {\n QueryEditor: AnnotationQueryEditor,\n prepareAnnotation(json: any): AnnotationQuery<GrafanaAnnotationQuery> {\n // Previously, these properties lived outside of target\n // This should handle migrating them\n json.target = json.target ?? {\n type: json.type ?? GrafanaAnnotationType.Dashboard,\n limit: json.limit ?? 100,\n tags: json.tags ?? [],\n matchAny: json.matchAny ?? false,\n }; // using spread syntax caused an infinite loop in StandardAnnotationQueryEditor\n return json;\n },\n prepareQuery(anno: AnnotationQuery<GrafanaAnnotationQuery>): GrafanaQuery {\n let datasource: DataSourceRef | undefined | null = undefined;\n if (isString(anno.datasource)) {\n const ref = migrateDatasourceNameToRef(anno.datasource, { returnDefaultAsNull: false });\n if (ref) {\n datasource = ref;\n }\n } else {\n datasource = anno.datasource as DataSourceRef;\n }\n\n return { ...anno, refId: anno.name, queryType: GrafanaQueryType.Annotations, datasource };\n },\n };\n }\n\n query(request: DataQueryRequest<GrafanaQuery>): Observable<DataQueryResponse> {\n const results: Array<Observable<DataQueryResponse>> = [];\n const targets: GrafanaQuery[] = [];\n const templateSrv = getTemplateSrv();\n for (const target of request.targets) {\n if (target.queryType === GrafanaQueryType.Annotations) {\n return from(\n this.getAnnotations({\n range: request.range,\n rangeRaw: request.range.raw,\n annotation: target as unknown as AnnotationQuery<GrafanaAnnotationQuery>,\n dashboard: getDashboardSrv().getCurrent(),\n })\n );\n }\n if (target.hide) {\n continue;\n }\n if (target.queryType === GrafanaQueryType.LiveMeasurements) {\n let channel = templateSrv.replace(target.channel, request.scopedVars);\n const { filter } = target;\n\n const addr = parseLiveChannelAddress(channel);\n if (!isValidLiveChannelAddress(addr)) {\n continue;\n }\n const buffer: Partial<StreamingFrameOptions> = {\n maxLength: request.maxDataPoints ?? 500,\n };\n if (target.buffer) {\n buffer.maxDelta = target.buffer;\n buffer.maxLength = buffer.maxLength! * 2; //??\n } else if (request.rangeRaw?.to === 'now') {\n buffer.maxDelta = request.range.to.valueOf() - request.range.from.valueOf();\n }\n\n results.push(\n getGrafanaLiveSrv().getDataStream({\n key: `${request.requestId}.${counter++}`,\n addr: addr!,\n filter,\n buffer,\n })\n );\n } else {\n if (!target.queryType) {\n target.queryType = GrafanaQueryType.RandomWalk;\n }\n targets.push(target);\n }\n }\n\n if (targets.length) {\n results.push(\n super.query({\n ...request,\n targets,\n })\n );\n }\n\n if (results.length) {\n // With a single query just return the results\n if (results.length === 1) {\n return results[0];\n }\n return merge(...results);\n }\n return of(); // nothing\n }\n\n listFiles(path: string): Observable<DataFrameView<FileElement>> {\n return this.query({\n targets: [\n {\n refId: 'A',\n queryType: GrafanaQueryType.List,\n path,\n },\n ],\n } as any).pipe(\n map((v) => {\n const frame = v.data[0] ?? new MutableDataFrame();\n return new DataFrameView<FileElement>(frame);\n })\n );\n }\n\n metricFindQuery(options: any) {\n return Promise.resolve([]);\n }\n\n async getAnnotations(options: AnnotationQueryRequest<GrafanaQuery>): Promise<DataQueryResponse> {\n const templateSrv = getTemplateSrv();\n const annotation = options.annotation as unknown as AnnotationQuery<GrafanaAnnotationQuery>;\n const target = annotation.target!;\n const params: any = {\n from: options.range.from.valueOf(),\n to: options.range.to.valueOf(),\n limit: target.limit,\n tags: target.tags,\n matchAny: target.matchAny,\n };\n\n if (target.type === GrafanaAnnotationType.Dashboard) {\n // if no dashboard id yet return\n if (!options.dashboard.uid) {\n return Promise.resolve({ data: [] });\n }\n // filter by dashboard id\n params.dashboardUID = options.dashboard.uid;\n // remove tags filter if any\n delete params.tags;\n } else {\n // require at least one tag\n if (!Array.isArray(target.tags) || target.tags.length === 0) {\n return Promise.resolve({ data: [] });\n }\n const delimiter = '__delimiter__';\n const tags = [];\n for (const t of params.tags) {\n const renderedValues = templateSrv.replace(t, {}, (value: any) => {\n if (typeof value === 'string') {\n return value;\n }\n\n return value.join(delimiter);\n });\n for (const tt of renderedValues.split(delimiter)) {\n tags.push(tt);\n }\n }\n params.tags = tags;\n }\n\n const annotations = await getBackendSrv().get(\n '/api/annotations',\n params,\n `grafana-data-source-annotations-${annotation.name}-${options.dashboard?.uid}`\n );\n return { data: [toDataFrame(annotations)] };\n }\n\n testDatasource() {\n return Promise.resolve();\n }\n}\n\n/** Get the GrafanaDatasource instance */\nexport async function getGrafanaDatasource() {\n return (await getDataSourceSrv().get('-- Grafana --')) as GrafanaDatasource;\n}\n\nexport interface FileElement {\n name: string;\n ['media-type']: string;\n}\n","import { DataQuery } from '@grafana/data';\nimport { LiveDataFilter } from '@grafana/runtime';\nimport { SearchQuery } from 'app/features/search/service';\n\n//----------------------------------------------\n// Query\n//----------------------------------------------\n\nexport enum GrafanaQueryType {\n LiveMeasurements = 'measurements',\n Annotations = 'annotations',\n\n // backend\n RandomWalk = 'randomWalk',\n List = 'list',\n Read = 'read',\n Search = 'search',\n}\n\nexport interface GrafanaQuery extends DataQuery {\n queryType: GrafanaQueryType; // RandomWalk by default\n channel?: string;\n filter?: LiveDataFilter;\n buffer?: number;\n path?: string; // for list and read\n search?: SearchQuery;\n}\n\nexport const defaultQuery: GrafanaQuery = {\n refId: 'A',\n queryType: GrafanaQueryType.RandomWalk,\n};\n\n//----------------------------------------------\n// Annotations\n//----------------------------------------------\n\nexport enum GrafanaAnnotationType {\n Dashboard = 'dashboard',\n Tags = 'tags',\n}\n\nexport interface GrafanaAnnotationQuery extends GrafanaQuery {\n type: GrafanaAnnotationType; // tags\n limit: number; // 100\n tags?: string[];\n matchAny?: boolean; // By default Grafana only shows annotations that match all tags in the query. Enabling this returns annotations that match any of the tags in the query.\n}\n","import { uniqueId } from 'lodash';\nimport { useRef } from 'react';\n\nexport function useUniqueId(): string {\n // we need to lazy-init this ref.\n // otherwise we would call `uniqueId`\n // on every render. unfortunately\n // useRef does not have lazy-init builtin,\n // like useState does. we do it manually.\n const idRefLazy = useRef<string | null>(null);\n\n if (idRefLazy.current == null) {\n idRefLazy.current = uniqueId();\n }\n\n return idRefLazy.current;\n}\n","import { cloneDeep, groupBy } from 'lodash';\nimport { forkJoin, from, Observable, of, OperatorFunction } from 'rxjs';\nimport { catchError, map, mergeAll, mergeMap, reduce, toArray } from 'rxjs/operators';\n\nimport {\n DataQuery,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceInstanceSettings,\n LoadingState,\n} from '@grafana/data';\nimport { getDataSourceSrv, toDataQueryError } from '@grafana/runtime';\n\nexport const MIXED_DATASOURCE_NAME = '-- Mixed --';\n\nexport interface BatchedQueries {\n datasource: Promise<DataSourceApi>;\n targets: DataQuery[];\n}\n\nexport class MixedDatasource extends DataSourceApi<DataQuery> {\n constructor(instanceSettings: DataSourceInstanceSettings) {\n super(instanceSettings);\n }\n\n query(request: DataQueryRequest<DataQuery>): Observable<DataQueryResponse> {\n // Remove any invalid queries\n const queries = request.targets.filter((t) => {\n return t.datasource?.uid !== MIXED_DATASOURCE_NAME;\n });\n\n if (!queries.length) {\n return of({ data: [] } as DataQueryResponse); // nothing\n }\n\n // Build groups of queries to run in parallel\n const sets: { [key: string]: DataQuery[] } = groupBy(queries, 'datasource.uid');\n const mixed: BatchedQueries[] = [];\n\n for (const key in sets) {\n const targets = sets[key];\n\n mixed.push({\n datasource: getDataSourceSrv().get(targets[0].datasource, request.scopedVars),\n targets,\n });\n }\n\n // Missing UIDs?\n if (!mixed.length) {\n return of({ data: [] } as DataQueryResponse); // nothing\n }\n\n return this.batchQueries(mixed, request);\n }\n\n batchQueries(mixed: BatchedQueries[], request: DataQueryRequest<DataQuery>): Observable<DataQueryResponse> {\n const runningQueries = mixed.filter(this.isQueryable).map((query, i) =>\n from(query.datasource).pipe(\n mergeMap((api: DataSourceApi) => {\n const dsRequest = cloneDeep(request);\n dsRequest.requestId = `mixed-${i}-${dsRequest.requestId || ''}`;\n dsRequest.targets = query.targets;\n\n return from(api.query(dsRequest)).pipe(\n map((response) => {\n return {\n ...response,\n data: response.data || [],\n state: LoadingState.Loading,\n key: `mixed-${i}-${response.key || ''}`,\n } as DataQueryResponse;\n }),\n toArray(),\n catchError((err) => {\n err = toDataQueryError(err);\n err.message = `${api.name}: ${err.message}`;\n\n return of<DataQueryResponse[]>([\n {\n data: [],\n state: LoadingState.Error,\n error: err,\n key: `mixed-${i}-${dsRequest.requestId || ''}`,\n },\n ]);\n })\n );\n })\n )\n );\n\n return forkJoin(runningQueries).pipe(flattenResponses(), map(this.finalizeResponses), mergeAll());\n }\n\n testDatasource() {\n return Promise.resolve({});\n }\n\n private isQueryable(query: BatchedQueries): boolean {\n return query && Array.isArray(query.targets) && query.targets.length > 0;\n }\n\n private finalizeResponses(responses: DataQueryResponse[]): DataQueryResponse[] {\n const { length } = responses;\n\n if (length === 0) {\n return responses;\n }\n\n const error = responses.find((response) => response.state === LoadingState.Error);\n if (error) {\n responses.push(error); // adds the first found error entry so error shows up in the panel\n } else {\n responses[length - 1].state = LoadingState.Done;\n }\n\n return responses;\n }\n}\n\nfunction flattenResponses(): OperatorFunction<DataQueryResponse[][], DataQueryResponse[]> {\n return reduce((all: DataQueryResponse[], current) => {\n return current.reduce((innerAll, innerCurrent) => {\n innerAll.push.apply(innerAll, innerCurrent);\n return innerAll;\n }, all);\n }, []);\n}\n","import { Alert } from 'app/types/unified-alerting';\n\nexport enum SortOrder {\n AlphaAsc = 1,\n AlphaDesc,\n Importance,\n TimeAsc,\n TimeDesc,\n}\n\nexport enum ShowOption {\n Current = 'current',\n RecentChanges = 'changes',\n}\n\nexport enum GroupMode {\n Default = 'default',\n Custom = 'custom',\n}\n\nexport interface AlertListOptions {\n showOptions: ShowOption;\n maxItems: number;\n sortOrder: SortOrder;\n dashboardAlerts: boolean;\n alertName: string;\n dashboardTitle: string;\n tags: string[];\n stateFilter: {\n ok: boolean;\n paused: boolean;\n no_data: boolean;\n execution_error: boolean;\n alerting: boolean;\n pending: boolean;\n };\n folderId: number;\n}\n\ninterface StateFilter {\n firing: boolean;\n pending: boolean;\n inactive?: boolean; // backwards compat\n noData: boolean;\n normal: boolean;\n error: boolean;\n}\n\nexport interface UnifiedAlertListOptions {\n maxItems: number;\n sortOrder: SortOrder;\n dashboardAlerts: boolean;\n groupMode: GroupMode;\n groupBy: string[];\n alertName: string;\n showInstances: boolean;\n folder: { id: number; title: string };\n stateFilter: StateFilter;\n alertInstanceLabelFilter: string;\n datasource: string;\n}\n\nexport type GroupedRules = Map<string, Alert[]>;\n","import { roundDecimals } from '@grafana/data';\n\nexport const SPACE_BETWEEN = 1;\nexport const SPACE_AROUND = 2;\nexport const SPACE_EVENLY = 3;\n\nconst coord = (i: number, offs: number, iwid: number, gap: number) => roundDecimals(offs + i * (iwid + gap), 6);\n\nexport type Each = (idx: number, offPct: number, dimPct: number) => void;\n\n/**\n * @internal\n */\nexport function distribute(numItems: number, sizeFactor: number, justify: number, onlyIdx: number | null, each: Each) {\n let space = 1 - sizeFactor;\n\n /* eslint-disable no-multi-spaces */\n // prettier-ignore\n let gap = (\n justify === SPACE_BETWEEN ? space / (numItems - 1) :\n justify === SPACE_AROUND ? space / (numItems ) :\n justify === SPACE_EVENLY ? space / (numItems + 1) : 0\n );\n\n if (isNaN(gap) || gap === Infinity) {\n gap = 0;\n }\n\n // prettier-ignore\n let offs = (\n justify === SPACE_BETWEEN ? 0 :\n justify === SPACE_AROUND ? gap / 2 :\n justify === SPACE_EVENLY ? gap : 0\n );\n /* eslint-enable */\n\n let iwid = sizeFactor / numItems;\n let _iwid = roundDecimals(iwid, 6);\n\n if (onlyIdx == null) {\n for (let i = 0; i < numItems; i++) {\n each(i, coord(i, offs, iwid, gap), _iwid);\n }\n } else {\n each(onlyIdx, coord(onlyIdx, offs, iwid, gap), _iwid);\n }\n}\n","const MAX_OBJECTS = 10;\nconst MAX_LEVELS = 4;\n\nexport type Quads = [Quadtree, Quadtree, Quadtree, Quadtree];\nexport type Rect = { x: number; y: number; w: number; h: number; [_: string]: any };\n\n/**\n * @internal\n */\nexport function pointWithin(px: number, py: number, rlft: number, rtop: number, rrgt: number, rbtm: number) {\n return px >= rlft && px <= rrgt && py >= rtop && py <= rbtm;\n}\n\n/**\n * @internal\n *\n * Determines if r2 is intersected by r1.\n */\nexport function intersects(r1: Rect, r2: Rect) {\n return r1.x <= r2.x + r2.w && r1.x + r1.w >= r2.x && r1.y + r1.h >= r2.y && r1.y <= r2.y + r2.h;\n}\n\n/**\n * @internal\n */\nexport class Quadtree {\n o: Rect[];\n q: Quads | null;\n\n constructor(public x: number, public y: number, public w: number, public h: number, public l: number = 0) {\n this.o = [];\n this.q = null;\n }\n\n split() {\n let t = this,\n x = t.x,\n y = t.y,\n w = t.w / 2,\n h = t.h / 2,\n l = t.l + 1;\n\n t.q = [\n // top right\n new Quadtree(x + w, y, w, h, l),\n // top left\n new Quadtree(x, y, w, h, l),\n // bottom left\n new Quadtree(x, y + h, w, h, l),\n // bottom right\n new Quadtree(x + w, y + h, w, h, l),\n ];\n }\n\n // invokes callback with index of each overlapping quad\n quads(x: number, y: number, w: number, h: number, cb: (q: Quadtree) => void) {\n let t = this,\n q = t.q!,\n hzMid = t.x + t.w / 2,\n vtMid = t.y + t.h / 2,\n startIsNorth = y < vtMid,\n startIsWest = x < hzMid,\n endIsEast = x + w > hzMid,\n endIsSouth = y + h > vtMid;\n\n // top-right quad\n startIsNorth && endIsEast && cb(q[0]);\n // top-left quad\n startIsWest && startIsNorth && cb(q[1]);\n // bottom-left quad\n startIsWest && endIsSouth && cb(q[2]);\n // bottom-right quad\n endIsEast && endIsSouth && cb(q[3]);\n }\n\n add(o: Rect) {\n let t = this;\n\n if (t.q != null) {\n t.quads(o.x, o.y, o.w, o.h, (q) => {\n q.add(o);\n });\n } else {\n let os = t.o;\n\n os.push(o);\n\n if (os.length > MAX_OBJECTS && t.l < MAX_LEVELS) {\n t.split();\n\n for (let i = 0; i < os.length; i++) {\n let oi = os[i];\n\n t.quads(oi.x, oi.y, oi.w, oi.h, (q) => {\n q.add(oi);\n });\n }\n\n t.o.length = 0;\n }\n }\n }\n\n get(x: number, y: number, w: number, h: number, cb: (o: Rect) => void) {\n let t = this;\n let os = t.o;\n\n for (let i = 0; i < os.length; i++) {\n cb(os[i]);\n }\n\n if (t.q != null) {\n t.quads(x, y, w, h, (q) => {\n q.get(x, y, w, h, cb);\n });\n }\n }\n\n clear() {\n this.o.length = 0;\n this.q = null;\n }\n}\n","import { isNumber } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport {\n DisplayValueAlignmentFactors,\n FieldDisplay,\n getDisplayValueAlignmentFactors,\n getFieldDisplayValues,\n PanelProps,\n FieldConfig,\n DisplayProcessor,\n DisplayValue,\n VizOrientation,\n} from '@grafana/data';\nimport { BarGauge, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\nimport { config } from 'app/core/config';\n\nimport { PanelOptions } from './models.gen';\n\nexport class BarGaugePanel extends PureComponent<BarGaugePanelProps> {\n renderComponent = (\n valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>,\n menuProps: DataLinksContextMenuApi\n ): JSX.Element => {\n const { options, fieldConfig } = this.props;\n const { value, alignmentFactors, orientation, width, height, count } = valueProps;\n const { field, display, view, colIndex } = value;\n const { openMenu, targetClassName } = menuProps;\n\n let processor: DisplayProcessor | undefined = undefined;\n if (view && isNumber(colIndex)) {\n processor = view.getFieldDisplayProcessor(colIndex);\n }\n\n return (\n <BarGauge\n value={clearNameForSingleSeries(count, fieldConfig.defaults, display)}\n width={width}\n height={height}\n orientation={orientation}\n field={field}\n text={options.text}\n display={processor}\n theme={config.theme2}\n itemSpacing={this.getItemSpacing()}\n displayMode={options.displayMode}\n onClick={openMenu}\n className={targetClassName}\n alignmentFactors={count > 1 ? alignmentFactors : undefined}\n showUnfilled={options.showUnfilled}\n />\n );\n };\n\n renderValue = (valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>): JSX.Element => {\n const { value, orientation } = valueProps;\n const { hasLinks, getLinks } = value;\n\n if (hasLinks && getLinks) {\n return (\n <div style={{ width: '100%', display: orientation === VizOrientation.Vertical ? 'flex' : 'initial' }}>\n <DataLinksContextMenu links={getLinks}>{(api) => this.renderComponent(valueProps, api)}</DataLinksContextMenu>\n </div>\n );\n }\n\n return this.renderComponent(valueProps, {});\n };\n\n getValues = (): FieldDisplay[] => {\n const { data, options, replaceVariables, fieldConfig, timeZone } = this.props;\n\n return getFieldDisplayValues({\n fieldConfig,\n reduceOptions: options.reduceOptions,\n replaceVariables,\n theme: config.theme2,\n data: data.series,\n timeZone,\n });\n };\n\n getItemSpacing(): number {\n if (this.props.options.displayMode === 'lcd') {\n return 2;\n }\n\n return 10;\n }\n\n render() {\n const { height, width, options, data, renderCounter } = this.props;\n\n return (\n <VizRepeater\n source={data}\n getAlignmentFactors={getDisplayValueAlignmentFactors}\n getValues={this.getValues}\n renderValue={this.renderValue}\n renderCounter={renderCounter}\n width={width}\n height={height}\n minVizWidth={options.minVizWidth}\n minVizHeight={options.minVizHeight}\n itemSpacing={this.getItemSpacing()}\n orientation={options.orientation}\n />\n );\n }\n}\nexport type BarGaugePanelProps = PanelProps<PanelOptions>;\n\nexport function clearNameForSingleSeries(count: number, field: FieldConfig<any>, display: DisplayValue): DisplayValue {\n if (count === 1 && !field.displayName) {\n return {\n ...display,\n title: undefined,\n };\n }\n\n return display;\n}\n","import React, { PureComponent } from 'react';\n\nimport { FieldDisplay, getFieldDisplayValues, PanelProps } from '@grafana/data';\nimport { DataLinksContextMenu, Gauge, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\nimport { config } from 'app/core/config';\n\nimport { clearNameForSingleSeries } from '../bargauge/BarGaugePanel';\n\nimport { PanelOptions } from './models.gen';\n\nexport class GaugePanel extends PureComponent<PanelProps<PanelOptions>> {\n renderComponent = (\n valueProps: VizRepeaterRenderValueProps<FieldDisplay>,\n menuProps: DataLinksContextMenuApi\n ): JSX.Element => {\n const { options, fieldConfig } = this.props;\n const { width, height, count, value } = valueProps;\n const { field, display } = value;\n const { openMenu, targetClassName } = menuProps;\n\n return (\n <Gauge\n value={clearNameForSingleSeries(count, fieldConfig.defaults, display)}\n width={width}\n height={height}\n field={field}\n text={options.text}\n showThresholdLabels={options.showThresholdLabels}\n showThresholdMarkers={options.showThresholdMarkers}\n theme={config.theme}\n onClick={openMenu}\n className={targetClassName}\n />\n );\n };\n\n renderValue = (valueProps: VizRepeaterRenderValueProps<FieldDisplay>): JSX.Element => {\n const { value } = valueProps;\n const { getLinks, hasLinks } = value;\n\n if (hasLinks && getLinks) {\n return (\n <DataLinksContextMenu links={getLinks}>\n {(api) => {\n return this.renderComponent(valueProps, api);\n }}\n </DataLinksContextMenu>\n );\n }\n\n return this.renderComponent(valueProps, {});\n };\n\n getValues = (): FieldDisplay[] => {\n const { data, options, replaceVariables, fieldConfig, timeZone } = this.props;\n return getFieldDisplayValues({\n fieldConfig,\n reduceOptions: options.reduceOptions,\n replaceVariables,\n theme: config.theme2,\n data: data.series,\n timeZone,\n });\n };\n\n render() {\n const { height, width, data, renderCounter, options } = this.props;\n\n return (\n <VizRepeater\n getValues={this.getValues}\n renderValue={this.renderValue}\n width={width}\n height={height}\n source={data}\n autoGrid={true}\n renderCounter={renderCounter}\n orientation={options.orientation}\n />\n );\n }\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nimport * as ui from '@grafana/schema';\n\nexport const modelVersion = Object.freeze([0, 0]);\n\n\nexport interface PanelOptions extends ui.SingleStatBaseOptions {\n showThresholdLabels: boolean;\n showThresholdMarkers: boolean;\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n showThresholdLabels: false,\n showThresholdMarkers: true,\n};\n","import { PanelPlugin } from '@grafana/data';\nimport { commonOptionsBuilder } from '@grafana/ui';\n\nimport { addOrientationOption, addStandardDataReduceOptions } from '../stat/common';\n\nimport { gaugePanelMigrationHandler, gaugePanelChangedHandler } from './GaugeMigrations';\nimport { GaugePanel } from './GaugePanel';\nimport { PanelOptions, defaultPanelOptions } from './models.gen';\nimport { GaugeSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<PanelOptions>(GaugePanel)\n .useFieldConfig()\n .setPanelOptions((builder) => {\n addStandardDataReduceOptions(builder);\n addOrientationOption(builder);\n\n builder\n .addBooleanSwitch({\n path: 'showThresholdLabels',\n name: 'Show threshold labels',\n description: 'Render the threshold values around the gauge bar',\n defaultValue: defaultPanelOptions.showThresholdLabels,\n })\n .addBooleanSwitch({\n path: 'showThresholdMarkers',\n name: 'Show threshold markers',\n description: 'Renders the thresholds as an outer bar',\n defaultValue: defaultPanelOptions.showThresholdMarkers,\n });\n\n commonOptionsBuilder.addTextSizeOptions(builder);\n })\n .setPanelChangeHandler(gaugePanelChangedHandler)\n .setSuggestionsSupplier(new GaugeSuggestionsSupplier())\n .setMigrationHandler(gaugePanelMigrationHandler);\n","import { PanelModel } from '@grafana/data';\nimport { sharedSingleStatPanelChangedHandler, sharedSingleStatMigrationHandler } from '@grafana/ui';\n\nimport { PanelOptions } from './models.gen';\n\n// This is called when the panel first loads\nexport const gaugePanelMigrationHandler = (panel: PanelModel<PanelOptions>): Partial<PanelOptions> => {\n return sharedSingleStatMigrationHandler(panel);\n};\n\n// This is called when the panel changes from another panel\nexport const gaugePanelChangedHandler = (\n panel: PanelModel<Partial<PanelOptions>> | any,\n prevPluginId: string,\n prevOptions: any\n) => {\n // This handles most config changes\n const opts = sharedSingleStatPanelChangedHandler(panel, prevPluginId, prevOptions) as PanelOptions;\n\n // Changing from angular singlestat\n if (prevPluginId === 'singlestat' && prevOptions.angular) {\n const gauge = prevOptions.angular.gauge;\n if (gauge) {\n opts.showThresholdMarkers = gauge.thresholdMarkers;\n opts.showThresholdLabels = gauge.thresholdLabels;\n }\n }\n return opts;\n};\n","import { ThresholdsMode, VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { PanelOptions } from './models.gen';\n\nexport class GaugeSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary } = builder;\n\n if (!dataSummary.hasData || !dataSummary.hasNumberField) {\n return;\n }\n\n // for many fields / series this is probably not a good fit\n if (dataSummary.numberFieldCount >= 50) {\n return;\n }\n\n const list = builder.getListAppender<PanelOptions, {}>({\n name: SuggestionName.Gauge,\n pluginId: 'gauge',\n options: {},\n fieldConfig: {\n defaults: {\n thresholds: {\n steps: [\n { value: -Infinity, color: 'green' },\n { value: 70, color: 'orange' },\n { value: 85, color: 'red' },\n ],\n mode: ThresholdsMode.Percentage,\n },\n custom: {},\n },\n overrides: [],\n },\n cardOptions: {\n previewModifier: (s) => {\n if (s.options!.reduceOptions.values) {\n s.options!.reduceOptions.limit = 2;\n }\n },\n },\n });\n\n if (dataSummary.hasStringField && dataSummary.frameCount === 1 && dataSummary.rowCountTotal < 10) {\n list.append({\n name: SuggestionName.Gauge,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n },\n },\n });\n list.append({\n name: SuggestionName.GaugeNoThresholds,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n },\n showThresholdMarkers: false,\n },\n });\n } else {\n list.append({\n name: SuggestionName.Gauge,\n options: {\n reduceOptions: {\n values: false,\n calcs: ['lastNotNull'],\n },\n },\n });\n list.append({\n name: SuggestionName.GaugeNoThresholds,\n options: {\n reduceOptions: {\n values: false,\n calcs: ['lastNotNull'],\n },\n showThresholdMarkers: false,\n },\n });\n }\n }\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n arrayUtils,\n DataFrame,\n Field,\n formattedValueToString,\n getFieldDisplayName,\n GrafanaTheme2,\n LinkModel,\n} from '@grafana/data';\nimport { SortOrder, TooltipDisplayMode } from '@grafana/schema';\nimport { LinkButton, useStyles2, VerticalGroup } from '@grafana/ui';\n\nexport interface Props {\n data?: DataFrame; // source data\n rowIndex?: number | null; // the hover row\n columnIndex?: number | null; // the hover column\n sortOrder?: SortOrder;\n mode?: TooltipDisplayMode | null;\n}\n\nexport const DataHoverView = ({ data, rowIndex, columnIndex, sortOrder, mode }: Props) => {\n const styles = useStyles2(getStyles);\n\n if (!data || rowIndex == null) {\n return null;\n }\n\n const visibleFields = data.fields.filter((f) => !Boolean(f.config.custom?.hideFrom?.tooltip));\n\n if (visibleFields.length === 0) {\n return null;\n }\n\n const displayValues: Array<[string, any, string]> = [];\n const links: Array<LinkModel<Field>> = [];\n const linkLookup = new Set<string>();\n\n for (const f of visibleFields) {\n const v = f.values.get(rowIndex);\n const disp = f.display ? f.display(v) : { text: `${v}`, numeric: +v };\n if (f.getLinks) {\n f.getLinks({ calculatedValue: disp, valueRowIndex: rowIndex }).forEach((link) => {\n const key = `${link.title}/${link.href}`;\n if (!linkLookup.has(key)) {\n links.push(link);\n linkLookup.add(key);\n }\n });\n }\n\n displayValues.push([getFieldDisplayName(f, data), v, formattedValueToString(disp)]);\n }\n\n if (sortOrder && sortOrder !== SortOrder.None) {\n displayValues.sort((a, b) => arrayUtils.sortValues(sortOrder)(a[1], b[1]));\n }\n\n return (\n <table className={styles.infoWrap}>\n <tbody>\n {(mode === TooltipDisplayMode.Multi || mode == null) &&\n displayValues.map((v, i) => (\n <tr key={`${i}/${rowIndex}`} className={i === columnIndex ? styles.highlight : ''}>\n <th>{v[0]}:</th>\n <td>{v[2]}</td>\n </tr>\n ))}\n {mode === TooltipDisplayMode.Single && columnIndex && (\n <tr key={`${columnIndex}/${rowIndex}`}>\n <th>{displayValues[columnIndex][0]}:</th>\n <td>{displayValues[columnIndex][2]}</td>\n </tr>\n )}\n {links.length > 0 && (\n <tr>\n <td colSpan={2}>\n <VerticalGroup>\n {links.map((link, i) => (\n <LinkButton\n key={i}\n icon={'external-link-alt'}\n target={link.target}\n href={link.href}\n onClick={link.onClick}\n fill=\"text\"\n style={{ width: '100%' }}\n >\n {link.title}\n </LinkButton>\n ))}\n </VerticalGroup>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoWrap: css`\n padding: 8px;\n th {\n font-weight: ${theme.typography.fontWeightMedium};\n padding: ${theme.spacing(0.25, 2)};\n }\n `,\n highlight: css`\n background: ${theme.colors.action.hover};\n `,\n});\n","import React, { MouseEvent, memo } from 'react';\n\nimport { EdgeDatum, NodeDatum } from './types';\nimport { shortenLine } from './utils';\n\ninterface Props {\n edge: EdgeDatum;\n hovering: boolean;\n onClick: (event: MouseEvent<SVGElement>, link: EdgeDatum) => void;\n onMouseEnter: (id: string) => void;\n onMouseLeave: (id: string) => void;\n}\nexport const Edge = memo(function Edge(props: Props) {\n const { edge, onClick, onMouseEnter, onMouseLeave, hovering } = props;\n // Not great typing but after we do layout these properties are full objects not just references\n const { source, target } = edge as { source: NodeDatum; target: NodeDatum };\n\n // As the nodes have some radius we want edges to end outside of the node circle.\n const line = shortenLine(\n {\n x1: source.x!,\n y1: source.y!,\n x2: target.x!,\n y2: target.y!,\n },\n 90\n );\n\n return (\n <g\n onClick={(event) => onClick(event, edge)}\n style={{ cursor: 'pointer' }}\n aria-label={`Edge from: ${(edge.source as NodeDatum).id} to: ${(edge.target as NodeDatum).id}`}\n >\n <line\n strokeWidth={hovering ? 2 : 1}\n stroke={'#999'}\n x1={line.x1}\n y1={line.y1}\n x2={line.x2}\n y2={line.y2}\n markerEnd=\"url(#triangle)\"\n />\n <line\n stroke={'transparent'}\n x1={line.x1}\n y1={line.y1}\n x2={line.x2}\n y2={line.y2}\n strokeWidth={20}\n onMouseEnter={() => {\n onMouseEnter(edge.id);\n }}\n onMouseLeave={() => {\n onMouseLeave(edge.id);\n }}\n />\n </g>\n );\n});\n","import React from 'react';\n\n/**\n * In SVG you need to supply this kind of marker that can be then referenced from a line segment as an ending of the\n * line turning in into arrow. Needs to be included in the svg element and then referenced as markerEnd=\"url(#triangle)\"\n */\nexport function EdgeArrowMarker() {\n return (\n <defs>\n <marker\n id=\"triangle\"\n viewBox=\"0 0 10 10\"\n refX=\"8\"\n refY=\"5\"\n markerUnits=\"userSpaceOnUse\"\n markerWidth=\"10\"\n markerHeight=\"10\"\n orient=\"auto\"\n >\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#999\" />\n </marker>\n </defs>\n );\n}\n","import { css } from '@emotion/css';\nimport React, { memo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { EdgeDatum, NodeDatum } from './types';\nimport { shortenLine } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n mainGroup: css`\n pointer-events: none;\n font-size: 8px;\n `,\n\n background: css`\n fill: ${theme.components.tooltip.background};\n `,\n\n text: css`\n fill: ${theme.components.tooltip.text};\n `,\n };\n};\n\ninterface Props {\n edge: EdgeDatum;\n}\nexport const EdgeLabel = memo(function EdgeLabel(props: Props) {\n const { edge } = props;\n // Not great typing but after we do layout these properties are full objects not just references\n const { source, target } = edge as { source: NodeDatum; target: NodeDatum };\n\n // As the nodes have some radius we want edges to end outside of the node circle.\n const line = shortenLine(\n {\n x1: source.x!,\n y1: source.y!,\n x2: target.x!,\n y2: target.y!,\n },\n 90\n );\n\n const middle = {\n x: line.x1 + (line.x2 - line.x1) / 2,\n y: line.y1 + (line.y2 - line.y1) / 2,\n };\n const styles = useStyles2(getStyles);\n\n return (\n <g className={styles.mainGroup}>\n <rect className={styles.background} x={middle.x - 40} y={middle.y - 15} width=\"80\" height=\"30\" rx=\"5\" />\n <text className={styles.text} x={middle.x} y={middle.y - 5} textAnchor={'middle'}>\n {edge.mainStat}\n </text>\n <text className={styles.text} x={middle.x} y={middle.y + 10} textAnchor={'middle'}>\n {edge.secondaryStat}\n </text>\n </g>\n );\n});\n","import { css } from '@emotion/css';\nimport { identity } from 'lodash';\nimport React, { useCallback } from 'react';\n\nimport { Field, FieldColorModeId, GrafanaTheme } from '@grafana/data';\nimport { LegendDisplayMode } from '@grafana/schema';\nimport { Icon, useStyles, useTheme, VizLegend, VizLegendItem, VizLegendListItem } from '@grafana/ui';\n\nimport { Config } from './layout';\nimport { NodeDatum } from './types';\n\nfunction getStyles() {\n return {\n item: css`\n label: LegendItem;\n flex-grow: 0;\n `,\n\n legend: css`\n label: Legend;\n pointer-events: all;\n `,\n };\n}\n\ninterface Props {\n nodes: NodeDatum[];\n onSort: (sort: Config['sort']) => void;\n sort?: Config['sort'];\n sortable: boolean;\n}\n\nexport const Legend = function Legend(props: Props) {\n const { nodes, onSort, sort, sortable } = props;\n\n const theme = useTheme();\n const styles = useStyles(getStyles);\n const colorItems = getColorLegendItems(nodes, theme);\n\n const onClick = useCallback(\n (item) => {\n onSort({\n field: item.data!.field,\n ascending: item.data!.field === sort?.field ? !sort?.ascending : false,\n });\n },\n [sort, onSort]\n );\n\n return (\n <VizLegend<ItemData>\n className={styles.legend}\n displayMode={LegendDisplayMode.List}\n placement={'bottom'}\n items={colorItems}\n itemRenderer={(item) => {\n return (\n <>\n <VizLegendListItem item={item} className={styles.item} onLabelClick={sortable ? onClick : undefined} />\n {sortable &&\n (sort?.field === item.data!.field ? <Icon name={sort!.ascending ? 'arrow-up' : 'arrow-down'} /> : '')}\n </>\n );\n }}\n />\n );\n};\n\ninterface ItemData {\n field: Field;\n}\n\nfunction getColorLegendItems(nodes: NodeDatum[], theme: GrafanaTheme): Array<VizLegendItem<ItemData>> {\n if (!nodes.length) {\n return [];\n }\n const fields = [nodes[0].mainStat, nodes[0].secondaryStat].filter(identity) as Field[];\n\n const node = nodes.find((n) => n.arcSections.length > 0);\n if (node) {\n if (node.arcSections[0]!.config?.color?.mode === FieldColorModeId.Fixed) {\n // We assume in this case we have a set of fixed colors which map neatly into a basic legend.\n\n // Lets collect and deduplicate as there isn't a requirement for 0 size arc section to be defined\n fields.push(...new Set(nodes.map((n) => n.arcSections).flat()));\n }\n }\n\n if (nodes[0].color) {\n fields.push(nodes[0].color);\n }\n\n return fields.map((f) => {\n const item: VizLegendItem = {\n label: f.config.displayName || f.name,\n yAxis: 0,\n data: { field: f },\n };\n if (f.config.color?.mode === FieldColorModeId.Fixed && f.config.color?.fixedColor) {\n item.color = theme.visualization.getColorByName(f.config.color?.fixedColor || '');\n } else if (f.config.color?.mode) {\n item.gradient = f.config.color?.mode;\n }\n\n if (!(item.color || item.gradient)) {\n // Defaults to gray color\n item.color = theme.visualization.getColorByName('');\n }\n\n return item;\n });\n}\n","import { css } from '@emotion/css';\nimport React, { MouseEvent, memo } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '@grafana/ui';\n\nimport { NodesMarker } from './types';\n\nconst nodeR = 40;\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n mainGroup: css`\n cursor: pointer;\n font-size: 10px;\n `,\n\n mainCircle: css`\n fill: ${theme.colors.panelBg};\n stroke: ${theme.colors.border3};\n `,\n text: css`\n width: 50px;\n height: 50px;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n}));\n\nexport const Marker = memo(function Marker(props: {\n marker: NodesMarker;\n onClick?: (event: MouseEvent<SVGElement>, marker: NodesMarker) => void;\n}) {\n const { marker, onClick } = props;\n const { node } = marker;\n const styles = getStyles(useTheme());\n\n if (!(node.x !== undefined && node.y !== undefined)) {\n return null;\n }\n\n return (\n <g\n data-node-id={node.id}\n className={styles.mainGroup}\n onClick={(event) => {\n onClick?.(event, marker);\n }}\n aria-label={`Hidden nodes marker: ${node.id}`}\n >\n <circle className={styles.mainCircle} r={nodeR} cx={node.x} cy={node.y} />\n <g>\n <foreignObject x={node.x - 25} y={node.y - 25} width=\"50\" height=\"50\">\n <div className={styles.text}>\n {/* we limit the count to 101 so if we have more than 100 nodes we don't have exact count */}\n <span>{marker.count > 100 ? '>100' : marker.count} nodes</span>\n </div>\n </foreignObject>\n </g>\n </g>\n );\n});\n","import { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React, { MouseEvent, memo } from 'react';\nimport tinycolor from 'tinycolor2';\n\nimport { Field, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\nimport { HoverState } from './NodeGraph';\nimport { NodeDatum } from './types';\nimport { statToString } from './utils';\n\nconst nodeR = 40;\n\nconst getStyles = (theme: GrafanaTheme2, hovering: HoverState) => ({\n mainGroup: css`\n cursor: pointer;\n font-size: 10px;\n transition: opacity 300ms;\n opacity: ${hovering === 'inactive' ? 0.5 : 1};\n `,\n\n mainCircle: css`\n fill: ${theme.components.panel.background};\n `,\n\n hoverCircle: css`\n opacity: 0.5;\n fill: transparent;\n stroke: ${theme.colors.primary.text};\n `,\n\n text: css`\n fill: ${theme.colors.text.primary};\n `,\n\n titleText: css`\n text-align: center;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n background-color: ${tinycolor(theme.colors.background.primary).setAlpha(0.6).toHex8String()};\n width: 100px;\n `,\n\n statsText: css`\n text-align: center;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n width: 70px;\n `,\n\n textHovering: css`\n width: 200px;\n & span {\n background-color: ${tinycolor(theme.colors.background.primary).setAlpha(0.8).toHex8String()};\n }\n `,\n});\n\nexport const Node = memo(function Node(props: {\n node: NodeDatum;\n onMouseEnter: (id: string) => void;\n onMouseLeave: (id: string) => void;\n onClick: (event: MouseEvent<SVGElement>, node: NodeDatum) => void;\n hovering: HoverState;\n}) {\n const { node, onMouseEnter, onMouseLeave, onClick, hovering } = props;\n const theme = useTheme2();\n const styles = getStyles(theme, hovering);\n const isHovered = hovering === 'active';\n\n if (!(node.x !== undefined && node.y !== undefined)) {\n return null;\n }\n\n return (\n <g\n data-node-id={node.id}\n className={styles.mainGroup}\n onMouseEnter={() => {\n onMouseEnter(node.id);\n }}\n onMouseLeave={() => {\n onMouseLeave(node.id);\n }}\n onClick={(event) => {\n onClick(event, node);\n }}\n aria-label={`Node: ${node.title}`}\n >\n <circle className={styles.mainCircle} r={nodeR} cx={node.x} cy={node.y} />\n {isHovered && <circle className={styles.hoverCircle} r={nodeR - 3} cx={node.x} cy={node.y} strokeWidth={2} />}\n <ColorCircle node={node} />\n <g className={styles.text}>\n <foreignObject x={node.x - (isHovered ? 100 : 35)} y={node.y - 15} width={isHovered ? '200' : '70'} height=\"40\">\n <div className={cx(styles.statsText, isHovered && styles.textHovering)}>\n <span>{node.mainStat && statToString(node.mainStat, node.dataFrameRowIndex)}</span>\n <br />\n <span>{node.secondaryStat && statToString(node.secondaryStat, node.dataFrameRowIndex)}</span>\n </div>\n </foreignObject>\n <foreignObject\n x={node.x - (isHovered ? 100 : 50)}\n y={node.y + nodeR + 5}\n width={isHovered ? '200' : '100'}\n height=\"40\"\n >\n <div className={cx(styles.titleText, isHovered && styles.textHovering)}>\n <span>{node.title}</span>\n <br />\n <span>{node.subTitle}</span>\n </div>\n </foreignObject>\n </g>\n </g>\n );\n});\n\n/**\n * Shows the outer segmented circle with different colors based on the supplied data.\n */\nfunction ColorCircle(props: { node: NodeDatum }) {\n const { node } = props;\n const fullStat = node.arcSections.find((s) => s.values.get(node.dataFrameRowIndex) === 1);\n const theme = useTheme2();\n\n if (fullStat) {\n // Doing arc with path does not work well so it's better to just do a circle in that case\n return (\n <circle\n fill=\"none\"\n stroke={theme.visualization.getColorByName(fullStat.config.color?.fixedColor || '')}\n strokeWidth={2}\n r={nodeR}\n cx={node.x}\n cy={node.y}\n />\n );\n }\n\n const nonZero = node.arcSections.filter((s) => s.values.get(node.dataFrameRowIndex) !== 0);\n if (nonZero.length === 0) {\n // Fallback if no arc is defined\n return (\n <circle\n fill=\"none\"\n stroke={node.color ? getColor(node.color, node.dataFrameRowIndex, theme) : 'gray'}\n strokeWidth={2}\n r={nodeR}\n cx={node.x}\n cy={node.y}\n />\n );\n }\n\n const { elements } = nonZero.reduce(\n (acc, section) => {\n const color = section.config.color?.fixedColor || '';\n const value = section.values.get(node.dataFrameRowIndex);\n const el = (\n <ArcSection\n key={color}\n r={nodeR}\n x={node.x!}\n y={node.y!}\n startPercent={acc.percent}\n percent={value}\n color={theme.visualization.getColorByName(color)}\n strokeWidth={2}\n />\n );\n acc.elements.push(el);\n acc.percent = acc.percent + value;\n return acc;\n },\n { elements: [] as React.ReactNode[], percent: 0 }\n );\n\n return <>{elements}</>;\n}\n\nfunction ArcSection({\n r,\n x,\n y,\n startPercent,\n percent,\n color,\n strokeWidth = 2,\n}: {\n r: number;\n x: number;\n y: number;\n startPercent: number;\n percent: number;\n color: string;\n strokeWidth?: number;\n}) {\n const endPercent = startPercent + percent;\n const startXPos = x + Math.sin(2 * Math.PI * startPercent) * r;\n const startYPos = y - Math.cos(2 * Math.PI * startPercent) * r;\n const endXPos = x + Math.sin(2 * Math.PI * endPercent) * r;\n const endYPos = y - Math.cos(2 * Math.PI * endPercent) * r;\n const largeArc = percent > 0.5 ? '1' : '0';\n return (\n <path\n fill=\"none\"\n d={`M ${startXPos} ${startYPos} A ${r} ${r} 0 ${largeArc} 1 ${endXPos} ${endYPos}`}\n stroke={color}\n strokeWidth={strokeWidth}\n />\n );\n}\n\nfunction getColor(field: Field, index: number, theme: GrafanaTheme2): string {\n if (!field.config.color) {\n return field.values.get(index);\n }\n\n return getFieldColorModeForField(field).getCalculator(field, theme)(0, field.values.get(index));\n}\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { Button, HorizontalGroup, useStyles, VerticalGroup } from '@grafana/ui';\n\nfunction getStyles() {\n return {\n wrapper: css`\n label: wrapper;\n pointer-events: all;\n `,\n };\n}\n\ninterface Props<Config> {\n config: Config;\n onConfigChange: (config: Config) => void;\n onPlus: () => void;\n onMinus: () => void;\n scale: number;\n disableZoomOut?: boolean;\n disableZoomIn?: boolean;\n}\n\n/**\n * Control buttons for zoom but also some layout config inputs mainly for debugging.\n */\nexport function ViewControls<Config extends Record<string, any>>(props: Props<Config>) {\n const { config, onConfigChange, onPlus, onMinus, disableZoomOut, disableZoomIn } = props;\n const [showConfig, setShowConfig] = useState(false);\n\n // For debugging the layout, should be removed here and maybe moved to panel config later on\n const allowConfiguration = false;\n const styles = useStyles(getStyles);\n\n return (\n <div className={styles.wrapper}>\n <VerticalGroup spacing=\"sm\">\n <HorizontalGroup spacing=\"xs\">\n <Button\n icon={'plus-circle'}\n onClick={onPlus}\n size={'md'}\n title={'Zoom in'}\n variant=\"secondary\"\n disabled={disableZoomIn}\n />\n <Button\n icon={'minus-circle'}\n onClick={onMinus}\n size={'md'}\n title={'Zoom out'}\n variant=\"secondary\"\n disabled={disableZoomOut}\n />\n </HorizontalGroup>\n <HorizontalGroup spacing=\"xs\">\n <Button\n icon={'code-branch'}\n onClick={() => onConfigChange({ ...config, gridLayout: false })}\n size={'md'}\n title={'Default layout'}\n variant=\"secondary\"\n disabled={!config.gridLayout}\n />\n <Button\n icon={'apps'}\n onClick={() => onConfigChange({ ...config, gridLayout: true })}\n size={'md'}\n title={'Grid layout'}\n variant=\"secondary\"\n disabled={config.gridLayout}\n />\n </HorizontalGroup>\n </VerticalGroup>\n\n {allowConfiguration && (\n <Button size={'xs'} fill=\"text\" onClick={() => setShowConfig((showConfig) => !showConfig)}>\n {showConfig ? 'Hide config' : 'Show config'}\n </Button>\n )}\n\n {allowConfiguration &&\n showConfig &&\n Object.keys(config)\n .filter((k) => k !== 'show')\n .map((k) => (\n <div key={k}>\n {k}\n <input\n style={{ width: 50 }}\n type={'number'}\n value={config[k]}\n onChange={(e) => {\n onConfigChange({ ...config, [k]: parseFloat(e.target.value) });\n }}\n />\n </div>\n ))}\n </div>\n );\n}\n","import { fromPairs, uniq } from 'lodash';\nimport { useMemo } from 'react';\n\nimport { Config } from './layout';\nimport { EdgeDatumLayout, NodeDatum, NodesMarker } from './types';\n\ntype NodesMap = Record<string, NodeDatum>;\ntype EdgesMap = Record<string, EdgeDatumLayout[]>;\n\n/**\n * Limits the number of nodes by going from the roots breadth first until we have desired number of nodes.\n */\nexport function useNodeLimit(\n nodes: NodeDatum[],\n edges: EdgeDatumLayout[],\n limit: number,\n config: Config,\n rootId?: string\n): { nodes: NodeDatum[]; edges: EdgeDatumLayout[]; markers?: NodesMarker[] } {\n // This is pretty expensive also this happens once in the layout code when initializing position but it's a bit\n // tricky to do it only once and reuse the results because layout directly modifies the nodes.\n const [edgesMap, nodesMap] = useMemo(() => {\n // Make sure we don't compute this until we have all the data.\n if (!(nodes.length && edges.length)) {\n return [{}, {}];\n }\n\n const edgesMap = edges.reduce<EdgesMap>((acc, e) => {\n acc[e.source.id] = [...(acc[e.source.id] ?? []), e];\n acc[e.target.id] = [...(acc[e.target.id] ?? []), e];\n return acc;\n }, {});\n\n const nodesMap = nodes.reduce<NodesMap>((acc, node) => {\n acc[node.id] = node;\n return acc;\n }, {});\n return [edgesMap, nodesMap];\n }, [edges, nodes]);\n\n return useMemo(() => {\n if (nodes.length <= limit) {\n return { nodes, edges };\n }\n\n if (config.gridLayout) {\n return limitGridLayout(nodes, limit, rootId);\n }\n\n return limitGraphLayout(nodes, edges, nodesMap, edgesMap, limit, rootId);\n }, [edges, edgesMap, limit, nodes, nodesMap, rootId, config.gridLayout]);\n}\n\nexport function limitGraphLayout(\n nodes: NodeDatum[],\n edges: EdgeDatumLayout[],\n nodesMap: NodesMap,\n edgesMap: EdgesMap,\n limit: number,\n rootId?: string\n) {\n let roots;\n if (rootId) {\n roots = [nodesMap[rootId]];\n } else {\n roots = nodes.filter((n) => n.incoming === 0);\n // TODO: same code as layout\n if (!roots.length) {\n roots = [nodes[0]];\n }\n }\n\n const { visibleNodes, markers } = collectVisibleNodes(limit, roots, nodesMap, edgesMap);\n\n const markersWithStats = collectMarkerStats(markers, visibleNodes, nodesMap, edgesMap);\n const markersMap = fromPairs(markersWithStats.map((m) => [m.node.id, m]));\n\n for (const marker of markersWithStats) {\n if (marker.count === 1) {\n delete markersMap[marker.node.id];\n visibleNodes[marker.node.id] = marker.node;\n }\n }\n\n // Show all edges between visible nodes or placeholder markers\n const visibleEdges = edges.filter(\n (e) =>\n (visibleNodes[e.source.id] || markersMap[e.source.id]) && (visibleNodes[e.target.id] || markersMap[e.target.id])\n );\n\n return {\n nodes: Object.values(visibleNodes),\n edges: visibleEdges,\n markers: Object.values(markersMap),\n };\n}\n\nexport function limitGridLayout(nodes: NodeDatum[], limit: number, rootId?: string) {\n let start = 0;\n let stop = limit;\n let markers: NodesMarker[] = [];\n\n if (rootId) {\n const index = nodes.findIndex((node) => node.id === rootId);\n const prevLimit = Math.floor(limit / 2);\n let afterLimit = prevLimit;\n start = index - prevLimit;\n if (start < 0) {\n afterLimit += Math.abs(start);\n start = 0;\n }\n stop = index + afterLimit + 1;\n\n if (stop > nodes.length) {\n if (start > 0) {\n start = Math.max(0, start - (stop - nodes.length));\n }\n stop = nodes.length;\n }\n\n if (start > 1) {\n markers.push({ node: nodes[start - 1], count: start });\n }\n\n if (nodes.length - stop > 1) {\n markers.push({ node: nodes[stop], count: nodes.length - stop });\n }\n } else {\n if (nodes.length - limit > 1) {\n markers = [{ node: nodes[limit], count: nodes.length - limit }];\n }\n }\n\n return {\n nodes: nodes.slice(start, stop),\n edges: [],\n markers,\n };\n}\n\n/**\n * Breath first traverse of the graph collecting all the nodes until we reach the limit. It also returns markers which\n * are nodes on the edges which did not make it into the limit but can be used as clickable markers for manually\n * expanding the graph.\n * @param limit\n * @param roots - Nodes where to start the traversal. In case of exploration this can be any node that user clicked on.\n * @param nodesMap - Node id to node\n * @param edgesMap - This is a map of node id to a list of edges (both ingoing and outgoing)\n */\nfunction collectVisibleNodes(\n limit: number,\n roots: NodeDatum[],\n nodesMap: Record<string, NodeDatum>,\n edgesMap: Record<string, EdgeDatumLayout[]>\n): { visibleNodes: Record<string, NodeDatum>; markers: NodeDatum[] } {\n const visibleNodes: Record<string, NodeDatum> = {};\n let stack = [...roots];\n\n while (Object.keys(visibleNodes).length < limit && stack.length > 0) {\n let current = stack.shift()!;\n\n // We are already showing this node. This can happen because graphs can be cyclic\n if (visibleNodes[current!.id]) {\n continue;\n }\n\n // Show this node\n visibleNodes[current.id] = current;\n const edges = edgesMap[current.id] || [];\n\n // Add any nodes that are connected to it on top of the stack to be considered in the next pass\n const connectedNodes = edges.map((e) => {\n // We don't care about direction here. Should not make much difference but argument could be made that with\n // directed graphs it should walk the graph directionally. Problem is when we focus on a node in the middle of\n // graph (not going from the \"natural\" root) we also want to show what was \"before\".\n const id = e.source.id === current.id ? e.target.id : e.source.id;\n return nodesMap[id];\n });\n stack = stack.concat(connectedNodes);\n }\n\n // Right now our stack contains all the nodes which are directly connected to the graph but did not make the cut.\n // Some of them though can be nodes we already are showing so we have to filter them and then use them as markers.\n const markers = uniq(stack.filter((n) => !visibleNodes[n.id]));\n\n return { visibleNodes, markers };\n}\n\nfunction collectMarkerStats(\n markers: NodeDatum[],\n visibleNodes: Record<string, NodeDatum>,\n nodesMap: Record<string, NodeDatum>,\n edgesMap: Record<string, EdgeDatumLayout[]>\n): NodesMarker[] {\n return markers.map((marker) => {\n const nodesToCount: Record<string, NodeDatum> = {};\n let count = 0;\n let stack = [marker];\n while (stack.length > 0 && count <= 101) {\n let current = stack.shift()!;\n\n // We are showing this node so not going to count it as hidden.\n if (visibleNodes[current.id] || nodesToCount[current.id]) {\n continue;\n }\n\n if (!nodesToCount[current.id]) {\n count++;\n }\n nodesToCount[current.id] = current;\n\n const edges = edgesMap[current.id] || [];\n\n const connectedNodes = edges.map((e) => {\n const id = e.source.id === current.id ? e.target.id : e.source.id;\n return nodesMap[id];\n });\n stack = stack.concat(connectedNodes);\n }\n\n return {\n node: marker,\n count: count,\n };\n });\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useUnmount } from 'react-use';\nimport useMountedState from 'react-use/lib/useMountedState';\n\nimport { Field } from '@grafana/data';\n\nimport { createWorker } from './createLayoutWorker';\nimport { EdgeDatum, EdgeDatumLayout, NodeDatum } from './types';\nimport { useNodeLimit } from './useNodeLimit';\nimport { graphBounds } from './utils';\n\nexport interface Config {\n linkDistance: number;\n linkStrength: number;\n forceX: number;\n forceXStrength: number;\n forceCollide: number;\n tick: number;\n gridLayout: boolean;\n sort?: {\n // Either a arc field or stats field\n field: Field;\n ascending: boolean;\n };\n}\n\n// Config mainly for the layout but also some other parts like current layout. The layout variables can be changed only\n// if you programmatically enable the config editor (for development only) see ViewControls. These could be moved to\n// panel configuration at some point (apart from gridLayout as that can be switched be user right now.).\nexport const defaultConfig: Config = {\n linkDistance: 150,\n linkStrength: 0.5,\n forceX: 2000,\n forceXStrength: 0.02,\n forceCollide: 100,\n tick: 300,\n gridLayout: false,\n};\n\n/**\n * This will return copy of the nods and edges with x,y positions filled in. Also the layout changes source/target props\n * in edges from string ids to actual nodes.\n */\nexport function useLayout(\n rawNodes: NodeDatum[],\n rawEdges: EdgeDatum[],\n config: Config = defaultConfig,\n nodeCountLimit: number,\n width: number,\n rootNodeId?: string\n) {\n const [nodesGraph, setNodesGraph] = useState<NodeDatum[]>([]);\n const [edgesGraph, setEdgesGraph] = useState<EdgeDatumLayout[]>([]);\n\n const [loading, setLoading] = useState(false);\n\n const isMounted = useMountedState();\n const layoutWorkerCancelRef = useRef<(() => void) | undefined>();\n\n useUnmount(() => {\n if (layoutWorkerCancelRef.current) {\n layoutWorkerCancelRef.current();\n }\n });\n\n // Also we compute both layouts here. Grid layout should not add much time and we can more easily just cache both\n // so this should happen only once for a given response data.\n //\n // Also important note is that right now this works on all the nodes even if they are not visible. This means that\n // the node position is stable even when expanding different parts of graph. It seems like a reasonable thing but\n // implications are that:\n // - limiting visible nodes count does not have a positive perf effect\n // - graphs with high node count can seem weird (very sparse or spread out) when we show only some nodes but layout\n // is done for thousands of nodes but we also do this only once in the graph lifecycle.\n // We could re-layout this on visible nodes change but this may need smaller visible node limit to keep the perf\n // (as we would run layout on every click) and also would be very weird without any animation to understand what is\n // happening as already visible nodes would change positions.\n useEffect(() => {\n if (rawNodes.length === 0) {\n setNodesGraph([]);\n setEdgesGraph([]);\n setLoading(false);\n return;\n }\n\n setLoading(true);\n\n // This is async but as I wanted to still run the sync grid layout and you cannot return promise from effect so\n // having callback seems ok here.\n const cancel = defaultLayout(rawNodes, rawEdges, ({ nodes, edges }) => {\n if (isMounted()) {\n setNodesGraph(nodes);\n setEdgesGraph(edges as EdgeDatumLayout[]);\n setLoading(false);\n }\n });\n layoutWorkerCancelRef.current = cancel;\n return cancel;\n }, [rawNodes, rawEdges, isMounted]);\n\n // Compute grid separately as it is sync and do not need to be inside effect. Also it is dependant on width while\n // default layout does not care and we don't want to recalculate that on panel resize.\n const [nodesGrid, edgesGrid] = useMemo(() => {\n if (rawNodes.length === 0) {\n return [[], []];\n }\n\n const rawNodesCopy = rawNodes.map((n) => ({ ...n }));\n const rawEdgesCopy = rawEdges.map((e) => ({ ...e }));\n gridLayout(rawNodesCopy, width, config.sort);\n\n return [rawNodesCopy, rawEdgesCopy as EdgeDatumLayout[]];\n }, [config.sort, rawNodes, rawEdges, width]);\n\n // Limit the nodes so we don't show all for performance reasons. Here we don't compute both at the same time so\n // changing the layout can trash internal memoization at the moment.\n const {\n nodes: nodesWithLimit,\n edges: edgesWithLimit,\n markers,\n } = useNodeLimit(\n config.gridLayout ? nodesGrid : nodesGraph,\n config.gridLayout ? edgesGrid : edgesGraph,\n nodeCountLimit,\n config,\n rootNodeId\n );\n\n // Get bounds based on current limited number of nodes.\n const bounds = useMemo(\n () => graphBounds([...nodesWithLimit, ...(markers || []).map((m) => m.node)]),\n [nodesWithLimit, markers]\n );\n\n return {\n nodes: nodesWithLimit,\n edges: edgesWithLimit,\n markers,\n bounds,\n hiddenNodesCount: rawNodes.length - nodesWithLimit.length,\n loading,\n };\n}\n\n/**\n * Wraps the layout code in a worker as it can take long and we don't want to block the main thread.\n * Returns a cancel function to terminate the worker.\n */\nfunction defaultLayout(\n nodes: NodeDatum[],\n edges: EdgeDatum[],\n done: (data: { nodes: NodeDatum[]; edges: EdgeDatum[] }) => void\n) {\n const worker = createWorker();\n worker.onmessage = (event: MessageEvent<{ nodes: NodeDatum[]; edges: EdgeDatumLayout[] }>) => {\n for (let i = 0; i < nodes.length; i++) {\n // These stats needs to be Field class but the data is stringified over the worker boundary\n event.data.nodes[i] = {\n ...nodes[i],\n ...event.data.nodes[i],\n };\n }\n done(event.data);\n };\n\n worker.postMessage({\n nodes: nodes.map((n) => ({\n id: n.id,\n incoming: n.incoming,\n })),\n edges,\n config: defaultConfig,\n });\n\n return () => {\n worker.terminate();\n };\n}\n\n/**\n * Set the nodes in simple grid layout sorted by some stat.\n */\nfunction gridLayout(\n nodes: NodeDatum[],\n width: number,\n sort?: {\n field: Field;\n ascending: boolean;\n }\n) {\n const spacingVertical = 140;\n const spacingHorizontal = 120;\n const padding = spacingHorizontal / 2;\n const perRow = Math.min(Math.floor((width - padding * 2) / spacingVertical), nodes.length);\n const midPoint = Math.floor(((perRow - 1) * spacingHorizontal) / 2);\n\n if (sort) {\n nodes.sort((node1, node2) => {\n const val1 = sort!.field.values.get(node1.dataFrameRowIndex);\n const val2 = sort!.field.values.get(node2.dataFrameRowIndex);\n\n // Lets pretend we don't care about type of the stats for a while (they can be strings)\n return sort!.ascending ? val1 - val2 : val2 - val1;\n });\n }\n\n for (const [index, node] of nodes.entries()) {\n const row = Math.floor(index / perRow);\n const column = index % perRow;\n node.x = column * spacingHorizontal - midPoint;\n node.y = -60 + row * spacingVertical;\n }\n}\n","import { CorsWorker as Worker } from 'app/core/utils/CorsWorker';\n\nexport const createWorker = () => new Worker(new URL('./layout.worker.js', import.meta.url));\n","import { css } from '@emotion/css';\nimport React, { MouseEvent, useCallback, useState } from 'react';\n\nimport { DataFrame, Field, GrafanaTheme, LinkModel } from '@grafana/data';\nimport { ContextMenu, MenuGroup, MenuItem, stylesFactory, useTheme } from '@grafana/ui';\n\nimport { Config } from './layout';\nimport { EdgeDatum, NodeDatum } from './types';\nimport { getEdgeFields, getNodeFields } from './utils';\n\n/**\n * Hook that contains state of the context menu, both for edges and nodes and provides appropriate component when\n * opened context menu should be opened.\n */\nexport function useContextMenu(\n getLinks: (dataFrame: DataFrame, rowIndex: number) => LinkModel[],\n nodes: DataFrame,\n edges: DataFrame,\n config: Config,\n setConfig: (config: Config) => void,\n setFocusedNodeId: (id: string) => void\n): {\n onEdgeOpen: (event: MouseEvent<SVGElement>, edge: EdgeDatum) => void;\n onNodeOpen: (event: MouseEvent<SVGElement>, node: NodeDatum) => void;\n MenuComponent: React.ReactNode;\n} {\n const [menu, setMenu] = useState<JSX.Element | undefined>(undefined);\n\n const onNodeOpen = useCallback(\n (event, node) => {\n const extraNodeItem = config.gridLayout\n ? [\n {\n label: 'Show in Graph layout',\n onClick: (node: NodeDatum) => {\n setFocusedNodeId(node.id);\n setConfig({ ...config, gridLayout: false });\n },\n },\n ]\n : undefined;\n const renderer = getItemsRenderer(getLinks(nodes, node.dataFrameRowIndex), node, extraNodeItem);\n\n if (renderer) {\n setMenu(\n <ContextMenu\n renderHeader={() => <NodeHeader node={node} nodes={nodes} />}\n renderMenuItems={renderer}\n onClose={() => setMenu(undefined)}\n x={event.pageX}\n y={event.pageY}\n />\n );\n }\n },\n [config, nodes, getLinks, setMenu, setConfig, setFocusedNodeId]\n );\n\n const onEdgeOpen = useCallback(\n (event, edge) => {\n const renderer = getItemsRenderer(getLinks(edges, edge.dataFrameRowIndex), edge);\n\n if (renderer) {\n setMenu(\n <ContextMenu\n renderHeader={() => <EdgeHeader edge={edge} edges={edges} />}\n renderMenuItems={renderer}\n onClose={() => setMenu(undefined)}\n x={event.pageX}\n y={event.pageY}\n />\n );\n }\n },\n [edges, getLinks, setMenu]\n );\n\n return { onEdgeOpen, onNodeOpen, MenuComponent: menu };\n}\n\nfunction getItemsRenderer<T extends NodeDatum | EdgeDatum>(\n links: LinkModel[],\n item: T,\n extraItems?: Array<LinkData<T>> | undefined\n) {\n if (!(links.length || extraItems?.length)) {\n return undefined;\n }\n const items = getItems(links);\n return () => {\n let groups = items?.map((group, index) => (\n <MenuGroup key={`${group.label}${index}`} label={group.label}>\n {(group.items || []).map(mapMenuItem(item))}\n </MenuGroup>\n ));\n\n if (extraItems) {\n groups = [...extraItems.map(mapMenuItem(item)), ...groups];\n }\n return groups;\n };\n}\n\nfunction mapMenuItem<T extends NodeDatum | EdgeDatum>(item: T) {\n return function NodeGraphMenuItem(link: LinkData<T>) {\n return (\n <MenuItem\n key={link.label}\n url={link.url}\n label={link.label}\n ariaLabel={link.ariaLabel}\n onClick={link.onClick ? () => link.onClick?.(item) : undefined}\n target={'_self'}\n />\n );\n };\n}\n\ntype LinkData<T extends NodeDatum | EdgeDatum> = {\n label: string;\n ariaLabel?: string;\n url?: string;\n onClick?: (item: T) => void;\n};\n\nfunction getItems(links: LinkModel[]) {\n const defaultGroup = 'Open in Explore';\n const groups = links.reduce<{ [group: string]: Array<{ l: LinkModel; newTitle?: string }> }>((acc, l) => {\n let group;\n let title;\n if (l.title.indexOf('/') !== -1) {\n group = l.title.split('/')[0];\n title = l.title.split('/')[1];\n acc[group] = acc[group] || [];\n acc[group].push({ l, newTitle: title });\n } else {\n acc[defaultGroup] = acc[defaultGroup] || [];\n acc[defaultGroup].push({ l });\n }\n\n return acc;\n }, {});\n\n return Object.keys(groups).map((key) => {\n return {\n label: key,\n ariaLabel: key,\n items: groups[key].map((link) => ({\n label: link.newTitle || link.l.title,\n ariaLabel: link.newTitle || link.l.title,\n url: link.l.href,\n onClick: link.l.onClick,\n })),\n };\n });\n}\n\nfunction NodeHeader(props: { node: NodeDatum; nodes: DataFrame }) {\n const index = props.node.dataFrameRowIndex;\n const fields = getNodeFields(props.nodes);\n return (\n <div>\n {fields.title && <Label field={fields.title} index={index} />}\n {fields.subTitle && <Label field={fields.subTitle} index={index} />}\n {fields.details.map((f) => (\n <Label key={f.name} field={f} index={index} />\n ))}\n </div>\n );\n}\n\nfunction EdgeHeader(props: { edge: EdgeDatum; edges: DataFrame }) {\n const index = props.edge.dataFrameRowIndex;\n const fields = getEdgeFields(props.edges);\n const styles = getLabelStyles(useTheme());\n const valueSource = fields.source?.values.get(index) || '';\n const valueTarget = fields.target?.values.get(index) || '';\n\n return (\n <div>\n {fields.source && fields.target && (\n <div className={styles.label}>\n <div>Source → Target</div>\n <span className={styles.value}>\n {valueSource} → {valueTarget}\n </span>\n </div>\n )}\n {fields.details.map((f) => (\n <Label key={f.name} field={f} index={index} />\n ))}\n </div>\n );\n}\n\nexport const getLabelStyles = stylesFactory((theme: GrafanaTheme) => {\n return {\n label: css`\n label: Label;\n line-height: 1.25;\n margin: ${theme.spacing.formLabelMargin};\n padding: ${theme.spacing.formLabelPadding};\n color: ${theme.colors.textFaint};\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.weight.semibold};\n `,\n value: css`\n label: Value;\n font-size: ${theme.typography.size.sm};\n font-weight: ${theme.typography.weight.semibold};\n color: ${theme.colors.formLabel};\n margin-top: ${theme.spacing.xxs};\n display: block;\n `,\n };\n});\nfunction Label(props: { field: Field; index: number }) {\n const { field, index } = props;\n const value = field.values.get(index) || '';\n const styles = getLabelStyles(useTheme());\n\n return (\n <div className={styles.label}>\n <div>{field.config.displayName || field.name}</div>\n <span className={styles.value}>{value}</span>\n </div>\n );\n}\n","import { useEffect, useRef, RefObject, useState, useMemo } from 'react';\nimport useMountedState from 'react-use/lib/useMountedState';\nimport usePrevious from 'react-use/lib/usePrevious';\n\nimport { Bounds } from './utils';\n\nexport interface State {\n isPanning: boolean;\n position: {\n x: number;\n y: number;\n };\n}\n\ninterface Options {\n scale?: number;\n bounds?: Bounds;\n focus?: {\n x: number;\n y: number;\n };\n}\n\n/**\n * Based on https://github.com/streamich/react-use/blob/master/src/useSlider.ts\n * Returns position x/y coordinates which can be directly used in transform: translate().\n * @param scale - Can be used when we want to scale the movement if we are moving a scaled element. We need to do it\n * here because we don't want to change the pos when scale changes.\n * @param bounds - If set the panning cannot go outside of those bounds.\n * @param focus - Position to focus on.\n */\nexport function usePanning<T extends Element>({ scale = 1, bounds, focus }: Options = {}): {\n state: State;\n ref: RefObject<T>;\n} {\n const isMounted = useMountedState();\n const isPanning = useRef(false);\n const frame = useRef(0);\n const panRef = useRef<T>(null);\n\n const initial = { x: 0, y: 0 };\n // As we return a diff of the view port to be applied we need as translate coordinates we have to invert the\n // bounds of the content to get the bounds of the view port diff.\n const viewBounds = useMemo(\n () => ({\n right: bounds ? -bounds.left : Infinity,\n left: bounds ? -bounds.right : -Infinity,\n bottom: bounds ? -bounds.top : -Infinity,\n top: bounds ? -bounds.bottom : Infinity,\n }),\n [bounds]\n );\n\n // We need to keep some state so we can compute the position diff and add that to the previous position.\n const startMousePosition = useRef(initial);\n const prevPosition = useRef(initial);\n // We cannot use the state as that would rerun the effect on each state change which we don't want so we have to keep\n // separate variable for the state that won't cause useEffect eval\n const currentPosition = useRef(initial);\n\n const [state, setState] = useState<State>({\n isPanning: false,\n position: initial,\n });\n\n useEffect(() => {\n const startPanning = (event: Event) => {\n if (!isPanning.current && isMounted()) {\n isPanning.current = true;\n // Snapshot the current position of both mouse pointer and the element\n startMousePosition.current = getEventXY(event);\n prevPosition.current = { ...currentPosition.current };\n setState((state) => ({ ...state, isPanning: true }));\n bindEvents();\n }\n };\n\n const stopPanning = () => {\n if (isPanning.current && isMounted()) {\n isPanning.current = false;\n setState((state) => ({ ...state, isPanning: false }));\n unbindEvents();\n }\n };\n\n const onPanStart = (event: Event) => {\n startPanning(event);\n onPan(event);\n };\n\n const bindEvents = () => {\n document.addEventListener('mousemove', onPan);\n document.addEventListener('mouseup', stopPanning);\n document.addEventListener('touchmove', onPan);\n document.addEventListener('touchend', stopPanning);\n };\n\n const unbindEvents = () => {\n document.removeEventListener('mousemove', onPan);\n document.removeEventListener('mouseup', stopPanning);\n document.removeEventListener('touchmove', onPan);\n document.removeEventListener('touchend', stopPanning);\n };\n\n const onPan = (event: Event) => {\n cancelAnimationFrame(frame.current);\n const pos = getEventXY(event);\n\n frame.current = requestAnimationFrame(() => {\n if (isMounted() && panRef.current) {\n // Get the diff by which we moved the mouse.\n let xDiff = pos.x - startMousePosition.current.x;\n let yDiff = pos.y - startMousePosition.current.y;\n\n // Add the diff to the position from the moment we started panning.\n currentPosition.current = {\n x: inBounds(prevPosition.current.x + xDiff / scale, viewBounds.left, viewBounds.right),\n y: inBounds(prevPosition.current.y + yDiff / scale, viewBounds.top, viewBounds.bottom),\n };\n setState((state) => ({\n ...state,\n position: {\n ...currentPosition.current,\n },\n }));\n }\n });\n };\n\n const ref = panRef.current;\n if (ref) {\n ref.addEventListener('mousedown', onPanStart);\n ref.addEventListener('touchstart', onPanStart);\n }\n return () => {\n if (ref) {\n ref.removeEventListener('mousedown', onPanStart);\n ref.removeEventListener('touchstart', onPanStart);\n }\n };\n }, [scale, viewBounds, isMounted]);\n\n const previousFocus = usePrevious(focus);\n\n // We need to update the state in case need to focus on something but we want to do it only once when the focus\n // changes to something new.\n useEffect(() => {\n if (focus && previousFocus?.x !== focus.x && previousFocus?.y !== focus.y) {\n const position = {\n x: inBounds(focus.x, viewBounds.left, viewBounds.right),\n y: inBounds(focus.y, viewBounds.top, viewBounds.bottom),\n };\n setState({\n position,\n isPanning: false,\n });\n\n currentPosition.current = position;\n prevPosition.current = position;\n }\n }, [focus, previousFocus, viewBounds, currentPosition, prevPosition]);\n\n let position = state.position;\n // This part prevents an ugly jump from initial position to the focused one as the set state in the effects is after\n // initial render.\n if (focus && previousFocus?.x !== focus.x && previousFocus?.y !== focus.y) {\n position = focus;\n }\n\n return {\n state: {\n ...state,\n position: {\n x: inBounds(position.x, viewBounds.left, viewBounds.right),\n y: inBounds(position.y, viewBounds.top, viewBounds.bottom),\n },\n },\n ref: panRef,\n };\n}\n\nfunction inBounds(value: number, min: number | undefined, max: number | undefined) {\n return Math.min(Math.max(value, min ?? -Infinity), max ?? Infinity);\n}\n\nfunction getEventXY(event: Event): { x: number; y: number } {\n if ((event as any).changedTouches) {\n const e = event as TouchEvent;\n return { x: e.changedTouches[0].clientX, y: e.changedTouches[0].clientY };\n } else {\n const e = event as MouseEvent;\n return { x: e.clientX, y: e.clientY };\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nconst defaultOptions: Options = {\n stepDown: (s) => s / 1.5,\n stepUp: (s) => s * 1.5,\n min: 0.13,\n max: 2.25,\n};\n\ninterface Options {\n /**\n * Allows you to specify how the step up will be handled so you can do fractional steps based on previous value.\n */\n stepUp: (scale: number) => number;\n stepDown: (scale: number) => number;\n\n /**\n * Set max and min values. If stepUp/down overshoots these bounds this will return min or max but internal scale value\n * will still be what ever the step functions returned last.\n */\n min?: number;\n max?: number;\n}\n\n/**\n * Keeps state and returns handlers that can be used to implement zooming functionality ideally by using it with\n * 'transform: scale'. It returns handler for manual buttons with zoom in/zoom out function and a ref that can be\n * used to zoom in/out with mouse wheel.\n */\nexport function useZoom({ stepUp, stepDown, min, max } = defaultOptions) {\n const ref = useRef<HTMLElement>(null);\n const [scale, setScale] = useState(1);\n\n const onStepUp = useCallback(() => {\n if (scale < (max ?? Infinity)) {\n setScale(stepUp(scale));\n }\n }, [scale, stepUp, max]);\n\n const onStepDown = useCallback(() => {\n if (scale > (min ?? -Infinity)) {\n setScale(stepDown(scale));\n }\n }, [scale, stepDown, min]);\n\n const onWheel = useCallback(\n function (event: Event) {\n // Seems like typing for the addEventListener is lacking a bit\n const wheelEvent = event as WheelEvent;\n\n // Only do this with special key pressed similar to how google maps work.\n // TODO: I would guess this won't work very well with touch right now\n if (wheelEvent.ctrlKey || wheelEvent.metaKey) {\n event.preventDefault();\n\n setScale(Math.min(Math.max(min ?? -Infinity, scale + Math.min(wheelEvent.deltaY, 2) * -0.01), max ?? Infinity));\n\n if (wheelEvent.deltaY < 0) {\n const newScale = scale + Math.max(wheelEvent.deltaY, -4) * -0.015;\n setScale(Math.max(min ?? -Infinity, newScale));\n } else if (wheelEvent.deltaY > 0) {\n const newScale = scale + Math.min(wheelEvent.deltaY, 4) * -0.015;\n setScale(Math.min(max ?? Infinity, newScale));\n }\n }\n },\n [min, max, scale]\n );\n\n useEffect(() => {\n if (!ref.current) {\n return;\n }\n\n const zoomRef = ref.current;\n\n // Adds listener for wheel event, we need the passive: false to be able to prevent default otherwise that\n // cannot be used with passive listeners.\n zoomRef.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n if (zoomRef) {\n zoomRef.removeEventListener('wheel', onWheel);\n }\n };\n }, [onWheel]);\n\n return {\n onStepUp,\n onStepDown,\n scale: Math.max(Math.min(scale, max ?? Infinity), min ?? -Infinity),\n isMax: scale >= (max ?? Infinity),\n isMin: scale <= (min ?? -Infinity),\n ref,\n };\n}\n","import { css } from '@emotion/css';\nimport cx from 'classnames';\nimport React, { memo, MouseEvent, MutableRefObject, useCallback, useEffect, useMemo, useState } from 'react';\nimport useMeasure from 'react-use/lib/useMeasure';\n\nimport { DataFrame, GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { Icon, Spinner, useStyles2, useTheme2 } from '@grafana/ui';\n\nimport { Edge } from './Edge';\nimport { EdgeArrowMarker } from './EdgeArrowMarker';\nimport { EdgeLabel } from './EdgeLabel';\nimport { Legend } from './Legend';\nimport { Marker } from './Marker';\nimport { Node } from './Node';\nimport { ViewControls } from './ViewControls';\nimport { Config, defaultConfig, useLayout } from './layout';\nimport { EdgeDatum, NodeDatum, NodesMarker } from './types';\nimport { useCategorizeFrames } from './useCategorizeFrames';\nimport { useContextMenu } from './useContextMenu';\nimport { useFocusPositionOnLayout } from './useFocusPositionOnLayout';\nimport { useHighlight } from './useHighlight';\nimport { usePanning } from './usePanning';\nimport { useZoom } from './useZoom';\nimport { processNodes, Bounds, findConnectedNodesForEdge, findConnectedNodesForNode } from './utils';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n label: wrapper;\n height: 100%;\n width: 100%;\n overflow: hidden;\n position: relative;\n `,\n\n svg: css`\n label: svg;\n height: 100%;\n width: 100%;\n overflow: visible;\n font-size: 10px;\n cursor: move;\n `,\n\n svgPanning: css`\n label: svgPanning;\n user-select: none;\n `,\n\n noDataMsg: css`\n height: 100%;\n width: 100%;\n display: grid;\n place-items: center;\n font-size: ${theme.typography.h4.fontSize};\n color: ${theme.colors.text.secondary};\n `,\n\n mainGroup: css`\n label: mainGroup;\n will-change: transform;\n `,\n\n viewControls: css`\n label: viewControls;\n position: absolute;\n left: 2px;\n bottom: 3px;\n right: 0;\n display: flex;\n align-items: flex-end;\n justify-content: space-between;\n pointer-events: none;\n `,\n legend: css`\n label: legend;\n background: ${theme.colors.background.secondary};\n box-shadow: ${theme.shadows.z1};\n padding-bottom: 5px;\n margin-right: 10px;\n `,\n viewControlsWrapper: css`\n margin-left: auto;\n `,\n alert: css`\n label: alert;\n padding: 5px 8px;\n font-size: 10px;\n text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);\n border-radius: ${theme.shape.borderRadius()};\n align-items: center;\n position: absolute;\n top: 0;\n right: 0;\n background: ${theme.colors.warning.main};\n color: ${theme.colors.warning.contrastText};\n `,\n loadingWrapper: css`\n label: loadingWrapper;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n `,\n});\n\n// Limits the number of visible nodes, mainly for performance reasons. Nodes above the limit are accessible by expanding\n// parts of the graph. The specific number is arbitrary but should be a number of nodes where panning, zooming and other\n// interactions will be without any lag for most users.\nconst defaultNodeCountLimit = 200;\n\ninterface Props {\n dataFrames: DataFrame[];\n getLinks: (dataFrame: DataFrame, rowIndex: number) => LinkModel[];\n nodeLimit?: number;\n}\nexport function NodeGraph({ getLinks, dataFrames, nodeLimit }: Props) {\n const nodeCountLimit = nodeLimit || defaultNodeCountLimit;\n const { edges: edgesDataFrames, nodes: nodesDataFrames } = useCategorizeFrames(dataFrames);\n\n const [measureRef, { width, height }] = useMeasure();\n const [config, setConfig] = useState<Config>(defaultConfig);\n\n const firstNodesDataFrame = nodesDataFrames[0];\n const firstEdgesDataFrame = edgesDataFrames[0];\n\n const theme = useTheme2();\n\n // TODO we should be able to allow multiple dataframes for both edges and nodes, could be issue with node ids which in\n // that case should be unique or figure a way to link edges and nodes dataframes together.\n const processed = useMemo(\n () => processNodes(firstNodesDataFrame, firstEdgesDataFrame, theme),\n [firstEdgesDataFrame, firstNodesDataFrame, theme]\n );\n\n // We need hover state here because for nodes we also highlight edges and for edges have labels separate to make\n // sure they are visible on top of everything else\n const { nodeHover, setNodeHover, clearNodeHover, edgeHover, setEdgeHover, clearEdgeHover } = useHover();\n const [hoveringIds, setHoveringIds] = useState<string[]>([]);\n useEffect(() => {\n let linked: string[] = [];\n if (nodeHover) {\n linked = findConnectedNodesForNode(processed.nodes, processed.edges, nodeHover);\n } else if (edgeHover) {\n linked = findConnectedNodesForEdge(processed.nodes, processed.edges, edgeHover);\n }\n setHoveringIds(linked);\n }, [nodeHover, edgeHover, processed]);\n\n // This is used for navigation from grid to graph view. This node will be centered and briefly highlighted.\n const [focusedNodeId, setFocusedNodeId] = useState<string>();\n const setFocused = useCallback((e: MouseEvent, m: NodesMarker) => setFocusedNodeId(m.node.id), [setFocusedNodeId]);\n\n // May seem weird that we do layout first and then limit the nodes shown but the problem is we want to keep the node\n // position stable which means we need the full layout first and then just visually hide the nodes. As hiding/showing\n // nodes should not have effect on layout it should not be recalculated.\n const { nodes, edges, markers, bounds, hiddenNodesCount, loading } = useLayout(\n processed.nodes,\n processed.edges,\n config,\n nodeCountLimit,\n width,\n focusedNodeId\n );\n\n // If we move from grid to graph layout and we have focused node lets get it's position to center there. We want do\n // do it specifically only in that case.\n const focusPosition = useFocusPositionOnLayout(config, nodes, focusedNodeId);\n const { panRef, zoomRef, onStepUp, onStepDown, isPanning, position, scale, isMaxZoom, isMinZoom } = usePanAndZoom(\n bounds,\n focusPosition\n );\n\n const { onEdgeOpen, onNodeOpen, MenuComponent } = useContextMenu(\n getLinks,\n firstNodesDataFrame,\n firstEdgesDataFrame,\n config,\n setConfig,\n setFocusedNodeId\n );\n const styles = useStyles2(getStyles);\n\n // This cannot be inline func or it will create infinite render cycle.\n const topLevelRef = useCallback(\n (r) => {\n measureRef(r);\n (zoomRef as MutableRefObject<HTMLElement | null>).current = r;\n },\n [measureRef, zoomRef]\n );\n\n const highlightId = useHighlight(focusedNodeId);\n\n return (\n <div ref={topLevelRef} className={styles.wrapper}>\n {loading ? (\n <div className={styles.loadingWrapper}>\n Computing layout \n <Spinner />\n </div>\n ) : null}\n\n {dataFrames.length && processed.nodes.length ? (\n <svg\n ref={panRef}\n viewBox={`${-(width / 2)} ${-(height / 2)} ${width} ${height}`}\n className={cx(styles.svg, isPanning && styles.svgPanning)}\n >\n <g\n className={styles.mainGroup}\n style={{ transform: `scale(${scale}) translate(${Math.floor(position.x)}px, ${Math.floor(position.y)}px)` }}\n >\n <EdgeArrowMarker />\n {!config.gridLayout && (\n <Edges\n edges={edges}\n nodeHoveringId={nodeHover}\n edgeHoveringId={edgeHover}\n onClick={onEdgeOpen}\n onMouseEnter={setEdgeHover}\n onMouseLeave={clearEdgeHover}\n />\n )}\n <Nodes\n nodes={nodes}\n onMouseEnter={setNodeHover}\n onMouseLeave={clearNodeHover}\n onClick={onNodeOpen}\n hoveringIds={hoveringIds || [highlightId]}\n />\n\n <Markers markers={markers || []} onClick={setFocused} />\n {/*We split the labels from edges so that they are shown on top of everything else*/}\n {!config.gridLayout && <EdgeLabels edges={edges} nodeHoveringId={nodeHover} edgeHoveringId={edgeHover} />}\n </g>\n </svg>\n ) : (\n <div className={styles.noDataMsg}>No data</div>\n )}\n\n <div className={styles.viewControls}>\n {nodes.length ? (\n <div className={styles.legend}>\n <Legend\n sortable={config.gridLayout}\n nodes={nodes}\n sort={config.sort}\n onSort={(sort) => {\n setConfig({\n ...config,\n sort: sort,\n });\n }}\n />\n </div>\n ) : null}\n\n <div className={styles.viewControlsWrapper}>\n <ViewControls<Config>\n config={config}\n onConfigChange={(cfg) => {\n if (cfg.gridLayout !== config.gridLayout) {\n setFocusedNodeId(undefined);\n }\n setConfig(cfg);\n }}\n onMinus={onStepDown}\n onPlus={onStepUp}\n scale={scale}\n disableZoomIn={isMaxZoom}\n disableZoomOut={isMinZoom}\n />\n </div>\n </div>\n\n {hiddenNodesCount > 0 && (\n <div className={styles.alert} aria-label={'Nodes hidden warning'}>\n <Icon size=\"sm\" name={'info-circle'} /> {hiddenNodesCount} nodes are hidden for performance reasons.\n </div>\n )}\n\n {MenuComponent}\n </div>\n );\n}\n\n// Active -> emphasized, inactive -> de-emphasized, and default -> normal styling\nexport type HoverState = 'active' | 'inactive' | 'default';\n\n// These components are here as a perf optimisation to prevent going through all nodes and edges on every pan/zoom.\ninterface NodesProps {\n nodes: NodeDatum[];\n onMouseEnter: (id: string) => void;\n onMouseLeave: (id: string) => void;\n onClick: (event: MouseEvent<SVGElement>, node: NodeDatum) => void;\n hoveringIds?: string[];\n}\nconst Nodes = memo(function Nodes(props: NodesProps) {\n return (\n <>\n {props.nodes.map((n) => (\n <Node\n key={n.id}\n node={n}\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n onClick={props.onClick}\n hovering={\n !props.hoveringIds || props.hoveringIds.length === 0\n ? 'default'\n : props.hoveringIds?.includes(n.id)\n ? 'active'\n : 'inactive'\n }\n />\n ))}\n </>\n );\n});\n\ninterface MarkersProps {\n markers: NodesMarker[];\n onClick: (event: MouseEvent<SVGElement>, marker: NodesMarker) => void;\n}\nconst Markers = memo(function Nodes(props: MarkersProps) {\n return (\n <>\n {props.markers.map((m) => (\n <Marker key={'marker-' + m.node.id} marker={m} onClick={props.onClick} />\n ))}\n </>\n );\n});\n\ninterface EdgesProps {\n edges: EdgeDatum[];\n nodeHoveringId?: string;\n edgeHoveringId?: string;\n onClick: (event: MouseEvent<SVGElement>, link: EdgeDatum) => void;\n onMouseEnter: (id: string) => void;\n onMouseLeave: (id: string) => void;\n}\nconst Edges = memo(function Edges(props: EdgesProps) {\n return (\n <>\n {props.edges.map((e) => (\n <Edge\n key={e.id}\n edge={e}\n hovering={\n (e.source as NodeDatum).id === props.nodeHoveringId ||\n (e.target as NodeDatum).id === props.nodeHoveringId ||\n props.edgeHoveringId === e.id\n }\n onClick={props.onClick}\n onMouseEnter={props.onMouseEnter}\n onMouseLeave={props.onMouseLeave}\n />\n ))}\n </>\n );\n});\n\ninterface EdgeLabelsProps {\n edges: EdgeDatum[];\n nodeHoveringId?: string;\n edgeHoveringId?: string;\n}\nconst EdgeLabels = memo(function EdgeLabels(props: EdgeLabelsProps) {\n return (\n <>\n {props.edges.map((e, index) => {\n const shouldShow =\n (e.source as NodeDatum).id === props.nodeHoveringId ||\n (e.target as NodeDatum).id === props.nodeHoveringId ||\n props.edgeHoveringId === e.id;\n const hasStats = e.mainStat || e.secondaryStat;\n return shouldShow && hasStats && <EdgeLabel key={e.id} edge={e} />;\n })}\n </>\n );\n});\n\nfunction usePanAndZoom(bounds: Bounds, focus?: { x: number; y: number }) {\n const { scale, onStepDown, onStepUp, ref, isMax, isMin } = useZoom();\n const { state: panningState, ref: panRef } = usePanning<SVGSVGElement>({\n scale,\n bounds,\n focus,\n });\n const { position, isPanning } = panningState;\n return { zoomRef: ref, panRef, position, isPanning, scale, onStepDown, onStepUp, isMaxZoom: isMax, isMinZoom: isMin };\n}\n\nfunction useHover() {\n const [nodeHover, setNodeHover] = useState<string | undefined>(undefined);\n const clearNodeHover = useCallback(() => setNodeHover(undefined), [setNodeHover]);\n const [edgeHover, setEdgeHover] = useState<string | undefined>(undefined);\n const clearEdgeHover = useCallback(() => setEdgeHover(undefined), [setEdgeHover]);\n\n return { nodeHover, setNodeHover, clearNodeHover, edgeHover, setEdgeHover, clearEdgeHover };\n}\n","import usePrevious from 'react-use/lib/usePrevious';\n\nimport { Config } from './layout';\nimport { NodeDatum } from './types';\n\nexport function useFocusPositionOnLayout(config: Config, nodes: NodeDatum[], focusedNodeId: string | undefined) {\n const prevLayoutGrid = usePrevious(config.gridLayout);\n let focusPosition;\n if (prevLayoutGrid === true && !config.gridLayout && focusedNodeId) {\n const node = nodes.find((n) => n.id === focusedNodeId);\n if (node) {\n focusPosition = {\n x: -node.x!,\n y: -node.y!,\n };\n }\n }\n\n return focusPosition;\n}\n","import { useEffect, useState } from 'react';\nimport useMountedState from 'react-use/lib/useMountedState';\n\nexport function useHighlight(focusedNodeId?: string) {\n const [highlightId, setHighlightId] = useState<string>();\n const mounted = useMountedState();\n useEffect(() => {\n if (focusedNodeId) {\n setHighlightId(focusedNodeId);\n setTimeout(() => {\n if (mounted()) {\n setHighlightId(undefined);\n }\n }, 500);\n }\n }, [focusedNodeId, mounted]);\n\n return highlightId;\n}\n","import { useMemo } from 'react';\n\nimport { DataFrame } from '@grafana/data';\n\n/**\n * As we need 2 dataframes for the service map, one with nodes and one with edges we have to figure out which is which.\n * Right now we do not have any metadata for it so we just check preferredVisualisationType and then column names.\n * TODO: maybe we could use column labels to have a better way to do this\n */\nexport function useCategorizeFrames(series: DataFrame[]) {\n return useMemo(() => {\n return series.reduce(\n (acc, frame) => {\n const sourceField = frame.fields.filter((f) => f.name === 'source');\n if (sourceField.length) {\n acc.edges.push(frame);\n } else {\n acc.nodes.push(frame);\n }\n return acc;\n },\n { edges: [], nodes: [] } as { nodes: DataFrame[]; edges: DataFrame[] }\n );\n }, [series]);\n}\n","import {\n ArrayVector,\n DataFrame,\n Field,\n FieldCache,\n FieldColorModeId,\n FieldType,\n GrafanaTheme2,\n MutableDataFrame,\n NodeGraphDataFrameFieldNames,\n} from '@grafana/data';\n\nimport { EdgeDatum, NodeDatum, NodeGraphOptions } from './types';\n\ntype Line = { x1: number; y1: number; x2: number; y2: number };\n\n/**\n * Makes line shorter while keeping the middle in he same place.\n */\nexport function shortenLine(line: Line, length: number): Line {\n const vx = line.x2 - line.x1;\n const vy = line.y2 - line.y1;\n const mag = Math.sqrt(vx * vx + vy * vy);\n const ratio = Math.max((mag - length) / mag, 0);\n const vx2 = vx * ratio;\n const vy2 = vy * ratio;\n const xDiff = vx - vx2;\n const yDiff = vy - vy2;\n const newx1 = line.x1 + xDiff / 2;\n const newy1 = line.y1 + yDiff / 2;\n return {\n x1: newx1,\n y1: newy1,\n x2: newx1 + vx2,\n y2: newy1 + vy2,\n };\n}\n\nexport function getNodeFields(nodes: DataFrame) {\n const normalizedFrames = {\n ...nodes,\n fields: nodes.fields.map((field) => ({ ...field, name: field.name.toLowerCase() })),\n };\n const fieldsCache = new FieldCache(normalizedFrames);\n return {\n id: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.id.toLowerCase()),\n title: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.title.toLowerCase()),\n subTitle: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.subTitle.toLowerCase()),\n mainStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.mainStat.toLowerCase()),\n secondaryStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.secondaryStat.toLowerCase()),\n arc: findFieldsByPrefix(nodes, NodeGraphDataFrameFieldNames.arc),\n details: findFieldsByPrefix(nodes, NodeGraphDataFrameFieldNames.detail),\n color: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.color),\n };\n}\n\nexport function getEdgeFields(edges: DataFrame) {\n const normalizedFrames = {\n ...edges,\n fields: edges.fields.map((field) => ({ ...field, name: field.name.toLowerCase() })),\n };\n const fieldsCache = new FieldCache(normalizedFrames);\n return {\n id: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.id.toLowerCase()),\n source: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.source.toLowerCase()),\n target: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.target.toLowerCase()),\n mainStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.mainStat.toLowerCase()),\n secondaryStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.secondaryStat.toLowerCase()),\n details: findFieldsByPrefix(edges, NodeGraphDataFrameFieldNames.detail.toLowerCase()),\n };\n}\n\nfunction findFieldsByPrefix(frame: DataFrame, prefix: string) {\n return frame.fields.filter((f) => f.name.match(new RegExp('^' + prefix)));\n}\n\n/**\n * Transform nodes and edges dataframes into array of objects that the layout code can then work with.\n */\nexport function processNodes(\n nodes: DataFrame | undefined,\n edges: DataFrame | undefined,\n theme: GrafanaTheme2\n): {\n nodes: NodeDatum[];\n edges: EdgeDatum[];\n legend?: Array<{\n color: string;\n name: string;\n }>;\n} {\n if (!nodes) {\n return { nodes: [], edges: [] };\n }\n\n const nodeFields = getNodeFields(nodes);\n if (!nodeFields.id) {\n throw new Error('id field is required for nodes data frame.');\n }\n\n const nodesMap =\n nodeFields.id.values.toArray().reduce<{ [id: string]: NodeDatum }>((acc, id, index) => {\n acc[id] = {\n id: id,\n title: nodeFields.title?.values.get(index) || '',\n subTitle: nodeFields.subTitle ? nodeFields.subTitle.values.get(index) : '',\n dataFrameRowIndex: index,\n incoming: 0,\n mainStat: nodeFields.mainStat,\n secondaryStat: nodeFields.secondaryStat,\n arcSections: nodeFields.arc,\n color: nodeFields.color,\n };\n return acc;\n }, {}) || {};\n\n let edgesMapped: EdgeDatum[] = [];\n // We may not have edges in case of single node\n if (edges) {\n const edgeFields = getEdgeFields(edges);\n if (!edgeFields.id) {\n throw new Error('id field is required for edges data frame.');\n }\n\n edgesMapped = edgeFields.id.values.toArray().map((id, index) => {\n const target = edgeFields.target?.values.get(index);\n const source = edgeFields.source?.values.get(index);\n // We are adding incoming edges count so we can later on find out which nodes are the roots\n nodesMap[target].incoming++;\n\n return {\n id,\n dataFrameRowIndex: index,\n source,\n target,\n mainStat: edgeFields.mainStat ? statToString(edgeFields.mainStat, index) : '',\n secondaryStat: edgeFields.secondaryStat ? statToString(edgeFields.secondaryStat, index) : '',\n } as EdgeDatum;\n });\n }\n\n return {\n nodes: Object.values(nodesMap),\n edges: edgesMapped || [],\n legend: nodeFields.arc.map((f) => {\n return {\n color: f.config.color?.fixedColor ?? '',\n name: f.config.displayName || f.name,\n };\n }),\n };\n}\n\nexport function statToString(field: Field, index: number) {\n if (field.type === FieldType.string) {\n return field.values.get(index);\n } else {\n const decimals = field.config.decimals || 2;\n const val = field.values.get(index);\n if (Number.isFinite(val)) {\n return field.values.get(index).toFixed(decimals) + (field.config.unit ? ' ' + field.config.unit : '');\n } else {\n return '';\n }\n }\n}\n\n/**\n * Utilities mainly for testing\n */\n\nexport function makeNodesDataFrame(count: number) {\n const frame = nodesFrame();\n for (let i = 0; i < count; i++) {\n frame.add(makeNode(i));\n }\n\n return frame;\n}\n\nfunction makeNode(index: number) {\n return {\n id: index.toString(),\n title: `service:${index}`,\n subtitle: 'service',\n arc__success: 0.5,\n arc__errors: 0.5,\n mainstat: 0.1,\n secondarystat: 2,\n color: 0.5,\n };\n}\n\nfunction nodesFrame() {\n const fields: any = {\n [NodeGraphDataFrameFieldNames.id]: {\n values: new ArrayVector(),\n type: FieldType.string,\n },\n [NodeGraphDataFrameFieldNames.title]: {\n values: new ArrayVector(),\n type: FieldType.string,\n },\n [NodeGraphDataFrameFieldNames.subTitle]: {\n values: new ArrayVector(),\n type: FieldType.string,\n },\n [NodeGraphDataFrameFieldNames.mainStat]: {\n values: new ArrayVector(),\n type: FieldType.number,\n },\n [NodeGraphDataFrameFieldNames.secondaryStat]: {\n values: new ArrayVector(),\n type: FieldType.number,\n },\n [NodeGraphDataFrameFieldNames.arc + 'success']: {\n values: new ArrayVector(),\n type: FieldType.number,\n config: { color: { fixedColor: 'green' } },\n },\n [NodeGraphDataFrameFieldNames.arc + 'errors']: {\n values: new ArrayVector(),\n type: FieldType.number,\n config: { color: { fixedColor: 'red' } },\n },\n\n [NodeGraphDataFrameFieldNames.color]: {\n values: new ArrayVector(),\n type: FieldType.number,\n config: { color: { mode: 'continuous-GrYlRd' } },\n },\n };\n\n return new MutableDataFrame({\n name: 'nodes',\n fields: Object.keys(fields).map((key) => ({\n ...fields[key],\n name: key,\n })),\n });\n}\n\nexport function makeEdgesDataFrame(edges: Array<[number, number]>) {\n const frame = edgesFrame();\n for (const edge of edges) {\n frame.add({\n id: edge[0] + '--' + edge[1],\n source: edge[0].toString(),\n target: edge[1].toString(),\n });\n }\n\n return frame;\n}\n\nfunction edgesFrame() {\n const fields: any = {\n [NodeGraphDataFrameFieldNames.id]: {\n values: new ArrayVector(),\n type: FieldType.string,\n },\n [NodeGraphDataFrameFieldNames.source]: {\n values: new ArrayVector(),\n type: FieldType.string,\n },\n [NodeGraphDataFrameFieldNames.target]: {\n values: new ArrayVector(),\n type: FieldType.string,\n },\n };\n\n return new MutableDataFrame({\n name: 'edges',\n fields: Object.keys(fields).map((key) => ({\n ...fields[key],\n name: key,\n })),\n });\n}\n\nexport interface Bounds {\n top: number;\n right: number;\n bottom: number;\n left: number;\n center: {\n x: number;\n y: number;\n };\n}\n\n/**\n * Get bounds of the graph meaning the extent of the nodes in all directions.\n */\nexport function graphBounds(nodes: NodeDatum[]): Bounds {\n if (nodes.length === 0) {\n return { top: 0, right: 0, bottom: 0, left: 0, center: { x: 0, y: 0 } };\n }\n\n const bounds = nodes.reduce(\n (acc, node) => {\n if (node.x! > acc.right) {\n acc.right = node.x!;\n }\n if (node.x! < acc.left) {\n acc.left = node.x!;\n }\n if (node.y! > acc.bottom) {\n acc.bottom = node.y!;\n }\n if (node.y! < acc.top) {\n acc.top = node.y!;\n }\n return acc;\n },\n { top: Infinity, right: -Infinity, bottom: -Infinity, left: Infinity }\n );\n\n const y = bounds.top + (bounds.bottom - bounds.top) / 2;\n const x = bounds.left + (bounds.right - bounds.left) / 2;\n\n return {\n ...bounds,\n center: {\n x,\n y,\n },\n };\n}\n\nexport function getNodeGraphDataFrames(frames: DataFrame[], options?: NodeGraphOptions) {\n // TODO: this not in sync with how other types of responses are handled. Other types have a query response\n // processing pipeline which ends up populating redux state with proper data. As we move towards more dataFrame\n // oriented API it seems like a better direction to move such processing into to visualisations and do minimal\n // and lazy processing here. Needs bigger refactor so keeping nodeGraph and Traces as they are for now.\n let nodeGraphFrames = frames.filter((frame) => {\n if (frame.meta?.preferredVisualisationType === 'nodeGraph') {\n return true;\n }\n\n if (frame.name === 'nodes' || frame.name === 'edges' || frame.refId === 'nodes' || frame.refId === 'edges') {\n return true;\n }\n\n const fieldsCache = new FieldCache(frame);\n if (fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.id)) {\n return true;\n }\n\n return false;\n });\n\n // If panel options are provided, interpolate their values in to the data frames\n if (options) {\n nodeGraphFrames = applyOptionsToFrames(nodeGraphFrames, options);\n }\n return nodeGraphFrames;\n}\n\nexport const applyOptionsToFrames = (frames: DataFrame[], options: NodeGraphOptions): DataFrame[] => {\n return frames.map((frame) => {\n const fieldsCache = new FieldCache(frame);\n\n // Edges frame has source which can be used to identify nodes vs edges frames\n if (fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.source.toLowerCase())) {\n if (options?.edges?.mainStatUnit) {\n const field = frame.fields.find((field) => field.name.toLowerCase() === NodeGraphDataFrameFieldNames.mainStat);\n if (field) {\n field.config = { ...field.config, unit: options.edges.mainStatUnit };\n }\n }\n if (options?.edges?.secondaryStatUnit) {\n const field = frame.fields.find(\n (field) => field.name.toLowerCase() === NodeGraphDataFrameFieldNames.secondaryStat\n );\n if (field) {\n field.config = { ...field.config, unit: options.edges.secondaryStatUnit };\n }\n }\n } else {\n if (options?.nodes?.mainStatUnit) {\n const field = frame.fields.find((field) => field.name.toLowerCase() === NodeGraphDataFrameFieldNames.mainStat);\n if (field) {\n field.config = { ...field.config, unit: options.nodes.mainStatUnit };\n }\n }\n if (options?.nodes?.secondaryStatUnit) {\n const field = frame.fields.find(\n (field) => field.name.toLowerCase() === NodeGraphDataFrameFieldNames.secondaryStat\n );\n if (field) {\n field.config = { ...field.config, unit: options.nodes.secondaryStatUnit };\n }\n }\n if (options?.nodes?.arcs?.length) {\n for (const arc of options.nodes.arcs) {\n const field = frame.fields.find((field) => field.name.toLowerCase() === arc.field);\n if (field && arc.color) {\n field.config = { ...field.config, color: { fixedColor: arc.color, mode: FieldColorModeId.Fixed } };\n }\n }\n }\n }\n return frame;\n });\n};\n\n// Returns an array of node ids which are connected to a given edge\nexport const findConnectedNodesForEdge = (nodes: NodeDatum[], edges: EdgeDatum[], edgeId: string): string[] => {\n const edge = edges.find((edge) => edge.id === edgeId);\n if (edge) {\n return [\n ...new Set(nodes.filter((node) => edge.source === node.id || edge.target === node.id).map((node) => node.id)),\n ];\n }\n return [];\n};\n\n// Returns an array of node ids which are connected to a given node\nexport const findConnectedNodesForNode = (nodes: NodeDatum[], edges: EdgeDatum[], nodeId: string): string[] => {\n const node = nodes.find((node) => node.id === nodeId);\n if (node) {\n const linkedEdges = edges.filter((edge) => edge.source === node.id || edge.target === node.id);\n return [\n ...new Set(\n linkedEdges.flatMap((edge) =>\n nodes.filter((n) => edge.source === n.id || edge.target === n.id).map((n) => n.id)\n )\n ),\n ];\n }\n return [];\n};\n","// These are used in some other plugins for some reason\n\nimport {\n escapeStringForRegex,\n FieldOverrideContext,\n getFieldDisplayName,\n PanelOptionsEditorBuilder,\n ReducerID,\n standardEditorsRegistry,\n} from '@grafana/data';\nimport { SingleStatBaseOptions, VizOrientation } from '@grafana/schema';\n\nexport function addStandardDataReduceOptions<T extends SingleStatBaseOptions>(\n builder: PanelOptionsEditorBuilder<T>,\n includeFieldMatcher = true\n) {\n const valueOptionsCategory = ['Value options'];\n\n builder.addRadio({\n path: 'reduceOptions.values',\n name: 'Show',\n description: 'Calculate a single value per column or series or show each row',\n settings: {\n options: [\n { value: false, label: 'Calculate' },\n { value: true, label: 'All values' },\n ],\n },\n category: valueOptionsCategory,\n defaultValue: false,\n });\n\n builder.addNumberInput({\n path: 'reduceOptions.limit',\n name: 'Limit',\n description: 'Max number of rows to display',\n category: valueOptionsCategory,\n settings: {\n placeholder: '25',\n integer: true,\n min: 1,\n max: 5000,\n },\n showIf: (options) => options.reduceOptions.values === true,\n });\n\n builder.addCustomEditor({\n id: 'reduceOptions.calcs',\n path: 'reduceOptions.calcs',\n name: 'Calculation',\n description: 'Choose a reducer function / calculation',\n category: valueOptionsCategory,\n editor: standardEditorsRegistry.get('stats-picker').editor as any,\n // TODO: Get ReducerID from generated schema one day?\n defaultValue: [ReducerID.lastNotNull],\n // Hides it when all values mode is on\n showIf: (currentConfig) => currentConfig.reduceOptions.values === false,\n });\n\n if (includeFieldMatcher) {\n builder.addSelect({\n path: 'reduceOptions.fields',\n name: 'Fields',\n description: 'Select the fields that should be included in the panel',\n category: valueOptionsCategory,\n settings: {\n allowCustomValue: true,\n options: [],\n getOptions: async (context: FieldOverrideContext) => {\n const options = [\n { value: '', label: 'Numeric Fields' },\n { value: '/.*/', label: 'All Fields' },\n ];\n if (context && context.data) {\n for (const frame of context.data) {\n for (const field of frame.fields) {\n const name = getFieldDisplayName(field, frame, context.data);\n const value = `/^${escapeStringForRegex(name)}$/`;\n options.push({ value, label: name });\n }\n }\n }\n return Promise.resolve(options);\n },\n },\n defaultValue: '',\n });\n }\n}\n\nexport function addOrientationOption<T extends SingleStatBaseOptions>(\n builder: PanelOptionsEditorBuilder<T>,\n category?: string[]\n) {\n builder.addRadio({\n path: 'orientation',\n name: 'Orientation',\n description: 'Layout orientation',\n category,\n settings: {\n options: [\n { value: VizOrientation.Auto, label: 'Auto' },\n { value: VizOrientation.Horizontal, label: 'Horizontal' },\n { value: VizOrientation.Vertical, label: 'Vertical' },\n ],\n },\n defaultValue: VizOrientation.Auto,\n });\n}\n","import { isNumber } from 'lodash';\nimport React, { PureComponent } from 'react';\n\nimport {\n DisplayValueAlignmentFactors,\n FieldDisplay,\n FieldType,\n getDisplayValueAlignmentFactors,\n getFieldDisplayValues,\n NumericRange,\n PanelProps,\n} from '@grafana/data';\nimport { findNumericFieldMinMax } from '@grafana/data/src/field/fieldOverrides';\nimport { BigValueTextMode, BigValueGraphMode } from '@grafana/schema';\nimport { BigValue, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\nimport { config } from 'app/core/config';\n\nimport { PanelOptions } from './models.gen';\n\nexport class StatPanel extends PureComponent<PanelProps<PanelOptions>> {\n renderComponent = (\n valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>,\n menuProps: DataLinksContextMenuApi\n ): JSX.Element => {\n const { timeRange, options } = this.props;\n const { value, alignmentFactors, width, height, count } = valueProps;\n const { openMenu, targetClassName } = menuProps;\n let sparkline = value.sparkline;\n if (sparkline) {\n sparkline.timeRange = timeRange;\n }\n\n return (\n <BigValue\n value={value.display}\n count={count}\n sparkline={sparkline}\n colorMode={options.colorMode}\n graphMode={options.graphMode}\n justifyMode={options.justifyMode}\n textMode={this.getTextMode()}\n alignmentFactors={alignmentFactors}\n text={options.text}\n width={width}\n height={height}\n theme={config.theme2}\n onClick={openMenu}\n className={targetClassName}\n />\n );\n };\n\n getTextMode() {\n const { options, fieldConfig, title } = this.props;\n\n // If we have manually set displayName or panel title switch text mode to value and name\n if (options.textMode === BigValueTextMode.Auto && (fieldConfig.defaults.displayName || !title)) {\n return BigValueTextMode.ValueAndName;\n }\n\n return options.textMode;\n }\n\n renderValue = (valueProps: VizRepeaterRenderValueProps<FieldDisplay, DisplayValueAlignmentFactors>): JSX.Element => {\n const { value } = valueProps;\n const { getLinks, hasLinks } = value;\n\n if (hasLinks && getLinks) {\n return (\n <DataLinksContextMenu links={getLinks}>\n {(api) => {\n return this.renderComponent(valueProps, api);\n }}\n </DataLinksContextMenu>\n );\n }\n\n return this.renderComponent(valueProps, {});\n };\n\n getValues = (): FieldDisplay[] => {\n const { data, options, replaceVariables, fieldConfig, timeZone } = this.props;\n\n let globalRange: NumericRange | undefined = undefined;\n\n for (let frame of data.series) {\n for (let field of frame.fields) {\n let { config } = field;\n // mostly copied from fieldOverrides, since they are skipped during streaming\n // Set the Min/Max value automatically\n if (field.type === FieldType.number) {\n if (field.state?.range) {\n continue;\n }\n if (!globalRange && (!isNumber(config.min) || !isNumber(config.max))) {\n globalRange = findNumericFieldMinMax(data.series);\n }\n const min = config.min ?? globalRange!.min;\n const max = config.max ?? globalRange!.max;\n field.state = field.state ?? {};\n field.state.range = { min, max, delta: max! - min! };\n }\n }\n }\n\n return getFieldDisplayValues({\n fieldConfig,\n reduceOptions: options.reduceOptions,\n replaceVariables,\n theme: config.theme2,\n data: data.series,\n sparkline: options.graphMode !== BigValueGraphMode.None,\n timeZone,\n });\n };\n\n render() {\n const { height, options, width, data, renderCounter } = this.props;\n\n return (\n <VizRepeater\n getValues={this.getValues}\n getAlignmentFactors={getDisplayValueAlignmentFactors}\n renderValue={this.renderValue}\n width={width}\n height={height}\n source={data}\n itemSpacing={3}\n renderCounter={renderCounter}\n autoGrid={true}\n orientation={options.orientation}\n />\n );\n }\n}\n","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file is autogenerated. DO NOT EDIT.\n//\n// To regenerate, run \"make gen-cue\" from the repository root.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nimport * as ui from '@grafana/schema';\n\nexport const modelVersion = Object.freeze([0, 0]);\n\n\nexport interface PanelOptions extends ui.SingleStatBaseOptions {\n colorMode: ui.BigValueColorMode;\n graphMode: ui.BigValueGraphMode;\n justifyMode: ui.BigValueJustifyMode;\n textMode: ui.BigValueTextMode;\n}\n\nexport const defaultPanelOptions: Partial<PanelOptions> = {\n colorMode: ui.BigValueColorMode.Value,\n graphMode: ui.BigValueGraphMode.Area,\n justifyMode: ui.BigValueJustifyMode.Auto,\n textMode: ui.BigValueTextMode.Auto,\n};\n","import { PanelPlugin } from '@grafana/data';\nimport { BigValueColorMode, BigValueGraphMode, BigValueJustifyMode, BigValueTextMode } from '@grafana/schema';\nimport { commonOptionsBuilder, sharedSingleStatMigrationHandler } from '@grafana/ui';\n\nimport { statPanelChangedHandler } from './StatMigrations';\nimport { StatPanel } from './StatPanel';\nimport { addStandardDataReduceOptions, addOrientationOption } from './common';\nimport { defaultPanelOptions, PanelOptions } from './models.gen';\nimport { StatSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<PanelOptions>(StatPanel)\n .useFieldConfig()\n .setPanelOptions((builder) => {\n const mainCategory = ['Stat styles'];\n\n addStandardDataReduceOptions(builder);\n addOrientationOption(builder, mainCategory);\n commonOptionsBuilder.addTextSizeOptions(builder);\n\n builder.addSelect({\n path: 'textMode',\n name: 'Text mode',\n description: 'Control if name and value is displayed or just name',\n category: mainCategory,\n settings: {\n options: [\n { value: BigValueTextMode.Auto, label: 'Auto' },\n { value: BigValueTextMode.Value, label: 'Value' },\n { value: BigValueTextMode.ValueAndName, label: 'Value and name' },\n { value: BigValueTextMode.Name, label: 'Name' },\n { value: BigValueTextMode.None, label: 'None' },\n ],\n },\n defaultValue: defaultPanelOptions.textMode,\n });\n\n builder\n .addRadio({\n path: 'colorMode',\n name: 'Color mode',\n defaultValue: BigValueColorMode.Value,\n category: mainCategory,\n settings: {\n options: [\n { value: BigValueColorMode.None, label: 'None' },\n { value: BigValueColorMode.Value, label: 'Value' },\n { value: BigValueColorMode.Background, label: 'Background' },\n ],\n },\n })\n .addRadio({\n path: 'graphMode',\n name: 'Graph mode',\n description: 'Stat panel graph / sparkline mode',\n category: mainCategory,\n defaultValue: defaultPanelOptions.graphMode,\n settings: {\n options: [\n { value: BigValueGraphMode.None, label: 'None' },\n { value: BigValueGraphMode.Area, label: 'Area' },\n ],\n },\n })\n .addRadio({\n path: 'justifyMode',\n name: 'Text alignment',\n defaultValue: defaultPanelOptions.justifyMode,\n category: mainCategory,\n settings: {\n options: [\n { value: BigValueJustifyMode.Auto, label: 'Auto' },\n { value: BigValueJustifyMode.Center, label: 'Center' },\n ],\n },\n });\n })\n .setNoPadding()\n .setPanelChangeHandler(statPanelChangedHandler)\n .setSuggestionsSupplier(new StatSuggestionsSupplier())\n .setMigrationHandler(sharedSingleStatMigrationHandler);\n","import { FieldColorModeId, FieldConfigSource, PanelModel } from '@grafana/data';\nimport { BigValueTextMode, BigValueGraphMode, BigValueColorMode } from '@grafana/schema';\nimport { sharedSingleStatPanelChangedHandler } from '@grafana/ui';\n\nimport { PanelOptions } from './models.gen';\n\n// This is called when the panel changes from another panel\nexport const statPanelChangedHandler = (\n panel: PanelModel<Partial<PanelOptions>> | any,\n prevPluginId: string,\n prevOptions: any\n) => {\n // This handles most config changes\n const options = sharedSingleStatPanelChangedHandler(panel, prevPluginId, prevOptions) as PanelOptions;\n\n // Changing from angular singlestat\n if (prevOptions.angular && (prevPluginId === 'singlestat' || prevPluginId === 'grafana-singlestat-panel')) {\n const oldOptions = prevOptions.angular;\n\n options.graphMode = BigValueGraphMode.None;\n if (oldOptions.sparkline && oldOptions.sparkline.show) {\n options.graphMode = BigValueGraphMode.Area;\n }\n\n if (oldOptions.colorBackground) {\n options.colorMode = BigValueColorMode.Background;\n } else if (oldOptions.colorValue) {\n options.colorMode = BigValueColorMode.Value;\n } else {\n options.colorMode = BigValueColorMode.None;\n if (oldOptions.sparkline?.lineColor && options.graphMode === BigValueGraphMode.Area) {\n const cfg: FieldConfigSource = panel.fieldConfig ?? {};\n cfg.defaults.color = {\n mode: FieldColorModeId.Fixed,\n fixedColor: oldOptions.sparkline.lineColor,\n };\n panel.fieldConfig = cfg;\n }\n }\n\n if (oldOptions.valueName === 'name') {\n options.textMode = BigValueTextMode.Name;\n }\n }\n\n return options;\n};\n","import { VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { BigValueColorMode, BigValueGraphMode } from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\n\nimport { PanelOptions } from './models.gen';\n\nexport class StatSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary: ds } = builder;\n\n if (!ds.hasData) {\n return;\n }\n\n const list = builder.getListAppender<PanelOptions, {}>({\n name: SuggestionName.Stat,\n pluginId: 'stat',\n options: {},\n fieldConfig: {\n defaults: {\n unit: 'short',\n custom: {},\n },\n overrides: [],\n },\n cardOptions: {\n previewModifier: (s) => {\n if (s.options!.reduceOptions.values) {\n s.options!.reduceOptions.limit = 1;\n }\n },\n },\n });\n\n // String and number field with low row count show individual rows\n if (ds.hasStringField && ds.hasNumberField && ds.frameCount === 1 && ds.rowCountTotal < 10) {\n list.append({\n name: SuggestionName.Stat,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n fields: '/.*/',\n },\n },\n });\n list.append({\n name: SuggestionName.StatColoredBackground,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n fields: '/.*/',\n },\n colorMode: BigValueColorMode.Background,\n },\n });\n }\n\n // Just a single string field\n if (ds.stringFieldCount === 1 && ds.frameCount === 1 && ds.rowCountTotal < 10 && ds.fieldCount === 1) {\n list.append({\n name: SuggestionName.Stat,\n options: {\n reduceOptions: {\n values: true,\n calcs: [],\n fields: '/.*/',\n },\n colorMode: BigValueColorMode.None,\n },\n });\n }\n\n if (ds.hasNumberField && ds.hasTimeField) {\n list.append({\n options: {\n reduceOptions: {\n values: false,\n calcs: ['lastNotNull'],\n },\n },\n });\n\n list.append({\n name: SuggestionName.StatColoredBackground,\n options: {\n reduceOptions: {\n values: false,\n calcs: ['lastNotNull'],\n },\n graphMode: BigValueGraphMode.None,\n colorMode: BigValueColorMode.Background,\n },\n });\n }\n }\n}\n","import { DashboardCursorSync } from '@grafana/data';\nimport {\n HideableFieldConfig,\n OptionsWithLegend,\n OptionsWithTimezones,\n OptionsWithTooltip,\n VisibilityMode,\n} from '@grafana/schema';\n\n/**\n * @alpha\n */\nexport interface TimelineOptions extends OptionsWithLegend, OptionsWithTooltip, OptionsWithTimezones {\n mode: TimelineMode; // not in the saved model!\n\n showValue: VisibilityMode;\n rowHeight: number;\n\n // only used for \"samples\" mode (status-history)\n colWidth?: number;\n // only used in \"changes\" mode (state-timeline)\n mergeValues?: boolean;\n // only used in \"changes\" mode (state-timeline)\n alignValue?: TimelineValueAlignment;\n\n sync?: () => DashboardCursorSync;\n getValueColor?: (frameIdx: number, fieldIdx: number, value: any) => string;\n}\n\nexport type TimelineValueAlignment = 'center' | 'left' | 'right';\n\n/**\n * @alpha\n */\nexport interface TimelineFieldConfig extends HideableFieldConfig {\n lineWidth?: number; // 0\n fillOpacity?: number; // 100\n}\n\n/**\n * @alpha\n */\nexport const defaultPanelOptions: Partial<TimelineOptions> = {\n showValue: VisibilityMode.Auto,\n alignValue: 'left',\n mergeValues: true,\n rowHeight: 0.9,\n};\n\n/**\n * @alpha\n */\nexport const defaultTimelineFieldConfig: TimelineFieldConfig = {\n lineWidth: 0,\n fillOpacity: 70,\n};\n\n/**\n * @alpha\n */\nexport enum TimelineMode {\n // state-timeline\n Changes = 'changes',\n // status-history\n Samples = 'samples',\n}\n","import uPlot, { Cursor, Series } from 'uplot';\n\nimport { GrafanaTheme2, TimeRange } from '@grafana/data';\nimport { alpha } from '@grafana/data/src/themes/colorManipulator';\nimport { VisibilityMode } from '@grafana/schema';\nimport { FIXED_UNIT } from '@grafana/ui/src/components/GraphNG/GraphNG';\nimport { distribute, SPACE_BETWEEN } from 'app/plugins/panel/barchart/distribute';\nimport { pointWithin, Quadtree, Rect } from 'app/plugins/panel/barchart/quadtree';\n\nimport { TimelineFieldConfig, TimelineMode, TimelineValueAlignment } from './types';\n\nconst { round, min, ceil } = Math;\n\nconst textPadding = 2;\n\nconst pxRatio = devicePixelRatio;\n\nconst laneDistr = SPACE_BETWEEN;\n\ntype WalkCb = (idx: number, offPx: number, dimPx: number) => void;\n\nfunction walk(rowHeight: number, yIdx: number | null, count: number, dim: number, draw: WalkCb) {\n distribute(count, rowHeight, laneDistr, yIdx, (i, offPct, dimPct) => {\n let laneOffPx = dim * offPct;\n let laneWidPx = dim * dimPct;\n\n draw(i, laneOffPx, laneWidPx);\n });\n}\n\ninterface TimelineBoxRect extends Rect {\n fillColor: string;\n}\n\n/**\n * @internal\n */\nexport interface TimelineCoreOptions {\n mode: TimelineMode;\n alignValue?: TimelineValueAlignment;\n numSeries: number;\n rowHeight: number;\n colWidth?: number;\n theme: GrafanaTheme2;\n showValue: VisibilityMode;\n mergeValues?: boolean;\n isDiscrete: (seriesIdx: number) => boolean;\n getValueColor: (seriesIdx: number, value: any) => string;\n label: (seriesIdx: number) => string;\n getTimeRange: () => TimeRange;\n formatValue?: (seriesIdx: number, value: any) => string;\n getFieldConfig: (seriesIdx: number) => TimelineFieldConfig;\n onHover: (seriesIdx: number, valueIdx: number, rect: Rect) => void;\n onLeave: () => void;\n}\n\n/**\n * @internal\n */\nexport function getConfig(opts: TimelineCoreOptions) {\n const {\n mode,\n numSeries,\n isDiscrete,\n rowHeight = 0,\n colWidth = 0,\n showValue,\n mergeValues = false,\n theme,\n label,\n formatValue,\n alignValue = 'left',\n getTimeRange,\n getValueColor,\n getFieldConfig,\n onHover,\n onLeave,\n } = opts;\n\n let qt: Quadtree;\n\n const hoverMarks = Array(numSeries)\n .fill(null)\n .map(() => {\n let mark = document.createElement('div');\n mark.classList.add('bar-mark');\n mark.style.position = 'absolute';\n mark.style.background = 'rgba(255,255,255,0.2)';\n return mark;\n });\n\n // Needed for to calculate text positions\n let boxRectsBySeries: TimelineBoxRect[][];\n\n const resetBoxRectsBySeries = (count: number) => {\n boxRectsBySeries = Array(numSeries)\n .fill(null)\n .map((v) => Array(count).fill(null));\n };\n\n const font = `500 ${Math.round(12 * devicePixelRatio)}px ${theme.typography.fontFamily}`;\n const hovered: Array<Rect | null> = Array(numSeries).fill(null);\n\n const size = [colWidth, Infinity];\n const gapFactor = 1 - size[0];\n const maxWidth = (size[1] ?? Infinity) * pxRatio;\n\n const fillPaths: Map<CanvasRenderingContext2D['fillStyle'], Path2D> = new Map();\n const strokePaths: Map<CanvasRenderingContext2D['strokeStyle'], Path2D> = new Map();\n\n function drawBoxes(ctx: CanvasRenderingContext2D) {\n fillPaths.forEach((fillPath, fillStyle) => {\n ctx.fillStyle = fillStyle;\n ctx.fill(fillPath);\n });\n\n strokePaths.forEach((strokePath, strokeStyle) => {\n ctx.strokeStyle = strokeStyle;\n ctx.stroke(strokePath);\n });\n\n fillPaths.clear();\n strokePaths.clear();\n }\n\n function putBox(\n ctx: CanvasRenderingContext2D,\n rect: uPlot.RectH,\n xOff: number,\n yOff: number,\n left: number,\n top: number,\n boxWidth: number,\n boxHeight: number,\n strokeWidth: number,\n seriesIdx: number,\n valueIdx: number,\n value: any,\n discrete: boolean\n ) {\n // do not render super small boxes\n if (boxWidth < 1) {\n return;\n }\n\n const valueColor = getValueColor(seriesIdx + 1, value);\n const fieldConfig = getFieldConfig(seriesIdx);\n const fillColor = getFillColor(fieldConfig, valueColor);\n\n boxRectsBySeries[seriesIdx][valueIdx] = {\n x: round(left - xOff),\n y: round(top - yOff),\n w: boxWidth,\n h: boxHeight,\n sidx: seriesIdx + 1,\n didx: valueIdx,\n // for computing label contrast\n fillColor,\n };\n\n if (discrete) {\n let fillStyle = fillColor;\n let fillPath = fillPaths.get(fillStyle);\n\n if (fillPath == null) {\n fillPaths.set(fillStyle, (fillPath = new Path2D()));\n }\n\n rect(fillPath, left, top, boxWidth, boxHeight);\n\n if (strokeWidth) {\n let strokeStyle = valueColor;\n let strokePath = strokePaths.get(strokeStyle);\n\n if (strokePath == null) {\n strokePaths.set(strokeStyle, (strokePath = new Path2D()));\n }\n\n rect(\n strokePath,\n left + strokeWidth / 2,\n top + strokeWidth / 2,\n boxWidth - strokeWidth,\n boxHeight - strokeWidth\n );\n }\n } else {\n ctx.beginPath();\n rect(ctx, left, top, boxWidth, boxHeight);\n ctx.fillStyle = fillColor;\n ctx.fill();\n\n if (strokeWidth) {\n ctx.beginPath();\n rect(ctx, left + strokeWidth / 2, top + strokeWidth / 2, boxWidth - strokeWidth, boxHeight - strokeWidth);\n ctx.strokeStyle = valueColor;\n ctx.lineWidth = strokeWidth;\n ctx.stroke();\n }\n }\n }\n\n const drawPaths: Series.PathBuilder = (u, sidx, idx0, idx1) => {\n uPlot.orient(\n u,\n sidx,\n (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim, moveTo, lineTo, rect) => {\n let strokeWidth = round((series.width || 0) * pxRatio);\n\n let discrete = isDiscrete(sidx);\n\n u.ctx.save();\n rect(u.ctx, u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n u.ctx.clip();\n\n walk(rowHeight, sidx - 1, numSeries, yDim, (iy, y0, height) => {\n if (mode === TimelineMode.Changes) {\n for (let ix = 0; ix < dataY.length; ix++) {\n let yVal = dataY[ix];\n\n if (yVal != null) {\n let left = Math.round(valToPosX(dataX[ix], scaleX, xDim, xOff));\n\n let nextIx = ix;\n while (\n ++nextIx < dataY.length &&\n (dataY[nextIx] === undefined || (mergeValues && dataY[nextIx] === yVal))\n ) {}\n\n // to now (not to end of chart)\n let right =\n nextIx === dataY.length\n ? xOff + xDim + strokeWidth\n : Math.round(valToPosX(dataX[nextIx], scaleX, xDim, xOff));\n\n putBox(\n u.ctx,\n rect,\n xOff,\n yOff,\n left,\n round(yOff + y0),\n right - left,\n round(height),\n strokeWidth,\n iy,\n ix,\n yVal,\n discrete\n );\n\n ix = nextIx - 1;\n }\n }\n } else if (mode === TimelineMode.Samples) {\n let colWid = valToPosX(dataX[1], scaleX, xDim, xOff) - valToPosX(dataX[0], scaleX, xDim, xOff);\n let gapWid = colWid * gapFactor;\n let barWid = round(min(maxWidth, colWid - gapWid) - strokeWidth);\n let xShift = barWid / 2;\n //let xShift = align === 1 ? 0 : align === -1 ? barWid : barWid / 2;\n\n for (let ix = idx0; ix <= idx1; ix++) {\n if (dataY[ix] != null) {\n // TODO: all xPos can be pre-computed once for all series in aligned set\n let left = valToPosX(dataX[ix], scaleX, xDim, xOff);\n\n putBox(\n u.ctx,\n rect,\n xOff,\n yOff,\n round(left - xShift),\n round(yOff + y0),\n barWid,\n round(height),\n strokeWidth,\n iy,\n ix,\n dataY[ix],\n discrete\n );\n }\n }\n }\n });\n\n if (discrete) {\n u.ctx.lineWidth = strokeWidth;\n drawBoxes(u.ctx);\n }\n\n u.ctx.restore();\n }\n );\n\n return null;\n };\n\n const drawPoints: Series.Points.Show =\n formatValue == null || showValue === VisibilityMode.Never\n ? false\n : (u, sidx, i0, i1) => {\n u.ctx.save();\n u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n u.ctx.clip();\n\n u.ctx.font = font;\n u.ctx.textAlign = mode === TimelineMode.Changes ? alignValue : 'center';\n u.ctx.textBaseline = 'middle';\n\n uPlot.orient(\n u,\n sidx,\n (series, dataX, dataY, scaleX, scaleY, valToPosX, valToPosY, xOff, yOff, xDim, yDim) => {\n let strokeWidth = round((series.width || 0) * pxRatio);\n\n let y = round(yOff + yMids[sidx - 1]);\n\n for (let ix = 0; ix < dataY.length; ix++) {\n if (dataY[ix] != null) {\n const boxRect = boxRectsBySeries[sidx - 1][ix];\n\n // Todo refine this to better know when to not render text (when values do not fit)\n if (!boxRect || (showValue === VisibilityMode.Auto && boxRect.w < 25)) {\n continue;\n }\n\n if (boxRect.x >= xDim) {\n continue; // out of view\n }\n\n // center-aligned\n let x = round(boxRect.x + xOff + boxRect.w / 2);\n const txt = formatValue(sidx, dataY[ix]);\n\n if (mode === TimelineMode.Changes) {\n if (alignValue === 'left') {\n x = round(boxRect.x + xOff + strokeWidth + textPadding);\n } else if (alignValue === 'right') {\n x = round(boxRect.x + xOff + boxRect.w - strokeWidth - textPadding);\n }\n }\n\n // TODO: cache by fillColor to avoid setting ctx for label\n u.ctx.fillStyle = theme.colors.getContrastText(boxRect.fillColor, 3);\n u.ctx.fillText(txt, x, y);\n }\n }\n }\n );\n\n u.ctx.restore();\n\n return false;\n };\n\n const init = (u: uPlot) => {\n let over = u.over;\n over.style.overflow = 'hidden';\n hoverMarks.forEach((m) => {\n over.appendChild(m);\n });\n };\n\n const drawClear = (u: uPlot) => {\n qt = qt || new Quadtree(0, 0, u.bbox.width, u.bbox.height);\n\n qt.clear();\n resetBoxRectsBySeries(u.data[0].length);\n\n // force-clear the path cache to cause drawBars() to rebuild new quadtree\n u.series.forEach((s) => {\n // @ts-ignore\n s._paths = null;\n });\n };\n\n function setHoverMark(i: number, o: Rect | null) {\n let h = hoverMarks[i];\n\n if (o) {\n h.style.display = '';\n h.style.left = round(o.x / pxRatio) + 'px';\n h.style.top = round(o.y / pxRatio) + 'px';\n h.style.width = round(o.w / pxRatio) + 'px';\n h.style.height = round(o.h / pxRatio) + 'px';\n } else {\n h.style.display = 'none';\n }\n\n hovered[i] = o;\n }\n\n let hoveredAtCursor: Rect | undefined;\n\n function hoverMulti(cx: number, cy: number) {\n let foundAtCursor: Rect | undefined;\n\n for (let i = 0; i < numSeries; i++) {\n let found: Rect | undefined;\n\n if (cx >= 0) {\n let cy2 = yMids[i];\n\n qt.get(cx, cy2, 1, 1, (o) => {\n if (pointWithin(cx, cy2, o.x, o.y, o.x + o.w, o.y + o.h)) {\n found = o;\n\n if (Math.abs(cy - cy2) <= o.h / 2) {\n foundAtCursor = o;\n }\n }\n });\n }\n\n if (found) {\n if (found !== hovered[i]) {\n setHoverMark(i, found);\n }\n } else if (hovered[i] != null) {\n setHoverMark(i, null);\n }\n }\n\n if (foundAtCursor) {\n if (foundAtCursor !== hoveredAtCursor) {\n hoveredAtCursor = foundAtCursor;\n onHover(foundAtCursor.sidx, foundAtCursor.didx, foundAtCursor);\n }\n } else if (hoveredAtCursor) {\n hoveredAtCursor = undefined;\n onLeave();\n }\n }\n\n function hoverOne(cx: number, cy: number) {\n let foundAtCursor: Rect | undefined;\n\n qt.get(cx, cy, 1, 1, (o) => {\n if (pointWithin(cx, cy, o.x, o.y, o.x + o.w, o.y + o.h)) {\n foundAtCursor = o;\n }\n });\n\n if (foundAtCursor) {\n setHoverMark(0, foundAtCursor);\n\n if (foundAtCursor !== hoveredAtCursor) {\n hoveredAtCursor = foundAtCursor;\n onHover(foundAtCursor.sidx, foundAtCursor.didx, foundAtCursor);\n }\n } else if (hoveredAtCursor) {\n setHoverMark(0, null);\n hoveredAtCursor = undefined;\n onLeave();\n }\n }\n\n const doHover = mode === TimelineMode.Changes ? hoverMulti : hoverOne;\n\n const setCursor = (u: uPlot) => {\n let cx = round(u.cursor.left! * pxRatio);\n let cy = round(u.cursor.top! * pxRatio);\n\n // if quadtree is empty, fill it\n if (!qt.o.length && qt.q == null) {\n for (const seriesRects of boxRectsBySeries) {\n for (const rect of seriesRects) {\n rect && qt.add(rect);\n }\n }\n }\n\n doHover(cx, cy);\n };\n\n // hide y crosshair & hover points\n const cursor: Partial<Cursor> = {\n y: false,\n x: mode === TimelineMode.Changes,\n points: { show: false },\n };\n\n const yMids: number[] = Array(numSeries).fill(0);\n const ySplits: number[] = Array(numSeries).fill(0);\n\n return {\n cursor,\n\n xSplits:\n mode === TimelineMode.Samples\n ? (u: uPlot, axisIdx: number, scaleMin: number, scaleMax: number, foundIncr: number, foundSpace: number) => {\n let splits = [];\n\n let dataIncr = u.data[0][1] - u.data[0][0];\n let skipFactor = ceil(foundIncr / dataIncr);\n\n for (let i = 0; i < u.data[0].length; i += skipFactor) {\n let v = u.data[0][i];\n\n if (v >= scaleMin && v <= scaleMax) {\n splits.push(v);\n }\n }\n\n return splits;\n }\n : null,\n\n xRange: (u: uPlot) => {\n const r = getTimeRange();\n\n let min = r.from.valueOf();\n let max = r.to.valueOf();\n\n if (mode === TimelineMode.Samples) {\n let colWid = u.data[0][1] - u.data[0][0];\n let scalePad = colWid / 2;\n\n if (min <= u.data[0][0]) {\n min = u.data[0][0] - scalePad;\n }\n\n let lastIdx = u.data[0].length - 1;\n\n if (max >= u.data[0][lastIdx]) {\n max = u.data[0][lastIdx] + scalePad;\n }\n }\n\n return [min, max] as uPlot.Range.MinMax;\n },\n\n ySplits: (u: uPlot) => {\n walk(rowHeight, null, numSeries, u.bbox.height, (iy, y0, hgt) => {\n // vertical midpoints of each series' timeline (stored relative to .u-over)\n yMids[iy] = round(y0 + hgt / 2);\n ySplits[iy] = u.posToVal(yMids[iy] / pxRatio, FIXED_UNIT);\n });\n\n return ySplits;\n },\n\n yValues: (u: uPlot, splits: number[]) => splits.map((v, i) => label(i + 1)),\n yRange: [0, 1] as uPlot.Range.MinMax,\n\n // pathbuilders\n drawPaths,\n drawPoints,\n\n // hooks\n init,\n drawClear,\n setCursor,\n };\n}\n\nfunction getFillColor(fieldConfig: TimelineFieldConfig, color: string) {\n // if #rgba with pre-existing alpha. ignore fieldConfig.fillOpacity\n // e.g. thresholds with opacity\n if (color[0] === '#' && color.length === 9) {\n return color;\n }\n\n const opacityPercent = (fieldConfig.fillOpacity ?? 100) / 100;\n return alpha(color, opacityPercent);\n}\n","import React from 'react';\nimport uPlot from 'uplot';\n\nimport {\n ArrayVector,\n DataFrame,\n DashboardCursorSync,\n DataHoverPayload,\n DataHoverEvent,\n DataHoverClearEvent,\n FALLBACK_COLOR,\n Field,\n FieldColorModeId,\n FieldConfig,\n FieldType,\n formattedValueToString,\n getFieldDisplayName,\n getValueFormat,\n GrafanaTheme2,\n getActiveThreshold,\n Threshold,\n getFieldConfigWithMinMax,\n ThresholdsMode,\n TimeRange,\n} from '@grafana/data';\nimport { maybeSortFrame } from '@grafana/data/src/transformations/transformers/joinDataFrames';\nimport { VizLegendOptions, AxisPlacement, ScaleDirection, ScaleOrientation } from '@grafana/schema';\nimport {\n FIXED_UNIT,\n SeriesVisibilityChangeMode,\n UPlotConfigBuilder,\n UPlotConfigPrepFn,\n VizLegendItem,\n} from '@grafana/ui';\nimport { applyNullInsertThreshold } from '@grafana/ui/src/components/GraphNG/nullInsertThreshold';\nimport { nullToValue } from '@grafana/ui/src/components/GraphNG/nullToValue';\nimport { PlotTooltipInterpolator } from '@grafana/ui/src/components/uPlot/types';\n\nimport { preparePlotData2, getStackingGroups } from '../../../../../packages/grafana-ui/src/components/uPlot/utils';\n\nimport { getConfig, TimelineCoreOptions } from './timeline';\nimport { TimelineFieldConfig, TimelineOptions } from './types';\n\nconst defaultConfig: TimelineFieldConfig = {\n lineWidth: 0,\n fillOpacity: 80,\n};\n\nexport function mapMouseEventToMode(event: React.MouseEvent): SeriesVisibilityChangeMode {\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n return SeriesVisibilityChangeMode.AppendToSelection;\n }\n return SeriesVisibilityChangeMode.ToggleSelection;\n}\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<TimelineOptions> = ({\n frame,\n theme,\n timeZones,\n getTimeRange,\n mode,\n eventBus,\n sync,\n rowHeight,\n colWidth,\n showValue,\n alignValue,\n mergeValues,\n getValueColor,\n}) => {\n const builder = new UPlotConfigBuilder(timeZones[0]);\n\n const xScaleUnit = 'time';\n const xScaleKey = 'x';\n\n const isDiscrete = (field: Field) => {\n const mode = field.config?.color?.mode;\n return !(mode && field.display && mode.startsWith('continuous-'));\n };\n\n const getValueColorFn = (seriesIdx: number, value: any) => {\n const field = frame.fields[seriesIdx];\n\n if (\n field.state?.origin?.fieldIndex !== undefined &&\n field.state?.origin?.frameIndex !== undefined &&\n getValueColor\n ) {\n return getValueColor(field.state?.origin?.frameIndex, field.state?.origin?.fieldIndex, value);\n }\n\n return FALLBACK_COLOR;\n };\n\n const opts: TimelineCoreOptions = {\n // should expose in panel config\n mode: mode!,\n numSeries: frame.fields.length - 1,\n isDiscrete: (seriesIdx) => isDiscrete(frame.fields[seriesIdx]),\n mergeValues,\n rowHeight: rowHeight!,\n colWidth: colWidth,\n showValue: showValue!,\n alignValue,\n theme,\n label: (seriesIdx) => getFieldDisplayName(frame.fields[seriesIdx], frame),\n getFieldConfig: (seriesIdx) => frame.fields[seriesIdx].config.custom,\n getValueColor: getValueColorFn,\n getTimeRange,\n // hardcoded formatter for state values\n formatValue: (seriesIdx, value) => formattedValueToString(frame.fields[seriesIdx].display!(value)),\n onHover: (seriesIndex, valueIndex) => {\n hoveredSeriesIdx = seriesIndex;\n hoveredDataIdx = valueIndex;\n shouldChangeHover = true;\n },\n onLeave: () => {\n hoveredSeriesIdx = null;\n hoveredDataIdx = null;\n shouldChangeHover = true;\n },\n };\n\n let shouldChangeHover = false;\n let hoveredSeriesIdx: number | null = null;\n let hoveredDataIdx: number | null = null;\n\n const coreConfig = getConfig(opts);\n const payload: DataHoverPayload = {\n point: {\n [xScaleUnit]: null,\n [FIXED_UNIT]: null,\n },\n data: frame,\n };\n\n builder.addHook('init', coreConfig.init);\n builder.addHook('drawClear', coreConfig.drawClear);\n builder.addHook('setCursor', coreConfig.setCursor);\n\n // in TooltipPlugin, this gets invoked and the result is bound to a setCursor hook\n // which fires after the above setCursor hook, so can take advantage of hoveringOver\n // already set by the above onHover/onLeave callbacks that fire from coreConfig.setCursor\n const interpolateTooltip: PlotTooltipInterpolator = (\n updateActiveSeriesIdx,\n updateActiveDatapointIdx,\n updateTooltipPosition\n ) => {\n if (shouldChangeHover) {\n if (hoveredSeriesIdx != null) {\n updateActiveSeriesIdx(hoveredSeriesIdx);\n updateActiveDatapointIdx(hoveredDataIdx);\n }\n\n shouldChangeHover = false;\n }\n\n updateTooltipPosition(hoveredSeriesIdx == null);\n };\n\n builder.setTooltipInterpolator(interpolateTooltip);\n\n builder.setPrepData((frames) => preparePlotData2(frames[0], getStackingGroups(frames[0])));\n\n builder.setCursor(coreConfig.cursor);\n\n builder.addScale({\n scaleKey: xScaleKey,\n isTime: true,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n range: coreConfig.xRange,\n });\n\n builder.addScale({\n scaleKey: FIXED_UNIT, // y\n isTime: false,\n orientation: ScaleOrientation.Vertical,\n direction: ScaleDirection.Up,\n range: coreConfig.yRange,\n });\n\n builder.addAxis({\n scaleKey: xScaleKey,\n isTime: true,\n splits: coreConfig.xSplits!,\n placement: AxisPlacement.Bottom,\n timeZone: timeZones[0],\n theme,\n grid: { show: true },\n });\n\n builder.addAxis({\n scaleKey: FIXED_UNIT, // y\n isTime: false,\n placement: AxisPlacement.Left,\n splits: coreConfig.ySplits,\n values: coreConfig.yValues,\n grid: { show: false },\n ticks: { show: false },\n gap: 16,\n theme,\n });\n\n let seriesIndex = 0;\n\n for (let i = 0; i < frame.fields.length; i++) {\n if (i === 0) {\n continue;\n }\n\n const field = frame.fields[i];\n const config = field.config as FieldConfig<TimelineFieldConfig>;\n const customConfig: TimelineFieldConfig = {\n ...defaultConfig,\n ...config.custom,\n };\n\n field.state!.seriesIndex = seriesIndex++;\n\n // const scaleKey = config.unit || FIXED_UNIT;\n // const colorMode = getFieldColorModeForField(field);\n\n builder.addSeries({\n scaleKey: FIXED_UNIT,\n pathBuilder: coreConfig.drawPaths,\n pointsBuilder: coreConfig.drawPoints,\n //colorMode,\n lineWidth: customConfig.lineWidth,\n fillOpacity: customConfig.fillOpacity,\n theme,\n show: !customConfig.hideFrom?.viz,\n thresholds: config.thresholds,\n // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n dataFrameFieldIndex: field.state?.origin,\n });\n }\n\n if (sync && sync() !== DashboardCursorSync.Off) {\n let cursor: Partial<uPlot.Cursor> = {};\n\n cursor.sync = {\n key: '__global_',\n filters: {\n pub: (type: string, src: uPlot, x: number, y: number, w: number, h: number, dataIdx: number) => {\n if (sync && sync() === DashboardCursorSync.Off) {\n return false;\n }\n payload.rowIndex = dataIdx;\n if (x < 0 && y < 0) {\n payload.point[xScaleUnit] = null;\n payload.point[FIXED_UNIT] = null;\n eventBus.publish(new DataHoverClearEvent());\n } else {\n payload.point[xScaleUnit] = src.posToVal(x, xScaleKey);\n payload.point.panelRelY = y > 0 ? y / h : 1; // used for old graph panel to position tooltip\n payload.down = undefined;\n eventBus.publish(new DataHoverEvent(payload));\n }\n return true;\n },\n },\n //TODO: remove any once https://github.com/leeoniya/uPlot/pull/611 got merged or the typing is fixed\n scales: [xScaleKey, null as any],\n };\n builder.setSync();\n builder.setCursor(cursor);\n }\n\n return builder;\n};\n\nexport function getNamesToFieldIndex(frame: DataFrame): Map<string, number> {\n const names = new Map<string, number>();\n for (let i = 0; i < frame.fields.length; i++) {\n names.set(getFieldDisplayName(frame.fields[i], frame), i);\n }\n return names;\n}\n\n/**\n * If any sequential duplicate values exist, this will return a new array\n * with the future values set to undefined.\n *\n * in: 1, 1,undefined, 1,2, 2,null,2,3\n * out: 1,undefined,undefined,undefined,2,undefined,null,2,3\n */\nexport function unsetSameFutureValues(values: any[]): any[] | undefined {\n let prevVal = values[0];\n let clone: any[] | undefined = undefined;\n\n for (let i = 1; i < values.length; i++) {\n let value = values[i];\n\n if (value === null) {\n prevVal = null;\n } else {\n if (value === prevVal) {\n if (!clone) {\n clone = [...values];\n }\n clone[i] = undefined;\n } else if (value != null) {\n prevVal = value;\n }\n }\n }\n return clone;\n}\n\nfunction getSpanNulls(field: Field) {\n let spanNulls = field.config.custom?.spanNulls;\n\n // magic value for join() to leave nulls alone instead of expanding null ranges\n // should be set to -1 when spanNulls = null|undefined|false|0, which is \"retain nulls, without expanding\"\n // Infinity is not optimal here since it causes spanNulls to be more expensive than simply removing all nulls unconditionally\n return !spanNulls ? -1 : spanNulls === true ? Infinity : spanNulls;\n}\n\n/**\n * Merge values by the threshold\n */\nexport function mergeThresholdValues(field: Field, theme: GrafanaTheme2): Field | undefined {\n const thresholds = field.config.thresholds;\n if (field.type !== FieldType.number || !thresholds || !thresholds.steps.length) {\n return undefined;\n }\n\n const items = getThresholdItems(field.config, theme);\n if (items.length !== thresholds.steps.length) {\n return undefined; // should not happen\n }\n\n const thresholdToText = new Map<Threshold, string>();\n const textToColor = new Map<string, string>();\n for (let i = 0; i < items.length; i++) {\n thresholdToText.set(thresholds.steps[i], items[i].label);\n textToColor.set(items[i].label, items[i].color!);\n }\n\n let input = field.values.toArray();\n const vals = new Array<String | undefined>(field.values.length);\n if (thresholds.mode === ThresholdsMode.Percentage) {\n const { min, max } = getFieldConfigWithMinMax(field);\n const delta = max! - min!;\n input = input.map((v) => {\n if (v == null) {\n return v;\n }\n return ((v - min!) / delta) * 100;\n });\n }\n\n for (let i = 0; i < vals.length; i++) {\n const v = input[i];\n if (v == null) {\n vals[i] = v;\n } else {\n vals[i] = thresholdToText.get(getActiveThreshold(v, thresholds.steps));\n }\n }\n\n return {\n ...field,\n config: {\n ...field.config,\n custom: {\n ...field.config.custom,\n spanNulls: getSpanNulls(field),\n },\n },\n type: FieldType.string,\n values: new ArrayVector(vals),\n display: (value: string) => ({\n text: value,\n color: textToColor.get(value),\n numeric: NaN,\n }),\n };\n}\n\n// This will return a set of frames with only graphable values included\nexport function prepareTimelineFields(\n series: DataFrame[] | undefined,\n mergeValues: boolean,\n timeRange: TimeRange,\n theme: GrafanaTheme2\n): { frames?: DataFrame[]; warn?: string } {\n if (!series?.length) {\n return { warn: 'No data in response' };\n }\n let hasTimeseries = false;\n const frames: DataFrame[] = [];\n\n for (let frame of series) {\n let isTimeseries = false;\n let changed = false;\n let maybeSortedFrame = maybeSortFrame(\n frame,\n frame.fields.findIndex((f) => f.type === FieldType.time)\n );\n\n let nulledFrame = applyNullInsertThreshold({\n frame: maybeSortedFrame,\n refFieldPseudoMin: timeRange.from.valueOf(),\n refFieldPseudoMax: timeRange.to.valueOf(),\n });\n\n if (nulledFrame !== frame) {\n changed = true;\n }\n\n const fields: Field[] = [];\n for (let field of nullToValue(nulledFrame).fields) {\n switch (field.type) {\n case FieldType.time:\n isTimeseries = true;\n hasTimeseries = true;\n fields.push(field);\n break;\n case FieldType.number:\n if (mergeValues && field.config.color?.mode === FieldColorModeId.Thresholds) {\n const f = mergeThresholdValues(field, theme);\n if (f) {\n fields.push(f);\n changed = true;\n continue;\n }\n }\n\n case FieldType.boolean:\n case FieldType.string:\n field = {\n ...field,\n config: {\n ...field.config,\n custom: {\n ...field.config.custom,\n spanNulls: getSpanNulls(field),\n },\n },\n };\n fields.push(field);\n break;\n default:\n changed = true;\n }\n }\n if (isTimeseries && fields.length > 1) {\n hasTimeseries = true;\n if (changed) {\n frames.push({\n ...maybeSortedFrame,\n fields,\n });\n } else {\n frames.push(maybeSortedFrame);\n }\n }\n }\n\n if (!hasTimeseries) {\n return { warn: 'Data does not have a time field' };\n }\n if (!frames.length) {\n return { warn: 'No graphable fields' };\n }\n return { frames };\n}\n\nexport function getThresholdItems(fieldConfig: FieldConfig, theme: GrafanaTheme2): VizLegendItem[] {\n const items: VizLegendItem[] = [];\n const thresholds = fieldConfig.thresholds;\n if (!thresholds || !thresholds.steps.length) {\n return items;\n }\n\n const steps = thresholds.steps;\n const disp = getValueFormat(thresholds.mode === ThresholdsMode.Percentage ? 'percent' : fieldConfig.unit ?? '');\n\n const fmt = (v: number) => formattedValueToString(disp(v));\n\n for (let i = 1; i <= steps.length; i++) {\n const step = steps[i - 1];\n items.push({\n label: i === 1 ? `< ${fmt(step.value)}` : `${fmt(step.value)}+`,\n color: theme.visualization.getColorByName(step.color),\n yAxis: 1,\n });\n }\n\n return items;\n}\n\nexport function prepareTimelineLegendItems(\n frames: DataFrame[] | undefined,\n options: VizLegendOptions,\n theme: GrafanaTheme2\n): VizLegendItem[] | undefined {\n if (!frames || options.showLegend === false) {\n return undefined;\n }\n\n return getFieldLegendItem(allNonTimeFields(frames), theme);\n}\n\nexport function getFieldLegendItem(fields: Field[], theme: GrafanaTheme2): VizLegendItem[] | undefined {\n if (!fields.length) {\n return undefined;\n }\n\n const items: VizLegendItem[] = [];\n const fieldConfig = fields[0].config;\n const colorMode = fieldConfig.color?.mode ?? FieldColorModeId.Fixed;\n const thresholds = fieldConfig.thresholds;\n\n // If thresholds are enabled show each step in the legend\n if (colorMode === FieldColorModeId.Thresholds && thresholds?.steps && thresholds.steps.length > 1) {\n return getThresholdItems(fieldConfig, theme);\n }\n\n // If thresholds are enabled show each step in the legend\n if (colorMode.startsWith('continuous')) {\n return undefined; // eventually a color bar\n }\n\n let stateColors: Map<string, string | undefined> = new Map();\n\n fields.forEach((field) => {\n field.values.toArray().forEach((v) => {\n let state = field.display!(v);\n if (state.color) {\n stateColors.set(state.text, state.color!);\n }\n });\n });\n\n stateColors.forEach((color, label) => {\n if (label.length > 0) {\n items.push({\n label: label!,\n color: theme.visualization.getColorByName(color ?? FALLBACK_COLOR),\n yAxis: 1,\n });\n }\n });\n\n return items;\n}\n\nfunction allNonTimeFields(frames: DataFrame[]): Field[] {\n const fields: Field[] = [];\n for (const frame of frames) {\n for (const field of frame.fields) {\n if (field.type !== FieldType.time) {\n fields.push(field);\n }\n }\n }\n return fields;\n}\n\nexport function findNextStateIndex(field: Field, datapointIdx: number) {\n let end;\n let rightPointer = datapointIdx + 1;\n\n if (rightPointer >= field.values.length) {\n return null;\n }\n\n const startValue = field.values.get(datapointIdx);\n\n while (end === undefined) {\n if (rightPointer >= field.values.length) {\n return null;\n }\n const rightValue = field.values.get(rightPointer);\n\n if (rightValue === undefined || rightValue === startValue) {\n rightPointer++;\n } else {\n end = rightPointer;\n }\n }\n\n return end;\n}\n\n/**\n * Returns the precise duration of a time range passed in milliseconds.\n * This function calculates with 30 days month and 365 days year.\n * adapted from https://gist.github.com/remino/1563878\n * @param milliSeconds The duration in milliseconds\n * @returns A formated string of the duration\n */\nexport function fmtDuration(milliSeconds: number): string {\n if (milliSeconds < 0 || Number.isNaN(milliSeconds)) {\n return '';\n }\n\n let yr: number, mo: number, wk: number, d: number, h: number, m: number, s: number, ms: number;\n\n s = Math.floor(milliSeconds / 1000);\n m = Math.floor(s / 60);\n s = s % 60;\n h = Math.floor(m / 60);\n m = m % 60;\n d = Math.floor(h / 24);\n h = h % 24;\n\n yr = Math.floor(d / 365);\n if (yr > 0) {\n d = d % 365;\n }\n\n mo = Math.floor(d / 30);\n if (mo > 0) {\n d = d % 30;\n }\n\n wk = Math.floor(d / 7);\n\n if (wk > 0) {\n d = d % 7;\n }\n\n ms = Math.round((milliSeconds % 1000) * 1000) / 1000;\n\n return (\n yr > 0\n ? yr + 'y ' + (mo > 0 ? mo + 'mo ' : '') + (wk > 0 ? wk + 'w ' : '') + (d > 0 ? d + 'd ' : '')\n : mo > 0\n ? mo + 'mo ' + (wk > 0 ? wk + 'w ' : '') + (d > 0 ? d + 'd ' : '')\n : wk > 0\n ? wk + 'w ' + (d > 0 ? d + 'd ' : '')\n : d > 0\n ? d + 'd ' + (h > 0 ? h + 'h ' : '')\n : h > 0\n ? h + 'h ' + (m > 0 ? m + 'm ' : '')\n : m > 0\n ? m + 'm ' + (s > 0 ? s + 's ' : '')\n : s > 0\n ? s + 's ' + (ms > 0 ? ms + 'ms ' : '')\n : ms > 0\n ? ms + 'ms '\n : '0'\n ).trim();\n}\n","import React, { useMemo } from 'react';\n\nimport { FieldOverrideEditorProps, SelectableValue } from '@grafana/data';\nimport { LineStyle } from '@grafana/schema';\nimport { HorizontalGroup, IconButton, RadioButtonGroup, Select } from '@grafana/ui';\n\ntype LineFill = 'solid' | 'dash' | 'dot';\n\nconst lineFillOptions: Array<SelectableValue<LineFill>> = [\n {\n label: 'Solid',\n value: 'solid',\n },\n {\n label: 'Dash',\n value: 'dash',\n },\n {\n label: 'Dots',\n value: 'dot',\n },\n];\n\nconst dashOptions: Array<SelectableValue<string>> = [\n '10, 10', // default\n '10, 15',\n '10, 20',\n '10, 25',\n '10, 30',\n '10, 40',\n '15, 10',\n '20, 10',\n '25, 10',\n '30, 10',\n '40, 10',\n '50, 10',\n '5, 10',\n '30, 3, 3',\n].map((txt) => ({\n label: txt,\n value: txt,\n}));\n\nconst dotOptions: Array<SelectableValue<string>> = [\n '0, 10', // default\n '0, 20',\n '0, 30',\n '0, 40',\n '0, 3, 3',\n].map((txt) => ({\n label: txt,\n value: txt,\n}));\n\nexport const LineStyleEditor: React.FC<FieldOverrideEditorProps<LineStyle, any>> = ({ value, onChange }) => {\n const options = useMemo(() => (value?.fill === 'dash' ? dashOptions : dotOptions), [value]);\n const current = useMemo(() => {\n if (!value?.dash?.length) {\n return options[0];\n }\n const str = value.dash?.join(', ');\n const val = options.find((o) => o.value === str);\n if (!val) {\n return {\n label: str,\n value: str,\n };\n }\n return val;\n }, [value, options]);\n\n return (\n <HorizontalGroup>\n <RadioButtonGroup\n value={value?.fill || 'solid'}\n options={lineFillOptions}\n onChange={(v) => {\n let dash: number[] | undefined = undefined;\n if (v === 'dot') {\n dash = parseText(dotOptions[0].value!);\n } else if (v === 'dash') {\n dash = parseText(dashOptions[0].value!);\n }\n onChange({\n ...value,\n fill: v!,\n dash,\n });\n }}\n />\n {value?.fill && value?.fill !== 'solid' && (\n <>\n <Select\n allowCustomValue={true}\n options={options}\n value={current}\n width={20}\n onChange={(v) => {\n onChange({\n ...value,\n dash: parseText(v.value ?? ''),\n });\n }}\n formatCreateLabel={(t) => `Segments: ${parseText(t).join(', ')}`}\n />\n <div>\n \n <a\n title=\"The input expects a segment list\"\n href=\"https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash#Parameters\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <IconButton name=\"question-circle\" />\n </a>\n </div>\n </>\n )}\n </HorizontalGroup>\n );\n};\n\nfunction parseText(txt: string): number[] {\n const segments: number[] = [];\n for (const s of txt.split(/(?:,| )+/)) {\n const num = Number.parseInt(s, 10);\n if (!isNaN(num)) {\n segments.push(num);\n }\n }\n return segments;\n}\n","import React from 'react';\n\nimport { FieldOverrideEditorProps, rangeUtil, SelectableValue } from '@grafana/data';\nimport { HorizontalGroup, Input, RadioButtonGroup } from '@grafana/ui';\n\nconst GAPS_OPTIONS: Array<SelectableValue<boolean | number>> = [\n {\n label: 'Never',\n value: false,\n },\n {\n label: 'Always',\n value: true,\n },\n {\n label: 'Threshold',\n value: 3600000, // 1h\n },\n];\n\nexport const SpanNullsEditor: React.FC<FieldOverrideEditorProps<boolean | number, any>> = ({ value, onChange }) => {\n const isThreshold = typeof value === 'number';\n const formattedTime = isThreshold ? rangeUtil.secondsToHms((value as number) / 1000) : undefined;\n GAPS_OPTIONS[2].value = isThreshold ? (value as number) : 3600000; // 1h\n\n const checkAndUpdate = (txt: string) => {\n let val: boolean | number = false;\n if (txt) {\n try {\n val = rangeUtil.intervalToSeconds(txt) * 1000;\n } catch (err) {\n console.warn('ERROR', err);\n }\n }\n onChange(val);\n };\n\n const handleEnterKey = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== 'Enter') {\n return;\n }\n checkAndUpdate((e.target as any).value);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n checkAndUpdate(e.target.value);\n };\n\n return (\n <HorizontalGroup>\n <RadioButtonGroup value={value} options={GAPS_OPTIONS} onChange={onChange} />\n {isThreshold && (\n <Input\n autoFocus={false}\n placeholder=\"never\"\n width={10}\n defaultValue={formattedTime}\n onKeyDown={handleEnterKey}\n onBlur={handleBlur}\n prefix={<div><</div>}\n spellCheck={false}\n />\n )}\n </HorizontalGroup>\n );\n};\n","import React, { useMemo } from 'react';\n\nimport { FieldOverrideEditorProps, FieldType, getFieldDisplayName, SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\n\nexport const FillBellowToEditor: React.FC<FieldOverrideEditorProps<string, any>> = ({ value, context, onChange }) => {\n const names = useMemo(() => {\n const names: Array<SelectableValue<string>> = [];\n if (context.data.length) {\n for (const frame of context.data) {\n for (const field of frame.fields) {\n if (field.type === FieldType.number) {\n const label = getFieldDisplayName(field, frame, context.data);\n names.push({\n label,\n value: label,\n });\n }\n }\n }\n }\n return names;\n }, [context]);\n\n const current = useMemo(() => {\n const found = names.find((v) => v.value === value);\n if (found) {\n return found;\n }\n if (value) {\n return {\n label: value,\n value,\n };\n }\n return undefined;\n }, [names, value]);\n\n return (\n <Select\n options={names}\n value={current}\n onChange={(v) => {\n onChange(v.value);\n }}\n />\n );\n};\n","import React, { useCallback } from 'react';\n\nimport { FieldOverrideEditorProps, SelectableValue } from '@grafana/data';\nimport { GraphTresholdsStyleMode } from '@grafana/schema';\nimport { Select } from '@grafana/ui';\n\nexport const ThresholdsStyleEditor: React.FC<\n FieldOverrideEditorProps<SelectableValue<{ mode: GraphTresholdsStyleMode }>, any>\n> = ({ item, value, onChange, id }) => {\n const onChangeCb = useCallback(\n (v: SelectableValue<GraphTresholdsStyleMode>) => {\n onChange({\n mode: v.value,\n });\n },\n [onChange]\n );\n return <Select inputId={id} value={value.mode} options={item.settings.options} onChange={onChangeCb} />;\n};\n","import {\n FieldColorModeId,\n FieldConfigProperty,\n FieldType,\n identityOverrideProcessor,\n SetFieldConfigOptionsArgs,\n stringOverrideProcessor,\n} from '@grafana/data';\nimport {\n BarAlignment,\n GraphDrawStyle,\n GraphFieldConfig,\n GraphGradientMode,\n LineInterpolation,\n LineStyle,\n VisibilityMode,\n StackingMode,\n GraphTresholdsStyleMode,\n GraphTransform,\n} from '@grafana/schema';\nimport { graphFieldOptions, commonOptionsBuilder } from '@grafana/ui';\n\nimport { FillBellowToEditor } from './FillBelowToEditor';\nimport { LineStyleEditor } from './LineStyleEditor';\nimport { SpanNullsEditor } from './SpanNullsEditor';\nimport { ThresholdsStyleEditor } from './ThresholdsStyleEditor';\n\nexport const defaultGraphConfig: GraphFieldConfig = {\n drawStyle: GraphDrawStyle.Line,\n lineInterpolation: LineInterpolation.Linear,\n lineWidth: 1,\n fillOpacity: 0,\n gradientMode: GraphGradientMode.None,\n barAlignment: BarAlignment.Center,\n stacking: {\n mode: StackingMode.None,\n group: 'A',\n },\n axisGridShow: true,\n axisCenteredZero: false,\n};\n\nconst categoryStyles = ['Graph styles'];\n\nexport function getGraphFieldConfig(cfg: GraphFieldConfig): SetFieldConfigOptionsArgs<GraphFieldConfig> {\n return {\n standardOptions: {\n [FieldConfigProperty.Color]: {\n settings: {\n byValueSupport: true,\n bySeriesSupport: true,\n preferThresholdsMode: false,\n },\n defaultValue: {\n mode: FieldColorModeId.PaletteClassic,\n },\n },\n },\n useCustomConfig: (builder) => {\n builder\n .addRadio({\n path: 'drawStyle',\n name: 'Style',\n category: categoryStyles,\n defaultValue: cfg.drawStyle,\n settings: {\n options: graphFieldOptions.drawStyle,\n },\n })\n .addRadio({\n path: 'lineInterpolation',\n name: 'Line interpolation',\n category: categoryStyles,\n defaultValue: cfg.lineInterpolation,\n settings: {\n options: graphFieldOptions.lineInterpolation,\n },\n showIf: (c) => c.drawStyle === GraphDrawStyle.Line,\n })\n .addRadio({\n path: 'barAlignment',\n name: 'Bar alignment',\n category: categoryStyles,\n defaultValue: cfg.barAlignment,\n settings: {\n options: graphFieldOptions.barAlignment,\n },\n showIf: (c) => c.drawStyle === GraphDrawStyle.Bars,\n })\n .addSliderInput({\n path: 'lineWidth',\n name: 'Line width',\n category: categoryStyles,\n defaultValue: cfg.lineWidth,\n settings: {\n min: 0,\n max: 10,\n step: 1,\n ariaLabelForHandle: 'Line width',\n },\n showIf: (c) => c.drawStyle !== GraphDrawStyle.Points,\n })\n .addSliderInput({\n path: 'fillOpacity',\n name: 'Fill opacity',\n category: categoryStyles,\n defaultValue: cfg.fillOpacity,\n settings: {\n min: 0,\n max: 100,\n step: 1,\n ariaLabelForHandle: 'Fill opacity',\n },\n showIf: (c) => c.drawStyle !== GraphDrawStyle.Points,\n })\n .addRadio({\n path: 'gradientMode',\n name: 'Gradient mode',\n category: categoryStyles,\n defaultValue: graphFieldOptions.fillGradient[0].value,\n settings: {\n options: graphFieldOptions.fillGradient,\n },\n showIf: (c) => c.drawStyle !== GraphDrawStyle.Points,\n })\n .addCustomEditor({\n id: 'fillBelowTo',\n path: 'fillBelowTo',\n name: 'Fill below to',\n category: categoryStyles,\n editor: FillBellowToEditor,\n override: FillBellowToEditor,\n process: stringOverrideProcessor,\n hideFromDefaults: true,\n shouldApply: (f) => true,\n })\n .addCustomEditor<void, LineStyle>({\n id: 'lineStyle',\n path: 'lineStyle',\n name: 'Line style',\n category: categoryStyles,\n showIf: (c) => c.drawStyle === GraphDrawStyle.Line,\n editor: LineStyleEditor,\n override: LineStyleEditor,\n process: identityOverrideProcessor,\n shouldApply: (f) => f.type === FieldType.number,\n })\n .addCustomEditor<void, boolean>({\n id: 'spanNulls',\n path: 'spanNulls',\n name: 'Connect null values',\n category: categoryStyles,\n defaultValue: false,\n editor: SpanNullsEditor,\n override: SpanNullsEditor,\n showIf: (c) => c.drawStyle === GraphDrawStyle.Line,\n shouldApply: (f) => f.type !== FieldType.time,\n process: identityOverrideProcessor,\n })\n .addRadio({\n path: 'showPoints',\n name: 'Show points',\n category: categoryStyles,\n defaultValue: graphFieldOptions.showPoints[0].value,\n settings: {\n options: graphFieldOptions.showPoints,\n },\n showIf: (c) => c.drawStyle !== GraphDrawStyle.Points,\n })\n .addSliderInput({\n path: 'pointSize',\n name: 'Point size',\n category: categoryStyles,\n defaultValue: 5,\n settings: {\n min: 1,\n max: 40,\n step: 1,\n ariaLabelForHandle: 'Point size',\n },\n showIf: (c) => c.showPoints !== VisibilityMode.Never || c.drawStyle === GraphDrawStyle.Points,\n });\n\n commonOptionsBuilder.addStackingConfig(builder, cfg.stacking, categoryStyles);\n\n builder.addSelect({\n category: categoryStyles,\n name: 'Transform',\n path: 'transform',\n settings: {\n options: [\n {\n label: 'Constant',\n value: GraphTransform.Constant,\n description: 'The first value will be shown as a constant line',\n },\n {\n label: 'Negative Y',\n value: GraphTransform.NegativeY,\n description: 'Flip the results to negative values on the y axis',\n },\n ],\n isClearable: true,\n },\n hideFromDefaults: true,\n });\n\n commonOptionsBuilder.addAxisConfig(builder, cfg);\n commonOptionsBuilder.addHideFrom(builder);\n\n builder.addCustomEditor({\n id: 'thresholdsStyle',\n path: 'thresholdsStyle',\n name: 'Show thresholds',\n category: ['Thresholds'],\n defaultValue: { mode: GraphTresholdsStyleMode.Off },\n settings: {\n options: graphFieldOptions.thresholdsDisplayModes,\n },\n editor: ThresholdsStyleEditor,\n override: ThresholdsStyleEditor,\n process: identityOverrideProcessor,\n shouldApply: () => true,\n });\n },\n };\n}\n","// Safari < 14 does not have mql.addEventListener(), but uses the old spec mql.addListener()\n\nlet oMatchMedia = window.matchMedia;\n\ntype MqlListener = (this: MediaQueryList, ev: MediaQueryListEvent) => any;\n\nwindow.matchMedia = (mediaQueryString) => {\n let mql = oMatchMedia(mediaQueryString);\n\n if (!mql.addEventListener) {\n // @ts-ignore\n mql.addEventListener = (type: string, listener: MqlListener) => {\n mql.addListener(listener);\n };\n // @ts-ignore\n mql.removeEventListener = (type: string, listener: MqlListener) => {\n mql.removeListener(listener);\n };\n }\n\n return mql;\n};\n","import { Store } from 'redux';\n\nimport { initialKeyedVariablesState } from 'app/features/variables/state/keyedVariablesReducer';\nimport { StoreState } from 'app/types';\n\nexport let store: Store<StoreState>;\n\nexport function setStore(newStore: Store<StoreState>) {\n store = newStore;\n}\n\nexport function getState(): StoreState {\n if (!store || !store.getState) {\n return { templating: { ...initialKeyedVariablesState, lastKey: 'key' } } as StoreState; // used by tests\n }\n\n return store.getState();\n}\n\nexport function dispatch(action: any) {\n if (!store || !store.getState) {\n return;\n }\n\n return store.dispatch(action);\n}\n","export enum OrgRole {\n Viewer = 'Viewer',\n Editor = 'Editor',\n Admin = 'Admin',\n}\n\nexport interface DashboardAclDTO {\n id?: number;\n dashboardId?: number;\n userId?: number;\n userLogin?: string;\n userEmail?: string;\n teamId?: number;\n team?: string;\n permission?: PermissionLevel;\n role?: OrgRole;\n icon?: string;\n inherited?: boolean;\n}\n\nexport interface DashboardAclUpdateDTO {\n userId?: number;\n teamId?: number;\n role?: OrgRole;\n permission?: PermissionLevel;\n}\n\nexport interface DashboardAcl {\n id?: number;\n dashboardId?: number;\n userId?: number;\n userLogin?: string;\n userEmail?: string;\n teamId?: number;\n team?: string;\n permission?: PermissionLevel;\n role?: OrgRole;\n icon?: string;\n name?: string;\n inherited?: boolean;\n sortRank?: number;\n userAvatarUrl?: string;\n teamAvatarUrl?: string;\n}\n\nexport interface DashboardPermissionInfo {\n value: PermissionLevel;\n label: string;\n description: string;\n}\n\nexport interface NewDashboardAclItem {\n teamId: number;\n userId: number;\n role?: OrgRole;\n permission: PermissionLevel;\n type: AclTarget;\n}\n\nexport enum PermissionLevel {\n View = 1,\n Edit = 2,\n Admin = 4,\n}\n\nexport enum PermissionLevelString {\n View = 'View',\n Edit = 'Edit',\n Admin = 'Admin',\n}\n\nexport enum DataSourcePermissionLevel {\n Query = 1,\n Admin = 2,\n}\n\nexport enum AclTarget {\n Team = 'Team',\n User = 'User',\n Viewer = 'Viewer',\n Editor = 'Editor',\n}\n\nexport interface AclTargetInfo {\n value: AclTarget;\n label: string;\n}\n\nexport const dataSourceAclLevels = [\n { value: DataSourcePermissionLevel.Query, label: 'Query', description: 'Can query data source.' },\n];\n\nexport const dashboardAclTargets: AclTargetInfo[] = [\n { value: AclTarget.Team, label: 'Team' },\n { value: AclTarget.User, label: 'User' },\n { value: AclTarget.Viewer, label: 'Everyone With Viewer Role' },\n { value: AclTarget.Editor, label: 'Everyone With Editor Role' },\n];\n\nexport const dashboardPermissionLevels: DashboardPermissionInfo[] = [\n { value: PermissionLevel.View, label: PermissionLevelString.View, description: 'Can view dashboards.' },\n {\n value: PermissionLevel.Edit,\n label: PermissionLevelString.Edit,\n description: 'Can add, edit and delete dashboards.',\n },\n {\n value: PermissionLevel.Admin,\n label: 'Admin',\n description: 'Can add/remove permissions and can add, edit and delete dashboards.',\n },\n];\n\nexport enum TeamPermissionLevel {\n Member = 0,\n Admin = 4,\n}\n\nexport interface TeamPermissionInfo {\n value: TeamPermissionLevel;\n label: string;\n description: string;\n}\n\nexport const teamsPermissionLevels: TeamPermissionInfo[] = [\n { value: TeamPermissionLevel.Member, label: 'Member', description: 'Is team member' },\n {\n value: TeamPermissionLevel.Admin,\n label: 'Admin',\n description: 'Can add/remove permissions, members and delete team.',\n },\n];\n","import { AnnotationQuery, BusEventBase, BusEventWithPayload, eventFactory } from '@grafana/data';\nimport { IconName } from '@grafana/ui';\n\n/**\n * Event Payloads\n */\n\nexport interface ShowDashSearchPayload {\n query?: string;\n}\n\nexport interface LocationChangePayload {\n href: string;\n}\n\nexport interface ShowModalPayload {\n model?: any;\n modalClass?: string;\n src?: string;\n templateHtml?: string;\n backdrop?: any;\n scope?: any;\n}\n\nexport interface ShowModalReactPayload {\n component: React.ComponentType<any>;\n props?: any;\n}\n\nexport interface ShowConfirmModalPayload {\n title?: string;\n text?: string;\n text2?: string;\n text2htmlBind?: boolean;\n confirmText?: string;\n altActionText?: string;\n yesText?: string;\n noText?: string;\n icon?: IconName;\n\n onConfirm?: () => void;\n onAltAction?: () => void;\n}\n\nexport interface DataSourceResponse<T> {\n data: T;\n readonly status: number;\n readonly statusText: string;\n readonly ok: boolean;\n readonly headers: Headers;\n readonly redirected: boolean;\n readonly type: ResponseType;\n readonly url: string;\n readonly config: any;\n}\n\ntype DataSourceResponsePayload = DataSourceResponse<any>;\n\nexport interface ToggleKioskModePayload {\n exit?: boolean;\n}\n\nexport interface GraphClickedPayload {\n pos: any;\n panel: any;\n item: any;\n}\n\nexport interface ThresholdChangedPayload {\n threshold: any;\n handleIndex: any;\n}\n\nexport interface DashScrollPayload {\n restore?: boolean;\n animate?: boolean;\n pos?: number;\n}\n\nexport interface PanelChangeViewPayload {}\n\n/**\n * Events\n */\n\nexport const dsRequestResponse = eventFactory<DataSourceResponsePayload>('ds-request-response');\nexport const dsRequestError = eventFactory<any>('ds-request-error');\nexport const toggleSidemenuHidden = eventFactory('toggle-sidemenu-hidden');\nexport const templateVariableValueUpdated = eventFactory('template-variable-value-updated');\nexport const graphClicked = eventFactory<GraphClickedPayload>('graph-click');\n\n/**\n * @internal\n */\nexport const thresholdChanged = eventFactory<ThresholdChangedPayload>('threshold-changed');\n\n/**\n * Used for syncing queries badge count in panel edit queries tab\n * Think we can get rid of this soon\n */\nexport class PanelQueriesChangedEvent extends BusEventBase {\n static type = 'panel-queries-changed';\n}\n\n/**\n * Used for syncing transformations badge count in panel edit transform tab\n * Think we can get rid of this soon\n */\nexport class PanelTransformationsChangedEvent extends BusEventBase {\n static type = 'panel-transformations-changed';\n}\n\n/**\n * Used by panel editor to know when panel plugin it'self trigger option updates\n */\nexport class PanelOptionsChangedEvent extends BusEventBase {\n static type = 'panels-options-changed';\n}\n\n/**\n * Used internally by DashboardModel to commmunicate with DashboardGrid that it needs to re-render\n */\nexport class DashboardPanelsChangedEvent extends BusEventBase {\n static type = 'dashboard-panels-changed';\n}\n\nexport class PanelDirectiveReadyEvent extends BusEventBase {\n static type = 'panel-directive-ready';\n}\n\nexport class RenderEvent extends BusEventBase {\n static type = 'render';\n}\n\ninterface ZoomOutEventPayload {\n scale: number;\n updateUrl?: boolean;\n}\n\nexport class ZoomOutEvent extends BusEventWithPayload<ZoomOutEventPayload> {\n static type = 'zoom-out';\n}\n\nexport enum ShiftTimeEventDirection {\n Left = -1,\n Right = 1,\n}\n\ninterface ShiftTimeEventPayload {\n direction: ShiftTimeEventDirection;\n updateUrl?: boolean;\n}\n\nexport class ShiftTimeEvent extends BusEventWithPayload<ShiftTimeEventPayload> {\n static type = 'shift-time';\n}\n\nexport class AbsoluteTimeEvent extends BusEventBase {\n static type = 'absolute-time';\n}\n\nexport class RemovePanelEvent extends BusEventWithPayload<number> {\n static type = 'remove-panel';\n}\n\n/**\n * @deprecated use ShowModalReactEvent instead that has this capability built in\n */\nexport class ShowModalEvent extends BusEventWithPayload<ShowModalPayload> {\n static type = 'show-modal';\n}\n\nexport class ShowConfirmModalEvent extends BusEventWithPayload<ShowConfirmModalPayload> {\n static type = 'show-confirm-modal';\n}\n\nexport class ShowModalReactEvent extends BusEventWithPayload<ShowModalReactPayload> {\n static type = 'show-react-modal';\n}\n\n/**\n * @deprecated use ShowModalReactEvent instead that has this capability built in\n */\nexport class HideModalEvent extends BusEventBase {\n static type = 'hide-modal';\n}\n\nexport class DashboardSavedEvent extends BusEventBase {\n static type = 'dashboard-saved';\n}\n\nexport class AnnotationQueryStarted extends BusEventWithPayload<AnnotationQuery> {\n static type = 'annotation-query-started';\n}\n\nexport class AnnotationQueryFinished extends BusEventWithPayload<AnnotationQuery> {\n static type = 'annotation-query-finished';\n}\n\nexport class PanelEditEnteredEvent extends BusEventWithPayload<number> {\n static type = 'panel-edit-started';\n}\n\nexport class PanelEditExitedEvent extends BusEventWithPayload<number> {\n static type = 'panel-edit-finished';\n}\n","import { Observable, SubscriptionLike, Unsubscribable } from 'rxjs';\n\nimport {\n AbsoluteTimeRange,\n DataFrame,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n HistoryItem,\n LogsModel,\n PanelData,\n QueryHint,\n RawTimeRange,\n TimeRange,\n EventBusExtended,\n DataQueryResponse,\n ExplorePanelsState,\n} from '@grafana/data';\nimport { RichHistorySearchFilters, RichHistorySettings } from 'app/core/utils/richHistoryTypes';\n\nexport enum ExploreId {\n left = 'left',\n right = 'right',\n}\n\nexport type ExploreQueryParams = {\n left: string;\n right: string;\n};\n\n/**\n * Global Explore state\n */\nexport interface ExploreState {\n /**\n * True if time interval for panels are synced. Only possible with split mode.\n */\n syncedTimes: boolean;\n /**\n * Explore state of the left split (left is default in non-split view).\n */\n left: ExploreItemState;\n /**\n * Explore state of the right area in split view.\n */\n right?: ExploreItemState;\n\n /**\n * Settings for rich history (note: filters are stored per each pane separately)\n */\n richHistorySettings?: RichHistorySettings;\n\n /**\n * True if local storage quota was exceeded when a rich history item was added. This is to prevent showing\n * multiple errors when local storage is full.\n */\n richHistoryStorageFull: boolean;\n\n /**\n * True if a warning message of hitting the exceeded number of items has been shown already.\n */\n richHistoryLimitExceededWarningShown: boolean;\n\n /**\n * True if a warning message about failed rich history has been shown already in this session.\n */\n richHistoryMigrationFailed: boolean;\n}\n\nexport const EXPLORE_GRAPH_STYLES = ['lines', 'bars', 'points', 'stacked_lines', 'stacked_bars'] as const;\nexport type ExploreGraphStyle = typeof EXPLORE_GRAPH_STYLES[number];\n\nexport interface ExploreItemState {\n /**\n * Width used for calculating the graph interval (can't have more datapoints than pixels)\n */\n containerWidth: number;\n /**\n * Datasource instance that has been selected. Datasource-specific logic can be run on this object.\n */\n datasourceInstance?: DataSourceApi | null;\n /**\n * True if there is no datasource to be selected.\n */\n datasourceMissing: boolean;\n /**\n * Emitter to send events to the rest of Grafana.\n */\n eventBridge: EventBusExtended;\n /**\n * List of timeseries to be shown in the Explore graph result viewer.\n */\n graphResult: DataFrame[] | null;\n /**\n * History of recent queries. Datasource-specific and initialized via localStorage.\n */\n history: HistoryItem[];\n /**\n * Queries for this Explore, e.g., set via URL. Each query will be\n * converted to a query row.\n */\n queries: DataQuery[];\n /**\n * True if this Explore area has been initialized.\n * Used to distinguish URL state injection versus split view state injection.\n */\n initialized: boolean;\n /**\n * Log query result to be displayed in the logs result viewer.\n */\n logsResult: LogsModel | null;\n\n /**\n * Time range for this Explore. Managed by the time picker and used by all query runs.\n */\n range: TimeRange;\n\n absoluteRange: AbsoluteTimeRange;\n /**\n * True if scanning for more results is active.\n */\n scanning: boolean;\n /**\n * Current scanning range to be shown to the user while scanning is active.\n */\n scanRange?: RawTimeRange;\n\n loading: boolean;\n /**\n * Table model that combines all query table results into a single table.\n */\n tableResult: DataFrame | null;\n\n /**\n * React keys for rendering of QueryRows\n */\n queryKeys: string[];\n\n /**\n * How often query should be refreshed\n */\n refreshInterval?: string;\n\n /**\n * If true, the view is in live tailing mode.\n */\n isLive: boolean;\n\n /**\n * If true, the live tailing view is paused.\n */\n isPaused: boolean;\n\n querySubscription?: Unsubscribable;\n\n queryResponse: ExplorePanelData;\n\n showLogs?: boolean;\n showMetrics?: boolean;\n showTable?: boolean;\n showTrace?: boolean;\n showNodeGraph?: boolean;\n\n /**\n * History of all queries\n */\n richHistory: RichHistoryQuery[];\n richHistorySearchFilters?: RichHistorySearchFilters;\n richHistoryTotal?: number;\n\n /**\n * We are using caching to store query responses of queries run from logs navigation.\n * In logs navigation, we do pagination and we don't want our users to unnecessarily run the same queries that they've run just moments before.\n * We are currently caching last 5 query responses.\n */\n cache: Array<{ key: string; value: ExplorePanelData }>;\n\n // properties below should be more generic if we add more providers\n // see also: DataSourceWithLogsVolumeSupport\n logsVolumeDataProvider?: Observable<DataQueryResponse>;\n logsVolumeDataSubscription?: SubscriptionLike;\n logsVolumeData?: DataQueryResponse;\n\n /* explore graph style */\n graphStyle: ExploreGraphStyle;\n panelsState: ExplorePanelsState;\n}\n\nexport interface ExploreUpdateState {\n datasource: boolean;\n queries: boolean;\n range: boolean;\n mode: boolean;\n}\n\nexport interface QueryOptions {\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n}\n\nexport interface QueryTransaction {\n id: string;\n done: boolean;\n error?: string | JSX.Element;\n hints?: QueryHint[];\n request: DataQueryRequest;\n queries: DataQuery[];\n result?: any; // Table model / Timeseries[] / Logs\n scanning?: boolean;\n}\n\nexport type RichHistoryQuery<T extends DataQuery = DataQuery> = {\n id: string;\n createdAt: number;\n datasourceUid: string;\n datasourceName: string;\n starred: boolean;\n comment: string;\n queries: T[];\n};\n\nexport interface ExplorePanelData extends PanelData {\n graphFrames: DataFrame[];\n tableFrames: DataFrame[];\n logsFrames: DataFrame[];\n traceFrames: DataFrame[];\n nodeGraphFrames: DataFrame[];\n graphResult: DataFrame[] | null;\n tableResult: DataFrame | null;\n logsResult: LogsModel | null;\n}\n","import { DataQuery } from '@grafana/data';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { VariableModel } from 'app/features/variables/types';\n\nimport { DashboardAcl } from './acl';\n\nexport interface DashboardDTO {\n redirectUri?: string;\n dashboard: DashboardDataDTO;\n meta: DashboardMeta;\n}\n\nexport interface DashboardMeta {\n slug?: string;\n uid?: string;\n canSave?: boolean;\n canEdit?: boolean;\n canDelete?: boolean;\n canShare?: boolean;\n canStar?: boolean;\n canAdmin?: boolean;\n url?: string;\n folderId?: number;\n folderUid?: string;\n canMakeEditable?: boolean;\n submenuEnabled?: boolean;\n provisioned?: boolean;\n provisionedExternalId?: string;\n isStarred?: boolean;\n showSettings?: boolean;\n expires?: string;\n isFolder?: boolean;\n isSnapshot?: boolean;\n folderTitle?: string;\n folderUrl?: string;\n created?: string;\n createdBy?: string;\n updated?: string;\n updatedBy?: string;\n fromScript?: boolean;\n fromFile?: boolean;\n hasUnsavedFolderChange?: boolean;\n annotationsPermissions?: AnnotationsPermissions;\n publicDashboardAccessToken?: string;\n publicDashboardEnabled?: boolean;\n}\n\nexport interface AnnotationActions {\n canAdd: boolean;\n canEdit: boolean;\n canDelete: boolean;\n}\n\nexport interface AnnotationsPermissions {\n dashboard: AnnotationActions;\n organization: AnnotationActions;\n}\n\nexport interface DashboardDataDTO {\n title: string;\n uid: string;\n templating: {\n list: VariableModel[];\n };\n panels?: any[];\n\n /** @deprecated -- components should key on uid rather than id */\n id?: number;\n}\n\nexport enum DashboardRoutes {\n Home = 'home-dashboard',\n New = 'new-dashboard',\n Normal = 'normal-dashboard',\n Path = 'path-dashboard',\n Scripted = 'scripted-dashboard',\n Public = 'public-dashboard',\n}\n\nexport enum DashboardInitPhase {\n NotStarted = 'Not started',\n Fetching = 'Fetching',\n Services = 'Services',\n Failed = 'Failed',\n Completed = 'Completed',\n}\n\nexport interface DashboardInitError {\n message: string;\n error: any;\n}\n\nexport enum KioskMode {\n Off = 'off',\n TV = 'tv',\n Full = 'full',\n}\n\nexport type GetMutableDashboardModelFn = () => DashboardModel | null;\n\nexport interface QueriesToUpdateOnDashboardLoad {\n panelId: number;\n queries: DataQuery[];\n}\n\nexport interface DashboardState {\n getModel: GetMutableDashboardModelFn;\n initPhase: DashboardInitPhase;\n initError: DashboardInitError | null;\n permissions: DashboardAcl[];\n}\n","import { WithAccessControlMetadata } from '@grafana/data';\n\nimport { ApiKey, OrgRole, Role } from '.';\n\nexport interface OrgServiceAccount extends WithAccessControlMetadata {\n serviceAccountId: number;\n avatarUrl: string;\n email: string;\n login: string;\n name: string;\n displayName: string;\n orgId: number;\n role: OrgRole;\n tokens: number[];\n}\n\nexport interface ServiceAccount {\n id: number;\n label: string;\n avatarUrl: string;\n login: string;\n email: string;\n name: string;\n displayName: string;\n orgId?: number;\n}\n\nexport interface ServiceAccountDTO extends WithAccessControlMetadata {\n id: number;\n orgId: number;\n tokens: number;\n name: string;\n login: string;\n avatarUrl?: string;\n createdAt: string;\n isDisabled: boolean;\n teams: string[];\n role: OrgRole;\n}\n\nexport interface ServiceAccountCreateApiResponse {\n avatarUrl?: string;\n id: number;\n isDisabled: boolean;\n login: string;\n name: string;\n orgId: number;\n role: OrgRole;\n tokens: number;\n}\n\nexport interface ServiceAccountProfileState {\n serviceAccount: ServiceAccountDTO;\n isLoading: boolean;\n tokens: ApiKey[];\n}\n\nexport enum ServiceAccountStateFilter {\n All = 'All',\n WithExpiredTokens = 'WithExpiredTokens',\n Disabled = 'Disabled',\n}\n\nexport interface ServiceAccountsState {\n serviceAccounts: ServiceAccountDTO[];\n isLoading: boolean;\n roleOptions: Role[];\n builtInRoles: Record<string, Role[]>;\n apiKeysMigrated: boolean;\n showApiKeysMigrationInfo: boolean;\n\n // search / filtering\n query: string;\n perPage: number;\n page: number;\n totalPages: number;\n showPaging: boolean;\n serviceAccountStateFilter: ServiceAccountStateFilter;\n}\n\nexport interface ServiceAccountsUpgradeStatus {\n upgraded: boolean;\n}\n","export interface AppNotification {\n id: string;\n severity: AppNotificationSeverity;\n icon: string;\n title: string;\n text: string;\n traceId?: string;\n component?: React.ReactElement;\n showing: boolean;\n timestamp: number;\n}\n\nexport enum AppNotificationSeverity {\n Success = 'success',\n Warning = 'warning',\n Error = 'error',\n Info = 'info',\n}\n\nexport enum AppNotificationTimeout {\n Success = 3000,\n Warning = 5000,\n Error = 7000,\n}\n\nexport const timeoutMap = {\n [AppNotificationSeverity.Success]: AppNotificationTimeout.Success,\n [AppNotificationSeverity.Warning]: AppNotificationTimeout.Warning,\n [AppNotificationSeverity.Error]: AppNotificationTimeout.Error,\n [AppNotificationSeverity.Info]: AppNotificationTimeout.Success,\n};\n\nexport interface AppNotificationsState {\n byId: Record<string, AppNotification>;\n lastRead: number;\n}\n","import {\n Action,\n AsyncThunk,\n AsyncThunkOptions,\n AsyncThunkPayloadCreator,\n createAsyncThunk as createAsyncThunkUntyped,\n PayloadAction,\n} from '@reduxjs/toolkit';\nimport {\n useSelector as useSelectorUntyped,\n TypedUseSelectorHook,\n useDispatch as useDispatchUntyped,\n} from 'react-redux';\nimport { ThunkAction, ThunkDispatch as GenericThunkDispatch } from 'redux-thunk';\n\nimport type { createRootReducer } from 'app/core/reducers/root';\nimport { configureStore } from 'app/store/configureStore';\n\nexport type StoreState = ReturnType<ReturnType<typeof createRootReducer>>;\n\n/*\n * Utility type to get strongly types thunks\n */\nexport type ThunkResult<R> = ThunkAction<R, StoreState, undefined, PayloadAction<any>>;\n\nexport type ThunkDispatch = GenericThunkDispatch<StoreState, undefined, Action>;\n\n// Typed useDispatch & useSelector hooks\nexport type AppDispatch = ReturnType<typeof configureStore>['dispatch'];\nexport const useDispatch = () => useDispatchUntyped<AppDispatch>();\nexport const useSelector: TypedUseSelectorHook<StoreState> = useSelectorUntyped;\n\ntype DefaultThunkApiConfig = { dispatch: AppDispatch; state: StoreState };\nexport const createAsyncThunk = <Returned, ThunkArg = void, ThunkApiConfig = DefaultThunkApiConfig>(\n typePrefix: string,\n payloadCreator: AsyncThunkPayloadCreator<Returned, ThunkArg, ThunkApiConfig>,\n options?: AsyncThunkOptions<ThunkArg, ThunkApiConfig>\n): AsyncThunk<Returned, ThunkArg, ThunkApiConfig> => createAsyncThunkUntyped(typePrefix, payloadCreator, options);\n","/**\n * UserPermission is a map storing permissions in a form of\n * {\n * action: true;\n * }\n */\nexport type UserPermission = Record<string, boolean>;\n\n// Permission actions\nexport enum AccessControlAction {\n UsersRead = 'users:read',\n UsersWrite = 'users:write',\n UsersAuthTokenList = 'users.authtoken:read',\n UsersAuthTokenUpdate = 'users.authtoken:write',\n UsersPasswordUpdate = 'users.password:write',\n UsersDelete = 'users:delete',\n UsersCreate = 'users:create',\n UsersEnable = 'users:enable',\n UsersDisable = 'users:disable',\n UsersPermissionsUpdate = 'users.permissions:write',\n UsersLogout = 'users:logout',\n UsersQuotasList = 'users.quotas:read',\n UsersQuotasUpdate = 'users.quotas:write',\n\n ServiceAccountsRead = 'serviceaccounts:read',\n ServiceAccountsCreate = 'serviceaccounts:create',\n ServiceAccountsWrite = 'serviceaccounts:write',\n ServiceAccountsDelete = 'serviceaccounts:delete',\n ServiceAccountsPermissionsRead = 'serviceaccounts.permissions:read',\n ServiceAccountsPermissionsWrite = 'serviceaccounts.permissions:write',\n\n OrgsRead = 'orgs:read',\n OrgsPreferencesRead = 'orgs.preferences:read',\n OrgsWrite = 'orgs:write',\n OrgsPreferencesWrite = 'orgs.preferences:write',\n OrgsCreate = 'orgs:create',\n OrgsDelete = 'orgs:delete',\n OrgUsersRead = 'org.users:read',\n OrgUsersAdd = 'org.users:add',\n OrgUsersRemove = 'org.users:remove',\n OrgUsersWrite = 'org.users:write',\n\n LDAPUsersRead = 'ldap.user:read',\n LDAPUsersSync = 'ldap.user:sync',\n LDAPStatusRead = 'ldap.status:read',\n\n DataSourcesExplore = 'datasources:explore',\n DataSourcesRead = 'datasources:read',\n DataSourcesCreate = 'datasources:create',\n DataSourcesWrite = 'datasources:write',\n DataSourcesDelete = 'datasources:delete',\n DataSourcesPermissionsRead = 'datasources.permissions:read',\n DataSourcesCachingRead = 'datasources.caching:read',\n DataSourcesInsightsRead = 'datasources.insights:read',\n\n ActionServerStatsRead = 'server.stats:read',\n\n ActionTeamsCreate = 'teams:create',\n ActionTeamsDelete = 'teams:delete',\n ActionTeamsRead = 'teams:read',\n ActionTeamsWrite = 'teams:write',\n ActionTeamsPermissionsRead = 'teams.permissions:read',\n ActionTeamsPermissionsWrite = 'teams.permissions:write',\n\n ActionRolesList = 'roles:read',\n ActionBuiltinRolesList = 'roles.builtin:list',\n ActionTeamsRolesList = 'teams.roles:read',\n ActionTeamsRolesAdd = 'teams.roles:add',\n ActionTeamsRolesRemove = 'teams.roles:remove',\n ActionUserRolesList = 'users.roles:read',\n ActionUserRolesAdd = 'users.roles:add',\n ActionUserRolesRemove = 'users.roles:remove',\n\n DashboardsRead = 'dashboards:read',\n DashboardsWrite = 'dashboards:write',\n DashboardsDelete = 'dashboards:delete',\n DashboardsCreate = 'dashboards:create',\n DashboardsPermissionsRead = 'dashboards.permissions:read',\n DashboardsPermissionsWrite = 'dashboards.permissions:write',\n\n FoldersRead = 'folders:read',\n FoldersWrite = 'folders:write',\n FoldersDelete = 'folders:delete',\n FoldersCreate = 'folders:create',\n FoldersPermissionsRead = 'folders.permissions:read',\n FoldersPermissionsWrite = 'folders.permissions:write',\n\n // Alerting rules\n AlertingRuleCreate = 'alert.rules:create',\n AlertingRuleRead = 'alert.rules:read',\n AlertingRuleUpdate = 'alert.rules:write',\n AlertingRuleDelete = 'alert.rules:delete',\n\n // Alerting instances (+silences)\n AlertingInstanceCreate = 'alert.instances:create',\n AlertingInstanceUpdate = 'alert.instances:write',\n AlertingInstanceRead = 'alert.instances:read',\n\n // Alerting Notification policies\n AlertingNotificationsRead = 'alert.notifications:read',\n AlertingNotificationsWrite = 'alert.notifications:write',\n\n // External alerting rule actions.\n AlertingRuleExternalWrite = 'alert.rules.external:write',\n AlertingRuleExternalRead = 'alert.rules.external:read',\n\n // External alerting instances actions.\n AlertingInstancesExternalWrite = 'alert.instances.external:write',\n AlertingInstancesExternalRead = 'alert.instances.external:read',\n\n // External alerting notifications actions.\n AlertingNotificationsExternalWrite = 'alert.notifications.external:write',\n AlertingNotificationsExternalRead = 'alert.notifications.external:read',\n\n ActionAPIKeysRead = 'apikeys:read',\n ActionAPIKeysCreate = 'apikeys:create',\n ActionAPIKeysDelete = 'apikeys:delete',\n}\n\nexport interface Role {\n uid: string;\n name: string;\n displayName: string;\n description: string;\n group: string;\n global: boolean;\n delegatable?: boolean;\n version: number;\n created: string;\n updated: string;\n}\n","export enum SuggestionName {\n LineChart = 'Line chart',\n LineChartSmooth = 'Line chart smooth',\n LineChartGradientColorScheme = 'Line chart with gradient color scheme',\n AreaChart = 'Area chart',\n AreaChartStacked = 'Area chart stacked',\n AreaChartStackedPercent = 'Area chart 100% stacked',\n BarChart = 'Bar chart',\n BarChartGradientColorScheme = 'Bar chart with gradient color scheme',\n BarChartStacked = 'Bar chart stacked',\n BarChartStackedPercent = 'Bar chart 100% stacked',\n BarChartHorizontal = 'Bar chart horizontal',\n BarChartHorizontalStacked = 'Bar chart horizontal stacked',\n BarChartHorizontalStackedPercent = 'Bar chart horizontal 100% stacked',\n Candlestick = 'Candlestick',\n PieChart = 'Pie chart',\n PieChartDonut = 'Pie chart donut',\n Stat = 'Stat',\n StatColoredBackground = 'Stat colored background',\n Gauge = 'Gauge',\n GaugeNoThresholds = 'Gauge no thresholds',\n BarGaugeBasic = 'Bar gauge basic',\n BarGaugeLCD = 'Bar gauge LCD',\n Table = 'Table',\n StateTimeline = 'State timeline',\n StatusHistory = 'Status history',\n TextPanel = 'Text',\n DashboardList = 'Dashboard list',\n Logs = 'Logs',\n}\n","// Prometheus API DTOs, possibly to be autogenerated from openapi spec in the near future\n\nimport { DataQuery, RelativeTimeRange } from '@grafana/data';\n\nexport type Labels = Record<string, string>;\nexport type Annotations = Record<string, string>;\n\nexport enum PromAlertingRuleState {\n Firing = 'firing',\n Inactive = 'inactive',\n Pending = 'pending',\n}\n\nexport enum GrafanaAlertState {\n Normal = 'Normal',\n Alerting = 'Alerting',\n Pending = 'Pending',\n NoData = 'NoData',\n Error = 'Error',\n}\n\ntype GrafanaAlertStateReason = ` (${string})` | '';\n\nexport type GrafanaAlertStateWithReason = `${GrafanaAlertState}${GrafanaAlertStateReason}`;\n\n/** We need this to disambiguate the union PromAlertingRuleState | GrafanaAlertStateWithReason\n */\nexport function isAlertStateWithReason(\n state: PromAlertingRuleState | GrafanaAlertStateWithReason\n): state is GrafanaAlertStateWithReason {\n return (\n state !== null &&\n typeof state !== 'undefined' &&\n !Object.values(PromAlertingRuleState).includes(state as PromAlertingRuleState)\n );\n}\n\nexport function mapStateWithReasonToBaseState(\n state: GrafanaAlertStateWithReason | PromAlertingRuleState\n): GrafanaAlertState | PromAlertingRuleState {\n if (isAlertStateWithReason(state)) {\n const fields = state.split(' ');\n return fields[0] as GrafanaAlertState;\n } else {\n return state;\n }\n}\n\nexport enum PromRuleType {\n Alerting = 'alerting',\n Recording = 'recording',\n}\nexport enum PromApplication {\n Lotex = 'Lotex',\n Mimir = 'Mimir',\n Prometheus = 'Prometheus',\n}\n\nexport interface PromBuildInfoResponse {\n data: {\n application?: string;\n version: string;\n revision: string;\n features?: {\n ruler_config_api?: 'true' | 'false';\n alertmanager_config_api?: 'true' | 'false';\n query_sharding?: 'true' | 'false';\n federated_rules?: 'true' | 'false';\n };\n };\n status: 'success';\n}\n\nexport interface PromApiFeatures {\n application?: PromApplication;\n features: {\n rulerApiEnabled: boolean;\n };\n}\n\ninterface PromRuleDTOBase {\n health: string;\n name: string;\n query: string; // expr\n evaluationTime?: number;\n lastEvaluation?: string;\n lastError?: string;\n}\n\nexport interface PromAlertingRuleDTO extends PromRuleDTOBase {\n alerts: Array<{\n labels: Labels;\n annotations: Annotations;\n state: Exclude<PromAlertingRuleState | GrafanaAlertStateWithReason, PromAlertingRuleState.Inactive>;\n activeAt: string;\n value: string;\n }>;\n labels: Labels;\n annotations?: Annotations;\n duration?: number; // for\n state: PromAlertingRuleState;\n type: PromRuleType.Alerting;\n}\n\nexport interface PromRecordingRuleDTO extends PromRuleDTOBase {\n health: string;\n name: string;\n query: string; // expr\n type: PromRuleType.Recording;\n labels?: Labels;\n}\n\nexport type PromRuleDTO = PromAlertingRuleDTO | PromRecordingRuleDTO;\n\nexport interface PromRuleGroupDTO {\n name: string;\n file: string;\n rules: PromRuleDTO[];\n interval: number;\n\n evaluationTime?: number; // these 2 are not in older prometheus payloads\n lastEvaluation?: string;\n}\n\nexport interface PromResponse<T> {\n status: 'success' | 'error' | ''; // mocks return empty string\n data: T;\n errorType?: string;\n error?: string;\n warnings?: string[];\n}\n\nexport type PromRulesResponse = PromResponse<{ groups: PromRuleGroupDTO[] }>;\n\n// Ruler rule DTOs\ninterface RulerRuleBaseDTO {\n expr: string;\n labels?: Labels;\n}\n\nexport interface RulerRecordingRuleDTO extends RulerRuleBaseDTO {\n record: string;\n}\n\nexport interface RulerAlertingRuleDTO extends RulerRuleBaseDTO {\n alert: string;\n for?: string;\n annotations?: Annotations;\n}\n\nexport enum GrafanaAlertStateDecision {\n Alerting = 'Alerting',\n NoData = 'NoData',\n KeepLastState = 'KeepLastState',\n OK = 'OK',\n Error = 'Error',\n}\n\nexport interface AlertDataQuery extends DataQuery {\n maxDataPoints?: number;\n intervalMs?: number;\n expression?: string;\n}\n\nexport interface AlertQuery {\n refId: string;\n queryType: string;\n relativeTimeRange?: RelativeTimeRange;\n datasourceUid: string;\n model: AlertDataQuery;\n}\n\nexport interface PostableGrafanaRuleDefinition {\n uid?: string;\n title: string;\n condition: string;\n no_data_state: GrafanaAlertStateDecision;\n exec_err_state: GrafanaAlertStateDecision;\n data: AlertQuery[];\n}\nexport interface GrafanaRuleDefinition extends PostableGrafanaRuleDefinition {\n id?: string;\n uid: string;\n namespace_uid: string;\n namespace_id: number;\n provenance?: string;\n}\n\nexport interface RulerGrafanaRuleDTO {\n grafana_alert: GrafanaRuleDefinition;\n for: string;\n annotations: Annotations;\n labels: Labels;\n}\n\nexport interface PostableRuleGrafanaRuleDTO {\n grafana_alert: PostableGrafanaRuleDefinition;\n for: string;\n annotations: Annotations;\n labels: Labels;\n}\n\nexport type RulerRuleDTO = RulerAlertingRuleDTO | RulerRecordingRuleDTO | RulerGrafanaRuleDTO;\n\nexport type PostableRuleDTO = RulerAlertingRuleDTO | RulerRecordingRuleDTO | PostableRuleGrafanaRuleDTO;\n\nexport type RulerRuleGroupDTO<R = RulerRuleDTO> = {\n name: string;\n interval?: string;\n source_tenants?: string[];\n rules: R[];\n};\n\nexport type PostableRulerRuleGroupDTO = RulerRuleGroupDTO<PostableRuleDTO>;\n\nexport type RulerRulesConfigDTO = { [namespace: string]: RulerRuleGroupDTO[] };\n","/*eslint-disable*/module.exports={messages:{\"common.locale.default\":\"Default\",\"common.locale.en\":\"English\",\"common.locale.es\":\"Spanish\",\"common.locale.fr\":\"French\",\"common.save\":\"Save\",\"dashboard.inspect-data.data-options\":\"Data options\",\"dashboard.inspect-data.dataframe-aria-label\":\"Select dataframe\",\"dashboard.inspect-data.dataframe-label\":\"Show data frame\",\"dashboard.inspect-data.download-csv\":\"Download CSV\",\"dashboard.inspect-data.download-excel-description\":\"Adds header to CSV for use with Excel\",\"dashboard.inspect-data.download-excel-label\":\"Download for Excel\",\"dashboard.inspect-data.download-logs\":\"Download logs\",\"dashboard.inspect-data.download-service\":\"Download service graph\",\"dashboard.inspect-data.download-traces\":\"Download traces\",\"dashboard.inspect-data.excel-header\":\"Excel header\",\"dashboard.inspect-data.formatted\":\"Formatted data\",\"dashboard.inspect-data.formatted-data-description\":\"Table data is formatted with options defined in the Field and Override tabs.\",\"dashboard.inspect-data.formatted-data-label\":\"Formatted data\",\"dashboard.inspect-data.panel-transforms\":\"Panel transforms\",\"dashboard.inspect-data.series-to-columns\":\"Series joined by time\",\"dashboard.inspect-data.transformation\":\"Series joined by time\",\"dashboard.inspect-data.transformations-description\":\"Table data is displayed with transformations defined in the panel Transform tab.\",\"dashboard.inspect-data.transformations-label\":\"Apply panel transformations\",\"dashboard.inspect-json.dataframe-description\":\"JSON formatted DataFrames\",\"dashboard.inspect-json.dataframe-label\":\"DataFrame JSON\",\"dashboard.inspect-json.panel-data-description\":\"The raw model passed to the panel visualization\",\"dashboard.inspect-json.panel-data-label\":\"Panel data\",\"dashboard.inspect-json.panel-json-description\":\"The model saved in the dashboard JSON that configures how everything works.\",\"dashboard.inspect-json.panel-json-label\":\"Panel JSON\",\"dashboard.inspect-json.select-source\":\"Select source\",\"dashboard.inspect-json.unknown\":[\"Unknown Object: \",[\"show\"]],\"dashboard.inspect-meta.no-inspector\":\"No Metadata Inspector\",\"dashboard.inspect-stats.data-title\":\"Data source stats\",\"dashboard.inspect-stats.processing-time\":\"Data processing time\",\"dashboard.inspect-stats.queries\":\"Number of queries\",\"dashboard.inspect-stats.request-time\":\"Total request time\",\"dashboard.inspect-stats.rows\":\"Total number rows\",\"dashboard.inspect-stats.table-title\":\"Stats\",\"dashboard.inspect.actions-tab\":\"Actions\",\"dashboard.inspect.data-tab\":\"Data\",\"dashboard.inspect.error-tab\":\"Error\",\"dashboard.inspect.json-tab\":\"JSON\",\"dashboard.inspect.meta-tab\":\"Meta Data\",\"dashboard.inspect.query-tab\":\"Query\",\"dashboard.inspect.stats-tab\":\"Stats\",\"dashboard.inspect.subtitle\":[[\"queryCount\"],\" queries with total query time of \",[\"formatted\"]],\"dashboard.inspect.title\":[\"Inspect: \",[\"panelTitle\"]],\"dashboard.refresh-picker.off-arialabel\":\"Turn off auto refresh\",\"dashboard.refresh-picker.off-description\":\"Auto refresh turned off. Choose refresh time interval\",\"dashboard.refresh-picker.off-label\":\"Off\",\"dashboard.refresh-picker.on-description\":[\"Choose refresh time interval with current interval \",[\"durationAriaLabel\"],\" selected\"],\"dashboard.toolbar.add-panel\":\"Add panel\",\"dashboard.toolbar.comments-show\":\"Show dashboard comments\",\"dashboard.toolbar.mark-favorite\":\"Mark as favorite\",\"dashboard.toolbar.open-original\":\"Open original dashboard\",\"dashboard.toolbar.playlist-next\":\"Go to next dashboard\",\"dashboard.toolbar.playlist-previous\":\"Go to previous dashboard\",\"dashboard.toolbar.playlist-stop\":\"Stop playlist\",\"dashboard.toolbar.refresh\":\"Refresh dashboard\",\"dashboard.toolbar.save\":\"Save dashboard\",\"dashboard.toolbar.settings\":\"Dashboard settings\",\"dashboard.toolbar.share\":\"Share dashboard or panel\",\"dashboard.toolbar.tv-button\":\"Cycle view mode\",\"dashboard.toolbar.unmark-favorite\":\"Unmark as favorite\",\"nav.alerting\":\"Alerting\",\"nav.alerting-admin\":\"Admin\",\"nav.alerting-am-routes\":\"Notification policies\",\"nav.alerting-channels\":\"Notification channels\",\"nav.alerting-groups\":\"Groups\",\"nav.alerting-legacy\":\"Alerting (legacy)\",\"nav.alerting-list\":\"Alert rules\",\"nav.alerting-receivers\":\"Contact points\",\"nav.alerting-silences\":\"Silences\",\"nav.api-keys\":\"API keys\",\"nav.config\":\"Configuration\",\"nav.create\":\"Create\",\"nav.create-alert\":\"New alert rule\",\"nav.create-dashboard\":\"Dashboard\",\"nav.create-folder\":\"Folder\",\"nav.create-import\":\"Import\",\"nav.dashboards\":\"Dashboards\",\"nav.datasources\":\"Data sources\",\"nav.explore\":\"Explore\",\"nav.help\":\"Help\",\"nav.home\":\"Home\",\"nav.library-panels\":\"Library panels\",\"nav.live\":\"Event streaming\",\"nav.live-cloud\":\"Cloud\",\"nav.live-pipeline\":\"Pipeline\",\"nav.live-status\":\"Status\",\"nav.manage-dashboards\":\"Browse\",\"nav.new-dashboard\":\"New dashboard\",\"nav.new-folder\":\"New folder\",\"nav.org-settings\":\"Preferences\",\"nav.playlists\":\"Playlists\",\"nav.plugins\":\"Plugins\",\"nav.profile/password\":\"Change password\",\"nav.profile/settings\":\"Preferences\",\"nav.service-accounts\":\"Service accounts\",\"nav.sign-out\":\"Sign out\",\"nav.snapshots\":\"Snapshots\",\"nav.starred\":\"Starred\",\"nav.starred-empty\":\"Your starred dashboards will appear here\",\"nav.teams\":\"Teams\",\"nav.users\":\"Users\",\"navigation.kiosk.tv-alert\":\"Press ESC to exit Kiosk mode\",\"panel.header-menu.inspect\":\"Inspect\",\"panel.header-menu.inspect-data\":\"Data\",\"panel.header-menu.inspect-json\":\"Panel JSON\",\"panel.header-menu.more\":\"More...\",\"panel.header-menu.more-toggle\":\"Toggle legend\",\"panel.header-menu.share\":\"Share\",\"panel.header-menu.view\":\"View\",\"share-modal.export.cancel-button\":\"Cancel\",\"share-modal.export.info-text\":\"Export this dashboard.\",\"share-modal.export.save-button\":\"Save to file\",\"share-modal.export.share-default-label\":\"Export with default values removed\",\"share-modal.export.share-externally-label\":\"Export for sharing externally\",\"share-modal.export.view-button\":\"View JSON\",\"share-modal.link.copy-link-button\":\"Copy\",\"share-modal.link.info-text\":\"Create a direct link to this dashboard or panel, customized with the options below.\",\"share-modal.link.link-url\":\"Link URL\",\"share-modal.link.render-alert\":\"Image renderer plugin not installed\",\"share-modal.link.render-instructions\":\"To render a panel image, you must install the <0>Grafana image renderer plugin</0>. Please contact your Grafana administrator to install the plugin.\",\"share-modal.link.rendered-image\":\"Direct link rendered image\",\"share-modal.link.save-alert\":\"Dashboard is not saved\",\"share-modal.link.save-dashboard\":\"To render a panel image, you must save the dashboard first.\",\"share-modal.link.shorten-url\":\"Shorten URL\",\"share-modal.link.theme\":\"Theme\",\"share-modal.link.theme-current\":\"Current\",\"share-modal.link.theme-dark\":\"Dark\",\"share-modal.link.theme-light\":\"Light\",\"share-modal.link.time-range-description\":\"Transforms the current relative time range to an absolute time range\",\"share-modal.link.time-range-label\":\"Lock time range\",\"share-modal.snapshot.cancel-button\":\"Cancel\",\"share-modal.snapshot.copy-link-button\":\"Copy\",\"share-modal.snapshot.delete-button\":\"Delete snapshot.\",\"share-modal.snapshot.deleted-message\":\"The snapshot has been deleted. If you have already accessed it once, then it might take up to an hour before before it is removed from browser caches or CDN caches.\",\"share-modal.snapshot.expire\":\"Expire\",\"share-modal.snapshot.expire-day\":\"1 Day\",\"share-modal.snapshot.expire-hour\":\"1 Hour\",\"share-modal.snapshot.expire-never\":\"Never\",\"share-modal.snapshot.expire-week\":\"7 Days\",\"share-modal.snapshot.info-text-1\":\"A snapshot is an instant way to share an interactive dashboard publicly. When created, we strip sensitive data like queries (metric, template, and annotation) and panel links, leaving only the visible metric data and series names embedded in your dashboard.\",\"share-modal.snapshot.info-text-2\":\"Keep in mind, your snapshot <0>can be viewed by anyone</0> that has the link and can access the URL. Share wisely.\",\"share-modal.snapshot.local-button\":\"Local Snapshot\",\"share-modal.snapshot.mistake-message\":\"Did you make a mistake?\",\"share-modal.snapshot.name\":\"Snapshot name\",\"share-modal.snapshot.timeout\":\"Timeout (seconds)\",\"share-modal.snapshot.timeout-description\":\"You might need to configure the timeout value if it takes a long time to collect your dashboard\\nmetrics.\",\"shared-dashboard.fields.timezone-label\":\"Timezone\",\"shared-preferences.fields.home-dashboard-label\":\"Home Dashboard\",\"shared-preferences.fields.home-dashboard-placeholder\":\"Choose default dashboard\",\"shared-preferences.fields.home-dashboard-tooltip\":\"Not finding the dashboard you want? Star it first, then it should appear in this select box.\",\"shared-preferences.fields.locale-label\":\"Language\",\"shared-preferences.fields.locale-placeholder\":\"Choose language\",\"shared-preferences.fields.theme-label\":\"UI Theme\",\"shared-preferences.fields.week-start-label\":\"Week start\",\"shared-preferences.theme.dark-label\":\"Dark\",\"shared-preferences.theme.default-label\":\"Default\",\"shared-preferences.theme.light-label\":\"Light\",\"shared-preferences.title\":\"Preferences\",\"user-orgs.current-org-button\":\"Current\",\"user-orgs.name-column\":\"Name\",\"user-orgs.role-column\":\"Role\",\"user-orgs.select-org-button\":\"Select organisation\",\"user-orgs.title\":\"Organizations\",\"user-profile.fields.email-error\":\"Email is required\",\"user-profile.fields.email-label\":\"Email\",\"user-profile.fields.name-error\":\"Name is required\",\"user-profile.fields.name-label\":\"Name\",\"user-profile.fields.username-label\":\"Username\",\"user-profile.title\":\"Edit profile\",\"user-session.browser-column\":\"Browser & OS\",\"user-session.created-at-column\":\"Logged on\",\"user-session.ip-column\":\"IP address\",\"user-session.revoke\":\"Revoke user session\",\"user-session.seen-at-column\":\"Last seen\",\"user-sessions.loading\":\"Loading sessions...\"}};","/* Flot plugin for showing crosshairs when the mouse hovers over the plot.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin supports these options:\n\n\tcrosshair: {\n\t\tmode: null or \"x\" or \"y\" or \"xy\"\n\t\tcolor: color\n\t\tlineWidth: number\n\t}\n\nSet the mode to one of \"x\", \"y\" or \"xy\". The \"x\" mode enables a vertical\ncrosshair that lets you trace the values on the x axis, \"y\" enables a\nhorizontal crosshair and \"xy\" enables them both. \"color\" is the color of the\ncrosshair (default is \"rgba(170, 0, 0, 0.80)\"), \"lineWidth\" is the width of\nthe drawn lines (default is 1).\n\nThe plugin also adds four public methods:\n\n - setCrosshair( pos )\n\n Set the position of the crosshair. Note that this is cleared if the user\n moves the mouse. \"pos\" is in coordinates of the plot and should be on the\n form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple\n axes), which is coincidentally the same format as what you get from a\n \"plothover\" event. If \"pos\" is null, the crosshair is cleared.\n\n - clearCrosshair()\n\n Clear the crosshair.\n\n - lockCrosshair(pos)\n\n Cause the crosshair to lock to the current location, no longer updating if\n the user moves the mouse. Optionally supply a position (passed on to\n setCrosshair()) to move it to.\n\n Example usage:\n\n\tvar myFlot = $.plot( $(\"#graph\"), ..., { crosshair: { mode: \"x\" } } };\n\t$(\"#graph\").bind( \"plothover\", function ( evt, position, item ) {\n\t\tif ( item ) {\n\t\t\t// Lock the crosshair to the data point being hovered\n\t\t\tmyFlot.lockCrosshair({\n\t\t\t\tx: item.datapoint[ 0 ],\n\t\t\t\ty: item.datapoint[ 1 ]\n\t\t\t});\n\t\t} else {\n\t\t\t// Return normal crosshair operation\n\t\t\tmyFlot.unlockCrosshair();\n\t\t}\n\t});\n\n - unlockCrosshair()\n\n Free the crosshair to move again after locking it.\n*/\n\n(function ($) {\n var options = {\n crosshair: {\n mode: null, // one of null, \"x\", \"y\" or \"xy\",\n color: \"rgba(170, 0, 0, 0.80)\",\n lineWidth: 1\n }\n };\n \n function init(plot) {\n // position of crosshair in pixels\n var crosshair = { x: -1, y: -1, locked: false };\n\n plot.setCrosshair = function setCrosshair(pos) {\n if (!pos)\n crosshair.x = -1;\n else {\n var o = plot.p2c(pos);\n crosshair.x = Math.max(0, Math.min(o.left, plot.width()));\n crosshair.y = Math.max(0, Math.min(o.top, plot.height()));\n }\n \n plot.triggerRedrawOverlay();\n };\n \n plot.clearCrosshair = plot.setCrosshair; // passes null for pos\n \n plot.lockCrosshair = function lockCrosshair(pos) {\n if (pos)\n plot.setCrosshair(pos);\n crosshair.locked = true;\n };\n\n plot.unlockCrosshair = function unlockCrosshair() {\n crosshair.locked = false;\n };\n\n function onMouseOut(e) {\n if (crosshair.locked)\n return;\n\n if (crosshair.x != -1) {\n crosshair.x = -1;\n plot.triggerRedrawOverlay();\n }\n }\n\n function onMouseMove(e) {\n if (crosshair.locked)\n return;\n \n if (plot.getSelection && plot.getSelection()) {\n crosshair.x = -1; // hide the crosshair while selecting\n return;\n }\n \n var offset = plot.offset();\n crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));\n crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));\n plot.triggerRedrawOverlay();\n }\n \n plot.hooks.bindEvents.push(function (plot, eventHolder) {\n if (!plot.getOptions().crosshair.mode)\n return;\n\n eventHolder.mouseout(onMouseOut);\n eventHolder.mousemove(onMouseMove);\n });\n\n plot.hooks.drawOverlay.push(function (plot, ctx) {\n var c = plot.getOptions().crosshair;\n if (!c.mode)\n return;\n\n var plotOffset = plot.getPlotOffset();\n \n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n if (crosshair.x != -1) {\n var adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0;\n\n ctx.strokeStyle = c.color;\n ctx.lineWidth = c.lineWidth;\n ctx.lineJoin = \"round\";\n\n ctx.beginPath();\n if (c.mode.indexOf(\"x\") != -1) {\n var drawX = Math.floor(crosshair.x) + adj;\n ctx.moveTo(drawX, 0);\n ctx.lineTo(drawX, plot.height());\n }\n if (c.mode.indexOf(\"y\") != -1) {\n var drawY = Math.floor(crosshair.y) + adj;\n ctx.moveTo(0, drawY);\n ctx.lineTo(plot.width(), drawY);\n }\n ctx.stroke();\n }\n ctx.restore();\n });\n\n plot.hooks.shutdown.push(function (plot, eventHolder) {\n eventHolder.unbind(\"mouseout\", onMouseOut);\n eventHolder.unbind(\"mousemove\", onMouseMove);\n });\n }\n \n $.plot.plugins.push({\n init: init,\n options: options,\n name: 'crosshair',\n version: '1.0'\n });\n})(jQuery);\n","/*\n * jQuery.flot.dashes\n *\n * options = {\n * series: {\n * dashes: {\n *\n * // show\n * // default: false\n * // Whether to show dashes for the series.\n * show: <boolean>,\n *\n * // lineWidth\n * // default: 2\n * // The width of the dashed line in pixels.\n * lineWidth: <number>,\n *\n * // dashLength\n * // default: 10\n * // Controls the length of the individual dashes and the amount of\n * // space between them.\n * // If this is a number, the dashes and spaces will have that length.\n * // If this is an array, it is read as [ dashLength, spaceLength ]\n * dashLength: <number> or <array[2]>\n * }\n * }\n * }\n */\n(function($){\n\n function init(plot) {\n\n plot.hooks.processDatapoints.push(function(plot, series, datapoints) {\n\n if (!series.dashes.show) return;\n\n plot.hooks.draw.push(function(plot, ctx) {\n\n var plotOffset = plot.getPlotOffset(),\n axisx = series.xaxis,\n axisy = series.yaxis;\n\n function plotDashes(xoffset, yoffset) {\n\n var points = datapoints.points,\n ps = datapoints.pointsize,\n prevx = null,\n prevy = null,\n dashRemainder = 0,\n dashOn = true,\n dashOnLength,\n dashOffLength;\n\n if (series.dashes.dashLength[0]) {\n dashOnLength = series.dashes.dashLength[0];\n if (series.dashes.dashLength[1]) {\n dashOffLength = series.dashes.dashLength[1];\n } else {\n dashOffLength = dashOnLength;\n }\n } else {\n dashOffLength = dashOnLength = series.dashes.dashLength;\n }\n\n ctx.beginPath();\n\n for (var i = ps; i < points.length; i += ps) {\n\n var x1 = points[i - ps],\n y1 = points[i - ps + 1],\n x2 = points[i],\n y2 = points[i + 1];\n\n if (x1 == null || x2 == null) continue;\n\n // clip with ymin\n if (y1 <= y2 && y1 < axisy.min) {\n if (y2 < axisy.min) continue; // line segment is outside\n // compute new intersection point\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.min;\n } else if (y2 <= y1 && y2 < axisy.min) {\n if (y1 < axisy.min) continue;\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.min;\n }\n\n // clip with ymax\n if (y1 >= y2 && y1 > axisy.max) {\n if (y2 > axisy.max) continue;\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.max;\n } else if (y2 >= y1 && y2 > axisy.max) {\n if (y1 > axisy.max) continue;\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.max;\n }\n\n // clip with xmin\n if (x1 <= x2 && x1 < axisx.min) {\n if (x2 < axisx.min) continue;\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.min;\n } else if (x2 <= x1 && x2 < axisx.min) {\n if (x1 < axisx.min) continue;\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.min;\n }\n\n // clip with xmax\n if (x1 >= x2 && x1 > axisx.max) {\n if (x2 > axisx.max) continue;\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.max;\n } else if (x2 >= x1 && x2 > axisx.max) {\n if (x1 > axisx.max) continue;\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.max;\n }\n\n if (x1 != prevx || y1 != prevy) {\n ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\n }\n\n var ax1 = axisx.p2c(x1) + xoffset,\n ay1 = axisy.p2c(y1) + yoffset,\n ax2 = axisx.p2c(x2) + xoffset,\n ay2 = axisy.p2c(y2) + yoffset,\n dashOffset;\n\n function lineSegmentOffset(segmentLength) {\n\n var c = Math.sqrt(Math.pow(ax2 - ax1, 2) + Math.pow(ay2 - ay1, 2));\n\n if (c <= segmentLength) {\n return {\n deltaX: ax2 - ax1,\n deltaY: ay2 - ay1,\n distance: c,\n remainder: segmentLength - c\n }\n } else {\n var xsign = ax2 > ax1 ? 1 : -1,\n ysign = ay2 > ay1 ? 1 : -1;\n return {\n deltaX: xsign * Math.sqrt(Math.pow(segmentLength, 2) / (1 + Math.pow((ay2 - ay1)/(ax2 - ax1), 2))),\n deltaY: ysign * Math.sqrt(Math.pow(segmentLength, 2) - Math.pow(segmentLength, 2) / (1 + Math.pow((ay2 - ay1)/(ax2 - ax1), 2))),\n distance: segmentLength,\n remainder: 0\n };\n }\n }\n //-end lineSegmentOffset\n\n do {\n\n dashOffset = lineSegmentOffset(\n dashRemainder > 0 ? dashRemainder :\n dashOn ? dashOnLength : dashOffLength);\n\n if (dashOffset.deltaX != 0 || dashOffset.deltaY != 0) {\n if (dashOn) {\n ctx.lineTo(ax1 + dashOffset.deltaX, ay1 + dashOffset.deltaY);\n } else {\n ctx.moveTo(ax1 + dashOffset.deltaX, ay1 + dashOffset.deltaY);\n }\n }\n\n dashOn = !dashOn;\n dashRemainder = dashOffset.remainder;\n ax1 += dashOffset.deltaX;\n ay1 += dashOffset.deltaY;\n\n } while (dashOffset.distance > 0);\n\n prevx = x2;\n prevy = y2;\n }\n\n ctx.stroke();\n }\n //-end plotDashes\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n ctx.lineJoin = 'round';\n\n var lw = series.dashes.lineWidth,\n sw = series.shadowSize;\n\n // FIXME: consider another form of shadow when filling is turned on\n if (lw > 0 && sw > 0) {\n // draw shadow as a thick and thin line with transparency\n ctx.lineWidth = sw;\n ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n // position shadow at angle from the mid of line\n var angle = Math.PI/18;\n plotDashes(Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2));\n ctx.lineWidth = sw/2;\n plotDashes(Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4));\n }\n\n ctx.lineWidth = lw;\n ctx.strokeStyle = series.color;\n\n if (lw > 0) {\n plotDashes(0, 0);\n }\n\n ctx.restore();\n\n });\n //-end draw hook\n\n });\n //-end processDatapoints hook\n\n }\n //-end init\n\n $.plot.plugins.push({\n init: init,\n options: {\n series: {\n dashes: {\n show: false,\n lineWidth: 2,\n dashLength: 10\n }\n }\n },\n name: 'dashes',\n version: '0.1'\n });\n\n})(jQuery)\n","(function($) {\n \"use strict\";\n\n var options = {\n series: {\n fillBelowTo: null\n }\n };\n\n function init(plot) {\n function findBelowSeries( series, allseries ) {\n\n var i;\n\n for ( i = 0; i < allseries.length; ++i ) {\n if ( allseries[ i ].id === series.fillBelowTo ) {\n return allseries[ i ];\n }\n }\n\n return null;\n }\n\n /* top and bottom doesn't actually matter for this, we're just using it to help make this easier to think about */\n /* this is a vector cross product operation */\n function segmentIntersection(top_left_x, top_left_y, top_right_x, top_right_y, bottom_left_x, bottom_left_y, bottom_right_x, bottom_right_y) {\n var top_delta_x, top_delta_y, bottom_delta_x, bottom_delta_y,\n s, t;\n\n top_delta_x = top_right_x - top_left_x;\n top_delta_y = top_right_y - top_left_y;\n bottom_delta_x = bottom_right_x - bottom_left_x;\n bottom_delta_y = bottom_right_y - bottom_left_y;\n\n s = (\n (-top_delta_y * (top_left_x - bottom_left_x)) + (top_delta_x * (top_left_y - bottom_left_y))\n ) / (\n -bottom_delta_x * top_delta_y + top_delta_x * bottom_delta_y\n );\n\n t = (\n (bottom_delta_x * (top_left_y - bottom_left_y)) - (bottom_delta_y * (top_left_x - bottom_left_x))\n ) / (\n -bottom_delta_x * top_delta_y + top_delta_x * bottom_delta_y\n );\n\n // Collision detected\n if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\n return [\n top_left_x + (t * top_delta_x), // X\n top_left_y + (t * top_delta_y) // Y\n ];\n }\n\n // No collision\n return null;\n }\n\n function plotDifferenceArea(plot, ctx, series) {\n if ( series.fillBelowTo === null ) {\n return;\n }\n\n var otherseries,\n\n ps,\n points,\n\n otherps,\n otherpoints,\n\n plotOffset,\n fillStyle;\n\n function openPolygon(x, y) {\n ctx.beginPath();\n ctx.moveTo(\n series.xaxis.p2c(x) + plotOffset.left,\n series.yaxis.p2c(y) + plotOffset.top\n );\n\n }\n\n function closePolygon() {\n ctx.closePath();\n ctx.fill();\n }\n\n function validateInput() {\n if (points.length/ps !== otherpoints.length/otherps) {\n console.error(\"Refusing to graph inconsistent number of points\");\n return false;\n }\n\n var i;\n for (i = 0; i < (points.length / ps); i++) {\n if (\n points[i * ps] !== null &&\n otherpoints[i * otherps] !== null &&\n points[i * ps] !== otherpoints[i * otherps]\n ) {\n console.error(\"Refusing to graph points without matching value\");\n return false;\n }\n }\n\n return true;\n }\n\n function findNextStart(start_i, end_i) {\n console.assert(end_i > start_i, \"expects the end index to be greater than the start index\");\n\n var start = (\n start_i === 0 ||\n points[start_i - 1] === null ||\n otherpoints[start_i - 1] === null\n ),\n equal = false,\n i,\n intersect;\n\n for (i = start_i; i < end_i; i++) {\n // Take note of null points\n if (\n points[(i * ps) + 1] === null ||\n otherpoints[(i * ps) + 1] === null\n ) {\n equal = false;\n start = true;\n }\n\n // Take note of equal points\n else if (points[(i * ps) + 1] === otherpoints[(i * otherps) + 1]) {\n equal = true;\n start = false;\n }\n\n\n else if (points[(i * ps) + 1] > otherpoints[(i * otherps) + 1]) {\n // If we begin above the desired point\n if (start) {\n openPolygon(points[i * ps], points[(i * ps) + 1]);\n }\n\n // If an equal point precedes this, start the polygon at that equal point\n else if (equal) {\n openPolygon(points[(i - 1) * ps], points[((i - 1) * ps) + 1]);\n }\n\n // Otherwise, find the intersection point, and start it there\n else {\n intersect = intersectionPoint(i);\n openPolygon(intersect[0], intersect[1]);\n }\n\n topTraversal(i, end_i);\n return;\n }\n\n // If we go below equal, equal at any preceding point is irrelevant\n else {\n start = false;\n equal = false;\n }\n }\n }\n\n function intersectionPoint(right_i) {\n console.assert(right_i > 0, \"expects the second point in the series line segment\");\n\n var i, intersect;\n\n for (i = 1; i < (otherpoints.length/otherps); i++) {\n intersect = segmentIntersection(\n points[(right_i - 1) * ps], points[((right_i - 1) * ps) + 1],\n points[right_i * ps], points[(right_i * ps) + 1],\n\n otherpoints[(i - 1) * otherps], otherpoints[((i - 1) * otherps) + 1],\n otherpoints[i * otherps], otherpoints[(i * otherps) + 1]\n );\n\n if (intersect !== null) {\n return intersect;\n }\n }\n\n console.error(\"intersectionPoint() should only be called when an intersection happens\");\n }\n\n function bottomTraversal(start_i, end_i) {\n console.assert(start_i >= end_i, \"the start should be the rightmost point, and the end should be the leftmost (excluding the equal or intersecting point)\");\n\n var i;\n\n for (i = start_i; i >= end_i; i--) {\n ctx.lineTo(\n otherseries.xaxis.p2c(otherpoints[i * otherps]) + plotOffset.left,\n otherseries.yaxis.p2c(otherpoints[(i * otherps) + 1]) + plotOffset.top\n );\n }\n\n closePolygon();\n }\n\n function topTraversal(start_i, end_i) {\n console.assert(start_i <= end_i, \"the start should be the rightmost point, and the end should be the leftmost (excluding the equal or intersecting point)\");\n\n var i,\n intersect;\n\n for (i = start_i; i < end_i; i++) {\n if (points[(i * ps) + 1] === null && i > start_i) {\n bottomTraversal(i - 1, start_i);\n findNextStart(i, end_i);\n return;\n }\n\n else if (points[(i * ps) + 1] === otherpoints[(i * otherps) + 1]) {\n bottomTraversal(i, start_i);\n findNextStart(i, end_i);\n return;\n }\n\n else if (points[(i * ps) + 1] < otherpoints[(i * otherps) + 1]) {\n intersect = intersectionPoint(i);\n ctx.lineTo(\n series.xaxis.p2c(intersect[0]) + plotOffset.left,\n series.yaxis.p2c(intersect[1]) + plotOffset.top\n );\n bottomTraversal(i, start_i);\n findNextStart(i, end_i);\n return;\n\n }\n\n else {\n ctx.lineTo(\n series.xaxis.p2c(points[i * ps]) + plotOffset.left,\n series.yaxis.p2c(points[(i * ps) + 1]) + plotOffset.top\n );\n }\n }\n\n bottomTraversal(end_i, start_i);\n }\n\n\n // Begin processing\n\n otherseries = findBelowSeries( series, plot.getData() );\n\n if ( !otherseries ) {\n return;\n }\n\n ps = series.datapoints.pointsize;\n points = series.datapoints.points;\n otherps = otherseries.datapoints.pointsize;\n otherpoints = otherseries.datapoints.points;\n plotOffset = plot.getPlotOffset();\n\n if (!validateInput()) {\n return;\n }\n\n\n // Flot's getFillStyle() should probably be exposed somewhere\n fillStyle = $.color.parse(series.color);\n fillStyle.a = 0.4;\n fillStyle.normalize();\n ctx.fillStyle = fillStyle.toString();\n\n\n // Begin recursive bi-directional traversal\n findNextStart(0, points.length/ps);\n }\n\n plot.hooks.drawSeries.push(plotDifferenceArea);\n }\n\n $.plot.plugins.push({\n init: init,\n options: options,\n name: \"fillbelow\",\n version: \"0.1.0\"\n });\n\n})(jQuery);\n","/*!\n * jquery.flot.gauge v1.1.0 *\n *\n * Flot plugin for rendering gauge charts.\n *\n * Copyright (c) 2015 @toyoty99.\n * Licensed under the MIT license.\n */\n\n/**\n * @module flot.gauge\n */\n(function($) {\n\n\n /**\n * Gauge class\n *\n * @class Gauge\n */\n var Gauge = (function() {\n /**\n * context of canvas\n *\n * @property context\n * @type Object\n */\n var context;\n /**\n * placeholder of canvas\n *\n * @property placeholder\n * @type Object\n */\n var placeholder;\n /**\n * options of plot\n *\n * @property options\n * @type Object\n */\n var options;\n /**\n * options of gauge\n *\n * @property gaugeOptions\n * @type Object\n */\n var gaugeOptions;\n /**\n * data series\n *\n * @property series\n * @type Array\n */\n var series;\n /**\n * logger\n *\n * @property logger\n * @type Object\n */\n var logger;\n\n /**\n * constructor\n *\n * @class Gauge\n * @constructor\n * @param {Object} gaugeOptions gauge options\n */\n var Gauge = function(plot, ctx) {\n context = ctx;\n placeholder = plot.getPlaceholder();\n options = plot.getOptions();\n gaugeOptions = options.series.gauges;\n series = plot.getData();\n logger = getLogger(gaugeOptions.debug);\n }\n\n /**\n * calculate layout\n *\n * @method calculateLayout\n * @return the calculated layout properties\n */\n Gauge.prototype.calculateLayout = function() {\n\n var canvasWidth = placeholder.width();\n var canvasHeight = placeholder.height();\n\n\n\n // calculate cell size\n var columns = Math.min(series.length, gaugeOptions.layout.columns);\n var rows = Math.ceil(series.length / columns);\n\n\n\n var margin = gaugeOptions.layout.margin;\n var hMargin = gaugeOptions.layout.hMargin;\n var vMargin = gaugeOptions.layout.vMargin;\n var cellWidth = (canvasWidth - (margin * 2) - (hMargin * (columns - 1))) / columns;\n var cellHeight = (canvasHeight - (margin * 2) - (vMargin * (rows - 1))) / rows;\n if (gaugeOptions.layout.square) {\n var cell = Math.min(cellWidth, cellHeight);\n cellWidth = cell;\n cellHeight = cell;\n }\n\n\n\n // calculate 'auto' values\n calculateAutoValues(gaugeOptions, cellWidth);\n\n // calculate maximum radius\n var cellMargin = gaugeOptions.cell.margin;\n var labelMargin = 0;\n var labelFontSize = 0;\n if (gaugeOptions.label.show) {\n labelMargin = gaugeOptions.label.margin;\n labelFontSize = gaugeOptions.label.font.size;\n }\n var valueMargin = 0;\n var valueFontSize = 0;\n if (gaugeOptions.value.show) {\n valueMargin = gaugeOptions.value.margin;\n valueFontSize = gaugeOptions.value.font.size;\n }\n var thresholdWidth = 0;\n if (gaugeOptions.threshold.show) {\n thresholdWidth = gaugeOptions.threshold.width;\n }\n var thresholdLabelMargin = 0;\n var thresholdLabelFontSize = 0;\n if (gaugeOptions.threshold.label.show) {\n thresholdLabelMargin = gaugeOptions.threshold.label.margin;\n thresholdLabelFontSize = gaugeOptions.threshold.label.font.size;\n }\n\n var maxRadiusH = (cellWidth / 2) - cellMargin - thresholdWidth - (thresholdLabelMargin * 2) - thresholdLabelFontSize;\n\n var startAngle = gaugeOptions.gauge.startAngle;\n var endAngle = gaugeOptions.gauge.endAngle;\n var dAngle = (endAngle - startAngle) / 100;\n var heightRatioV = -1;\n for (var a = startAngle; a < endAngle; a += dAngle) {\n heightRatioV = Math.max(heightRatioV, Math.sin(toRad(a)));\n }\n heightRatioV = Math.max(heightRatioV, Math.sin(toRad(endAngle)));\n var outerRadiusV = (cellHeight - (cellMargin * 2) - (labelMargin * 2) - labelFontSize) / (1 + heightRatioV);\n if (outerRadiusV * heightRatioV < valueMargin + (valueFontSize / 2)) {\n outerRadiusV = cellHeight - (cellMargin * 2) - (labelMargin * 2) - labelFontSize - valueMargin - (valueFontSize / 2);\n }\n var maxRadiusV = outerRadiusV - (thresholdLabelMargin * 2) - thresholdLabelFontSize - thresholdWidth;\n\n var radius = Math.min(maxRadiusH, maxRadiusV);\n\n\n var width = gaugeOptions.gauge.width;\n if (width >= radius) {\n width = Math.max(3, radius / 3);\n }\n\n\n var outerRadius = (thresholdLabelMargin * 2) + thresholdLabelFontSize + thresholdWidth + radius;\n var gaugeOuterHeight = Math.max(outerRadius * (1 + heightRatioV), outerRadius + valueMargin + (valueFontSize / 2));\n\n return {\n canvasWidth: canvasWidth,\n canvasHeight: canvasHeight,\n margin: margin,\n hMargin: hMargin,\n vMargin: vMargin,\n columns: columns,\n rows: rows,\n cellWidth: cellWidth,\n cellHeight: cellHeight,\n cellMargin: cellMargin,\n labelMargin: labelMargin,\n labelFontSize: labelFontSize,\n valueMargin: valueMargin,\n valueFontSize: valueFontSize,\n width: width,\n radius: radius,\n thresholdWidth: thresholdWidth,\n thresholdLabelMargin: thresholdLabelMargin,\n thresholdLabelFontSize: thresholdLabelFontSize,\n gaugeOuterHeight: gaugeOuterHeight\n };\n }\n\n /**\n * calculate the values which are set as 'auto'\n *\n * @method calculateAutoValues\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Number} cellWidth the width of cell\n */\n function calculateAutoValues(gaugeOptionsi, cellWidth) {\n\n if (gaugeOptionsi.gauge.width === \"auto\") {\n gaugeOptionsi.gauge.width = Math.max(5, cellWidth / 8);\n }\n if (gaugeOptionsi.label.margin === \"auto\") {\n gaugeOptionsi.label.margin = Math.max(1, cellWidth / 20);\n }\n if (gaugeOptionsi.label.font.size === \"auto\") {\n gaugeOptionsi.label.font.size = Math.max(5, cellWidth / 8);\n }\n if (gaugeOptionsi.value.margin === \"auto\") {\n gaugeOptionsi.value.margin = Math.max(1, cellWidth / 30);\n }\n if (gaugeOptionsi.value.font.size === \"auto\") {\n gaugeOptionsi.value.font.size = Math.max(5, cellWidth / 9);\n }\n if (gaugeOptionsi.threshold.width === \"auto\") {\n gaugeOptionsi.threshold.width = Math.max(3, cellWidth / 100);\n }\n if (gaugeOptionsi.threshold.label.margin === \"auto\") {\n gaugeOptionsi.threshold.label.margin = Math.max(3, cellWidth / 40);\n }\n if (gaugeOptionsi.threshold.label.font.size === \"auto\") {\n gaugeOptionsi.threshold.label.font.size = Math.max(5, cellWidth / 15);\n }\n\n }\n Gauge.prototype.calculateAutoValues = calculateAutoValues;\n\n /**\n * calculate the layout of the cell inside\n *\n * @method calculateCellLayout\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Number} cellWidth the width of cell\n * @param {Number} i the index of the series\n * @return the calculated cell layout properties\n */\n Gauge.prototype.calculateCellLayout = function(gaugeOptionsi, layout, i) {\n\n // calculate top, left and center\n var c = col(layout.columns, i);\n var r = row(layout.columns, i);\n var x = layout.margin + (layout.cellWidth + layout.hMargin) * c;\n var y = layout.margin + (layout.cellHeight + layout.vMargin) * r;\n var cx = x + (layout.cellWidth / 2);\n var cy = y + layout.cellMargin + (layout.labelMargin * 2) + layout.labelFontSize + layout.thresholdWidth\n + layout.thresholdLabelFontSize + (layout.thresholdLabelMargin * 2) + layout.radius;\n var blank = layout.cellHeight - (layout.cellMargin * 2) - (layout.labelMargin * 2) - layout.labelFontSize - layout.gaugeOuterHeight;\n var offsetY = 0;\n if (gaugeOptionsi.cell.vAlign === \"middle\") {\n offsetY = (blank / 2);\n } else if (gaugeOptionsi.cell.vAlign === \"bottom\") {\n offsetY = blank;\n }\n cy += offsetY;\n\n return {\n col: c,\n row: r,\n x: x,\n y: y,\n offsetY: offsetY,\n cellWidth: layout.cellWidth,\n cellHeight: layout.cellHeight,\n cellMargin: layout.cellMargin,\n cx: cx,\n cy: cy\n }\n }\n\n /**\n * draw the background of chart\n *\n * @method drawBackground\n * @param {Object} layout the layout properties\n */\n Gauge.prototype.drawBackground = function(layout) {\n\n if (!gaugeOptions.frame.show) {\n return;\n }\n context.save();\n context.strokeStyle = options.grid.borderColor;\n context.lineWidth = options.grid.borderWidth;\n context.strokeRect(0, 0, layout.canvasWidth, layout.canvasHeight);\n if (options.grid.backgroundColor) {\n context.fillStyle = options.grid.backgroundColor;\n context.fillRect(0, 0, layout.canvasWidth, layout.canvasHeight);\n }\n context.restore();\n }\n\n /**\n * draw the background of cell\n *\n * @method drawCellBackground\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} cellLayout the cell layout properties\n */\n Gauge.prototype.drawCellBackground = function(gaugeOptionsi, cellLayout) {\n\n context.save();\n if (gaugeOptionsi.cell.border && gaugeOptionsi.cell.border.show && gaugeOptionsi.cell.border.color && gaugeOptionsi.cell.border.width) {\n context.strokeStyle = gaugeOptionsi.cell.border.color;\n context.lineWidth = gaugeOptionsi.cell.border.width;\n context.strokeRect(cellLayout.x, cellLayout.y, cellLayout.cellWidth, cellLayout.cellHeight);\n }\n if (gaugeOptionsi.cell.background && gaugeOptionsi.cell.background.color) {\n context.fillStyle = gaugeOptionsi.cell.background.color;\n context.fillRect(cellLayout.x, cellLayout.y, cellLayout.cellWidth, cellLayout.cellHeight);\n }\n context.restore();\n }\n\n /**\n * draw the gauge\n *\n * @method drawGauge\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} layout the layout properties\n * @param {Object} cellLayout the cell layout properties\n * @param {String} label the label of data\n * @param {Number} data the value of the gauge\n */\n Gauge.prototype.drawGauge = function(gaugeOptionsi, layout, cellLayout, label, data) {\n\n\n var blur = gaugeOptionsi.gauge.shadow.show ? gaugeOptionsi.gauge.shadow.blur : 0;\n\n\n // draw gauge frame\n drawArcWithShadow(\n cellLayout.cx, // center x\n cellLayout.cy, // center y\n layout.radius,\n layout.width,\n toRad(gaugeOptionsi.gauge.startAngle),\n toRad(gaugeOptionsi.gauge.endAngle),\n gaugeOptionsi.gauge.border.color, // line color\n gaugeOptionsi.gauge.border.width, // line width\n gaugeOptionsi.gauge.background.color, // fill color\n blur);\n\n // draw gauge\n var c1 = getColor(gaugeOptionsi, data);\n var a2 = calculateAngle(gaugeOptionsi, layout, data);\n drawArcWithShadow(\n cellLayout.cx, // center x\n cellLayout.cy, // center y\n layout.radius - 1,\n layout.width - 2,\n toRad(gaugeOptionsi.gauge.startAngle),\n toRad(a2),\n c1, // line color\n 1, // line width\n c1, // fill color\n blur);\n }\n\n /**\n * decide the color of the data from the threshold options\n *\n * @method getColor\n * @private\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Number} data the value of the gauge\n */\n function getColor(gaugeOptionsi, data) {\n var color;\n for (var i = 0; i < gaugeOptionsi.threshold.values.length; i++) {\n var threshold = gaugeOptionsi.threshold.values[i];\n color = threshold.color;\n if (data < threshold.value) {\n break;\n }\n }\n return color;\n }\n\n /**\n * calculate the angle of the data\n *\n * @method calculateAngle\n * @private\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} layout the layout properties\n * @param {Number} data the value of the gauge\n */\n function calculateAngle(gaugeOptionsi, layout, data) {\n var a =\n gaugeOptionsi.gauge.startAngle\n + (gaugeOptionsi.gauge.endAngle - gaugeOptionsi.gauge.startAngle)\n * ((data - gaugeOptionsi.gauge.min) / (gaugeOptionsi.gauge.max - gaugeOptionsi.gauge.min));\n\n if (a < gaugeOptionsi.gauge.startAngle) {\n a = gaugeOptionsi.gauge.startAngle;\n } else if (a > gaugeOptionsi.gauge.endAngle) {\n a = gaugeOptionsi.gauge.endAngle;\n }\n return a;\n }\n\n /**\n * draw the arc of the threshold\n *\n * @method drawThreshold\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} layout the layout properties\n * @param {Object} cellLayout the cell layout properties\n */\n Gauge.prototype.drawThreshold = function(gaugeOptionsi, layout, cellLayout) {\n\n var a1 = gaugeOptionsi.gauge.startAngle;\n for (var i = 0; i < gaugeOptionsi.threshold.values.length; i++) {\n var threshold = gaugeOptionsi.threshold.values[i];\n c1 = threshold.color;\n a2 = calculateAngle(gaugeOptionsi, layout, threshold.value);\n drawArc(\n context,\n cellLayout.cx, // center x\n cellLayout.cy, // center y\n layout.radius + layout.thresholdWidth,\n layout.thresholdWidth - 2,\n toRad(a1),\n toRad(a2),\n c1, // line color\n 1, // line width\n c1); // fill color\n a1 = a2;\n }\n }\n\n /**\n * draw an arc with a shadow\n *\n * @method drawArcWithShadow\n * @private\n * @param {Number} cx the x position of the center\n * @param {Number} cy the y position of the center\n * @param {Number} r the radius of an arc\n * @param {Number} w the width of an arc\n * @param {Number} rd1 the start angle of an arc in radians\n * @param {Number} rd2 the end angle of an arc in radians\n * @param {String} lc the color of a line\n * @param {Number} lw the widht of a line\n * @param {String} fc the fill color of an arc\n * @param {Number} blur the shdow blur\n */\n function drawArcWithShadow(cx, cy, r, w, rd1, rd2, lc, lw, fc, blur) {\n if (rd1 === rd2) {\n return;\n }\n context.save();\n\n drawArc(context, cx, cy, r, w, rd1, rd2, lc, lw, fc);\n\n if (blur) {\n drawArc(context, cx, cy, r, w, rd1, rd2);\n context.clip();\n context.shadowOffsetX = 0;\n context.shadowOffsetY = 0;\n context.shadowBlur = 10;\n context.shadowColor = \"gray\";\n drawArc(context, cx, cy, r + 1, w + 2, rd1, rd2, lc, 1);\n }\n context.restore();\n }\n\n /**\n * draw the label of the gauge\n *\n * @method drawLable\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} layout the layout properties\n * @param {Object} cellLayout the cell layout properties\n * @param {Number} i the index of the series\n * @param {Object} item the item of the series\n */\n Gauge.prototype.drawLable = function(gaugeOptionsi, layout, cellLayout, i, item) {\n\n drawText(\n cellLayout.cx,\n cellLayout.y + cellLayout.cellMargin + layout.labelMargin + cellLayout.offsetY,\n \"flotGaugeLabel\" + i,\n gaugeOptionsi.label.formatter ? gaugeOptionsi.label.formatter(item.label, item.data[0][1]) : text,\n gaugeOptionsi.label);\n }\n\n /**\n * draw the value of the gauge\n *\n * @method drawValue\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} layout the layout properties\n * @param {Object} cellLayout the cell layout properties\n * @param {Number} i the index of the series\n * @param {Object} item the item of the series\n */\n Gauge.prototype.drawValue = function(gaugeOptionsi, layout, cellLayout, i, item) {\n\n drawText(\n cellLayout.cx,\n cellLayout.cy - (gaugeOptionsi.value.font.size / 2),\n \"flotGaugeValue\" + i,\n gaugeOptionsi.value.formatter ? gaugeOptionsi.value.formatter(item.label, item.data[0][1]) : text,\n gaugeOptionsi.value);\n }\n\n /**\n * draw the values of the threshold\n *\n * @method drawThresholdValues\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} layout the layout properties\n * @param {Object} cellLayout the cell layout properties\n * @param {Number} i the index of the series\n */\n Gauge.prototype.drawThresholdValues = function(gaugeOptionsi, layout, cellLayout, i) {\n\n // min, max\n drawThresholdValue(gaugeOptionsi, layout, cellLayout, \"Min\" + i, gaugeOptionsi.gauge.min, gaugeOptionsi.gauge.startAngle);\n drawThresholdValue(gaugeOptionsi, layout, cellLayout, \"Max\" + i, gaugeOptionsi.gauge.max, gaugeOptionsi.gauge.endAngle);\n // threshold values\n for (var j = 0; j < gaugeOptionsi.threshold.values.length; j++) {\n var threshold = gaugeOptionsi.threshold.values[j];\n if (threshold.value > gaugeOptionsi.gauge.min && threshold.value < gaugeOptionsi.gauge.max) {\n var a = calculateAngle(gaugeOptionsi, layout, threshold.value);\n drawThresholdValue(gaugeOptionsi, layout, cellLayout, i + \"_\" + j, threshold.value, a);\n }\n }\n }\n\n /**\n * draw the value of the threshold\n *\n * @method drawThresholdValue\n * @param {Object} gaugeOptionsi the options of the gauge\n * @param {Object} layout the layout properties\n * @param {Object} cellLayout the cell layout properties\n * @param {Number} i the index of the series\n * @param {Number} value the value of the threshold\n * @param {Number} a the angle of the value drawn\n */\n function drawThresholdValue(gaugeOptionsi, layout, cellLayout, i, value, a) {\n drawText(\n cellLayout.cx\n + ((layout.thresholdLabelMargin + (layout.thresholdLabelFontSize / 2) + layout.radius)\n * Math.cos(toRad(a))),\n cellLayout.cy\n + ((layout.thresholdLabelMargin + (layout.thresholdLabelFontSize / 2) + layout.radius)\n * Math.sin(toRad(a))),\n \"flotGaugeThresholdValue\" + i,\n gaugeOptionsi.threshold.label.formatter ? gaugeOptionsi.threshold.label.formatter(value) : value,\n gaugeOptionsi.threshold.label,\n a);\n }\n\n /**\n * draw a text\n *\n * the textOptions is assumed as follows:\n *\n * textOptions: {\n * background: {\n * color: null,\n * opacity: 0\n * },\n * font: {\n * size: \"auto\"\n * family: \"\\\"MS ゴシック\\\",sans-serif\"\n * },\n * color: null\n * }\n *\n * @method drawText\n * @private\n * @param {Number} x the x position of the text drawn (left top)\n * @param {Number} y the y position of the text drawn (left top)\n * @param {String} id the id of the dom element\n * @param {String} text the text drawn\n * @param {Object} textOptions the option of the text\n * @param {Number} [a] the angle of the value drawn\n */\n function drawText(x, y, id, text, textOptions, a) {\n var span = $(placeholder).find(\"#\" + id);\n var exists = span.length;\n if (!exists) {\n span = $(\"<span></span>\")\n span.attr(\"id\", id);\n span.attr(\"class\", \"flot-temp-elem\");\n placeholder.append(span);\n }\n\n span.css(\"position\", \"absolute\");\n span.css(\"top\", y + \"px\");\n span.css(\"white-space\", \"nowrap\");\n\n if (textOptions.font.size) {\n span.css(\"font-size\", textOptions.font.size + \"px\");\n }\n if (textOptions.font.family) {\n span.css(\"font-family\", textOptions.font.family);\n }\n if (textOptions.color) {\n span.css(\"color\", textOptions.color);\n }\n if (textOptions.background.color) {\n span.css(\"background-color\", textOptions.background.color);\n }\n if (textOptions.background.opacity) {\n span.css(\"opacity\", textOptions.background.opacity);\n }\n span.text(text);\n // after append, readjust the left position\n span.css(\"left\", x + \"px\"); // for redraw, resetting the left position is needed here\n span.css(\"left\", (parseInt(span.css(\"left\")) - (span.width()/ 2)) + \"px\");\n\n // at last, set angle\n if (!exists && a) {\n span.css(\"top\", (parseInt(span.css(\"top\")) - (span.height()/ 2)) + \"px\");\n span.css(\"transform\", \"rotate(\" + ((180 * a) + 90) + \"deg)\"); // not supported for ie8\n }\n }\n\n return Gauge;\n })();\n /**\n * get a instance of Logger\n *\n * @method getLogger\n * @for flot.gauge\n * @private\n * @param {Object} debugOptions the options of debug\n */\n function getLogger(debugOptions) {\n return typeof Logger !== \"undefined\" ? new Logger(debugOptions) : null;\n }\n\n /**\n * calculate the index of columns for the specified data\n *\n * @method col\n * @for flot.gauge\n * @param {Number} columns the number of columns\n * @param {Number} i the index of the series\n * @return the index of columns\n */\n function col(columns, i) {\n return i % columns;\n }\n\n /**\n * calculate the index of rows for the specified data\n *\n * @method row\n * @for flot.gauge\n * @param {Number} columns the number of rows\n * @param {Number} i the index of the series\n * @return the index of rows\n */\n function row(columns, i) {\n return Math.floor(i / columns);\n }\n\n /**\n * calculate the angle in radians\n *\n * internally, use a number without PI (0 - 2).\n * so, in this function, multiply PI\n *\n * @method toRad\n * @for flot.gauge\n * @param {Number} a the number of angle without PI\n * @return the angle in radians\n */\n function toRad(a) {\n return a * Math.PI;\n }\n\n /**\n * draw an arc\n *\n * @method drawArc\n * @for flot.gauge\n * @param {Object} context the context of canvas\n * @param {Number} cx the x position of the center\n * @param {Number} cy the y position of the center\n * @param {Number} r the radius of an arc\n * @param {Number} w the width of an arc\n * @param {Number} rd1 the start angle of an arc in radians\n * @param {Number} rd2 the end angle of an arc in radians\n * @param {String} lc the color of a line\n * @param {Number} lw the widht of a line\n * @param {String} fc the fill color of an arc\n */\n function drawArc(context, cx, cy, r, w, rd1, rd2, lc, lw, fc) {\n if (rd1 === rd2) {\n return;\n }\n var counterClockwise = false;\n context.save();\n context.beginPath();\n context.arc(cx, cy, r, rd1, rd2, counterClockwise);\n context.lineTo(cx + (r - w) * Math.cos(rd2),\n cy + (r - w) * Math.sin(rd2));\n context.arc(cx, cy, r - w, rd2, rd1, !counterClockwise);\n context.closePath();\n if (lw) {\n context.lineWidth = lw;\n }\n if (lc) {\n context.strokeStyle = lc;\n context.stroke();\n }\n if (fc) {\n context.fillStyle = fc;\n context.fill();\n }\n context.restore();\n }\n\n /**\n * initialize plugin\n *\n * @method init\n * @for flot.gauge\n * @private\n * @param {Object} plot a instance of plot\n */\n function init (plot) {\n // add processOptions hook\n plot.hooks.processOptions.push(function(plot, options) {\n var logger = getLogger(options.series.gauges.debug);\n\n\n\n\n // turn 'grid' and 'legend' off\n if (options.series.gauges.show) {\n options.grid.show = false;\n options.legend.show = false;\n }\n\n // sort threshold\n var thresholds = options.series.gauges.threshold.values;\n\n thresholds.sort(function(a, b) {\n if (a.value < b.value) {\n return -1;\n } else if (a.value > b.value) {\n return 1;\n } else {\n return 0;\n }\n });\n\n\n\n });\n\n // add draw hook\n plot.hooks.draw.push(function(plot, context) {\n var options = plot.getOptions();\n var gaugeOptions = options.series.gauges;\n\n var logger = getLogger(gaugeOptions.debug);\n\n\n if (!gaugeOptions.show) {\n return;\n }\n\n var series = plot.getData();\n\n if (!series || !series.length) {\n return; // if no series were passed\n }\n\n var gauge = new Gauge(plot, context);\n\n // calculate layout\n var layout = gauge.calculateLayout();\n\n // debug layout\n if (gaugeOptions.debug.layout) {\n\n }\n\n // draw background\n gauge.drawBackground(layout)\n\n // draw cells (label, gauge, value, threshold)\n for (var i = 0; i < series.length; i++) {\n var item = series[i];\n\n var gaugeOptionsi = $.extend({}, gaugeOptions, item.gauges);\n if (item.gauges) {\n // re-calculate 'auto' values\n gauge.calculateAutoValues(gaugeOptionsi, layout.cellWidth);\n }\n\n // calculate cell layout\n var cellLayout = gauge.calculateCellLayout(gaugeOptionsi, layout, i);\n\n // draw cell background\n gauge.drawCellBackground(gaugeOptionsi, cellLayout)\n // debug layout\n if (gaugeOptionsi.debug.layout) {\n\n }\n // draw label\n if (gaugeOptionsi.label.show) {\n gauge.drawLable(gaugeOptionsi, layout, cellLayout, i, item);\n }\n // draw gauge\n gauge.drawGauge(gaugeOptionsi, layout, cellLayout, item.label, item.data[0][1]);\n // draw threshold\n if (gaugeOptionsi.threshold.show) {\n gauge.drawThreshold(gaugeOptionsi, layout, cellLayout);\n }\n if (gaugeOptionsi.threshold.label.show) {\n gauge.drawThresholdValues(gaugeOptionsi, layout, cellLayout, i)\n }\n // draw value\n if (gaugeOptionsi.value.show) {\n gauge.drawValue(gaugeOptionsi, layout, cellLayout, i, item);\n }\n }\n });\n }\n\n /**\n * [defaults description]\n *\n * @property defaults\n * @type {Object}\n */\n var defaults = {\n series: {\n gauges: {\n debug: {\n log: false,\n layout: false,\n alert: false\n },\n show: false,\n layout: {\n margin: 5,\n columns: 3,\n hMargin: 5,\n vMargin: 5,\n square: false\n },\n frame: {\n show: true\n },\n cell: {\n background: {\n color: null\n },\n border: {\n show: true,\n color: \"black\",\n width: 1\n },\n margin: 5,\n vAlign: \"middle\" // 'top' or 'middle' or 'bottom'\n },\n gauge: {\n width: \"auto\", // a specified number, or 'auto'\n startAngle: 0.9, // 0 - 2 factor of the radians\n endAngle: 2.1, // 0 - 2 factor of the radians\n min: 0,\n max: 100,\n background: {\n color: \"white\"\n },\n border: {\n color: \"lightgray\",\n width: 2\n },\n shadow: {\n show: true,\n blur: 5\n }\n },\n label: {\n show: true,\n margin: \"auto\", // a specified number, or 'auto'\n background: {\n color: null,\n opacity: 0\n },\n font: {\n size: \"auto\", // a specified number, or 'auto'\n family: \"sans-serif\"\n },\n color: null,\n formatter: function(label, value) {\n return label;\n }\n },\n value: {\n show: true,\n margin: \"auto\", // a specified number, or 'auto'\n background: {\n color: null,\n opacity: 0\n },\n font: {\n size: \"auto\", // a specified number, or 'auto'\n family: \"sans-serif\"\n },\n color: null,\n formatter: function(label, value) {\n return parseInt(value);\n }\n },\n threshold: {\n show: true,\n width: \"auto\", // a specified number, or 'auto'\n label: {\n show: true,\n margin: \"auto\", // a specified number, or 'auto'\n background: {\n color: null,\n opacity: 0\n },\n font: {\n size: \"auto\", // a specified number, or 'auto'\n family: \",sans-serif\"\n },\n color: null,\n formatter: function(value) {\n return value;\n }\n },\n values: [\n\n ]\n }\n }\n }\n };\n\n // register the gauge plugin\n $.plot.plugins.push({\n init: init,\n options: defaults,\n name: \"gauge\",\n version: \"1.1.0\"\n });\n\n})(jQuery);\n\n","/* Javascript plotting library for jQuery, version 0.8.3.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\n*/\n\n// first an inline dependency, jquery.colorhelpers.js, we inline it here\n// for convenience\n\n/* Plugin for jQuery for working with colors.\n *\n * Version 1.1.\n *\n * Inspiration from jQuery color animation plugin by John Resig.\n *\n * Released under the MIT license by Ole Laursen, October 2009.\n *\n * Examples:\n *\n * $.color.parse(\"#fff\").scale('rgb', 0.25).add('a', -0.5).toString()\n * var c = $.color.extract($(\"#mydiv\"), 'background-color');\n * console.log(c.r, c.g, c.b, c.a);\n * $.color.make(100, 50, 25, 0.4).toString() // returns \"rgba(100,50,25,0.4)\"\n *\n * Note that .scale() and .add() return the same modified object\n * instead of making a new one.\n *\n * V. 1.1: Fix error handling so e.g. parsing an empty string does\n * produce a color rather than just crashing.\n */\n(function($) { $.color = {}; $.color.make = function(r, g, b, a) { var o = {}; o.r = r || 0; o.g = g || 0; o.b = b || 0; o.a = a != null ? a : 1; o.add = function(c, d) { for (var i = 0; i < c.length; ++i)o[c.charAt(i)] += d; return o.normalize() }; o.scale = function(c, f) { for (var i = 0; i < c.length; ++i)o[c.charAt(i)] *= f; return o.normalize() }; o.toString = function() { if (o.a >= 1) { return \"rgb(\" + [o.r, o.g, o.b].join(\",\") + \")\" } else { return \"rgba(\" + [o.r, o.g, o.b, o.a].join(\",\") + \")\" } }; o.normalize = function() { function clamp(min, value, max) { return value < min ? min : value > max ? max : value } o.r = clamp(0, parseInt(o.r), 255); o.g = clamp(0, parseInt(o.g), 255); o.b = clamp(0, parseInt(o.b), 255); o.a = clamp(0, o.a, 1); return o }; o.clone = function() { return $.color.make(o.r, o.b, o.g, o.a) }; return o.normalize() }; $.color.extract = function(elem, css) { var c; do { c = elem.css(css).toLowerCase(); if (c != \"\" && c != \"transparent\") break; elem = elem.parent() } while (elem.length && !$.nodeName(elem.get(0), \"body\")); if (c == \"rgba(0, 0, 0, 0)\") c = \"transparent\"; return $.color.parse(c) }; $.color.parse = function(str) { var res, m = $.color.make; if (res = /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/.exec(str)) return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); if (res = /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str)) return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); if (res = /rgb\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*\\)/.exec(str)) return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55); if (res = /rgba\\(\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\%\\s*,\\s*([0-9]+(?:\\.[0-9]+)?)\\s*\\)/.exec(str)) return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55, parseFloat(res[4])); if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) return m(parseInt(res[1] + res[1], 16), parseInt(res[2] + res[2], 16), parseInt(res[3] + res[3], 16)); var name = $.trim(str).toLowerCase(); if (name == \"transparent\") return m(255, 255, 255, 0); else { res = lookupColors[name] || [0, 0, 0]; return m(res[0], res[1], res[2]) } }; var lookupColors = { aqua: [0, 255, 255], azure: [240, 255, 255], beige: [245, 245, 220], black: [0, 0, 0], blue: [0, 0, 255], brown: [165, 42, 42], cyan: [0, 255, 255], darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgrey: [169, 169, 169], darkgreen: [0, 100, 0], darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47], darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0], darksalmon: [233, 150, 122], darkviolet: [148, 0, 211], fuchsia: [255, 0, 255], gold: [255, 215, 0], green: [0, 128, 0], indigo: [75, 0, 130], khaki: [240, 230, 140], lightblue: [173, 216, 230], lightcyan: [224, 255, 255], lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193], lightyellow: [255, 255, 224], lime: [0, 255, 0], magenta: [255, 0, 255], maroon: [128, 0, 0], navy: [0, 0, 128], olive: [128, 128, 0], orange: [255, 165, 0], pink: [255, 192, 203], purple: [128, 0, 128], violet: [128, 0, 128], red: [255, 0, 0], silver: [192, 192, 192], white: [255, 255, 255], yellow: [255, 255, 0] } })(jQuery);\n\n// the actual Flot code\n(function($) {\n\n // Cache the prototype hasOwnProperty for faster access\n\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM\n // operation produces the same effect as detach, i.e. removing the element\n // without touching its jQuery data.\n\n // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.\n\n if (!$.fn.detach) {\n $.fn.detach = function() {\n return this.each(function() {\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n });\n };\n }\n\n ///////////////////////////////////////////////////////////////////////////\n // The Canvas object is a wrapper around an HTML5 <canvas> tag.\n //\n // @constructor\n // @param {string} cls List of classes to apply to the canvas.\n // @param {element} container Element onto which to append the canvas.\n //\n // Requiring a container is a little iffy, but unfortunately canvas\n // operations don't work unless the canvas is attached to the DOM.\n\n function Canvas(cls, container) {\n\n var element = container.children(\".\" + cls)[0];\n\n if (element == null) {\n\n element = document.createElement(\"canvas\");\n element.className = cls;\n\n $(element).css({ direction: \"ltr\", position: \"absolute\", left: 0, top: 0 })\n .appendTo(container);\n\n // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas\n\n if (!element.getContext) {\n if (window.G_vmlCanvasManager) {\n element = window.G_vmlCanvasManager.initElement(element);\n } else {\n throw new Error(\"Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.\");\n }\n }\n }\n\n this.element = element;\n\n var context = this.context = element.getContext(\"2d\");\n\n // Determine the screen's ratio of physical to device-independent\n // pixels. This is the ratio between the canvas width that the browser\n // advertises and the number of pixels actually present in that space.\n\n // The iPhone 4, for example, has a device-independent width of 320px,\n // but its screen is actually 640px wide. It therefore has a pixel\n // ratio of 2, while most normal devices have a ratio of 1.\n\n var devicePixelRatio = window.devicePixelRatio || 1,\n backingStoreRatio =\n context.webkitBackingStorePixelRatio ||\n context.mozBackingStorePixelRatio ||\n context.msBackingStorePixelRatio ||\n context.oBackingStorePixelRatio ||\n context.backingStorePixelRatio || 1;\n\n this.pixelRatio = devicePixelRatio / backingStoreRatio;\n\n // Size the canvas to match the internal dimensions of its container\n\n this.resize(container.width(), container.height());\n\n // Collection of HTML div layers for text overlaid onto the canvas\n\n this.textContainer = null;\n this.text = {};\n\n // Cache of text fragments and metrics, so we can avoid expensively\n // re-calculating them when the plot is re-rendered in a loop.\n\n this._textCache = {};\n this._textSizeCache = window.flotTextSizeCache = window.flotTextSizeCache || {};\n }\n\n // Resizes the canvas to the given dimensions.\n //\n // @param {number} width New width of the canvas, in pixels.\n // @param {number} width New height of the canvas, in pixels.\n\n Canvas.prototype.resize = function(width, height) {\n\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid dimensions for plot, width = \" + width + \", height = \" + height);\n }\n\n var element = this.element,\n context = this.context,\n pixelRatio = this.pixelRatio;\n\n // Resize the canvas, increasing its density based on the display's\n // pixel ratio; basically giving it more pixels without increasing the\n // size of its element, to take advantage of the fact that retina\n // displays have that many more pixels in the same advertised space.\n\n // Resizing should reset the state (excanvas seems to be buggy though)\n\n if (this.width != width) {\n element.width = width * pixelRatio;\n element.style.width = width + \"px\";\n this.width = width;\n }\n\n if (this.height != height) {\n element.height = height * pixelRatio;\n element.style.height = height + \"px\";\n this.height = height;\n }\n\n // Save the context, so we can reset in case we get replotted. The\n // restore ensure that we're really back at the initial state, and\n // should be safe even if we haven't saved the initial state yet.\n\n context.restore();\n context.save();\n\n // Scale the coordinate space to match the display density; so even though we\n // may have twice as many pixels, we still want lines and other drawing to\n // appear at the same size; the extra pixels will just make them crisper.\n\n context.scale(pixelRatio, pixelRatio);\n };\n\n // Clears the entire canvas area, not including any overlaid HTML text\n\n Canvas.prototype.clear = function() {\n this.context.clearRect(0, 0, this.width, this.height);\n };\n\n // Finishes rendering the canvas, including managing the text overlay.\n\n Canvas.prototype.render = function() {\n\n var cache = this._textCache;\n\n // For each text layer, add elements marked as active that haven't\n // already been rendered, and remove those that are no longer active.\n\n for (var layerKey in cache) {\n if (hasOwnProperty.call(cache, layerKey)) {\n\n var layer = this.getTextLayer(layerKey),\n layerCache = cache[layerKey];\n\n layer.hide();\n\n for (var styleKey in layerCache) {\n if (hasOwnProperty.call(layerCache, styleKey)) {\n var styleCache = layerCache[styleKey];\n for (var key in styleCache) {\n if (hasOwnProperty.call(styleCache, key)) {\n\n var positions = styleCache[key].positions;\n\n for (var i = 0, position; position = positions[i]; i++) {\n if (position.active) {\n if (!position.rendered) {\n layer.append(position.element);\n position.rendered = true;\n }\n } else {\n positions.splice(i--, 1);\n if (position.rendered) {\n position.element.detach();\n }\n }\n }\n\n if (positions.length == 0) {\n delete styleCache[key];\n }\n }\n }\n }\n }\n\n layer.show();\n }\n }\n };\n\n // Creates (if necessary) and returns the text overlay container.\n //\n // @param {string} classes String of space-separated CSS classes used to\n // uniquely identify the text layer.\n // @return {object} The jQuery-wrapped text-layer div.\n\n Canvas.prototype.getTextLayer = function(classes) {\n\n var layer = this.text[classes];\n\n // Create the text layer if it doesn't exist\n\n if (layer == null) {\n\n // Create the text layer container, if it doesn't exist\n\n if (this.textContainer == null) {\n this.textContainer = $(\"<div class='flot-text flot-temp-elem'></div>\")\n .css({\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n 'font-size': \"smaller\",\n color: \"#545454\"\n })\n .insertAfter(this.element);\n }\n\n layer = this.text[classes] = $(\"<div></div>\")\n .addClass(classes)\n .css({\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n right: 0\n })\n .appendTo(this.textContainer);\n }\n\n return layer;\n };\n\n // Creates (if necessary) and returns a text info object.\n //\n // The object looks like this:\n //\n // {\n // width: Width of the text's wrapper div.\n // height: Height of the text's wrapper div.\n // element: The jQuery-wrapped HTML div containing the text.\n // positions: Array of positions at which this text is drawn.\n // }\n //\n // The positions array contains objects that look like this:\n //\n // {\n // active: Flag indicating whether the text should be visible.\n // rendered: Flag indicating whether the text is currently visible.\n // element: The jQuery-wrapped HTML div containing the text.\n // x: X coordinate at which to draw the text.\n // y: Y coordinate at which to draw the text.\n // }\n //\n // Each position after the first receives a clone of the original element.\n //\n // The idea is that that the width, height, and general 'identity' of the\n // text is constant no matter where it is placed; the placements are a\n // secondary property.\n //\n // Canvas maintains a cache of recently-used text info objects; getTextInfo\n // either returns the cached element or creates a new entry.\n //\n // @param {string} layer A string of space-separated CSS classes uniquely\n // identifying the layer containing this text.\n // @param {string} text Text string to retrieve info for.\n // @param {(string|object)=} font Either a string of space-separated CSS\n // classes or a font-spec object, defining the text's font and style.\n // @param {number=} angle Angle at which to rotate the text, in degrees.\n // Angle is currently unused, it will be implemented in the future.\n // @param {number=} width Maximum width of the text before it wraps.\n // @return {object} a text info object.\n\n Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {\n\n var textStyle, layerCache, styleCache, info;\n\n // Cast the value to a string, in case we were given a number or such\n\n text = \"\" + text;\n\n // If the font is a font-spec object, generate a CSS font definition\n\n if (typeof font === \"object\") {\n textStyle = font.style + \" \" + font.variant + \" \" + font.weight + \" \" + font.size + \"px/\" + font.lineHeight + \"px \" + font.family;\n } else {\n textStyle = font;\n }\n\n // Retrieve (or create) the cache for the text's layer and styles\n\n layerCache = this._textCache[layer];\n\n if (layerCache == null) {\n layerCache = this._textCache[layer] = {};\n }\n\n styleCache = layerCache[textStyle];\n\n if (styleCache == null) {\n styleCache = layerCache[textStyle] = {};\n }\n\n info = styleCache[text];\n\n // If we can't find a matching element in our cache, create a new one\n\n if (info == null) {\n\n var element = $(\"<div></div>\").html(text)\n .css({\n position: \"absolute\",\n 'max-width': width,\n top: -9999\n })\n .appendTo(this.getTextLayer(layer));\n\n if (typeof font === \"object\") {\n element.css({\n font: textStyle,\n color: font.color\n });\n } else if (typeof font === \"string\") {\n element.addClass(font);\n }\n\n info = styleCache[text] = { element: element, positions: [] };\n\n var size = this._textSizeCache[text];\n if (size) {\n info.width = size.width;\n info.height = size.height;\n } else {\n info.width = element.outerWidth(true);\n info.height = element.outerHeight(true);\n this._textSizeCache[text] = { width: info.width, height: info.height };\n }\n element.detach();\n }\n\n return info;\n };\n\n // Adds a text string to the canvas text overlay.\n //\n // The text isn't drawn immediately; it is marked as rendering, which will\n // result in its addition to the canvas on the next render pass.\n //\n // @param {string} layer A string of space-separated CSS classes uniquely\n // identifying the layer containing this text.\n // @param {number} x X coordinate at which to draw the text.\n // @param {number} y Y coordinate at which to draw the text.\n // @param {string} text Text string to draw.\n // @param {(string|object)=} font Either a string of space-separated CSS\n // classes or a font-spec object, defining the text's font and style.\n // @param {number=} angle Angle at which to rotate the text, in degrees.\n // Angle is currently unused, it will be implemented in the future.\n // @param {number=} width Maximum width of the text before it wraps.\n // @param {string=} halign Horizontal alignment of the text; either \"left\",\n // \"center\" or \"right\".\n // @param {string=} valign Vertical alignment of the text; either \"top\",\n // \"middle\" or \"bottom\".\n\n Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {\n\n var info = this.getTextInfo(layer, text, font, angle, width),\n positions = info.positions;\n\n // Tweak the div's position to match the text's alignment\n\n if (halign == \"center\") {\n x -= info.width / 2;\n } else if (halign == \"right\") {\n x -= info.width;\n }\n\n if (valign == \"middle\") {\n y -= info.height / 2;\n } else if (valign == \"bottom\") {\n y -= info.height;\n }\n\n // Determine whether this text already exists at this position.\n // If so, mark it for inclusion in the next render pass.\n\n for (var i = 0, position; position = positions[i]; i++) {\n if (position.x == x && position.y == y) {\n position.active = true;\n return;\n }\n }\n\n // If the text doesn't exist at this position, create a new entry\n\n // For the very first position we'll re-use the original element,\n // while for subsequent ones we'll clone it.\n\n position = {\n active: true,\n rendered: false,\n element: positions.length ? info.element.clone() : info.element,\n x: x,\n y: y\n };\n\n positions.push(position);\n\n // Move the element to its final position within the container\n\n position.element.css({\n top: Math.round(y),\n left: Math.round(x),\n 'text-align': halign\t// In case the text wraps\n });\n };\n\n // Removes one or more text strings from the canvas text overlay.\n //\n // If no parameters are given, all text within the layer is removed.\n //\n // Note that the text is not immediately removed; it is simply marked as\n // inactive, which will result in its removal on the next render pass.\n // This avoids the performance penalty for 'clear and redraw' behavior,\n // where we potentially get rid of all text on a layer, but will likely\n // add back most or all of it later, as when redrawing axes, for example.\n //\n // @param {string} layer A string of space-separated CSS classes uniquely\n // identifying the layer containing this text.\n // @param {number=} x X coordinate of the text.\n // @param {number=} y Y coordinate of the text.\n // @param {string=} text Text string to remove.\n // @param {(string|object)=} font Either a string of space-separated CSS\n // classes or a font-spec object, defining the text's font and style.\n // @param {number=} angle Angle at which the text is rotated, in degrees.\n // Angle is currently unused, it will be implemented in the future.\n\n Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {\n if (text == null) {\n var layerCache = this._textCache[layer];\n if (layerCache != null) {\n for (var styleKey in layerCache) {\n if (hasOwnProperty.call(layerCache, styleKey)) {\n var styleCache = layerCache[styleKey];\n for (var key in styleCache) {\n if (hasOwnProperty.call(styleCache, key)) {\n var positions = styleCache[key].positions;\n for (var i = 0, position; position = positions[i]; i++) {\n position.active = false;\n }\n }\n }\n }\n }\n }\n } else {\n var positions = this.getTextInfo(layer, text, font, angle).positions;\n for (var i = 0, position; position = positions[i]; i++) {\n if (position.x == x && position.y == y) {\n position.active = false;\n }\n }\n }\n };\n\n ///////////////////////////////////////////////////////////////////////////\n // The top-level container for the entire plot.\n\n function Plot(placeholder, data_, options_, plugins) {\n // data is on the form:\n // [ series1, series2 ... ]\n // where series is either just the data as [ [x1, y1], [x2, y2], ... ]\n // or { data: [ [x1, y1], [x2, y2], ... ], label: \"some label\", ... }\n\n var series = [],\n options = {\n // the color theme used for graphs\n colors: [\"#edc240\", \"#afd8f8\", \"#cb4b4b\", \"#4da74d\", \"#9440ed\"],\n legend: {\n show: true,\n noColumns: 1, // number of colums in legend table\n labelFormatter: null, // fn: string -> string\n labelBoxBorderColor: \"#ccc\", // border color for the little label boxes\n container: null, // container (as jQuery object) to put legend in, null means default on top of graph\n position: \"ne\", // position of default legend container within plot\n margin: 5, // distance from grid edge to default legend container within plot\n backgroundColor: null, // null means auto-detect\n backgroundOpacity: 0.85, // set to 0 to avoid background\n sorted: null // default to no legend sorting\n },\n xaxis: {\n show: null, // null = auto-detect, true = always, false = never\n position: \"bottom\", // or \"top\"\n mode: null, // null or \"time\"\n font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: \"italic\", weight: \"bold\", family: \"sans-serif\", variant: \"small-caps\" }\n color: null, // base color, labels, ticks\n tickColor: null, // possibly different color of ticks, e.g. \"rgba(0,0,0,0.15)\"\n transform: null, // null or f: number -> number to transform axis\n inverseTransform: null, // if transform is set, this should be the inverse function\n min: null, // min. value to show, null means set automatically\n max: null, // max. value to show, null means set automatically\n autoscaleMargin: null, // margin in % to add if auto-setting min/max\n ticks: null, // either [1, 3] or [[1, \"a\"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks\n tickFormatter: null, // fn: number -> string\n labelWidth: null, // size of tick labels in pixels\n labelHeight: null,\n reserveSpace: null, // whether to reserve space even if axis isn't shown\n tickLength: null, // size in pixels of ticks, or \"full\" for whole line\n alignTicksWithAxis: null, // axis number or null for no sync\n tickDecimals: null, // no. of decimals, null means auto\n tickSize: null, // number or [number, \"unit\"]\n minTickSize: null // number or [number, \"unit\"]\n },\n yaxis: {\n autoscaleMargin: 0.02,\n position: \"left\" // or \"right\"\n },\n xaxes: [],\n yaxes: [],\n series: {\n points: {\n show: false,\n radius: 3,\n lineWidth: 2, // in pixels\n fill: true,\n fillColor: \"#ffffff\",\n symbol: \"circle\" // or callback\n },\n lines: {\n // we don't put in show: false so we can see\n // whether lines were actively disabled\n lineWidth: 2, // in pixels\n fill: false,\n fillColor: null,\n steps: false\n // Omit 'zero', so we can later default its value to\n // match that of the 'fill' option.\n },\n bars: {\n show: false,\n lineWidth: 2, // in pixels\n barWidth: 1, // in units of the x axis\n fill: true,\n fillColor: null,\n align: \"left\", // \"left\", \"right\", or \"center\"\n horizontal: false,\n zero: true\n },\n shadowSize: 3,\n highlightColor: null\n },\n grid: {\n show: true,\n aboveData: false,\n color: \"#545454\", // primary color used for outline and labels\n backgroundColor: null, // null for transparent, else color\n borderColor: null, // set if different from the grid color\n tickColor: null, // color for the ticks, e.g. \"rgba(0,0,0,0.15)\"\n margin: 0, // distance from the canvas edge to the grid\n labelMargin: 5, // in pixels\n eventSectionHeight: 0, // space for event section\n axisMargin: 8, // in pixels\n borderWidth: 2, // in pixels\n minBorderMargin: null, // in pixels, null means taken from points radius\n markings: null, // array of ranges or fn: axes -> array of ranges\n markingsColor: \"#f4f4f4\",\n markingsLineWidth: 2,\n // interactive stuff\n clickable: false,\n hoverable: false,\n autoHighlight: true, // highlight in case mouse is near\n mouseActiveRadius: 10 // how far the mouse can be away to activate an item\n },\n interaction: {\n redrawOverlayInterval: 1000 / 60 // time between updates, -1 means in same flow\n },\n hooks: {}\n },\n surface = null, // the canvas for the plot itself\n overlay = null, // canvas for interactive stuff on top of plot\n eventHolder = null, // jQuery object that events should be bound to\n ctx = null, octx = null,\n xaxes = [], yaxes = [],\n plotOffset = { left: 0, right: 0, top: 0, bottom: 0 },\n plotWidth = 0, plotHeight = 0,\n hooks = {\n processOptions: [],\n processRawData: [],\n processDatapoints: [],\n processOffset: [],\n processRange: [],\n drawBackground: [],\n drawSeries: [],\n draw: [],\n bindEvents: [],\n drawOverlay: [],\n shutdown: []\n },\n plot = this;\n\n // public functions\n plot.setData = setData;\n plot.setupGrid = setupGrid;\n plot.draw = draw;\n plot.getPlaceholder = function() { return placeholder; };\n plot.getCanvas = function() { return surface.element; };\n plot.getPlotOffset = function() { return plotOffset; };\n plot.width = function() { return plotWidth; };\n plot.height = function() { return plotHeight; };\n plot.offset = function() {\n var o = eventHolder.offset();\n o.left += plotOffset.left;\n o.top += plotOffset.top;\n return o;\n };\n plot.getData = function() { return series; };\n plot.getAxes = function() {\n var res = {}, i;\n $.each(xaxes.concat(yaxes), function(_, axis) {\n if (axis)\n res[axis.direction + (axis.n != 1 ? axis.n : \"\") + \"axis\"] = axis;\n });\n return res;\n };\n plot.getXAxes = function() { return xaxes; };\n plot.getYAxes = function() { return yaxes; };\n plot.c2p = canvasToAxisCoords;\n plot.p2c = axisToCanvasCoords;\n plot.getOptions = function() { return options; };\n plot.highlight = highlight;\n plot.unhighlight = unhighlight;\n plot.triggerRedrawOverlay = triggerRedrawOverlay;\n plot.pointOffset = function(point) {\n return {\n left: parseInt(xaxes[axisNumber(point, \"x\") - 1].p2c(+point.x) + plotOffset.left, 10),\n top: parseInt(yaxes[axisNumber(point, \"y\") - 1].p2c(+point.y) + plotOffset.top, 10)\n };\n };\n plot.shutdown = shutdown;\n plot.destroy = function() {\n shutdown();\n placeholder.removeData(\"plot\").empty();\n\n series = [];\n options = null;\n surface = null;\n overlay = null;\n eventHolder = null;\n ctx = null;\n octx = null;\n xaxes = [];\n yaxes = [];\n hooks = null;\n highlights = [];\n plot = null;\n };\n plot.resize = function() {\n var width = placeholder.width(),\n height = placeholder.height();\n surface.resize(width, height);\n overlay.resize(width, height);\n };\n\n // public attributes\n plot.hooks = hooks;\n\n // initialize\n initPlugins(plot);\n parseOptions(options_);\n setupCanvases();\n setData(data_);\n setupGrid();\n draw();\n bindEvents();\n\n\n function executeHooks(hook, args) {\n args = [plot].concat(args);\n for (var i = 0; i < hook.length; ++i)\n hook[i].apply(this, args);\n }\n\n function initPlugins() {\n\n // References to key classes, allowing plugins to modify them\n\n var classes = {\n Canvas: Canvas\n };\n\n for (var i = 0; i < plugins.length; ++i) {\n var p = plugins[i];\n p.init(plot, classes);\n if (p.options)\n $.extend(true, options, p.options);\n }\n }\n\n function parseOptions(opts) {\n\n $.extend(true, options, opts);\n\n // $.extend merges arrays, rather than replacing them. When less\n // colors are provided than the size of the default palette, we\n // end up with those colors plus the remaining defaults, which is\n // not expected behavior; avoid it by replacing them here.\n\n if (opts && opts.colors) {\n options.colors = opts.colors;\n }\n\n if (options.xaxis.color == null)\n options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n if (options.yaxis.color == null)\n options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n\n if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility\n options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;\n if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility\n options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;\n\n if (options.grid.borderColor == null)\n options.grid.borderColor = options.grid.color;\n if (options.grid.tickColor == null)\n options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();\n\n // Fill in defaults for axis options, including any unspecified\n // font-spec fields, if a font-spec was provided.\n\n // If no x/y axis options were provided, create one of each anyway,\n // since the rest of the code assumes that they exist.\n\n var i, axisOptions, axisCount,\n fontSize = placeholder.css(\"font-size\"),\n fontSizeDefault = fontSize ? +fontSize.replace(\"px\", \"\") : 13,\n fontDefaults = {\n style: placeholder.css(\"font-style\"),\n size: Math.round(0.8 * fontSizeDefault),\n variant: placeholder.css(\"font-variant\"),\n weight: placeholder.css(\"font-weight\"),\n family: placeholder.css(\"font-family\")\n };\n\n axisCount = options.xaxes.length || 1;\n for (i = 0; i < axisCount; ++i) {\n\n axisOptions = options.xaxes[i];\n if (axisOptions && !axisOptions.tickColor) {\n axisOptions.tickColor = axisOptions.color;\n }\n\n axisOptions = $.extend(true, {}, options.xaxis, axisOptions);\n options.xaxes[i] = axisOptions;\n\n if (axisOptions.font) {\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n if (!axisOptions.font.color) {\n axisOptions.font.color = axisOptions.color;\n }\n if (!axisOptions.font.lineHeight) {\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n }\n }\n }\n\n axisCount = options.yaxes.length || 1;\n for (i = 0; i < axisCount; ++i) {\n\n axisOptions = options.yaxes[i];\n if (axisOptions && !axisOptions.tickColor) {\n axisOptions.tickColor = axisOptions.color;\n }\n\n axisOptions = $.extend(true, {}, options.yaxis, axisOptions);\n options.yaxes[i] = axisOptions;\n\n if (axisOptions.font) {\n axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);\n if (!axisOptions.font.color) {\n axisOptions.font.color = axisOptions.color;\n }\n if (!axisOptions.font.lineHeight) {\n axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);\n }\n }\n }\n\n // backwards compatibility, to be removed in future\n if (options.xaxis.noTicks && options.xaxis.ticks == null)\n options.xaxis.ticks = options.xaxis.noTicks;\n if (options.yaxis.noTicks && options.yaxis.ticks == null)\n options.yaxis.ticks = options.yaxis.noTicks;\n if (options.x2axis) {\n options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);\n options.xaxes[1].position = \"top\";\n // Override the inherit to allow the axis to auto-scale\n if (options.x2axis.min == null) {\n options.xaxes[1].min = null;\n }\n if (options.x2axis.max == null) {\n options.xaxes[1].max = null;\n }\n }\n if (options.y2axis) {\n options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);\n options.yaxes[1].position = \"right\";\n // Override the inherit to allow the axis to auto-scale\n if (options.y2axis.min == null) {\n options.yaxes[1].min = null;\n }\n if (options.y2axis.max == null) {\n options.yaxes[1].max = null;\n }\n }\n if (options.grid.coloredAreas)\n options.grid.markings = options.grid.coloredAreas;\n if (options.grid.coloredAreasColor)\n options.grid.markingsColor = options.grid.coloredAreasColor;\n if (options.lines)\n $.extend(true, options.series.lines, options.lines);\n if (options.points)\n $.extend(true, options.series.points, options.points);\n if (options.bars)\n $.extend(true, options.series.bars, options.bars);\n if (options.shadowSize != null)\n options.series.shadowSize = options.shadowSize;\n if (options.highlightColor != null)\n options.series.highlightColor = options.highlightColor;\n\n // save options on axes for future reference\n for (i = 0; i < options.xaxes.length; ++i)\n getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];\n for (i = 0; i < options.yaxes.length; ++i)\n getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];\n\n // add hooks from options\n for (var n in hooks)\n if (options.hooks[n] && options.hooks[n].length)\n hooks[n] = hooks[n].concat(options.hooks[n]);\n\n executeHooks(hooks.processOptions, [options]);\n }\n\n function setData(d) {\n series = parseData(d);\n fillInSeriesOptions();\n processData();\n }\n\n function parseData(d) {\n var res = [];\n for (var i = 0; i < d.length; ++i) {\n var s = $.extend(true, {}, options.series);\n\n if (d[i].data != null) {\n s.data = d[i].data; // move the data instead of deep-copy\n delete d[i].data;\n\n $.extend(true, s, d[i]);\n\n d[i].data = s.data;\n }\n else\n s.data = d[i];\n res.push(s);\n }\n\n return res;\n }\n\n function axisNumber(obj, coord) {\n var a = obj[coord + \"axis\"];\n if (typeof a == \"object\") // if we got a real axis, extract number\n a = a.n;\n if (typeof a != \"number\")\n a = 1; // default to first axis\n return a;\n }\n\n function allAxes() {\n // return flat array without annoying null entries\n return $.grep(xaxes.concat(yaxes), function(a) { return a; });\n }\n\n function canvasToAxisCoords(pos) {\n // return an object with x/y corresponding to all used axes\n var res = {}, i, axis;\n for (i = 0; i < xaxes.length; ++i) {\n axis = xaxes[i];\n if (axis)\n res[\"x\" + axis.n] = axis.c2p(pos.left);\n }\n\n for (i = 0; i < yaxes.length; ++i) {\n axis = yaxes[i];\n if (axis)\n res[\"y\" + axis.n] = axis.c2p(pos.top);\n }\n\n if (res.x1 !== undefined)\n res.x = res.x1;\n if (res.y1 !== undefined)\n res.y = res.y1;\n\n return res;\n }\n\n function axisToCanvasCoords(pos) {\n // get canvas coords from the first pair of x/y found in pos\n var res = {}, i, axis, key;\n\n for (i = 0; i < xaxes.length; ++i) {\n axis = xaxes[i];\n if (axis && axis.used) {\n key = \"x\" + axis.n;\n if (pos[key] == null && axis.n == 1)\n key = \"x\";\n\n if (pos[key] != null) {\n res.left = axis.p2c(pos[key]);\n break;\n }\n }\n }\n\n for (i = 0; i < yaxes.length; ++i) {\n axis = yaxes[i];\n if (axis && axis.used) {\n key = \"y\" + axis.n;\n if (pos[key] == null && axis.n == 1)\n key = \"y\";\n\n if (pos[key] != null) {\n res.top = axis.p2c(pos[key]);\n break;\n }\n }\n }\n\n return res;\n }\n\n function getOrCreateAxis(axes, number) {\n if (!axes[number - 1])\n axes[number - 1] = {\n n: number, // save the number for future reference\n direction: axes == xaxes ? \"x\" : \"y\",\n options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)\n };\n\n return axes[number - 1];\n }\n\n function fillInSeriesOptions() {\n\n var neededColors = series.length, maxIndex = -1, i;\n\n // Subtract the number of series that already have fixed colors or\n // color indexes from the number that we still need to generate.\n\n for (i = 0; i < series.length; ++i) {\n var sc = series[i].color;\n if (sc != null) {\n neededColors--;\n if (typeof sc == \"number\" && sc > maxIndex) {\n maxIndex = sc;\n }\n }\n }\n\n // If any of the series have fixed color indexes, then we need to\n // generate at least as many colors as the highest index.\n\n if (neededColors <= maxIndex) {\n neededColors = maxIndex + 1;\n }\n\n // Generate all the colors, using first the option colors and then\n // variations on those colors once they're exhausted.\n\n var c, colors = [], colorPool = options.colors,\n colorPoolSize = colorPool.length, variation = 0;\n\n for (i = 0; i < neededColors; i++) {\n\n c = $.color.parse(colorPool[i % colorPoolSize] || \"#666\");\n\n // Each time we exhaust the colors in the pool we adjust\n // a scaling factor used to produce more variations on\n // those colors. The factor alternates negative/positive\n // to produce lighter/darker colors.\n\n // Reset the variation after every few cycles, or else\n // it will end up producing only white or black colors.\n\n if (i % colorPoolSize == 0 && i) {\n if (variation >= 0) {\n if (variation < 0.5) {\n variation = -variation - 0.2;\n } else variation = 0;\n } else variation = -variation;\n }\n\n colors[i] = c.scale('rgb', 1 + variation);\n }\n\n // Finalize the series options, filling in their colors\n\n var colori = 0, s;\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n\n // assign colors\n if (s.color == null) {\n s.color = colors[colori].toString();\n ++colori;\n }\n else if (typeof s.color == \"number\")\n s.color = colors[s.color].toString();\n\n // turn on lines automatically in case nothing is set\n if (s.lines.show == null) {\n var v, show = true;\n for (v in s)\n if (s[v] && s[v].show) {\n show = false;\n break;\n }\n if (show)\n s.lines.show = true;\n }\n\n // If nothing was provided for lines.zero, default it to match\n // lines.fill, since areas by default should extend to zero.\n\n if (s.lines.zero == null) {\n s.lines.zero = !!s.lines.fill;\n }\n\n // setup axes\n s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, \"x\"));\n s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, \"y\"));\n }\n }\n\n function processData() {\n var topSentry = Number.POSITIVE_INFINITY,\n bottomSentry = Number.NEGATIVE_INFINITY,\n fakeInfinity = Number.MAX_VALUE,\n i, j, k, m, length,\n s, points, ps, x, y, axis, val, f, p,\n data, format;\n\n function updateAxis(axis, min, max) {\n if (min < axis.datamin && min != -fakeInfinity)\n axis.datamin = min;\n if (max > axis.datamax && max != fakeInfinity)\n axis.datamax = max;\n }\n\n $.each(allAxes(), function(_, axis) {\n // init axis\n axis.datamin = topSentry;\n axis.datamax = bottomSentry;\n axis.used = false;\n });\n\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n s.datapoints = { points: [] };\n\n executeHooks(hooks.processRawData, [s, s.data, s.datapoints]);\n }\n\n // first pass: clean and copy data\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n\n data = s.data;\n format = s.datapoints.format;\n\n if (!format) {\n format = [];\n // find out how to copy\n format.push({ x: true, number: true, required: true });\n format.push({ y: true, number: true, required: true });\n\n if (s.stack || s.bars.show || (s.lines.show && s.lines.fill)) {\n var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));\n format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });\n if (s.bars.horizontal) {\n delete format[format.length - 1].y;\n format[format.length - 1].x = true;\n }\n }\n\n s.datapoints.format = format;\n }\n\n if (s.datapoints.pointsize != null)\n continue; // already filled in\n\n s.datapoints.pointsize = format.length;\n\n ps = s.datapoints.pointsize;\n points = s.datapoints.points;\n\n var insertSteps = s.lines.show && s.lines.steps;\n s.xaxis.used = s.yaxis.used = true;\n\n for (j = k = 0; j < data.length; ++j, k += ps) {\n p = data[j];\n\n var nullify = p == null;\n if (!nullify) {\n for (m = 0; m < ps; ++m) {\n val = p[m];\n f = format[m];\n\n if (f) {\n if (f.number && val != null) {\n val = +val; // convert to number\n if (isNaN(val))\n val = null;\n else if (val == Infinity)\n val = fakeInfinity;\n else if (val == -Infinity)\n val = -fakeInfinity;\n }\n\n if (val == null) {\n if (f.required)\n nullify = true;\n\n if (f.defaultValue != null)\n val = f.defaultValue;\n }\n }\n\n points[k + m] = val;\n }\n }\n\n if (nullify) {\n for (m = 0; m < ps; ++m) {\n val = points[k + m];\n if (val != null) {\n f = format[m];\n // extract min/max info\n if (f.autoscale !== false) {\n if (f.x) {\n updateAxis(s.xaxis, val, val);\n }\n if (f.y) {\n updateAxis(s.yaxis, val, val);\n }\n }\n }\n points[k + m] = null;\n }\n }\n\n if (insertSteps && k > 0 && (!nullify || points[k - ps] != null)) {\n // copy the point to make room for a middle point\n for (m = 0; m < ps; ++m)\n points[k + ps + m] = points[k + m];\n\n // middle point has same y\n points[k + 1] = points[k - ps + 1] || 0;\n\n // if series has null values, let's give the last !null value a nice step\n if (nullify)\n points[k] = p[0];\n\n // we've added a point, better reflect that\n k += ps;\n }\n }\n }\n\n // give the hooks a chance to run\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n points = s.datapoints.points;\n ps = s.datapoints.pointsize;\n\n // grafana\n if (s.transform === 'negative-Y') {\n for (j = 0; j < points.length; j += ps) {\n if (points[j] == null)\n continue;\n\n val = points[j + 1];\n points[j + 1] = -val;\n }\n }\n\n executeHooks(hooks.processDatapoints, [s, s.datapoints]);\n }\n\n // second pass: find datamax/datamin for auto-scaling\n for (i = 0; i < series.length; ++i) {\n s = series[i];\n points = s.datapoints.points;\n ps = s.datapoints.pointsize;\n format = s.datapoints.format;\n\n var xmin = topSentry, ymin = topSentry,\n xmax = bottomSentry, ymax = bottomSentry;\n\n for (j = 0; j < points.length; j += ps) {\n if (points[j] == null)\n continue;\n\n for (m = 0; m < ps; ++m) {\n val = points[j + m];\n f = format[m];\n if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)\n continue;\n\n if (f.x) {\n if (val < xmin)\n xmin = val;\n if (val > xmax)\n xmax = val;\n }\n if (f.y) {\n if (val < ymin)\n ymin = val;\n if (val > ymax)\n ymax = val;\n }\n }\n }\n\n if (s.bars.show) {\n // make sure we got room for the bar on the dancing floor\n var delta;\n\n switch (s.bars.align) {\n case \"left\":\n delta = 0;\n break;\n case \"right\":\n delta = -s.bars.barWidth;\n break;\n default:\n delta = -s.bars.barWidth / 2;\n }\n\n if (s.bars.horizontal) {\n ymin += delta;\n ymax += delta + s.bars.barWidth;\n }\n else {\n xmin += delta;\n xmax += delta + s.bars.barWidth;\n }\n }\n\n updateAxis(s.xaxis, xmin, xmax);\n updateAxis(s.yaxis, ymin, ymax);\n }\n\n $.each(allAxes(), function(_, axis) {\n if (axis.datamin == topSentry)\n axis.datamin = null;\n if (axis.datamax == bottomSentry)\n axis.datamax = null;\n });\n }\n\n function setupCanvases() {\n // Make sure the placeholder is clear of everything except canvases\n // from a previous plot in this container that we'll try to re-use.\n\n placeholder.find(\".flot-temp-elem\").remove();\n\n if (placeholder.css(\"position\") == 'static')\n placeholder.css(\"position\", \"relative\"); // for positioning labels and overlay\n\n surface = new Canvas(\"flot-base\", placeholder);\n overlay = new Canvas(\"flot-overlay\", placeholder); // overlay canvas for interactive features\n\n ctx = surface.context;\n octx = overlay.context;\n\n // define which element we're listening for events on\n eventHolder = $(overlay.element).unbind();\n\n // If we're re-using a plot object, shut down the old one\n\n var existing = placeholder.data(\"plot\");\n\n if (existing) {\n existing.shutdown();\n overlay.clear();\n }\n\n // save in case we get replotted\n placeholder.data(\"plot\", plot);\n }\n\n function bindEvents() {\n // bind events\n if (options.grid.hoverable) {\n eventHolder.mousemove(onMouseMove);\n\n // Use bind, rather than .mouseleave, because we officially\n // still support jQuery 1.2.6, which doesn't define a shortcut\n // for mouseenter or mouseleave. This was a bug/oversight that\n // was fixed somewhere around 1.3.x. We can return to using\n // .mouseleave when we drop support for 1.2.6.\n\n eventHolder.bind(\"mouseleave\", onMouseLeave);\n $(document).bind(\"touchend\", onTouch);\n }\n\n if (options.grid.clickable)\n eventHolder.click(onClick);\n\n executeHooks(hooks.bindEvents, [eventHolder]);\n }\n\n function shutdown() {\n if (redrawTimeout)\n clearTimeout(redrawTimeout);\n\n eventHolder.unbind(\"mousemove\", onMouseMove);\n eventHolder.unbind(\"mouseleave\", onMouseLeave);\n eventHolder.unbind(\"click\", onClick);\n $(document).unbind(\"touchend\", onTouch);\n\n executeHooks(hooks.shutdown, [eventHolder]);\n }\n\n function setTransformationHelpers(axis) {\n // set helper functions on the axis, assumes plot area\n // has been computed already\n\n function identity(x) { return x; }\n\n var s, m, t = axis.options.transform || identity,\n it = axis.options.inverseTransform;\n\n // precompute how much the axis is scaling a point\n // in canvas space\n if (axis.direction == \"x\") {\n s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));\n m = Math.min(t(axis.max), t(axis.min));\n }\n else {\n s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));\n s = -s;\n m = Math.max(t(axis.max), t(axis.min));\n }\n\n // data point to canvas coordinate\n if (t == identity) // slight optimization\n axis.p2c = function(p) { return (p - m) * s; };\n else\n axis.p2c = function(p) { return (t(p) - m) * s; };\n // canvas coordinate to data point\n if (!it)\n axis.c2p = function(c) { return m + c / s; };\n else\n axis.c2p = function(c) { return it(m + c / s); };\n }\n\n function measureTickLabels(axis) {\n\n var opts = axis.options,\n ticks = axis.ticks || [],\n labelWidth = opts.labelWidth || 0,\n labelHeight = opts.labelHeight || 0,\n maxWidth = labelWidth || (axis.direction == \"x\" ? Math.floor(surface.width / (ticks.length || 1)) : null),\n legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\n layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\n font = opts.font || \"flot-tick-label tickLabel\";\n\n for (var i = 0; i < ticks.length; ++i) {\n\n var t = ticks[i];\n\n if (!t.label)\n continue;\n\n var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);\n\n /// Grafana fix, add +1 to label width\n labelWidth = Math.max(labelWidth, info.width + 1);\n labelHeight = Math.max(labelHeight, info.height);\n }\n\n axis.labelWidth = opts.labelWidth || labelWidth;\n axis.labelHeight = opts.labelHeight || labelHeight;\n }\n\n function allocateAxisBoxFirstPhase(axis) {\n // find the bounding box of the axis by looking at label\n // widths/heights and ticks, make room by diminishing the\n // plotOffset; this first phase only looks at one\n // dimension per axis, the other dimension depends on the\n // other axes so will have to wait\n\n var lw = axis.labelWidth,\n lh = axis.labelHeight,\n pos = axis.options.position,\n isXAxis = axis.direction === \"x\",\n tickLength = axis.options.tickLength,\n axisMargin = options.grid.axisMargin,\n padding = options.grid.labelMargin,\n eventSectionPadding = options.grid.eventSectionHeight,\n innermost = true,\n outermost = true,\n first = true,\n found = false;\n\n // Determine the axis's position in its direction and on its side\n\n $.each(isXAxis ? xaxes : yaxes, function(i, a) {\n if (a && (a.show || a.reserveSpace)) {\n if (a === axis) {\n found = true;\n } else if (a.options.position === pos) {\n if (found) {\n outermost = false;\n } else {\n innermost = false;\n }\n }\n if (!found) {\n first = false;\n }\n }\n });\n\n // The outermost axis on each side has no margin\n\n if (outermost) {\n axisMargin = 0;\n }\n\n // The ticks for the first axis in each direction stretch across\n\n if (tickLength == null) {\n tickLength = first ? \"full\" : 5;\n }\n\n if (!isNaN(+tickLength))\n padding += +tickLength;\n\n if (isXAxis) {\n // Add space for event section\n lh += padding;\n lh += eventSectionPadding;\n\n if (pos == \"bottom\") {\n plotOffset.bottom += lh + axisMargin;\n axis.box = { top: surface.height - plotOffset.bottom, height: lh };\n }\n else {\n axis.box = { top: plotOffset.top + axisMargin, height: lh };\n plotOffset.top += lh + axisMargin;\n }\n }\n else {\n lw += padding;\n\n if (pos == \"left\") {\n axis.box = { left: plotOffset.left + axisMargin, width: lw };\n plotOffset.left += lw + axisMargin;\n }\n else {\n plotOffset.right += lw + axisMargin;\n axis.box = { left: surface.width - plotOffset.right, width: lw };\n }\n }\n\n // save for future reference\n axis.position = pos;\n axis.tickLength = tickLength;\n axis.box.padding = padding;\n axis.box.eventSectionPadding = eventSectionPadding;\n axis.innermost = innermost;\n }\n\n function allocateAxisBoxSecondPhase(axis) {\n // now that all axis boxes have been placed in one\n // dimension, we can set the remaining dimension coordinates\n if (axis.direction == \"x\") {\n axis.box.left = plotOffset.left - axis.labelWidth / 2;\n axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;\n }\n else {\n axis.box.top = plotOffset.top - axis.labelHeight / 2;\n axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;\n }\n }\n\n function adjustLayoutForThingsStickingOut() {\n // possibly adjust plot offset to ensure everything stays\n // inside the canvas and isn't clipped off\n\n var minMargin = options.grid.minBorderMargin,\n axis, i;\n\n // check stuff from the plot (FIXME: this should just read\n // a value from the series, otherwise it's impossible to\n // customize)\n if (minMargin == null) {\n minMargin = 0;\n for (i = 0; i < series.length; ++i)\n minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth / 2));\n }\n\n var margins = {\n left: minMargin,\n right: minMargin,\n top: minMargin,\n bottom: minMargin\n };\n\n // check axis labels, note we don't check the actual\n // labels but instead use the overall width/height to not\n // jump as much around with replots\n $.each(allAxes(), function(_, axis) {\n if (axis.reserveSpace && axis.ticks && axis.ticks.length) {\n if (axis.direction === \"x\") {\n margins.left = Math.max(margins.left, axis.labelWidth / 2);\n margins.right = Math.max(margins.right, axis.labelWidth / 2);\n } else {\n margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);\n margins.top = Math.max(margins.top, axis.labelHeight / 2);\n }\n }\n });\n\n plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));\n plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));\n plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));\n plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));\n }\n\n function setupGrid() {\n var i, axes = allAxes(), showGrid = options.grid.show;\n\n // Initialize the plot's offset from the edge of the canvas\n\n for (var a in plotOffset) {\n var margin = options.grid.margin || 0;\n plotOffset[a] = typeof margin == \"number\" ? margin : margin[a] || 0;\n }\n\n executeHooks(hooks.processOffset, [plotOffset]);\n\n // If the grid is visible, add its border width to the offset\n\n for (var a in plotOffset) {\n if (typeof (options.grid.borderWidth) == \"object\") {\n plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;\n }\n else {\n plotOffset[a] += showGrid ? options.grid.borderWidth : 0;\n }\n }\n\n $.each(axes, function(_, axis) {\n var axisOpts = axis.options;\n axis.show = axisOpts.show == null ? axis.used : axisOpts.show;\n axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;\n setRange(axis);\n });\n\n executeHooks(hooks.processRange, []);\n\n if (showGrid) {\n\n var allocatedAxes = $.grep(axes, function(axis) {\n return axis.show || axis.reserveSpace;\n });\n\n var snaped = false;\n for (var i = 0; i < 2; i++) {\n $.each(allocatedAxes, function(_, axis) {\n // make the ticks\n setupTickGeneration(axis);\n setTicks(axis);\n snaped = snapRangeToTicks(axis, axis.ticks) || snaped;\n // find labelWidth/Height for axis\n measureTickLabels(axis);\n });\n\n if (snaped && hooks.processRange.length > 0) {\n executeHooks(hooks.processRange, []);\n snaped = false;\n } else {\n break;\n }\n }\n\n // with all dimensions calculated, we can compute the\n // axis bounding boxes, start from the outside\n // (reverse order)\n for (i = allocatedAxes.length - 1; i >= 0; --i)\n allocateAxisBoxFirstPhase(allocatedAxes[i]);\n\n // make sure we've got enough space for things that\n // might stick out\n adjustLayoutForThingsStickingOut();\n\n $.each(allocatedAxes, function(_, axis) {\n allocateAxisBoxSecondPhase(axis);\n });\n }\n\n\n plotWidth = surface.width - plotOffset.left - plotOffset.right;\n plotHeight = surface.height - plotOffset.bottom - plotOffset.top;\n\n // now we got the proper plot dimensions, we can compute the scaling\n $.each(axes, function(_, axis) {\n setTransformationHelpers(axis);\n });\n\n if (showGrid) {\n drawAxisLabels();\n }\n\n insertLegend();\n }\n\n function setRange(axis) {\n var opts = axis.options,\n min = +(opts.min != null ? opts.min : axis.datamin),\n max = +(opts.max != null ? opts.max : axis.datamax),\n delta = max - min;\n\n if (delta == 0.0) {\n // Grafana fix: wide Y min and max using increased wideFactor\n // when all series values are the same\n var wideFactor = 0.25;\n var widen = Math.abs(max == 0 ? 1 : max * wideFactor);\n\n if (opts.min == null) {\n min -= widen;\n }\n // always widen max if we couldn't widen min to ensure we\n // don't fall into min == max which doesn't work\n if (opts.max == null || opts.min != null) {\n max += widen;\n }\n }\n else {\n // consider autoscaling\n var margin = opts.autoscaleMargin;\n if (margin != null) {\n if (opts.min == null) {\n min -= delta * margin;\n // make sure we don't go below zero if all values\n // are positive\n if (min < 0 && axis.datamin != null && axis.datamin >= 0)\n min = 0;\n }\n if (opts.max == null) {\n max += delta * margin;\n if (max > 0 && axis.datamax != null && axis.datamax <= 0)\n max = 0;\n }\n }\n }\n axis.min = min;\n axis.max = max;\n }\n\n // grafana change\n function getSignificantDigitCount(n) {\n //remove decimal and make positive\n n = Math.abs(String(n).replace(\".\", \"\"));\n if (n == 0) {\n return 0;\n }\n\n // kill the 0s at the end of n\n while (n != 0 && n % 10 == 0) {\n n /= 10;\n }\n\n // get number of digits\n return Math.floor(Math.log(n) / Math.LN10) + 1;\n }\n\n function setupTickGeneration(axis) {\n var opts = axis.options;\n\n // estimate number of ticks\n var noTicks;\n if (typeof opts.ticks == \"number\" && opts.ticks > 0)\n noTicks = opts.ticks;\n else\n // heuristic based on the model a*sqrt(x) fitted to\n // some data points that seemed reasonable\n noTicks = 0.3 * Math.sqrt(axis.direction == \"x\" ? surface.width : surface.height);\n\n var delta = (axis.max - axis.min) / noTicks,\n dec = -Math.floor(Math.log(delta) / Math.LN10),\n maxDec = opts.tickDecimals;\n\n if (maxDec != null && dec > maxDec) {\n dec = maxDec;\n }\n\n var magn = Math.pow(10, -dec),\n norm = delta / magn, // norm is between 1.0 and 10.0\n size;\n\n if (norm < 1.5) {\n size = 1;\n } else if (norm < 3) {\n size = 2;\n // special case for 2.5, requires an extra decimal\n if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {\n size = 2.5;\n ++dec;\n }\n } else if (norm < 7.5) {\n size = 5;\n } else {\n size = 10;\n }\n\n size *= magn;\n\n if (opts.minTickSize != null && size < opts.minTickSize) {\n size = opts.minTickSize;\n }\n\n axis.delta = delta;\n axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);\n axis.tickSize = opts.tickSize || size;\n\n // Time mode was moved to a plug-in in 0.8, and since so many people use it\n // we'll add an especially friendly reminder to make sure they included it.\n\n if (opts.mode == \"time\" && !axis.tickGenerator) {\n throw new Error(\"Time mode requires the flot.time plugin.\");\n }\n\n // Flot supports base-10 axes; any other mode else is handled by a plug-in,\n // like flot.time.js.\n\n if (!axis.tickGenerator) {\n\n axis.tickGenerator = function(axis) {\n\n var ticks = [],\n start = floorInBase(axis.min, axis.tickSize),\n i = 0,\n v = Number.NaN,\n prev;\n\n do {\n prev = v;\n v = start + i * axis.tickSize;\n ticks.push(v);\n ++i;\n } while (v < axis.max && v != prev);\n return ticks;\n };\n\n axis.tickFormatter = function(value, axis) {\n\n var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;\n var formatted = \"\" + Math.round(value * factor) / factor;\n\n // If tickDecimals was specified, ensure that we have exactly that\n // much precision; otherwise default to the value's own precision.\n\n if (axis.tickDecimals != null) {\n var decimal = formatted.indexOf(\".\");\n var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;\n if (precision < axis.tickDecimals) {\n return (precision ? formatted : formatted + \".\") + (\"\" + factor).substr(1, axis.tickDecimals - precision);\n }\n }\n\n return formatted;\n };\n }\n\n if ($.isFunction(opts.tickFormatter))\n axis.tickFormatter = function(v, axis) { return \"\" + opts.tickFormatter(v, axis); };\n\n if (opts.alignTicksWithAxis != null) {\n var otherAxis = (axis.direction == \"x\" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];\n if (otherAxis && otherAxis.used && otherAxis != axis) {\n // consider snapping min/max to outermost nice ticks\n var niceTicks = axis.tickGenerator(axis);\n if (niceTicks.length > 0) {\n if (opts.min == null)\n axis.min = Math.min(axis.min, niceTicks[0]);\n if (opts.max == null && niceTicks.length > 1)\n axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);\n }\n\n axis.tickGenerator = function(axis) {\n // copy ticks, scaled to this axis\n var ticks = [], v, i;\n for (i = 0; i < otherAxis.ticks.length; ++i) {\n v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);\n v = axis.min + v * (axis.max - axis.min);\n ticks.push(v);\n }\n return ticks;\n };\n\n // we might need an extra decimal since forced\n // ticks don't necessarily fit naturally\n if (!axis.mode && opts.tickDecimals == null) {\n var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),\n ts = axis.tickGenerator(axis);\n\n // only proceed if the tick interval rounded\n // with an extra decimal doesn't give us a\n // zero at end\n if (!(ts.length > 1 && /\\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))\n axis.tickDecimals = extraDec;\n }\n }\n }\n }\n\n function setTicks(axis) {\n var oticks = axis.options.ticks, ticks = [];\n if (oticks == null || (typeof oticks == \"number\" && oticks > 0))\n ticks = axis.tickGenerator(axis);\n else if (oticks) {\n if ($.isFunction(oticks))\n // generate the ticks\n ticks = oticks(axis);\n else\n ticks = oticks;\n }\n\n // clean up/labelify the supplied ticks, copy them over\n var i, v;\n axis.ticks = [];\n for (i = 0; i < ticks.length; ++i) {\n var label = null;\n var t = ticks[i];\n if (typeof t == \"object\") {\n v = +t[0];\n if (t.length > 1)\n label = t[1];\n }\n else\n v = +t;\n if (label == null)\n label = axis.tickFormatter(v, axis);\n if (!isNaN(v))\n axis.ticks.push({ v: v, label: label });\n }\n }\n\n function snapRangeToTicks(axis, ticks) {\n var changed = false;\n if (axis.options.autoscaleMargin && ticks.length > 0) {\n // snap to ticks\n if (axis.options.min == null) {\n axis.min = Math.min(axis.min, ticks[0].v);\n changed = true;\n }\n if (axis.options.max == null && ticks.length > 1) {\n axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);\n changed = true;\n }\n }\n return changed;\n }\n\n function draw() {\n\n surface.clear();\n\n executeHooks(hooks.drawBackground, [ctx]);\n\n var grid = options.grid;\n\n // draw background, if any\n if (grid.show && grid.backgroundColor)\n drawBackground();\n\n if (grid.show && !grid.aboveData) {\n drawGrid();\n }\n\n for (var i = 0; i < series.length; ++i) {\n executeHooks(hooks.drawSeries, [ctx, series[i]]);\n drawSeries(series[i]);\n }\n\n executeHooks(hooks.draw, [ctx]);\n\n if (grid.show && grid.aboveData) {\n drawGrid();\n }\n\n surface.render();\n\n // A draw implies that either the axes or data have changed, so we\n // should probably update the overlay highlights as well.\n\n triggerRedrawOverlay();\n }\n\n function extractRange(ranges, coord) {\n var axis, from, to, key, axes = allAxes();\n\n for (var i = 0; i < axes.length; ++i) {\n axis = axes[i];\n if (axis.direction == coord) {\n key = coord + axis.n + \"axis\";\n if (!ranges[key] && axis.n == 1)\n key = coord + \"axis\"; // support x1axis as xaxis\n if (ranges[key]) {\n from = ranges[key].from;\n to = ranges[key].to;\n break;\n }\n }\n }\n\n // backwards-compat stuff - to be removed in future\n if (!ranges[key]) {\n axis = coord == \"x\" ? xaxes[0] : yaxes[0];\n from = ranges[coord + \"1\"];\n to = ranges[coord + \"2\"];\n }\n\n // auto-reverse as an added bonus\n if (from != null && to != null && from > to) {\n var tmp = from;\n from = to;\n to = tmp;\n }\n\n return { from: from, to: to, axis: axis };\n }\n\n function drawBackground() {\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, \"rgba(255, 255, 255, 0)\");\n ctx.fillRect(0, 0, plotWidth, plotHeight);\n ctx.restore();\n }\n\n function drawGrid() {\n var i, axes, bw, bc;\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n // draw markings\n var markings = options.grid.markings;\n if (markings) {\n if ($.isFunction(markings)) {\n axes = plot.getAxes();\n // xmin etc. is backwards compatibility, to be\n // removed in the future\n axes.xmin = axes.xaxis.min;\n axes.xmax = axes.xaxis.max;\n axes.ymin = axes.yaxis.min;\n axes.ymax = axes.yaxis.max;\n\n markings = markings(axes);\n }\n\n for (i = 0; i < markings.length; ++i) {\n var m = markings[i],\n xrange = extractRange(m, \"x\"),\n yrange = extractRange(m, \"y\");\n\n // fill in missing\n if (xrange.from == null)\n xrange.from = xrange.axis.min;\n if (xrange.to == null)\n xrange.to = xrange.axis.max;\n if (yrange.from == null)\n yrange.from = yrange.axis.min;\n if (yrange.to == null)\n yrange.to = yrange.axis.max;\n\n // clip\n if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||\n yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)\n continue;\n\n xrange.from = Math.max(xrange.from, xrange.axis.min);\n xrange.to = Math.min(xrange.to, xrange.axis.max);\n yrange.from = Math.max(yrange.from, yrange.axis.min);\n yrange.to = Math.min(yrange.to, yrange.axis.max);\n\n var xequal = xrange.from === xrange.to,\n yequal = yrange.from === yrange.to;\n\n if (xequal && yequal) {\n continue;\n }\n\n // then draw\n xrange.from = Math.floor(xrange.axis.p2c(xrange.from));\n xrange.to = Math.floor(xrange.axis.p2c(xrange.to));\n yrange.from = Math.floor(yrange.axis.p2c(yrange.from));\n yrange.to = Math.floor(yrange.axis.p2c(yrange.to));\n\n if (xequal || yequal) {\n var lineWidth = m.lineWidth || options.grid.markingsLineWidth,\n subPixel = lineWidth % 2 ? 0.5 : 0;\n ctx.beginPath();\n ctx.strokeStyle = m.color || options.grid.markingsColor;\n ctx.lineWidth = lineWidth;\n if (xequal) {\n ctx.moveTo(xrange.to + subPixel, yrange.from);\n ctx.lineTo(xrange.to + subPixel, yrange.to);\n } else {\n ctx.moveTo(xrange.from, yrange.to + subPixel);\n ctx.lineTo(xrange.to, yrange.to + subPixel);\n }\n ctx.stroke();\n } else {\n ctx.fillStyle = m.color || options.grid.markingsColor;\n ctx.fillRect(xrange.from, yrange.to,\n xrange.to - xrange.from,\n yrange.from - yrange.to);\n }\n }\n }\n\n // draw the ticks\n axes = allAxes();\n bw = options.grid.borderWidth;\n\n for (var j = 0; j < axes.length; ++j) {\n var axis = axes[j], box = axis.box,\n t = axis.tickLength, x, y, xoff, yoff;\n if (!axis.show || axis.ticks.length == 0)\n continue;\n\n ctx.lineWidth = 1;\n\n // find the edges\n if (axis.direction == \"x\") {\n x = 0;\n if (t == \"full\")\n y = (axis.position == \"top\" ? 0 : plotHeight);\n else\n y = box.top - plotOffset.top + (axis.position == \"top\" ? box.height : 0);\n }\n else {\n y = 0;\n if (t == \"full\")\n x = (axis.position == \"left\" ? 0 : plotWidth);\n else\n x = box.left - plotOffset.left + (axis.position == \"left\" ? box.width : 0);\n }\n\n // draw tick bar\n if (!axis.innermost) {\n ctx.strokeStyle = axis.options.color;\n ctx.beginPath();\n xoff = yoff = 0;\n if (axis.direction == \"x\")\n xoff = plotWidth + 1;\n else\n yoff = plotHeight + 1;\n\n if (ctx.lineWidth == 1) {\n if (axis.direction == \"x\") {\n y = Math.floor(y) + 0.5;\n } else {\n x = Math.floor(x) + 0.5;\n }\n }\n\n ctx.moveTo(x, y);\n ctx.lineTo(x + xoff, y + yoff);\n ctx.stroke();\n }\n\n // draw ticks\n\n ctx.strokeStyle = axis.options.tickColor;\n\n ctx.beginPath();\n for (i = 0; i < axis.ticks.length; ++i) {\n var v = axis.ticks[i].v;\n\n xoff = yoff = 0;\n\n if (isNaN(v) || v < axis.min || v > axis.max\n // skip those lying on the axes if we got a border\n || (t == \"full\"\n && ((typeof bw == \"object\" && bw[axis.position] > 0) || bw > 0)\n && (v == axis.min || v == axis.max)))\n continue;\n\n if (axis.direction == \"x\") {\n x = axis.p2c(v);\n yoff = t == \"full\" ? -plotHeight : t;\n\n if (axis.position == \"top\")\n yoff = -yoff;\n }\n else {\n y = axis.p2c(v);\n xoff = t == \"full\" ? -plotWidth : t;\n\n if (axis.position == \"left\")\n xoff = -xoff;\n }\n\n if (ctx.lineWidth == 1) {\n if (axis.direction == \"x\")\n x = Math.floor(x) + 0.5;\n else\n y = Math.floor(y) + 0.5;\n }\n\n ctx.moveTo(x, y);\n ctx.lineTo(x + xoff, y + yoff);\n }\n\n ctx.stroke();\n }\n\n\n // draw border\n if (bw) {\n // If either borderWidth or borderColor is an object, then draw the border\n // line by line instead of as one rectangle\n bc = options.grid.borderColor;\n if (typeof bw == \"object\" || typeof bc == \"object\") {\n if (typeof bw !== \"object\") {\n bw = { top: bw, right: bw, bottom: bw, left: bw };\n }\n if (typeof bc !== \"object\") {\n bc = { top: bc, right: bc, bottom: bc, left: bc };\n }\n\n if (bw.top > 0) {\n ctx.strokeStyle = bc.top;\n ctx.lineWidth = bw.top;\n ctx.beginPath();\n ctx.moveTo(0 - bw.left, 0 - bw.top / 2);\n ctx.lineTo(plotWidth, 0 - bw.top / 2);\n ctx.stroke();\n }\n\n if (bw.right > 0) {\n ctx.strokeStyle = bc.right;\n ctx.lineWidth = bw.right;\n ctx.beginPath();\n ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);\n ctx.lineTo(plotWidth + bw.right / 2, plotHeight);\n ctx.stroke();\n }\n\n if (bw.bottom > 0) {\n ctx.strokeStyle = bc.bottom;\n ctx.lineWidth = bw.bottom;\n ctx.beginPath();\n ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);\n ctx.lineTo(0, plotHeight + bw.bottom / 2);\n ctx.stroke();\n }\n\n if (bw.left > 0) {\n ctx.strokeStyle = bc.left;\n ctx.lineWidth = bw.left;\n ctx.beginPath();\n ctx.moveTo(0 - bw.left / 2, plotHeight + bw.bottom);\n ctx.lineTo(0 - bw.left / 2, 0);\n ctx.stroke();\n }\n }\n else {\n ctx.lineWidth = bw;\n ctx.strokeStyle = options.grid.borderColor;\n ctx.strokeRect(-bw / 2, -bw / 2, plotWidth + bw, plotHeight + bw);\n }\n }\n\n ctx.restore();\n }\n\n function drawAxisLabels() {\n\n $.each(allAxes(), function(_, axis) {\n var box = axis.box,\n legacyStyles = axis.direction + \"Axis \" + axis.direction + axis.n + \"Axis\",\n layer = \"flot-\" + axis.direction + \"-axis flot-\" + axis.direction + axis.n + \"-axis \" + legacyStyles,\n font = axis.options.font || \"flot-tick-label tickLabel\",\n tick, x, y, halign, valign;\n\n // Remove text before checking for axis.show and ticks.length;\n // otherwise plugins, like flot-tickrotor, that draw their own\n // tick labels will end up with both theirs and the defaults.\n\n surface.removeText(layer);\n\n if (!axis.show || axis.ticks.length == 0)\n return;\n\n for (var i = 0; i < axis.ticks.length; ++i) {\n\n tick = axis.ticks[i];\n if (!tick.label || tick.v < axis.min || tick.v > axis.max)\n continue;\n\n if (axis.direction == \"x\") {\n halign = \"center\";\n x = plotOffset.left + axis.p2c(tick.v);\n if (axis.position == \"bottom\") {\n y = box.top + box.padding + box.eventSectionPadding;\n } else {\n y = box.top + box.height - box.padding;\n valign = \"bottom\";\n }\n } else {\n valign = \"middle\";\n y = plotOffset.top + axis.p2c(tick.v);\n if (axis.position == \"left\") {\n x = box.left + box.width - box.padding;\n halign = \"right\";\n } else {\n x = box.left + box.padding;\n }\n }\n\n surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);\n }\n });\n }\n\n function drawOrphanedPoints(series) {\n /* Filters series data for points with no neighbors before or after\n * and plots single 0.5 radius points for them so that they are displayed.\n */\n var abandonedPoints = [];\n var beforeX = null;\n var afterX = null;\n var datapoints = series.datapoints;\n // find any points with no neighbors before or after\n var emptyPoints = [];\n for (var j = 0; j < datapoints.pointsize - 2; j++) {\n emptyPoints.push(0);\n }\n for (var i = 0; i < datapoints.points.length; i += datapoints.pointsize) {\n var x = datapoints.points[i], y = datapoints.points[i + 1];\n if (i === datapoints.points.length - datapoints.pointsize) {\n afterX = null;\n } else {\n afterX = datapoints.points[i + datapoints.pointsize];\n }\n if (x !== null && y !== null && beforeX === null && afterX === null) {\n abandonedPoints.push(x);\n abandonedPoints.push(y);\n abandonedPoints.push.apply(abandonedPoints, emptyPoints);\n }\n beforeX = x;\n\n }\n var olddatapoints = datapoints.points\n datapoints.points = abandonedPoints;\n\n series.points.radius = series.lines.lineWidth / 2;\n // plot the orphan points with a radius of lineWidth/2\n drawSeriesPoints(series);\n // reset old info\n datapoints.points = olddatapoints;\n }\n\n function drawSeries(series) {\n if (series.lines.show) {\n drawSeriesLines(series);\n if (!series.points.show && !series.bars.show) {\n // not necessary if user wants points displayed for everything\n drawOrphanedPoints(series);\n }\n }\n if (series.bars.show)\n drawSeriesBars(series);\n if (series.points.show)\n drawSeriesPoints(series);\n }\n\n function drawSeriesLines(series) {\n function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {\n var points = datapoints.points,\n ps = datapoints.pointsize,\n prevx = null, prevy = null;\n\n ctx.beginPath();\n for (var i = ps; i < points.length; i += ps) {\n var x1 = points[i - ps], y1 = points[i - ps + 1],\n x2 = points[i], y2 = points[i + 1];\n\n if (x1 == null || x2 == null)\n continue;\n\n // clip with ymin\n if (y1 <= y2 && y1 < axisy.min) {\n if (y2 < axisy.min)\n continue; // line segment is outside\n // compute new intersection point\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.min;\n }\n else if (y2 <= y1 && y2 < axisy.min) {\n if (y1 < axisy.min)\n continue;\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.min;\n }\n\n // clip with ymax\n if (y1 >= y2 && y1 > axisy.max) {\n if (y2 > axisy.max)\n continue;\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.max;\n }\n else if (y2 >= y1 && y2 > axisy.max) {\n if (y1 > axisy.max)\n continue;\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.max;\n }\n\n // clip with xmin\n if (x1 <= x2 && x1 < axisx.min) {\n if (x2 < axisx.min)\n continue;\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.min;\n }\n else if (x2 <= x1 && x2 < axisx.min) {\n if (x1 < axisx.min)\n continue;\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.min;\n }\n\n // clip with xmax\n if (x1 >= x2 && x1 > axisx.max) {\n if (x2 > axisx.max)\n continue;\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.max;\n }\n else if (x2 >= x1 && x2 > axisx.max) {\n if (x1 > axisx.max)\n continue;\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.max;\n }\n\n if (x1 != prevx || y1 != prevy)\n ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);\n\n prevx = x2;\n prevy = y2;\n ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);\n }\n ctx.stroke();\n }\n\n function plotLineArea(datapoints, axisx, axisy) {\n var points = datapoints.points,\n ps = datapoints.pointsize,\n bottom = Math.min(Math.max(0, axisy.min), axisy.max),\n i = 0, top, areaOpen = false,\n ypos = 1, segmentStart = 0, segmentEnd = 0;\n\n // we process each segment in two turns, first forward\n // direction to sketch out top, then once we hit the\n // end we go backwards to sketch the bottom\n while (true) {\n if (ps > 0 && i > points.length + ps)\n break;\n\n i += ps; // ps is negative if going backwards\n\n var x1 = points[i - ps],\n y1 = points[i - ps + ypos],\n x2 = points[i], y2 = points[i + ypos];\n\n if (areaOpen) {\n if (ps > 0 && x1 != null && x2 == null) {\n // at turning point\n segmentEnd = i;\n ps = -ps;\n ypos = 2;\n continue;\n }\n\n if (ps < 0 && i == segmentStart + ps) {\n // done with the reverse sweep\n ctx.fill();\n areaOpen = false;\n ps = -ps;\n ypos = 1;\n i = segmentStart = segmentEnd + ps;\n continue;\n }\n }\n\n if (x1 == null || x2 == null)\n continue;\n\n // clip x values\n\n // clip with xmin\n if (x1 <= x2 && x1 < axisx.min) {\n if (x2 < axisx.min)\n continue;\n y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.min;\n }\n else if (x2 <= x1 && x2 < axisx.min) {\n if (x1 < axisx.min)\n continue;\n y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.min;\n }\n\n // clip with xmax\n if (x1 >= x2 && x1 > axisx.max) {\n if (x2 > axisx.max)\n continue;\n y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x1 = axisx.max;\n }\n else if (x2 >= x1 && x2 > axisx.max) {\n if (x1 > axisx.max)\n continue;\n y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;\n x2 = axisx.max;\n }\n\n if (!areaOpen) {\n // open area\n ctx.beginPath();\n ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));\n areaOpen = true;\n }\n\n // now first check the case where both is outside\n if (y1 >= axisy.max && y2 >= axisy.max) {\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));\n continue;\n }\n else if (y1 <= axisy.min && y2 <= axisy.min) {\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));\n continue;\n }\n\n // else it's a bit more complicated, there might\n // be a flat maxed out rectangle first, then a\n // triangular cutout or reverse; to find these\n // keep track of the current x values\n var x1old = x1, x2old = x2;\n\n // clip the y values, without shortcutting, we\n // go through all cases in turn\n\n // clip with ymin\n if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {\n x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.min;\n }\n else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {\n x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.min;\n }\n\n // clip with ymax\n if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {\n x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y1 = axisy.max;\n }\n else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {\n x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;\n y2 = axisy.max;\n }\n\n // if the x value was changed we got a rectangle\n // to fill\n if (x1 != x1old) {\n ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));\n // it goes to (x1, y1), but we fill that below\n }\n\n // fill triangular section, this sometimes result\n // in redundant points if (x1, y1) hasn't changed\n // from previous line to, but we just ignore that\n ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n\n // fill the other rectangle if it's there\n if (x2 != x2old) {\n ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));\n ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));\n }\n }\n }\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n ctx.lineJoin = \"round\";\n\n var lw = series.lines.lineWidth,\n sw = series.shadowSize;\n // FIXME: consider another form of shadow when filling is turned on\n if (lw > 0 && sw > 0) {\n // draw shadow as a thick and thin line with transparency\n ctx.lineWidth = sw;\n ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n // position shadow at angle from the mid of line\n var angle = Math.PI / 18;\n plotLine(series.datapoints, Math.sin(angle) * (lw / 2 + sw / 2), Math.cos(angle) * (lw / 2 + sw / 2), series.xaxis, series.yaxis);\n ctx.lineWidth = sw / 2;\n plotLine(series.datapoints, Math.sin(angle) * (lw / 2 + sw / 4), Math.cos(angle) * (lw / 2 + sw / 4), series.xaxis, series.yaxis);\n }\n\n ctx.lineWidth = lw;\n ctx.strokeStyle = series.color;\n var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);\n if (fillStyle) {\n ctx.fillStyle = fillStyle;\n plotLineArea(series.datapoints, series.xaxis, series.yaxis);\n }\n\n if (lw > 0)\n plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);\n ctx.restore();\n }\n\n function drawSeriesPoints(series) {\n function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {\n var points = datapoints.points, ps = datapoints.pointsize;\n\n for (var i = 0; i < points.length; i += ps) {\n var x = points[i], y = points[i + 1];\n if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\n continue;\n\n ctx.beginPath();\n x = axisx.p2c(x);\n y = axisy.p2c(y) + offset;\n if (symbol == \"circle\")\n ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);\n else\n symbol(ctx, x, y, radius, shadow);\n ctx.closePath();\n\n if (fillStyle) {\n ctx.fillStyle = fillStyle;\n ctx.fill();\n }\n ctx.stroke();\n }\n }\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n var lw = series.points.lineWidth,\n sw = series.shadowSize,\n radius = series.points.radius,\n symbol = series.points.symbol;\n\n // If the user sets the line width to 0, we change it to a very\n // small value. A line width of 0 seems to force the default of 1.\n // Doing the conditional here allows the shadow setting to still be\n // optional even with a lineWidth of 0.\n\n if (lw == 0)\n lw = 0.0001;\n\n if (lw > 0 && sw > 0) {\n // draw shadow in two steps\n var w = sw / 2;\n ctx.lineWidth = w;\n ctx.strokeStyle = \"rgba(0,0,0,0.1)\";\n plotPoints(series.datapoints, radius, null, w + w / 2, true,\n series.xaxis, series.yaxis, symbol);\n\n ctx.strokeStyle = \"rgba(0,0,0,0.2)\";\n plotPoints(series.datapoints, radius, null, w / 2, true,\n series.xaxis, series.yaxis, symbol);\n }\n\n ctx.lineWidth = lw;\n ctx.strokeStyle = series.color;\n plotPoints(series.datapoints, radius,\n getFillStyle(series.points, series.color), 0, false,\n series.xaxis, series.yaxis, symbol);\n ctx.restore();\n }\n\n function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {\n var left, right, bottom, top,\n drawLeft, drawRight, drawTop, drawBottom,\n tmp;\n\n // in horizontal mode, we start the bar from the left\n // instead of from the bottom so it appears to be\n // horizontal rather than vertical\n if (horizontal) {\n drawBottom = drawRight = drawTop = true;\n drawLeft = false;\n left = b;\n right = x;\n top = y + barLeft;\n bottom = y + barRight;\n\n // account for negative bars\n if (right < left) {\n tmp = right;\n right = left;\n left = tmp;\n drawLeft = true;\n drawRight = false;\n }\n }\n else {\n drawLeft = drawRight = drawTop = true;\n drawBottom = false;\n left = x + barLeft;\n right = x + barRight;\n bottom = b;\n top = y;\n\n // account for negative bars\n if (top < bottom) {\n tmp = top;\n top = bottom;\n bottom = tmp;\n drawBottom = true;\n drawTop = false;\n }\n }\n\n // clip\n if (right < axisx.min || left > axisx.max ||\n top < axisy.min || bottom > axisy.max)\n return;\n\n if (left < axisx.min) {\n left = axisx.min;\n drawLeft = false;\n }\n\n if (right > axisx.max) {\n right = axisx.max;\n drawRight = false;\n }\n\n if (bottom < axisy.min) {\n bottom = axisy.min;\n drawBottom = false;\n }\n\n if (top > axisy.max) {\n top = axisy.max;\n drawTop = false;\n }\n\n left = axisx.p2c(left);\n bottom = axisy.p2c(bottom);\n right = axisx.p2c(right);\n top = axisy.p2c(top);\n\n // fill the bar\n if (fillStyleCallback) {\n c.fillStyle = fillStyleCallback(bottom, top);\n c.fillRect(left, top, right - left, bottom - top)\n }\n\n // draw outline\n if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {\n c.beginPath();\n\n // FIXME: inline moveTo is buggy with excanvas\n c.moveTo(left, bottom);\n if (drawLeft)\n c.lineTo(left, top);\n else\n c.moveTo(left, top);\n if (drawTop)\n c.lineTo(right, top);\n else\n c.moveTo(right, top);\n if (drawRight)\n c.lineTo(right, bottom);\n else\n c.moveTo(right, bottom);\n if (drawBottom)\n c.lineTo(left, bottom);\n else\n c.moveTo(left, bottom);\n c.stroke();\n }\n }\n\n function drawSeriesBars(series) {\n function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {\n var points = datapoints.points, ps = datapoints.pointsize;\n\n for (var i = 0; i < points.length; i += ps) {\n if (points[i] == null)\n continue;\n drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);\n }\n }\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n // FIXME: figure out a way to add shadows (for instance along the right edge)\n ctx.lineWidth = series.bars.lineWidth;\n ctx.strokeStyle = series.color;\n\n var barLeft;\n\n switch (series.bars.align) {\n case \"left\":\n barLeft = 0;\n break;\n case \"right\":\n barLeft = -series.bars.barWidth;\n break;\n default:\n barLeft = -series.bars.barWidth / 2;\n }\n\n var fillStyleCallback = series.bars.fill ? function(bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;\n plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);\n ctx.restore();\n }\n\n function getFillStyle(filloptions, seriesColor, bottom, top) {\n var fill = filloptions.fill;\n if (!fill)\n return null;\n\n if (filloptions.fillColor)\n return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);\n\n var c = $.color.parse(seriesColor);\n c.a = typeof fill == \"number\" ? fill : 0.4;\n c.normalize();\n return c.toString();\n }\n\n function insertLegend() {\n\n if (options.legend.container != null) {\n $.find(options.legend.container).html(\"\");\n } else {\n placeholder.find(\".legend\").remove();\n }\n\n if (!options.legend.show) {\n return;\n }\n\n var fragments = [], entries = [], rowStarted = false,\n lf = options.legend.labelFormatter, s, label;\n\n // Build a list of legend entries, with each having a label and a color\n\n for (var i = 0; i < series.length; ++i) {\n s = series[i];\n if (s.label) {\n label = lf ? lf(s.label, s) : s.label;\n if (label) {\n entries.push({\n label: label,\n color: s.color\n });\n }\n }\n }\n\n // Sort the legend using either the default or a custom comparator\n\n if (options.legend.sorted) {\n if ($.isFunction(options.legend.sorted)) {\n entries.sort(options.legend.sorted);\n } else if (options.legend.sorted == \"reverse\") {\n entries.reverse();\n } else {\n var ascending = options.legend.sorted != \"descending\";\n entries.sort(function(a, b) {\n return a.label == b.label ? 0 : (\n (a.label < b.label) != ascending ? 1 : -1 // Logical XOR\n );\n });\n }\n }\n\n // Generate markup for the list of entries, in their final order\n\n for (var i = 0; i < entries.length; ++i) {\n\n var entry = entries[i];\n\n if (i % options.legend.noColumns == 0) {\n if (rowStarted)\n fragments.push('</tr>');\n fragments.push('<tr>');\n rowStarted = true;\n }\n\n fragments.push(\n '<td class=\"legendColorBox\"><div style=\"border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px\"><div style=\"width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden\"></div></div></td>' +\n '<td class=\"legendLabel\">' + entry.label + '</td>'\n );\n }\n\n if (rowStarted)\n fragments.push('</tr>');\n\n if (fragments.length == 0)\n return;\n\n var table = '<table style=\"font-size:smaller;color:' + options.grid.color + '\">' + fragments.join(\"\") + '</table>';\n if (options.legend.container != null)\n $(options.legend.container).html(table);\n else {\n var pos = \"\",\n p = options.legend.position,\n m = options.legend.margin;\n if (m[0] == null)\n m = [m, m];\n if (p.charAt(0) == \"n\")\n pos += 'top:' + (m[1] + plotOffset.top) + 'px;';\n else if (p.charAt(0) == \"s\")\n pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';\n if (p.charAt(1) == \"e\")\n pos += 'right:' + (m[0] + plotOffset.right) + 'px;';\n else if (p.charAt(1) == \"w\")\n pos += 'left:' + (m[0] + plotOffset.left) + 'px;';\n var legend = $('<div class=\"legend\">' + table.replace('style=\"', 'style=\"position:absolute;' + pos + ';') + '</div>').appendTo(placeholder);\n if (options.legend.backgroundOpacity != 0.0) {\n // put in the transparent background\n // separately to avoid blended labels and\n // label boxes\n var c = options.legend.backgroundColor;\n if (c == null) {\n c = options.grid.backgroundColor;\n if (c && typeof c == \"string\")\n c = $.color.parse(c);\n else\n c = $.color.extract(legend, 'background-color');\n c.a = 1;\n c = c.toString();\n }\n var div = legend.children();\n $('<div style=\"position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos + 'background-color:' + c + ';\"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);\n }\n }\n }\n\n\n // interactive features\n\n var highlights = [],\n redrawTimeout = null;\n\n // returns the data item the mouse is over, or null if none is found\n function findNearbyItem(mouseX, mouseY, seriesFilter) {\n var maxDistance = options.grid.mouseActiveRadius,\n smallestDistance = maxDistance * maxDistance + 1,\n item = null, foundPoint = false, i, j, ps;\n\n for (i = series.length - 1; i >= 0; --i) {\n if (!seriesFilter(series[i]))\n continue;\n\n var s = series[i],\n axisx = s.xaxis,\n axisy = s.yaxis,\n points = s.datapoints.points,\n mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster\n my = axisy.c2p(mouseY),\n maxx = maxDistance / axisx.scale,\n maxy = maxDistance / axisy.scale;\n\n ps = s.datapoints.pointsize;\n // with inverse transforms, we can't use the maxx/maxy\n // optimization, sadly\n if (axisx.options.inverseTransform)\n maxx = Number.MAX_VALUE;\n if (axisy.options.inverseTransform)\n maxy = Number.MAX_VALUE;\n\n if (s.lines.show || s.points.show) {\n for (j = 0; j < points.length; j += ps) {\n var x = points[j], y = points[j + 1];\n if (x == null)\n continue;\n\n // For points and lines, the cursor must be within a\n // certain distance to the data point\n if (x - mx > maxx || x - mx < -maxx ||\n y - my > maxy || y - my < -maxy)\n continue;\n\n // We have to calculate distances in pixels, not in\n // data units, because the scales of the axes may be different\n var dx = Math.abs(axisx.p2c(x) - mouseX),\n dy = Math.abs(axisy.p2c(y) - mouseY),\n dist = dx * dx + dy * dy; // we save the sqrt\n\n // use <= to ensure last point takes precedence\n // (last generally means on top of)\n if (dist < smallestDistance) {\n smallestDistance = dist;\n item = [i, j / ps];\n }\n }\n }\n\n if (s.bars.show && !item) { // no other point can be nearby\n\n var barLeft, barRight;\n\n switch (s.bars.align) {\n case \"left\":\n barLeft = 0;\n break;\n case \"right\":\n barLeft = -s.bars.barWidth;\n break;\n default:\n barLeft = -s.bars.barWidth / 2;\n }\n\n barRight = barLeft + s.bars.barWidth;\n\n for (j = 0; j < points.length; j += ps) {\n var x = points[j], y = points[j + 1], b = points[j + 2];\n if (x == null)\n continue;\n\n // for a bar graph, the cursor must be inside the bar\n if (series[i].bars.horizontal ?\n (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&\n my >= y + barLeft && my <= y + barRight) :\n (mx >= x + barLeft && mx <= x + barRight &&\n my >= Math.min(b, y) && my <= Math.max(b, y)))\n item = [i, j / ps];\n }\n }\n }\n\n if (item) {\n i = item[0];\n j = item[1];\n ps = series[i].datapoints.pointsize;\n\n return {\n datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\n dataIndex: j,\n series: series[i],\n seriesIndex: i\n };\n }\n\n return null;\n }\n\n function onMouseMove(e) {\n if (options.grid.hoverable)\n triggerClickHoverEvent(\"plothover\", e,\n function(s) { return s[\"hoverable\"] != false; });\n }\n\n function onMouseLeave(e) {\n if (options.grid.hoverable)\n triggerClickHoverEvent(\"plothover\", e,\n function(s) { return false; });\n }\n\n function onClick(e) {\n if (plot.isSelecting) {\n return;\n }\n\n triggerClickHoverEvent(\"plotclick\", e, function(s) { return s[\"clickable\"] != false; });\n }\n\n // grafana addon - added to support mobile devices click in plot\n function onTouch(e) {\n if (!e.cancelable) {\n return;\n }\n\n if (!eventHolder.is(e.target) && eventHolder.has(e.target).length === 0) {\n triggerClickHoverEvent(\"plotleave\", e, function(s) { false; });\n return;\n }\n\n onMouseMove(mapFromTouchEvent(e));\n e.preventDefault();\n }\n\n // grafana addon - added to support mobile devices and mapping touch event to click event structure\n function mapFromTouchEvent(e) {\n if (!e || !e.originalEvent) {\n return e;\n }\n\n if (e.pageX && e.pageY) {\n return e;\n }\n\n var original = e.originalEvent;\n\n if (original.changedTouches.length === 0) {\n return e;\n }\n\n var touch = original.changedTouches[0];\n e.pageX = touch.pageX;\n e.pageY = touch.pageY;\n\n return e;\n }\n\n // trigger click or hover event (they send the same parameters\n // so we share their code)\n function triggerClickHoverEvent(eventname, event, seriesFilter) {\n var offset = eventHolder.offset(),\n canvasX = event.pageX - offset.left - plotOffset.left,\n canvasY = event.pageY - offset.top - plotOffset.top,\n pos = canvasToAxisCoords({ left: canvasX, top: canvasY });\n\n pos.pageX = event.pageX;\n pos.pageY = event.pageY;\n\n // Add ctrlKey and metaKey to event\n pos.ctrlKey = event.ctrlKey;\n pos.metaKey = event.metaKey;\n\n var item = findNearbyItem(canvasX, canvasY, seriesFilter);\n\n if (item) {\n // fill in mouse pos for any listeners out there\n item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);\n item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);\n }\n\n if (options.grid.autoHighlight) {\n // clear auto-highlights\n for (var i = 0; i < highlights.length; ++i) {\n var h = highlights[i];\n if (h.auto == eventname &&\n !(item && h.series == item.series &&\n h.point[0] == item.datapoint[0] &&\n h.point[1] == item.datapoint[1]))\n unhighlight(h.series, h.point);\n }\n\n if (item)\n highlight(item.series, item.datapoint, eventname);\n }\n\n placeholder.trigger(eventname, [pos, item]);\n }\n\n function triggerRedrawOverlay() {\n var t = options.interaction.redrawOverlayInterval;\n if (t == -1) { // skip event queue\n drawOverlay();\n return;\n }\n\n if (!redrawTimeout)\n redrawTimeout = setTimeout(drawOverlay, t);\n }\n\n function drawOverlay() {\n redrawTimeout = null;\n\n // draw highlights\n octx.save();\n overlay.clear();\n octx.translate(plotOffset.left, plotOffset.top);\n\n var i, hi;\n for (i = 0; i < highlights.length; ++i) {\n hi = highlights[i];\n\n if (hi.series.bars.show)\n drawBarHighlight(hi.series, hi.point);\n else\n drawPointHighlight(hi.series, hi.point);\n }\n octx.restore();\n\n executeHooks(hooks.drawOverlay, [octx]);\n }\n\n function highlight(s, point, auto) {\n if (typeof s == \"number\")\n s = series[s];\n\n if (typeof point == \"number\") {\n var ps = s.datapoints.pointsize;\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n }\n\n var i = indexOfHighlight(s, point);\n if (i == -1) {\n highlights.push({ series: s, point: point, auto: auto });\n\n triggerRedrawOverlay();\n }\n else if (!auto)\n highlights[i].auto = false;\n }\n\n function unhighlight(s, point) {\n if (s == null && point == null) {\n highlights = [];\n triggerRedrawOverlay();\n return;\n }\n\n if (typeof s == \"number\")\n s = series[s];\n\n if (typeof point == \"number\") {\n var ps = s.datapoints.pointsize;\n point = s.datapoints.points.slice(ps * point, ps * (point + 1));\n }\n\n var i = indexOfHighlight(s, point);\n if (i != -1) {\n highlights.splice(i, 1);\n\n triggerRedrawOverlay();\n }\n }\n\n function indexOfHighlight(s, p) {\n for (var i = 0; i < highlights.length; ++i) {\n var h = highlights[i];\n if (h.series == s && h.point[0] == p[0]\n && h.point[1] == p[1])\n return i;\n }\n return -1;\n }\n\n function drawPointHighlight(series, point) {\n var x = point[0], y = point[1],\n axisx = series.xaxis, axisy = series.yaxis,\n highlightColor = (typeof series.highlightColor === \"string\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();\n\n if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)\n return;\n\n var pointRadius = series.points.radius + series.points.lineWidth / 2;\n octx.lineWidth = pointRadius;\n octx.strokeStyle = highlightColor;\n var radius = 1.5 * pointRadius;\n x = axisx.p2c(x);\n y = axisy.p2c(y);\n\n octx.beginPath();\n if (series.points.symbol == \"circle\")\n octx.arc(x, y, radius, 0, 2 * Math.PI, false);\n else\n series.points.symbol(octx, x, y, radius, false);\n octx.closePath();\n octx.stroke();\n }\n\n function drawBarHighlight(series, point) {\n var highlightColor = (typeof series.highlightColor === \"string\") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),\n fillStyle = highlightColor,\n barLeft;\n\n switch (series.bars.align) {\n case \"left\":\n barLeft = 0;\n break;\n case \"right\":\n barLeft = -series.bars.barWidth;\n break;\n default:\n barLeft = -series.bars.barWidth / 2;\n }\n\n octx.lineWidth = series.bars.lineWidth;\n octx.strokeStyle = highlightColor;\n\n drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,\n function() { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);\n }\n\n function getColorOrGradient(spec, bottom, top, defaultColor) {\n if (typeof spec == \"string\")\n return spec;\n else {\n // assume this is a gradient spec; IE currently only\n // supports a simple vertical gradient properly, so that's\n // what we support too\n var gradient = ctx.createLinearGradient(0, top, 0, bottom);\n\n for (var i = 0, l = spec.colors.length; i < l; ++i) {\n var c = spec.colors[i];\n if (typeof c != \"string\") {\n var co = $.color.parse(defaultColor);\n if (c.brightness != null)\n co = co.scale('rgb', c.brightness);\n if (c.opacity != null)\n co.a *= c.opacity;\n c = co.toString();\n }\n gradient.addColorStop(i / (l - 1), c);\n }\n\n return gradient;\n }\n }\n }\n\n // Add the plot function to the top level of the jQuery object\n\n $.plot = function(placeholder, data, options) {\n //var t0 = new Date();\n var plot = new Plot($(placeholder), data, options, $.plot.plugins);\n //(window.console ? console.log : alert)(\"time used (msecs): \" + ((new Date()).getTime() - t0.getTime()));\n return plot;\n };\n\n $.plot.version = \"0.8.3\";\n\n $.plot.plugins = [];\n\n // Also add the plot function as a chainable property\n\n $.fn.plot = function(data, options) {\n return this.each(function() {\n $.plot(this, data, options);\n });\n };\n\n // round to nearby lower multiple of base\n function floorInBase(n, base) {\n return base * Math.floor(n / base);\n }\n\n})(jQuery);\n","/* Flot plugin for selecting regions of a plot.\n\nCopyright (c) 2007-2013 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin supports these options:\n\nselection: {\n\tmode: null or \"x\" or \"y\" or \"xy\",\n\tcolor: color,\n\tshape: \"round\" or \"miter\" or \"bevel\",\n\tminSize: number of pixels\n}\n\nSelection support is enabled by setting the mode to one of \"x\", \"y\" or \"xy\".\nIn \"x\" mode, the user will only be able to specify the x range, similarly for\n\"y\" mode. For \"xy\", the selection becomes a rectangle where both ranges can be\nspecified. \"color\" is color of the selection (if you need to change the color\nlater on, you can get to it with plot.getOptions().selection.color). \"shape\"\nis the shape of the corners of the selection.\n\n\"minSize\" is the minimum size a selection can be in pixels. This value can\nbe customized to determine the smallest size a selection can be and still\nhave the selection rectangle be displayed. When customizing this value, the\nfact that it refers to pixels, not axis units must be taken into account.\nThus, for example, if there is a bar graph in time mode with BarWidth set to 1\nminute, setting \"minSize\" to 1 will not make the minimum selection size 1\nminute, but rather 1 pixel. Note also that setting \"minSize\" to 0 will prevent\n\"plotunselected\" events from being fired when the user clicks the mouse without\ndragging.\n\nWhen selection support is enabled, a \"plotselected\" event will be emitted on\nthe DOM element you passed into the plot function. The event handler gets a\nparameter with the ranges selected on the axes, like this:\n\n\tplaceholder.bind( \"plotselected\", function( event, ranges ) {\n\t\talert(\"You selected \" + ranges.xaxis.from + \" to \" + ranges.xaxis.to)\n\t\t// similar for yaxis - with multiple axes, the extra ones are in\n\t\t// x2axis, x3axis, ...\n\t});\n\nThe \"plotselected\" event is only fired when the user has finished making the\nselection. A \"plotselecting\" event is fired during the process with the same\nparameters as the \"plotselected\" event, in case you want to know what's\nhappening while it's happening,\n\nA \"plotunselected\" event with no arguments is emitted when the user clicks the\nmouse to remove the selection. As stated above, setting \"minSize\" to 0 will\ndestroy this behavior.\n\nThe plugin allso adds the following methods to the plot object:\n\n- setSelection( ranges, preventEvent )\n\n Set the selection rectangle. The passed in ranges is on the same form as\n returned in the \"plotselected\" event. If the selection mode is \"x\", you\n should put in either an xaxis range, if the mode is \"y\" you need to put in\n an yaxis range and both xaxis and yaxis if the selection mode is \"xy\", like\n this:\n\n\tsetSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });\n\n setSelection will trigger the \"plotselected\" event when called. If you don't\n want that to happen, e.g. if you're inside a \"plotselected\" handler, pass\n true as the second parameter. If you are using multiple axes, you can\n specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of\n xaxis, the plugin picks the first one it sees.\n\n- clearSelection( preventEvent )\n\n Clear the selection rectangle. Pass in true to avoid getting a\n \"plotunselected\" event.\n\n- getSelection()\n\n Returns the current selection in the same format as the \"plotselected\"\n event. If there's currently no selection, the function returns null.\n\n*/\n\n(function ($) {\n function init(plot) {\n var selection = {\n first: { x: -1, y: -1}, second: { x: -1, y: -1},\n show: false,\n active: false\n };\n\n // FIXME: The drag handling implemented here should be\n // abstracted out, there's some similar code from a library in\n // the navigation plugin, this should be massaged a bit to fit\n // the Flot cases here better and reused. Doing this would\n // make this plugin much slimmer.\n var savedhandlers = {};\n\n var mouseUpHandler = null;\n\n function onMouseMove(e) {\n if (selection.active) {\n updateSelection(e);\n\n plot.getPlaceholder().trigger(\"plotselecting\", [ getSelection() ]);\n }\n }\n\n function onMouseDown(e) {\n if (e.which != 1) // only accept left-click\n return;\n\n // cancel out any text selections\n document.body.focus();\n\n // prevent text selection and drag in old-school browsers\n if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) {\n savedhandlers.onselectstart = document.onselectstart;\n document.onselectstart = function () { return false; };\n }\n if (document.ondrag !== undefined && savedhandlers.ondrag == null) {\n savedhandlers.ondrag = document.ondrag;\n document.ondrag = function () { return false; };\n }\n\n setSelectionPos(selection.first, e);\n\n selection.active = true;\n\n // this is a bit silly, but we have to use a closure to be\n // able to whack the same handler again\n mouseUpHandler = function (e) { onMouseUp(e); };\n\n $(document).one(\"mouseup\", mouseUpHandler);\n }\n\n function onMouseUp(e) {\n mouseUpHandler = null;\n\n // revert drag stuff for old-school browsers\n if (document.onselectstart !== undefined)\n document.onselectstart = savedhandlers.onselectstart;\n if (document.ondrag !== undefined)\n document.ondrag = savedhandlers.ondrag;\n\n // no more dragging\n selection.active = false;\n updateSelection(e);\n\n if (selectionIsSane())\n triggerSelectedEvent(e);\n else {\n // this counts as a clear\n plot.getPlaceholder().trigger(\"plotunselected\", [ ]);\n plot.getPlaceholder().trigger(\"plotselecting\", [ null ]);\n }\n\n setTimeout(function() {\n plot.isSelecting = false;\n }, 10);\n\n return false;\n }\n\n function getSelection() {\n if (!selectionIsSane())\n return null;\n\n if (!selection.show) return null;\n\n var r = {}, c1 = selection.first, c2 = selection.second;\n var axes = plot.getAxes();\n // look if no axis is used\n var noAxisInUse = true;\n $.each(axes, function (name, axis) {\n if (axis.used) {\n anyUsed = false;\n }\n })\n\n $.each(axes, function (name, axis) {\n if (axis.used || noAxisInUse) {\n var p1 = axis.c2p(c1[axis.direction]), p2 = axis.c2p(c2[axis.direction]);\n r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) };\n }\n });\n return r;\n }\n\n function triggerSelectedEvent(event) {\n var r = getSelection();\n\n // Add ctrlKey and metaKey to event\n r.ctrlKey = event.ctrlKey;\n r.metaKey = event.metaKey;\n\n plot.getPlaceholder().trigger(\"plotselected\", [ r ]);\n\n // backwards-compat stuff, to be removed in future\n if (r.xaxis && r.yaxis)\n plot.getPlaceholder().trigger(\"selected\", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]);\n }\n\n function clamp(min, value, max) {\n return value < min ? min: (value > max ? max: value);\n }\n\n function setSelectionPos(pos, e) {\n var o = plot.getOptions();\n var offset = plot.getPlaceholder().offset();\n var plotOffset = plot.getPlotOffset();\n pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width());\n pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height());\n\n if (o.selection.mode == \"y\")\n pos.x = pos == selection.first ? 0 : plot.width();\n\n if (o.selection.mode == \"x\")\n pos.y = pos == selection.first ? 0 : plot.height();\n }\n\n function updateSelection(pos) {\n if (pos.pageX == null)\n return;\n\n setSelectionPos(selection.second, pos);\n if (selectionIsSane()) {\n plot.isSelecting = true;\n selection.show = true;\n plot.triggerRedrawOverlay();\n }\n else\n clearSelection(true);\n }\n\n function clearSelection(preventEvent) {\n if (selection.show) {\n selection.show = false;\n plot.triggerRedrawOverlay();\n if (!preventEvent)\n plot.getPlaceholder().trigger(\"plotunselected\", [ ]);\n }\n }\n\n // function taken from markings support in Flot\n function extractRange(ranges, coord) {\n var axis, from, to, key, axes = plot.getAxes();\n\n for (var k in axes) {\n axis = axes[k];\n if (axis.direction == coord) {\n key = coord + axis.n + \"axis\";\n if (!ranges[key] && axis.n == 1)\n key = coord + \"axis\"; // support x1axis as xaxis\n if (ranges[key]) {\n from = ranges[key].from;\n to = ranges[key].to;\n break;\n }\n }\n }\n\n // backwards-compat stuff - to be removed in future\n if (!ranges[key]) {\n axis = coord == \"x\" ? plot.getXAxes()[0] : plot.getYAxes()[0];\n from = ranges[coord + \"1\"];\n to = ranges[coord + \"2\"];\n }\n\n // auto-reverse as an added bonus\n if (from != null && to != null && from > to) {\n var tmp = from;\n from = to;\n to = tmp;\n }\n\n return { from: from, to: to, axis: axis };\n }\n\n function setSelection(ranges, preventEvent) {\n var axis, range, o = plot.getOptions();\n\n if (o.selection.mode == \"y\") {\n selection.first.x = 0;\n selection.second.x = plot.width();\n }\n else {\n range = extractRange(ranges, \"x\");\n\n selection.first.x = range.axis.p2c(range.from);\n selection.second.x = range.axis.p2c(range.to);\n }\n\n if (o.selection.mode == \"x\") {\n selection.first.y = 0;\n selection.second.y = plot.height();\n }\n else {\n range = extractRange(ranges, \"y\");\n\n selection.first.y = range.axis.p2c(range.from);\n selection.second.y = range.axis.p2c(range.to);\n }\n\n selection.show = true;\n plot.triggerRedrawOverlay();\n if (!preventEvent && selectionIsSane())\n triggerSelectedEvent();\n }\n\n function selectionIsSane() {\n var minSize = plot.getOptions().selection.minSize;\n return Math.abs(selection.second.x - selection.first.x) >= minSize &&\n Math.abs(selection.second.y - selection.first.y) >= minSize;\n }\n\n plot.clearSelection = clearSelection;\n plot.setSelection = setSelection;\n plot.getSelection = getSelection;\n\n plot.hooks.bindEvents.push(function(plot, eventHolder) {\n var o = plot.getOptions();\n if (o.selection.mode != null) {\n eventHolder.mousemove(onMouseMove);\n eventHolder.mousedown(onMouseDown);\n }\n });\n\n plot.hooks.drawOverlay.push(function (plot, ctx) {\n // draw selection\n if (selection.show && selectionIsSane()) {\n var plotOffset = plot.getPlotOffset();\n var o = plot.getOptions();\n\n ctx.save();\n ctx.translate(plotOffset.left, plotOffset.top);\n\n var c = $.color.parse(o.selection.color);\n\n ctx.strokeStyle = c.scale('a', 0.8).toString();\n ctx.lineWidth = 1;\n ctx.lineJoin = o.selection.shape;\n ctx.fillStyle = c.scale('a', 0.4).toString();\n\n var x = Math.min(selection.first.x, selection.second.x) + 0.5,\n y = Math.min(selection.first.y, selection.second.y) + 0.5,\n w = Math.abs(selection.second.x - selection.first.x) - 1,\n h = Math.abs(selection.second.y - selection.first.y) - 1;\n\n ctx.fillRect(x, y, w, h);\n ctx.strokeRect(x, y, w, h);\n\n ctx.restore();\n }\n });\n\n plot.hooks.shutdown.push(function (plot, eventHolder) {\n eventHolder.unbind(\"mousemove\", onMouseMove);\n eventHolder.unbind(\"mousedown\", onMouseDown);\n\n if (mouseUpHandler) {\n $(document).unbind(\"mouseup\", mouseUpHandler);\n // grafana addition\n // In L114 this plugin is overrinding document.onselectstart handler to prevent default or custom behaviour\n // Then this patch is being restored during mouseup event. But, mouseup handler is unbound when this plugin is destroyed\n // and the overridden onselectstart handler is not restored. The problematic behaviour surfaces when flot is re-rendered\n // as a consequence of panel's model update. When i.e. options are applied via onBlur\n // event on some input which results in flot re-render. The mouseup handler should be called to resture the original handlers\n // but by the time the document mouseup event occurs, the event handler is no longer there, so onselectstart is permanently overridden.\n // To fix that we are making sure that the overrides are reverted when this plugin is destroyed, the same way as they would\n // via mouseup event handler (L138)\n\n if (document.onselectstart !== undefined)\n document.onselectstart = savedhandlers.onselectstart;\n if (document.ondrag !== undefined)\n document.ondrag = savedhandlers.ondrag;\n }\n });\n\n }\n\n $.plot.plugins.push({\n init: init,\n options: {\n selection: {\n mode: null, // one of null, \"x\", \"y\" or \"xy\"\n color: \"#e8cfac\",\n shape: \"round\", // one of \"round\", \"miter\", or \"bevel\"\n minSize: 5 // minimum number of pixels\n }\n },\n name: 'selection',\n version: '1.1'\n });\n})(jQuery);\n","/* Flot plugin for stacking data sets rather than overlyaing them.\n\nCopyright (c) 2007-2014 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nThe plugin assumes the data is sorted on x (or y if stacking horizontally).\nFor line charts, it is assumed that if a line has an undefined gap (from a\nnull point), then the line above it should have the same gap - insert zeros\ninstead of \"null\" if you want another behaviour. This also holds for the start\nand end of the chart. Note that stacking a mix of positive and negative values\nin most instances doesn't make sense (so it looks weird).\n\nTwo or more series are stacked when their \"stack\" attribute is set to the same\nkey (which can be any number or string or just \"true\"). To specify the default\nstack, you can set the stack option like this:\n\n series: {\n stack: null/false, true, or a key (number/string)\n }\n\nYou can also specify it for a single series, like this:\n\n $.plot( $(\"#placeholder\"), [{\n data: [ ... ],\n stack: true\n }])\n\nThe stacking order is determined by the order of the data series in the array\n(later series end up on top of the previous).\n\nInternally, the plugin modifies the datapoints in each series, adding an\noffset to the y value. For line series, extra data points are inserted through\ninterpolation. If there's a second y value, it's also adjusted (e.g for bar\ncharts or filled areas).\n\n*/\n\n(function ($) {\n var options = {\n series: { stack: null } // or number/string\n };\n\n function init(plot) {\n function findMatchingSeries(s, allseries) {\n var res = null;\n for (var i = 0; i < allseries.length; ++i) {\n if (s == allseries[i])\n break;\n\n if (allseries[i].stack == s.stack)\n res = allseries[i];\n }\n\n return res;\n }\n\n function stackData(plot, s, datapoints) {\n if (s.stack == null || s.stack === false)\n return;\n\n var other = findMatchingSeries(s, plot.getData());\n if (!other)\n return;\n\n var ps = datapoints.pointsize,\n points = datapoints.points,\n otherps = other.datapoints.pointsize,\n otherpoints = other.datapoints.points,\n newpoints = [],\n px, py, intery, qx, qy, bottom,\n withlines = s.lines.show,\n horizontal = s.bars.horizontal,\n withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y),\n withsteps = withlines && s.lines.steps,\n keyOffset = horizontal ? 1 : 0,\n accumulateOffset = horizontal ? 0 : 1,\n i = 0, j = 0, l, m;\n\n while (true) {\n if (i >= points.length && j >= otherpoints.length)\n break;\n\n l = newpoints.length;\n\n if (i < points.length && points[i] == null) {\n // copy gaps\n for (m = 0; m < ps; ++m)\n newpoints.push(points[i + m]);\n i += ps;\n }\n else if (i >= points.length) {\n // take the remaining points from the previous series\n for (m = 0; m < ps; ++m)\n newpoints.push(otherpoints[j + m]);\n if (withbottom)\n newpoints[l + 2] = otherpoints[j + accumulateOffset];\n j += otherps;\n }\n else if (j >= otherpoints.length) {\n // take the remaining points from the current series\n for (m = 0; m < ps; ++m)\n newpoints.push(points[i + m]);\n i += ps;\n }\n else if (j < otherpoints.length && otherpoints[j] == null) {\n // ignore point\n j += otherps;\n }\n else {\n // cases where we actually got two points\n px = points[i + keyOffset];\n py = points[i + accumulateOffset];\n qx = otherpoints[j + keyOffset];\n qy = otherpoints[j + accumulateOffset];\n bottom = 0;\n\n if (px == qx) {\n for (m = 0; m < ps; ++m)\n newpoints.push(points[i + m]);\n\n newpoints[l + accumulateOffset] += qy;\n bottom = qy;\n\n i += ps;\n j += otherps;\n }\n else if (px > qx) {\n // take the point from the previous series so that next series will correctly stack\n if (i == 0) {\n for (m = 0; m < ps; ++m)\n newpoints.push(otherpoints[j + m]);\n bottom = qy;\n }\n // we got past point below, might need to\n // insert interpolated extra point\n if (i > 0 && points[i - ps] != null) {\n intery = 0;\n newpoints.push(qx);\n newpoints.push(intery + qy);\n for (m = 2; m < ps; ++m)\n newpoints.push(points[i + m]);\n bottom = qy;\n }\n\n j += otherps;\n }\n else { // px < qx\n for (m = 0; m < ps; ++m)\n newpoints.push(points[i + m]);\n\n // we might be able to interpolate a point below,\n // this can give us a better y\n if (j > 0 && otherpoints[j - otherps] != null)\n bottom = 0;\n\n newpoints[l + accumulateOffset] += bottom;\n\n i += ps;\n }\n\n fromgap = false;\n\n if (l != newpoints.length && withbottom)\n newpoints[l + 2] = bottom;\n }\n\n // maintain the line steps invariant\n if (withsteps && l != newpoints.length && l > 0\n && newpoints[l] != null\n && newpoints[l] != newpoints[l - ps]\n && newpoints[l + 1] != newpoints[l - ps + 1]) {\n for (m = 0; m < ps; ++m)\n newpoints[l + ps + m] = newpoints[l + m];\n newpoints[l + 1] = newpoints[l - ps + 1];\n }\n }\n\n datapoints.points = newpoints;\n }\n\n plot.hooks.processDatapoints.push(stackData);\n }\n\n $.plot.plugins.push({\n init: init,\n options: options,\n name: 'stack',\n version: '1.2'\n });\n})(jQuery);\n","(function ($) {\n var options = {\n series: {\n stackpercent: null\n } // or number/string\n };\n\n function init(plot) {\n\n // will be built up dynamically as a hash from x-value, or y-value if horizontal\n var stackBases = {};\n var processed = false;\n var stackSums = {};\n\n //set percentage for stacked chart\n function processRawData(plot, series, data, datapoints) {\n if (!processed) {\n processed = true;\n stackSums = getStackSums(plot.getData());\n }\n\t\t\tif (series.stackpercent == true) {\n\t\t\t\tvar num = data.length;\n\t\t\t\tseries.percents = [];\n\t\t\t\tvar key_idx = 0;\n\t\t\t\tvar value_idx = 1;\n\t\t\t\tif (series.bars && series.bars.horizontal && series.bars.horizontal === true) {\n\t\t\t\t\tkey_idx = 1;\n\t\t\t\t\tvalue_idx = 0;\n\t\t\t\t}\n\t\t\t\tfor (var j = 0; j < num; j++) {\n\t\t\t\t\tvar sum = stackSums[data[j][key_idx] + \"\"];\n\t\t\t\t\tif (sum > 0) {\n\t\t\t\t\t\tseries.percents.push(data[j][value_idx] * 100 / sum);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tseries.percents.push(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n }\n\n //calculate summary\n function getStackSums(_data) {\n var data_len = _data.length;\n var sums = {};\n if (data_len > 0) {\n //caculate summary\n for (var i = 0; i < data_len; i++) {\n if (_data[i].stackpercent) {\n\t\t\t\t\t\tvar key_idx = 0;\n\t\t\t\t\t\tvar value_idx = 1;\n\t\t\t\t\t\tif (_data[i].bars && _data[i].bars.horizontal && _data[i].bars.horizontal === true) {\n\t\t\t\t\t\t\tkey_idx = 1;\n\t\t\t\t\t\t\tvalue_idx = 0;\n\t\t\t\t\t\t}\n var num = _data[i].data.length;\n for (var j = 0; j < num; j++) {\n var value = 0;\n if (_data[i].data[j][1] != null) {\n value = _data[i].data[j][value_idx];\n }\n if (sums[_data[i].data[j][key_idx] + \"\"]) {\n sums[_data[i].data[j][key_idx] + \"\"] += value;\n } else {\n sums[_data[i].data[j][key_idx] + \"\"] = value;\n }\n\n }\n }\n }\n }\n return sums;\n }\n\n function stackData(plot, s, datapoints) {\n if (!s.stackpercent) return;\n if (!processed) {\n stackSums = getStackSums(plot.getData());\n }\n var newPoints = [];\n\n\n\t\t\tvar key_idx = 0;\n\t\t\tvar value_idx = 1;\n\t\t\tif (s.bars && s.bars.horizontal && s.bars.horizontal === true) {\n\t\t\t\tkey_idx = 1;\n\t\t\t\tvalue_idx = 0;\n\t\t\t}\n\n\t\t\tfor (var i = 0; i < datapoints.points.length; i += 3) {\n\t\t\t\t// note that the values need to be turned into absolute y-values.\n\t\t\t\t// in other words, if you were to stack (x, y1), (x, y2), and (x, y3),\n\t\t\t\t// (each from different series, which is where stackBases comes in),\n\t\t\t\t// you'd want the new points to be (x, y1, 0), (x, y1+y2, y1), (x, y1+y2+y3, y1+y2)\n\t\t\t\t// generally, (x, thisValue + (base up to this point), + (base up to this point))\n\t\t\t\tif (!stackBases[datapoints.points[i + key_idx]]) {\n\t\t\t\t\tstackBases[datapoints.points[i + key_idx]] = 0;\n\t\t\t\t}\n\t\t\t\tnewPoints[i + key_idx] = datapoints.points[i + key_idx];\n\t\t\t\tnewPoints[i + value_idx] = datapoints.points[i + value_idx] + stackBases[datapoints.points[i + key_idx]];\n\t\t\t\tnewPoints[i + 2] = stackBases[datapoints.points[i + key_idx]];\n\t\t\t\tstackBases[datapoints.points[i + key_idx]] += datapoints.points[i + value_idx];\n\t\t\t\t// change points to percentage values\n\t\t\t\t// you may need to set yaxis:{ max = 100 }\n\t\t\t\tif ( stackSums[newPoints[i+key_idx]+\"\"] > 0 ){\n\t\t\t\t\tnewPoints[i + value_idx] = newPoints[i + value_idx] * 100 / stackSums[newPoints[i + key_idx] + \"\"];\n\t\t\t\t\tnewPoints[i + 2] = newPoints[i + 2] * 100 / stackSums[newPoints[i + key_idx] + \"\"];\n\t\t\t\t} else {\n\t\t\t\t\tnewPoints[i + value_idx] = 0;\n\t\t\t\t\tnewPoints[i + 2] = 0;\n\t\t\t\t}\n\t\t\t}\n\n datapoints.points = newPoints;\n }\n\n\t\tplot.hooks.processRawData.push(processRawData);\n plot.hooks.processDatapoints.push(stackData);\n }\n\n $.plot.plugins.push({\n init: init,\n options: options,\n name: 'stackpercent',\n version: '0.1'\n });\n})(jQuery);\n","/* Pretty handling of time axes.\n\nCopyright (c) 2007-2013 IOLA and Ole Laursen.\nLicensed under the MIT license.\n\nSet axis.mode to \"time\" to enable. See the section \"Time series data\" in\nAPI.txt for details.\n\n*/\n\n(function($) {\n\n\tvar options = {\n\t\txaxis: {\n\t\t\ttimezone: null,\t\t// \"browser\" for local to the client or timezone for timezone-js\n\t\t\ttimeformat: null,\t// format string to use\n\t\t\ttwelveHourClock: false,\t// 12 or 24 time in time mode\n\t\t\tmonthNames: null\t// list of names of months\n\t\t}\n\t};\n\n\t// round to nearby lower multiple of base\n\n\tfunction floorInBase(n, base) {\n\t\treturn base * Math.floor(n / base);\n\t}\n\n\t// Returns a string with the date d formatted according to fmt.\n\t// A subset of the Open Group's strftime format is supported.\n\n\tfunction formatDate(d, fmt, monthNames, dayNames) {\n\n\t\tif (typeof d.strftime == \"function\") {\n\t\t\treturn d.strftime(fmt);\n\t\t}\n\n\t\tvar leftPad = function(n, pad) {\n\t\t\tn = \"\" + n;\n\t\t\tpad = \"\" + (pad == null ? \"0\" : pad);\n\t\t\treturn n.length == 1 ? pad + n : n;\n\t\t};\n\n\t\tvar r = [];\n\t\tvar escape = false;\n\t\tvar hours = d.getHours();\n\t\tvar isAM = hours < 12;\n\n\t\tif (monthNames == null) {\n\t\t\tmonthNames = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\n\t\t}\n\n\t\tif (dayNames == null) {\n\t\t\tdayNames = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\t\t}\n\n\t\tvar hours12;\n\n\t\tif (hours > 12) {\n\t\t\thours12 = hours - 12;\n\t\t} else if (hours == 0) {\n\t\t\thours12 = 12;\n\t\t} else {\n\t\t\thours12 = hours;\n\t\t}\n\n\t\tfor (var i = 0; i < fmt.length; ++i) {\n\n\t\t\tvar c = fmt.charAt(i);\n\n\t\t\tif (escape) {\n\t\t\t\tswitch (c) {\n\t\t\t\t\tcase 'a': c = \"\" + dayNames[d.getDay()]; break;\n\t\t\t\t\tcase 'b': c = \"\" + monthNames[d.getMonth()]; break;\n\t\t\t\t\tcase 'd': c = leftPad(d.getDate(), \"\"); break;\n\t\t\t\t\tcase 'e': c = leftPad(d.getDate(), \" \"); break;\n\t\t\t\t\tcase 'h':\t// For back-compat with 0.7; remove in 1.0\n\t\t\t\t\tcase 'H': c = leftPad(hours); break;\n\t\t\t\t\tcase 'I': c = leftPad(hours12); break;\n\t\t\t\t\tcase 'l': c = leftPad(hours12, \" \"); break;\n\t\t\t\t\tcase 'm': c = leftPad(d.getMonth() + 1, \"\"); break;\n\t\t\t\t\tcase 'M': c = leftPad(d.getMinutes()); break;\n\t\t\t\t\t// quarters not in Open Group's strftime specification\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tc = \"\" + (Math.floor(d.getMonth() / 3) + 1); break;\n\t\t\t\t\tcase 'S': c = leftPad(d.getSeconds()); break;\n\t\t\t\t\tcase 'y': c = leftPad(d.getFullYear() % 100); break;\n\t\t\t\t\tcase 'Y': c = \"\" + d.getFullYear(); break;\n\t\t\t\t\tcase 'p': c = (isAM) ? (\"\" + \"am\") : (\"\" + \"pm\"); break;\n\t\t\t\t\tcase 'P': c = (isAM) ? (\"\" + \"AM\") : (\"\" + \"PM\"); break;\n\t\t\t\t\tcase 'w': c = \"\" + d.getDay(); break;\n\t\t\t\t}\n\t\t\t\tr.push(c);\n\t\t\t\tescape = false;\n\t\t\t} else {\n\t\t\t\tif (c == \"%\") {\n\t\t\t\t\tescape = true;\n\t\t\t\t} else {\n\t\t\t\t\tr.push(c);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn r.join(\"\");\n\t}\n\n\t// To have a consistent view of time-based data independent of which time\n\t// zone the client happens to be in we need a date-like object independent\n\t// of time zones. This is done through a wrapper that only calls the UTC\n\t// versions of the accessor methods.\n\n\tfunction makeUtcWrapper(d) {\n\n\t\tfunction addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {\n\t\t\tsourceObj[sourceMethod] = function() {\n\t\t\t\treturn targetObj[targetMethod].apply(targetObj, arguments);\n\t\t\t};\n\t\t};\n\n\t\tvar utc = {\n\t\t\tdate: d\n\t\t};\n\n\t\t// support strftime, if found\n\n\t\tif (d.strftime != undefined) {\n\t\t\taddProxyMethod(utc, \"strftime\", d, \"strftime\");\n\t\t}\n\n\t\taddProxyMethod(utc, \"getTime\", d, \"getTime\");\n\t\taddProxyMethod(utc, \"setTime\", d, \"setTime\");\n\n\t\tvar props = [\"Date\", \"Day\", \"FullYear\", \"Hours\", \"Milliseconds\", \"Minutes\", \"Month\", \"Seconds\"];\n\n\t\tfor (var p = 0; p < props.length; p++) {\n\t\t\taddProxyMethod(utc, \"get\" + props[p], d, \"getUTC\" + props[p]);\n\t\t\taddProxyMethod(utc, \"set\" + props[p], d, \"setUTC\" + props[p]);\n\t\t}\n\n\t\treturn utc;\n\t};\n\n\t// select time zone strategy. This returns a date-like object tied to the\n\t// desired timezone\n\n\tfunction dateGenerator(ts, opts) {\n\t\tif (opts.timezone == \"browser\") {\n\t\t\treturn new Date(ts);\n\t\t} else if (!opts.timezone || opts.timezone == \"utc\") {\n\t\t\treturn makeUtcWrapper(new Date(ts));\n\t\t} else if (typeof timezoneJS != \"undefined\" && typeof timezoneJS.Date != \"undefined\") {\n\t\t\tvar d = new timezoneJS.Date();\n\t\t\t// timezone-js is fickle, so be sure to set the time zone before\n\t\t\t// setting the time.\n\t\t\td.setTimezone(opts.timezone);\n\t\t\td.setTime(ts);\n\t\t\treturn d;\n\t\t} else {\n\t\t\treturn makeUtcWrapper(new Date(ts));\n\t\t}\n\t}\n\n\t// map of app. size of time units in milliseconds\n\n\tvar timeUnitSize = {\n\t\t\"second\": 1000,\n\t\t\"minute\": 60 * 1000,\n\t\t\"hour\": 60 * 60 * 1000,\n\t\t\"day\": 24 * 60 * 60 * 1000,\n\t\t\"month\": 30 * 24 * 60 * 60 * 1000,\n\t\t\"quarter\": 3 * 30 * 24 * 60 * 60 * 1000,\n\t\t\"year\": 365.2425 * 24 * 60 * 60 * 1000\n\t};\n\n\t// the allowed tick sizes, after 1 year we use\n\t// an integer algorithm\n\n\tvar baseSpec = [\n\t\t[1, \"second\"], [2, \"second\"], [5, \"second\"], [10, \"second\"],\n\t\t[30, \"second\"],\n\t\t[1, \"minute\"], [2, \"minute\"], [5, \"minute\"], [10, \"minute\"],\n\t\t[30, \"minute\"],\n\t\t[1, \"hour\"], [2, \"hour\"], [4, \"hour\"],\n\t\t[8, \"hour\"], [12, \"hour\"],\n\t\t[1, \"day\"], [2, \"day\"], [3, \"day\"],\n\t\t[0.25, \"month\"], [0.5, \"month\"], [1, \"month\"],\n\t\t[2, \"month\"]\n\t];\n\n\t// we don't know which variant(s) we'll need yet, but generating both is\n\t// cheap\n\n\tvar specMonths = baseSpec.concat([[3, \"month\"], [6, \"month\"],\n\t\t[1, \"year\"]]);\n\tvar specQuarters = baseSpec.concat([[1, \"quarter\"], [2, \"quarter\"],\n\t\t[1, \"year\"]]);\n\n\tfunction init(plot) {\n\t\tplot.hooks.processOptions.push(function (plot, options) {\n\t\t\t$.each(plot.getAxes(), function(axisName, axis) {\n\n\t\t\t\tvar opts = axis.options;\n\n\t\t\t\tif (opts.mode == \"time\") {\n\t\t\t\t\taxis.tickGenerator = function(axis) {\n\n\t\t\t\t\t\tvar ticks = [];\n\t\t\t\t\t\tvar d = dateGenerator(axis.min, opts);\n\t\t\t\t\t\tvar minSize = 0;\n\n\t\t\t\t\t\t// make quarter use a possibility if quarters are\n\t\t\t\t\t\t// mentioned in either of these options\n\n\t\t\t\t\t\tvar spec = (opts.tickSize && opts.tickSize[1] ===\n\t\t\t\t\t\t\t\"quarter\") ||\n\t\t\t\t\t\t\t(opts.minTickSize && opts.minTickSize[1] ===\n\t\t\t\t\t\t\t\"quarter\") ? specQuarters : specMonths;\n\n\t\t\t\t\t\tif (opts.minTickSize != null) {\n\t\t\t\t\t\t\tif (typeof opts.tickSize == \"number\") {\n\t\t\t\t\t\t\t\tminSize = opts.tickSize;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tminSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (var i = 0; i < spec.length - 1; ++i) {\n\t\t\t\t\t\t\tif (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]]\n\t\t\t\t\t\t\t\t\t\t\t + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2\n\t\t\t\t\t\t\t\t&& spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar size = spec[i][0];\n\t\t\t\t\t\tvar unit = spec[i][1];\n\n\t\t\t\t\t\t// special-case the possibility of several years\n\n\t\t\t\t\t\tif (unit == \"year\") {\n\n\t\t\t\t\t\t\t// if given a minTickSize in years, just use it,\n\t\t\t\t\t\t\t// ensuring that it's an integer\n\n\t\t\t\t\t\t\tif (opts.minTickSize != null && opts.minTickSize[1] == \"year\") {\n\t\t\t\t\t\t\t\tsize = Math.floor(opts.minTickSize[0]);\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tvar magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10));\n\t\t\t\t\t\t\t\tvar norm = (axis.delta / timeUnitSize.year) / magn;\n\n\t\t\t\t\t\t\t\tif (norm < 1.5) {\n\t\t\t\t\t\t\t\t\tsize = 1;\n\t\t\t\t\t\t\t\t} else if (norm < 3) {\n\t\t\t\t\t\t\t\t\tsize = 2;\n\t\t\t\t\t\t\t\t} else if (norm < 7.5) {\n\t\t\t\t\t\t\t\t\tsize = 5;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tsize = 10;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tsize *= magn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// minimum size for years is 1\n\n\t\t\t\t\t\t\tif (size < 1) {\n\t\t\t\t\t\t\t\tsize = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\taxis.tickSize = opts.tickSize || [size, unit];\n\t\t\t\t\t\tvar tickSize = axis.tickSize[0];\n\t\t\t\t\t\tunit = axis.tickSize[1];\n\n\t\t\t\t\t\tvar step = tickSize * timeUnitSize[unit];\n\n\t\t\t\t\t\tif (unit == \"second\") {\n\t\t\t\t\t\t\td.setSeconds(floorInBase(d.getSeconds(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"minute\") {\n\t\t\t\t\t\t\td.setMinutes(floorInBase(d.getMinutes(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"hour\") {\n\t\t\t\t\t\t\td.setHours(floorInBase(d.getHours(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"month\") {\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), tickSize));\n\t\t\t\t\t\t} else if (unit == \"quarter\") {\n\t\t\t\t\t\t\td.setMonth(3 * floorInBase(d.getMonth() / 3,\n\t\t\t\t\t\t\t\ttickSize));\n\t\t\t\t\t\t} else if (unit == \"year\") {\n\t\t\t\t\t\t\td.setFullYear(floorInBase(d.getFullYear(), tickSize));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// reset smaller components\n\n\t\t\t\t\t\td.setMilliseconds(0);\n\n\t\t\t\t\t\tif (step >= timeUnitSize.minute) {\n\t\t\t\t\t\t\td.setSeconds(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.hour) {\n\t\t\t\t\t\t\td.setMinutes(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.day) {\n\t\t\t\t\t\t\td.setHours(0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.day * 4) {\n\t\t\t\t\t\t\td.setDate(1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.month * 2) {\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), 3));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.quarter * 2) {\n\t\t\t\t\t\t\td.setMonth(floorInBase(d.getMonth(), 6));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (step >= timeUnitSize.year) {\n\t\t\t\t\t\t\td.setMonth(0);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar carry = 0;\n\t\t\t\t\t\tvar v = Number.NaN;\n\t\t\t\t\t\tvar prev;\n\n\t\t\t\t\t\tdo {\n\n\t\t\t\t\t\t\tprev = v;\n\t\t\t\t\t\t\tv = d.getTime();\n\t\t\t\t\t\t\tticks.push(v);\n\n\t\t\t\t\t\t\tif (unit == \"month\" || unit == \"quarter\") {\n\t\t\t\t\t\t\t\tif (tickSize < 1) {\n\n\t\t\t\t\t\t\t\t\t// a bit complicated - we'll divide the\n\t\t\t\t\t\t\t\t\t// month/quarter up but we need to take\n\t\t\t\t\t\t\t\t\t// care of fractions so we don't end up in\n\t\t\t\t\t\t\t\t\t// the middle of a day\n\n\t\t\t\t\t\t\t\t\td.setDate(1);\n\t\t\t\t\t\t\t\t\tvar start = d.getTime();\n\t\t\t\t\t\t\t\t\td.setMonth(d.getMonth() +\n\t\t\t\t\t\t\t\t\t\t(unit == \"quarter\" ? 3 : 1));\n\t\t\t\t\t\t\t\t\tvar end = d.getTime();\n\t\t\t\t\t\t\t\t\td.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize);\n\t\t\t\t\t\t\t\t\tcarry = d.getHours();\n\t\t\t\t\t\t\t\t\td.setHours(0);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\td.setMonth(d.getMonth() +\n\t\t\t\t\t\t\t\t\t\ttickSize * (unit == \"quarter\" ? 3 : 1));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (unit == \"year\") {\n\t\t\t\t\t\t\t\td.setFullYear(d.getFullYear() + tickSize);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\td.setTime(v + step);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} while (v < axis.max && v != prev);\n\n\t\t\t\t\t\treturn ticks;\n\t\t\t\t\t};\n\n\t\t\t\t\taxis.tickFormatter = function (v, axis) {\n\n\t\t\t\t\t\tvar d = dateGenerator(v, axis.options);\n\n\t\t\t\t\t\t// first check global format\n\n\t\t\t\t\t\tif (opts.timeformat != null) {\n\t\t\t\t\t\t\treturn formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// possibly use quarters if quarters are mentioned in\n\t\t\t\t\t\t// any of these places\n\n\t\t\t\t\t\tvar useQuarters = (axis.options.tickSize &&\n\t\t\t\t\t\t\t\taxis.options.tickSize[1] == \"quarter\") ||\n\t\t\t\t\t\t\t(axis.options.minTickSize &&\n\t\t\t\t\t\t\t\taxis.options.minTickSize[1] == \"quarter\");\n\n\t\t\t\t\t\tvar t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]];\n\t\t\t\t\t\tvar span = axis.max - axis.min;\n\t\t\t\t\t\tvar suffix = (opts.twelveHourClock) ? \" %p\" : \"\";\n\t\t\t\t\t\tvar hourCode = (opts.twelveHourClock) ? \"%I\" : \"%H\";\n\t\t\t\t\t\tvar fmt;\n\n\t\t\t\t\t\tif (t < timeUnitSize.minute) {\n\t\t\t\t\t\t\tfmt = hourCode + \":%M:%S\" + suffix;\n\t\t\t\t\t\t} else if (t < timeUnitSize.day) {\n\t\t\t\t\t\t\tif (span < 2 * timeUnitSize.day) {\n\t\t\t\t\t\t\t\tfmt = hourCode + \":%M\" + suffix;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfmt = \"%b %d \" + hourCode + \":%M\" + suffix;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (t < timeUnitSize.month) {\n\t\t\t\t\t\t\tfmt = \"%b %d\";\n\t\t\t\t\t\t} else if ((useQuarters && t < timeUnitSize.quarter) ||\n\t\t\t\t\t\t\t(!useQuarters && t < timeUnitSize.year)) {\n\t\t\t\t\t\t\tif (span < timeUnitSize.year) {\n\t\t\t\t\t\t\t\tfmt = \"%b\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfmt = \"%b %Y\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (useQuarters && t < timeUnitSize.year) {\n\t\t\t\t\t\t\tif (span < timeUnitSize.year) {\n\t\t\t\t\t\t\t\tfmt = \"Q%q\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tfmt = \"Q%q %Y\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfmt = \"%Y\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar rt = formatDate(d, fmt, opts.monthNames, opts.dayNames);\n\n\t\t\t\t\t\treturn rt;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t$.plot.plugins.push({\n\t\tinit: init,\n\t\toptions: options,\n\t\tname: 'time',\n\t\tversion: '1.0'\n\t});\n\n\t// Time-axis support used to be in Flot core, which exposed the\n\t// formatDate function on the plot object. Various plugins depend\n\t// on the function, so we need to re-expose it here.\n\n\t$.plot.formatDate = formatDate;\n\n})(jQuery);\n"],"names":["NOOP","v","ArrayPropertyVector","constructor","source","prop","length","this","get","index","converter","toArray","vectorToArray","toJSON","ArrayDataFrame","FunctionalVector","names","super","first","fields","map","name","type","guessFieldTypeFromNameAndValue","config","values","setFieldsFromObject","obj","Object","keys","setFieldType","field","find","f","push","idx","toDataFrameDTO","ENTITY_MAP","Inf","Infinity","NegInf","Undef","undefined","NaN","decodeFieldValueEntities","lookup","key","repl","guessFieldType","FieldType","dataFrameFromJSON","dto","schema","data","Error","reduce","max","vals","Math","entities","buffer","origLen","fill","ArrayVector","dataFrameToJSON","frame","refId","meta","sfield","DataFrameView","i","getter","hasOwnProperty","defineProperty","enumerable","toString","dataFrame","getFieldDisplayProcessor","colIndex","display","Array","_","MISSING_VALUE","MutableDataFrame","creator","addField","addFieldFor","value","guessFieldTypeFromValue","startLength","isArray","guessFieldTypeForField","add","validate","reverse","setParser","parser","parsers","Map","set","parseValue","p","makeFieldParser","appendRow","row","isString","val","createDimension","columns","getColumnsFromDimension","dimension","getColumnFromDimension","column","getValueFromDimension","getAllValuesFromDimension","c","getDimensionByName","dimensions","compareDataFrameStructures","a","b","skipConfig","fA","fB","labels","shallowCompare","cfgA","cfgB","aKeys","bKeys","compareArrayValues","cmp","defaultCmp","FieldCache","t","fieldByType","fieldByName","console","warn","getFields","hasFieldOfType","types","getFirstFieldOfType","includeHidden","custom","hidden","hasFieldNamed","hasFieldWithNameAndType","filter","getFieldByName","getFieldsByLabel","label","CircularDataFrame","options","CircularVector","convertTableToDataFrame","table","text","disp","includes","rows","NUMBER","toLowerCase","getFieldTypeFromValue","Date","isDateTime","isNumber","isBoolean","test","guessFieldTypes","series","guessDefined","isTableData","isDataFrame","toDataFrame","timeSeries","target","tags","unit","filterable","point","datapoints","json","convertJSONDocumentDataToDataFrame","times","points","TIME_SERIES_TIME_FIELD_NAME","TIME_SERIES_VALUE_FIELD_NAME","title","displayNameFromDS","convertTimeSeriesToDataFrame","graphSeries","x","y","convertGraphSeriesToDataFrame","toLegacyResponseData","rowCount","timeField","timeIndex","getTimeField","valueField","alias","getFieldDisplayName","j","sortDataFrame","sortIndex","fieldComparer","fieldIndexComparer","sort","SortedVector","reverseDataFrame","copy","getDataFrameRow","toFilteredDataFrameDTO","fieldPredicate","Float64Array","isTimeSeries","Boolean","isTimeSerie","anySeriesWithTimeField","defaultTimeZoneResolver","DefaultTimeZone","setTimeZoneResolver","resolver","getTimeZone","timeZone","units","isMathString","substring","parse","roundUp","timezone","fiscalYearStartMonth","isDate","dateTime","time","parseString","mathString","dateTimeForTimeZone","indexOf","ISO_8601","parseDateMath","isValid","date","strippedMathString","replace","len","charAt","num","isFiscal","isNaN","parseInt","numFrom","roundToFiscal","endOf","startOf","subtract","fyStartMonth","month","DEFAULT_SYSTEM_DATE_FORMAT","SystemDateFormatsState","millisecond","second","minute","hour","day","year","update","settings","fullDate","interval","useBrowserLocale","localTimeFormat","fullDateMS","hour12","getTimeFieldUnit","useMsResolution","locale","fallback","missingIntlDateTimeFormatSupport","navigator","languages","dateTimeFormat","Intl","DateTimeFormat","parts","formatToParts","mapping","resolvedOptions","weekday","era","dayPeriod","timeZoneName","part","join","systemDateFormats","prototype","dateInUtc","toTz","format","getFormat","dateTimeFormatISO","dateTimeFormatTimeAgo","fromNow","dateTimeFormatWithAbbrevation","timeZoneAbbrevation","defaultWithMS","zone","moment","tz","local","InternalTimeZones","timeZoneFormatUserFriendly","getTimeZoneInfo","timestamp","internal","mapInternal","mapToInfo","getTimeZones","memoize","includeInternal","initial","default","localBrowserTime","utc","zones","countriesForZone","countriesByTimeZone","getTimeZoneGroups","timeZones","groups","delimiter","group","slice","ianaName","countries","abbreviation","offsetInMins","info","getTimezoneOffset","momentTz","abbrevation","abbr","utcOffset","countryByCode","AF","AX","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BV","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MK","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","AN","NC","NZ","NI","NE","NG","NU","NF","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SK","SI","SB","SO","ZA","GS","ES","LK","SD","SR","SJ","SZ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW","all","code","durationMap","years","months","weeks","days","hours","minutes","seconds","intervalToAbbreviatedDurationString","includeSeconds","duration","intervalToDuration","entries","str","parseDuration","durationString","split","acc","match","rawLength","abbreviations","addDurationToDate","durationToMilliseconds","now","getTime","isValidDate","dateString","isValidDuration","trim","isValidGoDuration","timeUnits","setLocale","language","getLocale","getLocaleData","toUtc","input","formatInput","toDuration","dateTimeAsMoment","getWeekdayIndex","findIndex","wd","getWeekdayIndexByEnglishName","setWeekStart","weekStart","suffix","dow","parentLocale","week","spans","s","m","h","d","w","M","rangeIndex","describeTextRange","expr","isLast","opt","from","to","exec","amount","span","section","invalid","describeTimeRange","range","option","parsed","dateMath","each","isValidTimeSpan","describeTimeRangeAbbreviation","convertRawToRange","raw","dateTimeParse","isRelativeTime","timeRange","isRelativeTimeRange","secondsToHms","numYears","floor","numDays","numHours","numMinutes","numSeconds","numMilliseconds","msRangeToTimeString","rangeMs","rangeSec","Number","toFixed","formattedH","formattedM","formattedS","calculateInterval","resolution","lowLimitInterval","lowLimitMs","intervalToMs","intervalMs","roundInterval","valueOf","interval_regex","intervals_in_seconds","ms","describeInterval","sec","count","matches","has","intervalToSeconds","timeRangeToRelative","unix","relativeToTimeRange","relativeTimeRange","timeFormats","dateTimeAsIso","dateTimeAsIsoNoDateIfToday","dateTimeAsUS","dateTimeAsUSNoDateIfToday","dateTimeAsLocal","dateTimeAsLocalNoDateIfToday","dateTimeFromNow","getDisplayProcessor","isEmpty","toStringProcessor","hasDateUnit","startsWith","showMs","isBooleanUnit","start","end","formatFunc","getValueFormat","scaleFunc","getScaleCalculator","theme","decimals","mappings","isStringUnit","prefix","color","icon","percent","numeric","anyToNumber","mappingResult","getValueMappingResult","visualization","getColorByName","scaleResult","noValue","getRawDisplayProcessor","JSON","stringify","getCircularReplacer","seen","WeakSet","_key","fieldColorModeRegistry","Registry","id","FieldColorModeId","description","getCalculator","getFixedColor","isByValue","_field","_value","_percent","threshold","thresholdSafe","fallBackTreshold","FieldColorSchemeMode","isContinuous","getColors","palette","getNamedColors","colorCache","colorCacheTheme","getInterpolator","interpolator","interpolateRgbBasis","colors","_threshold","seriesIndex","state","getFieldColorModeForField","mode","getFieldColorMode","getFieldSeriesColor","scale","stat","seriesBy","reduceField","reducers","fixedColor","FALLBACK_COLOR","getTemplateProxyForField","frames","Proxy","reciever","__values","formatLabels","findNumericFieldMinMax","min","ReducerID","stats","statsMin","statsMax","delta","applyFieldOverrides","fieldConfig","fieldConfigRegistry","standardFieldConfigEditorRegistry","globalRange","override","overrides","rule","fieldMatchers","matcher","properties","originalFrame","newFrame","cloneDeep","scopedVars","__series","getFrameDisplayName","__field","context","dataFrameIndex","replaceVariables","setFieldConfigDefaults","defaults","setDynamicConfigValue","cachingDisplayProcessor","getLinks","getLinksSupplier","maxCacheSize","caches","cache","size","clear","asHexString","item","getIfExists","process","isCustom","unset","path","fieldConfigProperty","list","processFieldConfigValue","validateFieldConfig","destination","currentConfig","shouldApply","thresholds","tmp","fieldScopedVars","links","timeRangeUrl","locationUtil","link","variablesQuery","dataFrameVars","valueVars","valueRowIndex","calculatedValue","formattedValueToString","fieldsProxy","getFieldDisplayValuesProxy","rowIndex","__data","variables","__value","DataLinkBuiltInVars","onClick","href","url","targetBlank","evt","origin","e","mapInternalLinkToExplore","internalLink","applyRawFieldOverrides","newData","processor","frameIndex","newFields","fieldIndex","k","toNumber","displayName","VAR_SERIES_NAME","VAR_FIELD_NAME","VAR_FIELD_LABELS","VAR_CALC","VAR_CELL_PREFIX","DEFAULT_FIELD_DISPLAY_VALUES_LIMIT","getFieldDisplayValues","reduceOptions","calcs","fieldMatcher","getFieldMatcher","FieldMatcherID","limit","hitLimit","view","fieldLinksSupplier","usesCellValues","setIndexForPaletteColor","displayValue","rowName","getSmartDisplayNameForRow","overrideColor","lookupRowColorFromOverride","hasLinks","results","calc","sparkline","highlightIndex","displayProcessor","getDisplayText","createNoValuesFieldDisplay","otherNumericFields","otherField","mappedValue","currentLength","getDisplayValueAlignmentFactors","prefixLength","suffixLength","identityOverrideProcessor","_context","_settings","numberOverrideProcessor","parseFloat","displayNameOverrideProcessor","stringOverrideProcessor","dataLinksOverrideProcessor","valueMappingsOverrideProcessor","selectOverrideProcessor","expandTemplateVars","thresholdsOverrideProcessor","unitOverrideProcessor","booleanOverrideProcessor","trueValue","falseValue","getBooleanScaleCalculator","getColor","getMinMaxAndDelta","getActiveThresholdForValue","getFieldConfigWithMinMax","FieldConfigOptionsRegistry","standardEditorsRegistry","getActiveThreshold","active","ThresholdsMode","steps","sortThresholds","t1","t2","EventBusSrv","emitter","EventEmitter","publish","event","emit","subscribe","typeFilter","handler","getStream","next","eventType","Observable","observer","on","off","newScopedBus","ScopedEventBus","payload","scope","wrapper","emittedEvent","unbind","$on","removeAllListeners","eventBus","filterConfig","onlyLocal","pipe","DataHoverEvent","BusEventWithPayload","DataHoverClearEvent","BusEventBase","DataSelectEvent","AnnotationChangeEvent","DashboardLoadedEvent","monacoLanguageRegistry","FrameGeometrySourceMode","LayoutModes","createFieldConfigRegistry","pluginName","registry","standardConfigs","standardOptionsExtensions","useCustomConfig","builder","FieldConfigEditorBuilder","customProp","getRegistry","isStandardConfigExtension","currentExtensions","category","register","fieldConfigProp","disableStandardOptions","standardOptions","customDefault","defaultValue","customSettings","extensionProperty","property","standardProperties","PanelPlugin","GrafanaPlugin","panel","annotations","alertStates","result","_defaults","optionsSupplier","PanelOptionsEditorBuilder","getItems","fieldConfigDefaults","configDefaults","_fieldConfigDefaults","setDefaults","deprecationWarning","_fieldConfigRegistry","_initConfigRegistry","setEditor","editor","setNoPadding","noPadding","setMigrationHandler","onPanelMigration","setPanelChangeHandler","onPanelTypeChanged","setPanelOptions","getPanelOptionsSupplier","setDataSupport","support","dataSupport","useFieldConfig","setSuggestionsSupplier","supplier","suggestionsSupplier","getSuggestionsSupplier","hasPluginId","pluginId","hasInitialized","markdownOptions","pedantic","gfm","smartLists","smartypants","xhtml","breaks","renderMarkdown","opts","marked","html","noSanitize","sanitize","renderTextPanelMarkdown","sanitizeTextPanelContent","textUtil","escapeHtml","hasAnsiCodes","sanitizeUrl","specialMatcher","specialCharEscape","RegExp","specialCharUnescape","escapeStringForRegex","unEscapeStringFromRegex","stringStartsAsRegEx","stringToJsRegex","stringToMs","nr","String","toNumberString","isFinite","toIntegerOrUndefined","toFloatOrUndefined","toPascalCase","string","camelCase","toUpperCase","findHighlightChunksInText","searchWords","textToHighlight","chunks","term","findMatchesInText","haystack","needle","cleaned","flags","parseFlags","cleanNeedle","regexp","error","offset","FLAGS_REGEXP","Set","clearAll","flag","delete","createBreakpoints","xs","sm","md","lg","xl","xxl","up","down","step","clamp","hexToRgb","re","n","round","rgbToHex","decomposeColor","int","hex","intToHex","tColor","tinycolor","getAlpha","toHexString","toHex8String","asRgbString","toRgbString","hslToRgb","l","rgb","recomposeColor","marker","colorSpace","shift","getContrastRatio","foreground","background","canvas","lumA","getLuminance","lumB","backgroundParts","alpha","rgbNumbers","emphasize","coefficient","darken","lighten","padStart","lastIndexOf","DarkColors","weak","whiteBase","medium","strong","primary","secondary","disabled","maxContrast","main","border","shade","contrastText","hover","selected","focus","hoverOpacity","disabledText","disabledBackground","disabledOpacity","brandHorizontal","brandVertical","LightColors","blackBase","createColors","dark","light","base","warning","success","tonalOffset","hoverFactor","contrastThreshold","other","getContrastText","getRichColor","transparent","merge","factor","createShadows","z1","z2","z3","createShape","baseBorderRadius","borderRadius","createSpacing","gridSize","transform","spacing","args","argument","output","easing","easeInOut","easeOut","easeIn","sharp","shortest","shorter","short","standard","complex","enteringScreen","leavingScreen","create","props","durationOption","easingOption","delay","animatedProp","formatMs","getAutoHeightDuration","height","constant","milliseconds","createTransitions","defaultFontFamily","defaultFontFamilyMonospace","createTypography","typographyInput","fontFamily","fontFamilyMonospace","fontSize","fontWeightLight","fontWeightRegular","fontWeightMedium","fontWeightBold","htmlFontSize","coef","pxToRem","buildVariant","fontWeight","lineHeight","letterSpacing","casing","variants","h1","h2","h3","h4","h5","h6","body","bodySmall","createVisualizationColors","hues","shades","aliases","byNameIndex","hue","colorName","realColor","nativeColor","nativeColorNames","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","zIndex","navbarFixed","sidemenu","dropdown","typeahead","tooltip","modalBackdrop","modal","portal","convertFieldTypeTransformer","DataTransformerID","defaultOptions","conversions","targetField","destinationType","dateFormat","operator","transformer","timeParsed","framesCopy","conversion","convertFieldType","convertFieldTypes","ensureTimeField","numValues","number","fieldToNumberField","stringValues","fieldToStringField","booleanValues","fieldToBooleanField","complexValues","fieldToComplexField","iso8601Regex","firstValueTypeIsNumber","timeValues","firstDefined","isISO8601","fieldToTimeField","renameByRegexTransformer","regex","renamePattern","renameFieldsByRegex","newDisplayName","standardTransformers","noopTransformer","filterFieldsTransformer","filterFieldsByNameTransformer","filterFramesTransformer","filterFramesByRefIdTransformer","filterByValueTransformer","orderFieldsTransformer","organizeFieldsTransformer","reduceTransformer","concatenateTransformer","calculateFieldTransformer","seriesToColumnsTransformer","seriesToRowsTransformer","renameFieldsTransformer","labelsToFieldsTransformer","ensureColumnsTransformer","groupByTransformer","sortByTransformer","mergeTransformer","histogramTransformer","groupingToMatrixTransformer","limitTransformer","standardTransformersRegistry","getOperator","transformation","mergeMap","before","of","postProcessTransform","after","transformations","transformDataFrame","stream","operators","apply","getFieldPredicateMatchers","getFieldTypeMatchers","getFieldNameMatchers","getSimpleFieldMatchers","frameMatchers","getFramePredicateMatchers","getFrameNameMatchers","getRefIdMatchers","valueMatchers","getNullValueMatchers","getNumericValueMatchers","getEqualValueMatchers","getRangeValueMatchers","getRegexValueMatcher","getFrameMatchers","getValueMatcher","ByNamesMatcherMode","fieldNameMatcher","allFrames","getOptionsDisplayText","multipleFieldNamesMatcher","include","uniqueNames","exclude","displayText","regexpFieldNameMatcher","pattern","patternToRegex","fieldsInFrameMatcher","regexpOrMultipleNamesMatcher","regexpMatcher","namesMatcher","frameNameMatcher","FrameMatcherID","CalculateFieldMode","defaultReduceOptions","reducer","defaultBinaryOptions","left","BinaryOperationID","right","ReduceRow","outerSource","fieldReducers","doStandardCalcs","ignoreNulls","nullValueMode","NullValueMode","nullAsZero","iter","RowVector","getReduceRowCreator","BinaryOperation","binaryOptions","binary","binaryOperators","findFieldValuesWithNameOrConstant","BinaryOperationVector","operation","getBinaryCreator","getNameFromOptions","replaceFields","AsNumberVector","ConstantVector","r","ConcatenateFrameNameMode","frameNameMode","FieldName","frameNameLabel","dataFrames","concatenateFields","sameLength","maxLength","Drop","Label","FilterByValueType","FilterByValueMatch","filters","any","matchAll","fieldIndexByName","groupFieldIndexByName","matchers","createFilterValueMatchers","matching","processed","frameLength","noop","fieldName","GroupByOperationID","groupBy","groupByFields","shouldGroupOnField","valuesByGroupKey","groupKey","valuesByField","forEach","shouldCalculateField","aggregations","valuesByAggregation","fieldWithValuesForGroup","aggregation","aggregationField","detectFieldType","aggregate","sourceField","DEFAULT_COLUMN_FIELD","DEFAULT_ROW_FIELD","DEFAULT_VALUE_FIELD","columnField","rowField","columnFieldMatch","rowFieldMatch","valueFieldMatch","keyColumnField","findKeyField","keyRowField","rowColumnField","columnValues","uniqueValues","rowValues","matrixValues","columnName","resultFrame","unique","matchTitle","histogramBucketSizes","histFilter","histSort","histogramFieldInfo","bucketSize","bucketOffset","combine","hist","buildHistogram","histogramFieldsToFrame","histogramFrameBucketMinFieldName","histogramFrameBucketMaxFieldName","getHistogramFields","bucketMin","bucketMax","counts","allValues","concat","smallestDelta","targetSize","_bucketSize","getBucket","incrRoundDn","bucketDecimals","histograms","fieldHist","histogram","joinedHists","histIdx","bucketIdx","incrRound","incr","incrRoundUp","ceil","filterOut","entry","bins","createTheme","getJoinMatcher","joinBy","common","pickBestJoinField","maybeSortFrame","fieldIdx","sortByField","samples","firstIdx","lastIdx","stride","prevVal","isLikelyAscendingVector","outerJoinDataFrames","frameCopy","joinFieldMatcher","joinIndex","keepOriginIndices","joinField","unshift","keep","nullModes","allData","originalFields","nullModesFrame","NULL_REMOVE","spanNulls","NULL_RETAIN","NULL_EXPAND","joined","nullExpand","yVals","nullIdxs","alignedLen","xi","lastNullIdx","nullIdx","tables","xVals","ti","xIdxs","si","ys","nullMode","yVal","alignedIdx","LabelsToFieldsMode","Rows","keepLabels","convertLabelsToRows","uniqueLabels","sansLabels","labelName","valueLabel","indexByName","orderer","createFieldsOrderer","createOrderFieldsComparer","indexOfField","comparer","isInteger","MAX_SAFE_INTEGER","ReduceTransformerMode","includeTimeField","ReduceFields","alwaysFieldMatcher","notTimeFieldMatcher","reducerId","reduceFields","res","labelsToFields","calculators","distinctLabels","getDistinctLabelKeys","baseFrame","baseIndex","baseField","isFirstField","isSameField","baseValues","mergeResults","reduceSeriesToRows","GrafanaEdition","GAUGE_DEFAULT_MINIMUM","GAUGE_DEFAULT_MAXIMUM","DEFAULT_SAML_NAME","LoadingState","preferredVisualizationTypes","DataFrameType","VariableOrigin","VariableSuggestionsScope","DashboardCursorSync","DataTopic","AbstractLabelOperator","hasQueryImportSupport","datasource","importFromAbstractQueries","hasQueryExportSupport","exportToAbstractQueries","AnnotationEventFieldSource","NavSection","NavMenuItemType","isSystemOverrideWithRef","ref","__systemRef","isSystemOverride","FieldConfigProperty","PluginState","PluginType","PluginSignatureStatus","PluginSignatureType","PluginErrorCode","PluginIncludeType","CoreApp","FeatureState","addConfigPage","tab","configPages","setChannelSupport","AppPlugin","init","setRootPage","root","rootNav","setComponentsFromLegacyExports","pluginExports","ConfigCtrl","angularConfigCtrl","page","component","DataSourcePlugin","DataSourceClass","setConfigEditor","components","ConfigEditor","setConfigCtrl","setQueryCtrl","QueryCtrl","setAnnotationQueryCtrl","AnnotationsQueryCtrl","setQueryEditor","QueryEditor","setExploreQueryField","ExploreQueryField","setExploreMetricsQueryField","ExploreMetricsQueryField","setExploreLogsQueryField","ExploreLogsQueryField","setQueryEditorHelp","QueryEditorHelp","setExploreStartPage","ExploreStartPage","setVariableQueryEditor","VariableQueryEditor","setMetadataInspector","MetadataInspector","DataSourceApi","instanceSettings","uid","getRef","ExploreMode","DataQueryErrorType","LanguageProvider","makeClassES5Compatible","VizOrientation","VisualizationSuggestionScore","VisualizationSuggestionsBuilder","dataSummary","computeDataSummary","getListAppender","VisualizationSuggestionsListAppender","preferredVisualisationType","numberFieldCount","timeFieldCount","stringFieldCount","rowCountTotal","rowCountMax","fieldCount","frameCount","hasData","hasTimeField","hasNumberField","hasStringField","getList","append","defaultsDeep","OrgRole","AppEvents","alertSuccess","eventFactory","alertWarning","alertError","PanelEvents","refresh","componentDidMount","dataReceived","dataError","dataFramesReceived","dataSnapshotLoad","editModeInitialized","initPanelActions","initialized","panelTeardown","render","LegacyGraphHoverEvent","LegacyGraphHoverClearEvent","LiveChannelScope","LiveChannelType","LiveChannelConnectionState","LiveChannelEventType","VariableSupportType","isLiveChannelStatusEvent","Status","isLiveChannelJoinEvent","Join","isLiveChannelLeaveEvent","Leave","isLiveChannelMessageEvent","Message","parseLiveChannelAddress","namespace","isValidLiveChannelAddress","addr","toLiveChannelId","VariableSupportBase","StandardVariableSupport","getType","Standard","CustomVariableSupport","Custom","DataSourceVariableSupport","Datasource","isUnsignedPluginSignature","signature","valid","AlertState","LogLevel","LogsMetaKind","LogsSortOrder","LogsDedupStrategy","LogsDedupDescription","hasLogsContextSupport","withLogsSupport","getLogRowContext","showContextToggle","hasLogsVolumeSupport","getLogsVolumeDataProvider","TIME_FORMAT","getDefaultTimeRange","getDefaultRelativeTimeRange","OptionsUIRegistryBuilder","addCustomEditor","addNumberInput","addSliderInput","addTextInput","addSelect","addRadio","addBooleanSwitch","addColorPicker","addUnitPicker","NestedPanelOptionsBuilder","cfg","build","parent","getValue","onChange","isNestedPanelOptions","addNestedOptions","addStringArray","addMultiSelect","addTimeZonePicker","addFieldNamePicker","addDashboardPicker","keepTime","timeRangeFrom","timeRangeTo","includeVars","seriesName","valueTime","valueNumeric","valueText","valueRaw","valueCalc","onClickFn","interpolatedQuery","interpolateObject","query","interpolatedPanelsState","panelsState","datasourceName","generateInternalHref","datasourceUid","encodeURIComponent","serializeStateToUrlParam","queries","object","stringifiedQuery","err","replacedQuery","moveItemImmutably","arr","clone","splice","call","collator","Collator","sensitivity","numericCompare","sortValues","compareFn","compare","SortOrder","getDataSourceRef","ds","isDataSourceRef","getDataSourceUID","onUpdateDatasourceOption","updateDatasourcePluginOption","currentTarget","onUpdateDatasourceJsonDataOption","updateDatasourcePluginJsonDataOption","onUpdateDatasourceSecureJsonDataOption","updateDatasourcePluginSecureJsonDataOption","onUpdateDatasourceJsonDataOptionSelect","onUpdateDatasourceJsonDataOptionChecked","checked","onUpdateDatasourceSecureJsonDataOptionSelect","onUpdateDatasourceResetOption","updateDatasourcePluginResetOption","onOptionsChange","jsonData","secureJsonData","secureJsonFields","history","file","oldName","newName","message","last","CSVHeaderStyle","readCSV","csv","CSVReader","ParseState","line","isName","headerKeys","ReadingRows","current","InHeader","Starting","callback","onHeader","onRow","papacfg","dynamicTyping","skipEmptyLines","comments","chunk","Papa","writeValue","quoteChar","makeFieldWriter","getHeaderLine","isType","newline","getLocaleDelimiter","toLocaleString","toCSV","encoding","headerStyle","useExcelHeader","full","writers","LOGFMT_REGEXP","getLogLevel","currentIndex","level","getLogLevelFromKey","addLogLevelToSeries","lineIndex","levels","lines","LogsParsers","buildMatcher","getLabelFromField","getValueFromField","logfmt","escapeRegExp","calculateFieldStats","extractor","rowsWithField","countsByValue","countBy","getSortedCounts","calculateLogsLabelStats","rowsWithLabel","calculateStats","nonEmptyValues","chain","proportion","sortBy","getParser","sortInAscendingOrder","timeEpochMs","timeEpochNs","sortInDescendingOrder","sortLogsResult","logsResult","sortOrder","sortLogRows","hasUniqueLabels","logRows","checkLogsError","logRow","__error__","hasError","errorMessage","escapeUnescapedString","NodeGraphDataFrameFieldNames","getFlotPairs","xField","yField","vX","vY","pairs","getFlotPairsConstant","seriesData","DocsId","labelRegexp","parseLabels","labelsByKey","findCommonLabels","labelsSets","findUniqueLabels","commonLabels","uncommonLabels","matchAllLabels","expect","against","withoutBraces","labelKeys","cleanSelector","getTimeRangeUrlParams","getVariablesUrlParams","grafanaConfig","appSubUrl","stripBaseFromUrl","urlOrPath","parsedUrl","URL","maybeParseUrl","window","location","stripExtraChars","endsWith","isAbsoluteUrl","segmentToStrip","initialize","dependencies","getTimeRangeForUrl","assureBaseUrl","updateSearchParams","partial","urlSearchParams","URLSearchParams","curURL","searchParams","newSearchParams","urlUtil","params","getUrlForPartial","searchParamsToUpdate","search","pathname","processUrl","disableSanitizeHtml","classicColors","roundDecimals","dec","EPSILON","guessDecimals","objRemoveUndefined","toOption","getSeriesTimeStep","previousTime","returnTimeStep","MAX_VALUE","currentTime","timeStep","hasMsResolution","encodeURIComponentAsAngularJS","pctEncodeSpaces","charCodeAt","toUrlParams","rbracket","valueQueryPart","buildParams","tryDecodeURIComponent","decodeURIComponent","renderUrl","appendQueryToUrl","stringToAppend","pos","getUrlSearchParams","searchParamsSegments","keyValuePair","parseKeyValue","keyValue","splitPoint","parsedVal","urlState","compact","valueMappings","vm","MappingType","valueAsNumber","SpecialValueMatch","LegacyMappingType","convertOldAngularValueMappings","migratedThresholds","mappingType","valueMaps","rangeMaps","upgradeOldAngularValueMapping","old","newMappings","ValueToText","RangeToText","withLoadingIndicator","whileLoading","timer","mapTo","takeUntil","categories","hasBuiltIndex","NEGATIVE_INFINITY","POSITIVE_INFINITY","log","abs","LN10","magn","pow","getDecimalsForValue","formatted","decimalPos","precision","toFixedScaled","ext","toFixedUnit","asPrefix","booleanValueFormatter","logb","log10","scaledUnits","extArray","siIndex","maximumFractionDigits","simpleCountUnit","symbol","scaler","scaledDecimals","stringFormater","buildFormats","getCategories","cat","formats","fn","fmt","sub","toDateTimeValueFormatter","getOffsetFromSIPrefix","SIPrefix","currency","getValueFormatterIndex","getValueFormats","submenu","AppendedVectors","startAt","setLength","sources","src","capacity","tail","getAddFunction","setCapacity","setAppendMode","Symbol","iterator","vectorator","predicate","vector","FormattedVector","formatter","IndexVector","Components","TimePicker","openButton","fromField","toField","applyTimeRange","calendar","closeButton","absoluteTimeRangeTitle","DataSource","TestData","QueryTab","scenarioSelectContainer","scenarioSelect","noise","seriesCount","spread","startValue","drop","DataSourceHttpSettings","urlInput","Jaeger","traceIDInput","Prometheus","configPage","exemplarsAddButton","internalLinkSwitch","exemplarMarker","Menu","MenuComponent","MenuGroup","MenuItem","SubMenu","container","Panels","Panel","headerItems","containerByTitle","headerCornerInfo","Visualization","Graph","VisualizationTab","legendSection","Legend","legendItemAlias","showLegendSwitch","xAxis","BarGauge","valueV2","PieChart","svgSlice","Text","Table","header","footer","VizLegend","Drawer","General","expand","contract","close","rcContentWrapper","PanelEditor","content","OptionsPane","select","fieldLabel","DataPane","applyButton","toggleVizPicker","toggleVizOptions","toggleTableView","PanelInspector","Data","Stats","Json","Query","refreshButton","jsonObjectKeys","Tab","RefreshPicker","runButton","intervalButton","runButtonV2","intervalButtonV2","queryInspectorButton","queryHistoryButton","addQuery","QueryHistory","queryText","QueryEditorRows","QueryEditorRow","actionButton","AlertTab","Alert","alert","severity","alertV2","TransformTab","newTransform","transformationEditor","transformationEditorDebugger","Transforms","card","Reduce","modeLabel","calculationsLabel","searchInput","PageToolbar","QueryEditorToolbarItem","button","BackButton","backArrow","OptionsGroup","toggle","PluginVisualization","Select","singleValue","FieldConfigEditor","OverridesConfigEditor","FolderPicker","containerV2","ReadonlyFolderPicker","DataSourcePicker","inputV2","TimeZonePicker","WeekStartPicker","placeholder","TraceViewer","spanBar","QueryField","QueryBuilder","queryPatterns","labelSelect","valueSelect","matchOperatorSelect","ValuePicker","Search","sectionV2","items","itemsV2","cards","collapseFolder","sectionId","expandFolder","dashboardItem","dashboardItems","dashboardCard","DashboardLinks","dropDown","LoadingIndicator","CallToActionCard","buttonV2","DataLinksContextMenu","singleLink","CodeEditor","DashboardImportPage","textarea","submit","ImportDashboardForm","PanelAlertTabContent","VisualizationPreview","ColorSwatch","DashboardRow","UserProfile","profileSaveButton","preferencesSaveButton","orgsTable","sessionsTable","FileUpload","inputField","fileNameSpan","selectors","pages","Login","username","password","skip","Home","readOnly","saveAndTest","DataSources","dataSources","dataSourceName","AddDataSource","dataSourcePlugins","dataSourcePluginsV2","ConfirmModal","AddDashboard","addNewPanel","addNewRow","addNewPanelLibrary","Dashboard","DashNav","nav","navV2","publicDashboardTag","submenuItem","submenuItemLabels","submenuItemValueDropDownValueLinkTexts","submenuItemValueDropDownDropDown","submenuItemValueDropDownOptionTexts","Settings","deleteDashBoard","sectionItems","saveDashBoard","saveAsDashBoard","Annotations","List","addAnnotationCTA","addAnnotationCTAV2","Variables","addVariableCTA","addVariableCTAV2","newButton","tableRowNameFields","variableName","tableRowDefinitionFields","tableRowArrowUpButtons","tableRowArrowDownButtons","tableRowDuplicateButtons","tableRowRemoveButtons","Edit","headerLink","modeLabelNew","modeLabelEdit","generalNameInput","generalNameInputV2","generalTypeSelect","generalTypeSelectV2","generalLabelInput","generalLabelInputV2","generalHideSelect","generalHideSelectV2","selectionOptionsMultiSwitch","selectionOptionsIncludeAllSwitch","selectionOptionsCustomAllInput","selectionOptionsCustomAllInputV2","previewOfValuesOption","submitButton","QueryVariable","queryOptionsDataSourceSelect","queryOptionsRefreshSelect","queryOptionsRefreshSelectV2","queryOptionsRegExInput","queryOptionsRegExInputV2","queryOptionsSortSelect","queryOptionsSortSelectV2","queryOptionsQueryInput","valueGroupsTagsEnabledSwitch","valueGroupsTagsTagsQueryInput","valueGroupsTagsTagsValuesQueryInput","ConstantVariable","constantOptionsQueryInput","constantOptionsQueryInputV2","DatasourceVariable","datasourceSelect","TextBoxVariable","textBoxOptionsQueryInput","textBoxOptionsQueryInputV2","CustomVariable","customValueInput","IntervalVariable","intervalsValueInput","Dashboards","dashboards","SaveDashboardAsModal","save","SaveDashboardModal","saveVariables","saveTimerange","SharePanelModal","linkToRenderedImage","ShareDashboardModal","shareButton","PublicDashboard","WillBePublicCheckbox","LimitedDSCheckbox","CostIncreaseCheckbox","EnableSwitch","SaveConfigButton","CopyUrlInput","CopyUrlButton","TemplateVariablesWarningAlert","Explore","graph","scrollView","SoloPanel","PluginsList","listItem","signatureErrorNotice","PluginPage","signatureInfo","disabledInfo","PlaylistForm","itemRow","itemIdType","itemTagType","itemMoveUp","itemMoveDown","itemDelete","PanelDataErrorView","setPanelDataErrorView","renderer","PanelRenderer","setPanelRenderer","GrafanaBootConfig","systemRequirements","met","requiredImageRendererPluginVersion","thumbnailsExist","enabled","dsn","customEndpoint","sampleRate","apiKey","errorInstrumentalizationEnabled","consoleInstrumentalizationEnabled","webVitalsInstrumentalizationEnabled","managedIdentityEnabled","minInterval","bootData","user","lightTheme","theme2","v1","isPublicDashboardView","datasources","windowTitlePrefix","panels","newPanelTitle","playlist_timespan","unsaved_changes_warning","appUrl","buildInfo","version","commit","env","viewersCanEdit","editorsCanAdmin","dateFormats","featureName","toggleState","featureToggles","overrideFeatureTogglesFromUrl","topnav","grafanaBootData","navTree","MetaAnalyticsEventName","isPageviewEvent","isInteractionEvent","interactionName","isExperimentViewEvent","experimentId","SystemJS","System","loadPluginCss","import","reportMetaAnalytics","getEchoSrv","addEvent","EchoEventType","reportPageview","locationService","hash","reportInteraction","reportExperimentView","variant","experimentGroup","experimentVariant","featureEnabled","feature","enabledFeatures","logInfo","contexts","agent","GrafanaLogLevel","captureMessage","logWarning","logDebug","logError","captureException","factory","setQueryRunnerFactory","instance","createQueryRunner","PureComponent","getDataSourceSrv","actionMeta","action","onClear","dsSettings","dataSourceSrv","getInstanceSettings","setState","getCurrentValue","hideTextValue","noDefault","imgUrl","logos","small","hideText","ExpressionDatasourceRef","getDataSourceOptions","alerting","tracing","metrics","mixed","dashboard","logs","isDefault","autoFocus","onBlur","openMenuOnFocus","width","inputId","isClearable","className","isMulti","backspaceRemovesValue","maxMenuHeight","noOptionsMessage","getOptionLabel","o","HorizontalGroup","align","justify","PluginSignatureBadge","status","singletonInstance","setEchoSrv","registerEchoBackend","backend","addBackend","setDataSourceSrv","isFetchError","setBackendSrv","getBackendSrv","setAngularLoader","getAngularLoader","setLocationSrv","getLocationSrv","setTemplateSrv","getTemplateSrv","singleton","setLegacyAngularInjector","getLegacyAngularInjector","HistoryWrapper","H","basename","bind","getSearch","getHistory","getLocation","currentLocation","newQuery","getSearchObject","updatedUrl","reload","prevState","routeReloadCounter","locationSearchToObject","newLocation","queryString","setLocationService","navigationLog","createLogger","navigationLogger","logger","attachDebugger","RefreshEvent","ThemeChangedEvent","TimeRangeUpdatedEvent","CopyPanelEvent","setAppEvents","getAppEvents","StreamingFrameAction","setGrafanaLiveSrv","getGrafanaLiveSrv","freeze","isExpressionReference","HealthCheckError","details","HealthStatus","DataSourceWithBackend","standardStreamOptionsProvider","request","maxDataPoints","requestId","targets","filterQuery","q","datasourceId","rawRef","applyTemplateVariables","getQueryData","fetch","method","switchMap","rsp","toDataQueryResponse","channel","toStreamingDataResponse","streamOptionsProvider","catchError","interpolateVariablesInQueries","post","showErrorAlert","then","catch","callHealthCheck","OK","req","live","staticdata","streams","getDataStream","rangeRaw","maxDelta","cachedResponseNotice","refIDs","cachedResponse","headers","isCachedResponse","dr","js","notices","df","toDataQueryError","toTestingStatus","queryResponse","frameToMetricFindValue","AxisPlacement","AxisColorMode","VisibilityMode","GraphDrawStyle","GraphTransform","LineInterpolation","ScaleDistribution","GraphGradientMode","StackingMode","BarAlignment","ScaleOrientation","ScaleDirection","GraphTresholdsStyleMode","LegendDisplayMode","BigValueColorMode","BigValueGraphMode","BigValueJustifyMode","BigValueTextMode","TableCellDisplayMode","TooltipDisplayMode","BarGaugeDisplayMode","Auto","getIconFromSeverity","React","onRemove","children","buttonContent","elevated","bottomSpacing","topSpacing","restProps","useTheme2","styles","getStyles","titleId","useId","cx","role","buttonWrapper","shape","css","shadows","typography","Button","fullWidth","otherProps","getButtonStyles","iconOnly","LinkButton","tooltipPlacement","linkButtonStyles","pointerEvents","tabIndex","placement","padding","getPropertiesForButtonSize","variantStyles","getPropertiesForVariant","disabledStyles","cursor","boxShadow","transition","getPropertiesForDisabled","focusStyle","getFocusStyles","paddingMinusBorder","alignItems","verticalAlign","getMouseFocusStyles","flexGrow","justifyContent","img","marginRight","marginLeft","getButtonVariantStyles","transitions","colorManipulator","borderColor","outline","textDecoration","ButtonGroup","forwardRef","rest","useStyles2","ClickOutsideWrapper","createRef","hasEventListener","domNode","myRef","contains","addEventListener","onOutsideClick","useCapture","includeButtonPress","componentWillUnmount","removeEventListener","ColorSwatchVariant","Small","isSelected","ariaLabel","isFocusVisible","focusProps","useFocusRing","hasLabel","colorLabel","swatch","tc","swatchSize","outlineOffset","CustomScrollbar","autoHide","autoHideTimeout","setScrollTop","testId","autoHeightMin","autoHeightMax","hideTracksWhenNotNeeded","hideHorizontalTrack","hideVerticalTrack","scrollRefCallback","updateAfterMountMs","scrollTop","useRef","renderTrack","hideTrack","passedProps","style","useEffect","setTimeout","scrollbar","renderTrackHorizontal","useCallback","renderTrackVertical","renderThumbHorizontal","renderThumbVertical","renderView","onScrollStop","getValues","classNames","customScrollbar","autoHeight","getFieldStyles","stylesFactory","fieldHorizontal","fieldValidationWrapper","fieldValidationWrapperHorizontal","validationMessageHorizontalOverflow","Field","horizontal","loading","required","htmlFor","getChildId","labelElement","childProps","deleteUndefinedProps","getFieldValidationMessageStyles","baseStyle","vertical","fieldValidationMessageIcon","FieldValidationMessage","cssName","getLabelStyles","labelContent","chevron","labelProps","LegacyInputStatus","Input","validationRules","errors","validationEvents","inputElementProps","EventsWithValidation","eventName","hasValidationEvent","async","persist","validatorAsync","Invalid","Valid","isInvalid","hideErrorMessage","inputRef","inputClassName","populateEventPropsWithStatus","IndicatorsContainer","isOpen","selectProps","menuIsOpen","marginTop","NoOptionsMessage","SelectOption","Icon","getOptionValue","isDisabled","isLoading","isSearchable","tooltipContent","tabSelectsValue","onCloseMenu","onOpenMenu","allowCustomValue","formatCreateLabel","widthClass","SelectComponent","ReactSelect","creatableOptions","Creatable","selectClassNames","selectComponents","defaultProps","WrapInTooltip","onOpenMenuInternal","onCloseMenuInternal","captureMenuScroll","classNamePrefix","menuShouldScrollIntoView","resetSelectStyles","onMenuOpen","onMenuClose","ThemeContext","Option","SingleValue","MenuList","Group","SelectOptionGroup","AsyncSelect","loadOptions","loadingMessage","isOpenInternal","showTooltip","Tooltip","show","getFocusStyle","focusCss","sharedInputStyle","borderColorHover","borderHover","textColor","autoFillBorder","isDark","inputPadding","inputSizes","inputSizesPixels","auto","FIXED_UNIT","GraphNG","Subscription","prepState","alignedData","prepData","alignedFrame","plotInstance","withConfig","preparePlotFrame","defaultPreparePlotFrame","pluginLog","prepConfig","getTimeRange","handleCursorUpdate","u","valToPos","top","findMidPointYPosition","posToIdx","setCursor","panelContext","subscription","throttleTime","componentDidUpdate","prevProps","structureRev","propsToDiff","propsChanged","nextProps","propName","sameProps","newState","unsubscribe","renderLegend","legend","vizWidth","vizHeight","plotRef","PanelContextRoot","INSERT_MODES","prev","applyNullInsertThreshold","refFieldName","refFieldPseudoMax","refFieldPseudoMin","insertMode","refField","nullThresholdApplied","insertNulls","uniqueThresholds","refValues","frameValues","filledFieldValues","getInsertValue","thorough","refValuesNew","prevSlot","prevValue","curValue","filledLen","fieldValues","filledValues","nullInsertThreshold","nullToValue","transformedVals","nullToUndefThreshold","maxThreshold","prevRef","isVisibleBarField","drawStyle","hideFrom","viz","dimFields","numBarSeries","minXDelta","some","applySpanNullsThresholds","fi","lastVal","buildScaleKey","defaultPart","scaleRange","scaleSoftRange","axisSoftMin","axisSoftMax","scalePlacement","axisPlacement","scaleUnit","scaleDistribution","getScaleDistributionPart","axisLabel","cacheInitialized","iconRoot","cacheItem","cacheStore","getIconStyles","divElementProps","useTheme","getFontAwesomeIconStyles","grafanaPublicPath","__grafana_public_path__","u1001","u1002","u1003","u1004","u1005","u1006","u1007","u1008","u1009","u1010","u1011","u1012","u1013","u1014","u1015","u1016","u1017","u1018","u1019","u1020","u1021","u1022","u1023","u1024","u1025","u1026","u1027","u1028","u1029","u1030","u1031","u1032","u1033","u1034","u1035","u1036","u1037","u1038","u1039","u1040","u1041","u1042","u1043","u1044","u1045","u1046","u1047","u1048","u1049","u1050","u1051","u1052","u1053","u1054","u1055","u1056","u1057","u1058","u1059","u1060","u1061","u1062","u1063","u1064","u1065","u1066","u1067","u1068","u1069","u1070","u1071","u1072","u1073","u1074","u1075","u1076","u1077","u1078","u1079","u1080","u1081","u1082","u1083","u1084","u1085","u1086","u1087","u1088","u1089","u1090","u1091","u1092","u1093","u1094","u1095","u1096","u1097","u1098","u1099","u1100","u1101","u1102","u1103","u1104","u1105","u1106","u1107","u1108","u1109","u1110","u1111","u1112","u1113","u1114","u1115","u1116","u1117","u1118","u1119","u1120","u1121","u1122","u1123","u1124","u1125","u1126","u1127","u1128","u1129","u1130","u1131","u1132","u1133","u1134","u1135","u1136","u1137","u1138","u1139","u1140","u1141","u1142","u1143","u1144","u1145","u1146","u1147","u1148","u1149","u1150","u1151","u1152","u1153","u1154","u1155","u1156","u1157","u1158","u1159","u1160","u1161","initIconCache","svgSize","getSvgSize","svgHgt","svgWid","subDir","getIconSubDir","svgPath","iconName","alwaysMonoIcons","IconButton","iconType","tooltipString","pixelSize","hoverSize","iconColor","addonAfter","addonBefore","prefixRef","prefixRect","useMeasure","suffixRef","suffixRect","getInputStyles","addon","inputWrapper","paddingLeft","paddingRight","loadingIndicator","inline","prefixSuffixStaticWidth","prefixSuffix","inputDisabled","Orientation","Layout","orientation","Horizontal","wrap","layout","child","childWrapper","VerticalGroup","Vertical","Container","margin","grow","shrink","getContainerStyles","finalSpacing","marginCompensation","paddingSize","marginSize","inlineList","AbstractList","renderItem","getItemKey","UnThemedLogMessageAnsi","ansicolor","accumulated","character","chunkText","highlight","findChunks","highlightClassName","LogMessageAnsi","withTheme2","getLogRowContextStyles","wrapLogMessage","afterContext","beforeContext","commonStyles","bg1","dropdownShadow","bg2","radius","LogRowContextGroupHeader","onLoadMoreContext","canLoadMoreRows","useStyles","LogRowContextGroup","shouldScrollToBottom","useState","listContainerRef","useLayoutEffect","shouldScrollRows","offsetHeight","headerProps","LogRowContext","hasMoreContextRows","handleEscKeyDown","keyCode","document","stopPropagation","MAX_CHARACTERS","renderLogMessage","hasAnsi","highlights","needsHighlighter","restructureLog","memoizeOne","prettifyLogMessage","UnThemedLogRowMessage","onToggleContext","updateLimit","contextIsOpen","getLogRowStyles","logLevel","restructuredEntry","outlineColor","setAlpha","positionRelative","rowWithContext","horizontalScroll","contextNewline","position","logsRowMessage","logsRowMatchHighLight","onContextToggle","LogRowMessage","logColor","isLight","gray5","gray2","hoverBgColor","styleMixins","textHighlight","logsRowsTable","logsRow","logsRowDuplicates","logsRowLevel","logIconError","logsRowToggleDetails","logsRowLocalTime","logsRowLabels","logDetailsContainer","logDetailsTable","logsDetailsIcon","gray3","logDetailsLabel","logDetailsHeading","logDetailsValue","FieldNamePicker","useFieldDisplayNames","selectOptions","useSelectOptions","onSelectChange","selection","frameHasName","selectedOption","placeholderText","noFieldsMessage","useMemo","getFrameFieldsDisplayNames","displayNames","currentName","firstItem","fieldType","found","getFieldTypeIcon","getModalStyles","overlay","modalHeader","modalHeaderWithTabs","modalHeaderTitle","modalHeaderIcon","modalHeaderClose","modalContent","modalButtonRow","onCancel","clickable","PanelContextProvider","Provider","usePanelContext","Portal","forwardedRef","node","portalRoot","getPortalContainer","createElement","appendChild","removeChild","ReactDOM","getElementById","PortalContainer","DropdownIndicator","getInputControlStyles","withPrefix","InputControl","innerProps","MultiValueContainer","getSelectStyles","multiValueContainer","MultiValueRemove","multiValueRemove","SelectContainer","isFocused","getSelectContainerStyles","focused","SelectMenu","maxHeight","innerRef","menu","SelectMenuOptions","renderOptionLabel","optionFocused","optionSelected","optionDisabled","optionIcon","optionImage","alt","optionBody","optionDescription","UnthemedValueContainer","maxVisibleValues","showAllSelectedWhenOpen","valueChildren","otherChildren","truncatedValues","renderContainer","valueContainer","valueContainerMulti","ValueContainer","findSelectedValue","CustomControl","renderControl","SelectBase","allowCreateWhileLoading","cacheOptions","closeMenuOnSelect","filterOption","inputValue","isOptionDisabled","minMenuHeight","menuPlacement","menuPosition","menuShouldPortal","onCreateOption","onInputChange","onKeyDown","onFocus","isValidNewOption","formatOptionLabel","reactSelectRef","closeToBottom","setCloseToBottom","selectStyles","useCustomSelectStyles","controlRef","distance","innerHeight","getBoundingClientRect","bottom","onChangeWithEmpty","ReactSelectComponent","creatableProps","selectedValue","asyncSelectProps","hasValue","filtered","cleanValue","commonSelectProps","menuShouldBlockScroll","menuPortalTarget","defaultFormatCreateLabel","AsyncCreatable","ReactAsyncSelect","selectedValuesCount","indicatorChildren","renderExtraValuesIndicator","IndicatorSeparator","Control","ClearIndicator","clearValue","singleValueRemove","onMouseDown","preventDefault","Spinner","LoadingMessage","gap","MultiSelect","AsyncMultiSelect","getSelectOptionGroupStyles","textStrong","UnthemedSelectOptionGroup","expanded","onToggleChildren","withTheme","spinnerWrapper","spinnerIcon","delayedValue","setDelayedValue","onStartTime","timeout","timeSpent","turnOff","clearTimeout","useDelayedSwitch","FadeWithImage","SlideOutTransition","visible","FadeTransition","clearIndicator","control","dropdownIndicator","groupHeading","indicatorsContainer","indicatorSeparator","originalStyles","menuList","multiValue","multiValueLabel","menuPortal","minWidth","provided","opacity","isHorizontal","hasMarks","railColor","trackColor","handleColor","blueOpacity","hoverSyle","slider","cssCore","sliderInput","sliderInputVertical","sliderInputField","sliderInputFieldVertical","iconClassName","TableCell","cell","tableStyles","onCellFilterAdded","columnIndex","columnCount","userProps","cellProps","getCellProps","innerWidth","cellPadding","lastChildExtraPadding","getTableStyles","headerBg","resizerColor","cellHeight","rowHoverBg","getScrollbarWidth","buildCellContainerStyle","overflowOnHover","cellActionsOverflow","onHoverOverflow","overflow","cellHeightInner","rowHeight","thead","tfoot","headerCell","headerCellLabel","cellContainer","cellContainerNoOverflow","cellText","cellLink","imageCellLink","headerFilter","paginationWrapper","paginationItem","paginationCenterItem","paginationSummary","tableContentWrapper","totalColumnsWidth","imageCell","resizeHandle","typeIcon","noData","FILTER_FOR_OPERATOR","FILTER_OUT_OPERATOR","counter","Counter","onChangeTab","Suffix","tabsStyles","getTabStyles","linkClass","activeStyle","notActive","gradients","PopoverController","hideTimeout","hideAfter","showPopper","hidePopper","interactive","getArrowProps","getTooltipProps","setTooltipRef","setTriggerRef","usePopperTooltip","delayHide","delayShow","trigger","containerStyle","updatePopperPosition","buildTooltipTheme","tooltipBg","tooltipBorder","tooltipText","PartialHighlighter","highlightParts","indices","getStartIndices","highlighted","VizLayout","getVizStyles","legendRef","legendMeasure","maxWidth","legendStyle","flexDirection","SeriesIcon","gradient","cssColor","VizTooltipContainer","positionX","positionY","offsetX","offsetY","allowPointerEvents","tooltipRef","tooltipMeasurement","setTooltipMeasurement","useWindowSize","setPlacement","resizeObserver","ResizeObserver","tW","contentRect","tH","observe","disconnect","xPos","yPos","tooltipWidth","tooltipHeight","xOffset","yOffset","windowWidth","windowHeight","overflowRight","overflowLeft","wouldOverflowRight","wouldOverflowLeft","overflowBelow","overflowAbove","wouldOverflowBelow","wouldOverflowAbove","calculateTooltipPosition","getTooltipContainerStyles","VizTooltip","getSeriesTableRowStyles","seriesTable","seriesTableRow","seriesTableCell","activeSeries","SeriesTableRow","isActive","SeriesTable","InlineFormLabel","classes","FormField","labelWidth","inputWidth","inputEl","inputProps","formField","Switch","uniqueId","labelClass","switchClass","labelId","labelClassName","switchClassName","internalOnChange","SecretFormField","onReset","isConfigured","noRadiusInput","noRadiusButton","omit","UnThemedConfirmButton","showConfirm","confirmButtonRef","mainButtonRef","onConfirm","closeOnConfirm","confirmText","confirmVariant","confirmButtonVariant","buttonClass","buttonHide","buttonShow","buttonDisabled","confirmButtonClass","confirmButton","confirmButtonShow","confirmButtonHide","onClickButton","buttonContainer","onClickCancel","ConfirmButton","DeleteButton","defaultTransitionStyles","transitionProperty","transitionDuration","transitionTimingFunction","transitionStyles","exited","entering","entered","transitionDelay","exiting","Popover","onMouseEnter","onMouseLeave","wrapperClassName","renderArrow","referenceElement","Manager","Transition","in","mountOnEnter","unmountOnExit","transitionState","modifiers","rootBoundary","scroll","resize","arrowProps","tabContent","menuTabs","tabs","TabbedContainer","activeTab","setActiveTab","defaultTab","onClose","closeIconTooltip","TabsBar","TabContent","InlineToast","suffixIcon","indicatorElement","setIndicatorElement","popper","usePopper","placementStyles","getPlacementStyles","attributes","willChange","createAnimation","fromX","fromY","keyframes","placementTopAnimation","placementBottomAnimation","placementLeftAnimation","placementRightAnimation","marginBottom","animation","ClipboardButton","onClipboardCopy","onClipboardError","getText","buttonProps","showCopySuccess","setShowCopySuccess","timeoutId","buttonRef","copyTextCallback","textToCopy","copyText","successButton","successOverlay","clipboard","isSecureContext","writeText","execCommand","remove","visibility","onChangeCascader","onChanged","fromRCOptions","fromRCOption","disableDivFocus","Cascader","optionPath","cpy","flattenOptions","singleLabel","separator","selectedOptions","activeLabel","hideActiveLevelLabel","displayAllSelectedLevels","rcValue","focusCascade","onSelect","valueArray","isSearching","searchableOptions","getSearchableOptions","setInitialValue","initialValue","initValue","changeOnSelect","onSelectInputChange","fieldNames","expandIcon","open","alwaysOpen","I","onBlurCascade","onInputKeyDown","popup","icons","ButtonCascader","loadData","hideDownIcon","onLoadData","dropdownClassName","LoadingPlaceholder","reverseMap","callbackfn","reversedAndMapped","reverseIndex","selectedColor","onColorSelect","upperFirst","colorRow","swatchRow","NamedColorsPalette","swatches","extraColors","ColorInput","setValue","previousColor","setPreviousColor","updateColor","debounce","newColor","colorValue","ColorPreview","getColorPreviewStyles","colorInput","currentColor","setColor","useThrottleFn","rgbaString","UnThemedColorPickerPopover","tabName","activePicker","enableNamedColors","handleChange","renderCustomPicker","tabKey","customPickers","tabComponent","getTabClassName","onTabChange","contain","restoreFocus","colorPickerPopover","colorPickerPopoverTabs","renderCustomPickerTabs","colorPickerPopoverContent","renderPicker","ColorPickerPopover","SeriesColorPickerPopover","yaxis","onToggleAxis","colorPickerProps","colorPickerAxisSwitch","colorPickerAxisSwitchLabel","SeriesColorPickerPopoverWithTheme","colorPickerFactory","popover","Component","popoverElement","popperProps","pickerTriggerRef","colorPicker","closePopover","showColorPicker","hideColorPicker","ColorPicker","SeriesColorPicker","ColorPickerInput","returnColorAs","setIsOpen","paletteStyles","getPaletteStyles","picker","inner","EmptySearchResult","UnitPicker","groupOptions","sel","StatsPicker","allowMultiple","defaultStat","notFound","difference","checkInput","onSelectionChange","divider","backgroundColor","labelID","groupLabel","modulo","useMenuFocus","localRef","isMenuOpen","openedWithArrow","setOpenedWithArrow","onOpen","focusedItem","setFocusedItem","menuItems","querySelectorAll","menuItem","useEffectOnce","firstMenuItem","querySelector","menuItemsCount","click","handleKeys","iconWrapper","subMenu","itemsWrapper","element","wrapperPos","parentElement","getPosition","ariaChecked","destructive","childItems","setIsActive","isSubMenuOpen","setIsSubMenuOpen","hasSubMenu","ItemElement","itemStyle","useImperativeHandle","rel","ctrlKey","metaKey","shiftKey","MenuComp","handleFocus","assign","Item","Divider","ToolbarButton","imgSrc","imgAlt","narrow","isHighlighted","buttonStyles","buttonFullWidth","contentStyles","contentWithIcon","contentWithRightIcon","getButtonAriaLabel","renderIcon","primaryVariant","destructiveVariant","defaultOld","defaultTopNav","orangeDark","breakpoints","ToolbarButtonRow","ButtonSelectComponent","useMenuTriggerState","menuTriggerProps","menuProps","useMenuTrigger","useButton","menuWrapper","onChangeInternal","ButtonSelect","defaultIntervals","onIntervalChanged","getVariant","isLive","onRefresh","intervals","noIntervalPicker","offOptionLabelMsg","offOptionAriaLabelMsg","offDescriptionAriaLabelMsg","onDescriptionAriaLabelMsg","currentValue","translatedOffOption","offOption","formatDuration","intervalsToOptions","durationAriaLabel","onChangeSelect","refreshInterval","liveOption","TimeZoneGroup","border1","textWeak","weight","semibold","TimeZoneOffset","formatUtcOffset","textBase","TimeZoneDescription","useDescription","country","TimeZoneTitle","regular","offsetClassName","WideTimeZoneOption","containerStyles","containerFocused","timeZoneInfo","leftColumn","wideRow","spacer","rightColumn","CompactTimeZoneOption","groupedTimeZones","useTimeZones","useSelectedTimeZone","filterBySearchIndex","useFilterBySearchIndex","TimeZoneOption","onChangeTz","selectable","searchIndex","getSearchIndex","toLower","isInternal","searchQuery","quickOptions","monthOptions","TimePickerFooter","onChangeTimeZone","onChangeFiscalYearStartMonth","isEditing","setEditing","editMode","setEditMode","onToggleChangeTimeSettings","getStyle","timeZoneContainer","editContainer","RadioButtonGroup","timeSettingContainer","fiscalYearField","formLabel","TimePickerTitle","memo","Body","invalidDateDefault","fromAsDate","toDate","toAsDate","fromAsValidDate","toAsValidDate","inputToValue","onCalendarChange","dateInfo","useOnCalendarChange","getBodyStyles","selectRange","next2Label","prev2Label","tileClassName","nextLabel","prevLabel","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","Footer","onApply","getFooterStyles","Header","getHeaderStyles","isReversed","backdrop","TimePickerCalendar","isFullscreen","dialogProps","useDialog","overlayProps","useOverlay","isDismissable","ERROR_MESSAGES","TimeRangeForm","onApplyFromProps","fromValue","toValue","valueToState","setFrom","setTo","setOpen","rangeUtil","fiscalYear","fyTooltip","fieldContainer","rawFrom","rawTo","valueAsString","fromInvalid","toInvalid","rangeInvalid","isSame","isBefore","isRangeInvalid","radio","TimeRangeOption","uuidv4","getOptionsStyles","TimeRangeList","placeholderEmpty","Options","isEqual","keyForOption","mapOptionToTimeRange","TimePickerContentWithScreenSize","hideQuickRanges","showHistory","hideTimeZone","isHistoryEmpty","isContainerTall","historyOptions","ranges","mapRangeToTimeOption","mapToHistoryOptions","timeOption","useTimeOption","searchTerm","setSearchQuery","filteredQuickOptions","rightSide","timeRangeFilter","FilterInput","NarrowScreenForm","leftSide","FullScreenForm","TimePickerContent","widthOverride","getNarrowScreenStyles","isAbsolute","collapsedFlag","setCollapsedFlag","collapsed","expandButton","form","getFullScreenStyles","recent","EmptyRecentList","getEmptyListStyles","ZoomOutTooltip","TimePickerTooltip","TimePickerButtonLabel","formattedRange","adjustedTimeRange","TimeRangePicker","onMoveBackward","onMoveForward","onZoom","timeSyncButton","isSynced","hasAbsolute","TimeOfDayPicker","minuteStep","showHour","showSeconds","popupClassName","allowEmpty","showSecond","inputIcon","Caret","wrapperStyle","caretWrapper","bgColor","formInputBg","menuShadowColor","optionBgHover","dropdownOptionHoverBg","formInputBorder","formInputHeight","formInputBgDisabled","formInputDisabledText","weekStarts","onChangeWeekStart","DatePicker","minDate","ev","DatePickerWithInput","closeOnSelect","autoComplete","DateTimePicker","maxDate","useMedia","getCalendarStyles","DateTimeInput","DateTimeCalendar","internalDate","setInternalDate","onChangeDate","InlineField","calendarStyles","setHours","setMinutes","setSeconds","onChangeTime","fullScreen","nextAriaLabel","prevAriaLabel","getTagColorsFromName","nameStyle","TagItem","TagsInput","addOnBlur","newTagName","setNewName","tagToRemove","onAdd","tag","onKeyUp","addButtonStyle","Pagination","currentPage","numberOfPages","onNavigate","hideWhenSinglePage","showSmallVersion","pageLengthToCondense","pageButtons","condensePages","getListItem","pagesToRender","pageIndex","lowerBoundIndex","upperBoundIndex","differenceOfBounds","currentPageIsBetweenBounds","ellipsisOffset","pageOffset","ellipsis","Tag","colorIndex","getTagStyles","getTagColor","gray98","TagList","displayMax","getAriaLabel","numTags","tagsToDisplay","li","moreTagsLabel","isTruncated","listStyle","FilterPill","ModalHeader","iconTooltip","Modal","closeOnEscape","closeOnBackdropClick","contentClassName","onDismiss","onClickBackdrop","trapFocus","underlayProps","isKeyboardDismissDisabled","titleProps","headerClass","DefaultModalHeader","ButtonRow","leftItems","confirmationText","dismissText","alternativeText","onAlternative","setDisabled","modalText","modalDescription","modalConfirmationInput","localeCompare","paddingTop","UnThemedQueryField","runQuery","documentChanged","onRichValueChange","textChanged","Plain","runOnChangeAndRunQuery","runOnChangeDebounced","cleanText","onRunQuery","lastExecutedValue","runOnChange","runOnRunQuery","onTypeahead","portalOrigin","onWillApplySuggestion","plugins","SuggestionsPlugin","RunnerPlugin","NewlinePlugin","ClearPlugin","SelectionShortcutsPlugin","IndentationPlugin","ClipboardPlugin","additionalPlugins","suggestions","typeaheadContext","typeaheadPrefix","typeaheadText","makeValue","syntax","mounted","syntaxLoaded","insertText","deleteBackward","classnames","SCHEMA","autoCorrect","handleBlur","change","spellCheck","focusStyles","ReactMonacoEditorLazy","dependency","importStatement","useAsync","useAsyncDependency","ErrorWithStack","errorInfo","componentStack","stack","ReactMonacoEditor","CodeEditorSuggestionItemKind","getCompletionItems","monaco","suggestion","kind","mapKinds","sug","Method","CompletionItemKind","Property","Constant","registerSuggestions","getSuggestions","registerCompletionItemProvider","triggerCharacters","provideCompletionItems","model","startLineNumber","lineNumber","endLineNumber","startColumn","endColumn","triggerCharacter","currentLine","getValueInRange","ch","findInsertIndex","UnthemedCodeEditor","customLanguage","Promise","resolve","getEditorValue","onSave","onBeforeEditorMount","completionCancel","onEditorDidMount","addCommand","KeyMod","CtrlCmd","KeyCode","KeyS","languagePromise","loadCustomLanguage","dispose","oldProps","newLanguage","showMiniMap","showLineNumbers","monacoOptions","longText","wordWrap","tabSize","codeLens","contextmenu","minimap","renderCharacters","lineNumbersMinChars","lineDecorationsWidth","overviewRulerBorder","automaticLayout","fixedOverflowWidgets","glyphMargin","folding","lineNumbers","beforeMount","handleBeforeMount","onMount","handleOnMount","variableSuggestionToCodeEditorSuggestion","detail","documentation","getTabsBarStyles","hideBorder","tabsWrapper","ModalTabsHeader","tabSuffix","ModalTabContent","ModalsContext","showModal","hideModal","ModalsProvider","ModalRoot","Consumer","ModalsController","pageIcon","onGoBack","titleHref","parentHref","mainStyle","toolbar","titleEl","noLinkTitle","pre","leftWrapper","navElement","Link","titleText","parentLink","titleLink","parentIcon","titleDivider","titleWrapper","h1Styles","leftActionItem","actionWrapper","SetInterval","propsSubject","Subject","NEVER","tap","func","EmptyCell","FooterRow","footerGroups","isPaginationVisible","e2eSelectorsTable","footerGroup","getFooterGroupProps","footerGroupProps","footerProps","getHeaderProps","renderFooterCell","getFooterValue","footerValues","FooterCell","FilterList","caseSensitive","searchFilter","setSearchFilter","gutter","ITEM_HEIGHT","onCheckedChanged","newValues","itemCount","itemSize","filterList","isChecked","filterListRow","Checkbox","FormattedValueDisplay","htmlProps","hasPrefix","hasSuffix","suffixStyle","reductionFactor","fontSizeReductionFactor","TITLE_LINE_HEIGHT","wrapperStyles","titleDim","calculateTitleDimensions","titleStyles","whiteSpace","textOverflow","alignSelf","isVertical","textAlign","getTitleStyles","renderBarAndValue","displayMode","renderRetroBars","renderBasicAndGradientBars","showUnfilled","alignmentFactors","valueWidth","valueHeight","maxBarHeight","maxBarWidth","calculateBarAndValueDimensions","minValue","maxValue","valuePercent","getValuePercent","valueColor","getValueColor","valueStyles","getValueStyles","isBasic","barStyles","emptyBar","barHeight","borderTop","getBarGradient","barWidth","borderRight","bar","getBasicAndGradientStyles","itemSpacing","lcdCellWidth","wrapperWidth","wrapperHeight","isVert","valueRange","maxSize","cellSpacing","cellCount","cellSize","cells","cellColor","getCellColor","cellStyles","isLit","backgroundImage","backgroundShade","titleSize","maxTitleHeightRatio","titleHeight","titleFontSize","textSize","measureText","textWidth","valueString","fontSizeToMeasureWith","valueSize","realValueWidth","VALUE_LEFT_PADDING","positionValue","valueRatio","cssDirection","lastpos","thresholdValue","scheme","formattedValueString","calculateFontSize","Gradient","ContextMenu","focusOnOpen","renderMenuItems","renderHeader","menuRef","positionStyles","setPositionStyles","menuElement","rect","OFFSET","collisions","useClickAway","WithContextMenu","setIsMenuOpen","setMenuPosition","openMenu","pageX","pageY","itemsGroup","linkModelToContextMenuItems","linksCounter","renderMenuGroupItems","targetClassName","linkModel","defaultScale","BarGaugeCell","barGaugeMode","Lcd","Basic","isFunction","api","renderComponent","TableCellInspectModal","CellActions","previewMode","isInspecting","setIsInspecting","isRightAligned","getTextAlign","showFilters","inspectEnabled","inspect","commonButtonProps","onFilterFor","onFilterOut","DefaultCell","showActions","cellStyle","disableOverflowOnHover","getTextColorForBackground","themeFactor","bgColor2","spin","getCellStyle","getCellLinks","GeoCell","Geometry","WKT","writeGeometry","featureProjection","dataProjection","ImageCell","JSONViewCell","txt","getCellComponent","filterByValue","filterValues","rowToFieldValue","fieldValue","sortOptions","sortCaseInsensitive","sortNumber","rowA","rowB","FilterPopup","preFilteredRows","filterValue","setFilter","calculateUniqueFieldValues","valuesToOptions","filteredOptions","getFilteredOptions","setValues","matchCase","setMatchCase","onFilter","onClearFilter","clearFilterVisible","filterContainer","listDivider","border2","Filter","isPopoverVisible","setPopoverVisible","filterEnabled","onShowPopover","onClosePopover","filterIconEnabled","filterIconDisabled","textBlue","textFaint","HeaderRow","headerGroups","showTypeIcons","headerGroup","getHeaderGroupProps","headerGroupProps","canResize","userSelect","isResizing","canSort","getSortByToggleProps","isSorted","isSortedDesc","canFilter","getResizerProps","renderHeaderCell","COLUMN_MIN_WIDTH","getInitialState","initialSortBy","col","desc","columnMinWidth","noHeader","resizable","enablePagination","headerHeight","footerHeight","fv","memoizedData","memoizedColumns","availableWidth","fieldCountWithoutWidth","fieldTableOptions","selectSortType","Cell","accessor","sortType","sharedWidth","getColumns","stateReducer","onColumnResize","onSortByChange","columnIdString","columnResizing","headerIdWidths","columnWidths","fieldDisplayName","sortByFields","sortItem","useTableStateReducer","disableResizing","initialState","autoResetFilters","sortTypes","getTableProps","prepareRow","gotoPage","setPageSize","pageOptions","useTable","useFilters","useSortBy","usePagination","useAbsoluteLayout","useResizeColumns","listHeight","pageSize","RenderRow","getRowProps","toPage","paginationEl","itemsRangeStart","itemsRangeEnd","isSmall","TextArea","getTextAreaStyle","UnThemedTableInputCSV","onSeriesParsed","tableInputCsv","onTextChange","TableInputCSV","online","VerticalTab","getTabContentStyle","makeDirectionalGradient","direction","bbox","ctx","x0","y0","x1","y1","GradientDirection","Down","Left","Up","Right","createLinearGradient","builders","scaleGradient","scaleKey","scaleStops","discrete","scales","minStopIdx","maxStopIdx","stopVal","minStopVal","maxStopVal","minStopPos","maxStopPos","ori","prevColor","getCanvasContext","grd","pct","addColorStop","getGradientRange","hardMin","hardMax","softMin","softMax","dataMin","dataMax","plot","sc","ser","seriesIdx","getDataRange","getScaleGradientFn","colorMode","UPlotSeriesBuilder","PlotConfigBuilder","getConfig","facets","pathBuilder","pointsBuilder","pointsFilter","lineInterpolation","lineWidth","lineStyle","barAlignment","barWidthFactor","barMaxWidth","showPoints","pointSize","pxAlign","lineConfig","lineColor","getLineColor","stroke","paths","cap","dash","self","idx0","idx1","pathsBuilder","pathBuilders","uPlot","linear","smooth","spline","stepBefore","stepped","stepAfter","barsCfgKey","bars","mapDrawStyleToPathBuilder","useColor","_stroke","pointsConfig","spanGaps","getFill","gradientMode","dynamicSeriesColor","fillColor","fillOpacity","opacityPercent","color1","color2","getHueGradientFn","cursorDefaults","drag","setScale","prox","UPlotConfigBuilder","ts","addHook","hook","hooks","addThresholds","addLines","xMin","xMax","yScaleKey","transparentIndex","beginPath","moveTo","lineTo","strokeStyle","addAreas","fillStyle","fillRect","yMin","yMax","restore","getThresholdsDrawHook","addAxis","grid","axes","hasLeftAxis","UPlotAxisBuilder","getAxisPlacement","axis","setMode","setSelect","addSeries","getSeries","addScale","UPlotScaleBuilder","addBand","band","bands","setStackingGroups","stackingGroups","getStackingGroups","setTooltipInterpolator","tooltipInterpolator","getTooltipInterpolator","setPrepData","setSync","sync","hasSync","setPadding","ensureNonOverlappingAxes","pointColorFn","alphaHex","idxs","tzDate","getStackingBands","axesWithoutGridSet","firstValueAxisIdx","yFieldConfig","defaultConfig","Sparkline","alignedDataFrame","preparePlotData2","configBuilder","prepareConfig","rebuildConfig","getYRange","isTime","customConfig","seriesColor","pointsMode","LINE_HEIGHT","BigValueLayout","panelPadding","textValues","textMode","titleToAlignTo","valueToAlignTo","Value","Name","None","ValueAndName","getTextValues","justifyCenter","justifyMode","Center","shouldJustifyCenter","valueFontSize","chartHeight","chartWidth","maxTextWidth","maxTextHeight","Background","getValueAndTitleContainerStyles","getPanelStyles","panelStyles","bgColor3","renderChart","brighten","getChartStyles","WideNoChartLayout","valueWidthPercent","WideWithChartLayout","StackedWithChartLayout","StackedWithNoChartLayout","BigValue","buildLayout","valueAndTitleContainerStyles","DEFAULT_THRESHOLDS","calculateGaugeAutoProps","showLabel","availableHeight","gaugeHeight","getFormattedThresholds","isPercent","Gauge","autoProps","canvasElement","draw","showThresholdLabels","showThresholdMarkers","gaugeWidthReduceRatio","gaugeWidth","thresholdMarkersWidth","thresholdLabelFontSize","gauges","gauge","shadow","thresholdWidth","vMargin","font","family","sansSerif","plotSeries","$","renderVisualization","GraphContextMenu","getContextMenuSource","contextDimensions","itemsToRender","yAxis","valueFromDimensions","formattedValue","datapoint","GraphContextMenuHeader","findHoverIndexFromData","xAxisDimension","middle","lower","upper","xPosition","graphTickFormatter","epoch","timeformat","graphTimeFormat","ticks","secPerTick","oneDay","oneYear","MultiModeGraphTooltip","activeDimensions","activeSeriesIndex","hoverInfo","yAxisDimensions","xAxisDimensions","xAxisPosition","hoverIndex","hoverDistance","pointTime","minDistance","minTime","datapointIndex","getMultiSeriesGraphHoverInfo","SingleModeGraphTooltip","processedTime","GraphTooltip","isTooltipVisible","isContextVisible","onHorizontalRegionSelected","xaxis","activeItem","contextPos","contextItem","tooltipElement","tooltipElementProps","tooltipMode","tooltipContentRenderer","tooltipComponent","dataIndex","tooltipContentProps","contextContentProps","$element","onPlotSelected","onPlotHover","onPlotClick","getYAxes","uniqBy","tickDecimals","yAxisConfig","showLines","showBars","isStacked","yaxes","flotOptions","zero","getBarWidth","shadowSize","tickFormatter","minBorderMargin","markings","borderWidth","hoverable","labelMarginX","mouseActiveRadius","crosshair","isVisible","noDataToBeDisplayed","renderTooltip","renderContextMenu","ErrorIndicator","red88","PanelChrome","getHeaderHeight","contentStyle","getContentStyle","headerStyles","headerTitle","itemsRenderer","toRender","chromePadding","SeriesVisibilityChangeMode","PanelChromeComponent","InlineList","VizLegendSeriesIcon","readonly","onSeriesColorChange","VizLegendStatsList","capitalize","VizLegendListItem","onLabelClick","onLabelMouseEnter","onLabelMouseOut","onMouseOut","itemWrapper","itemDisabled","getDisplayValues","linkDisabled","yAxisLabel","VizLegendList","itemRenderer","itemRight","rightWrapper","itemBottom","bottomWrapper","sectionRight","itemStyles","LegendTableItem","labelDisabled","VizLegendTable","sortKey","sortDesc","onToggleSort","sortedItems","orderBy","columnTitle","headerSortable","withIcon","SeriesVisibilityChangeBehavior","seriesVisibilityChangeBehavior","Isolate","onToggleSeriesVisibility","onToggleLegendSort","dataId","onLegendLabelClick","Hide","AppendToSelection","ToggleSelection","mapMouseEventToMode","getGraphWithLegendStyles","graphContainer","legendContainer","GraphWithLegend","sortLegendBy","sortLegendDesc","legendDisplayMode","legendVisibility","onSeriesToggle","hideEmpty","hideZero","legendItems","isZeroOnlySeries","isNullOnlySeries","shouldHideLegendItem","calculateSizeOfChild","parentWidth","parentHeight","numberOfChildren","sqrt","VizRepeater","renderCounter","getOrientation","renderGrid","renderValue","getAlignmentFactors","square","xCount","yCount","itemsOnLastRow","widthOnLastRow","calculateGridDimensions","xGrid","yGrid","itemWidth","itemHeight","autoGrid","minVizWidth","minVizHeight","repeaterStyle","resolvedOrientation","getItemStylesForIndex","GraphSeriesToggler","hiddenSeries","toggledSeries","onHiddenSeriesChanged","newHiddenSeries","allSeriesLabels","collapse","collapseBody","bodyContentWrapper","loader","loaderActive","headerCollapsed","headerLabel","ControlledCollapse","onToggle","Collapse","collapsible","panelClass","loaderClass","CollapsableSection","toggleOpen","collapsableSectionStyles","HTMLElement","tagName","buttonLabelId","spinner","boxSizing","HIDDEN_LABELS","logsLabels","logsLabel","logsLabelValue","LogLabels","displayLabels","DataLinkButton","logsStatsRow","logsStatsRowActive","logsStatsRowLabel","logsStatsRowValue","logsStatsRowCount","logsStatsRowPercent","logsStatsRowBar","logsStatsRowInnerBar","bgBlue1","LogLabelStatsRow","barStyle","logsStats","logsStatsHeader","logsStatsTitle","logsStatsClose","logsStatsBody","UnThemedLogLabelStats","isLabel","topRows","activeRow","otherRows","insertActiveRow","otherCount","sum","total","otherProportion","LogLabelStats","UnThemedLogDetailsRow","showFieldsStats","fieldStats","mouseOver","onClickShowDetectedField","parsedKey","onClickHideDetectedField","onClickFilterLabel","parsedValue","onClickFilterOutLabel","getStats","toggleFieldsStats","hoverValueCopy","showDetectedFields","noHoverBackground","hoverCursor","wordBreakAll","showingField","wrapLine","hasDetectedFieldsFunctionality","hasFilteringFunctionality","toggleFieldButton","hideField","showField","showStats","filterLabel","filterOutLabel","colSpan","LogDetailsRow","memoizedGetParser","getAllFields","getFieldLinks","parseMessage","fieldsMap","getDerivedFields","fieldHash","allFields","sortFieldsLinkFirst","rowEntry","entryFieldIndex","shouldRemoveField","fieldA","fieldB","UnThemedLogDetails","getRows","showDuplicates","logsRowLevelDetails","logDetails","labelsAvailable","detectedFieldsAvailable","levelClassName","getStatsForDetectedField","LogDetails","LogRowContextProvider","getRowContext","logsSortOrder","setLimit","setResult","setHasMoreContextRows","promises","dataResult","fieldCache","timestampField","idField","errorResult","getRowContexts","currentResult","hasMoreLogsBefore","hasMoreLogsAfter","currentResultBefore","currentResultAfter","valueBefore","valueAfter","UnThemedLogRowMessageDetectedFields","wrapClassName","LogRowMessageDetectedFields","UnThemedLogRow","showContext","showDetails","enableLogDetails","renderTimeStamp","epochMs","renderLogRow","showLabels","showTime","forceEscape","onLogRowHover","topVerticalAlign","detailsOpen","errorLogRow","logRowBackground","processedRow","hasUnescapedContent","toggleDetails","duplicates","toggleContext","LogRow","UnThemedLogRows","renderAll","orderedRows","previewLimit","renderAllTimer","dedupStrategy","deduplicatedRows","dedupedRows","dedupCount","processedRows","sortLogs","firstRows","lastRows","makeGetRows","LogRows","FieldLinkList","externalLinks","internalLinks","externalLinksHeading","externalLink","linkExternal","FullWidthButtonContainer","optionsToKeep","sharedSingleStatPanelChangedHandler","prevPluginId","prevOptions","angular","prevPanel","valueName","tableColumn","nullPointMode","nullText","strVale","migrateFromAngularSinglestat","sharedSingleStatMigrationHandler","previousVersion","pluginVersion","valueOptions","fieldOptions","fieldDefaults","newOptions","migrateFromValueOptions","migrateOldThresholds","moveThresholdsAndMappingsToField","oldTitle","convertOldAngularValueMapping","callToActionElement","getSwitchStyles","switchIdRef","switch","InlineSwitch","inlineContainer","inlineLabel","inlineLabelEnabled","itemValue","DataLinkSuggestions","groupedSuggestions","indexOffset","DataLinkSuggestionsList","activeIndex","activeIndexOffset","onSuggestionSelect","activeRef","selectedRef","SelectionReference","getSelection","anchorNode","clientWidth","clientHeight","SlatePrism","onlyIn","getSyntax","Prism","builtInVariable","suggestionsWrapper","wrapperOverrides","DataLinkInput","editorRef","showingSuggestions","setShowingSuggestions","suggestionsIndex","setSuggestionsIndex","linkUrl","setLinkUrl","prevLinkUrl","usePrevious","stateRef","suggestionElement","selectionRef","onVariableSelect","onUrlChange","includeDollarSign","_editor","infoText","DataLinkEditor","DataLinkEditorModalContent","dirtyLink","setDirtyLink","DataLinksListItem","onEdit","getDataLinkListItemStyles","hasTitle","hasUrl","notConfigured","DataLinksInlineEditor","editIndex","setEditIndex","isNew","setIsNew","getDataLinksInlineEditorStyles","linksSafe","onDataLinkChange","onDataLinkCancel","onDataLinkRemove","InfoBox","urlTitle","docsLink","Badge","badge","sourceColor","FeatureInfoBox","featureState","getFeatureInfoBoxStyles","FeatureBadge","branded","getPanelStateBadgeDisplayModel","isObject","getObjectName","getValuePreview","cssClass","el","classList","Node","createTextNode","DATE_STRING_REGEX","PARTIAL_DATE_REGEX","JSON_DATE_REGEX","requestAnimationFrame","cb","_defaultConfig","animateOpen","animateClose","JsonExplorer","_isOpen","isUrl","isEmptyObject","hasKey","constructorName","appendChildren","removeChildren","openAtDepth","depth","isNumberArray","renderArray","arrayWrapperSpan","skipChildren","skipRoot","togglerLink","togglerIcon","objectWrapperSpan","setAttribute","valuePreview","animated","addAChild","childrenElement","childrenRemoved","removeAChild","innerHTML","JSONFormatter","onDidRender","wrapperEl","wrapperRef","hasChildNodes","replaceChild","lastChild","renderJson","ErrorBoundary","componentDidCatch","react","onError","onRecover","ErrorBoundaryAlert","withErrorBoundary","errorBoundaryProps","comp","InlineLabel","as","getInlineLabelStyles","textHeading","childContainer","BasicAuthSettings","dataSourceConfig","basicAuthPassword","basicAuthUser","getCustomHeaderRowStyles","CustomHeaderRow","configured","_e","CustomHeadersSettings","newJsonData","fromEntries","newSecureJsonData","headerIndex","headerId","updateSettings","onHeaderChange","onHeaderRemove","onHeaderReset","onHeaderAdd","HttpProxySettings","showForwardOAuthIdentityOption","tlsAuth","tlsAuthWithCACert","tlsSkipVerify","oauthPassThru","InlineFieldRow","CertificationKey","hasCert","TLSAuthSettings","hasTLSCACert","tlsCACert","hasTLSClientCert","tlsClientCert","hasTLSClientKey","tlsClientKey","hasServerName","serverName","onResetClickFactory","newSecureJsonFields","onCertificateChangeFactory","ACCESS_OPTIONS","DEFAULT_ACCESS_OPTION","HttpAccessHelp","defaultUrl","showAccessOptions","sigV4AuthToggleEnabled","azureAuthSettings","renderSigV4Editor","urlTooltip","isAccessHelpVisible","setIsAccessHelpVisible","onSettingsChange","access","accessSelect","isValidUrl","notValidStyle","inputStyle","azureAuthEnabled","azureAuthSupported","getAzureAuthEnabled","keepCookies","cookies","basicAuth","withCredentials","setAzureAuthEnabled","sigV4Auth","azureSettingsUI","AlertingSettings","alertmanagerDataSources","alertmanagerOptions","manageAlerts","alertmanagerUid","getSegmentStyles","segment","queryPlaceholder","Segment","allowEmptyValue","inputMinWidth","inputPlaceholder","onExpandedChange","autofocus","setExpanded","useExpandableLabel","SegmentSelect","onClickOutside","widthPixels","asyncOptions","SegmentAsync","reloadOptionsOnChange","noOptionMessageHandler","mapStateToNoOptionsMessage","fetchOptions","useAsyncFn","SegmentInput","setInputWidth","inputWidthStyle","SegmentSection","initialExpanded","setWidth","setExpandedWrapper","closeOnMaskClick","scrollableContent","subtitle","expandable","drawerStyles","isExpanded","setIsExpanded","currentWidth","overlayRef","maskClosable","getContainer","drawer","actions","contentScroll","minHeight","flex","Slider","onAfterChange","ariaLabelForHandle","marks","included","SliderWithTooltip","SliderComponent","sliderValue","setSliderValue","onSliderChange","onSliderInputChange","onSliderInputBlur","sliderInputClassNames","sliderInputFieldClassNames","RangeSlider","formatTooltipResult","tooltipAlwaysVisible","RangeWithTooltip","createSliderWithTooltip","RangeComponent","tipProps","tipFormatter","Form","defaultValues","onSubmit","validateOnMount","validateFieldsOnMount","validateOn","useForm","handleSubmit","formState","Controller","isFullWidth","isPicking","setIsPicking","FieldNameByRegexMatcherEditor","fieldNameByRegexMatcherItem","optionsToLabel","FieldNameMatcherEditor","onChangeFromProps","fieldNameMatcherItem","FieldNamesMatcherEditor","selections","fieldNamesMatcherItem","excludeFromPicker","FieldTypeMatcherEditor","useFieldCounts","allTypes","fieldTypeMatcherItem","FieldsByFrameRefIdMatcher","referenceIDs","useFrameRefIds","fieldsByFrameRefIdItem","refIds","fieldMatchersUI","validUrl","getLegendStyles","heading","legendProps","FieldSet","InlineSegmentGroup","FieldArray","prepend","swap","move","insert","useFieldArray","RadioButton","getRadioButtonStyles","radioLabel","textColorHover","labelHeight","disabledOptions","handleOnChange","handleOnClick","internalId","groupName","activeButtonRef","radioGroup","isItemDisabled","flexWrap","RadioButtonDot","RadioButtonList","itemId","optionValue","AutoSizeInput","onCommitChange","extraSpace","realWidth","getWidthFor","combinedRef","refs","targetRef","useCombinedRefs","SecretInput","configuredStyle","SecretTextArea","htmlValue","getCheckboxStyles","checkmark","labelStyles","checkboxSize","trimFileName","fileName","extension","onFileUpload","accept","setFileName","files","fileUpload","multiple","labelWrapper","REMOVE_FILE","FileListItem","customFile","removeFile","progress","abortUpload","retryUpload","valueFormat","fileListContainer","fileNameWrapper","progressBar","FileDropzone","readAs","onLoad","fileListRenderer","onFileRemove","setFiles","errorMessages","setErrorMessages","setFileProperty","oldFiles","oldFile","onDrop","acceptedFiles","rejectedFiles","customFiles","mapToCustomFile","setErrors","reader","FileReader","read","readAsText","fileToModify","abort","onabort","DOMException","onprogress","loaded","onload","onerror","newFiles","getRootProps","getInputProps","isDragActive","useDropzone","useFsAccessApi","transformAcceptToNewFormat","fileList","rejectedFile","clearAlert","dropzone","FileDropzoneDefaultChildren","primaryText","getPrimaryText","errorAlert","acceptMargin","getAcceptedFileTypeText","getMimeTypeByExtension","mime","secondaryText","flat","isValidTimeRange","TimeRangeInput","clearable","pickerInput","caretIcon","clearIcon","inputStyles","linkHover","formInputPlaceholderText","mapOptionToRelativeTimeRange","relativeToSeconds","isRangeValid","relative","isRelativeFormat","secondsToRelativeFormat","validOptions","RelativeTimeRangePicker","mapRelativeTimeRangeToOption","validation","clockIcon","TooltipContent","toolTipStyles","supported","fromError","toError","bodyHeight","calculateErrorHeight","CardInner","getCardInnerStyles","CardContainer","disableEvents","disableHover","oldContainer","getCardContainerStyles","isSelectable","gridTemplateColumns","gridTemplateRows","gridAutoColumns","gridAutoFlow","gridTemplateAreas","CardContext","Card","hasHeadingComponent","Heading","onCardClick","useContext","getHeadingStyles","linkHack","gridArea","justifySelf","Tags","tagList","Description","getDescriptionStyles","Figure","getFigureStyles","media","Meta","getMetaStyles","metadataItem","curr","metadata","overflowWrap","BaseActions","getActionStyles","secondaryActions","cloneElement","marginTtop","Actions","SecondaryActions","getCardStyles","Dropdown","setShow","onVisibleChange","animationStyles","CSSTransition","appear","exit","enter","ReactUtils","appearActive","getSignatureDisplayModel","graphFieldOptions","fillGradient","stacking","thresholdsDisplayModes","defaultFormatter","PlotLegend","vizLayoutLegendProps","seriesConfig","dataFrameFieldIndex","countFormatter","fieldCalcs","fieldReducer","Marker","XYCanvas","EventsCanvas","events","renderEventMarker","mapEventToXYCoords","renderToken","setRenderToken","isMounted","useMountedState","eventMarkers","markers","coords","devicePixelRatio","ZoomPlugin","setSelection","posToVal","KNOWN_KEYS","initHook","vizLayoutViz","closest","pressedKeys","dragStartX","keysLastHandledAt","handlePressedKeys","dx","horValue","vertValue","dy","over","maxX","maxY","moveCursor","drawHeight","initiateAnimationLoop","drawWidth","KeyboardPlugin","getNamesToFieldIndex","originNames","origField","UnthemedTimeSeries","renderers","tweakAxis","tweakScale","xScaleKey","xScaleUnit","xFieldAxisPlacement","xFieldAxisShow","filterTicks","splits","axisGridShow","textBaseline","side","cssBaseline","_pos","_size","fillText","customRenderedFields","flatMap","fieldMap","indicesOnly","distribution","centeredZero","axisCenteredZero","axisColor","axisColorMode","axisColorOpts","axisWidth","formatValue","gaps","xData","yData","firstPos","lastPos","thisGap","nextGap","approxIdx","originFrame","originField","dispName","defaultBuilder","_data","firstY","fauxData","fillBelowTo","thresholdsStyle","fieldIndices","scaleKeys","dataIdx","hoveredIdx","cursorXVal","nonNullLft","nonNullRgt","curPos","rgtPos","lftDelta","rgtDelta","hoverEvent","pub","panelRelY","preparePlotConfigBuilder","showLegend","TimeSeries","GraphNGContext","useGraphNGContext","mapSeriesIndexToDataFrameFieldIndex","getXAxisField","xFieldMatcher","EmotionPerfTest","TestScenario","NoStyles","InlineEmotionCSS","UseStylesNoCX","UseStylesWithConditionalCX","UseStylesWithCSSProp","UseStylesWithConditionalCSS","UseStylesWithConditionalClassNames","setRender","MeasureRender","renderManyComponents","elements","mainStyles","large","disabed","getStylesObjects","Profiler","onRender","phase","actualDuration","baseDuration","startTime","commitTime","getStylesObjectMain","matchHighLight","autoEscape","PanelContainer","LegacyForms","enterActive","exitActive","measurement","UPlotChart","reinitPlot","destroy","DEFAULT_PLOT_CONFIG","plotContainer","sameDims","setSize","sameConfig","sameData","setData","prevTime","nextTime","sameTimeRange","UPLOT_AXIS_FONT_SIZE","optMinMax","calculateSpace","axisIdx","scaleMin","scaleMax","plotDim","sample","formatTime","calculateAxisSize","axisSize","textWidthWithLimit","labelGap","space","tickLabelRotation","gridColor","getUPlotSideFromAxis","rotate","labelSize","labelFont","tickSpace","tickIncr","timeUnitSize","foundSpace","foundIncr","yearRoundedToDay","incrementRoundedToDay","distr","rangeConfig","pad","hard","soft","hardMinOnly","hardMaxOnly","minMax","absMin","absMax","dir","minmax","TooltipPlugin","focusedSeriesIdx","setFocusedSeriesIdx","focusedPointIdx","setFocusedPointIdx","focusedPointIdxs","setFocusedPointIdxs","setCoords","plotEnter","plotLeave","positionTooltip","xFieldFmt","xVal","sortIdx","sortRef","sortFn","arrayUtils","aIdx","bIdx","cL","cT","isCursorOutsideCanvas","paddingSide","sidesWithAxes","hasCrossAxis","StackDirection","rSeries","nextIdx","stackingMode","stackingGroup","firstValue","stackDir","Pos","Neg","drawStyle2","stackKey","onStackMeta","stacksQty","dataLen","zeroArr","falseArr","accums","anyValsAtX","groupIdx","groupValsAtX","firstValIdx","firstVal","stackIdx","accum","stacked","totals","sMaxIdx","sMinIdx","sVal","pluginLogger","addAxisConfig","hideScale","showIf","ScaleDistributionEditor","DISTRIBUTION_OPTIONS","LOG_DISTRIBUTION_OPTIONS","SeriesConfigEditor","onChangeToggle","startCase","addHideFrom","hideFromDefaults","addLegendOptions","includeLegendCalcs","addTooltipOptions","singleOnly","modeOptions","addTextSizeOptions","withTitle","integer","StackingEditor","isOverride","addStackingConfig","BRACES","BracesPlugin","keyEvent","startOffset","startKey","endOffset","endKey","focusOffset","focusText","insertTextByKey","moveEndBackward","complement","matchAnnotation","anchor","addAnnotation","moveBackward","nextChar","anchorText","annotationType","annotation","moveFocusForward","removeAnnotation","moveAnchorForward","previousChar","deleteForward","forward","removeBom","clipboardPlugin","onCopy","clipEvent","selectedBlocks","getLeafBlocksAtRange","block","copiedText","textBlocks","excludingLastLineLength","getCopiedText","clipboardData","onPaste","pastedValue","getData","splitBlock","onCut","deleteAtRange","isIndentLeftHotkey","isKeyHotkey","isShiftTabHotkey","isIndentRightHotkey","SLATE_TAB","handleIndent","indentDirection","curSelection","blockWhitespace","trimLeft","textKey","getFirstText","rangeProperties","deleteBackwardAtRange","SlateRange","startText","textBeforeCaret","isWhiteSpace","moveStartBackward","startBlock","endBlock","equals","handleTabKey","indent","getIndent","isSelectLineHotkey","focusBlock","moveAnchorToStartOfBlock","getNextBlock","moveFocusToStartOfNextBlock","moveFocusToEndOfText","flattenGroupItems","groupedItems","calculateLongestLabel","allItems","longest","calculateListSizes","longestLabel","calculateSize","monospace","listWidth","calculateListWidth","calculateItemHeight","calculateListHeight","longestLabelHeight","longestLabelWidth","verticalPadding","totalHeight","TypeaheadInfo","typeaheadItem","xxs","dangerouslySetInnerHTML","__html","typeaheadItemSelected","typeaheadItemMatch","typeaheadItemGroupTitle","TypeaheadItem","onClickItem","itemGroupTitleClassName","Typeahead","hoveredItem","typeaheadIndex","handleSelectionChange","forceUpdate","listRef","scrollToItem","moveAmount","newTypeaheadIndex","onSelectSuggestion","scrollX","scrollY","showDocumentation","documentationItem","itemKey","typeaheadRef","handleTypeaheadDebounced","handleTypeahead","hasSuggestions","moveMenuIndex","insertSuggestion","commands","selectSuggestion","ed","applyTypeahead","suggestionText","preserveSuffix","backward","deleteBackwards","fragment","makeFragment","insertFragment","snapshotSelection","moveForward","renderEditor","onStateChange","parentBlock","getClosestBlock","selectionStartOffset","decorations","getDecorations","filteredDecorations","decoration","TOKEN_MARK","labelKeyDec","labelKey","wrapperClasses","labelValueMatch","searchFunctionType","prefixMatch","SearchFunctionType","searchFunction","SearchFunctionMap","newGroup","skipFilter","filterText","skipSort","sortText","sortValue","gr","blur","defaultOnlyIn","defaultGetSyntax","defaultRenderDecoration","Record","renderDecoration","optsParam","prismLanguages","decorateNode","Block","grammarName","grammar","blockText","getTexts","tokens","flattened","flattenTokens","texts","textStart","textEnd","processToken","token","accu","createDecoration","flattenToken","firstToken","offsets","lastToken","ThemeContextMock","memoizedStyleCreators","WeakMap","WithTheme","ContextComponent","hoistNonReactStatics","memoizedStyleCreator","mockThemeContext","themeMock","getTheme","mockTheme","mock","getAgularPanelStyles","getElementStyles","getVariantStyles","getPageStyles","maxWidthBreakpoint","GlobalStyles","cardChrome","hoverColor","listItemSelected","mediaUp","breakpoint","bodyBg","formFocusOutline","stylesCreator","getAvailableIcons","altKey","fuzzyMatch","letter","letterIndex","lastRange","getPreviousCousin","selector","sibling","previousSibling","getNextCharacter","global","getRangeAt","textContent","Element","ownerDocument","DEFAULT_ANNOTATION_COLOR","OK_COLOR","ALERTING_COLOR","NO_DATA_COLOR","PENDING_COLOR","REGION_FILL_ALPHA","hexToHsl","toHsl","hslToHex","getBrightness","sortedColors","hexColors","hslColors","sortedHSLColors","chunkedHSLColors","sortedChunkedHSLColors","flattenedZippedSortedChunkedHSLColors","flattenDeep","zip","sortColorsByHue","currRule","regexValidation","valueToValidate","TAG_COLORS","TAG_BORDER_COLORS","djb2","scrollbarWidth","div","newStyles","MsOverflowStyle","offsetWidth","origOnClick","useForceUpdate","thebugger","throttle","LOGGIN_ENABLED","enable","disable","isEnabled","ctxFontStyle","getContext","fontStyle","cacheKey","fromCache","fontSizeBasedOnWidth","fontSizeBasedOnHeight","optimalSize","renderOrCallToRender","itemToRender","Word","Prefix","Fuzzy","nodes","inlines","Document","autoColor","includeFallbackColors","UiFindInput","allowClear","clearUiFind","trackFindFunction","TracePageSearchBar","TracePageSearchBarBar","TracePageSearchBarSuffix","TracePageSearchBarBtn","TracePageSearchBarBtnDisabled","TracePageSearchBarLocateBtn","navigable","setSearch","searchValue","searchBarSuffix","spanFindMatches","focusedSpanIdForSearch","setSearchBarSuffix","setFocusedSpanIdForSearch","btnClass","uiFindInputInputProps","ubFlexAuto","getSearchBarSuffix","ubJustifyEnd","spanMatches","prevMatchedIndex","Ticks","TicksTick","TicksTickLabel","TicksTickLabelEndAnchor","endTime","numTicks","viewingDuration","durationAtTick","portion","flexRow","TimelineRow","TimelineRowCell","widthPercent","mergedStyle","flexBasis","ubRelative","Positions","bufferLen","heights","lastI","profileData","dataLength","calcHeights","heightGetter","forcedLastI","_max","calcYs","yValue","confirmHeight","_i","chg","findFloorIndex","imin","imax","getRowPosition","getEstimatedHeight","known","DEFAULT_INITIAL_DRAW","ListView","_viewHeight","bottomY","_scrollTop","_yPositions","_getHeight","scrollElement","scrollElementTop","listViewOffset","_itemHolderElm","itemOffset","scrollTo","_isScrolledOrResized","_positionList","_wrapperElm","_calcViewIndexes","maxStart","viewBufferMin","_startIndex","minEnd","_endIndex","_startIndexDrawn","_endIndexDrawn","elm","windowScroller","_scanItemHeights","getIndexFromKey","lowDirtyKey","highDirtyKey","isDirty","childNodes","getAttribute","observed","firstElementChild","_knownHeights","getKeyFromIndex","itemHeightGetter","_htmlTopOffset","_windowScrollListenerAdded","_htmlElm","documentElement","_onScroll","_isViewChanged","useRoot","yStart","yEnd","initialDraw","viewBuffer","attrs","wrapperProps","_initWrapper","onScroll","overflowY","scrollerStyle","itemsWrapperClassName","_initItemHolder","overlayClassName","popoverRef","CopyIcon","hasCopied","setHasCopied","tooltipTitle","copyIconClassName","KeyValueTable","keyColumn","copyColumn","linkIcon","jsonObjectOrArrayStartRegex","parseIfComplexJson","LinkValue","KeyValuesTable","linksGetter","uWidth100","markup","jsonMarkup","jsonTable","ubInlineBlock","valueMarkup","headerEmpty","headerHighContrast","emptyIcon","summary","summaryItem","summaryLabel","summaryDelim","KeyValuesSummary","AccordianKeyValues","highContrast","iconCls","uAlignIcon","arrow","uTxEllipsis","AccordianLogs","AccordianLogsHeader","AccordianLogsContent","AccordianLogsFooter","openedItems","onItemToggle","HeaderComponent","_sortBy","ubMb1","rpc","logMarker","toPercent","SpanBar","viewEnd","viewStart","getViewedBounds","shortLabel","longLabel","traceStartTime","setLabel","logGroups","_groupBy","posPercent","onMouseOver","positionKey","SpanLinksMenu","closeMenu","logLinks","metricLinks","traceLinks","getFirstAncestor","_get","_find","references","refType","spanID","SpanTreeOffset","SpanTreeOffsetParent","indentGuide","indentGuideActive","UnthemedSpanTreeOffset","ancestorId","relatedTarget","HTMLSpanElement","removeHoverIndentGuideId","addHoverIndentGuideId","ancestorIds","ancestorIDs","spanAncestorIds","childrenVisible","showChildrenIcon","hasChildren","hoverIndentGuideIds","handleMouseEnter","handleMouseLeave","spanBarClassName","spanBarLabelClassName","nameWrapperClassName","nameWrapperMatchingFilterClassName","viewClassName","nameColumnClassName","animations","nameWrapper","nameWrapperMatchingFilter","nameColumn","endpointName","viewExpanded","viewExpandedAndMatchingFilter","rowClippingLeft","rowClippingRight","rowExpanded","rowMatchingFilter","rowFocused","rowExpandedAndMatchingFilter","nameDetailExpanded","svcName","svcNameChildrenCollapsed","errorIcon","rpcColorMarker","labelRight","labelLeft","UnthemedSpanBarRow","onDetailToggled","onChildrenToggled","spanBarOptions","NONE","DURATION","TAG","tagKey","columnDivision","isChildrenExpanded","isDetailExpanded","isMatchingFilter","noInstrumentedServer","showErrorIcon","clippingLeft","clippingRight","createSpanLink","isParent","operationName","serviceName","viewBounds","labelDetail","hintClassName","_childrenToggle","_detailToggle","errorIconColor","getSpanBarLabel","countLinks","DividerVertical","DividerHorizontal","ReferenceLink","reference","createFocusSpanLink","traceID","AccordianReferenceItem","AccordianReferences","AccordianReferencesHeader","AccordianReferencesContent","AccordianReferencesFooter","ReferencesList","itemContent","debugInfo","debugLabel","References","TextList","DefaultTextComponent","AccordianText","headerClassName","TextComponent","accordianKeyValuesStyles","getAccordianKeyValuesStyles","listWrapper","debugValue","AccordianWarnings","AccordianWarningsHeader","AccordianWarningsHeaderOpen","AccordianWarningsLabel","Textarea","LinkIcon","SpanDetail","detailState","logItemToggle","logsToggle","processToggle","tagsToggle","warningsToggle","stackTracesToggle","referencesToggle","referenceItemToggle","topOfViewRefType","isTagsOpen","isProcessOpen","logsState","isWarningsOpen","referencesState","isStackTracesOpen","relativeStartTime","warnings","stackTraces","overviewItems","getAbsoluteTime","childSpanCount","focusSpanLink","ubM0","LabeledList","ubTxRightAlign","ubMy1","logItem","textComponentProps","stackTrace","cols","TopOfViewRefType","dateStr","expandedAccent","infoWrapper","UnthemedSpanDetailRow","itemIndex","focusedSpanId","borderTopColor","_linksGetter","rowsWrapper","scrollToTopButton","DEFAULT_HEIGHTS","memoizedGenerateRowStates","trace","childrenHiddenIDs","detailStates","collapseDepth","rowStates","isDetail","spanIndex","generateRowStates","memoizedViewBoundsFunc","createViewedBoundsFunc","memoizedGetClipping","currentViewRange","zoomStart","zoomEnd","UnthemedVirtualizedTraceView","currentViewRangeTime","findMatchesIDs","getRowStates","listView","isChanged","registerAccessors","getAccessors","_traceID","_spanID","_isDetail","renderSpanDetailRow","renderSpanBarRow","scrollToIndex","topOfViewRef","scrollIntoView","behavior","setTrace","uiFind","scrollToSpan","shouldComponentUpdate","nextPropKeys","shouldScrollToFirstUiFindMatch","clearShouldScrollToFirstUiFindMatch","scrollToFirstVisibleSpan","nextRegisterAccessors","nextTrace","getClipping","lv","getViewRange","getSearchedSpanIDs","getCollapsedChildren","getViewHeight","getBottomRowIndexVisible","getBottomVisibleIndex","getTopRowIndexVisible","getTopVisibleIndex","mapRowIndexToSpanIndex","mapSpanIndexToRowIndex","childrenToggle","detailToggle","spanNameColumnWidth","getColorByKey","isCollapsed","isErrorSpan","spanContainsErredSpan","rpcSpan","findServerChildSpan","rpcViewBounds","peerServiceKV","kv","isKindClient","SpanBarRow","detailLogItemToggle","detailLogsToggle","detailProcessToggle","detailReferencesToggle","detailReferenceItemToggle","detailWarningsToggle","detailStackTracesToggle","detailTagsToggle","SpanDetailRow","setListView","getRowHeight","renderRow","scrollToTop","viewRange","viewMin","viewWindow","spanHasTag","isClientSpan","isServerSpan","isErrorBool","isErrorStr","parentSpanIndex","spanChildDepth","LabeledListItem","LabeledListLabel","LabeledListValue","scrollPageDown","binding","scrollPageUp","scrollToNextVisibleSpan","scrollToPrevVisibleSpan","panLeft","panLeftFast","panRight","panRightFast","zoomIn","zoomInFast","zoomOut","zoomOutFast","collapseAll","expandAll","collapseOne","expandOne","searchSpans","clearSearch","getInstance","Combokeys","TimelineCollapser","onExpandAll","onExpandOne","onCollapseAll","onCollapseOne","EUpdateTypes","DraggableManager","getBounds","resetBoundsOnResize","_bounds","clientX","_isDragging","_onMouseEnter","_onMouseLeave","_onMouseMove","_getPosition","manager","_handleDragEvent","_onDragStart","_onDragMove","_stopDragging","_onDragEnd","handleMouseDown","_handleMinorMouseEvent","handleMouseMove","_resetBoundsOnResize","resetBounds","onMouseMove","onDragStart","onDragMove","onDragEnd","_getBounds","clientXLeft","isDragging","TimelineColumnResizer","dragger","draggerDragging","draggerDraggingLeft","draggerDraggingRight","gripIcon","gripIconDragging","_rootElm","dragPosition","_dragManager","_getDraggingBounds","_handleDragEnd","_handleDragUpdate","draggerStyle","columnResizeHandleHeight","gripStyle","isDraggingLeft","isDraggingRight","_setRootElm","TimelineViewingLayer","TimelineViewingLayerCursorGuide","TimelineViewingLayerDragged","TimelineViewingLayerDraggedDraggingLeft","TimelineViewingLayerDraggedDraggingRight","TimelineViewingLayerDraggedShiftDrag","TimelineViewingLayerDraggedReframeDrag","TimelineViewingLayerFullOverlay","mapFromViewSubRange","mapToViewSubRange","getMarkers","isShift","isOutOfView","getNextViewLayout","Reflect","cls","_root","viewRangeTime","updateNextViewRangeTime","reframe","updateViewRangeTime","_draggerReframe","_handleReframeDragEnd","_handleReframeDragUpdate","_handleReframeMouseLeave","_handleReframeMouseMove","UNSAFE_componentWillReceiveProps","boundsInvalidator","shiftEnd","shiftStart","cusrorPosition","_setRoot","TimelineHeaderRow","TimelineHeaderRowTitle","TimelineHeaderWrapper","nameColumnWidth","onColummWidthChange","ubFlex","ubPx2","TraceTimelineViewer","UnthemedTraceTimelineViewer","datasourceType","callbacks","inst","keysHandler","keyboardMappings","mergeShortcuts","setSpanNameColumnWidth","traceTimeline","VirtualizedTraceView","NewWindowIconLarge","NewWindowIcon","isLarge","ExternalLinks","BreakableText","WORD_RX","wordRegexp","TraceName","traceName","deepFreeze","archiveEnabled","dagMaxNumServices","menuEnabled","linkPatterns","maxLookback","maxLimit","tracking","gaID","trackErrors","getConfigValue","getParent","parentRef","parameterRegExp","getParamNames","stringSupplant","encodeFn","processTemplate","template","parameters","createTestFunction","arg","identity","getParameterInArray","array","callTemplate","computeLinks","processTags","parameterValues","allParameters","every","parameter","currentSpan","getParameterInAncestor","processedLinks","_uniq","getTraceLinks","validKeys","computeTraceLink","getTraceName","candidateSpan","allIDs","thisRefLength","candidateRefLength","CanvasSpanGraph","UnthemedCanvasSpanGraph","getRgbColorByKey","_canvasElm","_draw","totalValueWidth","getFillColor","fillCache","cHeight","cWidth","itemYChange","valueOffset","renderIntoCanvas","_setCanvasRef","TickLabels","TickLabelsLabel","GraphTick","GraphTicks","x2","y2","ScrubberHandleExpansion","ScrubberHandle","ScrubberLine","ScrubberDragging","ScrubberHandles","Scrubber","xPercent","ViewingLayerResetZoomHoverClassName","ViewingLayerResetZoom","ViewingLayer","ViewingLayerGraph","ViewingLayerInactive","ViewingLayerCursorGuide","ViewingLayerDraggedShift","ViewingLayerDrag","ViewingLayerFullOverlay","dragTypes","UnthemedViewingLayer","preventCursorLine","_draggerStart","_handleScrubberDragEnd","_handleScrubberDragUpdate","_handleScrubberEnterLeave","_draggerEnd","_getMarkers","leadingX","haveNextTimeRange","leftInactive","cursorPosition","rightInactive","_resetTimeZoomClickHandler","strokeWidth","getItem","memoizedGetitems","SpanGraph","ubPb2","TracePageHeader","TracePageHeaderTitleRow","TracePageHeaderBack","TracePageHeaderTitleLink","TracePageHeaderDetailToggle","TracePageHeaderDetailToggleExpanded","TracePageHeaderTitle","TracePageHeaderTitleCollapsible","TracePageHeaderOverviewItems","TracePageHeaderOverviewItemValueDetail","TracePageHeaderOverviewItemValue","TracePageHeaderArchiveIcon","TracePageHeaderTraceId","HEADER_ITEMS","_values","processes","_maxBy","canCollapse","hideMap","hideSummary","onSlimViewClicked","slimView","summaryItems","uTxMuted","DetailState","oldState","isReferencesOpen","toggleTags","toggleProcess","toggleReferences","toggleReferenceItem","toggleWarnings","toggleStackTraces","toggleLogs","toggleLogItem","TreeNode","static","walk","addChild","iterFunction","searchFn","getPath","findPath","currentNode","currentPath","attempt","nodeStack","actualDepth","nodeDepth","pop","getProcessServiceName","proc","getSpanId","getSpanName","getSpanDuration","getSpanTimestamp","getSpanProcessId","processID","getSpanReferenceByType","getSpanServiceName","childOfRef","filterSpansForText","leftBound","rightBound","extract","original","getTextFilterdSpansAsMap","matchingSpans","getTraceSpans","textFilteredSpansMap","muted","getTraceProcesses","getSpanWithProcess","getTraceSpansAsMap","getTraceSpanIdsAsTree","nodesById","spansById","parentID","comparator","nodeA","nodeB","getTraceTimestamp","prevTimestamp","getTraceDuration","prevDuration","getParentSpan","tree","spanMap","spanA","spanB","numberSortComparator","itemA","itemB","getTraceServices","spanTree","services","DURATION_FORMATTERS","getDurationFormatterForTrace","totalDuration","getTraceSpansByHierarchyPosition","hierarchyPositionMap","hiddenSpanIds","collapsedSpanId","updatedSpan","deduplicateTags","spanTags","warningsHash","uniqueTags","orderTags","topPrefixes","orderedTags","tp","aKey","bKey","transformTraceData","traceEndTime","spanIdCounts","idCount","_isEqual","svcCounts","tagsInfo","refSpan","subsidiarilyReferencedBy","numberOfSpans","filterSpans","textFilter","includeFilters","excludeKeys","isTextInFilters","isTextInKeyValues","kvs","SpanBarSettings","textSemiWeak","strToRgb","g","ColorGenerator","colorsHex","colorsRgb","_getColorIndex","hashCode","hashIndex","getGenerator","ONE_MILLISECOND","ONE_SECOND","ONE_MINUTE","ONE_HOUR","ONE_DAY","DEFAULT_MS_PRECISION","UNIT_STEPS","microseconds","ofPrevious","quantizeDuration","floatPrecision","conversionFactor","targetPrecision","trunc","toPrecision","toFloatPrecision","formatMillisecondTime","targetDuration","asMilliseconds","formatSecondTime","asSeconds","primaryUnit","secondaryUnit","_dropWhile","_round","primaryUnitString","secondaryValue","secondaryUnitString","cleanUpAction","createAction","appEvents","PermissionTarget","AddPermission","permissions","assignments","setPermissionTarget","teamId","setTeamId","userId","setUserId","builtInRole","setBuiltinRole","permission","setPermission","targetOptions","users","User","teams","Team","builtInRoles","BuiltInRole","CloseButton","UserPicker","onSelected","TeamPicker","PermissionListItem","permissionLevels","canSet","getAvatar","getDescription","isManaged","getPermissionInfo","getName","teamAvatarUrl","userAvatarUrl","userLogin","team","PermissionList","INITIAL_DESCRIPTION","Permissions","buttonLabel","resource","resourceId","canSetPermissions","addPermissionTitle","isAdding","setIsAdding","setItems","setDesc","fetchItems","getPermissions","promise","setUserPermission","setTeamPermission","setBuiltInRolePermission","SlideDown","typeId","defaultMaxHeight","defaultStyle","inProp","AppChromeUpdate","pageNav","chrome","useGrafana","NavToolbarSeparator","leftActionsSeparator","Branding","CardButton","ctaStyle","infoBoxStyles","buttonIcon","buttonLink","buttonTitle","proTip","proTipLink","proTipLinkTitle","proTipTarget","infoBox","infoBoxTitle","ctaElementClassName","ButtonEl","ctaElement","getFooterLinks","getVersionLinks","licenseInfo","stateInfo","edition","licenseUrl","hideVersion","hasUpdate","ChangePassword","onSkip","passwords","newPassword","confirmNew","LocalStorageValueProvider","storageKey","store","onSaveToStore","onDeleteFromStore","LoginCtrl","pw","oldPassword","resetCode","resetModel","confirmPassword","toGrafana","put","formModel","isLoggingIn","changeView","isChangingPassword","redirectUrl","login","changePassword","loginHint","passwordHint","disableLoginForm","ldapEnabled","authProxyEnabled","disableUserSignUp","isOauthEnabled","skipPasswordChange","LoginForm","autoCapitalize","InnerBox","enterAnimation","loginStyles","getLoginStyles","loginInnerBox","LoginLayout","subTitle","startAnim","setStartAnim","loginAnim","loginContent","loginLogoWrapper","loginLogo","mainTitle","loginOuterBox","flyInAnimation","backgroundPosition","backgroundRepeat","NumberInput","inputCorrected","updateValue","newValue","corrected","currValue","updateValueDebounced","renderInput","onKeyPress","ColorValueEditor","spot","colorText","trashIcon","NumberValueEditor","onValueChange","modes","ThresholdsEditor","nextValue","newThresholds","latestThresholdInputRef","toThresholdsWithKey","onChangeThresholdValue","inputPrefix","onChangeThresholdColor","percentIcon","onRemoveThreshold","onAddThreshold","addButton","onModeChanged","formSpacingBase","ThresholdsValueEditor","ValueMappingEditRow","onDuplicate","showIconPicker","onChangeColor","onClearColor","onChangeIcon","onClearIcon","onUpdateMatchValue","onChangeText","onChangeFrom","onChangeTo","onChangePattern","onChangeSpecialMatch","specialMatch","specialMatchOptions","draggableId","dragRow","draggableProps","dragHandle","dragHandleProps","typeColumn","rangeInputWrapper","textAlignCenter","ResourcePicker","ResourcePickerSize","folderName","ResourceFolderName","mediaType","MediaType","regexInputWrapper","textTransform","ValueMappingsEditorModal","updateRows","buildEditRowModels","onChangeMapping","newList","onRemoveRow","mappingTypes","onAddValueMapping","createRow","onDuplicateMapping","sourceRow","getRowUniqueId","tableWrap","editTable","droppableId","droppableProps","editModelToSaveModel","editRows","ValueMappingsEditor","isEditorOpen","setIsEditorOpen","onCloseEditor","compactTable","DashboardPicker","onPicked","FieldColorEditor","byValueSupport","FieldColorModeViz","onModeChange","newMode","onColorChange","onSeriesModeChange","bySeriesSupport","seriesModes","lastColor","DataLinksValueEditor","MultiSelectValueEditor","getOptions","updateOptions","SelectValueEditor","StatsPickerEditor","StringArrayEditor","showAdd","onRemoveString","textInput","formInputBorderHover","UnitValueEditor","getAllOptionEditors","SliderValueEditor","StringValueEditor","multiSelect","fieldColor","getAllStandardFieldConfigs","getItemsCount","preferThresholdsMode","inputElement","getComputedStyle","getPropertyValue","maxDigits","calculatedTextWidth","getTextWidth","repeat","stylesSlider","getStylesSlider","numberInputWrapper","useTextarea","usePageNav","navId","oldProp","useSelector","createSelector","getNavIndex","navIndex","getNavModel","usePageTitle","navModel","activePage","PageHeader","navItem","pageTitle","pageImg","pageSubTitle","PageTabs","hideFromTabs","paddingBottom","SectionNav","directChildren","nestedItems","sectionName","sectionImg","subSection","flexShrink","Page","oldNavProp","PageLayoutType","scrollRef","pageHeaderNav","sectionNav","panes","pageContent","pageInner","dashboardContent","Contents","PageLoader","OldNavOnly","OldPage","getPageHeaderNav","scrollWrapper","contentWithoutToolbar","NewPage","SelectNav","customCss","defaultSelectedItem","Navigation","headerCanvas","renderHeaderTitle","renderTitle","breadcrumbs","highlightText","breadcrumbsResult","bc","pageName","loadingText","PasswordField","showPassword","setShowPassword","AddPermissions","AclTarget","onAddPermission","getCleanState","PermissionLevel","newItem","pickerClassName","dashboardAclTargets","onTypeChanged","onUserSelected","onTeamSelected","dashboardPermissionLevels","onPermissionChanged","showPermissionLevels","DisabledPermissionListItem","currentPermissionLevel","dp","ItemAvatar","ItemDescription","PermissionsListItem","onRemoveItem","folderInfo","inheritedFromRoot","dashboardId","inherited","canViewFolderPermissions","isFetching","OperationRowHelp","markdown","markdownHelper","helpHtml","QueryOperationAction","QueryOperationRowHeader","actionsElement","draggable","headerElement","isContentVisible","onRowToggle","reportDragMousePosition","titleElement","collapseIcon","dragIcon","QueryOperationRow","setIsContentVisible","getQueryOperationRowStyles","defaultPrevented","clientY","useUpdateEffect","renderPropArgs","headerElementRendered","inlineFormMargin","RolePickerInput","appliedRoles","showBuiltInRole","onQueryChange","getRolePickerInputStyles","numberOfRoles","selectedRoles","RolesLabel","getTooltipStyles","BuiltinRoleOption","fixedRoleGroupNames","ldap","RolePickerMenu","showGroups","builtinRolesDisabled","onBuiltInRoleSelect","onUpdate","updateDisabled","setSelectedOptions","selectedBuiltInRole","setSelectedBuiltInRole","showSubMenu","setShowSubMenu","openedMenuGroup","setOpenedMenuGroup","subMenuOptions","setSubMenuOptions","subMenuNode","customStyles","customRoles","filterCustomRoles","sortRolesByName","fixedRoles","filterFixedRoles","optionGroups","getOptionGroups","getSelectedGroupOptions","selectedGroupOptions","getRoleGroup","groupSelected","groupPartiallySelected","onGroupChange","delegatable","restOptions","onOpenSubMenu","onCloseSubMenu","onClearSubMenu","menuLeft","menuSection","groupHeader","builtInRoleSelector","newRole","RoleMenuGroupOption","partiallySelected","isNotDelegatable","RolePickerSubMenu","showOnLeft","RoleMenuOption","hideDescription","menuButtonRow","selectedCustomRoles","roleUID","groupsMap","subMenuLeft","subMenuButtonRow","menuOptionDisabled","menuOptionCheckbox","menuOptionBody","menuOptionInfoSign","checkboxPartiallyChecked","menuOptionExpand","subMenuPortal","RolePicker","roleOptions","onRolesChange","onBuiltinRoleChange","canUpdateRoles","setSelectedRoles","setQuery","setOffset","offsetVertical","offsetHorizontal","MENU_MAX_HEIGHT","roles","newRoles","newBuiltInRole","UserRolePicker","orgId","onApplyRoles","pendingRoles","getUserRoles","contextSrv","AccessControlAction","fetchUserRoles","updateUserRoles","fetchRoleOptions","rolesUrl","fetchBuiltinRoles","builtinRolesUrl","userRolesUrl","isHandled","roleUids","fetchTeamRoles","teamRolesUrl","updateTeamRoles","formatLabel","folderTitle","dashboardTitle","getDashboards","backendSrv","folderUid","setCurrent","skipInitialLoad","folder","folderId","getFolder","getInitialValues","getFolderById","initialFolderId","initialTitle","loadInitialValue","searchFolders","rootName","enableReset","permissionLevel","accessControlMetadata","showRoot","hits","hit","mapSearchHitsToOptions","hasAccess","newFolder","createFolder","onFolderChange","resetFolder","rootFolder","debouncedSearch","leading","trailing","enableCreateNew","createNewFolder","PermissionLevelString","defaultSortOptionsGetter","SearchSrv","getSortOptions","SortPicker","isDesc","DEFAULT_SORT","isNil","avatarUrl","finally","TagBadge","removeIcon","tagStyle","countLabel","TagOption","TagFilter","hideValues","tagOptions","currentlySelectedTags","setOptions","setIsLoading","previousTags","setPreviousTags","customTags","setCustomTags","selectKey","onLoadOptions","customTag","onTagChange","newTags","MultiValueLabel","tagFilter","TimePickerWithHistory","toAppend","toStore","onAppendToHistory","ProBadge","eventVariant","shortcuts","Global","HelpModal","titleDescription","shortcutTableKey","shortcutCategory","shortcutTable","shortcutTableCategoryHeader","shortcut","shortcutTableKeys","shortcutTableDescription","hasAlphaPanels","debug","GRID_CELL_HEIGHT","GRID_CELL_VMARGIN","GRID_COLUMN_COUNT","REPEAT_DIR_VERTICAL","REPEAT_DIR_HORIZONTAL","DEFAULT_PANEL_SPAN","DEFAULT_ROW_HEIGHT","MIN_PANEL_HEIGHT","LS_PANEL_COPY_KEY","PANEL_BORDER","DEFAULT_PER_PAGE_PAGINATION","LS_VISUALIZATION_SELECT_TAB_KEY","GrafanaContext","defaultSuccessNotification","AppNotificationSeverity","defaultWarningNotification","defaultErrorNotification","createSuccessNotification","showing","createErrorNotification","traceId","getMessageFromError","createWarningNotification","useAppNotification","dispatch","useDispatch","notifyApp","fromDTO","createdAt","starred","comment","RICH_HISTORY_KEY","MAX_HISTORY_ITEMS","RichHistoryLocalStorage","allQueries","getRichHistoryDTOs","richHistory","filterAndSortQueries","datasourceFilters","newRichHistoryQuery","richHistoryQuery","newRichHistoryQueryDTO","toDTO","currentRichHistoryDTOs","retentionPeriod","RICH_HISTORY_SETTING_KEYS","retentionPeriodLastTs","createRetentionPeriodBoundary","cleanUp","newQueriesToCompare","lastQueriesToCompare","RichHistoryServiceError","queriesToKeep","limitExceeded","checkLimits","updatedHistory","throwError","RichHistoryStorageWarning","updateRichHistory","richHistoryDTO","activeDatasourceOnly","starredTabAsFirstTab","lastUsedDatasourceFilters","selectableValue","updateCallback","richHistoryDTOs","transformedQueries","individualQuery","letters","isParsable","createDataQuery","migrateRichHistory","RichHistoryRemoteStorage","preferenceService","PreferencesService","dataSourceUid","relativeFrom","relativeTo","buildQueryParams","lastValueFrom","queryHistory","totalCount","load","homeTab","patch","showSuccessAlert","listOfDatasourceFilters","timeFilter","filteredQueriesByDs","filterQueriesByDataSource","filteredQueriesByDsAndSearchFilter","filterQueriesBySearchFilter","filteredQueriesToBeSorted","filter1","filter2","filterQueriesByTime","sortQueries","isLastTs","today","setDate","sortFunc","migrated","richHistoryLocalStorage","richHistoryRemoteStorage","getRichHistoryStorage","supportedFeatures","availableFilters","lastUsedDataSourcesAvailable","clearHistory","onlyActiveDataSource","changeRetention","queryHistoryAvailable","useQueryParams","useLocation","ENGLISH_US","FRENCH_FRANCE","SPANISH_SPAIN","DEFAULT_LOCALE","VALID_LOCALES","LIMIT_LABEL","COMMON_LABELS","LogLevelColor","SECOND","MINUTE","HOUR","DAY","isoDateRegexp","dedupLogRows","strategy","rowCopy","previous","isDuplicateRow","filterLogLevels","hiddenLogLevels","isLogsData","dataFrameToLogsModel","absoluteRange","logSeries","metricSeries","separateLogsAndMetrics","logsModel","allLabels","allSeries","seriesWithFields","stringField","labelsField","frameType","timeNanosecondField","logLevelField","getIdField","getAllLabels","flatAllLabels","tsNs","messageValue","getLabelsForFrameRow","logLevelKey","timeFromNow","timeLocal","timeUtc","lastLimitPerRef","elem","limitValue","totalBytes","queriesVisited","errorMetaAdded","totalBytesKey","lokiQueryStatKey","byteStat","logSeriesToLogsModel","sortedRows","visibleRange","visibleRangeMs","requestedRangeMs","pxPerBar","minimumBucketSize","resolutionIntervalMs","earliestTsLogs","getSeriesProperties","seriesByLevel","seriesList","lastTs","pointColor","makeDataFramesForLogs","logsModelMeta","limitIndex","metaLimitValue","adjustMetaInfo","idFieldNames","aggregateRawLogsVolume","rawLogsVolume","extractLevel","logsVolumeByLevelMap","aggregatedDataFrame","totalLength","pointIndex","valueToAdd","totalValue","Time","aggregateFields","oneLevelDetected","getLogVolumeFieldConfig","queryLogsVolume","logsVolumeRequest","timespan","intervalInfo","timespanMs","__interval","__interval_ms","getIntervalInfo","isObservable","complete","aggregatedLogsVolume","dataQueryResponse","useUrlParams","toggleKioskMode","kiosk","getKioskMode","KioskMode","exitKioskMode","profiler","renderingCompleted","panelsRendered","STORAGE_KEY","byId","storedNotifsRaw","localStorage","isStoredNotification","deserializeNotifications","lastRead","appNotificationsSlice","createSlice","newAlert","isSimilar","serializeNotifications","hideAppNotification","alertId","clearNotification","clearAllNotifications","readAllNotifications","appNotificationsReducer","selectLastReadTimestamp","selectWarningsAndErrors","selectAll","isAtLeastWarning","selectVisible","notif","notifs","reducedNotifs","cur","setItem","navTreeSlice","setStarred","starredItems","isStarred","newStarredItem","updateDashboardName","navTreeReducer","buildInitialState","buildNavIndex","parentItem","newNode","buildWarningNav","updateNavIndex","updateConfigurationSubtitle","getItemWithNewSubTitle","navIndexReducer","newPages","apikeys","getNotFoundModel","onlyChild","nodeWithActive","enrichNodeWithActiveState","getSectionRoot","nodeCopy","resourceUri","preferences","TokenRevokedModal","modalStyles","showMaxConcurrentSessions","maxConcurrentSessions","infobox","FetchStatus","FetchQueue","queue","Pending","InProgress","Done","updates","asObservable","noOfInProgress","noOfPending","printState","entriesWithoutOptions","getUpdate","publishUpdate","FetchQueueWorker","fetchQueue","responseQueue","maxParallelRequests","http2Enabled","getUpdates","concatMap","apiRequests","isDataQuery","dataRequests","noOfAllowedDataRequests","dataRequestToFetch","ResponseQueue","responses","setInProgress","observable","CANCEL_ALL_REQUESTS_REQUEST_ID","BackendSrv","deps","fromFetch","logout","noBackendCache","internalFetch","response","subscriptions","getResponses","setDone","inFlightRequests","parseRequestOptions","loadUrlToken","fromFetchStream","getFromFetchStream","failureStream","toFailureStream","successStream","ok","inspectorStream","processRequestError","handleStreamCancellation","resolveCancelerIfExists","cancelAllInFlightRequests","retry","isLocalUrl","Authorization","hideFromInspector","parseUrlFromOptions","parseInitFromOptions","statusText","redirected","responseType","isContentTypeApplicationJson","parseResponseBody","share","isSignedIn","inputStream","fetchErrorResponse","retryWhen","attempts","firstAttempt","ShowModalReactEvent","loginPing","showApplicationErrorAlert","cancelRequest","throwIfEmpty","cancelled","HTTP_REQUEST_CANCELED","getInspectorStream","withNoBackendCache","getDashboardByUid","getGrafanaStorage","getDashboard","getPublicDashboardByUid","getFolderByUid","queryParams","withAccessControl","isGrafanaAdmin","orgRole","orgName","externalUserId","orgCount","helpFlags1","hasEditPermissionInFolders","email","gravatarUrl","extend","isEditor","hasRole","minRefreshInterval","accessControlEnabled","reloadcache","setLoggedOut","accessControlBuiltInRoleAssignmentEnabled","licensedAccessControlEnabled","hasPermissionInMetadata","accessControl","hasPermission","isGrafanaVisible","visibilityState","isAllowedInterval","getValidInterval","hasAccessToExplore","fallBack","hasAccessInMetadata","evaluatePermission","addDashboardImpression","impressionsKey","impressionKey","impressions","imp","getDashboardOpened","toggleTheme","runtimeOnly","currentTheme","newTheme","newCssLink","bodyLinks","getElementsByTagName","service","currentPref","keybindingSrv","reset","Mousetrap","initGlobals","showHelpModal","goToHome","openAlerting","goToProfile","openSearch","makeAbsoluteTime","bindGlobal","globalEsc","anyDoc","activeElement","nodeName","hasAttribute","toggleNav","closeSearch","AbsoluteTimeEvent","editview","inspectTab","editPanel","viewPanel","showDashEditView","keyArg","returnValue","keyType","bindWithPanelId","dataset","panelid","withFocusedPanel","setupTimeRangeBindings","updateUrl","ZoomOutEvent","ShiftTimeEvent","ShiftTimeEventDirection","setupDashboardBindings","graphTooltip","startRefresh","canSave","SaveDashboardDrawer","panelId","canEditPanelById","isViewing","getPanelById","getExploreUrl","datasourceSrv","getDatasourceSrv","timeSrv","getTimeSrv","urlWithoutBase","panelInView","panelInEdit","RemovePanelEvent","panelIndex","getPanelInfoById","duplicatePanel","panelInfo","ShareModal","toggleLegendsForAll","collapseRows","expandRows","newUrlParam","autofitpanels","getRecentDashboards","sections","queryForRecentDashboards","score","SECTION_STORAGE_KEY","DashboardSearchItemType","dashIds","take","impressionSrv","dashboardIds","orderId","getStarred","hasFilters","folderIds","SearchLayout","skipRecent","skipStarred","handleSearchResult","folderUrl","getDashboardTags","getBool","def","exists","getObject","ret","setObject","errorToThrow","removeItem","TableModel","columnMap","addColumn","addRow","areRowsMatching","otherRow","foundFieldToMatch","mergeTablesIntoModel","dst","arguments","tableDataTables","columnNames","columnsUnion","columnIndexMapper","flattenedRows","mapper","alteredRow","mergedRows","compactedRows","matchedRow","matchSeriesOverride","aliasOrRegex","seriesAlias","updateLegendValues","aliasEscaped","escape","valueFormater","isMsResolutionNeeded","applySeriesOverrides","dashes","dashLength","zindex","linewidth","spaceLength","pointradius","steppedLine","hideTooltip","logmin","avg","diff","diffperc","allIsNull","allIsZero","nonNulls","previousValue","previousDeltaUp","formater","hideFromLegend","ThemeProvider","setTheme","provideTheme","CorsWorker","Worker","scriptUrl","urlParts","scriptsBasePathUrl","importScripts","objectURL","createObjectURL","Blob","revokeObjectURL","accessControlQueryParam","accesscontrol","processAclItems","processAclItem","sortRank","arrayMove","fromIndex","toIndex","DEFAULT_RANGE","lastUsedDatasourceKeyForOrgId","exploreDatasource","exploreTargets","timeRangeForUrl","exploreState","buildQueryTransaction","exploreId","queryOptions","scanning","combinedKey","lowLimit","getIntervals","app","liveStreaming","generateKey","done","clearQueryKeys","isSegment","ParseUrlStateIndex","safeStringifyValue","toGraphStyle","EXPLORE_GRAPH_STYLES","parseUrlState","safeParseJson","SegmentsStart","RangeFrom","RangeTo","parsedSegments","__panelsState","generateEmptyQuery","getNextRefIdChar","generateNewKeyAndAddRefIdIfMissing","ensureQueries","hasNonEmptyQuery","updateHistory","historyKey","getQueryKeys","datasourceInstance","newQueryKeys","primaryKey","rawRange","parseRawTime","getTimeRangeFromUrl","refreshIntervalToSortOrder","convertToWebSocketUrl","protocol","host","stopQueryState","querySubscription","copyStringToClipboard","parseHeaders","isAppJson","parseBody","credentials","parseCredentials","parseHeaderByMethodFactory","methodPredicate","canParse","headerParsers","Headers","contentType","arrayBuffer","blob","textData","serializeParams","arrayValue","serializedParams","omitBy","flatten","maxDepth","currentDepth","isarray","safe","isobject","newKey","kbn","valueFormats","intervalRegex","intervalsInSeconds","regexEscape","secondsToHhmmss","strings","outOf","addSlashes","queryColorDot","diameter","slugifyForUrl","additionalDecimals","roundValue","getUnitFormats","receiver","isUtc","getRefId","hide","getQueryParamValue","addToRichHistory","showQuotaExceededError","showLimitExceededWarning","newQueriesToSave","strippedQuery","notEmptyQuery","richHistoryStorageFull","getRichHistory","updateRichHistorySettings","getRichHistorySettings","getSettings","deleteAllFromRichHistory","deleteAll","updateStarredInRichHistory","updateStarred","updateCommentInRichHistory","newComment","updateComment","deleteQueryInRichHistory","deleteRichHistory","LocalStorageMigrationStatus","migrateQueryHistoryFromLocalStorage","NotNeeded","migrate","Successful","Failed","createUrlFromRichHistory","serializedState","baseUrl","mapNumbertoTimeInSlider","createQueryHeading","createQueryText","queryDsInstance","getQueryDisplayText","mapQueriesToHeadings","mappedQueriesToHeadings","createDatasourcesList","getRelativeURLPath","createShortLink","createAndCopyShortLink","shortLink","tickStep","stop","e10","e5","e2","step0","step1","getScaledDecimals","tickSize","getFlotTickSize","noTicks","maxDec","norm","getFlotRange","panelMin","panelMax","datamin","datamax","wideFactor","widen","getFlotTickDecimals","grafanaTimeFormat","logp","getPrecision","getStringPrecision","dotIndex","getShiftedTimeRange","origRange","getZoomedTimeRange","center","newTimespan","OrgRolePicker","loadAdminUserPage","userAdminPageLoadedAction","userProfileLoadedAction","loadUserProfile","orgs","userOrgsLoadedAction","loadUserOrgs","loadUserSessions","loadLdapSyncStatus","userError","userAdminPageFailedAction","updateUser","setUserPassword","disableUser","enableUser","deleteUser","updateUserPermissions","addOrgUser","loginOrEmail","updateOrgUserRole","deleteOrgUser","sessions","session","seenAt","clientIp","browser","browserVersion","os","osVersion","device","userSessionsLoadedAction","revokeSession","tokenId","authTokenId","revokeAllSessions","canReadLDAPStatus","syncStatus","ldapSyncStatusLoadedAction","syncLdapUser","loadLdapState","connectionInfo","ldapConnectionInfoLoadedAction","ldapError","ldapFailedAction","loadUserMapping","surname","userInfo","userMappingInfoLoadedAction","clearUserMappingInfoAction","userMappingInfoFailedAction","clearUserError","clearUserErrorAction","clearUserMappingInfo","fetchUsers","getState","perPage","userListAdmin","getFilters","usersFetched","usersFetchEnd","fetchUsersWithDebounce","changeQuery","usersFetchBegin","queryChanged","changeFilter","filterChanged","changePage","pageChanged","initialLdapState","syncInfo","connectionError","ldapSlice","ldapReducer","initialUserAdminState","userAdminSlice","userAdminReducer","userListAdminSlice","totalPages","showPaging","userAdmin","alertQueryDef","QueryPartDef","dynamicLookup","defaultParams","EvalFunction","joinEvalMatches","metric","Metric","getStateDisplayModel","normalizedState","normalizeAlertState","iconClass","stateClass","conditionTypes","evalFunctions","IsAbove","IsBelow","IsOutsideRange","IsWithinRange","HasNoValue","evalOperators","noDataModes","executionErrorModes","reducerTypes","createReducerPart","QueryPart","getAlertAnnotationInfo","ah","evalMatches","alertStateSortScore","firing","no_data","pending","paused","inactive","addStrategy","updateText","innerExpr","hasMultipleParamsInString","strValue","optional","updateParam","partVal","functionRenderer","paramType","quote","suffixRenderer","combineReducers","createAsyncMapSlice","fetchRulesSourceBuildInfoAction","rulesSourceName","promRules","fetchPromRulesAction","rulerRules","fetchRulerRulesAction","amConfigs","fetchAlertManagerConfigAction","alertManagerSourceName","silences","fetchSilencesAction","ruleForm","saveRule","createAsyncSlice","saveRuleFormAction","existingRule","fetchEditableRuleAction","grafanaNotifiers","fetchGrafanaNotifiersAction","saveAMConfig","updateAlertManagerConfigAction","deleteAMConfig","deleteAlertManagerConfigAction","updateSilence","createOrUpdateSilenceAction","amAlerts","fetchAmAlertsAction","folders","fetchFolderAction","amAlertGroups","fetchAlertGroupsAction","testReceivers","testReceiversAction","updateLotexNamespaceAndGroup","updateLotexNamespaceAndGroupAction","externalAlertmanagers","alertmanagerConfig","fetchExternalAlertmanagersConfigAction","discoveredAlertmanagers","fetchExternalAlertmanagersAction","managedAlertStateHistory","fetchGrafanaAnnotationsAction","alertRulesSlice","loadAlertRules","loadedAlertRules","alertRulesViewModel","stateModel","alertDef","stateText","stateIcon","stateAge","newStateDate","executionError","evalData","convertToAlertRule","notificationChannelSlice","notificationChannelTypes","notificationChannel","notifiers","setNotificationChannels","typeName","o1","o2","notificationChannelLoaded","secureChannelOptions","secure","propertyName","cleanedSettings","secureSettings","migrateSecureFields","resetSecureField","secureFields","alertRules","unifiedAlerting","unifiedAlertingReducer","discoverDataSourceFeatures","buildInfoResponse","fetchPromBuildInfo","fetchRules","hasPromRulesSupport","rulerSupported","fetchTestRulerRulesGroup","RULER_NOT_SUPPORTED_MSG","hasRulerSupport","application","PromApplication","features","rulerApiEnabled","ruler_config_api","discoverFeatures","dsConfig","getDataSourceByName","prepareRulesFilterQueryParams","dashboardUID","GRAFANA_RULES_SOURCE_NAME","rules","getDatasourceAPIUid","prometheusUrlBuilder","nsMap","rulerUrlBuilder","rulerConfig","rulerPath","rulerSearchParams","apiVersion","namespaceGroup","setRulerRuleGroup","fetchRulerRules","rulerGetRequest","fetchRulerRulesGroup","deleteRulerRulesGroup","empty","hasErrorMessage","isResponseError","isCortexErrorResponse","isRulerNotSupported","deleteNamespace","AlertLabel","onRemoveLabel","bold","AlertLabels","AlertManagerPicker","alertManager","wellableAnnotationKeys","AnnotationDetailsField","annotationKey","annotationLabels","AnnotationValue","needsWell","needsLink","tokenizeValue","well","CollapseToggle","idControlled","restOfProps","DetailsField","fieldVertical","DynamicTable","isExpandable","onCollapse","onExpand","renderExpandedContent","testIdGenerator","pagination","paginationStyles","renderPrefixCell","renderPrefixHeader","footerRow","defaultPaginationStyles","getPaginationStyles","expandedIds","setExpandedIds","itemsPerPage","onPageChange","pageItems","isItemExpanded","expandCell","toggleExpanded","bodyCell","renderCell","expandedContentRow","hasPrefixCell","sizes","StateTag","good","bad","neutral","HoverCard","VARIABLES","Tokenize","tokenType","isVariable","TokenType","Variable","KEYWORDS","keyword","isKeyword","Keyword","FUNCTIONS","functionName","Function","Unknown","tokenContent","Token","disableCard","hoverTokenItem","Well","panelBg","AlertGroupHeader","textStyles","getNotificationsTextColors","alerts","countByStatus","statusObj","pluralize","availableAlertManagerFunctions","builtinFunctions","keywords","defaultToken","functions","tokenizer","Delimiter","cases","Identifier","Comment","rawstring","conf","blockComment","brackets","autoClosingPairs","surroundingPairs","AlertInstanceDetails","AlertInstancesTable","instances","alertInstanceKey","AlertStateTag","activeAt","alertStateToState","alertStateToReadable","initialPage","setPage","firstItemOnPageIndex","newPage","useUnifiedAlertingSelector","equalityFn","fetchAlertManagerConfig","template_files","template_file_provenances","alertmanager_config","fetchStatus","receivers","receiversResponseContainsErrors","getReceiverResultError","grafana_managed_receiver_configs","isTestReceiversResult","receiversResult","fetchExternalAlertmanagerConfig","escapeQuotes","sortStateHistory","compareDesc","endNeq","timeEnd","timeNeq","getRulerClient","findEditableRule","isGrafanaRuleIdentifier","ruleIdentifier","namespaces","isGrafanaRulerRule","grafana_alert","ruleSourceName","isCloudRuleIdentifier","identifier","ruleId","isPrometheusRuleIdentifier","deleteRule","ruleWithLocation","addRuleToNamespaceAndGroup","newRule","existingGroup","moveGrafanaRule","copyGrafanaUID","updateGrafanaRule","newRules","saveLotexRule","existing","formRule","formValuesToRulerRuleDTO","freshExisting","targetGroup","saveGrafanaRule","evaluateEvery","formValuesToRulerGrafanaRuleDTO","groupSpec","sameNamespace","sameGroup","oldRule","getDataSourceConfig","getDataSourceRulerConfig","createAsyncThunk","thunkAPI","withSerializedError","isVanillaPrometheusAlertManagerDataSource","retryWhile","messageFromError","fetchExternalAlertmanagers","fetchPromAndRulerRulesAction","fetchSilences","fetchAllPromBuildInfoAction","allRequests","getAllRulesSourceNames","allSettled","getRulesDataSource","condition","hasLoaded","fetchAllPromAndRulerRulesAction","force","getStore","fetchAllPromRulesAction","deleteRulesGroupAction","ruleGroup","withAppEvents","sourceName","getRulesSourceName","rulesSource","successMessage","deleteRuleAction","rulerClient","navigateTo","redirectOnSave","RuleFormType","stringifiedIdentifier","fetchAnnotations","oldConfig","newConfig","redirectPath","refetch","latestConfig","updateAlertManagerConfig","addDefaultsToAlertmanagerConfig","makeAMLink","alertmanagerSourceName","silenced","inhibited","isRegex","fetchAlerts","expireSilenceAction","silenceId","silenceID","expireSilence","exitOnSave","createOrUpdateSilence","deleteReceiverAction","receiverName","deleteTemplateAction","templateName","newTemplates","templates","fetchFolderIfNotFetchedAction","dispatched","fetchAlertGroups","deleteAlertManagerConfig","deleteMuteTimingAction","muteTimingName","muteIntervals","mute_time_intervals","route","removeMuteTimingFromRoute","namespaceName","newNamespaceName","newGroupName","groupInterval","rulesResult","addExternalAlertmanagersAction","alertManagerConfig","addAlertManagers","getRulesSourceType","isGrafanaRulesSource","instancesPermissions","grafana","external","notificationsPermissions","rulesPermissions","getInstancesPermissions","sourceType","getNotificationsPermissions","getRulesPermissions","evaluateAccess","fallBackUserRoles","getRulesAccess","canCreateGrafanaRules","canCreateCloudRules","canEditRules","permissionFallback","muteTiming","muteName","routes","subRoute","renameMuteTimings","newMuteTimingName","oldMuteTimingName","isReceiverUsedInRoute","isReceiverUsed","matcherToOperator","MatcherOperator","matcherToMatcherField","matcherFieldToMatcher","matcherOperatorToValue","matchersToString","currentMatcherString","matcherFieldOptions","matcherOperators","parseMatcher","trimmed","operatorsFound","op","parseMatchers","matcherQueryString","labelsMatchMatchers","labelValue","nameMatches","valueMatches","getAllAlertmanagerDataSources","getAllDataSources","DataSourceType","getAlertmanagerByUid","timeIntervalToString","timeInterval","weekdays","days_of_month","getTimeString","getWeekdayString","getDaysOfMonthString","getMonthsString","getYearsString","start_time","end_time","abbreviated","toLocaleUpperCase","daysOfMonth","checkEvaluationIntervalGlobalLimit","alertGroupEvaluateEvery","globalLimit","exceedsLimit","evaluateEveryMs","evaluateEveryGlobalLimitMs","RULE_LIST_POLL_INTERVAL_MS","ALERTMANAGER_NAME_QUERY_KEY","ALERTMANAGER_NAME_LOCAL_STORAGE_KEY","SILENCES_POLL_INTERVAL_MS","NOTIFICATIONS_POLL_INTERVAL_MS","TIMESERIES","TABLE","STAT","Annotation","runbookURL","panelID","GRAFANA_DATASOURCE_NAME","RulesDataSourceTypes","Loki","getRulesDataSources","getAlertManagerDataSources","Alertmanager","grafanaAlertManagerDataSource","getAllAlertManagerDataSources","getAlertManagerDataSourcesByPermission","availableDataSources","notification","cloudSources","availableRulesSources","getAllRulesSources","isCloudRulesSource","getRulesSourceUid","implementation","AlertManagerImplementation","getRulesSourceByName","getDefaultOrFirstCompatibleDataSource","defaultDataSource","parseQueryParamMatchers","matcherPairs","parsedMatchers","getMatcherQueryParams","validMatcherLabels","matcherUrlParams","findAlertInstancesWithMatchers","anchorRegex","regexpString","matchesInstance","matchedInstance","createViewLink","ruleSource","returnTo","paramId","paramSource","createExploreLink","ui","arrayToRecord","rec","getFiltersFromUrlParams","alertState","dataSource","ruleType","getNotificationPoliciesFilters","contactPoint","getSilenceFiltersFromUrlParams","silenceState","recordToArray","record","alertManagerName","makeRuleBasedSilenceLink","makeLabelBasedSilenceLink","alertname","silenceUrlParams","makeDataSourceLink","shouldRetry","pause","makeAttempt","GrafanaAlertState","PromAlertingRuleState","sortAlerts","mapStateWithReasonToBaseState","toLocaleLowerCase","initialAsyncRequestState","requestStateReducer","asyncThunk","fulfilled","rejected","extraReducers","addDefaultCase","getEntityId","isAsyncThunkAction","asyncAction","entityId","statusCode","msg","isAsyncRequestMapSliceFulfilled","isAsyncRequestStateFulfilled","isAsyncRequestMapSlicePending","isAsyncRequestStatePending","getDefaultFormValues","noDataState","GrafanaAlertStateDecision","execErrState","evaluateFor","expression","forTime","forTimeUnit","for","listifyLabelsOrAnnotations","no_data_state","exec_err_state","rulerRuleToFormValues","defaultFormValues","ga","namespace_id","isAlertingRulerRule","parseInterval","isRecordingRulerRule","getDefaultQueries","getDefaultExpression","queryType","ExpressionQueryType","ExpressionDatasourceUID","conditions","evaluator","panelToRuleFormValues","panelDataSourceRef","dsRef","queryVariables","interpolatedTarget","datasourceSettings","dataQueriesToGrafanaQueries","fromRulerRule","rulerRuleHash","hashRulerRule","fromCombinedRule","rulerRule","promRule","ruleHash","hashRule","fromRule","fromRuleWithLocation","equal","cloudRuleIdentifierPrefix","prometheusRuleIdentifierPrefix","escapeDollars","unesacapeDollars","decodeFromUri","tryParse","stringifyIdentifier","hashLabelsOrAnnotations","isRecordingRule","isAlertingRule","ruleIdentifierToRuleSourceName","PromRuleType","isRulerNotSupportedResponse","resp","flattenRules","alertStateToStateMap","getFirstActiveAt","isNotNormal","isFederatedRuleGroup","source_tenants","TimeOptions","timeOptions","positiveDurationValidationPattern","durationValidationPattern","parseDurationToMilliseconds","saveAnnotation","updateAnnotation","deleteAnnotation","getAnnotationTags","executeAnnotationQuery","savedJsonAnno","standardAnnotationSupport","prepareAnnotation","prepareQuery","__annotation","queryRequest","runRequest","panelData","processEvents","anno","hasTime","hasText","byName","evts","alertEventAndAnnotationFields","setter","getAnnotationsFromData","annotationEventNames","help","legacyRunner","shouldUseMappingUI","shouldUseLegacyRunner","apiKeysSlice","hasFetched","includeExpired","keysIncludingExpired","apiKeysMigrated","apiKeysLoaded","apiKeysMigrationStatusLoaded","includeExpiredToggled","apiKeys","senderColor","senderName","timeFormatted","created","toLocaleTimeString","markdownContent","avatarContainer","avatar","CommentView","packetCounter","addComment","setComment","commentViewContainer","CommentManager","address","getLiveAddress","objectType","objectId","getLiveChannel","commentCreated","messages","updateSubscription","DashboardExporter","cleanUpRepeats","saveModel","getSaveModelClone","processRepeats","inputs","requires","variableLookup","libraryPanels","variable","getVariables","templateizeDatasourceUsage","datasourceVariable","builtIn","refName","processPanel","panelDef","processLibraryPanels","isPanelModelLibraryPanel","libraryPanel","LibraryElementKind","rowPanel","isQuery","VariableRefresh","annotationDef","isConstant","__elements","curKey","curLibPanel","newObj","__inputs","__requires","libPanel","gridPos","DashNavButton","iconSize","noBorderContainer","DashNavTimeControls","setAutoRefresh","refreshTimeModel","timepicker","hasDelay","nowDelay","adjustedFrom","adjustedTo","nextRange","setTime","refresh_intervals","getValidIntervals","timePickerValue","getTimezone","hideIntervalPicker","onChangeTimePicker","onMoveBack","onChangeRefreshInterval","DashboardCommentsModal","mapDispatchToProps","updateTimeZoneForSession","connector","connect","e2eSelectors","customLeftActions","customRightActions","onStarDashboard","dashboardSrv","getDashboardSrv","starDashboard","onToggleTVMode","onOpenSettings","onPlaylistPrev","playlistSrv","onPlaylistNext","onPlaylistStop","addCustomContent","buttons","isPlaylistRunning","renderLeftActions","kioskMode","canStar","canShare","publicDashboardEnabled","renderTimeControls","hideTimePicker","renderRightActions","onAddPanel","canEdit","showSettings","snapshot","snapshotUrl","originalUrl","tvButton","gotoSnapshotOrigin","A","AutoRefreshIntervals","refreshIntervals","onRefreshIntervalChange","getIntervalsFunc","validateIntervalsFunc","validateIntervals","setIntervals","invalidIntervalsMessage","setInvalidIntervalsMessage","intervalsString","onIntervalsChange","newIntervals","onIntervalsBlur","invalidMessage","cleanIntervals","TimePickerSettings","isNowDelayValid","onNowDelayChange","onHideTimePickerChange","timePickerHidden","onLiveNowChange","liveNow","onTimeZoneChange","onWeekStartChange","NetworkGraph","edges","onDoubleClick","network","onNodeDoubleClick","visJs","toVisNetworkNodes","toVisNetworkEdges","autoResize","improvedLayout","hierarchical","sortMethod","interaction","navigationButtons","dragNodes","Network","createNetwork","nodesWithStyle","DataSet","edgesWithStyle","edge","arrows","NetworkGraphModal","propsShow","UnProvidedVariablesDependenciesButton","createDependencyNodes","createDependencyEdges","filterNodesWithDependencies","VariablesDependenciesButton","VariablesUnknownButton","usages","VariablesUnknownTable","changed","setChanged","setUsages","unknownsNetwork","getUnknownsNetwork","elapsed","CollapseLabel","NoUnknowns","UnknownTable","infoIcon","usage","firstColumn","defaultColumn","lastColumn","HIDE_OPTIONS","VariableHide","VariableHideSelect","VariableSelectField","VariableTypeSelect","getVariableTypes","variableAdapters","VariableValuesPreview","setPreviewLimit","previewOptions","setPreviewOptions","showMoreOptions","optionContainer","variableEditorMount","rootStateKey","toKeyedAction","variableEditorMounted","getVariable","variableEditorUnMount","variableEditorUnMounted","toVariablePayload","onEditorUpdate","switchToListMode","changeVariableName","errorText","getVariablesByKey","changeVariableNameFailed","completeChangeVariableName","originalVariable","changeVariableNameSucceeded","renamedIdentifier","toKeyedVariableIdentifier","addVariable","switchToEditMode","removeVariable","reIndex","switchToNewMode","toStateKey","getNextAvailableId","getNewVariableIndex","setIdInEditor","clearIdInEditor","getEditorVariables","getModel","createUsagesNetwork","usagesNetwork","transformUsagesToNetwork","initInspect","nextId","ownProps","getVariablesState","bindActionCreators","changeVariableProp","propValue","changeVariableType","newType","VariableEditorEditorUnConnected","EditorToRender","onHandleSubmit","VariableSectionHeader","VariableTextField","V","onNameChange","onTypeChange","onLabelChange","onHideChange","onDescriptionChange","onPropChange","onPropChanged","hasOptions","VariableEditorEditor","VariableUsagesButton","isAdhoc","VariableEditorListRow","usageTree","propsOnEdit","propsOnDuplicate","onDelete","propsOnDelete","definition","getDefinition","passed","getVariableUsages","isAdHoc","nameLink","definitionColumn","VariableCheckIndicator","iconPassed","iconFailed","greenBase","VariableEditorList","onChangeOrder","EmptyVariablesList","EmptyListCTA","templatingState","idInEditor","changeVariableOrder","duplicateVariable","newId","VariableEditorContainerUnconnected","variableToEdit","onChangeToListMode","onNewVariable","onEditVariable","onChangeVariableOrder","onDuplicateVariable","onRemoveVariable","VariableEditorContainer","AccessControlDashboardPermissions","P","getDashboardPermissions","addDashboardPermission","removeDashboardPermission","updateDashboardPermission","checkFolderPermissions","DashboardPermissionsUnconnected","hasUnsavedFolderChange","PermissionsInfo","onOpenAddPermissions","onCancelAddPermission","DashboardPermissions","AnnotationFieldMapper","updateFields","onFieldNameChange","StandardAnnotationQueryEditor","getCurrent","running","PanelModel","verifyDataSource","fixed","renderStatus","rowStyle","onAnnotationChange","onMappingChange","AngularEditorLoader","angularComponent","loadAngular","scopeProps","ctrl","currentAnnotation","ignoreNextWatcherFiring","digest","currentDatasource","getScope","$watch","newAnnotationName","AnnotationSettingsEdit","editIdx","setAnnotation","isNewAnnotation","ListNewButton","AnnotationSettingsList","onNew","updateAnnotations","onMove","showEmptyListCTA","DashboardSettingsHeader","AnnotationsSettings","setEditIdx","newAnnotation","cleanUpDashboardAndVariables","getModalBody","totalAlerts","sumBy","ProvisionedDeleteModal","provisionedId","DeleteDashboardModal","isProvisioned","provisioned","onDeleteDashboard","deleteDashboard","useDashboardDelete","modalBody","provisionedExternalId","DeleteDashboardButton","PreviewSettings","getThumbnailURL","formData","FormData","imgstyle","markAsStale","doUpload","GRAPH_TOOLTIP_OPTIONS","updateTimeZone","updateTimeZoneDashboard","updateWeekStart","updateWeekStartDashboard","GeneralSettings","setRenderCounter","editable","canDelete","JsonEditorSettings","dashboardJson","setDashboardJson","editWrapper","saveJSONDashboard","dashboardWatcher","LinkSettingsList","setLinks","moveLink","duplicateLink","deleteLink","LinksSettings","newLink","LinkSettingsEdit","editLinkIdx","VersionsSettings","isAppending","historySrv","versions","decorateVersions","selectedVersions","newInfo","baseInfo","isNewLatest","lhs","rhs","viewMode","diffData","createdDateString","formatDate","ageString","getRelativeTime","versionId","getVersions","isLastPage","rev","canCompare","showButtons","hasMore","VersionHistory","isComparing","baseVersion","newVersion","VersionsHistorySpinner","onCheck","getDiff","MakeEditable","onMakeEditable","DashboardSettings","canMakeEditable","canAdmin","onPostSave","canSaveAs","scrollInner","settingsWrapper","loc","SaveDashboardButton","onSaveSuccess","settingsContent","asDropdown","linkTypeOptions","linkIconMap","question","bolt","doc","cloud","linkIconOptions","linkSettings","setLinkSettings","selectedItem","CATEGORY_PARAM_NAME","OptionsPaneCategory","forceOpen","isOpenDefault","itemsCount","isNested","initialIsExpanded","savedState","setSavedState","useLocalStorage","getOptionGroupStorageKey","updateQueryParams","manualClickTime","isOpenFromUrl","boxStyles","box","boxNestedExpanded","headerExpanded","headerNested","bodyStyles","bodyNested","PANEL_EDITOR_UI_STATE_STORAGE_KEY","OptionsPaneCategoryDescriptor","addItem","addCategory","getCategory","customRender","OptionsPaneItemOverrides","OptionsPaneItemDescriptor","getLabel","highlightWord","word","renderOverrides","skipField","dataOverrideTooltipDescription","overrideRuleTooltipDescription","getOptionOverrides","fieldOption","infoDots","lodashGet","getVisualizationOptions","plugin","onPanelOptionsChanged","onFieldConfigsChange","instanceState","currentOptions","currentFieldConfig","categoryIndex","dataSeries","getDataLinksVariableSuggestions","getStandardEditorContext","getOptionsPaneCategory","categoryNames","categoryName","setOptionImmutably","fillOptionsPaneItems","Editor","updateDefaultFieldConfigValue","parentCategory","pluginOption","subAccess","getNestedValueAccess","subContext","getBuilder","DEFAULT_PANEL_EDITOR_UI_STATE","isPanelOptionsVisible","rightPaneSize","topPaneSize","DisplayMode","pluginsSlice","storedUiState","migratedState","getPanel","getSourcePanel","initDone","shouldDiscardChanges","isVizPickerOpen","tableViewEnabled","updateEditorInitState","sourcePanel","setEditorPanelData","setDiscardChanges","setPanelEditorUIState","closeEditor","panelEditor","PanelEditorTabId","PanelEditTableToggle","displayModes","Fill","Exact","Off","VisualizationSelectPaneTab","calculatePanelSize","pWidth","pHeight","supportsDataQuery","skipDataQuery","splat","propKey","SaveDashboardAsButton","isCopy","SaveDashboardDiff","oldValue","oldJSON","newJSON","schemaChange","diffs","changes","DiffGroup","showDiffs","jsonView","DiffViewer","useDashboardSave","onDashboardSave","saveDashboardApiCall","saveDashboard","clearUnsavedChanges","DashboardSavedEvent","newUrl","SaveDashboardErrorProxy","dashboardSaveModel","isHandledError","overwrite","ConfirmPluginDashboardSaveModal","getConfirmPluginDashboardSaveModalStyles","errorStatus","SaveDashboardAsForm","onSuccess","$folder","copyTags","autoUpdate","getSaveAsDashboardClone","getFormValues","dashboardName","validationSrv","SaveDashboardForm","hasTimeChanged","hasVariableChanged","hasVariableValuesChanged","saving","setSaving","resetOriginalVariables","resetOriginalTime","Stack","hasChanges","SaveProvisionedDashboardForm","dashboardJSON","saveToFile","saveAs","SaveToStorageForm","setResponse","setPath","workflow","setWorkflow","WorkflowID","saveText","workflows","write","isJustSave","isFromStorage","diffCount","cloneJSON","cloneSafe","jsonDiff","showDiff","setShowDiff","themeOptions","ShareEmbed","useCurrentTimeRange","selectedTheme","iframeHtml","buildIframeHtml","onUseCurrentTimeRangeChange","onThemeChange","onIframeHtmlChange","getIframeHtml","ViewJsonModal","getClipboardText","disableHeight","ShareExport","shareExternally","trimDefaults","exporter","makeExportable","openSaveAsDialog","openJsonModal","dashboardJsonPretty","exportExternallyTranslation","exportDefaultTranslation","onShareExternallyChange","onTrimDefaultsChange","onViewJson","onSaveAsFile","ShareLibraryPanel","ShareLink","useShortUrl","shareUrl","buildShareUrl","imageUrl","buildImageUrl","buildUrl","isDashboardSaved","timeRangeLabelTranslation","timeRangeDescriptionTranslation","shortenURLTranslation","linkURLTranslation","onUrlShorten","getShareUrl","dashboardHasTemplateVariables","publicDashboardPersisted","publicDashboard","generatePublicDashboardUrl","accessToken","SharePublicDashboard","dashboardVariables","setPublicDashboardConfig","dashboardUid","acknowledgements","setAcknowledgements","public","setPublicDashboard","getPublicDashboardConfig","onAcknowledge","getDefaultTime","hasUnsavedChanges","publicDashboardConfig","pdResp","savePublicDashboardConfig","ShareSnapshot","timeoutSeconds","saveSnapshot","snapshotExpires","scrubDashboard","cmdData","expires","deleteUrl","snapshotName","snapshotData","singlePanel","getSaveModel","forEachPanel","selectedExpireOption","expireOptions","externalEnabled","sharingButtonText","getSnaphotShareOptions","shareOptions","renderStep1","snapshotNameTranslation","expireTranslation","timeoutTranslation","timeoutDescriptionTranslation","onSnapshotNameChange","onExpireChange","onTimeoutChange","createSnapshot","renderStep2","getSnapshotUrl","deleteSnapshot","renderStep3","customDashboardTabs","customPanelTabs","getTabs","getActiveTab","onSelectTab","ActiveTab","buildBaseUrl","queryStart","shortenUrl","buildSoloUrl","soloUrl","getLocalTimeZone","DiffValues","hasLeftValue","isUndefined","originalValue","hasRightValue","replaceDiff","DiffTitle","getDiffTitleStyles","embolden","getDiffText","withoutDiff","critical","diffViewerBackground","dashboardBg","diffViewerColor","addedBackground","greenShade","addedColor","removedBackground","redShade","removedColor","wordAddedBackground","wordRemovedBackground","redBase","addedGutterBackground","removedGutterBackground","gutterBackground","gutterBackgroundDark","highlightBackground","highlightGutterBackground","bgBlue2","codeFoldGutterBackground","codeFoldBackground","emptyLineBackground","gutterColor","addedGutterColor","removedGutterColor","codeFoldContentColor","diffViewerTitleBackground","diffViewerTitleColor","diffViewerTitleBorderColor","border3","codeFold","splitView","compareMethod","DiffMethod","useDarkTheme","getHistoryList","getDashboardVersion","restoreDashboard","useDashboardRestore","onRestoreDashboard","RevertDashboardModal","VersionHistoryTable","createdBy","VersionHistoryHeader","VersionsHistoryButtons","VersionHistoryComparison","versionInfo","noMarginBottom","lhsMap","jsonMap","rhsMap","flow","pointers","showProp","propIsNumeric","isNumeric","getDiffOperationText","PanelHeaderMenuItem","setRef","isSubMenu","isDivider","menuIconClassName","shortcutIconClassName","getDropdownLocationCssClass","FIVE_MINS","getLiveTimerInterval","millisPerPixel","liveTimer","BehaviorSubject","budget","lastUpdate","oldOk","newOk","tr","listener","listeners","isInView","liveTimeOffset","liveTimeChanged","setLiveTimeRange","listen","updateInterval","setInterval","measure","DashboardLoaderSrv","_dashboardLoadFailed","isSnapshot","dashboardNotFound","loadDashboard","slug","_loadScriptedDashboard","DashboardRoutes","_loadFromDatasource","isFolder","_executeScript","fromScript","dsid","reject","scriptResult","scriptFunc","dashboardLoaderSrv","DashboardSrv","removePanel","onRemovePanel","DashboardModel","parsedJson","requestOptions","TimeSrv","shiftTime","autoRefreshBlocked","timeModel","initTimeFromUrl","parseTime","timeAtLoad","parseUrlParam","utcValue","getTimeWindow","timeWindow","timeWindowMs","urlRefresh","currentRefresh","isAllowedIntervalFn","isExistingInterval","minRefreshIntervalInIntervals","lowestRefreshInterval","getRefreshFromUrl","updateTimeRangeFromUrl","urlRange","timeHasChangedSinceLoad","stopAutoRefresh","currentUrlState","validInterval","refreshTimer","startNextRefreshTimer","autoRefreshPaused","timeRangeUpdated","afterMs","pauseAutoRefresh","resumeAutoRefresh","oldRefresh","urlParams","isRefreshOutsideThreshold","lastRefresh","totalRange","migrateMultipleStatsMetricsQuery","panelQueries","newQueries","statistics","statistic","newTarget","migrateMultipleStatsAnnotationQuery","annotationQuery","newAnnotations","DashboardMigrator","dashboardModel","DatasourceSrv","updateSchema","oldVersion","schemaVersion","panelUpgrades","templating","leftMin","leftMax","y_format","y_formats","y2_format","maxId","getNextPanelId","aliasYAxis","seriesOverrides","pulldowns","allFormat","getNextQueryLetter","rawQuery","mathExpr","asExpr","templateVariable","hideVariable","hideLabel","logBase","leftLogBase","leftYAxisLabel","rightMin","rightMax","rightLogBase","rightYAxisLabel","threshold1","thresholdLine","threshold1Color","threshold2","threshold2Color","sharedCrosshair","upgradeToGridLayout","minSpan","factors","maxPerRow","upgradePanelLink","updateLinks","updateVariablesSyntax","dataLinks","multi","alignCurrentWithMulti","wasAngularTable","wasReactTable","returnSaveModel","changePlugin","angularPanelCtrl","gaugePanelPlugin","statPanelPlugin","migrateSinglestat","tagsQuery","tagValuesQuery","useTags","upgradeValueMappingsForPanel","migrateTooltipOptions","appendTransformerAfter","migrateDatasourceNameToRef","returnDefaultAsNull","migrateCloudWatchQueries","migrateCloudWatchAnnotationQuery","ensureXAxisVisibility","defaultDs","panelDataSourceWasDefault","rowPanels","isCloudWatchQuery","metricQueryType","MetricQueryType","metricEditorMode","MetricEditorMode","newAnnotationQueries","newAnnotationQuery","widthFactor","nextRowId","showRows","showTitle","repeatIteration","rowGridHeight","getGridHeight","rowPanelModel","rowArea","RowArea","panelWidth","panelHeight","panelPos","getPanelPosition","addPanel","rowYPos","area","startPlace","endPlace","place","callOnce","dashUri","seriesName1","fieldName1","nameOrRef","upgradeValueMappings","oldMappings","tooltipOptions","sortedDeepCloneWithoutNulls","isPlainObject","mutableKeys","infinityEqualsNull","findNextPanelID","getVariablesFromState","revision","ensureListExist","gnetId","ensurePanelsHaveIds","initMeta","addBuiltInAnnotationQuery","sortPanelsByGridPos","panelsAffectedByVariableChange","appEventsSubscription","VariablesChanged","variablesChangedHandler","VariablesTimeRangeProcessDone","variablesTimeRangeProcessDoneHandler","VariablesChangedInUrl","variablesChangedInUrlHandler","nonPersistedProperties","updateTemplatingSaveModelClone","originalTime","getPanelSaveModels","updatePanels","inputPanels","isNoop","doUpdate","isEqualWith","mergePanels","DashboardPanelsChangedEvent","isSnapshotTruthy","repeatPanelId","repeatedByRow","originalVariables","originalTemplating","currentVariables","onTimeRangeUpdated","refreshAll","panelIds","otherPanelInFullscreen","RenderEvent","panelInitialized","lastResult","getQueryRunner","getLastResult","initEditPanel","getEditClone","initViewPanel","setIsViewing","exitViewPanel","refreshIfPanelsAffectedByVariableChange","exitPanelEditor","nextPanelId","panelIterator","canEditPanel","panelA","panelB","configRev","changedPanel","hasChanged","hasVariables","collapsedPanel","deleteScopeVars","panelsToRemove","pull","repeatPanel","cleanUpRowRepeats","processRowRepeats","rowPanelIndex","getRowPanels","getPanelRepeatClone","valueIndex","sourcePanelIndex","getRowRepeatClone","sourceRowPanel","insertPos","updateRepeatedPanelIds","getPanelRepeatVariable","repeatRow","getSelectedVariableOptions","repeatDirection","panelBelowIndex","curPanel","otherPanel","setScopedVars","variableOption","optionIndex","cloneRowPanel","isAllVariable","positions","maxPos","maxBy","removeRow","removePanels","toggleRow","collapsedRows","isSubMenuVisible","newPanel","hasRepeat","yDiff","pushDownAmount","panelsBelowRow","nextRowIndex","cycleGraphTooltip","sharedTooltipModeEnabled","sharedCrosshairModeOnly","cloneVariablesFrom","hasVariablesChanged","autoFitPanels","viewHeight","currentGridHeight","visibleHeight","submenuEnabled","scaleFactor","templateVariableValueUpdated","CoreEvents","getPanelByUrlId","panelUrlId","collapsedPanels","rp","panelsWithLegends","isPanelWithLegend","onCount","panelLegendsOn","canEditAnnotations","annotationsPermissions","organization","canEditDashboard","canDeleteAnnotations","canAddAnnotations","canAdd","shouldUpdateDashboardPanelFromJSON","updatedPanel","updated","variableIds","originalLibraryPanels","notPersistedProperties","hasRefreshed","cachedPluginOptions","queryRunner","getDisplayTitle","mustKeepProps","timeFrom","timeShift","hideTimeOverride","fullscreen","cacheTimeout","restoreModel","autoMigrateGraphPanels","autoMigrateFrom","ensureQueryIds","generateNewKey","PanelOptionsChangedEvent","updateFieldConfig","resendLastResult","updateGridPos","newPos","manuallyUpdated","runAllPanelQueries","dashboardTimezone","timeData","publicDashboardAccessToken","run","timeInfo","getOptionsToRemember","restorePanelOptions","restoreCustomOverrideRules","applyPluginOptionDefaults","isAfterPluginChange","getPanelOptionsWithDefaults","pluginLoaded","getPluginVersion","wasAngular","callPanelTypeChangeHandler","clearPropertiesBeforePluginChange","filterFieldConfigOverrides","isStandardFieldProp","newPlugin","oldPluginId","oldOptions","prevFieldConfig","isAngularPlugin","updateQueries","PanelQueriesChangedEvent","sourceModel","sourceQueryRunner","useLastResultFrom","getTransformations","getFieldOverrideOptions","getDataSupport","PanelQueryRunner","setTransformations","PanelTransformationsChangedEvent","setProperty","extraVars","lastRequest","getLastRequest","vars","allVariablesParams","stringifyPanelModel","loadDashboardPermissions","toUpdateItem","itemToUpdate","itemsToUpdate","itemToDelete","importDashboard","loadPluginDashboards","removeDashboard","cancelVariables","cleanUpDashboard","updateWeekStartForSession","optionsWithDefaults","mergeWith","objValue","srcValue","fieldConfigWithDefaults","existingFieldConfig","pluginDefaults","cleanProperties","fixThresholds","applyFieldConfigDefaults","fieldConfigWithOptimalColorMode","colorSettings","adaptFieldColorMode","parentPath","fullPath","existsInRegistry","isCustomFieldProp","currentOverride","initPhase","DashboardInitPhase","initError","dashboardSlice","dashboardInitFetching","dashboardInitServices","dashboardInitCompleted","dashboardInitFailed","ask","cleanUpPanelState","text2","ShowConfirmModalEvent","yesText","copyPanel","sharePanel","addLibraryPanel","AddLibraryPanelModal","unlinkLibraryPanel","UnlinkModal","toggleLegend","applyPanelTimeOverrides","newTimeData","timeFromInterpolated","timeFromInfo","_isString","timeFromDate","timeShiftInterpolated","CLOUD_ONBOARDING_APP_ID","ROUTE_BASE_ID","ROUTES","DATASOURCES_ROUTES","New","layoutMode","dataSourcesCount","dataSourceTypeSearchQuery","isLoadingDataSources","dataSourceMeta","dataSourceLoaded","dataSourcesLoaded","dataSourceMetaLoaded","dataSourcePluginsLoad","dataSourcePluginsLoaded","setDataSourcesSearchQuery","setDataSourcesLayoutMode","setDataSourceTypeSearchQuery","setDataSourceName","setIsDefault","initialDataSourceSettingsState","testingStatus","loadError","initDataSourceSettingsSucceeded","initDataSourceSettingsFailed","testDataSourceStarting","testDataSourceSucceeded","testDataSourceFailed","dataSourceSettings","fixedColorOption","ColorDimensionEditor","defaultColor","isFixed","FileDropzoneCustomChildren","FileUploader","setFormData","setUpload","dropped","setDropped","setFile","Preview","iconPreview","acceptableFiles","iconContainer","ResourceCards","defaultWidth","columnWidth","itemData","areEqual","FolderPickerTab","setNewValue","getFolders","currentFolder","setCurrentFolder","getFolderIfExists","directoryIndex","setDirectoryIndex","filteredIndex","setFilteredIndex","listFiles","cardsWrapper","URLPickerTab","getPublicOrAbsoluteUrl","shortName","ResourcePickerPopover","setActivePicker","PickerTabType","upload","setError","resourcePickerPopoverTab","resourcePickerPopoverActiveTab","renderFolderPicker","resourcePickerPopover","resourcePickerPopoverTabs","resourcePickerPopoverContent","buttonGroup","sanitizedSrc","colorStyle","pointer","textOptions","TextDimensionMode","dummyFieldSettings","dummyStringSettings","TextDimensionEditor","setRefresh","onFieldChange","onFixedChange","resourceOptions","ResourceDimensionMode","ResourceDimensionEditor","showSourceRadio","resourceType","srcPath","placeholderValue","niceName","fixedValueOption","ScaleDimensionEditor","minMaxStep","validateScaleOptions","validateAndDoChange","validateScaleConfig","onMinChange","onMaxChange","hideRange","scalarOptions","ScalarDimensionMode","ScalarDimensionEditor","getColorDimension","isAssumed","getLastNotNullFieldValue","getColorDimensionForField","findField","getTextDimension","getTextDimensionForField","getResourceDimension","getIcon","getScalarDimension","validated","getScalarDimensionForField","getScaledDimension","getScaledDimensionForField","scaled","ScaleDimensionMode","maxArea","PI","minArea","deltaArea","defaultTextConfig","getColorDimensionFromData","getScaleDimensionFromData","getScalarDimensionFromData","getResourceDimensionFromData","getTextDimensionFromData","findFieldIndex","createSpanLinkFactory","splitOpenFn","traceToLogsOptions","traceToMetricsOptions","getFieldLinksForExplore","dataFrameRowIndex","getTimeRangeFromSpan","logsDataSourceSettings","isSplunkDS","metricsDataSourceSettings","dataLink","filterByTraceID","filterBySpanID","mapTagNamesEnabled","mappedTags","keysToCheck","defaultKeys","getLinkForLoki","getLinkForSplunk","startMs","spanStartTimeShift","endMs","spanEndTimeShift","buildMetricsQuery","legacyCreateSpanLinkFactory","adjustedStartTime","spanEndMs","adjustedEndTime","tagValue","labelsQuery","shouldDisableCollapse","allSpans","hiddenSpansIds","makeDetailSubsectionToggle","setDetailStates","newDetailStates","noDataMsg","TraceView","traceProp","toggleDetail","useDetailState","setHoverIndentGuideIds","newHoverIndentGuideIds","useHoverIndentGuide","setViewRange","prevRange","useViewRange","setChildrenHiddenIDs","prevExpandedDepth","expandNextHiddenSpan","newChildrenHiddenIDs","nearestCollapsedAncestor","curSpan","useChildrenState","slim","setSlim","panelState","explore","spanId","setFocusedSpanId","changePanelState","sameTrace","useFocusSpanLink","tracesToLogs","tracesToMetrics","onTraceGraphViewClicked","useSearch","transformDataFrames","serviceTags","parentSpanID","transformTraceDataFrame","updateDatasourceInstanceAction","changeDatasource","loadAndInitDatasource","currentDataSourceInstance","importQueries","changeRefreshInterval","runQueries","datasourceReducer","graphResult","tableResult","logsVolumeDataProvider","logsVolumeData","createEmptyQueryResponse","queryKeys","datasourceMissing","changeSizeAction","changePanelsStateAction","exploreItem","stateSave","initializeExploreAction","changeSize","changeGraphStyleAction","changeGraphStyle","graphStyle","storeGraphStyle","initializeExplore","containerWidth","eventBridge","loadResult","updateTime","replaceUrl","refreshExplore","newUrlQuery","itemState","newUrlState","urlDiff","getUrlStateFromPaneState","refreshQueries","getFiscalYearStartMonth","initialQueries","setQueriesAction","paneReducer","makeExplorePaneState","queryReducer","timeReducer","historyReducer","richHistoryUpdatedAction","richHistoryResults","richHistoryTotal","richHistorySearchFiltersUpdatedAction","richHistorySearchFilters","oldUrlState","historyUpdatedAction","updateRichHistoryState","updatedQuery","deletedId","forEachExplorePane","newRichHistory","deletedItems","ExploreId","addHistoryItem","richHistoryLimitExceededWarningShown","richHistoryStorageFullAction","richHistoryLimitExceededAction","starHistoryItem","commentHistoryItem","deleteHistoryItem","loadRichHistory","loadMoreRichHistory","currentFilters","currentRichHistory","nextFilters","moreRichHistory","clearRichHistoryResults","initRichHistory","queriesMigrated","migrationFailedDuringThisSession","richHistoryMigrationFailed","migrationResult","richHistoryMigrationFailedAction","richHistorySettings","richHistorySettingsUpdatedAction","updateHistorySettings","updateHistorySearchFilters","currentSettings","syncTimesAction","resetExploreAction","splitCloseAction","cleanupPaneAction","urlStates","lastSavedUrl","splitOpen","leftState","rightUrlState","splitClose","navigateToExplore","openInNewWindow","initialExploreItemState","initialExploreState","syncedTimes","targetSplit","rightState","explorePaneState","decorateWithFrameTypeMetadata","graphFrames","tableFrames","logsFrames","traceFrames","nodeGraphFrames","decorateWithGraphResult","decorateWithTableResult","frameA","frameB","frameARefId","frameBRefId","decorateData","fullRangeLogsVolumeAvailable","preProcessPanelData","newResults","sortedNewResults","decorateWithLogsResult","grouped","addQueryRowAction","changeQueriesAction","cancelQueriesAction","queriesImportedAction","modifyQueriesAction","queryStoreSubscriptionAction","storeLogsVolumeDataProviderAction","cleanLogsVolumeAction","storeLogsVolumeDataSubscriptionAction","updateLogsVolumeDataAction","queryStreamUpdatedAction","changeLoadingStateAction","setPausedStateAction","scanStartAction","scanStopAction","addResultsToCacheAction","clearCacheAction","addQueryRow","getDefaultQuery","cancelQueries","sourceDataSource","targetDataSource","importedQueries","abstractQueries","nextQueries","modifyQueries","modification","modifier","preventSubmit","preserveCache","clearCache","exploreItemState","newQuerySub","nextHistory","handleHistory","cachedValue","getResultsFromCache","transaction","loadingState","sourceRequest","selectedTimeRange","deepEqual","dataRange","canReuseLogsVolumeData","loadLogsVolumeData","setQueries","rawQueries","scanStart","addResultsToCache","createCacheKey","logsVolumeDataSubscription","nextQuery","processQueryResponse","isPaused","scanRange","CACHE_LIMIT","newCache","legacy","showLogs","showMetrics","showTable","showTrace","showNodeGraph","changeRangeAction","changeRefreshIntervalAction","updateTimeRange","absRange","actionRange","rangeInState","rawTimeRange","syncTimes","isTimeSynced","leftRange","leftAbsoluteRange","rightRange","rightAbsoluteRange","toRawTimeRange","GRAPH_STYLE_KEY","loadGraphStyle","pruneObject","pruned","mapValues","pane","cacheIdx","getLinkSrv","getDataLinkUIModel","hostname","getTitleFromHref","useLinks","reducerFunctions","rt","eo","ef","Condition","onRemoveCondition","onEvaluateValueChange","newParams","buttonWidth","isRange","buttonSelectText","evalOperator","ea","conditionFunction","rf","evalFunction","buttonStyle","ClassicConditions","onConditionChange","lastParams","at","newCondition","defaultCondition","showHelp","toggleShowHelp","useToggle","documentationContainer","documentationHeader","documentationFunctions","DocumentedFunction","documentationLink","getDocumentedFunctionStyles","onSettingsChanged","onReplaceWithChanged","ReducerMode","replaceWithValue","newSettings","replaceWithNumber","reducerMode","Resample","downsampler","downsamplingTypes","upsampler","upsamplingTypes","ExpressionDatasourceApi","templateSrv","getCollapsedText","module","author","screenshots","getCachedExpression","setCachedExpression","expressionCache","math","resample","useExpressionsCache","onSelectExpressionType","cachedExpression","getDefaults","gelTypes","renderExpressionType","classic","Strict","DropNonNumbers","ReplaceNonNumbers","loadFolder","buildNavModel","saveFolder","deleteFolder","getFolderPermissions","loadFolderPermissions","setCanViewFolderPermissions","updateFolderPermission","removeFolderPermission","addFolderPermission","getLoadingNav","folderSlice","setFolderTitle","defaultPaths","COUNTRIES_GAZETTEER_PATH","GazetteerPathEditor","gaz","setGaz","getGazetteer","fetchData","examples","addLocationFields","refineInterval","base32Decoded","mask","pointFieldFromGeohash","geohash","BITS","isEven","lat","lon","latCenter","decodeGeohash","Point","fromLonLat","hiddenTooltipField","pointFieldFromLonLat","longitude","latitude","getGeoFieldFromGazetteer","geo","geometry","createGeometryCollection","dest","v0","GeometryCollection","createLineBetween","LineString","getCenterPoint","ensureSingleType","loadGazetteer","loadWorldmapPoints","GeoJSON","readFeatures","fieldOrder","getField","getBestName","idfield","getGeometry","getId","getKeys","frameFromGeoJSON","ex","lng","firstString","isPoint","getCenter","getExtent","frameAsGazetter","getFieldFinder","matchLowerNames","defaultMatchers","wkt","getLocationMatchers","gazetteer","getGeometryField","getLocationFields","derived","fetchInvitees","addInvitee","addInviteForm","revokeInvite","invitesAdapter","createEntityAdapter","selectId","invite","getSelectors","invites","addCase","setAll","inviteCode","removeOne","AddLibraryPanelContents","setFolderId","panelName","setPanelName","debouncedPanelName","setDebouncedPanelName","waiting","setWaiting","useDebounce","saveLibraryPanel","usePanelSave","onCreate","isValidName","getLibraryPanelByName","lp","invalidInput","getLibraryPanels","searchString","excludeUid","sortDirection","folderFilter","getLibraryPanel","panelSaveModel","updateLibraryPanel","deleteLibraryPanel","getLibraryPanelConnectedDashboards","libraryPanelUid","getConnectedDashboards","connections","connectionId","LibraryElementConnectionKind","createPanelLibraryErrorNotification","createPanelLibrarySuccessNotification","toPanelModelLibraryPanel","libraryPanelDto","saveAndRefreshLibraryPanel","toPanelSaveModel","savedPanel","saveOrUpdateLibraryPanel","updatePanelModelWithUpdate","DashboardEventAction","DashboardChangedModal","reloadPage","dismiss","isDelete","Deleted","continueEditing","acceptDelete","discardAndReload","radioItem","editing","sendEditingState","sessionId","EditingStarted","Saved","ignoreSave","showPopup","hasSeenNotice","editingEvent","getRecentEditingEvent","lastEditing","setEditingState","EditingCanceled","watch","leave","ignoreNextSave","PROM_STYLE_METRIC_LABEL","PushMode","StreamingDataFrame","wide","schemaChanged","optionsOverride","trimValues","dataFrameDTO","numberOfItemsToRemove","getNumberOfItemsToRemove","timeFieldIndex","schemaFields","pushMode","packetInfo","serialized","assureValuesAreWithinLengthLimit","needsMoreLength","needsBiggerDelta","needsToOverrideDefaultInfinityDelta","circPush","newLength","alwaysReplace","firstField","niceSchemaFields","displayNameFormat","hasSameStructure","sf","renderLegendFormat","isWide","ents","labeledTables","vrecs","tableKeys","transpose","addLabel","dummyTable","appended","labelCount","parsedLabels","parseLabelsFromField","proto","getStreamingFrameOptions","closestIdx","lo","hi","mid","bitwise","getLastStreamingDataFramePacket","pi","deltaIdx","nlen","sliceIdx","deltaLookup","low","high","initFromSerialized","streamingDataFrame","StreamingResponseDataType","isStreamingResponseData","responseData","isStreamingDataFrame","promiseWithRemoteObservableAsObservable","promiseWithProxyObservable","remoteObservableAsObservable","remoteObs","subscriber","remoteSubPromise","comlink","nextValueInRemoteObs","remoteSub","CentrifugeServiceWorkerProxy","centrifugeWorker","getConnectionState","observeOn","asyncScheduler","optionsAsPlainSerializableObject","getPresence","dataStreamSubscriberReadiness","GrafanaLiveService","centrifugeSrv","pushNewValues","updateBuffer","rawResponse","parsedResponse","random","initGrafanaLive","centrifugeServiceDeps","liveEnabled","CentrifugeService","hitTypes","validateNewDashboardName","validateNewFolderName","existingErrorMessage","nameLowerCased","fetchGcomDashboard","fetchDashboard","setGcomDashboard","processInputs","processElements","fetchFailed","importDashboardJson","setJsonDashboard","inputModel","InputType","setInputs","libraryPanelInputs","LibraryPanelInputState","panelInDb","setLibraryPanelInputs","clearLoadedDashboard","clearDashboard","importDashboardForm","inputsToPersist","constants","dashboardUrl","importedUrl","moveDashboards","dashboardUids","toFolder","tasks","createTask","moveDashboard","executeInOrder","successCount","succeeded","alreadyInFolderCount","alreadyInFolder","fullDash","ignoreRejections","deleteFoldersAndDashboards","folderUids","task","DashboardSource","initialImportDashboardState","updatedAt","importDashboardSlice","Gcom","organizationSlice","userOrgs","organizationLoaded","setOrganizationName","userOrganizationsLoaded","needsNumberField","needsTimeField","needsStringField","getMessageFor","changePanelPlugin","columnGap","rowGap","PanelPluginError","getPanelPluginLoadError","LoadError","getPanelPluginNotFound","silent","NotFound","defaultFieldConfig","onChangeTimeRange","onFieldConfigChange","setPlugin","syncGetPanelPlugin","useOptionDefaults","dataWithOverrides","useFieldOverrides","importPanelPlugin","PanelComponent","timeRangeVars","seriesVars","buildLabelPath","getPanelLinksVariableSuggestions","getFieldVars","uniq","getDataFrameVars","valueTimeVar","LinkSrv","onBuildUrl","getLinkUrl","getAnchorInfo","getPanelLinkAnchorInfo","initPanelState","pluginToLoad","loadPanelPlugin","panelModelAndPluginReady","panelKey","cleanUpAngularComponent","cleanAndRemoveMany","panelKeys","cleanUpKey","changeToLibraryPanel","newPluginId","oldType","clearLastResult","oldKey","changePanelKey","panelsSlice","setPanelInstanceState","setPanelAngularComponent","queryParamsToPreserve","locationUpdated","nextTimeoutId","numberOfLoops","startUrl","filteredParams","pickBy","nextDashboardUrl","validPlaylistUrl","playlistUid","isPlaying","locationListenerUnsub","playlist","getPluginDetails","remote","GCOM_API_ROOT","getRemotePlugin","isPublished","localPlugins","localReadme","getLocalPlugins","getPluginVersions","getLocalPluginReadme","grafanaDependency","grafanaVersion","pluginDependencies","readme","getRemotePlugins","remotePlugins","isRemotePluginVisible","getPluginErrors","API_ROOT","isCompatible","embedded","isLocalPluginVisible","installPlugin","uninstallPlugin","updatePluginSettings","datasourceRequest","STATE_PREFIX","mergeLocalsAndRemotes","catalogPlugins","errorByPluginId","groupErrorsByPluginId","remotePlugin","mergeLocalAndRemote","localPlugin","popularity","downloads","typeCode","publishedAt","isDisabledSecretsPlugin","getPluginSignature","isInstalled","isCore","isDev","isEnterprise","errorCode","mapRemoteToCatalog","dev","signatureOrg","signatureType","installedVersion","mapLocalToCatalog","versionSignedByOrgName","versionSignatureType","mapToCatalogPlugin","getExternalManageLink","Sorters","sortPlugins","sorters","nameAsc","nameDesc","published","getLatestCompatibleVersion","latest","isInstallControlsEnabled","isPluginVisible","pluginCatalogHiddenPlugins","isOrgAdmin","isDataSourceEditor","fetchAll","thunkApi","pluginErrors","fetchRemotePlugins","rejectWithValue","fetchDetails","install","isUpdating","invalidatePluginInCache","uninstall","panelPluginLoaded","pluginsAdapter","isPendingRequest","isFulfilledRequest","isRejectedRequest","getOriginalActionType","requests","PluginListDisplayMode","isLoadingPluginDashboards","setDisplayMode","upsertMany","updateOne","addMatcher","RequestStatus","PluginAdminRoutes","PluginIconName","PluginStatus","PluginTabLabels","PluginTabIds","settingsMapByName","defaultName","settingsMapByUid","settingsMapById","expressionDatasource","expressionInstanceSettings","getDataSourceSettingsByUid","isstring","nameOrUid","interpolatedName","variableInterpolation","loadDatasource","dsPlugin","importDataSourcePlugin","instantiate","anyInstance","getAll","isDataSource","dsValue","sorted","mixedInstanceSettings","dashboardInstanceSettings","grafanaInstanceSettings","getExternal","getAnnotationSources","getMetricSources","skipVariables","defaultDatasource","getDataSourceService","promiseCache","panelPluginCache","getPanelPlugin","importPanelPluginFromMeta","importPluginModule","PanelCtrl","initializedAt","registerPluginInCache","encodeURI","clearPluginSettingsCache","locateWithCache","defaultBust","extractPath","bust","pluginInfoCache","getPluginSettings","AlertGroup","showAlerts","setShowAlerts","noGroupingText","startsAt","actionsRow","silencedBy","generatorURL","fingerprint","isAlertingEnabled","alertmanager","filteredResults","useFilteredGroups","fetchNotifications","clearInterval","hasResults","alertManagers","getFoldersWithEntries","extraFolders","searchHit","extra","filteredExtra","findOptionWithId","ALL_FOLDER","GENERAL_FOLDER","GENERAL_FOLDER_ID","GENERAL_FOLDER_TITLE","propsOnChange","setInitialized","setOption","getFolderAsOption","getFoldersAsOptions","debouncedLoadOptions","debouncePromise","alertName","getStateFilter","stateFilter","cardContainer","alertRuleList","alertRuleItem","alertRuleItemIcon","alertRuleItemText","alertRuleItemTime","alertRuleItemInfo","noAlertsMessage","alertIcon","hasAlertState","filterAlerts","normal","isPrivateLabel","GroupBy","promRulesByDatasource","rulesDataSourceNames","allRequestsReady","AlertInstances","defaultShowInstances","groupMode","GroupMode","showInstances","displayInstances","setDisplayInstances","toggleDisplayInstances","filteredAlerts","hiddenInstances","uncollapsible","toggleShowInstances","parseMapKey","groupedRules","groupByKeys","alertHasEveryLabel","mapKey","createMapKey","existingAlerts","groupAlerts","customGroupDetails","alertLabels","getStateTagStyles","stateStyle","rulesToDisplay","maxItems","firstActiveAt","instanceDetails","alertDuration","showIfCurrentState","showOptions","ShowOption","alertList","setNoAlertsMessage","currentAlertState","dashboardQuery","dashboardAlerts","dashboardTag","currentAlerts","al","newStateDateAgo","execution_error","recentStateChanges","currentDashboard","alertHistory","onlyAlertsOnDashboard","nameFilter","dashboardFilter","dashboardTags","filterObj","curFilter","getSuggestionsForData","unifiedAlertList","promRulesRequests","haveResults","filteredRules","replacedName","alertInstanceLabelFilter","replacedLabelFilter","isGrafanaDS","filterRules","sortRules","AnnotationListItem","onAvatarClick","onTagClick","showUser","showTags","showAvatar","showTimeStamp","showTimeStampEnd","TimeStamp","Avatar","AnnoListPanel","_timeOffset","navigateBefore","navigateAfter","navigateToPanel","dashboardUIDs","queryTags","nextTag","focusedTag","dataTagId","tagListRef","parsedTagId","possibleNextTag","queryUser","onAnnoClick","onUserClick","doSearch","subs","onlyInTimeRange","onlyFromThisDashboard","hasFilter","onClearUser","noneFound","defaultPanelOptions","addTooltipSupport","onUPlotClick","setHover","isToolTipOpen","ref_parent","ref_over","clearPopupIfOpened","viewport","xIndex","yIndex","groupDistr","SPACE_BETWEEN","barDistr","xOri","xDir","rawValue","showValue","xSpacing","isXHorizontal","hasAutoValueSize","pctStacked","qt","hRect","groupWidth","barRadius","LABEL_OFFSET_FACTOR","LABEL_OFFSET_MAX","barsPctLayout","barsColors","labelOffset","vSpace","hSpace","useMappedColors","mappedColorDisp","barsBuilder","offs","lft","wid","hgt","barRect","sidx","didx","alignedTotals","calculatedSize","textMetrics","calculateFontSizeWithMetrics","autoFontSize","middleShift","actualBoundingBoxAscent","actualBoundingBoxDescent","xAdjust","yAdjust","cy","pointWithin","isHovered","xRange","pctOffset","distribute","di","lftPct","widPct","rn","xValues","xTimeAuto","xScale","oMin","oMax","xSplits","dim","_dir","skipMod","cssDim","maxTicks","drawClear","Quadtree","_paths","groupCount","barCount","out","groupOffPct","groupDimPct","barIdx","barOffPct","barDimPct","distrOne","distrTwo","valueIdx","curAlign","curBaseline","baseline","intersectsLabel","subsidx","label2","bbox2","intersects","interpolateTooltip","updateActiveSeriesIdx","updateActiveDatapointIdx","updateTooltipPosition","xTickLabelRotation","xTickLabelSpacing","defaultBarChartFieldConfig","xTickLabelMaxLength","vizOrientation","yOri","yDir","getBarCharScaleOrientation","shortenValue","rotateLabel","valueMaxLength","cos","sin","getRotationPadding","legendOrdered","isLegendOrdered","prepareBarChartDisplayValues","colorByField","firstNumber","aligned","GAPS_OPTIONS","TickSpacingEditor","isRTL","shouldDisplayCloseButton","setShouldDisplayCloseButton","onCloseToolTip","frame0Ref","chartDisplay","structureRef","f0","f1","rotationAngle","datapointIdx","DataHoverView","getFieldLegendItem","commonOptionsBuilder","xaxisPlaceholder","countNumberFields","getListWithDefaults","SuggestionName","cardOptions","previewModifier","BarGaugePanel","addStandardDataReduceOptions","addOrientationOption","getCommonAnnotationStyles","markerTriangle","markerBar","AnnotationEditorForm","timeFormatter","clickAwayRef","createAnnotationState","createAnnotation","onAnnotationCreate","updateAnnotationState","onAnnotationUpdate","isUpdatingAnnotation","isRegionAnnotation","stateIndicator","editorForm","editorContainer","AnnotationEditor","popperTrigger","setPopperTrigger","editorPopover","setEditorPopover","overlayRange","AnnotationEditorPlugin","setBbox","isAddingAnnotation","setIsAddingAnnotation","clearSelection","annotating","setSelectHooks","mousedown","targ","mouseup","startAnnotating","plotCanvas","AnnotationTooltip","editControls","alertText","isRegion","areAnnotationCommentsEnabled","commentWrapper","POPPER_CONFIG","AnnotationMarker","panelCtx","setIsEditing","markerRef","setMarkerRef","setEditorRef","popoverRenderTimeout","editorPopper","onAnnotationEdit","onAnnotationDelete","onPopoverMouseEnter","markerWrapper","AnnotationsPlugin","annotationsRef","views","clip","renderLine","setLineDash","closePath","annotationsView","mapAnnotationToXYCoords","renderMarker","ContextMenuPlugin","setPoint","onMouseCapture","isClick","pts","pt","defaultItems","ContextMenuView","ExemplarMarker","getExemplarMarkerStyles","markerElement","setMarkerElement","popperElement","setPopperElement","popperStyles","exemplarsTable","valign","valueWrapper","viewBox","marble","activeMarble","symbols","getSymbol","bg","dark2","dark9","shadowColor","tableBgOdd","dark3","gray6","ExemplarsPlugin","exemplars","mapExemplarToXYCoords","yScale","OutsideRangePlugin","timevalues","setTimeValues","setTimeRange","toX","ThresholdDragHandle","dragBounds","mapPositionToValue","outOfBounds","setCurrentValue","onStop","lastY","onDrag","bounds","handle","handleText","mainColor","arrowStyles","triangle","getArrowStyles","isOutOfBounds","ThresholdControlsPlugin","onThresholdsChange","thresholdHandles","handles","nextSteps","prepareGraphableFields","hasValueField","nulledFrame","getTimezones","timezones","defaultTimezone","VizDisplayMode","CandleStyle","ColorStrategy","defaultColors","CandlesVolume","candleStyle","Candles","colorStrategy","OpenClose","includeAllFields","candlestickFieldsInfo","volume","findFieldOrAuto","prepareCandlestickFields","timeSeriesFrames","used","autoOpenClose","Volume","candleStyles","OHLCBars","colorStrategies","CloseClose","numericFieldFilter","addFieldPicker","canEditThresholds","onSplitOpen","forField","doNothing","volumeAlpha","volumeIdx","shouldRenderVolume","volumeField","_splits","shouldRenderPrice","upColor","downColor","flatColor","flatAsUp","drawPrice","asCandles","drawVolume","selectPath","priceDir","flatPath","upPath","downPath","oIdx","hIdx","lIdx","cIdx","vIdx","downPathVol","upPathVol","flatPathVol","Path2D","hollowPath","tData","oData","cData","hData","lData","vData","zeroPx","dataX","dataY","colWidth","prevIdx","minDelta","stickWidth","outlineWidth","halfWidth","tPx","interDir","sign","intraDir","outerPath","vPx","hPx","lPx","oPx","cPx","btm","globalCompositeOperation","drawMarkers","enableAnnotationCreation","getGraphFieldConfig","defaultGraphConfig","PanelLayout","showHeadings","showRecentlyViewed","showSearch","showStarred","dashlistSectionHeader","dashlistSection","dashlistLink","dashlistStar","dashlistFolder","dashlistTitle","dashlistLinkBody","dashlistItem","gridContainer","IconToggle","toggleCheckbox","iconPropsOverride","iconProps","defaultChecked","checkBox","appearance","setDashboards","replaceVars","starredDashboards","recentDashboards","searchedDashboards","searched","dashMap","dashId","isRecent","isSearchResult","fetchDashboards","toggleDashboardStar","updatedDashboards","dashboardList","dashboardGroups","renderList","renderPreviews","SearchCard","Previews","headings","CursorView","EventBusLoggerPanel","eventObserver","RenderInfoViewer","dataChanged","counters","oldSeries","showCounters","lastRender","resetCounters","StateView","onInstanceStateChange","StateViewEditor","DebugMode","DebugPanel","Events","Cursor","State","ThrowError","Render","cardStyle","completeGradient","darkThemeGradients","lightThemeGradients","borderGradient","iconStyle","blue95","cardContent","DocsCard","learnHref","learnUrl","TutorialCard","handleTutorialClick","cardTitle","Step","setup","step1TutorialTitle","keyPrefix","step1Key","step2Key","GettingStarted","checksDone","currentStep","subheading","check","core","checkedStepsPromises","checkedCardsPromises","checkedCards","checkedSteps","backForwardButtons","onPreviousClick","onForwardClick","headerLogo","getBucketSize","wantedMin","wantedMax","fullRangeMin","xAxisFormatter","incrs","minSpace","_space","bucketWidth","firstSplit","lastSplit","tickLabels","curMax","maxCount","keepMod","countField","dispY","vis","preparePlotData","Histogram","rawSeries","defaultPanelFieldConfig","originalDataHasHistogram","scopes","LiveChannelEditor","updateSelectOptions","dropWrap","onScopeChanged","onNamespaceChanged","findPathOption","onPathChanged","getFormattedValue","TablePanel","matcherId","propId","panelModel","datasourceRef","applyFilterFromTable","renderTable","getFooterCells","showHeader","getCurrentFrameIndex","hasFields","inputHeight","selectWrapper","onChangeTableSelection","MessageDisplayMode","LivePanel","loadChannel","streamObserver","renderNotEnabled","renderMessage","renderPublish","onSaveJSON","onPublishClicked","statusClass","statusWrap","renderBody","halfHeight","brandPrimary","brandSuccess","brandWarning","brandDanger","Raw","isAscending","labelContainer","showCommonLabels","logsContainerRef","renderCommonLabels","DEFAULT_FEED_URL","getProperty","propNode","loadFeed","fetchFeedText","DOMParser","parseFromString","pubDate","ogImage","parseAtomFeed","parseRSSFeed","NewsPanel","refreshSubscription","feedUrl","feed","feedToDataFrame","news","isError","showImage","useWideLayout","itemWide","socialImage","socialImageWide","ArcOptionsEditor","updateField","arcs","arc","removeArc","newArc","memoizedGetNodeGraphDataFrames","getNodeGraphDataFrames","NodeGraph","useComponentInstanceId","idRef","PieChartType","PieChartLegendValues","PieChartLabels","filterDisplayItems","sumDisplayItemsReducer","fieldDisplayValues","pieType","highlightedTitle","componentInstanceId","useTooltip","containerRef","TooltipInPortal","useTooltipInPortal","detectBounds","filteredFieldDisplayValues","getGradientId","toHex","getGradientColor","tooltipOpen","outerRadius","donutThickness","Pie","innerRadius","gradientFromOffset","getPieLayout","fieldDisplayValue","RadialGradient","getGradientColorFrom","getGradientColorTo","fromOffset","toOffset","gradientUnits","pieValue","cornerRadius","padAngle","pie","highlightState","getHighlightState","PieSlice","PieLabel","tooltipTop","tooltipPortal","tooltipLeft","unstyled","applyPositionStyle","tooltipData","onMouseMoveOverArc","localPoint","ownerSVGElement","getTooltipData","pieStyle","getSvgStyle","labelRadius","labelX","labelY","startAngle","endAngle","getLabelPos","labelFontSize","textAnchor","Percent","pa","pieArc","HighLightState","Highlighted","Deemphasized","Normal","svgArg","deemphasized","defaultLegendOptions","getLegend","displayValues","legendOptions","hideFromViz","valuesToShow","fractionOfTotal","percentOfTotal","setHighlightedTitle","setHighlightedSlice","resetHighlightedSlice","useSliceHighlightState","fd","hasFrames","aliasColors","legendType","Donut","percentage","StateTimelineTooltip","onAnnotationAdd","linkLookup","nextStateIdx","findNextStateIndex","nextStateTs","stateTs","toFragment","durationFragment","fmtDuration","TimelineChart","frameIdx","prepareTimelineFields","mergeValues","prepareTimelineLegendItems","renderCustomTooltip","valueFieldsCount","TimelineMode","valuemap","colorMaps","defaultTimelineFieldConfig","SpanNullsEditor","StatusHistoryTooltip","defaultStatusFieldConfig","PaginationEditor","transformsMap","timeseries_to_rows","timeseries_to_columns","timeseries_aggregations","columnsMap","colorModeMap","generateThresholds","migrateTableStyleToOverride","defaultTo","linkTooltip","linkTargetBlank","footerCategory","oldOpts","migrateTransformations","prevDefaults","migrateDefaults","TextMode","Markdown","TextPanel","processContent","updateHTML","prepareHTML","interpolateString","sanitizeString","prepareMarkdown","HTML","TextPanelEditor","editorBox","oldTextPanel","TimezonesEditor","addTimezone","setTimezone","removeTimezone","getThresholdColor","getFieldConfigFromOldAxis","validNumber","fillY2DynamicValues","y1G","y2G","hasFillBelowTo","seriesOverride","dashOverride","legendConfig","alignAsTable","enabledLegendValues","ids","getReducersFromLegend","sideWidth","tooltipConfig","shared","flotToGraphOptions","fr","migrateHideFrom","getElementsByClassName","helpOptions","helpText","helpLinks","helpLink","TooltipView","infoWrap","DimensionError","ScatterLineMode","isGraphable","getSimpleFieldMatcher","getSimpleFieldNotMatcher","defaultScatterConfig","prepScatter","ttip","dims","pointColorFixed","pointColorIndex","pointSizeConfig","pointSizeIndex","getScatterSeries","numericIndicies","prepSeries","pointColorMode","pointSizeHints","pointSizeFixed","pointSymbol","hints","scatterSeries","drawBubbles","scaleX","scaleY","valToPosX","valToPosY","xOff","yOff","xDim","yDim","scatterInfo","showLine","deg360","xKey","yKey","pointHints","colorByValue","filtLft","filtRgt","filtBtm","filtTop","pointColors","pointAlpha","linePath","lineCap","dist","ocx","ocy","scatterIndex","asSingleValue","colorValues","colorAlphaValues","asArray","XYChartPanel2","scatterHoverCallback","initSeries","initFacets","XYDimsEditor","frameNames","NoData","BadFrameSelection","getXYDimensions","numberFields","yFields","xName","sorter","categoryStyles","Linear","LineStyleEditor","heatmap","textPanel","timeseriesPanel","stateTimelinePanel","statusHistoryPanel","candlestickPanel","xyChartPanel","dashListPanel","alertListPanel","annoListPanel","tablePanel","newsPanel","livePanel","statPanel","debugPanel","gettingStartedPanel","gaugePanel","pieChartPanel","barGaugePanel","barChartPanel","logsPanel","tracesPanel","welcomeBanner","nodeGraph","histogramPanel","alertGroupsPanel","grafanaUI","grafanaUIraw","exposeToPlugin","grafanaRuntime","require","exports","grafanaData","locate","baseURL","defaultExtension","packages","esModule","authorization","jquery","d3","rxjs","rxjsOperators","reactRouter","prismjs","slate","slateReact","slatePlain","reactDom","reactRedux","redux","emotion","__esModule","flotDeps","flotDep","fakeDep","builtInPlugins","importAppPlugin","revokeUserSession","loadUser","loadSessions","loadOrgs","loadTeams","setUserOrg","org","updateUserProfile","initialUserState","orgsAreLoading","sessionsAreLoading","teamsAreLoading","updateFiscalYearStartMonth","setUpdating","updating","userLoaded","initLoadTeams","teamsLoaded","initLoadOrgs","orgsLoaded","initLoadSessions","sessionsLoaded","userSessionRevoked","updateFiscalYearStartMonthForSession","QueryActionComponents","addExtraRenderAction","extraRenderActions","getAllExtraRenderAction","GroupActionComponents","RowActionComponents","QueryEditorRowHeader","collapsedText","renderExtras","validationError","setValidationError","onEndEditName","queryNameWrapper","queryName","queryEditIcon","otherQuery","queryNameInput","renderDataSource","contextInfo","onChangeDataSource","bg3","formInputBorderActive","QueryErrorAlert","hasTextEditMode","showingHelp","angularQueryEditor","getAngularQueryComponentScope","angularScope","renderAngularQueryEditor","getReactQueryEditor","toggleEditorMode","onRemoveQuery","onAddQuery","onToggleHelp","allWarnings","filterPanelDataToQuery","serie","uniqueWarnings","serializedWarnings","extraActions","renderWarnings","hideDisableQuery","hasEditorHelp","onToggleEditMode","renderExtraActions","onCopyQuery","onDisableQuery","renderHeaderExtras","renderCollapsedText","me","getQueryDataSourceIdentifier","dataSourceIdentifier","loadedDataSourceIdentifier","dataFilteredByRefId","notifyAngularQueryEditorsOfData","rowClasses","renderPluginEditor","DatasourceCheatsheet","renderActions","onClickExample","dedupAnnotations","dedup","partition","eventsById","eventGroup","isPanelAlert","head","AlertStatesWorker","canWork","work","emptyResult","handleDashboardQueryRunnerWorkerError","AnnotationsQueryRunner","canRun","handleAnnotationQueryRunnerError","LegacyAnnotationQueryRunner","AnnotationsWorker","runners","getAnnotationsToProcessFilter","publicDashboardViewMode","observables","handleDatasourceSrvError","runner","AnnotationQueryStarted","getDashboardQueryRunner","cancellations","translateQueryResult","finalize","AnnotationQueryFinished","mergeAll","UnifiedAlertStatesWorker","hasAlertRules","dashboard_uid","panelIdToAlertState","promAlertStateToAlertState","DashboardQueryRunnerImpl","workers","SnapshotWorker","getResult","cancel","executeRun","ReplaySubject","runs","cancellationStream","runsSubscription","eventsSubscription","getAnnotationsByPanelId","workerObservables","resultSubscription","resultObservable","timerSubscription","timerObservable","dashboardQueryRunner","createDashboardQueryRunner","setDashboardQueryRunner","getAnnotationsFromSnapshot","getAnnotationsInSnapshot","notifyWithError","annotationsFromDataFrames","PublicDashboardDataSource","isMixedDatasource","resolveUid","MIXED_DATASOURCE_NAME","testDatasource","getNextRequestId","dataConfigSource","withTransforms","subject","withFieldConfig","lastData","isFirstPacket","lastConfigRev","snapshotPanelData","getTransformationsStream","processedData","streamingPacketWithSameSchema","isSharedDashboardQuery","pipeToSubject","runSharedRequest","getDataSource","isMixedDS","isExpressionQuery","lowerIntervalLimit","panelObservable","dashObservable","combineLatest","combined","dashData","cancelQuery","cancelNetworkRequestsOnUnsubscribe","setStructureRevision","processResponsePacket","packet","packets","dataItem","dataTopic","getRequestTimeRange","queryFunction","dataObservable","returnVal","callQueryMethod","errLog","queryCacheStatus","totalQueries","cachedQueries","eventData","dataSize","emitDataRequestEvent","getProcessedDataFrame","getProcessedDataFrames","STARTTIME","performance","processedDataFrames","annotationsProcessed","STOPTIME","timings","dataProcessingTime","SearchCardExpanded","imageHeight","imageWidth","lastUpdated","hasImage","setHasImage","imageSrc","imageContainer","image","imagePlaceholder","infoHeader","titleContainer","updateContainer","IMAGE_HORIZONTAL_MARGIN","onTagSelected","onToggleChecked","setLastUpdated","showExpandedView","setShowExpandedView","offsetCallback","onShowExpandedView","SearchCheckbox","checkbox","expandedView","markerWidth","popperWidth","getIconFromMeta","metaIconMap","SearchItem","tagSelected","handleCheckboxClick","SEARCH_ITEM_HEIGHT","metaContainer","sortMetaName","sortMeta","GENERAL_FOLDER_UID","SEARCH_PANELS_LOCAL_STORAGE_KEY","SEARCH_SELECTED_LAYOUT","useKeyNavigationListener","eventsRef","keyboardEvents","useSearchKeyboardNavigation","numColumns","highlightIndexRef","setHighlightIndex","urlsRef","updateLocation","useSearchQuery","parseRouteParams","defaultQuery","selectedLayout","useReducer","QUERY_CHANGE","onTagFilterChange","SET_TAGS","onDatasourceChange","DATASOURCE_CHANGE","onTagAdd","ADD_TAG","onClearFilters","CLEAR_FILTERS","defaultQueryParams","onStarredFilterChange","TOGGLE_STARRED","onClearStarred","onSortChange","TOGGLE_SORT","onLayoutChange","LAYOUT_CHANGE","DashboardSearch","onCloseSearch","includePanels","setIncludePanels","setInputValue","searchField","closeBtn","SearchView","onQueryTextChange","newQueryText","showManage","SearchWrapper","updateUrlParams","ExplainScorePopup","explain","allowedActions","dsUids","generateColumns","selectionToggle","showingEverything","uidField","kindField","sortFieldWith","sortField","checkboxHeader","hasUID","nameCellStyle","missingTitleText","headerNameStyle","typeField","typeText","makeTypeColumn","panel_type","ds_uid","datasourceItemClass","invalidDatasourceItemClass","srv","dslist","makeDataSourceColumn","datasourceItem","invalidDatasourceItem","locationInfo","locationCellStyle","locationItem","getIconForKind","tagListClass","makeTagsColumn","sortedHeader","getDisplayValue","getDisplay","showExplainPopup","explainItem","SearchResultsTable","columnStyles","getColumnStyles","infiniteLoaderRef","listEl","setListEl","totalRows","resetloadMoreItemsCache","getTableBodyProps","rowContainer","selectedRow","headerRow","isItemLoaded","loadMoreItems","onItemsRendered","MessageLink","PreviewsSystemRequirements","showPreviews","previewsEnabled","rendererAvailable","systemRequirementsMet","shouldDisplayRequirements","reportSearchFailedQueryInteraction","dashboardListType","getQuerySearchContext","previews","starredFilter","tagCount","queryLength","layoutOptions","getValidQueryLayout","ActionRow","getTagOptions","showStarredFilter","hideLayout","actionRow","checkboxWrapper","FolderSection","renderStandaloneBody","getSectionHeaderStyles","sectionExpanded","setSectionExpanded","getSectionStorageKey","itemsUIDs","getGrafanaSearcher","uri","useUniqueId","renderResults","folderViewResults","FolderView","hidePseudoFolders","stars","ConfirmDeleteModal","onDeleteItems","folderCount","dashCount","dashEnding","folderEnding","MoveToFolderModal","onMoveItems","setFolder","selectedDashboards","moving","setMoving","ending","ManageActions","canMove","includesGeneralFolder","isMoveModalOpen","setIsMoveModalOpen","isDeleteModalOpen","setIsDeleteModalOpen","SearchResultsCards","finfo","SearchResultsGrid","itemProps","cellWidth","numRows","visibleStartIndex","visibleRowStartIndex","visibleStopIndex","visibleRowStopIndex","overscanStartIndex","overscanRowStartIndex","overscanStopIndex","overscanColumnStopIndex","innerElementType","facade","virtualizedGridItemWrapper","folderDTO","searchSelection","setSearchSelection","newSearchSelection","isFolders","listKey","setListKey","eventTrackingNamespace","withAllowedActions","reportDashboardListViewed","reportSearchResultInteraction","trackingInfo","reportSearchQueryInteraction","toggleSelection","uids","updateSearchSelection","getStarredItems","noResults","unsupported","REMOVE_STARRED","REMOVE_TAG","prevSort","replaceCurrentFolderQuery","getCurrentFolderUID","BlugeSearcher","facet","doSearchQuery","getGrafanaDatasource","GrafanaQueryType","getTermCountsFrom","sortFields","sortTimeFields","max_score","getSortFieldDisplayName","loadMax","startIndex","stopIndex","submeta","getNextPage","SQLSearcher","general","doAPIQuery","searcher","useBluge","cleanedParams","folderStr","EXPIRATION_OPTIONS","CreateTokenModal","serviceAccountLogin","onCreateToken","tomorrow","defaultTokenName","setDefaultTokenName","newTokenName","setNewTokenName","isWithExpirationDate","setIsWithExpirationDate","newTokenExpirationDate","setNewTokenExpirationDate","isExpirationDateValid","setIsExpirationDateValid","onCloseInternal","modalTitle","modalTokenRow","modalCopyToClipboardButton","secondsToLive","getSecondsToLive","dateAsDate","API_KEYS_MIGRATION_INFO_STORAGE_KEY","BASE_URL","fetchACOptions","acOptionsLoaded","builtInRolesLoaded","getApiKeysMigrationStatus","fetchServiceAccounts","serviceAccountsFetchBegin","serviceAccountStateFilter","serviceAccounts","serviceAccountsFetched","serviceAccountsFetchEnd","fetchServiceAccountsWithDebounce","updateServiceAccount","serviceAccount","deleteServiceAccount","serviceAccountId","createServiceAccountToken","saID","onTokenCreated","ServiceAccountStateFilter","changeStateFilter","stateFilterChanged","getApiKeysMigrationInfo","showApiKeysMigrationInfo","showApiKeysMigrationInfoLoaded","closeApiKeysMigrationInfo","serviceAccountProfileSlice","serviceAccountFetchBegin","serviceAccountFetchEnd","serviceAccountLoaded","serviceAccountTokensLoaded","serviceAccountProfileReducer","initialStateList","serviceAccountsSlice","serviceAccountsReducer","serviceAccountProfile","SimpleStorage","storagePath","deleteFile","overwriteExistingFile","filenameAlreadyExists","fileNames","trimmedLowerCase","storage","StorageView","initialTeamsState","searchPage","teamsSlice","setTeamsSearchPage","teamsReducer","teamSlice","members","searchMemberQuery","teamLoaded","teamMembersLoaded","setSearchMemberQuery","teamGroupsLoaded","FormatRegistryID","formatRegistry","lucene","luceneEscape","escapedValues","distributed","percentEncode","encodeURIComponentStrict","singleQuote","regExp","doubleQuote","sqlString","toISOString","glob","ALL_VARIABLE_VALUE","ALL_VARIABLE_TEXT","formatVariableLabel","queryParam","formatQueryParameter","runtimeDependencies","getFilteredVariables","getVariableWithName","variableRegex","_variables","updateIndex","isNone","variableInitialized","getAdhocFilters","getAdHocVariables","variableUid","formatItem","setGrafanaVariable","grafanaVariables","setGlobalVariable","getVariableName","lastIndex","containsTemplate","getVariableAtIndex","variableExists","highlightVariablesAsHtml","var1","var2","fmt2","var3","getAllValue","allValue","getFieldAccessor","fieldPath","fieldAccessorCache","getVariableValue","scopedVar","getVariableText","fmt3","getValueForUrl","systemValue","isAllValue","replaceWithText","HeatmapCalculationMode","logModeOptions","AxisEditor","addHeatmapCalculationOptions","fixedDec","genIncrs","minExp","maxExp","mults","multDec","exp","expa","mag","_incr","allMults","decIncrs","oneIncrs","wholeIncrs","niceLinearIncrs","niceTimeIncrs","heatmapTransformer","calculateHeatmapFromData","keepOriginalData","readHeatmapRowsCustomMeta","isHeatmapCellsDense","foundY","rowsToCellsHeatmap","counts2","bucketCounts","bi","bucketBounds","yi","ordinalFieldName","le","HeatmapCellLayout","yOrdinalDisplay","yMatchWithLabel","yOrdinalLabel","yMinDisplay","yValues","xBucketsCfg","xBuckets","yBucketsCfg","yBuckets","heat2d","xSorted","ySorted","minX","minY","yExp","yLog","xBinIncr","xSize","yBinIncr","ySize","xMode","yMode","approx","xIncrs","xTime","xIncrIdx","yIncrs","yTime","yIncrIdx","binX","xCeil","binY","yCeil","log2","minXBin","maxXBin","minYBin","maxYBin","xBinQty","yBinQty","xs2","ys2","xQty","yQty","xIncr","yIncr","initBins","SpatialAction","SpatialCalculation","SpatialOperation","Prepare","toLineString","calculateBearings","bearing","getCenterPointWGS84","degrees","atan2","getCoordinates","toLonLat","doGeomeryCalculation","getArea","getLength","canInvite","externalUserMngInfo","externalUserMngLinkName","externalUserMngLinkUrl","usersSlice","usersLoaded","setUsersSearchQuery","setUsersSearchPage","filterTableName","getVariableByOptions","createAdHocVariable","addFilter","filterUpdated","variableUpdated","removeFilter","filterRemoved","filterAdded","setFiltersFromUrl","filtersRestored","changeVariableDatasource","extended","getAdhocVariableEditorState","getTagKeys","changeVariableEditorExtended","initAdHocVariableEditor","getLastKey","initialAdHocVariableModelState","AdHocFilterKey","filterKey","getTagKeysOptions","loadKeys","fetchFilterKeys","plusSegment","fetchFilterKeysWithRemove","REMOVE_FILTER_KEY","REMOVE_VALUE","AdHocFilterValue","placeHolder","fetchFilterValues","getTagValues","OperatorSegment","AdHocFilterRenderer","onKeyChange","onOperatorChange","AdHocFilterBuilder","appendBefore","onCompleted","setKey","setOperator","onKeyChanged","onOperatorChanged","onValueChanged","ConditionSegment","AdHocFilter","renderFilters","appendFilterToVariable","segments","renderFilterSegments","initialVariableModelState","adHocVariableSlice","initialVariablesState","getInstanceState","adHocVariableReducer","NEW_VARIABLE_ID","NONE_VARIABLE_TEXT","NONE_VARIABLE_VALUE","LEGACY_VARIABLE_QUERY_EDITOR_NAME","LegacyVariableQueryEditor","sectionHeading","selectContainer","VariableTextAreaField","getLineCount","initialVariableEditorState","variableEditorReducerSlice","addVariableEditorError","errorProp","removeVariableEditorError","cleanEditorState","variableEditorReducer","editorState","getDatasourceVariableEditorState","getQueryVariableEditorState","skipUrlSync","withMulti","hasObjectProperty","hasCurrent","withProperty","hasLegacyVariableSupport","metricFindQuery","hasStandardVariableSupport","variableSupport","toDataQuery","hasCustomVariableSupport","hasDatasourceVariableSupport","isLegacyQueryEditor","isQueryEditor","initialVariableInspectState","variableInspectReducerSlice","variableInspectReducer","dependsOn","variableRegexExec","validVariableNames","getPropsWithVariable","variableId","hasVariable","containsVariable","objectValues","newResult","unUsed","unknowns","unknown","unknownVariables","unknownVariableNames","getUnknownVariableStrings","unknownVariable","createUnknownsNetwork","getAllAffectedPanelIdsForVariableChange","variableGraph","panelsByVar","allDependencies","newSet","mapSet","descendants","panelsByVarUsage","thePanels","varId","getDependentPanels","traverseTree","leafId","showGraph","countLeaves","getPanelVars","jsonString","varNames","varName","applyStateChanges","initialOptionPickerState","queryValue","selectedValues","applyLimit","updateDefaultSelection","updateAllSelection","optionsPickerSlice","queryHasSearchFilter","containsSearchFilter","hideOptions","toggleOption","clearOthers","forceSelect","moveOptionsHighlight","nextIndex","toggleAllOptions","updateSearchQuery","updateOptionsAndFilter","optionsText","updateOptionsFromSearch","cleanPickerState","optionsPickerReducer","isVariableWithOptions","convertToMulti","convertToSingle","Edge","_linkTo","inputEdges","outputEdges","inputNode","outputNode","unlink","inode","onode","getEdgeFrom","getEdgeTo","getOptimizedInputEdges","toBeRemoved","inputEdgesNodes","edgeToRemove","createNode","createNodes","inputArr","outputArr","inputNodes","outputNodes","getNode","createEdge","initialNodes","descendantsRecursive","newDescendants","fixSelectedInconsistency","changeVariableMultiValue","isDependencyGraphCircular","encounteredDependencyIds","getDirectDependencies","directDependencies","otherVariable","isWaitingForDependencies","processVariable","processVariableDependencies","urlValue","refreshableVariable","completeVariableLoading","stringUrlValue","ensureStringValues","setValueFromUrl","setOptionFromUrl","getVariableRefresh","variableFromState","defaultText","foundOption","castArray","validateVariableSelectionState","variableInState","selectOptionsForCurrentValue","getCurrentText","setOptionAsCurrent","emitChanges","setCurrentVariableValue","createGraph","v2","emitChangeEvents","TransactionStatus","upgradeLegacyQueries","panelVars","getQueryWithVariables","variablesThatNeedRefresh","createVariableErrorNotification","previousOptions","updatedOptions","templateVarsChangedInUrl","isVariableUrlValueDifferentFromCurrent","removed","variableInModel","filteredVars","varGraph","affectedPanels","variableValue","queryParamsNew","adapter","initVariablesTransaction","urlUid","lastKey","getIfExistsLastKey","variablesInitTransaction","orgModel","userModel","addSystemTemplateVariables","orderIndex","variableStateNotStarted","initDashboardTemplating","getDatasourceSrvFunc","migrateVariablesDatasourceNameToRef","variablesCompleteTransaction","cleanUpVariables","cleanVariables","variablesClearTransaction","rethrow","hasOngoingTransaction","variableStateFetching","variableStateFailed","variableStateCompleted","isDataQueryType","initialKeyedVariablesState","keyAsString","isKeyedAction","outerAction","stringKey","nextKeyState","getTemplatingReducers","templatingReducers","variablesReducer","optionsPicker","transactionReducer","getInitialTemplatingState","initialTransactionState","throwWhenMissing","variablesState","getFilteredVariablesByKey","s1","s2","defaultVariablesFilter","getSubMenuVariables","getNextVariableIndex","sharedReducerSlice","beforeAdding","lodashDefaults","variableStates","sharedReducer","transactionSlice","actionAffectsDirtyState","globalVariables","allVariables","VariableSort","dontHide","variableString","getSearchFilterScopedVar","wildcardChar","__searchFilter","isMatchingVariable","varMatch","getTemplatedRegex","getLegacyQueryOptions","queryVariable","getUrlValueForComparison","findTemplateVarChanges","convertToType","convertToBool","basicMatcherEditor","validator","setInvalid","onChangeValue","onChangeOptions","NoopMatcherEditor","rangeMatcherEditor","valueMatchersUI","ValueMatcherID","FilterByValueFilterEditor","fieldsInfo","fieldsAsOptions","fieldByDisplayName","getFieldName","matcherOptions","getMatcherOptions","getSelectedMatcherId","onChangeField","onChangeMatcher","getDefaultOptions","onChangeMatcherOptions","isApplicable","filterTypes","filterMatch","filterByValueTransformRegistryItem","getEditorStyles","useFieldsInfo","onAddFilter","onDeleteFilter","onChangeFilter","onChangeType","onChangeMatch","getTransformerOptionPane","heatmapTransformRegistryItem","getFieldConfigFromFrame","evaluatedMappings","configValue","targetProperty","mappingValues","valueMap","mappingColors","mappingTexts","combineValueMappings","FieldConfigHandlerKey","configMapHandlers","Ignore","toNumericOrUndefined","defaultReducer","configMapHandlersIndex","lookUpConfigHandler","getConfigMapHandlersIndex","evaluteFieldMappings","withNameAndValue","nameFieldMappping","handlerKey","valueFieldMapping","nameField","automatic","FieldToConfigMappingEditor","withReducers","configHandlerToSelectOption","configOption","findConfigHandlerFor","missingInFrame","getViewModelRows","configProps","labelCell","selectCell","existingIdx","onChangeConfigProperty","onChangeReducer","isAutomatic","configFromDataTransformer","configRefId","configFrame","reducedConfigFrame","newField","fieldMapping","applyTo","outputFrame","dataConfig","extractConfigFromQuery","configFromQueryTransformRegistryItem","currentRefId","currentMatcher","matcherUI","matcherOption","calculationModes","okTypes","CalculateFieldTransformerEditor","updateReduceOptions","updateBinaryOptions","initOptions","configuredOptions","extractAllNames","extractNamesAndSelected","allNames","renderReduceRow","onFieldToggle","onStatsChange","renderBinaryOperation","foundLeft","foundRight","leftNames","rightNames","ops","onBinaryLeftChanged","onBinaryOperationChanged","onBinaryRightChanged","onAliasChanged","onToggleReplaceFields","calculateFieldTransformRegistryItem","nameModes","ConcatenateTransformerEditor","onLabelChanged","concatenateTransformRegistryItem","fieldNamePickerSettings","convertFieldTypeTransformRegistryItem","onSelectField","onSelectDestinationType","onInputFormat","onAddConvertFieldType","onRemoveConvertFieldType","FilterByNameTransformerEditor","isRegexValid","onInputBlur","filterFieldsByNameTransformRegistryItem","FilterByRefIdTransformerEditor","filterFramesByRefIdTransformRegistryItem","useAllFieldNamesFromDataFrames","getDistinctLabels","distinct","GroupByFieldConfiguration","onConfigChange","getStyling","rowSpacing","calculations","groupByTransformRegistryItem","groupingToMatrixTransformRegistryItem","onSelectColumn","onSelectRow","onSelectValue","histogramTransformRegistryItem","onBucketSizeChanged","onBucketOffsetChanged","onToggleCombine","labelsToFieldsTransformerRegistryItem","labelNames","onToggleSelection","limitTransformRegistryItem","onSetLimit","limitField","mergeTransformerRegistryItem","OrganizeFieldsTransformerEditor","excludeByName","renameByName","orderedFieldNames","orderFieldNamesByIndex","onToggleVisibility","shouldExclude","endIndex","reorderToIndex","onRenameField","DraggableFieldName","renamedFieldName","getFieldNameStyles","nameByIndex","organizeFieldsTransformRegistryItem","reduceTransformRegistryItem","onSelectMode","onToggleTime","onToggleLabels","RenameByRegexTransformerEditor","handleRegexChange","handleRegexBlur","handleRenameChange","handleRenameBlur","renameByRegexTransformRegistryItem","seriesToFieldsTransformerRegistryItem","byField","seriesToRowsTransformerRegistryItem","sortByTransformRegistryItem","sorts","FieldExtractorID","fmts","KeyValues","buff","esc","isEscaped","extAuto","fieldExtractors","extractFieldsTransformer","addExtractedFields","extractFieldsTransformRegistryItem","joinByLabelsTransformer","joinByLabels","getErrorFrame","inputFields","joinValues","nameValues","joinByLabelsTransformRegistryItem","valueOption","joinOptions","addOptions","hasJoin","addText","addJoin","updateJoinValue","fieldLookupTransformer","fieldMatches","lookupField","addFieldsFromGazetteer","doGazetteerXform","fieldLookupSettings","fieldLookupTransformRegistryItem","onPickLookupField","onPickGazetteer","timeSeriesFormat","toTimeSeriesMany","toTimeSeriesLong","valueFields","labelFields","uniqueValueNames","uniqueValueNamesToType","uniqueLabelKeys","labelKeyToWideIndices","uniqueFactorNamesToWideIndex","tKey","wideIndices","sortedTimeRowIndices","sortedUniqueLabelKeys","uniqueFactorNames","uniqueFactorNamesWithWideIndices","wideRowIndex","longFrame","timeWideRowIndex","wideFieldIndex","wideField","prepareTimeSeriesTransformer","TimeSeriesWide","TimeSeriesMany","TimeSeriesLong","prepareTimeseriesTransformerRegistryItem","onSelectFormat","rowsToFieldsTransformer","outFields","getLabelsFromRow","rowsToFields","rowsToFieldsTransformRegistryItem","spatialTransformer","isLineBuilderOption","targetLocation","modify","calculate","doSetGeometry","spatialTransformRegistryItem","getStandardTransformers","monacoPath","scripts","loadKusto","parallelScripts","allPromises","loadScript","script","scriptEl","__monacoKustoResolvePromise","getDefaultMonacoLanguages","ErrorPage","getServiceStyles","LoginDivider","getButtonStyleFor","LoginServiceButtons","enabledServices","oauthEnabled","saml","google","azuread","github","gitlab","grafanacom","hrefName","okta","oauth","generic_oauth","loginServices","hasServices","UserSignup","verifyEmailEnabled","forgottenPasswordStyles","LoginPage","UserLdapSyncInfo","onUserSync","ldapSyncInfo","nextSyncTime","nextSync","debugLDAPMappingURL","canReadLDAPUser","canSyncLDAPUser","OrgPicker","excludeOrgs","orgOptionsState","getOrgOptions","allOrgs","idArray","anOrg","UserOrgs","showAddOrgModal","addToOrgButtonRef","isExternalUser","onOrgRoleChange","onOrgRemove","onOrgAdd","addToOrgContainerClass","canAddToOrg","OrgRow","showOrgAddModal","AddToOrgModal","dismissOrgAddModal","getOrgRowStyles","removeButton","disabledTooltip","tooltipItem","tooltipItemLink","rolePickerWrapper","rolePicker","UnThemedOrgRow","currentRole","isChangingRole","canChangeRole","canRemoveFromOrg","rolePickerDisabled","ExternalUserTooltip","ChangeOrgButton","onChangeRoleClick","onCancelClick","onOrgRoleSave","getAddToOrgModalStyles","buttonRow","selectedOrg","pendingOrgId","pendingUserId","userOrg","onOrgSelect","onRoleUpdate","onAddUserToOrg","getChangeOrgButtonTheme","adminOptions","UserPermissions","onGrafanaAdminChange","currentAdminOption","setCurrentAdminOption","canChangePermissions","onUserUpdate","onUserDelete","onUserDisable","onUserEnable","onPasswordChange","showDeleteModal","setShowDeleteModal","showDisableModal","setShowDisableModal","deleteUserRef","showDeleteUserModal","disableUserRef","showDisableUserModal","authSource","authLabels","lockMessage","editLocked","isExternal","passwordChangeLocked","canDisable","canEnable","UserProfileRow","locked","inputType","inputElem","focusInput","LockedRow","setInputElem","onEditClick","lockMessageClass","BaseUserSessions","showLogoutModal","forceAllLogoutButton","onSessionRevoke","onAllSessionsRevoke","i18n","logoutFromAllDevicesClass","canLogout","dateStyle","showLogoutConfirmationModal","dismissLogoutConfirmationModal","UserSessions","withI18n","UserAdminPage","isLDAPUser","canReadSessions","LdapConnectionStatus","ldapConnectionInfo","serverInfo","port","available","LdapErrorBox","connectionErrors","errorElements","LdapSyncInfo","isSyncing","handleSyncClick","schedule","LdapUserGroups","showAttributeMapping","groupDN","LdapUserMappingInfo","ldapValue","cfgAttrValue","LdapUserPermissions","LdapUserTeams","teamName","LdapUserInfo","ldapUser","LdapPage","fetchUserMapping","fetchLDAPStatus","onClearUserError","ErrorLoadingChunk","chunkNotFound","LoadingChunkPlaceHolder","loadComponentHandler","pastDelay","SafeDynamicImport","Loadable","commonRoutes","legacyRoutes","unifiedRoutes","pageClass","getAlertingRoutes","unifiedAlertingEnabled","alertingEnabled","uniquePaths","liveRoutes","getLiveRoutes","DEFAULT_ROUTES","routeName","ADMIN_ROUTES","profileRoutes","getProfileRoutes","profileEnabled","ServiceAccountPermissions","ServiceAccountProfileRow","ServiceAccountRoleRow","onRoleChange","canUpdateRole","ServiceAccountProfile","ableToWrite","ServiceAccountTokensTable","tokenActionsDisabled","tableRow","hasExpired","TokenExpiration","formatLastUsedAtDate","lastUsedAt","expiration","formatSecondsLeftUntilExpiration","secondsUntilExpiration","tooltipContainer","toolTipIcon","neverExpire","loadServiceAccount","loadServiceAccountTokens","deleteServiceAccountToken","headerContainer","headerAvatar","returnButton","pageBody","tokensListHeader","ServiceAccountPage","newToken","setNewToken","isTokenModalOpen","setIsTokenModalOpen","isDisableModalOpen","setIsDisableModalOpen","canReadPermissions","showDeleteServiceAccountModal","showDisableServiceAccountModal","extraRoutes","getBrowseStorageRoutes","dashboardsFromStorage","getDynamicDashboardRoutes","scenes","AngularRoot","enrichConfigItems","toggleOrgSwitcher","onOpenShortcuts","profileNode","bottomNavItem","showOrgSwitcher","forcedLoginUrl","getForcedLoginUrl","enrichWithInteractionTracking","expandedState","isMatchOrChildMatch","itemToCheck","searchItem","stripQueryParams","isBetterMatch","newMatch","currentMatch","currentMatchUrl","newMatchUrl","getActiveItem","currentBestMatch","linkWithoutParams","linkPathname","getNavModelItemKey","TOP_BAR_LEVEL_HEIGHT","NavFeatureHighlight","NavBarItemWithoutMenu","elClassName","getNavBarItemWithoutMenuStyles","elStyle","NavBarMenuItem","styleOverrides","isMobile","linkContent","linkText","externalLinkIcon","gridColumnStart","borderBottom","NavBarToggle","home","channels","serviceaccounts","MENU_WIDTH","NavBarMenu","navItems","setMenuAnimationInProgress","ANIMATION_DURATION","animStyles","getAnimStyles","onEnter","onExited","mobileHeader","menuCollapseIcon","itemList","NavItem","backdropFilter","gridAutoRows","animationDuration","commonTransition","overlayTransition","backdropTransition","overlayOpen","overlayClosed","backdropOpen","backdropClosed","appearDone","useLingui","getNavItemStyles","linkHasChildren","CollapsibleNavItem","childLink","showIconInNavbar","emptyMessageId","emptyMessageTranslated","menuItemTranslations","emptyMessage","FeatureHighlightWrapper","itemWithoutMenu","itemWithoutMenuContent","getLinkIcon","placeItems","placeContent","getCollapsibleStyles","collapsibleMenuItem","collapsibleIcon","collapsibleSectionWrapper","collapseWrapper","collapseContent","searchBarHidden","animationSpeed","topPosition","MegaMenu","navBarTree","showSwitcherModal","setShowSwitcherModal","homeItem","coreItems","pluginItems","configItems","Breadcrumbs","crumbs","addCrumbs","breadcrumb","breadcrumbLink","NavToolbar","onToggleMegaMenu","onToggleSearchBar","pageToolbar","menuButton","TopSearchBar","searchBar","logo","searchWrapper","actionItem","ProfileMenu","AppChrome","chromeless","topNav","toggleSearchBar","toggleMegaMenu","contentNoSearchBar","megaMenuOpen","AppNotificationItem","appNotification","onClearNotification","timeoutMap","showTraceId","appNotifications","AppNotificationListUnConnected","onClearAppNotification","AppNotificationList","OrgSwitcher","currentOrgId","setCurrentOrg","NavBarItemMenuContext","createContext","menuHasFocus","onLeft","useNavBarItemMenuContext","NavBarContext","menuIdOpen","setMenuIdOpen","useNavBarContext","NavBarItemMenuItem","rendered","disabledKeys","setFocused","useFocus","onFocusChange","isSection","menuItemType","menuItemProps","useMenuItem","onAction","keyboardProps","useKeyboard","continuePropagation","mergeProps","NavBarScrollContainer","showScrollTopIndicator","setShowTopScrollIndicator","showScrollBottomIndicator","setShowBottomScrollIndicator","scrollTopMarker","scrollBottomMarker","intersectionObserver","IntersectionObserver","isIntersecting","scrollContainer","scrollTopIndicator","scrollIndicatorVisible","scrollTopIcon","scrollContent","scrollBottomIndicator","scrollBottomIcon","NavBarItemMenu","reverseMenuDirection","contextProps","completeProps","contextMenuProps","reverseDirection","useTreeState","useMenu","collection","selectionManager","setFocusedKey","menuSubTitle","headerComponent","itemComponents","contents","NAV_MENU_PORTAL_CONTAINER_ID","NavBarMenuPortalContainer","menuPortalContainer","NavBarItemMenuTrigger","setMenuHasFocus","highlightId","hoverProps","useHover","onHoverChange","isHovering","Wrapper","overlayPositionProps","useOverlayPosition","focusWithinProps","useFocusWithin","onFocusWithin","onBlurWithin","portalContainer","filteredItems","hideFromMenu","adjustHeightForBorder","translationKey","containerHover","itemText","textValue","onOpenSearch","NavBar","menuOpen","setMenuOpen","menuAnimationInProgress","toggleSwitcherModal","isSearchActive","navWrapper","mobileSidemenuLogo","menuExpandIcon","grafanaLogoInner","grafanaLogo","verticalSpacer","hideFromMobile","i18nInstance","I18nProvider","localInput","validatedLocale","fallbackMessages","pluralsOrdinal","PluralRules","pluralsCardinal","plurals","ordinal","getI18n","forceRenderOnLocaleChange","GrafanaRoute","registerRouteRender","updateBodyClassNames","cleanupDOM","getPageClasses","tooltipById","tooltipsByClass","ResultItem","currentRootActionId","ancestors","ancestor","getResultItemStyles","actionContainer","textContainer","breadcrumbAncestor","subtitleText","shortcutContainer","rowBackgroundColor","shortcutBackgroundColor","alightItems","alignitems","fontsize","dashboardNav","parentId","perform","getDashboardNav","alertingCommandPaletteStaticActions","priority","Priority","CommandPalette","getSearchStyles","setActions","staticActions","setStaticActions","useKBar","visualState","VisualState","isNotLogin","staticActionsResp","globalActions","navBarActionMap","navBarActions","navBarFlatUrls","flatMapDeep","nbt","nbf","navBarAction","getGlobalActions","getDashboardNavActions","dashAct","setVisualState","useRegisterActions","KBarPortal","KBarPositioner","positioner","KBarAnimator","animator","KBarSearch","RenderResults","rootActionId","useMatches","resultsContainer","KBarResults","sectionHeader","LiveConnectionWarning","foot","bodyRenderHooks","pageBanners","AppWrapper","exact","AngularApp","bootstrap","loadAndInitAngularIfEnabled","ready","renderRoutes","renderRoute","renderNavBar","commandPaletteEnabled","searchBarEnabled","KBarProvider","enableHistory","onSelectAction","actionId","actionName","Banner","Hook","defaultSection","AppChromeService","searchBarStorageKey","currentRoute","routeChangeHandled","isShallowEqual","useObservable","interceptLinkClicks","parentNode","getParentAnchor","AngularModalProxy","WrappedComponent","ConnectedWrappedComponent","connectWithProvider","ModalManager","reactModalNode","reactModalRoot","showConfirmModal","showModalReact","modalProps","onReactModalDismiss","WrappedWithI18N","altActionText","onAltAction","noText","text2htmlBind","echoLogger","echoLog","Echo","flushInterval","backends","flush","_meta","getMeta","_event","supportedEvents","userSignedIn","screenSize","windowSize","screen","userAgent","timeSinceNavigationStart","reportPerformance","PerformanceBackend","ApplicationInsightsBackend","applicationInsights","trackPageView","trackEvent","dataType","applicationInsightsOpts","connectionString","endpointUrl","Microsoft","ApplicationInsights","loadAppInsights","GAEchoBackend","trackedUserId","googleAnalyticsId","RudderstackBackend","rudderanalytics","track","experiment_id","experiment_group","experiment_variant","sdkUrl","rds","methods","methodName","writeKey","dataPlaneUrl","configUrl","identify","EchoSrvTransport","BaseTransport","send","getIgnoreUrls","GrafanaJavascriptAgentBackend","transports","instrumentations","FetchTransport","ErrorsInstrumentation","ConsoleInstrumentation","WebVitalsInstrumentation","grafanaJavaScriptAgentOptions","globalObjectKey","preventGlobalExposure","environment","agentInstance","initializeAgent","setUser","CustomEndpointTransport","_buffer","makePromiseBuffer","maxConcurrentRequests","sendEvent","_disabledUntil","reason","sentryReq","exception","Severity","fmtSentryErrorValue","makeTimestamp","endpoint","referrerPolicy","supportsReferrerPolicy","fetchParameters","SyncPromise","retryAfterHeader","parseRetryAfterHeader","sendSession","_sendRequest","sentryRequest","originalPayload","SentryEchoBackend","sentryOptions","release","transport","ignoreErrors","sentrySetUser","initSentry","preloadPlugin","QueryRunner","AdHocVariableEditorUnConnected","onDatasourceChanged","AdHocVariableEditor","AdHocPickerUnconnected","AdHocPicker","escapeDelimiter","unescapeDelimiter","toFilter","isFilter","createAdHocVariableAdapter","urlParser","initialQueryVariableModelState","includeAll","getAllMatches","metricNamesToVariableValues","variableRegEx","metricNames","valueGroup","textGroup","firstMatch","manyMatches","reverseSort","sortVariableValues","queryVariableSlice","updateVariableOptions","templatedRegex","queryVariableReducer","toMetricFindValues","firstValueKey","areMetricFindValues","textIndex","stringIndex","expandableIndex","QueryRunners","LegacyQueryRunner","StandardQueryRunner","CustomQueryRunner","DatasourceQueryRunner","getRunnerForDatasource","getTarget","getEmptyMetricFindValueObservable","VariableQueryRunner","queryRunners","updateOptionsRequests","updateOptionsResults","cancelRequests","onNewRequest","queueRequest","getResponse","getTemplatedRegexFunc","beforeKey","runnerArgs","getRequest","afterKey","updateOptionsState","validateVariableSelection","variableAsVars","searchFilterAsVars","getVariableQueryRunner","NavigationKey","VariableInput","VariableLink","propsOnClick","VariableLinkText","textAndTags","VariableOptions","handleEvent","onToggleAll","listStyles","renderMultiToggle","renderOption","selectClass","highlightClass","navigateOptions","commitChangesToVariable","toggleOptionByHighlight","selectAndClose","moveDown","moveUp","filterOrSearchOptions","passedIdentifier","searchForOptionsWithDebounce","currentPayload","mapToCurrent","searchQueryPayload","setVariable","openOptions","optionPickerFactory","OptionsPickerUnconnected","onVariableChange","onToggleMultiValueVariable","onToggleSingleValueVariable","onHideOptions","renderOptions","renderLink","onShowOptions","onFilterOrSearchOptions","onToggleOption","onToggleAllOptions","OptionsPicker","ConstantVariableEditor","initialConstantVariableModelState","constantVariableSlice","createConstantOptionsFromQuery","constantVariableReducer","createConstantVariableAdapter","VariableSwitchField","SelectionOptionsEditor","onMultiChanged","onMultiChangedProps","onIncludeAllChanged","onAllValueChanged","CustomVariableEditorUnconnected","onSelectionOptionsChange","CustomVariableEditor","connectWithStore","initialCustomVariableModelState","customVariableSlice","createCustomOptionsFromQuery","textMatch","customVariableReducer","createCustomVariableAdapter","initialDataSourceVariableModelState","dataSourceVariableSlice","createDataSourceOptions","dataSourceVariableReducer","initDataSourceVariableEditor","dataSourceTypes","DataSourceVariableEditorUnConnected","foundItem","typeOptions","typeValue","onDataSourceTypeChanged","onRegExChange","onRegExBlur","DataSourceVariableEditor","createDataSourceVariableAdapter","variableToTest","updateDataSourceVariableOptions","IntervalVariableEditor","stepOptions","stepValue","auto_count","onQueryChanged","onQueryBlur","onAutoChange","onAutoCountChanged","auto_min","onAutoMinChanged","initialIntervalVariableModelState","intervalVariableSlice","createIntervalOptions","intervalVariableReducer","updateAutoValue","createIntervalVariableAdapter","REFRESH_OPTIONS","QueryVariableRefreshSelect","SORT_OPTIONS","QueryVariableSortSelect","StandardVariableQueryEditor","propsDatasource","propsQuery","updateQueryVariableOptions","variableQueryObserver","responseSubscription","changeQueryVariableDataSource","extendedEditorState","previousDatasource","importDataSourcePluginFunc","getVariableQueryEditor","flattenQuery","childProp","initQueryVariableEditor","changeQueryVariableQuery","hasSelfReferencingQuery","QueryVariableEditorUnConnected","onLegacyQueryChange","onDataSourceChange","onRefreshChange","renderQueryEditor","QueryVariableEditor","createQueryVariableAdapter","TextBoxVariableEditor","updateVariable","TextBoxVariablePicker","updatedValue","setUpdatedValue","initialTextBoxVariableModelState","originalQuery","textBoxVariableSlice","createTextBoxOptions","textBoxVariableReducer","createTextBoxVariableAdapter","setTextBoxVariableOptionsFromUrl","saveCurrentAsDefault","origQuery","rootReducers","sharedReducers","alertingReducers","teamsReducers","apiKeysReducers","foldersReducers","dashboardReducers","exploreReducers","dataSourcesReducers","usersReducers","userReducers","invitesReducers","organizationReducers","ldapReducers","importDashboardReducers","panelEditorReducers","panelsReducers","pluginsReducer","addedReducers","createRootReducer","appReducer","stateSelector","stateSlice","recursiveCleanState","stateKey","extensionsIndex","extensionsExports","reportMetricPerformanceMark","metricName","getEntriesByName","loadMetricName","jsLoadMetricName","cssLoadMetricName","mark","initEchoSrv","addExtensionReducers","reduxConfigureStore","middleware","getDefaultMiddleware","thunk","serializableCheck","immutableCheck","devTools","preloadedState","setStore","configureStore","getDashboardSaveModel","getDashboardTimeRange","getPanelData","pluginsToPreload","preloadPlugins","__grafana_load_failed","public_cdn_path","__webpack_public_path__","nonce","__webpack_nonce__","__grafana_app_bundle_loaded","SilenceState","AlertmanagerChoice","CloudWatchLogsQueryStatus","VariableQueryType","SHARED_DASHBOARD_QUERY","listenToPanelId","getPanelIdFromQuery","getQueryError","listenToPanel","listenToRunner","modified","DashboardQueryRow","editURL","queryEditorRowHeader","DashboardQueryEditor","onRunQueries","loadingResults","mainDS","queryData","onPanelChanged","getPanelDescription","dsname","queryCount","noQueriesText","messageFromElement","isValidElement","maybeAMessage","innererror","tagsTooltipContent","annotationTypes","GrafanaAnnotationType","limitOptions","AnnotationQueryEditor","matchAny","GrafanaDatasource","getAnnotations","renderedValues","tt","RandomWalk","idRefLazy","MixedDatasource","sets","batchQueries","runningQueries","isQueryable","dsRequest","forkJoin","innerAll","innerCurrent","finalizeResponses","coord","iwid","numItems","sizeFactor","onlyIdx","_iwid","px","py","rlft","rtop","rrgt","rbtm","r1","r2","quads","hzMid","vtMid","startIsNorth","startIsWest","endIsEast","endIsSouth","oi","valueProps","clearNameForSingleSeries","getItemSpacing","GaugePanel","thresholdMarkers","thresholdLabels","visibleFields","hovering","shortenLine","markerEnd","EdgeArrowMarker","refX","refY","markerUnits","markerHeight","orient","mainGroup","EdgeLabel","rx","mainStat","secondaryStat","onSort","sortable","colorItems","arcSections","getColorLegendItems","ascending","mainCircle","nodeR","hoverCircle","statsText","textHovering","ColorCircle","statToString","fullStat","nonZero","ArcSection","startPercent","endPercent","startXPos","startYPos","endXPos","endYPos","largeArc","ViewControls","onPlus","onMinus","disableZoomOut","disableZoomIn","showConfig","setShowConfig","gridLayout","useNodeLimit","rootId","edgesMap","nodesMap","prevLimit","afterLimit","limitGridLayout","roots","incoming","visibleNodes","connectedNodes","collectVisibleNodes","markersWithStats","nodesToCount","collectMarkerStats","markersMap","fromPairs","visibleEdges","limitGraphLayout","linkDistance","linkStrength","forceX","forceXStrength","forceCollide","tick","defaultLayout","worker","onmessage","postMessage","terminate","perRow","midPoint","node1","node2","val1","val2","getItemsRenderer","extraItems","defaultGroup","newTitle","mapMenuItem","NodeHeader","getNodeFields","EdgeHeader","getEdgeFields","valueSource","valueTarget","formLabelMargin","formLabelPadding","usePanning","isPanning","panRef","startMousePosition","prevPosition","currentPosition","stopPanning","unbindEvents","onPanStart","getEventXY","bindEvents","startPanning","onPan","cancelAnimationFrame","xDiff","inBounds","previousFocus","changedTouches","stepDown","stepUp","svg","svgPanning","viewControls","viewControlsWrapper","loadingWrapper","nodeLimit","nodeCountLimit","edgesDataFrames","nodesDataFrames","useCategorizeFrames","measureRef","setConfig","firstNodesDataFrame","firstEdgesDataFrame","processNodes","nodeHover","setNodeHover","clearNodeHover","edgeHover","setEdgeHover","clearEdgeHover","hoveringIds","setHoveringIds","linked","findConnectedNodesForNode","findConnectedNodesForEdge","focusedNodeId","setFocusedNodeId","hiddenNodesCount","rawNodes","rawEdges","rootNodeId","nodesGraph","setNodesGraph","edgesGraph","setEdgesGraph","setLoading","layoutWorkerCancelRef","useUnmount","nodesGrid","edgesGrid","rawNodesCopy","rawEdgesCopy","nodesWithLimit","edgesWithLimit","graphBounds","useLayout","focusPosition","useFocusPositionOnLayout","zoomRef","onStepUp","onStepDown","isMaxZoom","isMinZoom","isMax","isMin","onWheel","wheelEvent","deltaY","newScale","passive","useZoom","panningState","usePanAndZoom","onEdgeOpen","onNodeOpen","setMenu","extraNodeItem","useContextMenu","topLevelRef","setHighlightId","useHighlight","Edges","nodeHoveringId","edgeHoveringId","Nodes","Markers","EdgeLabels","shouldShow","hasStats","vx","vy","ratio","vx2","vy2","newx1","newy1","normalizedFrames","fieldsCache","findFieldsByPrefix","nodeFields","edgesMapped","edgeFields","applyOptionsToFrames","mainStatUnit","secondaryStatUnit","edgeId","nodeId","linkedEdges","includeFieldMatcher","valueOptionsCategory","StatPanel","graphMode","getTextMode","mainCategory","colorBackground","alignValue","pxRatio","laneDistr","yIdx","offPct","dimPct","numSeries","isDiscrete","getFieldConfig","onHover","onLeave","hoverMarks","boxRectsBySeries","hovered","gapFactor","fillPaths","strokePaths","putBox","boxWidth","boxHeight","fillPath","strokePath","drawPoints","i0","i1","yMids","ix","boxRect","setHoverMark","hoveredAtCursor","doHover","foundAtCursor","cy2","ySplits","dataIncr","skipFactor","scalePad","iy","yRange","drawPaths","nextIx","colWid","barWid","xShift","seriesRects","hoveredSeriesIdx","hoveredDataIdx","shouldChangeHover","coreConfig","getSpanNulls","mergeThresholdValues","getThresholdItems","thresholdToText","textToColor","hasTimeseries","isTimeseries","maybeSortedFrame","allNonTimeFields","stateColors","rightPointer","rightValue","milliSeconds","yr","mo","wk","lineFillOptions","dashOptions","dotOptions","parseText","isThreshold","formattedTime","checkAndUpdate","FillBellowToEditor","ThresholdsStyleEditor","onChangeCb","oMatchMedia","matchMedia","mediaQueryString","mql","addListener","removeListener","newStore","DataSourcePermissionLevel","Viewer","View","Admin","TeamPermissionLevel","teamsPermissionLevels","Member","toggleSidemenuHidden","graphClicked","thresholdChanged","PanelDirectiveReadyEvent","ShowModalEvent","HideModalEvent","PanelEditEnteredEvent","PanelEditExitedEvent","AppNotificationTimeout","Success","Warning","Info","useDispatchUntyped","useSelectorUntyped","typePrefix","payloadCreator","createAsyncThunkUntyped","isAlertStateWithReason","jQuery","triggerRedrawOverlay","setCrosshair","p2c","clearCrosshair","lockCrosshair","unlockCrosshair","eventHolder","mouseout","mousemove","drawOverlay","plotOffset","getPlotOffset","translate","adj","lineJoin","drawX","drawY","shutdown","processDatapoints","axisx","axisy","plotDashes","xoffset","yoffset","dashOnLength","dashOffLength","ps","pointsize","prevx","prevy","dashRemainder","dashOn","dashOffset","ax1","ay1","ax2","ay2","lineSegmentOffset","deltaX","remainder","segmentLength","ysign","lw","sw","angle","drawSeries","otherseries","otherps","otherpoints","openPolygon","findNextStart","start_i","end_i","assert","intersect","intersectionPoint","topTraversal","right_i","top_left_x","top_left_y","top_right_x","top_right_y","bottom_left_x","bottom_left_y","bottom_right_x","bottom_right_y","top_delta_x","top_delta_y","bottom_delta_x","bottom_delta_y","bottomTraversal","allseries","findBelowSeries","validateInput","normalize","gaugeOptions","getPlaceholder","getLogger","calculateAutoValues","gaugeOptionsi","calculateAngle","drawArcWithShadow","rd1","rd2","lc","fc","drawArc","shadowOffsetX","shadowOffsetY","shadowBlur","drawThresholdValue","cellLayout","drawText","thresholdLabelMargin","toRad","attr","calculateLayout","canvasWidth","canvasHeight","hMargin","cellMargin","labelMargin","valueMargin","maxRadiusH","dAngle","heightRatioV","outerRadiusV","maxRadiusV","gaugeOuterHeight","calculateCellLayout","blank","vAlign","drawBackground","strokeRect","drawCellBackground","drawGauge","c1","a2","drawThreshold","a1","drawLable","drawValue","drawThresholdValues","debugOptions","Logger","processOptions","make","lookupColors","darkgrey","Canvas","appendTo","G_vmlCanvasManager","initElement","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","_textCache","_textSizeCache","flotTextSizeCache","Plot","data_","options_","noColumns","labelFormatter","labelBoxBorderColor","backgroundOpacity","tickColor","inverseTransform","autoscaleMargin","reserveSpace","tickLength","alignTicksWithAxis","minTickSize","xaxes","highlightColor","aboveData","eventSectionHeight","axisMargin","markingsColor","markingsLineWidth","autoHighlight","redrawOverlayInterval","surface","octx","plotWidth","plotHeight","processRawData","processOffset","processRange","executeHooks","parseData","neededColors","maxIndex","colorPool","colorPoolSize","variation","colori","getOrCreateAxis","axisNumber","fillInSeriesOptions","topSentry","bottomSentry","fakeInfinity","updateAxis","allAxes","autoscale","insertSteps","nullify","xmin","ymin","xmax","ymax","processData","grep","canvasToAxisCoords","c2p","redrawTimeout","onTouch","measureTickLabels","legacyStyles","layer","getTextInfo","allocateAxisBoxFirstPhase","lh","isXAxis","eventSectionPadding","innermost","outermost","setupGrid","showGrid","axisOpts","setRange","allocatedAxes","snaped","setupTickGeneration","setTicks","snapRangeToTicks","minMargin","margins","adjustLayoutForThingsStickingOut","allocateAxisBoxSecondPhase","it","setTransformationHelpers","halign","removeText","fragments","rowStarted","lf","prependTo","insertLegend","tickGenerator","decimal","substr","otherAxis","niceTicks","extraDec","oticks","getColorOrGradient","drawGrid","extractRange","bw","getAxes","xrange","yrange","xequal","yequal","subPixel","xoff","yoff","plotLine","plotLineArea","areaOpen","ypos","segmentStart","segmentEnd","x1old","x2old","getFillStyle","drawSeriesLines","abandonedPoints","beforeX","afterX","emptyPoints","olddatapoints","drawSeriesPoints","drawOrphanedPoints","plotBars","barLeft","barRight","fillStyleCallback","drawBar","drawSeriesBars","plotPoints","drawLeft","drawRight","drawTop","drawBottom","filloptions","getCanvas","getXAxes","unhighlight","pointOffset","removeData","initPlugins","axisOptions","axisCount","fontSizeDefault","fontDefaults","x2axis","y2axis","coloredAreas","coloredAreasColor","parseOptions","setupCanvases","triggerClickHoverEvent","isSelecting","cancelable","is","originalEvent","touch","mapFromTouchEvent","eventname","seriesFilter","canvasX","canvasY","mouseX","mouseY","maxDistance","smallestDistance","mx","my","maxx","maxy","findNearbyItem","drawBarHighlight","drawPointHighlight","indexOfHighlight","pointRadius","spec","co","brightness","detach","clearRect","layerKey","getTextLayer","layerCache","styleKey","styleCache","insertAfter","addClass","textStyle","outerWidth","outerHeight","savedhandlers","mouseUpHandler","updateSelection","which","onselectstart","ondrag","setSelectionPos","selectionIsSane","triggerSelectedEvent","onMouseUp","one","c2","anyUsed","p1","p2","preventEvent","minSize","findMatchingSeries","qx","qy","newpoints","withlines","withbottom","withsteps","keyOffset","accumulateOffset","fromgap","stackBases","stackSums","getStackSums","data_len","sums","stackpercent","key_idx","value_idx","percents","newPoints","floorInBase","monthNames","dayNames","strftime","hours12","leftPad","isAM","getDay","makeUtcWrapper","addProxyMethod","sourceObj","sourceMethod","targetObj","targetMethod","dateGenerator","timezoneJS","baseSpec","specMonths","specQuarters","axisName","setMonth","setFullYear","setMilliseconds","quarter","carry","useQuarters","hourCode","twelveHourClock"],"sourceRoot":""}