1{"version":3,"file":"7095.0e38943fa459e872fe93.js","mappings":"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cACA,cACA,gBACA,UACA,yBACA,0BACA,0BACA,UACA,0BACA,0BACA,8BACA,+BACA,eACA,mBACA,UACA,cACA,UACA,YACA,QACA,cACA,UACA,WACA,YACA,SACA,OACA,cACA,mBACA,WACA,cACA,gBACA,WACA,OACA,cACA,UACA,OACA,UACA,QACA,eACA,iBACA,UACA,UACA,YACA,QACA,MACA,aACA,OACA,OACA,OACA,cACA,cACA,QACA,oBACA,UACA,kBACA,eACA,SACA,SACA,OACA,SACA,eACA,cACA,YACA,SACA,qBACA,SACA,SACA,UACA,UACA,QACA,gBACA,mBACA,iBACA,eACA,OACA,gBACA,OACA,QACA,UACA,cACA,QACA,YACA,YACA,SACA,SACA,OACA,YACA,YACA,KAQG,SAASxgF,EAAiB5+G,GAC/B,GAAIA,EACF,OAAQA,EAAMT,MACZ,KAAK2B,EAAAA,UAAAA,KACH,MAAO,aACT,KAAKA,EAAAA,UAAAA,OACH,MAAO,OACT,KAAKA,EAAAA,UAAAA,OACH,MAAO,iBACT,KAAKA,EAAAA,UAAAA,QACH,MAAO,YACT,KAAKA,EAAAA,UAAAA,MACH,MAAO,cACT,KAAKA,EAAAA,UAAAA,MACH,MAAO,iBAGb,MAAO,2GC1LF,MAAMs8J,EAA8EvnI,GAClFA,IAAQ52B,KAAK+2B,IACX,CACLlvB,MAAOkvB,EAAKvoB,MACZ+gF,UAAWx4D,EAAKvoB,MAEhBupB,IAAKhB,EAAKe,KACVlqB,OAAQmpB,EAAKnpB,OACby7D,KAAO,IAAkB,UAAhBtyC,EAAKnpB,OAAqB,OAAS,qBAC5CiqB,QAASd,EAAKc,gNCSb,SAASmoK,EAAWx5D,EAAe7gG,GACxC,IAAI2/E,EAAW,EACbiV,EAAciM,EAAMh1H,QAAQm0B,GAG9BA,EAASA,EAAO7zB,QAAQ,MAAO,IAE/B,MAAM2qH,EAA0B,GAEhC,IAAqB,IAAjBlC,EACF,MAAO,CACLjV,SAAU,EACVhG,OAAO,EACPmd,OAAQ,CAAC,CAAErtG,MAAOmrG,EAAalrG,IAAKkrG,EAAc50F,EAAOzmC,OAAS,KAItE,IAAK,MAAM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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/StreamingDataFrame.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/renameByRegex.ts","webpack://grafana/./packages/grafana-data/src/transformations/transformers/convertFieldType.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/histogram.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/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/arrayUtils.ts","webpack://grafana/./packages/grafana-data/src/utils/dataLinks.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/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/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/live.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/utils/DataSourceWithBackend.ts","webpack://grafana/./packages/grafana-runtime/src/utils/queryResponse.ts","webpack://grafana/./packages/grafana-schema/src/schema/graph.gen.ts","webpack://grafana/./packages/grafana-ui/src/components/Alert/Alert.tsx","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/Button/Button.tsx","webpack://grafana/./packages/grafana-ui/src/components/Button/ButtonGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/Button/ToolbarButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/Button/ToolbarButtonRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Cascader/Cascader.tsx","webpack://grafana/./packages/grafana-ui/src/components/Cascader/optionMappings.ts","webpack://grafana/./packages/grafana-ui/src/components/ClickOutsideWrapper/ClickOutsideWrapper.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/ColorPicker.tsx","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/warnAboutColorPickerPropsDeprecation.ts","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/ColorSwatch.tsx","webpack://grafana/./packages/grafana-ui/src/components/ColorPicker/SeriesColorPickerPopover.tsx","webpack://grafana/./packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.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/DataLinksInlineEditor/DataLinksListItem.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/DataLinksInlineEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/FormattedValueDisplay/FormattedValueDisplay.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/Legacy/Switch/Switch.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/commonStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/GraphNG/GraphNG.tsx","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/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/Modal.tsx","webpack://grafana/./packages/grafana-ui/src/components/Modal/ModalHeader.tsx","webpack://grafana/./packages/grafana-ui/src/components/Modal/getModalStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/color.tsx","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/SelectMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/IndicatorsContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/Select/ValueContainer.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/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/SelectContainer.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/Spinner/Spinner.tsx","webpack://grafana/./packages/grafana-ui/src/components/StatsPicker/StatsPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/Switch/Switch.tsx","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/Popover.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/UnitPicker/UnitPicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/ValuePicker/ValuePicker.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLayout/VizLayout.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/TabbedContainer/TabbedContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/ClipboardButton/ClipboardButton.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/components/EmptySearchResult/EmptySearchResult.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/hooks.ts","webpack://grafana/./packages/grafana-ui/src/components/Menu/Menu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Menu/SubMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/MenuItem.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/TimeRangePicker/mapper.ts","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerTitle.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarHeader.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/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/TimeZonePicker/TimeZoneTitle.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneDescription.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOffset.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneOption.tsx","webpack://grafana/./packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneGroup.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/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/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/FilterActions.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/DefaultCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/BarGauge/BarGauge.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/BarGaugeCell.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/Table/JSONViewCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/ImageCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/styles.ts","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/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/Table/TableCell.tsx","webpack://grafana/./packages/grafana-ui/src/components/Table/FilterList.tsx","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/TabContent.tsx","webpack://grafana/./packages/grafana-ui/src/components/Gauge/Gauge.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/utils.ts","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/VizTooltipContainer.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/VizTooltip.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/SeriesIcon.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizTooltip/SeriesTable.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphTooltip/SingleModeGraphTooltip.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/GraphTooltip.tsx","webpack://grafana/./packages/grafana-ui/src/components/ContextMenu/ContextMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Menu/MenuGroup.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/GraphContextMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/Graph/Graph.tsx","webpack://grafana/./packages/grafana-ui/src/components/VizLegend/types.ts","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/VizLegend/VizLegendSeriesIcon.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/List/InlineList.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/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/Logs/LogRowContextProvider.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/logParser.ts","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/DataLinks/DataLinkButton.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogDetailsRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/Logs/LogDetails.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/ContextMenu/WithContextMenu.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataLinks/DataLinksContextMenu.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/ErrorBoundary/ErrorWithStack.tsx","webpack://grafana/./packages/grafana-ui/src/components/ErrorBoundary/ErrorBoundary.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/SecretFormField/SecretFormField.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/BasicAuthSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/HttpProxySettings.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/CertificationKey.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/TLSAuthSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/CustomHeadersSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/SigV4AuthSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/DataSourceSettings/DataSourceHttpSettings.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/InlineFieldRow.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/styles.ts","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/OptionsUI/string.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/strings.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/number.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/slider.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/select.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/multiSelect.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/MatchersUI/FieldNameMatcherEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/FieldNameByRegexMatcherEditor.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/FieldNamesMatcherEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/MatchersUI/fieldMatchersUI.ts","webpack://grafana/./packages/grafana-ui/src/components/Forms/Legend.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/Checkbox.tsx","webpack://grafana/./packages/grafana-ui/src/components/Forms/getFormStyles.ts","webpack://grafana/./packages/grafana-ui/src/components/Link/Link.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/Select/test-utils.ts","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/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/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/XYCanvas.tsx","webpack://grafana/./packages/grafana-ui/src/components/uPlot/geometries/Marker.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/TooltipPlugin.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/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/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/uPlot/config/UPlotScaleBuilder.ts","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/components/ValueMappingsEditor/ValueMappingEditRow.tsx","webpack://grafana/./packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditorModal.tsx","webpack://grafana/./packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/mappings.tsx","webpack://grafana/./packages/grafana-ui/src/components/ThresholdsEditorNew/ThresholdsEditor.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/thresholds.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/units.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/links.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/fieldColor.tsx","webpack://grafana/./packages/grafana-ui/src/components/OptionsUI/stats.tsx","webpack://grafana/./packages/grafana-ui/src/utils/standardEditors.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/components/Typeahead/TypeaheadInfo.tsx","webpack://grafana/./packages/grafana-ui/src/components/Typeahead/TypeaheadItem.tsx","webpack://grafana/./packages/grafana-ui/src/utils/typeahead.ts","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/elements.ts","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/card.ts","webpack://grafana/./packages/grafana-ui/src/themes/GlobalStyles/angularPanelStyles.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/dataLinks.ts","webpack://grafana/./packages/grafana-ui/src/utils/fuzzy.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/dom.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/./public/app/angular/AngularLocationWrapper.ts","webpack://grafana/./public/app/angular/components/query_part.ts","webpack://grafana/./public/app/angular/core_module.ts","webpack://grafana/./public/app/angular/panel/metrics_panel_ctrl.ts","webpack://grafana/./public/app/angular/panel/panel_ctrl.ts","webpack://grafana/./public/app/angular/panel/query_ctrl.ts","webpack://grafana/./public/app/angular/partials.ts","webpack://grafana/./public/app/angular/promiseToDigest.ts","webpack://grafana/./public/app/core/actions/cleanUp.ts","webpack://grafana/./public/app/core/app_events.ts","webpack://grafana/./public/app/core/components/Animations/SlideDown.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/CopyToClipboard/CopyToClipboard.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/Page/Page.tsx","webpack://grafana/./public/app/core/components/Page/PageContents.tsx","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/Select/TeamPicker.tsx","webpack://grafana/./public/app/core/components/PermissionList/AddPermission.tsx","webpack://grafana/./public/app/core/components/PermissionList/PermissionListItem.tsx","webpack://grafana/./public/app/core/components/PermissionList/DisabledPermissionListItem.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/QueryOperationRow.tsx","webpack://grafana/./public/app/core/components/RolePicker/RolePickerMenu.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/RolePicker.tsx","webpack://grafana/./public/app/core/components/RolePicker/UserRolePicker.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/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/help/HelpModal.tsx","webpack://grafana/./public/app/core/config.ts","webpack://grafana/./public/app/core/constants.ts","webpack://grafana/./public/app/core/copy/appNotification.ts","webpack://grafana/./public/app/core/jquery_extended.ts","webpack://grafana/./public/app/core/logs_model.ts","webpack://grafana/./public/app/core/utils/colors.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/navModel.ts","webpack://grafana/./public/app/core/selectors/navModel.ts","webpack://grafana/./public/app/core/services/PreferencesService.ts","webpack://grafana/./public/app/core/services/FetchQueue.ts","webpack://grafana/./public/app/core/services/ResponseQueue.ts","webpack://grafana/./public/app/core/services/FetchQueueWorker.ts","webpack://grafana/./public/app/features/users/TokenRevokedModal.tsx","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/acl.ts","webpack://grafana/./public/app/core/utils/arrayMove.ts","webpack://grafana/./public/app/core/utils/connectWithReduxStore.tsx","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/shortLinks.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/ThresholdMapper.ts","webpack://grafana/./public/app/features/alerting/state/alertDef.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/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/CollapseToggle.tsx","webpack://grafana/./public/app/features/alerting/unified/components/StateTag.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/AlertGroupHeader.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rule-editor/RuleFolderPicker.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertStateTag.tsx","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/ruler.ts","webpack://grafana/./public/app/features/alerting/unified/state/actions.ts","webpack://grafana/./public/app/features/alerting/unified/api/prometheus.ts","webpack://grafana/./public/app/features/alerting/unified/api/grafana.ts","webpack://grafana/./public/app/features/alerting/unified/api/annotations.ts","webpack://grafana/./public/app/features/alerting/unified/styles/notifications.ts","webpack://grafana/./public/app/features/alerting/unified/types/rule-form.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/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/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/editor/VariableValuesPreview.tsx","webpack://grafana/./public/app/features/variables/editor/actions.ts","webpack://grafana/./public/app/features/variables/editor/VariableTypeSelect.tsx","webpack://grafana/./public/app/features/variables/editor/VariableHideSelect.tsx","webpack://grafana/./public/app/features/variables/editor/VariableEditorEditor.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/VariableUsagesButton.tsx","webpack://grafana/./public/app/features/variables/editor/VariableEditorList.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/inspect/VariablesDependenciesButton.tsx","webpack://grafana/./public/app/features/variables/editor/VariableEditorContainer.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardPermissions/DashboardPermissions.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/GeneralSettings.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/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/JsonEditorSettings.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/state/reducers.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/types.ts","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardAsForm.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardAsModal.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardButton.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/forms/SaveProvisionedDashboardForm.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveProvisionedDashboard.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/forms/SaveDashboardForm.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardModal.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/SaveDashboardModalProxy.tsx","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/useDashboardSave.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/utils.ts","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareLink.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareSnapshot.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/ShareEmbed.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareLibraryPanel.tsx","webpack://grafana/./public/app/features/dashboard/components/ShareModal/ShareModal.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/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/VersionHistoryComparison.tsx","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.ts","webpack://grafana/./public/app/features/dashboard/state/DashboardMigrator.ts","webpack://grafana/./public/app/core/utils/factors.ts","webpack://grafana/./public/app/features/dashboard/utils/panelMerge.ts","webpack://grafana/./public/app/core/utils/object.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/loadSnapshotData.ts","webpack://grafana/./public/app/features/dashboard/utils/panel.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/NumberInput.tsx","webpack://grafana/./public/app/features/dimensions/editors/TextDimensionEditor.tsx","webpack://grafana/./public/app/features/dimensions/editors/ResourceCards.tsx","webpack://grafana/./public/app/features/dimensions/editors/ResourcePicker.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/scalar.ts","webpack://grafana/./public/app/features/dimensions/resource.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/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/Resample.tsx","webpack://grafana/./public/app/features/expressions/components/Reduce.tsx","webpack://grafana/./public/app/features/expressions/components/Math.tsx","webpack://grafana/./public/app/features/expressions/components/Condition.tsx","webpack://grafana/./public/app/features/expressions/components/ClassicConditions.tsx","webpack://grafana/./public/app/features/expressions/ExpressionQueryEditor.tsx","webpack://grafana/./public/app/features/expressions/ExpressionDatasource.ts","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/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/live.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/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/PanelPluginError.tsx","webpack://grafana/./public/app/features/panel/components/PanelRenderer.tsx","webpack://grafana/./public/app/features/panel/panellinks/linkSuppliers.ts","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/core/utils/ticks.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/plugins/annotations/AnnotationEditorForm.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/styles.ts","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/utils.ts","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/ThresholdDragHandle.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.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/state-timeline/TimelineChart.tsx","webpack://grafana/./public/app/plugins/panel/state-timeline/StateTimelineTooltip.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/StatusHistoryPanel.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/suggestions.ts","webpack://grafana/./public/app/plugins/panel/candlestick/models.gen.ts","webpack://grafana/./public/app/plugins/panel/candlestick/utils.ts","webpack://grafana/./public/app/plugins/panel/candlestick/fields.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/graph/jquery.flot.events.ts","webpack://grafana/./public/app/plugins/panel/graph/graph_tooltip.ts","webpack://grafana/./public/app/plugins/panel/graph/threshold_manager.ts","webpack://grafana/./public/app/plugins/panel/graph/time_region_manager.ts","webpack://grafana/./public/app/plugins/panel/graph/event_manager.ts","webpack://grafana/./public/app/plugins/panel/graph/histogram.ts","webpack://grafana/./public/app/plugins/panel/graph/align_yaxes.ts","webpack://grafana/./public/app/plugins/panel/graph/Legend/LegendSeriesItem.tsx","webpack://grafana/./public/app/plugins/panel/graph/Legend/Legend.tsx","webpack://grafana/./public/app/plugins/panel/graph/graph.ts","webpack://grafana/./public/app/plugins/panel/graph/utils.ts","webpack://grafana/./public/app/plugins/panel/graph/series_overrides_ctrl.ts","webpack://grafana/./public/app/plugins/panel/graph/thresholds_form.ts","webpack://grafana/./public/app/plugins/panel/graph/time_regions_form.ts","webpack://grafana/./public/app/plugins/panel/graph/annotation_tooltip.ts","webpack://grafana/./public/app/plugins/panel/graph/event_editor.ts","webpack://grafana/./public/app/plugins/panel/graph/data_processor.ts","webpack://grafana/./public/app/plugins/panel/graph/axes_editor.ts","webpack://grafana/./public/app/plugins/panel/graph/GraphContextMenuCtrl.ts","webpack://grafana/./public/app/plugins/panel/graph/module.ts","webpack://grafana/./public/app/plugins/panel/graph/template.ts","webpack://grafana/./public/app/plugins/panel/graph/GraphMigrations.ts","webpack://grafana/./public/app/plugins/panel/xychart/models.gen.ts","webpack://grafana/./public/app/plugins/panel/xychart/config.ts","webpack://grafana/./public/app/plugins/panel/xychart/dims.ts","webpack://grafana/./public/app/plugins/panel/xychart/XYDimsEditor.tsx","webpack://grafana/./public/app/plugins/panel/xychart/scatter.ts","webpack://grafana/./public/app/plugins/panel/xychart/TooltipView.tsx","webpack://grafana/./public/app/plugins/panel/xychart/XYChartPanel2.tsx","webpack://grafana/./public/app/plugins/panel/xychart/module.tsx","webpack://grafana/./public/app/plugins/panel/dashlist/styles.ts","webpack://grafana/./public/app/plugins/panel/dashlist/DashList.tsx","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/dashlist/module.tsx","webpack://grafana/./public/app/plugins/panel/pluginlist/components/UpdatePluginModal.tsx","webpack://grafana/./public/app/plugins/panel/pluginlist/PluginList.tsx","webpack://grafana/./public/app/plugins/panel/pluginlist/module.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/types.ts","webpack://grafana/./public/app/plugins/panel/alertlist/AlertList.tsx","webpack://grafana/./public/app/plugins/panel/alertlist/AlertInstances.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/AnnotationListItemTags.tsx","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/module.tsx","webpack://grafana/./public/app/plugins/panel/heatmap/color_scale.ts","webpack://grafana/./public/app/plugins/panel/heatmap/color_legend.ts","webpack://grafana/./public/app/plugins/panel/heatmap/axes_editor.ts","webpack://grafana/./public/app/plugins/panel/heatmap/display_editor.ts","webpack://grafana/./public/app/plugins/panel/heatmap/heatmap_data_converter.ts","webpack://grafana/./public/app/plugins/panel/heatmap/heatmap_tooltip.ts","webpack://grafana/./public/app/plugins/panel/heatmap/rendering.ts","webpack://grafana/./public/app/plugins/panel/heatmap/heatmap_ctrl.ts","webpack://grafana/./public/app/plugins/panel/table/footer.ts","webpack://grafana/./public/app/plugins/panel/table/TablePanel.tsx","webpack://grafana/./public/app/plugins/panel/table/models.gen.ts","webpack://grafana/./public/app/plugins/panel/table/migrations.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/table-old/transformers.ts","webpack://grafana/./public/app/plugins/panel/table-old/editor.ts","webpack://grafana/./public/app/plugins/panel/table-old/column_options.ts","webpack://grafana/./public/app/plugins/panel/table-old/renderer.ts","webpack://grafana/./public/app/plugins/panel/table-old/module.ts","webpack://grafana/./public/app/plugins/panel/gettingstarted/components/sharedStyles.ts","webpack://grafana/./public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx","webpack://grafana/./public/app/plugins/panel/gettingstarted/components/DocsCard.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/piechart/types.ts","webpack://grafana/./packages/grafana-ui/src/utils/useComponetInstanceId.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/bargauge/types.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/barchart/types.ts","webpack://grafana/./public/app/plugins/panel/barchart/bars.ts","webpack://grafana/./public/app/plugins/panel/barchart/utils.ts","webpack://grafana/./public/app/plugins/panel/barchart/BarChart.tsx","webpack://grafana/./public/app/plugins/panel/barchart/module.tsx","webpack://grafana/./public/app/plugins/panel/barchart/BarChartPanel.tsx","webpack://grafana/./public/app/plugins/panel/barchart/suggestions.ts","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/NewsPanel.tsx","webpack://grafana/./public/app/plugins/panel/news/rss.ts","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/live/LiveChannelEditor.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/debug/types.ts","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/CursorView.tsx","webpack://grafana/./public/app/plugins/panel/debug/StateView.tsx","webpack://grafana/./public/app/plugins/panel/debug/DebugPanel.tsx","webpack://grafana/./public/app/plugins/panel/debug/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/nodeGraph/NodeGraphPanel.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/module.tsx","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/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/features/plugins/built_in_plugins.ts","webpack://grafana/./public/app/features/plugins/plugin_loader.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/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/LegacyAnnotationQueryRunner.ts","webpack://grafana/./public/app/features/query/state/DashboardQueryRunner/AnnotationsQueryRunner.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/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/ActionRow.tsx","webpack://grafana/./public/app/features/search/components/ConfirmDeleteModal.tsx","webpack://grafana/./public/app/features/search/reducers/manageDashboards.ts","webpack://grafana/./public/app/features/search/hooks/useManageDashboards.ts","webpack://grafana/./public/app/features/search/components/DashboardActions.tsx","webpack://grafana/./public/app/features/search/components/ManageDashboards.tsx","webpack://grafana/./public/app/features/search/components/MoveToFolderModal.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/components/SectionHeader.tsx","webpack://grafana/./public/app/features/search/components/SearchResults.tsx","webpack://grafana/./public/app/features/search/components/SearchResultsFilter.tsx","webpack://grafana/./public/app/features/search/constants.ts","webpack://grafana/./public/app/features/search/hooks/useSearch.ts","webpack://grafana/./public/app/features/search/hooks/useSearchQuery.ts","webpack://grafana/./public/app/features/search/reducers/actionTypes.ts","webpack://grafana/./public/app/features/search/reducers/dashboardSearch.ts","webpack://grafana/./public/app/features/search/reducers/searchQueryReducer.ts","webpack://grafana/./public/app/features/search/types.ts","webpack://grafana/./public/app/features/search/utils.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/users/state/reducers.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/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/QueryVariableRefreshSelect.tsx","webpack://grafana/./public/app/features/variables/query/QueryVariableSortSelect.tsx","webpack://grafana/./public/app/features/variables/query/QueryVariableEditor.tsx","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/OptionsPicker/actions.ts","webpack://grafana/./public/app/features/variables/pickers/shared/VariableOptions.tsx","webpack://grafana/./public/app/features/variables/pickers/shared/VariableLink.tsx","webpack://grafana/./public/app/features/variables/pickers/OptionsPicker/OptionsPicker.tsx","webpack://grafana/./public/app/features/variables/query/adapter.ts","webpack://grafana/./public/app/features/variables/custom/reducer.ts","webpack://grafana/./public/app/features/variables/custom/CustomVariableEditor.tsx","webpack://grafana/./public/app/features/variables/custom/adapter.ts","webpack://grafana/./public/app/features/variables/custom/actions.ts","webpack://grafana/./public/app/features/variables/textbox/reducer.ts","webpack://grafana/./public/app/features/variables/textbox/TextBoxVariablePicker.tsx","webpack://grafana/./public/app/features/variables/textbox/TextBoxVariableEditor.tsx","webpack://grafana/./public/app/features/variables/textbox/actions.ts","webpack://grafana/./public/app/features/variables/textbox/adapter.ts","webpack://grafana/./public/app/features/variables/constant/reducer.ts","webpack://grafana/./public/app/features/variables/constant/ConstantVariableEditor.tsx","webpack://grafana/./public/app/features/variables/constant/actions.ts","webpack://grafana/./public/app/features/variables/constant/adapter.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/reducer.ts","webpack://grafana/./public/app/features/variables/interval/IntervalVariableEditor.tsx","webpack://grafana/./public/app/features/variables/interval/actions.ts","webpack://grafana/./public/app/features/variables/interval/adapter.ts","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocPicker.tsx","webpack://grafana/./public/app/features/variables/adhoc/AdHocVariableEditor.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/adapters.ts","webpack://grafana/./public/app/features/variables/system/adapter.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/OperatorSegment.tsx","webpack://grafana/./public/app/features/variables/adhoc/picker/AdHocFilterValue.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/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/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/applyStateChanges.ts","webpack://grafana/./public/app/features/variables/pickers/OptionsPicker/reducer.ts","webpack://grafana/./public/app/features/variables/query/queryRunners.ts","webpack://grafana/./public/app/features/variables/query/operators.ts","webpack://grafana/./public/app/features/variables/query/VariableQueryRunner.ts","webpack://grafana/./public/app/features/variables/query/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/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/plugins/pluginPreloader.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/components/TransformersUI/ReduceTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/FilterByNameTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/FilterByRefIdTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/FilterByValueTransformer/ValueMatchers/utils.ts","webpack://grafana/./public/app/core/components/TransformersUI/FilterByValueTransformer/ValueMatchers/BasicMatcherEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/FilterByValueTransformer/ValueMatchers/NoopMatcherEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/FilterByValueTransformer/ValueMatchers/RangeMatcherEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/FilterByValueTransformer/ValueMatchers/valueMatchersUI.ts","webpack://grafana/./public/app/core/components/TransformersUI/FilterByValueTransformer/FilterByValueFilterEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/FilterByValueTransformer/FilterByValueTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/utils.ts","webpack://grafana/./public/app/core/components/TransformersUI/OrganizeFieldsTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/SeriesToFieldsTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/CalculateFieldTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/LabelsToFieldsTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/GroupByTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/SortByTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/MergeTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/SeriesToRowsTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/ConcatenateTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/RenameByRegexTransformer.tsx","webpack://grafana/./public/app/core/components/TransformersUI/HistogramTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/fieldToConfigMapping/fieldToConfigMapping.ts","webpack://grafana/./public/app/core/components/TransformersUI/rowsToFields/rowsToFields.ts","webpack://grafana/./public/app/core/components/TransformersUI/fieldToConfigMapping/FieldToConfigMappingEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/rowsToFields/RowsToFieldsTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/configFromQuery/configFromQuery.ts","webpack://grafana/./public/app/core/components/TransformersUI/configFromQuery/ConfigFromQueryTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/prepareTimeSeries/prepareTimeSeries.ts","webpack://grafana/./public/app/core/components/TransformersUI/prepareTimeSeries/PrepareTimeSeriesEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/ConvertFieldTypeTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/lookupGazetteer/fieldLookup.ts","webpack://grafana/./public/app/core/components/TransformersUI/lookupGazetteer/FieldLookupTransformerEditor.tsx","webpack://grafana/./public/app/core/components/TransformersUI/extractFields/fieldExtractors.ts","webpack://grafana/./public/app/core/components/TransformersUI/extractFields/extractFields.ts","webpack://grafana/./public/app/core/components/TransformersUI/extractFields/ExtractFieldsTransformerEditor.tsx","webpack://grafana/./public/app/core/utils/standardTransformers.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/core/reducers/index.ts","webpack://grafana/./public/app/features/variables/state/reducers.ts","webpack://grafana/./public/app/core/reducers/root.ts","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/LdapUserMappingInfo.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapUserPermissions.tsx","webpack://grafana/./public/app/features/admin/ldap/LdapUserGroups.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/features/admin/UserProfile.tsx","webpack://grafana/./public/app/features/admin/UserPermissions.tsx","webpack://grafana/./public/app/features/admin/UserSessions.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/UserAdminPage.tsx","webpack://grafana/./public/app/core/components/Login/UserSignup.tsx","webpack://grafana/./public/app/core/components/Login/LoginServiceButtons.tsx","webpack://grafana/./public/app/core/components/Login/LoginPage.tsx","webpack://grafana/./public/app/core/components/DynamicImports/LoadingChunkPlaceHolder.tsx","webpack://grafana/./public/app/core/navigation/hooks.ts","webpack://grafana/./public/app/core/components/DynamicImports/ErrorLoadingChunk.tsx","webpack://grafana/./public/app/core/components/DynamicImports/SafeDynamicImport.tsx","webpack://grafana/./public/app/core/components/ErrorPage/ErrorPage.tsx","webpack://grafana/./public/app/features/plugins/admin/routes.ts","webpack://grafana/./public/app/features/live/pages/routes.ts","webpack://grafana/./public/app/features/alerting/routes.tsx","webpack://grafana/./public/app/routes/routes.tsx","webpack://grafana/./public/app/core/components/NavBar/utils.ts","webpack://grafana/./public/app/core/components/OrgSwitcher.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarMenuItem.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarDropdown.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarItem.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarSection.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarMenu.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBar.tsx","webpack://grafana/./public/app/core/components/NavBar/NavBarNext.tsx","webpack://grafana/./public/app/core/navigation/GrafanaRoute.tsx","webpack://grafana/./public/app/core/components/AppNotifications/AppNotificationItem.tsx","webpack://grafana/./public/app/core/components/AppNotifications/AppNotificationList.tsx","webpack://grafana/./public/app/features/search/components/SearchField.tsx","webpack://grafana/./public/app/features/search/components/DashboardSearch.tsx","webpack://grafana/./public/app/features/search/hooks/useDashboardSearch.ts","webpack://grafana/./public/app/features/search/components/SearchWrapper.tsx","webpack://grafana/./public/app/features/live/LiveConnectionWarning.tsx","webpack://grafana/./public/app/angular/AngularRoot.tsx","webpack://grafana/./public/app/AppWrapper.tsx","webpack://grafana/./public/app/core/navigation/patch/interceptLinkClicks.ts","webpack://grafana/./public/app/features/query/state/QueryRunner.ts","webpack://grafana/./public/lib/monaco-languages/kusto.ts","webpack://grafana/./public/lib/monaco-languages/index.ts","webpack://grafana/./public/app/core/services/echo/backends/analytics/GABackend.ts","webpack://grafana/./public/app/core/services/echo/backends/analytics/ApplicationInsightsBackend.ts","webpack://grafana/./public/app/core/services/echo/backends/analytics/RudderstackBackend.ts","webpack://grafana/./public/app/core/components/editors/DashboardPicker.tsx","webpack://grafana/./public/app/core/components/editors/registry.tsx","webpack://grafana/./public/app/features/panel/components/PanelDataErrorView.tsx","webpack://grafana/./public/app/angular/panel/panel_directive.ts","webpack://grafana/./public/app/angular/panel/panel_editor_tab.ts","webpack://grafana/./public/app/angular/panel/query_editor_row.ts","webpack://grafana/./public/app/angular/filters/filters.ts","webpack://grafana/./public/app/angular/services/alert_srv.ts","webpack://grafana/./public/app/angular/services/dynamic_directive_srv.ts","webpack://grafana/./public/app/angular/services/ng_react.ts","webpack://grafana/./public/app/angular/services/segment_srv.ts","webpack://grafana/./public/app/angular/services/popover_srv.ts","webpack://grafana/./public/app/angular/services/timer.ts","webpack://grafana/./public/app/angular/services/AngularLoader.ts","webpack://grafana/./public/app/angular/dropdown_typeahead.ts","webpack://grafana/./public/app/angular/autofill_event_fix.ts","webpack://grafana/./public/app/angular/metric_segment.ts","webpack://grafana/./public/app/angular/misc.ts","webpack://grafana/./public/app/angular/ng_model_on_blur.ts","webpack://grafana/./public/app/angular/tags.ts","webpack://grafana/./public/app/angular/rebuild_on_change.ts","webpack://grafana/./public/app/angular/give_focus.ts","webpack://grafana/./public/app/angular/diff-view.ts","webpack://grafana/./public/app/angular/react2angular.ts","webpack://grafana/./public/app/angular/array_join.ts","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/AnnotationQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor.tsx","webpack://grafana/./public/app/core/components/Select/MetricSelect.tsx","webpack://grafana/./public/app/plugins/datasource/loki/components/AnnotationsQueryEditor.tsx","webpack://grafana/./public/app/angular/angular_wrappers.ts","webpack://grafana/./public/app/angular/components/query_part_editor.ts","webpack://grafana/./public/app/angular/components/form_dropdown/form_dropdown.ts","webpack://grafana/./public/app/angular/components/scroll.ts","webpack://grafana/./public/app/angular/components/jsontree.ts","webpack://grafana/./public/app/angular/components/switch.ts","webpack://grafana/./public/app/angular/components/info_popover.ts","webpack://grafana/./public/app/angular/components/spectrum_picker.ts","webpack://grafana/./public/app/angular/components/code_editor/code_editor.ts","webpack://grafana/./public/app/angular/components/sql_part/sql_part_editor.ts","webpack://grafana/./public/app/angular/components/HttpSettingsCtrl.ts","webpack://grafana/./public/app/angular/components/TlsAuthSettingsCtrl.ts","webpack://grafana/./public/app/angular/components/plugin_component.ts","webpack://grafana/./public/app/angular/GrafanaCtrl.ts","webpack://grafana/./public/app/core/navigation/patch/RouteProvider.ts","webpack://grafana/./public/app/core/navigation/patch/RouteParamsProvider.ts","webpack://grafana/./public/app/angular/bridgeReactAngularRouting.ts","webpack://grafana/./public/app/angular/services/annotations_srv.ts","webpack://grafana/./public/app/angular/services/UtilSrv.ts","webpack://grafana/./public/app/angular/AngularApp.ts","webpack://grafana/./public/app/angular/registerComponents.ts","webpack://grafana/./public/app/angular/injectorMonkeyPatch.ts","webpack://grafana/./public/app/core/components/modals/AngularModalProxy.tsx","webpack://grafana/./public/app/core/services/ModalManager.ts","webpack://grafana/./public/app/app.ts","webpack://grafana/./public/app/store/configureStore.ts","webpack://grafana/./public/app/index.ts","webpack://grafana/./public/app/plugins/datasource/alertmanager/types.ts","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/MQLQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/MetricQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/QueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/SLO/Service.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/SLO/SLO.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/SLO/Selector.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/SLO/SLOQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/Project.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/Metrics.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/GroupBy.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/Alignment.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/LabelFilter.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/AnnotationsHelp.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/AlignmentFunction.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/AlignmentPeriod.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/AlignmentPeriodLabel.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/AliasBy.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/Aggregation.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/Fields.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/VisualMetricQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/components/Preprocessor.tsx","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/constants.ts","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/functions.ts","webpack://grafana/./public/app/plugins/datasource/cloud-monitoring/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/aws_url.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/commands.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/definition.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/language.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/query/getStatsGroups.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/LogsQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/CloudWatchLink.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/LogsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/MetricStatEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/FlexItem.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/QueryHeader.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/guards.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/PanelQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/EditorList.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/InputGroup.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/AccessoryButton.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/FilterItem.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/Dimensions.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/Forms.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/Alias.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/expressions.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/utils.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLFilter.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLGroupBy.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLBuilderSelectRow.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/SQLGenerator.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLOrderByGroup.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLBuilderEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/MathExpressionQueryField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/cloudwatch-sql/register.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/SQLCodeEditor.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/EditorField.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/EditorFieldGroup.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/EditorHeader.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/EditorRow.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/EditorRows.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/InlineSelect.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/components/ui/Stack.tsx","webpack://grafana/./public/app/plugins/datasource/cloudwatch/hooks.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/syntax.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/types.ts","webpack://grafana/./public/app/plugins/datasource/cloudwatch/utils/utils.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/azureMetadata/locations.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/resourceTypes.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/Field.tsx","webpack://grafana/./public/app/core/utils/deferred.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/QueryField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/FormatAsField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/styles.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/NestedRows.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/NestedResourceTable.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/index.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/ResourceField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/useMigrations.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/LogsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/LogsQueryEditor/setQueryValue.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/setQueryValue.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/SubscriptionField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/MetricNamespaceField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceTypeField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceGroupsField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceNameField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/MetricNameField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/AggregationField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/TimeGrainField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/DimensionFields.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/TopField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/LegendFormatField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/MetricsQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryTypeField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ArgQueryEditor/QueryField.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ArgQueryEditor/ArgQueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ApplicationInsightsEditor/index.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/InsightsAnalyticsEditor/index.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/usePreparedQuery.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/types.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/ResourcePicker/utils.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/components/Space.tsx","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/time_grain_converter.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/types/query.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/types/types.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/utils/common.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/utils/messageFromError.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/utils/migrateQuery.ts","webpack://grafana/./public/app/plugins/datasource/grafana-azure-monitor-datasource/utils/useLastError.ts","webpack://grafana/./public/app/plugins/datasource/influxdb/components/useUniqueId.ts","webpack://grafana/./public/app/plugins/datasource/loki/components/LokiOptionFields.tsx","webpack://grafana/./public/app/plugins/datasource/loki/components/LokiLabelBrowser.tsx","webpack://grafana/./public/app/plugins/datasource/loki/language_utils.ts","webpack://grafana/./public/app/plugins/datasource/loki/components/LokiQueryField.tsx","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/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/geomap/editor/GazetteerPathEditor.tsx","webpack://grafana/./public/app/plugins/panel/geomap/gazetteer/gazetteer.ts","webpack://grafana/./public/app/plugins/panel/geomap/gazetteer/worldmap.ts","webpack://grafana/./public/app/plugins/panel/geomap/gazetteer/geojson.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/usePanning.ts","webpack://grafana/./public/app/plugins/panel/nodeGraph/Node.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/Edge.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/ViewControls.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/useZoom.ts","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/EdgeArrowMarker.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/EdgeLabel.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/useContextMenu.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/Marker.tsx","webpack://grafana/./public/app/plugins/panel/nodeGraph/Legend.tsx","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/StatPanel.tsx","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/stat/types.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/FillBelowToEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/SpanNullsEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/ThresholdsStyleEditor.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/config.ts","webpack://grafana/./public/app/plugins/sdk.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/appNotifications.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/vendor/angular-other/angular-strap.js","webpack://grafana/./public/vendor/bootstrap/bootstrap.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","webpack://grafana/./public/vendor/tagsinput/bootstrap-tagsinput.js"],"sourcesContent":["import { Field, FieldType, DataFrame } from '../types/dataFrame';\nimport { vectorToArray } from '../vector/vectorToArray';\nimport { Vector, QueryResultMeta } from '../types';\nimport { guessFieldTypeFromNameAndValue, toDataFrameDTO } from './processDataFrame';\nimport { FunctionalVector } from '../vector/FunctionalVector';\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';\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\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, ...sfield } = f;\n      data.values.push(values.toArray());\n      return sfield;\n    }),\n  };\n\n  return {\n    schema,\n    data,\n  };\n}\n","import { DataFrame } from '../types/dataFrame';\nimport { DisplayProcessor } from '../types';\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\n  constructor(private data: DataFrame) {\n    super();\n    const obj = ({} as unknown) as T;\n\n    for (let i = 0; i < data.fields.length; i++) {\n      const field = data.fields[i];\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  }\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 { Field, DataFrame, DataFrameDTO, FieldDTO, FieldType } from '../types/dataFrame';\nimport { QueryResultMeta } from '../types/data';\nimport { guessFieldTypeFromValue, guessFieldTypeForField, toDataFrameDTO } from './processDataFrame';\nimport { isString } from 'lodash';\nimport { makeFieldParser } from '../utils/fieldParser';\nimport { MutableVector, Vector } from '../types/vector';\nimport { ArrayVector } from '../vector/ArrayVector';\nimport { FunctionalVector } from '../vector/FunctionalVector';\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  /**\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        if (!f.parse) {\n          f.parse = makeFieldParser(v, f);\n        }\n        v = f.parse(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        if (!field.parse) {\n          field.parse = makeFieldParser(val, field);\n        }\n        val = field.parse(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 { Field, DataFrame, FieldType, Labels, QueryResultMeta } from '../types';\nimport { ArrayVector } from '../vector';\nimport { DataFrameJSON, decodeFieldValueEntities, FieldSchema } from './DataFrameJSON';\nimport { guessFieldTypeFromValue } from './processDataFrame';\nimport { join } from '../transformations/transformers/joinDataFrames';\nimport { AlignedData } from 'uplot';\n\n/**\n * Indicate if the frame is appened or replace\n *\n * @public -- but runtime\n */\nexport enum StreamingFrameAction {\n  Append = 'append',\n  Replace = 'replace',\n}\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 *\n * @public -- but runtime\n */\nexport interface StreamPacketInfo {\n  number: number;\n  action: StreamingFrameAction;\n  length: number;\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\nenum PushMode {\n  wide,\n  labels,\n  // long\n}\n\n/**\n * Unlike a circular buffer, this will append and periodically slice the front\n *\n * @alpha\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  options: StreamingFrameOptions;\n\n  private schemaFields: FieldSchema[] = [];\n  private timeFieldIndex = -1;\n  private pushMode = PushMode.wide;\n  private alwaysReplace = false;\n\n  // current labels\n  private labels: Set<string> = new Set();\n  readonly packetInfo: StreamPacketInfo = {\n    number: 0,\n    action: StreamingFrameAction.Replace,\n    length: 0,\n  };\n\n  constructor(frame: DataFrameJSON, opts?: StreamingFrameOptions) {\n    this.options = {\n      maxLength: 1000,\n      maxDelta: Infinity,\n      ...opts,\n    };\n    this.alwaysReplace = this.options.action === StreamingFrameAction.Replace;\n\n    this.push(frame);\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) {\n    const { schema, data } = msg;\n\n    this.packetInfo.number++;\n\n    if (schema) {\n      this.pushMode = PushMode.wide;\n      this.timeFieldIndex = schema.fields.findIndex((f) => f.type === FieldType.time);\n      if (\n        this.timeFieldIndex === 1 &&\n        schema.fields[0].name === 'labels' &&\n        schema.fields[0].type === FieldType.string\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      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      } else {\n        const isWide = this.pushMode === PushMode.wide;\n        this.fields = niceSchemaFields.map((f) => {\n          return {\n            config: f.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 ?? new ArrayVector()\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.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}, recieved: ${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\n  // adds a set of fields for a new label\n  private addLabel(label: string) {\n    let labelCount = this.labels.size;\n\n    // parse labels\n    const parsedLabels: Labels = {};\n    if (label.length) {\n      label.split(',').forEach((kv) => {\n        const [key, val] = kv.trim().split('=');\n        parsedLabels[key] = val;\n      });\n    }\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        }\n      });\n    } else {\n      for (let i = 1; i < this.schemaFields.length; i++) {\n        let proto = this.schemaFields[i] as Field;\n\n        this.fields.push({\n          ...proto,\n          config: proto.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\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\nfunction 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\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: number[][], newData: number[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) {\n  for (let i = 0; i < data.length; i++) {\n    data[i] = data[i].concat(newData[i]);\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];\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  if (sliceIdx) {\n    for (let i = 0; i < data.length; i++) {\n      data[i] = data[i].slice(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 { Field } from '../types/dataFrame';\nimport { KeyValue } from '../types/data';\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 === '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 { MutableDataFrame } from './MutableDataFrame';\nimport { CircularVector } from '../vector/CircularVector';\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 {\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 { isDateTime } from '../datetime/moment_wrapper';\nimport { ArrayVector } from '../vector/ArrayVector';\nimport { MutableDataFrame } from './MutableDataFrame';\nimport { SortedVector } from '../vector/SortedVector';\nimport { ArrayDataFrame } from './ArrayDataFrame';\nimport { getFieldDisplayName } from '../field/fieldState';\nimport { fieldIndexComparer } from '../field/fieldComparers';\nimport { vectorToArray } from '../vector/vectorToArray';\nimport { dataFrameFromJSON } from './DataFrameJSON';\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) {\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  const fields: FieldDTO[] = data.fields.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';\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';\nimport { DateTime, dateTime, dateTimeForTimeZone, DurationUnit, isDateTime, ISO_8601 } from './moment_wrapper';\nimport { TimeZone } from '../types/index';\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    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';\n\nexport class SystemDateFormatsState {\n  fullDate = DEFAULT_SYSTEM_DATE_FORMAT;\n  interval = {\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  get fullDateMS() {\n    // Add millisecond to seconds part\n    return this.fullDate.replace('ss', 'ss.SSS');\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    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';\nimport { TimeZone } from '../types';\nimport { DateTimeInput } from './moment_wrapper';\nimport { systemDateFormats } from './formats';\nimport { DateTimeOptions, getTimeZone } from './common';\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 moment from 'moment-timezone';\nimport { memoize } from 'lodash';\nimport { TimeZone } from '../types';\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.substr(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: 'Palestinian Territory (Occupied)',\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 intervalToDuration from 'date-fns/intervalToDuration';\nimport add from 'date-fns/add';\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 duration - string to convert. For example '2m', '5h 20s'\n *\n * @public\n */\nexport function parseDuration(duration: string): Duration {\n  return duration.split(' ').reduce<Duration>((acc, value) => {\n    const match = value.match(/(\\d+)(.+)/);\n    if (match === null || match.length !== 3) {\n      return acc;\n    }\n\n    const key = Object.entries(durationMap).find(([_, abbreviations]) => abbreviations?.includes(match[2]))?.[0];\n    return !key ? acc : { ...acc, [key]: match[1] };\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 { TimeZone } from '../types/time';\n/* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */\nimport moment, { Moment, MomentInput, DurationInputArg1, DurationInputArg2 } from 'moment';\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 setWeekStart = (weekStart?: string) => {\n  const suffix = '-weekStart';\n  const language = getLocale().replace(suffix, '');\n  const dow = weekStart ? getWeekdayIndex(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 { isDateTime, DateTime, dateTime } from './moment_wrapper';\nimport { timeZoneAbbrevation, dateTimeFormat, dateTimeFormatTimeAgo } from './formatter';\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.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    // 12.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 { Field, FieldType } from '../types/dataFrame';\nimport { DisplayProcessor, DisplayValue } from '../types/displayValue';\nimport { getValueFormat, isBooleanUnit } from '../valueFormats/valueFormats';\nimport { getValueMappingResult } from '../utils/valueMappings';\nimport { dateTime, dateTimeParse } from '../datetime';\nimport { KeyValue, TimeZone } from '../types';\nimport { getScaleCalculator } from './scale';\nimport { GrafanaTheme2 } from '../themes/types';\nimport { anyToNumber } from '../utils/anyToNumber';\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  }\n\n  const formatFunc = getValueFormat(unit || 'none');\n  const scaleFunc = getScaleCalculator(field, options.theme);\n\n  return (value: any) => {\n    const { mappings } = config;\n    const isStringUnit = unit === 'string';\n\n    if (hasDateUnit && typeof value === 'string') {\n      value = dateTime(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 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    }\n\n    if (!isNaN(numeric)) {\n      if (text == null && !isBoolean(value)) {\n        const v = formatFunc(numeric, 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    return { text, numeric, prefix, suffix, color, percent };\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: `${value}`,\n    numeric: (null as unknown) as number,\n  });\n}\n","import { FALLBACK_COLOR, Field, FieldColorModeId, Threshold } from '../types';\nimport { RegistryItem } from '../utils';\nimport { Registry } from '../utils/Registry';\nimport { interpolateRgbBasis } from 'd3-interpolate';\nimport { fallBackTreshold } from './thresholds';\nimport { getScaleCalculator, ColorScaleValue } from './scale';\nimport { reduceField } from '../transformations/fieldReducer';\nimport { GrafanaTheme2 } from '../themes/types';\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 { getFieldDisplayName } from './fieldState';\nimport { formatLabels } from '../utils/labels';\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 {\n  ApplyFieldOverrideOptions,\n  DataFrame,\n  DataLink,\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 { fieldMatchers, reduceField, ReducerID } from '../transformations';\nimport { FieldMatcher } from '../types/transformations';\nimport { isNumber, set, unset, get, cloneDeep } from 'lodash';\nimport { getDisplayProcessor, getRawDisplayProcessor } from './displayProcessor';\nimport { guessFieldTypeForField } from '../dataframe';\nimport { standardFieldConfigEditorRegistry } from './standardFieldConfigEditorRegistry';\nimport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\nimport { DataLinkBuiltInVars, locationUtil } from '../utils';\nimport { formattedValueToString } from '../valueFormats';\nimport { getFieldDisplayValuesProxy } from './getFieldDisplayValuesProxy';\nimport { getFrameDisplayName } from './fieldState';\nimport { getTimeField } from '../dataframe/processDataFrame';\nimport { mapInternalLinkToExplore } from '../utils/dataLinks';\nimport { getTemplateProxyForField } from './templateProxies';\nimport { asHexString } from '../themes/colorManipulator';\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 formating and threshold color determinitation\nfunction cachingDisplayProcessor(disp: DisplayProcessor, maxCacheSize = 2500): DisplayProcessor {\n  const cache = new Map<any, DisplayValue>();\n\n  return (value: any) => {\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);\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  frame: DataFrame,\n  field: Field,\n  fieldScopedVars: ScopedVars,\n  replaceVariables: InterpolateFunction,\n  timeZone?: TimeZone\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';\nimport { DataFrame, DisplayValue, TimeZone } from '../types';\nimport { formattedValueToString } from '../valueFormats';\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 { getDisplayProcessor } from './displayProcessor';\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 { DataFrameView } from '../dataframe/DataFrameView';\nimport { GrafanaTheme2 } from '../themes';\nimport { reduceField, ReducerID } from '../transformations/fieldReducer';\nimport { ScopedVars } from '../types/ScopedVars';\nimport { getTimeField } from '../dataframe/processDataFrame';\nimport { getFieldMatcher } from '../transformations';\nimport { FieldMatcherID } from '../transformations/matchers/ids';\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  /** 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\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';\nimport { GrafanaTheme2 } from '../themes/types';\nimport { reduceField, ReducerID } from '../transformations/fieldReducer';\nimport { Field, FieldConfig, FieldType, NumericRange, Threshold } from '../types';\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 { Registry, RegistryItem } from '../utils/Registry';\nimport { ComponentType } from 'react';\nimport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\nimport { DataFrame, InterpolateFunction, VariableSuggestionsScope, VariableSuggestion } from '../types';\nimport { EventBus } from '../events';\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';\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';\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","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 { RegistryItemWithOptions } from '../utils/Registry';\nimport BaseLayer from 'ol/layer/Base';\nimport Map from 'ol/Map';\nimport { PanelData } from '../types';\nimport { GrafanaTheme2 } from '../themes';\nimport { PanelOptionsEditorBuilder } from '../utils';\nimport { ReactNode } from 'react';\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  // 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\n/**\n * @alpha\n */\nexport interface MapLayerHandler<TConfig = any> {\n  init: () => BaseLayer;\n  update?: (data: PanelData) => void;\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   * Show transparency controls in UI (for non-basemaps)\n   */\n  showOpacity?: boolean;\n\n  /**\n   * Function that configures transformation and returns a transformer\n   * @param options\n   */\n  create: (map: Map, options: MapLayerOptions<TConfig>, theme: GrafanaTheme2) => 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';\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 {\n  FieldConfigSource,\n  GrafanaPlugin,\n  PanelEditorProps,\n  PanelMigrationHandler,\n  PanelPluginMeta,\n  PanelProps,\n  PanelTypeChangedHandler,\n  FieldConfigProperty,\n  PanelPluginDataSupport,\n  VisualizationSuggestionsSupplier,\n} from '../types';\nimport { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders';\nimport { ComponentClass, ComponentType } from 'react';\nimport { set } from 'lodash';\nimport { deprecationWarning } from '../utils';\nimport { FieldConfigOptionsRegistry, StandardEditorContext } from '../field';\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","import { marked } from 'marked';\nimport { sanitize } from './sanitize';\n\nlet hasInitialized = false;\n\nexport interface RenderMarkdownOptions {\n  noSanitize?: boolean;\n}\n\nexport function renderMarkdown(str?: string, options?: RenderMarkdownOptions): string {\n  if (!hasInitialized) {\n    marked.setOptions({\n      pedantic: false,\n      gfm: true,\n      smartLists: true,\n      smartypants: false,\n      xhtml: false,\n    });\n    hasInitialized = true;\n  }\n\n  const html = marked(str || '');\n  if (options?.noSanitize) {\n    return html;\n  }\n\n  return sanitize(html);\n}\n","export * from './string';\nexport * from './markdown';\nexport * from './text';\nimport { escapeHtml, hasAnsiCodes, sanitize, sanitizeUrl } from './sanitize';\n\nexport const textUtil = {\n  escapeHtml,\n  hasAnsiCodes,\n  sanitize,\n  sanitizeUrl,\n};\n","import { camelCase } from 'lodash';\nconst specialChars = ['(', '[', '{', '}', ']', ')', '|', '*', '+', '-', '.', '?', '<', '>', '#', '&', '^', '$'];\n\nexport const escapeStringForRegex = (value: string) => {\n  if (!value) {\n    return value;\n  }\n\n  return specialChars.reduce((escaped, currentChar) => escaped.replace(currentChar, '\\\\' + currentChar), value);\n};\n\nexport const unEscapeStringFromRegex = (value: string) => {\n  if (!value) {\n    return value;\n  }\n\n  return specialChars.reduce((escaped, currentChar) => escaped.replace('\\\\' + currentChar, currentChar), value);\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?)$'));\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.substr(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.substr(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 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].substr(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';\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.58)`,\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 10px 20px rgb(20,20,20)',\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';\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 { DataTransformerID } from './ids';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { map } from 'rxjs/operators';\nimport { DataFrame } from '../../types/dataFrame';\nimport { getFieldDisplayName } from '../../field/fieldState';\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 = new RegExp(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 { SynchronousDataTransformerInfo } from '../../types';\nimport { map } from 'rxjs/operators';\n\nimport { DataTransformerID } from './ids';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { dateTimeParse } from '../../datetime';\nimport { ArrayVector } from '../../vector';\nimport { fieldMatchers } from '../matchers';\nimport { FieldMatcherID } from '../matchers/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 specifed 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    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\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 { reduceTransformer } from './transformers/reduce';\nimport { concatenateTransformer } from './transformers/concat';\nimport { calculateFieldTransformer } from './transformers/calculateField';\nimport { filterFieldsTransformer, filterFramesTransformer } from './transformers/filter';\nimport { filterFieldsByNameTransformer } from './transformers/filterByName';\nimport { noopTransformer } from './transformers/noop';\nimport { filterFramesByRefIdTransformer } from './transformers/filterByRefId';\nimport { orderFieldsTransformer } from './transformers/order';\nimport { organizeFieldsTransformer } from './transformers/organize';\nimport { seriesToColumnsTransformer } from './transformers/seriesToColumns';\nimport { seriesToRowsTransformer } from './transformers/seriesToRows';\nimport { renameFieldsTransformer } from './transformers/rename';\nimport { labelsToFieldsTransformer } from './transformers/labelsToFields';\nimport { ensureColumnsTransformer } from './transformers/ensureColumns';\nimport { groupByTransformer } from './transformers/groupBy';\nimport { sortByTransformer } from './transformers/sortBy';\nimport { mergeTransformer } from './transformers/merge';\nimport { renameByRegexTransformer } from './transformers/renameByRegex';\nimport { filterByValueTransformer } from './transformers/filterByValue';\nimport { histogramTransformer } from './transformers/histogram';\nimport { convertFieldTypeTransformer } from './transformers/convertFieldType';\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};\n","import React from 'react';\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';\nimport { standardTransformersRegistry, TransformerRegistryItem } from './standardTransformersRegistry';\n\nconst getOperator = (config: DataTransformerConfig): MonoTypeOperatorFunction<DataFrame[]> => (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) => of(before).pipe(info.transformation.operator(options), postProcessTransform(before, info)))\n  );\n};\n\nconst postProcessTransform = (\n  before: DataFrame[],\n  info: TransformerRegistryItem<any>\n): MonoTypeOperatorFunction<DataFrame[]> => (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 { getFieldPredicateMatchers, getFramePredicateMatchers } from './matchers/predicates';\nimport { getFieldNameMatchers, getFrameNameMatchers } from './matchers/nameMatcher';\nimport { getFieldTypeMatchers } from './matchers/fieldTypeMatcher';\nimport { getRefIdMatchers } from './matchers/refIdMatcher';\nimport {\n  FieldMatcherInfo,\n  MatcherConfig,\n  FrameMatcherInfo,\n  FieldMatcher,\n  FrameMatcher,\n  ValueMatcherInfo,\n  ValueMatcher,\n} from '../types/transformations';\nimport { Registry } from '../utils/Registry';\nimport { getNullValueMatchers } from './matchers/valueMatchers/nullMatchers';\nimport { getNumericValueMatchers } from './matchers/valueMatchers/numericMatchers';\nimport { getEqualValueMatchers } from './matchers/valueMatchers/equalMatchers';\nimport { getRangeValueMatchers } from './matchers/valueMatchers/rangeMatchers';\nimport { getSimpleFieldMatchers } from './matchers/simpleFieldMatcher';\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 { Field, DataFrame } from '../../types/dataFrame';\nimport { FieldMatcherID, FrameMatcherID } from './ids';\nimport { FieldMatcherInfo, FrameMatcherInfo, FieldMatcher } from '../../types/transformations';\nimport { stringToJsRegex } from '../../text/string';\nimport { getFieldDisplayName } from '../../field/fieldState';\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 { map } from 'rxjs/operators';\n\nimport { DataFrame, DataTransformerInfo, Field, FieldType, NullValueMode, Vector } from '../../types';\nimport { DataTransformerID } from './ids';\nimport { doStandardCalcs, fieldReducers, ReducerID } from '../fieldReducer';\nimport { getFieldMatcher } from '../matchers';\nimport { FieldMatcherID } from '../matchers/ids';\nimport { RowVector } from '../../vector/RowVector';\nimport { ArrayVector, BinaryOperationVector, ConstantVector } from '../../vector';\nimport { AsNumberVector } from '../../vector/AsNumberVector';\nimport { getTimeField } from '../../dataframe/processDataFrame';\nimport { defaults } from 'lodash';\nimport { BinaryOperationID, binaryOperators } from '../../utils/binaryOperators';\nimport { ensureColumnsTransformer } from './ensureColumns';\nimport { getFieldDisplayName } from '../../field';\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) => (outerSource) => {\n    const operator =\n      options && options.timeSeries !== false ? ensureColumnsTransformer.operator(null) : noopTransformer.operator({});\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          creator = getBinaryCreator(defaults(options.binary, 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 { DataTransformerID } from './ids';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { DataFrame, Field, TIME_SERIES_VALUE_FIELD_NAME } from '../../types/dataFrame';\nimport { ArrayVector } from '../../vector';\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 { noopTransformer } from './noop';\nimport { DataTransformerID } from './ids';\nimport { DataTransformerInfo, MatcherConfig } from '../../types/transformations';\nimport { DataFrame, Field } from '../../types/dataFrame';\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { getValueMatcher } from '../matchers';\nimport { ArrayVector } from '../../vector/ArrayVector';\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 { DataTransformerID } from './ids';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { ArrayVector } from '../../vector/ArrayVector';\nimport { guessFieldTypeForField } from '../../dataframe/processDataFrame';\nimport { reduceField, ReducerID } from '../fieldReducer';\nimport { MutableField } from '../../dataframe/MutableDataFrame';\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: Record<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[groupKey] ?? {};\n\n            if (!valuesByGroupKey[groupKey]) {\n              valuesByGroupKey[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          const groupKeys = Object.keys(valuesByGroupKey);\n\n          for (const field of groupByFields) {\n            const values = new ArrayVector();\n            const fieldName = getFieldDisplayName(field);\n\n            for (let key of groupKeys) {\n              const valuesByField = valuesByGroupKey[key];\n              values.add(valuesByField[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            for (const groupKey of groupKeys) {\n              const fieldWithValuesForGroup = valuesByGroupKey[groupKey][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: groupKeys.length,\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 { SynchronousDataTransformerInfo } from '../../types';\nimport { map } from 'rxjs/operators';\n\nimport { DataTransformerID } from './ids';\nimport { DataFrame, Field, FieldConfig, FieldType } from '../../types/dataFrame';\nimport { ArrayVector } from '../../vector/ArrayVector';\nimport { AlignedData, join } from './joinDataFrames';\nimport { getDisplayProcessor } from '../../field';\nimport { createTheme, GrafanaTheme2 } from '../../themes';\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) {\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.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  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: config ?? {},\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// function incrRound(num: number, incr: number) {\n//   return Math.round(num / incr) * incr;\n// }\n\n// function incrRoundUp(num: number, incr: number) {\n//   return Math.ceil(num / incr) * incr;\n// }\n\nfunction 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 { map } from 'rxjs/operators';\n\nimport { DataFrame, Field, FieldType, SynchronousDataTransformerInfo } from '../../types';\nimport { DataTransformerID } from './ids';\nimport { ArrayVector } from '../../vector';\nimport { getFieldDisplayName } from '../..';\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] ||= new Set());\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 { DataTransformerID } from './ids';\nimport { DataTransformerInfo } from '../../types/transformations';\nimport { DataFrame, Field } from '../../types';\nimport { getFieldDisplayName } from '../../field/fieldState';\nimport { map } from 'rxjs/operators';\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 = (indexByName: Record<string, number>) => (\n  fields: Field[],\n  data: DataFrame[],\n  frame: DataFrame\n) => {\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 { DataTransformerID } from './ids';\nimport { DataTransformerInfo, FieldMatcher, MatcherConfig } from '../../types/transformations';\nimport { fieldReducers, reduceField, ReducerID } from '../fieldReducer';\nimport { alwaysFieldMatcher, notTimeFieldMatcher } from '../matchers/predicates';\nimport { DataFrame, Field, FieldType } from '../../types/dataFrame';\nimport { ArrayVector } from '../../vector/ArrayVector';\nimport { KeyValue } from '../../types/data';\nimport { guessFieldTypeForField } from '../../dataframe/processDataFrame';\nimport { getFieldMatcher } from '../matchers';\nimport { getFieldDisplayName } from '../../field';\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 { DataSourceInstanceSettings } from './datasource';\nimport { PanelPluginMeta } from './panel';\nimport { GrafanaTheme } from './theme';\nimport { SystemDateFormatSettings } from '../datetime';\nimport { GrafanaTheme2 } from '../themes';\nimport { MapLayerOptions } from '../geo/layer';\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  /**\n   * Is set to true when running Grafana Enterprise edition.\n   *\n   * @deprecated use `licenseInfo.hasLicense` instead\n   */\n  isEnterprise: boolean;\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 available feature toggles in Grafana. These can be configured via the\n * `conf/custom.ini` to enable features under development or not yet available in\n * stable version.\n *\n * @public\n */\nexport interface FeatureToggles {\n  [name: string]: boolean;\n\n  trimDefaults: boolean;\n  accesscontrol: boolean;\n  tempoServiceGraph: boolean;\n  tempoSearch: boolean;\n  tempoBackendSearch: boolean;\n  recordedQueries: boolean;\n  newNavigation: boolean;\n  fullRangeLogsVolume: boolean;\n}\n\n/**\n * Describes the license information about the current running instance of Grafana.\n *\n * @public\n */\nexport interface LicenseInfo {\n  hasLicense: boolean;\n  expiry: number;\n  licenseUrl: string;\n  stateInfo: string;\n  hasValidLicense: boolean;\n  edition: GrafanaEdition;\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 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/**\n * Describes all the different Grafana configuration values available for an instance.\n *\n * @public\n */\nexport interface GrafanaConfig {\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: any;\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  ldapEnabled: boolean;\n  sigV4AuthEnabled: boolean;\n  samlEnabled: boolean;\n  autoAssignOrg: boolean;\n  verifyEmailEnabled: boolean;\n  oauth: any;\n  disableUserSignUp: boolean;\n  loginHint: any;\n  passwordHint: any;\n  loginError: any;\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  customTheme?: any;\n  geomapDefaultBaseLayer?: MapLayerOptions;\n  geomapDisableCustomBaseLayer?: boolean;\n  unifiedAlertingEnabled: boolean;\n}\n","export const GAUGE_DEFAULT_MINIMUM = 0;\nexport const GAUGE_DEFAULT_MAXIMUM = 100;\nexport const DEFAULT_SAML_NAME = 'SAML';\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","import { DataQuery } from './query';\nimport { InterpolateFunction } from './panel';\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;\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","import { Observable } from 'rxjs';\nimport { ComponentType } from 'react';\n\nimport { QueryEditorProps } from './datasource';\nimport { DataFrame } from './dataFrame';\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 | string | 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 propery directly on the main object\n  [key: string]: any;\n}\n\nexport interface AnnotationEvent {\n  id?: string;\n  annotation?: any;\n  dashboardId?: number;\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>>;\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<QueryEditorProps<any, TQuery>>;\n}\n","export interface NavModelItem {\n  text: string;\n  url?: string;\n  subTitle?: string;\n  icon?: string;\n  img?: string;\n  id?: string;\n  active?: boolean;\n  hideFromTabs?: boolean;\n  hideFromMenu?: boolean;\n  divider?: boolean;\n  children?: NavModelItem[];\n  breadcrumbs?: NavModelBreadcrumb[];\n  target?: string;\n  parentItem?: NavModelItem;\n  section?: NavSection;\n  showOrgSwitcher?: boolean;\n  onClick?: () => void;\n}\n\nexport enum NavSection {\n  Core = 'core',\n  Plugin = 'plugin',\n  Config = 'config',\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   *  Describes breadcrumbs that are used in places such as data source settings., folder page and plugins page.\n   */\n  breadcrumbs?: 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';\nimport { MatcherConfig, FieldConfig, Field, DataFrame, TimeZone } from '../types';\nimport { InterpolateFunction } from './panel';\nimport { StandardEditorProps, FieldConfigOptionsRegistry, StandardEditorContext } from '../field';\nimport { OptionsEditorItem } from './OptionsUIRegistryBuilder';\nimport { OptionEditorConfig } from './options';\nimport { GrafanaTheme2 } from '../themes';\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 { ComponentClass } from 'react';\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}\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: ComponentClass<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 { ComponentClass } from 'react';\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?: ComponentClass<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: ComponentClass<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 { Observable } from 'rxjs';\nimport { ComponentType } from 'react';\nimport { GrafanaPlugin, PluginMeta } from './plugin';\nimport { PanelData } from './panel';\nimport { LogRowModel } from './logs';\nimport { AnnotationEvent, AnnotationQuery, AnnotationSupport } from './annotations';\nimport { KeyValue, LoadingState, TableData, TimeSeries } from './data';\nimport { DataFrame, DataFrameDTO } from './dataFrame';\nimport { RawTimeRange, TimeRange } from './time';\nimport { ScopedVars } from './ScopedVars';\nimport { CoreApp } from './app';\nimport { CustomVariableSupport, DataSourceVariableSupport, StandardVariableSupport } from './variables';\nimport { makeClassES5Compatible } from '../utils/makeClassES5Compatible';\nimport { DataQuery } from './query';\nimport { DataSourceRef } 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  setExploreQueryField(ExploreQueryField: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>) {\n    this.components.ExploreQueryField = ExploreQueryField;\n    return this;\n  }\n\n  setExploreMetricsQueryField(ExploreQueryField: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>) {\n    this.components.ExploreMetricsQueryField = ExploreQueryField;\n    return this;\n  }\n\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  ExploreQueryField?: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>;\n  ExploreMetricsQueryField?: ComponentType<QueryEditorProps<DSType, TQuery, TOptions>>;\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   * Imports queries from a different datasource\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   * @deprecated getLogRowContext and showContextToggle in `DataSourceApi` is deprecated.\n   *\n   * DataSourceWithLogsContextSupport should be implemented instead (these methods have exactly\n   * the same signature in DataSourceWithLogsContextSupport).\n   * This method will be removed from DataSourceApi in the future. Some editors may still show\n   * a deprecation warning which can be ignored for time being.\n   */\n  getLogRowContext?: <TContextQueryOptions extends {}>(\n    row: LogRowModel,\n    options?: TContextQueryOptions\n  ) => Promise<DataQueryResponse>;\n\n  /**\n   * @deprecated getLogRowContext and showContextToggle in `DataSourceApi` is deprecated.\n   *\n   * DataSourceWithLogsContextSupport should be implemented instead (these methods have exactly\n   * the same signature in DataSourceWithLogsContextSupport).\n   * This method will be removed from DataSourceApi in the future. Some editors may still show\n   * a deprecation warning which can be ignored for time being.\n   */\n  showContextToggle?(row?: LogRowModel): boolean;\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\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  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?: string;\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  reverse?: boolean;\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\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}\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  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  password: string;\n  user: string;\n  database: string;\n  basicAuth: boolean;\n  basicAuthPassword: string;\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 { DataQueryError, DataQueryRequest, DataQueryTimings } from './datasource';\nimport { PluginMeta } from './plugin';\nimport { ScopedVars } from './ScopedVars';\nimport { LoadingState, PreferredVisualisationType } from './data';\nimport { DataFrame, FieldType } from './dataFrame';\nimport { AbsoluteTimeRange, TimeRange, TimeZone } from './time';\nimport { EventBus } from '../events';\nimport { FieldConfigSource } from './fieldOverrides';\nimport { Registry } from '../utils';\nimport { StandardEditorProps } from '../field';\nimport { OptionsEditorItem } from './OptionsUIRegistryBuilder';\nimport { OptionEditorConfig } from './options';\nimport { AlertStateInfo } from './alerts';\nimport { PanelModel } from './dashboard';\nimport { DataTransformerConfig } from './transformations';\nimport { defaultsDeep } from 'lodash';\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 { DataQueryError, DataQueryResponseData } from './datasource';\nimport { AngularPanelMenuItem } from './panel';\nimport { DataFrame } from './dataFrame';\nimport { eventFactory } from '../events/eventFactory';\nimport { BusEventBase, BusEventWithPayload } from '../events/types';\nimport { DataHoverPayload } from '../events';\n\nexport type AlertPayload = [string, string?];\nexport type AlertErrorPayload = [string, (string | Error)?];\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 interface LiveChannelAddress {\n  scope: LiveChannelScope;\n  namespace: string; // depends on the scope\n  path: string;\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): string {\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';\nimport { DataQuery } from './query';\n\nimport {\n  DataQueryRequest,\n  DataQueryResponse,\n  DataSourceApi,\n  DataSourceJsonData,\n  DataSourceOptionsType,\n  DataSourceQueryType,\n  QueryEditorProps,\n} from './datasource';\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 { DataQuery } from './query';\nimport { AbsoluteTimeRange } from './time';\nimport { DataQueryResponse } from './datasource';\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?: 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 * @alpha\n */\nexport interface DataSourceWithLogsContextSupport {\n  /**\n   * Retrieve context for a given log row\n   */\n  getLogRowContext: <TContextQueryOptions extends {}>(\n    row: LogRowModel,\n    options?: TContextQueryOptions\n  ) => Promise<DataQueryResponse>;\n\n  showContextToggle(row?: LogRowModel): boolean;\n}\n\n/**\n * @alpha\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 { DataQuery } from './query';\nimport { DataQueryRequest, DataQueryResponse } from './datasource';\nimport { Observable } from 'rxjs';\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';\nimport { RegistryItem, Registry } from '../utils/Registry';\nimport {\n  NumberFieldConfigSettings,\n  SliderFieldConfigSettings,\n  SelectFieldConfigSettings,\n  StringFieldConfigSettings,\n} from '../field';\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  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 { FieldConfigEditorProps, FieldConfigPropertyItem, FieldConfigEditorConfig } from '../types/fieldOverrides';\nimport { OptionsEditorItem, OptionsUIRegistryBuilder } from '../types/OptionsUIRegistryBuilder';\nimport { PanelOptionsEditorConfig, PanelOptionsEditorItem } from '../types/panel';\nimport {\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';\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","/** @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","import {\n  DataLink,\n  DataQuery,\n  Field,\n  InternalDataLink,\n  InterpolateFunction,\n  LinkModel,\n  ScopedVars,\n  TimeRange,\n} from '../types';\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?: (options: { datasourceUid: string; query: any; range?: TimeRange }) => void;\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 = interpolateQuery(link, 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.datasourceName, interpolatedQuery, range),\n    onClick: onClickFn\n      ? () => {\n          onClickFn({\n            datasourceUid: internalLink.datasourceUid,\n            query: interpolatedQuery,\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>(datasourceName: string, query: T, range: TimeRange): string {\n  return locationUtil.assureBaseUrl(\n    `/explore?left=${encodeURIComponent(\n      serializeStateToUrlParam({\n        range: range.raw,\n        datasource: datasourceName,\n        queries: [query],\n      })\n    )}`\n  );\n}\n\nfunction interpolateQuery<T extends DataQuery = any>(\n  link: DataLink,\n  scopedVars: ScopedVars,\n  replaceVariables: InterpolateFunction\n): T {\n  let stringifiedQuery = '';\n  try {\n    stringifiedQuery = JSON.stringify(link.internal?.query || '');\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 { isString } from 'lodash';\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): ref is DataSourceRef {\n  return typeof ref === 'object' && (typeof ref?.uid === 'string' || typeof ref?.uid === 'undefined');\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 = (props: DataSourcePluginOptionsEditorProps, key: keyof DataSourceSettings) => (\n  event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>\n) => {\n  updateDatasourcePluginOption(props, key, event.currentTarget.value);\n};\n\nexport const onUpdateDatasourceJsonDataOption = <J, S, K extends keyof J>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: K\n) => (event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>) => {\n  updateDatasourcePluginJsonDataOption(props, key, event.currentTarget.value);\n};\n\nexport const onUpdateDatasourceSecureJsonDataOption = <J, S extends {} = KeyValue>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: string\n) => (event: React.SyntheticEvent<HTMLInputElement | HTMLSelectElement>) => {\n  updateDatasourcePluginSecureJsonDataOption(props, key, event.currentTarget.value);\n};\n\nexport const onUpdateDatasourceJsonDataOptionSelect = <J, S, K extends keyof J>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: K\n) => (selected: SelectableValue) => {\n  updateDatasourcePluginJsonDataOption(props, key, selected.value);\n};\n\nexport const onUpdateDatasourceJsonDataOptionChecked = <J, S, K extends keyof J>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: K\n) => (event: React.SyntheticEvent<HTMLInputElement>) => {\n  updateDatasourcePluginJsonDataOption(props, key, event.currentTarget.checked);\n};\n\nexport const onUpdateDatasourceSecureJsonDataOptionSelect = <J, S extends {} = KeyValue>(\n  props: DataSourcePluginOptionsEditorProps<J, S>,\n  key: string\n) => (selected: SelectableValue) => {\n  updateDatasourcePluginSecureJsonDataOption(props, key, selected.value);\n};\n\nexport const onUpdateDatasourceResetOption = (props: DataSourcePluginOptionsEditorProps, key: string) => (\n  event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n) => {\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 Papa, { ParseConfig, Parser, ParseResult } from 'papaparse';\nimport { defaults } from 'lodash';\n\n// Types\nimport { DataFrame, Field, FieldConfig, FieldType } from '../types';\nimport { guessFieldTypeFromValue } from '../dataframe/processDataFrame';\nimport { MutableDataFrame } from '../dataframe/MutableDataFrame';\nimport { getFieldDisplayName } from '../field';\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.substr(1, idx - 1);\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.substr(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 { LogLevel, LogRowModel, LogLabelStatsModel, LogsParser, LogsModel, LogsSortOrder } from '../types/logs';\nimport { DataFrame, FieldType } from '../types/index';\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(/\\\\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 { Field } from '../types/dataFrame';\nimport { NullValueMode } from '../types/data';\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 { GrafanaConfig, RawTimeRange, ScopedVars } from '../types';\nimport { UrlQueryMap, urlUtil } from './url';\nimport { textUtil } from '../text';\n\nlet grafanaConfig: GrafanaConfig = { appSubUrl: '' } as any;\nlet getTimeRangeUrlParams: () => RawTimeRange;\nlet getVariablesUrlParams: (scopedVars?: ScopedVars) => UrlQueryMap;\n\n/**\n *\n * @param url\n * @internal\n */\nconst stripBaseFromUrl = (url: string): string => {\n  const appSubUrl = grafanaConfig.appSubUrl ?? '';\n  const stripExtraChars = appSubUrl.endsWith('/') ? 1 : 0;\n  const isAbsoluteUrl = url.startsWith('http');\n  let segmentToStrip = appSubUrl;\n\n  if (!url.startsWith('/') || isAbsoluteUrl) {\n    segmentToStrip = `${window.location.origin}${appSubUrl}`;\n  }\n\n  return url.length > 0 && url.indexOf(segmentToStrip) === 0 ? url.slice(segmentToStrip.length - stripExtraChars) : url;\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 * 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  processUrl: (url: string) => {\n    return grafanaConfig.disableSanitizeHtml ? url : textUtil.sanitizeUrl(url);\n  },\n};\n","import { GrafanaTheme, GrafanaThemeType } from '../types/theme';\n\n/**\n * @deprecated use theme.visualization.getColorByName\n */\nexport function getColorForTheme(color: string, theme: GrafanaTheme): string {\n  return theme.visualization.getColorByName(color);\n}\n\n/**\n * @deprecated use getColorForTheme\n */\nexport function getColorFromHexRgbOrName(color: string, type?: GrafanaThemeType): string {\n  return 'gray';\n}\n\nexport 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","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}\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\nexport function serializeStateToUrlParam(urlState: ExploreUrlState, compact?: boolean): string {\n  if (compact) {\n    return JSON.stringify([urlState.range.from, urlState.range.to, urlState.datasource, ...urlState.queries]);\n  }\n  return JSON.stringify(urlState);\n}\n","import {\n  MappingType,\n  SpecialValueMatch,\n  ThresholdsConfig,\n  ValueMap,\n  ValueMapping,\n  ValueMappingResult,\n  SpecialValueOptions,\n} from '../types';\nimport { getActiveThreshold } from '../field';\nimport { stringToJsRegex } from '../text/string';\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 * @deprecated use MappingType instead\n * @internal\n */\nexport interface LegacyBaseMap {\n  id: number; // this could/should just be the array index\n  text: string; // the final display value\n  type: LegacyMappingType;\n}\n\n/**\n * @deprecated use ValueMapping instead\n * @internal\n */\nexport type LegacyValueMapping = LegacyValueMap | LegacyRangeMap;\n\n/**\n * @deprecated use ValueMap instead\n * @internal\n */\nexport interface LegacyValueMap extends LegacyBaseMap {\n  value: string;\n}\n\n/**\n * @deprecated use RangeMap instead\n * @internal\n */\nexport interface LegacyRangeMap extends LegacyBaseMap {\n  from: string;\n  to: string;\n}\n\n/**\n * @deprecated use getValueMappingResult instead\n * @internal\n */\nexport function getMappedValue(valueMappings: LegacyValueMapping[], value: any): LegacyValueMapping {\n  const emptyResult = { type: LegacyMappingType.ValueToText, value: '', text: '', from: '', to: '', id: 0 };\n  if (!valueMappings?.length) {\n    return emptyResult;\n  }\n\n  const upgraded: ValueMapping[] = [];\n  for (const vm of valueMappings) {\n    if (isValueMapping(vm)) {\n      upgraded.push(vm);\n      continue;\n    }\n    upgraded.push(upgradeOldAngularValueMapping(vm));\n  }\n\n  if (!upgraded?.length) {\n    return emptyResult;\n  }\n\n  const result = getValueMappingResult(upgraded, value);\n  if (!result) {\n    return emptyResult;\n  }\n\n  return {\n    type: LegacyMappingType.ValueToText,\n    value: result.text,\n    text: result.text ?? '',\n    from: '',\n    to: '',\n    id: result.index ?? 0,\n  };\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\nfunction isValueMapping(map: any): map is ValueMapping {\n  if (!map) {\n    return false;\n  }\n\n  return map.hasOwnProperty('options') && typeof map.options === 'object';\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 { getCategories } from './categories';\nimport { DecimalCount } from '../types/displayValue';\nimport { toDateTimeValueFormatter } from './dateTimeFormatters';\nimport { getOffsetFromSIPrefix, SIPrefix, currency } from './symbolFormatters';\nimport { TimeZone } from '../types';\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  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).substr(1, decimals - precision);\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\n// Formatter which scales the unit string geometrically according to the given\n// numeric factor. Repeatedly scales the value down by the factor until it is\n// less than the factor in magnitude, or the end of the array is reached.\nexport function scaledUnits(factor: number, extArray: string[]): ValueFormatter {\n  return (size: number, decimals?: DecimalCount, scaledDecimals?: DecimalCount) => {\n    if (size === null) {\n      return { text: '' };\n    }\n    if (size === Number.NEGATIVE_INFINITY || size === Number.POSITIVE_INFINITY || isNaN(size)) {\n      return { text: size.toLocaleString() };\n    }\n\n    let steps = 0;\n    const limit = extArray.length;\n\n    while (Math.abs(size) >= factor) {\n      steps++;\n      size /= factor;\n\n      if (steps >= limit) {\n        return { text: 'NA' };\n      }\n    }\n\n    return { text: toFixed(size, decimals), suffix: extArray[steps] };\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';\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';\nimport { vectorToArray } from './vectorToArray';\nimport { FunctionalVector } from './FunctionalVector';\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 { vectorToArray } from './vectorToArray';\nimport { Vector } from '../types';\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 { Vector } from '../types/vector';\nimport { DisplayProcessor } from '../types';\nimport { formattedValueToString } from '../valueFormats';\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';\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      },\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    addQuery: 'Query editor add query button',\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  },\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-test-id=\"SpanBar--wrapper\"]',\n  },\n  QueryField: { container: 'Query field' },\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    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    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};\n","import { Pages } from './pages';\nimport { Components } from './components';\nimport { E2ESelectors } from '../types';\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    dataSourcePlugins: (pluginName: string) => `Data source plugin item ${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    },\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            generalTypeSelect: 'Variable editor Form Type select',\n            generalLabelInput: 'Variable editor Form Label field',\n            generalHideSelect: '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            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            queryOptionsRegExInput: 'Variable editor Form Query RegEx field',\n            queryOptionsSortSelect: '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          },\n          TextBoxVariable: {\n            textBoxOptionsQueryInput: 'Variable editor Form TextBox Query field',\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  Explore: {\n    url: '/explore',\n    General: {\n      container: 'data-testid Explore',\n      graph: 'Explore Graph',\n      table: 'Explore Table',\n      scrollBar: () => '.scrollbar-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';\nimport { 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  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';\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  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';\nimport {\n  BuildInfo,\n  createTheme,\n  DataSourceInstanceSettings,\n  FeatureToggles,\n  GrafanaConfig,\n  GrafanaTheme,\n  GrafanaTheme2,\n  LicenseInfo,\n  MapLayerOptions,\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  datasources: { [str: string]: DataSourceInstanceSettings } = {};\n  panels: { [key: string]: PanelPluginMeta } = {};\n  minRefreshInterval = '';\n  appUrl = '';\n  appSubUrl = '';\n  windowTitlePrefix = '';\n  buildInfo: BuildInfo = {} as BuildInfo;\n  newPanelTitle = '';\n  bootData: any;\n  externalUserMngLinkUrl = '';\n  externalUserMngLinkName = '';\n  externalUserMngInfo = '';\n  allowOrgCreate = false;\n  disableLoginForm = false;\n  defaultDatasource = ''; // UID\n  alertingEnabled = false;\n  alertingErrorOrTimeout = '';\n  alertingNoDataOrNullValues = '';\n  alertingMinInterval = 1;\n  authProxyEnabled = false;\n  exploreEnabled = false;\n  ldapEnabled = false;\n  sigV4AuthEnabled = false;\n  samlEnabled = false;\n  samlName = '';\n  autoAssignOrg = true;\n  verifyEmailEnabled = false;\n  oauth: any;\n  disableUserSignUp = false;\n  loginHint: any;\n  passwordHint: any;\n  loginError: any;\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    accesscontrol: false,\n    trimDefaults: false,\n    tempoServiceGraph: false,\n    tempoSearch: false,\n    tempoBackendSearch: false,\n    recordedQueries: false,\n    newNavigation: false,\n    fullRangeLogsVolume: false,\n  };\n  licenseInfo: LicenseInfo = {} as LicenseInfo;\n  rendererAvailable = false;\n  rendererVersion = '';\n  http2Enabled = false;\n  dateFormats?: SystemDateFormatSettings;\n  sentry = {\n    enabled: false,\n    dsn: '',\n    customEndpoint: '',\n    sampleRate: 1,\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  applicationInsightsConnectionString?: string;\n  applicationInsightsEndpointUrl?: string;\n  recordedQueries = {\n    enabled: false,\n  };\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\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: 'v1.0',\n        commit: '1',\n        env: 'production',\n        isEnterprise: false,\n      },\n      viewersCanEdit: false,\n      editorsCanAdmin: false,\n      disableSanitizeHtml: false,\n    };\n\n    merge(this, defaults, options);\n\n    if (this.dateFormats) {\n      systemDateFormats.update(this.dateFormats);\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}\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 * 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","import { config } from '../config';\n\n// @ts-ignore\nimport System from 'systemjs/dist/system.js';\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 { getEchoSrv, EchoEventType } from '../services/EchoSrv';\nimport {\n  InteractionEchoEvent,\n  MetaAnalyticsEvent,\n  MetaAnalyticsEventPayload,\n  PageviewEchoEvent,\n} from '../types/analytics';\nimport { locationService } from '../services';\nimport { config } from '../config';\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","import { captureMessage, captureException, Severity as LogLevel } from '@sentry/browser';\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  captureMessage(message, {\n    level: LogLevel.Info,\n    contexts,\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  captureMessage(message, {\n    level: LogLevel.Warning,\n    contexts,\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  captureMessage(message, {\n    level: LogLevel.Debug,\n    contexts,\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  captureException(err, { contexts });\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 { ActionMeta, HorizontalGroup, PluginSignatureBadge, Select } from '@grafana/ui';\nimport {\n  DataSourceInstanceSettings,\n  DataSourceRef,\n  getDataSourceUID,\n  isUnsignedPluginSignature,\n  SelectableValue,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { getDataSourceSrv } from '../services/dataSourceSrv';\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 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  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.substr(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    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 } = this.props;\n    const options = this.dataSourceSrv\n      .getList({\n        alerting,\n        tracing,\n        metrics,\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 } = 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=\"data-source-picker\"\n          menuShouldPortal\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}\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/** @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 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\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(url: string, params?: any, requestId?: string): Promise<any>;\n  delete(url: string, data?: any): Promise<any>;\n  post(url: string, data?: any): Promise<any>;\n  patch(url: string, data?: any): Promise<any>;\n  put(url: string, data?: any): Promise<any>;\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(options: BackendSrvRequest): Promise<any>;\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","/**\n * Passed as options to the {@link LocationSrv} to describe how the automatically navigation\n * should be performed.\n *\n * @public\n */\nimport { UrlQueryMap } from '@grafana/data';\n\n/**\n * @public\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 */\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 */\nexport function getLocationSrv(): LocationSrv {\n  return singletonInstance;\n}\n","import { VariableModel, ScopedVars } 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\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 {\n  DataFrame,\n  DataQueryResponse,\n  LiveChannelAddress,\n  LiveChannelEvent,\n  LiveChannelPresenceStatus,\n  StreamingFrameOptions,\n} from '@grafana/data';\nimport { Observable } from 'rxjs';\n\n/**\n * @alpha -- experimental\n */\nexport interface LiveDataFilter {\n  fields?: string[];\n}\n\n/**\n * @alpha\n */\nexport interface LiveDataStreamOptions {\n  addr: LiveChannelAddress;\n  frame?: DataFrame; // initial results\n  key?: string;\n  buffer?: StreamingFrameOptions;\n  filter?: LiveDataFilter;\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   * 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 { deprecationWarning, UrlQueryMap, urlUtil } from '@grafana/data';\nimport * as H from 'history';\nimport { LocationUpdate } from './LocationSrv';\nimport { attachDebugger, createLogger } from '@grafana/ui';\nimport { config } from '../config';\n\n/**\n * @alpha\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 * @alpha\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 * @alpha\n */\nexport let locationService: LocationService = new HistoryWrapper();\n\n/** @internal\n * Used for tests only\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 LocationSrv so it is available\n * via the {@link getLocationSrv} 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 {\n  DataSourceApi,\n  DataQueryRequest,\n  DataQueryResponse,\n  DataSourceInstanceSettings,\n  DataQuery,\n  DataSourceJsonData,\n  ScopedVars,\n  makeClassES5Compatible,\n  DataFrame,\n  parseLiveChannelAddress,\n  StreamingFrameOptions,\n  StreamingFrameAction,\n  getDataSourceRef,\n  DataSourceRef,\n} from '@grafana/data';\nimport { merge, Observable, of } from 'rxjs';\nimport { catchError, switchMap } from 'rxjs/operators';\nimport { getBackendSrv, getDataSourceSrv, getGrafanaLiveSrv } from '../services';\nimport { BackendDataSourceResponse, toDataQueryResponse } from './queryResponse';\n\n/**\n * @internal\n */\nexport const ExpressionDatasourceRef = Object.freeze({\n  type: '__expr__',\n  uid: '__expr__',\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\nclass 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    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) => 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,\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) => StreamingFrameOptions;\n\n/**\n * @public\n */\nexport const standardStreamOptionsProvider: StreamOptionsProvider = (request: DataQueryRequest, frame: DataFrame) => {\n  const buffer: 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    buffer.maxDelta = request.range.to.valueOf() - request.range.from.valueOf();\n  }\n  return buffer;\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} from '@grafana/data';\nimport { FetchError, FetchResponse } from '../services';\nimport { toDataQueryError } from './toDataQueryError';\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 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 (const js of dr.frames) {\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\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 was autogenerated by cuetsy from all the files in this directory,\n// then hand-edited for correctness. It will be fully auto-generated Soon™.\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 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 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 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  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  Hidden = 'hidden',\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 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 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  Value_and_name = '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 interface GraphFieldConfig\n  extends LineConfig,\n    FillConfig,\n    PointsConfig,\n    AxisConfig,\n    BarConfig,\n    StackableFieldConfig,\n    HideableFieldConfig {\n  drawStyle?: GraphDrawStyle;\n  gradientMode?: GraphGradientMode;\n  thresholdsStyle?: GraphThresholdsStyleConfig;\n}\n\nexport interface VizLegendOptions {\n  asTable?: boolean;\n  calcs: string[];\n  displayMode: LegendDisplayMode;\n  isVisible?: boolean;\n  placement: LegendPlacement;\n  sortBy?: string;\n  sortDesc?: boolean;\n}\n\nexport enum BarGaugeDisplayMode {\n  Basic = 'basic',\n  Gradient = 'gradient',\n  Lcd = 'lcd',\n}\n\nexport interface TableFieldOptions {\n  align: string;\n  displayMode: TableCellDisplayMode;\n  hidden?: boolean;\n  minWidth?: number;\n  width?: number;\n  filterable?: boolean;\n}\n\nexport const defaultTableFieldOptions: TableFieldOptions = {\n  align: 'auto',\n  displayMode: TableCellDisplayMode.Auto,\n};\n\nexport interface VizTooltipOptions {\n  mode: TooltipDisplayMode;\n}\n","import React, { HTMLAttributes, ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useTheme2 } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types/icon';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Button } from '../Button/Button';\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}\n\nfunction 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    { title, onRemove, children, buttonContent, elevated, bottomSpacing, className, severity = 'error', ...restProps },\n    ref\n  ) => {\n    const theme = useTheme2();\n    const styles = getStyles(theme, severity, elevated, bottomSpacing);\n\n    return (\n      <div\n        ref={ref}\n        className={cx(styles.alert, className)}\n        data-testid={selectors.components.Alert.alertV2(severity)}\n        {...restProps}\n      >\n        <div className={styles.icon}>\n          <Icon size=\"xl\" name={getIconFromSeverity(severity) as IconName} />\n        </div>\n        <div className={styles.body} role=\"alert\">\n          <div className={styles.title}>{title}</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 = (theme: GrafanaTheme2, severity: AlertVariant, elevated?: boolean, bottomSpacing?: number) => {\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\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: scroll;\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 { DataFrame, FieldConfig, FieldSparkline, IndexVector } from '@grafana/data';\nimport { GraphFieldConfig } from '@grafana/schema';\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 {\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","import React, { PureComponent } from 'react';\nimport { AlignedData, Range } from 'uplot';\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';\nimport { UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder';\nimport { UPlotChart } from '../uPlot/Plot';\nimport { Themeable2 } from '../../types';\nimport { preparePlotData } from '../uPlot/utils';\nimport { preparePlotFrame } from './utils';\nimport { isEqual } from 'lodash';\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\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: preparePlotData([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: preparePlotData([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","// Libraries\nimport React, { CSSProperties } from 'react';\nimport tinycolor from 'tinycolor2';\n\n// Utils\nimport { formattedValueToString, DisplayValue, FieldConfig, FieldType } from '@grafana/data';\nimport { calculateFontSize } from '../../utils/measureText';\n\n// Types\nimport { BigValueColorMode, Props, BigValueJustifyMode, BigValueTextMode } from './BigValue';\nimport { getTextColorForBackground } from '../../utils';\nimport { GraphDrawStyle, GraphFieldConfig } from '@grafana/schema';\nimport { Sparkline } from '../Sparkline/Sparkline';\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 = 14;\n    this.valueFontSize = 14;\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    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    // make title fontsize it's a bit smaller than valueFontSize\n    this.titleFontSize = Math.min(this.valueFontSize * 0.7, this.titleFontSize);\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) {\n      return new WideWithChartLayout(props);\n    } else {\n      return new WideNoChartLayout(props);\n    }\n  }\n\n  // stacked layouts\n  if (height > 100 && !!sparkline) {\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","// Library\nimport React, { PureComponent } from 'react';\nimport { DisplayValue, DisplayValueAlignmentFactors, FieldSparkline, TextDisplayOptions } from '@grafana/data';\n\n// Types\nimport { Themeable2 } from '../../types';\nimport { buildLayout } from './BigValueLayout';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\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?: TextDisplayOptions;\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 React, { AnchorHTMLAttributes, ButtonHTMLAttributes } from 'react';\nimport { css, CSSObject, cx } from '@emotion/css';\nimport { useTheme2 } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { getPropertiesForButtonSize } from '../Forms/commonStyles';\nimport { colorManipulator, GrafanaTheme2, ThemeRichColor } from '@grafana/data';\nimport { ComponentSize } from '../../types/size';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\nimport { Icon } from '../Icon/Icon';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'destructive' | 'link';\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};\n\nexport type ButtonProps = CommonProps & ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ variant = 'primary', size = 'md', fill = 'solid', icon, fullWidth, children, className, ...otherProps }, ref) => {\n    const theme = useTheme2();\n    const styles = getButtonStyles({\n      theme,\n      size,\n      variant,\n      fill,\n      fullWidth,\n      iconOnly: !children,\n    });\n\n    deprecatedPropWarning(\n      variant === 'link',\n      `${Button.displayName}: Prop variant=\"link\" is deprecated. Please use fill=\"text\".`\n    );\n\n    return (\n      <button className={cx(styles.button, className)} {...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      ...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(styles.button, { [styles.disabled]: disabled }, className);\n\n    deprecatedPropWarning(\n      variant === 'link',\n      `${LinkButton.displayName}: Prop variant=\"link\" is deprecated. Please use fill=\"text\".`\n    );\n\n    return (\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);\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    pointerEvents: 'none',\n    color: theme.colors.text.disabled,\n    transition: 'none',\n  };\n\n  if (fill === 'text' || variant === 'link') {\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  const buttonVariant = variant === 'link' ? 'primary' : variant;\n  const buttonFill = variant === 'link' ? 'text' : fill;\n\n  switch (buttonVariant) {\n    case 'secondary':\n      return getButtonVariantStyles(theme, theme.colors.secondary, buttonFill);\n\n    case 'destructive':\n      return getButtonVariantStyles(theme, theme.colors.error, buttonFill);\n\n    case 'primary':\n    default:\n      return getButtonVariantStyles(theme, theme.colors.primary, buttonFill);\n  }\n}\n\nfunction deprecatedPropWarning(test: boolean, message: string) {\n  if (process.env.NODE_ENV === 'development' && test) {\n    console.warn(`@grafana/ui ${message}`);\n  }\n}\n","import React, { forwardRef, HTMLAttributes } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useStyles2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\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, { forwardRef, ButtonHTMLAttributes } from 'react';\nimport { cx, css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { styleMixins, useStyles2 } from '../../themes';\nimport { IconName } from '../../types/icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\nimport { getPropertiesForVariant } from './Button';\nimport { isString } from 'lodash';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\n\nexport interface Props extends ButtonHTMLAttributes<HTMLButtonElement> {\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}\n\nexport type ToolbarButtonVariant = 'default' | 'primary' | 'destructive' | 'active';\n\nexport const ToolbarButton = forwardRef<HTMLButtonElement, Props>(\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      ...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      </button>\n    );\n\n    return tooltip ? (\n      <Tooltip content={tooltip} placement=\"bottom\">\n        {body}\n      </Tooltip>\n    ) : (\n      body\n    );\n  }\n);\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  return {\n    button: css`\n      label: toolbar-button;\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: 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    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  };\n};\n","import React, { forwardRef, HTMLAttributes } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useStyles2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\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 React from 'react';\nimport { Icon } from '../Icon/Icon';\nimport RCCascader from 'rc-cascader';\n\nimport { Select } from '../Select/Select';\nimport { Input } from '../Input/Input';\nimport { SelectableValue } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { onChangeCascader } from './optionMappings';\nimport memoizeOne from 'memoize-one';\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  displayAllSelectedLevels?: 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    this.setState({\n      rcValue: value,\n      focusCascade: true,\n      activeLabel: this.props.displayAllSelectedLevels\n        ? selectedOptions.map((option) => option.label).join(this.props.separator || DEFAULT_SEPARATOR)\n        : selectedOptions[selectedOptions.length - 1].label,\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  };\n\n  onBlurCascade = () => {\n    this.setState({\n      focusCascade: false,\n    });\n  };\n\n  onInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n    if (\n      e.key === 'ArrowDown' ||\n      e.key === 'ArrowUp' ||\n      e.key === 'Enter' ||\n      e.key === 'ArrowLeft' ||\n      e.key === 'ArrowRight'\n    ) {\n      return;\n    }\n    this.setState({\n      focusCascade: false,\n      isSearching: true,\n    });\n  };\n\n  render() {\n    const { allowCustomValue, 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            menuShouldPortal\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={this.props.formatCreateLabel}\n            width={width}\n          />\n        ) : (\n          <RCCascader\n            onChange={onChangeCascader(this.onChange)}\n            options={this.props.options}\n            changeOnSelect={changeOnSelect}\n            value={rcValue.value}\n            fieldNames={{ label: 'label', value: 'value', children: 'items' }}\n            expandIcon={null}\n            // Required, otherwise the portal that the popup is shown in will render under other components\n            popupClassName={css`\n              z-index: 9999;\n            `}\n          >\n            <div className={disableDivFocus}>\n              <Input\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 { CascaderValueType, CascaderOption as RCCascaderOption } from 'rc-cascader/lib/Cascader';\nimport { CascaderOption } from './Cascader';\n\ntype onChangeType = ((values: string[], options: CascaderOption[]) => void) | undefined;\n\nexport const onChangeCascader = (onChanged: onChangeType) => (\n  values: CascaderValueType,\n  options: RCCascaderOption[]\n) => {\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 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: window,\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 React, { Component, createRef } from 'react';\nimport { PopoverController } from '../Tooltip/PopoverController';\nimport { Popover } from '../Tooltip/Popover';\nimport { ColorPickerPopover, ColorPickerProps, ColorPickerChangeHandler } from './ColorPickerPopover';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { SeriesColorPickerPopover } from './SeriesColorPickerPopover';\n\nimport { css } from '@emotion/css';\nimport { withTheme2, stylesFactory } from '../../themes';\nimport { ColorSwatch } from './ColorSwatch';\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    onColorChange = (color: string) => {\n      const { onColorChange, onChange } = this.props;\n      const changeHandler = (onColorChange || onChange) as ColorPickerChangeHandler;\n\n      return changeHandler(color);\n    };\n\n    render() {\n      const { theme, children } = this.props;\n      const styles = getStyles(theme);\n      const popoverElement = React.createElement(popover, {\n        ...{ ...this.props, children: null },\n        onChange: this.onColorChange,\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                  />\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 React, { FunctionComponent } from 'react';\nimport { ThemeVizHue } from '@grafana/data';\nimport { Property } from 'csstype';\nimport { ColorSwatch, ColorSwatchVariant } from './ColorSwatch';\nimport { upperFirst } from 'lodash';\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 primaryShade = hue.shades.find((shade) => shade.primary)!;\n\n  return (\n    <div {...otherProps} style={{ display: 'flex', flexDirection: 'column' }}>\n      {primaryShade && (\n        <ColorSwatch\n          key={primaryShade.name}\n          isSelected={primaryShade.name === selectedColor}\n          variant={ColorSwatchVariant.Large}\n          color={primaryShade.color}\n          label={upperFirst(hue.name)}\n          onClick={() => onColorSelect(primaryShade.name)}\n        />\n      )}\n      <div\n        style={{\n          display: 'flex',\n          marginTop: '8px',\n        }}\n      >\n        {hue.shades.map(\n          (shade) =>\n            !shade.primary && (\n              <div key={shade.name} style={{ marginRight: '4px' }}>\n                <ColorSwatch\n                  key={shade.name}\n                  isSelected={shade.name === selectedColor}\n                  color={shade.color}\n                  onClick={() => onColorSelect(shade.name)}\n                />\n              </div>\n            )\n        )}\n      </div>\n    </div>\n  );\n};\n\nexport default NamedColorsGroup;\n","import React from 'react';\nimport NamedColorsGroup from './NamedColorsGroup';\nimport { VerticalGroup } from '../Layout/Layout';\nimport { ColorSwatch } from './ColorSwatch';\nimport { useTheme2 } from '../../themes/ThemeContext';\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\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    <VerticalGroup spacing=\"md\">\n      <div\n        style={{\n          display: 'grid',\n          gridTemplateColumns: 'repeat(3, 1fr)',\n          gridRowGap: theme.spacing(2),\n          gridColumnGap: theme.spacing(2),\n          flexGrow: 1,\n        }}\n      >\n        {swatches}\n        <div />\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    </VerticalGroup>\n  );\n};\n","import React from 'react';\nimport tinycolor from 'tinycolor2';\nimport { debounce } from 'lodash';\n\nimport { ColorPickerProps } from './ColorPickerPopover';\nimport { Input } from '../Input/Input';\nimport { useStyles2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { cx, css } from '@emotion/css';\n\ninterface ColorInputState {\n  previousColor: string;\n  value: string;\n}\n\ninterface ColorInputProps extends ColorPickerProps {\n  style?: React.CSSProperties;\n  className?: string;\n}\n\nclass ColorInput extends React.PureComponent<ColorInputProps, ColorInputState> {\n  constructor(props: ColorInputProps) {\n    super(props);\n    this.state = {\n      previousColor: props.color,\n      value: props.color,\n    };\n\n    this.updateColor = debounce(this.updateColor, 100);\n  }\n\n  static getDerivedStateFromProps(props: ColorPickerProps, state: ColorInputState) {\n    const newColor = tinycolor(props.color);\n    if (newColor.isValid() && props.color !== state.previousColor) {\n      return {\n        ...state,\n        previousColor: props.color,\n        value: newColor.toString(),\n      };\n    }\n\n    return state;\n  }\n  updateColor = (color: string) => {\n    this.props.onChange(color);\n  };\n\n  onChange = (event: React.SyntheticEvent<HTMLInputElement>) => {\n    const newColor = tinycolor(event.currentTarget.value);\n\n    this.setState({\n      value: event.currentTarget.value,\n    });\n\n    if (newColor.isValid()) {\n      this.updateColor(newColor.toString());\n    }\n  };\n\n  onBlur = () => {\n    const newColor = tinycolor(this.state.value);\n\n    if (!newColor.isValid()) {\n      this.setState({\n        value: this.props.color,\n      });\n    }\n  };\n\n  render() {\n    const { value } = this.state;\n    return (\n      <Input\n        className={this.props.className}\n        value={value}\n        onChange={this.onChange}\n        onBlur={this.onBlur}\n        addonBefore={<ColorPreview color={this.props.color} />}\n      />\n    );\n  }\n}\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 React, { useMemo, useState } from 'react';\n\nimport { RgbaStringColorPicker } from 'react-colorful';\nimport tinycolor from 'tinycolor2';\nimport ColorInput from './ColorInput';\nimport { GrafanaTheme2, colorManipulator } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { useThrottleFn } from 'react-use';\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={cx(styles.root)} color={rgbaString} onChange={setColor} />\n      <ColorInput theme={theme} color={rgbaString} onChange={setColor} className={styles.colorInput} />\n    </div>\n  );\n};\n\nconst 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 React from 'react';\nimport { NamedColorsPalette } from './NamedColorsPalette';\nimport { PopoverContentProps } from '../Tooltip/Tooltip';\nimport SpectrumPalette from './SpectrumPalette';\nimport { Themeable2 } from '../../types/theme';\nimport { warnAboutColorPickerPropsDeprecation } from './warnAboutColorPickerPropsDeprecation';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2, colorManipulator } from '@grafana/data';\nimport { stylesFactory, withTheme2 } from '../../themes';\n\nexport type ColorPickerChangeHandler = (color: string) => void;\n\nexport interface ColorPickerProps extends Themeable2 {\n  color: string;\n  onChange: ColorPickerChangeHandler;\n\n  /**\n   * @deprecated Use onChange instead\n   */\n  onColorChange?: ColorPickerChangeHandler;\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    warnAboutColorPickerPropsDeprecation('ColorPickerPopover', props);\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 { onColorChange, onChange, enableNamedColors, theme } = this.props;\n    const changeHandler = onColorChange || onChange;\n    if (enableNamedColors) {\n      return changeHandler(color);\n    }\n    changeHandler(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            <div className={this.getTabClassName(key)} onClick={this.onTabChange(key)} key={key}>\n              {customPickers[key].name}\n            </div>\n          );\n        })}\n      </>\n    );\n  };\n\n  render() {\n    const { theme } = this.props;\n    const styles = getStyles(theme);\n    return (\n      <div className={styles.colorPickerPopover}>\n        <div className={styles.colorPickerPopoverTabs}>\n          <div className={this.getTabClassName('palette')} onClick={this.onTabChange('palette')}>\n            Colors\n          </div>\n          <div className={this.getTabClassName('spectrum')} onClick={this.onTabChange('spectrum')}>\n            Custom\n          </div>\n          {this.renderCustomPickerTabs()}\n        </div>\n        <div className={styles.colorPickerPopoverContent}>{this.renderPicker()}</div>\n      </div>\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\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        cursor: pointer;\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: 336px;\n      font-size: ${theme.typography.bodySmall.fontSize};\n      min-height: 184px;\n      padding: ${theme.spacing(2)};\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    `,\n    colorPickerPopoverTabs: css`\n      display: flex;\n      width: 100%;\n      border-radius: ${theme.shape.borderRadius()} ${theme.shape.borderRadius()} 0 0;\n      overflow: hidden;\n    `,\n  };\n});\n","import { deprecationWarning } from '@grafana/data';\nimport { ColorPickerProps } from './ColorPickerPopover';\n\nexport const warnAboutColorPickerPropsDeprecation = (componentName: string, props: ColorPickerProps) => {\n  const { onColorChange } = props;\n  if (onColorChange) {\n    deprecationWarning(componentName, 'onColorChange', 'onChange');\n  }\n};\n","import React, { CSSProperties } from 'react';\nimport tinycolor from 'tinycolor2';\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.DOMAttributes<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, ...otherProps }, ref) => {\n    const theme = useTheme2();\n    const tc = tinycolor(color);\n    const isSmall = variant === ColorSwatchVariant.Small;\n    const hasLabel = !!label;\n    const swatchSize = isSmall ? '16px' : '32px';\n\n    const swatchStyles: CSSProperties = {\n      width: swatchSize,\n      height: swatchSize,\n      borderRadius: '50%',\n      background: `${color}`,\n      marginRight: hasLabel ? '8px' : '0px',\n      boxShadow: isSelected\n        ? `inset 0 0 0 2px ${color}, inset 0 0 0 4px ${theme.colors.getContrastText(color)}`\n        : 'none',\n    };\n\n    if (tc.getAlpha() < 0.1) {\n      swatchStyles.border = `2px solid ${theme.colors.border.medium}`;\n    }\n\n    return (\n      <div\n        ref={ref}\n        style={{\n          display: 'flex',\n          alignItems: 'center',\n          cursor: 'pointer',\n        }}\n        {...otherProps}\n      >\n        <div style={swatchStyles} />\n        {hasLabel && <span>{label}</span>}\n      </div>\n    );\n  }\n);\n\nColorSwatch.displayName = 'ColorSwatch';\n","import React, { FunctionComponent } from 'react';\n\nimport { ColorPickerPopover, ColorPickerProps } from './ColorPickerPopover';\nimport { PopoverContentProps } from '../Tooltip/Tooltip';\nimport { Switch } from '../Forms/Legacy/Switch/Switch';\nimport { css } from '@emotion/css';\nimport { withTheme2, useStyles } from '../../themes';\nimport { Button } from '../Button';\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 { GrafanaTheme2 } from '@grafana/data';\nimport classNames from 'classnames';\nimport { isNil } from 'lodash';\nimport React, { FC, RefCallback, useCallback, useEffect, useRef } from 'react';\nimport Scrollbars, { positionValues } from 'react-custom-scrollbars-2';\nimport { useStyles2 } from '../../themes';\n\nexport type ScrollbarPosition = positionValues;\n\ninterface Props {\n  className?: 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  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  useEffect(() => {\n    if (ref.current) {\n      scrollRefCallback?.(ref.current.view);\n    }\n  }, [ref, scrollRefCallback]);\n  const styles = useStyles2(getStyles);\n\n  const updateScroll = () => {\n    if (ref.current && !isNil(scrollTop)) {\n      ref.current.scrollTop(scrollTop);\n    }\n  };\n\n  useEffect(() => {\n    updateScroll();\n  });\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\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      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 { VariableSuggestion, GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { groupBy, capitalize } from 'lodash';\nimport React, { useRef, useMemo } from 'react';\nimport useClickAway from 'react-use/lib/useClickAway';\nimport { List } from '../index';\nimport { useStyles2 } from '../../themes';\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 React, { memo, RefObject, useEffect, useMemo, useRef, useState } from 'react';\nimport usePrevious from 'react-use/lib/usePrevious';\nimport { DataLinkSuggestions } from './DataLinkSuggestions';\nimport { makeValue } from '../../index';\nimport { SelectionReference } from './SelectionReference';\nimport { Portal } from '../index';\n\n// @ts-ignore\nimport Prism, { Grammar, LanguageMap } from 'prismjs';\nimport { Editor } from '@grafana/slate-react';\nimport { Value } from 'slate';\nimport Plain from 'slate-plain-serializer';\nimport { Popper as ReactPopper } from 'react-popper';\nimport { css, cx } from '@emotion/css';\n\nimport { SlatePrism } from '../../slate-plugins';\nimport { SCHEMA } from '../../utils/slate';\nimport { useStyles2 } from '../../themes';\nimport { DataLinkBuiltInVars, GrafanaTheme2, VariableOrigin, VariableSuggestion } from '@grafana/data';\nimport { getInputStyles } from '../Input/Input';\nimport CustomScrollbar from '../CustomScrollbar/CustomScrollbar';\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\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    const activeIndexPosition = useMemo(() => getElementPosition(activeRef.current, suggestionsIndex), [\n      suggestionsIndex,\n    ]);\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 scrollTop={activeIndexPosition} autoHeightMax=\"300px\">\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 React, { FC } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { DataFrame, DataLink, GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { HorizontalGroup, VerticalGroup } from '../../Layout/Layout';\nimport { IconButton } from '../../IconButton/IconButton';\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 React, { ChangeEvent } from 'react';\nimport { VariableSuggestion, GrafanaTheme2, DataLink } from '@grafana/data';\nimport { Switch } from '../Switch/Switch';\nimport { css } from '@emotion/css';\nimport { useStyles2 } from '../../themes/index';\nimport { DataLinkInput } from './DataLinkInput';\nimport { Field } from '../Forms/Field';\nimport { Input } from '../Input/Input';\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 { DataFrame, DataLink, VariableSuggestion } from '@grafana/data';\nimport React, { FC, useState } from 'react';\nimport { DataLinkEditor } from '../DataLinkEditor';\nimport { Button } from '../../Button';\nimport { Modal } from '../../Modal/Modal';\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 { DataFrame, DataLink, GrafanaTheme2, VariableSuggestion } from '@grafana/data';\nimport React, { useState } from 'react';\nimport { css } from '@emotion/css';\nimport { Button } from '../../Button/Button';\nimport { cloneDeep } from 'lodash';\nimport { Modal } from '../../Modal/Modal';\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { DataLinksListItem } from './DataLinksListItem';\nimport { DataLinkEditorModalContent } from './DataLinkEditorModalContent';\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 React, { FC, CSSProperties, HTMLProps } from 'react';\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","import React, { HTMLAttributes } from 'react';\nimport { Label } from './Label';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { FieldValidationMessage } from './FieldValidationMessage';\nimport { getChildId } from '../../utils/reactUtils';\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?: string | null;\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  return (\n    <div className={cx(styles.field, horizontal && styles.fieldHorizontal, className)} {...otherProps}>\n      {labelElement}\n      <div>\n        {React.cloneElement(children, { invalid, disabled, loading })}\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","import React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon } from '../Icon/Icon';\nimport { stylesFactory, useTheme2 } from '../../themes';\n\nexport interface FieldValidationMessageProps {\n  children: string;\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\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 React from 'react';\nimport { useTheme2, stylesFactory } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\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 React, { PureComponent, ChangeEvent } from 'react';\nimport classNames from 'classnames';\nimport { validate, EventsWithValidation, hasValidationEvent } from '../../../../utils';\nimport { ValidationEvents, ValidationRule } from '../../../../types';\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 { Icon } from '../../../Icon/Icon';\nimport { components } from 'react-select';\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, OptionProps } from 'react-select';\n\nexport interface Props {\n  children: Element;\n}\n\nexport const NoOptionsMessage = (props: OptionProps<any, any>) => {\n  const { children } = props;\n  return (\n    <components.Option {...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.Option>\n  );\n};\n\nexport default NoOptionsMessage;\n","import React from 'react';\nimport { Icon } from '../../../Icon/Icon';\nimport { components, OptionProps } from 'react-select';\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 Creatable from 'react-select/creatable';\nimport { default as ReactAsyncSelect } from 'react-select/async';\n\n// Components\nimport { SelectOption } from './SelectOption';\nimport { SelectOptionGroup } from '../../../Select/SelectOptionGroup';\nimport { SingleValue } from '../../../Select/SingleValue';\nimport { SelectCommonProps, SelectAsyncProps } from '../../../Select/types';\nimport IndicatorsContainer from './IndicatorsContainer';\nimport NoOptionsMessage from './NoOptionsMessage';\nimport resetSelectStyles from '../../../Select/resetSelectStyles';\nimport { CustomScrollbar } from '../../../CustomScrollbar/CustomScrollbar';\nimport { PopoverContent, Tooltip } from '../../../Tooltip/Tooltip';\nimport { SelectableValue } from '@grafana/data';\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'>;\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 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()}\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            //@ts-expect-error\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              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              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 React, { PureComponent } from 'react';\nimport { uniqueId } from 'lodash';\nimport { Placement } from '@popperjs/core';\nimport { Tooltip } from '../../../Tooltip/Tooltip';\nimport { Icon } from '../../..';\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 React from 'react';\nimport { useTheme2, stylesFactory } from '../../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { getPropertiesForButtonSize } from '../commonStyles';\nimport { getFocusStyles, getMouseFocusStyles } from '../../../themes/mixins';\nimport { StringSelector } from '@grafana/e2e-selectors';\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  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      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          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 React, { useCallback, useEffect, useRef } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { RadioButtonSize, RadioButton } from './RadioButton';\nimport { Icon } from '../../Icon/Icon';\nimport { IconName } from '../../../types/icon';\nimport { useStyles2 } from '../../../themes';\n\nexport interface RadioButtonGroupProps<T> {\n  value?: T;\n  disabled?: boolean;\n  disabledOptions?: T[];\n  options: Array<SelectableValue<T>>;\n  onChange?: (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  disabled,\n  disabledOptions,\n  size = 'md',\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 id = uniqueId('radiogroup-');\n  const groupName = useRef(id);\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            id={`option-${o.value}-${id}`}\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}\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, cx } from '@emotion/css';\nimport { GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\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 uPlot, { AlignedData } from 'uplot';\nimport { Themeable2 } from '../../types';\nimport { findMidPointYPosition, pluginLog } from '../uPlot/utils';\nimport {\n  DataFrame,\n  DataHoverClearEvent,\n  DataHoverEvent,\n  Field,\n  FieldMatcherID,\n  fieldMatchers,\n  LegacyGraphHoverEvent,\n  TimeRange,\n  TimeZone,\n} from '@grafana/data';\nimport { preparePlotFrame as defaultPreparePlotFrame } from './utils';\nimport { VizLegendOptions } from '@grafana/schema';\nimport { PanelContext, PanelContextRoot } from '../PanelChrome/PanelContext';\nimport { Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\nimport { GraphNGLegendEvent, XYFieldMatchers } from './types';\nimport { Renderers, UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder';\nimport { VizLayout } from '../VizLayout/VizLayout';\nimport { UPlotChart } from '../uPlot/Plot';\nimport { ScaleProps } from '../uPlot/config/UPlotScaleBuilder';\nimport { AxisProps } from '../uPlot/config/UPlotAxisBuilder';\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  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    this.state = this.prepState(props);\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    );\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        alignedData: config!.prepData!([alignedFrame]) as AlignedData,\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, timeZone, propsToDiff } = this.props;\n\n    const propsChanged = !sameProps(prevProps, this.props, propsToDiff);\n\n    if (frames !== prevProps.frames || propsChanged) {\n      let newState = this.prepState(this.props, false);\n\n      if (newState) {\n        const shouldReconfig =\n          this.state.config === undefined ||\n          timeZone !== prevProps.timeZone ||\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          newState.alignedData = newState.config.prepData!([newState.alignedFrame]) as AlignedData;\n          pluginLog('GraphNG', false, 'config recreated', newState.config);\n        }\n      }\n\n      newState && this.setState(newState);\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","// 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 { XYFieldMatchers } from './types';\nimport { ArrayVector, DataFrame, FieldConfig, FieldType, outerJoinDataFrames } from '@grafana/data';\nimport { nullToUndefThreshold } from './nullToUndefThreshold';\nimport { AxisPlacement, GraphFieldConfig, ScaleDistribution, ScaleDistributionConfig } from '@grafana/schema';\nimport { FIXED_UNIT } from './GraphNG';\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) {\n      continue;\n    }\n\n    if (field.type === FieldType.number) {\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\n  return frame;\n}\n\nexport function preparePlotFrame(frames: DataFrame[], dimFields: XYFieldMatchers) {\n  let alignedFrame = outerJoinDataFrames({\n    frames: frames,\n    joinBy: dimFields.x,\n    keep: dimFields.y,\n    keepOriginIndices: true,\n  });\n\n  return alignedFrame && applySpanNullsThresholds(alignedFrame);\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  return `${scaleUnit}/${scaleRange}/${scaleSoftRange}/${scalePlacement}/${scaleDistribution}/${scaleLabel}`;\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 { 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', queue: [] };\n}\n\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 u1008 from '!!raw-loader!../../../../../public/img/icons/unicons/arrow.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 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 u1018 from '!!raw-loader!../../../../../public/img/icons/unicons/bell.svg';\nimport u1019 from '!!raw-loader!../../../../../public/img/icons/unicons/bell-slash.svg';\nimport u1020 from '!!raw-loader!../../../../../public/img/icons/unicons/bolt.svg';\nimport u1021 from '!!raw-loader!../../../../../public/img/icons/unicons/book.svg';\nimport u1022 from '!!raw-loader!../../../../../public/img/icons/unicons/book-open.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 u1029 from '!!raw-loader!../../../../../public/img/icons/unicons/channel-add.svg';\nimport u1030 from '!!raw-loader!../../../../../public/img/icons/unicons/chart-line.svg';\nimport u1031 from '!!raw-loader!../../../../../public/img/icons/unicons/check.svg';\nimport u1032 from '!!raw-loader!../../../../../public/img/icons/unicons/check-circle.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 u1036 from '!!raw-loader!../../../../../public/img/icons/unicons/cloud.svg';\nimport u1037 from '!!raw-loader!../../../../../public/img/icons/unicons/cloud-download.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 u1041 from '!!raw-loader!../../../../../public/img/icons/unicons/comment-alt.svg';\nimport u1042 from '!!raw-loader!../../../../../public/img/icons/unicons/comment-alt-share.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 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 u1058 from '!!raw-loader!../../../../../public/img/icons/unicons/eye.svg';\nimport u1059 from '!!raw-loader!../../../../../public/img/icons/unicons/eye-slash.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 u1062 from '!!raw-loader!../../../../../public/img/icons/unicons/filter.svg';\nimport u1063 from '!!raw-loader!../../../../../public/img/icons/unicons/folder.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 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 u1071 from '!!raw-loader!../../../../../public/img/icons/unicons/import.svg';\nimport u1072 from '!!raw-loader!../../../../../public/img/icons/unicons/info.svg';\nimport u1073 from '!!raw-loader!../../../../../public/img/icons/unicons/info-circle.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 u1076 from '!!raw-loader!../../../../../public/img/icons/unicons/link.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 u1079 from '!!raw-loader!../../../../../public/img/icons/unicons/minus.svg';\nimport u1080 from '!!raw-loader!../../../../../public/img/icons/unicons/minus-circle.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 u1083 from '!!raw-loader!../../../../../public/img/icons/unicons/pause.svg';\nimport u1084 from '!!raw-loader!../../../../../public/img/icons/unicons/pen.svg';\nimport u1085 from '!!raw-loader!../../../../../public/img/icons/unicons/play.svg';\nimport u1086 from '!!raw-loader!../../../../../public/img/icons/unicons/plug.svg';\nimport u1087 from '!!raw-loader!../../../../../public/img/icons/unicons/plus.svg';\nimport u1088 from '!!raw-loader!../../../../../public/img/icons/unicons/plus-circle.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 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 u1096 from '!!raw-loader!../../../../../public/img/icons/unicons/search.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 u1099 from '!!raw-loader!../../../../../public/img/icons/unicons/share-alt.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 u1121 from '!!raw-loader!../../../../../public/img/icons/unicons/wrap-text.svg';\nimport u1122 from '!!raw-loader!../../../../../public/img/icons/unicons/cloud-upload.svg';\nimport u1123 from '!!raw-loader!../../../../../public/img/icons/unicons/credit-card.svg';\nimport u1124 from '!!raw-loader!../../../../../public/img/icons/unicons/file-copy-alt.svg';\nimport u1125 from '!!raw-loader!../../../../../public/img/icons/unicons/fire.svg';\nimport u1126 from '!!raw-loader!../../../../../public/img/icons/unicons/hourglass.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 u1129 from '!!raw-loader!../../../../../public/img/icons/unicons/list-ui-alt.svg';\nimport u1130 from '!!raw-loader!../../../../../public/img/icons/unicons/message.svg';\nimport u1131 from '!!raw-loader!../../../../../public/img/icons/unicons/palette.svg';\nimport u1132 from '!!raw-loader!../../../../../public/img/icons/unicons/percentage.svg';\nimport u1133 from '!!raw-loader!../../../../../public/img/icons/unicons/shield-exclamation.svg';\nimport u1134 from '!!raw-loader!../../../../../public/img/icons/unicons/plus-square.svg';\nimport u1135 from '!!raw-loader!../../../../../public/img/icons/unicons/x.svg';\nimport u1136 from '!!raw-loader!../../../../../public/img/icons/unicons/capture.svg';\nimport u1137 from '!!raw-loader!../../../../../public/img/icons/custom/gf-grid.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 u1140 from '!!raw-loader!../../../../../public/img/icons/custom/gf-portrait.svg';\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 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 u1148 from '!!raw-loader!../../../../../public/img/icons/custom/gf-logs.svg';\nimport u1149 from '!!raw-loader!../../../../../public/img/icons/mono/favorite.svg';\nimport u1150 from '!!raw-loader!../../../../../public/img/icons/mono/grafana.svg';\nimport u1151 from '!!raw-loader!../../../../../public/img/icons/mono/heart.svg';\nimport u1152 from '!!raw-loader!../../../../../public/img/icons/mono/heart-break.svg';\nimport u1153 from '!!raw-loader!../../../../../public/img/icons/mono/panel-add.svg';\nimport u1154 from '!!raw-loader!../../../../../public/img/icons/mono/library-panel.svg';\nimport u1155 from '!!raw-loader!../../../../../public/img/icons/unicons/record-audio.svg';\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 = (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}\n","import React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { IconName, IconType, IconSize } from '../../types/icon';\nimport SVG from 'react-inlinesvg';\nimport { cacheInitialized, initIconCache, iconRoot } from './iconBundle';\n\nconst alwaysMonoIcons: IconName[] = ['grafana', 'favorite', 'heart-break', 'heart', 'panel-add', 'library-panel'];\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    container: css`\n      label: Icon;\n      display: inline-block;\n    `,\n    icon: css`\n      vertical-align: middle;\n      display: inline-block;\n      margin-bottom: ${theme.spacing.xxs};\n      fill: currentColor;\n    `,\n    orange: css`\n      fill: ${theme.palette.orange};\n    `,\n  };\n});\n\nfunction getIconSubDir(name: IconName, type: string): string {\n  return name?.startsWith('gf-')\n    ? 'custom'\n    : alwaysMonoIcons.includes(name)\n    ? 'mono'\n    : type === 'default'\n    ? 'unicons'\n    : 'mono';\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\n/* Transform string with px to number and add 2 pxs as path in svg is 2px smaller */\nexport const 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 React from 'react';\nimport { Icon, getSvgSize } from '../Icon/Icon';\nimport { IconName, IconSize, IconType } from '../../types/icon';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { css, cx } from '@emotion/css';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { GrafanaTheme2, colorManipulator } from '@grafana/data';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { TooltipPlacement } from '../Tooltip/PopoverController';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\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  /** @deprecated */\n  surface?: SurfaceType;\n  /** Type od the icon - mono or default */\n  iconType?: IconType;\n  /** Tooltip content to display on hover */\n  tooltip?: string;\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\ntype SurfaceType = 'dashboard' | 'panel' | 'header';\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\n    const button = (\n      <button ref={ref} aria-label={ariaLabel || tooltip || ''} {...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      margin-bottom: 0;\n      vertical-align: baseline;\n      display: flex;\n    `,\n  };\n});\n","import React, { HTMLProps, ReactNode } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { getFocusStyle, sharedInputStyle } from '../Forms/commonStyles';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { Spinner } from '../Spinner/Spinner';\nimport useMeasure from 'react-use/lib/useMeasure';\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)}>\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 React, { HTMLProps } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\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 React from 'react';\nimport { cx, css } from '@emotion/css';\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';\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 { findHighlightChunksInText } from '@grafana/data';\nimport ansicolor from 'ansicolor';\nimport React, { PureComponent } from 'react';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\n\ninterface Style {\n  [key: string]: string;\n}\n\ninterface ParsedChunk {\n  style: Style;\n  text: string;\n}\n\nfunction convertCSSToStyle(css: string): Style {\n  return css.split(/;\\s*/).reduce((accumulated, line) => {\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      // @ts-ignore\n      accumulated[key] = match[2];\n    }\n\n    return accumulated;\n  }, {});\n}\n\ninterface Props {\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 LogMessageAnsi 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(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          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","import React, { useRef, useState, useLayoutEffect, useEffect } from 'react';\nimport { GrafanaTheme, DataQueryError, LogRowModel, textUtil } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\n\nimport { Alert } from '../Alert/Alert';\nimport { LogRowContextRows, LogRowContextQueryErrors, HasMoreContextRows } from './LogRowContextProvider';\nimport { useStyles, useTheme } from '../../themes/ThemeContext';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { List } from '../List/List';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { LogMessageAnsi } from './LogMessageAnsi';\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    if (shouldScrollToBottom && listContainerRef.current) {\n      setScrollTop(listContainerRef.current.offsetHeight);\n    }\n  }, [shouldScrollToBottom]);\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 React, { PureComponent } from 'react';\nimport tinycolor from 'tinycolor2';\nimport { css, cx } from '@emotion/css';\nimport { LogRowModel, findHighlightChunksInText, GrafanaTheme2 } from '@grafana/data';\nimport memoizeOne from 'memoize-one';\n\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\nimport { LogRowContextQueryErrors, HasMoreContextRows, LogRowContextRows } from './LogRowContextProvider';\nimport { Themeable2 } from '../../types/theme';\nimport { withTheme2 } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\nimport { LogRowContext } from './LogRowContext';\nimport { LogMessageAnsi } from './LogMessageAnsi';\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\n    const highlightClassName = cx([style.logsRowMatchHighLight]);\n    const styles = getStyles(theme);\n\n    return (\n      <td 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, highlightClassName)}\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';\nimport { GrafanaTheme2, LogLevel } from '@grafana/data';\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.primary, 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.colors.warning.main};\n      background-color: rgba(${theme.colors.warning.main}, 0.1);\n    `,\n    logsRowMatchHighLightPreview: css`\n      label: logs-row__match-highlight--preview;\n      background-color: rgba(${theme.colors.warning.main}, 0.2);\n      border-bottom-style: dotted;\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        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      position: relative;\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      position: relative;\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    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';\nimport { FieldNamePickerConfigSettings, SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { Select } from '../Select/Select';\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        menuShouldPortal\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';\nimport { DataFrame, Field, getFieldDisplayName, SelectableValue } from '@grafana/data';\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 { cx } from '@emotion/css';\nimport { FocusScope } from '@react-aria/focus';\nimport React, { PropsWithChildren, useCallback, useEffect } from 'react';\n\nimport { useTheme2 } from '../../themes';\nimport { IconName } from '../../types';\nimport { IconButton } from '../IconButton/IconButton';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { Portal } from '../Portal/Portal';\nimport { getModalStyles } from './getModalStyles';\nimport { ModalHeader } from './ModalHeader';\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: propsOnDismiss,\n    onClickBackdrop,\n    trapFocus = true,\n  } = props;\n  const theme = useTheme2();\n  const styles = getModalStyles(theme);\n  const onDismiss = useCallback(() => {\n    if (propsOnDismiss) {\n      propsOnDismiss();\n    }\n  }, [propsOnDismiss]);\n\n  useEffect(() => {\n    const onEscKey = (ev: KeyboardEvent) => {\n      if (ev.key === 'Esc' || ev.key === 'Escape') {\n        onDismiss();\n      }\n    };\n    if (isOpen && closeOnEscape) {\n      document.addEventListener('keydown', onEscKey, false);\n    } else {\n      document.removeEventListener('keydown', onEscKey, false);\n    }\n    return () => {\n      document.removeEventListener('keydown', onEscKey, false);\n    };\n  }, [closeOnEscape, isOpen, onDismiss]);\n\n  if (!isOpen) {\n    return null;\n  }\n\n  const headerClass = cx(styles.modalHeader, typeof title !== 'string' && styles.modalHeaderWithTabs);\n\n  return (\n    <Portal>\n      <div\n        className={styles.modalBackdrop}\n        onClick={onClickBackdrop || (closeOnBackdropClick ? onDismiss : undefined)}\n      />\n      <FocusScope contain={trapFocus} autoFocus restoreFocus>\n        <div className={cx(styles.modal, className)}>\n          <div className={headerClass}>\n            {typeof title === 'string' && <DefaultModalHeader {...props} title={title} />}\n            {typeof title !== 'string' && title}\n            <div className={styles.modalHeaderClose}>\n              <IconButton aria-label=\"Close dialogue\" surface=\"header\" name=\"times\" size=\"xl\" onClick={onDismiss} />\n            </div>\n          </div>\n          <div className={cx(styles.modalContent, contentClassName)}>{children}</div>\n        </div>\n      </FocusScope>\n    </Portal>\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  title: string;\n  icon?: IconName;\n  iconTooltip?: string;\n}\n\nfunction DefaultModalHeader({ icon, iconTooltip, title }: DefaultModalHeaderProps): JSX.Element {\n  return <ModalHeader icon={icon} iconTooltip={iconTooltip} title={title} />;\n}\n","import React from 'react';\nimport { getModalStyles } from './getModalStyles';\nimport { IconName } from '../../types';\nimport { useStyles2 } from '../../themes';\n\ninterface Props {\n  title: 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 }) => {\n  const styles = useStyles2(getModalStyles);\n\n  return (\n    <>\n      <h2 className={styles.modalHeaderTitle}>{title}</h2>\n      {children}\n    </>\n  );\n};\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\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      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 React from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { ColorPicker } from '../ColorPicker/ColorPicker';\nimport { useTheme2, useStyles2 } from '../../themes';\nimport { css } from '@emotion/css';\nimport { ColorSwatch } from '../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} onBlur={hideColorPicker}>\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 from 'react';\nimport { css, cx } from '@emotion/css';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { useStyles } from '../../themes';\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 {\n  EventBusSrv,\n  EventBus,\n  DashboardCursorSync,\n  AnnotationEventUIModel,\n  ThresholdsConfig,\n  SplitOpen,\n  CoreApp,\n} from '@grafana/data';\nimport React from 'react';\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  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';\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: portalRoot = document.body, forwardedRef } = props;\n  const theme = useTheme2();\n  const node = useRef<HTMLDivElement | null>(null);\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    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\nexport const RefForwardingPortal = React.forwardRef<HTMLDivElement, Props>((props, ref) => {\n  return <Portal {...props} forwardedRef={ref} />;\n});\nRefForwardingPortal.displayName = 'RefForwardingPortal';\n","import React from 'react';\nimport { Icon } from '../Icon/Icon';\n\ninterface DropdownIndicatorProps {\n  isOpen: boolean;\n}\n\nexport const DropdownIndicator: React.FC<DropdownIndicatorProps> = ({ isOpen }) => {\n  const icon = isOpen ? 'angle-up' : 'angle-down';\n  return <Icon name={icon} />;\n};\n","import React, { FC, RefCallback } from 'react';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { getSelectStyles } from './getSelectStyles';\nimport { cx } from '@emotion/css';\nimport { SelectableValue } from '@grafana/data';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types';\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    >\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 React from 'react';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { getInputStyles } from '../Input/Input';\nimport { cx, css } from '@emotion/css';\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","import React, { ReactNode } from 'react';\nimport { cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { withTheme2 } from '../../themes/ThemeContext';\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 React from 'react';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { inputPadding } from '../Forms/commonStyles';\nimport { getInputStyles } from '../Input/Input';\nimport { css, cx } from '@emotion/css';\nimport { stylesFactory } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\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(\n  (theme: GrafanaTheme2, invalid: boolean, focused: boolean, disabled: 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\n          display: flex;\n          flex-direction: row;\n          align-items: center;\n          flex-wrap: wrap;\n          justify-content: space-between;\n\n          padding-right: 0;\n\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);\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, focused, disabled, !!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';\nimport { useTheme2 } from '../../themes';\nimport { getSelectStyles } from './getSelectStyles';\nimport { Icon } from '../Icon/Icon';\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 (\n    <div {...innerProps} className={styles.multiValueRemove}>\n      <Icon name=\"times\" size=\"sm\" />\n    </div>\n  );\n};\n","import { SelectableValue } from '@grafana/data';\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 Creatable from 'react-select/creatable';\nimport { default as ReactAsyncSelect } from 'react-select/async';\nimport { default as AsyncCreatable } from 'react-select/async-creatable';\n\nimport { Icon } from '../Icon/Icon';\nimport { Spinner } from '../Spinner/Spinner';\nimport { css, cx } from '@emotion/css';\nimport resetSelectStyles from './resetSelectStyles';\nimport { SelectMenu, SelectMenuOptions } from './SelectMenu';\nimport { IndicatorsContainer } from './IndicatorsContainer';\nimport { ValueContainer } from './ValueContainer';\nimport { InputControl } from './InputControl';\nimport { SelectContainer } from './SelectContainer';\nimport { DropdownIndicator } from './DropdownIndicator';\nimport { SelectOptionGroup } from './SelectOptionGroup';\nimport { SingleValue } from './SingleValue';\nimport { MultiValueContainer, MultiValueRemove } from './MultiValue';\nimport { useTheme2 } from '../../themes';\nimport { getSelectStyles } from './getSelectStyles';\nimport { cleanValue, findSelectedValue } from './utils';\nimport { ActionMeta, SelectBaseProps, SelectValue } from './types';\nimport { deprecationWarning } from '@grafana/data';\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 = false,\n  noOptionsMessage = 'No options found',\n  onBlur,\n  onChange,\n  onCloseMenu,\n  onCreateOption,\n  onInputChange,\n  onKeyDown,\n  onOpenMenu,\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}: SelectBaseProps<T>) {\n  if (menuShouldPortal === false) {\n    deprecationWarning('SelectBase', 'menuShouldPortal={false}', 'menuShouldPortal={true}');\n  }\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\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 ? document.body : undefined,\n    menuShouldScrollIntoView: false,\n    onBlur,\n    onChange: onChangeWithEmpty,\n    onInputChange,\n    onKeyDown,\n    onMenuClose: onCloseMenu,\n    onMenuOpen: onOpenMenu,\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 ?? ((input: string) => `Create: ${input}`);\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          Placeholder(props: any) {\n            return (\n              <div\n                {...props.innerProps}\n                className={cx(\n                  css(props.getStyles('placeholder', props)),\n                  css`\n                    display: inline-block;\n                    color: ${theme.colors.text.disabled};\n\n                    box-sizing: border-box;\n                    line-height: 1;\n                    white-space: nowrap;\n                  `,\n                  // When width: auto, the placeholder must take up space in the Select otherwise the width collapses down\n                  width !== 'auto' &&\n                    css`\n                      position: absolute;\n                      top: 50%;\n                      transform: translateY(-50%);\n                    `\n                )}\n              >\n                {props.children}\n              </div>\n            );\n          },\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={{\n          ...resetSelectStyles(),\n          menuPortal: (base: any) => ({\n            ...base,\n            zIndex: theme.zIndex.portal,\n          }),\n          //These are required for the menu positioning to function\n          menu: ({ top, bottom, position }: any) => ({\n            top,\n            bottom,\n            position,\n            minWidth: '100%',\n            zIndex: theme.zIndex.dropdown,\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        className={className}\n        {...commonSelectProps}\n        {...creatableProps}\n        {...asyncSelectProps}\n      />\n    </>\n  );\n}\n","import React from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { SelectCommonProps, MultiSelectCommonProps, SelectAsyncProps } from './types';\nimport { SelectBase } from './SelectBase';\nimport { SelectContainer, SelectContainerProps } from './SelectContainer';\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\ninterface 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 React from 'react';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { sharedInputStyle } from '../Forms/commonStyles';\nimport { getInputStyles } from '../Input/Input';\nimport { css, cx } from '@emotion/css';\nimport { stylesFactory } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { focusCss } from '../../themes/mixins';\nimport { components, ContainerProps as BaseContainerProps, GroupTypeBase } from 'react-select';\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 GroupTypeBase<Option>>\n  extends BaseContainerProps<Option, isMulti, Group> {\n  isFocused: boolean;\n}\n\nexport const SelectContainer = <Option, isMulti extends boolean, Group extends GroupTypeBase<Option>>(\n  props: SelectContainerProps<Option, isMulti, Group>\n) => {\n  const {\n    isDisabled,\n    isFocused,\n    children,\n    selectProps: { prefix },\n  } = props;\n\n  const theme = useTheme2();\n  const styles = getSelectContainerStyles(theme, isFocused, isDisabled, !!prefix);\n\n  return (\n    <components.SelectContainer {...props} className={cx(styles.wrapper, props.className)}>\n      {children}\n    </components.SelectContainer>\n  );\n};\n\nconst getSelectContainerStyles = stylesFactory(\n  (theme: GrafanaTheme2, focused: boolean, disabled: boolean, withPrefix: 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: center;\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        withPrefix &&\n          css`\n            padding-left: 0;\n          `\n      ),\n    };\n  }\n);\n","import React, { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { GroupProps } from 'react-select';\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 React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { components, SingleValueProps } from 'react-select';\nimport { useDelayedSwitch } from '../../utils/useDelayedSwitch';\nimport { useStyles2 } from '../../themes';\nimport { SlideOutTransition } from '../transitions/SlideOutTransition';\nimport { FadeTransition } from '../transitions/FadeTransition';\nimport { Spinner } from '../Spinner/Spinner';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport tinycolor from 'tinycolor2';\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  `;\n  const container = 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 item = css`\n    width: 100%;\n    height: 100%;\n    position: absolute;\n  `;\n\n  const disabled = css`\n    color: ${tinycolor(theme.colors.text.disabled).setAlpha(0.64).toString()};\n  `;\n\n  return { singleValue, container, item, disabled };\n};\n\ntype StylesType = ReturnType<typeof getStyles>;\n\ninterface Props\n  extends SingleValueProps<{\n    imgUrl?: string;\n    label?: string;\n    value: string;\n    loading?: boolean;\n    hideText?: boolean;\n  }> {\n  disabled?: boolean;\n}\n\nexport const SingleValue = (props: Props) => {\n  const { children, data, disabled } = props;\n  const styles = useStyles2(getStyles);\n  const loading = useDelayedSwitch(data.loading || false, { delay: 250, duration: 750 });\n\n  return (\n    <components.SingleValue {...props}>\n      <div className={cx(styles.singleValue, disabled && styles.disabled)}>\n        {data.imgUrl ? (\n          <FadeWithImage loading={loading} imgUrl={data.imgUrl} styles={styles} alt={data.label || data.value} />\n        ) : (\n          <SlideOutTransition horizontal size={16} visible={loading} duration={150}>\n            <div className={styles.container}>\n              <Spinner className={styles.item} inline />\n            </div>\n          </SlideOutTransition>\n        )}\n        {!data.hideText && children}\n      </div>\n    </components.SingleValue>\n  );\n};\n\nconst FadeWithImage = (props: { loading: boolean; imgUrl: string; styles: StylesType; alt: string }) => {\n  return (\n    <div className={props.styles.container}>\n      <FadeTransition duration={150} visible={props.loading}>\n        <Spinner className={props.styles.item} inline />\n      </FadeTransition>\n      <FadeTransition duration={150} visible={!props.loading}>\n        <img className={props.styles.item} 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 { stylesFactory } from '../../themes/stylesFactory';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\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      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: flex;\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    `,\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","export default function resetSelectStyles() {\n  return {\n    clearIndicator: () => ({}),\n    container: () => ({}),\n    control: () => ({}),\n    dropdownIndicator: () => ({}),\n    group: () => ({}),\n    groupHeading: () => ({}),\n    indicatorsContainer: () => ({}),\n    indicatorSeparator: () => ({}),\n    input: () => ({}),\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: () => ({}),\n    singleValue: () => ({}),\n    valueContainer: () => ({}),\n  };\n}\n","import React, { FC } from 'react';\nimport { cx, css } from '@emotion/css';\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 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, { PureComponent } from 'react';\n\nimport { difference } from 'lodash';\n\nimport { Select } from '../Select/Select';\n\nimport { fieldReducers, SelectableValue } from '@grafana/data';\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        menuShouldPortal\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 React, { HTMLProps, useRef } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { GrafanaTheme2, deprecationWarning } from '@grafana/data';\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, showLabel, label, value, id, ...props }, ref) => {\n    const theme = useTheme2();\n    const styles = getSwitchStyles(theme, transparent);\n\n    return (\n      <div className={styles.inlineContainer}>\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 { CellProps, Column, Row } from 'react-table';\nimport { Field, KeyValue, SelectableValue } from '@grafana/data';\nimport { TableStyles } from './styles';\nimport { FC } from 'react';\nimport { Property } from 'csstype';\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 React, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { stylesFactory, useStyles2 } from '../../themes';\nimport { GrafanaTheme2, locale } from '@grafana/data';\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 React, { HTMLProps } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { Counter } from './Counter';\nimport { getFocusStyles } from '../../themes/mixins';\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}\n\nexport const Tab = React.forwardRef<HTMLAnchorElement, TabProps>(\n  ({ label, active, icon, onChangeTab, counter, 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      </>\n    );\n\n    const linkClass = cx(tabsStyles.link, active ? tabsStyles.activeStyle : tabsStyles.notActive);\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          ref={ref}\n        >\n          {content()}\n        </a>\n      </li>\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  };\n});\n","import React, { PureComponent } from 'react';\nimport { Placement, VirtualElement } from '@popperjs/core';\nimport { Manager, Popper as ReactPopper, PopperArrowProps } from 'react-popper';\nimport { Portal } from '../Portal/Portal';\nimport Transition from 'react-transition-group/Transition';\nimport { PopoverContent } from './Tooltip';\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    } = 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                        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 React from 'react';\nimport { Placement } from '@popperjs/core';\nimport { PopoverContent } from './Tooltip';\n\n// This API allows popovers to update Popper's position when e.g. popover content changes\n// updatePopperPosition is delivered to content by react-popper\n\nexport interface UsingPopperProps {\n  show?: boolean;\n  placement?: TooltipPlacement;\n  content: PopoverContent;\n  children: JSX.Element;\n}\n\nexport type TooltipPlacement =\n  | 'auto-start'\n  | 'auto'\n  | 'auto-end'\n  | 'top-start'\n  | 'top'\n  | 'top-end'\n  | 'right-start'\n  | 'right'\n  | 'right-end'\n  | 'bottom-end'\n  | 'bottom'\n  | 'bottom-start'\n  | 'left-end'\n  | 'left'\n  | 'left-start';\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 React, { createRef, FC } from 'react';\nimport { VirtualElement } from '@popperjs/core';\nimport { Popover } from './Popover';\nimport { PopoverController, UsingPopperProps } from './PopoverController';\n\nexport interface TooltipProps extends UsingPopperProps {\n  theme?: 'info' | 'error' | 'info-alt';\n}\n\nexport interface PopoverContentProps {\n  updatePopperPosition?: () => void;\n}\n\nexport type PopoverContent = string | React.ReactElement<any> | ((props: PopoverContentProps) => JSX.Element);\n\nexport const Tooltip: FC<TooltipProps> = React.memo(({ children, theme, ...controllerProps }: TooltipProps) => {\n  const tooltipTriggerRef = createRef<HTMLElement | VirtualElement>();\n  const popperBackgroundClassName = 'popper__background' + (theme ? ' popper__background--' + theme : '');\n\n  return (\n    <PopoverController {...controllerProps}>\n      {(showPopper, hidePopper, popperProps) => {\n        {\n          /* Override internal 'show' state if passed in as prop */\n        }\n        const payloadProps = {\n          ...popperProps,\n          show: controllerProps.show !== undefined ? controllerProps.show : popperProps.show,\n        };\n        return (\n          <>\n            {tooltipTriggerRef.current && controllerProps.content && (\n              <Popover\n                {...payloadProps}\n                onMouseEnter={showPopper}\n                onMouseLeave={hidePopper}\n                referenceElement={tooltipTriggerRef.current}\n                wrapperClassName=\"popper\"\n                className={popperBackgroundClassName}\n                renderArrow={({ arrowProps, placement }) => (\n                  <div className=\"popper__arrow\" data-placement={placement} {...arrowProps} />\n                )}\n              />\n            )}\n            {React.cloneElement(children, {\n              ref: tooltipTriggerRef,\n              onMouseEnter: showPopper,\n              onMouseLeave: hidePopper,\n            })}\n          </>\n        );\n      }}\n    </PopoverController>\n  );\n});\n\nTooltip.displayName = 'Tooltip';\n","import React, { createElement } from 'react';\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(highlighted ? 'mark' : 'span', {\n        key: i - 1,\n        children: text.substring(start, end),\n        className: highlighted ? highlightClassName : undefined,\n      })\n    );\n    highlighted = !highlighted;\n  }\n\n  return <div>{children}</div>;\n};\n","import React, { PureComponent } from 'react';\nimport { Cascader, CascaderOption } from '../Cascader/Cascader';\nimport { getValueFormats, SelectableValue } from '@grafana/data';\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 React, { useState } from 'react';\nimport { IconName } from '../../types';\nimport { SelectableValue } from '@grafana/data';\nimport { Button, ButtonVariant } from '../Button';\nimport { Select } from '../Select/Select';\nimport { ComponentSize } from '../../types/size';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useTheme2 } from '../../themes';\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            menuShouldPortal\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, { FC, CSSProperties, ComponentType } from 'react';\nimport { useMeasure } from 'react-use';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { LegendPlacement } from '@grafana/schema';\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 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 <div style={containerStyle}>{children(width, height)}</div>;\n  }\n\n  const { placement, maxHeight = '35%', maxWidth = '60%' } = legend.props;\n\n  let size: VizSize | null = null;\n\n  const vizStyle: CSSProperties = {\n    flexGrow: 2,\n  };\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      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 style={vizStyle}>{size && children(size.width, size.height)}</div>\n      <div style={legendStyle} ref={legendRef}>\n        <CustomScrollbar hideHorizontalTrack>{legend}</CustomScrollbar>\n      </div>\n    </div>\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}\n\n/**\n * @beta\n */\nexport const VizLayoutLegend: FC<VizLayoutLegendProps> = ({ children }) => {\n  return <>{children}</>;\n};\n\nVizLayout.Legend = VizLayoutLegend;\n","import React, { PureComponent, SyntheticEvent } from 'react';\nimport { cx, css } from '@emotion/css';\nimport { stylesFactory, withTheme } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\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        {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        <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      cursor: not-allowed;\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  };\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';\nimport { ConfirmButton } from './ConfirmButton';\nimport { ComponentSize } from '../../types/size';\nimport { Button } from '../Button';\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 React, { useState } from 'react';\nimport { css } from '@emotion/css';\n\nimport { SelectableValue, GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { IconName, TabsBar, Tab, IconButton, CustomScrollbar, TabContent } from '../..';\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: 100%;\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 React, { PureComponent } from 'react';\nimport Clipboard from 'clipboard';\nimport { Button, ButtonProps } from '../Button';\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?(e: Clipboard.Event): void;\n  /** Callback when there was an error copying the text */\n  onClipboardError?(e: Clipboard.Event): void;\n}\n\nexport class ClipboardButton extends PureComponent<Props> {\n  private clipboard!: Clipboard;\n  private elem!: HTMLButtonElement;\n\n  setRef = (elem: HTMLButtonElement) => {\n    this.elem = elem;\n  };\n\n  componentDidMount() {\n    const { getText, onClipboardCopy, onClipboardError } = this.props;\n\n    this.clipboard = new Clipboard(this.elem, {\n      text: () => getText(),\n    });\n\n    this.clipboard.on('success', (e: Clipboard.Event) => {\n      onClipboardCopy && onClipboardCopy(e);\n    });\n\n    this.clipboard.on('error', (e: Clipboard.Event) => {\n      onClipboardError && onClipboardError(e);\n    });\n  }\n\n  componentWillUnmount() {\n    this.clipboard.destroy();\n  }\n\n  render() {\n    const { getText, onClipboardCopy, onClipboardError, children, ...buttonProps } = this.props;\n\n    return (\n      <Button {...buttonProps} ref={this.setRef}>\n        {children}\n      </Button>\n    );\n  }\n}\n","import React from 'react';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types/icon';\nimport { css, cx } from '@emotion/css';\n\n// @ts-ignore\nimport RCCascader from 'rc-cascader';\nimport { CascaderOption } from '../Cascader/Cascader';\nimport { onChangeCascader, onLoadDataCascader } from '../Cascader/optionMappings';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\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}\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, ...rest } = props;\n  const theme = useTheme2();\n  const styles = getStyles(theme);\n\n  return (\n    <RCCascader\n      onChange={onChangeCascader(onChange)}\n      loadData={onLoadDataCascader(loadData)}\n      popupClassName={styles.popup}\n      {...rest}\n      expandIcon={null}\n    >\n      <button className={cx('gf-form-label', className)} disabled={props.disabled}>\n        {icon && <Icon name={icon} className={styles.icons.left} />}\n        {props.children}\n        <Icon name=\"angle-down\" className={styles.icons.right} />\n      </button>\n    </RCCascader>\n  );\n};\n\nButtonCascader.displayName = 'ButtonCascader';\n","import React, { HTMLAttributes, SFC } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Spinner } from '../Spinner/Spinner';\nimport { useStyles } from '../../themes';\n\n/**\n * @public\n */\nexport interface LoadingPlaceholderProps extends HTMLAttributes<HTMLDivElement> {\n  text: string;\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","import React, { FC } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\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 { RefObject, useEffect, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\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 React, { useImperativeHandle, useRef } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '../../themes';\nimport { useMenuFocus } from './hooks';\n\n/** @internal */\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\n/** @internal */\nexport const Menu = 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);\nMenu.displayName = 'Menu';\n\n/** @internal */\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    `,\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 React, { ReactElement, useRef } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useStyles2 } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { MenuItemProps } from './MenuItem';\nimport { getPosition } from './utils';\nimport { useMenuFocus } from './hooks';\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);\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: 10px;\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","import React, { ReactElement, useCallback, useMemo, useState, useRef, useImperativeHandle } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2, LinkTarget } from '@grafana/data';\nimport { useStyles2 } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types';\nimport { SubMenu } from './SubMenu';\nimport { getFocusStyles } from '../../themes/mixins';\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\n  tabIndex?: number;\n\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      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    const hasSubMenu = useMemo(() => childItems && childItems.length > 0, [childItems]);\n    const Wrapper = hasSubMenu ? 'div' : url === undefined ? 'button' : 'a';\n    const itemStyle = cx(\n      {\n        [styles.item]: true,\n        [styles.activeItem]: isActive,\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      <Wrapper\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      </Wrapper>\n    );\n  })\n);\nMenuItem.displayName = 'MenuItem';\n\n/** @internal */\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      padding: 5px 12px 5px 10px;\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    activeItem: css`\n      background: ${theme.colors.action.selected};\n    `,\n    icon: css`\n      opacity: 0.7;\n      margin-right: 10px;\n      color: ${theme.colors.text.secondary};\n    `,\n  };\n};\n","import React, { useState, HTMLAttributes } from 'react';\nimport { PopoverContent } from '../Tooltip/Tooltip';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { ToolbarButtonVariant, ToolbarButton, ButtonGroup } from '../Button';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { css } from '@emotion/css';\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Menu } from '../Menu/Menu';\nimport { MenuItem } from '../Menu/MenuItem';\nimport { FocusScope } from '@react-aria/focus';\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 [isOpen, setIsOpen] = useState<boolean>(false);\n  const styles = useStyles2(getStyles);\n\n  const onCloseMenu = () => {\n    setIsOpen(false);\n  };\n\n  const onToggle = (event: React.MouseEvent) => {\n    event.stopPropagation();\n    event.preventDefault();\n    setIsOpen(!isOpen);\n  };\n\n  const onArrowKeyDown = (event: React.KeyboardEvent) => {\n    event.stopPropagation();\n    if (event.key === 'ArrowDown' || event.key === 'Enter') {\n      setIsOpen(!isOpen);\n    }\n  };\n\n  const onChangeInternal = (item: SelectableValue<T>) => {\n    onChange(item);\n    setIsOpen(false);\n  };\n\n  return (\n    <ButtonGroup className={styles.wrapper}>\n      <ToolbarButton\n        className={className}\n        isOpen={isOpen}\n        onClick={onToggle}\n        onKeyDown={onArrowKeyDown}\n        narrow={narrow}\n        variant={variant}\n        {...restProps}\n      >\n        {value?.label || value?.value}\n      </ToolbarButton>\n      {isOpen && (\n        <div className={styles.menuWrapper}>\n          <ClickOutsideWrapper onClick={onCloseMenu} parent={document} includeButtonPress={false}>\n            <FocusScope contain autoFocus restoreFocus>\n              <Menu onClose={onCloseMenu}>\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 React, { PureComponent } from 'react';\nimport formatDuration from 'date-fns/formatDuration';\nimport { SelectableValue, parseDuration } from '@grafana/data';\nimport { ButtonSelect } from '../Dropdown/ButtonSelect';\nimport { ButtonGroup, ToolbarButton, ToolbarButtonVariant } from '../Button';\nimport { selectors } from '@grafana/e2e-selectors';\n\n// Default intervals used in the refresh picker component\nexport const defaultIntervals = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'];\nconst offLabel = 'Auto refresh turned off. Choose refresh time interval';\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}\n\nexport class RefreshPicker extends PureComponent<Props> {\n  static offOption = { label: 'Off', value: '', ariaLabel: 'Turn off auto refresh' };\n  static liveOption = { label: 'Live', value: 'LIVE', ariaLabel: 'Turn on live streaming' };\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 { onRefresh, intervals, tooltip, value, text, isLoading, noIntervalPicker, width } = this.props;\n\n    const currentValue = value || '';\n    const variant = this.getVariant();\n    const options = intervalsToOptions({ intervals });\n    const option = options.find(({ value }) => value === currentValue);\n    let selectedValue = option || RefreshPicker.offOption;\n\n    if (selectedValue.label === RefreshPicker.offOption.label) {\n      selectedValue = { value: '' };\n    }\n\n    return (\n      <ButtonGroup className=\"refresh-picker\">\n        <ToolbarButton\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={\n              selectedValue.value === ''\n                ? offLabel\n                : `Choose refresh time interval with current interval ${selectedValue.ariaLabel} selected`\n            }\n          />\n        )}\n      </ButtonGroup>\n    );\n  }\n}\n\nexport function intervalsToOptions({ intervals = defaultIntervals }: { intervals?: string[] } = {}): Array<\n  SelectableValue<string>\n> {\n  const intervalsOrDefault = intervals || defaultIntervals;\n  const options = intervalsOrDefault.map((interval) => {\n    const duration: { [key: string]: string | number } = parseDuration(interval);\n\n    const key = Object.keys(duration)[0];\n    const value = duration[key];\n    duration[key] = Number(value);\n\n    const ariaLabel = formatDuration(duration);\n\n    return {\n      label: interval,\n      value: interval,\n      ariaLabel: ariaLabel,\n    };\n  });\n\n  options.unshift(RefreshPicker.offOption);\n  return options;\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 React, { memo, PropsWithChildren } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\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 React from 'react';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { Button } from '../../Button';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { TimePickerCalendarProps } from './TimePickerCalendar';\nimport { useStyles2 } from '../../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React, { useCallback } from 'react';\nimport { useStyles2 } from '../../../themes';\nimport Calendar from 'react-calendar';\nimport { css } from '@emotion/css';\nimport { Icon } from '../../Icon/Icon';\nimport { TimePickerCalendarProps } from './TimePickerCalendar';\nimport { GrafanaTheme2, dateTime, dateTimeParse, DateTime, TimeZone } from '@grafana/data';\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[] {\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__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 React from 'react';\nimport { useStyles2 } from '../../../themes';\nimport { Button } from '../../Button';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\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 React, { FormEvent, memo } from 'react';\nimport { css } from '@emotion/css';\nimport { DateTime, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { useTheme2 } from '../../../themes';\nimport { Header } from './CalendarHeader';\nimport { Portal } from '../../Portal/Portal';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport { Body } from './CalendarBody';\nimport { Footer } from './CalendarFooter';\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      left: 25%;\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 { 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\n          className={styles.container}\n          onClick={stopPropagation}\n          aria-label={selectors.components.TimePicker.calendar.label}\n          ref={ref}\n          {...overlayProps}\n        >\n          <Header {...props} />\n          <Body {...props} />\n        </section>\n      </FocusScope>\n    );\n  }\n\n  return (\n    <Portal>\n      <FocusScope contain autoFocus restoreFocus>\n        <section className={styles.modal} onClick={stopPropagation} ref={ref} {...overlayProps}>\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    </Portal>\n  );\n}\nexport default memo(TimePickerCalendar);\nTimePickerCalendar.displayName = 'TimePickerCalendar';\n","import { css } from '@emotion/css';\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';\nimport React, { FormEvent, useCallback, useEffect, useState } from 'react';\nimport { Icon, Tooltip } from '../..';\nimport { useStyles2 } from '../../..';\nimport { Button } from '../../Button';\nimport { Field } from '../../Forms/Field';\nimport { Input } from '../../Input/Input';\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 React, { memo } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2, TimeOption } from '@grafana/data';\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { getFocusStyles } from '../../../themes/mixins';\nimport { v4 as uuidv4 } from 'uuid';\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 React, { ReactNode } from 'react';\nimport { css } from '@emotion/css';\nimport { TimeOption } from '@grafana/data';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { TimeRangeOption } from './TimeRangeOption';\nimport { stylesFactory } from '../../../themes';\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 React, { ReactNode } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\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 React, { PropsWithChildren, useMemo } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme, TimeZoneInfo } from '@grafana/data';\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 React, { PropsWithChildren } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme, TimeZone, dateTimeFormat } from '@grafana/data';\nimport { useTheme, stylesFactory } from '../../../themes';\nimport { isString } from 'lodash';\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 React, { PropsWithChildren } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2, SelectableValue, getTimeZoneInfo } from '@grafana/data';\nimport { useTheme2 } from '../../../themes/ThemeContext';\nimport { stylesFactory } from '../../../themes/stylesFactory';\nimport { Icon } from '../../Icon/Icon';\nimport { TimeZoneOffset } from './TimeZoneOffset';\nimport { TimeZoneDescription } from './TimeZoneDescription';\nimport { TimeZoneTitle } from './TimeZoneTitle';\nimport { isString } from 'lodash';\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  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={getTimeZoneInfo(data.value, timestamp)} />\n        </div>\n        <div className={styles.rightColumn}>\n          <TimeZoneOffset timeZone={data.value} timestamp={timestamp} className={offsetClassName} />\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  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={getTimeZoneInfo(data.value, timestamp)} />\n          </div>\n          <div className={styles.rightColumn}>\n            <TimeZoneOffset timestamp={timestamp} timeZone={data.value} className={offsetClassName} />\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 React, { PropsWithChildren } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\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 React, { useMemo, useCallback } from 'react';\nimport { toLower, isEmpty, isString } from 'lodash';\nimport {\n  SelectableValue,\n  getTimeZoneInfo,\n  TimeZoneInfo,\n  getTimeZoneGroups,\n  GroupedTimeZones,\n  TimeZone,\n  InternalTimeZones,\n} from '@grafana/data';\nimport { Select } from '../Select/Select';\nimport { CompactTimeZoneOption, WideTimeZoneOption, SelectableZone } from './TimeZonePicker/TimeZoneOption';\nimport { TimeZoneGroup } from './TimeZonePicker/TimeZoneGroup';\nimport { formatUtcOffset } from './TimeZonePicker/TimeZoneOffset';\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      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 React, { FC, useCallback, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { getTimeZoneInfo, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { TimeZoneTitle } from '../TimeZonePicker/TimeZoneTitle';\nimport { TimeZoneDescription } from '../TimeZonePicker/TimeZoneDescription';\nimport { TimeZoneOffset } from '../TimeZonePicker/TimeZoneOffset';\nimport { Button } from '../../Button';\nimport { TimeZonePicker } from '../TimeZonePicker';\nimport { isString } from 'lodash';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Field, RadioButtonGroup, Select } from '../..';\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                  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 { GrafanaTheme2, isDateTime, rangeUtil, RawTimeRange, TimeOption, TimeRange, TimeZone } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport React, { memo, useMemo, useState } from 'react';\nimport { useMedia } from 'react-use';\nimport { stylesFactory, useTheme2 } from '../../../themes';\nimport { CustomScrollbar } from '../../CustomScrollbar/CustomScrollbar';\nimport { Icon } from '../../Icon/Icon';\nimport { mapOptionToTimeRange, mapRangeToTimeOption } from './mapper';\nimport { TimePickerTitle } from './TimePickerTitle';\nimport { TimeRangeForm } from './TimeRangeForm';\nimport { TimeRangeList } from './TimeRangeList';\nimport { TimePickerFooter } from './TimePickerFooter';\nimport { getFocusStyles } from '../../../themes/mixins';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { FilterInput } from '../..';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, isReversed, hideQuickRanges, isContainerTall) => {\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: 546px;\n      top: 116%;\n      border-radius: 2px;\n      border: 1px solid ${theme.colors.border.weak};\n      ${isReversed ? 'left' : 'right'}: 0;\n\n      @media only screen and (max-width: ${theme.breakpoints.values.lg}px) {\n        width: 262px;\n      }\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: 40% !important;\n      border-right: ${isReversed ? `1px solid ${theme.colors.border.weak}` : 'none'};\n      display: flex;\n      flex-direction: column;\n      @media only screen and (max-width: ${theme.breakpoints.values.lg}px) {\n        width: 100% !important;\n      }\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\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}\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);\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 theme = useTheme2();\n  const isFullscreen = useMedia(`(min-width: ${theme.breakpoints.values.lg}px)`);\n\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          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&apos;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","// Libraries\nimport React, { memo, FormEvent, createRef, useState, ReactElement } from 'react';\nimport { css } from '@emotion/css';\n\n// Components\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { TimePickerContent } from './TimeRangePicker/TimePickerContent';\n\n// Utils & Services\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { withTheme, useTheme } from '../../themes/ThemeContext';\n\n// Types\nimport {\n  isDateTime,\n  rangeUtil,\n  GrafanaTheme,\n  dateTimeFormat,\n  timeZoneFormatUserFriendly,\n  TimeRange,\n  TimeZone,\n  dateMath,\n} from '@grafana/data';\nimport { Themeable } from '../../types';\nimport { quickOptions } from './options';\nimport { ButtonGroup, ToolbarButton } from '../Button';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useOverlay } from '@react-aria/overlays';\nimport { FocusScope } from '@react-aria/focus';\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}\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  } = 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\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\">\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 restoreFocus>\n          <section ref={ref} {...overlayProps}>\n            <TimePickerContent\n              timeZone={timeZone}\n              fiscalYearStartMonth={fiscalYearStartMonth}\n              value={value}\n              onChange={onChange}\n              quickOptions={quickOptions}\n              history={history}\n              showHistory\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 React, { FC } from 'react';\nimport RcTimePicker from 'rc-time-picker';\nimport { css, cx } from '@emotion/css';\nimport { dateTime, DateTime, dateTimeAsMoment, GrafanaTheme } from '@grafana/data';\nimport { Icon, useStyles } from '../../index';\nimport { stylesFactory } from '../../themes';\nimport { inputSizes } from '../Forms/commonStyles';\nimport { FormInputSize } from '../Forms/types';\nimport { focusCss } from '../../themes/mixins';\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';\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '../Select/Select';\nimport { selectors } from '@grafana/e2e-selectors';\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      menuShouldPortal={true}\n    />\n  );\n};\n","import React, { memo } from 'react';\nimport Calendar from 'react-calendar';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\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}\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, 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      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  };\n};\n","import React, { ChangeEvent } from 'react';\nimport { css } from '@emotion/css';\nimport { dateTime } from '@grafana/data';\nimport { DatePicker } from '../DatePicker/DatePicker';\nimport { Props as InputProps, Input } from '../../Input/Input';\nimport { useStyles } from '../../../themes';\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  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  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        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 React, { FC, FormEvent, ReactNode, useCallback, useEffect, useState } from 'react';\nimport { useMedia } from 'react-use';\nimport Calendar from 'react-calendar';\nimport { css, cx } from '@emotion/css';\nimport { dateTimeFormat, DateTime, dateTime, GrafanaTheme2, isDateTime } from '@grafana/data';\nimport { Button, ClickOutsideWrapper, HorizontalGroup, Icon, InlineField, Input, Portal } from '../..';\nimport { TimeOfDayPicker } from '../TimeOfDayPicker';\nimport { getStyles as getCalendarStyles } from '../TimeRangePicker/TimePickerCalendar';\nimport { useStyles2, useTheme2 } from '../../../themes';\nimport { isValid } from '../utils';\nimport { getBodyStyles } from '../TimeRangePicker/CalendarBody';\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 React, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { getTagColorsFromName } from '../../utils';\nimport { stylesFactory, useTheme } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { GrafanaTheme } from '@grafana/data';\n\ninterface Props {\n  name: string;\n\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});\n\n/**\n * @internal\n * Only used internally by TagsInput\n * */\nexport const TagItem: FC<Props> = ({ name, 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      <Icon className=\"pointer\" name=\"times\" onClick={() => onRemove(name)} />\n    </div>\n  );\n};\n","import React, { ChangeEvent, KeyboardEvent, FC, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { Button } from '../Button';\nimport { TagItem } from './TagItem';\nimport { useStyles, useTheme2 } from '../../themes/ThemeContext';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Input } from '../Input/Input';\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    if (disabled) {\n      return;\n    }\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} />;\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          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 React from 'react';\nimport { css } from '@emotion/css';\nimport { stylesFactory } from '../../themes';\nimport { Button, ButtonVariant } from '../Button';\nimport { Icon } from '../Icon/Icon';\n\nconst PAGE_LENGTH_TO_CONDENSE = 8;\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}\n\nexport const Pagination: React.FC<Props> = ({ currentPage, numberOfPages, onNavigate, hideWhenSinglePage }) => {\n  const styles = getStyles();\n  const pages = [...new Array(numberOfPages).keys()];\n\n  const condensePages = numberOfPages > PAGE_LENGTH_TO_CONDENSE;\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  const pageButtons = 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 = PAGE_LENGTH_TO_CONDENSE;\n    const upperBoundIndex = numberOfPages - PAGE_LENGTH_TO_CONDENSE + 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    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 - 2 && page <= currentPage + 2)\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 && (page === currentPage - 3 || page === currentPage + 3))\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\n  if (hideWhenSinglePage && numberOfPages <= 1) {\n    return null;\n  }\n\n  return (\n    <div className={styles.container}>\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 = stylesFactory(() => {\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 React, { forwardRef, HTMLAttributes } from 'react';\nimport { cx, css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useTheme } from '../../themes';\nimport { getTagColor, getTagColorsFromName } from '../../utils';\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  /** 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, className, colorIndex, ...rest }, ref) => {\n  const theme = useTheme();\n  const styles = getTagStyles(theme, name, colorIndex);\n\n  const onTagClick = (event: React.MouseEvent<HTMLElement>) => {\n    if (onClick) {\n      onClick(name, event);\n    }\n  };\n\n  return (\n    <span\n      key={name}\n      ref={ref}\n      onClick={onTagClick}\n      className={cx(styles.wrapper, className, onClick && styles.hover)}\n      {...rest}\n    >\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      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 React, { FC, memo } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { OnTagClick, Tag } from './Tag';\n\nexport interface Props {\n  tags: string[];\n  onClick?: OnTagClick;\n  /** Custom styles for the wrapper component */\n  className?: string;\n}\n\nexport const TagList: FC<Props> = memo(({ tags, onClick, className }) => {\n  const styles = getStyles();\n\n  return (\n    <span className={cx(styles.wrapper, className)}>\n      {tags.map((tag) => (\n        <Tag key={tag} name={tag} onClick={onClick} className={styles.tag} />\n      ))}\n    </span>\n  );\n});\n\nTagList.displayName = 'TagList';\n\nconst getStyles = () => {\n  return {\n    wrapper: css`\n      display: flex;\n      flex: 1 1 auto;\n      flex-wrap: wrap;\n      margin-bottom: -6px;\n      justify-content: flex-end;\n    `,\n    tag: css`\n      margin: 0 0 6px 6px;\n    `,\n  };\n};\n","import React from 'react';\nimport { useStyles2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { Icon } from '../Icon/Icon';\nimport { IconName } from '../../types';\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, { useEffect, useRef, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { Modal } from '../Modal/Modal';\nimport { IconName } from '../../types/icon';\nimport { Button } from '../Button';\nimport { useStyles2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { HorizontalGroup, Input } from '..';\nimport { selectors } from '@grafana/e2e-selectors';\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 { debounce } from 'lodash';\nimport React, { Context } from 'react';\n\nimport { Value, Editor as CoreEditor } from 'slate';\nimport { Editor, Plugin } from '@grafana/slate-react';\nimport Plain from 'slate-plain-serializer';\nimport classnames from 'classnames';\n\nimport {\n  ClearPlugin,\n  NewlinePlugin,\n  SelectionShortcutsPlugin,\n  IndentationPlugin,\n  ClipboardPlugin,\n  RunnerPlugin,\n  SuggestionsPlugin,\n} from '../../slate-plugins';\n\nimport { makeValue, SCHEMA, CompletionItemGroup, TypeaheadOutput, TypeaheadInput, SuggestionsState } from '../..';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport interface QueryFieldProps {\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}\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 QueryField 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 } = this.props;\n    const wrapperClassName = classnames('slate-query-field__wrapper', {\n      'slate-query-field__wrapper--disabled': disabled,\n    });\n\n    return (\n      <div className={wrapperClassName}>\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 default QueryField;\n","import React from 'react';\nimport { useAsyncDependency } from '../../utils/useAsyncDependency';\nimport { ErrorWithStack, LoadingPlaceholder } from '..';\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 * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport type { EditorProps } from '@monaco-editor/react';\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\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 React from 'react';\nimport { css } from '@emotion/css';\nimport { ReactMonacoEditorLazy } from './ReactMonacoEditorLazy';\nimport type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme2, monacoLanguageRegistry } from '@grafana/data';\n\nimport { withTheme2 } from '../../themes';\nimport { Themeable2 } from '../../types';\n\nimport { CodeEditorProps, Monaco, MonacoEditor as MonacoEditorType, MonacoOptions } from './types';\nimport { registerSuggestions } from './suggestions';\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.KEY_S, 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 styles = getStyles(theme);\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={styles.container} 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';\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 React, { ReactNode } from 'react';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\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: 41px;\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      <ul className={tabsStyles.tabs}>{children}</ul>\n    </div>\n  );\n});\n\nTabsBar.displayName = 'TabsBar';\n","import React from 'react';\nimport { IconName } from '../../types';\nimport { TabsBar } from '../Tabs/TabsBar';\nimport { Tab } from '../Tabs/Tab';\nimport { ModalHeader } from './ModalHeader';\n\ninterface ModalTab {\n  value: string;\n  label: string;\n  icon?: IconName;\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              active={t.value === activeTab}\n              onChangeTab={() => onChangeTab(t)}\n            />\n          );\n        })}\n      </TabsBar>\n    </ModalHeader>\n  );\n};\n","import React from 'react';\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\nconst 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 React, { FC, ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { IconName } from '../../types';\nimport { Icon } from '../Icon/Icon';\nimport { styleMixins } from '../../themes';\nimport { IconButton } from '../IconButton/IconButton';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Link } from '..';\nimport { getFocusStyles } from '../../themes/mixins';\n\nexport interface Props {\n  pageIcon?: IconName;\n  title?: 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}\n\n/** @alpha */\nexport const PageToolbar: FC<Props> = React.memo(\n  ({ title, parent, pageIcon, onGoBack, children, titleHref, parentHref, leftItems, isFullscreen, className }) => {\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    return (\n      <div className={mainStyle}>\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              surface=\"dashboard\"\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 && titleHref && (\n            <h1 className={styles.h1Styles}>\n              <Link\n                aria-label=\"Search dashboard by name\"\n                className={cx(styles.titleText, styles.titleLink)}\n                href={titleHref}\n              >\n                {title}\n              </Link>\n            </h1>\n          )}\n          {title && !titleHref && <h1 className={styles.titleText}>{title}</h1>}\n        </nav>\n        {leftItems?.map((child, index) => (\n          <div className={styles.leftActionItem} key={index}>\n            {child}\n          </div>\n        ))}\n\n        <div className={styles.spacer} />\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      </div>\n    );\n  }\n);\n\nPageToolbar.displayName = 'PageToolbar';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  const { spacing, typography } = theme;\n\n  const focusStyle = getFocusStyles(theme);\n  const titleStyles = css`\n    font-size: ${typography.size.lg};\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    margin: 0;\n    max-width: 240px;\n    border-radius: 2px;\n\n    @media ${styleMixins.mediaUp(theme.v1.breakpoints.xl)} {\n      max-width: unset;\n    }\n  `;\n\n  return {\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    spacer: css`\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    titleWrapper: css`\n      display: flex;\n      align-items: center;\n      min-width: 0;\n      overflow: hidden;\n    `,\n    navElement: css`\n      display: flex;\n    `,\n    h1Styles: css`\n      margin: 0;\n      line-height: inherit;\n      display: flex;\n    `,\n    parentIcon: css`\n      margin-left: ${theme.spacing(0.5)};\n    `,\n    titleText: titleStyles,\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 { PureComponent } from 'react';\nimport { interval, Subscription, Subject, of, NEVER } from 'rxjs';\nimport { tap, switchMap } from 'rxjs/operators';\nimport { isEqual } from 'lodash';\n\nimport { stringToMs, SelectableValue } from '@grafana/data';\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 React, { FC, useCallback } from 'react';\nimport { FILTER_FOR_OPERATOR, FILTER_OUT_OPERATOR, TableCellProps } from './types';\nimport { Icon, Tooltip } from '..';\n\nexport const FilterActions: FC<TableCellProps> = ({ cell, field, tableStyles, onCellFilterAdded }) => {\n  const onFilterFor = useCallback(\n    (event: React.MouseEvent<HTMLDivElement>) =>\n      onCellFilterAdded({ key: field.name, operator: FILTER_FOR_OPERATOR, value: cell.value }),\n    [cell, field, onCellFilterAdded]\n  );\n  const onFilterOut = useCallback(\n    (event: React.MouseEvent<HTMLDivElement>) =>\n      onCellFilterAdded({ key: field.name, operator: FILTER_OUT_OPERATOR, value: cell.value }),\n    [cell, field, onCellFilterAdded]\n  );\n\n  return (\n    <div className={tableStyles.filterWrapper}>\n      <div className={tableStyles.filterItem}>\n        <Tooltip content=\"Filter for value\" placement=\"top\">\n          <Icon name={'search-plus'} onClick={onFilterFor} />\n        </Tooltip>\n      </div>\n      <div className={tableStyles.filterItem}>\n        <Tooltip content=\"Filter out value\" placement=\"top\">\n          <Icon name={'search-minus'} onClick={onFilterOut} />\n        </Tooltip>\n      </div>\n    </div>\n  );\n};\n","import React, { FC, ReactElement } from 'react';\nimport { DisplayValue, Field, formattedValueToString } from '@grafana/data';\n\nimport { TableCellDisplayMode, TableCellProps } from './types';\nimport tinycolor from 'tinycolor2';\nimport { TableStyles } from './styles';\nimport { FilterActions } from './FilterActions';\nimport { getTextColorForBackground, getCellLinks } from '../../utils';\n\nexport const DefaultCell: FC<TableCellProps> = (props) => {\n  const { field, cell, tableStyles, row, cellProps } = props;\n\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 cellStyle = getCellStyle(tableStyles, field, displayValue);\n  const showFilters = field.config.filterable;\n\n  const { link, onClick } = getCellLinks(field, row);\n\n  return (\n    <div {...cellProps} className={cellStyle}>\n      {!link && <div className={tableStyles.cellText}>{value}</div>}\n      {link && (\n        <a href={link.href} onClick={onClick} target={link.target} title={link.title} className={tableStyles.cellLink}>\n          {value}\n        </a>\n      )}\n      {showFilters && cell.value !== undefined && <FilterActions {...props} />}\n    </div>\n  );\n};\n\nfunction getCellStyle(tableStyles: TableStyles, field: Field, displayValue: DisplayValue) {\n  if (field.config.custom?.displayMode === TableCellDisplayMode.ColorText) {\n    return tableStyles.buildCellContainerStyle(displayValue.color);\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());\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    );\n  }\n\n  return tableStyles.cellContainer;\n}\n","// Library\nimport React, { CSSProperties, PureComponent, ReactNode } from 'react';\nimport tinycolor from 'tinycolor2';\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  TextDisplayOptions,\n  ThresholdsMode,\n  TimeSeriesValue,\n  VizOrientation,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\nimport { calculateFontSize, measureText } from '../../utils/measureText';\nimport { Themeable2 } from '../../types';\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?: TextDisplayOptions;\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 {\n      valueHeight,\n      valueWidth,\n      maxBarHeight,\n      maxBarWidth,\n      wrapperWidth,\n      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  return Math.min((value - minValue) / (maxValue - minValue), 1);\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?: TextDisplayOptions\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, { FC } from 'react';\nimport { ThresholdsConfig, ThresholdsMode, VizOrientation, getFieldConfigWithMinMax } from '@grafana/data';\nimport { BarGauge, BarGaugeDisplayMode } from '../BarGauge/BarGauge';\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 } = 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  return (\n    <div {...cellProps} className={tableStyles.cellContainer}>\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    </div>\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 */\nfunction escapeString(str: string): string {\n  return str.replace('\"', '\"');\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 = '\"' + escapeString(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 { isObject, getObjectName, getType, getValuePreview, cssClass, createElement } from './helpers';\n\nimport { isNumber } from 'lodash';\n\nconst DATE_STRING_REGEX = /(^\\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  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';\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 React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { isString } from 'lodash';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { JSONFormatter } from '../JSONFormatter/JSONFormatter';\nimport { useStyles2 } from '../../themes';\nimport { TableCellProps } from './types';\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport function JSONViewCell(props: TableCellProps): JSX.Element {\n  const { cell, tableStyles, cellProps } = props;\n\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 content = <JSONTooltip value={value} />;\n\n  return (\n    <Tooltip placement=\"auto-start\" content={content} theme=\"info-alt\">\n      <div {...cellProps} className={tableStyles.cellContainer}>\n        <div className={cx(tableStyles.cellText, txt)}>{displayValue}</div>\n      </div>\n    </Tooltip>\n  );\n}\n\ninterface PopupProps {\n  value: any;\n}\n\nfunction JSONTooltip(props: PopupProps): JSX.Element {\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={styles.container}>\n      <div>\n        <JSONFormatter json={props.value} open={4} className={styles.json} />\n      </div>\n    </div>\n  );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    container: css`\n      padding: ${theme.spacing(0.5)};\n    `,\n    json: css`\n      width: fit-content;\n      max-height: 70vh;\n      overflow-y: auto;\n    `,\n  };\n}\n","import React, { FC } from 'react';\nimport { getCellLinks } from '../../utils';\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 { link, onClick } = getCellLinks(field, row);\n\n  return (\n    <div {...cellProps} className={tableStyles.cellContainer}>\n      {!link && <img src={displayValue.text} className={tableStyles.imageCell} />}\n      {link && (\n        <a\n          href={link.href}\n          onClick={onClick}\n          target={link.target}\n          title={link.title}\n          className={tableStyles.imageCellLink}\n        >\n          <img src={displayValue.text} className={tableStyles.imageCell} />\n        </a>\n      )}\n    </div>\n  );\n};\n","import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\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) => {\n    return css`\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        overflow: visible;\n        width: auto !important;\n        box-shadow: 0 0 2px ${theme.colors.primary.main};\n        background: ${background ?? rowHoverBg};\n        z-index: 1;\n\n        .cell-filter-actions  {\n          display: inline-flex;\n        }\n      }\n      a {\n        color: inherit;\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    `,\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      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(),\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      width: 100%;\n      height: 100%;\n    `,\n    headerFilter: css`\n      label: headerFilter;\n      cursor: pointer;\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    filterWrapper: cx(\n      css`\n        label: filterWrapper;\n        display: none;\n        justify-content: flex-end;\n        flex-grow: 1;\n        opacity: 0.6;\n        padding-left: ${theme.spacing(0.25)};\n      `,\n      'cell-filter-actions'\n    ),\n    filterItem: css`\n      label: filterItem;\n      cursor: pointer;\n      padding: 0 ${theme.spacing(0.025)};\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 React from 'react';\nimport { FooterItem } from './types';\nimport { KeyValue } from '@grafana/data';\nimport { css } from '@emotion/css';\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>&nbsp;</span>;\n};\n","import React from 'react';\nimport { ColumnInstance, HeaderGroup } from 'react-table';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { getTableStyles, TableStyles } from './styles';\nimport { useStyles2 } from '../../themes';\nimport { FooterItem } from './types';\nimport { EmptyCell, FooterCell } from './FooterCell';\n\nexport interface FooterRowProps {\n  totalColumnsWidth: number;\n  footerGroups: HeaderGroup[];\n  footerValues: FooterItem[];\n  height: number;\n}\n\nexport const FooterRow = (props: FooterRowProps) => {\n  const { totalColumnsWidth, footerGroups, height } = props;\n  const e2eSelectorsTable = selectors.components.Panels.Visualization.Table;\n  const tableStyles = useStyles2(getTableStyles);\n\n  return (\n    <table\n      style={{\n        position: '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 { Row } from 'react-table';\nimport memoizeOne from 'memoize-one';\nimport { Property } from 'csstype';\nimport {\n  DataFrame,\n  Field,\n  FieldType,\n  formattedValueToString,\n  getFieldDisplayName,\n  SelectableValue,\n} from '@grafana/data';\n\nimport { DefaultCell } from './DefaultCell';\nimport { BarGaugeCell } from './BarGaugeCell';\nimport { CellComponent, TableCellDisplayMode, TableFieldOptions, FooterItem, GrafanaTableColumn } from './types';\nimport { JSONViewCell } from './JSONViewCell';\nimport { ImageCell } from './ImageCell';\nimport { getFooterValue } from './FooterRow';\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\nfunction 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  // 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 React, { FC } from 'react';\nimport { Cell } from 'react-table';\nimport { GrafanaTableColumn, TableFilterActionCallback } from './types';\nimport { TableStyles } from './styles';\n\nexport interface Props {\n  cell: Cell;\n  tableStyles: TableStyles;\n  onCellFilterAdded?: TableFilterActionCallback;\n  columnIndex: number;\n  columnCount: number;\n}\n\nexport const TableCell: FC<Props> = ({ cell, tableStyles, onCellFilterAdded, columnIndex, columnCount }) => {\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  }) as React.ReactElement;\n};\n","import React, { FC, useCallback, useMemo, useState } from 'react';\nimport { FixedSizeList as List } from 'react-window';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { Checkbox, FilterInput, Label, VerticalGroup } from '..';\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, useCallback, useMemo, useState } from 'react';\nimport { Field, GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\n\nimport { TableStyles } from './styles';\nimport { stylesFactory, useStyles, useTheme2 } from '../../themes';\nimport { Button, ClickOutsideWrapper, HorizontalGroup, IconButton, Label, VerticalGroup } from '..';\nimport { FilterList } from './FilterList';\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 React, { FC, useCallback, useMemo, useRef, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { Field, GrafanaTheme } from '@grafana/data';\n\nimport { TableStyles } from './styles';\nimport { stylesFactory, useStyles } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { FilterPopup } from './FilterPopup';\nimport { Popover } from '..';\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      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';\nimport { DataFrame, Field } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { getTableStyles, TableStyles } from './styles';\nimport { useStyles2 } from '../../themes';\nimport { Filter } from './Filter';\nimport { Icon } from '../Icon/Icon';\nimport { getFieldTypeIcon } from '../../types';\n\nexport interface HeaderRowProps {\n  headerGroups: HeaderGroup[];\n  data: DataFrame;\n  showTypeIcons?: boolean;\n}\n\nexport const HeaderRow = (props: HeaderRowProps) => {\n  const { headerGroups, data, 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, data.fields[index], showTypeIcons)\n            )}\n          </div>\n        );\n      })}\n    </div>\n  );\n};\n\nfunction renderHeaderCell(column: any, tableStyles: TableStyles, field?: Field, showTypeIcons?: boolean) {\n  const headerProps = column.getHeaderProps();\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          <div\n            {...column.getSortByToggleProps()}\n            className={tableStyles.headerCellLabel}\n            title={column.render('Header')}\n          >\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          </div>\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, useMemo } from 'react';\nimport { DataFrame, getFieldDisplayName } from '@grafana/data';\nimport {\n  Cell,\n  Column,\n  useAbsoluteLayout,\n  useFilters,\n  UseFiltersState,\n  useResizeColumns,\n  UseResizeColumnsState,\n  useSortBy,\n  UseSortByState,\n  useTable,\n} from 'react-table';\nimport { FixedSizeList } from 'react-window';\nimport { getColumns, sortCaseInsensitive, sortNumber } from './utils';\nimport {\n  TableColumnResizeActionCallback,\n  TableFilterActionCallback,\n  FooterItem,\n  TableSortByActionCallback,\n  TableSortByFieldState,\n} from './types';\nimport { getTableStyles } from './styles';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { TableCell } from './TableCell';\nimport { useStyles2 } from '../../themes';\nimport { FooterRow } from './FooterRow';\nimport { HeaderRow } from './HeaderRow';\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}\n\ninterface ReactTableInternalState extends UseResizeColumnsState<{}>, UseSortByState<{}>, UseFiltersState<{}> {}\n\nfunction useTableStateReducer({ onColumnResize, onSortByChange, data }: Props) {\n  return useCallback(\n    (newState: ReactTableInternalState, 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<ReactTableInternalState> {\n  const state: Partial<ReactTableInternalState> = {};\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  } = 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(() => getColumns(data, width, columnMinWidth, footerValues), [\n    data,\n    width,\n    columnMinWidth,\n    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      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 { getTableProps, headerGroups, rows, prepareRow, totalColumnsWidth, footerGroups } = useTable(\n    options,\n    useFilters,\n    useSortBy,\n    useAbsoluteLayout,\n    useResizeColumns\n  );\n\n  const RenderRow = React.useCallback(\n    ({ index: rowIndex, style }) => {\n      const row = rows[rowIndex];\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, prepareRow, rows, tableStyles]\n  );\n\n  const listHeight = height - (headerHeight + footerHeight);\n\n  return (\n    <div {...getTableProps()} className={tableStyles.table} aria-label={ariaLabel} role=\"table\">\n      <CustomScrollbar hideVerticalTrack={true}>\n        <div style={{ width: totalColumnsWidth ? `${totalColumnsWidth}px` : '100%' }}>\n          {!noHeader && <HeaderRow data={data} headerGroups={headerGroups} showTypeIcons={showTypeIcons} />}\n          {rows.length > 0 ? (\n            <FixedSizeList\n              height={listHeight}\n              itemCount={rows.length}\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              footerValues={footerValues}\n              footerGroups={footerGroups}\n              totalColumnsWidth={totalColumnsWidth}\n            />\n          )}\n        </div>\n      </CustomScrollbar>\n    </div>\n  );\n});\n\nTable.displayName = 'Table';\n","import React, { HTMLProps } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\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 React from 'react';\nimport { debounce } from 'lodash';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme, DataFrame, CSVConfig, readCSV } from '@grafana/data';\nimport { Icon } from '../Icon/Icon';\nimport { Themeable } from '../../types/theme';\nimport { TextArea } from '../TextArea/TextArea';\nimport { stylesFactory, withTheme } from '../../themes';\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} &nbsp;\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 React, { FC, HTMLAttributes, ReactNode } from 'react';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\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 React, { PureComponent } from 'react';\nimport $ from 'jquery';\nimport {\n  DisplayValue,\n  formattedValueToString,\n  FieldConfig,\n  ThresholdsMode,\n  GAUGE_DEFAULT_MAXIMUM,\n  GAUGE_DEFAULT_MINIMUM,\n  getActiveThreshold,\n  Threshold,\n  getColorForTheme,\n  FieldColorModeId,\n  FALLBACK_COLOR,\n  TextDisplayOptions,\n} from '@grafana/data';\nimport { Themeable } from '../../types';\nimport { calculateFontSize } from '../../utils/measureText';\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?: TextDisplayOptions;\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: {\n        mode: ThresholdsMode.Absolute,\n        steps: [\n          { value: -Infinity, color: 'green' },\n          { value: 80, color: 'red' },\n        ],\n      },\n    },\n  };\n\n  componentDidMount() {\n    this.draw();\n  }\n\n  componentDidUpdate() {\n    this.draw();\n  }\n\n  getFormattedThresholds(decimals: number): Threshold[] {\n    const { field, theme, value } = this.props;\n\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 ?? Gauge.defaultProps.field?.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    formatted.push({ value: +min.toFixed(decimals), color: getColorForTheme(first.color, theme) });\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: getColorForTheme(prev!.color, theme) });\n      if (step === last) {\n        break;\n      }\n    }\n    formatted.push({ value: +max.toFixed(decimals), color: getColorForTheme(last.color, theme) });\n    return formatted;\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: this.getFormattedThresholds(decimals),\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\ninterface GaugeAutoProps {\n  titleFontSize: number;\n  gaugeHeight: number;\n  showLabel: boolean;\n}\n\nfunction 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","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 React, { useState, HTMLAttributes, useMemo, useRef, useLayoutEffect } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useStyles2 } from '../../themes';\nimport { getTooltipContainerStyles } from '../../themes/mixins';\nimport useWindowSize from 'react-use/lib/useWindowSize';\nimport { Dimensions2D, GrafanaTheme2 } from '@grafana/data';\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}\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  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: tW,\n              height: tH,\n            });\n          }\n        }\n      }),\n    [tooltipMeasurement]\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: '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","import React from 'react';\nimport { css } from '@emotion/css';\nimport { Portal } from '../Portal/Portal';\nimport { Dimensions, TimeZone } from '@grafana/data';\nimport { FlotPosition } from '../Graph/types';\nimport { VizTooltipContainer } from './VizTooltipContainer';\nimport { useStyles } from '../../themes';\nimport { TooltipDisplayMode } from '@grafana/schema';\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 React, { CSSProperties } from 'react';\nimport { useTheme2 } from '../../themes';\nimport { fieldColorModeRegistry } from '@grafana/data';\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 React from 'react';\nimport { GrafanaTheme2, GraphSeriesValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { SeriesIcon } from '../VizLegend/SeriesIcon';\nimport { useStyles2 } from '../../themes';\n\n/**\n * @public\n */\nexport interface SeriesTableRowProps {\n  color?: string;\n  label?: string;\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 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 React from 'react';\nimport {\n  getValueFromDimension,\n  getColumnFromDimension,\n  formattedValueToString,\n  getFieldDisplayName,\n} from '@grafana/data';\nimport { SeriesTable } from '../../VizTooltip';\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 {\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 <= 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';\nimport { SeriesTable } from '../../VizTooltip';\nimport { GraphTooltipContentProps } from './types';\nimport { getMultiSeriesGraphHoverInfo } from '../utils';\nimport { FlotPosition } from '../types';\nimport { getValueFromDimension } from '@grafana/data';\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';\nimport { VizTooltipContentProps } from '../../VizTooltip';\nimport { SingleModeGraphTooltip } from './SingleModeGraphTooltip';\nimport { MultiModeGraphTooltip } from './MultiModeGraphTooltip';\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","import React, { useRef, useState, useLayoutEffect } from 'react';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useClickAway } from 'react-use';\nimport { Portal } from '../Portal/Portal';\nimport { Menu } from '../Menu/Menu';\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  /** 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, 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      setFocusedItem(0);\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 from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '../../themes';\nimport { MenuItemProps } from './MenuItem';\nimport { uniqueId } from 'lodash';\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 React from 'react';\nimport { ContextMenu, ContextMenuProps } from '../ContextMenu/ContextMenu';\nimport { GraphDimensions } from './GraphTooltip/types';\nimport {\n  FlotDataPoint,\n  getValueFromDimension,\n  Dimensions,\n  dateTimeFormat,\n  TimeZone,\n  FormattedValue,\n} from '@grafana/data';\nimport { useTheme } from '../../themes';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { FormattedValueDisplay } from '../FormattedValueDisplay/FormattedValueDisplay';\nimport { SeriesIcon } from '../VizLegend/SeriesIcon';\nimport { css } from '@emotion/css';\nimport { MenuGroup, MenuGroupProps } from '../Menu/MenuGroup';\nimport { MenuItem } from '../Menu/MenuItem';\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","// Libraries\nimport $ from 'jquery';\nimport React, { PureComponent } from 'react';\nimport { uniqBy } from 'lodash';\n// Types\nimport { TooltipDisplayMode } from '@grafana/schema';\nimport { TimeRange, GraphSeriesXY, TimeZone, createDimension } from '@grafana/data';\nimport { FlotPosition, FlotItem } from './types';\nimport { VizTooltipProps, VizTooltipContentProps, ActiveDimensions, VizTooltip } from '../VizTooltip';\nimport { GraphTooltip } from './GraphTooltip/GraphTooltip';\nimport { GraphContextMenu, GraphContextMenuProps, ContextDimensions } from './GraphContextMenu';\nimport { GraphDimensions } from './GraphTooltip/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\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 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 from 'react';\nimport { css, cx } from '@emotion/css';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { useStyles } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\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 React, { CSSProperties, ReactNode } from 'react';\nimport { css } from '@emotion/css';\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\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;\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';\nimport { LoadingIndicator } from './LoadingIndicator';\nimport { ErrorIndicator } from './ErrorIndicator';\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, { useCallback } from 'react';\nimport { SeriesColorPicker } from '../ColorPicker/ColorPicker';\nimport { usePanelContext } from '../PanelChrome';\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 React, { useCallback } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { VizLegendSeriesIcon } from './VizLegendSeriesIcon';\nimport { VizLegendItem } from './types';\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { styleMixins } from '../../themes';\nimport { formattedValueToString, GrafanaTheme2 } from '@grafana/data';\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: left;\n    `,\n    yAxisLabel: css`\n      color: ${theme.colors.text.secondary};\n    `,\n  };\n};\n","import React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { VizLegendTableProps } from './types';\nimport { Icon } from '../Icon/Icon';\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { orderBy } from 'lodash';\nimport { LegendTableItem } from './VizLegendTableItem';\nimport { DisplayValue, GrafanaTheme2 } from '@grafana/data';\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, 2, 0.25, 1)};\n    font-size: ${theme.typography.bodySmall.fontSize};\n    text-align: left;\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';\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 from 'react';\nimport { InlineList } from '../List/InlineList';\nimport { css } from '@emotion/css';\nimport { DisplayValue, formattedValueToString } from '@grafana/data';\nimport { capitalize } from 'lodash';\nimport { useStyles } from '../../themes/ThemeContext';\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 React, { useCallback } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { VizLegendSeriesIcon } from './VizLegendSeriesIcon';\nimport { VizLegendItem } from './types';\nimport { VizLegendStatsList } from './VizLegendStatsList';\nimport { useStyles } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\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 React from 'react';\nimport { VizLegendBaseProps, VizLegendItem } from './types';\nimport { InlineList } from '../List/InlineList';\nimport { List } from '../List/List';\nimport { css, cx } from '@emotion/css';\nimport { useStyles } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { VizLegendListItem } from './VizLegendListItem';\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 React, { useCallback } from 'react';\nimport { LegendProps, SeriesVisibilityChangeBehavior, VizLegendItem } from './types';\nimport { LegendDisplayMode } from '@grafana/schema';\nimport { VizLegendTable } from './VizLegendTable';\nimport { VizLegendList } from './VizLegendList';\nimport { DataHoverClearEvent, DataHoverEvent } from '@grafana/data';\nimport { SeriesVisibilityChangeMode, usePanelContext } from '../PanelChrome';\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 React from 'react';\nimport { css } from '@emotion/css';\nimport { GraphSeriesValue } from '@grafana/data';\n\nimport { Graph, GraphProps } from './Graph';\nimport { VizLegendItem } from '../VizLegend/types';\nimport { LegendDisplayMode, LegendPlacement } from '@grafana/schema';\nimport { VizLegend } from '../VizLegend/VizLegend';\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { stylesFactory } from '../../themes';\n\nexport interface GraphWithLegendProps extends GraphProps {\n  legendDisplayMode: LegendDisplayMode;\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    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      {legendDisplayMode !== LegendDisplayMode.Hidden && (\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';\nimport { VizOrientation } from '@grafana/data';\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  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 { renderValue, height, width, itemSpacing, getAlignmentFactors, autoGrid, orientation, minVizHeight } = this\n      .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: minVizHeight ? 'hidden 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 = width / values.length - itemSpacing + itemSpacing / values.length;\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 React from 'react';\nimport { GraphSeriesXY } from '@grafana/data';\nimport { difference, isEqual } from 'lodash';\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 React, { FunctionComponent, useState } from 'react';\nimport { css, cx } from '@emotion/css';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\nimport { GrafanaTheme2 } from '@grafana/data';\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, 0.5, 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, 0.5, 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-up' : 'angle-down'} />}\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 React, { FC, ReactNode, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { useStyles2 } from '../../themes';\nimport { Icon } from '..';\nimport { GrafanaTheme2 } from '@grafana/data';\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}\n\nexport const CollapsableSection: FC<Props> = ({ label, isOpen, onToggle, children }) => {\n  const [open, toggleOpen] = useState<boolean>(isOpen);\n  const styles = useStyles2(collapsableSectionStyles);\n  const headerStyle = open ? styles.header : styles.headerCollapsed;\n  const tooltip = `Click to ${open ? 'collapse' : 'expand'}`;\n  const onClick = () => {\n    onToggle?.(!open);\n    toggleOpen(!open);\n  };\n\n  return (\n    <div>\n      <div onClick={onClick} className={headerStyle} title={tooltip}>\n        {label}\n        <Icon name={open ? 'angle-down' : 'angle-right'} size=\"xl\" className={styles.icon} />\n      </div>\n      {open && <div className={styles.content}>{children}</div>}\n    </div>\n  );\n};\n\nconst collapsableSectionStyles = (theme: GrafanaTheme2) => {\n  const header = css({\n    display: 'flex',\n    justifyContent: 'space-between',\n    fontSize: theme.typography.size.lg,\n    padding: `${theme.spacing(0.5)} 0`,\n    cursor: 'pointer',\n  });\n  const headerCollapsed = css(header, {\n    borderBottom: `1px solid ${theme.colors.border.weak}`,\n  });\n  const icon = css({\n    color: theme.colors.text.secondary,\n  });\n  const content = css({\n    padding: `${theme.spacing(2)} 0`,\n  });\n\n  return { header, headerCollapsed, icon, content };\n};\n","import React, { FunctionComponent } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme, Labels } from '@grafana/data';\n\nimport { stylesFactory } from '../../themes';\nimport { Themeable } from '../../types/theme';\nimport { withTheme } from '../../themes/ThemeContext';\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 {\n  LogRowModel,\n  toDataFrame,\n  Field,\n  FieldCache,\n  LogsSortOrder,\n  DataQueryResponse,\n  DataQueryError,\n} from '@grafana/data';\nimport React, { useState, useEffect } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\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 { Field, getParser, LinkModel, LogRowModel } from '@grafana/data';\nimport memoizeOne from 'memoize-one';\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 (\n      row.dataFrame.fields\n        .map((field, index) => ({ ...field, index }))\n        // Remove Id which we use for react key and entry field which we are showing as the log message. Also remove hidden fields.\n        .filter(\n          (field, index) => !('id' === field.name || row.entryFieldIndex === index || field.config.custom?.hidden)\n        )\n        // Filter out fields without values. For example in elastic the fields are parsed from the document which can\n        // have different structure per row and so the dataframe is pretty sparse.\n        .filter((field) => {\n          const value = field.values.get(row.rowIndex);\n          // Not sure exactly what will be the empty value here. And we want to keep 0 as some values can be non\n          // string.\n          return value !== null && value !== undefined;\n        })\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);\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","import React, { FunctionComponent } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\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 React, { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { LogLabelStatsModel, GrafanaTheme } from '@grafana/data';\n\nimport { Themeable } from '../../types/theme';\nimport { stylesFactory } from '../../themes';\nimport { withTheme } from '../../themes/index';\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      column-span: 2;\n      background: inherit;\n      color: ${theme.colors.text};\n      word-break: break-all;\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      <td 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      </td>\n    );\n  }\n}\n\nexport const LogLabelStats = withTheme(UnThemedLogLabelStats);\nLogLabelStats.displayName = 'LogLabelStats';\n","import { Field, LinkModel } from '@grafana/data';\nimport React from 'react';\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 React, { PureComponent } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { Field, LinkModel, LogLabelStatsModel, GrafanaTheme2 } from '@grafana/data';\n\nimport { Themeable2 } from '../../types/theme';\nimport { withTheme2 } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\nimport { LogLabelStats } from './LogLabelStats';\nimport { IconButton } from '../IconButton/IconButton';\nimport { DataLinkButton } from '../DataLinks/DataLinkButton';\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}\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    wrapLine: css`\n      label: wrapLine;\n      white-space: pre-wrap;\n    `,\n  };\n};\n\nclass UnThemedLogDetailsRow extends PureComponent<Props, State> {\n  state: State = {\n    showFieldsStats: false,\n    fieldCount: 0,\n    fieldStats: null,\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  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 } = 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 className={cx(styles.wordBreakAll, wrapLogMessage && styles.wrapLine)}>\n          {parsedValue}\n          {links?.map((link) => (\n            <span key={link.title}>\n              &nbsp;\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 React, { PureComponent } from 'react';\nimport memoizeOne from 'memoize-one';\nimport { css, cx } from '@emotion/css';\nimport {\n  calculateFieldStats,\n  calculateLogsLabelStats,\n  calculateStats,\n  Field,\n  getParser,\n  LinkModel,\n  LogRowModel,\n  GrafanaTheme2,\n} from '@grafana/data';\n\nimport { Themeable2 } from '../../types/theme';\nimport { withTheme2 } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\nimport { getAllFields } from './logParser';\n\n//Components\nimport { LogDetailsRow } from './LogDetailsRow';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\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, { PureComponent } from 'react';\nimport { cx, css } from '@emotion/css';\nimport { LogRowModel, Field, LinkModel } from '@grafana/data';\n\nimport { Themeable } from '../../types/theme';\nimport { withTheme } from '../../themes/index';\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 = cx(\n      wrapLogMessage &&\n        css`\n          white-space: pre-wrap;\n        `\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 React, { PureComponent } from 'react';\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';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { cx, css } from '@emotion/css';\n\nimport {\n  LogRowContextRows,\n  LogRowContextQueryErrors,\n  HasMoreContextRows,\n  LogRowContextProvider,\n  RowContextOptions,\n} from './LogRowContextProvider';\nimport { Themeable2 } from '../../types/theme';\nimport { styleMixins, withTheme2 } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\nimport { LogDetails } from './LogDetails';\nimport { LogRowMessageDetectedFields } from './LogRowMessageDetectedFields';\nimport { LogRowMessage } from './LogRowMessage';\nimport { LogLabels } from './LogLabels';\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      vertical-align: top;\n      margin-top: -${theme.spacing(0.5)};\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 React, { PureComponent } from 'react';\nimport memoizeOne from 'memoize-one';\nimport { TimeZone, LogsDedupStrategy, LogRowModel, Field, LinkModel, LogsSortOrder, sortLogRows } from '@grafana/data';\n\nimport { Themeable2 } from '../../types/theme';\nimport { withTheme2 } from '../../themes/index';\nimport { getLogRowStyles } from './getLogRowStyles';\n\n//Components\nimport { LogRow } from './LogRow';\nimport { RowContextOptions } from './LogRowContextProvider';\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 { Field, GrafanaTheme, LinkModel } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport React from 'react';\nimport { useStyles } from '../../themes';\nimport { Icon } from '../Icon/Icon';\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 React, { FC } from 'react';\nimport { css, cx } from '@emotion/css';\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 { OptionsWithTextFormatting } from '@grafana/schema';\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';\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 React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { GrafanaTheme2 } from '@grafana/data';\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 React, { useState } from 'react';\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}\n\nexport const WithContextMenu: React.FC<WithContextMenuProps> = ({ children, renderMenuItems }) => {\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        />\n      )}\n    </>\n  );\n};\n","import React from 'react';\nimport { FieldConfig, LinkModel } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { css } from '@emotion/css';\nimport { WithContextMenu } from '../ContextMenu/WithContextMenu';\nimport { linkModelToContextMenuItems } from '../../utils/dataLinks';\nimport { MenuGroup, MenuItemsGroup } from '../Menu/MenuGroup';\nimport { MenuItem } from '../Menu/MenuItem';\n\ninterface DataLinksContextMenuProps {\n  children: (props: DataLinksContextMenuApi) => JSX.Element;\n  links: () => LinkModel[];\n  config: FieldConfig;\n}\n\nexport interface DataLinksContextMenuApi {\n  openMenu?: React.MouseEventHandler<HTMLOrSVGElement>;\n  targetClassName?: string;\n}\n\nexport const DataLinksContextMenu: React.FC<DataLinksContextMenuProps> = ({ children, links, config }) => {\n  const linksCounter = config.links!.length;\n  const itemsGroup: MenuItemsGroup[] = [{ items: linkModelToContextMenuItems(links), label: 'Data links' }];\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={{ display: 'flex' }}\n        aria-label={selectors.components.DataLinksContextMenu.singleLink}\n      >\n        {children({})}\n      </a>\n    );\n  }\n};\n","import React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon } from '../Icon/Icon';\nimport { Alert, AlertVariant } from '../Alert/Alert';\nimport { stylesFactory, useStyles2 } from '../../themes';\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 React, { HTMLAttributes } from 'react';\nimport { Icon } from '../Icon/Icon';\nimport { useTheme } from '../../themes/ThemeContext';\nimport { stylesFactory } from '../../themes/stylesFactory';\nimport { IconName } from '../../types';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { getColorForTheme, GrafanaTheme } from '@grafana/data';\nimport tinycolor from 'tinycolor2';\nimport { css, cx } from '@emotion/css';\nimport { HorizontalGroup } from '../Layout/Layout';\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 = getColorForTheme(color, theme);\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 React from 'react';\nimport { InfoBox, InfoBoxProps } from './InfoBox';\nimport { FeatureState, GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useStyles } from '../../themes';\nimport { Badge, BadgeProps } from '../Badge/Badge';\nimport { css } from '@emotion/css';\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","import React, { FunctionComponent } from 'react';\nimport { ErrorBoundaryApi } from './ErrorBoundary';\nimport { stylesFactory } from '../../themes';\nimport { css } from '@emotion/css';\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 React, { PureComponent, ReactNode, ComponentType } from 'react';\nimport { captureException } from '@sentry/browser';\nimport { Alert } from '../Alert/Alert';\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 React, { FunctionComponent, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { Tooltip, PopoverContent } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\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 React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { InlineFormLabel } from '../FormLabel/FormLabel';\nimport { PopoverContent } from '../Tooltip/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 { omit } from 'lodash';\nimport React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { FormField } from '../FormField/FormField';\nimport { Button } from '../Button/Button';\nimport { css, cx } from '@emotion/css';\nimport { PopoverContent } from '../Tooltip/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 React from 'react';\n\nimport { InlineField } from '../..';\nimport { HttpSettingsProps } from './types';\nimport { FormField } from '../FormField/FormField';\nimport { SecretFormField } from '../SecretFormField/SecretFormField';\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      basicAuthPassword: '',\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={\n            !!dataSourceConfig.basicAuthPassword ||\n            !!(dataSourceConfig.secureJsonFields && dataSourceConfig.secureJsonFields.basicAuthPassword)\n          }\n          value={password || ''}\n          inputWidth={18}\n          labelWidth={10}\n          onReset={onPasswordReset}\n          onChange={onPasswordChange}\n        />\n      </InlineField>\n    </>\n  );\n};\n","import React from 'react';\nimport { HttpSettingsBaseProps } from './types';\nimport { Switch } from '../Forms/Legacy/Switch/Switch';\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        <Switch\n          label=\"TLS Client Auth\"\n          labelClass=\"width-13\"\n          checked={dataSourceConfig.jsonData.tlsAuth || false}\n          onChange={(event) => onChange({ ...dataSourceConfig.jsonData, tlsAuth: event!.currentTarget.checked })}\n        />\n\n        <Switch\n          label=\"With CA Cert\"\n          labelClass=\"width-13\"\n          checked={dataSourceConfig.jsonData.tlsAuthWithCACert || false}\n          onChange={(event) =>\n            onChange({ ...dataSourceConfig.jsonData, tlsAuthWithCACert: event!.currentTarget.checked })\n          }\n          tooltip=\"Needed for verifying self-signed TLS Certs\"\n        />\n      </div>\n      <div className=\"gf-form-inline\">\n        <Switch\n          label=\"Skip TLS Verify\"\n          labelClass=\"width-13\"\n          checked={dataSourceConfig.jsonData.tlsSkipVerify || false}\n          onChange={(event) => onChange({ ...dataSourceConfig.jsonData, tlsSkipVerify: event!.currentTarget.checked })}\n        />\n      </div>\n      {showForwardOAuthIdentityOption && (\n        <div className=\"gf-form-inline\">\n          <Switch\n            label=\"Forward OAuth Identity\"\n            labelClass=\"width-13\"\n            checked={dataSourceConfig.jsonData.oauthPassThru || false}\n            onChange={(event) =>\n              onChange({ ...dataSourceConfig.jsonData, oauthPassThru: event!.currentTarget.checked })\n            }\n            tooltip=\"Forward the user's upstream OAuth identity to the data source (Their access token gets passed along).\"\n          />\n        </div>\n      )}\n    </>\n  );\n};\n","import React, { FunctionComponent } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { Tooltip, PopoverContent } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\nimport { useTheme } from '../../themes';\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  /** @deprecated */\n  /** This prop is deprecated and is not used anymore */\n  isFocused?: boolean;\n  /** @deprecated */\n  /** This prop is deprecated and is not used anymore */\n  isInvalid?: 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  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 placement=\"top\" content={tooltip} theme=\"info\">\n          <Icon 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 React, { FC } from 'react';\nimport { cx, css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { useTheme } from '../../themes';\nimport { InlineLabel } from './InlineLabel';\nimport { PopoverContent } from '../Tooltip/Tooltip';\nimport { FieldProps } from './Field';\nimport { getChildId } from '../../utils/reactUtils';\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 field's background transparent */\n  transparent?: boolean;\n  htmlFor?: string;\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  transparent,\n  ...htmlProps\n}) => {\n  const theme = useTheme();\n  const styles = getStyles(theme, grow);\n  const inputId = htmlFor ?? getChildId(children);\n\n  const labelElement =\n    typeof label === 'string' ? (\n      <InlineLabel width={labelWidth} tooltip={tooltip} htmlFor={inputId} transparent={transparent}>\n        {label}\n      </InlineLabel>\n    ) : (\n      label\n    );\n\n  return (\n    <div className={cx(styles.container, className)} {...htmlProps}>\n      {labelElement}\n      {React.cloneElement(children, { invalid, disabled, loading })}\n    </div>\n  );\n};\n\nInlineField.displayName = 'InlineField';\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: 0 ${theme.spacing.xs} ${theme.spacing.xs} 0;\n    `,\n  };\n};\n","import React, { ChangeEvent, MouseEvent, FC } from 'react';\nimport { Input } from '../Input/Input';\nimport { Button } from '../Button';\nimport { TextArea } from '../TextArea/TextArea';\nimport { InlineField } from '../Forms/InlineField';\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    <InlineField label={label} labelWidth={14}>\n      {hasCert ? (\n        <>\n          <Input type=\"text\" disabled value=\"configured\" width={24} />\n          <Button variant=\"secondary\" onClick={onClick} style={{ marginLeft: 4 }}>\n            Reset\n          </Button>\n        </>\n      ) : (\n        <TextArea rows={7} onChange={onChange} placeholder={placeholder} required />\n      )}\n    </InlineField>\n  );\n};\n","import React from 'react';\nimport { KeyValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { Icon } from '../Icon/Icon';\nimport { CertificationKey } from './CertificationKey';\nimport { HttpSettingsBaseProps } from './types';\nimport { FormField } from '../FormField/FormField';\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 React, { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { uniqueId } from 'lodash';\nimport { DataSourceSettings } from '@grafana/data';\nimport { Button } from '../Button';\nimport { FormField } from '../FormField/FormField';\nimport { Icon } from '../Icon/Icon';\nimport { SecretFormField } from '../SecretFormField/SecretFormField';\nimport { stylesFactory } from '../../themes';\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';\nimport { HttpSettingsBaseProps } from './types';\nimport { DataSourceSettings } from '@grafana/data';\nimport {\n  AwsAuthDataSourceSecureJsonData,\n  AwsAuthDataSourceJsonData,\n  ConnectionConfig,\n  ConnectionConfigProps,\n} from '@grafana/aws-sdk';\n\nexport const SigV4AuthSettings: React.FC<HttpSettingsBaseProps> = (props) => {\n  const { dataSourceConfig, onChange } = props;\n\n  // The @grafana/aws-sdk ConnectionConfig is designed to be rendered in a ConfigEditor,\n  // taking DataSourcePluginOptionsEditorProps as props. We therefore need to map the props accordingly.\n  const connectionConfigProps: ConnectionConfigProps<AwsAuthDataSourceJsonData, AwsAuthDataSourceSecureJsonData> = {\n    onOptionsChange: (awsDataSourceSettings) => {\n      const dataSourceSettings: DataSourceSettings<any, any> = {\n        ...dataSourceConfig,\n        jsonData: {\n          ...dataSourceConfig.jsonData,\n          sigV4AuthType: awsDataSourceSettings.jsonData.authType,\n          sigV4Profile: awsDataSourceSettings.jsonData.profile,\n          sigV4AssumeRoleArn: awsDataSourceSettings.jsonData.assumeRoleArn,\n          sigV4ExternalId: awsDataSourceSettings.jsonData.externalId,\n          sigV4Region: awsDataSourceSettings.jsonData.defaultRegion,\n          sigV4Endpoint: awsDataSourceSettings.jsonData.endpoint,\n        },\n        secureJsonFields: {\n          sigV4AccessKey: awsDataSourceSettings.secureJsonFields?.accessKey,\n          sigV4SecretKey: awsDataSourceSettings.secureJsonFields?.secretKey,\n        },\n        secureJsonData: {\n          sigV4AccessKey: awsDataSourceSettings.secureJsonData?.accessKey,\n          sigV4SecretKey: awsDataSourceSettings.secureJsonData?.secretKey,\n        },\n      };\n      onChange(dataSourceSettings);\n    },\n    options: {\n      ...dataSourceConfig,\n      jsonData: {\n        ...dataSourceConfig.jsonData,\n        authType: dataSourceConfig.jsonData.sigV4AuthType,\n        profile: dataSourceConfig.jsonData.sigV4Profile,\n        assumeRoleArn: dataSourceConfig.jsonData.sigV4AssumeRoleArn,\n        externalId: dataSourceConfig.jsonData.sigV4ExternalId,\n        defaultRegion: dataSourceConfig.jsonData.sigV4Region,\n        endpoint: dataSourceConfig.jsonData.sigV4Endpoint,\n      },\n      secureJsonFields: {\n        accessKey: dataSourceConfig.secureJsonFields?.sigV4AccessKey,\n        secretKey: dataSourceConfig.secureJsonFields?.sigV4SecretKey,\n      },\n      secureJsonData: {\n        accessKey: dataSourceConfig.secureJsonData?.sigV4AccessKey,\n        secretKey: dataSourceConfig.secureJsonData?.sigV4SecretKey,\n      },\n    },\n  };\n\n  return (\n    <>\n      <div className=\"gf-form\">\n        <h6>SigV4 Auth Details</h6>\n      </div>\n      <ConnectionConfig {...connectionConfigProps} skipHeader skipEndpoint></ConnectionConfig>\n    </>\n  );\n};\n","import React, { useState, useCallback } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { DataSourceSettings, SelectableValue } from '@grafana/data';\nimport { BasicAuthSettings } from './BasicAuthSettings';\nimport { HttpProxySettings } from './HttpProxySettings';\nimport { TLSAuthSettings } from './TLSAuthSettings';\nimport { CustomHeadersSettings } from './CustomHeadersSettings';\nimport { Select } from '../Select/Select';\nimport { Input } from '../Forms/Legacy/Input/Input';\nimport { Switch } from '../Forms/Legacy/Switch/Switch';\nimport { Icon } from '../Icon/Icon';\nimport { FormField } from '../FormField/FormField';\nimport { InlineFormLabel } from '../FormLabel/FormLabel';\nimport { TagsInput } from '../TagsInput/TagsInput';\nimport { SigV4AuthSettings } from './SigV4AuthSettings';\nimport { useTheme } from '../../themes';\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        &nbsp;<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\nexport const DataSourceHttpSettings: React.FC<HttpSettingsProps> = (props) => {\n  const {\n    defaultUrl,\n    dataSourceConfig,\n    onChange,\n    showAccessOptions,\n    sigV4AuthToggleEnabled,\n    showForwardOAuthIdentityOption,\n    azureAuthSettings,\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      menuShouldPortal\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      onChange={(event) => onSettingsChange({ url: event.currentTarget.value })}\n    />\n  );\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&nbsp;\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            <Switch\n              label=\"Basic auth\"\n              labelClass=\"width-13\"\n              checked={dataSourceConfig.basicAuth}\n              onChange={(event) => {\n                onSettingsChange({ basicAuth: event!.currentTarget.checked });\n              }}\n            />\n            <Switch\n              label=\"With Credentials\"\n              labelClass=\"width-13\"\n              checked={dataSourceConfig.withCredentials}\n              onChange={(event) => {\n                onSettingsChange({ withCredentials: event!.currentTarget.checked });\n              }}\n              tooltip=\"Whether credentials such as cookies or auth headers should be sent with cross-site requests.\"\n            />\n          </div>\n\n          {azureAuthSettings?.azureAuthEnabled && (\n            <div className=\"gf-form-inline\">\n              <Switch\n                label=\"Azure Authentication\"\n                labelClass=\"width-13\"\n                checked={dataSourceConfig.jsonData.azureAuth || false}\n                onChange={(event) => {\n                  onSettingsChange({\n                    jsonData: { ...dataSourceConfig.jsonData, azureAuth: event!.currentTarget.checked },\n                  });\n                }}\n                tooltip=\"Use Azure authentication for Azure endpoint.\"\n              />\n            </div>\n          )}\n\n          {sigV4AuthToggleEnabled && (\n            <div className=\"gf-form-inline\">\n              <Switch\n                label=\"SigV4 auth\"\n                labelClass=\"width-13\"\n                checked={dataSourceConfig.jsonData.sigV4Auth || false}\n                onChange={(event) => {\n                  onSettingsChange({\n                    jsonData: { ...dataSourceConfig.jsonData, sigV4Auth: event!.currentTarget.checked },\n                  });\n                }}\n              />\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?.azureAuthEnabled &&\n          azureAuthSettings?.azureSettingsUI &&\n          dataSourceConfig.jsonData.azureAuth && (\n            <azureAuthSettings.azureSettingsUI dataSourceConfig={dataSourceConfig} onChange={onChange} />\n          )}\n\n        {dataSourceConfig.jsonData.sigV4Auth && sigV4AuthToggleEnabled && <SigV4AuthSettings {...props} />}\n\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, { FC, HTMLProps, ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useStyles } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\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 { DataSourceInstanceSettings, DataSourceJsonData, DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport React, { useMemo } from 'react';\nimport { Switch } from '../Forms/Legacy/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            <Switch\n              label=\"Manage alerts via Alerting UI\"\n              labelClass=\"width-13\"\n              checked={options.jsonData.manageAlerts !== false}\n              onChange={(event) =>\n                onOptionsChange({\n                  ...options,\n                  jsonData: { ...options.jsonData, manageAlerts: event!.currentTarget.checked },\n                })\n              }\n            />\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              menuShouldPortal\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 { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React, { HTMLProps } from 'react';\nimport { cx } from '@emotion/css';\nimport { isObject } from 'lodash';\nimport { SelectableValue } from '@grafana/data';\nimport { SegmentSelect, useExpandableLabel, SegmentProps } from './';\nimport { getSegmentStyles } from './styles';\nimport { InlineLabel } from '../Forms/InlineLabel';\nimport { useStyles } from '../../themes';\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';\nimport { SelectableValue } from '@grafana/data';\nimport { AsyncSelect, Select } from '../Select/Select';\nimport { useTheme2 } from '../../themes/ThemeContext';\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        menuShouldPortal\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 React, { HTMLProps } from 'react';\nimport { cx } from '@emotion/css';\nimport { isObject } from 'lodash';\nimport { SegmentSelect } from './SegmentSelect';\nimport { SelectableValue } from '@grafana/data';\nimport { useExpandableLabel, SegmentProps } from '.';\nimport { useAsyncFn } from 'react-use';\nimport { AsyncState } from 'react-use/lib/useAsync';\nimport { getSegmentStyles } from './styles';\nimport { InlineLabel } from '../Forms/InlineLabel';\nimport { useStyles } from '../../themes';\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 React, { HTMLProps, useRef, useState } from 'react';\nimport { cx, css } from '@emotion/css';\nimport useClickAway from 'react-use/lib/useClickAway';\nimport { measureText } from '../../utils/measureText';\nimport { useExpandableLabel, SegmentProps } from '.';\nimport { getSegmentStyles } from './styles';\nimport { InlineLabel } from '../Forms/InlineLabel';\nimport { useStyles } from '../../themes';\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 React from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '../../themes';\nimport { InlineLabel } from '../Forms/InlineLabel';\nimport { InlineFieldRow } from '../Forms/InlineFieldRow';\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 React, { CSSProperties, FC, ReactNode, useState, useEffect } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport RcDrawer from 'rc-drawer';\nimport { css } from '@emotion/css';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { CustomScrollbar } from '../CustomScrollbar/CustomScrollbar';\nimport { IconButton } from '../IconButton/IconButton';\nimport { stylesFactory, useTheme2 } from '../../themes';\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\n  /** Set to true if the component rendered within in drawer content has its own scroll */\n  scrollableContent?: boolean;\n\n  /** Callback for closing the drawer */\n  onClose: () => void;\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, scrollableContent: boolean) => {\n  return {\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      z-index: 1;\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    titleSpacing: css`\n      margin-bottom: ${theme.spacing(2)};\n    `,\n    content: css`\n      padding: ${theme.spacing(2)};\n      flex-grow: 1;\n      overflow: ${!scrollableContent ? 'hidden' : 'auto'};\n      z-index: 0;\n      height: 100%;\n    `,\n  };\n});\n\nexport const Drawer: FC<Props> = ({\n  children,\n  inline = false,\n  onClose,\n  closeOnMaskClick = true,\n  scrollableContent = false,\n  title,\n  subtitle,\n  width = '40%',\n  expandable = false,\n}) => {\n  const theme = useTheme2();\n  const drawerStyles = getStyles(theme, scrollableContent);\n  const [isExpanded, setIsExpanded] = useState(false);\n  const [isOpen, setIsOpen] = useState(false);\n  const currentWidth = isExpanded ? '100%' : width;\n\n  // RcDrawer v4.x needs to be mounted in advance for animations to play.\n  useEffect(() => {\n    setIsOpen(true);\n  }, []);\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      {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                surface=\"header\"\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                surface=\"header\"\n                aria-label={selectors.components.Drawer.General.contract}\n              />\n            )}\n            <IconButton\n              name=\"times\"\n              size=\"xl\"\n              onClick={onClose}\n              surface=\"header\"\n              aria-label={selectors.components.Drawer.General.close}\n            />\n          </div>\n          <div className={drawerStyles.titleWrapper}>\n            <h3>{title}</h3>\n            {typeof subtitle === 'string' && <div className=\"muted\">{subtitle}</div>}\n            {typeof subtitle !== 'string' && subtitle}\n          </div>\n        </div>\n      )}\n      {typeof title !== 'string' && title}\n      <div className={drawerStyles.content}>\n        {!scrollableContent ? children : <CustomScrollbar>{children}</CustomScrollbar>}\n      </div>\n    </RcDrawer>\n  );\n};\n","import { stylesFactory } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css as cssCore } from '@emotion/react';\nimport { css } from '@emotion/css';\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      .rc-slider-dot-active {\n        ${hoverSyle};\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 React, { useState, useCallback, ChangeEvent, FunctionComponent, FocusEvent } from 'react';\nimport SliderComponent from 'rc-slider';\n\nimport { cx } from '@emotion/css';\nimport { Global } from '@emotion/react';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { getStyles } from './styles';\nimport { SliderProps } from './types';\nimport { Input } from '../Input/Input';\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 React, { FunctionComponent } from 'react';\nimport { Range as RangeComponent, createSliderWithTooltip } from 'rc-slider';\nimport { cx } from '@emotion/css';\nimport { Global } from '@emotion/react';\nimport { useTheme2 } from '../../themes/ThemeContext';\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 React, { useCallback } from 'react';\nimport { StandardEditorProps, StringFieldConfigSettings } from '@grafana/data';\nimport { Input } from '../Input/Input';\nimport { TextArea } from '../TextArea/TextArea';\n\nexport const StringValueEditor: React.FC<StandardEditorProps<string, StringFieldConfigSettings>> = ({\n  value,\n  onChange,\n  item,\n}) => {\n  const Component = item.settings?.useTextarea ? TextArea : Input;\n\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    />\n  );\n};\n","import React from 'react';\nimport { FieldConfigEditorProps, StringFieldConfigSettings, GrafanaTheme } from '@grafana/data';\nimport { Input } from '../Input/Input';\nimport { Icon } from '../Icon/Icon';\nimport { stylesFactory, getTheme } from '../../themes';\nimport { css } from '@emotion/css';\nimport { Button } from '../Button';\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 React, { useCallback } from 'react';\nimport {\n  FieldConfigEditorProps,\n  toIntegerOrUndefined,\n  toFloatOrUndefined,\n  NumberFieldConfigSettings,\n} from '@grafana/data';\nimport { Input } from '../Input/Input';\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    (e: React.SyntheticEvent) => {\n      if (e.hasOwnProperty('key')) {\n        // handling keyboard event\n        const evt = e as React.KeyboardEvent<HTMLInputElement>;\n        if (evt.key === 'Enter') {\n          onChange(\n            settings?.integer\n              ? toIntegerOrUndefined(evt.currentTarget.value)\n              : toFloatOrUndefined(evt.currentTarget.value)\n          );\n        }\n      } else {\n        // handling form event\n        const evt = e as React.FormEvent<HTMLInputElement>;\n        onChange(\n          settings?.integer\n            ? toIntegerOrUndefined(evt.currentTarget.value)\n            : toFloatOrUndefined(evt.currentTarget.value)\n        );\n      }\n    },\n    [onChange, settings?.integer]\n  );\n\n  const defaultValue = value === undefined || value === null || isNaN(value) ? '' : value.toString();\n  return (\n    <Input\n      defaultValue={defaultValue}\n      min={settings?.min}\n      max={settings?.max}\n      type=\"number\"\n      step={settings?.step}\n      placeholder={settings?.placeholder}\n      onBlur={onValueChange}\n      onKeyDown={onValueChange}\n    />\n  );\n};\n","import React from 'react';\nimport { FieldConfigEditorProps, SliderFieldConfigSettings } from '@grafana/data';\nimport { Slider } from '../Slider/Slider';\n\nexport const SliderValueEditor: React.FC<FieldConfigEditorProps<number, SliderFieldConfigSettings>> = ({\n  value,\n  onChange,\n  item,\n}) => {\n  const { settings } = item;\n  const initialValue = typeof value === 'number' ? value : typeof value === 'string' ? +value : 0;\n\n  return (\n    <Slider\n      value={initialValue}\n      min={settings?.min || 0}\n      max={settings?.max || 100}\n      step={settings?.step}\n      marks={settings?.marks}\n      included={settings?.included}\n      onChange={onChange}\n      ariaLabelForHandle={settings?.ariaLabelForHandle}\n    />\n  );\n};\n","import React from 'react';\nimport { FieldConfigEditorProps, SelectFieldConfigSettings, SelectableValue } from '@grafana/data';\nimport { Select } from '../Select/Select';\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        menuShouldPortal\n        isLoading={isLoading}\n        value={current}\n        defaultValue={value}\n        allowCustomValue={settings?.allowCustomValue}\n        onChange={(e) => onChange(e.value)}\n        options={options}\n      />\n    );\n  }\n}\n","import React from 'react';\nimport { FieldConfigEditorProps, SelectFieldConfigSettings, SelectableValue } from '@grafana/data';\nimport { MultiSelect } from '../Select/Select';\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        menuShouldPortal\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, { HTMLProps, useEffect } from 'react';\nimport { useForm, Mode, DeepPartial, UnpackNestedValue, SubmitHandler } from 'react-hook-form';\nimport { FormAPI } from '../../types';\nimport { css } from '@emotion/css';\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, { memo, useCallback } from 'react';\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { FieldMatcherID, fieldMatchers, SelectableValue } from '@grafana/data';\nimport { Select } from '../Select/Select';\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 menuShouldPortal 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';\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { FieldMatcherID, fieldMatchers } from '@grafana/data';\nimport { Input } from '../Input/Input';\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, useMemo, useCallback } from 'react';\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { FieldMatcherID, fieldMatchers, SelectableValue, FieldType, DataFrame } from '@grafana/data';\nimport { Select } from '../Select/Select';\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} menuShouldPortal />;\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';\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { FieldMatcherID, fieldMatchers, SelectableValue, DataFrame } from '@grafana/data';\nimport { Select } from '../Select/Select';\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 menuShouldPortal 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 React, { memo, useCallback } from 'react';\nimport { MatcherUIProps, FieldMatcherUIRegistryItem } from './types';\nimport { FieldMatcherID, fieldMatchers, SelectableValue, ByNamesMatcherOptions } from '@grafana/data';\nimport { MultiSelect } from '../Select/Select';\nimport { Input } from '../Input/Input';\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 menuShouldPortal 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 { Registry } from '@grafana/data';\nimport { FieldMatcherUIRegistryItem } from './types';\nimport { fieldNameMatcherItem } from './FieldNameMatcherEditor';\nimport { fieldNameByRegexMatcherItem } from './FieldNameByRegexMatcherEditor';\nimport { fieldTypeMatcherItem } from './FieldTypeMatcherEditor';\nimport { fieldsByFrameRefIdItem } from './FieldsByFrameRefIdMatcher';\nimport { fieldNamesMatcherItem } from './FieldNamesMatcherEditor';\n\nexport const fieldMatchersUI = new Registry<FieldMatcherUIRegistryItem<any>>(() => [\n  fieldNameMatcherItem,\n  fieldNameByRegexMatcherItem,\n  fieldTypeMatcherItem,\n  fieldsByFrameRefIdItem,\n  fieldNamesMatcherItem,\n]);\n","import React, { ReactNode } from 'react';\nimport { useTheme, stylesFactory } from '../../themes';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\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 React, { HTMLProps, useCallback } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getLabelStyles } from './Label';\nimport { stylesFactory, useStyles2 } from '../../themes';\nimport { css, cx } from '@emotion/css';\nimport { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins';\n\nexport interface CheckboxProps extends Omit<HTMLProps<HTMLInputElement>, 'value'> {\n  label?: string;\n  description?: string;\n  value?: boolean;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n  ({ label, description, value, 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          {...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","import { stylesFactory } from '../../themes';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getLabelStyles } from './Label';\nimport { getLegendStyles } from './Legend';\nimport { getFieldValidationMessageStyles } from './FieldValidationMessage';\nimport { getButtonStyles, ButtonVariant } from '../Button';\nimport { ComponentSize } from '../../types/size';\nimport { getInputStyles } from '../Input/Input';\nimport { getCheckboxStyles } from './Checkbox';\n\n/** @deprecated */\nexport const getFormStyles = stylesFactory(\n  (theme: GrafanaTheme2, options: { variant: ButtonVariant; size: ComponentSize; invalid: boolean }) => {\n    console.warn('getFormStyles is deprecated');\n\n    return {\n      label: getLabelStyles(theme),\n      legend: getLegendStyles(theme.v1),\n      fieldValidationMessage: getFieldValidationMessageStyles(theme),\n      button: getButtonStyles({\n        theme,\n        variant: options.variant,\n        size: options.size,\n      }),\n      input: getInputStyles({ theme, invalid: options.invalid }),\n      checkbox: getCheckboxStyles(theme),\n    };\n  }\n);\n","import { locationUtil, textUtil } from '@grafana/data';\nimport React, { AnchorHTMLAttributes, forwardRef } from 'react';\nimport { Link as RouterLink } from 'react-router-dom';\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 React, { FC, HTMLProps } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { Legend } from './Legend';\n\nexport interface Props extends HTMLProps<HTMLFieldSetElement> {\n  children: React.ReactNode[] | React.ReactNode;\n  /** Text for the fieldset's legend */\n  label?: string;\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 React, { FC } from 'react';\nimport { cx, css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\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';\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 { select } from 'react-select-event';\n\n// Used to select an option or options from a Select in unit tests\nexport const selectOptionInTest = async (\n  input: HTMLElement,\n  optionOrOptions: string | RegExp | Array<string | RegExp>\n) => await select(input, optionOrOptions, { container: document.body });\n\n// Finds the parent of the Select so you can assert if it has a value\nexport const getSelectParent = (input: HTMLElement) =>\n  input.parentElement?.parentElement?.parentElement?.parentElement?.parentElement;\n","import React, { HTMLProps } from 'react';\nimport { escapeStringForRegex, unEscapeStringFromRegex } from '@grafana/data';\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","/**\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 React, { FC, FormEvent, useCallback, useState } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { Icon } from '../index';\nimport { stylesFactory, useTheme2 } from '../../themes';\nimport { ComponentSize } from '../../types/size';\nimport { getButtonStyles } from '../Button';\nimport { trimFileName } from '../../utils/file';\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}\n\nexport const FileUpload: FC<Props> = ({\n  onFileUpload,\n  className,\n  children = 'Upload file',\n  accept = '*',\n  size = 'md',\n}) => {\n  const theme = useTheme2();\n  const style = getStyles(theme, size);\n  const [fileName, setFileName] = useState('');\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      <label className={cx(style.button, className)}>\n        <Icon name=\"upload\" className={style.icon} />\n        {children}\n        <input\n          type=\"file\"\n          id=\"fileUpload\"\n          className={style.fileUpload}\n          onChange={onChange}\n          multiple={false}\n          accept={accept}\n        />\n      </label>\n      {fileName && (\n        <span aria-label=\"File name\" className={style.fileName}>\n          {trimFileName(fileName)}\n        </span>\n      )}\n    </>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, size: ComponentSize) => {\n  const buttonStyles = getButtonStyles({ theme, variant: 'primary', size, iconOnly: false });\n  return {\n    fileUpload: css`\n      display: none;\n    `,\n    button: buttonStyles.button,\n    icon: buttonStyles.icon,\n    fileName: css`\n      margin-left: ${theme.spacing(0.5)};\n    `,\n  };\n});\n","import { css } from '@emotion/css';\nimport { formattedValueToString, getValueFormat, GrafanaTheme2 } from '@grafana/data';\nimport React from 'react';\nimport { useStyles2 } from '../../themes';\nimport { trimFileName } from '../../utils/file';\nimport { Button } from '../Button';\nimport { Icon } from '../Icon/Icon';\nimport { IconButton } from '../IconButton/IconButton';\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 { GrafanaTheme2 } from '@grafana/data';\nimport { uniqueId } from 'lodash';\nimport React, { ReactNode, useCallback, useState } from 'react';\nimport { DropEvent, DropzoneOptions, FileRejection, useDropzone } from 'react-dropzone';\nimport { useTheme2 } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { FileListItem } from './FileListItem';\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   *  maxFiles: 0,\n   * }\n   */\n  options?: DropzoneOptions;\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}\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 }: FileDropzoneProps) {\n  const [files, setFiles] = useState<DropzoneFile[]>([]);\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      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  };\n\n  const { getRootProps, getInputProps, isDragActive } = useDropzone({ ...options, onDrop });\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  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      {options?.accept && (\n        <small className={cx(styles.small, styles.acceptMargin)}>{getAcceptedFileTypeText(options)}</small>\n      )}\n      {fileList}\n    </div>\n  );\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?: DropzoneOptions) {\n  if (options?.multiple === undefined || options?.multiple) {\n    return 'Upload file';\n  }\n  return files.length ? 'Replace file' : 'Upload file';\n}\n\nfunction getAcceptedFileTypeText(options: DropzoneOptions) {\n  if (Array.isArray(options.accept)) {\n    return `Accepted file types: ${options.accept.join(', ')}`;\n  }\n\n  return `Accepted file type: ${options.accept}`;\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  };\n}\n","import React, { FC, FormEvent, MouseEvent, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { dateMath, dateTime, getDefaultTimeRange, GrafanaTheme2, TimeRange, TimeZone } from '@grafana/data';\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { Icon } from '../Icon/Icon';\nimport { getInputStyles } from '../Input/Input';\nimport { TimePickerButtonLabel } from './TimeRangePicker';\nimport { TimePickerContent } from './TimeRangePicker/TimePickerContent';\nimport { quickOptions } from './options';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { stylesFactory } from '../../themes';\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 React, { FormEvent, ReactElement, useCallback, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { RelativeTimeRange, GrafanaTheme2, TimeOption } from '@grafana/data';\nimport { useStyles2 } from '../../../themes';\nimport { Button } from '../../Button';\nimport { ClickOutsideWrapper } from '../../ClickOutsideWrapper/ClickOutsideWrapper';\nimport { TimeRangeList } from '../TimeRangePicker/TimeRangeList';\nimport { quickOptions } from '../options';\nimport CustomScrollbar from '../../CustomScrollbar/CustomScrollbar';\nimport { TimePickerTitle } from '../TimeRangePicker/TimePickerTitle';\nimport {\n  isRangeValid,\n  isRelativeFormat,\n  mapOptionToRelativeTimeRange,\n  mapRelativeTimeRangeToOption,\n  RangeValidation,\n} from './utils';\nimport { Field } from '../../Forms/Field';\nimport { getInputStyles, Input } from '../../Input/Input';\nimport { Icon } from '../../Icon/Icon';\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>Specify time range</TimePickerTitle>\n                  <div className={styles.description}>\n                    Specify a relative time range, 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                </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 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 React, { HTMLAttributes, ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { styleMixins, stylesFactory, useTheme2 } from '../../themes';\n\n/**\n * @public\n */\nexport interface CardInnerProps {\n  href?: string;\n  children?: ReactNode;\n}\n\nconst CardInner = ({ children, href }: CardInnerProps) => {\n  const theme = useTheme2();\n  const { inner } = getCardContainerStyles(theme);\n  return href ? (\n    <a className={inner} href={href}>\n      {children}\n    </a>\n  ) : (\n    <div className={inner}>{children}</div>\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  /** Custom container styles */\n  className?: string;\n}\n\nexport const CardContainer = ({\n  href,\n  children,\n  disableEvents,\n  disableHover,\n  className,\n  ...props\n}: CardContainerProps) => {\n  const theme = useTheme2();\n  const { container } = getCardContainerStyles(theme, disableEvents, disableHover);\n  return (\n    <div {...props} className={cx(container, className)}>\n      <CardInner href={href}>{children}</CardInner>\n    </div>\n  );\n};\n\nconst getCardContainerStyles = stylesFactory((theme: GrafanaTheme2, disabled = false, disableHover = false) => {\n  return {\n    container: 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    inner: css({\n      display: 'flex',\n      width: '100%',\n      padding: theme.spacing(2),\n    }),\n  };\n});\n","import React, { memo, cloneElement, FC, ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2, stylesFactory } from '../../themes';\nimport { CardContainer, CardContainerProps } from './CardContainer';\n\n/**\n * @public\n */\nexport interface Props extends Omit<CardContainerProps, 'disableEvents' | 'disableHover'> {\n  /** Main heading for the Card **/\n  heading: ReactNode;\n  /** Card description text */\n  description?: string;\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?: () => void;\n}\n\nexport interface CardInterface extends FC<Props> {\n  Tags: typeof Tags;\n  Figure: typeof Figure;\n  Meta: typeof Meta;\n  Actions: typeof Actions;\n  SecondaryActions: typeof SecondaryActions;\n}\n\n/**\n * Generic card component\n *\n * @public\n */\nexport const Card: CardInterface = ({ heading, description, disabled, href, onClick, children, ...htmlProps }) => {\n  const theme = useTheme2();\n  const styles = getCardStyles(theme);\n  const [tags, figure, meta, actions, secondaryActions] = ['Tags', 'Figure', 'Meta', 'Actions', 'SecondaryActions'].map(\n    (item) => {\n      const found = React.Children.toArray(children as React.ReactElement[]).find((child) => {\n        return React.isValidElement(child) && child?.type && (child.type as any).displayName === item;\n      });\n\n      if (found && React.isValidElement(found)) {\n        return React.cloneElement(found, { disabled, styles, ...found.props });\n      }\n      return found;\n    }\n  );\n\n  const hasActions = Boolean(actions || secondaryActions);\n  const disableHover = disabled || (!onClick && !href);\n  const disableEvents = disabled && !actions;\n  const onCardClick = onClick && !disabled ? onClick : undefined;\n  const onEnterKey = onClick && !disabled ? getEnterKeyHandler(onClick) : undefined;\n\n  return (\n    <CardContainer\n      tabIndex={disableHover ? undefined : 0}\n      onClick={onCardClick}\n      onKeyDown={onEnterKey}\n      disableEvents={disableEvents}\n      disableHover={disableHover}\n      href={href}\n      {...htmlProps}\n    >\n      {figure}\n      <div className={styles.inner}>\n        <div className={styles.info}>\n          <div>\n            <h2 className={styles.heading}>{heading}</h2>\n            {meta}\n            {description && <p className={styles.description}>{description}</p>}\n          </div>\n          {tags}\n        </div>\n        {hasActions && (\n          <div className={styles.actionRow}>\n            {actions}\n            {secondaryActions}\n          </div>\n        )}\n      </div>\n    </CardContainer>\n  );\n};\n\nfunction getEnterKeyHandler(onClick: () => void) {\n  return (e: React.KeyboardEvent<HTMLInputElement>) => {\n    if (e.key === 'Enter') {\n      onClick();\n    }\n  };\n}\n\n/**\n * @public\n */\nexport const getCardStyles = stylesFactory((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    heading: css`\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      width: 100%;\n      margin-bottom: 0;\n      font-size: ${theme.typography.size.md};\n      letter-spacing: inherit;\n      line-height: ${theme.typography.body.lineHeight};\n      color: ${theme.colors.text.primary};\n      font-weight: ${theme.typography.fontWeightMedium};\n    `,\n    info: css`\n      display: flex;\n      flex-direction: row;\n      justify-content: space-between;\n      align-items: center;\n      width: 100%;\n    `,\n    metadata: css`\n      display: flex;\n      align-items: center;\n      width: 100%;\n      font-size: ${theme.typography.size.sm};\n      color: ${theme.colors.text.secondary};\n      margin: ${theme.spacing(0.5, 0, 0)};\n      line-height: ${theme.typography.bodySmall.lineHeight};\n      overflow-wrap: anywhere;\n    `,\n    description: css`\n      width: 100%;\n      margin: ${theme.spacing(1, 0, 0)};\n      color: ${theme.colors.text.secondary};\n      line-height: ${theme.typography.body.lineHeight};\n    `,\n    media: css`\n      margin-right: ${theme.spacing(2)};\n      width: 40px;\n\n      & > * {\n        width: 100%;\n      }\n\n      &:empty {\n        display: none;\n      }\n    `,\n    actionRow: css`\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      width: 100%;\n      margin-top: ${theme.spacing(2)};\n    `,\n    actions: css`\n      & > * {\n        margin-right: ${theme.spacing(1)};\n      }\n    `,\n    secondaryActions: css`\n      display: flex;\n      align-items: center;\n      color: ${theme.colors.text.secondary};\n      // align to the right\n      margin-left: auto;\n      & > * {\n        margin-right: ${theme.spacing(1)} !important;\n      }\n    `,\n    separator: css`\n      margin: 0 ${theme.spacing(1)};\n    `,\n    tagList: css`\n      max-width: 50%;\n    `,\n  };\n});\n\ninterface ChildProps {\n  styles?: ReturnType<typeof getCardStyles>;\n  disabled?: boolean;\n}\n\nconst Tags: FC<ChildProps> = ({ children, styles }) => {\n  return <div className={styles?.tagList}>{children}</div>;\n};\nTags.displayName = 'Tags';\n\nconst Figure: FC<ChildProps & { align?: 'top' | 'center'; className?: string }> = ({\n  children,\n  styles,\n  align = 'top',\n  className,\n}) => {\n  return (\n    <div\n      className={cx(\n        styles?.media,\n        className,\n        align === 'center' &&\n          css`\n            display: flex;\n            align-items: center;\n          `\n      )}\n    >\n      {children}\n    </div>\n  );\n};\n\nFigure.displayName = 'Figure';\n\nconst Meta: FC<ChildProps & { separator?: string }> = memo(({ children, styles, separator = '|' }) => {\n  let meta = children;\n\n  // Join meta data elements by separator\n  if (Array.isArray(children) && separator) {\n    const filtered = React.Children.toArray(children).filter(Boolean);\n    if (!filtered.length) {\n      return null;\n    }\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={styles?.metadata}>{meta}</div>;\n});\n\nMeta.displayName = 'Meta';\n\ninterface ActionsProps extends ChildProps {\n  children?: React.ReactNode;\n  variant?: 'primary' | 'secondary';\n}\n\nconst BaseActions: FC<ActionsProps> = ({ children, styles, disabled, variant }) => {\n  const css = variant === 'primary' ? styles?.actions : styles?.secondaryActions;\n  return (\n    <div className={css}>\n      {React.Children.map(children, (child) => {\n        return React.isValidElement(child) ? cloneElement(child, { disabled, ...child.props }) : null;\n      })}\n    </div>\n  );\n};\n\nconst Actions: FC<ActionsProps> = ({ children, styles, disabled }) => {\n  return (\n    <BaseActions variant=\"primary\" disabled={disabled} styles={styles}>\n      {children}\n    </BaseActions>\n  );\n};\n\nActions.displayName = 'Actions';\n\nconst SecondaryActions: FC<ActionsProps> = ({ children, styles, disabled }) => {\n  return (\n    <BaseActions variant=\"secondary\" disabled={disabled} styles={styles}>\n      {children}\n    </BaseActions>\n  );\n};\n\nSecondaryActions.displayName = 'SecondaryActions';\n\nCard.Tags = Tags;\nCard.Figure = Figure;\nCard.Meta = Meta;\nCard.Actions = Actions;\nCard.SecondaryActions = SecondaryActions;\n","import React, { HTMLAttributes } from 'react';\nimport { PluginSignatureStatus } from '@grafana/data';\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';\nimport {\n  DataFrame,\n  DisplayValue,\n  fieldReducers,\n  getFieldDisplayName,\n  getFieldSeriesColor,\n  reduceField,\n} from '@grafana/data';\nimport { UPlotConfigBuilder } from './config/UPlotConfigBuilder';\nimport { VizLegendItem } from '../VizLegend/types';\nimport { VizLegendOptions, AxisPlacement } from '@grafana/schema';\nimport { VizLayout, VizLayoutLegendProps } from '../VizLayout/VizLayout';\nimport { VizLegend } from '../VizLegend/VizLegend';\nimport { useTheme2 } from '../../themes';\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          const fieldCalcs = reduceField({\n            field,\n            reducers: calcs,\n          });\n\n          return calcs.map<DisplayValue>((reducerId) => {\n            const fieldReducer = fieldReducers.get(reducerId);\n\n            return {\n              ...fmt(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, { useMemo } from 'react';\nimport { css } from '@emotion/css';\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 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 { DataFrame, DataFrameFieldIndex } from '@grafana/data';\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\nimport { Marker } from './Marker';\nimport { XYCanvas } from './XYCanvas';\nimport uPlot from 'uplot';\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';\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\nimport { pluginLog } from '../utils';\nimport { PlotSelection } from '../types';\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 {\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 } from '@grafana/schema';\nimport React, { useEffect, useLayoutEffect, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport uPlot from 'uplot';\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  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  sync,\n  timeZone,\n  config,\n  renderTooltip,\n  ...otherProps\n}) => {\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 plotInstance: uPlot | undefined = undefined;\n    let bbox: DOMRect | undefined = undefined;\n\n    const plotMouseLeave = () => {\n      if (!isMounted()) {\n        return;\n      }\n      setCoords(null);\n      setIsActive(false);\n      plotInstance?.root.classList.remove('plot-active');\n    };\n\n    const plotMouseEnter = () => {\n      if (!isMounted()) {\n        return;\n      }\n      setIsActive(true);\n      plotInstance?.root.classList.add('plot-active');\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      plotInstance = u;\n\n      u.over.addEventListener('mouseleave', plotMouseLeave);\n      u.over.addEventListener('mouseenter', plotMouseEnter);\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) {\n        plotInstance.over.removeEventListener('mouseleave', plotMouseLeave);\n        plotInstance.over.removeEventListener('mouseenter', plotMouseEnter);\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  const 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 fieldFmt = field.display || getDisplayProcessor({ field, timeZone, theme });\n      const display = fieldFmt(field.values.get(focusedPointIdx));\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\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 display = field.display!(otherProps.data.fields[i].values.get(focusedPointIdxs[i]!));\n\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      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 isCursourOutsideCanvas({ 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 (isCursourOutsideCanvas(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 { isNumber } from 'lodash';\nimport {\n  DashboardCursorSync,\n  DataFrame,\n  DataHoverClearEvent,\n  DataHoverEvent,\n  DataHoverPayload,\n  FieldConfig,\n  FieldType,\n  formattedValueToString,\n  getFieldColorModeForField,\n  getFieldSeriesColor,\n  getFieldDisplayName,\n} from '@grafana/data';\n\nimport { UPlotConfigBuilder, UPlotConfigPrepFn } from '../uPlot/config/UPlotConfigBuilder';\nimport {\n  AxisPlacement,\n  GraphDrawStyle,\n  GraphFieldConfig,\n  GraphTresholdsStyleMode,\n  VisibilityMode,\n  ScaleDirection,\n  ScaleOrientation,\n  VizLegendOptions,\n} from '@grafana/schema';\nimport { collectStackingGroups, orderIdsByCalcs, preparePlotData } from '../uPlot/utils';\nimport uPlot from 'uplot';\nimport { buildScaleKey } from '../GraphNG/utils';\n\nconst defaultFormatter = (v: any) => (v == null ? '-' : v.toFixed(1));\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  legend?: VizLegendOptions;\n}> = ({\n  frame,\n  theme,\n  timeZone,\n  getTimeRange,\n  eventBus,\n  sync,\n  allFrames,\n  renderers,\n  legend,\n  tweakScale = (opts) => opts,\n  tweakAxis = (opts) => opts,\n}) => {\n  const builder = new UPlotConfigBuilder(timeZone);\n\n  builder.setPrepData((prepData) => preparePlotData(prepData, undefined, legend));\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  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    builder.addAxis({\n      scaleKey: xScaleKey,\n      isTime: true,\n      placement: AxisPlacement.Bottom,\n      label: xField.config.custom?.axisLabel,\n      timeZone,\n      theme,\n      grid: { show: xField.config.custom?.axisGridShow },\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: AxisPlacement.Bottom,\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  const stackingGroups: Map<string, number[]> = new Map();\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    const fmt = field.display ?? defaultFormatter;\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        },\n        field\n      )\n    );\n\n    if (!yScaleKey) {\n      yScaleKey = scaleKey;\n    }\n\n    if (customConfig.axisPlacement !== AxisPlacement.Hidden) {\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) => formattedValueToString(fmt(v)),\n            theme,\n            grid: { show: customConfig.axisGridShow },\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 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              filtered.push(u.posToIdx(thisGap[1], true));\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      }\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    builder.addSeries({\n      pathBuilder,\n      pointsBuilder,\n      scaleKey,\n      showPoints,\n      pointsFilter,\n      colorMode,\n      fillOpacity,\n      theme,\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    collectStackingGroups(field, stackingGroups, seriesIndex);\n  }\n\n  if (stackingGroups.size !== 0) {\n    for (const [_, seriesIds] of stackingGroups.entries()) {\n      const seriesIdxs = orderIdsByCalcs({ ids: seriesIds, legend, frame });\n      for (let j = seriesIdxs.length - 1; j > 0; j--) {\n        builder.addBand({\n          series: [seriesIdxs[j], seriesIdxs[j - 1]],\n        });\n      }\n    }\n  }\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 = hoveredIdx,\n          nonNullRgt = hoveredIdx,\n          i;\n\n        i = hoveredIdx;\n        while (nonNullLft === hoveredIdx && i-- > 0) {\n          if (seriesData[i] != null) {\n            nonNullLft = i;\n          }\n        }\n\n        i = hoveredIdx;\n        while (nonNullRgt === hoveredIdx && 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 = self.valToPos(xVals[nonNullRgt], 'x');\n        let lftPos = 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      // ??? setSeries: syncMode === DashboardCursorSync.Tooltip,\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      match: [() => true, () => true],\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';\nimport { DataFrame, TimeRange } from '@grafana/data';\nimport { GraphNG, GraphNGProps } from '../GraphNG/GraphNG';\nimport { UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder';\nimport { PlotLegend } from '../uPlot/PlotLegend';\nimport { LegendDisplayMode } from '@grafana/schema';\nimport { preparePlotConfigBuilder } from './utils';\nimport { withTheme2 } from '../../themes/ThemeContext';\nimport { PanelContext, PanelContextRoot } from '../PanelChrome/PanelContext';\nimport { PropDiffFn } from '../../../../../packages/grafana-ui/src/components/GraphNG/GraphNG';\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, timeZone, legend, renderers, tweakAxis, tweakScale } = this.props;\n\n    return preparePlotConfigBuilder({\n      frame: alignedFrame,\n      theme,\n      timeZone,\n      getTimeRange,\n      eventBus,\n      sync,\n      allFrames,\n      legend,\n      renderers,\n      tweakScale,\n      tweakAxis,\n    });\n  };\n\n  renderLegend = (config: UPlotConfigBuilder) => {\n    const { legend, frames } = this.props;\n\n    if (!config || (legend && legend.displayMode === LegendDisplayMode.Hidden)) {\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 { DataFrame, DataFrameFieldIndex, Field } from '@grafana/data';\nimport { XYFieldMatchers } from './types';\nimport React, { useCallback, useContext } from 'react';\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 { Profiler, ProfilerOnRenderCallback, useState, FC } from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { Button } from '../Button';\nimport { VerticalGroup } from '../Layout/Layout';\nimport classnames from 'classnames';\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 React, { forwardRef, HTMLAttributes, useCallback } from 'react';\nimport { cx, css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '../../themes';\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\nimport { PartialHighlighter } from '../Typeahead/PartialHighlighter';\nimport { HighlightPart } from '../../types';\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.colors.primary.text};\n    background-color: ${theme.colors.primary.transparent};\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","export { Icon } from './Icon/Icon';\nexport { IconButton, IconButtonVariant } from './IconButton/IconButton';\nexport { ConfirmButton } from './ConfirmButton/ConfirmButton';\nexport { DeleteButton } from './ConfirmButton/DeleteButton';\nexport { Tooltip, PopoverContent } from './Tooltip/Tooltip';\nexport { PopoverController } from './Tooltip/PopoverController';\nexport { Popover } from './Tooltip/Popover';\nexport { Portal } 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';\n\nexport { LoadingPlaceholder, LoadingPlaceholderProps } from './LoadingPlaceholder/LoadingPlaceholder';\nexport { ColorPicker, SeriesColorPicker } from './ColorPicker/ColorPicker';\nexport { ColorValueEditor, ColorValueEditorProps } from './OptionsUI/color';\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\n// Code editor\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 } 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 { 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';\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// TODO: namespace!!\nexport { StringValueEditor } from './OptionsUI/string';\nexport { StringArrayEditor } from './OptionsUI/strings';\nexport { NumberValueEditor } from './OptionsUI/number';\nexport { SliderValueEditor } from './OptionsUI/slider';\nexport { SelectValueEditor } from './OptionsUI/select';\nexport { MultiSelectValueEditor } from './OptionsUI/multiSelect';\n\n// Next-gen forms\nexport { Form } from './Forms/Form';\nexport { sharedInputStyle } from './Forms/commonStyles';\nexport { InputControl } from './InputControl';\nexport { Button, LinkButton, ButtonVariant, ToolbarButton, ButtonGroup, ToolbarButtonRow, ButtonProps } from './Button';\nexport { ValuePicker } from './ValuePicker/ValuePicker';\nexport { fieldMatchersUI } from './MatchersUI/fieldMatchersUI';\nexport { getFormStyles } from './Forms/getFormStyles';\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 { selectOptionInTest } from './Select/test-utils';\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';\n\nexport { Input, getInputStyles } from './Input/Input';\nexport { FilterInput } from './FilterInput/FilterInput';\nexport { FormInputSize } from './Forms/types';\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 { 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\n// Select\nimport { AsyncSelect, Select } from './Forms/Legacy/Select/Select';\nimport { IndicatorsContainer } from './Forms/Legacy/Select/IndicatorsContainer';\nimport { NoOptionsMessage } from './Forms/Legacy/Select/NoOptionsMessage';\n\n//Input\nimport { Input, LegacyInputStatus } from './Forms/Legacy/Input/Input';\nimport { FormField } from './FormField/FormField';\nimport { SecretFormField } from './SecretFormField/SecretFormField';\n\nimport { Switch } from './Forms/Legacy/Switch/Switch';\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';\n","import React from 'react';\nimport { css } from '@emotion/css';\nimport { CSSTransition } from 'react-transition-group';\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 React from 'react';\nimport { css } from '@emotion/css';\nimport { CSSTransition } from 'react-transition-group';\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';\nimport { DEFAULT_PLOT_CONFIG, pluginLog } from './utils';\nimport { PlotProps } from './types';\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\n      // this is a uPlot cache-busting hack for bar charts in case x axis labels changed\n      // since the x scale's \"range\" doesnt change, the axis size doesnt get recomputed, which is where the tick labels are regenerated & cached\n      // the more expensive, more proper/thorough way to do this is to force all axes to recalc: plot?.redraw(false, true);\n      if (plot && typeof this.props.data[0]?.[0] === 'string') {\n        //@ts-ignore\n        plot.axes[0]._values = this.props.data[0];\n      }\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 { dateTimeFormat, GrafanaTheme2, isBooleanUnit, systemDateFormats, TimeZone } from '@grafana/data';\nimport uPlot, { Axis } from 'uplot';\nimport { PlotConfigBuilder } from '../types';\nimport { measureText } from '../../../utils/measureText';\nimport { AxisPlacement } from '@grafana/schema';\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) => string;\n  incrs?: Axis.Incrs;\n  splits?: Axis.Splits;\n  values?: Axis.Values;\n  isTime?: boolean;\n  timeZone?: TimeZone;\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    } = 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: 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: 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 (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, vals: any[]) => vals.map(formatValue!);\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 */\nfunction formatTime(self: uPlot, splits: number[], axisIdx: number, foundSpace: number, foundIncr: number): 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.second.replace('ss', 'ss.SS');\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) => 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 {\n  colorManipulator,\n  FieldColorMode,\n  FieldColorModeId,\n  GrafanaTheme2,\n  ThresholdsConfig,\n  ThresholdsMode,\n} from '@grafana/data';\nimport { ScaleOrientation } from '@grafana/schema';\nimport tinycolor from 'tinycolor2';\nimport uPlot from 'uplot';\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  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 {\n  colorManipulator,\n  DataFrameFieldIndex,\n  FALLBACK_COLOR,\n  FieldColorMode,\n  FieldColorModeId,\n  GrafanaTheme2,\n  ThresholdsConfig,\n} from '@grafana/data';\nimport uPlot, { Series } from 'uplot';\nimport {\n  BarAlignment,\n  BarConfig,\n  GraphDrawStyle,\n  FillConfig,\n  GraphGradientMode,\n  LineConfig,\n  LineInterpolation,\n  PointsConfig,\n  VisibilityMode,\n} from '@grafana/schema';\nimport { PlotConfigBuilder } from '../types';\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\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 { lineColor, gradientMode, colorMode, thresholds, theme, hardMin, hardMax, softMin, softMax } = this.props;\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    } = 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    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 = Infinity\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 uPlot, { Cursor, Band, Hooks, Select, AlignedData, Padding, Series } from 'uplot';\nimport { merge } from 'lodash';\nimport {\n  DataFrame,\n  DefaultTimeZone,\n  EventBus,\n  Field,\n  getTimeZoneInfo,\n  GrafanaTheme2,\n  TimeRange,\n  TimeZone,\n} from '@grafana/data';\nimport { FacetedData, PlotConfig, PlotTooltipInterpolator } from '../types';\nimport { ScaleProps, UPlotScaleBuilder } from './UPlotScaleBuilder';\nimport { SeriesProps, UPlotSeriesBuilder } from './UPlotSeriesBuilder';\nimport { AxisProps, UPlotAxisBuilder } from './UPlotAxisBuilder';\nimport { AxisPlacement } from '@grafana/schema';\nimport { pluginLog } from '../utils';\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;\n\nexport class UPlotConfigBuilder {\n  private series: UPlotSeriesBuilder[] = [];\n  private axes: Record<string, UPlotAxisBuilder> = {};\n  private scales: UPlotScaleBuilder[] = [];\n  private bands: Band[] = [];\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    if (this.axes[props.scaleKey]) {\n      this.axes[props.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[props.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  setTooltipInterpolator(interpolator: PlotTooltipInterpolator) {\n    this.tooltipInterpolator = interpolator;\n  }\n\n  getTooltipInterpolator() {\n    return this.tooltipInterpolator;\n  }\n\n  setPrepData(prepData: PrepData) {\n    this.prepData = (frames) => {\n      this.frames = frames;\n      return prepData(frames);\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 = (alphaHex = '') => (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.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  timeZone: 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 { GrafanaTheme2, Threshold, ThresholdsConfig, ThresholdsMode } from '@grafana/data';\nimport { GraphThresholdsStyleConfig, GraphTresholdsStyleMode } from '@grafana/schema';\nimport { getGradientRange, scaleGradient } from './gradientFills';\nimport tinycolor from 'tinycolor2';\nimport uPlot from 'uplot';\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 uPlot, { Scale, Range } from 'uplot';\nimport { PlotConfigBuilder } from '../types';\nimport { ScaleOrientation, ScaleDirection, ScaleDistribution } from '@grafana/schema';\nimport { isBooleanUnit } from '@grafana/data';\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}\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 { isTime, scaleKey, min: hardMin, max: hardMax, softMin, softMax, range, direction, orientation } = 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        // @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 from 'react';\nimport uPlot, { Options, AlignedData } from 'uplot';\nimport { TimeRange } from '@grafana/data';\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 { DataFrame, ensureTimeField, Field, FieldType } from '@grafana/data';\nimport { StackingMode, VizLegendOptions } from '@grafana/schema';\nimport { orderBy } from 'lodash';\nimport uPlot, { AlignedData, Options, PaddingSide } from 'uplot';\nimport { attachDebugger } from '../../utils';\nimport { createLogger } from '../../utils/logger';\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 function preparePlotData(\n  frames: DataFrame[],\n  onStackMeta?: (meta: StackMeta) => void,\n  legend?: VizLegendOptions\n): AlignedData {\n  const frame = frames[0];\n  const result: any[] = [];\n  const stackingGroups: Map<string, number[]> = new Map();\n  let seriesIndex = 0;\n\n  for (let i = 0; i < frame.fields.length; i++) {\n    const f = frame.fields[i];\n\n    if (f.type === FieldType.time) {\n      result.push(ensureTimeField(f).values.toArray());\n      seriesIndex++;\n      continue;\n    }\n\n    collectStackingGroups(f, stackingGroups, seriesIndex);\n    result.push(f.values.toArray());\n    seriesIndex++;\n  }\n\n  // Stacking\n  if (stackingGroups.size !== 0) {\n    const byPct = frame.fields[1].config.custom?.stacking?.mode === StackingMode.Percent;\n    const dataLength = result[0].length;\n    const alignedTotals = Array(stackingGroups.size);\n    alignedTotals[0] = null;\n\n    // array or stacking groups\n    for (const [_, seriesIds] of stackingGroups.entries()) {\n      const seriesIdxs = orderIdsByCalcs({ ids: seriesIds, legend, frame });\n\n      const groupTotals = byPct ? Array(dataLength).fill(0) : null;\n\n      if (byPct) {\n        for (let j = 0; j < seriesIdxs.length; j++) {\n          const currentlyStacking = result[seriesIdxs[j]];\n\n          for (let k = 0; k < dataLength; k++) {\n            const v = currentlyStacking[k];\n            groupTotals![k] += v == null ? 0 : +v;\n          }\n        }\n      }\n\n      const acc = Array(dataLength).fill(0);\n\n      for (let j = 0; j < seriesIdxs.length; j++) {\n        let seriesIdx = seriesIdxs[j];\n\n        alignedTotals[seriesIdx] = groupTotals;\n\n        const currentlyStacking = result[seriesIdx];\n\n        for (let k = 0; k < dataLength; k++) {\n          const v = currentlyStacking[k];\n          acc[k] += v == null ? 0 : v / (byPct ? groupTotals![k] : 1);\n        }\n\n        result[seriesIdx] = acc.slice();\n      }\n    }\n\n    onStackMeta &&\n      onStackMeta({\n        totals: alignedTotals as AlignedData,\n      });\n  }\n\n  return result as AlignedData;\n}\n\nexport function collectStackingGroups(f: Field, groups: Map<string, number[]>, seriesIdx: number) {\n  const customConfig = f.config.custom;\n  if (!customConfig) {\n    return;\n  }\n  if (\n    customConfig.stacking?.mode !== StackingMode.None &&\n    customConfig.stacking?.group &&\n    !customConfig.hideFrom?.viz\n  ) {\n    if (!groups.has(customConfig.stacking.group)) {\n      groups.set(customConfig.stacking.group, [seriesIdx]);\n    } else {\n      groups.set(customConfig.stacking.group, groups.get(customConfig.stacking.group)!.concat(seriesIdx));\n    }\n  }\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\ntype OrderIdsByCalcsOptions = {\n  legend?: VizLegendOptions;\n  ids: number[];\n  frame: DataFrame;\n};\nexport function orderIdsByCalcs({ legend, ids, frame }: OrderIdsByCalcsOptions) {\n  if (!legend?.sortBy || legend.sortDesc == null) {\n    return ids;\n  }\n  const orderedIds = orderBy<number>(\n    ids,\n    (id) => {\n      return frame.fields[id].state?.calcs?.[legend.sortBy!.toLowerCase()];\n    },\n    legend.sortDesc ? 'desc' : 'asc'\n  );\n\n  return orderedIds;\n}\n","import React from 'react';\nimport {\n  FieldConfigEditorBuilder,\n  FieldOverrideEditorProps,\n  FieldType,\n  identityOverrideProcessor,\n  SelectableValue,\n} from '@grafana/data';\nimport { graphFieldOptions, Select, HorizontalGroup, RadioButtonGroup } from '../../index';\nimport { AxisConfig, AxisPlacement, ScaleDistribution, ScaleDistributionConfig } from '@grafana/schema';\n\n/**\n * @alpha\n */\nexport function addAxisConfig(\n  builder: FieldConfigEditorBuilder<AxisConfig>,\n  defaultConfig: AxisConfig,\n  hideScale?: boolean\n) {\n  const category = ['Axis'];\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      // no matter what the field type is\n      shouldApply: () => true,\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    .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    .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\n  if (!hideScale) {\n    builder.addCustomEditor<void, ScaleDistributionConfig>({\n      id: 'scaleDistribution',\n      path: 'scaleDistribution',\n      name: 'Scale',\n      category,\n      editor: ScaleDistributionEditor,\n      override: ScaleDistributionEditor,\n      defaultValue: { type: ScaleDistribution.Linear },\n      shouldApply: (f) => f.type === FieldType.number,\n      process: identityOverrideProcessor,\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 * @alpha\n */\nconst ScaleDistributionEditor: React.FC<FieldOverrideEditorProps<ScaleDistributionConfig, any>> = ({\n  value,\n  onChange,\n}) => {\n  return (\n    <HorizontalGroup>\n      <RadioButtonGroup\n        value={value.type || ScaleDistribution.Linear}\n        options={DISTRIBUTION_OPTIONS}\n        onChange={(v) => {\n          console.log(v, value);\n          onChange({\n            ...value,\n            type: v!,\n            log: v === ScaleDistribution.Linear ? undefined : 2,\n          });\n        }}\n      />\n      {value.type === ScaleDistribution.Log && (\n        <Select\n          menuShouldPortal\n          allowCustomValue={false}\n          autoFocus\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 React, { useCallback } from 'react';\nimport { startCase } from 'lodash';\nimport { FilterPill, HorizontalGroup } from '../../index';\nimport { FieldConfigEditorBuilder, FieldConfigEditorProps } from '@grafana/data';\nimport { HideableFieldConfig, HideSeriesConfig } from '@grafana/schema';\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    .addRadio({\n      path: 'legend.displayMode',\n      name: 'Legend 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          { value: LegendDisplayMode.Hidden, label: 'Hidden' },\n        ],\n      },\n    })\n    .addRadio({\n      path: 'legend.placement',\n      name: 'Legend 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.displayMode !== LegendDisplayMode.Hidden,\n    });\n\n  if (includeLegendCalcs) {\n    builder.addCustomEditor<StatsPickerConfigSettings, string[]>({\n      id: 'legend.calcs',\n      path: 'legend.calcs',\n      name: 'Legend 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.displayMode !== LegendDisplayMode.Hidden,\n    });\n  }\n}\n","import { OptionsWithTooltip } from '@grafana/schema';\nimport { PanelOptionsEditorBuilder } from '@grafana/data';\n\nexport function addTooltipOptions<T extends OptionsWithTooltip>(\n  builder: PanelOptionsEditorBuilder<T>,\n  singleOnly = false\n) {\n  const options = singleOnly\n    ? [\n        { value: 'single', label: 'Single' },\n        { value: 'none', label: 'Hidden' },\n      ]\n    : [\n        { value: 'single', label: 'Single' },\n        { value: 'multi', label: 'All' },\n        { value: 'none', label: 'Hidden' },\n      ];\n\n  builder.addRadio({\n    path: 'tooltip.mode',\n    name: 'Tooltip mode',\n    category: ['Tooltip'],\n    description: '',\n    defaultValue: 'single',\n    settings: {\n      options,\n    },\n  });\n}\n","import { OptionsWithTextFormatting } from '@grafana/schema';\nimport { PanelOptionsEditorBuilder } from '@grafana/data';\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 {\n  FieldConfigEditorBuilder,\n  FieldOverrideEditorProps,\n  FieldType,\n  identityOverrideProcessor,\n} from '@grafana/data';\nimport React from 'react';\nimport {\n  GraphFieldConfig,\n  graphFieldOptions,\n  HorizontalGroup,\n  IconButton,\n  Input,\n  RadioButtonGroup,\n  Tooltip,\n} from '../..';\nimport { StackingConfig, StackingMode } from '@grafana/schema';\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 React, { useCallback, useEffect, useRef } from 'react';\nimport { Input } from '../Input/Input';\nimport { GrafanaTheme2, MappingType, SpecialValueMatch, SelectableValue, ValueMappingResult } from '@grafana/data';\nimport { Draggable } from 'react-beautiful-dnd';\nimport { Icon } from '../Icon/Icon';\nimport { ColorPicker } from '../ColorPicker/ColorPicker';\nimport { LinkButton } from '../Button';\nimport { HorizontalGroup } from '../Layout/Layout';\nimport { IconButton } from '../IconButton/IconButton';\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { css } from '@emotion/css';\nimport { Select } from '../Select/Select';\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}\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}\n\nexport function ValueMappingEditRow({ mapping, index, onChange, onRemove, onDuplicate: onDupliate }: Props) {\n  const { key, result } = 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 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 draggableId={`mapping-${index}`} index={index}>\n      {(provided) => (\n        <tr ref={provided.innerRef} {...provided.draggableProps}>\n          <td>\n            <div {...provided.dragHandleProps} className={styles.dragHandle}>\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                menuShouldPortal\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                  <LinkButton variant=\"primary\" fill=\"text\" onClick={props.showColorPicker} ref={props.ref} size=\"sm\">\n                    Set color\n                  </LinkButton>\n                )}\n              </ColorPicker>\n            )}\n          </td>\n          <td className={styles.textAlignCenter}>\n            <HorizontalGroup spacing=\"sm\">\n              <IconButton name=\"copy\" onClick={() => onDupliate(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  dragHandle: css({\n    cursor: 'grab',\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 React, { useEffect, useState } from 'react';\nimport { GrafanaTheme2, MappingType, SelectableValue, SpecialValueMatch, ValueMapping } from '@grafana/data';\nimport { Button } from '../Button/Button';\nimport { Modal } from '../Modal/Modal';\nimport { useStyles2 } from '../../themes';\nimport { ValueMappingEditRow, ValueMappingEditRowModel } from './ValueMappingEditRow';\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd';\nimport { css } from '@emotion/css';\nimport { ValuePicker } from '../ValuePicker/ValuePicker';\n\nexport interface Props {\n  value: ValueMapping[];\n  onChange: (valueMappings: ValueMapping[]) => void;\n  onClose: () => void;\n}\n\nexport function ValueMappingsEditorModal({ value, onChange, onClose }: 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([\n      ...rows,\n      {\n        type: value.value!,\n        isNew: true,\n        result: {},\n      },\n    ]);\n  };\n\n  const onDuplicateMapping = (index: number) => {\n    const sourceRow = 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              <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={index.toString()}\n                      mapping={row}\n                      index={index}\n                      onChange={onChangeMapping}\n                      onRemove={onRemoveRow}\n                      onDuplicate={onDuplicateMapping}\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\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  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            type: mapping.type,\n            result: mapping.options[key],\n            key,\n          });\n        }\n        break;\n      case MappingType.RangeToText:\n        editRows.push({\n          type: mapping.type,\n          result: mapping.options.result,\n          from: mapping.options.from ?? 0,\n          to: mapping.options.to ?? 0,\n        });\n        break;\n      case MappingType.RegexToText:\n        editRows.push({\n          type: mapping.type,\n          result: mapping.options.result,\n          pattern: mapping.options.pattern,\n        });\n        break;\n      case MappingType.SpecialValue:\n        editRows.push({\n          type: mapping.type,\n          result: mapping.options.result,\n          specialMatch: mapping.options.match ?? SpecialValueMatch.Null,\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 React, { useCallback, useMemo, useState } from 'react';\nimport { GrafanaTheme2, MappingType, ValueMapping } from '@grafana/data';\nimport { Button } from '../Button/Button';\nimport { Modal } from '../Modal/Modal';\nimport { useStyles2 } from '../../themes';\nimport { css } from '@emotion/css';\nimport { buildEditRowModels, editModelToSaveModel, ValueMappingsEditorModal } from './ValueMappingsEditorModal';\nimport { Icon } from '../Icon/Icon';\nimport { VerticalGroup } from '../Layout/Layout';\nimport { ColorPicker } from '../ColorPicker/ColorPicker';\n\nexport interface Props {\n  value: ValueMapping[];\n  onChange: (valueMappings: ValueMapping[]) => void;\n}\n\nexport const ValueMappingsEditor = React.memo(({ value, onChange }: Props) => {\n  const styles = useStyles2(getStyles);\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  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              <td>\n                {row.result.color && (\n                  <ColorPicker\n                    color={row.result.color}\n                    onChange={(color) => onChangeColor(color, rowIndex)}\n                    enableNamedColors={true}\n                  />\n                )}\n              </td>\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 value={value} onChange={onChange} onClose={onCloseEditor} />\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 from 'react';\n\nimport { FieldConfigEditorProps, ValueMapping, ValueMappingFieldConfigSettings } from '@grafana/data';\nimport { ValueMappingsEditor } from '../ValueMappingsEditor/ValueMappingsEditor';\n\nexport class ValueMappingsValueEditor extends React.PureComponent<\n  FieldConfigEditorProps<ValueMapping[], ValueMappingFieldConfigSettings>\n> {\n  constructor(props: FieldConfigEditorProps<ValueMapping[], ValueMappingFieldConfigSettings>) {\n    super(props);\n  }\n\n  render() {\n    const { onChange } = this.props;\n    let value = this.props.value;\n    if (!value) {\n      value = [];\n    }\n\n    return <ValueMappingsEditor value={value} onChange={onChange} />;\n  }\n}\n","import React, { PureComponent, ChangeEvent } from 'react';\nimport { css } from '@emotion/css';\nimport {\n  Threshold,\n  sortThresholds,\n  ThresholdsConfig,\n  ThresholdsMode,\n  SelectableValue,\n  GrafanaTheme,\n} from '@grafana/data';\nimport { colors } from '../../utils';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { Input } from '../Input/Input';\nimport { ColorPicker } from '../ColorPicker/ColorPicker';\nimport { stylesFactory } from '../../themes';\nimport { Icon } from '../Icon/Icon';\nimport { RadioButtonGroup } from '../Forms/RadioButtonGroup/RadioButtonGroup';\nimport { Button } from '../Button';\nimport { Label } from '../Forms/Label';\nimport { isNumber } from 'lodash';\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(\n  (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);\n","import React from 'react';\nimport { FieldConfigEditorProps, ThresholdsConfig, ThresholdsMode, ThresholdsFieldConfigSettings } from '@grafana/data';\nimport { ThresholdsEditor } from '../ThresholdsEditorNew/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 React from 'react';\n\nimport { FieldConfigEditorProps, UnitFieldConfigSettings } from '@grafana/data';\nimport { UnitPicker } from '../UnitPicker/UnitPicker';\n\nexport const UnitValueEditor: React.FC<FieldConfigEditorProps<string, UnitFieldConfigSettings>> = ({\n  value,\n  onChange,\n}) => {\n  return <UnitPicker value={value} onChange={onChange} />;\n};\n","import React from 'react';\nimport {\n  DataLink,\n  DataLinksFieldConfigSettings,\n  FieldConfigEditorProps,\n  VariableSuggestionsScope,\n} from '@grafana/data';\nimport { DataLinksInlineEditor } from '../DataLinks/DataLinksInlineEditor/DataLinksInlineEditor';\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, { CSSProperties, FC } from 'react';\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 { Select } from '../Select/Select';\nimport { ColorValueEditor } from './color';\nimport { useStyles2, useTheme2 } from '../../themes/ThemeContext';\nimport { css } from '@emotion/css';\nimport { Field } from '../Forms/Field';\nimport { RadioButtonGroup } from '../Forms/RadioButtonGroup/RadioButtonGroup';\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          menuShouldPortal\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\n            menuShouldPortal\n            minMenuHeight={200}\n            options={options}\n            value={mode}\n            onChange={onModeChange}\n            inputId={id}\n          />\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 (\n    <Select menuShouldPortal minMenuHeight={200} options={options} value={mode} onChange={onModeChange} inputId={id} />\n  );\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';\nimport { FieldConfigEditorProps, StatsPickerConfigSettings } from '@grafana/data';\nimport { StatsPicker } from '../StatsPicker/StatsPicker';\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 React from 'react';\nimport {\n  DataLink,\n  dataLinksOverrideProcessor,\n  FieldConfigPropertyItem,\n  FieldType,\n  NumberFieldConfigSettings,\n  numberOverrideProcessor,\n  standardEditorsRegistry,\n  StandardEditorsRegistryItem,\n  StringFieldConfigSettings,\n  stringOverrideProcessor,\n  ThresholdsConfig,\n  ThresholdsFieldConfigSettings,\n  thresholdsOverrideProcessor,\n  ValueMapping,\n  ValueMappingFieldConfigSettings,\n  valueMappingsOverrideProcessor,\n  ThresholdsMode,\n  identityOverrideProcessor,\n  TimeZone,\n  FieldColor,\n  FieldColorConfigSettings,\n  StatsPickerConfigSettings,\n  displayNameOverrideProcessor,\n  FieldNamePickerConfigSettings,\n} from '@grafana/data';\n\nimport { Switch } from '../components/Switch/Switch';\nimport {\n  NumberValueEditor,\n  SliderValueEditor,\n  RadioButtonGroup,\n  StringValueEditor,\n  StringArrayEditor,\n  SelectValueEditor,\n  MultiSelectValueEditor,\n  TimeZonePicker,\n} from '../components';\nimport { ValueMappingsValueEditor } from '../components/OptionsUI/mappings';\nimport { ThresholdsValueEditor } from '../components/OptionsUI/thresholds';\nimport { UnitValueEditor } from '../components/OptionsUI/units';\nimport { DataLinksValueEditor } from '../components/OptionsUI/links';\nimport { ColorValueEditor } from '../components/OptionsUI/color';\nimport { FieldColorEditor } from '../components/OptionsUI/fieldColor';\nimport { StatsPickerEditor } from '../components/OptionsUI/stats';\nimport { FieldNamePicker } from '../components/MatchersUI/FieldNamePicker';\n\n/**\n * Returns collection of common field config properties definitions\n */\nexport const getStandardFieldConfigs = () => {\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 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  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 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  return [unit, min, max, decimals, displayName, color, noValue, thresholds, mappings, links];\n};\n\n/**\n * Returns collection of standard option editors definitions\n *\n * @internal\n */\nexport const getStandardOptionEditors = () => {\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 thresholds: StandardEditorsRegistryItem<ThresholdsConfig> = {\n    id: 'thresholds',\n    name: 'Thresholds',\n    description: 'Allows defining thresholds',\n    editor: ThresholdsValueEditor as any,\n  };\n\n  const mappings: StandardEditorsRegistryItem<ValueMapping[]> = {\n    id: 'mappings',\n    name: 'Mappings',\n    description: 'Allows defining value mappings',\n    editor: ValueMappingsValueEditor 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: 'Time zone selection',\n    editor: FieldNamePicker as any,\n  };\n\n  return [\n    text,\n    number,\n    slider,\n    boolean,\n    radio,\n    select,\n    unit,\n    mappings,\n    thresholds,\n    links,\n    statsPicker,\n    strings,\n    timeZone,\n    fieldColor,\n    color,\n    multiSelect,\n    fieldName,\n  ];\n};\n","import { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor, Annotation } from 'slate';\nimport { v4 as uuidv4 } from 'uuid';\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 { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\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 { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\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 { RangeJSON, Range as SlateRange, Editor as CoreEditor } from 'slate';\nimport { Plugin } from '@grafana/slate-react';\nimport { isKeyHotkey } from 'is-hotkey';\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 { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\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 { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\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 { Plugin } from '@grafana/slate-react';\nimport { Editor as CoreEditor } from 'slate';\n\nimport { isKeyHotkey } from 'is-hotkey';\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 React from 'react';\nimport { css, cx } from '@emotion/css';\n\nimport { GrafanaTheme, renderMarkdown } from '@grafana/data';\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      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 React from 'react';\n\n// @ts-ignore\nimport Highlighter from 'react-highlight-words';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { CompletionItem, CompletionItemKind } from '../../types/completion';\nimport { PartialHighlighter } from './PartialHighlighter';\nimport { useStyles } from '../../themes/ThemeContext';\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 textToHighlight={label} searchWords={[prefix ?? '']} highlightClassName={highlightClassName} />\n      )}\n    </li>\n  );\n};\n","import { default as calculateSize } from 'calculate-size';\nimport { CompletionItemGroup, CompletionItem, CompletionItemKind } from '../types/completion';\nimport { GrafanaTheme } from '@grafana/data';\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 React, { createRef } from 'react';\nimport ReactDOM from 'react-dom';\nimport { isEqual } from 'lodash';\nimport { FixedSizeList } from 'react-window';\n\nimport { TypeaheadInfo } from './TypeaheadInfo';\nimport { TypeaheadItem } from './TypeaheadItem';\nimport { flattenGroupItems, calculateLongestLabel, calculateListSizes } from '../../utils/typeahead';\nimport { ThemeContext } from '../../themes/ThemeContext';\nimport { CompletionItem, CompletionItemGroup, CompletionItemKind } from '../../types/completion';\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\">\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 React from 'react';\nimport { debounce, sortBy } from 'lodash';\n\nimport { Editor as CoreEditor } from 'slate';\nimport { Plugin as SlatePlugin } from '@grafana/slate-react';\n\nimport TOKEN_MARK from './slate-prism/TOKEN_MARK';\nimport { Typeahead } from '../components/Typeahead/Typeahead';\nimport { CompletionItem, SuggestionsState, TypeaheadInput, TypeaheadOutput } from '../types';\nimport { makeFragment, SearchFunctionType } from '../utils';\nimport { SearchFunctionMap } from '../utils/searchFunctions';\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          .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 React from 'react';\nimport { Mark, Node, Decoration } from 'slate';\nimport { Editor } from '@grafana/slate-react';\nimport { Record } from 'immutable';\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  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';\nimport { Plugin } from '@grafana/slate-react';\nimport Options, { OptionsFormat } from './options';\nimport TOKEN_MARK from './TOKEN_MARK';\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 { createTheme, GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\nimport hoistNonReactStatics from 'hoist-non-react-statics';\nimport React, { useContext } from 'react';\nimport { Themeable, Themeable2 } from '../types/theme';\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';\nimport { GrafanaTheme2, ThemeTypographyVariant } from '@grafana/data';\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}\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';\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';\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    }\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';\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-wrapper {\n      width: 100%;\n      flex-grow: 1;\n      width: 100%;\n      min-height: 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 React from 'react';\nimport { Global } from '@emotion/react';\nimport { useTheme2 } from '..';\nimport { getElementStyles } from './elements';\nimport { getCardStyles } from './card';\nimport { getAgularPanelStyles } from './angularPanelStyles';\nimport { getPageStyles } from './page';\nimport { getMarkdownStyles } from './markdownStyles';\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';\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 { GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\nimport tinycolor from 'tinycolor2';\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: all 0.2s 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    transition: `all 0.2s cubic-bezier(0.19, 1, 0.22, 1)`,\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';\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';\nimport { ComponentSize } from './size';\nexport type IconType = 'mono' | 'default';\nexport type IconSize = ComponentSize | 'xl' | 'xxl' | 'xxxl';\n\nexport const getAvailableIcons = () =>\n  [\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    'backward',\n    'bars',\n    'bell',\n    'bell-slash',\n    'bolt',\n    'book',\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-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    '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-alt',\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    '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    '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    'wrap-text',\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.other:\n        return 'brackets-curly';\n    }\n  }\n  return 'question-circle';\n}\n","import { LinkModel } from '@grafana/data';\nimport { MenuItemProps } from '../components/Menu/MenuItem';\nimport { IconName } from '../types';\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 === '_self' ? 'link' : 'external-link-alt'}` as IconName,\n      onClick: link.onClick,\n    };\n  });\n};\n","import { HighlightPart } from '../types';\nimport { last } from 'lodash';\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","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 { Field, LinkModel } from '@grafana/data';\nimport { MouseEventHandler } from 'react';\nimport { Row } from 'react-table';\n\n/**\n * @internal\n */\nexport const getCellLinks = (field: Field, row: Row<any>) => {\n  let link: LinkModel<any> | undefined;\n  let onClick: MouseEventHandler<HTMLAnchorElement> | undefined;\n  if (field.getLinks) {\n    link = field.getLinks({\n      valueRowIndex: row.index,\n    })[0];\n  }\n\n  //const fieldLink = link?.onClick;\n  if (link?.onClick) {\n    onClick = (event) => {\n      // Allow opening in new tab\n      if (!(event.ctrlKey || event.metaKey || event.shiftKey)) {\n        event.preventDefault();\n        link!.onClick!(event, {\n          field,\n          rowIndex: row.index,\n        });\n      }\n    };\n  }\n  return {\n    link,\n    onClick,\n  };\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","// Node.closest() polyfill\nif ('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!.substr(offset, 1);\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 = window['_debug'] ?? {};\n  debugGlobal[key] = completeDebugger;\n  // @ts-ignore\n  window['_debug'] = debugGlobal;\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","const context = document.createElement('canvas').getContext('2d')!;\nconst cache = new Map<string, TextMetrics>();\nconst cacheLimit = 500;\nlet ctxFontStyle = '';\n\n/**\n * @internal\n */\nexport function getCanvasContext() {\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  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';\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","import { locationSearchToObject, locationService, navigationLogger } from '@grafana/runtime';\nimport { deprecationWarning, urlUtil } from '@grafana/data';\n\n// Ref: https://github.com/angular/angular.js/blob/ae8e903edf88a83fedd116ae02c0628bf72b150c/src/ng/location.js#L5\nconst DEFAULT_PORTS: Record<string, number> = { http: 80, https: 443, ftp: 21 };\n\nexport class AngularLocationWrapper {\n  constructor() {\n    this.absUrl = this.wrapInDeprecationWarning(this.absUrl);\n    this.hash = this.wrapInDeprecationWarning(this.hash);\n    this.host = this.wrapInDeprecationWarning(this.host);\n    this.path = this.wrapInDeprecationWarning(this.path);\n    this.port = this.wrapInDeprecationWarning(this.port, 'window.location');\n    this.protocol = this.wrapInDeprecationWarning(this.protocol, 'window.location');\n    this.replace = this.wrapInDeprecationWarning(this.replace);\n    this.search = this.wrapInDeprecationWarning(this.search);\n    this.state = this.wrapInDeprecationWarning(this.state);\n    this.url = this.wrapInDeprecationWarning(this.url);\n  }\n\n  wrapInDeprecationWarning(fn: Function, replacement?: string) {\n    let self = this;\n\n    return function wrapper() {\n      deprecationWarning('$location', fn.name, replacement || 'locationService');\n      return fn.apply(self, arguments);\n    };\n  }\n\n  absUrl(): string {\n    return `${window.location.origin}${this.url()}`;\n  }\n\n  hash(newHash?: string | null) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: hash');\n\n    if (!newHash) {\n      return locationService.getLocation().hash.substr(1);\n    } else {\n      throw new Error('AngularLocationWrapper method not implemented.');\n    }\n  }\n\n  host(): string {\n    return new URL(window.location.href).hostname;\n  }\n\n  path(pathname?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: path');\n\n    const location = locationService.getLocation();\n\n    if (pathname !== undefined && pathname !== null) {\n      let parsedPath = String(pathname);\n      parsedPath = parsedPath.startsWith('/') ? parsedPath : `/${parsedPath}`;\n      const url = new URL(`${window.location.origin}${parsedPath}`);\n\n      locationService.push({\n        pathname: url.pathname,\n        search: url.search.length > 0 ? url.search : location.search,\n        hash: url.hash.length > 0 ? url.hash : location.hash,\n      });\n      return this;\n    }\n\n    if (pathname === null) {\n      locationService.push('/');\n      return this;\n    }\n\n    return location.pathname;\n  }\n\n  port(): number | null {\n    const url = new URL(window.location.href);\n    return parseInt(url.port, 10) || DEFAULT_PORTS[url.protocol] || null;\n  }\n\n  protocol(): string {\n    return new URL(window.location.href).protocol.slice(0, -1);\n  }\n\n  replace() {\n    throw new Error('AngularLocationWrapper method not implemented.');\n  }\n\n  search(search?: any, paramValue?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: search');\n    if (!search) {\n      return locationService.getSearchObject();\n    }\n\n    if (search && arguments.length > 1) {\n      locationService.partial({\n        [search]: paramValue,\n      });\n\n      return this;\n    }\n\n    if (search) {\n      let newQuery;\n\n      if (typeof search === 'object') {\n        newQuery = { ...search };\n      } else {\n        newQuery = locationSearchToObject(search);\n      }\n\n      for (const key of Object.keys(newQuery)) {\n        // removing params with null | undefined\n        if (newQuery[key] === null || newQuery[key] === undefined) {\n          delete newQuery[key];\n        }\n      }\n\n      const updatedUrl = urlUtil.renderUrl(locationService.getLocation().pathname, newQuery);\n      locationService.push(updatedUrl);\n    }\n\n    return this;\n  }\n\n  state(state?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: state');\n    throw new Error('AngularLocationWrapper method not implemented.');\n  }\n\n  url(newUrl?: any) {\n    navigationLogger('AngularLocationWrapper', false, 'Angular compat layer: url');\n\n    if (newUrl !== undefined) {\n      if (newUrl.startsWith('#')) {\n        locationService.push({ ...locationService.getLocation(), hash: newUrl });\n      } else if (newUrl.startsWith('?')) {\n        locationService.push({ ...locationService.getLocation(), search: newUrl });\n      } else if (newUrl.trim().length === 0) {\n        locationService.push('/');\n      } else {\n        locationService.push(newUrl);\n      }\n\n      return locationService;\n    }\n\n    const location = locationService.getLocation();\n    return `${location.pathname}${location.search}${location.hash}`;\n  }\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: QueryPartDef, innerExpr: string) {\n  return innerExpr + ' ' + part.params[0];\n}\n\nexport function identityRenderer(part: QueryPartDef, innerExpr: string) {\n  return part.params[0];\n}\n\nexport function quotedIdentityRenderer(part: QueryPartDef, innerExpr: string) {\n  return '\"' + part.params[0] + '\"';\n}\n","import angular from 'angular';\n\nconst coreModule = angular.module('grafana.core', ['ngRoute']);\n\n// legacy modules\nconst angularModules = [\n  coreModule,\n  angular.module('grafana.controllers', []),\n  angular.module('grafana.directives', []),\n  angular.module('grafana.factories', []),\n  angular.module('grafana.services', []),\n  angular.module('grafana.filters', []),\n  angular.module('grafana.routes', []),\n];\n\nexport { angularModules, coreModule };\n\nexport default coreModule;\n","import { isArray } from 'lodash';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport {\n  DataFrame,\n  DataQueryResponse,\n  DataSourceApi,\n  LegacyResponseData,\n  LoadingState,\n  PanelData,\n  PanelEvents,\n  TimeRange,\n  toDataFrameDTO,\n  toLegacyResponseData,\n} from '@grafana/data';\nimport { Unsubscribable } from 'rxjs';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { PanelQueryRunner } from '../../features/query/state/PanelQueryRunner';\n\nclass MetricsPanelCtrl extends PanelCtrl {\n  declare datasource: DataSourceApi;\n  declare range: TimeRange;\n\n  contextSrv: ContextSrv;\n  datasourceSrv: any;\n  timeSrv: any;\n  templateSrv: any;\n  interval: any;\n  intervalMs: any;\n  resolution: any;\n  timeInfo?: string;\n  skipDataOnInit = false;\n  dataList: LegacyResponseData[] = [];\n  querySubscription?: Unsubscribable | null;\n  useDataFrames = false;\n  panelData?: PanelData;\n\n  constructor($scope: any, $injector: any) {\n    super($scope, $injector);\n\n    this.contextSrv = $injector.get('contextSrv');\n    this.datasourceSrv = $injector.get('datasourceSrv');\n    this.timeSrv = $injector.get('timeSrv');\n    this.templateSrv = $injector.get('templateSrv');\n    this.panel.datasource = this.panel.datasource || null;\n\n    this.events.on(PanelEvents.refresh, this.onMetricsPanelRefresh.bind(this));\n    this.events.on(PanelEvents.panelTeardown, this.onPanelTearDown.bind(this));\n    this.events.on(PanelEvents.componentDidMount, this.onMetricsPanelMounted.bind(this));\n  }\n\n  private onMetricsPanelMounted() {\n    const queryRunner = this.panel.getQueryRunner() as PanelQueryRunner;\n    this.querySubscription = queryRunner\n      .getData({ withTransforms: true, withFieldConfig: true })\n      .subscribe(this.panelDataObserver);\n  }\n\n  private onPanelTearDown() {\n    if (this.querySubscription) {\n      this.querySubscription.unsubscribe();\n      this.querySubscription = null;\n    }\n  }\n\n  private onMetricsPanelRefresh() {\n    // ignore fetching data if another panel is in fullscreen\n    if (this.otherPanelInFullscreenMode()) {\n      return;\n    }\n\n    // if we have snapshot data use that\n    if (this.panel.snapshotData) {\n      this.updateTimeRange();\n      let data = this.panel.snapshotData;\n      // backward compatibility\n      if (!isArray(data)) {\n        data = data.data;\n      }\n\n      this.panelData = {\n        state: LoadingState.Done,\n        series: data,\n        timeRange: this.range,\n      };\n\n      // Defer panel rendering till the next digest cycle.\n      // For some reason snapshot panels don't init at this time, so this helps to avoid rendering issues.\n      return this.$timeout(() => {\n        this.events.emit(PanelEvents.dataSnapshotLoad, data);\n      });\n    }\n\n    // clear loading/error state\n    delete this.error;\n    this.loading = true;\n\n    // load datasource service\n    return this.datasourceSrv\n      .get(this.panel.datasource, this.panel.scopedVars)\n      .then(this.issueQueries.bind(this))\n      .catch((err: any) => {\n        this.processDataError(err);\n      });\n  }\n\n  processDataError(err: any) {\n    // if canceled  keep loading set to true\n    if (err.cancelled) {\n      console.log('Panel request cancelled', err);\n      return;\n    }\n\n    this.error = err.message || 'Request Error';\n\n    if (err.data) {\n      if (err.data.message) {\n        this.error = err.data.message;\n      } else if (err.data.error) {\n        this.error = err.data.error;\n      }\n    }\n\n    this.angularDirtyCheck();\n  }\n\n  angularDirtyCheck() {\n    if (!this.$scope.$root.$$phase) {\n      this.$scope.$digest();\n    }\n  }\n\n  // Updates the response with information from the stream\n  panelDataObserver = {\n    next: (data: PanelData) => {\n      this.panelData = data;\n\n      if (data.state === LoadingState.Error) {\n        this.loading = false;\n        this.processDataError(data.error);\n      }\n\n      // Ignore data in loading state\n      if (data.state === LoadingState.Loading) {\n        this.loading = true;\n        this.angularDirtyCheck();\n        return;\n      }\n\n      if (data.request) {\n        const { timeInfo } = data.request;\n        if (timeInfo) {\n          this.timeInfo = timeInfo;\n        }\n      }\n\n      if (data.timeRange) {\n        this.range = data.timeRange;\n      }\n\n      if (this.useDataFrames) {\n        this.handleDataFrames(data.series);\n      } else {\n        // Make the results look as if they came directly from a <6.2 datasource request\n        const legacy = data.series.map((v) => toLegacyResponseData(v));\n        this.handleQueryResult({ data: legacy });\n      }\n\n      this.angularDirtyCheck();\n    },\n  };\n\n  updateTimeRange(datasource?: DataSourceApi) {\n    this.datasource = datasource || this.datasource;\n    this.range = this.timeSrv.timeRange();\n\n    const newTimeData = applyPanelTimeOverrides(this.panel, this.range);\n    this.timeInfo = newTimeData.timeInfo;\n    this.range = newTimeData.timeRange;\n  }\n\n  issueQueries(datasource: DataSourceApi) {\n    this.updateTimeRange(datasource);\n\n    this.datasource = datasource;\n\n    const panel = this.panel as PanelModel;\n    const queryRunner = panel.getQueryRunner();\n\n    return queryRunner.run({\n      datasource: panel.datasource,\n      queries: panel.targets,\n      panelId: panel.id,\n      dashboardId: this.dashboard.id,\n      timezone: this.dashboard.getTimezone(),\n      timeInfo: this.timeInfo,\n      timeRange: this.range,\n      maxDataPoints: panel.maxDataPoints || this.width,\n      minInterval: panel.interval,\n      scopedVars: panel.scopedVars,\n      cacheTimeout: panel.cacheTimeout,\n      transformations: panel.transformations,\n    });\n  }\n\n  handleDataFrames(data: DataFrame[]) {\n    this.loading = false;\n\n    if (this.dashboard && this.dashboard.snapshot) {\n      this.panel.snapshotData = data.map((frame) => toDataFrameDTO(frame));\n    }\n\n    try {\n      this.events.emit(PanelEvents.dataFramesReceived, data);\n    } catch (err) {\n      this.processDataError(err);\n    }\n  }\n\n  handleQueryResult(result: DataQueryResponse) {\n    this.loading = false;\n\n    if (this.dashboard.snapshot) {\n      this.panel.snapshotData = result.data;\n    }\n\n    if (!result || !result.data) {\n      console.log('Data source query result invalid, missing data field:', result);\n      result = { data: [] };\n    }\n\n    try {\n      this.events.emit(PanelEvents.dataReceived, result.data);\n    } catch (err) {\n      this.processDataError(err);\n    }\n  }\n}\n\nexport { MetricsPanelCtrl };\n","import { isString } from 'lodash';\nimport config from 'app/core/config';\nimport { profiler } from 'app/core/core';\nimport { auto } from 'angular';\nimport {\n  AppEvent,\n  PanelEvents,\n  PanelPluginMeta,\n  AngularPanelMenuItem,\n  EventBusExtended,\n  EventBusSrv,\n} from '@grafana/data';\nimport { DashboardModel } from '../../features/dashboard/state';\nimport { AngularLocationWrapper } from 'app/angular/AngularLocationWrapper';\n\nexport class PanelCtrl {\n  panel: any;\n  error: any;\n  declare dashboard: DashboardModel;\n  pluginName = '';\n  pluginId = '';\n  editorTabs: any;\n  $scope: any;\n  $injector: auto.IInjectorService;\n  $timeout: any;\n  editModeInitiated = false;\n  declare height: number;\n  declare width: number;\n  containerHeight: any;\n  events: EventBusExtended;\n  loading = false;\n  timing: any;\n  $location: AngularLocationWrapper;\n\n  constructor($scope: any, $injector: auto.IInjectorService) {\n    this.panel = this.panel ?? $scope.$parent.panel;\n    this.dashboard = this.dashboard ?? $scope.$parent.dashboard;\n    this.$injector = $injector;\n    this.$scope = $scope;\n    this.$timeout = $injector.get('$timeout');\n    this.editorTabs = [];\n    this.$location = new AngularLocationWrapper();\n    this.events = new EventBusSrv();\n    this.timing = {}; // not used but here to not break plugins\n\n    const plugin = config.panels[this.panel.type];\n    if (plugin) {\n      this.pluginId = plugin.id;\n      this.pluginName = plugin.name;\n    }\n\n    $scope.$on(PanelEvents.componentDidMount.name, () => this.panelDidMount());\n  }\n\n  panelDidMount() {\n    this.events.emit(PanelEvents.componentDidMount);\n    this.events.emit(PanelEvents.initialized);\n    this.dashboard.panelInitialized(this.panel);\n  }\n\n  renderingCompleted() {\n    profiler.renderingCompleted();\n  }\n\n  refresh() {\n    this.panel.refresh();\n  }\n\n  publishAppEvent<T>(event: AppEvent<T>, payload?: T) {\n    this.$scope.$root.appEvent(event, payload);\n  }\n\n  initEditMode() {\n    if (!this.editModeInitiated) {\n      this.editModeInitiated = true;\n      this.events.emit(PanelEvents.editModeInitialized);\n    }\n  }\n\n  addEditorTab(title: string, directiveFn: any, index?: number, icon?: any) {\n    const editorTab = { title, directiveFn, icon };\n\n    if (isString(directiveFn)) {\n      editorTab.directiveFn = () => {\n        return { templateUrl: directiveFn };\n      };\n    }\n\n    if (index) {\n      this.editorTabs.splice(index, 0, editorTab);\n    } else {\n      this.editorTabs.push(editorTab);\n    }\n  }\n\n  getExtendedMenu() {\n    const menu: AngularPanelMenuItem[] = [];\n    this.events.emit(PanelEvents.initPanelActions, menu);\n    return menu;\n  }\n\n  // Override in sub-class to add items before extended menu\n  async getAdditionalMenuItems(): Promise<any[]> {\n    return [];\n  }\n\n  otherPanelInFullscreenMode() {\n    return this.dashboard.otherPanelInFullscreen(this.panel);\n  }\n\n  render(payload?: any) {\n    this.events.emit(PanelEvents.render, payload);\n  }\n\n  // overriden from react\n  onPluginTypeChange = (plugin: PanelPluginMeta) => {};\n}\n","import { indexOf } from 'lodash';\nimport { auto } from 'angular';\n\nexport class QueryCtrl<T = any> {\n  target!: T;\n  datasource!: any;\n  panelCtrl!: any;\n  panel: any;\n  hasRawMode!: boolean;\n  error?: string | null;\n  isLastQuery: boolean;\n\n  constructor(public $scope: any, public $injector: auto.IInjectorService) {\n    this.panelCtrl = this.panelCtrl ?? $scope.ctrl.panelCtrl;\n    this.target = this.target ?? $scope.ctrl.target;\n    this.datasource = this.datasource ?? $scope.ctrl.datasource;\n    this.panel = this.panelCtrl?.panel ?? $scope.ctrl.panelCtrl.panel;\n    this.isLastQuery = indexOf(this.panel.targets, this.target) === this.panel.targets.length - 1;\n  }\n\n  refresh() {\n    this.panelCtrl.refresh();\n  }\n}\n","let templates = (require as any).context('../', true, /\\.html$/);\ntemplates.keys().forEach((key: string) => {\n  templates(key);\n});\n","import { IScope } from 'angular';\n\nexport const promiseToDigest = ($scope: IScope) => (promise: Promise<any>) => promise.finally($scope.$evalAsync);\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","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, { FC } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useTheme2, styleMixins } from '@grafana/ui';\nimport { colorManipulator } from '@grafana/data';\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 React, { HTMLAttributes } from 'react';\nimport { css } from '@emotion/css';\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 React from 'react';\nimport { css } from '@emotion/css';\nimport { IconButton, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\n\ntype Props = {\n  onClick: () => void;\n  'aria-label'?: string;\n};\n\nexport const CloseButton: React.FC<Props> = ({ onClick, 'aria-label': ariaLabel }) => {\n  const styles = useStyles2(getStyles);\n  return <IconButton aria-label={ariaLabel ?? 'Close'} className={styles} name=\"times\" onClick={onClick} />;\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 React, { PureComponent, ReactNode } from 'react';\nimport ClipboardJS from 'clipboard';\n\ninterface Props {\n  text: () => string;\n  elType?: string | React.ForwardRefExoticComponent<any>;\n  onSuccess?: (evt: any) => void;\n  onError?: (evt: any) => void;\n  className?: string;\n  children?: ReactNode;\n}\n\nexport class CopyToClipboard extends PureComponent<Props> {\n  clipboardjs?: ClipboardJS;\n  myRef: any;\n\n  constructor(props: Props) {\n    super(props);\n    this.myRef = React.createRef();\n  }\n\n  componentDidMount() {\n    this.initClipboardJS();\n  }\n\n  componentDidUpdate() {\n    if (this.clipboardjs) {\n      this.clipboardjs.destroy();\n    }\n    this.initClipboardJS();\n  }\n\n  initClipboardJS = () => {\n    const { text, onSuccess, onError } = this.props;\n\n    this.clipboardjs = new ClipboardJS(this.myRef.current, {\n      text: text,\n    });\n\n    if (onSuccess) {\n      this.clipboardjs.on('success', (evt) => {\n        evt.clearSelection();\n        onSuccess(evt);\n      });\n    }\n\n    if (onError) {\n      this.clipboardjs.on('error', (evt) => {\n        console.error('Action:', evt.action);\n        console.error('Trigger:', evt.trigger);\n        onError(evt);\n      });\n    }\n  };\n\n  componentWillUnmount() {\n    if (this.clipboardjs) {\n      this.clipboardjs.destroy();\n    }\n  }\n\n  getElementType = () => {\n    return this.props.elType || 'button';\n  };\n\n  render() {\n    const { elType, text, children, onError, onSuccess, ...restProps } = this.props;\n\n    return React.createElement(\n      this.getElementType(),\n      {\n        ref: this.myRef,\n        ...restProps,\n      },\n      this.props.children\n    );\n  }\n}\n","import React, { MouseEvent } from 'react';\nimport { css } from '@emotion/css';\nimport { CallToActionCard, Icon, IconName, LinkButton } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\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 ctaElement = (\n    <LinkButton\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    </LinkButton>\n  );\n\n  return <CallToActionCard className={ctaStyle} message={title} footer={footer()} callToActionElement={ctaElement} />;\n};\n\nexport default EmptyListCTA;\n","import React, { FC } from 'react';\nimport config from 'app/core/config';\nimport { Icon, IconName } from '@grafana/ui';\n\nexport interface FooterLink {\n  text: string;\n  id?: string;\n  icon?: string;\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 as IconName} />} {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';\nimport { Tooltip, Form, Field, VerticalGroup, Button } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\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';\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';\nimport config from 'app/core/config';\nimport { getBackendSrv } from '@grafana/runtime';\nimport appEvents from 'app/core/app_events';\nimport { AppEvents } from '@grafana/data';\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      getBackendSrv()\n        .put('/api/user/password', pw)\n        .then(() => {\n          this.toGrafana();\n        })\n        .catch((err: any) => console.error(err));\n    }\n\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  };\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 React, { FC, ReactElement } from 'react';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { FormModel } from './LoginCtrl';\nimport { Button, Form, Input, Field } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { PasswordField } from '../PasswordField/PasswordField';\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 aria-label={selectors.pages.Login.submit} className={submitButton} disabled={isLoggingIn}>\n              {isLoggingIn ? 'Logging in...' : 'Log in'}\n            </Button>\n            {children}\n          </>\n        )}\n      </Form>\n    </div>\n  );\n};\n","import React, { FC, useEffect, useState } from 'react';\nimport { cx, css, keyframes } from '@emotion/css';\nimport { useStyles2, styleMixins } from '@grafana/ui';\nimport { Branding } from '../Branding/Branding';\nimport { GrafanaTheme2 } from '@grafana/data';\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  const bgColor = theme.isDark ? '#000' : theme.colors.background.canvas;\n\n  return {\n    container: css({\n      minHeight: '100%',\n      backgroundPosition: 'center',\n      backgroundRepeat: 'no-repeat',\n      backgroundColor: bgColor,\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","// Libraries\nimport React, { FC, HTMLAttributes, useEffect } from 'react';\nimport { getTitleFromNavModel } from 'app/core/selectors/navModel';\n\n// Components\nimport PageHeader from '../PageHeader/PageHeader';\nimport { Footer } from '../Footer/Footer';\nimport { PageContents } from './PageContents';\nimport { CustomScrollbar, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2, NavModel } from '@grafana/data';\nimport { Branding } from '../Branding/Branding';\nimport { css, cx } from '@emotion/css';\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n  children: React.ReactNode;\n  navModel?: NavModel;\n}\n\nexport interface PageType extends FC<Props> {\n  Header: typeof PageHeader;\n  Contents: typeof PageContents;\n}\n\nexport const Page: PageType = ({ navModel, children, className, ...otherProps }) => {\n  const styles = useStyles2(getStyles);\n\n  useEffect(() => {\n    if (navModel) {\n      const title = getTitleFromNavModel(navModel);\n      document.title = title ? `${title} - ${Branding.AppTitle}` : Branding.AppTitle;\n    } else {\n      document.title = Branding.AppTitle;\n    }\n  }, [navModel]);\n\n  return (\n    <div {...otherProps} className={cx(styles.wrapper, className)}>\n      <CustomScrollbar autoHeightMin={'100%'}>\n        <div className=\"page-scrollbar-content\">\n          {navModel && <PageHeader model={navModel} />}\n          {children}\n          <Footer />\n        </div>\n      </CustomScrollbar>\n    </div>\n  );\n};\n\nPage.Header = PageHeader;\nPage.Contents = PageContents;\n\nexport default Page;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  wrapper: css`\n    width: 100%;\n    flex-grow: 1;\n    width: 100%;\n    min-height: 0;\n  `,\n});\n","// Libraries\nimport React, { FC } from 'react';\nimport { cx } from '@emotion/css';\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, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { Tab, TabsBar, Icon, IconName, useStyles2 } from '@grafana/ui';\nimport { NavModel, NavModelItem, NavModelBreadcrumb, GrafanaTheme2 } from '@grafana/data';\nimport { PanelHeaderMenuItem } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuItem';\n\nexport interface Props {\n  model: NavModel;\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              />\n            )\n          );\n        })}\n      </TabsBar>\n    </nav>\n  );\n};\n\nexport const PageHeader: FC<Props> = ({ model }) => {\n  const styles = useStyles2(getStyles);\n\n  if (!model) {\n    return null;\n  }\n\n  const main = model.main;\n  const children = main.children;\n\n  return (\n    <div className={styles.headerCanvas}>\n      <div className=\"page-container\">\n        <div className=\"page-header\">\n          {renderHeaderTitle(main)}\n          {children && children.length && <Navigation>{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 ?? [])}\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[]) {\n  if (!title && (!breadcrumbs || breadcrumbs.length === 0)) {\n    return null;\n  }\n\n  if (!breadcrumbs || breadcrumbs.length === 0) {\n    return <h1 className=\"page-header__title\">{title}</h1>;\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\nexport default PageHeader;\n","import React, { FC } from 'react';\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';\nimport { selectors } from '@grafana/e2e-selectors';\n\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 React, { Component } from 'react';\nimport { debounce, isNil } from 'lodash';\nimport { AsyncSelect } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\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          menuShouldPortal\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 React, { Component } from 'react';\nimport { css } from '@emotion/css';\nimport config from 'app/core/config';\nimport { UserPicker } from 'app/core/components/Select/UserPicker';\nimport { TeamPicker } from 'app/core/components/Select/TeamPicker';\nimport { Button, Form, HorizontalGroup, Select, stylesFactory } from '@grafana/ui';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { OrgUser, Team } from 'app/types';\nimport {\n  dashboardPermissionLevels,\n  dashboardAclTargets,\n  AclTarget,\n  PermissionLevel,\n  NewDashboardAclItem,\n  OrgRole,\n} from 'app/types/acl';\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: any) => {\n    const type = item.value as AclTarget;\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                menuShouldPortal\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                menuShouldPortal\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, { PureComponent } from 'react';\nimport { Select, Icon, Button } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { dashboardPermissionLevels, DashboardAcl, PermissionLevel } from 'app/types/acl';\nimport { FolderInfo } from 'app/types';\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            menuShouldPortal\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, { Component } from 'react';\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              menuShouldPortal\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';\nimport PermissionsListItem from './PermissionListItem';\nimport DisabledPermissionsListItem from './DisabledPermissionListItem';\nimport { FolderInfo } from 'app/types';\nimport { DashboardAcl } from 'app/types/acl';\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 React from 'react';\nimport { css, cx } from '@emotion/css';\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 { IconButton, IconName, useStyles2 } from '@grafana/ui';\nimport React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\ninterface 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        surface=\"header\"\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 React, { useCallback, useState } from 'react';\nimport { Icon, ReactUtils, stylesFactory, useTheme } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { useUpdateEffect } from 'react-use';\nimport { Draggable } from 'react-beautiful-dnd';\n\ninterface 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  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  const rowHeader = (\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        {title && (\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        {headerElementRendered}\n      </div>\n\n      <div className={styles.column}>\n        {actionsElement}\n        {draggable && (\n          <Icon title=\"Drag and drop to reorder\" name=\"draggabledots\" size=\"lg\" className={styles.dragIcon} />\n        )}\n      </div>\n    </div>\n  );\n\n  if (draggable) {\n    return (\n      <Draggable draggableId={id} index={index}>\n        {(provided) => {\n          const dragHandleProps = { ...provided.dragHandleProps, role: 'group' }; // replace the role=\"button\" because it causes https://dequeuniversity.com/rules/axe/4.3/nested-interactive?application=msftAI\n          return (\n            <>\n              <div ref={provided.innerRef} className={styles.wrapper} {...provided.draggableProps}>\n                <div {...dragHandleProps}>{rowHeader}</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      {rowHeader}\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    header: css`\n      label: Header;\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: 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.textWeak};\n      &:hover {\n        color: ${theme.colors.text};\n      }\n    `,\n    collapseIcon: css`\n      color: ${theme.colors.textWeak};\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.sm};\n    `,\n    title: css`\n      font-weight: ${theme.typography.weight.semibold};\n      color: ${theme.colors.textBlue};\n      margin-left: ${theme.spacing.sm};\n      overflow: hidden;\n      text-overflow: ellipsis;\n    `,\n    content: css`\n      margin-top: ${theme.spacing.inlineFormMargin};\n      margin-left: ${theme.spacing.lg};\n    `,\n    disabled: css`\n      color: ${theme.colors.textWeak};\n    `,\n  };\n});\n\nQueryOperationRow.displayName = 'QueryOperationRow';\n","import React, { FormEvent, useEffect, useRef, useState } from 'react';\nimport { css, cx } from '@emotion/css';\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 { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { getSelectStyles } from '@grafana/ui/src/components/Select/getSelectStyles';\nimport { OrgRole, Role } from 'app/types';\n\ntype BuiltInRoles = Record<string, Role[]>;\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  builtInRoles: BuiltInRoles;\n  options: Role[];\n  appliedRoles: Role[];\n  showGroups?: boolean;\n  builtinRolesDisabled?: boolean;\n  onSelect: (roles: Role[]) => void;\n  onBuiltInRoleSelect?: (role: OrgRole) => void;\n  onUpdate: (newBuiltInRole: OrgRole, newRoles: string[]) => void;\n  onClear?: () => void;\n}\n\nexport const RolePickerMenu = ({\n  builtInRole,\n  builtInRoles,\n  options,\n  appliedRoles,\n  showGroups,\n  builtinRolesDisabled,\n  onSelect,\n  onBuiltInRoleSelect,\n  onUpdate,\n  onClear,\n}: RolePickerMenuProps): JSX.Element => {\n  const [selectedOptions, setSelectedOptions] = useState<Role[]>(appliedRoles);\n  const [selectedBuiltInRole, setSelectedBuiltInRole] = useState<OrgRole>(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\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) {\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)) {\n      if (group) {\n        setSelectedOptions(selectedOptions.filter((role) => !group.options.find((option) => role.uid === option.uid)));\n      }\n    } else {\n      if (group) {\n        const restOptions = selectedOptions.filter((role) => !group.options.find((option) => role.uid === option.uid));\n        setSelectedOptions([...restOptions, ...group.options]);\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    if (onClear) {\n      onClear();\n    }\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    for (const key in selectedOptions) {\n      const roleUID = selectedOptions[key]?.uid;\n      selectedCustomRoles.push(roleUID);\n    }\n    onUpdate(selectedBuiltInRole, selectedCustomRoles);\n  };\n\n  return (\n    <div className={cx(styles.menu, customStyles.menuWrapper)}>\n      <div className={customStyles.menu} aria-label=\"Role picker menu\">\n        <CustomScrollbar autoHide={false} autoHeightMax=\"300px\" hideHorizontalTrack hideVerticalTrack>\n          <div className={customStyles.menuSection}>\n            <div className={customStyles.groupHeader}>Built-in 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          {!!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                        />\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}>\n              Clear all\n            </Button>\n            <Button size=\"sm\" onClick={onUpdateInternal}>\n              Update\n            </Button>\n          </HorizontalGroup>\n        </div>\n      </div>\n      <div ref={subMenuNode}></div>\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}\n\nexport const RolePickerSubMenu = ({\n  options,\n  selectedOptions,\n  disabledOptions,\n  onSelect,\n  onClear,\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 className={customStyles.subMenu} aria-label=\"Role picker submenu\">\n      <CustomScrollbar autoHide={false} autoHeightMax=\"300px\" 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}></span>\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    subMenu: css`\n      height: 100%;\n      min-width: 260px;\n      display: flex;\n      flex-direction: column;\n      border-left-style: solid;\n      border-left-width: 1px;\n      border-left-color: ${theme.components.input.borderColor};\n\n      & > div {\n        padding-top: ${theme.spacing(1)};\n      }\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, { ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { getInputStyles, Icon, IconName, useStyles2, getSelectStyles } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport interface Props {\n  children: ReactNode;\n  iconName?: IconName;\n}\nexport const ValueContainer = ({ children, iconName }: Props) => {\n  const styles = useStyles2(getStyles);\n  return (\n    <div className={styles.container}>\n      {iconName && <Icon name={iconName} size=\"xs\" />}\n      {children}\n    </div>\n  );\n};\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 React, { FormEvent, HTMLProps, MutableRefObject, useEffect, useRef } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useStyles2, getInputStyles, sharedInputStyle, styleMixins, Tooltip, Icon } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { ValueContainer } from './ValueContainer';\nimport { Role } from '../../../types';\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  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  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 as MutableRefObject<HTMLInputElement>).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={styles.selectedRoles} onMouseDown={onOpen}>\n      <ValueContainer>{builtInRole}</ValueContainer>\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          <div>\n            <ValueContainer>{`+${numberOfRoles} role${numberOfRoles > 1 ? 's' : ''}`}</ValueContainer>\n          </div>\n        </Tooltip>\n      )}\n    </div>\n  ) : (\n    <div className={styles.wrapper}>\n      <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\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        min-width: 520px;\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","import React, { FormEvent, useCallback, useEffect, useState } from 'react';\nimport { ClickOutsideWrapper } from '@grafana/ui';\nimport { RolePickerMenu } from './RolePickerMenu';\nimport { RolePickerInput } from './RolePickerInput';\nimport { Role, OrgRole } from 'app/types';\n\nexport interface Props {\n  builtInRole: OrgRole;\n  getRoles: () => Promise<Role[]>;\n  getRoleOptions: () => Promise<Role[]>;\n  getBuiltinRoles: () => Promise<Record<string, Role[]>>;\n  onRolesChange: (newRoles: string[]) => void;\n  onBuiltinRoleChange: (newRole: OrgRole) => void;\n  disabled?: boolean;\n  builtinRolesDisabled?: boolean;\n}\n\nexport const RolePicker = ({\n  builtInRole,\n  getRoles,\n  getRoleOptions,\n  getBuiltinRoles,\n  onRolesChange,\n  onBuiltinRoleChange,\n  disabled,\n  builtinRolesDisabled,\n}: Props): JSX.Element | null => {\n  const [isOpen, setOpen] = useState(false);\n  const [roleOptions, setRoleOptions] = useState<Role[]>([]);\n  const [appliedRoles, setAppliedRoles] = useState<Role[]>([]);\n  const [selectedRoles, setSelectedRoles] = useState<Role[]>([]);\n  const [selectedBuiltInRole, setSelectedBuiltInRole] = useState<OrgRole>(builtInRole);\n  const [builtInRoles, setBuiltinRoles] = useState<Record<string, Role[]>>({});\n  const [query, setQuery] = useState('');\n  const [isLoading, setIsLoading] = useState(true);\n\n  useEffect(() => {\n    async function fetchOptions() {\n      try {\n        let options = await getRoleOptions();\n        setRoleOptions(options.filter((option) => !option.name?.startsWith('managed:')));\n\n        const builtInRoles = await getBuiltinRoles();\n        setBuiltinRoles(builtInRoles);\n\n        const userRoles = await getRoles();\n        setAppliedRoles(userRoles);\n        setSelectedRoles(userRoles);\n      } catch (e) {\n        // TODO handle error\n        console.error('Error loading options');\n      } finally {\n        setIsLoading(false);\n      }\n    }\n\n    fetchOptions();\n  }, [getRoles, getRoleOptions, getBuiltinRoles, builtInRole]);\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 = (newBuiltInRole: OrgRole, newRoles: string[]) => {\n    onBuiltinRoleChange(newBuiltInRole);\n    onRolesChange(newRoles);\n    setOpen(false);\n    setQuery('');\n  };\n\n  const getOptions = () => {\n    if (query && query.trim() !== '') {\n      return roleOptions.filter((option) => option.name?.toLowerCase().includes(query.toLowerCase()));\n    }\n    return roleOptions;\n  };\n\n  if (isLoading) {\n    return null;\n  }\n\n  return (\n    <div data-testid=\"role-picker\" style={{ position: 'relative' }}>\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        />\n        {isOpen && (\n          <RolePickerMenu\n            options={getOptions()}\n            builtInRole={selectedBuiltInRole}\n            builtInRoles={builtInRoles}\n            appliedRoles={appliedRoles}\n            onBuiltInRoleSelect={onBuiltInRoleSelect}\n            onSelect={onSelect}\n            onUpdate={onUpdate}\n            showGroups={query.length === 0 || query.trim() === ''}\n            builtinRolesDisabled={builtinRolesDisabled}\n          />\n        )}\n      </ClickOutsideWrapper>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { Role, OrgRole } from 'app/types';\nimport { RolePicker } from './RolePicker';\n\nexport interface Props {\n  builtInRole: OrgRole;\n  userId: number;\n  orgId?: number;\n  onBuiltinRoleChange: (newRole: OrgRole) => void;\n  getRoleOptions?: () => Promise<Role[]>;\n  getBuiltinRoles?: () => Promise<{ [key: string]: Role[] }>;\n  disabled?: boolean;\n  builtinRolesDisabled?: boolean;\n}\n\nexport const UserRolePicker: FC<Props> = ({\n  builtInRole,\n  userId,\n  orgId,\n  onBuiltinRoleChange,\n  getRoleOptions,\n  getBuiltinRoles,\n  disabled,\n  builtinRolesDisabled,\n}) => {\n  return (\n    <RolePicker\n      builtInRole={builtInRole}\n      onRolesChange={(roles) => updateUserRoles(roles, userId, orgId)}\n      onBuiltinRoleChange={onBuiltinRoleChange}\n      getRoleOptions={() => (getRoleOptions ? getRoleOptions() : fetchRoleOptions(orgId))}\n      getRoles={() => fetchUserRoles(userId, orgId)}\n      getBuiltinRoles={() => (getBuiltinRoles ? getBuiltinRoles() : fetchBuiltinRoles(orgId))}\n      disabled={disabled}\n      builtinRolesDisabled={builtinRolesDisabled}\n    />\n  );\n};\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    error.isHandled = true;\n    return [];\n  }\n};\n\nexport const updateUserRoles = (roleUids: string[], userId: number, orgId?: number) => {\n  let userRolesUrl = `/api/access-control/users/${userId}/roles`;\n  if (orgId) {\n    userRolesUrl += `?targetOrgId=${orgId}`;\n  }\n  return getBackendSrv().put(userRolesUrl, {\n    orgId,\n    roleUids,\n  });\n};\n","import React, { PureComponent } from 'react';\nimport { debounce } from 'lodash';\nimport { AsyncSelect } from '@grafana/ui';\nimport { AppEvents, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport appEvents from '../../app_events';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { createFolder, getFolderById, searchFolders } from 'app/features/manage-dashboards/state/actions';\nimport { PermissionLevelString } from '../../../types';\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  allowEmpty?: boolean;\n  showRoot?: 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.getOptions, 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  getOptions = async (query: string) => {\n    const { rootName, enableReset, initialTitle, permissionLevel, initialFolderId, showRoot } = this.props;\n\n    const searchHits = await searchFolders(query, permissionLevel);\n\n    const options: Array<SelectableValue<number>> = searchHits.map((hit) => ({ label: hit.title, value: hit.id }));\n    if (contextSrv.isEditor && 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>) => {\n    if (!newFolder) {\n      newFolder = { value: 0, label: this.props.rootName };\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    // @ts-ignore\n    const newFolder = await createFolder({ title: folderName });\n    let folder = { value: -1, label: 'Not created' };\n    if (newFolder.id > -1) {\n      appEvents.emit(AppEvents.alertSuccess, ['Folder Created', 'OK']);\n      folder = { value: newFolder.id, label: newFolder.title };\n      await this.onFolderChange(folder);\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.getOptions('');\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 } = this.props;\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          menuShouldPortal\n        />\n      </div>\n    );\n  }\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, { FC } from 'react';\nimport { useAsync } from 'react-use';\nimport { Icon, IconName, Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { DEFAULT_SORT } from 'app/features/search/constants';\nimport { SearchSrv } from '../../services/search_srv';\n\nconst searchSrv = new SearchSrv();\n\nexport interface Props {\n  onChange: (sortValue: SelectableValue) => void;\n  value?: string;\n  placeholder?: string;\n  filter?: string[];\n}\n\nconst getSortOptions = (filter?: string[]) => {\n  return searchSrv.getSortOptions().then(({ sortOptions }) => {\n    const filteredOptions = filter ? sortOptions.filter((o: any) => filter.includes(o.name)) : sortOptions;\n    return filteredOptions.map((opt: any) => ({ label: opt.displayName, value: opt.name }));\n  });\n};\n\nexport const SortPicker: FC<Props> = ({ onChange, value, placeholder, filter }) => {\n  // Using sync Select and manual options fetching here since we need to find the selected option by value\n  const { loading, value: options } = useAsync<() => Promise<SelectableValue[]>>(() => getSortOptions(filter), []);\n\n  const selected = options?.find((opt) => opt.value === value);\n  return !loading ? (\n    <Select\n      menuShouldPortal\n      key={value}\n      width={25}\n      onChange={onChange}\n      value={selected ?? null}\n      options={options}\n      aria-label=\"Sort\"\n      placeholder={placeholder ?? `Sort (Default ${DEFAULT_SORT.label})`}\n      prefix={<Icon name={(value?.includes('asc') ? 'sort-amount-up' : 'sort-amount-down') as IconName} />}\n    />\n  ) : null;\n};\n","// Libraries\nimport React, { Component } from 'react';\nimport { debounce, isNil } from 'lodash';\n\n// Components\nimport { AsyncSelect } from '@grafana/ui';\n\n// Utils & Services\nimport { getBackendSrv } from '@grafana/runtime';\n\n// Types\nimport { OrgUser } from 'app/types';\nimport { SelectableValue } from '@grafana/data';\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          menuShouldPortal\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';\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 React, { FC } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useTheme, stylesFactory } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\n\nimport { OptionProps } from 'react-select/src/components/Option';\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        <TagBadge label={label} removeIcon={false} count={data.count ?? 0} />\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","// Libraries\nimport React, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { components } from 'react-select';\nimport debounce from 'debounce-promise';\nimport { stylesFactory, useTheme, resetSelectStyles, Icon, AsyncMultiSelect } from '@grafana/ui';\nimport { escapeStringForRegex, GrafanaTheme } from '@grafana/data';\n// Components\nimport { TagOption } from './TagOption';\nimport { TagBadge } from './TagBadge';\n\nexport interface TermCount {\n  term: 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 theme = useTheme();\n  const styles = getStyles(theme);\n\n  const onLoadOptions = async (query: string) => {\n    const options = await tagOptions();\n    return options.map((option) => ({\n      value: option.term,\n      label: option.term,\n      count: option.count,\n    }));\n  };\n\n  const debouncedLoadOptions = debounce(onLoadOptions, 300);\n\n  const onTagChange = (newTags: any[]) => {\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\n  const value = tags.map((tag) => ({ value: tag, label: tag, count: 0 }));\n\n  const selectOptions = {\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    loadOptions: debouncedLoadOptions,\n    loadingMessage: 'Loading...',\n    noOptionsMessage: 'No tags found',\n    onChange: onTagChange,\n    placeholder,\n    styles: resetSelectStyles(),\n    value,\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([])}>\n          Clear tags\n        </span>\n      )}\n      <AsyncMultiSelect menuShouldPortal {...selectOptions} prefix={<Icon name=\"tag-alt\" />} aria-label=\"Tag filter\" />\n    </div>\n  );\n};\n\nTagFilter.displayName = 'TagFilter';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\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: -22px;\n      right: 0;\n      cursor: pointer;\n      color: ${theme.colors.textWeak};\n\n      &:hover {\n        color: ${theme.colors.textStrong};\n      }\n    `,\n  };\n});\n","import React from 'react';\nimport { LocalStorageValueProvider } from '../LocalStorageValueProvider';\nimport { TimeRange, isDateTime, toUtc } from '@grafana/data';\nimport { TimeRangePickerProps, TimeRangePicker } from '@grafana/ui';\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 React from 'react';\nimport { css } from '@emotion/css';\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  ],\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};\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 { config, GrafanaBootConfig } from '@grafana/runtime';\nimport { PluginState } from '@grafana/data';\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 no exposed directly, this is equivolant\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 { AppNotification, AppNotificationSeverity, AppNotificationTimeout } from 'app/types';\nimport { getMessageFromError } from 'app/core/utils/errors';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst defaultSuccessNotification = {\n  title: '',\n  text: '',\n  severity: AppNotificationSeverity.Success,\n  icon: 'check',\n  timeout: AppNotificationTimeout.Success,\n};\n\nconst defaultWarningNotification = {\n  title: '',\n  text: '',\n  severity: AppNotificationSeverity.Warning,\n  icon: 'exclamation-triangle',\n  timeout: AppNotificationTimeout.Warning,\n};\n\nconst defaultErrorNotification = {\n  title: '',\n  text: '',\n  severity: AppNotificationSeverity.Error,\n  icon: 'exclamation-triangle',\n  timeout: AppNotificationTimeout.Error,\n};\n\nexport const createSuccessNotification = (title: string, text = ''): AppNotification => ({\n  ...defaultSuccessNotification,\n  title: title,\n  text: text,\n  id: uuidv4(),\n});\n\nexport const createErrorNotification = (\n  title: string,\n  text: string | Error = '',\n  component?: React.ReactElement\n): AppNotification => {\n  return {\n    ...defaultErrorNotification,\n    text: getMessageFromError(text),\n    title,\n    id: uuidv4(),\n    component,\n  };\n};\n\nexport const createWarningNotification = (title: string, text = ''): AppNotification => ({\n  ...defaultWarningNotification,\n  title: title,\n  text: text,\n  id: uuidv4(),\n});\n","import $ from 'jquery';\nimport angular from 'angular';\nimport { extend } from 'lodash';\n\nconst $win = $(window);\n\n$.fn.place_tt = (() => {\n  const defaults = {\n    offset: 5,\n  };\n\n  return function (this: any, x: number, y: number, opts: any) {\n    opts = $.extend(true, {}, defaults, opts);\n\n    return this.each(() => {\n      const $tooltip = $(this);\n      let width, height;\n\n      $tooltip.addClass('grafana-tooltip');\n\n      $('#tooltip').remove();\n      $tooltip.appendTo(document.body);\n\n      if (opts.compile) {\n        angular\n          .element(document)\n          .injector()\n          .invoke([\n            '$compile',\n            '$rootScope',\n            ($compile, $rootScope) => {\n              const tmpScope = $rootScope.$new(true);\n              extend(tmpScope, opts.scopeData);\n\n              $compile($tooltip)(tmpScope);\n              tmpScope.$digest();\n              tmpScope.$destroy();\n            },\n          ]);\n      }\n\n      width = $tooltip.outerWidth(true)!;\n      height = $tooltip.outerHeight(true)!;\n\n      const left = x + opts.offset + width > $win.width()! ? x - opts.offset - width : x + opts.offset;\n      const top = y + opts.offset + height > $win.height()! ? y - opts.offset - height : y + opts.offset;\n\n      $tooltip.css('left', left > 0 ? left : 0);\n      $tooltip.css('top', top > 0 ? top : 0);\n    });\n  };\n})();\n","import { size } from 'lodash';\nimport { BarAlignment, GraphDrawStyle, StackingMode } from '@grafana/schema';\nimport { ansicolor, colors } from '@grafana/ui';\n\nimport {\n  AbsoluteTimeRange,\n  DataFrame,\n  DataQuery,\n  DataQueryRequest,\n  DataQueryResponse,\n  DataSourceApi,\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 { getThemeColor } from 'app/core/utils/colors';\nimport { SIPrefix } from '@grafana/data/src/valueFormats/symbolFormatters';\nimport { Observable, throwError, timeout } from 'rxjs';\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', '#dde4ed'),\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\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: any = {};\n  const seriesList: any[] = [];\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  timeNanosecondField?: FieldWithIndex;\n  logLevelField?: FieldWithIndex;\n  idField?: FieldWithIndex;\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    allSeries = seriesWithFields.map((series) => {\n      const fieldCache = new FieldCache(series);\n      const stringField = fieldCache.getFirstFieldOfType(FieldType.string);\n\n      if (stringField?.labels) {\n        allLabels.push(stringField.labels);\n      }\n\n      return {\n        series,\n        timeField: fieldCache.getFirstFieldOfType(FieldType.time),\n        timeNanosecondField: fieldCache.hasFieldWithNameAndType('tsNs', FieldType.time)\n          ? fieldCache.getFieldByName('tsNs')\n          : undefined,\n        stringField,\n        logLevelField: fieldCache.getFieldByName('level'),\n        idField: getIdField(fieldCache),\n      } as LogFields;\n    });\n  }\n\n  const commonLabels = allLabels.length > 0 ? findCommonLabels(allLabels) : {};\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    const labels = stringField.labels;\n    const uniqueLabels = findUniqueLabels(labels, commonLabels);\n    if (Object.keys(uniqueLabels).length > 0) {\n      hasUniqueLabels = true;\n    }\n\n    let seriesLogLevel: LogLevel | undefined = undefined;\n    if (labels && Object.keys(labels).indexOf('level') !== -1) {\n      seriesLogLevel = getLogLevelFromKey(labels['level']);\n    }\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      let logLevel = LogLevel.unknown;\n      if (logLevelField && logLevelField.values.get(j)) {\n        logLevel = getLogLevelFromKey(logLevelField.values.get(j));\n      } else if (seriesLogLevel) {\n        logLevel = seriesLogLevel;\n      } else {\n        logLevel = getLogLevel(entry);\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: stringField.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 limitValue = Object.values(\n    limits.reduce((acc: any, elem: any) => {\n      acc[elem.refId] = elem.meta.limit;\n      return acc;\n    }, {})\n  ).reduce((acc: number, elem: any) => (acc += elem), 0) as number;\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  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\nconst LOGS_VOLUME_QUERY_DEFAULT_TIMEOUT = 60000;\n\ntype LogsVolumeQueryOptions<T extends DataQuery> = {\n  timeout?: number;\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<T extends DataQuery>(\n  datasource: DataSourceApi<T, any, any>,\n  logsVolumeRequest: DataQueryRequest<T>,\n  options: LogsVolumeQueryOptions<T>\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 subscription = (datasource.query(logsVolumeRequest) as Observable<DataQueryResponse>)\n      .pipe(\n        timeout({\n          each: options.timeout || LOGS_VOLUME_QUERY_DEFAULT_TIMEOUT,\n          with: () => throwError(new Error('Request timed-out. Please make your query more specific and try again.')),\n        })\n      )\n      .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          rawLogsVolume = rawLogsVolume.concat(dataQueryResponse.data.map(toDataFrame));\n        },\n        error: (error) => {\n          const errorMessage = error.data?.message || error.statusText || error.message;\n          console.error('Log volume query failed with error: ', errorMessage);\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 { AppEvents, UrlQueryValue } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport appEvents from '../app_events';\nimport { KioskMode } from '../../types';\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, ['Press ESC to exit Kiosk mode']);\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(queryParam?: UrlQueryValue): KioskMode {\n  switch (queryParam) {\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';\nimport { AppNotification, AppNotificationsState } from 'app/types/';\n\nexport const initialState: AppNotificationsState = {\n  appNotifications: [] as AppNotification[],\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, action: PayloadAction<AppNotification>) => {\n      const newAlert = action.payload;\n\n      for (const existingAlert of state.appNotifications) {\n        if (\n          newAlert.icon === existingAlert.icon &&\n          newAlert.severity === existingAlert.severity &&\n          newAlert.text === existingAlert.text &&\n          newAlert.title === existingAlert.title &&\n          newAlert.component === existingAlert.component\n        ) {\n          return;\n        }\n      }\n\n      state.appNotifications.push(newAlert);\n    },\n    clearAppNotification: (state, action: PayloadAction<string>): AppNotificationsState => ({\n      ...state,\n      appNotifications: state.appNotifications.filter((appNotification) => appNotification.id !== action.payload),\n    }),\n  },\n});\n\nexport const { notifyApp, clearAppNotification } = appNotificationsSlice.actions;\n\nexport const appNotificationsReducer = appNotificationsSlice.reducer;\n","import { AnyAction, createAction } from '@reduxjs/toolkit';\nimport { NavIndex, NavModel, NavModelItem } from '@grafana/data';\n\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    navIndex[node.id!] = {\n      ...node,\n      parentItem: parentItem,\n    };\n\n    if (node.children) {\n      buildNavIndex(navIndex, node.children, node);\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    breadcrumbs: [node],\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\n    let main: NavModelItem;\n    if (!onlyChild && node.parentItem) {\n      main = { ...node.parentItem };\n\n      main.children =\n        main.children &&\n        main.children.map((item) => {\n          return {\n            ...item,\n            active: item.url === node.url,\n          };\n        });\n    } else {\n      main = node;\n    }\n\n    return {\n      node,\n      main,\n    };\n  }\n\n  if (fallback) {\n    return fallback;\n  }\n\n  return getNotFoundModel();\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';\nimport { backendSrv } from './backend_srv';\n\nexport class PreferencesService {\n  constructor(private resourceUri: string) {}\n\n  update(preferences: UserPreferencesDTO): Promise<any> {\n    return backendSrv.put(`/api/${this.resourceUri}/preferences`, preferences);\n  }\n\n  load(): Promise<UserPreferencesDTO> {\n    return backendSrv.get<UserPreferencesDTO>(`/api/${this.resourceUri}/preferences`);\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 { Observable, Subject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { BackendSrvRequest, FetchResponse } from '@grafana/runtime';\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 { concatMap, filter } from 'rxjs/operators';\n\nimport { FetchQueue, FetchStatus } from './FetchQueue';\nimport { BackendSrvRequest, GrafanaBootConfig } from '@grafana/runtime';\nimport { isDataQuery } from '../utils/query';\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 React from 'react';\nimport { Button, InfoBox, Portal, stylesFactory, useTheme2 } from '@grafana/ui';\nimport { getModalStyles } from '@grafana/ui/src/components/Modal/getModalStyles';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\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 {\n  from,\n  lastValueFrom,\n  merge,\n  MonoTypeOperatorFunction,\n  Observable,\n  of,\n  Subject,\n  Subscription,\n  throwError,\n} from 'rxjs';\nimport { catchError, filter, map, mergeMap, retryWhen, share, takeUntil, tap, throwIfEmpty } from 'rxjs/operators';\nimport { fromFetch } from 'rxjs/fetch';\nimport { v4 as uuidv4 } from 'uuid';\nimport { BackendSrv as BackendService, BackendSrvRequest, FetchError, FetchResponse } from '@grafana/runtime';\nimport { AppEvents, DataQueryErrorType } from '@grafana/data';\n\nimport appEvents from 'app/core/app_events';\nimport { getConfig } from 'app/core/config';\nimport { DashboardSearchHit } from 'app/features/search/types';\nimport { FolderDTO } from 'app/types';\nimport { ContextSrv, contextSrv } from './context_srv';\nimport { parseInitFromOptions, parseResponseBody, parseUrlFromOptions } from '../utils/fetch';\nimport { isDataQuery, isLocalUrl } from '../utils/query';\nimport { FetchQueue } from './FetchQueue';\nimport { ResponseQueue } from './ResponseQueue';\nimport { FetchQueueWorker } from './FetchQueueWorker';\nimport { TokenRevokedModal } from 'app/features/users/TokenRevokedModal';\nimport { ShowModalReactEvent } from '../../types/events';\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 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 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 data = await parseResponseBody<T>(response, options.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    ]);\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(url: string, data?: any) {\n    return await this.request({ method: 'DELETE', url, data });\n  }\n\n  async post(url: string, data?: any) {\n    return await this.request({ method: 'POST', url, data });\n  }\n\n  async patch(url: string, data: any) {\n    return await this.request({ method: 'PATCH', url, data });\n  }\n\n  async put(url: string, data: any) {\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  search(query: any): Promise<DashboardSearchHit[]> {\n    return this.get('/api/search', query);\n  }\n\n  getDashboardByUid(uid: string) {\n    return this.get(`/api/dashboards/uid/${uid}`);\n  }\n\n  getFolderByUid(uid: string) {\n    return this.get<FolderDTO>(`/api/folders/${uid}`);\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 config from '../../core/config';\nimport { extend } from 'lodash';\nimport { rangeUtil } from '@grafana/data';\nimport { AccessControlAction, UserPermission } from 'app/types';\n\nexport class User {\n  id: number;\n  isGrafanaAdmin: any;\n  isSignedIn: any;\n  orgRole: any;\n  orgId: number;\n  orgName: string;\n  login: string;\n  orgCount: number;\n  timezone: string;\n  fiscalYearStartMonth: number;\n  helpFlags1: number;\n  lightTheme: boolean;\n  hasEditPermissionInFolders: boolean;\n  email?: string;\n  permissions?: UserPermission;\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.orgCount = 0;\n    this.timezone = '';\n    this.fiscalYearStartMonth = 0;\n    this.helpFlags1 = 0;\n    this.lightTheme = false;\n    this.hasEditPermissionInFolders = false;\n    this.email = undefined;\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: {} };\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  /**\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    return this.user.orgRole === role;\n  }\n\n  accessControlEnabled(): boolean {\n    return config.licenseInfo.hasLicense && config.featureToggles['accesscontrol'];\n  }\n\n  // Checks whether user has required permission\n  hasPermission(action: AccessControlAction | string): boolean {\n    // Fallback if access control disabled\n    if (!config.featureToggles['accesscontrol']) {\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 (config.featureToggles['accesscontrol']) {\n      return this.hasPermission(AccessControlAction.DataSourcesExplore);\n    }\n    return (this.isEditor || config.viewersCanEdit) && config.exploreEnabled;\n  }\n\n  hasAccess(action: string, fallBack: boolean) {\n    if (!config.featureToggles['accesscontrol']) {\n      return fallBack;\n    }\n    return this.hasPermission(action);\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 (!config.featureToggles['accesscontrol']) {\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 overriden in test environment');\n  }\n  contextSrv = override;\n};\n","import store from 'app/core/store';\nimport { filter, isArray, isNumber } from 'lodash';\nimport config from 'app/core/config';\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  getDashboardOpened() {\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 { ThemeChangedEvent } from '@grafana/runtime';\nimport appEvents from '../app_events';\nimport { config } from '../config';\nimport { PreferencesService } from './PreferencesService';\nimport { contextSrv } from '../core';\nimport { createTheme } from '@grafana/data';\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';\nimport 'mousetrap-global-bind';\nimport { LegacyGraphHoverClearEvent, locationUtil } from '@grafana/data';\nimport appEvents from 'app/core/app_events';\nimport { getExploreUrl } from 'app/core/utils/explore';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { SaveDashboardModalProxy } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardModalProxy';\nimport { locationService } from '@grafana/runtime';\nimport { exitKioskMode, toggleKioskMode } from '../navigation/kiosk';\nimport {\n  RemovePanelEvent,\n  ShiftTimeEvent,\n  ShiftTimeEventPayload,\n  ShowModalReactEvent,\n  ZoomOutEvent,\n} from '../../types/events';\nimport { contextSrv } from '../core';\nimport { getDatasourceSrv } from '../../features/plugins/datasource_srv';\nimport { getTimeSrv } from '../../features/dashboard/services/TimeSrv';\nimport { toggleTheme } from './toggleTheme';\nimport { withFocusedPanel } from './withFocusedPanelId';\nimport { HelpModal } from '../components/help/HelpModal';\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('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\n  private 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  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 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  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: SaveDashboardModalProxy,\n            props: {\n              dashboard,\n            },\n          })\n        );\n      }\n    });\n\n    this.bind('t z', () => {\n      appEvents.publish(new ZoomOutEvent(2));\n    });\n\n    this.bind('ctrl+z', () => {\n      appEvents.publish(new ZoomOutEvent(2));\n    });\n\n    this.bind('t left', () => {\n      appEvents.publish(new ShiftTimeEvent(ShiftTimeEventPayload.Left));\n    });\n\n    this.bind('t right', () => {\n      appEvents.publish(new ShiftTimeEvent(ShiftTimeEventPayload.Right));\n    });\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    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    this.bindWithPanelId('p l', (panelId) => {\n      const panelInfo = dashboard.getPanelInfoById(panelId)!;\n\n      if (panelInfo.panel.legend) {\n        panelInfo.panel.legend.show = !panelInfo.panel.legend.show;\n        panelInfo.panel.render();\n      }\n    });\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';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport store from 'app/core/store';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { hasFilters } from 'app/features/search/utils';\nimport { SECTION_STORAGE_KEY } from 'app/features/search/constants';\nimport { DashboardSection, DashboardSearchItemType, DashboardSearchHit, SearchLayout } from 'app/features/search/types';\nimport { backendSrv } from './backend_srv';\n\ninterface Sections {\n  [key: string]: Partial<DashboardSection>;\n}\n\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(key: string, def?: any) {\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      errorToThrow.name = error.name;\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';\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    if (options.col === null || 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';\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';\nimport { config, GrafanaBootConfig, ThemeChangedEvent } from '@grafana/runtime';\nimport { ThemeContext } from '@grafana/ui';\nimport { appEvents } from '../core';\nimport { createTheme } from '@grafana/data';\n\nexport const ConfigContext = React.createContext<GrafanaBootConfig>(config);\nexport const ConfigConsumer = ConfigContext.Consumer;\n\nexport const provideConfig = (component: React.ComponentType<any>) => {\n  const ConfigProvider = (props: any) => (\n    <ConfigContext.Provider value={config}>{React.createElement(component, { ...props })}</ConfigContext.Provider>\n  );\n  return ConfigProvider;\n};\n\nexport const ThemeProvider = ({ children }: { children: React.ReactNode }) => {\n  const [theme, setTheme] = useState(getCurrentUserTheme());\n\n  useEffect(() => {\n    const sub = appEvents.subscribe(ThemeChangedEvent, (event) => {\n      //config.theme = event.payload;\n      setTheme(event.payload);\n    });\n\n    return () => sub.unsubscribe();\n  }, []);\n\n  return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n};\n\nfunction getCurrentUserTheme() {\n  return createTheme({\n    colors: {\n      mode: config.bootData.user.lightTheme ? 'light' : 'dark',\n    },\n  });\n}\n\nexport const provideTheme = (component: React.ComponentType<any>) => {\n  return provideConfig((props: any) => <ThemeProvider>{React.createElement(component, { ...props })}</ThemeProvider>);\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 { 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 React from 'react';\nimport { connect, Provider } from 'react-redux';\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 { 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","// Libraries\nimport { flatten, omit, uniq } from 'lodash';\nimport { Unsubscribable } from 'rxjs';\n// Services & Utils\nimport {\n  CoreApp,\n  DataQuery,\n  DataQueryRequest,\n  DataSourceApi,\n  dateMath,\n  DefaultTimeZone,\n  HistoryItem,\n  IntervalValues,\n  LogsDedupStrategy,\n  LogsSortOrder,\n  RawTimeRange,\n  TimeFragment,\n  TimeRange,\n  TimeZone,\n  toUtc,\n  urlUtil,\n  ExploreUrlState,\n  rangeUtil,\n  DateTime,\n  isDateTime,\n} from '@grafana/data';\nimport store from 'app/core/store';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getNextRefIdChar } from './query';\n// Types\nimport { RefreshPicker } from '@grafana/ui';\nimport { ExploreId, QueryOptions, QueryTransaction } from 'app/types/explore';\nimport { config } from '../config';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DataSourceSrv } from '@grafana/runtime';\nimport { PanelModel } from 'app/features/dashboard/state';\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, originPanelId: panel.id });\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\nexport const EXPLORE_GRAPH_STYLES = ['lines', 'bars', 'points', 'stacked_lines', 'stacked_bars'] as const;\n\nexport type ExploreGraphStyle = typeof EXPLORE_GRAPH_STYLES[number];\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    originPanelId: 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', 'originPanelId', 'mode'));\n\n  const originPanelId = parsedSegments.filter((segment) => isSegment(segment, 'originPanelId'))[0];\n  return { datasource, queries, range, originPanelId };\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  return {\n    from: dateMath.parse(rawRange.from, false, timeZone as any, fiscalYearStartMonth)!,\n    to: dateMath.parse(rawRange.to, true, timeZone as any, fiscalYearStartMonth)!,\n    raw: rawRange,\n  };\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 { BackendSrvRequest } from '@grafana/runtime';\nimport { omitBy } from 'lodash';\nimport { deprecationWarning } from '@grafana/data';\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        return 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.stringToJsRegex()', '@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).substr(1, decimals - precision);\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 (\n    url.indexOf('api/datasources/proxy') !== -1 ||\n    url.indexOf('api/tsdb/query') !== -1 ||\n    url.indexOf('api/ds/query') !== -1\n  ) {\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","// Libraries\nimport { isEqual, omit } from 'lodash';\n\n// Services & Utils\nimport { DataQuery, DataSourceApi, dateTimeFormat, urlUtil, ExploreUrlState } from '@grafana/data';\nimport store from 'app/core/store';\nimport { dispatch } from 'app/store/store';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification, createWarningNotification } from 'app/core/copy/appNotification';\n\n// Types\nimport { RichHistoryQuery } from 'app/types/explore';\nimport { serializeStateToUrlParam } from '@grafana/data/src/utils/url';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nconst RICH_HISTORY_KEY = 'grafana.explore.richHistory';\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};\n\nexport enum SortOrder {\n  Descending = 'Descending',\n  Ascending = 'Ascending',\n  DatasourceAZ = 'Datasource A-Z',\n  DatasourceZA = 'Datasource Z-A',\n}\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 const MAX_HISTORY_ITEMS = 10000;\n\nexport function addToRichHistory(\n  richHistory: RichHistoryQuery[],\n  datasourceId: string,\n  datasourceName: string | null,\n  queries: DataQuery[],\n  starred: boolean,\n  comment: string | null,\n  sessionName: string,\n  showQuotaExceededError: boolean,\n  showLimitExceededWarning: boolean\n): { richHistory: RichHistoryQuery[]; localStorageFull?: boolean; limitExceeded?: boolean } {\n  const ts = Date.now();\n  /* Save only queries, that are not falsy (e.g. empty object, null, ...) */\n  const newQueriesToSave: DataQuery[] = queries && queries.filter((query) => notEmptyQuery(query));\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  const queriesToKeep = richHistory.filter((q) => q.ts > retentionPeriodLastTs || q.starred === true) || [];\n\n  if (newQueriesToSave.length > 0) {\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 = newQueriesToSave.map((q) => omit(q, ['key', 'refId']));\n    const lastQueriesToCompare =\n      queriesToKeep.length > 0 &&\n      queriesToKeep[0].queries.map((q) => {\n        return omit(q, ['key', 'refId']);\n      });\n\n    if (isEqual(newQueriesToCompare, lastQueriesToCompare)) {\n      return { richHistory };\n    }\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    let updatedHistory: RichHistoryQuery[] = [\n      {\n        queries: newQueriesToSave,\n        ts,\n        datasourceId,\n        datasourceName: datasourceName ?? '',\n        starred,\n        comment: comment ?? '',\n        sessionName,\n      },\n      ...queriesToKeep,\n    ];\n\n    try {\n      showLimitExceededWarning &&\n        limitExceeded &&\n        dispatch(\n          notifyApp(\n            createWarningNotification(\n              `Query history reached the limit of ${MAX_HISTORY_ITEMS}. Old, not-starred items will be removed.`\n            )\n          )\n        );\n      store.setObject(RICH_HISTORY_KEY, updatedHistory);\n      return { richHistory: updatedHistory, limitExceeded, localStorageFull: false };\n    } catch (error) {\n      showQuotaExceededError &&\n        dispatch(notifyApp(createErrorNotification('Saving rich history failed', error.message)));\n      return { richHistory: updatedHistory, limitExceeded, localStorageFull: error.name === 'QuotaExceededError' };\n    }\n  }\n\n  return { richHistory };\n}\n\nexport function getRichHistory(): RichHistoryQuery[] {\n  const richHistory: RichHistoryQuery[] = store.getObject(RICH_HISTORY_KEY, []);\n  const transformedRichHistory = migrateRichHistory(richHistory);\n  return transformedRichHistory;\n}\n\nexport function deleteAllFromRichHistory() {\n  return store.delete(RICH_HISTORY_KEY);\n}\n\nexport function updateStarredInRichHistory(richHistory: RichHistoryQuery[], ts: number) {\n  const updatedHistory = richHistory.map((query) => {\n    /* Timestamps are currently unique - we can use them to identify specific queries */\n    if (query.ts === ts) {\n      const isStarred = query.starred;\n      const updatedQuery = Object.assign({}, query, { starred: !isStarred });\n      return updatedQuery;\n    }\n    return query;\n  });\n\n  try {\n    store.setObject(RICH_HISTORY_KEY, updatedHistory);\n    return updatedHistory;\n  } catch (error) {\n    dispatch(notifyApp(createErrorNotification('Saving rich history failed', error.message)));\n    return richHistory;\n  }\n}\n\nexport function updateCommentInRichHistory(\n  richHistory: RichHistoryQuery[],\n  ts: number,\n  newComment: string | undefined\n) {\n  const updatedHistory = richHistory.map((query) => {\n    if (query.ts === ts) {\n      const updatedQuery = Object.assign({}, query, { comment: newComment });\n      return updatedQuery;\n    }\n    return query;\n  });\n\n  try {\n    store.setObject(RICH_HISTORY_KEY, updatedHistory);\n    return updatedHistory;\n  } catch (error) {\n    dispatch(notifyApp(createErrorNotification('Saving rich history failed', error.message)));\n    return richHistory;\n  }\n}\n\nexport function deleteQueryInRichHistory(richHistory: RichHistoryQuery[], ts: number) {\n  const updatedHistory = richHistory.filter((query) => query.ts !== ts);\n  try {\n    store.setObject(RICH_HISTORY_KEY, updatedHistory);\n    return updatedHistory;\n  } catch (error) {\n    dispatch(notifyApp(createErrorNotification('Saving rich history failed', error.message)));\n    return richHistory;\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) => (a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : 0);\n  }\n  if (sortOrder === SortOrder.Descending) {\n    sortFunc = (a: RichHistoryQuery, b: RichHistoryQuery) => (a.ts < b.ts ? 1 : a.ts > b.ts ? -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 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, true);\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 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\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.ts);\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/* Create datasource list with images. If specific datasource retrieved from Rich history is not part of\n * exploreDatasources add generic datasource image and add property isRemoved = true.\n */\nexport function createDatasourcesList(queriesDatasources: string[]) {\n  const datasources: Array<{ label: string; value: string; imgUrl: string; isRemoved: boolean }> = [];\n\n  queriesDatasources.forEach((dsName) => {\n    const dsSettings = getDataSourceSrv().getInstanceSettings(dsName);\n    if (dsSettings) {\n      datasources.push({\n        label: dsSettings.name,\n        value: dsSettings.name,\n        imgUrl: dsSettings.meta.info.logos.small,\n        isRemoved: false,\n      });\n    } else {\n      datasources.push({\n        label: dsName,\n        value: dsName,\n        imgUrl: 'public/img/icn-datasource.svg',\n        isRemoved: true,\n      });\n    }\n  });\n  return datasources;\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\nexport function 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 function filterQueriesByDataSource(queries: RichHistoryQuery[], listOfDatasourceFilters: string[]) {\n  return listOfDatasourceFilters && listOfDatasourceFilters.length > 0\n    ? queries.filter((q) => listOfDatasourceFilters.includes(q.datasourceName))\n    : queries;\n}\n\nexport function filterQueriesByTime(queries: RichHistoryQuery[], timeFilter: [number, number]) {\n  return queries.filter(\n    (q) =>\n      q.ts < createRetentionPeriodBoundary(timeFilter[0], true) &&\n      q.ts > createRetentionPeriodBoundary(timeFilter[1], false)\n  );\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\nfunction migrateRichHistory(richHistory: RichHistoryQuery[]) {\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: RichHistoryQuery, 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","import memoizeOne from 'memoize-one';\nimport { getBackendSrv, config } from '@grafana/runtime';\nimport { copyStringToClipboard } from './explore';\nimport { dispatch } from 'app/store/store';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification, createSuccessNotification } from 'app/core/copy/appNotification';\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","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\n  const to = center + (timespan * factor) / 2;\n  const from = center - (timespan * factor) / 2;\n\n  return { from, to };\n};\n","import React, { FC } from 'react';\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}\n\nconst options = Object.keys(OrgRole).map((key) => ({ label: key, value: key }));\n\nexport const OrgRolePicker: FC<Props> = ({\n  value,\n  onChange,\n  'aria-label': ariaLabel,\n  inputId,\n  autoFocus,\n  ...restProps\n}) => {\n  return (\n    <Select\n      menuShouldPortal\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 config from 'app/core/config';\nimport { dateTimeFormat, dateTimeFormatTimeAgo } from '@grafana/data';\nimport { getBackendSrv, locationService } from '@grafana/runtime';\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';\nimport { debounce } from 'lodash';\nimport { contextSrv } from 'app/core/core';\n\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 && config.licenseInfo.hasLicense) {\n        await dispatch(loadLdapSyncStatus());\n      }\n      dispatch(userAdminPageLoadedAction(true));\n    } catch (error) {\n      console.error(error);\n\n      const userError = {\n        title: error.data.message,\n        body: error.data.error,\n      };\n\n      dispatch(userAdminPageFailedAction(userError));\n    }\n  };\n}\n\nexport function loadUserProfile(userId: number): ThunkResult<void> {\n  return async (dispatch) => {\n    const user = await getBackendSrv().get(`/api/users/${userId}`);\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    const sessions = tokens.map((session: UserSession) => {\n      return {\n        id: session.id,\n        isActive: session.isActive,\n        seenAt: dateTimeFormatTimeAgo(session.seenAt),\n        createdAt: dateTimeFormat(session.createdAt, { format: 'MMMM DD, YYYY' }),\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    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 (config.licenseInfo.hasLicense && 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      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\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      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\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';\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          filters: state.filters.map((filter) => (filter.name === name ? { ...filter, value } : filter)),\n        };\n      }\n      return {\n        ...state,\n        filters: [...state.filters, action.payload],\n      };\n    },\n  },\n});\n\nexport const {\n  usersFetched,\n  usersFetchBegin,\n  usersFetchEnd,\n  queryChanged,\n  pageChanged,\n  filterChanged,\n} = userListAdminSlice.actions;\nexport const userListAdminReducer = userListAdminSlice.reducer;\n\nexport default {\n  ldap: ldapReducer,\n  userAdmin: userAdminReducer,\n  userListAdmin: userListAdminReducer,\n};\n","import { config } from 'app/core/config';\nimport { PanelModel } from 'app/features/dashboard/state';\n\nexport const hiddenReducerTypes = ['percent_diff', 'percent_diff_abs'];\nexport class ThresholdMapper {\n  static alertToGraphThresholds(panel: PanelModel) {\n    if (!panel.alert || config.unifiedAlertingEnabled) {\n      return false; // no update when no alerts\n    }\n\n    for (let i = 0; i < panel.alert.conditions.length; i++) {\n      const condition = panel.alert.conditions[i];\n      if (condition.type !== 'query') {\n        continue;\n      }\n\n      const evaluator = condition.evaluator;\n      const thresholds: any[] = (panel.thresholds = []);\n      const visible = hiddenReducerTypes.indexOf(condition.reducer?.type) === -1;\n\n      switch (evaluator.type) {\n        case 'gt': {\n          const value = evaluator.params[0];\n          thresholds.push({ value: value, op: 'gt', visible });\n          break;\n        }\n        case 'lt': {\n          const value = evaluator.params[0];\n          thresholds.push({ value: value, op: 'lt', visible });\n          break;\n        }\n        case 'outside_range': {\n          const value1 = evaluator.params[0];\n          const value2 = evaluator.params[1];\n\n          if (value1 > value2) {\n            thresholds.push({ value: value1, op: 'gt', visible });\n            thresholds.push({ value: value2, op: 'lt', visible });\n          } else {\n            thresholds.push({ value: value1, op: 'lt', visible });\n            thresholds.push({ value: value2, op: 'gt', visible });\n          }\n\n          break;\n        }\n        case 'within_range': {\n          const value1 = evaluator.params[0];\n          const value2 = evaluator.params[1];\n\n          if (value1 > value2) {\n            thresholds.push({ value: value1, op: 'lt', visible });\n            thresholds.push({ value: value2, op: 'gt', visible });\n          } else {\n            thresholds.push({ value: value1, op: 'gt', visible });\n            thresholds.push({ value: value2, op: 'lt', visible });\n          }\n          break;\n        }\n      }\n      break;\n    }\n\n    for (const t of panel.thresholds) {\n      t.fill = panel.options.alertThreshold;\n      t.line = panel.options.alertThreshold;\n      t.colorMode = 'critical';\n    }\n\n    const updated = true;\n    return updated;\n  }\n}\n","import { isArray, reduce } from 'lodash';\nimport { QueryPartDef, QueryPart } from 'app/angular/components/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\nfunction getStateDisplayModel(state: string) {\n  const normalizedState = state.toLowerCase().replace(/_/g, '');\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    case 'unknown': {\n      return {\n        text: 'UNKNOWN',\n        iconClass: 'question-circle',\n        stateClass: '.alert-state-paused',\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\n  throw { message: 'Unknown alert state' };\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 { combineReducers } from 'redux';\nimport { createAsyncMapSlice, createAsyncSlice } from '../utils/redux';\nimport {\n  fetchAlertManagerConfigAction,\n  fetchAmAlertsAction,\n  fetchEditableRuleAction,\n  fetchGrafanaNotifiersAction,\n  fetchPromRulesAction,\n  fetchRulerRulesAction,\n  fetchSilencesAction,\n  saveRuleFormAction,\n  updateAlertManagerConfigAction,\n  createOrUpdateSilenceAction,\n  fetchFolderAction,\n  fetchAlertGroupsAction,\n  checkIfLotexSupportsEditingRulesAction,\n  deleteAlertManagerConfigAction,\n  testReceiversAction,\n  updateLotexNamespaceAndGroupAction,\n  fetchExternalAlertmanagersAction,\n  fetchExternalAlertmanagersConfigAction,\n  fetchGrafanaAnnotationsAction,\n} from './actions';\n\nexport const reducer = combineReducers({\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  lotexSupportsRuleEditing: createAsyncMapSlice(\n    'lotexSupportsRuleEditing',\n    checkIfLotexSupportsEditingRulesAction,\n    (source) => source\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';\nimport { dateTime } from '@grafana/data';\nimport alertDef from './alertDef';\nimport {\n  AlertRule,\n  AlertRuleDTO,\n  AlertRulesState,\n  NotificationChannelOption,\n  NotificationChannelState,\n  NotifierDTO,\n} from 'app/types';\nimport unifiedAlertingReducer from '../unified/state/reducers';\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 {\n  setNotificationChannels,\n  notificationChannelLoaded,\n  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 React, { FC } from 'react';\nimport { IconButton, useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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 { GrafanaTheme } from '@grafana/data';\nimport { useStyles } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport React from 'react';\nimport { AlertLabel } from './AlertLabel';\n\ntype Props = { labels: Record<string, string>; className?: string };\n\nexport const AlertLabels = ({ labels, className }: Props) => {\n  const styles = useStyles(getStyles);\n  const pairs = Object.entries(labels).filter(([key]) => !(key.startsWith('__') && key.endsWith('__')));\n\n  return (\n    <div className={cx(styles.wrapper, className)}>\n      {pairs.map(([key, value], index) => (\n        <AlertLabel key={`${key}-${value}-${index}`} labelKey={key} value={value} />\n      ))}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n  wrapper: css`\n    & > * {\n      margin-bottom: ${theme.spacing.xs};\n      margin-right: ${theme.spacing.xs};\n    }\n    padding-bottom: ${theme.spacing.xs};\n  `,\n});\n","import { SelectableValue, GrafanaTheme2 } from '@grafana/data';\nimport { DataSourceType, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\nimport React, { FC, useMemo } from 'react';\nimport { Field, Select, useStyles2 } from '@grafana/ui';\nimport { getAllDataSources } from '../utils/config';\nimport { css } from '@emotion/css';\n\ninterface Props {\n  onChange: (alertManagerSourceName: string) => void;\n  current?: string;\n  disabled?: boolean;\n}\n\nexport const AlertManagerPicker: FC<Props> = ({ onChange, current, disabled = false }) => {\n  const styles = useStyles2(getStyles);\n\n  const options: Array<SelectableValue<string>> = useMemo(() => {\n    return [\n      {\n        label: 'Grafana',\n        value: GRAFANA_RULES_SOURCE_NAME,\n        imgUrl: 'public/img/grafana_icon.svg',\n        meta: {},\n      },\n      ...getAllDataSources()\n        .filter((ds) => ds.type === DataSourceType.Alertmanager)\n        .map((ds) => ({\n          label: ds.name.substr(0, 37),\n          value: ds.name,\n          imgUrl: ds.meta.info.logos.small,\n          meta: ds.meta,\n        })),\n    ];\n  }, []);\n\n  // no need to show the picker if there's only one option\n  if (options.length === 1) {\n    return null;\n  }\n\n  return (\n    <Field\n      className={styles.field}\n      label={disabled ? 'Alertmanager' : 'Choose Alertmanager'}\n      disabled={disabled}\n      data-testid=\"alertmanager-picker\"\n    >\n      <Select\n        menuShouldPortal\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 React, { FC, HTMLAttributes } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { IconSize, useStyles, Icon } from '@grafana/ui';\n\ninterface Props extends HTMLAttributes<HTMLButtonElement> {\n  isCollapsed: boolean;\n  onToggle: (isCollapsed: boolean) => void;\n  size?: IconSize;\n  className?: string;\n  text?: string;\n}\n\nexport const CollapseToggle: FC<Props> = ({ isCollapsed, onToggle, className, text, size = 'xl', ...restOfProps }) => {\n  const styles = useStyles(getStyles);\n\n  return (\n    <button\n      aria-label={`${isCollapsed ? 'Expand' : 'Collapse'} alert group`}\n      className={cx(styles.expandButton, className)}\n      onClick={() => onToggle(!isCollapsed)}\n      {...restOfProps}\n    >\n      <Icon size={size} name={isCollapsed ? 'angle-right' : 'angle-down'} />\n      {text}\n    </button>\n  );\n};\n\nexport const getStyles = () => ({\n  expandButton: css`\n    background: none;\n    border: none;\n\n    outline: none !important;\n\n    display: inline-flex;\n    align-items: center;\n\n    svg {\n      margin-bottom: 0;\n    }\n  `,\n});\n","import { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\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 { AlertmanagerGroup, AlertState } from 'app/plugins/datasource/alertmanager/types';\nimport React from 'react';\nimport { useStyles2 } from '@grafana/ui';\nimport { getNotificationsTextColors } from '../../styles/notifications';\nimport pluralize from 'pluralize';\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 React, { FC } from 'react';\nimport { FolderPicker, Props as FolderPickerProps } from 'app/core/components/Select/FolderPicker';\n\nexport interface Folder {\n  title: string;\n  id: number;\n}\n\nexport interface Props extends Omit<FolderPickerProps, 'initialTitle' | 'initialFolderId'> {\n  value?: Folder;\n}\n\nexport const RuleFolderPicker: FC<Props> = ({ value, ...props }) => (\n  <FolderPicker showRoot={false} allowEmpty={true} initialTitle={value?.title} initialFolderId={value?.id} {...props} />\n);\n","import { AlertState } from '@grafana/data';\nimport { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\nimport React, { FC } from 'react';\nimport { alertStateToReadable, alertStateToState } from '../../utils/rules';\nimport { StateTag } from '../StateTag';\ninterface Props {\n  state: PromAlertingRuleState | GrafanaAlertState | AlertState;\n}\n\nexport const AlertStateTag: FC<Props> = ({ state }) => (\n  <StateTag state={alertStateToState[state]}>{alertStateToReadable(state)}</StateTag>\n);\n","import { StoreState } from 'app/types';\nimport { useSelector } from 'react-redux';\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 { urlUtil } from '@grafana/data';\nimport { getBackendSrv } 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} from 'app/plugins/datasource/alertmanager/types';\nimport { lastValueFrom } from 'rxjs';\nimport { getDatasourceAPIId, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\nimport { isFetchError } from '../utils/alertmanager';\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/${getDatasourceAPIId(alertManagerSourceName)}/config/api/v1/alerts`,\n        showErrorAlert: false,\n        showSuccessAlert: false,\n      })\n    );\n    return {\n      template_files: result.data.template_files ?? {},\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      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/${getDatasourceAPIId(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/${getDatasourceAPIId(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/${getDatasourceAPIId(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/${getDatasourceAPIId(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/${getDatasourceAPIId(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/${getDatasourceAPIId(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/${getDatasourceAPIId(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/${getDatasourceAPIId(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/${getDatasourceAPIId(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(alertManagers: string[]): Promise<void> {\n  await lastValueFrom(\n    getBackendSrv().fetch({\n      method: 'POST',\n      data: { alertmanagers: alertManagers },\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<{ alertmanagers: string[] }> {\n  const result = await lastValueFrom(\n    getBackendSrv().fetch<{ alertmanagers: string[] }>({\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 { lastValueFrom } from 'rxjs';\nimport { FetchResponse, getBackendSrv } from '@grafana/runtime';\n\nimport { PostableRulerRuleGroupDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto';\nimport { getDatasourceAPIId, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\nimport { RULER_NOT_SUPPORTED_MSG } from '../utils/constants';\n\ninterface ErrorResponseMessage {\n  message?: string;\n  error?: string;\n}\n\n// upsert a rule group. use this to update rules\nexport async function setRulerRuleGroup(\n  dataSourceName: string,\n  namespace: string,\n  group: PostableRulerRuleGroupDTO\n): Promise<void> {\n  await lastValueFrom(\n    getBackendSrv().fetch<unknown>({\n      method: 'POST',\n      url: `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent(namespace)}`,\n      data: group,\n      showErrorAlert: false,\n      showSuccessAlert: false,\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(dataSourceName: string, filter?: FetchRulerRulesFilter) {\n  if (filter?.dashboardUID && dataSourceName !== GRAFANA_RULES_SOURCE_NAME) {\n    throw new Error('Filtering by dashboard UID is not supported for cloud rules sources.');\n  }\n\n  const params: Record<string, string> = {};\n  if (filter?.dashboardUID) {\n    params['dashboard_uid'] = filter.dashboardUID;\n    if (filter.panelId) {\n      params['panel_id'] = String(filter.panelId);\n    }\n  }\n  return rulerGetRequest<RulerRulesConfigDTO>(\n    `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules`,\n    {},\n    params\n  );\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(dataSourceName: string, namespace: string) {\n  const result = await rulerGetRequest<Record<string, RulerRuleGroupDTO[]>>(\n    `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent(namespace)}`,\n    {}\n  );\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 fetchRulerRulesGroup(\n  dataSourceName: string,\n  namespace: string,\n  group: string\n): Promise<RulerRuleGroupDTO | null> {\n  return rulerGetRequest<RulerRuleGroupDTO | null>(\n    `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent(\n      namespace\n    )}/${encodeURIComponent(group)}`,\n    null\n  );\n}\n\nexport async function deleteRulerRulesGroup(dataSourceName: string, namespace: string, groupName: string) {\n  await lastValueFrom(\n    getBackendSrv().fetch({\n      url: `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent(\n        namespace\n      )}/${encodeURIComponent(groupName)}`,\n      method: 'DELETE',\n      showSuccessAlert: false,\n      showErrorAlert: false,\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(dataSourceName: string, namespace: string): Promise<void> {\n  await lastValueFrom(\n    getBackendSrv().fetch<unknown>({\n      method: 'DELETE',\n      url: `/api/ruler/${getDatasourceAPIId(dataSourceName)}/api/v1/rules/${encodeURIComponent(namespace)}`,\n      showErrorAlert: false,\n      showSuccessAlert: false,\n    })\n  );\n}\n","import { getBackendSrv, locationService } from '@grafana/runtime';\nimport { createAsyncThunk } from '@reduxjs/toolkit';\nimport {\n  AlertmanagerAlert,\n  AlertManagerCortexConfig,\n  AlertmanagerGroup,\n  ExternalAlertmanagersResponse,\n  Receiver,\n  Silence,\n  SilenceCreatePayload,\n  TestReceiversAlert,\n} from 'app/plugins/datasource/alertmanager/types';\nimport { FolderDTO, NotifierDTO, ThunkResult } from 'app/types';\nimport { RuleIdentifier, RuleNamespace, RuleWithLocation, StateHistoryItem } from 'app/types/unified-alerting';\nimport {\n  PostableRulerRuleGroupDTO,\n  RulerGrafanaRuleDTO,\n  RulerRuleGroupDTO,\n  RulerRulesConfigDTO,\n} from 'app/types/unified-alerting-dto';\nimport { fetchNotifiers } from '../api/grafana';\nimport { fetchAnnotations } from '../api/annotations';\nimport {\n  expireSilence,\n  fetchAlertManagerConfig,\n  fetchAlerts,\n  fetchAlertGroups,\n  fetchSilences,\n  createOrUpdateSilence,\n  updateAlertManagerConfig,\n  fetchStatus,\n  deleteAlertManagerConfig,\n  testReceivers,\n  addAlertManagers,\n  fetchExternalAlertmanagers,\n  fetchExternalAlertmanagerConfig,\n} from '../api/alertmanager';\nimport { FetchPromRulesFilter, fetchRules } from '../api/prometheus';\nimport {\n  deleteNamespace,\n  deleteRulerRulesGroup,\n  fetchRulerRules,\n  fetchRulerRulesGroup,\n  fetchRulerRulesNamespace,\n  FetchRulerRulesFilter,\n  setRulerRuleGroup,\n} from '../api/ruler';\nimport { RuleFormType, RuleFormValues } from '../types/rule-form';\nimport {\n  getAllRulesSourceNames,\n  GRAFANA_RULES_SOURCE_NAME,\n  isGrafanaRulesSource,\n  isVanillaPrometheusAlertManagerDataSource,\n} from '../utils/datasource';\nimport { makeAMLink, retryWhile } from '../utils/misc';\nimport { withAppEvents, withSerializedError } from '../utils/redux';\nimport { formValuesToRulerRuleDTO, formValuesToRulerGrafanaRuleDTO } from '../utils/rule-form';\nimport {\n  isCloudRuleIdentifier,\n  isGrafanaRuleIdentifier,\n  isGrafanaRulerRule,\n  isPrometheusRuleIdentifier,\n  isRulerNotSupportedResponse,\n} from '../utils/rules';\nimport { addDefaultsToAlertmanagerConfig, isFetchError } from '../utils/alertmanager';\nimport * as ruleId from '../utils/rule-id';\nimport { isEmpty } from 'lodash';\nimport messageFromError from 'app/plugins/datasource/grafana-azure-monitor-datasource/utils/messageFromError';\nimport { RULER_NOT_SUPPORTED_MSG } from '../utils/constants';\n\nconst FETCH_CONFIG_RETRY_TIMEOUT = 30 * 1000;\n\nexport const fetchPromRulesAction = createAsyncThunk(\n  'unifiedalerting/fetchPromRules',\n  ({ rulesSourceName, filter }: { rulesSourceName: string; filter?: FetchPromRulesFilter }): Promise<RuleNamespace[]> =>\n    withSerializedError(fetchRules(rulesSourceName, filter))\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            }));\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<{ alertmanagers: string[] }> => {\n    return withSerializedError(fetchExternalAlertmanagerConfig());\n  }\n);\n\nexport const fetchRulerRulesAction = createAsyncThunk(\n  'unifiedalerting/fetchRulerRules',\n  ({\n    rulesSourceName,\n    filter,\n  }: {\n    rulesSourceName: string;\n    filter?: FetchRulerRulesFilter;\n  }): Promise<RulerRulesConfigDTO | null> => {\n    return withSerializedError(fetchRulerRules(rulesSourceName, filter));\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 fetchAllPromAndRulerRulesAction(force = false): ThunkResult<void> {\n  return (dispatch, getStore) => {\n    const { promRules, rulerRules } = getStore().unifiedAlerting;\n    getAllRulesSourceNames().map((rulesSourceName) => {\n      if (force || !promRules[rulesSourceName]?.loading) {\n        dispatch(fetchPromRulesAction({ rulesSourceName }));\n      }\n      if (force || !rulerRules[rulesSourceName]?.loading) {\n        dispatch(fetchRulerRulesAction({ rulesSourceName }));\n      }\n    });\n  };\n}\n\nexport function fetchAllPromRulesAction(force = false): ThunkResult<void> {\n  return (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\nasync function findEditableRule(ruleIdentifier: RuleIdentifier): Promise<RuleWithLocation | null> {\n  if (isGrafanaRuleIdentifier(ruleIdentifier)) {\n    const namespaces = await fetchRulerRules(GRAFANA_RULES_SOURCE_NAME);\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(ruleSourceName, 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\nexport const fetchEditableRuleAction = createAsyncThunk(\n  'unifiedalerting/fetchEditableRule',\n  (ruleIdentifier: RuleIdentifier): Promise<RuleWithLocation | null> =>\n    withSerializedError(findEditableRule(ruleIdentifier))\n);\n\nasync function deleteRule(ruleWithLocation: RuleWithLocation): Promise<void> {\n  const { ruleSourceName, namespace, group, rule } = ruleWithLocation;\n  // in case of GRAFANA, each group implicitly only has one rule. delete the group.\n  if (isGrafanaRulesSource(ruleSourceName)) {\n    await deleteRulerRulesGroup(GRAFANA_RULES_SOURCE_NAME, namespace, group.name);\n    return;\n  }\n  // in case of CLOUD\n  // it was the last rule, delete the entire group\n  if (group.rules.length === 1) {\n    await deleteRulerRulesGroup(ruleSourceName, namespace, group.name);\n    return;\n  }\n  // post the group with rule removed\n  await setRulerRuleGroup(ruleSourceName, namespace, {\n    ...group,\n    rules: group.rules.filter((r) => r !== rule),\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) => {\n    withAppEvents(\n      (async () => {\n        const ruleWithLocation = await findEditableRule(ruleIdentifier);\n        if (!ruleWithLocation) {\n          throw new Error('Rule not found.');\n        }\n        await deleteRule(ruleWithLocation);\n        // refetch rules for this rules source\n        dispatch(fetchRulerRulesAction({ rulesSourceName: ruleWithLocation.ruleSourceName }));\n        dispatch(fetchPromRulesAction({ 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\nasync function saveLotexRule(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(dataSourceName, 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(dataSourceName, 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(dataSourceName, 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\nasync function saveGrafanaRule(values: RuleFormValues, existing?: RuleWithLocation): Promise<RuleIdentifier> {\n  const { folder, evaluateEvery } = values;\n  const formRule = formValuesToRulerGrafanaRuleDTO(values);\n\n  if (!folder) {\n    throw new Error('Folder must be specified');\n  }\n\n  // updating an existing rule...\n  if (existing) {\n    // refetch it to be sure we have the latest\n    const freshExisting = await findEditableRule(ruleId.fromRuleWithLocation(existing));\n    if (!freshExisting) {\n      throw new Error('Rule not found.');\n    }\n\n    // if same folder, repost the group with updated rule\n    if (freshExisting.namespace === folder.title) {\n      const uid = (freshExisting.rule as RulerGrafanaRuleDTO).grafana_alert.uid!;\n      formRule.grafana_alert.uid = uid;\n      await setRulerRuleGroup(GRAFANA_RULES_SOURCE_NAME, freshExisting.namespace, {\n        name: freshExisting.group.name,\n        interval: evaluateEvery,\n        rules: [formRule],\n      });\n      return { uid };\n    }\n  }\n\n  // if creating new rule or folder was changed, create rule in a new group\n  const targetFolderGroups = await fetchRulerRulesNamespace(GRAFANA_RULES_SOURCE_NAME, folder.title);\n\n  // set group name to rule name, but be super paranoid and check that this group does not already exist\n  const groupName = getUniqueGroupName(values.name, targetFolderGroups);\n  formRule.grafana_alert.title = groupName;\n\n  const payload: PostableRulerRuleGroupDTO = {\n    name: groupName,\n    interval: evaluateEvery,\n    rules: [formRule],\n  };\n  await setRulerRuleGroup(GRAFANA_RULES_SOURCE_NAME, folder.title, payload);\n\n  // now refetch this group to get the uid, hah\n  const result = await fetchRulerRulesGroup(GRAFANA_RULES_SOURCE_NAME, folder.title, groupName);\n  const newUid = (result?.rules[0] as RulerGrafanaRuleDTO)?.grafana_alert?.uid;\n  if (newUid) {\n    // if folder has changed, delete the old one\n    if (existing) {\n      const freshExisting = await findEditableRule(ruleId.fromRuleWithLocation(existing));\n      if (freshExisting && freshExisting.namespace !== folder.title) {\n        await deleteRule(freshExisting);\n      }\n    }\n\n    return { uid: newUid };\n  } else {\n    throw new Error('Failed to fetch created rule.');\n  }\n}\n\nexport function getUniqueGroupName(currentGroupName: string, existingGroups: RulerRuleGroupDTO[]) {\n  let newGroupName = currentGroupName;\n  let idx = 1;\n  while (!!existingGroups.find((g) => g.name === newGroupName)) {\n    newGroupName = `${currentGroupName}-${++idx}`;\n  }\n\n  return newGroupName;\n}\n\nexport const saveRuleFormAction = createAsyncThunk(\n  'unifiedalerting/saveRuleForm',\n  ({\n    values,\n    existing,\n    redirectOnSave,\n  }: {\n    values: RuleFormValues;\n    existing?: RuleWithLocation;\n    redirectOnSave?: string;\n  }): Promise<void> =>\n    withAppEvents(\n      withSerializedError(\n        (async () => {\n          const { type } = values;\n          // in case of system (cortex/loki)\n          let identifier: RuleIdentifier;\n          if (type === RuleFormType.cloudAlerting || type === RuleFormType.cloudRecording) {\n            identifier = await saveLotexRule(values, existing);\n            // in case of grafana managed\n          } else if (type === RuleFormType.grafana) {\n            identifier = await saveGrafanaRule(values, existing);\n          } else {\n            throw new Error('Unexpected rule form type');\n          }\n          if (redirectOnSave) {\n            locationService.push(redirectOnSave);\n          } else {\n            // redirect to edit page\n            const newLocation = `/alerting/${encodeURIComponent(ruleId.stringifyIdentifier(identifier))}/edit`;\n            if (locationService.getLocation().pathname !== newLocation) {\n              locationService.replace(newLocation);\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((getBackendSrv() as any).getFolderByUid(uid))\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 checkIfLotexSupportsEditingRulesAction = createAsyncThunk<boolean, string>(\n  'unifiedalerting/checkIfLotexRuleEditingSupported',\n  async (rulesSourceName: string): Promise<boolean> =>\n    withAppEvents(\n      (async () => {\n        try {\n          await fetchRulerRulesGroup(rulesSourceName, 'test', 'test');\n          return true;\n        } catch (e) {\n          if (\n            (isFetchError(e) &&\n              (e.data.message?.includes('GetRuleGroup unsupported in rule local store') || // \"local\" rule storage\n                e.data.message?.includes('page not found'))) || // ruler api disabled\n            e.message?.includes('404 from rules config endpoint') || // ruler api disabled\n            e.data.message?.includes(RULER_NOT_SUPPORTED_MSG) // ruler api not supported\n          ) {\n            return false;\n          }\n          throw e;\n        }\n      })(),\n      {\n        errorMessage: `Failed to determine if \"${rulesSourceName}\" allows editing rules`,\n      }\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\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          // fetch rules and perform sanity checks\n          const rulesResult = await fetchRulerRules(rulesSourceName);\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                rulesSourceName,\n                newNamespaceName,\n                group.name === groupName\n                  ? {\n                      ...group,\n                      name: newGroupName,\n                      interval: groupInterval,\n                    }\n                  : group\n              );\n            }\n            await deleteNamespace(rulesSourceName, namespaceName);\n\n            // if only modifying group...\n          } else {\n            // save updated group\n            await setRulerRuleGroup(rulesSourceName, 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(rulesSourceName, 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 (alertManagerUrls: string[], thunkAPI): Promise<void> => {\n    return withAppEvents(\n      withSerializedError(\n        (async () => {\n          await addAlertManagers(alertManagerUrls);\n          thunkAPI.dispatch(fetchExternalAlertmanagersConfigAction());\n        })()\n      ),\n      {\n        errorMessage: 'Failed adding alertmanagers',\n        successMessage: 'Alertmanagers updated',\n      }\n    );\n  }\n);\n","import { lastValueFrom } from 'rxjs';\nimport { getBackendSrv } from '@grafana/runtime';\n\nimport { RuleNamespace } from 'app/types/unified-alerting';\nimport { PromRulesResponse } from 'app/types/unified-alerting-dto';\nimport { getDatasourceAPIId, GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\n\nexport interface FetchPromRulesFilter {\n  dashboardUID: string;\n  panelId?: number;\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 not supported for cloud rules sources.');\n  }\n\n  const params: Record<string, string> = {};\n  if (filter?.dashboardUID) {\n    params['dashboard_uid'] = filter.dashboardUID;\n    if (filter.panelId) {\n      params['panel_id'] = String(filter.panelId);\n    }\n  }\n\n  const response = await lastValueFrom(\n    getBackendSrv().fetch<PromRulesResponse>({\n      url: `/api/prometheus/${getDatasourceAPIId(dataSourceName)}/api/v1/rules`,\n      showErrorAlert: false,\n      showSuccessAlert: false,\n      params,\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 { 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 { getBackendSrv } from '@grafana/runtime';\nimport { StateHistoryItem } from 'app/types/unified-alerting';\n\nexport function fetchAnnotations(alertId: string): Promise<StateHistoryItem[]> {\n  return getBackendSrv().get('/api/annotations', {\n    alertId,\n  });\n}\n","import { GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\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 { 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 RuleFormValues {\n  // common\n  name: string;\n  type?: RuleFormType;\n  dataSourceName: string | null;\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: { title: string; id: number } | null;\n  evaluateEvery: string;\n  evaluateFor: string;\n\n  // cortex / loki rules\n  namespace: string;\n  group: string;\n  forTime: number;\n  forTimeUnit: string;\n  expression: string;\n}\n","import { AlertManagerCortexConfig, MatcherOperator, Route, Matcher } from 'app/plugins/datasource/alertmanager/types';\nimport { Labels } from 'app/types/unified-alerting-dto';\nimport { MatcherFieldValue } from '../types/silence-form';\nimport { SelectableValue } from '@grafana/data';\nimport { getAllDataSources } from './config';\nimport { DataSourceType } from './datasource';\nimport { FetchError } from '@grafana/runtime';\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\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 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\nfunction unescapeMatcherValue(value: string) {\n  let trimmed = value.trim().replace(/\\\\\"/g, '\"');\n  if (trimmed.startsWith('\"') && trimmed.endsWith('\"') && !trimmed.endsWith('\\\\\"')) {\n    trimmed = trimmed.substr(1, trimmed.length - 2);\n  }\n  return trimmed.replace(/\\\\\"/g, '\"');\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.substr(0, idx).trim();\n  const value = unescapeMatcherValue(trimmed.substr(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 isFetchError(e: unknown): e is FetchError {\n  return typeof e === 'object' && e !== null && 'status' in e && 'data' in e;\n}\n","import { DataSourceInstanceSettings, DataSourceJsonData } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nexport function getAllDataSources(): Array<DataSourceInstanceSettings<DataSourceJsonData>> {\n  return Object.values(config.datasources);\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 { AlertManagerDataSourceJsonData, AlertManagerImplementation } from 'app/plugins/datasource/alertmanager/types';\nimport { RulesSource } from 'app/types/unified-alerting';\nimport { getAllDataSources } from './config';\n\nexport const GRAFANA_RULES_SOURCE_NAME = 'grafana';\n\nexport enum DataSourceType {\n  Alertmanager = 'alertmanager',\n  Loki = 'loki',\n  Prometheus = 'prometheus',\n}\n\nexport const RulesDataSourceTypes: string[] = [DataSourceType.Loki, DataSourceType.Prometheus];\n\nexport function getRulesDataSources() {\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 getAlertManagerDataSources() {\n  return getAllDataSources()\n    .filter((ds) => ds.type === DataSourceType.Alertmanager)\n    .sort((a, b) => a.name.localeCompare(b.name));\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  return [...getRulesDataSources().map((r) => r.name), GRAFANA_RULES_SOURCE_NAME];\n}\n\nexport function getAllRulesSources(): RulesSource[] {\n  return [...getRulesDataSources(), GRAFANA_RULES_SOURCE_NAME];\n}\n\nexport function getRulesSourceName(rulesSource: RulesSource): string {\n  return isCloudRulesSource(rulesSource) ? rulesSource.name : rulesSource;\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","import { Matcher } from 'app/plugins/datasource/alertmanager/types';\nimport { Labels } from '@grafana/data';\nimport { parseMatcher } from './alertmanager';\nimport { uniqBy } from 'lodash';\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","import { urlUtil, UrlQueryMap, Labels } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { CombinedRule, FilterState, RulesSource, SilenceFilterState } from 'app/types/unified-alerting';\nimport { ALERTMANAGER_NAME_QUERY_KEY } from './constants';\nimport { getRulesSourceName } from './datasource';\nimport * as ruleId from './rule-id';\nimport { getMatcherQueryParams } from './matchers';\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 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): string {\n  return `${path}${alertManagerName ? `?${ALERTMANAGER_NAME_QUERY_KEY}=${encodeURIComponent(alertManagerName)}` : ''}`;\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\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","import { isArray } from 'angular';\nimport { AsyncThunk, createSlice, Draft, isAsyncThunkAction, PayloadAction, SerializedError } from '@reduxjs/toolkit';\nimport { FetchError } from '@grafana/runtime';\nimport { AppEvents } from '@grafana/data';\n\nimport { appEvents } from 'app/core/core';\nimport { isFetchError } from './alertmanager';\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 (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","import {\n  DataQuery,\n  rangeUtil,\n  RelativeTimeRange,\n  ScopedVars,\n  getDefaultRelativeTimeRange,\n  TimeRange,\n  IntervalValues,\n  DataSourceRef,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/services/context_srv';\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  Annotations,\n  GrafanaAlertStateDecision,\n  AlertQuery,\n  Labels,\n  PostableRuleGrafanaRuleDTO,\n  RulerRuleDTO,\n} from 'app/types/unified-alerting-dto';\nimport { EvalFunction } from '../../state/alertDef';\nimport { RuleFormType, RuleFormValues } from '../types/rule-form';\nimport { Annotation } from './constants';\nimport { isGrafanaRulesSource } from './datasource';\nimport { arrayToRecord, recordToArray } from './misc';\nimport { isAlertingRulerRule, isGrafanaRulerRule, isRecordingRulerRule } from './rules';\nimport { parseInterval } from './time';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\n\nexport const getDefaultFormValues = (): RuleFormValues =>\n  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: !contextSrv.isEditor ? RuleFormType.grafana : undefined, // viewers can't create prom alerts\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    group: '',\n    namespace: '',\n    expression: '',\n    forTime: 1,\n    forTimeUnit: 'm',\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        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 = getDataSourceSrv().getInstanceSettings('default');\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  };\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';\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! };\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 };\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 { AlertState } from '@grafana/data';\nimport {\n  GrafanaAlertState,\n  PromAlertingRuleState,\n  PromRuleType,\n  RulerAlertingRuleDTO,\n  RulerGrafanaRuleDTO,\n  RulerRecordingRuleDTO,\n  RulerRuleDTO,\n} from 'app/types/unified-alerting-dto';\nimport {\n  Alert,\n  AlertingRule,\n  CloudRuleIdentifier,\n  GrafanaRuleIdentifier,\n  PrometheusRuleIdentifier,\n  PromRuleWithLocation,\n  RecordingRule,\n  Rule,\n  RuleIdentifier,\n  RuleNamespace,\n} from 'app/types/unified-alerting';\nimport { AsyncRequestState } from './redux';\nimport { RULER_NOT_SUPPORTED_MSG } from './constants';\nimport { capitalize } from 'lodash';\nimport { State } from '../components/StateTag';\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 | GrafanaAlertState | 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 const alertStateToState: 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    if (alert.activeAt && alert.state !== GrafanaAlertState.Normal) {\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","export enum TimeOptions {\n  seconds = 's',\n  minutes = 'm',\n  hours = 'h',\n  days = 'd',\n  weeks = 'w',\n}\n","import { describeInterval } from '@grafana/data/src/datetime/rangeutil';\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","import { AnnotationEvent } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\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';\nimport { CoreApp, DataQueryRequest, DataSourceApi, rangeUtil, ScopedVars } from '@grafana/data';\n\nimport { AnnotationQueryOptions, AnnotationQueryResponse } from './types';\nimport { standardAnnotationSupport } from './standardAnnotationSupport';\nimport { runRequest } from '../query/state/runRequest';\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 { Observable, of, OperatorFunction } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\nimport {\n  AnnotationEvent,\n  AnnotationEventFieldSource,\n  AnnotationEventMappings,\n  AnnotationQuery,\n  AnnotationSupport,\n  DataFrame,\n  Field,\n  FieldType,\n  getFieldDisplayName,\n  KeyValue,\n  standardTransformers,\n} from '@grafana/data';\n\nimport { isString } from 'lodash';\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          query,\n        },\n        mappings: {},\n      };\n    }\n    return json as AnnotationQuery;\n  },\n\n  /**\n   * Convert the stored JSON model and environment to a standard data source query object.\n   * This query will be executed in the data source and the results converted into events.\n   * Returning an undefined result will quietly skip query execution\n   */\n  prepareQuery: (anno: AnnotationQuery) => anno.target,\n\n  /**\n   * When the standard frame > event processing is insufficient, this allows explicit control of the mappings\n   */\n  processEvents: (anno: AnnotationQuery, data: DataFrame[]) => {\n    return getAnnotationsFromData(data, anno.mappings);\n  },\n};\n\n/**\n * Flatten all panel data into a single frame\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];\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","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};\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    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 } = apiKeysSlice.actions;\n\nexport const apiKeysReducer = apiKeysSlice.reducer;\n\nexport default {\n  apiKeys: apiKeysReducer,\n};\n","import { defaults, each, sortBy } from 'lodash';\n\nimport config from 'app/core/config';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { PanelPluginMeta } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { VariableOption, VariableRefresh } from '../../../variables/types';\nimport { isConstant, isQuery } from '../../../variables/guard';\nimport { LibraryElementKind } from '../../../library-panels/types';\nimport { isPanelModelLibraryPanel } from '../../../library-panels/guard';\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 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  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 promises: Array<Promise<void>> = [];\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) => {\n      let datasource: string = obj.datasource;\n      let datasourceVariable: any = null;\n\n      // ignore data source properties that contain a variable\n      if (datasource && (datasource as any).uid) {\n        const uid = (datasource as any).uid as string;\n        if (uid.indexOf('$') === 0) {\n          datasourceVariable = variableLookup[uid.substring(1)];\n          if (datasourceVariable && datasourceVariable.current) {\n            datasource = datasourceVariable.current.value;\n          }\n        }\n      }\n\n      promises.push(\n        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            if (!obj.datasource || typeof obj.datasource === 'string') {\n              obj.datasource = '${' + refName + '}';\n            } else {\n              obj.datasource.uid = '${' + refName + '}';\n            }\n          })\n      );\n    };\n\n    const processPanel = (panel: PanelModel) => {\n      if (panel.datasource !== undefined && panel.datasource !== null) {\n        templateizeDatasourceUsage(panel);\n      }\n\n      if (panel.targets) {\n        for (const target of panel.targets) {\n          if (target.datasource !== undefined) {\n            templateizeDatasourceUsage(target);\n          }\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    const processLibraryPanels = (panel: any) => {\n      if (isPanelModelLibraryPanel(panel)) {\n        const { libraryPanel, ...model } = panel;\n        const { name, uid } = libraryPanel;\n        if (!libraryPanels.has(uid)) {\n          libraryPanels.set(uid, { name, uid, kind: LibraryElementKind.Panel, model });\n        }\n      }\n    };\n\n    // check up panel data sources\n    for (const panel of saveModel.panels) {\n      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          processPanel(rowPanel);\n        }\n      }\n    }\n\n    // templatize template vars\n    for (const variable of saveModel.getVariables()) {\n      if (isQuery(variable)) {\n        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      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    return Promise.all(promises)\n      .then(() => {\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        // make inputs and requires a top thing\n        const newObj: { [key: string]: {} } = {};\n        newObj['__inputs'] = inputs;\n        newObj['__elements'] = [...libraryPanels.values()];\n        newObj['__requires'] = sortBy(requires, ['id']);\n\n        defaults(newObj, saveModel);\n        return newObj;\n      })\n      .catch((err) => {\n        console.error('Export failed:', err);\n        return {\n          error: err,\n        };\n      });\n  }\n}\n","// Libraries\nimport React, { FunctionComponent, MouseEvent } from 'react';\nimport { css } from '@emotion/css';\n// Components\nimport { IconName, IconType, IconSize, IconButton, useTheme, stylesFactory } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\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","// Libraries\nimport React, { Component } from 'react';\nimport { dateMath, TimeRange, TimeZone } from '@grafana/data';\nimport { TimeRangeUpdatedEvent } from '@grafana/runtime';\n\n// Types\nimport { DashboardModel } from '../../state';\n\n// Components\nimport { defaultIntervals, RefreshPicker, ToolbarButtonRow } from '@grafana/ui';\nimport { TimePickerWithHistory } from 'app/core/components/TimePicker/TimePickerWithHistory';\n\n// Utils & Services\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { appEvents } from 'app/core/core';\nimport { ShiftTimeEvent, ShiftTimeEventPayload, ZoomOutEvent } from '../../../../types/events';\nimport { Unsubscribable } from 'rxjs';\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().refreshDashboard();\n    return Promise.resolve();\n  };\n\n  onMoveBack = () => {\n    appEvents.publish(new ShiftTimeEvent(ShiftTimeEventPayload.Left));\n  };\n\n  onMoveForward = () => {\n    appEvents.publish(new ShiftTimeEvent(ShiftTimeEventPayload.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(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=\"Refresh dashboard\"\n          noIntervalPicker={hideIntervalPicker}\n        />\n      </ToolbarButtonRow>\n    );\n  }\n}\n","// Libaries\nimport React, { PureComponent, FC, ReactNode } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n// Utils & Services\nimport { playlistSrv } from 'app/features/playlist/PlaylistSrv';\n// Components\nimport { DashNavButton } from './DashNavButton';\nimport { DashNavTimeControls } from './DashNavTimeControls';\nimport { ButtonGroup, ModalsController, ToolbarButton, PageToolbar } from '@grafana/ui';\nimport { locationUtil, textUtil } from '@grafana/data';\n// State\nimport { updateTimeZoneForSession } from 'app/features/profile/state/reducers';\n// Types\nimport { DashboardModel } from '../../state';\nimport { KioskMode } from 'app/types';\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { SaveDashboardModalProxy } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardModalProxy';\nimport { locationService } from '@grafana/runtime';\nimport { toggleKioskMode } from 'app/core/navigation/kiosk';\nimport { getDashboardSrv } from '../../services/DashboardSrv';\n\nconst mapDispatchToProps = {\n  updateTimeZoneForSession,\n};\n\nconst connector = connect(null, mapDispatchToProps);\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\nclass DashNav extends PureComponent<Props> {\n  constructor(props: Props) {\n    super(props);\n  }\n\n  onClose = () => {\n    locationService.partial({ viewPanel: null });\n  };\n\n  onToggleTVMode = () => {\n    toggleKioskMode();\n  };\n\n  onOpenSettings = () => {\n    locationService.partial({ editview: 'settings' });\n  };\n\n  onStarDashboard = () => {\n    const { dashboard } = this.props;\n    const dashboardSrv = getDashboardSrv();\n\n    dashboardSrv.starDashboard(dashboard.id, dashboard.meta.isStarred).then((newState: any) => {\n      dashboard.meta.isStarred = newState;\n      this.forceUpdate();\n    });\n  };\n\n  onPlaylistPrev = () => {\n    playlistSrv.prev();\n  };\n\n  onPlaylistNext = () => {\n    playlistSrv.next();\n  };\n\n  onPlaylistStop = () => {\n    playlistSrv.stop();\n    this.forceUpdate();\n  };\n\n  addCustomContent(actions: DashNavButtonModel[], buttons: ReactNode[]) {\n    actions.map((action, index) => {\n      const Component = action.component;\n      const element = <Component {...this.props} key={`button-custom-${index}`} />;\n      typeof action.index === 'number' ? buttons.splice(action.index, 0, element) : buttons.push(element);\n    });\n  }\n\n  isPlaylistRunning() {\n    return playlistSrv.isPlaying;\n  }\n\n  renderLeftActionsButton() {\n    const { dashboard, kioskMode } = this.props;\n    const { canStar, canShare, isStarred } = dashboard.meta;\n    const buttons: ReactNode[] = [];\n\n    if (kioskMode !== KioskMode.Off || this.isPlaylistRunning()) {\n      return [];\n    }\n\n    if (canStar) {\n      let desc = isStarred ? 'Unmark as favorite' : '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={this.onStarDashboard}\n          key=\"button-star\"\n        />\n      );\n    }\n\n    if (canShare) {\n      let desc = 'Share dashboard or panel';\n      buttons.push(\n        <ModalsController key=\"button-share\">\n          {({ showModal, hideModal }) => (\n            <DashNavButton\n              tooltip={desc}\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    this.addCustomContent(customLeftActions, buttons);\n    return buttons;\n  }\n\n  renderPlaylistControls() {\n    return (\n      <ButtonGroup key=\"playlist-buttons\">\n        <ToolbarButton tooltip=\"Go to previous dashboard\" icon=\"backward\" onClick={this.onPlaylistPrev} narrow />\n        <ToolbarButton onClick={this.onPlaylistStop}>Stop playlist</ToolbarButton>\n        <ToolbarButton tooltip=\"Go to next dashboard\" icon=\"forward\" onClick={this.onPlaylistNext} narrow />\n      </ButtonGroup>\n    );\n  }\n\n  renderTimeControls() {\n    const { dashboard, updateTimeZoneForSession, hideTimePicker } = this.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  renderRightActionsButton() {\n    const { dashboard, onAddPanel, isFullscreen, kioskMode } = this.props;\n    const { canEdit, showSettings } = dashboard.meta;\n    const { snapshot } = dashboard;\n    const snapshotUrl = snapshot && snapshot.originalUrl;\n    const buttons: ReactNode[] = [];\n    const tvButton = (\n      <ToolbarButton tooltip=\"Cycle view mode\" icon=\"monitor\" onClick={this.onToggleTVMode} key=\"tv-button\" />\n    );\n\n    if (this.isPlaylistRunning()) {\n      return [this.renderPlaylistControls(), this.renderTimeControls()];\n    }\n\n    if (kioskMode === KioskMode.TV) {\n      return [this.renderTimeControls(), tvButton];\n    }\n\n    if (canEdit && !isFullscreen) {\n      buttons.push(<ToolbarButton tooltip=\"Add panel\" icon=\"panel-add\" onClick={onAddPanel} key=\"button-panel-add\" />);\n      buttons.push(\n        <ModalsController key=\"button-save\">\n          {({ showModal, hideModal }) => (\n            <ToolbarButton\n              tooltip=\"Save dashboard\"\n              icon=\"save\"\n              onClick={() => {\n                showModal(SaveDashboardModalProxy, {\n                  dashboard,\n                  onDismiss: hideModal,\n                });\n              }}\n            />\n          )}\n        </ModalsController>\n      );\n    }\n\n    if (snapshotUrl) {\n      buttons.push(\n        <ToolbarButton\n          tooltip=\"Open original dashboard\"\n          onClick={() => this.gotoSnapshotOrigin(snapshotUrl)}\n          icon=\"link\"\n          key=\"button-snapshot\"\n        />\n      );\n    }\n\n    if (showSettings) {\n      buttons.push(\n        <ToolbarButton tooltip=\"Dashboard settings\" icon=\"cog\" onClick={this.onOpenSettings} key=\"button-settings\" />\n      );\n    }\n\n    this.addCustomContent(customRightActions, buttons);\n\n    buttons.push(this.renderTimeControls());\n    buttons.push(tvButton);\n    return buttons;\n  }\n\n  gotoSnapshotOrigin(snapshotUrl: string) {\n    window.location.href = textUtil.sanitizeUrl(snapshotUrl);\n  }\n\n  render() {\n    const { isFullscreen, title, folderTitle } = this.props;\n    const onGoBack = isFullscreen ? this.onClose : undefined;\n\n    const titleHref = locationUtil.updateSearchParams(window.location.href, '?search=open');\n    const parentHref = locationUtil.updateSearchParams(window.location.href, '?search=open&folder=current');\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={this.renderLeftActionsButton()}\n      >\n        {this.renderRightActionsButton()}\n      </PageToolbar>\n    );\n  }\n}\n\nexport default connector(DashNav);\n","import React, { FC, useCallback, useEffect, useMemo, useState } from 'react';\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.message;\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 React, { PureComponent } from 'react';\nimport { CollapsableSection, Field, Input, Switch, TimeZonePicker, WeekStartPicker } from '@grafana/ui';\nimport { rangeUtil, TimeZone } from '@grafana/data';\nimport { isEmpty } from 'lodash';\nimport { selectors } from '@grafana/e2e-selectors';\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=\"Timezone\" 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, { MouseEvent, useCallback, useEffect, useState } from 'react';\nimport { VariableOption, VariableWithOptions } from '../types';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, InlineFieldRow, InlineLabel, useStyles, VerticalGroup } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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 { ThunkResult } from '../../../types';\nimport { getEditorVariables, getNewVariabelIndex, getVariable, getVariables } from '../state/selectors';\nimport {\n  changeVariableNameFailed,\n  changeVariableNameSucceeded,\n  clearIdInEditor,\n  setIdInEditor,\n  variableEditorMounted,\n  variableEditorUnMounted,\n} from './reducer';\nimport { variableAdapters } from '../adapters';\nimport { AddVariable, toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { cloneDeep } from 'lodash';\nimport { VariableType } from '@grafana/data';\nimport { addVariable, removeVariable } from '../state/sharedReducer';\nimport { updateOptions } from '../state/actions';\nimport { VariableModel } from '../types';\nimport { initInspect } from '../inspect/reducer';\nimport { createUsagesNetwork, transformUsagesToNetwork } from '../inspect/utils';\n\nexport const variableEditorMount = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch) => {\n    dispatch(variableEditorMounted({ name: getVariable(identifier.id).name }));\n  };\n};\n\nexport const variableEditorUnMount = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    dispatch(variableEditorUnMounted(toVariablePayload(identifier)));\n  };\n};\n\nexport const onEditorUpdate = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch) => {\n    await dispatch(updateOptions(identifier));\n    dispatch(switchToListMode());\n  };\n};\n\nexport const changeVariableName = (identifier: VariableIdentifier, newName: string): ThunkResult<void> => {\n  return (dispatch, getState) => {\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 = getVariables(getState());\n    const foundVariables = variables.filter((v) => v.name === newName && v.id !== identifier.id);\n\n    if (foundVariables.length) {\n      errorText = 'Variable with the same name already exists';\n    }\n\n    if (errorText) {\n      dispatch(changeVariableNameFailed({ newName, errorText }));\n      return;\n    }\n\n    dispatch(completeChangeVariableName(identifier, newName));\n  };\n};\n\nexport const completeChangeVariableName = (identifier: VariableIdentifier, newName: string): ThunkResult<void> => (\n  dispatch,\n  getState\n) => {\n  const originalVariable = getVariable(identifier.id, getState());\n  if (originalVariable.name === newName) {\n    dispatch(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 = toVariableIdentifier(model);\n\n  dispatch(addVariable(toVariablePayload(renamedIdentifier, { global, index, model })));\n  dispatch(changeVariableNameSucceeded(toVariablePayload(renamedIdentifier, { newName })));\n  dispatch(switchToEditMode(renamedIdentifier));\n  dispatch(removeVariable(toVariablePayload(identifier, { reIndex: false })));\n};\n\nexport const switchToNewMode = (type: VariableType = 'query'): ThunkResult<void> => (dispatch, getState) => {\n  const id = getNextAvailableId(type, getVariables(getState()));\n  const identifier = { type, id };\n  const global = false;\n  const index = getNewVariabelIndex(getState());\n  const model = cloneDeep(variableAdapters.get(type).initialState);\n  model.id = id;\n  model.name = id;\n  dispatch(\n    addVariable(\n      toVariablePayload<AddVariable>(identifier, { global, model, index })\n    )\n  );\n  dispatch(setIdInEditor({ id: identifier.id }));\n};\n\nexport const switchToEditMode = (identifier: VariableIdentifier): ThunkResult<void> => (dispatch) => {\n  dispatch(setIdInEditor({ id: identifier.id }));\n};\n\nexport const switchToListMode = (): ThunkResult<void> => (dispatch, getState) => {\n  dispatch(clearIdInEditor());\n  const state = getState();\n  const variables = getEditorVariables(state);\n  const dashboard = state.dashboard.getModel();\n  const { usages } = createUsagesNetwork(variables, dashboard);\n  const usagesNetwork = transformUsagesToNetwork(usages);\n\n  dispatch(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 React, { PropsWithChildren, useMemo } from 'react';\nimport { SelectableValue, VariableType } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { getVariableTypes } from '../utils';\nimport { variableAdapters } from '../adapters';\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      ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalTypeSelect}\n    />\n  );\n}\n","import React, { PropsWithChildren, useMemo } from 'react';\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      ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalHideSelect}\n    />\n  );\n}\n","import React, { FormEvent, PureComponent } from 'react';\nimport { isEqual } from 'lodash';\nimport { AppEvents, LoadingState, SelectableValue, VariableType } from '@grafana/data';\nimport { Button, Icon, InlineFieldRow, VerticalGroup } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { variableAdapters } from '../adapters';\nimport { toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { VariableHide, VariableModel } from '../types';\nimport { appEvents } from '../../../core/core';\nimport { VariableValuesPreview } from './VariableValuesPreview';\nimport { changeVariableName, onEditorUpdate, variableEditorMount, variableEditorUnMount } from './actions';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { StoreState } from '../../../types';\nimport { VariableEditorState } from './reducer';\nimport { getVariable } from '../state/selectors';\nimport { connectWithStore } from '../../../core/utils/connectWithReduxStore';\nimport { OnPropChangeArguments } from './types';\nimport { changeVariableProp, changeVariableType } from '../state/sharedReducer';\nimport { updateOptions } from '../state/actions';\nimport { VariableTextField } from './VariableTextField';\nimport { VariableSectionHeader } from './VariableSectionHeader';\nimport { hasOptions } from '../guard';\nimport { VariableTypeSelect } from './VariableTypeSelect';\nimport { VariableHideSelect } from './VariableHideSelect';\n\nexport interface OwnProps {\n  identifier: VariableIdentifier;\n}\n\ninterface ConnectedProps {\n  editor: VariableEditorState;\n  variable: VariableModel;\n}\n\ninterface DispatchProps {\n  variableEditorMount: typeof variableEditorMount;\n  variableEditorUnMount: typeof variableEditorUnMount;\n  changeVariableName: typeof changeVariableName;\n  changeVariableProp: typeof changeVariableProp;\n  onEditorUpdate: typeof onEditorUpdate;\n  changeVariableType: typeof changeVariableType;\n  updateOptions: typeof updateOptions;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\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(toVariablePayload(this.props.identifier, { newType: option.value }));\n  };\n\n  onLabelChange = (event: FormEvent<HTMLInputElement>) => {\n    event.preventDefault();\n    this.props.changeVariableProp(\n      toVariablePayload(this.props.identifier, { propName: 'label', propValue: event.currentTarget.value })\n    );\n  };\n\n  onDescriptionChange = (event: FormEvent<HTMLInputElement>) => {\n    this.props.changeVariableProp(\n      toVariablePayload(this.props.identifier, { propName: 'description', propValue: event.currentTarget.value })\n    );\n  };\n\n  onHideChange = (option: SelectableValue<VariableHide>) => {\n    this.props.changeVariableProp(\n      toVariablePayload(this.props.identifier, {\n        propName: 'hide',\n        propValue: option.value,\n      })\n    );\n  };\n\n  onPropChanged = async ({ propName, propValue, updateOptions = false }: OnPropChangeArguments) => {\n    this.props.changeVariableProp(toVariablePayload(this.props.identifier, { propName, propValue }));\n    if (updateOptions) {\n      await this.props.updateOptions(toVariableIdentifier(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                  ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalNameInput}\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                  ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.General.generalLabelInput}\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\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => ({\n  editor: state.templating.editor,\n  variable: getVariable(ownProps.identifier.id, state, false), // we could be renaming a variable and we don't want this to throw\n});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  variableEditorMount,\n  variableEditorUnMount,\n  changeVariableName,\n  changeVariableProp,\n  onEditorUpdate,\n  changeVariableType,\n  updateOptions,\n};\n\nexport const VariableEditorEditor = connectWithStore(\n  VariableEditorEditorUnConnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import React, { FC, useCallback, useEffect, useRef } from 'react';\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';\nimport { Modal } from '@grafana/ui';\n\nimport { GraphEdge, GraphNode } from './utils';\nimport { NetworkGraph, Props as NetWorkGraphProps } from './NetworkGraph';\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 { IconButton } from '@grafana/ui';\n\nimport { UsagesToNetwork } from './utils';\nimport { NetworkGraphModal } from './NetworkGraphModal';\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 <IconButton onClick={() => showModal()} name=\"code-branch\" title=\"Show usages\" />;\n      }}\n    </NetworkGraphModal>\n  );\n};\n","import React, { FC, MouseEvent, PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { Icon, IconButton, useStyles } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme } from '@grafana/data';\n\nimport EmptyListCTA from '../../../core/components/EmptyListCTA/EmptyListCTA';\nimport { QueryVariableModel, VariableModel } from '../types';\nimport { toVariableIdentifier, VariableIdentifier } from '../state/types';\nimport { DashboardModel } from '../../dashboard/state';\nimport { getVariableUsages, UsagesToNetwork, VariableUsageTree } from '../inspect/utils';\nimport { isAdHoc } from '../guard';\nimport { VariableUsagesButton } from '../inspect/VariableUsagesButton';\n\nexport interface Props {\n  variables: VariableModel[];\n  dashboard: DashboardModel | null;\n  usages: VariableUsageTree[];\n  usagesNetwork: UsagesToNetwork[];\n  onAddClick: (event: MouseEvent) => void;\n  onEditClick: (identifier: VariableIdentifier) => void;\n  onChangeVariableOrder: (identifier: VariableIdentifier, fromIndex: number, toIndex: number) => void;\n  onDuplicateVariable: (identifier: VariableIdentifier) => void;\n  onRemoveVariable: (identifier: VariableIdentifier) => void;\n}\n\nenum MoveType {\n  down = 1,\n  up = -1,\n}\n\nexport class VariableEditorList extends PureComponent<Props> {\n  onEditClick = (event: MouseEvent, identifier: VariableIdentifier) => {\n    event.preventDefault();\n    this.props.onEditClick(identifier);\n  };\n\n  onChangeVariableOrder = (event: MouseEvent, variable: VariableModel, moveType: MoveType) => {\n    event.preventDefault();\n    this.props.onChangeVariableOrder(toVariableIdentifier(variable), variable.index, variable.index + moveType);\n  };\n\n  onDuplicateVariable = (event: MouseEvent, identifier: VariableIdentifier) => {\n    event.preventDefault();\n    this.props.onDuplicateVariable(identifier);\n  };\n\n  onRemoveVariable = (event: MouseEvent, identifier: VariableIdentifier) => {\n    event.preventDefault();\n    this.props.onRemoveVariable(identifier);\n  };\n\n  render() {\n    return (\n      <div>\n        <div>\n          {this.props.variables.length === 0 && (\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={this.props.onAddClick}\n              />\n            </div>\n          )}\n\n          {this.props.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={6} />\n                  </tr>\n                </thead>\n                <tbody>\n                  {this.props.variables.map((state, index) => {\n                    const variable = state as QueryVariableModel;\n                    const definition = variable.definition\n                      ? variable.definition\n                      : typeof variable.query === 'string'\n                      ? variable.query\n                      : '';\n                    const usages = getVariableUsages(variable.id, this.props.usages);\n                    const passed = usages > 0 || isAdHoc(variable);\n                    return (\n                      <tr key={`${variable.name}-${index}`}>\n                        <td style={{ width: '1%' }}>\n                          <span\n                            onClick={(event) => this.onEditClick(event, toVariableIdentifier(variable))}\n                            className=\"pointer template-variable\"\n                            aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowNameFields(\n                              variable.name\n                            )}\n                          >\n                            {variable.name}\n                          </span>\n                        </td>\n                        <td\n                          style={{ maxWidth: '200px' }}\n                          onClick={(event) => this.onEditClick(event, toVariableIdentifier(variable))}\n                          className=\"pointer max-width\"\n                          aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowDefinitionFields(\n                            variable.name\n                          )}\n                        >\n                          {definition}\n                        </td>\n\n                        <td style={{ width: '1%' }}>\n                          <VariableCheckIndicator passed={passed} />\n                        </td>\n\n                        <td style={{ width: '1%' }}>\n                          <VariableUsagesButton\n                            id={variable.id}\n                            isAdhoc={isAdHoc(variable)}\n                            usages={this.props.usagesNetwork}\n                          />\n                        </td>\n\n                        <td style={{ width: '1%' }}>\n                          {index > 0 && (\n                            <IconButton\n                              onClick={(event) => this.onChangeVariableOrder(event, variable, MoveType.up)}\n                              name=\"arrow-up\"\n                              title=\"Move variable up\"\n                              aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowArrowUpButtons(\n                                variable.name\n                              )}\n                            />\n                          )}\n                        </td>\n\n                        <td style={{ width: '1%' }}>\n                          {index < this.props.variables.length - 1 && (\n                            <IconButton\n                              onClick={(event) => this.onChangeVariableOrder(event, variable, MoveType.down)}\n                              name=\"arrow-down\"\n                              title=\"Move variable down\"\n                              aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowArrowDownButtons(\n                                variable.name\n                              )}\n                            />\n                          )}\n                        </td>\n\n                        <td style={{ width: '1%' }}>\n                          <IconButton\n                            onClick={(event) => this.onDuplicateVariable(event, toVariableIdentifier(variable))}\n                            name=\"copy\"\n                            title=\"Duplicate variable\"\n                            aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowDuplicateButtons(\n                              variable.name\n                            )}\n                          />\n                        </td>\n\n                        <td style={{ width: '1%' }}>\n                          <IconButton\n                            onClick={(event) => this.onRemoveVariable(event, toVariableIdentifier(variable))}\n                            name=\"trash-alt\"\n                            title=\"Remove variable\"\n                            aria-label={selectors.pages.Dashboard.Settings.Variables.List.tableRowRemoveButtons(\n                              variable.name\n                            )}\n                          />\n                        </td>\n                      </tr>\n                    );\n                  })}\n                </tbody>\n              </table>\n            </div>\n          )}\n        </div>\n      </div>\n    );\n  }\n}\n\ninterface VariableCheckIndicatorProps {\n  passed: boolean;\n}\n\nconst VariableCheckIndicator: FC<VariableCheckIndicatorProps> = ({ passed }) => {\n  const style = useStyles(getStyles);\n  if (passed) {\n    return (\n      <Icon\n        name=\"check\"\n        className={style.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={style.iconFailed}\n      title=\"This variable is not referenced by any variable or dashboard.\"\n    />\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme) => ({\n  iconPassed: css`\n    color: ${theme.palette.greenBase};\n  `,\n  iconFailed: css`\n    color: ${theme.palette.orange};\n  `,\n});\n","import React, { FC, useMemo } from 'react';\nimport { IconButton } from '@grafana/ui';\nimport { UsagesToNetwork } from './utils';\nimport { NetworkGraphModal } from './NetworkGraphModal';\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 React, { ReactElement, useEffect, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { useAsync } from 'react-use';\nimport { CollapsableSection, HorizontalGroup, Icon, Spinner, Tooltip, useStyles, VerticalGroup } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { reportInteraction } from '@grafana/runtime';\n\nimport { VariableModel } from '../types';\nimport { DashboardModel } from '../../dashboard/state';\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, { FC, useMemo } from 'react';\nimport { Provider } from 'react-redux';\n// @ts-ignore\nimport { Button } from '@grafana/ui';\nimport { createDependencyEdges, createDependencyNodes, filterNodesWithDependencies } from './utils';\nimport { store } from '../../../store/store';\nimport { VariableModel } from '../types';\nimport { NetworkGraphModal } from './NetworkGraphModal';\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 onClick={() => showModal()} icon=\"channel-add\" variant=\"secondary\">\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, { MouseEvent, PureComponent } from 'react';\nimport { Icon, LinkButton } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { StoreState } from '../../../types';\nimport { VariableEditorEditor } from './VariableEditorEditor';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { getEditorVariables } from '../state/selectors';\nimport { switchToEditMode, switchToListMode, switchToNewMode } from './actions';\nimport { changeVariableOrder, duplicateVariable, removeVariable } from '../state/sharedReducer';\nimport { VariableEditorList } from './VariableEditorList';\nimport { VariablesUnknownTable } from '../inspect/VariablesUnknownTable';\nimport { VariablesDependenciesButton } from '../inspect/VariablesDependenciesButton';\n\nconst mapStateToProps = (state: StoreState) => ({\n  variables: getEditorVariables(state),\n  idInEditor: state.templating.editor.id,\n  dashboard: state.dashboard.getModel(),\n  usagesNetwork: state.templating.inspect.usagesNetwork,\n  usages: state.templating.inspect.usages,\n});\n\nconst mapDispatchToProps = {\n  changeVariableOrder,\n  duplicateVariable,\n  removeVariable,\n  switchToNewMode,\n  switchToEditMode,\n  switchToListMode,\n};\n\ninterface OwnProps {}\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();\n  }\n\n  onChangeToListMode = (event: MouseEvent<HTMLAnchorElement>) => {\n    event.preventDefault();\n    this.props.switchToListMode();\n  };\n\n  onEditVariable = (identifier: VariableIdentifier) => {\n    this.props.switchToEditMode(identifier);\n  };\n\n  onNewVariable = (event: MouseEvent) => {\n    event.preventDefault();\n    this.props.switchToNewMode();\n  };\n\n  onChangeVariableOrder = (identifier: VariableIdentifier, fromIndex: number, toIndex: number) => {\n    this.props.changeVariableOrder(toVariablePayload(identifier, { fromIndex, toIndex }));\n  };\n\n  onDuplicateVariable = (identifier: VariableIdentifier) => {\n    this.props.duplicateVariable(toVariablePayload(identifier, { newId: (undefined as unknown) as string }));\n  };\n\n  onRemoveVariable = (identifier: VariableIdentifier) => {\n    this.props.removeVariable(toVariablePayload(identifier, { reIndex: true }));\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              <LinkButton\n                type=\"button\"\n                onClick={this.onNewVariable}\n                aria-label={selectors.pages.Dashboard.Settings.Variables.List.newButton}\n              >\n                New\n              </LinkButton>\n            </>\n          )}\n        </div>\n\n        {!variableToEdit && (\n          <>\n            <VariableEditorList\n              dashboard={this.props.dashboard}\n              variables={this.props.variables}\n              onAddClick={this.onNewVariable}\n              onEditClick={this.onEditVariable}\n              onChangeVariableOrder={this.onChangeVariableOrder}\n              onDuplicateVariable={this.onDuplicateVariable}\n              onRemoveVariable={this.onRemoveVariable}\n              usages={this.props.usages}\n              usagesNetwork={this.props.usagesNetwork}\n            />\n            <VariablesUnknownTable variables={this.props.variables} dashboard={this.props.dashboard} />\n          </>\n        )}\n        {variableToEdit && <VariableEditorEditor identifier={toVariableIdentifier(variableToEdit)} />}\n      </div>\n    );\n  }\n}\n\nexport const VariableEditorContainer = connector(VariableEditorContainerUnconnected);\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { Tooltip, Icon, Button } from '@grafana/ui';\nimport { SlideDown } from 'app/core/components/Animations/SlideDown';\nimport { StoreState } from 'app/types';\nimport { DashboardAcl, PermissionLevel, NewDashboardAclItem } from 'app/types/acl';\nimport {\n  getDashboardPermissions,\n  addDashboardPermission,\n  removeDashboardPermission,\n  updateDashboardPermission,\n} from '../../state/actions';\nimport { checkFolderPermissions } from '../../../folders/state/actions';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport PermissionList from 'app/core/components/PermissionList/PermissionList';\nimport AddPermission from 'app/core/components/PermissionList/AddPermission';\nimport PermissionsInfo from 'app/core/components/PermissionList/PermissionsInfo';\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 from 'react';\nimport { css } from '@emotion/css';\nimport { sumBy } from 'lodash';\nimport { Modal, ConfirmModal, Button } from '@grafana/ui';\nimport { DashboardModel, PanelModel } from '../../state';\nimport { useDashboardDelete } from './useDashboardDelete';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport { config } from 'app/core/config';\n\ntype DeleteDashboardModalProps = {\n  hideModal(): void;\n  dashboard: DashboardModel;\n};\n\nexport const DeleteDashboardModal: React.FC<DeleteDashboardModalProps> = ({ hideModal, dashboard }) => {\n  const isProvisioned = dashboard.meta.provisioned;\n  const { onDeleteDashboard } = useDashboardDelete(dashboard.uid);\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","import { useEffect } from 'react';\nimport { useAsyncFn } from 'react-use';\nimport { AppEvents } from '@grafana/data';\nimport appEvents from 'app/core/app_events';\nimport { deleteDashboard } from 'app/features/manage-dashboards/state/actions';\nimport { locationService } from '@grafana/runtime';\n\nexport const useDashboardDelete = (uid: string) => {\n  const [state, onDeleteDashboard] = useAsyncFn(() => deleteDashboard(uid, false), []);\n\n  useEffect(() => {\n    if (state.value) {\n      locationService.replace('/');\n      appEvents.emit(AppEvents.alertSuccess, ['Dashboard Deleted', state.value.title + ' has been deleted']);\n    }\n  }, [state]);\n\n  return { state, onDeleteDashboard };\n};\n","import React from 'react';\nimport { DeleteDashboardModal } from './DeleteDashboardModal';\nimport { Button, ModalsController } from '@grafana/ui';\nimport { DashboardModel } from '../../state';\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, { useState } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { TimeZone } from '@grafana/data';\nimport { CollapsableSection, Field, Input, RadioButtonGroup, TagsInput } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { DeleteDashboardButton } from '../DeleteDashboard/DeleteDashboardButton';\nimport { TimePickerSettings } from './TimePickerSettings';\n\nimport { updateTimeZoneDashboard, updateWeekStartDashboard } from 'app/features/dashboard/state/actions';\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      <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      <CollapsableSection label=\"Panel options\" isOpen={true}>\n        <Field\n          label=\"Graph tooltip\"\n          description=\"Controls tooltip and hover highlight behavior across different panels\"\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.canSave && <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 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';\n\nimport { annotationEventNames, AnnotationFieldInfo } from '../standardAnnotationSupport';\nimport { Select, Tooltip, Icon } from '@grafana/ui';\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            menuShouldPortal\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            menuShouldPortal\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 React, { PureComponent } from 'react';\nimport { lastValueFrom } from 'rxjs';\nimport { css, cx } from '@emotion/css';\nimport { AnnotationEventMappings, AnnotationQuery, DataQuery, DataSourceApi, LoadingState } from '@grafana/data';\nimport { Button, Icon, IconName, Spinner } from '@grafana/ui';\n\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { standardAnnotationSupport } from '../standardAnnotationSupport';\nimport { executeAnnotationQuery } from '../executeAnnotationQuery';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { AnnotationQueryResponse } from '../types';\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) {\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    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: {} as 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              &nbsp;\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  render() {\n    const { datasource, annotation } = this.props;\n    const { response } = this.state;\n\n    // Find the annotaiton 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        />\n        {datasource.type !== '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';\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 { Checkbox, CollapsableSection, ColorValueEditor, Field, HorizontalGroup, Input } from '@grafana/ui';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { AnnotationQuery, DataSourceInstanceSettings } from '@grafana/data';\nimport { DataSourcePicker, getDataSourceSrv } from '@grafana/runtime';\nimport { useAsync } from 'react-use';\nimport StandardAnnotationQueryEditor from 'app/features/annotations/components/StandardAnnotationQueryEditor';\nimport { AngularEditorLoader } from './AngularEditorLoader';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport const newAnnotation: AnnotationQuery = {\n  name: 'New annotation',\n  enable: true,\n  datasource: null,\n  iconColor: 'red',\n};\n\ntype Props = {\n  editIdx: number;\n  dashboard: DashboardModel;\n};\n\nexport const AnnotationSettingsEdit: React.FC<Props> = ({ editIdx, dashboard }) => {\n  const [annotation, setAnnotation] = useState(editIdx !== null ? dashboard.annotations.list[editIdx] : newAnnotation);\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: ds.name,\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 === newAnnotation.name;\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 React, { ButtonHTMLAttributes } from 'react';\nimport { Button, useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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';\nimport { DeleteButton, Icon, IconButton, VerticalGroup } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { ListNewButton } from '../DashboardSettings/ListNewButton';\nimport { arrayUtils } from '@grafana/data';\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  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 className=\"pointer\" onClick={() => onEdit(idx)}>\n                    <Icon name=\"comment-alt\" /> &nbsp; {annotation.name}\n                  </td>\n                )}\n                {annotation.builtIn && (\n                  <td style={{ width: '90%' }} className=\"pointer\" onClick={() => onEdit(idx)}>\n                    <Icon name=\"comment-alt\" /> &nbsp; <em className=\"muted\">{annotation.name} (Built-in)</em>\n                  </td>\n                )}\n                <td className=\"pointer\" onClick={() => onEdit(idx)}>\n                  {annotation.datasource || 'Default'}\n                </td>\n                <td style={{ width: '1%' }}>\n                  {idx !== 0 && (\n                    <IconButton\n                      surface=\"header\"\n                      name=\"arrow-up\"\n                      aria-label=\"arrow-up\"\n                      onClick={() => onMove(idx, -1)}\n                    />\n                  )}\n                </td>\n                <td style={{ width: '1%' }}>\n                  {dashboard.annotations.list.length > 1 && idx !== dashboard.annotations.list.length - 1 ? (\n                    <IconButton\n                      surface=\"header\"\n                      name=\"arrow-down\"\n                      aria-label=\"arrow-down\"\n                      onClick={() => onMove(idx, 1)}\n                    />\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 &amp; 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';\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';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { AnnotationSettingsEdit, AnnotationSettingsList } from '../AnnotationSettings';\nimport { newAnnotation } from '../AnnotationSettings/AnnotationSettingsEdit';\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    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 React, { useState } from 'react';\nimport { DeleteButton, HorizontalGroup, Icon, IconButton, TagList } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { DashboardModel, DashboardLink } from '../../state/DashboardModel';\nimport { ListNewButton } from '../DashboardSettings/ListNewButton';\nimport { arrayUtils } from '@grafana/data';\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\" /> &nbsp; {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 && (\n                  <IconButton\n                    surface=\"header\"\n                    name=\"arrow-up\"\n                    aria-label=\"arrow-up\"\n                    onClick={() => moveLink(idx, -1)}\n                  />\n                )}\n              </td>\n              <td style={{ width: '1%' }}>\n                {links.length > 1 && idx !== links.length - 1 ? (\n                  <IconButton\n                    surface=\"header\"\n                    name=\"arrow-down\"\n                    aria-label=\"arrow-down\"\n                    onClick={() => moveLink(idx, 1)}\n                  />\n                ) : null}\n              </td>\n              <td style={{ width: '1%' }}>\n                <IconButton surface=\"header\" 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';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { LinkSettingsEdit, LinkSettingsList } from '../LinksSettings';\nimport { newLink } from '../LinksSettings/LinkSettingsEdit';\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';\nimport { Spinner, HorizontalGroup } from '@grafana/ui';\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.id, baseInfo.version);\n    const rhs = await historySrv.getDashboardVersion(this.props.dashboard.id, 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&hellip;\" />\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&hellip;\" />\n        ) : (\n          <VersionHistoryTable versions={versions} onCheck={this.onCheck} />\n        )}\n        {this.state.isAppending && <VersionsHistorySpinner msg=\"Fetching more entries&hellip;\" />}\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 React, { useState } from 'react';\nimport { css } from '@emotion/css';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { Button, CodeEditor, HorizontalGroup, useStyles2 } from '@grafana/ui';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { getDashboardSrv } from '../../services/DashboardSrv';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { GrafanaTheme2 } from '@grafana/data';\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  const onClick = () => {\n    getDashboardSrv()\n      .saveJSONDashboard(dashboardJson)\n      .then(() => {\n        dashboardWatcher.reloadPage();\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 onClick={onClick}>Save changes</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, { useCallback, useMemo } from 'react';\nimport { Link } from 'react-router-dom';\nimport { css, cx } from '@emotion/css';\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 { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { SaveDashboardButton, SaveDashboardAsButton } from '../SaveDashboard/SaveDashboardButton';\nimport { VariableEditorContainer } from '../../../variables/editor/VariableEditorContainer';\nimport { DashboardPermissions } from '../DashboardPermissions/DashboardPermissions';\nimport { GeneralSettings } from './GeneralSettings';\nimport { AnnotationsSettings } from './AnnotationsSettings';\nimport { LinksSettings } from './LinksSettings';\nimport { VersionsSettings } from './VersionsSettings';\nimport { JsonEditorSettings } from './JsonEditorSettings';\nimport { GrafanaTheme2, locationUtil } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\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 onClick={props.onMakeEditable}>Make editable</Button>\n  </div>\n);\n\nexport function DashboardSettings({ dashboard, editview }: Props) {\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 />,\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      pages.push({\n        title: 'Permissions',\n        id: 'permissions',\n        icon: 'lock',\n        component: <DashboardPermissions dashboard={dashboard} />,\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    dashboardWatcher.reloadPage();\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    <div className=\"dashboard-settings\">\n      <PageToolbar title={`${dashboard.title} / Settings`} parent={folderTitle} onGoBack={onClose} />\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                  to={(loc) => locationUtil.updateSearchParams(loc.search, `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  );\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n  scrollInner: css`\n    min-width: 100%;\n    display: flex;\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';\nimport { CollapsableSection, TagsInput, Select, Field, Input, Checkbox } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\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 }) => {\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\n          inputId=\"link-type-input\"\n          value={linkSettings.type}\n          options={linkTypeOptions}\n          onChange={onTypeChange}\n          menuShouldPortal\n        />\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 menuShouldPortal 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    </div>\n  );\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { PanelModel } from '../../../state/PanelModel';\nimport { getDefaultTimeRange, LoadingState, PanelData } from '@grafana/data';\nimport { DisplayMode } from '../types';\nimport store from '../../../../../core/store';\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';\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 React from 'react';\nimport { Button, Input, Switch, Form, Field, InputControl, Modal } from '@grafana/ui';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { SaveDashboardFormProps } from '../types';\nimport { validationSrv } from 'app/features/manage-dashboards/services/ValidationSrv';\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  clone.hideControls = false;\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.message;\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          <Field label=\"Copy tags\">\n            <Switch {...register('copyTags')} />\n          </Field>\n          <Modal.ButtonRow>\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          </Modal.ButtonRow>\n        </>\n      )}\n    </Form>\n  );\n};\n","import React, { useState } from 'react';\nimport { css } from '@emotion/css';\nimport { Modal } from '@grafana/ui';\nimport { SaveDashboardAsForm } from './forms/SaveDashboardAsForm';\nimport { SaveDashboardErrorProxy } from './SaveDashboardErrorProxy';\nimport { useDashboardSave } from './useDashboardSave';\nimport { SaveDashboardModalProps } from './types';\n\nexport const SaveDashboardAsModal: React.FC<\n  SaveDashboardModalProps & {\n    isNew?: boolean;\n  }\n> = ({ dashboard, onDismiss, isNew }) => {\n  const { state, onDashboardSave } = useDashboardSave(dashboard);\n  const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState();\n  return (\n    <>\n      {state.error && (\n        <SaveDashboardErrorProxy\n          error={state.error}\n          dashboard={dashboard}\n          dashboardSaveModel={dashboardSaveModelClone}\n          onDismiss={onDismiss}\n        />\n      )}\n      {!state.error && (\n        <Modal\n          isOpen={true}\n          title=\"Save dashboard as...\"\n          icon=\"copy\"\n          onDismiss={onDismiss}\n          className={css`\n            width: 500px;\n          `}\n        >\n          <SaveDashboardAsForm\n            dashboard={dashboard}\n            onCancel={onDismiss}\n            onSuccess={onDismiss}\n            onSubmit={(clone, options, dashboard) => {\n              setDashboardSaveModelClone(clone);\n              return onDashboardSave(clone, options, dashboard);\n            }}\n            isNew={isNew}\n          />\n        </Modal>\n      )}\n    </>\n  );\n};\n","import React from 'react';\nimport { Button, ButtonVariant, ModalsController, FullWidthButtonContainer } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { SaveDashboardAsModal } from './SaveDashboardAsModal';\nimport { SaveDashboardModalProxy } from './SaveDashboardModalProxy';\nimport { selectors } from '@grafana/e2e-selectors';\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(SaveDashboardModalProxy, {\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(SaveDashboardAsModal, {\n                  dashboard,\n                  onSaveSuccess,\n                  onDismiss: hideModal,\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 React, { useEffect } from 'react';\nimport { Button, ConfirmModal, Modal, stylesFactory, useTheme } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { useDashboardSave } from './useDashboardSave';\nimport { SaveDashboardModalProps } from './types';\nimport { SaveDashboardAsButton } from './SaveDashboardButton';\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, { useCallback, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { saveAs } from 'file-saver';\nimport { Button, Modal, stylesFactory, TextArea, useTheme } from '@grafana/ui';\nimport { CopyToClipboard } from 'app/core/components/CopyToClipboard/CopyToClipboard';\nimport { SaveDashboardFormProps } from '../types';\nimport { AppEvents, GrafanaTheme } from '@grafana/data';\nimport appEvents from '../../../../../core/app_events';\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 onCopyToClipboardSuccess = useCallback(() => {\n    appEvents.emit(AppEvents.alertSuccess, ['Dashboard JSON copied to clipboard']);\n  }, []);\n\n  const styles = getStyles(theme);\n  return (\n    <>\n      <div>\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        <Modal.ButtonRow>\n          <Button variant=\"secondary\" onClick={onCancel} fill=\"outline\">\n            Cancel\n          </Button>\n          <CopyToClipboard text={() => dashboardJSON} elType={Button} onSuccess={onCopyToClipboardSuccess}>\n            Copy JSON to clipboard\n          </CopyToClipboard>\n          <Button onClick={saveToFile}>Save JSON to file</Button>\n        </Modal.ButtonRow>\n      </div>\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 from 'react';\nimport { Modal } from '@grafana/ui';\nimport { SaveProvisionedDashboardForm } from './forms/SaveProvisionedDashboardForm';\nimport { SaveDashboardModalProps } from './types';\n\nexport const SaveProvisionedDashboard: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss }) => {\n  return (\n    <Modal isOpen={true} title=\"Cannot save provisioned dashboard\" icon=\"copy\" onDismiss={onDismiss}>\n      <SaveProvisionedDashboardForm dashboard={dashboard} onCancel={onDismiss} onSuccess={onDismiss} />\n    </Modal>\n  );\n};\n","import React, { useMemo } from 'react';\n\nimport { Button, Checkbox, Form, Modal, TextArea } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { SaveDashboardFormProps } from '../types';\n\ninterface SaveDashboardFormDTO {\n  message: string;\n  saveVariables: boolean;\n  saveTimerange: boolean;\n}\n\nexport const SaveDashboardForm: React.FC<SaveDashboardFormProps> = ({ dashboard, onCancel, onSuccess, onSubmit }) => {\n  const hasTimeChanged = useMemo(() => dashboard.hasTimeChanged(), [dashboard]);\n  const hasVariableChanged = useMemo(() => dashboard.hasVariableValuesChanged(), [dashboard]);\n\n  return (\n    <Form\n      onSubmit={async (data: SaveDashboardFormDTO) => {\n        if (!onSubmit) {\n          return;\n        }\n\n        const result = await onSubmit(dashboard.getSaveModelClone(data), data, dashboard);\n        if (result.status === 'success') {\n          if (data.saveVariables) {\n            dashboard.resetOriginalVariables();\n          }\n          if (data.saveTimerange) {\n            dashboard.resetOriginalTime();\n          }\n          onSuccess();\n        }\n      }}\n    >\n      {({ register, errors }) => (\n        <>\n          <div>\n            {hasTimeChanged && (\n              <Checkbox\n                {...register('saveTimerange')}\n                label=\"Save current time range as dashboard default\"\n                aria-label={selectors.pages.SaveDashboardModal.saveTimerange}\n              />\n            )}\n            {hasVariableChanged && (\n              <Checkbox\n                {...register('saveVariables')}\n                label=\"Save current variable values as dashboard default\"\n                aria-label={selectors.pages.SaveDashboardModal.saveVariables}\n              />\n            )}\n            {(hasVariableChanged || hasTimeChanged) && <div className=\"gf-form-group\" />}\n\n            <TextArea {...register('message')} placeholder=\"Add a note to describe your changes.\" autoFocus />\n          </div>\n\n          <Modal.ButtonRow>\n            <Button variant=\"secondary\" onClick={onCancel} fill=\"outline\">\n              Cancel\n            </Button>\n            <Button type=\"submit\" aria-label={selectors.pages.SaveDashboardModal.save}>\n              Save\n            </Button>\n          </Modal.ButtonRow>\n        </>\n      )}\n    </Form>\n  );\n};\n","import React, { useState } from 'react';\nimport { Modal } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { SaveDashboardForm } from './forms/SaveDashboardForm';\nimport { SaveDashboardErrorProxy } from './SaveDashboardErrorProxy';\nimport { useDashboardSave } from './useDashboardSave';\nimport { SaveDashboardModalProps } from './types';\n\nexport const SaveDashboardModal: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss, onSaveSuccess }) => {\n  const { state, onDashboardSave } = useDashboardSave(dashboard);\n  const [dashboardSaveModelClone, setDashboardSaveModelClone] = useState();\n\n  return (\n    <>\n      {state.error && (\n        <SaveDashboardErrorProxy\n          error={state.error}\n          dashboard={dashboard}\n          dashboardSaveModel={dashboardSaveModelClone}\n          onDismiss={onDismiss}\n        />\n      )}\n      {!state.error && (\n        <Modal\n          isOpen={true}\n          title=\"Save dashboard\"\n          icon=\"copy\"\n          onDismiss={onDismiss}\n          className={css`\n            width: 500px;\n          `}\n        >\n          <SaveDashboardForm\n            dashboard={dashboard}\n            onCancel={onDismiss}\n            onSuccess={() => {\n              onDismiss();\n              if (onSaveSuccess) {\n                onSaveSuccess();\n              }\n            }}\n            onSubmit={(clone, options, dashboard) => {\n              setDashboardSaveModelClone(clone);\n              return onDashboardSave(clone, options, dashboard);\n            }}\n          />\n        </Modal>\n      )}\n    </>\n  );\n};\n","import React from 'react';\nimport { SaveProvisionedDashboard } from './SaveProvisionedDashboard';\nimport { SaveDashboardAsModal } from './SaveDashboardAsModal';\nimport { SaveDashboardModalProps } from './types';\nimport { SaveDashboardModal } from './SaveDashboardModal';\n\nexport const SaveDashboardModalProxy: React.FC<SaveDashboardModalProps> = ({ dashboard, onDismiss, onSaveSuccess }) => {\n  const isProvisioned = dashboard.meta.provisioned;\n  const isNew = dashboard.version === 0;\n  const isChanged = dashboard.version > 0;\n\n  const modalProps = {\n    dashboard,\n    onDismiss,\n    onSaveSuccess,\n  };\n\n  return (\n    <>\n      {isChanged && !isProvisioned && <SaveDashboardModal {...modalProps} />}\n      {isProvisioned && <SaveProvisionedDashboard {...modalProps} />}\n      {isNew && <SaveDashboardAsModal {...modalProps} isNew />}\n    </>\n  );\n};\n","import { useEffect } from 'react';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport { AppEvents, locationUtil } from '@grafana/data';\nimport { SaveDashboardOptions } from './types';\nimport appEvents from 'app/core/app_events';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { saveDashboard as saveDashboardApiCall } from 'app/features/manage-dashboards/state/actions';\nimport { locationService } from '@grafana/runtime';\nimport { DashboardSavedEvent } from 'app/types/events';\n\nconst saveDashboard = (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  return saveDashboardApiCall({ ...options, folderId, dashboard: saveModel });\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\n  useEffect(() => {\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      appEvents.emit(AppEvents.alertSuccess, ['Dashboard saved']);\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    }\n  }, [dashboard, state]);\n\n  return { state, onDashboardSave };\n};\n","import { config } from '@grafana/runtime';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { createShortLink } from 'app/core/utils/shortLinks';\nimport { dateTime, PanelModel, TimeRange, urlUtil } from '@grafana/data';\n\nexport interface BuildParamsArgs {\n  useCurrentTimeRange: boolean;\n  selectedTheme?: string;\n  panel?: PanelModel;\n  search?: string;\n  range?: TimeRange;\n  orgId?: string;\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', 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(useCurrentTimeRange: boolean, selectedTheme?: string, panel?: PanelModel) {\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  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(useCurrentTimeRange: boolean, selectedTheme?: string, panel?: PanelModel) {\n  let soloUrl = buildSoloUrl(useCurrentTimeRange, selectedTheme, panel);\n\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(useCurrentTimeRange: boolean, selectedTheme?: string, panel?: PanelModel) {\n  let soloUrl = buildSoloUrl(useCurrentTimeRange, 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 React, { PureComponent } from 'react';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport { Alert, ClipboardButton, Field, FieldSet, Icon, Input, RadioButtonGroup, Switch } from '@grafana/ui';\nimport { AppEvents, SelectableValue } from '@grafana/data';\nimport { buildImageUrl, buildShareUrl } from './utils';\nimport { appEvents } from 'app/core/core';\nimport config from 'app/core/config';\nimport { ShareModalTabProps } from './types';\n\nconst themeOptions: Array<SelectableValue<string>> = [\n  { label: 'Current', value: 'current' },\n  { label: 'Dark', value: 'dark' },\n  { label: 'Light', value: 'light' },\n];\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    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 } = this.props;\n    const { useCurrentTimeRange, useShortUrl, selectedTheme } = this.state;\n\n    const shareUrl = await buildShareUrl(useCurrentTimeRange, selectedTheme, panel, useShortUrl);\n    const imageUrl = buildImageUrl(useCurrentTimeRange, 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  onShareUrlCopy = () => {\n    appEvents.emit(AppEvents.alertSuccess, ['Content copied to clipboard']);\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    return (\n      <>\n        <p className=\"share-modal-info-text\">\n          Create a direct link to this dashboard or panel, customized with the options below.\n        </p>\n        <FieldSet>\n          <Field\n            label=\"Lock 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 label=\"Shorten URL\">\n            <Switch id=\"share-shorten-url\" value={useShortUrl} onChange={this.onUrlShorten} />\n          </Field>\n\n          <Field label=\"Link URL\">\n            <Input\n              id=\"link-url-input\"\n              value={shareUrl}\n              readOnly\n              addonAfter={\n                <ClipboardButton variant=\"primary\" getText={this.getShareUrl} onClipboardCopy={this.onShareUrlCopy}>\n                  <Icon name=\"copy\" /> Copy\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\" /> Direct link rendered image\n                </a>\n              </div>\n            )}\n\n            {!isDashboardSaved && (\n              <Alert severity=\"info\" title=\"Dashboard is not saved\" bottomSpacing={0}>\n                To render a panel image, you must save the dashboard first.\n              </Alert>\n            )}\n          </>\n        )}\n\n        {panel && !config.rendererAvailable && (\n          <Alert severity=\"info\" title=\"Image renderer plugin not installed\" bottomSpacing={0}>\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          </Alert>\n        )}\n      </>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { Button, ClipboardButton, Field, Icon, Input, LinkButton, Modal, Select, Spinner } from '@grafana/ui';\nimport { AppEvents, SelectableValue } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { appEvents } from 'app/core/core';\nimport { VariableRefresh } from '../../../variables/types';\nimport { ShareModalTabProps } from './types';\n\nconst snapshotApiUrl = '/api/snapshots';\n\nconst expireOptions: Array<SelectableValue<number>> = [\n  { label: 'Never', value: 0 },\n  { label: '1 Hour', value: 60 * 60 },\n  { label: '1 Day', value: 60 * 60 * 24 },\n  { label: '7 Days', value: 60 * 60 * 24 * 7 },\n];\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\n  constructor(props: Props) {\n    super(props);\n    this.dashboard = props.dashboard;\n    this.state = {\n      isLoading: false,\n      step: 1,\n      selectedExpireOption: expireOptions[0],\n      snapshotExpires: 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    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: any; url: any } = await getBackendSrv().post(snapshotApiUrl, cmdData);\n      this.setState({\n        deleteUrl: results.deleteUrl,\n        snapshotUrl: results.url,\n        step: 2,\n      });\n    } finally {\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: any) => {\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  onSnapshotUrlCopy = () => {\n    appEvents.emit(AppEvents.alertSuccess, ['Content copied to clipboard']);\n  };\n\n  renderStep1() {\n    const { onDismiss } = this.props;\n    const {\n      snapshotName,\n      selectedExpireOption,\n      timeoutSeconds,\n      isLoading,\n      sharingButtonText,\n      externalEnabled,\n    } = this.state;\n\n    return (\n      <>\n        <div>\n          <p className=\"share-modal-info-text\">\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          </p>\n          <p className=\"share-modal-info-text\">\n            Keep in mind, your snapshot <em>can be viewed by anyone</em> that has the link and can access the URL. Share\n            wisely.\n          </p>\n        </div>\n        <Field label=\"Snapshot name\">\n          <Input id=\"snapshot-name-input\" width={30} value={snapshotName} onChange={this.onSnapshotNameChange} />\n        </Field>\n        <Field label=\"Expire\">\n          <Select\n            inputId=\"expire-select-input\"\n            menuShouldPortal\n            width={30}\n            options={expireOptions}\n            value={selectedExpireOption}\n            onChange={this.onExpireChange}\n          />\n        </Field>\n        <Field\n          label=\"Timeout (seconds)\"\n          description=\"You might need to configure the timeout value if it takes a long time to collect your dashboard\n            metrics.\"\n        >\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            Cancel\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            Local Snapshot\n          </Button>\n        </Modal.ButtonRow>\n      </>\n    );\n  }\n\n  renderStep2() {\n    const { snapshotUrl } = this.state;\n\n    return (\n      <>\n        <div className=\"gf-form\" style={{ marginTop: '40px' }}>\n          <div className=\"gf-form-row\">\n            <a href={snapshotUrl} className=\"large share-modal-link\" target=\"_blank\" rel=\"noreferrer\">\n              <Icon name=\"external-link-alt\" /> {snapshotUrl}\n            </a>\n            <br />\n            <ClipboardButton variant=\"secondary\" getText={this.getSnapshotUrl} onClipboardCopy={this.onSnapshotUrlCopy}>\n              Copy Link\n            </ClipboardButton>\n          </div>\n        </div>\n\n        <div className=\"pull-right\" style={{ padding: '5px' }}>\n          Did you make a mistake?{' '}\n          <LinkButton fill=\"text\" target=\"_blank\" onClick={this.deleteSnapshot}>\n            Delete snapshot.\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          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        </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, { useCallback } from 'react';\nimport { ClipboardButton, CodeEditor, Modal } from '@grafana/ui';\n\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { notifyApp } from '../../../../core/actions';\nimport { dispatch } from '../../../../store/store';\nimport { createSuccessNotification } from '../../../../core/copy/appNotification';\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  const onClipboardCopy = () => {\n    dispatch(notifyApp(createSuccessNotification('Content copied to clipboard')));\n  };\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 getText={getClipboardText} onClipboardCopy={onClipboardCopy}>\n          Copy to Clipboard\n        </ClipboardButton>\n      </Modal.ButtonRow>\n    </Modal>\n  );\n}\n","import React, { PureComponent } from 'react';\nimport { saveAs } from 'file-saver';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { Button, Field, Modal, Switch } from '@grafana/ui';\nimport { DashboardExporter } from 'app/features/dashboard/components/DashExportModal';\nimport { appEvents } from 'app/core/core';\nimport { ShowModalReactEvent } from 'app/types/events';\nimport { ViewJsonModal } from './ViewJsonModal';\nimport { config } from '@grafana/runtime';\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  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    return (\n      <>\n        <p className=\"share-modal-info-text\">Export this dashboard.</p>\n        <Field label=\"Export for sharing externally\">\n          <Switch id=\"share-externally-toggle\" value={shareExternally} onChange={this.onShareExternallyChange} />\n        </Field>\n        {config.featureToggles.trimDefaults && (\n          <Field label=\"Export with default values removed\">\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            Cancel\n          </Button>\n          <Button variant=\"secondary\" onClick={this.onViewJson}>\n            View JSON\n          </Button>\n          <Button variant=\"primary\" onClick={this.onSaveAsFile}>\n            Save to file\n          </Button>\n        </Modal.ButtonRow>\n      </>\n    );\n  }\n}\n","import React, { FormEvent, PureComponent } from 'react';\nimport { ClipboardButton, Field, Modal, RadioButtonGroup, Switch, TextArea } from '@grafana/ui';\nimport { AppEvents, SelectableValue } from '@grafana/data';\nimport { appEvents } from 'app/core/core';\nimport { buildIframeHtml } from './utils';\nimport { ShareModalTabProps } from './types';\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    this.buildIframeHtml();\n  }\n\n  buildIframeHtml = () => {\n    const { panel } = this.props;\n    const { useCurrentTimeRange, selectedTheme } = this.state;\n\n    const iframeHtml = buildIframeHtml(useCurrentTimeRange, 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  onIframeHtmlCopy = () => {\n    appEvents.emit(AppEvents.alertSuccess, ['Content copied to clipboard']);\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            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 variant=\"primary\" getText={this.getIframeHtml} onClipboardCopy={this.onIframeHtmlCopy}>\n            Copy to clipboard\n          </ClipboardButton>\n        </Modal.ButtonRow>\n      </>\n    );\n  }\n}\n","import React from 'react';\nimport { AddLibraryPanelContents } from 'app/features/library-panels/components/AddLibraryPanelModal/AddLibraryPanelModal';\nimport { ShareModalTabProps } from './types';\n\ninterface Props extends ShareModalTabProps {\n  initialFolderId?: number;\n}\n\nexport const ShareLibraryPanel = ({ panel, initialFolderId, onDismiss }: Props) => {\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 React from 'react';\nimport { Modal, ModalTabsHeader, TabContent } from '@grafana/ui';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { isPanelModelLibraryPanel } from 'app/features/library-panels/guard';\nimport { ShareLink } from './ShareLink';\nimport { ShareSnapshot } from './ShareSnapshot';\nimport { ShareExport } from './ShareExport';\nimport { ShareEmbed } from './ShareEmbed';\nimport { ShareModalTabModel } from './types';\nimport { contextSrv } from 'app/core/core';\nimport { ShareLibraryPanel } from './ShareLibraryPanel';\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  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  // onDismiss = () => {\n  //   //this.setState(getInitialState(this.props));\n  //   this.props.onDismiss();\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 { isNumber } from 'lodash';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { getBackendSrv } from '@grafana/runtime';\n\nexport interface HistoryListOpts {\n  limit: number;\n  start: number;\n}\n\nexport interface RevisionsModel {\n  id: number;\n  checked: boolean;\n  dashboardId: number;\n  parentVersion: number;\n  version: number;\n  created: Date;\n  createdBy: string;\n  message: string;\n}\n\nexport interface DiffTarget {\n  dashboardId: number;\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 id = dashboard && dashboard.id ? dashboard.id : void 0;\n    return id ? getBackendSrv().get(`api/dashboards/id/${id}/versions`, options) : Promise.resolve([]);\n  }\n\n  getDashboardVersion(id: number, version: number) {\n    return getBackendSrv().get(`api/dashboards/id/${id}/versions/${version}`);\n  }\n\n  restoreDashboard(dashboard: DashboardModel, version: number) {\n    const id = dashboard && dashboard.id ? dashboard.id : void 0;\n    const url = `api/dashboards/id/${id}/restore`;\n\n    return id && 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';\nimport { AppEvents, locationUtil } from '@grafana/data';\nimport appEvents from 'app/core/app_events';\nimport { StoreState } from 'app/types';\nimport { historySrv } from './HistorySrv';\nimport { DashboardModel } from '../../state';\nimport { locationService } from '@grafana/runtime';\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\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      appEvents.emit(AppEvents.alertSuccess, ['Dashboard restored', 'Restored from version ' + version]);\n    }\n  }, [state, version]);\n  return { state, onRestoreDashboard };\n};\n","import React, { useEffect } from 'react';\nimport { ConfirmModal } from '@grafana/ui';\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 React from 'react';\nimport { css } from '@emotion/css';\nimport { Checkbox, Button, Tag, ModalsController } from '@grafana/ui';\nimport { DecoratedRevisionModel } from '../DashboardSettings/VersionsSettings';\nimport { RevertDashboardModal } from './RevertDashboardModal';\n\ntype VersionsTableProps = {\n  versions: DecoratedRevisionModel[];\n  onCheck: (ev: React.FormEvent<HTMLInputElement>, versionId: number) => void;\n};\nexport const VersionHistoryTable: React.FC<VersionsTableProps> = ({ versions, onCheck }) => (\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            />\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 React from 'react';\nimport { css } from '@emotion/css';\nimport { noop } from 'lodash';\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';\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 { 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 React from 'react';\nimport { isArray, isObject, isUndefined } from 'lodash';\nimport { useStyles2, Icon } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React from 'react';\nimport { useStyles, Icon } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { Diff, getDiffText } from './utils';\nimport { DiffValues } from './DiffValues';\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 React from 'react';\nimport { last } from 'lodash';\nimport { useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React from 'react';\nimport { css } from '@emotion/css';\nimport ReactDiffViewer, { ReactDiffViewerProps, DiffMethod } from 'react-diff-viewer';\nimport { useTheme } from '@grafana/ui';\nimport tinycolor from 'tinycolor2';\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 React from 'react';\nimport { css, cx } from '@emotion/css';\n\nimport { Button, ModalsController, CollapsableSection, HorizontalGroup, useStyles } from '@grafana/ui';\nimport { DecoratedRevisionModel } from '../DashboardSettings/VersionsSettings';\nimport { RevertDashboardModal } from './RevertDashboardModal';\nimport { DiffGroup } from './DiffGroup';\nimport { DiffViewer } from './DiffViewer';\nimport { jsonDiff } from './utils';\nimport { GrafanaTheme } from '@grafana/data';\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 React, { FC, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { PanelMenuItem } from '@grafana/data';\nimport { Icon, IconName, useTheme } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\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 { dateMath, dateTime, TimeRange } from '@grafana/data';\nimport { BehaviorSubject } from 'rxjs';\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 moment from 'moment'; // eslint-disable-line no-restricted-imports\n// eslint-disable-next-line lodash/import-scope\nimport _, { isFunction } from 'lodash';\nimport $ from 'jquery';\nimport kbn from 'app/core/utils/kbn';\nimport { AppEvents, dateMath, UrlQueryValue } from '@grafana/data';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { getDashboardSrv } from './DashboardSrv';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { getBackendSrv, locationService } from '@grafana/runtime';\nimport { appEvents } from '../../../core/core';\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 === 'ds') {\n      promise = this._loadFromDatasource(slug); // explore dashboards as code\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 { appEvents } from 'app/core/app_events';\nimport { DashboardModel } from '../state/DashboardModel';\nimport { removePanel } from '../utils/panel';\nimport { DashboardMeta } from 'app/types';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { saveDashboard } from 'app/features/manage-dashboards/state/actions';\nimport { RemovePanelEvent } from '../../../types/events';\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  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';\nimport {\n  dateMath,\n  dateTime,\n  getDefaultTimeRange,\n  isDateTime,\n  rangeUtil,\n  RawTimeRange,\n  TimeRange,\n  toUtc,\n} from '@grafana/data';\nimport { DashboardModel } from '../state/DashboardModel';\nimport { getShiftedTimeRange, getZoomedTimeRange } from 'app/core/utils/timePicker';\nimport { config } from 'app/core/config';\nimport { getRefreshFromUrl } from '../utils/getRefreshFromUrl';\nimport { locationService } from '@grafana/runtime';\nimport { ShiftTimeEvent, ShiftTimeEventPayload, ZoomOutEvent } from '../../../types/events';\nimport { contextSrv, ContextSrv } from 'app/core/services/context_srv';\nimport appEvents from 'app/core/app_events';\n\nexport class TimeSrv {\n  time: any;\n  refreshTimer: any;\n  refresh: any;\n  previousAutoRefresh: any;\n  oldRefresh: string | null | undefined;\n  dashboard?: DashboardModel;\n  timeAtLoad: any;\n  private autoRefreshBlocked?: boolean;\n\n  constructor(private contextSrv: ContextSrv) {\n    // default time\n    this.time = getDefaultTimeRange().raw;\n    this.refreshDashboard = this.refreshDashboard.bind(this);\n\n    appEvents.subscribe(ZoomOutEvent, (e) => {\n      this.zoomOut(e.payload);\n    });\n\n    appEvents.subscribe(ShiftTimeEvent, (e) => {\n      this.shiftTime(e.payload);\n    });\n\n    document.addEventListener('visibilitychange', () => {\n      if (this.autoRefreshBlocked && document.visibilityState === 'visible') {\n        this.autoRefreshBlocked = false;\n        this.refreshDashboard();\n      }\n    });\n  }\n\n  init(dashboard: DashboardModel) {\n    this.dashboard = dashboard;\n    this.time = dashboard.time;\n    this.refresh = dashboard.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.dashboard?.getTimezone(),\n      this.dashboard?.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 dashboard\n    if (params.get('to') && params.get('to')!.indexOf('now') === -1) {\n      this.refresh = false;\n      if (this.dashboard) {\n        this.dashboard.refresh = false;\n      }\n    }\n\n    let paramsJSON: Record<string, string> = {};\n    params.forEach(function (value, key) {\n      paramsJSON[key] = value;\n    });\n\n    // but if refresh explicitly set then use that\n    this.refresh = getRefreshFromUrl({\n      params: paramsJSON,\n      currentRefresh: this.refresh,\n      refreshIntervals: Array.isArray(this.dashboard?.timepicker?.refresh_intervals)\n        ? this.dashboard?.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, true);\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.dashboard) {\n      this.dashboard.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.refreshDashboard();\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  refreshDashboard() {\n    this.dashboard?.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.refreshDashboard();\n      } else {\n        this.autoRefreshBlocked = true;\n      }\n    }, afterMs);\n  }\n\n  stopAutoRefresh() {\n    clearTimeout(this.refreshTimer);\n  }\n\n  // store dashboard refresh value and pause auto-refresh in some places\n  // i.e panel edit\n  pauseAutoRefresh() {\n    this.previousAutoRefresh = this.dashboard?.refresh;\n    this.setAutoRefresh('');\n  }\n\n  // resume auto-refresh based on old dashboard refresh property\n  resumeAutoRefresh() {\n    this.setAutoRefresh(this.previousAutoRefresh);\n  }\n\n  setTime(time: RawTimeRange, fromRouteUpdate?: boolean) {\n    extend(this.time, time);\n\n    // disable refresh if zoom in or zoom out\n    if (isDateTime(time.to)) {\n      this.oldRefresh = this.dashboard?.refresh || this.oldRefresh;\n      this.setAutoRefresh(false);\n    } else if (this.oldRefresh && this.oldRefresh !== this.dashboard?.refresh) {\n      this.setAutoRefresh(this.oldRefresh);\n      this.oldRefresh = null;\n    }\n\n    // update url\n    if (fromRouteUpdate !== 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.refreshDashboard();\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.dashboard ? this.dashboard.getTimezone() : undefined;\n\n    return {\n      from: dateMath.parse(raw.from, false, timezone, this.dashboard?.fiscalYearStartMonth)!,\n      to: dateMath.parse(raw.to, true, timezone, this.dashboard?.fiscalYearStartMonth)!,\n      raw: raw,\n    };\n  }\n\n  zoomOut(factor: number) {\n    const range = this.timeRange();\n    const { from, to } = getZoomedTimeRange(range, factor);\n\n    this.setTime({ from: toUtc(from), to: toUtc(to) });\n  }\n\n  shiftTime(direction: ShiftTimeEventPayload) {\n    const range = this.timeRange();\n    const { from, to } = getShiftedTimeRange(direction, range);\n\n    this.setTime({\n      from: toUtc(from),\n      to: toUtc(to),\n    });\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  params: Record<string, string>;\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  params,\n  currentRefresh,\n  isAllowedIntervalFn,\n  minRefreshInterval,\n  refreshIntervals = defaultIntervals,\n}: Args): string | boolean | undefined {\n  if (!params.refresh) {\n    return currentRefresh;\n  }\n\n  const isAllowedInterval = isAllowedIntervalFn(params.refresh);\n  const isExistingInterval = refreshIntervals.find((interval) => interval === params.refresh);\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 params.refresh || currentRefresh;\n}\n","import { AnnotationQuery, DataQuery } from '@grafana/data';\nimport { getNextRefIdChar } from 'app/core/utils/query';\nimport { MetricEditorMode, CloudWatchAnnotationQuery, CloudWatchMetricsQuery, MetricQueryType } from './types';\n\n// Migrates a metric 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 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: CloudWatchAnnotationQuery\n): Array<AnnotationQuery<DataQuery>> {\n  const newAnnotations: CloudWatchAnnotationQuery[] = [];\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 as Array<AnnotationQuery<DataQuery>>;\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","// Libraries\nimport { each, find, findIndex, flattenDeep, isArray, isBoolean, isNumber, isString, map, max, some } from 'lodash';\n// Utils\nimport getFactors from 'app/core/utils/factors';\nimport kbn from 'app/core/utils/kbn';\n// Types\nimport { PanelModel } from './PanelModel';\nimport { DashboardModel } from './DashboardModel';\nimport {\n  AnnotationQuery,\n  DataLink,\n  DataLinkBuiltInVars,\n  DataQuery,\n  DataSourceRef,\n  DataTransformerConfig,\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';\n// Constants\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 { isConstant, isMulti } from 'app/features/variables/guard';\nimport { alignCurrentWithMulti } from 'app/features/variables/shared/multiOptions';\nimport { VariableHide } from '../../variables/types';\nimport { config } from 'app/core/config';\nimport { plugin as statPanelPlugin } from 'app/plugins/panel/stat/module';\nimport { plugin as gaugePanelPlugin } from 'app/plugins/panel/gauge/module';\nimport { getStandardFieldConfigs, getStandardOptionEditors } from '@grafana/ui';\nimport { getDataSourceSrv } from '@grafana/runtime';\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 'app/plugins/datasource/cloudwatch/migrations';\nimport { CloudWatchAnnotationQuery, CloudWatchMetricsQuery } from 'app/plugins/datasource/cloudwatch/types';\n\nstandardEditorsRegistry.setInit(getStandardOptionEditors);\nstandardFieldConfigEditorRegistry.setInit(getStandardFieldConfigs);\n\ntype PanelSchemeUpgradeHandler = (panel: PanelModel) => PanelModel;\nexport class DashboardMigrator {\n  dashboard: DashboardModel;\n\n  constructor(dashboardModel: DashboardModel) {\n    this.dashboard = dashboardModel;\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 = 34;\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);\n\n        if (!panel.targets) {\n          return panel;\n        }\n\n        for (const target of panel.targets) {\n          const targetRef = migrateDatasourceNameToRef(target.datasource);\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 (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        if (this.dashboard.panels[j].panels) {\n          for (n = 0; n < this.dashboard.panels[j].panels.length; n++) {\n            this.dashboard.panels[j].panels[n] = panelUpgrades[k].call(this, this.dashboard.panels[j].panels[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\nexport function migrateDatasourceNameToRef(nameOrRef?: string | DataSourceRef | null): DataSourceRef | null {\n  if (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(target: AnnotationQuery<DataQuery>): target is CloudWatchAnnotationQuery {\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","// 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 { PanelModel as IPanelModel } from '@grafana/data';\nimport { isEqualWith } from 'lodash';\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 { 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","// Libaries\nimport {\n  cloneDeep,\n  defaults as _defaults,\n  each,\n  filter,\n  find,\n  findIndex,\n  indexOf,\n  isEqual,\n  map,\n  maxBy,\n  pull,\n  some,\n} from 'lodash';\n// Constants\nimport { DEFAULT_ANNOTATION_COLOR } from '@grafana/ui';\nimport { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN, GRID_COLUMN_COUNT, REPEAT_DIR_VERTICAL } from 'app/core/constants';\n// Utils & Services\nimport { contextSrv } from 'app/core/services/context_srv';\n// Types\nimport { GridPos, PanelModel } from './PanelModel';\nimport { DashboardMigrator } from './DashboardMigrator';\nimport {\n  AnnotationQuery,\n  AppEvent,\n  DashboardCursorSync,\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 { CoreEvents, DashboardMeta, KioskMode } from 'app/types';\nimport { GetVariables, getVariables } from 'app/features/variables/state/selectors';\nimport { variableAdapters } from 'app/features/variables/adapters';\nimport { onTimeRangeUpdated } from 'app/features/variables/state/actions';\nimport { dispatch } from '../../../store/store';\nimport { isAllVariable } from '../../variables/utils';\nimport { DashboardPanelsChangedEvent, RenderEvent } from 'app/types/events';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { mergePanels, PanelMergeInfo } from '../utils/panelMerge';\nimport { deleteScopeVars, isOnTheSameGridRow } from './utils';\nimport { RefreshEvent, TimeRangeUpdatedEvent } from '@grafana/runtime';\nimport { sortedDeepCloneWithoutNulls } from 'app/core/utils/object';\nimport { Subscription } from 'rxjs';\nimport { appEvents } from '../../../core/core';\nimport {\n  VariablesChanged,\n  VariablesChangedEvent,\n  VariablesChangedInUrl,\n  VariablesTimeRangeProcessDone,\n} from '../../variables/types';\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 {\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  iteration?: number;\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 = getVariables) {\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.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    let found = false;\n    for (const item of this.annotations.list) {\n      if (item.builtIn === 1) {\n        found = true;\n        break;\n      }\n    }\n\n    if (found) {\n      return;\n    }\n\n    this.annotations.list.unshift({\n      datasource: '-- 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.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 = () => {\n      return copy.templating.list;\n    };\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((panel: PanelModel) => {\n        if (this.isSnapshotTruthy()) {\n          return true;\n        }\n        if (panel.type === 'add-panel') {\n          return false;\n        }\n        // skip repeated panels in the saved model\n        if (panel.repeatPanelId) {\n          return false;\n        }\n        // skip repeated rows in the saved model\n        if (panel.repeatedByRow) {\n          return false;\n        }\n        return true;\n      })\n      .map((panel: PanelModel) => {\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();\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 (let i = 0; i < copy.templating.list.length; i++) {\n        const current = copy.templating.list[i];\n        const original: any = find(originalVariables, { name: current.name, type: current.type });\n\n        if (!original) {\n          continue;\n        }\n\n        if (current.type === 'adhoc') {\n          copy.templating.list[i].filters = original.filters;\n        } else {\n          copy.templating.list[i].current = original.current;\n        }\n      }\n    }\n  }\n\n  timeRangeUpdated(timeRange: TimeRange) {\n    this.events.publish(new TimeRangeUpdatedEvent(timeRange));\n    dispatch(onTimeRangeUpdated(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) {\n      if (event.refreshAll || event.panelIds.includes(this.panelInEdit.id)) {\n        this.panelInEdit.refresh();\n        return;\n      }\n    }\n\n    for (const panel of this.panels) {\n      if (!this.otherPanelInFullscreen(panel)) {\n        if (event.refreshAll || event.panelIds.includes(panel.id)) {\n          panel.refresh();\n        }\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 ensureListExist(data: any) {\n    if (!data) {\n      data = {};\n    }\n    if (!data.list) {\n      data.list = [];\n    }\n    return data;\n  }\n\n  getNextPanelId() {\n    let max = 0;\n\n    for (const panel of this.panels) {\n      if (panel.id > max) {\n        max = panel.id;\n      }\n\n      if (panel.collapsed) {\n        for (const rowPanel of panel.panels) {\n          if (rowPanel.id > max) {\n            max = rowPanel.id;\n          }\n        }\n      }\n    }\n\n    return max + 1;\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    for (const panel of this.panels) {\n      if (panel.id === id) {\n        return panel;\n      }\n    }\n\n    return 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    for (const panel of this.panels) {\n      if (panel.hasChanged) {\n        console.log('Panel has changed', panel);\n        return true;\n      }\n    }\n    return false;\n  }\n\n  cleanUpRepeats() {\n    if (this.isSnapshotTruthy() || !this.hasVariables()) {\n      return;\n    }\n\n    this.iteration = (this.iteration || new Date().getTime()) + 1;\n    const panelsToRemove = [];\n\n    // cleanup scopedVars\n    deleteScopeVars(this.panels);\n\n    for (let i = 0; i < this.panels.length; i++) {\n      const panel = this.panels[i];\n      if ((!panel.repeat || panel.repeatedByRow) && panel.repeatPanelId && panel.repeatIteration !== this.iteration) {\n        panelsToRemove.push(panel);\n      }\n    }\n\n    // remove panels\n    pull(this.panels, ...panelsToRemove);\n    panelsToRemove.map((p) => p.destroy());\n    this.sortPanelsByGridPos();\n    this.events.publish(new DashboardPanelsChangedEvent());\n  }\n\n  processRepeats() {\n    if (this.isSnapshotTruthy() || !this.hasVariables()) {\n      return;\n    }\n\n    this.cleanUpRepeats();\n\n    this.iteration = (this.iteration || new Date().getTime()) + 1;\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 panelsToRemove = [];\n    for (let i = 0; i < rowPanels.length; i++) {\n      const panel = rowPanels[i];\n      if (!panel.repeat && panel.repeatPanelId) {\n        panelsToRemove.push(panel);\n      }\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 = findIndex(this.panels, (p: PanelModel) => p.id === row.id);\n      rowPanels = this.getRowPanels(rowPanelIndex);\n    }\n\n    this.cleanUpRowRepeats(rowPanels);\n\n    for (let i = 0; i < rowPanels.length; i++) {\n      const panel = rowPanels[i];\n      if (panel.repeat) {\n        const panelIndex = findIndex(this.panels, (p: PanelModel) => 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.repeatIteration = this.iteration;\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 = map(rowPanels, (panel: PanelModel) => 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: any = 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 = 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 (let i = panelBelowIndex; i < this.panels.length; i++) {\n        if (isOnTheSameGridRow(panel, this.panels[i])) {\n          continue;\n        }\n\n        this.panels[i].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 = 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        each(rowPanels, (rowPanel: PanelModel, i: number) => {\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        each(rowPanels, (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 (let i = panelBelowIndex; i < this.panels.length; i++) {\n          this.panels[i].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    panel.key = `${panel.id}`;\n    panel.repeatIteration = this.iteration;\n    if (repeatedByRow) {\n      panel.repeatedByRow = true;\n    } else {\n      panel.repeat = undefined;\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    const rowYPos = rowPanel.gridPos.y;\n    const positions = map(rowPanel.panels, 'gridPos');\n    const maxPos = maxBy(positions, (pos: GridPos) => {\n      return pos.y + pos.h;\n    });\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 needToogle = (!removePanels && row.collapsed) || (removePanels && !row.collapsed);\n\n    if (needToogle) {\n      this.toggleRow(row);\n    }\n\n    this.removePanel(row);\n  }\n\n  expandRows() {\n    for (let i = 0; i < this.panels.length; i++) {\n      const panel = this.panels[i];\n\n      if (panel.type !== 'row') {\n        continue;\n      }\n\n      if (panel.collapsed) {\n        this.toggleRow(panel);\n      }\n    }\n  }\n\n  collapseRows() {\n    for (let i = 0; i < this.panels.length; i++) {\n      const panel = this.panels[i];\n\n      if (panel.type !== 'row') {\n        continue;\n      }\n\n      if (!panel.collapsed) {\n        this.toggleRow(panel);\n      }\n    }\n  }\n\n  isSubMenuVisible() {\n    if (this.links.length > 0) {\n      return true;\n    }\n\n    if (this.getVariables().find((variable) => variable.hide !== 2)) {\n      return true;\n    }\n\n    if (this.annotations.list.find((annotation) => annotation.hide !== true)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  getPanelInfoById(panelId: number) {\n    for (let i = 0; i < this.panels.length; i++) {\n      if (this.panels[i].id === panelId) {\n        return {\n          panel: this.panels[i],\n          index: i,\n        };\n      }\n    }\n\n    return 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    if (newPanel.alert) {\n      delete newPanel.thresholds;\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      row.collapsed = false;\n      const hasRepeat = some(row.panels as PanelModel[], (p: PanelModel) => p.repeat);\n\n      if (row.panels.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 = row.panels[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 row.panels) {\n          // set the y gridPos if it wasn't already set\n          panel.gridPos.y ??= row.gridPos.y;\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 (let panelIndex = insertPos; panelIndex < this.panels.length; panelIndex++) {\n          this.panels[panelIndex].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      return;\n    }\n\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 = map(rowPanels, (panel: PanelModel) => panel.getSaveModel());\n    row.collapsed = true;\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 rowPanels = [];\n\n    for (let index = rowIndex + 1; index < this.panels.length; index++) {\n      const panel = this.panels[index];\n\n      // break when encountering another row\n      if (panel.type === 'row') {\n        break;\n      }\n\n      // this panel must belong to row\n      rowPanels.push(panel);\n    }\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    return !isEqual(this.time, this.originalTime);\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());\n  }\n\n  hasVariableValuesChanged() {\n    return this.hasVariablesChanged(this.originalTemplating, this.getVariablesFromState());\n  }\n\n  autoFitPanels(viewHeight: number, kioskMode?: UrlQueryValue) {\n    const currentGridHeight = Math.max(\n      ...this.panels.map((panel) => {\n        return panel.gridPos.h + panel.gridPos.y;\n      })\n    );\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    this.panels.forEach((panel, i) => {\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    for (const panel of this.panels) {\n      if (panel.collapsed) {\n        for (const rowPanel of panel.panels) {\n          if (rowPanel.id === panelId) {\n            this.toggleRow(panel);\n            break;\n          }\n        }\n      }\n    }\n\n    return this.getPanelById(panelId);\n  }\n\n  toggleLegendsForAll() {\n    const panelsWithLegends = this.panels.filter((panel) => {\n      return panel.legend !== undefined && panel.legend !== null;\n    });\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();\n  };\n\n  canAddAnnotations() {\n    return 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  private getPanelRepeatVariable(panel: PanelModel) {\n    return this.getVariablesFromState().find((variable) => variable.name === panel.repeat);\n  }\n\n  private isSnapshotTruthy() {\n    return this.snapshot;\n  }\n\n  private hasVariables() {\n    return this.getVariablesFromState().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 = map(currentVariables, (variable: any) => {\n      return {\n        name: variable.name,\n        type: variable.type,\n        current: cloneDeep(variable.current),\n        filters: cloneDeep(variable.filters),\n      };\n    });\n\n    return !isEqual(updated, originalVariables);\n  }\n\n  private cloneVariablesFrom(variables: any[]): any[] {\n    return variables.map((variable) => {\n      return {\n        name: variable.name,\n        type: variable.type,\n        current: cloneDeep(variable.current),\n        filters: cloneDeep(variable.filters),\n      };\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","import { PanelModel } from './PanelModel';\nimport { REPEAT_DIR_HORIZONTAL } from '../../../core/constants';\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","// Libraries\nimport { cloneDeep, defaultsDeep, isArray, isEqual, keys } from 'lodash';\nimport { v4 as uuidv4 } from 'uuid';\n// Utils\nimport { getTemplateSrv, RefreshEvent } from '@grafana/runtime';\nimport { getNextRefIdChar } from 'app/core/utils/query';\n// Types\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 config from 'app/core/config';\nimport { PanelQueryRunner } from '../../query/state/PanelQueryRunner';\nimport {\n  PanelOptionsChangedEvent,\n  PanelQueriesChangedEvent,\n  PanelTransformationsChangedEvent,\n  RenderEvent,\n} from 'app/types/events';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { getVariablesUrlParams } from '../../variables/getAllVariableValuesForUrl';\nimport {\n  filterFieldConfigOverrides,\n  getPanelOptionsWithDefaults,\n  isStandardFieldProp,\n  restoreCustomOverrideRules,\n} from './getPanelOptionsWithDefaults';\nimport { QueryGroupOptions } from 'app/types';\nimport { PanelModelLibraryPanel } from '../../library-panels/types';\n\nexport interface GridPos {\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  static?: boolean;\n}\n\nimport { TimeOverrideResult } from '../utils/panel';\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  repeatIteration: 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  datasource: null,\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?: any;\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  // 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    // 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    if (model.datasource === undefined) {\n      // This is part of defaults as defaults are removed in save model and\n      // this should not be removed in save model as exporter needs to templatize it\n      model.datasource = null;\n    }\n\n    return model;\n  }\n\n  setIsViewing(isViewing: boolean) {\n    this.isViewing = isViewing;\n  }\n\n  updateGridPos(newPos: GridPos) {\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  }\n\n  runAllPanelQueries(dashboardId: number, dashboardTimezone: string, timeData: TimeOverrideResult, width: number) {\n    this.getQueryRunner().run({\n      datasource: this.datasource,\n      queries: this.targets,\n      panelId: this.id,\n      dashboardId: dashboardId,\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 (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  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    // Let panel plugins inspect options from previous panel and keep any that it can use\n    if (newPlugin.onPanelTypeChanged) {\n      const prevOptions = wasAngular ? { angular: oldOptions } : oldOptions.options;\n      Object.assign(this.options, newPlugin.onPanelTypeChanged(this, oldPluginId, prevOptions, prevFieldConfig));\n    }\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 = dataSource.default\n      ? null\n      : {\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    let vars = this.scopedVars;\n\n    if (extraVars) {\n      vars = vars ? { ...vars, ...extraVars } : extraVars;\n    }\n\n    const allVariablesParams = getVariablesUrlParams(vars);\n    const variablesQuery = urlUtil.toUrlParams(allVariablesParams);\n    const timeRangeUrl = urlUtil.toUrlParams(getTimeSrv().timeRangeForUrl());\n\n    vars = {\n      ...vars,\n      [DataLinkBuiltInVars.keepTime]: {\n        text: timeRangeUrl,\n        value: timeRangeUrl,\n      },\n      [DataLinkBuiltInVars.includeVars]: {\n        text: variablesQuery,\n        value: variablesQuery,\n      },\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, {}, '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","// Services & Utils\nimport { getBackendSrv } from '@grafana/runtime';\nimport { createSuccessNotification } from 'app/core/copy/appNotification';\n// Actions\nimport { loadPluginDashboards } from '../../plugins/admin/state/actions';\nimport { cleanUpDashboard, loadDashboardPermissions } from './reducers';\nimport { notifyApp } from 'app/core/actions';\nimport { updateTimeZoneForSession, updateWeekStartForSession } from 'app/features/profile/state/reducers';\n// Types\nimport { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLevel, ThunkResult } from 'app/types';\nimport { cancelVariables } from '../../variables/state/actions';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { TimeZone } from '@grafana/data';\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(uri: string): ThunkResult<void> {\n  return async (dispatch) => {\n    await getBackendSrv().delete(`/api/dashboards/${uri}`);\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  }\n\n  getTimeSrv().stopAutoRefresh();\n\n  dispatch(cleanUpDashboard());\n  dispatch(cancelVariables());\n};\n\nexport const updateTimeZoneDashboard = (timeZone: TimeZone): ThunkResult<void> => (dispatch) => {\n  dispatch(updateTimeZoneForSession(timeZone));\n  getTimeSrv().refreshDashboard();\n};\n\nexport const updateWeekStartDashboard = (weekStart: string): ThunkResult<void> => (dispatch) => {\n  dispatch(updateWeekStartForSession(weekStart));\n  getTimeSrv().refreshDashboard();\n};\n","import {\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';\nimport { mergeWith, isArray, isObject, unset, isEqual } from 'lodash';\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';\nimport {\n  DashboardAclDTO,\n  DashboardInitError,\n  DashboardInitPhase,\n  DashboardState,\n  QueriesToUpdateOnDashboardLoad,\n} from 'app/types';\nimport { AngularComponent } from '@grafana/runtime';\nimport { processAclItems } from 'app/core/utils/acl';\nimport { DashboardModel } from './DashboardModel';\nimport { PanelModel } from './PanelModel';\nimport { PanelPlugin } from '@grafana/data';\n\nexport const initialState: DashboardState = {\n  initPhase: DashboardInitPhase.NotStarted,\n  isInitSlow: false,\n  getModel: () => null,\n  permissions: [],\n  modifiedQueries: null,\n  initError: null,\n};\n\nconst dashbardSlice = 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    dashboardInitSlow: (state) => {\n      state.isInitSlow = true;\n    },\n    dashboardInitCompleted: (state, action: PayloadAction<DashboardModel>) => {\n      state.getModel = () => action.payload;\n      state.initPhase = DashboardInitPhase.Completed;\n      state.isInitSlow = false;\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.isInitSlow = false;\n      state.initError = null;\n      state.getModel = () => null;\n    },\n    setDashboardQueriesToUpdateOnLoad: (state, action: PayloadAction<QueriesToUpdateOnDashboardLoad>) => {\n      state.modifiedQueries = action.payload;\n    },\n    clearDashboardQueriesToUpdateOnLoad: (state) => {\n      state.modifiedQueries = 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  dashboardInitSlow,\n  dashboardInitCompleted,\n  dashboardInitServices,\n  cleanUpDashboard,\n  setDashboardQueriesToUpdateOnLoad,\n  clearDashboardQueriesToUpdateOnLoad,\n  addPanel,\n} = dashbardSlice.actions;\n\nexport const dashboardReducer = dashbardSlice.reducer;\n\nexport default {\n  dashboard: dashboardReducer,\n};\n","import { applyFieldOverrides, ArrayDataFrame, getDefaultTimeRange, LoadingState, PanelData } from '@grafana/data';\nimport { config } from 'app/core/config';\nimport { DashboardModel, PanelModel } from '../state';\nimport { getProcessedDataFrames } from '../../query/state/runRequest';\nimport { SnapshotWorker } from '../../query/state/DashboardQueryRunner/SnapshotWorker';\nimport { applyPanelTimeOverrides } from './panel';\nimport { getTimeSrv } from '../services/TimeSrv';\n\nexport function loadSnapshotData(panel: PanelModel, dashboard: DashboardModel): PanelData {\n  const data = getProcessedDataFrames(panel.snapshotData);\n  const worker = new SnapshotWorker();\n  const options = { dashboard, range: getDefaultTimeRange() };\n  const annotationEvents = worker.canWork(options) ? worker.getAnnotationsInSnapshot(dashboard, panel.id) : [];\n  const annotations = [new ArrayDataFrame(annotationEvents)];\n  const timeData = applyPanelTimeOverrides(panel, getTimeSrv().timeRange());\n\n  return {\n    timeRange: timeData.timeRange,\n    state: LoadingState.Done,\n    series: applyFieldOverrides({\n      data,\n      fieldConfig: {\n        defaults: {},\n        overrides: [],\n      },\n      replaceVariables: panel.replaceVariables,\n      fieldConfigRegistry: panel.plugin!.fieldConfigRegistry,\n      theme: config.theme2,\n      timeZone: dashboard.getTimezone(),\n    }),\n    annotations,\n  };\n}\n","// Store\nimport store from 'app/core/store';\n\n// Models\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { TimeRange, AppEvents, rangeUtil, dateMath, PanelModel as IPanelModel } from '@grafana/data';\n\n// Utils\nimport { isString as _isString } from 'lodash';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\n\n// Services\nimport { getTemplateSrv } from '@grafana/runtime';\n\n// Constants\nimport { LS_PANEL_COPY_KEY, PANEL_BORDER } from 'app/core/constants';\n\nimport { ShareModal } from 'app/features/dashboard/components/ShareModal';\nimport { ShowConfirmModalEvent, ShowModalReactEvent } from '../../../types/events';\nimport { AddLibraryPanelModal } from 'app/features/library-panels/components/AddLibraryPanelModal/AddLibraryPanelModal';\nimport { UnlinkModal } from 'app/features/library-panels/components/UnlinkModal/UnlinkModal';\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};\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  console.warn('Toggle legend is not implemented yet');\n  // We need to set panel.legend defaults first\n  // panel.legend.show = !panel.legend.show;\n  refreshPanel(panel);\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","import { AnyAction, createAction } from '@reduxjs/toolkit';\nimport { DataSourcePluginMeta, DataSourceSettings, LayoutMode, LayoutModes } from '@grafana/data';\n\nimport { DataSourcesState, DataSourceSettingsState, TestingStatus } from 'app/types';\nimport { DataSourceTypesLoadedPayload } from './actions';\nimport { GenericDataSourcePlugin } from '../settings/PluginSettings';\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 React, { FC, useCallback } from 'react';\nimport { GrafanaTheme2, SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { ColorDimensionConfig } from '../types';\nimport { Select, ColorPicker, useStyles2 } from '@grafana/ui';\nimport {\n  useFieldDisplayNames,\n  useSelectOptions,\n} from '../../../../../packages/grafana-ui/src/components/MatchersUI/utils';\nimport { css } from '@emotion/css';\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          menuShouldPortal\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 React, { PureComponent } from 'react';\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 */\nexport class NumberInput extends PureComponent<Props, State> {\n  state: State = { text: '', inputCorrected: false };\n\n  componentDidMount() {\n    this.setState({\n      ...this.state,\n      text: isNaN(this.props.value!) ? '' : `${this.props.value}`,\n    });\n  }\n\n  componentDidUpdate(oldProps: Props) {\n    if (this.props.value !== oldProps.value) {\n      this.setState({\n        ...this.state,\n        text: isNaN(this.props.value!) ? '' : `${this.props.value}`,\n      });\n    }\n  }\n\n  onBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n    let value: number | undefined = undefined;\n    const txt = e.currentTarget.value;\n    if (txt && !isNaN(e.currentTarget.valueAsNumber)) {\n      value = e.currentTarget.valueAsNumber;\n    }\n    this.props.onChange(value);\n    this.setState({ ...this.state, inputCorrected: false });\n  };\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      ...this.state,\n      text: newValue ? newValue : '',\n      inputCorrected: corrected,\n    });\n  };\n\n  onKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\n    if (e.key === 'Enter') {\n      this.onBlur(e as any);\n    }\n  };\n\n  render() {\n    const { placeholder } = this.props;\n    const { text, inputCorrected } = this.state;\n    return (\n      <Field invalid={inputCorrected} error={inputCorrected ? 'Cannot go beyond range' : ''}>\n        <Input\n          type=\"number\"\n          min={this.props.min}\n          max={this.props.max}\n          step={this.props.step}\n          autoFocus={this.props.autoFocus}\n          value={text}\n          onChange={this.onChange}\n          onBlur={this.onBlur}\n          onKeyPress={this.onKeyPress}\n          placeholder={placeholder}\n        />\n      </Field>\n    );\n  }\n}\n","import React, { FC, useCallback } from 'react';\nimport {\n  FieldNamePickerConfigSettings,\n  StandardEditorProps,\n  StandardEditorsRegistryItem,\n  StringFieldConfigSettings,\n} from '@grafana/data';\nimport { Button, InlineField, InlineFieldRow, RadioButtonGroup, StringValueEditor } from '@grafana/ui';\n\nimport { TextDimensionConfig, TextDimensionMode, TextDimensionOptions } from '../types';\nimport { FieldNamePicker } from '../../../../../packages/grafana-ui/src/components/MatchersUI/FieldNamePicker';\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  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 onClearFixedText = () => {\n    // Need to first change to field in order to clear fixed value in editor\n    onChange({ mode: TextDimensionMode.Field, fixed: '', field: '' });\n    onChange({ mode: TextDimensionMode.Fixed, fixed: '', field: '' });\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>\n          <InlineField label={'Value'} labelWidth={labelWidth} grow={true}>\n            <>\n              <StringValueEditor\n                context={context}\n                value={value?.fixed}\n                onChange={onFixedChange}\n                item={dummyStringSettings}\n              />\n              {value?.fixed && (\n                <Button icon=\"times\" variant=\"secondary\" fill=\"text\" size=\"sm\" onClick={onClearFixedText} />\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, { memo, CSSProperties } from 'react';\nimport { areEqual, FixedSizeGrid as Grid } from 'react-window';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2, stylesFactory } from '@grafana/ui';\nimport SVG from 'react-inlinesvg';\nimport { css, cx } from '@emotion/css';\nimport { ResourceItem } from './ResourcePicker';\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.substr(0, card.label.length - 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 React, { useEffect, useState } from 'react';\nimport { css } from '@emotion/css';\nimport SVG from 'react-inlinesvg';\nimport { Button, Select, FilterInput, useTheme2, stylesFactory, Field, Modal, Label, Input } from '@grafana/ui';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\n\nimport { ResourceCards } from './ResourceCards';\nimport { getPublicOrAbsoluteUrl } from '../resource';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { FileElement, GrafanaDatasource } from 'app/plugins/datasource/grafana/datasource';\nimport { ResourceFolderName } from '..';\n\ninterface Props {\n  value?: string; //img/icons/unicons/0-plus.svg\n  onChange: (value?: string) => void;\n  mediaType: 'icon' | 'image';\n  folderName: ResourceFolderName;\n  setOpen: (value: boolean) => void;\n}\n\nexport interface ResourceItem {\n  label: string;\n  value: string; // includes folder\n  search: string;\n  imgUrl: string;\n}\n\nconst sourceOptions = [\n  { label: `Folder`, value: 'folder' },\n  { label: 'URL', value: 'url' },\n  // { label: 'Upload', value: 'upload' }, TODO\n];\n\nconst getFolders = (mediaType: 'icon' | 'image') => {\n  if (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 const ResourcePicker = (props: Props) => {\n  const { value, onChange, mediaType, folderName, setOpen } = props;\n  const folders = getFolders(mediaType).map((v) => ({\n    label: v,\n    value: v,\n  }));\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  // select between existing icon folder, url, or upload\n  const [source, setSource] = useState<SelectableValue<string>>(sourceOptions[0]);\n  // pass on new value to confirm button and to show in preview\n  const [newValue, setNewValue] = useState<string>(value ?? '');\n  const [searchQuery, setSearchQuery] = useState<string>();\n  const theme = useTheme2();\n  const styles = getStyles(theme);\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 === '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.substr(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  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  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    <div>\n      <div className={styles.upper}>\n        <div className={styles.child}>\n          <Field label=\"Source\">\n            <Select menuShouldPortal={true} options={sourceOptions} onChange={setSource} value={source} />\n          </Field>\n          {source?.value === 'folder' && (\n            <>\n              <Field label=\"Folder\">\n                <Select menuShouldPortal={true} 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            </>\n          )}\n          {source?.value === 'url' && (\n            <Field label=\"URL\">\n              <Input onChange={(e) => setNewValue(e.currentTarget.value)} value={newValue} />\n            </Field>\n          )}\n        </div>\n        <div className={styles.iconContainer}>\n          <Field label=\"Preview\">\n            <div className={styles.iconPreview}>\n              {mediaType === 'icon' && <SVG src={imgSrc} className={styles.img} />}\n              {mediaType === 'image' && newValue && <img src={imgSrc} className={styles.img} />}\n            </div>\n          </Field>\n          <Label>{shortName}</Label>\n        </div>\n      </div>\n      {source?.value === 'folder' && filteredIndex && (\n        <div className={styles.cardsWrapper}>\n          <ResourceCards cards={filteredIndex} onChange={(v) => setNewValue(v)} value={newValue} />\n        </div>\n      )}\n\n      <Modal.ButtonRow>\n        <Button variant=\"secondary\" onClick={() => setOpen(false)}>\n          Cancel\n        </Button>\n        <Button variant={newValue && newValue !== value ? 'primary' : 'secondary'} onClick={() => onChange(newValue)}>\n          Select\n        </Button>\n      </Modal.ButtonRow>\n      {/* TODO: add file upload\n          {tabs[1].active && (\n          <FileUpload\n            onFileUpload={({ currentTarget }) => console.log('file', currentTarget?.files && currentTarget.files[0])}\n            className={styles.tabContent}\n          />\n        )} */}\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  return {\n    cardsWrapper: css`\n      height: 30vh;\n      min-height: 50px;\n      margin-top: 5px;\n      max-width: 680px;\n    `,\n    tabContent: css`\n      margin-top: 20px;\n      & > :nth-child(2) {\n        margin-top: 10px;\n      },\n    `,\n    iconPreview: css`\n      width: 95px;\n      height: 79px;\n      border: 1px solid ${theme.colors.border.medium};\n      display: flex;\n      align-items: center;\n      justify-content: center;\n    `,\n    iconContainer: css`\n      display: flex;\n      flex-direction: column;\n      width: 40%;\n      align-items: center;\n    `,\n    img: css`\n      width: 49px;\n      height: 49px;\n      fill: ${theme.colors.text.primary};\n    `,\n    child: css`\n      width: 60%;\n    `,\n    upper: css`\n      display: flex;\n      flex-wrap: wrap;\n      justify-content: space-between;\n      align-items: center;\n    `,\n  };\n});\n","import React, { FC, useCallback, useState } from 'react';\nimport {\n  FieldNamePickerConfigSettings,\n  GrafanaTheme2,\n  StandardEditorProps,\n  StandardEditorsRegistryItem,\n} from '@grafana/data';\nimport { InlineField, InlineFieldRow, RadioButtonGroup, Button, Modal, Input, useStyles2 } from '@grafana/ui';\nimport SVG from 'react-inlinesvg';\nimport { css } from '@emotion/css';\n\nimport { ResourceDimensionConfig, ResourceDimensionMode, ResourceDimensionOptions } from '../types';\nimport { FieldNamePicker } from '../../../../../packages/grafana-ui/src/components/MatchersUI/FieldNamePicker';\nimport { ResourcePicker } from './ResourcePicker';\nimport { getPublicOrAbsoluteUrl, ResourceFolderName } from '..';\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  const [isOpen, setOpen] = useState(false);\n  const styles = useStyles2(getStyles);\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      setOpen(false);\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 openModal = useCallback(() => {\n    setOpen(true);\n  }, []);\n\n  const mode = value?.mode ?? ResourceDimensionMode.Fixed;\n  const showSourceRadio = item.settings?.showSourceRadio ?? true;\n  const mediaType = item.settings?.resourceType ?? 'icon';\n  const folderName = item.settings?.folderName ?? ResourceFolderName.Icon;\n  let srcPath = '';\n  if (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      {isOpen && (\n        <Modal isOpen={isOpen} title={`Select ${mediaType}`} onDismiss={() => setOpen(false)} closeOnEscape>\n          <ResourcePicker\n            onChange={onFixedChange}\n            value={value?.fixed}\n            mediaType={mediaType}\n            folderName={folderName}\n            setOpen={setOpen}\n          />\n        </Modal>\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        <InlineFieldRow onClick={openModal} className={styles.pointer}>\n          <InlineField label={null} grow>\n            <Input\n              value={niceName(value?.fixed) ?? ''}\n              placeholder={item.settings?.placeholderText ?? 'Select a value'}\n              readOnly={true}\n              prefix={srcPath && <SVG src={srcPath} className={styles.icon} />}\n              suffix={<Button icon=\"times\" variant=\"secondary\" fill=\"text\" size=\"sm\" onClick={onClear} />}\n            />\n          </InlineField>\n        </InlineFieldRow>\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\nconst getStyles = (theme: GrafanaTheme2) => ({\n  icon: css`\n    vertical-align: middle;\n    display: inline-block;\n    fill: currentColor;\n    max-width: 25px;\n  `,\n  pointer: css`\n    cursor: pointer;\n    input[readonly] {\n      cursor: pointer;\n    }\n  `,\n});\n","import React, { FC, useCallback, useMemo } from 'react';\nimport { GrafanaTheme2, SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { ScaleDimensionConfig, ScaleDimensionOptions } from '../types';\nimport { InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';\nimport {\n  useFieldDisplayNames,\n  useSelectOptions,\n} from '../../../../../packages/grafana-ui/src/components/MatchersUI/utils';\nimport { NumberInput } from './NumberInput';\nimport { css } from '@emotion/css';\nimport { validateScaleOptions, validateScaleConfig } from '../scale';\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          menuShouldPortal\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 React, { FC, useCallback } from 'react';\nimport { FieldType, GrafanaTheme2, SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { ScalarDimensionConfig, ScalarDimensionMode, ScalarDimensionOptions } from '../types';\nimport { InlineField, InlineFieldRow, RadioButtonGroup, Select, useStyles2 } from '@grafana/ui';\nimport { useFieldDisplayNames, useSelectOptions } from '@grafana/ui/src/components/MatchersUI/utils';\nimport { NumberInput } from './NumberInput';\nimport { css } from '@emotion/css';\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          menuShouldPortal\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, getFieldColorModeForField, getScaleCalculator, GrafanaTheme2 } from '@grafana/data';\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  const mode = getFieldColorModeForField(field);\n  if (!mode.isByValue) {\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  const scale = getScaleCalculator(field, theme);\n  return {\n    get: (i) => {\n      const val = field.values.get(i);\n      return scale(val).color;\n    },\n    field,\n    value: () => scale(getLastNotNullFieldValue(field)).color,\n  };\n}\n","import { DataFrame, Field, FieldType, formattedValueToString } from '@grafana/data';\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, Field } from '@grafana/data';\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 } from '@grafana/data';\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  return {\n    field,\n    get: field.values.get,\n    value: () => getLastNotNullFieldValue(field),\n  };\n}\n","import { DataFrame, Field } from '@grafana/data';\nimport { ScaleDimensionMode } from '.';\nimport { getMinMaxAndDelta } from '../../../../packages/grafana-data/src/field/scale';\nimport { ScaleDimensionConfig, DimensionSupplier, ScaleDimensionOptions } from './types';\nimport { findField, getLastNotNullFieldValue } from './utils';\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 fied 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: 'icon' | 'image';\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","import { DataFrame, PanelData, Field, getFieldDisplayName, ReducerID } from '@grafana/data';\nimport {\n  getColorDimension,\n  getScaledDimension,\n  getTextDimension,\n  getResourceDimension,\n  ColorDimensionConfig,\n  DimensionSupplier,\n  ResourceDimensionConfig,\n  ScaleDimensionConfig,\n  TextDimensionConfig,\n} from 'app/features/dimensions';\nimport { config } from '@grafana/runtime';\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 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","// Libraries\nimport { AnyAction, createAction } from '@reduxjs/toolkit';\nimport { RefreshPicker } from '@grafana/ui';\nimport { DataSourceApi, HistoryItem } from '@grafana/data';\nimport { stopQueryState } from 'app/core/utils/explore';\nimport { ExploreItemState, ThunkResult } from 'app/types';\n\nimport { ExploreId } from 'app/types/explore';\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, 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 { AnyAction } from 'redux';\nimport { isEqual } from 'lodash';\n\nimport {\n  DEFAULT_RANGE,\n  getQueryKeys,\n  parseUrlState,\n  ensureQueries,\n  generateNewKeyAndAddRefIdIfMissing,\n  getTimeRangeFromUrl,\n  ExploreGraphStyle,\n} from 'app/core/utils/explore';\nimport { ExploreId, ExploreItemState } from 'app/types/explore';\nimport { queryReducer, runQueries, setQueriesAction } from './query';\nimport { datasourceReducer } from './datasource';\nimport { timeReducer, updateTime } from './time';\nimport { historyReducer } from './history';\nimport {\n  makeExplorePaneState,\n  loadAndInitDatasource,\n  createEmptyQueryResponse,\n  getUrlStateFromPaneState,\n  storeGraphStyle,\n} from './utils';\nimport { createAction, PayloadAction } from '@reduxjs/toolkit';\nimport { EventBusExtended, DataQuery, ExploreUrlState, TimeRange, HistoryItem, DataSourceApi } from '@grafana/data';\n// Types\nimport { ThunkResult } from 'app/types';\nimport { getFiscalYearStartMonth, getTimeZone } from 'app/features/profile/state/selectors';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { getRichHistory } from '../../../core/utils/richHistory';\nimport { richHistoryUpdatedAction } from './main';\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 * 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  originPanelId?: number | null;\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 */\nexport function initializeExplore(\n  exploreId: ExploreId,\n  datasourceNameOrUid: string,\n  queries: DataQuery[],\n  range: TimeRange,\n  containerWidth: number,\n  eventBridge: EventBusExtended,\n  originPanelId?: number | null\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, datasourceNameOrUid);\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        originPanelId,\n        datasourceInstance: instance,\n        history,\n      })\n    );\n    dispatch(updateTime({ exploreId }));\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    const richHistory = getRichHistory();\n    dispatch(richHistoryUpdatedAction({ richHistory }));\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    const { datasource, queries, range: urlRange, originPanelId } = 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, originPanelId)\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    // 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 (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 (initializeExploreAction.match(action)) {\n    const { containerWidth, eventBridge, queries, range, originPanelId, 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      originPanelId,\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} => {\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\n  return {\n    datasource,\n    queries,\n    range,\n  };\n};\n","import {\n  deleteAllFromRichHistory,\n  deleteQueryInRichHistory,\n  updateCommentInRichHistory,\n  updateStarredInRichHistory,\n} from 'app/core/utils/richHistory';\nimport { ExploreId, ExploreItemState, ThunkResult } from 'app/types';\nimport { richHistoryUpdatedAction } from './main';\nimport { HistoryItem } from '@grafana/data';\nimport { AnyAction, createAction } from '@reduxjs/toolkit';\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\nexport const updateRichHistory = (ts: number, property: string, updatedProperty?: string): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    // Side-effect: Saving rich history in localstorage\n    let nextRichHistory;\n    if (property === 'starred') {\n      nextRichHistory = updateStarredInRichHistory(getState().explore.richHistory, ts);\n    }\n    if (property === 'comment') {\n      nextRichHistory = updateCommentInRichHistory(getState().explore.richHistory, ts, updatedProperty);\n    }\n    if (property === 'delete') {\n      nextRichHistory = deleteQueryInRichHistory(getState().explore.richHistory, ts);\n    }\n    dispatch(richHistoryUpdatedAction({ richHistory: nextRichHistory }));\n  };\n};\n\nexport const deleteRichHistory = (): ThunkResult<void> => {\n  return (dispatch) => {\n    deleteAllFromRichHistory();\n    dispatch(richHistoryUpdatedAction({ richHistory: [] }));\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 { AnyAction } from 'redux';\nimport { DataSourceSrv, getDataSourceSrv, locationService } from '@grafana/runtime';\nimport { DataQuery, ExploreUrlState, serializeStateToUrlParam, TimeRange, UrlQueryMap } from '@grafana/data';\nimport { GetExploreUrlArguments, stopQueryState } from 'app/core/utils/explore';\nimport { ExploreId, ExploreItemState, ExploreState } from 'app/types/explore';\nimport { paneReducer } from './explorePane';\nimport { createAction } from '@reduxjs/toolkit';\nimport { getUrlStateFromPaneState, makeExplorePaneState } from './utils';\nimport { ThunkResult } from '../../../types';\nimport { TimeSrv } from '../../dashboard/services/TimeSrv';\nimport { PanelModel } from 'app/features/dashboard/state';\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<any>('explore/richHistoryUpdated');\nexport const localStorageFullAction = createAction('explore/localStorageFullAction');\nexport const richHistoryLimitExceededAction = createAction('explore/richHistoryLimitExceededAction');\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), true);\n\n    if (right) {\n      urlStates.right = serializeStateToUrlParam(getUrlStateFromPaneState(right), true);\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 function splitOpen<T extends DataQuery = any>(options?: {\n  datasourceUid: string;\n  query: T;\n  // Don't use right now. It's used for Traces to Logs interaction but is hacky in how the range is actually handled.\n  range?: TimeRange;\n}): 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      const datasourceName = getDataSourceSrv().getInstanceSettings(options.datasourceUid)?.name || '';\n      rightUrlState = {\n        datasource: datasourceName,\n        queries: [options.query],\n        range: options.range || leftState.range,\n      };\n    }\n\n    const urlState = serializeStateToUrlParam(rightUrlState, true);\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  richHistory: [],\n  localStorageFull: false,\n  richHistoryLimitExceededWarningShown: 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 (richHistoryUpdatedAction.match(action)) {\n    return {\n      ...state,\n      richHistory: action.payload.richHistory,\n    };\n  }\n\n  if (localStorageFullAction.match(action)) {\n    return {\n      ...state,\n      localStorageFull: true,\n    };\n  }\n\n  if (richHistoryLimitExceededAction.match(action)) {\n    return {\n      ...state,\n      richHistoryLimitExceededWarningShown: 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 || !Number.isInteger(state.left.originPanelId)) {\n      return initialExploreState;\n    }\n\n    return {\n      ...initialExploreState,\n      left: {\n        ...initialExploreItemState,\n        queries: state.left.queries,\n        originPanelId: state.left.originPanelId,\n      },\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 {\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';\nimport { groupBy } from 'lodash';\nimport { Observable, of } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\nimport { dataFrameToLogsModel } from '../../../core/logs_model';\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  options: {\n    absoluteRange?: AbsoluteTimeRange;\n    refreshInterval?: string;\n    queries?: DataQuery[];\n    fullRangeLogsVolumeAvailable?: boolean;\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 { mergeMap, throttleTime } from 'rxjs/operators';\nimport { identity, Observable, of, SubscriptionLike, Unsubscribable } from 'rxjs';\nimport {\n  AbsoluteTimeRange,\n  DataQuery,\n  DataQueryErrorType,\n  DataQueryResponse,\n  DataSourceApi,\n  hasLogsVolumeSupport,\n  LoadingState,\n  PanelData,\n  PanelEvents,\n  QueryFixAction,\n  toLegacyResponseData,\n} from '@grafana/data';\n\nimport {\n  buildQueryTransaction,\n  ensureQueries,\n  generateEmptyQuery,\n  generateNewKeyAndAddRefIdIfMissing,\n  getQueryKeys,\n  hasNonEmptyQuery,\n  stopQueryState,\n  updateHistory,\n} from 'app/core/utils/explore';\nimport { addToRichHistory } from 'app/core/utils/richHistory';\nimport { ExploreItemState, ExplorePanelData, ThunkResult } from 'app/types';\nimport { ExploreId, QueryOptions } from 'app/types/explore';\nimport { getTimeZone } from 'app/features/profile/state/selectors';\nimport { getShiftedTimeRange } from 'app/core/utils/timePicker';\nimport { notifyApp } from '../../../core/actions';\nimport { runRequest } from '../../query/state/runRequest';\nimport { decorateData } from '../utils/decorators';\nimport { createErrorNotification } from '../../../core/copy/appNotification';\nimport { localStorageFullAction, richHistoryLimitExceededAction, richHistoryUpdatedAction, stateSave } from './main';\nimport { AnyAction, createAction, PayloadAction } from '@reduxjs/toolkit';\nimport { updateTime } from './time';\nimport { historyUpdatedAction } from './history';\nimport { createCacheKey, getResultsFromCache } from './utils';\nimport deepEqual from 'fast-deep-equal';\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: PanelData;\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(exploreId: ExploreId, index: number): ThunkResult<void> {\n  return (dispatch, getState) => {\n    const queries = getState().explore[exploreId]!.queries;\n    const query = generateEmptyQuery(queries, index);\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 (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\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 { richHistory } = getState().explore;\n    const exploreItemState = getState().explore[exploreId]!;\n    const {\n      datasourceInstance,\n      containerWidth,\n      isLive: live,\n      range,\n      scanning,\n      queryResponse,\n      querySubscription,\n      history,\n      refreshInterval,\n      absoluteRange,\n      cache,\n      logsVolumeDataProvider,\n    } = exploreItemState;\n    let newQuerySub;\n\n    const queries = exploreItemState.queries.map((query) => ({\n      ...query,\n      datasource: query.datasource || datasourceInstance?.getRef(),\n    }));\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(data, queryResponse, absoluteRange, refreshInterval, queries, !!logsVolumeDataProvider)\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 datasourceId = datasourceInstance?.meta.id;\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 datasourceName = datasourceInstance.name;\n      const timeZone = getTimeZone(getState().user);\n      const transaction = buildQueryTransaction(exploreId, queries, queryOptions, range, scanning, timeZone);\n\n      let querySaved = false;\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              !!getState().explore[exploreId]!.logsVolumeDataProvider\n            )\n          )\n        )\n        .subscribe(\n          (data) => {\n            if (data.state !== LoadingState.Loading && !data.error && !querySaved) {\n              // Side-effect: Saving history in localstorage\n              const nextHistory = updateHistory(history, datasourceId, queries);\n              const { richHistory: nextRichHistory, localStorageFull, limitExceeded } = addToRichHistory(\n                richHistory || [],\n                datasourceId,\n                datasourceName,\n                queries,\n                false,\n                '',\n                '',\n                !getState().explore.localStorageFull,\n                !getState().explore.richHistoryLimitExceededWarningShown\n              );\n              dispatch(historyUpdatedAction({ exploreId, history: nextHistory }));\n              dispatch(richHistoryUpdatedAction({ richHistory: nextRichHistory }));\n              if (localStorageFull) {\n                dispatch(localStorageFullAction());\n              }\n              if (limitExceeded) {\n                dispatch(richHistoryLimitExceededAction());\n              }\n\n              // We save queries to the URL here so that only successfully run queries change the URL.\n              dispatch(stateSave({ replace: options?.replaceUrl }));\n              querySaved = true;\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) => {\n            dispatch(notifyApp(createErrorNotification('Query processing error', error)));\n            dispatch(changeLoadingStateAction({ exploreId, loadingState: LoadingState.Error }));\n            console.error(error);\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 logsVolumeDataProvider = datasourceInstance.getLogsVolumeDataProvider(transaction.request);\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    if (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  if (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';\nimport {\n  AbsoluteTimeRange,\n  dateTimeForTimeZone,\n  LoadingState,\n  RawTimeRange,\n  sortLogsResult,\n  TimeRange,\n} from '@grafana/data';\nimport { RefreshPicker } from '@grafana/ui';\n\nimport { getTimeRange, refreshIntervalToSortOrder, stopQueryState } from 'app/core/utils/explore';\nimport { ExploreItemState, ThunkResult } from 'app/types';\nimport { ExploreId } from 'app/types/explore';\nimport { getFiscalYearStartMonth, getTimeZone } from 'app/features/profile/state/selectors';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { runQueries } from './query';\nimport { syncTimesAction, stateSave } from './main';\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\n    getTimeSrv().init(\n      new DashboardModel({\n        time: range.raw,\n        refresh: false,\n        timeZone,\n      })\n    );\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 * 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 {\n  AbsoluteTimeRange,\n  DataSourceApi,\n  EventBusExtended,\n  ExploreUrlState,\n  getDefaultTimeRange,\n  HistoryItem,\n  LoadingState,\n  PanelData,\n} from '@grafana/data';\n\nimport { ExploreItemState } from 'app/types/explore';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport store from '../../../core/store';\nimport {\n  clearQueryKeys,\n  ExploreGraphStyle,\n  lastUsedDatasourceKeyForOrgId,\n  toGraphStyle,\n} from '../../../core/utils/explore';\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  logsVolumeDataProvider: undefined,\n  logsVolumeData: undefined,\n  graphStyle: loadGraphStyle(),\n});\n\nexport const createEmptyQueryResponse = (): PanelData => ({\n  state: LoadingState.NotStarted,\n  series: [],\n  timeRange: getDefaultTimeRange(),\n});\n\nexport async function loadAndInitDatasource(\n  orgId: number,\n  datasourceUid?: string\n): Promise<{ history: HistoryItem[]; instance: DataSourceApi }> {\n  let instance;\n  try {\n    instance = await getDatasourceSrv().get(datasourceUid);\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(historyKey, []);\n  // Save last-used datasource\n\n  store.set(lastUsedDatasourceKeyForOrgId(orgId), instance.uid);\n  return { history, instance };\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?.name || '',\n    queries: pane.queries.map(clearQueryKeys),\n    range: toRawTimeRange(pane.range),\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';\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 { getLinkSrv } from '../../panel/panellinks/link_srv';\nimport { contextSrv } from 'app/core/services/context_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 React, { ChangeEvent, FC } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';\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 menuShouldPortal 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\n            menuShouldPortal\n            options={downsamplingTypes}\n            value={downsampler}\n            onChange={onSelectDownsampler}\n            width={25}\n          />\n        </InlineField>\n        <InlineField label=\"Upsample\">\n          <Select\n            menuShouldPortal\n            options={upsamplingTypes}\n            value={upsampler}\n            onChange={onSelectUpsampler}\n            width={25}\n          />\n        </InlineField>\n      </InlineFieldRow>\n    </>\n  );\n};\n","import React, { FC } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { InlineField, InlineFieldRow, Select } from '@grafana/ui';\nimport { ExpressionQuery, 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  return (\n    <InlineFieldRow>\n      <InlineField label=\"Function\" labelWidth={labelWidth}>\n        <Select menuShouldPortal options={reducerTypes} value={reducer} onChange={onSelectReducer} width={25} />\n      </InlineField>\n      <InlineField label=\"Input\" labelWidth={labelWidth}>\n        <Select menuShouldPortal onChange={onRefIdChange} options={refIds} value={query.expression} width={20} />\n      </InlineField>\n    </InlineFieldRow>\n  );\n};\n","import { InlineField, TextArea } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport React, { ChangeEvent, FC } from 'react';\nimport { ExpressionQuery } from '../types';\n\ninterface Props {\n  labelWidth: number;\n  query: ExpressionQuery;\n  onChange: (query: ExpressionQuery) => void;\n}\n\nconst mathPlaceholder =\n  'Math operations on one more queries, you reference the query by ${refId} ie. $A, $B, $C etc\\n' +\n  'Example: $A + $B\\n' +\n  'Available functions: abs(), log(), nan(), inf(), null()';\n\nexport const Math: FC<Props> = ({ labelWidth, onChange, query }) => {\n  const onExpressionChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n    onChange({ ...query, expression: event.target.value });\n  };\n\n  return (\n    <InlineField\n      label=\"Expression\"\n      labelWidth={labelWidth}\n      className={css`\n        align-items: baseline;\n      `}\n    >\n      <TextArea value={query.expression} onChange={onExpressionChange} rows={4} placeholder={mathPlaceholder} />\n    </InlineField>\n  );\n};\n","import React, { FC, FormEvent } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { Button, ButtonSelect, Icon, InlineFieldRow, Input, Select, useStyles } from '@grafana/ui';\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        menuShouldPortal\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        menuShouldPortal\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';\nimport { SelectableValue } from '@grafana/data';\nimport { Button, Icon, InlineField, InlineFieldRow } from '@grafana/ui';\nimport { Condition } from './Condition';\nimport { ClassicCondition, ExpressionQuery } from '../types';\nimport { defaultCondition } from '../utils/expressionTypes';\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      onChange({\n        ...query,\n        conditions: query.conditions.length > 0 ? [...query.conditions, defaultCondition] : [defaultCondition],\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 React, { PureComponent } from 'react';\nimport { DataSourceApi, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { InlineField, Select } from '@grafana/ui';\nimport { Resample } from './components/Resample';\nimport { Reduce } from './components/Reduce';\nimport { Math } from './components/Math';\nimport { ClassicConditions } from './components/ClassicConditions';\nimport { getDefaults } from './utils/expressionTypes';\nimport { ExpressionQuery, ExpressionQueryType, gelTypes } from './types';\n\ntype Props = QueryEditorProps<DataSourceApi<ExpressionQuery>, ExpressionQuery>;\n\nconst labelWidth = 14;\nexport class ExpressionQueryEditor extends PureComponent<Props> {\n  onSelectExpressionType = (item: SelectableValue<ExpressionQueryType>) => {\n    const { query, onChange } = this.props;\n\n    onChange(getDefaults({ ...query, type: item.value! }));\n  };\n\n  renderExpressionType() {\n    const { onChange, query, queries } = this.props;\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} />;\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  render() {\n    const { query } = this.props;\n    const selected = gelTypes.find((o) => o.value === query.type);\n\n    return (\n      <div>\n        <InlineField label=\"Operation\" labelWidth={labelWidth}>\n          <Select\n            menuShouldPortal\n            options={gelTypes}\n            value={selected}\n            onChange={this.onSelectExpressionType}\n            width={25}\n          />\n        </InlineField>\n        {this.renderExpressionType()}\n      </div>\n    );\n  }\n}\n","import { DataSourceInstanceSettings, DataSourcePluginMeta, PluginType } from '@grafana/data';\nimport { ExpressionQuery, ExpressionQueryType } from './types';\nimport { ExpressionQueryEditor } from './ExpressionQueryEditor';\nimport { DataSourceWithBackend } from '@grafana/runtime';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\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  getCollapsedText(query: ExpressionQuery) {\n    return `Expression: ${query.type}`;\n  }\n\n  newQuery(query?: Partial<ExpressionQuery>): ExpressionQuery {\n    return {\n      refId: '--', // Replaced with query\n      type: query?.type ?? ExpressionQueryType.math,\n      datasource: ExpressionDatasourceRef,\n      conditions: query?.conditions ?? undefined,\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.type,\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 { DataQuery, ReducerID, SelectableValue } from '@grafana/data';\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];\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}\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';\nimport { ClassicCondition, ExpressionQuery, ExpressionQueryType } from '../types';\nimport { EvalFunction } from '../../alerting/state/alertDef';\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      query.expression = undefined;\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.classic:\n      if (!query.conditions) {\n        query.conditions = [defaultCondition];\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 { AppEvents, locationUtil } from '@grafana/data';\nimport { getBackendSrv, locationService } from '@grafana/runtime';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { FolderState, ThunkResult } from 'app/types';\nimport { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLevel } from 'app/types/acl';\nimport { notifyApp, updateNavIndex } from 'app/core/actions';\nimport { buildNavModel } from './navModel';\nimport appEvents from 'app/core/app_events';\nimport { loadFolder, loadFolderPermissions, setCanViewFolderPermissions } from './reducers';\nimport { lastValueFrom } from 'rxjs';\nimport { createWarningNotification } from 'app/core/copy/appNotification';\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    // this should be redux action at some point\n    appEvents.emit(AppEvents.alertSuccess, ['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 (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 () => {\n    const newFolder = await getBackendSrv().post('/api/folders', { title: folderName });\n    appEvents.emit(AppEvents.alertSuccess, ['Folder Created', 'OK']);\n    locationService.push(locationUtil.stripBaseFromUrl(newFolder.url));\n  };\n}\n","import { NavModel, NavModelItem } from '@grafana/data';\n\nimport { 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 (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    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 { DashboardAclDTO, FolderDTO, FolderState } from 'app/types';\nimport { processAclItems } from 'app/core/utils/acl';\n\nexport const initialState: FolderState = {\n  id: 0,\n  uid: 'loading',\n  title: 'loading',\n  url: '',\n  canSave: 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 React, { useCallback, useEffect, useState } from 'react';\nimport { Button, Field, Input, Modal } from '@grafana/ui';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { PanelModel } from '../../../dashboard/state';\nimport { usePanelSave } from '../../utils/usePanelSave';\nimport { useAsync, useDebounce } from 'react-use';\nimport { getLibraryPanelByName } from '../../state/api';\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      err.isHandled = true;\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';\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';\nimport { PanelModelWithLibraryPanel } from './types';\n\nexport function isPanelModelLibraryPanel(panel: PanelModel): panel is PanelModelWithLibraryPanel {\n  return Boolean(panel.libraryPanel?.uid);\n}\n","import {\n  LibraryElementConnectionDTO,\n  LibraryElementDTO,\n  LibraryElementKind,\n  LibraryElementsSearchResult,\n  PanelModelWithLibraryPanel,\n} from '../types';\nimport { DashboardSearchHit } from '../../search/types';\nimport { getBackendSrv } from '../../../core/services/backend_srv';\nimport { lastValueFrom } from 'rxjs';\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 { PanelModel } from '../dashboard/state';\nimport { Dispatch } from 'react';\nimport { AnyAction } from '@reduxjs/toolkit';\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 { LibraryElementDTO, PanelModelLibraryPanel } from './types';\nimport { PanelModel } from '../dashboard/state';\nimport { addLibraryPanel, updateLibraryPanel } from './state/api';\nimport { createErrorNotification, createSuccessNotification } from '../../core/copy/appNotification';\nimport { AppNotification } 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 { PanelModel } from 'app/features/dashboard/state';\nimport {\n  createPanelLibraryErrorNotification,\n  createPanelLibrarySuccessNotification,\n  saveAndRefreshLibraryPanel,\n} from '../utils';\nimport { notifyApp } from 'app/core/actions';\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      err.isHandled = true;\n      throw new Error(err.data.message);\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 React, { PureComponent } from 'react';\nimport { Modal, stylesFactory } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { dashboardWatcher } from './dashboardWatcher';\nimport { config } from '@grafana/runtime';\nimport { DashboardEvent, DashboardEventAction } from './types';\nimport { GrafanaTheme } from '@grafana/data';\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 { getGrafanaLiveSrv, locationService } from '@grafana/runtime';\nimport { getDashboardSrv } from '../../dashboard/services/DashboardSrv';\nimport { appEvents, contextSrv } from 'app/core/core';\nimport {\n  AppEvents,\n  isLiveChannelMessageEvent,\n  isLiveChannelStatusEvent,\n  LiveChannelAddress,\n  LiveChannelConnectionState,\n  LiveChannelEvent,\n  LiveChannelScope,\n} from '@grafana/data';\nimport { DashboardChangedModal } from './DashboardChangedModal';\nimport { DashboardEvent, DashboardEventAction } from './types';\nimport { sessionId } from 'app/features/live';\nimport { ShowModalReactEvent } from '../../../types/events';\nimport { Unsubscribable } from 'rxjs';\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 { BackendSrv, GrafanaLiveSrv, LiveDataStreamOptions } from '@grafana/runtime';\nimport { CentrifugeSrv } from './centrifuge/service';\n\nimport { Observable } from 'rxjs';\nimport {\n  DataQueryResponse,\n  LiveChannelAddress,\n  LiveChannelEvent,\n  LiveChannelPresenceStatus,\n  toLiveChannelId,\n} from '@grafana/data';\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(): Observable<boolean> {\n    return this.deps.centrifugeSrv.getConnectionState();\n  }\n\n  /**\n   * Connect to a channel and return results as DataFrames\n   */\n  getDataStream(options: LiveDataStreamOptions): Observable<DataQueryResponse> {\n    return this.deps.centrifugeSrv.getDataStream(options);\n  }\n\n  /**\n   * Watch for messages in a channel\n   */\n  getStream<T>(address: LiveChannelAddress): Observable<LiveChannelEvent<T>> {\n    return this.deps.centrifugeSrv.getStream<T>(address);\n  }\n\n  /**\n   * Publish into a channel\n   *\n   * @alpha -- experimental\n   */\n  async publish(address: LiveChannelAddress, data: any): Promise<any> {\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  async getPresence(address: LiveChannelAddress): Promise<LiveChannelPresenceStatus> {\n    return this.deps.centrifugeSrv.getPresence(address);\n  }\n}\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 { CentrifugeSrv, CentrifugeSrvDeps } from './service';\nimport { RemoteCentrifugeService } from './service.worker';\nimport './transferHandlers';\n\nimport * as comlink from 'comlink';\nimport { asyncScheduler, Observable, observeOn } from 'rxjs';\nimport { LiveChannelAddress, LiveChannelEvent } from '@grafana/data';\nimport { promiseWithRemoteObservableAsObservable } from './remoteObservable';\nimport { createWorker } from './createCentrifugeServiceWorker';\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  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 { config, getBackendSrv, getGrafanaLiveSrv, setGrafanaLiveSrv } from '@grafana/runtime';\nimport { GrafanaLiveService } from './live';\nimport { contextSrv } from '../../core/services/context_srv';\nimport { CentrifugeServiceWorkerProxy } from './centrifuge/serviceWorkerProxy';\nimport { CentrifugeService } from './centrifuge/service';\nimport { liveTimer } from 'app/features/dashboard/dashgrid/liveTimer';\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 { AppEvents, DataSourceInstanceSettings, locationUtil } from '@grafana/data';\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';\nimport { DashboardDataDTO, DashboardDTO, FolderInfo, PermissionLevelString, ThunkResult } from 'app/types';\nimport { appEvents } from '../../../core/core';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { getDataSourceSrv, locationService, getBackendSrv } from '@grafana/runtime';\nimport { DashboardSearchHit } from '../../search/types';\nimport { getLibraryPanel } from '../../library-panels/state/api';\nimport { LibraryElementDTO, LibraryElementKind } from '../../library-panels/types';\nimport { LibraryElementExport } from '../../dashboard/components/DashExportModal/DashboardExporter';\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      appEvents.emit(AppEvents.alertError, [error.data.message || error]);\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?: 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 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.Exits;\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 (err.data?.status !== 'plugin-dashboard') {\n      return { succeeded: false };\n    }\n\n    err.isHandled = true;\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 interface SaveDashboardOptions {\n  dashboard: DashboardDataDTO;\n  message?: string;\n  folderId?: number;\n  overwrite?: boolean;\n}\n\nexport function saveDashboard(options: SaveDashboardOptions) {\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(query: any, permission?: PermissionLevelString): Promise<DashboardSearchHit[]> {\n  return getBackendSrv().get('/api/search', { query, type: 'dash-folder', permission });\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';\nimport { DataSourceInstanceSettings, LoadingState } from '@grafana/data';\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  Exits = '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 } from 'app/types';\n\nexport const initialState: OrganizationState = {\n  organization: {} as Organization,\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  },\n});\n\nexport const { setOrganizationName, organizationLoaded } = organizationSlice.actions;\n\nexport const organizationReducer = organizationSlice.reducer;\n\nexport default {\n  organization: organizationReducer,\n};\n","// Libraries\nimport React, { PureComponent, ReactNode } from 'react';\n\n// Types\nimport { AppNotificationSeverity } from 'app/types';\nimport { Alert } from '@grafana/ui';\nimport { PanelProps, PanelPlugin, PluginType, PanelPluginMeta } from '@grafana/data';\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';\nimport { applyFieldOverrides, FieldConfigSource, getTimeZone, PanelData, PanelPlugin } from '@grafana/data';\nimport { PanelRendererProps } from '@grafana/runtime';\nimport { appEvents } from 'app/core/core';\nimport { useAsync } from 'react-use';\nimport { getPanelOptionsWithDefaults, OptionDefaults } from '../../dashboard/state/getPanelOptionsWithDefaults';\nimport { importPanelPlugin } from '../../plugins/importPanelPlugin';\nimport { ErrorBoundaryAlert, useTheme2 } from '@grafana/ui';\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    fieldConfig: externalFieldConfig = defaultFieldConfig,\n  } = props;\n\n  const [localFieldConfig, setFieldConfig] = useState(externalFieldConfig);\n  const { value: plugin, error, loading } = useAsync(() => importPanelPlugin(pluginId), [pluginId]);\n  const optionsWithDefaults = useOptionDefaults(plugin, options, localFieldConfig);\n  const dataWithOverrides = useFieldOverrides(plugin, optionsWithDefaults, data, timeZone);\n\n  useEffect(() => {\n    setFieldConfig((lfc) => ({ ...lfc, ...externalFieldConfig }));\n  }, [externalFieldConfig]);\n\n  if (error) {\n    return <div>Failed to load plugin: {error.message}</div>;\n  }\n\n  if (pluginIsLoading(loading, plugin, pluginId)) {\n    return <div>Loading plugin panel...</div>;\n  }\n\n  if (!plugin || !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={localFieldConfig}\n        transparent={false}\n        width={width}\n        height={height}\n        renderCounter={0}\n        replaceVariables={(str: string) => str}\n        onOptionsChange={onOptionsChange}\n        onFieldConfigChange={setFieldConfig}\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\nfunction pluginIsLoading(loading: boolean, plugin: PanelPlugin<any, any> | undefined, pluginId: string) {\n  return loading || plugin?.meta.id !== pluginId;\n}\n","import { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport {\n  DataLink,\n  DisplayValue,\n  FieldDisplay,\n  formattedValueToString,\n  getFieldDisplayValuesProxy,\n  getTimeField,\n  InterpolateFunction,\n  Labels,\n  LinkModelSupplier,\n  ScopedVar,\n  ScopedVars,\n} from '@grafana/data';\nimport { getLinkSrv } from './link_srv';\n\ninterface SeriesVars {\n  name?: string;\n  refId?: string;\n}\n\ninterface FieldVars {\n  name: string;\n  labels?: Labels;\n}\n\ninterface ValueVars {\n  raw: any;\n  numeric: number;\n  text: string;\n  time?: number;\n  calc?: string;\n}\n\ninterface DataViewVars {\n  name?: string;\n  refId?: string;\n  fields?: Record<string, DisplayValue>;\n}\n\ninterface DataLinkScopedVars extends ScopedVars {\n  __series: ScopedVar<SeriesVars>;\n  __field: ScopedVar<FieldVars>;\n  __value: ScopedVar<ValueVars>;\n  __data: ScopedVar<DataViewVars>;\n}\n\n/**\n * Link suppliers creates link models based on a link origin\n */\nexport const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<FieldDisplay> | undefined => {\n  const links = value.field.links;\n  if (!links || links.length === 0) {\n    return undefined;\n  }\n\n  return {\n    getLinks: (replaceVariables: InterpolateFunction) => {\n      const scopedVars: Partial<DataLinkScopedVars> = {};\n\n      if (value.view) {\n        const { dataFrame } = value.view;\n\n        scopedVars['__series'] = {\n          value: {\n            name: dataFrame.name,\n            refId: dataFrame.refId,\n          },\n          text: 'Series',\n        };\n\n        const field = value.colIndex !== undefined ? dataFrame.fields[value.colIndex] : undefined;\n\n        if (field) {\n          scopedVars['__field'] = {\n            value: {\n              name: field.name,\n              labels: field.labels,\n            },\n            text: 'Field',\n          };\n\n          if (value.rowIndex !== undefined && value.rowIndex >= 0) {\n            const { timeField } = getTimeField(dataFrame);\n            scopedVars['__value'] = {\n              value: {\n                raw: field.values.get(value.rowIndex),\n                numeric: value.display.numeric,\n                text: formattedValueToString(value.display),\n                time: timeField ? timeField.values.get(value.rowIndex) : undefined,\n              },\n              text: 'Value',\n            };\n          }\n\n          // Expose other values on the row\n          if (value.view) {\n            scopedVars['__data'] = {\n              value: {\n                name: dataFrame.name,\n                refId: dataFrame.refId,\n                fields: getFieldDisplayValuesProxy({\n                  frame: dataFrame,\n                  rowIndex: value.rowIndex!,\n                }),\n              },\n              text: 'Data',\n            };\n          }\n        } else {\n          // calculation\n          scopedVars['__value'] = {\n            value: {\n              raw: value.display.numeric,\n              numeric: value.display.numeric,\n              text: formattedValueToString(value.display),\n              calc: value.name,\n            },\n            text: 'Value',\n          };\n        }\n      } else {\n        console.log('VALUE', value);\n      }\n\n      const replace: InterpolateFunction = (value: string, vars: ScopedVars | undefined, fmt?: string | Function) => {\n        const finalVars: ScopedVars = {\n          ...(scopedVars as ScopedVars),\n          ...vars,\n        };\n        return replaceVariables(value, finalVars, fmt);\n      };\n\n      return links.map((link: DataLink) => {\n        return getLinkSrv().getDataLinkUIModel(link, replace, value);\n      });\n    },\n  };\n};\n\nexport const getPanelLinksSupplier = (panel: PanelModel): LinkModelSupplier<PanelModel> | undefined => {\n  const links = panel.links;\n\n  if (!links || links.length === 0) {\n    return undefined;\n  }\n\n  return {\n    getLinks: () => {\n      return links.map((link) => {\n        return getLinkSrv().getDataLinkUIModel(link, panel.replaceVariables, panel);\n      });\n    },\n  };\n};\n","import { chain } from 'lodash';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { getConfig } from 'app/core/config';\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 { 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 { getPanelPluginNotFound } from 'app/features/panel/components/PanelPluginError';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { loadPanelPlugin } from 'app/features/plugins/admin/state/actions';\nimport { ThunkResult } from 'app/types';\nimport { panelModelAndPluginReady } from './reducers';\nimport { LibraryElementDTO } from 'app/features/library-panels/types';\nimport { toPanelModelLibraryPanel } from 'app/features/library-panels/utils';\nimport { PanelOptionsChangedEvent, PanelQueriesChangedEvent } from 'app/types/events';\nimport { DataTransformerConfig, FieldConfigSource } from '@grafana/data';\nimport { getPanelOptionsWithDefaults } from 'app/features/dashboard/state/getPanelOptionsWithDefaults';\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 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    }\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';\nimport { AngularComponent } from '@grafana/runtime';\nimport { PanelPlugin } from '@grafana/data';\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    cleanUpPanelState: (state, action: PayloadAction<{ key: string }>) => {\n      cleanUpAngularComponent(state[action.payload.key]);\n      delete state[action.payload.key];\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\nfunction 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  cleanUpPanelState,\n} = panelsSlice.actions;\n\nexport const panelsReducer = panelsSlice.reducer;\n\nexport default {\n  panels: panelsReducer,\n};\n","// Libraries\nimport { pickBy } from 'lodash';\n\n// Utils\nimport { getBackendSrv, locationService } from '@grafana/runtime';\nimport { locationUtil, urlUtil, rangeUtil } from '@grafana/data';\nimport { Location } from 'history';\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(playlistId: number) {\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/${playlistId}`)\n      .then((playlist: any) => {\n        return getBackendSrv()\n          .get(`/api/playlists/${playlistId}/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 { getBackendSrv } from '@grafana/runtime';\nimport { PluginError, PluginMeta, renderMarkdown } from '@grafana/data';\nimport { API_ROOT, GCOM_API_ROOT } from './constants';\nimport { LocalPlugin, RemotePlugin, CatalogPluginDetails, Version, PluginVersion } from './types';\nimport { isLocalPluginVisible, isRemotePluginVisible } from './helpers';\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    // 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    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    // 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    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    error.isHandled = true;\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 { config } from '@grafana/runtime';\nimport { PluginSignatureStatus, dateTimeParse, PluginError, PluginErrorCode } from '@grafana/data';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { Settings } from 'app/core/config';\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;\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  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: !!error,\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;\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\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';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { PanelPlugin } from '@grafana/data';\nimport { StoreState, ThunkResult } from 'app/types';\nimport { importPanelPlugin } from 'app/features/plugins/importPanelPlugin';\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';\nimport { invalidatePluginInCache } from '../../pluginCacheBuster';\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      error.isHandled = true;\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      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    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';\nimport { fetchAll, fetchDetails, install, uninstall, loadPluginDashboards, panelPluginLoaded } from './actions';\nimport { CatalogPlugin, PluginListDisplayMode, ReducerState, RequestStatus } from '../types';\nimport { STATE_PREFIX } from '../constants';\nimport { PanelPlugin } from '@grafana/data';\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\nconst slice = createSlice({\n  name: 'plugins',\n  initialState: {\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  } as ReducerState,\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        state.dashboards = action.payload;\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';\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}\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}\n\nexport enum PluginTabIds {\n  OVERVIEW = 'overview',\n  VERSIONS = 'version-history',\n  CONFIG = 'config',\n  DASHBOARDS = 'dashboards',\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","// Services & Utils\nimport { importDataSourcePlugin } from './plugin_loader';\nimport {\n  GetDataSourceListFilters,\n  DataSourceSrv as DataSourceService,\n  getDataSourceSrv as getDataSourceService,\n  TemplateSrv,\n  getTemplateSrv,\n  getLegacyAngularInjector,\n} from '@grafana/runtime';\n// Types\nimport {\n  AppEvents,\n  DataSourceApi,\n  DataSourceInstanceSettings,\n  DataSourceRef,\n  DataSourceSelectItem,\n  ScopedVars,\n} from '@grafana/data';\n// Pretend Datasource\nimport {\n  dataSource as expressionDatasource,\n  ExpressionDatasourceUID,\n  instanceSettings as expressionInstanceSettings,\n} from 'app/features/expressions/ExpressionDatasource';\nimport { DataSourceVariableModel } from '../variables/types';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\nimport appEvents from 'app/core/app_events';\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      appEvents.emit(AppEvents.alertError, [instanceSettings.name + ' plugin failed', err.toString()]);\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.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().filter((variable) => variable.type === 'datasource')) {\n        const dsVar = variable as DataSourceVariableModel;\n        const first = dsVar.current.value === 'default' ? this.defaultName : dsVar.current.value;\n        const dsName = (first as unknown) as string;\n        const dsSettings = this.settingsMapByName[dsName];\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.isDefault ? null : 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.isDefault ? null : x.name,\n        meta: x.meta,\n      };\n    });\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\nexport default DatasourceSrv;\n","import config from 'app/core/config';\nimport * as grafanaData from '@grafana/data';\nimport { getPanelPluginLoadError } from '../panel/components/PanelPluginError';\nimport { importPluginModule } from './plugin_loader';\ninterface PanelCache {\n  [key: string]: Promise<grafanaData.PanelPlugin>;\n}\nconst panelCache: PanelCache = {};\n\nexport function importPanelPlugin(id: string): Promise<grafanaData.PanelPlugin> {\n  const loaded = panelCache[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  panelCache[id] = getPanelPlugin(meta);\n\n  return panelCache[id];\n}\n\nexport function importPanelPluginFromMeta(meta: grafanaData.PanelPluginMeta): Promise<grafanaData.PanelPlugin> {\n  return getPanelPlugin(meta);\n}\n\nfunction getPanelPlugin(meta: grafanaData.PanelPluginMeta): Promise<grafanaData.PanelPlugin> {\n  return importPluginModule(meta.module, meta.info?.version)\n    .then((pluginExports) => {\n      if (pluginExports.plugin) {\n        return pluginExports.plugin as grafanaData.PanelPlugin;\n      } else if (pluginExports.PanelCtrl) {\n        const plugin = new grafanaData.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      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","const 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}\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","/**\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","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// This file was almost autogenerated by cuetsy.\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nexport const modelVersion = Object.freeze([0, 0]);\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: PanelOptions = {\n  content: `# Title\n\nFor markdown syntax help: [commonmark.org/help](https://commonmark.org/help/)`,\n  mode: TextMode.Markdown,\n};\n","// Libraries\nimport React, { PureComponent } from 'react';\nimport { debounce } from 'lodash';\nimport { PanelProps, renderMarkdown, textUtil } from '@grafana/data';\n// Utils\nimport config from 'app/core/config';\n// Types\nimport { PanelOptions, TextMode } from './models.gen';\nimport { CustomScrollbar, stylesFactory } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport DangerouslySetHtmlContent from 'dangerously-set-html-content';\n\ninterface 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    return this.interpolateAndSanitizeString(html);\n  }\n\n  prepareMarkdown(content: string): string {\n    // Sanitize is disabled here as we handle that after variable interpolation\n    return renderMarkdown(this.interpolateAndSanitizeString(content), { noSanitize: config.disableSanitizeHtml });\n  }\n\n  interpolateAndSanitizeString(content: string): string {\n    const { replaceVariables } = this.props;\n\n    content = replaceVariables(content, {}, 'html');\n\n    return config.disableSanitizeHtml ? content : textUtil.sanitize(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 html={html} className={cx('markdown-html', styles.content)} />\n      </CustomScrollbar>\n    );\n  }\n}\n\nconst getStyles = stylesFactory(() => {\n  return {\n    content: css`\n      height: 100%;\n    `,\n  };\n});\n","import React, { FC, useMemo } from 'react';\nimport { css, cx } from '@emotion/css';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport {\n  CodeEditor,\n  stylesFactory,\n  useTheme,\n  CodeEditorSuggestionItem,\n  variableSuggestionToCodeEditorSuggestion,\n} from '@grafana/ui';\nimport { GrafanaTheme, StandardEditorProps } from '@grafana/data';\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=\"200px\"\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 { textPanelMigrationHandler } from './textPanelMigrationHandler';\nimport { TextPanelEditor } from './TextPanelEditor';\nimport { defaultPanelOptions, PanelOptions, TextMode } from './models.gen';\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';\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 React, { HTMLAttributes, useRef } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { Button, Field, Form, HorizontalGroup, InputControl, TextArea, usePanelContext, useStyles2 } from '@grafana/ui';\nimport { AnnotationEventUIModel, GrafanaTheme2 } from '@grafana/data';\nimport useClickAway from 'react-use/lib/useClickAway';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\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 { GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React from 'react';\nimport { HorizontalGroup, IconButton, Tag, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2, textUtil } from '@grafana/data';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { css } from '@emotion/css';\n\ninterface AnnotationTooltipProps {\n  annotation: AnnotationsDataFrameViewDTO;\n  timeFormatter: (v: number) => string;\n  editable: boolean;\n  onEdit: () => void;\n  onDelete: () => void;\n}\n\nexport const AnnotationTooltip: React.FC<AnnotationTooltipProps> = ({\n  annotation,\n  timeFormatter,\n  editable,\n  onEdit,\n  onDelete,\n}) => {\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 (editable) {\n    editControls = (\n      <div className={styles.editControls}>\n        <IconButton name={'pen'} size={'sm'} onClick={onEdit} />\n        <IconButton name={'trash-alt'} size={'sm'} onClick={onDelete} />\n      </div>\n    );\n  }\n\n  return (\n    <div className={styles.wrapper}>\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      </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    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 React, { HTMLAttributes, useCallback, useRef, useState } from 'react';\nimport { GrafanaTheme2, dateTimeFormat, systemDateFormats, TimeZone } from '@grafana/data';\nimport { Portal, useStyles2, usePanelContext } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { AnnotationEditorForm } from './AnnotationEditorForm';\nimport { getCommonAnnotationStyles } from '../styles';\nimport { usePopper } from 'react-popper';\nimport { getTooltipContainerStyles } from '@grafana/ui/src/themes/mixins';\nimport { AnnotationTooltip } from './AnnotationTooltip';\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n  timeZone: TimeZone;\n  annotation: AnnotationsDataFrameViewDTO;\n}\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, style }: Props) {\n  const { canAddAnnotations, ...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        editable={Boolean(canAddAnnotations && canAddAnnotations())}\n      />\n    );\n  }, [canAddAnnotations, onAnnotationDelete, onAnnotationEdit, timeFormatter, annotation]);\n\n  const isRegionAnnotation = Boolean(annotation.isRegion);\n\n  let marker = (\n    <div className={commonStyles(annotation).markerTriangle} style={{ transform: 'translate3d(-100%,-50%, 0)' }} />\n  );\n\n  if (isRegionAnnotation) {\n    marker = (\n      <div className={commonStyles(annotation).markerBar} style={{ ...style, transform: 'translate3d(0,-50%, 0)' }} />\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 { colorManipulator, DataFrame, DataFrameFieldIndex, DataFrameView, TimeZone } from '@grafana/data';\nimport { EventsCanvas, UPlotConfigBuilder, useTheme2 } from '@grafana/ui';\nimport React, { useCallback, useEffect, useLayoutEffect, useRef } from 'react';\nimport { AnnotationMarker } from './annotations/AnnotationMarker';\nimport uPlot from 'uplot';\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 markerStyle;\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        markerStyle = { width: `${x1 - x0}px` };\n      }\n\n      return <AnnotationMarker annotation={annotation} timeZone={timeZone} style={markerStyle} />;\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 React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { css as cssCore, Global } from '@emotion/react';\nimport {\n  ContextMenu,\n  GraphContextMenuHeader,\n  IconName,\n  MenuItemProps,\n  MenuItemsGroup,\n  MenuGroup,\n  MenuItem,\n  UPlotConfigBuilder,\n} from '@grafana/ui';\nimport { CartesianCoords2D, DataFrame, getFieldDisplayName, InterpolateFunction, TimeZone } from '@grafana/data';\nimport { useClickAway } from 'react-use';\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 {\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';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { usePopper } from 'react-popper';\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 {\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';\nimport React, { useCallback, useLayoutEffect, useRef } from 'react';\nimport { ExemplarMarker } from './ExemplarMarker';\nimport uPlot from 'uplot';\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 {\n  ArrayVector,\n  DataFrame,\n  Field,\n  FieldType,\n  getDisplayProcessor,\n  GrafanaTheme2,\n  isBooleanUnit,\n} from '@grafana/data';\nimport { GraphFieldConfig, LineInterpolation, StackingMode } from '@grafana/schema';\n\n/**\n * Returns null if there are no graphable fields\n */\nexport function prepareGraphableFields(series: DataFrame[], theme: GrafanaTheme2): 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    for (const field of frame.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          if (copy.config.custom?.stacking?.mode === StackingMode.Percent) {\n            copy.config.unit = 'percentunit';\n            copy.display = getDisplayProcessor({ field: copy, theme });\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        fields,\n      });\n    }\n  }\n\n  if (frames.length) {\n    return frames;\n  }\n\n  return null;\n}\n","import React, { HTMLAttributes, useState } from 'react';\nimport { usePopper } from 'react-popper';\nimport { css, cx } from '@emotion/css';\nimport { PlotSelection, useStyles2, useTheme2, Portal, DEFAULT_ANNOTATION_COLOR } from '@grafana/ui';\nimport { colorManipulator, DataFrame, getDisplayProcessor, GrafanaTheme2, TimeZone } from '@grafana/data';\nimport { getCommonAnnotationStyles } from '../styles';\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 { CartesianCoords2D, DataFrame, TimeZone } from '@grafana/data';\nimport { PlotSelection, UPlotConfigBuilder } from '@grafana/ui';\nimport React, { useCallback, useLayoutEffect, useRef, useState } from 'react';\nimport { useMountedState } from 'react-use';\nimport { AnnotationEditor } from './annotations/AnnotationEditor';\nimport uPlot from 'uplot';\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 React, { useMemo, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { Threshold, GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, useTheme2 } from '@grafana/ui';\nimport Draggable, { DraggableBounds } from 'react-draggable';\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 { FieldConfigSource, ThresholdsConfig, getValueFormat } from '@grafana/data';\nimport { UPlotConfigBuilder, buildScaleKey } from '@grafana/ui';\nimport { ThresholdDragHandle } from './ThresholdDragHandle';\nimport uPlot from 'uplot';\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  ConfigOverrideRule,\n  DynamicConfigValue,\n  FieldColorModeId,\n  FieldConfig,\n  FieldConfigProperty,\n  FieldConfigSource,\n  FieldMatcherID,\n  fieldReducers,\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} from '@grafana/schema';\nimport { TimeSeriesOptions } from './types';\nimport { omitBy, pickBy, isNil, isNumber, isString } from 'lodash';\nimport { defaultGraphConfig } from './config';\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 = seriesOverride.alias.startsWith('/') && seriesOverride.alias.endsWith('/');\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          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.Null;\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      placement: 'bottom',\n      calcs: [],\n    },\n    tooltip: {\n      mode: TooltipDisplayMode.Single,\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.displayMode = LegendDisplayMode.Hidden;\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\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  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 { GraphFieldConfig } from '@grafana/schema';\nimport { PanelPlugin } from '@grafana/data';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { TimeSeriesPanel } from './TimeSeriesPanel';\nimport { graphPanelChangedHandler } from './migrations';\nimport { TimeSeriesOptions } from './types';\nimport { defaultGraphConfig, getGraphFieldConfig } from './config';\nimport { TimeSeriesSuggestionsSupplier } from './suggestions';\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  .setSuggestionsSupplier(new TimeSeriesSuggestionsSupplier())\n  .setDataSupport({ annotations: true, alertStates: true });\n","import React, { useMemo } from 'react';\nimport { Field, PanelProps } from '@grafana/data';\nimport { TooltipDisplayMode } from '@grafana/schema';\nimport { usePanelContext, TimeSeries, TooltipPlugin, ZoomPlugin } from '@grafana/ui';\nimport { getFieldLinksForExplore } from 'app/features/explore/utils/links';\nimport { AnnotationsPlugin } from './plugins/AnnotationsPlugin';\nimport { ContextMenuPlugin } from './plugins/ContextMenuPlugin';\nimport { ExemplarsPlugin } from './plugins/ExemplarsPlugin';\nimport { TimeSeriesOptions } from './types';\nimport { prepareGraphableFields } from './utils';\nimport { AnnotationEditorPlugin } from './plugins/AnnotationEditorPlugin';\nimport { ThresholdControlsPlugin } from './plugins/ThresholdControlsPlugin';\nimport { config } from 'app/core/config';\nimport { PanelDataErrorView } from '@grafana/runtime';\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), [data]);\n\n  if (!frames) {\n    return <PanelDataErrorView panelId={id} data={data} needsTimeField={true} needsNumberField={true} />;\n  }\n\n  const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations());\n\n  return (\n    <TimeSeries\n      frames={frames}\n      structureRev={data.structureRev}\n      timeRange={timeRange}\n      timeZone={timeZone}\n      width={width}\n      height={height}\n      legend={options.legend}\n    >\n      {(config, alignedDataFrame) => {\n        return (\n          <>\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                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        );\n      }}\n    </TimeSeries>\n  );\n};\n","import { FieldColorModeId, VisualizationSuggestionsBuilder } from '@grafana/data';\nimport {\n  GraphDrawStyle,\n  GraphFieldConfig,\n  GraphGradientMode,\n  LegendDisplayMode,\n  LineInterpolation,\n  StackingMode,\n} from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\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.displayMode = LegendDisplayMode.Hidden;\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 React from 'react';\nimport { LegendDisplayMode, 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';\nimport { DataFrame, FieldType, TimeRange } from '@grafana/data';\nimport { preparePlotConfigBuilder } from './utils';\nimport { TimelineMode, TimelineOptions, TimelineValueAlignment } from './types';\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  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      // When there is only one row, use the full space\n      rowHeight: alignedFrame.fields.length > 2 ? this.props.rowHeight : 1,\n    });\n  };\n\n  renderLegend = (config: UPlotConfigBuilder) => {\n    const { legend, legendItems } = this.props;\n\n    if (!config || !legendItems || !legend || legend.displayMode === LegendDisplayMode.Hidden) {\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 React from 'react';\nimport {\n  DataFrame,\n  FALLBACK_COLOR,\n  formattedValueToString,\n  getDisplayProcessor,\n  getFieldDisplayName,\n  getValueFormat,\n  TimeZone,\n} from '@grafana/data';\nimport { SeriesTableRow, useTheme2 } from '@grafana/ui';\nimport { findNextStateIndex } from './utils';\n\ninterface StateTimelineTooltipProps {\n  data: DataFrame[];\n  alignedData: DataFrame;\n  seriesIdx: number;\n  datapointIdx: number;\n  timeZone: TimeZone;\n}\n\nexport const StateTimelineTooltip: React.FC<StateTimelineTooltipProps> = ({\n  data,\n  alignedData,\n  seriesIdx,\n  datapointIdx,\n  timeZone,\n}) => {\n  const theme = useTheme2();\n\n  const xField = alignedData.fields[0];\n  const xFieldFmt = xField.display || getDisplayProcessor({ field: xField, timeZone, theme });\n\n  const field = alignedData.fields[seriesIdx!];\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 && formattedValueToString(getValueFormat('dtdurationms')(nextStateTs - stateTs, 0));\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 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  );\n};\n\nStateTimelineTooltip.displayName = 'StateTimelineTooltip';\n","import { FieldColorModeId, FieldConfigProperty, PanelPlugin } from '@grafana/data';\nimport { StateTimelinePanel } from './StateTimelinePanel';\nimport { TimelineOptions, TimelineFieldConfig, defaultPanelOptions, defaultTimelineFieldConfig } from './types';\nimport { VisibilityMode } from '@grafana/schema';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { timelinePanelChangedHandler } from './migrations';\nimport { StatTimelineSuggestionsSupplier } from './suggestions';\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    },\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","import React, { useCallback, useMemo } from 'react';\nimport { DataFrame, FieldType, PanelProps } from '@grafana/data';\nimport { TooltipPlugin, useTheme2, ZoomPlugin, usePanelContext } from '@grafana/ui';\nimport { TimelineMode, TimelineOptions } from './types';\nimport { TimelineChart } from './TimelineChart';\nimport { prepareTimelineFields, prepareTimelineLegendItems } from './utils';\nimport { StateTimelineTooltip } from './StateTimelineTooltip';\nimport { getLastStreamingDataFramePacket } from '@grafana/data/src/dataframe/StreamingDataFrame';\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  onChangeTimeRange,\n}) => {\n  const theme = useTheme2();\n  const { sync } = usePanelContext();\n\n  const { frames, warn } = useMemo(() => prepareTimelineFields(data?.series, options.mergeValues ?? true, theme), [\n    data,\n    options.mergeValues,\n    theme,\n  ]);\n\n  const legendItems = useMemo(() => prepareTimelineLegendItems(frames, options.legend, theme), [\n    frames,\n    options.legend,\n    theme,\n  ]);\n\n  const renderCustomTooltip = useCallback(\n    (alignedData: DataFrame, seriesIdx: number | null, datapointIdx: number | null) => {\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        <StateTimelineTooltip\n          data={data}\n          alignedData={alignedData}\n          seriesIdx={seriesIdx}\n          datapointIdx={datapointIdx}\n          timeZone={timeZone}\n        />\n      );\n    },\n    [timeZone, frames]\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\n  return (\n    <TimelineChart\n      theme={theme}\n      frames={frames}\n      structureRev={data.structureRev}\n      timeRange={timeRange}\n      timeZone={timeZone}\n      width={width}\n      height={height}\n      legendItems={legendItems}\n      {...options}\n      mode={TimelineMode.Changes}\n    >\n      {(config, alignedFrame) => {\n        return (\n          <>\n            <ZoomPlugin config={config} onZoom={onChangeTimeRange} />\n            <TooltipPlugin\n              data={alignedFrame}\n              sync={sync}\n              config={config}\n              mode={options.tooltip.mode}\n              timeZone={timeZone}\n              renderTooltip={renderCustomTooltip}\n            />\n          </>\n        );\n      }}\n    </TimelineChart>\n  );\n};\n","import { FieldConfigSource, MappingType, PanelModel, ValueMap } from '@grafana/data';\nimport { TimelineFieldConfig, TimelineOptions } from './types';\nimport { isArray } from 'lodash';\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';\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, { useMemo } from 'react';\nimport { PanelProps } from '@grafana/data';\nimport { TooltipPlugin, useTheme2, ZoomPlugin } from '@grafana/ui';\nimport { StatusPanelOptions } from './types';\nimport { TimelineChart } from '../state-timeline/TimelineChart';\nimport { TimelineMode } from '../state-timeline/types';\nimport { prepareTimelineFields, prepareTimelineLegendItems } from '../state-timeline/utils';\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 { frames, warn } = useMemo(() => prepareTimelineFields(data?.series, false, theme), [data, theme]);\n\n  const legendItems = useMemo(() => prepareTimelineLegendItems(frames, options.legend, theme), [\n    frames,\n    options.legend,\n    theme,\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  // 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 recieved)\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      timeZone={timeZone}\n      width={width}\n      height={height}\n      legendItems={legendItems}\n      {...options}\n      // hardcoded\n      mode={TimelineMode.Samples}\n    >\n      {(config, alignedFrame) => {\n        return (\n          <>\n            <ZoomPlugin config={config} onZoom={onChangeTimeRange} />\n            <TooltipPlugin data={alignedFrame} config={config} mode={options.tooltip.mode} timeZone={timeZone} />\n          </>\n        );\n      }}\n    </TimelineChart>\n  );\n};\n","import { HideableFieldConfig, VisibilityMode, OptionsWithTooltip, OptionsWithLegend } from '@grafana/schema';\n\n/**\n * @alpha\n */\nexport interface StatusPanelOptions extends OptionsWithTooltip, OptionsWithLegend {\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 { StatusHistoryPanel } from './StatusHistoryPanel';\nimport { StatusPanelOptions, StatusFieldConfig, defaultStatusFieldConfig } from './types';\nimport { VisibilityMode } from '@grafana/schema';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { StatusHistorySuggestionsSupplier } from './suggestions';\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 { FieldColorModeId, VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { SuggestionName } from 'app/types/suggestions';\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","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\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    placement: 'bottom',\n    calcs: [],\n  },\n  includeAllFields: false,\n};\n","import { VizDisplayMode, ColorStrategy, CandleStyle } from './models.gen';\nimport uPlot from 'uplot';\nimport { colorManipulator } from '@grafana/data';\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  ArrayVector,\n  DataFrame,\n  Field,\n  FieldType,\n  getFieldDisplayName,\n  GrafanaTheme2,\n  outerJoinDataFrames,\n} from '@grafana/data';\nimport { findField } from 'app/features/dimensions';\nimport { prepareGraphableFields } from '../timeseries/utils';\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): CandlestickData | null {\n  if (!series?.length) {\n    return null;\n  }\n\n  // All fields\n  const fieldMap = options.fields ?? {};\n  const aligned = series.length === 1 ? series[0] : outerJoinDataFrames({ frames: series, enforceSort: true });\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);\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 { GraphFieldConfig } from '@grafana/schema';\nimport {\n  Field,\n  FieldType,\n  getFieldDisplayName,\n  PanelOptionsEditorBuilder,\n  PanelPlugin,\n  SelectableValue,\n} from '@grafana/data';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { CandlestickPanel } from './CandlestickPanel';\nimport {\n  defaultColors,\n  CandlestickOptions,\n  VizDisplayMode,\n  ColorStrategy,\n  defaultPanelOptions,\n  CandleStyle,\n} from './models.gen';\nimport { defaultGraphConfig, getGraphFieldConfig } from '../timeseries/config';\nimport { CandlestickData, candlestickFieldsInfo, FieldPickerInfo, prepareCandlestickFields } from './fields';\nimport { config } from '@grafana/runtime';\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 { Field, getDisplayProcessor, PanelProps } from '@grafana/data';\nimport { TooltipDisplayMode } from '@grafana/schema';\nimport { usePanelContext, TimeSeries, TooltipPlugin, ZoomPlugin, UPlotConfigBuilder, useTheme2 } from '@grafana/ui';\nimport { getFieldLinksForExplore } from 'app/features/explore/utils/links';\nimport { AnnotationsPlugin } from '../timeseries/plugins/AnnotationsPlugin';\nimport { ContextMenuPlugin } from '../timeseries/plugins/ContextMenuPlugin';\nimport { ExemplarsPlugin } from '../timeseries/plugins/ExemplarsPlugin';\nimport { AnnotationEditorPlugin } from '../timeseries/plugins/AnnotationEditorPlugin';\nimport { ThresholdControlsPlugin } from '../timeseries/plugins/ThresholdControlsPlugin';\nimport { config } from 'app/core/config';\nimport { drawMarkers, FieldIndices } from './utils';\nimport { defaultColors, CandlestickOptions, VizDisplayMode } from './models.gen';\nimport { ScaleProps } from '@grafana/ui/src/components/uPlot/config/UPlotScaleBuilder';\nimport { AxisProps } from '@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder';\nimport { prepareCandlestickFields } from './fields';\nimport uPlot from 'uplot';\nimport { PanelDataErrorView } from '@grafana/runtime';\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(() => prepareCandlestickFields(data?.series, options, theme), [data, options, theme]);\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 <PanelDataErrorView panelId={id} data={data} needsTimeField={true} needsNumberField={true} />;\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      timeZone={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            <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            {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        );\n      }}\n    </TimeSeries>\n  );\n};\n","import { VisualizationSuggestionsBuilder, VisualizationSuggestionScore } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { SuggestionName } from 'app/types/suggestions';\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","import $ from 'jquery';\nimport { partition, each } from 'lodash';\n//@ts-ignore\nimport Drop from 'tether-drop';\nimport { CreatePlotOverlay } from '@grafana/data';\nimport { getLegacyAngularInjector } from '@grafana/runtime';\n\n/** @ngInject */\nconst createAnnotationToolip: CreatePlotOverlay = (element, event, plot) => {\n  const injector = getLegacyAngularInjector();\n  const content = document.createElement('div');\n  content.innerHTML = '<annotation-tooltip event=\"event\" on-edit=\"onEdit()\"></annotation-tooltip>';\n\n  injector.invoke([\n    '$compile',\n    '$rootScope',\n    ($compile, $rootScope) => {\n      const eventManager = plot.getOptions().events.manager;\n      const tmpScope = $rootScope.$new(true);\n      tmpScope.event = event;\n      tmpScope.onEdit = () => {\n        eventManager.editEvent(event);\n      };\n\n      $compile(content)(tmpScope);\n      tmpScope.$digest();\n      tmpScope.$destroy();\n\n      const drop = new Drop({\n        target: element[0],\n        content: content,\n        position: 'bottom center',\n        classes: 'drop-popover drop-popover--annotation',\n        openOn: 'hover',\n        hoverCloseDelay: 200,\n        tetherOptions: {\n          constraints: [{ to: 'window', pin: true, attachment: 'both' }],\n        },\n      });\n\n      drop.open();\n\n      drop.on('close', () => {\n        setTimeout(() => {\n          drop.destroy();\n        });\n      });\n    },\n  ]);\n};\n\nlet markerElementToAttachTo: any = null;\n\n/** @ngInject */\nconst createEditPopover: CreatePlotOverlay = (element, event, plot) => {\n  const eventManager = plot.getOptions().events.manager;\n  if (eventManager.editorOpen) {\n    // update marker element to attach to (needed in case of legend on the right\n    // when there is a double render pass and the initial marker element is removed)\n    markerElementToAttachTo = element;\n    return;\n  }\n\n  // mark as openend\n  eventManager.editorOpened();\n  // set marker elment to attache to\n  markerElementToAttachTo = element;\n\n  // wait for element to be attached and positioned\n  setTimeout(() => {\n    const injector = getLegacyAngularInjector();\n    const content = document.createElement('div');\n    content.innerHTML = '<event-editor panel-ctrl=\"panelCtrl\" event=\"event\" close=\"close()\"></event-editor>';\n\n    injector.invoke([\n      '$compile',\n      '$rootScope',\n      ($compile, $rootScope) => {\n        const scope = $rootScope.$new(true);\n        let drop: any;\n\n        scope.event = event;\n        scope.panelCtrl = eventManager.panelCtrl;\n        scope.close = () => {\n          drop.close();\n        };\n\n        $compile(content)(scope);\n        scope.$digest();\n\n        drop = new Drop({\n          target: markerElementToAttachTo[0],\n          content: content,\n          position: 'bottom center',\n          classes: 'drop-popover drop-popover--form',\n          openOn: 'click',\n          tetherOptions: {\n            constraints: [{ to: 'window', pin: true, attachment: 'both' }],\n          },\n        });\n\n        drop.open();\n        eventManager.editorOpened();\n\n        drop.on('close', () => {\n          // need timeout here in order call drop.destroy\n          setTimeout(() => {\n            eventManager.editorClosed();\n            scope.$destroy();\n            drop.destroy();\n          });\n        });\n      },\n    ]);\n  }, 100);\n};\n\nexport { createEditPopover, createAnnotationToolip };\n\n/*\n * jquery.flot.events\n *\n * description: Flot plugin for adding events/markers to the plot\n * version: 0.2.5\n * authors:\n *    Alexander Wunschik <alex@wunschik.net>\n *    Joel Oughton <joeloughton@gmail.com>\n *    Nicolas Joseph <www.nicolasjoseph.com>\n *\n * website: https://github.com/mojoaxel/flot-events\n *\n * released under MIT License and GPLv2+\n */\n\n/**\n * A class that allows for the drawing an remove of some object\n */\nexport class DrawableEvent {\n  _object: any;\n  _drawFunc: any;\n  _clearFunc: any;\n  _moveFunc: any;\n  _position: any;\n  _width: any;\n  _height: any;\n\n  /** @ngInject */\n  constructor(\n    object: JQuery,\n    drawFunc: any,\n    clearFunc: any,\n    moveFunc: any,\n    left: number,\n    top: number,\n    width: number,\n    height: number\n  ) {\n    this._object = object;\n    this._drawFunc = drawFunc;\n    this._clearFunc = clearFunc;\n    this._moveFunc = moveFunc;\n    this._position = { left, top };\n    this._width = width;\n    this._height = height;\n  }\n\n  width() {\n    return this._width;\n  }\n  height() {\n    return this._height;\n  }\n  position() {\n    return this._position;\n  }\n  draw() {\n    this._drawFunc(this._object);\n  }\n  clear() {\n    this._clearFunc(this._object);\n  }\n  getObject() {\n    return this._object;\n  }\n  moveTo(position: { left: number; top: number }) {\n    this._position = position;\n    this._moveFunc(this._object, this._position);\n  }\n}\n\n/**\n * Event class that stores options (eventType, min, max, title, description) and the object to draw.\n */\nexport class VisualEvent {\n  _parent: any;\n  _options: any;\n  _drawableEvent: any;\n  _hidden: any;\n\n  /** @ngInject */\n  constructor(options: any, drawableEvent: DrawableEvent) {\n    this._options = options;\n    this._drawableEvent = drawableEvent;\n    this._hidden = false;\n  }\n\n  visual() {\n    return this._drawableEvent;\n  }\n  getOptions() {\n    return this._options;\n  }\n  getParent() {\n    return this._parent;\n  }\n  isHidden() {\n    return this._hidden;\n  }\n  hide() {\n    this._hidden = true;\n  }\n  unhide() {\n    this._hidden = false;\n  }\n}\n\n/**\n * A Class that handles the event-markers inside the given plot\n */\nexport class EventMarkers {\n  _events: any;\n  _types: any;\n  _plot: any;\n  eventsEnabled: any;\n\n  /** @ngInject */\n  constructor(plot: any) {\n    this._events = [];\n    this._types = [];\n    this._plot = plot;\n    this.eventsEnabled = false;\n  }\n\n  getEvents() {\n    return this._events;\n  }\n\n  setTypes(types: any) {\n    return (this._types = types);\n  }\n\n  /**\n   * create internal objects for the given events\n   */\n  setupEvents(events: any[]) {\n    const parts = partition(events, 'isRegion');\n    const regions = parts[0];\n    events = parts[1];\n\n    $.each(events, (index, event) => {\n      const ve = new VisualEvent(event, this._buildDiv(event));\n      this._events.push(ve);\n    });\n\n    $.each(regions, (index, event) => {\n      const vre = new VisualEvent(event, this._buildRegDiv(event));\n      this._events.push(vre);\n    });\n\n    this._events.sort((a: any, b: any) => {\n      const ao = a.getOptions(),\n        bo = b.getOptions();\n      if (ao.min > bo.min) {\n        return 1;\n      }\n      if (ao.min < bo.min) {\n        return -1;\n      }\n      return 0;\n    });\n  }\n\n  /**\n   * draw the events to the plot\n   */\n  drawEvents() {\n    // var o = this._plot.getPlotOffset();\n\n    $.each(this._events, (index, event) => {\n      const options = event.getOptions();\n      const insidePlot = this._insidePlot(options.min) || this._insidePlot(options.timeEnd);\n      const overlapPlot = this._overlapPlot(options.min, options.timeEnd);\n      // check event is inside the graph range\n      if ((insidePlot || overlapPlot) && !event.isHidden()) {\n        event.visual().draw();\n      } else {\n        event.visual().getObject().hide();\n      }\n    });\n  }\n\n  /**\n   * update the position of the event-markers (e.g. after scrolling or zooming)\n   */\n  updateEvents() {\n    const o = this._plot.getPlotOffset();\n    let left;\n    let top;\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n\n    $.each(this._events, (index, event) => {\n      top = o.top + this._plot.height() - event.visual().height();\n      left = xaxis.p2c(event.getOptions().min) + o.left - event.visual().width() / 2;\n      event.visual().moveTo({ top: top, left: left });\n    });\n  }\n\n  /**\n   * remove all events from the plot\n   */\n  _clearEvents() {\n    $.each(this._events, (index, val) => {\n      val.visual().clear();\n    });\n    this._events = [];\n  }\n\n  /**\n   * create a DOM element for the given event\n   */\n  _buildDiv(event: { eventType: any; min: any; editModel: any }) {\n    const that = this;\n\n    const container = this._plot.getPlaceholder();\n    const o = this._plot.getPlotOffset();\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n    let top, left, color, markerSize, markerShow, lineStyle, lineWidth;\n    let markerTooltip;\n\n    // map the eventType to a types object\n    const eventTypeId = event.eventType;\n\n    if (this._types === null || !this._types[eventTypeId] || !this._types[eventTypeId].color) {\n      color = '#666';\n    } else {\n      color = this._types[eventTypeId].color;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || !this._types[eventTypeId].markerSize) {\n      markerSize = 8; //default marker size\n    } else {\n      markerSize = this._types[eventTypeId].markerSize;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || this._types[eventTypeId].markerShow === undefined) {\n      markerShow = true;\n    } else {\n      markerShow = this._types[eventTypeId].markerShow;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || this._types[eventTypeId].markerTooltip === undefined) {\n      markerTooltip = true;\n    } else {\n      markerTooltip = this._types[eventTypeId].markerTooltip;\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || !this._types[eventTypeId].lineStyle) {\n      lineStyle = 'dashed'; //default line style\n    } else {\n      lineStyle = this._types[eventTypeId].lineStyle.toLowerCase();\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || this._types[eventTypeId].lineWidth === undefined) {\n      lineWidth = 1; //default line width\n    } else {\n      lineWidth = this._types[eventTypeId].lineWidth;\n    }\n\n    let topOffset = xaxis.options.eventSectionHeight || 0;\n    topOffset = topOffset / 3;\n\n    top = o.top + this._plot.height() + topOffset;\n    left = xaxis.p2c(event.min) + o.left;\n\n    const line = $('<div class=\"events_line flot-temp-elem\"></div>')\n      .css({\n        position: 'absolute',\n        opacity: 0.8,\n        left: left + 'px',\n        top: 8,\n        width: lineWidth + 'px',\n        height: this._plot.height() + topOffset * 0.8,\n        'border-left-width': lineWidth + 'px',\n        'border-left-style': lineStyle,\n        'border-left-color': color,\n        color: color,\n      })\n      .appendTo(container);\n\n    if (markerShow) {\n      const marker = $('<div class=\"events_marker\"></div>').css({\n        position: 'absolute',\n        left: -markerSize - Math.round(lineWidth / 2) + 'px',\n        'font-size': 0,\n        'line-height': 0,\n        width: 0,\n        height: 0,\n        'border-left': markerSize + 'px solid transparent',\n        'border-right': markerSize + 'px solid transparent',\n      });\n\n      marker.appendTo(line);\n\n      if (\n        this._types[eventTypeId] &&\n        this._types[eventTypeId].position &&\n        this._types[eventTypeId].position.toUpperCase() === 'BOTTOM'\n      ) {\n        marker.css({\n          top: top - markerSize - 8 + 'px',\n          'border-top': 'none',\n          'border-bottom': markerSize + 'px solid ' + color,\n        });\n      } else {\n        marker.css({\n          top: '0px',\n          'border-top': markerSize + 'px solid ' + color,\n          'border-bottom': 'none',\n        });\n      }\n\n      marker.data({\n        event: event,\n      });\n\n      const mouseenter = function (this: any) {\n        createAnnotationToolip(marker, $(this).data('event'), that._plot);\n      };\n\n      if (event.editModel) {\n        createEditPopover(marker, event.editModel, that._plot);\n      }\n\n      const mouseleave = () => {\n        that._plot.clearSelection();\n      };\n\n      if (markerTooltip) {\n        marker.css({ cursor: 'help' });\n        marker.hover(mouseenter, mouseleave);\n      }\n    }\n\n    const drawableEvent = new DrawableEvent(\n      line,\n      function drawFunc(obj: { show: () => void }) {\n        obj.show();\n      },\n      (obj: { remove: () => void }) => {\n        obj.remove();\n      },\n      (obj: any, position: { top: any; left: any }) => {\n        obj.css({\n          top: position.top,\n          left: position.left,\n        });\n      },\n      left,\n      top,\n      line.width() ?? 1,\n      line.height() ?? 1\n    );\n\n    return drawableEvent;\n  }\n\n  /**\n   * create a DOM element for the given region\n   */\n  _buildRegDiv(event: { eventType: any; min: number; timeEnd: number; editModel: any }) {\n    const that = this;\n\n    const container = this._plot.getPlaceholder();\n    const o = this._plot.getPlotOffset();\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n    let top,\n      left,\n      lineWidth: number,\n      regionWidth,\n      lineStyle: string | number | cssPropertySetter,\n      color: string,\n      markerTooltip;\n\n    // map the eventType to a types object\n    const eventTypeId = event.eventType;\n\n    if (this._types === null || !this._types[eventTypeId] || !this._types[eventTypeId].color) {\n      color = '#666';\n    } else {\n      color = this._types[eventTypeId].color;\n    }\n\n    if (this._types === null || !this._types[eventTypeId] || this._types[eventTypeId].markerTooltip === undefined) {\n      markerTooltip = true;\n    } else {\n      markerTooltip = this._types[eventTypeId].markerTooltip;\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || this._types[eventTypeId].lineWidth === undefined) {\n      lineWidth = 1; //default line width\n    } else {\n      lineWidth = this._types[eventTypeId].lineWidth;\n    }\n\n    if (this._types == null || !this._types[eventTypeId] || !this._types[eventTypeId].lineStyle) {\n      lineStyle = 'dashed'; //default line style\n    } else {\n      lineStyle = this._types[eventTypeId].lineStyle.toLowerCase();\n    }\n\n    const topOffset = 2;\n    top = o.top + this._plot.height() + topOffset;\n\n    const timeFrom = Math.min(event.min, event.timeEnd);\n    const timeTo = Math.max(event.min, event.timeEnd);\n    left = xaxis.p2c(timeFrom) + o.left;\n    const right = xaxis.p2c(timeTo) + o.left;\n\n    const [xmin, xmax] = [o.left, o.left + this._plot.width()];\n    const regionStart = Math.max(left, xmin);\n    const regionEnd = Math.min(right, xmax);\n    const regionOffset = right > xmax ? 0 : lineWidth; // only include lineWidth when right line is visible\n    regionWidth = regionEnd - regionStart + regionOffset;\n\n    each([left, right], (position) => {\n      // only draw visible region lines\n      if (xmin <= position && position < xmax) {\n        const line = $('<div class=\"events_line flot-temp-elem\"></div>').css({\n          position: 'absolute',\n          opacity: 0.8,\n          left: position + 'px',\n          top: 8,\n          width: lineWidth + 'px',\n          height: this._plot.height() + topOffset,\n          'border-left-width': lineWidth + 'px',\n          'border-left-style': lineStyle,\n          'border-left-color': color,\n          color: color,\n        });\n        line.appendTo(container);\n      }\n    });\n\n    const region = $('<div class=\"events_marker region_marker flot-temp-elem\"></div>').css({\n      position: 'absolute',\n      opacity: 0.5,\n      left: regionStart + 'px',\n      top: top,\n      width: regionWidth + 'px',\n      height: '0.5rem',\n      'border-left-color': color,\n      color: color,\n      'background-color': color,\n    });\n    region.appendTo(container);\n\n    region.data({\n      event: event,\n    });\n\n    const mouseenter = function (this: any) {\n      createAnnotationToolip(region, $(this).data('event'), that._plot);\n    };\n\n    if (event.editModel) {\n      createEditPopover(region, event.editModel, that._plot);\n    }\n\n    const mouseleave = () => {\n      that._plot.clearSelection();\n    };\n\n    if (markerTooltip) {\n      region.css({ cursor: 'help' });\n      region.hover(mouseenter, mouseleave);\n    }\n\n    const drawableEvent = new DrawableEvent(\n      region,\n      function drawFunc(obj: { show: () => void }) {\n        obj.show();\n      },\n      (obj: { remove: () => void }) => {\n        obj.remove();\n      },\n      (obj: { css: (arg0: { top: any; left: any }) => void }, position: { top: any; left: any }) => {\n        obj.css({\n          top: position.top,\n          left: position.left,\n        });\n      },\n      left,\n      top,\n      region.width() ?? 1,\n      region.height() ?? 1\n    );\n\n    return drawableEvent;\n  }\n\n  /**\n   * check if the event is inside visible range\n   */\n  _insidePlot(x: any) {\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n    const xc = xaxis.p2c(x);\n    return xc > 0 && xc < xaxis.p2c(xaxis.max);\n  }\n\n  /**\n   * check if the event overlaps the visible range\n   */\n  _overlapPlot(point0: number, point1: number) {\n    const xaxis = this._plot.getXAxes()[this._plot.getOptions().events.xaxis - 1];\n    const [coord0, coord1] = [xaxis.p2c(point0), xaxis.p2c(point1)];\n    const [coordMin, coordMax] = [0, xaxis.p2c(xaxis.max)];\n    return coordMin < coord0 && coord1 < coordMax;\n  }\n}\n\n/**\n * initialize the plugin for the given plot\n */\n\n/** @ngInject */\nexport function init(this: any, plot: any) {\n  const that = this;\n  const eventMarkers = new EventMarkers(plot);\n\n  plot.getEvents = () => {\n    return eventMarkers._events;\n  };\n\n  plot.hideEvents = () => {\n    $.each(eventMarkers._events, (index, event) => {\n      event.visual().getObject().hide();\n    });\n  };\n\n  plot.showEvents = () => {\n    plot.hideEvents();\n    $.each(eventMarkers._events, (index, event) => {\n      event.hide();\n    });\n\n    that.eventMarkers.drawEvents();\n  };\n\n  // change events on an existing plot\n  plot.setEvents = (events: any[]) => {\n    if (eventMarkers.eventsEnabled) {\n      eventMarkers.setupEvents(events);\n    }\n  };\n\n  plot.hooks.processOptions.push((plot: any, options: any) => {\n    // enable the plugin\n    if (options.events.data != null) {\n      eventMarkers.eventsEnabled = true;\n    }\n  });\n\n  plot.hooks.draw.push((plot: any) => {\n    const options = plot.getOptions();\n\n    if (eventMarkers.eventsEnabled) {\n      // check for first run\n      if (eventMarkers.getEvents().length < 1) {\n        eventMarkers.setTypes(options.events.types);\n        eventMarkers.setupEvents(options.events.data);\n      } else {\n        eventMarkers.updateEvents();\n      }\n    }\n\n    eventMarkers.drawEvents();\n  });\n}\n\nconst defaultOptions: any = {\n  events: {\n    data: null,\n    types: null,\n    xaxis: 1,\n    position: 'BOTTOM',\n  },\n};\n\n$.plot.plugins.push({\n  init: init,\n  options: defaultOptions,\n  name: 'events',\n  version: '0.2.5',\n});\n","import $ from 'jquery';\nimport { appEvents } from 'app/core/core';\nimport { CoreEvents } from 'app/types';\nimport {\n  textUtil,\n  systemDateFormats,\n  LegacyGraphHoverClearEvent,\n  LegacyGraphHoverEvent,\n  DataHoverClearEvent,\n} from '@grafana/data';\n\nexport default function GraphTooltip(this: any, elem: any, dashboard: any, scope: any, getSeriesFn: any) {\n  const self = this;\n  const ctrl = scope.ctrl;\n  const panel = ctrl.panel;\n  const hoverEvent = new LegacyGraphHoverEvent({ pos: {}, point: {}, panel: this.panel });\n\n  const $tooltip = $('<div class=\"graph-tooltip\">');\n\n  this.destroy = () => {\n    $tooltip.remove();\n  };\n\n  this.findHoverIndexFromDataPoints = (posX: number, series: any, last: number) => {\n    const ps = series.datapoints.pointsize;\n    const initial = last * ps;\n    const len = series.datapoints.points.length;\n    let j;\n    for (j = initial; j < len; j += ps) {\n      // Special case of a non stepped line, highlight the very last point just before a null point\n      if (\n        (!series.lines.steps && series.datapoints.points[initial] != null && series.datapoints.points[j] == null) ||\n        //normal case\n        series.datapoints.points[j] > posX\n      ) {\n        return Math.max(j - ps, 0) / ps;\n      }\n    }\n    return j / ps - 1;\n  };\n\n  this.findHoverIndexFromData = (posX: any, series: any) => {\n    let lower = 0;\n    let upper = series.data.length - 1;\n    let middle;\n    while (true) {\n      if (lower > upper) {\n        return Math.max(upper, 0);\n      }\n      middle = Math.floor((lower + upper) / 2);\n      if (series.data[middle][0] === posX) {\n        return middle;\n      } else if (series.data[middle][0] < posX) {\n        lower = middle + 1;\n      } else {\n        upper = middle - 1;\n      }\n    }\n  };\n\n  this.renderAndShow = (absoluteTime: string, innerHtml: string, pos: { pageX: number; pageY: any }, xMode: string) => {\n    if (xMode === 'time') {\n      innerHtml = '<div class=\"graph-tooltip-time\">' + absoluteTime + '</div>' + innerHtml;\n    }\n    $tooltip.html(innerHtml).place_tt(pos.pageX, pos.pageY, { offset: 10 });\n  };\n\n  this.getMultiSeriesPlotHoverInfo = function (seriesList: any[], pos: { x: number }) {\n    let value, i, series, hoverIndex, hoverDistance, pointTime, yaxis;\n    // 3 sub-arrays, 1st for hidden series, 2nd for left yaxis, 3rd for right yaxis.\n    let results: any = [[], [], []];\n\n    //now we know the current X (j) position for X and Y values\n    let lastValue = 0; //needed for stacked values\n\n    let minDistance, minTime;\n\n    for (i = 0; i < seriesList.length; i++) {\n      series = seriesList[i];\n\n      if (!series.data.length || (panel.legend.hideEmpty && series.allIsNull)) {\n        // Init value so that it does not brake series sorting\n        results[0].push({ hidden: true, value: 0 });\n        continue;\n      }\n\n      if (!series.data.length || (panel.legend.hideZero && series.allIsZero)) {\n        // Init value so that it does not brake series sorting\n        results[0].push({ hidden: true, value: 0 });\n        continue;\n      }\n\n      if (series.hideTooltip) {\n        results[0].push({ hidden: true, value: 0 });\n        continue;\n      }\n\n      hoverIndex = this.findHoverIndexFromData(pos.x, series);\n      hoverDistance = pos.x - series.data[hoverIndex][0];\n      pointTime = series.data[hoverIndex][0];\n\n      // Take the closest point before the cursor, or if it does not exist, the closest after\n      if (\n        !minDistance ||\n        (hoverDistance >= 0 && (hoverDistance < minDistance || minDistance < 0)) ||\n        (hoverDistance < 0 && hoverDistance > minDistance)\n      ) {\n        minDistance = hoverDistance;\n        minTime = pointTime;\n      }\n\n      value = series.data[hoverIndex][1];\n\n      if (series.stack && value !== null && panel.tooltip.value_type !== 'individual') {\n        lastValue += value;\n        value = lastValue;\n      }\n\n      // Highlighting multiple Points depending on the plot type\n      if (series.lines.steps || series.stack) {\n        // stacked and steppedLine plots can have series with different length.\n        // Stacked series can increase its length on each new stacked serie if null points found,\n        // to speed the index search we begin always on the last found hoverIndex.\n        hoverIndex = this.findHoverIndexFromDataPoints(pos.x, series, hoverIndex);\n      }\n\n      // Be sure we have a yaxis so that it does not brake series sorting\n      yaxis = 0;\n      if (series.yaxis) {\n        yaxis = series.yaxis.n;\n      }\n\n      results[yaxis].push({\n        value: value,\n        hoverIndex: hoverIndex,\n        color: series.color,\n        label: series.aliasEscaped,\n        time: pointTime,\n        distance: hoverDistance,\n        index: i,\n      });\n    }\n\n    // Contat the 3 sub-arrays\n    results = results[0].concat(results[1], results[2]);\n\n    // Time of the point closer to pointer\n    results.time = minTime;\n\n    return results;\n  };\n\n  elem.mouseleave(() => {\n    if (panel.tooltip?.shared) {\n      const plot = elem.data().plot;\n      if (plot) {\n        $tooltip.detach();\n        plot.unhighlight();\n      }\n    }\n    dashboard.events.publish(new LegacyGraphHoverClearEvent());\n    dashboard.events.publish(new DataHoverClearEvent());\n  });\n\n  elem.bind('plothover', (event: any, pos: { panelRelY: number; pageY: number }, item: any) => {\n    self.show(pos, item);\n\n    // broadcast to other graph panels that we are hovering!\n    if (!dashboard.panelInEdit) {\n      pos.panelRelY = (pos.pageY - elem.offset().top) / elem.height();\n      hoverEvent.payload.pos = pos;\n      hoverEvent.payload.panel = panel;\n      hoverEvent.payload.point['time'] = (pos as any).x;\n      dashboard.events.publish(hoverEvent);\n    }\n  });\n\n  elem.bind('plotclick', (event: any, pos: any, item: any) => {\n    appEvents.emit(CoreEvents.graphClicked, { pos: pos, panel: panel, item: item });\n  });\n\n  elem.bind('plotleave', () => {\n    if (!panel.tooltip.shared) {\n      return;\n    }\n\n    const plot = elem.data().plot;\n    if (plot) {\n      $tooltip.detach();\n      plot.unhighlight();\n    }\n  });\n\n  this.clear = (plot: { clearCrosshair: () => void; unhighlight: () => void }) => {\n    $tooltip.detach();\n    plot.clearCrosshair();\n    plot.unhighlight();\n  };\n\n  this.show = (pos: any, item: any) => {\n    const plot = elem.data().plot;\n    const plotData = plot.getData();\n    const xAxes = plot.getXAxes();\n    const xMode = xAxes[0].options.mode;\n    const seriesList = getSeriesFn();\n    let allSeriesMode = panel.tooltip.shared;\n    let group, value, absoluteTime, hoverInfo, i, series, seriesHtml, tooltipFormat;\n\n    // if panelRelY is defined another panel wants us to show a tooltip\n    // get pageX from position on x axis and pageY from relative position in original panel\n    if (pos.panelRelY) {\n      const pointOffset = plot.pointOffset({ x: pos.x });\n      if (Number.isNaN(pointOffset.left) || pointOffset.left < 0 || pointOffset.left > elem.width()) {\n        self.clear(plot);\n        return;\n      }\n\n      pos.pageX = elem.offset().left + pointOffset.left;\n      pos.pageY = elem.offset().top + elem.height() * pos.panelRelY;\n\n      const scrollTop = $(window).scrollTop() ?? 0;\n      const isVisible = pos.pageY >= scrollTop && pos.pageY <= $(window).innerHeight()! + scrollTop;\n\n      if (!isVisible) {\n        self.clear(plot);\n        return;\n      }\n\n      plot.setCrosshair(pos);\n      allSeriesMode = true;\n\n      if (dashboard.sharedCrosshairModeOnly()) {\n        // if only crosshair mode we are done\n        return;\n      }\n    }\n\n    if (seriesList.length === 0) {\n      return;\n    }\n\n    if (seriesList[0].hasMsResolution) {\n      tooltipFormat = systemDateFormats.fullDateMS;\n    } else {\n      tooltipFormat = systemDateFormats.fullDate;\n    }\n\n    if (allSeriesMode) {\n      plot.unhighlight();\n\n      const seriesHoverInfo = self.getMultiSeriesPlotHoverInfo(plotData, pos);\n\n      seriesHtml = '';\n\n      absoluteTime = dashboard.formatDate(seriesHoverInfo.time, tooltipFormat);\n\n      // Dynamically reorder the hovercard for the current time point if the\n      // option is enabled.\n      if (panel.tooltip.sort === 2) {\n        seriesHoverInfo.sort((a: { value: number }, b: { value: number }) => {\n          return b.value - a.value;\n        });\n      } else if (panel.tooltip.sort === 1) {\n        seriesHoverInfo.sort((a: { value: number }, b: { value: number }) => {\n          return a.value - b.value;\n        });\n      }\n\n      for (i = 0; i < seriesHoverInfo.length; i++) {\n        hoverInfo = seriesHoverInfo[i];\n\n        if (hoverInfo.hidden) {\n          continue;\n        }\n\n        let highlightClass = '';\n        if (item && hoverInfo.index === item.seriesIndex) {\n          highlightClass = 'graph-tooltip-list-item--highlight';\n        }\n\n        series = seriesList[hoverInfo.index];\n        value = textUtil.sanitize(series.formatValue(hoverInfo.value));\n\n        const color = textUtil.sanitize(hoverInfo.color);\n        const label = textUtil.sanitize(hoverInfo.label);\n\n        seriesHtml +=\n          '<div class=\"graph-tooltip-list-item ' + highlightClass + '\"><div class=\"graph-tooltip-series-name\">';\n        seriesHtml += '<i class=\"fa fa-minus\" style=\"color:' + color + ';\"></i> ' + label + ':</div>';\n        seriesHtml += '<div class=\"graph-tooltip-value\">' + value + '</div></div>';\n        plot.highlight(hoverInfo.index, hoverInfo.hoverIndex);\n      }\n\n      self.renderAndShow(absoluteTime, seriesHtml, pos, xMode);\n    } else if (item) {\n      // single series tooltip\n      const color = textUtil.sanitize(item.series.color);\n      series = seriesList[item.seriesIndex];\n      group = '<div class=\"graph-tooltip-list-item\"><div class=\"graph-tooltip-series-name\">';\n      group += '<i class=\"fa fa-minus\" style=\"color:' + color + ';\"></i> ' + series.aliasEscaped + ':</div>';\n\n      if (panel.stack && panel.tooltip.value_type === 'individual') {\n        value = item.datapoint[1] - item.datapoint[2];\n      } else {\n        value = item.datapoint[1];\n      }\n\n      value = textUtil.sanitize(series.formatValue(value));\n      absoluteTime = dashboard.formatDate(item.datapoint[0], tooltipFormat);\n\n      group += '<div class=\"graph-tooltip-value\">' + value + '</div>';\n\n      self.renderAndShow(absoluteTime, group, pos, xMode);\n    } else {\n      // no hit\n      $tooltip.detach();\n    }\n  };\n}\n","import 'vendor/flot/jquery.flot';\nimport $ from 'jquery';\nimport { isNumber } from 'lodash';\nimport { getColorForTheme } from '@grafana/data';\nimport { CoreEvents } from 'app/types';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport { config } from 'app/core/config';\n\nexport class ThresholdManager {\n  plot: any;\n  placeholder: any;\n  height: any;\n  thresholds: any;\n  needsCleanup = false;\n  hasSecondYAxis: any;\n\n  constructor(private panelCtrl: PanelCtrl) {}\n\n  getHandleHtml(handleIndex: any, model: { colorMode: string }, valueStr: any) {\n    let stateClass = model.colorMode;\n    if (model.colorMode === 'custom') {\n      stateClass = 'critical';\n    }\n\n    return `\n    <div class=\"alert-handle-wrapper alert-handle-wrapper--T${handleIndex}\">\n      <div class=\"alert-handle-line alert-handle-line--${stateClass}\">\n      </div>\n      <div class=\"alert-handle\" data-handle-index=\"${handleIndex}\">\n        <i class=\"icon-gf icon-gf-${stateClass} alert-state-${stateClass}\"></i>\n        <span class=\"alert-handle-value\">${valueStr}<i class=\"alert-handle-grip\"></i></span>\n      </div>\n    </div>`;\n  }\n\n  initDragging(evt: any) {\n    const handleElem = $(evt.currentTarget).parents('.alert-handle-wrapper');\n    const handleIndex = $(evt.currentTarget).data('handleIndex');\n\n    let lastY: number | null = null;\n    let posTop: number;\n    const plot = this.plot;\n    const panelCtrl = this.panelCtrl;\n    const model = this.thresholds[handleIndex];\n\n    function dragging(evt: any) {\n      if (lastY === null) {\n        lastY = evt.clientY;\n      } else {\n        const diff = evt.clientY - lastY;\n        posTop = posTop + diff;\n        lastY = evt.clientY;\n        handleElem.css({ top: posTop + diff });\n      }\n    }\n\n    function stopped() {\n      // calculate graph level\n      let graphValue = plot.c2p({ left: 0, top: posTop }).y;\n      graphValue = parseInt(graphValue.toFixed(0), 10);\n      model.value = graphValue;\n\n      handleElem.off('mousemove', dragging);\n      document.removeEventListener('mouseup', stopped);\n\n      // trigger digest and render\n      panelCtrl.$scope.$apply(() => {\n        panelCtrl.render();\n        panelCtrl.events.emit(CoreEvents.thresholdChanged, {\n          threshold: model,\n          handleIndex: handleIndex,\n        });\n      });\n    }\n\n    lastY = null;\n    posTop = handleElem.position().top;\n\n    handleElem.on('mousemove', dragging);\n    document.addEventListener('mouseup', stopped);\n  }\n\n  cleanUp() {\n    this.placeholder.find('.alert-handle-wrapper').remove();\n    this.needsCleanup = false;\n  }\n\n  renderHandle(handleIndex: number, defaultHandleTopPos: number) {\n    const model = this.thresholds[handleIndex];\n    // alerting defines\n    if (!model.visible && (this.panelCtrl as any).alert) {\n      return;\n    }\n\n    const value = model.value;\n    let valueStr = value;\n    let handleTopPos = 0;\n\n    // handle no value\n    if (!isNumber(value)) {\n      valueStr = '';\n      handleTopPos = defaultHandleTopPos;\n    } else {\n      const valueCanvasPos = this.plot.p2c({ x: 0, y: value });\n      handleTopPos = Math.round(Math.min(Math.max(valueCanvasPos.top, 0), this.height) - 6);\n    }\n\n    const handleElem = $(this.getHandleHtml(handleIndex, model, valueStr));\n    this.placeholder.append(handleElem);\n\n    handleElem.toggleClass('alert-handle-wrapper--no-value', valueStr === '');\n    handleElem.css({ top: handleTopPos });\n  }\n\n  shouldDrawHandles() {\n    // @ts-ignore\n    return !this.hasSecondYAxis && this.panelCtrl.editingThresholds && this.panelCtrl.panel.thresholds.length > 0;\n  }\n\n  prepare(elem: JQuery, data: any[]) {\n    this.hasSecondYAxis = false;\n    for (let i = 0; i < data.length; i++) {\n      if (data[i].yaxis > 1) {\n        this.hasSecondYAxis = true;\n        break;\n      }\n    }\n\n    if (this.shouldDrawHandles()) {\n      const thresholdMargin = this.panelCtrl.panel.thresholds.length > 1 ? '220px' : '110px';\n      elem.css('margin-right', thresholdMargin);\n    } else if (this.needsCleanup) {\n      elem.css('margin-right', '0');\n    }\n  }\n\n  draw(plot: any) {\n    this.thresholds = this.panelCtrl.panel.thresholds;\n    this.plot = plot;\n    this.placeholder = plot.getPlaceholder();\n\n    if (this.needsCleanup) {\n      this.cleanUp();\n    }\n\n    if (!this.shouldDrawHandles()) {\n      return;\n    }\n\n    this.height = plot.height();\n\n    if (this.thresholds.length > 0) {\n      this.renderHandle(0, 10);\n    }\n    if (this.thresholds.length > 1) {\n      this.renderHandle(1, this.height - 30);\n    }\n\n    this.placeholder.off('mousedown', '.alert-handle');\n    this.placeholder.on('mousedown', '.alert-handle', this.initDragging.bind(this));\n    this.needsCleanup = true;\n  }\n\n  addFlotOptions(options: any, panel: any) {\n    if (!panel.thresholds || panel.thresholds.length === 0) {\n      return;\n    }\n\n    let gtLimit = Infinity;\n    let ltLimit = -Infinity;\n    let i, threshold, other;\n\n    for (i = 0; i < panel.thresholds.length; i++) {\n      threshold = panel.thresholds[i];\n      if (!isNumber(threshold.value)) {\n        continue;\n      }\n\n      let limit;\n      switch (threshold.op) {\n        case 'gt': {\n          limit = gtLimit;\n          // if next threshold is less then op and greater value, then use that as limit\n          if (panel.thresholds.length > i + 1) {\n            other = panel.thresholds[i + 1];\n            if (other.value > threshold.value) {\n              limit = other.value;\n              ltLimit = limit;\n            }\n          }\n          break;\n        }\n        case 'lt': {\n          limit = ltLimit;\n          // if next threshold is less then op and greater value, then use that as limit\n          if (panel.thresholds.length > i + 1) {\n            other = panel.thresholds[i + 1];\n            if (other.value < threshold.value) {\n              limit = other.value;\n              gtLimit = limit;\n            }\n          }\n          break;\n        }\n      }\n\n      let fillColor, lineColor;\n\n      switch (threshold.colorMode) {\n        case 'critical': {\n          fillColor = 'rgba(234, 112, 112, 0.12)';\n          lineColor = 'rgba(237, 46, 24, 0.60)';\n          break;\n        }\n        case 'warning': {\n          fillColor = 'rgba(235, 138, 14, 0.12)';\n          lineColor = 'rgba(247, 149, 32, 0.60)';\n          break;\n        }\n        case 'ok': {\n          fillColor = 'rgba(11, 237, 50, 0.090)';\n          lineColor = 'rgba(6,163,69, 0.60)';\n          break;\n        }\n        case 'custom': {\n          fillColor = threshold.fillColor;\n          lineColor = threshold.lineColor;\n          break;\n        }\n      }\n\n      // fill\n      if (threshold.fill) {\n        if (threshold.yaxis === 'right' && this.hasSecondYAxis) {\n          options.grid.markings.push({\n            y2axis: { from: threshold.value, to: limit },\n            color: getColorForTheme(fillColor, config.theme),\n          });\n        } else {\n          options.grid.markings.push({\n            yaxis: { from: threshold.value, to: limit },\n            color: getColorForTheme(fillColor, config.theme),\n          });\n        }\n      }\n      if (threshold.line) {\n        if (threshold.yaxis === 'right' && this.hasSecondYAxis) {\n          options.grid.markings.push({\n            y2axis: { from: threshold.value, to: threshold.value },\n            color: getColorForTheme(lineColor, config.theme),\n          });\n        } else {\n          options.grid.markings.push({\n            yaxis: { from: threshold.value, to: threshold.value },\n            color: getColorForTheme(lineColor, config.theme),\n          });\n        }\n      }\n    }\n  }\n}\n","import 'vendor/flot/jquery.flot';\nimport { map } from 'lodash';\nimport { getColorForTheme, dateTime, DateTime, AbsoluteTimeRange, GrafanaTheme } from '@grafana/data';\nimport { config } from 'app/core/config';\n\ntype TimeRegionColorDefinition = {\n  fill: string | null;\n  line: string | null;\n};\n\nexport const colorModes: any = {\n  gray: {\n    themeDependent: true,\n    title: 'Gray',\n    darkColor: { fill: 'rgba(255, 255, 255, 0.09)', line: 'rgba(255, 255, 255, 0.2)' },\n    lightColor: { fill: 'rgba(0, 0, 0, 0.09)', line: 'rgba(0, 0, 0, 0.2)' },\n  },\n  red: {\n    title: 'Red',\n    color: { fill: 'rgba(234, 112, 112, 0.12)', line: 'rgba(237, 46, 24, 0.60)' },\n  },\n  green: {\n    title: 'Green',\n    color: { fill: 'rgba(11, 237, 50, 0.090)', line: 'rgba(6,163,69, 0.60)' },\n  },\n  blue: {\n    title: 'Blue',\n    color: { fill: 'rgba(11, 125, 238, 0.12)', line: 'rgba(11, 125, 238, 0.60)' },\n  },\n  yellow: {\n    title: 'Yellow',\n    color: { fill: 'rgba(235, 138, 14, 0.12)', line: 'rgba(247, 149, 32, 0.60)' },\n  },\n  custom: { title: 'Custom' },\n};\n\nexport function getColorModes() {\n  return map(Object.keys(colorModes), (key) => {\n    return {\n      key,\n      value: colorModes[key].title,\n    };\n  });\n}\n\nfunction getColor(timeRegion: any, theme: GrafanaTheme): TimeRegionColorDefinition {\n  if (Object.keys(colorModes).indexOf(timeRegion.colorMode) === -1) {\n    timeRegion.colorMode = 'red';\n  }\n\n  if (timeRegion.colorMode === 'custom') {\n    return {\n      fill: timeRegion.fill && timeRegion.fillColor ? getColorForTheme(timeRegion.fillColor, theme) : null,\n      line: timeRegion.line && timeRegion.lineColor ? getColorForTheme(timeRegion.lineColor, theme) : null,\n    };\n  }\n\n  const colorMode = colorModes[timeRegion.colorMode];\n\n  if (colorMode.themeDependent === true) {\n    return theme.isLight ? colorMode.lightColor : colorMode.darkColor;\n  }\n\n  return {\n    fill: timeRegion.fill ? getColorForTheme(colorMode.color.fill, theme) : null,\n    line: timeRegion.fill ? getColorForTheme(colorMode.color.line, theme) : null,\n  };\n}\n\nexport class TimeRegionManager {\n  plot: any;\n  timeRegions: any;\n\n  constructor(private panelCtrl: any) {}\n\n  draw(plot: any) {\n    this.timeRegions = this.panelCtrl.panel.timeRegions;\n    this.plot = plot;\n  }\n\n  addFlotOptions(options: any, panel: any) {\n    if (!panel.timeRegions || panel.timeRegions.length === 0) {\n      return;\n    }\n\n    const tRange = {\n      from: dateTime(this.panelCtrl.range.from).utc(),\n      to: dateTime(this.panelCtrl.range.to).utc(),\n    };\n\n    let i: number,\n      hRange: { from: any; to: any },\n      timeRegion: any,\n      regions: AbsoluteTimeRange[],\n      fromStart: DateTime,\n      fromEnd: DateTime,\n      timeRegionColor: TimeRegionColorDefinition;\n\n    const timeRegionsCopy = panel.timeRegions.map((a: any) => ({ ...a }));\n\n    for (i = 0; i < timeRegionsCopy.length; i++) {\n      timeRegion = timeRegionsCopy[i];\n\n      if (!(timeRegion.fromDayOfWeek || timeRegion.from) && !(timeRegion.toDayOfWeek || timeRegion.to)) {\n        continue;\n      }\n\n      if (timeRegion.from && !timeRegion.to) {\n        timeRegion.to = timeRegion.from;\n      }\n\n      if (!timeRegion.from && timeRegion.to) {\n        timeRegion.from = timeRegion.to;\n      }\n\n      hRange = {\n        from: this.parseTimeRange(timeRegion.from),\n        to: this.parseTimeRange(timeRegion.to),\n      };\n\n      if (!timeRegion.fromDayOfWeek && timeRegion.toDayOfWeek) {\n        timeRegion.fromDayOfWeek = timeRegion.toDayOfWeek;\n      }\n\n      if (!timeRegion.toDayOfWeek && timeRegion.fromDayOfWeek) {\n        timeRegion.toDayOfWeek = timeRegion.fromDayOfWeek;\n      }\n\n      if (timeRegion.fromDayOfWeek) {\n        hRange.from.dayOfWeek = Number(timeRegion.fromDayOfWeek);\n      }\n\n      if (timeRegion.toDayOfWeek) {\n        hRange.to.dayOfWeek = Number(timeRegion.toDayOfWeek);\n      }\n\n      if (hRange.from.dayOfWeek && hRange.from.h === null && hRange.from.m === null) {\n        hRange.from.h = 0;\n        hRange.from.m = 0;\n        hRange.from.s = 0;\n      }\n\n      if (hRange.to.dayOfWeek && hRange.to.h === null && hRange.to.m === null) {\n        hRange.to.h = 23;\n        hRange.to.m = 59;\n        hRange.to.s = 59;\n      }\n\n      if (!hRange.from || !hRange.to) {\n        continue;\n      }\n\n      regions = [];\n\n      fromStart = dateTime(tRange.from);\n      fromStart.set('hour', 0);\n      fromStart.set('minute', 0);\n      fromStart.set('second', 0);\n      fromStart.add(hRange.from.h, 'hours');\n      fromStart.add(hRange.from.m, 'minutes');\n      fromStart.add(hRange.from.s, 'seconds');\n\n      while (fromStart.unix() <= tRange.to.unix()) {\n        while (hRange.from.dayOfWeek && hRange.from.dayOfWeek !== fromStart.isoWeekday()) {\n          fromStart.add(24, 'hours');\n        }\n\n        if (fromStart.unix() > tRange.to.unix()) {\n          break;\n        }\n\n        fromEnd = dateTime(fromStart);\n\n        if (fromEnd.hour) {\n          if (hRange.from.h <= hRange.to.h) {\n            fromEnd.add(hRange.to.h - hRange.from.h, 'hours');\n          } else if (hRange.from.h > hRange.to.h) {\n            while (fromEnd.hour() !== hRange.to.h) {\n              fromEnd.add(1, 'hours');\n            }\n          } else {\n            fromEnd.add(24 - hRange.from.h, 'hours');\n\n            while (fromEnd.hour() !== hRange.to.h) {\n              fromEnd.add(1, 'hours');\n            }\n          }\n        }\n\n        fromEnd.set('minute', hRange.to.m);\n        fromEnd.set('second', hRange.to.s);\n\n        while (hRange.to.dayOfWeek && hRange.to.dayOfWeek !== fromEnd.isoWeekday()) {\n          fromEnd.add(24, 'hours');\n        }\n\n        const outsideRange =\n          (fromStart.unix() < tRange.from.unix() && fromEnd.unix() < tRange.from.unix()) ||\n          (fromStart.unix() > tRange.to.unix() && fromEnd.unix() > tRange.to.unix());\n\n        if (!outsideRange) {\n          regions.push({ from: fromStart.valueOf(), to: fromEnd.valueOf() });\n        }\n\n        fromStart.add(24, 'hours');\n      }\n\n      timeRegionColor = getColor(timeRegion, config.theme);\n\n      for (let j = 0; j < regions.length; j++) {\n        const r = regions[j];\n        if (timeRegion.fill) {\n          options.grid.markings.push({\n            xaxis: { from: r.from, to: r.to },\n            color: timeRegionColor.fill,\n          });\n        }\n\n        if (timeRegion.line) {\n          options.grid.markings.push({\n            xaxis: { from: r.from, to: r.from },\n            color: timeRegionColor.line,\n          });\n          options.grid.markings.push({\n            xaxis: { from: r.to, to: r.to },\n            color: timeRegionColor.line,\n          });\n        }\n      }\n    }\n  }\n\n  parseTimeRange(str: string) {\n    const timeRegex = /^([\\d]+):?(\\d{2})?/;\n    const result: any = { h: null, m: null };\n    const match = timeRegex.exec(str);\n\n    if (!match) {\n      return result;\n    }\n\n    if (match.length > 1) {\n      result.h = Number(match[1]);\n      result.m = 0;\n\n      if (match.length > 2 && match[2] !== undefined) {\n        result.m = Number(match[2]);\n      }\n\n      if (result.h > 23) {\n        result.h = 23;\n      }\n\n      if (result.m > 59) {\n        result.m = 59;\n      }\n    }\n\n    return result;\n  }\n}\n","import { each, filter, keys } from 'lodash';\nimport tinycolor from 'tinycolor2';\nimport {\n  ALERTING_COLOR,\n  DEFAULT_ANNOTATION_COLOR,\n  NO_DATA_COLOR,\n  OK_COLOR,\n  PENDING_COLOR,\n  REGION_FILL_ALPHA,\n} from '@grafana/ui';\nimport { MetricsPanelCtrl } from 'app/angular/panel/metrics_panel_ctrl';\n\nimport { AnnotationEvent } from '@grafana/data';\n\nexport class EventManager {\n  event: AnnotationEvent | null = null;\n  editorOpen = false;\n\n  constructor(private panelCtrl: MetricsPanelCtrl) {}\n\n  editorClosed() {\n    this.event = null;\n    this.editorOpen = false;\n    this.panelCtrl.render();\n  }\n\n  editorOpened() {\n    this.editorOpen = true;\n  }\n\n  updateTime(range: { from: any; to: any }) {\n    if (!this.event) {\n      this.event = {};\n      this.event.dashboardId = this.panelCtrl.dashboard.id;\n      this.event.panelId = this.panelCtrl.panel.id;\n    }\n\n    // update time\n    this.event.time = range.from;\n    this.event.isRegion = false;\n\n    if (range.to) {\n      this.event.timeEnd = range.to;\n      this.event.isRegion = true;\n    }\n\n    this.panelCtrl.render();\n  }\n\n  editEvent(event: AnnotationEvent, elem?: any) {\n    this.event = event;\n    this.panelCtrl.render();\n  }\n\n  addFlotEvents(annotations: any, flotOptions: any) {\n    if (!this.event && annotations.length === 0) {\n      return;\n    }\n\n    const types: any = {\n      $__alerting: {\n        color: ALERTING_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__ok: {\n        color: OK_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__no_data: {\n        color: NO_DATA_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__pending: {\n        color: PENDING_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n      $__editing: {\n        color: DEFAULT_ANNOTATION_COLOR,\n        position: 'BOTTOM',\n        markerSize: 5,\n      },\n    };\n\n    if (this.event) {\n      if (this.event.isRegion) {\n        annotations = [\n          {\n            isRegion: true,\n            min: this.event.time,\n            timeEnd: this.event.timeEnd,\n            text: this.event.text,\n            eventType: '$__editing',\n            editModel: this.event,\n          },\n        ];\n      } else {\n        annotations = [\n          {\n            min: this.event.time,\n            text: this.event.text,\n            editModel: this.event,\n            eventType: '$__editing',\n          },\n        ];\n      }\n    } else {\n      // annotations from query\n      for (let i = 0; i < annotations.length; i++) {\n        const item = annotations[i];\n\n        // add properties used by jquery flot events\n        item.min = item.time;\n        item.max = item.time;\n        item.eventType = item.type;\n\n        if (item.newState) {\n          item.eventType = '$__' + item.newState;\n          continue;\n        }\n\n        if (!types[item.type]) {\n          types[item.type] = {\n            color: item.color,\n            position: 'BOTTOM',\n            markerSize: 5,\n          };\n        }\n      }\n    }\n\n    const regions = getRegions(annotations);\n    addRegionMarking(regions, flotOptions);\n\n    const eventSectionHeight = 20;\n    const eventSectionMargin = 7;\n    flotOptions.grid.eventSectionHeight = eventSectionMargin;\n    flotOptions.xaxis.eventSectionHeight = eventSectionHeight;\n\n    flotOptions.events = {\n      levels: keys(types).length + 1,\n      data: annotations,\n      types: types,\n      manager: this,\n    };\n  }\n}\n\nfunction getRegions(events: AnnotationEvent[]) {\n  return filter(events, 'isRegion');\n}\n\nfunction addRegionMarking(regions: any[], flotOptions: { grid: { markings: any } }) {\n  const markings = flotOptions.grid.markings;\n  const defaultColor = DEFAULT_ANNOTATION_COLOR;\n  let fillColor;\n\n  each(regions, (region) => {\n    if (region.source) {\n      fillColor = region.color || defaultColor;\n    } else {\n      fillColor = defaultColor;\n    }\n\n    fillColor = addAlphaToRGB(fillColor, REGION_FILL_ALPHA);\n    markings.push({\n      xaxis: { from: region.min, to: region.timeEnd },\n      color: fillColor,\n    });\n  });\n}\n\nfunction addAlphaToRGB(colorString: string, alpha: number): string {\n  const color = tinycolor(colorString);\n  if (color.isValid()) {\n    color.setAlpha(alpha);\n    return color.toRgbString();\n  } else {\n    return colorString;\n  }\n}\n","import TimeSeries from 'app/core/time_series2';\nimport { histogram } from 'd3';\n\n/**\n * Convert series into array of series values.\n * @param data Array of series\n */\nexport function getSeriesValues(dataList: TimeSeries[]): number[] {\n  const VALUE_INDEX = 0;\n  const values = [];\n\n  // Count histogam stats\n  for (let i = 0; i < dataList.length; i++) {\n    const series = dataList[i];\n    const datapoints = series.datapoints;\n    for (let j = 0; j < datapoints.length; j++) {\n      if (datapoints[j][VALUE_INDEX] !== null) {\n        values.push(datapoints[j][VALUE_INDEX]);\n      }\n    }\n  }\n\n  return values;\n}\n\n/**\n * Convert array of values into timeseries-like histogram:\n * [[val_1, count_1], [val_2, count_2], ..., [val_n, count_n]]\n * @param values\n * @param bucketSize\n */\nexport function convertValuesToHistogram(values: number[], bucketSize: number, min: number, max: number): any[] {\n  const minBound = getBucketBound(min, bucketSize);\n  const maxBound = getBucketBound(max, bucketSize);\n\n  const histGenerator = histogram()\n    .domain([minBound, maxBound])\n    .thresholds(Math.round(max - min) / bucketSize);\n\n  return histGenerator(values).map((bin) => {\n    return [bin.x0, bin.length];\n  });\n}\n\n/**\n * Convert series into array of histogram data.\n * @param data Array of series\n * @param bucketSize\n */\nexport function convertToHistogramData(\n  data: any,\n  bucketSize: number,\n  hiddenSeries: any,\n  min: number,\n  max: number\n): any[] {\n  return data.map((series: any) => {\n    const values = getSeriesValues([series]);\n    series.histogram = true;\n    if (!hiddenSeries[series.alias]) {\n      const histogram = convertValuesToHistogram(values, bucketSize, min, max);\n      series.data = histogram;\n    } else {\n      series.data = [];\n    }\n    return series;\n  });\n}\n\nfunction getBucketBound(value: number, bucketSize: number): number {\n  return Math.floor(value / bucketSize) * bucketSize;\n}\n","/**\n * To align two Y axes by Y level\n * @param yAxes data [{min: min_y1, min: max_y1}, {min: min_y2, max: max_y2}]\n * @param level Y level\n */\nexport function alignYLevel(yAxes: any, level: any) {\n  if (isNaN(level) || !checkCorrectAxis(yAxes)) {\n    return;\n  }\n\n  const [yLeft, yRight] = yAxes;\n  moveLevelToZero(yLeft, yRight, level);\n\n  expandStuckValues(yLeft, yRight);\n\n  // one of graphs on zero\n  const zero = yLeft.min === 0 || yRight.min === 0 || yLeft.max === 0 || yRight.max === 0;\n\n  const oneSide = checkOneSide(yLeft, yRight);\n\n  if (zero && oneSide) {\n    yLeft.min = yLeft.max > 0 ? 0 : yLeft.min;\n    yLeft.max = yLeft.max > 0 ? yLeft.max : 0;\n    yRight.min = yRight.max > 0 ? 0 : yRight.min;\n    yRight.max = yRight.max > 0 ? yRight.max : 0;\n  } else {\n    if (checkOppositeSides(yLeft, yRight)) {\n      if (yLeft.min >= 0) {\n        yLeft.min = -yLeft.max;\n        yRight.max = -yRight.min;\n      } else {\n        yLeft.max = -yLeft.min;\n        yRight.min = -yRight.max;\n      }\n    } else {\n      const rate = getRate(yLeft, yRight);\n\n      if (oneSide) {\n        // all graphs above the Y level\n        if (yLeft.min > 0) {\n          yLeft.min = yLeft.max / rate;\n          yRight.min = yRight.max / rate;\n        } else {\n          yLeft.max = yLeft.min / rate;\n          yRight.max = yRight.min / rate;\n        }\n      } else {\n        if (checkTwoCross(yLeft, yRight)) {\n          yLeft.min = yRight.min ? yRight.min * rate : yLeft.min;\n          yRight.min = yLeft.min ? yLeft.min / rate : yRight.min;\n          yLeft.max = yRight.max ? yRight.max * rate : yLeft.max;\n          yRight.max = yLeft.max ? yLeft.max / rate : yRight.max;\n        } else {\n          yLeft.min = yLeft.min > 0 ? yRight.min * rate : yLeft.min;\n          yRight.min = yRight.min > 0 ? yLeft.min / rate : yRight.min;\n          yLeft.max = yLeft.max < 0 ? yRight.max * rate : yLeft.max;\n          yRight.max = yRight.max < 0 ? yLeft.max / rate : yRight.max;\n        }\n      }\n    }\n  }\n\n  restoreLevelFromZero(yLeft, yRight, level);\n}\n\nfunction expandStuckValues(yLeft: { max: number; min: number }, yRight: { max: number; min: number }) {\n  // wide Y min and max using increased wideFactor\n  const wideFactor = 0.25;\n  if (yLeft.max === yLeft.min) {\n    yLeft.min -= wideFactor;\n    yLeft.max += wideFactor;\n  }\n  if (yRight.max === yRight.min) {\n    yRight.min -= wideFactor;\n    yRight.max += wideFactor;\n  }\n}\n\nfunction moveLevelToZero(yLeft: { min: number; max: number }, yRight: { min: number; max: number }, level: number) {\n  if (level !== 0) {\n    yLeft.min -= level;\n    yLeft.max -= level;\n    yRight.min -= level;\n    yRight.max -= level;\n  }\n}\n\nfunction restoreLevelFromZero(\n  yLeft: { min: number; max: number },\n  yRight: { min: number; max: number },\n  level: number\n) {\n  if (level !== 0) {\n    yLeft.min += level;\n    yLeft.max += level;\n    yRight.min += level;\n    yRight.max += level;\n  }\n}\n\ninterface AxisSide {\n  max: number;\n  min: number;\n}\n\nfunction checkCorrectAxis(axis: any[]): boolean {\n  return axis.length === 2 && checkCorrectAxes(axis[0]) && checkCorrectAxes(axis[1]);\n}\n\nfunction checkCorrectAxes(axes: any): boolean {\n  return 'min' in axes && 'max' in axes;\n}\n\nfunction checkOneSide(yLeft: AxisSide, yRight: AxisSide): boolean {\n  // on the one hand with respect to zero\n  return (yLeft.min >= 0 && yRight.min >= 0) || (yLeft.max <= 0 && yRight.max <= 0);\n}\n\nfunction checkTwoCross(yLeft: AxisSide, yRight: AxisSide): boolean {\n  // both across zero\n  return yLeft.min <= 0 && yLeft.max >= 0 && yRight.min <= 0 && yRight.max >= 0;\n}\n\nfunction checkOppositeSides(yLeft: AxisSide, yRight: AxisSide): boolean {\n  // on the opposite sides with respect to zero\n  return (yLeft.min >= 0 && yRight.max <= 0) || (yLeft.max <= 0 && yRight.min >= 0);\n}\n\nfunction getRate(yLeft: AxisSide, yRight: AxisSide): number {\n  if (checkTwoCross(yLeft, yRight)) {\n    const rateLeft = yRight.min ? yLeft.min / yRight.min : 0;\n    const rateRight = yRight.max ? yLeft.max / yRight.max : 0;\n\n    return rateLeft > rateRight ? rateLeft : rateRight;\n  }\n\n  if (checkOneSide(yLeft, yRight)) {\n    const absLeftMin = Math.abs(yLeft.min);\n    const absLeftMax = Math.abs(yLeft.max);\n    const absRightMin = Math.abs(yRight.min);\n    const absRightMax = Math.abs(yRight.max);\n    const upLeft = Math.max(absLeftMin, absLeftMax);\n    const downLeft = Math.min(absLeftMin, absLeftMax);\n    const upRight = Math.max(absRightMin, absRightMax);\n    const downRight = Math.min(absRightMin, absRightMax);\n\n    const rateLeft = downLeft !== 0 ? upLeft / downLeft : upLeft;\n    const rateRight = downRight !== 0 ? upRight / downRight : upRight;\n\n    return rateLeft > rateRight ? rateLeft : rateRight;\n  }\n\n  if (yLeft.min > 0 || yRight.min > 0) {\n    return yLeft.max / yRight.max;\n  } else {\n    return yLeft.min / yRight.min;\n  }\n}\n","import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { TimeSeries } from 'app/core/core';\nimport { SeriesColorPicker, SeriesIcon } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nexport const LEGEND_STATS = ['min', 'max', 'avg', 'current', 'total'] as const;\nexport type LegendStat = typeof LEGEND_STATS[number];\n\nexport interface LegendLabelProps {\n  series: TimeSeries;\n  asTable?: boolean;\n  hidden?: boolean;\n  onLabelClick: (series: any, event: any) => void;\n  onColorChange: (series: any, color: string) => void;\n  onToggleAxis: (series: any) => void;\n}\n\nexport interface LegendValuesProps {\n  values?: boolean;\n  min?: boolean;\n  max?: boolean;\n  avg?: boolean;\n  current?: boolean;\n  total?: boolean;\n}\n\ntype LegendItemProps = LegendLabelProps & LegendValuesProps;\n\ninterface LegendItemState {\n  yaxis: number;\n}\n\nexport class LegendItem extends PureComponent<LegendItemProps, LegendItemState> {\n  static defaultProps = {\n    asTable: false,\n    hidden: false,\n    onLabelClick: () => {},\n    onColorChange: () => {},\n    onToggleAxis: () => {},\n  };\n\n  constructor(props: LegendItemProps) {\n    super(props);\n    this.state = {\n      yaxis: this.props.series.yaxis,\n    };\n  }\n\n  onLabelClick = (e: any) => this.props.onLabelClick(this.props.series, e);\n\n  onToggleAxis = () => {\n    const yaxis = this.state.yaxis === 2 ? 1 : 2;\n    const info = { alias: this.props.series.alias, yaxis: yaxis };\n    this.setState({ yaxis: yaxis });\n    this.props.onToggleAxis(info);\n  };\n\n  onColorChange = (color: string) => {\n    this.props.onColorChange(this.props.series, color);\n    // Because of PureComponent nature it makes only shallow props comparison and changing of series.color doesn't run\n    // component re-render. In this case we can't rely on color, selected by user, because it may be overwritten\n    // by series overrides. So we need to use forceUpdate() to make sure we have proper series color.\n    this.forceUpdate();\n  };\n\n  renderLegendValues() {\n    const { series, asTable } = this.props;\n    const legendValueItems = [];\n    for (const valueName of LEGEND_STATS) {\n      // @ts-ignore\n      if (this.props[valueName]) {\n        const valueFormatted = series.formatValue(series.stats[valueName]);\n        legendValueItems.push(\n          <LegendValue\n            key={valueName}\n            valueName={valueName}\n            value={valueFormatted}\n            asTable={asTable}\n            onValueClick={this.onLabelClick}\n          />\n        );\n      }\n    }\n    return legendValueItems;\n  }\n\n  render() {\n    const { series, values, asTable, hidden } = this.props;\n    const seriesOptionClasses = classNames({\n      'graph-legend-series-hidden': hidden,\n      'graph-legend-series--right-y': series.yaxis === 2,\n    });\n    const valueItems = values ? this.renderLegendValues() : [];\n    const seriesLabel = (\n      <LegendSeriesLabel\n        label={series.alias}\n        color={series.color}\n        yaxis={this.state.yaxis}\n        onLabelClick={this.onLabelClick}\n        onColorChange={this.onColorChange}\n        onToggleAxis={this.onToggleAxis}\n      />\n    );\n\n    if (asTable) {\n      return (\n        <tr className={`graph-legend-series ${seriesOptionClasses}`}>\n          <td>\n            <div className=\"graph-legend-series__table-name\">{seriesLabel}</div>\n          </td>\n          {valueItems}\n        </tr>\n      );\n    } else {\n      return (\n        <div className={`graph-legend-series ${seriesOptionClasses}`}>\n          {seriesLabel}\n          {valueItems}\n        </div>\n      );\n    }\n  }\n}\n\ninterface LegendSeriesLabelProps {\n  label: string;\n  color: string;\n  yaxis?: number;\n  onLabelClick: (event: any) => void;\n}\n\nclass LegendSeriesLabel extends PureComponent<LegendSeriesLabelProps & LegendSeriesIconProps> {\n  static defaultProps: Partial<LegendSeriesLabelProps> = {\n    yaxis: undefined,\n    onLabelClick: () => {},\n  };\n\n  render() {\n    const { label, color, yaxis } = this.props;\n    const { onColorChange, onToggleAxis } = this.props;\n    const onLabelClick = this.props.onLabelClick ? this.props.onLabelClick : () => {};\n\n    return [\n      <LegendSeriesIcon\n        key=\"icon\"\n        color={color}\n        yaxis={yaxis}\n        onColorChange={onColorChange}\n        onToggleAxis={onToggleAxis}\n      />,\n      <a\n        className=\"graph-legend-alias pointer\"\n        title={label}\n        key=\"label\"\n        onClick={onLabelClick}\n        aria-label={selectors.components.Panels.Visualization.Graph.Legend.legendItemAlias(label)}\n      >\n        {label}\n      </a>,\n    ];\n  }\n}\n\ninterface LegendSeriesIconProps {\n  color: string;\n  yaxis?: number;\n  onColorChange?: (color: string) => void;\n  onToggleAxis?: () => void;\n}\n\ninterface LegendSeriesIconState {\n  color: string;\n}\n\nclass LegendSeriesIcon extends PureComponent<LegendSeriesIconProps, LegendSeriesIconState> {\n  static defaultProps: Partial<LegendSeriesIconProps> = {\n    yaxis: undefined,\n    onColorChange: () => {},\n    onToggleAxis: () => {},\n  };\n\n  onColorChange = (color: string) => {\n    const { onColorChange } = this.props;\n    if (onColorChange) {\n      onColorChange(color);\n    }\n  };\n  render() {\n    return (\n      <SeriesColorPicker\n        yaxis={this.props.yaxis}\n        color={this.props.color}\n        onChange={this.onColorChange}\n        onToggleAxis={this.props.onToggleAxis}\n        enableNamedColors\n      >\n        {({ ref, showColorPicker, hideColorPicker }) => (\n          <SeriesIcon\n            color={this.props.color}\n            ref={ref}\n            onClick={showColorPicker}\n            onMouseLeave={hideColorPicker}\n            className=\"graph-legend-icon\"\n          />\n        )}\n      </SeriesColorPicker>\n    );\n  }\n}\n\ninterface LegendValueProps {\n  value: string;\n  valueName: string;\n  asTable?: boolean;\n  onValueClick?: (event: any) => void;\n}\n\nfunction LegendValue({ value, valueName, asTable, onValueClick }: LegendValueProps) {\n  if (asTable) {\n    return (\n      <td className={`graph-legend-value ${valueName}`} onClick={onValueClick}>\n        {value}\n      </td>\n    );\n  }\n  return (\n    <div className={`graph-legend-value ${valueName}`} onClick={onValueClick}>\n      {value}\n    </div>\n  );\n}\n","import { sortBy as _sortBy } from 'lodash';\nimport React, { PureComponent } from 'react';\nimport { TimeSeries } from 'app/core/core';\nimport { CustomScrollbar, Icon } from '@grafana/ui';\nimport { LegendStat, LegendItem, LEGEND_STATS } from './LegendSeriesItem';\n\ninterface LegendProps {\n  seriesList: TimeSeries[];\n  optionalClass?: string;\n}\n\ninterface LegendEventHandlers {\n  onToggleSeries?: (hiddenSeries: any) => void;\n  onToggleSort?: (sortBy: any, sortDesc: any) => void;\n  onToggleAxis?: (series: TimeSeries) => void;\n  onColorChange?: (series: TimeSeries, color: string) => void;\n}\n\ninterface LegendComponentEventHandlers {\n  onToggleSeries?: (series: TimeSeries, event: any) => void;\n  onToggleSort?: (sortBy: LegendStat | undefined, sortDesc: any) => void;\n  onToggleAxis?: (series: TimeSeries) => void;\n  onColorChange?: (series: TimeSeries, color: string) => void;\n}\n\ninterface LegendDisplayProps {\n  hiddenSeries: any;\n  hideEmpty?: boolean;\n  hideZero?: boolean;\n  alignAsTable?: boolean;\n  rightSide?: boolean;\n  sideWidth?: number;\n}\n\ninterface LegendValuesProps {\n  values?: boolean;\n  min?: boolean;\n  max?: boolean;\n  avg?: boolean;\n  current?: boolean;\n  total?: boolean;\n}\n\ninterface LegendSortProps {\n  sort?: LegendStat;\n  sortDesc?: boolean;\n}\n\nexport type GraphLegendProps = LegendProps &\n  LegendDisplayProps &\n  LegendValuesProps &\n  LegendSortProps &\n  LegendEventHandlers;\nexport type LegendComponentProps = LegendProps &\n  LegendDisplayProps &\n  LegendValuesProps &\n  LegendSortProps &\n  LegendComponentEventHandlers;\n\ninterface LegendState {\n  hiddenSeries: { [seriesAlias: string]: boolean };\n}\n\nexport class GraphLegend extends PureComponent<GraphLegendProps, LegendState> {\n  static defaultProps: Partial<GraphLegendProps> = {\n    values: false,\n    min: false,\n    max: false,\n    avg: false,\n    current: false,\n    total: false,\n    alignAsTable: false,\n    rightSide: false,\n    sort: undefined,\n    sortDesc: false,\n    optionalClass: '',\n    onToggleSeries: () => {},\n    onToggleSort: () => {},\n    onToggleAxis: () => {},\n    onColorChange: () => {},\n  };\n\n  constructor(props: GraphLegendProps) {\n    super(props);\n    this.state = {\n      hiddenSeries: this.props.hiddenSeries,\n    };\n  }\n\n  sortLegend() {\n    let seriesList: TimeSeries[] = [...this.props.seriesList] || [];\n    const sortBy = this.props.sort;\n    if (sortBy && this.props[sortBy] && this.props.alignAsTable) {\n      seriesList = _sortBy(seriesList, (series) => {\n        let sort = series.stats[sortBy];\n        if (sort === null) {\n          sort = -Infinity;\n        }\n        return sort;\n      }) as TimeSeries[];\n      if (this.props.sortDesc) {\n        seriesList = seriesList.reverse();\n      }\n    }\n    return seriesList;\n  }\n\n  onToggleSeries = (series: TimeSeries, event: any) => {\n    if (!this.props.onToggleSeries) {\n      return;\n    }\n\n    let hiddenSeries = { ...this.state.hiddenSeries };\n    if (event.ctrlKey || event.metaKey || event.shiftKey) {\n      if (hiddenSeries[series.alias]) {\n        delete hiddenSeries[series.alias];\n      } else {\n        hiddenSeries[series.alias] = true;\n      }\n    } else {\n      hiddenSeries = this.toggleSeriesExclusiveMode(series);\n    }\n    this.setState({ hiddenSeries: hiddenSeries });\n    this.props.onToggleSeries(hiddenSeries);\n  };\n\n  toggleSeriesExclusiveMode(series: TimeSeries) {\n    const hiddenSeries = { ...this.state.hiddenSeries };\n\n    if (hiddenSeries[series.alias]) {\n      delete hiddenSeries[series.alias];\n    }\n\n    // check if every other series is hidden\n    const alreadyExclusive = this.props.seriesList.every((value) => {\n      if (value.alias === series.alias) {\n        return true;\n      }\n\n      return hiddenSeries[value.alias];\n    });\n\n    if (alreadyExclusive) {\n      // remove all hidden series\n      this.props.seriesList.forEach((value) => {\n        delete hiddenSeries[value.alias];\n      });\n    } else {\n      // hide all but this serie\n      this.props.seriesList.forEach((value) => {\n        if (value.alias === series.alias) {\n          return;\n        }\n\n        hiddenSeries[value.alias] = true;\n      });\n    }\n\n    return hiddenSeries;\n  }\n\n  render() {\n    const {\n      optionalClass,\n      rightSide,\n      sideWidth,\n      sort,\n      sortDesc,\n      hideEmpty,\n      hideZero,\n      values,\n      min,\n      max,\n      avg,\n      current,\n      total,\n    } = this.props;\n    const seriesValuesProps = { values, min, max, avg, current, total };\n    const hiddenSeries = this.state.hiddenSeries;\n    const seriesHideProps = { hideEmpty, hideZero };\n    const sortProps = { sort, sortDesc };\n    const seriesList = this.sortLegend().filter((series) => !series.hideFromLegend(seriesHideProps));\n    const legendClass = `${this.props.alignAsTable ? 'graph-legend-table' : ''} ${optionalClass}`;\n\n    // Set min-width if side style and there is a value, otherwise remove the CSS property\n    // Set width so it works with IE11\n    const width: any = rightSide && sideWidth ? sideWidth : undefined;\n    const ieWidth: any = rightSide && sideWidth ? sideWidth - 1 : undefined;\n    const legendStyle: React.CSSProperties = {\n      minWidth: width,\n      width: ieWidth,\n    };\n\n    const legendProps: LegendComponentProps = {\n      seriesList: seriesList,\n      hiddenSeries: hiddenSeries,\n      onToggleSeries: this.onToggleSeries,\n      onToggleAxis: this.props.onToggleAxis,\n      onToggleSort: this.props.onToggleSort,\n      onColorChange: this.props.onColorChange,\n      ...seriesValuesProps,\n      ...sortProps,\n    };\n\n    return (\n      <div className={`graph-legend-content ${legendClass}`} style={legendStyle}>\n        {this.props.alignAsTable ? <LegendTable {...legendProps} /> : <LegendSeriesList {...legendProps} />}\n      </div>\n    );\n  }\n}\n\nclass LegendSeriesList extends PureComponent<LegendComponentProps> {\n  render() {\n    const { seriesList, hiddenSeries, values, min, max, avg, current, total } = this.props;\n    const seriesValuesProps = { values, min, max, avg, current, total };\n    return seriesList.map((series, i) => (\n      <LegendItem\n        // This trick required because TimeSeries.id is not unique (it's just TimeSeries.alias).\n        // In future would be good to make id unique across the series list.\n        key={`${series.id}-${i}`}\n        series={series}\n        hidden={hiddenSeries[series.alias]}\n        {...seriesValuesProps}\n        onLabelClick={this.props.onToggleSeries}\n        onColorChange={this.props.onColorChange}\n        onToggleAxis={this.props.onToggleAxis}\n      />\n    ));\n  }\n}\n\nclass LegendTable extends PureComponent<Partial<LegendComponentProps>> {\n  onToggleSort = (stat: LegendStat) => {\n    if (!this.props.onToggleSort) {\n      return;\n    }\n\n    let sortDesc = this.props.sortDesc;\n    let sortBy = this.props.sort;\n    if (stat !== sortBy) {\n      sortDesc = undefined;\n    }\n\n    // if already sort ascending, disable sorting\n    if (sortDesc === false) {\n      sortBy = undefined;\n      sortDesc = undefined;\n    } else {\n      sortDesc = !sortDesc;\n      sortBy = stat;\n    }\n    this.props.onToggleSort(sortBy, sortDesc);\n  };\n\n  render() {\n    const seriesList = this.props.seriesList;\n    const { values, min, max, avg, current, total, sort, sortDesc, hiddenSeries } = this.props;\n    const seriesValuesProps: any = { values, min, max, avg, current, total };\n\n    if (!seriesList) {\n      return null;\n    }\n\n    return (\n      <table>\n        <colgroup>\n          <col style={{ width: '100%' }} />\n        </colgroup>\n        <thead>\n          <tr>\n            <th style={{ textAlign: 'left' }} />\n            {LEGEND_STATS.map(\n              (statName) =>\n                seriesValuesProps[statName] && (\n                  <LegendTableHeaderItem\n                    key={statName}\n                    statName={statName}\n                    sort={sort}\n                    sortDesc={sortDesc}\n                    onClick={this.onToggleSort}\n                  />\n                )\n            )}\n          </tr>\n        </thead>\n        <tbody>\n          {seriesList &&\n            seriesList.map((series, i) => (\n              <LegendItem\n                key={`${series.id}-${i}`}\n                asTable={true}\n                series={series}\n                hidden={hiddenSeries[series.alias]}\n                onLabelClick={this.props.onToggleSeries}\n                onColorChange={this.props.onColorChange}\n                onToggleAxis={this.props.onToggleAxis}\n                {...seriesValuesProps}\n              />\n            ))}\n        </tbody>\n      </table>\n    );\n  }\n}\n\ninterface LegendTableHeaderProps {\n  statName: LegendStat;\n  onClick?: (statName: LegendStat) => void;\n}\n\nclass LegendTableHeaderItem extends PureComponent<LegendTableHeaderProps & LegendSortProps> {\n  onClick = () => {\n    if (this.props.onClick) {\n      this.props.onClick(this.props.statName);\n    }\n  };\n\n  render() {\n    const { statName, sort, sortDesc } = this.props;\n    return (\n      <th className=\"pointer\" onClick={this.onClick}>\n        {statName}\n        {sort === statName && <Icon name={sortDesc ? 'angle-down' : 'angle-up'} />}\n      </th>\n    );\n  }\n}\n\nexport class Legend extends PureComponent<GraphLegendProps> {\n  render() {\n    return (\n      <CustomScrollbar hideHorizontalTrack>\n        <GraphLegend {...this.props} />\n      </CustomScrollbar>\n    );\n  }\n}\n\nexport default Legend;\n","import '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 './jquery.flot.events';\n\nimport $ from 'jquery';\nimport { clone, find, flatten, isUndefined, map, max as _max, min as _min, sortBy as _sortBy, toNumber } from 'lodash';\nimport { tickStep } from 'app/core/utils/ticks';\nimport { updateLegendValues } from 'app/core/core';\nimport { coreModule } from 'app/angular/core_module';\nimport GraphTooltip from './graph_tooltip';\nimport { ThresholdManager } from './threshold_manager';\nimport { TimeRegionManager } from './time_region_manager';\nimport { EventManager } from './event_manager';\nimport { convertToHistogramData } from './histogram';\nimport { alignYLevel } from './align_yaxes';\nimport config from 'app/core/config';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { GraphLegendProps, Legend } from './Legend/Legend';\n\nimport { GraphCtrl } from './module';\nimport { graphTickFormatter, graphTimeFormat, IconName, MenuItemProps, MenuItemsGroup } from '@grafana/ui';\nimport { provideTheme } from 'app/core/utils/ConfigProvider';\nimport {\n  DataFrame,\n  DataFrameView,\n  DataHoverClearEvent,\n  DataHoverEvent,\n  DataHoverPayload,\n  FieldDisplay,\n  FieldType,\n  formattedValueToString,\n  getDisplayProcessor,\n  getFlotPairsConstant,\n  getTimeField,\n  getValueFormat,\n  hasLinks,\n  LegacyEventHandler,\n  LegacyGraphHoverClearEvent,\n  LegacyGraphHoverEvent,\n  LegacyGraphHoverEventPayload,\n  LinkModelSupplier,\n  PanelEvents,\n  toUtc,\n} from '@grafana/data';\nimport { GraphContextMenuCtrl } from './GraphContextMenuCtrl';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { getFieldLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';\nimport { DashboardModel } from '../../../features/dashboard/state';\nimport { isLegacyGraphHoverEvent } from './utils';\n\nconst LegendWithThemeProvider = provideTheme(Legend);\n\nclass GraphElement {\n  ctrl: GraphCtrl;\n  contextMenu: GraphContextMenuCtrl;\n  tooltip: any;\n  dashboard: DashboardModel;\n  annotations: object[];\n  panel: any;\n  plot: any;\n  sortedSeries?: any[];\n  data: any[] = [];\n  panelWidth: number;\n  eventManager: EventManager;\n  thresholdManager: ThresholdManager;\n  timeRegionManager: TimeRegionManager;\n  declare legendElem: HTMLElement;\n\n  constructor(\n    private scope: any,\n    private elem: JQuery & {\n      bind(eventType: string, handler: (eventObject: JQueryEventObject, ...args: any[]) => any): JQuery; // need to extend with Plot\n    },\n    private timeSrv: TimeSrv\n  ) {\n    this.ctrl = scope.ctrl;\n    this.contextMenu = scope.ctrl.contextMenuCtrl;\n    this.dashboard = this.ctrl.dashboard;\n    this.panel = this.ctrl.panel;\n    this.annotations = [];\n\n    this.panelWidth = 0;\n    this.eventManager = new EventManager(this.ctrl);\n    this.thresholdManager = new ThresholdManager(this.ctrl);\n    this.timeRegionManager = new TimeRegionManager(this.ctrl);\n    // @ts-ignore\n    this.tooltip = new GraphTooltip(this.elem, this.ctrl.dashboard, this.scope, () => {\n      return this.sortedSeries;\n    });\n\n    // panel events\n    this.ctrl.events.on(PanelEvents.panelTeardown, this.onPanelTeardown.bind(this));\n    this.ctrl.events.on(PanelEvents.render, this.onRender.bind(this));\n\n    // global events\n    // Using old way here to use the scope unsubscribe model as the new $on function does not take scope\n    this.ctrl.dashboard.events.on(LegacyGraphHoverEvent.type, this.onGraphHover.bind(this), this.scope);\n    this.ctrl.dashboard.events.on(LegacyGraphHoverClearEvent.type, this.onGraphHoverClear.bind(this), this.scope);\n\n    this.ctrl.dashboard.events.on(DataHoverEvent.type, this.onGraphHover.bind(this), this.scope);\n    this.ctrl.dashboard.events.on(DataHoverClearEvent.type, this.onGraphHoverClear.bind(this), this.scope);\n\n    // plot events\n    this.elem.bind('plotselected', this.onPlotSelected.bind(this));\n    this.elem.bind('plotclick', this.onPlotClick.bind(this));\n\n    // get graph legend element\n    if (this.elem && this.elem.parent) {\n      this.legendElem = this.elem.parent().find('.graph-legend')[0];\n    }\n  }\n\n  onRender(renderData: any[]) {\n    this.data = renderData || this.data;\n    if (!this.data) {\n      return;\n    }\n\n    this.annotations = this.ctrl.annotations || [];\n    this.buildFlotPairs(this.data);\n    const graphHeight = this.ctrl.height;\n    updateLegendValues(this.data, this.panel, graphHeight);\n\n    if (!this.panel.legend.show) {\n      if (this.legendElem.hasChildNodes()) {\n        ReactDOM.unmountComponentAtNode(this.legendElem);\n      }\n      this.renderPanel();\n      return;\n    }\n\n    const { values, min, max, avg, current, total } = this.panel.legend;\n    const { alignAsTable, rightSide, sideWidth, sort, sortDesc, hideEmpty, hideZero } = this.panel.legend;\n    const legendOptions = { alignAsTable, rightSide, sideWidth, sort, sortDesc, hideEmpty, hideZero };\n    const valueOptions = { values, min, max, avg, current, total };\n    const legendProps: GraphLegendProps = {\n      seriesList: this.data,\n      hiddenSeries: this.ctrl.hiddenSeries,\n      ...legendOptions,\n      ...valueOptions,\n      onToggleSeries: this.ctrl.onToggleSeries,\n      onToggleSort: this.ctrl.onToggleSort,\n      onColorChange: this.ctrl.onColorChange,\n      onToggleAxis: this.ctrl.onToggleAxis,\n    };\n\n    const legendReactElem = React.createElement(LegendWithThemeProvider, legendProps);\n    ReactDOM.render(legendReactElem, this.legendElem, () => this.renderPanel());\n  }\n\n  onGraphHover(evt: LegacyGraphHoverEventPayload | DataHoverPayload) {\n    // ignore other graph hover events if shared tooltip is disabled\n    if (!this.dashboard.sharedTooltipModeEnabled()) {\n      return;\n    }\n\n    if (isLegacyGraphHoverEvent(evt)) {\n      // ignore if we are the emitter\n      if (!this.plot || evt.panel?.id === this.panel.id || this.ctrl.otherPanelInFullscreenMode()) {\n        return;\n      }\n\n      this.tooltip.show(evt.pos);\n    }\n\n    // DataHoverEvent can come from multiple panels that doesn't include x position\n    if (!evt.point?.time) {\n      return;\n    }\n\n    this.tooltip.show({ x: evt.point.time, panelRelY: evt.point.panelRelY ?? 1 });\n  }\n\n  onPanelTeardown() {\n    if (this.plot) {\n      this.plot.destroy();\n      this.plot = null;\n    }\n\n    this.tooltip.destroy();\n    this.elem.off();\n    this.elem.remove();\n\n    ReactDOM.unmountComponentAtNode(this.legendElem);\n  }\n\n  onGraphHoverClear(handler: LegacyEventHandler<any>) {\n    if (this.plot) {\n      this.tooltip.clear(this.plot);\n    }\n  }\n\n  onPlotSelected(event: JQueryEventObject, ranges: any) {\n    if (this.panel.xaxis.mode !== 'time') {\n      // Skip if panel in histogram or series mode\n      this.plot.clearSelection();\n      return;\n    }\n\n    if ((ranges.ctrlKey || ranges.metaKey) && this.dashboard.canAddAnnotations()) {\n      // Add annotation\n      setTimeout(() => {\n        this.eventManager.updateTime(ranges.xaxis);\n      }, 100);\n    } else {\n      this.scope.$apply(() => {\n        this.timeSrv.setTime({\n          from: toUtc(ranges.xaxis.from),\n          to: toUtc(ranges.xaxis.to),\n        });\n      });\n    }\n  }\n\n  getContextMenuItemsSupplier = (\n    flotPosition: { x: number; y: number },\n    linksSupplier?: LinkModelSupplier<FieldDisplay>\n  ): (() => MenuItemsGroup[]) => {\n    return () => {\n      // Fixed context menu items\n      const items: MenuItemsGroup[] = this.dashboard.canAddAnnotations()\n        ? [\n            {\n              items: [\n                {\n                  label: 'Add annotation',\n                  ariaLabel: 'Add annotation',\n                  icon: 'comment-alt',\n                  onClick: () => this.eventManager.updateTime({ from: flotPosition.x, to: null }),\n                },\n              ],\n            },\n          ]\n        : [];\n\n      if (!linksSupplier) {\n        return items;\n      }\n\n      const dataLinks = [\n        {\n          items: linksSupplier.getLinks(this.panel.replaceVariables).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      return [...items, ...dataLinks];\n    };\n  };\n\n  onPlotClick(event: JQueryEventObject, pos: any, item: any) {\n    const scrollContextElement = this.elem.closest('.view') ? this.elem.closest('.view').get()[0] : null;\n    const contextMenuSourceItem = item;\n\n    if (this.panel.xaxis.mode !== 'time') {\n      // Skip if panel in histogram or series mode\n      return;\n    }\n\n    if (pos.ctrlKey || pos.metaKey) {\n      // Skip if range selected (added in \"plotselected\" event handler)\n      if (pos.x !== pos.x1) {\n        return;\n      }\n\n      // skip if dashboard is not saved yet (exists in db) or user cannot edit\n      if (!this.dashboard.id || !this.dashboard.canAddAnnotations()) {\n        return;\n      }\n\n      setTimeout(() => {\n        this.eventManager.updateTime({ from: pos.x, to: null });\n      }, 100);\n      return;\n    } else {\n      this.tooltip.clear(this.plot);\n      let linksSupplier: LinkModelSupplier<FieldDisplay> | undefined;\n\n      if (item) {\n        // pickup y-axis index to know which field's config to apply\n        const yAxisConfig = this.panel.yaxes[item.series.yaxis.n === 2 ? 1 : 0];\n        const dataFrame = this.ctrl.dataList[item.series.dataFrameIndex];\n        const field = dataFrame.fields[item.series.fieldIndex];\n        const dataIndex = this.getDataIndexWithNullValuesCorrection(item, dataFrame);\n\n        let links: any[] = this.panel.options.dataLinks || [];\n        const hasLinksValue = hasLinks(field);\n        if (hasLinksValue) {\n          // Append the configured links to the panel datalinks\n          links = [...links, ...field.config.links!];\n        }\n        const fieldConfig = {\n          decimals: yAxisConfig.decimals,\n          links,\n        };\n        const fieldDisplay = getDisplayProcessor({\n          field: { config: fieldConfig, type: FieldType.number },\n          theme: config.theme2,\n          timeZone: this.dashboard.getTimezone(),\n        })(field.values.get(dataIndex));\n        linksSupplier = links.length\n          ? getFieldLinksSupplier({\n              display: fieldDisplay,\n              name: field.name,\n              view: new DataFrameView(dataFrame),\n              rowIndex: dataIndex,\n              colIndex: item.series.fieldIndex,\n              field: fieldConfig,\n              hasLinks: hasLinksValue,\n            })\n          : undefined;\n      }\n\n      this.scope.$apply(() => {\n        // Setting nearest CustomScrollbar element as a scroll context for graph context menu\n        this.contextMenu.setScrollContextElement(scrollContextElement);\n        this.contextMenu.setSource(contextMenuSourceItem);\n        this.contextMenu.setMenuItemsSupplier(this.getContextMenuItemsSupplier(pos, linksSupplier) as any);\n        this.contextMenu.toggleMenu(pos);\n      });\n    }\n  }\n\n  getDataIndexWithNullValuesCorrection(item: any, dataFrame: DataFrame): number {\n    /** This is one added to handle the scenario where we have null values in\n     *  the time series data and the: \"visualization options -> null value\"\n     *  set to \"connected\". In this scenario we will get the wrong dataIndex.\n     *\n     *  https://github.com/grafana/grafana/issues/22651\n     */\n    const { datapoint, dataIndex } = item;\n\n    if (!Array.isArray(datapoint) || datapoint.length === 0) {\n      return dataIndex;\n    }\n\n    const ts = datapoint[0];\n    const { timeField } = getTimeField(dataFrame);\n\n    if (!timeField || !timeField.values) {\n      return dataIndex;\n    }\n\n    const field = timeField.values.get(dataIndex);\n\n    if (field === ts) {\n      return dataIndex;\n    }\n\n    const correctIndex = timeField.values.toArray().findIndex((value) => value === ts);\n    return correctIndex > -1 ? correctIndex : dataIndex;\n  }\n\n  shouldAbortRender() {\n    if (!this.data) {\n      return true;\n    }\n\n    if (this.panelWidth === 0) {\n      return true;\n    }\n\n    return false;\n  }\n\n  drawHook(plot: any) {\n    // add left axis labels\n    if (this.panel.yaxes[0].label && this.panel.yaxes[0].show) {\n      $(\"<div class='axisLabel left-yaxis-label flot-temp-elem'></div>\")\n        .text(this.panel.yaxes[0].label)\n        .appendTo(this.elem);\n    }\n\n    // add right axis labels\n    if (this.panel.yaxes[1].label && this.panel.yaxes[1].show) {\n      $(\"<div class='axisLabel right-yaxis-label flot-temp-elem'></div>\")\n        .text(this.panel.yaxes[1].label)\n        .appendTo(this.elem);\n    }\n\n    const { dataWarning } = this.ctrl;\n    if (dataWarning) {\n      const msg = $(`<div class=\"datapoints-warning flot-temp-elem\">${dataWarning.title}</div>`);\n      if (dataWarning.action) {\n        $(`<button class=\"btn btn-secondary\">${dataWarning.actionText}</button>`)\n          .click(dataWarning.action)\n          .appendTo(msg);\n      }\n      msg.appendTo(this.elem);\n    }\n    this.thresholdManager.draw(plot);\n    this.timeRegionManager.draw(plot);\n  }\n\n  processOffsetHook(plot: any, gridMargin: { left: number; right: number }) {\n    const left = this.panel.yaxes[0];\n    const right = this.panel.yaxes[1];\n    if (left.show && left.label) {\n      gridMargin.left = 20;\n    }\n    if (right.show && right.label) {\n      gridMargin.right = 20;\n    }\n\n    // apply y-axis min/max options\n    const yaxis = plot.getYAxes();\n    for (let i = 0; i < yaxis.length; i++) {\n      const axis: any = yaxis[i];\n      const panelOptions = this.panel.yaxes[i];\n      axis.options.max = axis.options.max !== null ? axis.options.max : panelOptions.max;\n      axis.options.min = axis.options.min !== null ? axis.options.min : panelOptions.min;\n    }\n  }\n\n  processRangeHook(plot: any) {\n    const yAxes = plot.getYAxes();\n    const align = this.panel.yaxis.align || false;\n\n    if (yAxes.length > 1 && align === true) {\n      const level = this.panel.yaxis.alignLevel || 0;\n      alignYLevel(yAxes, parseFloat(level));\n    }\n  }\n\n  // Series could have different timeSteps,\n  // let's find the smallest one so that bars are correctly rendered.\n  // In addition, only take series which are rendered as bars for this.\n  getMinTimeStepOfSeries(data: any[]) {\n    let min = Number.MAX_VALUE;\n\n    for (let i = 0; i < data.length; i++) {\n      if (!data[i].stats.timeStep) {\n        continue;\n      }\n      if (this.panel.bars) {\n        if (data[i].bars && data[i].bars.show === false) {\n          continue;\n        }\n      } else {\n        if (typeof data[i].bars === 'undefined' || typeof data[i].bars.show === 'undefined' || !data[i].bars.show) {\n          continue;\n        }\n      }\n\n      if (data[i].stats.timeStep < min) {\n        min = data[i].stats.timeStep;\n      }\n    }\n\n    return min;\n  }\n\n  // Function for rendering panel\n  renderPanel() {\n    this.panelWidth = this.elem.width() ?? 0;\n\n    if (this.shouldAbortRender()) {\n      return;\n    }\n\n    // give space to alert editing\n    this.thresholdManager.prepare(this.elem, this.data);\n\n    // un-check dashes if lines are unchecked\n    this.panel.dashes = this.panel.lines ? this.panel.dashes : false;\n\n    // Populate element\n    const options: any = this.buildFlotOptions(this.panel);\n    this.prepareXAxis(options, this.panel);\n    this.configureYAxisOptions(this.data, options);\n    this.thresholdManager.addFlotOptions(options, this.panel);\n    this.timeRegionManager.addFlotOptions(options, this.panel);\n    this.eventManager.addFlotEvents(this.annotations, options);\n    this.sortedSeries = this.sortSeries(this.data, this.panel);\n    this.callPlot(options, true);\n  }\n\n  buildFlotPairs(data: any) {\n    for (let i = 0; i < data.length; i++) {\n      const series = data[i];\n      series.data = series.getFlotPairs(series.nullPointMode || this.panel.nullPointMode);\n\n      if (series.transform === 'constant') {\n        series.data = getFlotPairsConstant(series.data, this.ctrl.range!);\n      }\n\n      // if hidden remove points and disable stack\n      if (this.ctrl.hiddenSeries[series.alias]) {\n        series.data = [];\n        series.stack = false;\n      }\n    }\n  }\n\n  prepareXAxis(options: any, panel: any) {\n    switch (panel.xaxis.mode) {\n      case 'series': {\n        options.series.bars.barWidth = 0.7;\n        options.series.bars.align = 'center';\n\n        for (let i = 0; i < this.data.length; i++) {\n          const series = this.data[i];\n          series.data = [[i + 1, series.stats[panel.xaxis.values[0]]]];\n        }\n\n        this.addXSeriesAxis(options);\n        break;\n      }\n      case 'histogram': {\n        let bucketSize: number;\n\n        if (this.data.length) {\n          let histMin = _min(map(this.data, (s) => s.stats.min));\n          let histMax = _max(map(this.data, (s) => s.stats.max));\n          const ticks = panel.xaxis.buckets || this.panelWidth / 50;\n          if (panel.xaxis.min != null) {\n            const isInvalidXaxisMin = tickStep(panel.xaxis.min, histMax, ticks) <= 0;\n            histMin = isInvalidXaxisMin ? histMin : panel.xaxis.min;\n          }\n          if (panel.xaxis.max != null) {\n            const isInvalidXaxisMax = tickStep(histMin, panel.xaxis.max, ticks) <= 0;\n            histMax = isInvalidXaxisMax ? histMax : panel.xaxis.max;\n          }\n          bucketSize = tickStep(histMin, histMax, ticks);\n          options.series.bars.barWidth = bucketSize * 0.8;\n          this.data = convertToHistogramData(this.data, bucketSize, this.ctrl.hiddenSeries, histMin, histMax);\n        } else {\n          bucketSize = 0;\n        }\n\n        this.addXHistogramAxis(options, bucketSize);\n        break;\n      }\n      case 'table': {\n        options.series.bars.barWidth = 0.7;\n        options.series.bars.align = 'center';\n        this.addXTableAxis(options);\n        break;\n      }\n      default: {\n        options.series.bars.barWidth = this.getMinTimeStepOfSeries(this.data) / 1.5;\n        this.addTimeAxis(options);\n        break;\n      }\n    }\n  }\n\n  callPlot(options: any, incrementRenderCounter: boolean) {\n    try {\n      this.plot = $.plot(this.elem, this.sortedSeries, options);\n      if (this.ctrl.renderError) {\n        delete this.ctrl.error;\n      }\n    } catch (e) {\n      console.error('flotcharts error', e);\n      this.ctrl.error = e.message || 'Render Error';\n      this.ctrl.renderError = true;\n    }\n\n    if (incrementRenderCounter) {\n      this.ctrl.renderingCompleted();\n    }\n  }\n\n  buildFlotOptions(panel: any) {\n    let gridColor = '#c8c8c8';\n    if (config.bootData.user.lightTheme === true) {\n      gridColor = '#a1a1a1';\n    }\n    const stack = panel.stack ? true : null;\n    const options: any = {\n      hooks: {\n        draw: [this.drawHook.bind(this)],\n        processOffset: [this.processOffsetHook.bind(this)],\n        processRange: [this.processRangeHook.bind(this)],\n      },\n      legend: { show: false },\n      series: {\n        stackpercent: panel.stack ? panel.percentage : false,\n        stack: panel.percentage ? null : stack,\n        lines: {\n          show: panel.lines,\n          zero: false,\n          fill: this.translateFillOption(panel.fill),\n          fillColor: this.getFillGradient(panel.fillGradient),\n          lineWidth: panel.dashes ? 0 : panel.linewidth,\n          steps: panel.steppedLine,\n        },\n        dashes: {\n          show: panel.dashes,\n          lineWidth: panel.linewidth,\n          dashLength: [panel.dashLength, panel.spaceLength],\n        },\n        bars: {\n          show: panel.bars,\n          fill: 1,\n          barWidth: 1,\n          zero: false,\n          lineWidth: 0,\n        },\n        points: {\n          show: panel.points,\n          fill: 1,\n          fillColor: false,\n          radius: panel.points ? panel.pointradius : 2,\n        },\n        shadowSize: 0,\n      },\n      yaxes: [],\n      xaxis: {},\n      grid: {\n        minBorderMargin: 0,\n        markings: [],\n        backgroundColor: null,\n        borderWidth: 0,\n        hoverable: true,\n        clickable: true,\n        color: gridColor,\n        margin: { left: 0, right: 0 },\n        labelMarginX: 0,\n        mouseActiveRadius: 30,\n      },\n      selection: {\n        mode: 'x',\n        color: '#666',\n      },\n      crosshair: {\n        mode: 'x',\n      },\n    };\n    return options;\n  }\n\n  sortSeries(series: any, panel: any) {\n    const sortBy = panel.legend.sort;\n    const sortOrder = panel.legend.sortDesc;\n    const haveSortBy = sortBy !== null && sortBy !== undefined && panel.legend[sortBy];\n    const haveSortOrder = sortOrder !== null && sortOrder !== undefined;\n    const shouldSortBy = panel.stack && haveSortBy && haveSortOrder && panel.legend.alignAsTable;\n    const sortDesc = panel.legend.sortDesc === true ? -1 : 1;\n\n    if (shouldSortBy) {\n      return _sortBy(series, (s) => s.stats[sortBy] * sortDesc);\n    } else {\n      return _sortBy(series, (s) => s.zindex);\n    }\n  }\n\n  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  translateFillOption(fill: number) {\n    if (this.panel.percentage && this.panel.stack) {\n      return fill === 0 ? 0.001 : fill / 10;\n    } else {\n      return fill / 10;\n    }\n  }\n\n  addTimeAxis(options: any) {\n    const ticks = this.panelWidth / 100;\n    const min = isUndefined(this.ctrl.range!.from) ? null : this.ctrl.range!.from.valueOf();\n    const max = isUndefined(this.ctrl.range!.to) ? null : this.ctrl.range!.to.valueOf();\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\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  }\n\n  addXSeriesAxis(options: any) {\n    const ticks = map(this.data, (series, index) => {\n      return [index + 1, series.alias];\n    });\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\n      mode: null,\n      min: 0,\n      max: ticks.length + 1,\n      label: 'Datetime',\n      ticks: ticks,\n    };\n  }\n\n  addXHistogramAxis(options: any, bucketSize: number) {\n    let ticks: number | number[];\n    let min: number | undefined;\n    let max: number | undefined;\n\n    const defaultTicks = this.panelWidth / 50;\n\n    if (this.data.length && bucketSize) {\n      const tickValues = [];\n\n      for (const d of this.data) {\n        for (const point of d.data) {\n          tickValues[point[0]] = true;\n        }\n      }\n\n      ticks = Object.keys(tickValues).map((v) => Number(v));\n      min = _min(ticks)!;\n      max = _max(ticks)!;\n\n      // Adjust tick step\n      let tickStep = bucketSize;\n      let ticksNum = Math.floor((max - min) / tickStep);\n      while (ticksNum > defaultTicks) {\n        tickStep = tickStep * 2;\n        ticksNum = Math.ceil((max - min) / tickStep);\n      }\n\n      // Expand ticks for pretty view\n      min = Math.floor(min / tickStep) * tickStep;\n      // 1.01 is 101% - ensure we have enough space for last bar\n      max = Math.ceil((max * 1.01) / tickStep) * tickStep;\n\n      ticks = [];\n      for (let i = min; i <= max; i += tickStep) {\n        ticks.push(i);\n      }\n    } else {\n      // Set defaults if no data\n      ticks = defaultTicks / 2;\n      min = 0;\n      max = 1;\n    }\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\n      mode: null,\n      min: min,\n      max: max,\n      label: 'Histogram',\n      ticks: ticks,\n    };\n\n    // Use 'short' format for histogram values\n    this.configureAxisMode(options.xaxis, 'short', null);\n  }\n\n  addXTableAxis(options: any) {\n    let ticks = map(this.data, (series, seriesIndex) => {\n      return map(series.datapoints, (point, pointIndex) => {\n        const tickIndex = seriesIndex * series.datapoints.length + pointIndex;\n        return [tickIndex + 1, point[1]];\n      });\n    });\n    // @ts-ignore, potential bug? is this flattenDeep?\n    ticks = flatten(ticks, true);\n\n    options.xaxis = {\n      timezone: this.dashboard.getTimezone(),\n      show: this.panel.xaxis.show,\n      mode: null,\n      min: 0,\n      max: ticks.length + 1,\n      label: 'Datetime',\n      ticks: ticks,\n    };\n  }\n\n  configureYAxisOptions(data: any, options: any) {\n    const defaults = {\n      position: 'left',\n      show: this.panel.yaxes[0].show,\n      index: 1,\n      logBase: this.panel.yaxes[0].logBase || 1,\n      min: this.parseNumber(this.panel.yaxes[0].min),\n      max: this.parseNumber(this.panel.yaxes[0].max),\n      tickDecimals: this.panel.yaxes[0].decimals,\n    };\n\n    options.yaxes.push(defaults);\n\n    if (find(data, { yaxis: 2 })) {\n      const secondY = clone(defaults);\n      secondY.index = 2;\n      secondY.show = this.panel.yaxes[1].show;\n      secondY.logBase = this.panel.yaxes[1].logBase || 1;\n      secondY.position = 'right';\n      secondY.min = this.parseNumber(this.panel.yaxes[1].min);\n      secondY.max = this.parseNumber(this.panel.yaxes[1].max);\n      secondY.tickDecimals = this.panel.yaxes[1].decimals;\n      options.yaxes.push(secondY);\n\n      this.applyLogScale(options.yaxes[1], data);\n      this.configureAxisMode(\n        options.yaxes[1],\n        this.panel.percentage && this.panel.stack ? 'percent' : this.panel.yaxes[1].format,\n        this.panel.yaxes[1].decimals\n      );\n    }\n    this.applyLogScale(options.yaxes[0], data);\n    this.configureAxisMode(\n      options.yaxes[0],\n      this.panel.percentage && this.panel.stack ? 'percent' : this.panel.yaxes[0].format,\n      this.panel.yaxes[0].decimals\n    );\n  }\n\n  parseNumber(value: any) {\n    if (value === null || typeof value === 'undefined') {\n      return null;\n    }\n\n    return toNumber(value);\n  }\n\n  applyLogScale(axis: any, data: any) {\n    if (axis.logBase === 1) {\n      return;\n    }\n\n    const minSetToZero = axis.min === 0;\n\n    if (axis.min < Number.MIN_VALUE) {\n      axis.min = null;\n    }\n    if (axis.max < Number.MIN_VALUE) {\n      axis.max = null;\n    }\n\n    let series, i;\n    let max = axis.max,\n      min = axis.min;\n\n    for (i = 0; i < data.length; i++) {\n      series = data[i];\n      if (series.yaxis === axis.index) {\n        if (!max || max < series.stats.max) {\n          max = series.stats.max;\n        }\n        if (!min || min > series.stats.logmin) {\n          min = series.stats.logmin;\n        }\n      }\n    }\n\n    axis.transform = (v: number) => {\n      return v < Number.MIN_VALUE ? null : Math.log(v) / Math.log(axis.logBase);\n    };\n    axis.inverseTransform = (v: any) => {\n      return Math.pow(axis.logBase, v);\n    };\n\n    if (!max && !min) {\n      max = axis.inverseTransform(+2);\n      min = axis.inverseTransform(-2);\n    } else if (!max) {\n      max = min * axis.inverseTransform(+4);\n    } else if (!min) {\n      min = max * axis.inverseTransform(-4);\n    }\n\n    if (axis.min) {\n      min = axis.inverseTransform(Math.ceil(axis.transform(axis.min)));\n    } else {\n      min = axis.min = axis.inverseTransform(Math.floor(axis.transform(min)));\n    }\n    if (axis.max) {\n      max = axis.inverseTransform(Math.floor(axis.transform(axis.max)));\n    } else {\n      max = axis.max = axis.inverseTransform(Math.ceil(axis.transform(max)));\n    }\n\n    if (!min || min < Number.MIN_VALUE || !max || max < Number.MIN_VALUE) {\n      return;\n    }\n\n    if (Number.isFinite(min) && Number.isFinite(max)) {\n      if (minSetToZero) {\n        axis.min = 0.1;\n        min = 1;\n      }\n\n      axis.ticks = this.generateTicksForLogScaleYAxis(min, max, axis.logBase);\n      if (minSetToZero) {\n        axis.ticks.unshift(0.1);\n      }\n      if (axis.ticks[axis.ticks.length - 1] > axis.max) {\n        axis.max = axis.ticks[axis.ticks.length - 1];\n      }\n    } else {\n      axis.ticks = [1, 2];\n      delete axis.min;\n      delete axis.max;\n    }\n  }\n\n  generateTicksForLogScaleYAxis(min: any, max: number, logBase: number) {\n    let ticks = [];\n\n    let nextTick;\n    for (nextTick = min; nextTick <= max; nextTick *= logBase) {\n      ticks.push(nextTick);\n    }\n\n    const maxNumTicks = Math.ceil(this.ctrl.height / 25);\n    const numTicks = ticks.length;\n    if (numTicks > maxNumTicks) {\n      const factor = Math.ceil(numTicks / maxNumTicks) * logBase;\n      ticks = [];\n\n      for (nextTick = min; nextTick <= max * factor; nextTick *= factor) {\n        ticks.push(nextTick);\n      }\n    }\n\n    return ticks;\n  }\n\n  configureAxisMode(\n    axis: { tickFormatter: (val: any, axis: any) => string },\n    format: string,\n    decimals?: number | null\n  ) {\n    axis.tickFormatter = (val, axis) => {\n      const formatter = getValueFormat(format);\n\n      if (!formatter) {\n        throw new Error(`Unit '${format}' is not supported`);\n      }\n\n      return formattedValueToString(formatter(val, decimals));\n    };\n  }\n}\n\n/** @ngInject */\nfunction graphDirective(timeSrv: TimeSrv, popoverSrv: any, contextSrv: ContextSrv) {\n  return {\n    restrict: 'A',\n    template: '',\n    link: (scope: any, elem: JQuery) => {\n      return new GraphElement(scope, elem, timeSrv);\n    },\n  };\n}\n\ncoreModule.directive('grafanaGraph', graphDirective);\nexport { GraphElement, graphDirective };\n","import {\n  AbsoluteTimeRange,\n  DataFrame,\n  FieldType,\n  LegacyGraphHoverEventPayload,\n  reduceField,\n  ReducerID,\n} from '@grafana/data';\n\n/**\n * Find the min and max time that covers all data\n */\nexport function getDataTimeRange(frames: DataFrame[]): AbsoluteTimeRange | undefined {\n  const range: AbsoluteTimeRange = {\n    from: Number.MAX_SAFE_INTEGER,\n    to: Number.MIN_SAFE_INTEGER,\n  };\n  let found = false;\n  const reducers = [ReducerID.min, ReducerID.max];\n  for (const frame of frames) {\n    for (const field of frame.fields) {\n      if (field.type === FieldType.time) {\n        const calcs = reduceField({ field, reducers });\n        range.from = Math.min(range.from, calcs[ReducerID.min]);\n        range.to = Math.max(range.to, calcs[ReducerID.max]);\n        found = true;\n      }\n    }\n  }\n  return found ? range : undefined;\n}\n\n// Check wether event is LegacyGraphHoverEvent\nexport function isLegacyGraphHoverEvent(event: any): event is LegacyGraphHoverEventPayload {\n  return event.hasOwnProperty('pos');\n}\n","import { map, each, isUndefined } from 'lodash';\nimport coreModule from 'app/angular/core_module';\nimport { textUtil } from '@grafana/data';\n\n/** @ngInject */\nexport function SeriesOverridesCtrl($scope: any, $element: JQuery, popoverSrv: any) {\n  $scope.overrideMenu = [];\n  $scope.currentOverrides = [];\n  $scope.override = $scope.override || {};\n  $scope.colorPickerModel = {};\n\n  $scope.addOverrideOption = (name: string, propertyName: string, values: any) => {\n    const option = {\n      text: name,\n      propertyName: propertyName,\n      index: $scope.overrideMenu.length,\n      values,\n      submenu: map(values, (value) => {\n        return { text: String(value), value: value };\n      }),\n    };\n\n    $scope.overrideMenu.push(option);\n  };\n\n  $scope.setOverride = (item: { propertyName: string }, subItem: { value: any }) => {\n    // handle color overrides\n    if (item.propertyName === 'color') {\n      $scope.openColorSelector($scope.override['color']);\n      return;\n    }\n\n    $scope.override[item.propertyName] = subItem.value;\n\n    // automatically disable lines for this series and the fill below to series\n    // can be removed by the user if they still want lines\n    if (item.propertyName === 'fillBelowTo') {\n      $scope.override['lines'] = false;\n      $scope.ctrl.addSeriesOverride({ alias: subItem.value, lines: false });\n    }\n\n    $scope.updateCurrentOverrides();\n    $scope.ctrl.render();\n  };\n\n  $scope.colorSelected = (color: any) => {\n    $scope.override['color'] = color;\n    $scope.updateCurrentOverrides();\n    $scope.ctrl.render();\n\n    // update picker model so that the picker UI will also update\n    $scope.colorPickerModel.series.color = color;\n  };\n\n  $scope.openColorSelector = (color: any) => {\n    $scope.colorPickerModel = {\n      autoClose: true,\n      colorSelected: $scope.colorSelected,\n      series: { color },\n    };\n\n    popoverSrv.show({\n      element: $element.find('.dropdown')[0],\n      position: 'top center',\n      openOn: 'click',\n      template: '<series-color-picker-popover color=\"series.color\" onColorChange=\"colorSelected\" />',\n      classNames: 'drop-popover drop-popover--transparent',\n      model: $scope.colorPickerModel,\n      onClose: () => {\n        $scope.ctrl.render();\n      },\n    });\n  };\n\n  $scope.removeOverride = (option: { propertyName: string | number }) => {\n    delete $scope.override[option.propertyName];\n    $scope.updateCurrentOverrides();\n    $scope.ctrl.refresh();\n  };\n\n  $scope.getSeriesNames = () => {\n    return map($scope.ctrl.seriesList, (series) => {\n      return textUtil.escapeHtml(series.alias);\n    });\n  };\n\n  $scope.updateCurrentOverrides = () => {\n    $scope.currentOverrides = [];\n    each($scope.overrideMenu, (option) => {\n      const value = $scope.override[option.propertyName];\n      if (isUndefined(value)) {\n        return;\n      }\n      $scope.currentOverrides.push({\n        name: option.text,\n        propertyName: option.propertyName,\n        value: String(value),\n      });\n    });\n  };\n\n  $scope.addOverrideOption('Bars', 'bars', [true, false]);\n  $scope.addOverrideOption('Lines', 'lines', [true, false]);\n  $scope.addOverrideOption('Line fill', 'fill', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n  $scope.addOverrideOption('Fill gradient', 'fillGradient', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n  $scope.addOverrideOption('Line width', 'linewidth', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n  $scope.addOverrideOption('Null point mode', 'nullPointMode', ['connected', 'null', 'null as zero']);\n  $scope.addOverrideOption('Fill below to', 'fillBelowTo', $scope.getSeriesNames());\n  $scope.addOverrideOption('Staircase line', 'steppedLine', [true, false]);\n  $scope.addOverrideOption('Dashes', 'dashes', [true, false]);\n  $scope.addOverrideOption('Hidden Series', 'hiddenSeries', [true, false]);\n  $scope.addOverrideOption('Dash Length', 'dashLength', [\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8,\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    17,\n    18,\n    19,\n    20,\n  ]);\n  $scope.addOverrideOption('Dash Space', 'spaceLength', [\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8,\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    17,\n    18,\n    19,\n    20,\n  ]);\n  $scope.addOverrideOption('Points', 'points', [true, false]);\n  $scope.addOverrideOption('Points Radius', 'pointradius', [1, 2, 3, 4, 5]);\n  $scope.addOverrideOption('Stack', 'stack', [true, false, 'A', 'B', 'C', 'D']);\n  $scope.addOverrideOption('Color', 'color', ['change']);\n  $scope.addOverrideOption('Y-axis', 'yaxis', [1, 2]);\n  $scope.addOverrideOption('Z-index', 'zindex', [-3, -2, -1, 0, 1, 2, 3]);\n  $scope.addOverrideOption('Transform', 'transform', ['constant', 'negative-Y']);\n  $scope.addOverrideOption('Legend', 'legend', [true, false]);\n  $scope.addOverrideOption('Hide in tooltip', 'hideTooltip', [true, false]);\n  $scope.updateCurrentOverrides();\n}\n\ncoreModule.controller('SeriesOverridesCtrl', SeriesOverridesCtrl);\n","import coreModule from 'app/angular/core_module';\nimport config from 'app/core/config';\nimport tinycolor from 'tinycolor2';\nexport class ThresholdFormCtrl {\n  panelCtrl: any;\n  panel: any;\n  disabled = false;\n\n  /** @ngInject */\n  constructor(private $scope: any) {}\n\n  $onInit() {\n    this.panel = this.panelCtrl.panel;\n\n    if (this.panel.alert && !config.unifiedAlertingEnabled) {\n      this.disabled = true;\n    }\n\n    const unbindDestroy = this.$scope.$on('$destroy', () => {\n      this.panelCtrl.editingThresholds = false;\n      this.panelCtrl.render();\n      unbindDestroy();\n    });\n\n    this.panelCtrl.editingThresholds = true;\n  }\n\n  addThreshold() {\n    this.panel.thresholds.push({\n      value: undefined,\n      colorMode: 'critical',\n      op: 'gt',\n      fill: true,\n      line: true,\n      yaxis: 'left',\n    });\n    this.panelCtrl.render();\n  }\n\n  removeThreshold(index: number) {\n    this.panel.thresholds.splice(index, 1);\n    this.panelCtrl.render();\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  onFillColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.thresholds[index].fillColor = newColor;\n      this.render();\n    };\n  }\n\n  onLineColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.thresholds[index].lineColor = newColor;\n      this.render();\n    };\n  }\n\n  onThresholdTypeChange(index: number) {\n    // Because of the ng-model binding, threshold's color mode is already set here\n    if (this.panel.thresholds[index].colorMode === 'custom') {\n      this.panel.thresholds[index].fillColor = tinycolor(config.theme.palette.blue85).setAlpha(0.2).toRgbString();\n      this.panel.thresholds[index].lineColor = tinycolor(config.theme.palette.blue77).setAlpha(0.6).toRgbString();\n    }\n    this.panelCtrl.render();\n  }\n}\n\ncoreModule.directive('graphThresholdForm', () => {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/plugins/panel/graph/thresholds_form.html',\n    controller: ThresholdFormCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      panelCtrl: '=',\n    },\n  };\n});\n","import coreModule from 'app/angular/core_module';\nimport { getColorModes } from './time_region_manager';\n\nexport class TimeRegionFormCtrl {\n  panelCtrl: any;\n  panel: any;\n  disabled = false;\n  colorModes: any;\n\n  /** @ngInject */\n  constructor(private $scope: any) {}\n\n  $onInit() {\n    this.panel = this.panelCtrl.panel;\n\n    const unbindDestroy = this.$scope.$on('$destroy', () => {\n      this.panelCtrl.editingTimeRegions = false;\n      this.panelCtrl.render();\n      unbindDestroy();\n    });\n\n    this.colorModes = getColorModes();\n    this.panelCtrl.editingTimeRegions = true;\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  addTimeRegion() {\n    this.panel.timeRegions.push({\n      op: 'time',\n      fromDayOfWeek: undefined,\n      from: undefined,\n      toDayOfWeek: undefined,\n      to: undefined,\n      colorMode: 'background6',\n      fill: true,\n      line: false,\n      // Default colors for new\n      fillColor: 'rgba(234, 112, 112, 0.12)',\n      lineColor: 'rgba(237, 46, 24, 0.60)',\n    });\n    this.panelCtrl.render();\n  }\n\n  removeTimeRegion(index: number) {\n    this.panel.timeRegions.splice(index, 1);\n    this.panelCtrl.render();\n  }\n\n  onFillColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.timeRegions[index].fillColor = newColor;\n      this.render();\n    };\n  }\n\n  onLineColorChange(index: number) {\n    return (newColor: string) => {\n      this.panel.timeRegions[index].lineColor = newColor;\n      this.render();\n    };\n  }\n}\n\ncoreModule.directive('graphTimeRegionForm', () => {\n  return {\n    restrict: 'E',\n    templateUrl: 'public/app/plugins/panel/graph/time_regions_form.html',\n    controller: TimeRegionFormCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      panelCtrl: '=',\n    },\n  };\n});\n","import { isString, escape } from 'lodash';\nimport $ from 'jquery';\nimport coreModule from 'app/angular/core_module';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { DashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { ContextSrv } from 'app/core/services/context_srv';\n\n/** @ngInject */\nexport function annotationTooltipDirective(\n  $sanitize: any,\n  dashboardSrv: DashboardSrv,\n  contextSrv: ContextSrv,\n  $compile: any\n) {\n  function sanitizeString(str: string) {\n    try {\n      return $sanitize(str);\n    } catch (err) {\n      console.log('Could not sanitize annotation string, html escaping instead');\n      return escape(str);\n    }\n  }\n\n  return {\n    restrict: 'E',\n    scope: {\n      event: '=',\n      onEdit: '&',\n    },\n    link: (scope: any, element: JQuery) => {\n      const event = scope.event;\n      let title = event.title;\n      let text = event.text;\n      const dashboard = dashboardSrv.getCurrent();\n\n      let tooltip = '<div class=\"graph-annotation\">';\n      let titleStateClass = '';\n\n      if (event.alertId !== undefined && event.newState) {\n        const stateModel = alertDef.getStateDisplayModel(event.newState);\n        titleStateClass = stateModel.stateClass;\n        title = `<i class=\"${stateModel.iconClass}\"></i> ${stateModel.text}`;\n        text = alertDef.getAlertAnnotationInfo(event);\n        if (event.text) {\n          text = text + '<br />' + event.text;\n        }\n      } else if (title) {\n        text = title + '<br />' + (isString(text) ? text : '');\n        title = '';\n      }\n\n      let header = `<div class=\"graph-annotation__header\">`;\n      if (event.login && event.avatarUrl) {\n        header += `<div class=\"graph-annotation__user\" bs-tooltip=\"'Created by ${event.login}'\"><img src=\"${event.avatarUrl}\" /></div>`;\n      }\n      header += `\n          <span class=\"graph-annotation__title ${titleStateClass}\">${sanitizeString(title)}</span>\n          <span class=\"graph-annotation__time\">${dashboard?.formatDate(event.min)}</span>\n      `;\n\n      // Show edit icon only for users with at least Editor role\n      if (event.id && dashboard?.canAddAnnotations()) {\n        header += `\n          <span class=\"pointer graph-annotation__edit-icon\" ng-click=\"onEdit()\">\n            <i class=\"fa fa-pencil-square\"></i>\n          </span>\n        `;\n      }\n\n      header += `</div>`;\n      tooltip += header;\n      tooltip += '<div class=\"graph-annotation__body\">';\n\n      if (text) {\n        tooltip += '<div ng-non-bindable>' + sanitizeString(text.replace(/\\n/g, '<br>')) + '</div>';\n      }\n\n      const tags = event.tags;\n\n      if (tags && tags.length) {\n        scope.tags = tags;\n        tooltip +=\n          '<span class=\"label label-tag small\" ng-repeat=\"tag in tags\" tag-color-from-name=\"tag\">{{tag}}</span><br/>';\n      }\n\n      tooltip += '</div>';\n      tooltip += '</div>';\n\n      const $tooltip = $(tooltip);\n      $tooltip.appendTo(element);\n\n      $compile(element.contents())(scope);\n    },\n  };\n}\n\ncoreModule.directive('annotationTooltip', annotationTooltipDirective);\n","import { cloneDeep, isNumber } from 'lodash';\nimport { coreModule } from 'app/angular/core_module';\nimport { AnnotationEvent, dateTime } from '@grafana/data';\nimport { MetricsPanelCtrl } from 'app/angular/panel/metrics_panel_ctrl';\nimport { deleteAnnotation, saveAnnotation, updateAnnotation } from '../../../features/annotations/api';\nimport { getDashboardQueryRunner } from '../../../features/query/state/DashboardQueryRunner/DashboardQueryRunner';\n\nexport class EventEditorCtrl {\n  // @ts-ignore initialized through Angular not constructor\n  panelCtrl: MetricsPanelCtrl;\n  // @ts-ignore initialized through Angular not constructor\n  event: AnnotationEvent;\n  timeRange?: { from: number; to: number };\n  form: any;\n  close: any;\n  timeFormated?: string;\n\n  /** @ngInject */\n  constructor() {}\n\n  $onInit() {\n    this.event.panelId = this.panelCtrl.panel.id; // set correct id if in panel edit\n    this.event.dashboardId = this.panelCtrl.dashboard.id;\n\n    // Annotations query returns time as Unix timestamp in milliseconds\n    this.event.time = tryEpochToMoment(this.event.time);\n    if (this.event.isRegion) {\n      this.event.timeEnd = tryEpochToMoment(this.event.timeEnd);\n    }\n\n    this.timeFormated = this.panelCtrl.dashboard.formatDate(this.event.time!);\n  }\n\n  async save(): Promise<void> {\n    if (!this.form.$valid) {\n      return;\n    }\n\n    const saveModel = cloneDeep(this.event);\n    saveModel.time = saveModel.time!.valueOf();\n    saveModel.timeEnd = 0;\n\n    if (saveModel.isRegion) {\n      saveModel.timeEnd = this.event.timeEnd!.valueOf();\n\n      if (saveModel.timeEnd < saveModel.time) {\n        console.log('invalid time');\n        return;\n      }\n    }\n\n    let crudFunction = saveAnnotation;\n    if (saveModel.id) {\n      crudFunction = updateAnnotation;\n    }\n\n    try {\n      await crudFunction(saveModel);\n    } catch (err) {\n      console.log(err);\n    } finally {\n      this.close();\n      getDashboardQueryRunner().run({ dashboard: this.panelCtrl.dashboard, range: this.panelCtrl.range });\n    }\n  }\n\n  async delete(): Promise<void> {\n    try {\n      await deleteAnnotation(this.event);\n    } catch (err) {\n      console.log(err);\n    } finally {\n      this.close();\n      getDashboardQueryRunner().run({ dashboard: this.panelCtrl.dashboard, range: this.panelCtrl.range });\n    }\n  }\n}\n\nfunction tryEpochToMoment(timestamp: any) {\n  if (timestamp && isNumber(timestamp)) {\n    const epoch = Number(timestamp);\n    return dateTime(epoch);\n  } else {\n    return timestamp;\n  }\n}\n\nexport function eventEditor() {\n  return {\n    restrict: 'E',\n    controller: EventEditorCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    templateUrl: 'public/app/features/annotations/partials/event_editor.html',\n    scope: {\n      panelCtrl: '=',\n      event: '=',\n      close: '&',\n    },\n  };\n}\n\ncoreModule.directive('eventEditor', eventEditor);\n","import { find } from 'lodash';\nimport { colors } from '@grafana/ui';\nimport {\n  DataFrame,\n  dateTime,\n  Field,\n  FieldType,\n  getColorForTheme,\n  getFieldDisplayName,\n  getTimeField,\n  TimeRange,\n} from '@grafana/data';\nimport TimeSeries from 'app/core/time_series2';\nimport config from 'app/core/config';\n\ntype Options = {\n  dataList: DataFrame[];\n  range?: TimeRange;\n};\n\nexport class DataProcessor {\n  constructor(private panel: any) {}\n\n  getSeriesList(options: Options): TimeSeries[] {\n    const list: TimeSeries[] = [];\n    const { dataList, range } = options;\n\n    if (!dataList || !dataList.length) {\n      return list;\n    }\n\n    for (let i = 0; i < dataList.length; i++) {\n      const series = dataList[i];\n      const { timeField } = getTimeField(series);\n\n      if (!timeField) {\n        continue;\n      }\n\n      for (let j = 0; j < series.fields.length; j++) {\n        const field = series.fields[j];\n\n        if (field.type !== FieldType.number) {\n          continue;\n        }\n        const name = getFieldDisplayName(field, series, dataList);\n        const datapoints = [];\n\n        for (let r = 0; r < series.length; r++) {\n          datapoints.push([field.values.get(r), dateTime(timeField.values.get(r)).valueOf()]);\n        }\n\n        list.push(this.toTimeSeries(field, name, i, j, datapoints, list.length, range));\n      }\n    }\n\n    // Merge all the rows if we want to show a histogram\n    if (this.panel.xaxis.mode === 'histogram' && !this.panel.stack && list.length > 1) {\n      const first = list[0];\n      first.alias = first.aliasEscaped = 'Count';\n\n      for (let i = 1; i < list.length; i++) {\n        first.datapoints = first.datapoints.concat(list[i].datapoints);\n      }\n\n      return [first];\n    }\n\n    return list;\n  }\n\n  private toTimeSeries(\n    field: Field,\n    alias: string,\n    dataFrameIndex: number,\n    fieldIndex: number,\n    datapoints: any[][],\n    index: number,\n    range?: TimeRange\n  ) {\n    const colorIndex = index % colors.length;\n    const color = this.panel.aliasColors[alias] || colors[colorIndex];\n\n    const series = new TimeSeries({\n      datapoints: datapoints || [],\n      alias: alias,\n      color: getColorForTheme(color, config.theme),\n      unit: field.config ? field.config.unit : undefined,\n      dataFrameIndex,\n      fieldIndex,\n    });\n\n    if (datapoints && datapoints.length > 0 && range) {\n      const last = datapoints[datapoints.length - 1][1];\n      const from = range.from;\n\n      if (last - from.valueOf() < -10000) {\n        // If the data is in reverse order\n        const first = datapoints[0][1];\n        if (first - from.valueOf() < -10000) {\n          series.isOutsideRange = true;\n        }\n      }\n    }\n    return series;\n  }\n\n  setPanelDefaultsForNewXAxisMode() {\n    switch (this.panel.xaxis.mode) {\n      case 'time': {\n        this.panel.bars = false;\n        this.panel.lines = true;\n        this.panel.points = false;\n        this.panel.legend.show = true;\n        this.panel.tooltip.shared = true;\n        this.panel.xaxis.values = [];\n        break;\n      }\n      case 'series': {\n        this.panel.bars = true;\n        this.panel.lines = false;\n        this.panel.points = false;\n        this.panel.stack = false;\n        this.panel.legend.show = false;\n        this.panel.tooltip.shared = false;\n        this.panel.xaxis.values = ['total'];\n        break;\n      }\n      case 'histogram': {\n        this.panel.bars = true;\n        this.panel.lines = false;\n        this.panel.points = false;\n        this.panel.stack = false;\n        this.panel.legend.show = false;\n        this.panel.tooltip.shared = false;\n        break;\n      }\n    }\n  }\n\n  validateXAxisSeriesValue() {\n    switch (this.panel.xaxis.mode) {\n      case 'series': {\n        if (this.panel.xaxis.values.length === 0) {\n          this.panel.xaxis.values = ['total'];\n          return;\n        }\n\n        const validOptions = this.getXAxisValueOptions({});\n        const found: any = find(validOptions, { value: this.panel.xaxis.values[0] });\n        if (!found) {\n          this.panel.xaxis.values = ['total'];\n        }\n        return;\n      }\n    }\n  }\n\n  getXAxisValueOptions(options: any) {\n    switch (this.panel.xaxis.mode) {\n      case 'series': {\n        return [\n          { text: 'Avg', value: 'avg' },\n          { text: 'Min', value: 'min' },\n          { text: 'Max', value: 'max' },\n          { text: 'Total', value: 'total' },\n          { text: 'Count', value: 'count' },\n        ];\n      }\n    }\n\n    return [];\n  }\n\n  pluckDeep(obj: any, property: string) {\n    const propertyParts = property.split('.');\n    let value = obj;\n    for (let i = 0; i < propertyParts.length; ++i) {\n      if (value[propertyParts[i]]) {\n        value = value[propertyParts[i]];\n      } else {\n        return undefined;\n      }\n    }\n    return value;\n  }\n}\n","import { selectors } from '@grafana/e2e-selectors';\nimport { GraphCtrl } from './module';\n\nexport class AxesEditorCtrl {\n  panel: any;\n  panelCtrl: GraphCtrl;\n  logScales: any;\n  xAxisModes: any;\n  xAxisStatOptions: any;\n  xNameSegment: any;\n  selectors: typeof selectors.components.Panels.Visualization.Graph.VisualizationTab;\n\n  /** @ngInject */\n  constructor(private $scope: any) {\n    this.panelCtrl = $scope.ctrl as GraphCtrl;\n    this.panel = this.panelCtrl.panel;\n    this.$scope.ctrl = this;\n\n    this.logScales = {\n      linear: 1,\n      'log (base 2)': 2,\n      'log (base 10)': 10,\n      'log (base 32)': 32,\n      'log (base 1024)': 1024,\n    };\n\n    this.xAxisModes = {\n      Time: 'time',\n      Series: 'series',\n      Histogram: 'histogram',\n      // 'Data field': 'field',\n    };\n\n    this.xAxisStatOptions = [\n      { text: 'Avg', value: 'avg' },\n      { text: 'Min', value: 'min' },\n      { text: 'Max', value: 'max' },\n      { text: 'Total', value: 'total' },\n      { text: 'Count', value: 'count' },\n      { text: 'Current', value: 'current' },\n    ];\n\n    if (this.panel.xaxis.mode === 'custom') {\n      if (!this.panel.xaxis.name) {\n        this.panel.xaxis.name = 'specify field';\n      }\n    }\n    this.selectors = selectors.components.Panels.Visualization.Graph.VisualizationTab;\n  }\n\n  setUnitFormat(axis: { format: any }) {\n    return (unit: string) => {\n      axis.format = unit;\n      // if already set via field config we clear that\n      if (this.panel.fieldConfig.defaults.unit) {\n        this.panel.fieldConfig.defaults.unit = undefined;\n        this.panelCtrl.refresh();\n      } else {\n        this.panelCtrl.render();\n      }\n    };\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  xAxisModeChanged() {\n    this.panelCtrl.processor.setPanelDefaultsForNewXAxisMode();\n    this.panelCtrl.onDataFramesReceived(this.panelCtrl.dataList);\n  }\n\n  xAxisValueChanged() {\n    this.panelCtrl.onDataFramesReceived(this.panelCtrl.dataList);\n  }\n}\n\n/** @ngInject */\nexport function axesEditorComponent() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/graph/axes_editor.html',\n    controller: AxesEditorCtrl,\n  };\n}\n","import { MenuItemProps } from '@grafana/ui';\nimport { FlotDataPoint } from '@grafana/data';\n\nexport class GraphContextMenuCtrl {\n  private source?: FlotDataPoint | null;\n  private scope?: any;\n  menuItemsSupplier?: () => MenuItemProps[];\n  scrollContextElement: HTMLElement | null = null;\n  position: {\n    x: number;\n    y: number;\n  } = { x: 0, y: 0 };\n\n  isVisible: boolean;\n\n  constructor($scope: any) {\n    this.isVisible = false;\n    this.scope = $scope;\n  }\n\n  onClose = () => {\n    if (this.scrollContextElement) {\n      this.scrollContextElement.removeEventListener('scroll', this.onClose);\n    }\n\n    this.scope.$apply(() => {\n      this.isVisible = false;\n    });\n  };\n\n  toggleMenu = (event?: { pageX: number; pageY: number }) => {\n    this.isVisible = !this.isVisible;\n    if (this.isVisible && this.scrollContextElement) {\n      this.scrollContextElement.addEventListener('scroll', this.onClose);\n    }\n\n    if (this.source) {\n      this.position = {\n        x: this.source.pageX,\n        y: this.source.pageY,\n      };\n    } else {\n      this.position = {\n        x: event ? event.pageX : 0,\n        y: event ? event.pageY : 0,\n      };\n    }\n  };\n\n  // Sets element which is considered as a scroll context of given context menu.\n  // Having access to this element allows scroll event attachement for menu to be closed when user scrolls\n  setScrollContextElement = (el: HTMLElement | null) => {\n    this.scrollContextElement = el;\n  };\n\n  setSource = (source: FlotDataPoint | null) => {\n    this.source = source;\n  };\n\n  getSource = () => {\n    return this.source;\n  };\n\n  setMenuItemsSupplier = (menuItemsSupplier: () => MenuItemProps[]) => {\n    this.menuItemsSupplier = menuItemsSupplier;\n  };\n}\n","import './graph';\nimport './series_overrides_ctrl';\nimport './thresholds_form';\nimport './time_regions_form';\nimport './annotation_tooltip';\nimport './event_editor';\n\nimport template from './template';\nimport { defaults, find, without } from 'lodash';\n\nimport { DataProcessor } from './data_processor';\nimport { axesEditorComponent } from './axes_editor';\nimport config from 'app/core/config';\nimport TimeSeries from 'app/core/time_series2';\nimport { DataFrame, FieldConfigProperty, getColorForTheme, PanelEvents, PanelPlugin } from '@grafana/data';\n\nimport { GraphContextMenuCtrl } from './GraphContextMenuCtrl';\nimport { graphPanelMigrationHandler } from './GraphMigrations';\nimport { DataWarning, GraphFieldConfig, GraphPanelOptions } from './types';\n\nimport { auto } from 'angular';\nimport { getLocationSrv } from '@grafana/runtime';\nimport { getDataTimeRange } from './utils';\nimport { changePanelPlugin } from 'app/features/panel/state/actions';\nimport { dispatch } from 'app/store/store';\nimport { ThresholdMapper } from 'app/features/alerting/state/ThresholdMapper';\nimport { appEvents } from '../../../core/core';\nimport { ZoomOutEvent } from '../../../types/events';\nimport { MetricsPanelCtrl } from 'app/angular/panel/metrics_panel_ctrl';\nimport { loadSnapshotData } from '../../../features/dashboard/utils/loadSnapshotData';\nimport { annotationsFromDataFrames } from '../../../features/query/state/DashboardQueryRunner/utils';\n\nexport class GraphCtrl extends MetricsPanelCtrl {\n  static template = template;\n\n  renderError = false;\n  hiddenSeries: any = {};\n  hiddenSeriesTainted = false;\n  seriesList: TimeSeries[] = [];\n  dataList: DataFrame[] = [];\n  annotations: any = [];\n  alertState: any;\n\n  dataWarning?: DataWarning;\n  colors: any = [];\n  subTabIndex = 0;\n  processor: DataProcessor;\n  contextMenuCtrl: GraphContextMenuCtrl;\n\n  panelDefaults: any = {\n    // datasource name, null = default datasource\n    datasource: null,\n    // sets client side (flot) or native graphite png renderer (png)\n    renderer: 'flot',\n    yaxes: [\n      {\n        label: null,\n        show: true,\n        logBase: 1,\n        min: null,\n        max: null,\n        format: 'short',\n      },\n      {\n        label: null,\n        show: true,\n        logBase: 1,\n        min: null,\n        max: null,\n        format: 'short',\n      },\n    ],\n    xaxis: {\n      show: true,\n      mode: 'time',\n      name: null,\n      values: [],\n      buckets: null,\n    },\n    yaxis: {\n      align: false,\n      alignLevel: null,\n    },\n    // show/hide lines\n    lines: true,\n    // fill factor\n    fill: 1,\n    // fill gradient\n    fillGradient: 0,\n    // line width in pixels\n    linewidth: 1,\n    // show/hide dashed line\n    dashes: false,\n    // show/hide line\n    hiddenSeries: false,\n    // length of a dash\n    dashLength: 10,\n    // length of space between two dashes\n    spaceLength: 10,\n    // show hide points\n    points: false,\n    // point radius in pixels\n    pointradius: 2,\n    // show hide bars\n    bars: false,\n    // enable/disable stacking\n    stack: false,\n    // stack percentage mode\n    percentage: false,\n    // legend options\n    legend: {\n      show: true, // disable/enable legend\n      values: false, // disable/enable legend values\n      min: false,\n      max: false,\n      current: false,\n      total: false,\n      avg: false,\n    },\n    // how null points should be handled\n    nullPointMode: 'null',\n    // staircase line mode\n    steppedLine: false,\n    // tooltip options\n    tooltip: {\n      value_type: 'individual',\n      shared: true,\n      sort: 0,\n    },\n    // time overrides\n    timeFrom: null,\n    timeShift: null,\n    // metric queries\n    targets: [{}],\n    // series color overrides\n    aliasColors: {},\n    // other style overrides\n    seriesOverrides: [],\n    thresholds: [],\n    timeRegions: [],\n    options: {\n      // show/hide alert threshold lines and fill\n      alertThreshold: true,\n    },\n  };\n\n  /** @ngInject */\n  constructor($scope: any, $injector: auto.IInjectorService) {\n    super($scope, $injector);\n\n    defaults(this.panel, this.panelDefaults);\n    defaults(this.panel.tooltip, this.panelDefaults.tooltip);\n    defaults(this.panel.legend, this.panelDefaults.legend);\n    defaults(this.panel.xaxis, this.panelDefaults.xaxis);\n    defaults(this.panel.options, this.panelDefaults.options);\n\n    this.useDataFrames = true;\n    this.processor = new DataProcessor(this.panel);\n    this.contextMenuCtrl = new GraphContextMenuCtrl($scope);\n\n    this.events.on(PanelEvents.render, this.onRender.bind(this));\n    this.events.on(PanelEvents.dataFramesReceived, this.onDataFramesReceived.bind(this));\n    this.events.on(PanelEvents.dataSnapshotLoad, this.onDataSnapshotLoad.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n    this.events.on(PanelEvents.initPanelActions, this.onInitPanelActions.bind(this));\n\n    // set axes format from field config\n    const fieldConfigUnit = this.panel.fieldConfig.defaults.unit;\n    if (fieldConfigUnit) {\n      this.panel.yaxes[0].format = fieldConfigUnit;\n    }\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Display', 'public/app/plugins/panel/graph/tab_display.html');\n    this.addEditorTab('Series overrides', 'public/app/plugins/panel/graph/tab_series_overrides.html');\n    this.addEditorTab('Axes', axesEditorComponent);\n    this.addEditorTab('Legend', 'public/app/plugins/panel/graph/tab_legend.html');\n    this.addEditorTab('Thresholds', 'public/app/plugins/panel/graph/tab_thresholds.html');\n    this.addEditorTab('Time regions', 'public/app/plugins/panel/graph/tab_time_regions.html');\n    this.subTabIndex = 0;\n    this.hiddenSeriesTainted = false;\n  }\n\n  onInitPanelActions(actions: any[]) {\n    actions.push({ text: 'Toggle legend', click: 'ctrl.toggleLegend()', shortcut: 'p l' });\n  }\n\n  zoomOut(evt: any) {\n    appEvents.publish(new ZoomOutEvent(2));\n  }\n\n  onDataSnapshotLoad(snapshotData: any) {\n    const { series, annotations } = loadSnapshotData(this.panel, this.dashboard);\n    this.panelData!.annotations = annotations;\n    this.onDataFramesReceived(series);\n  }\n\n  onDataFramesReceived(data: DataFrame[]) {\n    this.dataList = data;\n    this.seriesList = this.processor.getSeriesList({\n      dataList: this.dataList,\n      range: this.range,\n    });\n\n    this.dataWarning = this.getDataWarning();\n\n    this.alertState = undefined;\n    (this.seriesList as any).alertState = undefined;\n    if (this.panelData!.alertState) {\n      this.alertState = this.panelData!.alertState;\n      (this.seriesList as any).alertState = this.alertState.state;\n    }\n\n    this.annotations = [];\n    if (this.panelData!.annotations?.length) {\n      this.annotations = annotationsFromDataFrames(this.panelData!.annotations);\n    }\n\n    this.loading = false;\n    this.render(this.seriesList);\n  }\n\n  getDataWarning(): DataWarning | undefined {\n    const datapointsCount = this.seriesList.reduce((prev, series) => {\n      return prev + series.datapoints.length;\n    }, 0);\n\n    if (datapointsCount === 0) {\n      if (this.dataList) {\n        for (const frame of this.dataList) {\n          if (frame.length && frame.fields?.length) {\n            return {\n              title: 'Unable to graph data',\n              tip: 'Data exists, but is not timeseries',\n              actionText: 'Switch to table view',\n              action: () => {\n                dispatch(changePanelPlugin({ panel: this.panel, pluginId: 'table' }));\n              },\n            };\n          }\n        }\n      }\n\n      return {\n        title: 'No data',\n        tip: 'No data returned from query',\n      };\n    }\n\n    // If any data is in range, do not return an error\n    for (const series of this.seriesList) {\n      if (!series.isOutsideRange) {\n        return undefined;\n      }\n    }\n\n    // All data is outside the time range\n    const dataWarning: DataWarning = {\n      title: 'Data outside time range',\n      tip: 'Can be caused by timezone mismatch or missing time filter in query',\n    };\n\n    const range = getDataTimeRange(this.dataList);\n\n    if (range) {\n      dataWarning.actionText = 'Zoom to data';\n      dataWarning.action = () => {\n        getLocationSrv().update({\n          partial: true,\n          query: {\n            from: range.from,\n            to: range.to,\n          },\n        });\n      };\n    }\n\n    return dataWarning;\n  }\n\n  onRender() {\n    if (!this.seriesList) {\n      return;\n    }\n\n    ThresholdMapper.alertToGraphThresholds(this.panel);\n\n    for (const series of this.seriesList) {\n      series.applySeriesOverrides(this.panel.seriesOverrides);\n\n      // Always use the configured field unit\n      if (series.unit) {\n        this.panel.yaxes[series.yaxis - 1].format = series.unit;\n      }\n      if (this.hiddenSeriesTainted === false && series.hiddenSeries === true) {\n        this.hiddenSeries[series.alias] = true;\n      }\n    }\n  }\n\n  onColorChange = (series: any, color: string) => {\n    series.setColor(getColorForTheme(color, config.theme));\n    this.panel.aliasColors[series.alias] = color;\n    this.render();\n  };\n\n  onToggleSeries = (hiddenSeries: any) => {\n    this.hiddenSeriesTainted = true;\n    this.hiddenSeries = hiddenSeries;\n    this.render();\n  };\n\n  onToggleSort = (sortBy: any, sortDesc: any) => {\n    this.panel.legend.sort = sortBy;\n    this.panel.legend.sortDesc = sortDesc;\n    this.render();\n  };\n\n  onToggleAxis = (info: { alias: any; yaxis: any }) => {\n    let override: any = find(this.panel.seriesOverrides, { alias: info.alias });\n    if (!override) {\n      override = { alias: info.alias };\n      this.panel.seriesOverrides.push(override);\n    }\n    override.yaxis = info.yaxis;\n    this.render();\n  };\n\n  addSeriesOverride(override: any) {\n    this.panel.seriesOverrides.push(override || {});\n  }\n\n  removeSeriesOverride(override: any) {\n    this.panel.seriesOverrides = without(this.panel.seriesOverrides, override);\n    this.render();\n  }\n\n  toggleLegend() {\n    this.panel.legend.show = !this.panel.legend.show;\n    this.render();\n  }\n\n  legendValuesOptionChanged() {\n    const legend = this.panel.legend;\n    legend.values = legend.min || legend.max || legend.avg || legend.current || legend.total;\n    this.render();\n  }\n\n  onContextMenuClose = () => {\n    this.contextMenuCtrl.toggleMenu();\n  };\n\n  getTimeZone = () => this.dashboard.getTimezone();\n\n  getDataFrameByRefId = (refId: string) => {\n    return this.dataList.filter((dataFrame) => dataFrame.refId === refId)[0];\n  };\n\n  migrateToReact() {\n    this.onPluginTypeChange(config.panels['timeseries']);\n  }\n}\n\n// Use new react style configuration\nexport const plugin = new PanelPlugin<GraphPanelOptions, GraphFieldConfig>(null)\n  .useFieldConfig({\n    disableStandardOptions: [\n      FieldConfigProperty.NoValue,\n      FieldConfigProperty.Thresholds,\n      FieldConfigProperty.Max,\n      FieldConfigProperty.Min,\n      FieldConfigProperty.Decimals,\n      FieldConfigProperty.Color,\n      FieldConfigProperty.Mappings,\n    ],\n  })\n  .setDataSupport({ annotations: true, alertStates: true })\n  .setMigrationHandler(graphPanelMigrationHandler);\n\n// Use the angular ctrt rather than a react one\nplugin.angularPanelCtrl = GraphCtrl;\n","const template = `\n<div class=\"graph-panel\" ng-class=\"{'graph-panel--legend-right': ctrl.panel.legend.rightSide}\">\n  <div class=\"graph-panel__chart\" grafana-graph ng-dblclick=\"ctrl.zoomOut()\">\n  </div>\n\n  <div class=\"graph-legend\">\n    <div class=\"graph-legend-content\" graph-legend></div>\n  </div>\n  <div ng-if=\"ctrl.contextMenuCtrl.isVisible\">\n    <graph-context-menu\n      itemsGroup=\"ctrl.contextMenuCtrl.menuItemsSupplier()\"\n      on-close=\"ctrl.onContextMenuClose\"\n      getContextMenuSource=\"ctrl.contextMenuCtrl.getSource\"\n      timeZone=\"ctrl.getTimeZone()\"\n      x=\"ctrl.contextMenuCtrl.position.x\"\n      y=\"ctrl.contextMenuCtrl.position.y\"\n    ></graph-context-menu>\n  </div>\n</div>\n`;\n\nexport default template;\n","import { PanelModel, FieldConfigSource, DataLink } from '@grafana/data';\n\n/**\n * Called when upgrading from a previously saved versoin\n */\nexport const graphPanelMigrationHandler = (panel: PanelModel<any>): Partial<any> => {\n  const fieldConfig: FieldConfigSource = panel.fieldConfig ?? {\n    defaults: {},\n    overrides: [],\n  };\n\n  const options = panel.options || {};\n\n  // Move <7.1 dataLinks to the field section\n  if (options.dataLinks) {\n    fieldConfig.defaults.links = options.dataLinks as DataLink[];\n    delete options.dataLinks;\n  }\n\n  // Mutate the original panel state (only necessary because it is angular)\n  panel.options = options;\n  panel.fieldConfig = fieldConfig;\n  return options;\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 {\n  FieldColorModeId,\n  FieldConfigProperty,\n  FieldType,\n  identityOverrideProcessor,\n  SetFieldConfigOptionsArgs,\n} from '@grafana/data';\nimport { LineStyle, VisibilityMode } from '@grafana/schema';\n\nimport { commonOptionsBuilder, graphFieldOptions } from '@grafana/ui';\nimport { LineStyleEditor } from '../timeseries/LineStyleEditor';\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 { DataFrame, Field, FieldMatcher, FieldType, getFieldDisplayName } from '@grafana/data';\nimport { XYDimensionConfig } from './models.gen';\n\n// TODO: fix import\nimport { XYFieldMatchers } from '@grafana/ui/src/components/GraphNG/types';\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 React, { FC, useMemo } from 'react';\nimport { css } from '@emotion/css';\nimport { IconButton, Label, Select, stylesFactory, useTheme } from '@grafana/ui';\nimport {\n  SelectableValue,\n  getFrameDisplayName,\n  GrafanaTheme,\n  StandardEditorProps,\n  getFieldDisplayName,\n} from '@grafana/data';\n\nimport { XYDimensionConfig, XYChartOptions } from './models.gen';\nimport { getXYDimensions, isGraphable } from './dims';\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        menuShouldPortal\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        menuShouldPortal\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  DataFrame,\n  FieldColorModeId,\n  fieldColorModeRegistry,\n  getDisplayProcessor,\n  getFieldColorModeForField,\n  getFieldDisplayName,\n  getFieldSeriesColor,\n  GrafanaTheme2,\n} from '@grafana/data';\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';\nimport { config } from '@grafana/runtime';\nimport { defaultScatterConfig, ScatterFieldConfig, ScatterLineMode, XYChartOptions } from './models.gen';\nimport { pointWithin, Quadtree, Rect } from '../barchart/quadtree';\nimport { alpha } from '@grafana/data/src/themes/colorManipulator';\nimport uPlot from 'uplot';\nimport { DimensionValues, ScatterHoverCallback, ScatterSeries } from './types';\nimport { isGraphable } from './dims';\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    return {\n      error: e.message,\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          // leon forgot to add these to the uPlot's Scale interface, but they exist!\n          //let xKey = scaleX.key as string;\n          //let yKey = scaleY.key as string;\n          let xKey = series.facets![0].scale;\n          let yKey = series.facets![1].scale;\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: AxisPlacement.Bottom,\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    builder.addAxis({\n      scaleKey,\n      theme,\n      label: field.config.custom.axisLabel,\n      values: (u, splits) => splits.map((s) => field.display!(s).text),\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![frameSeriesIndex](frames[i]);\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';\nimport { stylesFactory } from '@grafana/ui';\nimport { DataFrame, Field, formattedValueToString, getFieldDisplayName, GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { config } from 'app/core/config';\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 React, { PureComponent } from 'react';\nimport { PanelProps } from '@grafana/data';\nimport { XYChartOptions } from './models.gen';\nimport { ScatterHoverEvent, ScatterSeries } from './types';\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';\nimport { prepData, prepScatter } from './scatter';\nimport { config } from '@grafana/runtime';\nimport { TooltipView } from './TooltipView';\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 { PanelPlugin } from '@grafana/data';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { defaultScatterConfig, XYChartOptions, ScatterFieldConfig } from './models.gen';\nimport { getScatterFieldConfig } from './config';\nimport { XYDimsEditor } from './XYDimsEditor';\nimport { XYChartPanel2 } from './XYChartPanel2';\nimport { ColorDimensionEditor, ScaleDimensionEditor } from 'app/features/dimensions/editors';\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","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  `,\n\n  dashlistItem: css`\n    position: relative;\n    list-style: none;\n  `,\n});\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { take } from 'lodash';\nimport { css, cx } from '@emotion/css';\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 { getBackendSrv } from 'app/core/services/backend_srv';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport { DashboardSearchHit } from 'app/features/search/types';\nimport { DashListOptions } from './types';\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: DashListOptions, 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<DashListOptions>) {\n  const [dashboards, setDashboards] = useState(new Map<number, Dashboard>());\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    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  };\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 } = 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  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              <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            </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: 100,\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 { SelectableValue } from '@grafana/data';\n\nimport { FolderInfo, PermissionLevelString } from '../../../../types';\nimport { getFolderById, searchFolders } from '../../../../features/manage-dashboards/state/actions';\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 React, { ReactElement, useCallback, useState } from 'react';\nimport debouncePromise from 'debounce-promise';\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { AsyncSelect } from '@grafana/ui';\n\nimport { FolderInfo, PermissionLevelString } from '../../../../types';\nimport { findOptionWithId, getFolderAsOption, getFoldersAsOptions } from './api';\nimport { PermissionLevel } from './types';\nimport { GENERAL_FOLDER_ID, GENERAL_FOLDER_TITLE } from '../../../../features/search/constants';\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        menuShouldPortal\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 { PanelModel, PanelPlugin } from '@grafana/data';\nimport { DashList } from './DashList';\nimport { DashListOptions } from './types';\nimport React from 'react';\nimport { TagsInput } from '@grafana/ui';\nimport {\n  ALL_FOLDER,\n  GENERAL_FOLDER,\n  ReadonlyFolderPicker,\n} from '../../../core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker';\n\nexport const plugin = new PanelPlugin<DashListOptions>(DashList)\n  .setPanelOptions((builder) => {\n    builder\n      .addBooleanSwitch({\n        path: 'showStarred',\n        name: 'Starred',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        path: 'showRecentlyViewed',\n        name: 'Recently viewed',\n        defaultValue: false,\n      })\n      .addBooleanSwitch({\n        path: 'showSearch',\n        name: 'Search',\n        defaultValue: false,\n      })\n      .addBooleanSwitch({\n        path: 'showHeadings',\n        name: 'Show headings',\n        defaultValue: true,\n      })\n      .addNumberInput({\n        path: 'maxItems',\n        name: 'Max items',\n        defaultValue: 10,\n      })\n      .addTextInput({\n        path: 'query',\n        name: 'Query',\n        defaultValue: '',\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: [],\n        editor(props) {\n          return <TagsInput tags={props.value} onChange={props.onChange} />;\n        },\n      });\n  })\n  .setMigrationHandler((panel: PanelModel<DashListOptions> & 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 from 'react';\nimport { Modal, stylesFactory, useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\n\ninterface Props {\n  pluginName: string;\n  pluginID: string;\n  onConfirm?: () => void;\n  onDismiss?: () => void;\n}\n\nexport function UpdatePluginModal({ pluginName, pluginID, onDismiss }: Props) {\n  const styles = useStyles(getStyles);\n\n  return (\n    <Modal title=\"Update Plugin\" icon=\"cloud-download\" onDismiss={onDismiss} isOpen>\n      <div className={styles.container}>\n        <p>Type the following on the command line to update {pluginName}.</p>\n        <pre>\n          <code>grafana-cli plugins update {pluginID}</code>\n        </pre>\n        <span className={styles.small}>\n          Check out {pluginName} on <a href={`https://grafana.com/plugins/${pluginID}`}>Grafana.com</a> for README and\n          changelog. If you do not have access to the command line, ask your Grafana administator.\n        </span>\n      </div>\n      <p className={styles.updateAllTip}>\n        <img className={styles.inlineLogo} src=\"public/img/grafana_icon.svg\" />\n        <strong>Pro tip</strong>: To update all plugins at once, type{' '}\n        <code className={styles.codeSmall}>grafana-cli plugins update-all</code> on the command line.\n      </p>\n    </Modal>\n  );\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  small: css`\n    font-size: ${theme.typography.size.sm};\n    font-weight: ${theme.typography.weight.regular};\n  `,\n  codeSmall: css`\n    font-size: ${theme.typography.size.xs};\n    padding: ${theme.spacing.xxs};\n    margin: 0 ${theme.spacing.xxs};\n  `,\n  container: css`\n    margin-bottom: calc(${theme.spacing.d} * 2.5);\n  `,\n  updateAllTip: css`\n    color: ${theme.colors.textWeak};\n    font-size: ${theme.typography.size.sm};\n  `,\n  inlineLogo: css`\n    vertical-align: sub;\n    margin-right: calc(${theme.spacing.d} / 3);\n    width: ${theme.spacing.md};\n  `,\n}));\n","import React from 'react';\nimport { useAsync } from 'react-use';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme, PanelProps, PluginMeta, PluginType } from '@grafana/data';\nimport { CustomScrollbar, ModalsController, stylesFactory, Tooltip, useStyles } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { UpdatePluginModal } from './components/UpdatePluginModal';\n\nexport function PluginList(props: PanelProps) {\n  const pluginState = useAsync(async () => {\n    const plugins: PluginMeta[] = await getBackendSrv().get('api/plugins', { embedded: 0, core: 0 });\n    return [\n      { header: 'Installed Apps', list: plugins.filter((p) => p.type === PluginType.app), type: PluginType.app },\n      { header: 'Installed Panels', list: plugins.filter((p) => p.type === PluginType.panel), type: PluginType.panel },\n      {\n        header: 'Installed Datasources',\n        list: plugins.filter((p) => p.type === PluginType.datasource),\n        type: PluginType.datasource,\n      },\n    ];\n  }, []);\n\n  const styles = useStyles(getStyles);\n  const isAdmin = contextSrv.user.isGrafanaAdmin;\n\n  if (pluginState.loading || pluginState.value === undefined) {\n    return null;\n  }\n\n  return (\n    <CustomScrollbar autoHeightMin=\"100%\" autoHeightMax=\"100%\">\n      <div className={styles.pluginList}>\n        {pluginState.value.map((category) => (\n          <div className={styles.section} key={`category-${category.type}`}>\n            <h6 className={styles.sectionHeader}>{category.header}</h6>\n            {category.list.map((plugin) => (\n              <a className={styles.item} href={plugin.defaultNavUrl} key={`plugin-${plugin.id}`}>\n                <img src={plugin.info.logos.small} className={styles.image} width=\"17\" height=\"17\" alt=\"\" />\n                <span className={styles.title}>{plugin.name}</span>\n                <span className={styles.version}>v{plugin.info.version}</span>\n                {isAdmin &&\n                  (plugin.hasUpdate ? (\n                    <ModalsController>\n                      {({ showModal, hideModal }) => (\n                        <Tooltip content={`New version: ${plugin.latestVersion}`} placement=\"top\">\n                          <span\n                            className={cx(styles.message, styles.messageUpdate)}\n                            onClick={(e) => {\n                              e.preventDefault();\n\n                              showModal(UpdatePluginModal, {\n                                pluginID: plugin.id,\n                                pluginName: plugin.name,\n                                onDismiss: hideModal,\n                                isOpen: true,\n                              });\n                            }}\n                          >\n                            Update available!\n                          </span>\n                        </Tooltip>\n                      )}\n                    </ModalsController>\n                  ) : plugin.enabled ? (\n                    <span className={cx(styles.message, styles.messageNoUpdate)}>Up to date</span>\n                  ) : (\n                    <span className={cx(styles.message, styles.messageEnable)}>Enable now</span>\n                  ))}\n              </a>\n            ))}\n\n            {category.list.length === 0 && (\n              <a className={styles.item} href=\"https://grafana.com/plugins\">\n                <span className={styles.noneInstalled}>\n                  None installed. <em className={styles.emphasis}>Browse Grafana.com</em>\n                </span>\n              </a>\n            )}\n          </div>\n        ))}\n      </div>\n    </CustomScrollbar>\n  );\n}\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => ({\n  pluginList: css`\n    display: flex;\n    flex-direction: column;\n  `,\n  section: css`\n    display: flex;\n    flex-direction: column;\n    &:not(:last-of-type) {\n      margin-bottom: 16px;\n    }\n  `,\n  sectionHeader: css`\n    color: ${theme.colors.textWeak};\n    margin-bottom: ${theme.spacing.d};\n  `,\n  image: css`\n    width: 17px;\n    margin-right: ${theme.spacing.xxs};\n  `,\n  title: css`\n    margin-right: calc(${theme.spacing.d} / 3);\n  `,\n  version: css`\n    font-size: ${theme.typography.size.sm};\n    color: ${theme.colors.textWeak};\n  `,\n  item: css`\n    display: flex;\n    justify-content: flex-start;\n    align-items: center;\n    cursor: pointer;\n    margin: ${theme.spacing.xxs};\n    padding: ${theme.spacing.sm};\n    background: ${theme.colors.dashboardBg};\n    border-radius: ${theme.border.radius.md};\n  `,\n  message: css`\n    margin-left: auto;\n    font-size: ${theme.typography.size.sm};\n  `,\n  messageEnable: css`\n    color: ${theme.colors.linkExternal};\n    &:hover {\n      border-bottom: ${theme.border.width.sm} solid ${theme.colors.linkExternal};\n    }\n  `,\n  messageUpdate: css`\n    &:hover {\n      border-bottom: ${theme.border.width.sm} solid ${theme.colors.text};\n    }\n  `,\n  messageNoUpdate: css`\n    color: ${theme.colors.textWeak};\n  `,\n  noneInstalled: css`\n    color: ${theme.colors.textWeak};\n    font-size: ${theme.typography.size.sm};\n  `,\n  emphasis: css`\n    font-weight: ${theme.typography.weight.semibold};\n    font-style: normal;\n    color: ${theme.colors.textWeak};\n  `,\n}));\n","import { PanelPlugin } from '@grafana/data';\nimport { PluginList } from './PluginList';\n\nexport const plugin = new PanelPlugin(PluginList);\n","import { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\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 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\nexport interface UnifiedAlertListOptions {\n  maxItems: number;\n  sortOrder: SortOrder;\n  dashboardAlerts: boolean;\n  alertName: string;\n  showInstances: boolean;\n  folder: { id: number; title: string };\n  stateFilter: {\n    [K in PromAlertingRuleState]: boolean;\n  };\n}\n","import React, { useState } from 'react';\nimport { sortBy } from 'lodash';\nimport { dateMath, dateTime, GrafanaTheme, PanelProps } from '@grafana/data';\nimport { Card, CustomScrollbar, Icon, stylesFactory, useStyles } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport { getBackendSrv, getTemplateSrv } from '@grafana/runtime';\nimport { useAsync } from 'react-use';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { AlertRuleDTO, AnnotationItemDTO } from 'app/types';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\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\n                      heading={alert.name}\n                      href={`${alert.url}?viewPanel=${alert.panelId}`}\n                      className={styles.cardContainer}\n                    >\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 heading={alert.alertName} className={styles.cardContainer}>\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","import React, { useEffect, useMemo, useState } from 'react';\nimport pluralize from 'pluralize';\nimport { Icon, useStyles2 } from '@grafana/ui';\nimport { Alert, PromRuleWithLocation } from 'app/types/unified-alerting';\nimport { AlertLabels } from 'app/features/alerting/unified/components/AlertLabels';\nimport { AlertStateTag } from 'app/features/alerting/unified/components/rules/AlertStateTag';\nimport { dateTime, GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\nimport { omit } from 'lodash';\nimport { alertInstanceKey } from 'app/features/alerting/unified/utils/rules';\n\ninterface Props {\n  ruleWithLocation: PromRuleWithLocation;\n  showInstances: boolean;\n}\n\nexport const AlertInstances = ({ ruleWithLocation, showInstances }: Props) => {\n  const { rule } = ruleWithLocation;\n  const [displayInstances, setDisplayInstances] = useState<boolean>(showInstances);\n  const styles = useStyles2(getStyles);\n\n  useEffect(() => {\n    setDisplayInstances(showInstances);\n  }, [showInstances]);\n\n  // sort instances, because API returns them in random order every time\n  const sortedAlerts = useMemo(\n    (): Alert[] =>\n      displayInstances\n        ? rule.alerts.slice().sort((a, b) => alertInstanceKey(a).localeCompare(alertInstanceKey(b)))\n        : [],\n    [rule, displayInstances]\n  );\n\n  return (\n    <div>\n      {rule.state !== PromAlertingRuleState.Inactive && (\n        <div className={styles.instance} onClick={() => setDisplayInstances(!displayInstances)}>\n          <Icon name={displayInstances ? 'angle-down' : 'angle-right'} size={'md'} />\n          <span>{`${rule.alerts.length} ${pluralize('instance', rule.alerts.length)}`}</span>\n        </div>\n      )}\n\n      {!!sortedAlerts.length && (\n        <ol className={styles.list}>\n          {sortedAlerts.map((alert, index) => {\n            return (\n              <li className={styles.listItem} key={`${alert.activeAt}-${index}`}>\n                <div>\n                  <AlertStateTag state={alert.state} />\n                  <span className={styles.date}>{dateTime(alert.activeAt).format('YYYY-MM-DD HH:mm:ss')}</span>\n                </div>\n                <AlertLabels labels={omit(alert.labels, 'alertname')} />\n              </li>\n            );\n          })}\n        </ol>\n      )}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  instance: css`\n    cursor: pointer;\n  `,\n  list: css`\n    list-style-type: none;\n  `,\n  listItem: css`\n    margin-top: ${theme.spacing(1)};\n  `,\n  date: css`\n    font-size: ${theme.typography.bodySmall.fontSize};\n    padding-left: ${theme.spacing(0.5)};\n  `,\n});\n","import React, { useEffect, useMemo } from 'react';\nimport { sortBy } from 'lodash';\nimport { useDispatch } from 'react-redux';\nimport { GrafanaTheme, GrafanaTheme2, intervalToAbbreviatedDurationString, PanelProps } from '@grafana/data';\nimport { CustomScrollbar, Icon, IconName, LoadingPlaceholder, useStyles, useStyles2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\n\nimport { AlertInstances } from './AlertInstances';\nimport alertDef from 'app/features/alerting/state/alertDef';\nimport { SortOrder, UnifiedAlertListOptions } from './types';\n\nimport { flattenRules, alertStateToState, getFirstActiveAt } from 'app/features/alerting/unified/utils/rules';\nimport { PromRuleWithLocation } from 'app/types/unified-alerting';\nimport { fetchAllPromRulesAction } from 'app/features/alerting/unified/state/actions';\nimport { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector';\nimport { getAllRulesSourceNames } from 'app/features/alerting/unified/utils/datasource';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { Annotation, RULE_LIST_POLL_INTERVAL_MS } from 'app/features/alerting/unified/utils/constants';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nexport function UnifiedAlertList(props: PanelProps<UnifiedAlertListOptions>) {\n  const dispatch = useDispatch();\n  const rulesDataSourceNames = useMemo(getAllRulesSourceNames, []);\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 = useStyles(getStyles);\n  const stateStyle = useStyles2(getStateTagStyles);\n\n  const rules = useMemo(\n    () =>\n      filterRules(\n        props.options,\n        sortRules(\n          props.options.sortOrder,\n          Object.values(promRulesRequests).flatMap(({ result = [] }) => flattenRules(result))\n        )\n      ),\n    [props.options, promRulesRequests]\n  );\n\n  const rulesToDisplay = rules.length <= props.options.maxItems ? rules : rules.slice(0, props.options.maxItems);\n\n  const noAlertsMessage = rules.length ? '' : 'No alerts';\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          <ol className={styles.alertRuleList}>\n            {haveResults &&\n              rulesToDisplay.map((ruleWithLocation, index) => {\n                const { rule, namespaceName, groupName } = ruleWithLocation;\n                const firstActiveAt = getFirstActiveAt(rule);\n                return (\n                  <li\n                    className={styles.alertRuleItem}\n                    key={`alert-${namespaceName}-${groupName}-${rule.name}-${index}`}\n                  >\n                    <div className={stateStyle.icon}>\n                      <Icon\n                        name={alertDef.getStateDisplayModel(rule.state).iconClass as IconName}\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]]}>{rule.state.toUpperCase()}</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 ruleWithLocation={ruleWithLocation} showInstances={props.options.showInstances} />\n                    </div>\n                  </li>\n                );\n              })}\n          </ol>\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(options: PanelProps<UnifiedAlertListOptions>['options'], rules: PromRuleWithLocation[]) {\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    filteredRules = filteredRules.filter(({ rule: { name } }) =>\n      name.toLocaleLowerCase().includes(options.alertName.toLocaleLowerCase())\n    );\n  }\n  if (Object.values(options.stateFilter).some((value) => value)) {\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.inactive && rule.rule.state === PromAlertingRuleState.Inactive)\n      );\n    });\n  }\n  if (options.folder) {\n    filteredRules = filteredRules.filter((rule) => {\n      return rule.namespaceName === options.folder.title;\n    });\n  }\n\n  return filteredRules;\n}\n\nconst getStyles = (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    & > * {\n      margin-right: ${theme.spacing.sm};\n    }\n  `,\n  alertName: css`\n    font-size: ${theme.typography.size.md};\n    font-weight: ${theme.typography.weight.bold};\n  `,\n  alertDuration: css`\n    font-size: ${theme.typography.size.sm};\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  instanceDetails: css`\n    min-width: 1px;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\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.typography.size.sm};\n    /* padding: ${theme.spacing(2, 0)}; */\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  //   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  // `,\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  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","import React from 'react';\nimport { PanelPlugin } from '@grafana/data';\nimport { TagsInput } from '@grafana/ui';\nimport { AlertList } from './AlertList';\nimport { UnifiedAlertList } from './UnifiedAlertList';\nimport { AlertListOptions, ShowOption, SortOrder, UnifiedAlertListOptions } from './types';\nimport { alertListPanelMigrationHandler } from './AlertListMigrationHandler';\nimport { config } from '@grafana/runtime';\nimport { RuleFolderPicker } from 'app/features/alerting/unified/components/rule-editor/RuleFolderPicker';\nimport {\n  ALL_FOLDER,\n  GENERAL_FOLDER,\n  ReadonlyFolderPicker,\n} from '../../../core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker';\nimport { AlertListSuggestionsSupplier } from './suggestions';\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    .addNumberInput({\n      name: 'Max items',\n      path: 'maxItems',\n      defaultValue: 20,\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    .addBooleanSwitch({\n      path: 'showInstances',\n      name: 'Show alert instances',\n      defaultValue: false,\n      category: ['Options'],\n    })\n    .addTextInput({\n      path: 'alertName',\n      name: 'Alert name',\n      defaultValue: '',\n      category: ['Filter'],\n    })\n    .addCustomEditor({\n      path: 'folder',\n      name: 'Folder',\n      id: 'folder',\n      defaultValue: null,\n      editor: function RenderFolderPicker(props) {\n        return (\n          <RuleFolderPicker\n            {...props}\n            enableReset={true}\n            onChange={({ title, id }) => {\n              return props.onChange({ title, id });\n            }}\n          />\n        );\n      },\n      category: ['Filter'],\n    })\n    .addBooleanSwitch({\n      path: 'stateFilter.firing',\n      name: 'Alerting',\n      defaultValue: true,\n      category: ['State filter'],\n    })\n    .addBooleanSwitch({\n      path: 'stateFilter.pending',\n      name: 'Pending',\n      defaultValue: true,\n      category: ['State filter'],\n    })\n    .addBooleanSwitch({\n      path: 'stateFilter.inactive',\n      name: 'Inactive',\n      defaultValue: false,\n      category: ['State filter'],\n    });\n});\n\nexport const plugin = config.unifiedAlertingEnabled ? unifiedAlertList : alertList;\n","import { PanelModel } from '@grafana/data';\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';\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 React, { FC, MouseEvent, useCallback } from 'react';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { useStyles } from '@grafana/ui';\n\nimport { TagBadge } from '../../../core/components/TagFilter/TagBadge';\n\ninterface Props {\n  tags?: string[];\n  remove?: boolean;\n  onClick: (tag: string, remove?: boolean) => void;\n}\n\nexport const AnnotationListItemTags: FC<Props> = ({ tags, remove, onClick }) => {\n  const styles = useStyles(getStyles);\n  const onTagClicked = useCallback(\n    (e: MouseEvent, tag: string) => {\n      e.stopPropagation();\n      onClick(tag, remove);\n    },\n    [onClick, remove]\n  );\n\n  if (!tags || !tags.length) {\n    return null;\n  }\n\n  return (\n    <>\n      {tags.map((tag) => {\n        return (\n          <span key={tag} onClick={(e) => onTagClicked(e, tag)} className={styles.pointer}>\n            <TagBadge label={tag} removeIcon={Boolean(remove)} count={0} />\n          </span>\n        );\n      })}\n    </>\n  );\n};\n\nfunction getStyles(theme: GrafanaTheme) {\n  return {\n    pointer: css`\n      cursor: pointer;\n      padding: ${theme.spacing.xxs};\n    `,\n  };\n}\n","import React, { FC, MouseEvent } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { AnnotationEvent, DateTimeInput, GrafanaTheme2, PanelProps } from '@grafana/data';\nimport { styleMixins, Tooltip, useStyles2 } from '@grafana/ui';\nimport { AnnoOptions } from './types';\nimport { AnnotationListItemTags } from './AnnotationListItemTags';\n\ninterface Props extends Pick<PanelProps<AnnoOptions>, '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 = (e: MouseEvent) => {\n    e.stopPropagation();\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    <div>\n      <span className={cx(styles.item, styles.link, styles.pointer)} onClick={onItemClick}>\n        <div className={styles.title}>\n          <span>{text}</span>\n          {showTimeStamp ? <TimeStamp formatDate={formatDate} time={time!} /> : null}\n          {showTimeStampEnd ? <span className={styles.time}>-</span> : null}\n          {showTimeStampEnd ? <TimeStamp formatDate={formatDate} time={timeEnd!} /> : null}\n        </div>\n        <div className={styles.login}>\n          {showAvatar ? <Avatar email={email} login={login!} avatarUrl={avatarUrl} onClick={onLoginClick} /> : null}\n          {showTags ? <AnnotationListItemTags tags={tags} remove={false} onClick={onTagClick} /> : null}\n        </div>\n      </span>\n    </div>\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    <div>\n      <Tooltip content={tooltipContent} theme=\"info\" placement=\"top\">\n        <span onClick={onAvatarClick} className={styles.avatar}>\n          <img src={avatarUrl} alt=\"avatar icon\" />\n        </span>\n      </Tooltip>\n    </div>\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    pointer: css`\n      cursor: pointer;\n    `,\n    item: css`\n      margin: ${theme.spacing(0.5)};\n      padding: ${theme.spacing(1)};\n      ${styleMixins.listItem(theme)}// display: flex;\n    `,\n    title: css`\n      flex-basis: 80%;\n    `,\n    link: css`\n      display: flex;\n\n      .fa {\n        padding-top: ${theme.spacing(0.5)};\n      }\n\n      .fa-star {\n        color: ${theme.v1.palette.orange};\n      }\n    `,\n    login: css`\n      align-self: center;\n      flex: auto;\n      display: flex;\n      justify-content: flex-end;\n      font-size: ${theme.typography.bodySmall.fontSize};\n    `,\n    time: css`\n      margin-left: ${theme.spacing(1)};\n      margin-right: ${theme.spacing(1)}\n      font-size: ${theme.typography.bodySmall.fontSize};\n      color: ${theme.colors.text.secondary};\n    `,\n    avatar: css`\n      padding: ${theme.spacing(0.5)};\n      img {\n        border-radius: 50%;\n        width: ${theme.spacing(2)};\n        height: ${theme.spacing(2)};\n      }\n    `,\n  };\n}\n","// Libraries\nimport React, { PureComponent } from 'react';\n// Types\nimport { AnnoOptions } from './types';\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 { AbstractList } from '@grafana/ui/src/components/List/AbstractList';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport appEvents from 'app/core/app_events';\nimport { AnnotationListItem } from './AnnotationListItem';\nimport { AnnotationListItemTags } from './AnnotationListItemTags';\nimport { CustomScrollbar, stylesFactory } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { Subscription } from 'rxjs';\n\ninterface UserInfo {\n  id?: number;\n  login?: string;\n  email?: string;\n}\n\nexport interface Props extends PanelProps<AnnoOptions> {}\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\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.dashboardId = getDashboardSrv().getCurrent()?.id;\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?.id === anno.dashboardId) {\n      locationService.partial(params);\n      return;\n    }\n\n    const result = await getBackendSrv().get('/api/search', { dashboardIds: anno.dashboardId });\n    if (result && result.length && result[0].id === anno.dashboardId) {\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.dashboardId]);\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    const queryTags = remove ? this.state.queryTags.filter((item) => item !== tag) : [...this.state.queryTags, tag];\n\n    this.setState({ queryTags });\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  renderTags = (tags?: string[], remove?: boolean): JSX.Element | null => {\n    return <AnnotationListItemTags tags={tags} remove={remove} onClick={this.onTagClick} />;\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>\n            <b>Filter: &nbsp; </b>\n            {queryUser && (\n              <span onClick={this.onClearUser} className=\"pointer\">\n                {queryUser.email}\n              </span>\n            )}\n            {queryTags.length > 0 && this.renderTags(queryTags, true)}\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}));\n","import React from 'react';\nimport { PanelModel, PanelPlugin } from '@grafana/data';\nimport { TagsInput } from '@grafana/ui';\nimport { AnnoListPanel } from './AnnoListPanel';\nimport { AnnoOptions } from './types';\nimport { truncate } from '@sentry/utils';\n\nexport const plugin = new PanelPlugin<AnnoOptions>(AnnoListPanel)\n  .setPanelOptions((builder) => {\n    builder\n      .addRadio({\n        category: ['Annotation query'],\n        path: 'onlyFromThisDashboard',\n        name: 'Query filter',\n        defaultValue: false,\n        settings: {\n          options: [\n            { value: false, label: 'All dashboards' },\n            { value: true, label: 'This dashboard' },\n          ] as any, // does not like boolean, but works fine!\n        },\n      })\n      .addRadio({\n        category: ['Annotation query'],\n        path: 'onlyInTimeRange',\n        name: 'Time range',\n        defaultValue: false,\n        settings: {\n          options: [\n            { value: false, label: 'None' },\n            { value: true, label: 'This dashboard' },\n          ] as any, // does not like boolean, but works fine!\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: 10,\n      })\n      .addBooleanSwitch({\n        category: ['Display'],\n        path: 'showUser',\n        name: 'Show user',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        category: ['Display'],\n        path: 'showTime',\n        name: 'Show time',\n        defaultValue: true,\n      })\n      .addBooleanSwitch({\n        category: ['Display'],\n        path: 'showTags',\n        name: 'Show tags',\n        defaultValue: true,\n      })\n      .addRadio({\n        category: ['Link behavior'],\n        path: 'navigateToPanel',\n        name: 'Link target',\n        defaultValue: truncate,\n        settings: {\n          options: [\n            { value: true, label: 'Panel' },\n            { value: false, label: 'Dashboard' },\n          ] as any, // does not like boolean, but works fine!\n        },\n      })\n      .addTextInput({\n        category: ['Link behavior'],\n        path: 'navigateBefore',\n        name: 'Time before',\n        defaultValue: '10m',\n        description: '',\n      })\n      .addTextInput({\n        category: ['Link behavior'],\n        path: 'navigateAfter',\n        name: 'Time after',\n        defaultValue: '10m',\n        description: '',\n      });\n  })\n  // TODO, we should support this directly in the plugin infrastructure\n  .setPanelChangeHandler((panel: PanelModel<AnnoOptions>, prevPluginId: string, prevOptions: any) => {\n    if (prevPluginId === 'ryantxu-annolist-panel') {\n      return prevOptions as AnnoOptions;\n    }\n    return panel.options;\n  });\n","import * as d3 from 'd3';\nimport * as d3ScaleChromatic from 'd3-scale-chromatic';\n\nexport function getColorScale(colorScheme: any, lightTheme: boolean, maxValue: number, minValue = 0): (d: any) => any {\n  //@ts-ignore\n  const colorInterpolator = d3ScaleChromatic[colorScheme.value];\n  const colorScaleInverted = colorScheme.invert === 'always' || colorScheme.invert === (lightTheme ? 'light' : 'dark');\n\n  const start = colorScaleInverted ? maxValue : minValue;\n  const end = colorScaleInverted ? minValue : maxValue;\n\n  return d3.scaleSequential(colorInterpolator).domain([start, end]);\n}\n\nexport function getOpacityScale(\n  options: { cardColor?: null; colorScale?: any; exponent?: any },\n  maxValue: number,\n  minValue = 0\n): any {\n  let legendOpacityScale;\n  if (options.colorScale === 'linear') {\n    legendOpacityScale = d3.scaleLinear().domain([minValue, maxValue]).range([0, 1]);\n  } else if (options.colorScale === 'sqrt') {\n    legendOpacityScale = d3.scalePow().exponent(options.exponent).domain([minValue, maxValue]).range([0, 1]);\n  }\n  return legendOpacityScale;\n}\n","import { find, isEmpty, isNil, sortBy, uniq } from 'lodash';\nimport $ from 'jquery';\nimport * as d3 from 'd3';\nimport { contextSrv } from 'app/core/core';\nimport { tickStep } from 'app/core/utils/ticks';\nimport { getColorScale, getOpacityScale } from './color_scale';\nimport coreModule from 'app/angular/core_module';\nimport { PanelEvents, getColorForTheme } from '@grafana/data';\nimport { config } from 'app/core/config';\n\nconst LEGEND_HEIGHT_PX = 6;\nconst LEGEND_WIDTH_PX = 100;\nconst LEGEND_TICK_SIZE = 0;\nconst LEGEND_VALUE_MARGIN = 0;\nconst LEGEND_PADDING_LEFT = 10;\nconst LEGEND_SEGMENT_WIDTH = 10;\n\n/**\n * Color legend for heatmap editor.\n */\ncoreModule.directive('colorLegend', () => {\n  return {\n    restrict: 'E',\n    template: '<div class=\"heatmap-color-legend\"><svg width=\"16.5rem\" height=\"24px\"></svg></div>',\n    link: (scope: any, elem, attrs) => {\n      const ctrl = scope.ctrl;\n      const panel = scope.ctrl.panel;\n\n      render();\n\n      ctrl.events.on(PanelEvents.render, () => {\n        render();\n      });\n\n      function render() {\n        const legendElem = $(elem).find('svg');\n        const legendWidth = Math.floor(legendElem.outerWidth() ?? 10);\n\n        if (panel.color.mode === 'spectrum') {\n          const colorScheme: any = find(ctrl.colorSchemes, {\n            value: panel.color.colorScheme,\n          });\n          const colorScale = getColorScale(colorScheme, contextSrv.user.lightTheme, legendWidth);\n          drawSimpleColorLegend(elem, colorScale);\n        } else if (panel.color.mode === 'opacity') {\n          const colorOptions = panel.color;\n          drawSimpleOpacityLegend(elem, colorOptions);\n        }\n      }\n    },\n  };\n});\n\n/**\n * Heatmap legend with scale values.\n */\ncoreModule.directive('heatmapLegend', () => {\n  return {\n    restrict: 'E',\n    template: `<div class=\"heatmap-color-legend\"><svg width=\"${LEGEND_WIDTH_PX}px\" height=\"${LEGEND_HEIGHT_PX}px\"></svg></div>`,\n    link: (scope: any, elem, attrs) => {\n      const ctrl = scope.ctrl;\n      const panel = scope.ctrl.panel;\n\n      render();\n      ctrl.events.on(PanelEvents.render, () => {\n        render();\n      });\n\n      function render() {\n        clearLegend(elem);\n        if (!isEmpty(ctrl.data) && !isEmpty(ctrl.data.cards)) {\n          const cardStats = ctrl.data.cardStats;\n          const rangeFrom = isNil(panel.color.min) ? Math.max(cardStats.min, 0) : panel.color.min;\n          const rangeTo = isNil(panel.color.max) ? cardStats.max : panel.color.max;\n          const maxValue = cardStats.max;\n          const minValue = cardStats.min;\n\n          if (panel.color.mode === 'spectrum') {\n            const colorScheme: any = find(ctrl.colorSchemes, {\n              value: panel.color.colorScheme,\n            });\n            drawColorLegend(elem, colorScheme, rangeFrom, rangeTo, maxValue, minValue);\n          } else if (panel.color.mode === 'opacity') {\n            const colorOptions = panel.color;\n            drawOpacityLegend(elem, colorOptions, rangeFrom, rangeTo, maxValue, minValue);\n          }\n        }\n      }\n    },\n  };\n});\n\nfunction drawColorLegend(\n  elem: JQuery,\n  colorScheme: any,\n  rangeFrom: number,\n  rangeTo: number,\n  maxValue: number,\n  minValue: number\n) {\n  const legendElem = $(elem).find('svg');\n  const legend = d3.select(legendElem.get(0));\n  clearLegend(elem);\n\n  const legendWidth = Math.floor(legendElem.outerWidth() ?? 10) - 30;\n  const legendHeight = legendElem.attr('height') as any;\n\n  const rangeStep = ((rangeTo - rangeFrom) / legendWidth) * LEGEND_SEGMENT_WIDTH;\n  const widthFactor = legendWidth / (rangeTo - rangeFrom);\n  const valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n  const colorScale = getColorScale(colorScheme, contextSrv.user.lightTheme, rangeTo, rangeFrom);\n  legend\n    .append('g')\n    .attr('class', 'legend-color-bar')\n    .attr('transform', 'translate(' + LEGEND_PADDING_LEFT + ',0)')\n    .selectAll('.heatmap-color-legend-rect')\n    .data(valuesRange)\n    .enter()\n    .append('rect')\n    .attr('x', (d) => Math.round((d - rangeFrom) * widthFactor))\n    .attr('y', 0)\n    .attr('width', Math.round(rangeStep * widthFactor + 1)) // Overlap rectangles to prevent gaps\n    .attr('height', legendHeight)\n    .attr('stroke-width', 0)\n    .attr('fill', (d) => colorScale(d));\n\n  drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange);\n}\n\nfunction drawOpacityLegend(\n  elem: JQuery,\n  options: { cardColor: null },\n  rangeFrom: number,\n  rangeTo: number,\n  maxValue: any,\n  minValue: number\n) {\n  const legendElem = $(elem).find('svg');\n  const legend = d3.select(legendElem.get(0));\n  clearLegend(elem);\n\n  const legendWidth = Math.floor(legendElem.outerWidth() ?? 30) - 30;\n  const legendHeight = legendElem.attr('height') as any;\n\n  const rangeStep = ((rangeTo - rangeFrom) / legendWidth) * LEGEND_SEGMENT_WIDTH;\n  const widthFactor = legendWidth / (rangeTo - rangeFrom);\n  const valuesRange = d3.range(rangeFrom, rangeTo, rangeStep);\n\n  const opacityScale = getOpacityScale(options, rangeTo, rangeFrom);\n  legend\n    .append('g')\n    .attr('class', 'legend-color-bar')\n    .attr('transform', 'translate(' + LEGEND_PADDING_LEFT + ',0)')\n    .selectAll('.heatmap-opacity-legend-rect')\n    .data(valuesRange)\n    .enter()\n    .append('rect')\n    .attr('x', (d) => Math.round((d - rangeFrom) * widthFactor))\n    .attr('y', 0)\n    .attr('width', Math.round(rangeStep * widthFactor))\n    .attr('height', legendHeight)\n    .attr('stroke-width', 0)\n    .attr('fill', options.cardColor)\n    .style('opacity', (d) => opacityScale(d));\n\n  drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange);\n}\n\nfunction drawLegendValues(\n  elem: JQuery,\n  rangeFrom: number,\n  rangeTo: number,\n  maxValue: any,\n  minValue: any,\n  legendWidth: number,\n  valuesRange: number[]\n) {\n  const legendElem = $(elem).find('svg');\n  const legend = d3.select(legendElem.get(0));\n\n  if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) {\n    return;\n  }\n\n  const legendValueScale = d3.scaleLinear().domain([rangeFrom, rangeTo]).range([0, legendWidth]);\n\n  const ticks = buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue);\n  const xAxis = d3.axisBottom(legendValueScale).tickValues(ticks).tickSize(LEGEND_TICK_SIZE);\n\n  const colorRect = legendElem.find(':first-child');\n  const posY = getSvgElemHeight(legendElem) + LEGEND_VALUE_MARGIN;\n  const posX = getSvgElemX(colorRect) + LEGEND_PADDING_LEFT;\n\n  d3.select(legendElem.get(0))\n    .append('g')\n    .attr('class', 'axis')\n    .attr('transform', 'translate(' + posX + ',' + posY + ')')\n    .call(xAxis);\n\n  legend.select('.axis').select('.domain').remove();\n}\n\nfunction drawSimpleColorLegend(elem: JQuery, colorScale: any) {\n  const legendElem = $(elem).find('svg');\n  clearLegend(elem);\n\n  const legendWidth = Math.floor(legendElem.outerWidth() ?? 30);\n  const legendHeight = legendElem.attr('height') as any;\n\n  if (legendWidth) {\n    const valuesNumber = Math.floor(legendWidth / 2);\n    const rangeStep = Math.floor(legendWidth / valuesNumber);\n    const valuesRange = d3.range(0, legendWidth, rangeStep);\n\n    const legend = d3.select(legendElem.get(0));\n    const legendRects = legend.selectAll('.heatmap-color-legend-rect').data(valuesRange);\n\n    legendRects\n      .enter()\n      .append('rect')\n      .attr('x', (d) => d)\n      .attr('y', 0)\n      .attr('width', rangeStep + 1) // Overlap rectangles to prevent gaps\n      .attr('height', legendHeight)\n      .attr('stroke-width', 0)\n      .attr('fill', (d) => colorScale(d));\n  }\n}\n\nfunction drawSimpleOpacityLegend(elem: JQuery, options: { colorScale: string; exponent: number; cardColor: string }) {\n  const legendElem = $(elem).find('svg');\n  clearLegend(elem);\n\n  const legend = d3.select(legendElem.get(0));\n  const legendWidth = Math.floor(legendElem.outerWidth() ?? 30);\n  const legendHeight = legendElem.attr('height') as any;\n\n  if (legendWidth) {\n    let legendOpacityScale: any;\n    if (options.colorScale === 'linear') {\n      legendOpacityScale = d3.scaleLinear().domain([0, legendWidth]).range([0, 1]);\n    } else if (options.colorScale === 'sqrt') {\n      legendOpacityScale = d3.scalePow().exponent(options.exponent).domain([0, legendWidth]).range([0, 1]);\n    }\n\n    const rangeStep = 10;\n    const valuesRange = d3.range(0, legendWidth, rangeStep);\n    const legendRects = legend.selectAll('.heatmap-opacity-legend-rect').data(valuesRange);\n\n    legendRects\n      .enter()\n      .append('rect')\n      .attr('x', (d) => d)\n      .attr('y', 0)\n      .attr('width', rangeStep)\n      .attr('height', legendHeight)\n      .attr('stroke-width', 0)\n      .attr('fill', getColorForTheme(options.cardColor, config.theme))\n      .style('opacity', (d) => legendOpacityScale(d));\n  }\n}\n\nfunction clearLegend(elem: JQuery) {\n  const legendElem = $(elem).find('svg');\n  legendElem.empty();\n}\n\nfunction getSvgElemX(elem: JQuery) {\n  const svgElem: any = elem.get(0) as any;\n  if (svgElem && svgElem.x && svgElem.x.baseVal) {\n    return svgElem.x.baseVal.value;\n  } else {\n    return 0;\n  }\n}\n\nfunction getSvgElemHeight(elem: JQuery<any>) {\n  const svgElem: any = elem.get(0);\n  if (svgElem && svgElem.height && svgElem.height.baseVal) {\n    return svgElem.height.baseVal.value;\n  } else {\n    return 0;\n  }\n}\n\nfunction buildLegendTicks(rangeFrom: number, rangeTo: number, maxValue: number, minValue: number) {\n  const range = rangeTo - rangeFrom;\n  const tickStepSize = tickStep(rangeFrom, rangeTo, 3);\n  const ticksNum = Math.ceil(range / tickStepSize);\n  const firstTick = getFirstCloseTick(rangeFrom, tickStepSize);\n  let ticks = [];\n\n  for (let i = 0; i < ticksNum; i++) {\n    const current = firstTick + tickStepSize * i;\n    // Add user-defined min and max if it had been set\n    if (isValueCloseTo(minValue, current, tickStepSize)) {\n      ticks.push(minValue);\n      continue;\n    } else if (minValue < current) {\n      ticks.push(minValue);\n    }\n    if (isValueCloseTo(maxValue, current, tickStepSize)) {\n      ticks.push(maxValue);\n      continue;\n    } else if (maxValue < current) {\n      ticks.push(maxValue);\n    }\n    ticks.push(current);\n  }\n  if (!isValueCloseTo(maxValue, rangeTo, tickStepSize)) {\n    ticks.push(maxValue);\n  }\n  ticks.push(rangeTo);\n  ticks = sortBy(uniq(ticks));\n  return ticks;\n}\n\nfunction isValueCloseTo(val: number, valueTo: number, step: number) {\n  const diff = Math.abs(val - valueTo);\n  return diff < step * 0.3;\n}\n\nfunction getFirstCloseTick(minValue: number, step: number) {\n  if (minValue < 0) {\n    return Math.floor(minValue / step) * step;\n  }\n  return 0;\n}\n","export class AxesEditorCtrl {\n  panel: any;\n  panelCtrl: any;\n  logScales: any;\n  dataFormats: any;\n  yBucketBoundModes: any;\n\n  /** @ngInject */\n  constructor($scope: any, uiSegmentSrv: any) {\n    $scope.editor = this;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n\n    this.logScales = {\n      linear: 1,\n      'log (base 2)': 2,\n      'log (base 10)': 10,\n      'log (base 32)': 32,\n      'log (base 1024)': 1024,\n    };\n\n    this.dataFormats = {\n      'Time series': 'timeseries',\n      'Time series buckets': 'tsbuckets',\n    };\n\n    this.yBucketBoundModes = {\n      Auto: 'auto',\n      Upper: 'upper',\n      Lower: 'lower',\n      Middle: 'middle',\n    };\n  }\n\n  setUnitFormat = (unit: string) => {\n    this.panel.yAxis.format = unit;\n    this.panelCtrl.render();\n  };\n}\n\n/** @ngInject */\nexport function axesEditor() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/heatmap/partials/axes_editor.html',\n    controller: AxesEditorCtrl,\n  };\n}\n","export class HeatmapDisplayEditorCtrl {\n  panel: any;\n  panelCtrl: any;\n\n  /** @ngInject */\n  constructor($scope: any) {\n    $scope.editor = this;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n  }\n}\n\n/** @ngInject */\nexport function heatmapDisplayEditor() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/heatmap/partials/display_editor.html',\n    controller: HeatmapDisplayEditorCtrl,\n  };\n}\n","import { concat, forEach, isEmpty, isEqual, isNumber, sortBy } from 'lodash';\nimport { TimeSeries } from 'app/core/core';\nimport { Bucket, HeatmapCard, HeatmapCardStats, YBucket, XBucket } from './types';\n\nconst VALUE_INDEX = 0;\nconst TIME_INDEX = 1;\n\n/**\n * Convert histogram represented by the list of series to heatmap object.\n * @param seriesList List of time series\n */\nfunction histogramToHeatmap(seriesList: TimeSeries[]) {\n  const heatmap: any = {};\n\n  for (let i = 0; i < seriesList.length; i++) {\n    const series = seriesList[i];\n    const bound = i;\n    if (isNaN(bound)) {\n      return heatmap;\n    }\n\n    for (const point of series.datapoints) {\n      const count = point[VALUE_INDEX];\n      const time = point[TIME_INDEX];\n\n      if (!isNumber(count)) {\n        continue;\n      }\n\n      let bucket = heatmap[time];\n      if (!bucket) {\n        bucket = heatmap[time] = { x: time, buckets: {} };\n      }\n\n      bucket.buckets[bound] = {\n        y: bound,\n        count: count,\n        bounds: {\n          top: null,\n          bottom: bound,\n        },\n        values: [],\n        points: [],\n      };\n    }\n  }\n\n  return heatmap;\n}\n\n/**\n * Sort series representing histogram by label value.\n */\nfunction sortSeriesByLabel(s1: { label: string }, s2: { label: string }) {\n  let label1, label2;\n\n  try {\n    // fail if not integer. might happen with bad queries\n    label1 = parseHistogramLabel(s1.label);\n    label2 = parseHistogramLabel(s2.label);\n  } catch (err) {\n    console.error(err.message || err);\n    return 0;\n  }\n\n  if (label1 > label2) {\n    return 1;\n  }\n\n  if (label1 < label2) {\n    return -1;\n  }\n\n  return 0;\n}\n\nfunction parseHistogramLabel(label: string): number {\n  if (label === '+Inf' || label === 'inf') {\n    return +Infinity;\n  }\n  const value = Number(label);\n  if (isNaN(value)) {\n    throw new Error(`Error parsing histogram label: ${label} is not a number`);\n  }\n  return value;\n}\n\n/**\n * Convert buckets into linear array of \"cards\" - objects, represented heatmap elements.\n * @param  {Object} buckets\n * @returns {Object}          Array of \"card\" objects and stats\n */\nfunction convertToCards(buckets: any, hideZero = false): { cards: HeatmapCard[]; cardStats: HeatmapCardStats } {\n  let min = 0,\n    max = 0;\n  const cards: HeatmapCard[] = [];\n  forEach(buckets, (xBucket) => {\n    forEach(xBucket.buckets, (yBucket) => {\n      const card: HeatmapCard = {\n        x: xBucket.x,\n        y: yBucket.y,\n        yBounds: yBucket.bounds,\n        values: yBucket.values,\n        count: yBucket.count,\n      };\n      if (!hideZero || card.count !== 0) {\n        cards.push(card);\n      }\n\n      if (cards.length === 1) {\n        min = yBucket.count;\n        max = yBucket.count;\n      }\n\n      min = yBucket.count < min ? yBucket.count : min;\n      max = yBucket.count > max ? yBucket.count : max;\n    });\n  });\n\n  const cardStats = { min, max };\n  return { cards, cardStats };\n}\n\n/**\n * Special method for log scales. When series converted into buckets with log scale,\n * for simplification, 0 values are converted into 0, not into -Infinity. On the other hand, we mean\n * that all values less than series minimum, is 0 values, and we create special \"minimum\" bucket for\n * that values (actually, there're no values less than minimum, so this bucket is empty).\n *  8-16|    | ** |    |  * |  **|\n *   4-8|  * |*  *|*   |** *| *  |\n *   2-4| * *|    | ***|    |*   |\n *   1-2|*   |    |    |    |    | This bucket contains minimum series value\n * 0.5-1|____|____|____|____|____| This bucket should be displayed as 0 on graph\n *     0|____|____|____|____|____| This bucket is for 0 values (should actually be -Infinity)\n * So we should merge two bottom buckets into one (0-value bucket).\n *\n * @param  {Object} buckets  Heatmap buckets\n * @param  {Number} minValue Minimum series value\n * @returns {Object}          Transformed buckets\n */\nfunction mergeZeroBuckets(buckets: any, minValue: number) {\n  forEach(buckets, (xBucket) => {\n    const yBuckets = xBucket.buckets;\n\n    const emptyBucket: any = {\n      bounds: { bottom: 0, top: 0 },\n      values: [],\n      points: [],\n      count: 0,\n    };\n\n    const nullBucket = yBuckets[0] || emptyBucket;\n    const minBucket = yBuckets[minValue] || emptyBucket;\n\n    const newBucket: any = {\n      y: 0,\n      bounds: { bottom: minValue, top: minBucket.bounds.top || minValue },\n      values: [],\n      points: [],\n      count: 0,\n    };\n\n    newBucket.points = nullBucket.points.concat(minBucket.points);\n    newBucket.values = nullBucket.values.concat(minBucket.values);\n    newBucket.count = newBucket.values.length;\n\n    if (newBucket.count === 0) {\n      return;\n    }\n\n    delete yBuckets[minValue];\n    yBuckets[0] = newBucket;\n  });\n\n  return buckets;\n}\n\n/**\n * Convert set of time series into heatmap buckets\n * @returns {Object}    Heatmap object:\n * {\n *   xBucketBound_1: {\n *     x: xBucketBound_1,\n *     buckets: {\n *       yBucketBound_1: {\n *         y: yBucketBound_1,\n *         bounds: {bottom, top}\n *         values: [val_1, val_2, ..., val_K],\n *         points: [[val_Y, val_X, series_name], ..., [...]],\n *         seriesStat: {seriesName_1: val_1, seriesName_2: val_2}\n *       },\n *       ...\n *       yBucketBound_M: {}\n *     },\n *     values: [val_1, val_2, ..., val_K],\n *     points: [\n *       [val_Y, val_X, series_name], (point_1)\n *       ...\n *       [...] (point_K)\n *     ]\n *   },\n *   xBucketBound_2: {},\n *   ...\n *   xBucketBound_N: {}\n * }\n */\nfunction convertToHeatMap(seriesList: TimeSeries[], yBucketSize: number, xBucketSize: number, logBase = 1) {\n  const heatmap = {};\n\n  for (const series of seriesList) {\n    const datapoints = series.datapoints;\n    const seriesName = series.label;\n\n    // Slice series into X axis buckets\n    // |    | ** |    |  * |  **|\n    // |  * |*  *|*   |** *| *  |\n    // |** *|    | ***|    |*   |\n    // |____|____|____|____|____|_\n    //\n    forEach(datapoints, (point) => {\n      const bucketBound = getBucketBound(point[TIME_INDEX], xBucketSize);\n      pushToXBuckets(heatmap, point, bucketBound, seriesName);\n    });\n  }\n\n  // Slice X axis buckets into Y (value) buckets\n  // |  **|     |2|,\n  // | *  | --\\ |1|,\n  // |*   | --/ |1|,\n  // |____|     |0|\n  //\n  forEach(heatmap, (xBucket: any) => {\n    if (logBase !== 1) {\n      xBucket.buckets = convertToLogScaleValueBuckets(xBucket, yBucketSize, logBase);\n    } else {\n      xBucket.buckets = convertToValueBuckets(xBucket, yBucketSize);\n    }\n  });\n\n  return heatmap;\n}\n\nfunction pushToXBuckets(buckets: any, point: any[], bucketNum: number, seriesName: string) {\n  const value = point[VALUE_INDEX];\n  if (value === null || value === undefined || isNaN(value)) {\n    return;\n  }\n\n  // Add series name to point for future identification\n  const pointExt = concat(point, seriesName);\n\n  if (buckets[bucketNum] && buckets[bucketNum].values) {\n    buckets[bucketNum].values.push(value);\n    buckets[bucketNum].points.push(pointExt);\n  } else {\n    buckets[bucketNum] = {\n      x: bucketNum,\n      values: [value],\n      points: [pointExt],\n    };\n  }\n}\n\nfunction pushToYBuckets(\n  buckets: Bucket,\n  bucketNum: number,\n  value: any,\n  point: string[],\n  bounds: { bottom: number; top: number }\n) {\n  let count = 1;\n  // Use the 3rd argument as scale/count\n  if (point.length > 3) {\n    count = parseInt(point[2], 10);\n  }\n  if (buckets[bucketNum]) {\n    buckets[bucketNum].values.push(value);\n    buckets[bucketNum].points?.push(point);\n    buckets[bucketNum].count += count;\n  } else {\n    buckets[bucketNum] = {\n      y: bucketNum,\n      bounds: bounds,\n      values: [value],\n      points: [point],\n      count: count,\n    };\n  }\n}\n\nfunction getValueBucketBound(value: any, yBucketSize: number, logBase: number) {\n  if (logBase === 1) {\n    return getBucketBound(value, yBucketSize);\n  } else {\n    return getLogScaleBucketBound(value, yBucketSize, logBase);\n  }\n}\n\n/**\n * Find bucket for given value (for linear scale)\n */\nfunction getBucketBounds(value: number, bucketSize: number) {\n  let bottom, top;\n  bottom = Math.floor(value / bucketSize) * bucketSize;\n  top = (Math.floor(value / bucketSize) + 1) * bucketSize;\n\n  return { bottom, top };\n}\n\nfunction getBucketBound(value: number, bucketSize: number) {\n  const bounds = getBucketBounds(value, bucketSize);\n  return bounds.bottom;\n}\n\nfunction convertToValueBuckets(xBucket: { values: any; points: any }, bucketSize: number) {\n  const values = xBucket.values;\n  const points = xBucket.points;\n  const buckets = {};\n\n  forEach(values, (val, index) => {\n    const bounds = getBucketBounds(val, bucketSize);\n    const bucketNum = bounds.bottom;\n    pushToYBuckets(buckets, bucketNum, val, points[index], bounds);\n  });\n\n  return buckets;\n}\n\n/**\n * Find bucket for given value (for log scales)\n */\nfunction getLogScaleBucketBounds(value: number, yBucketSplitFactor: number, logBase: number) {\n  let top, bottom;\n  if (value === 0) {\n    return { bottom: 0, top: 0 };\n  }\n\n  const valueLog = logp(value, logBase);\n  let pow, powTop;\n  if (yBucketSplitFactor === 1 || !yBucketSplitFactor) {\n    pow = Math.floor(valueLog);\n    powTop = pow + 1;\n  } else {\n    const additionalBucketSize = 1 / yBucketSplitFactor;\n    let additionalLog = valueLog - Math.floor(valueLog);\n    additionalLog = Math.floor(additionalLog / additionalBucketSize) * additionalBucketSize;\n    pow = Math.floor(valueLog) + additionalLog;\n    powTop = pow + additionalBucketSize;\n  }\n  bottom = Math.pow(logBase, pow);\n  top = Math.pow(logBase, powTop);\n\n  return { bottom, top };\n}\n\nfunction getLogScaleBucketBound(value: number, yBucketSplitFactor: number, logBase: number) {\n  const bounds = getLogScaleBucketBounds(value, yBucketSplitFactor, logBase);\n  return bounds.bottom;\n}\n\nfunction convertToLogScaleValueBuckets(\n  xBucket: { values: any; points: any },\n  yBucketSplitFactor: number,\n  logBase: number\n) {\n  const values = xBucket.values;\n  const points = xBucket.points;\n\n  const buckets = {};\n  forEach(values, (val, index) => {\n    const bounds = getLogScaleBucketBounds(val, yBucketSplitFactor, logBase);\n    const bucketNum = bounds.bottom;\n    pushToYBuckets(buckets, bucketNum, val, points[index], bounds);\n  });\n\n  return buckets;\n}\n\n/**\n * Logarithm for custom base\n * @param value\n * @param base logarithm base\n */\nfunction logp(value: number, base: number) {\n  return Math.log(value) / Math.log(base);\n}\n\n/**\n * Calculate size of Y bucket from given buckets bounds.\n * @param bounds Array of Y buckets bounds\n * @param logBase Logarithm base\n */\nfunction calculateBucketSize(bounds: number[], logBase = 1): number {\n  let bucketSize = Infinity;\n\n  if (bounds.length === 0) {\n    return 0;\n  } else if (bounds.length === 1) {\n    return bounds[0];\n  } else {\n    bounds = sortBy(bounds);\n    for (let i = 1; i < bounds.length; i++) {\n      const distance = getDistance(bounds[i], bounds[i - 1], logBase);\n      bucketSize = distance < bucketSize ? distance : bucketSize;\n    }\n  }\n\n  return bucketSize;\n}\n\n/**\n * Calculate distance between two numbers in given scale (linear or logarithmic).\n * @param a\n * @param b\n * @param logBase\n */\nfunction getDistance(a: number, b: number, logBase = 1): number {\n  if (logBase === 1) {\n    // Linear distance\n    return Math.abs(b - a);\n  } else {\n    // logarithmic distance\n    const ratio = Math.max(a, b) / Math.min(a, b);\n    return logp(ratio, logBase);\n  }\n}\n\n/**\n * Compare two heatmap data objects\n * @param objA\n * @param objB\n */\nfunction isHeatmapDataEqual(objA: any, objB: any): boolean {\n  let isEql = !emptyXOR(objA, objB);\n\n  forEach(objA, (xBucket: XBucket, x) => {\n    if (objB[x]) {\n      if (emptyXOR(xBucket.buckets, objB[x].buckets)) {\n        isEql = false;\n        return false;\n      }\n\n      forEach(xBucket.buckets, (yBucket: YBucket, y) => {\n        if (objB[x].buckets && objB[x].buckets[y]) {\n          if (objB[x].buckets[y].values) {\n            isEql = isEqual(sortBy(yBucket.values), sortBy(objB[x].buckets[y].values));\n            if (!isEql) {\n              return false;\n            } else {\n              return true;\n            }\n          } else {\n            isEql = false;\n            return false;\n          }\n        } else {\n          isEql = false;\n          return false;\n        }\n      });\n\n      if (!isEql) {\n        return false;\n      } else {\n        return true;\n      }\n    } else {\n      isEql = false;\n      return false;\n    }\n  });\n\n  return isEql;\n}\n\nfunction emptyXOR(foo: any, bar: any): boolean {\n  return (isEmpty(foo) || isEmpty(bar)) && !(isEmpty(foo) && isEmpty(bar));\n}\n\nexport {\n  convertToHeatMap,\n  histogramToHeatmap,\n  convertToCards,\n  mergeZeroBuckets,\n  getValueBucketBound,\n  isHeatmapDataEqual,\n  calculateBucketSize,\n  sortSeriesByLabel,\n};\n","import * as d3 from 'd3';\nimport $ from 'jquery';\nimport { filter, find, isNumber, map, reduce } from 'lodash';\nimport { getValueBucketBound } from './heatmap_data_converter';\nimport { getValueFormat, formattedValueToString } from '@grafana/data';\n\nconst TOOLTIP_PADDING_X = 30;\nconst TOOLTIP_PADDING_Y = 5;\nconst HISTOGRAM_WIDTH = 160;\nconst HISTOGRAM_HEIGHT = 40;\n\nexport class HeatmapTooltip {\n  tooltip: any;\n  scope: any;\n  dashboard: any;\n  panelCtrl: any;\n  panel: any;\n  heatmapPanel: any;\n  mouseOverBucket: boolean;\n  originalFillColor: any;\n\n  constructor(elem: JQuery, scope: any) {\n    this.scope = scope;\n    this.dashboard = scope.ctrl.dashboard;\n    this.panelCtrl = scope.ctrl;\n    this.panel = scope.ctrl.panel;\n    this.heatmapPanel = elem;\n    this.mouseOverBucket = false;\n    this.originalFillColor = null;\n\n    elem.on('mouseleave', this.onMouseLeave.bind(this));\n  }\n\n  onMouseLeave() {\n    this.destroy();\n  }\n\n  onMouseMove(e: any) {\n    if (!this.panel.tooltip.show) {\n      return;\n    }\n\n    this.move(e);\n  }\n\n  add() {\n    this.tooltip = d3.select('body').append('div').attr('class', 'heatmap-tooltip graph-tooltip grafana-tooltip');\n  }\n\n  destroy() {\n    if (this.tooltip) {\n      this.tooltip.remove();\n    }\n\n    this.tooltip = null;\n  }\n\n  show(pos: { panelRelY: any }, data: any) {\n    if (!this.panel.tooltip.show || !data) {\n      return;\n    }\n    // shared tooltip mode\n    if (pos.panelRelY) {\n      return;\n    }\n\n    const { xBucketIndex, yBucketIndex } = this.getBucketIndexes(pos, data);\n\n    if (!data.buckets[xBucketIndex]) {\n      this.destroy();\n      return;\n    }\n\n    if (!this.tooltip) {\n      this.add();\n    }\n\n    let boundBottom, boundTop, valuesNumber;\n    const xData = data.buckets[xBucketIndex];\n    // Search in special 'zero' bucket also\n    const yData: any = find(xData.buckets, (bucket, bucketIndex) => {\n      return bucket.bounds.bottom === yBucketIndex || bucketIndex === yBucketIndex.toString();\n    });\n\n    const tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n    const time = this.dashboard.formatDate(xData.x, tooltipTimeFormat);\n\n    // Decimals override. Code from panel/graph/graph.ts\n    let countValueFormatter, bucketBoundFormatter;\n    if (isNumber(this.panel.tooltipDecimals)) {\n      countValueFormatter = this.countValueFormatter(this.panel.tooltipDecimals, null);\n      bucketBoundFormatter = this.panelCtrl.tickValueFormatter(this.panelCtrl.decimals, null);\n    } else {\n      // auto decimals\n      // legend and tooltip gets one more decimal precision\n      // than graph legend ticks\n      const decimals = (this.panelCtrl.decimals || -1) + 1;\n      countValueFormatter = this.countValueFormatter(decimals, this.panelCtrl.scaledDecimals + 2);\n      bucketBoundFormatter = this.panelCtrl.tickValueFormatter(decimals, this.panelCtrl.scaledDecimals + 2);\n    }\n\n    let tooltipHtml = `<div class=\"graph-tooltip-time\">${time}</div>\n      <div class=\"heatmap-histogram\"></div>`;\n\n    if (yData) {\n      if (yData.bounds) {\n        if (data.tsBuckets) {\n          // Use Y-axis labels\n          const tickFormatter = (valIndex: string | number) => {\n            return data.tsBucketsFormatted ? data.tsBucketsFormatted[valIndex] : data.tsBuckets[valIndex];\n          };\n\n          boundBottom = tickFormatter(yBucketIndex);\n          if (this.panel.yBucketBound !== 'middle') {\n            boundTop = yBucketIndex < data.tsBuckets.length - 1 ? tickFormatter(yBucketIndex + 1) : '';\n          }\n        } else {\n          // Display 0 if bucket is a special 'zero' bucket\n          const bottom = yData.y ? yData.bounds.bottom : 0;\n          boundBottom = bucketBoundFormatter(bottom);\n          boundTop = bucketBoundFormatter(yData.bounds.top);\n        }\n        valuesNumber = countValueFormatter(yData.count);\n        const boundStr = boundTop && boundBottom ? `${boundBottom} - ${boundTop}` : boundBottom || boundTop;\n        tooltipHtml += `<div>\n          bucket: <b>${boundStr}</b> <br>\n          count: <b>${valuesNumber}</b> <br>\n        </div>`;\n      } else {\n        // currently no bounds for pre bucketed data\n        tooltipHtml += `<div>count: <b>${yData.count}</b><br></div>`;\n      }\n    } else {\n      if (!this.panel.tooltip.showHistogram) {\n        this.destroy();\n        return;\n      }\n      boundBottom = yBucketIndex;\n      boundTop = '';\n      valuesNumber = 0;\n    }\n\n    this.tooltip.html(tooltipHtml);\n\n    if (this.panel.tooltip.showHistogram) {\n      this.addHistogram(xData);\n    }\n\n    this.move(pos);\n  }\n\n  getBucketIndexes(pos: { panelRelY?: any; x?: any; y?: any }, data: any) {\n    const xBucketIndex = this.getXBucketIndex(pos.x, data);\n    const yBucketIndex = this.getYBucketIndex(pos.y, data);\n    return { xBucketIndex, yBucketIndex };\n  }\n\n  getXBucketIndex(x: number, data: { buckets: any; xBucketSize: number }) {\n    // First try to find X bucket by checking x pos is in the\n    // [bucket.x, bucket.x + xBucketSize] interval\n    const xBucket: any = find(data.buckets, (bucket) => {\n      return x > bucket.x && x - bucket.x <= data.xBucketSize;\n    });\n    return xBucket ? xBucket.x : getValueBucketBound(x, data.xBucketSize, 1);\n  }\n\n  getYBucketIndex(y: number, data: { tsBuckets: any; yBucketSize: number }) {\n    if (data.tsBuckets) {\n      return Math.floor(y);\n    }\n    const yBucketIndex = getValueBucketBound(y, data.yBucketSize, this.panel.yAxis.logBase);\n    return yBucketIndex;\n  }\n\n  getSharedTooltipPos(pos: { pageX: any; x: any; pageY: any; panelRelY: number }) {\n    // get pageX from position on x axis and pageY from relative position in original panel\n    pos.pageX = this.heatmapPanel.offset().left + this.scope.xScale(pos.x);\n    pos.pageY = this.heatmapPanel.offset().top + this.scope.chartHeight * pos.panelRelY;\n    return pos;\n  }\n\n  addHistogram(data: { x: string | number }) {\n    const xBucket = this.scope.ctrl.data.buckets[data.x];\n    const yBucketSize = this.scope.ctrl.data.yBucketSize;\n    let min: number, max: number, ticks: number;\n    if (this.scope.ctrl.data.tsBuckets) {\n      min = 0;\n      max = this.scope.ctrl.data.tsBuckets.length - 1;\n      ticks = this.scope.ctrl.data.tsBuckets.length;\n    } else {\n      min = this.scope.ctrl.data.yAxis.min;\n      max = this.scope.ctrl.data.yAxis.max;\n      ticks = this.scope.ctrl.data.yAxis.ticks;\n    }\n    let histogramData = map(xBucket.buckets, (bucket) => {\n      const count = bucket.count !== undefined ? bucket.count : bucket.values.length;\n      return [bucket.bounds.bottom, count];\n    });\n    histogramData = filter(histogramData, (d) => {\n      return d[0] >= min && d[0] <= max;\n    });\n\n    const scale = this.scope.yScale.copy();\n    const histXScale = scale.domain([min, max]).range([0, HISTOGRAM_WIDTH]);\n\n    let barWidth: number;\n    if (this.panel.yAxis.logBase === 1) {\n      barWidth = Math.floor((HISTOGRAM_WIDTH / (max - min)) * yBucketSize * 0.9);\n    } else {\n      const barNumberFactor = yBucketSize ? yBucketSize : 1;\n      barWidth = Math.floor((HISTOGRAM_WIDTH / ticks / barNumberFactor) * 0.9);\n    }\n    barWidth = Math.max(barWidth, 1);\n\n    // Normalize histogram Y axis\n    const histogramDomain = reduce(\n      map(histogramData, (d) => d[1]),\n      (sum, val) => sum + val,\n      0\n    );\n    const histYScale = d3.scaleLinear().domain([0, histogramDomain]).range([0, HISTOGRAM_HEIGHT]);\n\n    const histogram = this.tooltip\n      .select('.heatmap-histogram')\n      .append('svg')\n      .attr('width', HISTOGRAM_WIDTH)\n      .attr('height', HISTOGRAM_HEIGHT);\n\n    histogram\n      .selectAll('.bar')\n      .data(histogramData)\n      .enter()\n      .append('rect')\n      .attr('x', (d: any[]) => {\n        return histXScale(d[0]);\n      })\n      .attr('width', barWidth)\n      .attr('y', (d: any[]) => {\n        return HISTOGRAM_HEIGHT - histYScale(d[1]);\n      })\n      .attr('height', (d: any[]) => {\n        return histYScale(d[1]);\n      });\n  }\n\n  move(pos: { panelRelY?: any; pageX?: any; pageY?: any }) {\n    if (!this.tooltip) {\n      return;\n    }\n\n    const elem = $(this.tooltip.node())[0];\n    const tooltipWidth = elem.clientWidth;\n    const tooltipHeight = elem.clientHeight;\n\n    let left = pos.pageX + TOOLTIP_PADDING_X;\n    let top = pos.pageY + TOOLTIP_PADDING_Y;\n\n    if (pos.pageX + tooltipWidth + 40 > window.innerWidth) {\n      left = pos.pageX - tooltipWidth - TOOLTIP_PADDING_X;\n    }\n\n    if (pos.pageY - window.pageYOffset + tooltipHeight + 20 > window.innerHeight) {\n      top = pos.pageY - tooltipHeight - TOOLTIP_PADDING_Y;\n    }\n\n    return this.tooltip.style('left', left + 'px').style('top', top + 'px');\n  }\n\n  countValueFormatter(decimals: number, scaledDecimals: any = null) {\n    const fmt = getValueFormat('short');\n    return (value: number) => {\n      return formattedValueToString(fmt(value, decimals, scaledDecimals));\n    };\n  }\n}\n","import { find, isEmpty, isNaN, isNil, isString, map, max, min, toNumber } from 'lodash';\nimport $ from 'jquery';\nimport * as d3 from 'd3';\nimport { contextSrv } from 'app/core/core';\nimport * as ticksUtils from 'app/core/utils/ticks';\nimport { HeatmapTooltip } from './heatmap_tooltip';\nimport { mergeZeroBuckets } from './heatmap_data_converter';\nimport { getColorScale, getOpacityScale } from './color_scale';\nimport {\n  dateTimeFormat,\n  formattedValueToString,\n  getColorForTheme,\n  getValueFormat,\n  LegacyGraphHoverClearEvent,\n  LegacyGraphHoverEvent,\n  PanelEvents,\n  toUtc,\n} from '@grafana/data';\nimport { graphTimeFormat } from '@grafana/ui';\nimport { config } from 'app/core/config';\n\nconst MIN_CARD_SIZE = 1,\n  CARD_PADDING = 1,\n  CARD_ROUND = 0,\n  DATA_RANGE_WIDING_FACTOR = 1.2,\n  DEFAULT_X_TICK_SIZE_PX = 100,\n  DEFAULT_Y_TICK_SIZE_PX = 22.5,\n  X_AXIS_TICK_PADDING = 10,\n  Y_AXIS_TICK_PADDING = 5,\n  MIN_SELECTION_WIDTH = 2;\n\nexport default function rendering(scope: any, elem: any, attrs: any, ctrl: any) {\n  return new HeatmapRenderer(scope, elem, attrs, ctrl);\n}\nexport class HeatmapRenderer {\n  width = 200;\n  height = 200;\n  yScale: any;\n  xScale: any;\n  chartWidth = 0;\n  chartHeight = 0;\n  chartTop = 0;\n  chartBottom = 0;\n  yAxisWidth = 0;\n  xAxisHeight = 0;\n  cardPadding = 0;\n  cardRound = 0;\n  cardWidth = 0;\n  cardHeight = 0;\n  colorScale: any;\n  opacityScale: any;\n  mouseUpHandler: any;\n  data: any;\n  panel: any;\n  $heatmap: any;\n  tooltip: HeatmapTooltip;\n  heatmap: any;\n  timeRange: any;\n\n  selection: any;\n  padding: any;\n  margin: any;\n  dataRangeWidingFactor: number;\n\n  hoverEvent: LegacyGraphHoverEvent;\n\n  constructor(private scope: any, private elem: any, attrs: any, private ctrl: any) {\n    // $heatmap is JQuery object, but heatmap is D3\n    this.$heatmap = this.elem.find('.heatmap-panel');\n    this.tooltip = new HeatmapTooltip(this.$heatmap, this.scope);\n\n    this.selection = {\n      active: false,\n      x1: -1,\n      x2: -1,\n    };\n\n    this.padding = { left: 0, right: 0, top: 0, bottom: 0 };\n    this.margin = { left: 25, right: 15, top: 10, bottom: 20 };\n    this.dataRangeWidingFactor = DATA_RANGE_WIDING_FACTOR;\n    this.ctrl.events.on(PanelEvents.render, this.onRender.bind(this));\n    this.ctrl.tickValueFormatter = this.tickValueFormatter.bind(this);\n\n    /////////////////////////////\n    // Selection and crosshair //\n    /////////////////////////////\n\n    // Shared crosshair and tooltip\n    this.ctrl.dashboard.events.on(LegacyGraphHoverEvent.type, this.onGraphHover.bind(this), this.scope);\n    this.ctrl.dashboard.events.on(LegacyGraphHoverClearEvent.type, this.onGraphHoverClear.bind(this), this.scope);\n\n    // Register selection listeners\n    this.$heatmap.on('mousedown', this.onMouseDown.bind(this));\n    this.$heatmap.on('mousemove', this.onMouseMove.bind(this));\n    this.$heatmap.on('mouseleave', this.onMouseLeave.bind(this));\n\n    this.hoverEvent = new LegacyGraphHoverEvent({ pos: {}, point: {}, panel: this.panel });\n  }\n\n  onGraphHoverClear() {\n    this.clearCrosshair();\n  }\n\n  onGraphHover(event: { pos: any }) {\n    this.drawSharedCrosshair(event.pos);\n  }\n\n  onRender() {\n    this.render();\n    this.ctrl.renderingCompleted();\n  }\n\n  setElementHeight() {\n    try {\n      let height = this.ctrl.height || this.panel.height || this.ctrl.row.height;\n      if (isString(height)) {\n        height = parseInt(height.replace('px', ''), 10);\n      }\n\n      height -= this.panel.legend.show ? 28 : 11; // bottom padding and space for legend\n\n      this.$heatmap.css('height', height + 'px');\n\n      return true;\n    } catch (e) {\n      // IE throws errors sometimes\n      return false;\n    }\n  }\n\n  getYAxisWidth(elem: any) {\n    const panelYAxisWidth = this.getPanelYAxisWidth();\n    if (panelYAxisWidth !== null) {\n      return panelYAxisWidth + Y_AXIS_TICK_PADDING;\n    }\n\n    const axisText = elem.selectAll('.axis-y text').nodes();\n    const maxTextWidth = max(\n      map(axisText, (text) => {\n        // Use SVG getBBox method\n        return text.getBBox().width;\n      })\n    );\n\n    return maxTextWidth;\n  }\n\n  getXAxisHeight(elem: any) {\n    const axisLine = elem.select('.axis-x line');\n    if (!axisLine.empty()) {\n      const axisLinePosition = parseFloat(elem.select('.axis-x line').attr('y2'));\n      const canvasWidth = parseFloat(elem.attr('height'));\n      return canvasWidth - axisLinePosition;\n    } else {\n      // Default height\n      return 30;\n    }\n  }\n\n  addXAxis() {\n    this.scope.xScale = this.xScale = d3\n      .scaleTime()\n      .domain([this.timeRange.from, this.timeRange.to])\n      .range([0, this.chartWidth]);\n\n    const ticks = this.chartWidth / DEFAULT_X_TICK_SIZE_PX;\n    const format = graphTimeFormat(ticks, this.timeRange.from.valueOf(), this.timeRange.to.valueOf());\n    const timeZone = this.ctrl.dashboard.getTimezone();\n    const formatter = (date: d3.AxisDomain) =>\n      dateTimeFormat(date.valueOf(), {\n        format: format,\n        timeZone: timeZone,\n      });\n\n    const xAxis = d3\n      .axisBottom(this.xScale)\n      .ticks(ticks)\n      .tickFormat(formatter)\n      .tickPadding(X_AXIS_TICK_PADDING)\n      .tickSize(this.chartHeight);\n\n    const posY = this.margin.top;\n    const posX = this.yAxisWidth;\n    this.heatmap\n      .append('g')\n      .attr('class', 'axis axis-x')\n      .attr('transform', 'translate(' + posX + ',' + posY + ')')\n      .call(xAxis);\n\n    // Remove horizontal line in the top of axis labels (called domain in d3)\n    this.heatmap.select('.axis-x').select('.domain').remove();\n  }\n\n  addYAxis() {\n    let ticks = Math.ceil(this.chartHeight / DEFAULT_Y_TICK_SIZE_PX);\n    let tickInterval = ticksUtils.tickStep(this.data.heatmapStats.min, this.data.heatmapStats.max, ticks);\n    let { yMin, yMax } = this.wideYAxisRange(this.data.heatmapStats.min, this.data.heatmapStats.max, tickInterval);\n\n    // Rewrite min and max if it have been set explicitly\n    yMin = this.panel.yAxis.min !== null ? this.panel.yAxis.min : yMin;\n    yMax = this.panel.yAxis.max !== null ? this.panel.yAxis.max : yMax;\n\n    // Adjust ticks after Y range widening\n    tickInterval = ticksUtils.tickStep(yMin, yMax, ticks);\n    ticks = Math.ceil((yMax - yMin) / tickInterval);\n\n    const decimalsAuto = ticksUtils.getPrecision(tickInterval);\n    let decimals = this.panel.yAxis.decimals === null ? decimalsAuto : this.panel.yAxis.decimals;\n    // Calculate scaledDecimals for log scales using tick size (as in jquery.flot.js)\n    const flotTickSize = ticksUtils.getFlotTickSize(yMin, yMax, ticks, decimalsAuto);\n    const scaledDecimals = ticksUtils.getScaledDecimals(decimals, flotTickSize);\n    this.ctrl.decimals = decimals;\n    this.ctrl.scaledDecimals = scaledDecimals;\n\n    // Set default Y min and max if no data\n    if (isEmpty(this.data.buckets)) {\n      yMax = 1;\n      yMin = -1;\n      ticks = 3;\n      decimals = 1;\n    }\n\n    this.data.yAxis = {\n      min: yMin,\n      max: yMax,\n      ticks: ticks,\n    };\n\n    this.scope.yScale = this.yScale = d3.scaleLinear().domain([yMin, yMax]).range([this.chartHeight, 0]);\n\n    const yAxis = d3\n      .axisLeft(this.yScale)\n      .ticks(ticks)\n      .tickFormat(this.tickValueFormatter(decimals, scaledDecimals))\n      .tickSizeInner(0 - this.width)\n      .tickSizeOuter(0)\n      .tickPadding(Y_AXIS_TICK_PADDING);\n\n    this.heatmap.append('g').attr('class', 'axis axis-y').call(yAxis);\n\n    // Calculate Y axis width first, then move axis into visible area\n    const posY = this.margin.top;\n    const posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.heatmap.select('.axis-y').attr('transform', 'translate(' + posX + ',' + posY + ')');\n\n    // Remove vertical line in the right of axis labels (called domain in d3)\n    this.heatmap.select('.axis-y').select('.domain').remove();\n  }\n\n  // Wide Y values range and anjust to bucket size\n  wideYAxisRange(min: number, max: number, tickInterval: number) {\n    const yWiding = (max * (this.dataRangeWidingFactor - 1) - min * (this.dataRangeWidingFactor - 1)) / 2;\n    let yMin, yMax;\n\n    if (tickInterval === 0) {\n      yMax = max * this.dataRangeWidingFactor;\n      yMin = min - min * (this.dataRangeWidingFactor - 1);\n    } else {\n      yMax = Math.ceil((max + yWiding) / tickInterval) * tickInterval;\n      yMin = Math.floor((min - yWiding) / tickInterval) * tickInterval;\n    }\n\n    // Don't wide axis below 0 if all values are positive\n    if (min >= 0 && yMin < 0) {\n      yMin = 0;\n    }\n\n    return { yMin, yMax };\n  }\n\n  addLogYAxis() {\n    const logBase = this.panel.yAxis.logBase;\n    let { yMin, yMax } = this.adjustLogRange(this.data.heatmapStats.minLog, this.data.heatmapStats.max, logBase);\n\n    yMin =\n      this.panel.yAxis.min && this.panel.yAxis.min !== '0' ? this.adjustLogMin(this.panel.yAxis.min, logBase) : yMin;\n    yMax = this.panel.yAxis.max !== null ? this.adjustLogMax(this.panel.yAxis.max, logBase) : yMax;\n\n    // Set default Y min and max if no data\n    if (isEmpty(this.data.buckets)) {\n      yMax = Math.pow(logBase, 2);\n      yMin = 1;\n    }\n\n    this.scope.yScale = this.yScale = d3\n      .scaleLog()\n      .base(this.panel.yAxis.logBase)\n      .domain([yMin, yMax])\n      .range([this.chartHeight, 0]);\n\n    const domain = this.yScale.domain();\n    const tickValues = this.logScaleTickValues(domain, logBase);\n\n    const decimalsAuto = ticksUtils.getPrecision(yMin);\n    const decimals = this.panel.yAxis.decimals || decimalsAuto;\n\n    // Calculate scaledDecimals for log scales using tick size (as in jquery.flot.js)\n    const flotTickSize = ticksUtils.getFlotTickSize(yMin, yMax, tickValues.length, decimalsAuto);\n    const scaledDecimals = ticksUtils.getScaledDecimals(decimals, flotTickSize);\n    this.ctrl.decimals = decimals;\n    this.ctrl.scaledDecimals = scaledDecimals;\n\n    this.data.yAxis = {\n      min: yMin,\n      max: yMax,\n      ticks: tickValues.length,\n    };\n\n    const yAxis = d3\n      .axisLeft(this.yScale)\n      .tickValues(tickValues)\n      .tickFormat(this.tickValueFormatter(decimals, scaledDecimals))\n      .tickSizeInner(0 - this.width)\n      .tickSizeOuter(0)\n      .tickPadding(Y_AXIS_TICK_PADDING);\n\n    this.heatmap.append('g').attr('class', 'axis axis-y').call(yAxis);\n\n    // Calculate Y axis width first, then move axis into visible area\n    const posY = this.margin.top;\n    const posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.heatmap.select('.axis-y').attr('transform', 'translate(' + posX + ',' + posY + ')');\n\n    // Set first tick as pseudo 0\n    if (yMin < 1) {\n      this.heatmap.select('.axis-y').select('.tick text').text('0');\n    }\n\n    // Remove vertical line in the right of axis labels (called domain in d3)\n    this.heatmap.select('.axis-y').select('.domain').remove();\n  }\n\n  addYAxisFromBuckets() {\n    const tsBuckets = this.data.tsBuckets;\n    let ticks = Math.ceil(this.chartHeight / DEFAULT_Y_TICK_SIZE_PX);\n\n    this.scope.yScale = this.yScale = d3\n      .scaleLinear()\n      .domain([0, tsBuckets.length - 1])\n      .range([this.chartHeight, 0]);\n\n    const tickValues = map(tsBuckets, (b, i) => i);\n    const decimalsAuto = max(map(tsBuckets, ticksUtils.getStringPrecision));\n    const decimals = this.panel.yAxis.decimals === null ? decimalsAuto : this.panel.yAxis.decimals;\n    this.ctrl.decimals = decimals;\n\n    const tickValueFormatter = this.tickValueFormatter.bind(this);\n    function tickFormatter(yAxisWidth: number | null) {\n      return function (valIndex: d3.AxisDomain) {\n        let valueFormatted = tsBuckets[valIndex.valueOf()];\n        if (!isNaN(toNumber(valueFormatted)) && valueFormatted !== '') {\n          // Try to format numeric tick labels\n          valueFormatted = tickValueFormatter(decimals)(toNumber(valueFormatted));\n        } else if (valueFormatted && typeof valueFormatted === 'string' && valueFormatted !== '') {\n          if (yAxisWidth) {\n            const scale = 0.15; // how to have a better calculation for this\n            const trimmed = valueFormatted.substring(0, Math.floor(yAxisWidth * scale));\n            const postfix = trimmed.length < valueFormatted.length ? '...' : '';\n            valueFormatted = `${trimmed}${postfix}`;\n          }\n        }\n        return valueFormatted;\n      };\n    }\n    const tsBucketsFormatted = map(tsBuckets, (v, i) => tickFormatter(null)(i));\n    this.data.tsBucketsFormatted = tsBucketsFormatted;\n\n    const yAxis = d3\n      .axisLeft(this.yScale)\n      .tickFormat(tickFormatter(this.getPanelYAxisWidth()))\n      .tickSizeInner(0 - this.width)\n      .tickSizeOuter(0)\n      .tickPadding(Y_AXIS_TICK_PADDING);\n    if (tickValues && tickValues.length <= ticks) {\n      yAxis.tickValues(tickValues);\n    } else {\n      yAxis.ticks(ticks);\n    }\n\n    this.heatmap.append('g').attr('class', 'axis axis-y').call(yAxis);\n\n    // Calculate Y axis width first, then move axis into visible area\n    const posY = this.margin.top;\n    const posX = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.heatmap.select('.axis-y').attr('transform', 'translate(' + posX + ',' + posY + ')');\n\n    if (this.panel.yBucketBound === 'middle' && tickValues && tickValues.length) {\n      // Shift Y axis labels to the middle of bucket\n      const tickShift = 0 - this.chartHeight / (tickValues.length - 1) / 2;\n      this.heatmap.selectAll('.axis-y text').attr('transform', 'translate(' + 0 + ',' + tickShift + ')');\n    }\n\n    // Remove vertical line in the right of axis labels (called domain in d3)\n    this.heatmap.select('.axis-y').select('.domain').remove();\n  }\n\n  // Adjust data range to log base\n  adjustLogRange(min: number, max: number, logBase: number) {\n    let yMin = this.data.heatmapStats.minLog;\n    if (this.data.heatmapStats.minLog > 1 || !this.data.heatmapStats.minLog) {\n      yMin = 1;\n    } else {\n      yMin = this.adjustLogMin(this.data.heatmapStats.minLog, logBase);\n    }\n\n    // Adjust max Y value to log base\n    const yMax = this.adjustLogMax(this.data.heatmapStats.max, logBase);\n\n    return { yMin, yMax };\n  }\n\n  adjustLogMax(max: number, base: number) {\n    return Math.pow(base, Math.ceil(ticksUtils.logp(max, base)));\n  }\n\n  adjustLogMin(min: number, base: number) {\n    return Math.pow(base, Math.floor(ticksUtils.logp(min, base)));\n  }\n\n  logScaleTickValues(domain: any[], base: number) {\n    const domainMin = domain[0];\n    const domainMax = domain[1];\n    const tickValues = [];\n\n    if (domainMin < 1) {\n      const underOneTicks = Math.floor(ticksUtils.logp(domainMin, base));\n      for (let i = underOneTicks; i < 0; i++) {\n        const tickValue = Math.pow(base, i);\n        tickValues.push(tickValue);\n      }\n    }\n\n    const ticks = Math.ceil(ticksUtils.logp(domainMax, base));\n    for (let i = 0; i <= ticks; i++) {\n      const tickValue = Math.pow(base, i);\n      tickValues.push(tickValue);\n    }\n\n    return tickValues;\n  }\n\n  tickValueFormatter(decimals: number, scaledDecimals: any = null) {\n    const format = this.panel.yAxis.format;\n    return (value: any) => {\n      try {\n        if (format !== 'none') {\n          const v = getValueFormat(format)(value, decimals, scaledDecimals);\n          return formattedValueToString(v);\n        }\n      } catch (err) {\n        console.error(err.message || err);\n      }\n      return value;\n    };\n  }\n\n  fixYAxisTickSize() {\n    this.heatmap.select('.axis-y').selectAll('.tick line').attr('x2', this.chartWidth);\n  }\n\n  addAxes() {\n    this.chartHeight = this.height - this.margin.top - this.margin.bottom;\n    this.chartTop = this.margin.top;\n    this.chartBottom = this.chartTop + this.chartHeight;\n    if (this.panel.dataFormat === 'tsbuckets') {\n      this.addYAxisFromBuckets();\n    } else {\n      if (this.panel.yAxis.logBase === 1) {\n        this.addYAxis();\n      } else {\n        this.addLogYAxis();\n      }\n    }\n\n    this.yAxisWidth = this.getYAxisWidth(this.heatmap) + Y_AXIS_TICK_PADDING;\n    this.chartWidth = this.width - this.yAxisWidth - this.margin.right;\n    this.fixYAxisTickSize();\n\n    this.addXAxis();\n    this.xAxisHeight = this.getXAxisHeight(this.heatmap);\n\n    if (!this.panel.yAxis.show) {\n      this.heatmap.select('.axis-y').selectAll('line').style('opacity', 0);\n    }\n\n    if (!this.panel.xAxis.show) {\n      this.heatmap.select('.axis-x').selectAll('line').style('opacity', 0);\n    }\n  }\n\n  addHeatmapCanvas() {\n    const heatmapElem = this.$heatmap[0];\n\n    this.width = Math.floor(this.$heatmap.width()) - this.padding.right;\n    this.height = Math.floor(this.$heatmap.height()) - this.padding.bottom;\n\n    this.cardPadding = this.panel.cards.cardPadding !== null ? this.panel.cards.cardPadding : CARD_PADDING;\n    this.cardRound = this.panel.cards.cardRound !== null ? this.panel.cards.cardRound : CARD_ROUND;\n\n    if (this.heatmap) {\n      this.heatmap.remove();\n    }\n\n    this.heatmap = d3.select(heatmapElem).append('svg').attr('width', this.width).attr('height', this.height);\n  }\n\n  addHeatmap() {\n    this.addHeatmapCanvas();\n    this.addAxes();\n\n    if (this.panel.yAxis.logBase !== 1 && this.panel.dataFormat !== 'tsbuckets') {\n      const logBase = this.panel.yAxis.logBase;\n      const domain = this.yScale.domain();\n      const tickValues = this.logScaleTickValues(domain, logBase);\n      this.data.buckets = mergeZeroBuckets(this.data.buckets, min(tickValues)!);\n    }\n\n    const cardsData = this.data.cards;\n    const cardStats = this.data.cardStats;\n    const maxValueAuto = cardStats.max;\n    const minValueAuto = Math.max(cardStats.min, 0);\n    const maxValue = isNil(this.panel.color.max) ? maxValueAuto : this.panel.color.max;\n    const minValue = isNil(this.panel.color.min) ? minValueAuto : this.panel.color.min;\n    const colorScheme: any = find(this.ctrl.colorSchemes, {\n      value: this.panel.color.colorScheme,\n    });\n    this.colorScale = getColorScale(colorScheme, contextSrv.user.lightTheme, maxValue, minValue);\n    this.opacityScale = getOpacityScale(this.panel.color, maxValue, minValue);\n    this.setCardSize();\n\n    let cards = this.heatmap.selectAll('.heatmap-card').data(cardsData);\n    cards.append('title');\n    cards = cards\n      .enter()\n      .append('rect')\n      .attr('x', this.getCardX.bind(this))\n      .attr('width', this.getCardWidth.bind(this))\n      .attr('y', this.getCardY.bind(this))\n      .attr('height', this.getCardHeight.bind(this))\n      .attr('rx', this.cardRound)\n      .attr('ry', this.cardRound)\n      .attr('class', 'bordered heatmap-card')\n      .style('fill', this.getCardColor.bind(this))\n      .style('stroke', this.getCardColor.bind(this))\n      .style('stroke-width', 0)\n      .style('opacity', this.getCardOpacity.bind(this));\n\n    const $cards = this.$heatmap.find('.heatmap-card');\n    $cards\n      .on('mouseenter', (event: any) => {\n        this.tooltip.mouseOverBucket = true;\n        this.highlightCard(event);\n      })\n      .on('mouseleave', (event: any) => {\n        this.tooltip.mouseOverBucket = false;\n        this.resetCardHighLight(event);\n      });\n  }\n\n  highlightCard(event: any) {\n    const color = d3.select(event.target).style('fill');\n    const highlightColor = d3.color(color)!.darker(2);\n    const strokeColor = d3.color(color)!.brighter(4);\n    const currentCard = d3.select(event.target);\n    this.tooltip.originalFillColor = color;\n    currentCard\n      .style('fill', highlightColor.toString())\n      .style('stroke', strokeColor.toString())\n      .style('stroke-width', 1);\n  }\n\n  resetCardHighLight(event: any) {\n    d3.select(event.target)\n      .style('fill', this.tooltip.originalFillColor)\n      .style('stroke', this.tooltip.originalFillColor)\n      .style('stroke-width', 0);\n  }\n\n  setCardSize() {\n    const xGridSize = Math.floor(this.xScale(this.data.xBucketSize) - this.xScale(0));\n    let yGridSize = Math.floor(this.yScale(this.yScale.invert(0) - this.data.yBucketSize));\n\n    if (this.panel.yAxis.logBase !== 1) {\n      const base = this.panel.yAxis.logBase;\n      const splitFactor = this.data.yBucketSize || 1;\n      yGridSize = Math.floor((this.yScale(1) - this.yScale(base)) / splitFactor);\n    }\n\n    const cardWidth = xGridSize - this.cardPadding * 2;\n    this.cardWidth = Math.max(cardWidth, MIN_CARD_SIZE);\n    this.cardHeight = yGridSize ? yGridSize - this.cardPadding * 2 : 0;\n  }\n\n  getCardX(d: { x: any }) {\n    let x;\n    if (this.xScale(d.x) < 0) {\n      // Cut card left to prevent overlay\n      x = this.yAxisWidth + this.cardPadding;\n    } else {\n      x = this.xScale(d.x) + this.yAxisWidth + this.cardPadding;\n    }\n\n    return x;\n  }\n\n  getCardWidth(d: { x: any }) {\n    let w = this.cardWidth;\n    if (this.xScale(d.x) < 0) {\n      // Cut card left to prevent overlay\n      w = this.xScale(d.x) + this.cardWidth;\n    } else if (this.xScale(d.x) + this.cardWidth > this.chartWidth) {\n      // Cut card right to prevent overlay\n      w = this.chartWidth - this.xScale(d.x) - this.cardPadding;\n    }\n\n    // Card width should be MIN_CARD_SIZE at least, but cut cards shouldn't be displayed\n    w = w > 0 ? Math.max(w, MIN_CARD_SIZE) : 0;\n    return w;\n  }\n\n  getCardY(d: { y: number }) {\n    let y = this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardPadding;\n    if (this.panel.yAxis.logBase !== 1 && d.y === 0) {\n      y = this.chartBottom - this.cardHeight - this.cardPadding;\n    } else {\n      if (y < this.chartTop) {\n        y = this.chartTop;\n      }\n    }\n\n    return y;\n  }\n\n  getCardHeight(d: { y: number }) {\n    const y = this.yScale(d.y) + this.chartTop - this.cardHeight - this.cardPadding;\n    let h = this.cardHeight;\n\n    if (this.panel.yAxis.logBase !== 1 && d.y === 0) {\n      return this.cardHeight;\n    }\n\n    // Cut card height to prevent overlay\n    if (y < this.chartTop) {\n      h = this.yScale(d.y) - this.cardPadding;\n    } else if (this.yScale(d.y) > this.chartBottom) {\n      h = this.chartBottom - y;\n    } else if (y + this.cardHeight > this.chartBottom) {\n      h = this.chartBottom - y;\n    }\n\n    // Height can't be more than chart height\n    h = Math.min(h, this.chartHeight);\n    // Card height should be MIN_CARD_SIZE at least\n    h = Math.max(h, MIN_CARD_SIZE);\n\n    return h;\n  }\n\n  getCardColor(d: { count: any }) {\n    if (this.panel.color.mode === 'opacity') {\n      return getColorForTheme(this.panel.color.cardColor, config.theme);\n    } else {\n      return this.colorScale(d.count);\n    }\n  }\n\n  getCardOpacity(d: { count: any }) {\n    if (this.panel.color.mode === 'opacity') {\n      return this.opacityScale(d.count);\n    } else {\n      return 1;\n    }\n  }\n\n  getEventOffset(event: any) {\n    const elemOffset = this.$heatmap.offset();\n    const x = Math.floor(event.clientX - elemOffset.left);\n    const y = Math.floor(event.clientY - elemOffset.top);\n    return { x, y };\n  }\n\n  onMouseDown(event: any) {\n    const offset = this.getEventOffset(event);\n    this.selection.active = true;\n    this.selection.x1 = offset.x;\n\n    this.mouseUpHandler = () => {\n      this.onMouseUp();\n    };\n\n    $(document).one('mouseup', this.mouseUpHandler.bind(this));\n  }\n\n  onMouseUp() {\n    $(document).unbind('mouseup', this.mouseUpHandler.bind(this));\n    this.mouseUpHandler = null;\n    this.selection.active = false;\n\n    const selectionRange = Math.abs(this.selection.x2 - this.selection.x1);\n    if (this.selection.x2 >= 0 && selectionRange > MIN_SELECTION_WIDTH) {\n      const timeFrom = this.xScale.invert(Math.min(this.selection.x1, this.selection.x2) - this.yAxisWidth);\n      const timeTo = this.xScale.invert(Math.max(this.selection.x1, this.selection.x2) - this.yAxisWidth);\n\n      this.ctrl.timeSrv.setTime({\n        from: toUtc(timeFrom),\n        to: toUtc(timeTo),\n      });\n    }\n\n    this.clearSelection();\n  }\n\n  onMouseLeave() {\n    this.ctrl.dashboard.events.publish(new LegacyGraphHoverClearEvent());\n    this.clearCrosshair();\n  }\n\n  onMouseMove(event: any) {\n    if (!this.heatmap) {\n      return;\n    }\n\n    const offset = this.getEventOffset(event);\n    if (this.selection.active) {\n      // Clear crosshair and tooltip\n      this.clearCrosshair();\n      this.tooltip.destroy();\n\n      this.selection.x2 = this.limitSelection(offset.x);\n      this.drawSelection(this.selection.x1, this.selection.x2);\n    } else {\n      const pos = this.getEventPos(event, offset);\n      this.drawCrosshair(offset.x);\n      this.tooltip.show(pos, this.data);\n      this.emitGraphHoverEvent(pos);\n    }\n  }\n\n  getEventPos(event: { pageX: any; pageY: any }, offset: { x: any; y: any }) {\n    const x = this.xScale.invert(offset.x - this.yAxisWidth).valueOf();\n    const y = this.yScale.invert(offset.y - this.chartTop);\n    const pos: any = {\n      pageX: event.pageX,\n      pageY: event.pageY,\n      x: x,\n      x1: x,\n      y: y,\n      y1: y,\n      panelRelY: null,\n      offset,\n    };\n\n    return pos;\n  }\n\n  emitGraphHoverEvent(pos: { panelRelY: number; offset: { y: number } }) {\n    // Set minimum offset to prevent showing legend from another panel\n    pos.panelRelY = Math.max(pos.offset.y / this.height, 0.001);\n    // broadcast to other graph panels that we are hovering\n    this.hoverEvent.payload.pos = pos;\n    this.hoverEvent.payload.panel = this.panel;\n    this.hoverEvent.payload.point['time'] = (pos as any).x;\n    this.ctrl.dashboard.events.publish(this.hoverEvent);\n  }\n\n  limitSelection(x2: number) {\n    x2 = Math.max(x2, this.yAxisWidth);\n    x2 = Math.min(x2, this.chartWidth + this.yAxisWidth);\n    return x2;\n  }\n\n  drawSelection(posX1: number, posX2: number) {\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-selection').remove();\n      const selectionX = Math.min(posX1, posX2);\n      const selectionWidth = Math.abs(posX1 - posX2);\n\n      if (selectionWidth > MIN_SELECTION_WIDTH) {\n        this.heatmap\n          .append('rect')\n          .attr('class', 'heatmap-selection')\n          .attr('x', selectionX)\n          .attr('width', selectionWidth)\n          .attr('y', this.chartTop)\n          .attr('height', this.chartHeight);\n      }\n    }\n  }\n\n  clearSelection() {\n    this.selection.x1 = -1;\n    this.selection.x2 = -1;\n\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-selection').remove();\n    }\n  }\n\n  drawCrosshair(position: number) {\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-crosshair').remove();\n\n      let posX = position;\n      posX = Math.max(posX, this.yAxisWidth);\n      posX = Math.min(posX, this.chartWidth + this.yAxisWidth);\n\n      this.heatmap\n        .append('g')\n        .attr('class', 'heatmap-crosshair')\n        .attr('transform', 'translate(' + posX + ',0)')\n        .append('line')\n        .attr('x1', 1)\n        .attr('y1', this.chartTop)\n        .attr('x2', 1)\n        .attr('y2', this.chartBottom)\n        .attr('stroke-width', 1);\n    }\n  }\n\n  drawSharedCrosshair(pos: { x: any }) {\n    if (this.heatmap && this.ctrl.dashboard.graphTooltip !== 0) {\n      const posX = this.xScale(pos.x) + this.yAxisWidth;\n      this.drawCrosshair(posX);\n    }\n  }\n\n  clearCrosshair() {\n    if (this.heatmap) {\n      this.heatmap.selectAll('.heatmap-crosshair').remove();\n    }\n  }\n\n  render() {\n    this.data = this.ctrl.data;\n    this.panel = this.ctrl.panel;\n    this.timeRange = this.ctrl.range;\n\n    if (!this.setElementHeight() || !this.data) {\n      return;\n    }\n\n    // Draw default axes and return if no data\n    if (isEmpty(this.data.buckets)) {\n      this.addHeatmapCanvas();\n      this.addAxes();\n      return;\n    }\n\n    this.addHeatmap();\n    this.scope.yAxisWidth = this.yAxisWidth;\n    this.scope.xAxisHeight = this.xAxisHeight;\n    this.scope.chartHeight = this.chartHeight;\n    this.scope.chartWidth = this.chartWidth;\n    this.scope.chartTop = this.chartTop;\n  }\n\n  private getPanelYAxisWidth(): number | null {\n    if (!this.panel.yAxis.width) {\n      return null;\n    }\n\n    return isNaN(this.panel.yAxis.width) ? null : parseInt(this.panel.yAxis.width, 10);\n  }\n}\n","import { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport { defaultsDeep, includes, keys, map, reduce, min as _min, max as _max } from 'lodash';\nimport kbn from 'app/core/utils/kbn';\nimport TimeSeries from 'app/core/time_series2';\nimport { axesEditor } from './axes_editor';\nimport { heatmapDisplayEditor } from './display_editor';\nimport rendering from './rendering';\nimport {\n  convertToHeatMap,\n  convertToCards,\n  histogramToHeatmap,\n  calculateBucketSize,\n  sortSeriesByLabel,\n} from './heatmap_data_converter';\nimport { auto } from 'angular';\nimport { getProcessedDataFrames } from 'app/features/query/state/runRequest';\nimport { DataProcessor } from '../graph/data_processor';\nimport { LegacyResponseData, PanelEvents, DataFrame, rangeUtil } from '@grafana/data';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport appEvents from 'app/core/app_events';\nimport { ZoomOutEvent } from 'app/types/events';\n\nconst X_BUCKET_NUMBER_DEFAULT = 30;\nconst Y_BUCKET_NUMBER_DEFAULT = 10;\n\nconst panelDefaults: any = {\n  heatmap: {},\n  cards: {\n    cardPadding: null,\n    cardRound: null,\n  },\n  color: {\n    mode: 'spectrum',\n    cardColor: '#b4ff00',\n    colorScale: 'sqrt',\n    exponent: 0.5,\n    colorScheme: 'interpolateOranges',\n  },\n  legend: {\n    show: false,\n  },\n  dataFormat: 'timeseries',\n  yBucketBound: 'auto',\n  reverseYBuckets: false,\n  xAxis: {\n    show: true,\n  },\n  yAxis: {\n    show: true,\n    format: 'short',\n    decimals: null,\n    logBase: 1,\n    splitFactor: null,\n    min: null,\n    max: null,\n  },\n  xBucketSize: null,\n  xBucketNumber: null,\n  yBucketSize: null,\n  yBucketNumber: null,\n  tooltip: {\n    show: true,\n    showHistogram: false,\n  },\n  highlightCards: true,\n  hideZeroBuckets: false,\n};\n\nconst colorModes = ['opacity', 'spectrum'];\nconst opacityScales = ['linear', 'sqrt'];\n\n// Schemes from d3-scale-chromatic\n// https://github.com/d3/d3-scale-chromatic\nconst colorSchemes = [\n  // Diverging\n  { name: 'Spectral', value: 'interpolateSpectral', invert: 'always' },\n  { name: 'RdYlGn', value: 'interpolateRdYlGn', invert: 'always' },\n\n  // Sequential (Single Hue)\n  { name: 'Blues', value: 'interpolateBlues', invert: 'dark' },\n  { name: 'Greens', value: 'interpolateGreens', invert: 'dark' },\n  { name: 'Greys', value: 'interpolateGreys', invert: 'dark' },\n  { name: 'Oranges', value: 'interpolateOranges', invert: 'dark' },\n  { name: 'Purples', value: 'interpolatePurples', invert: 'dark' },\n  { name: 'Reds', value: 'interpolateReds', invert: 'dark' },\n\n  // Sequential (Multi-Hue)\n  { name: 'Turbo', value: 'interpolateTurbo', invert: 'light' },\n  { name: 'Cividis', value: 'interpolateCividis', invert: 'light' },\n  { name: 'Viridis', value: 'interpolateViridis', invert: 'light' },\n  { name: 'Magma', value: 'interpolateMagma', invert: 'light' },\n  { name: 'Inferno', value: 'interpolateInferno', invert: 'light' },\n  { name: 'Plasma', value: 'interpolatePlasma', invert: 'light' },\n  { name: 'Warm', value: 'interpolateWarm', invert: 'light' },\n  { name: 'Cool', value: 'interpolateCool', invert: 'light' },\n  { name: 'Cubehelix', value: 'interpolateCubehelixDefault', invert: 'light' },\n  { name: 'BuGn', value: 'interpolateBuGn', invert: 'dark' },\n  { name: 'BuPu', value: 'interpolateBuPu', invert: 'dark' },\n  { name: 'GnBu', value: 'interpolateGnBu', invert: 'dark' },\n  { name: 'OrRd', value: 'interpolateOrRd', invert: 'dark' },\n  { name: 'PuBuGn', value: 'interpolatePuBuGn', invert: 'dark' },\n  { name: 'PuBu', value: 'interpolatePuBu', invert: 'dark' },\n  { name: 'PuRd', value: 'interpolatePuRd', invert: 'dark' },\n  { name: 'RdPu', value: 'interpolateRdPu', invert: 'dark' },\n  { name: 'YlGnBu', value: 'interpolateYlGnBu', invert: 'dark' },\n  { name: 'YlGn', value: 'interpolateYlGn', invert: 'dark' },\n  { name: 'YlOrBr', value: 'interpolateYlOrBr', invert: 'dark' },\n  { name: 'YlOrRd', value: 'interpolateYlOrRd', invert: 'dark' },\n];\n\nconst dsSupportHistogramSort = ['elasticsearch'];\n\nexport class HeatmapCtrl extends MetricsPanelCtrl {\n  static templateUrl = 'module.html';\n\n  opacityScales: any = [];\n  colorModes: any = [];\n  colorSchemes: any = [];\n  selectionActivated: boolean;\n  unitFormats: any;\n  data: any;\n  series: TimeSeries[] = [];\n  dataWarning: any;\n  decimals = 0;\n  scaledDecimals = 0;\n\n  processor: DataProcessor; // Shared with graph panel\n\n  /** @ngInject */\n  constructor($scope: any, $injector: auto.IInjectorService, templateSrv: TemplateSrv, timeSrv: TimeSrv) {\n    super($scope, $injector);\n\n    this.selectionActivated = false;\n\n    defaultsDeep(this.panel, panelDefaults);\n    this.opacityScales = opacityScales;\n    this.colorModes = colorModes;\n    this.colorSchemes = colorSchemes;\n\n    // Use DataFrames\n    this.useDataFrames = true;\n    this.processor = new DataProcessor({\n      xaxis: { mode: 'custom' }, // NOT: 'histogram' :)\n      aliasColors: {}, // avoids null reference\n    });\n\n    // Bind grafana panel events\n    this.events.on(PanelEvents.render, this.onRender.bind(this));\n    this.events.on(PanelEvents.dataFramesReceived, this.onDataFramesReceived.bind(this));\n    this.events.on(PanelEvents.dataSnapshotLoad, this.onSnapshotLoad.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n\n    this.onCardColorChange = this.onCardColorChange.bind(this);\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Axes', axesEditor, 2);\n    this.addEditorTab('Display', heatmapDisplayEditor, 3);\n    this.unitFormats = kbn.getUnitFormats();\n  }\n\n  zoomOut(evt: any) {\n    appEvents.publish(new ZoomOutEvent(2));\n  }\n\n  onRender() {\n    if (this.panel.dataFormat === 'tsbuckets') {\n      this.convertHistogramToHeatmapData();\n    } else {\n      this.convertTimeSeriesToHeatmapData();\n    }\n  }\n\n  convertTimeSeriesToHeatmapData() {\n    if (!this.range || !this.series) {\n      return;\n    }\n\n    let xBucketSize, yBucketSize, bucketsData, heatmapStats;\n    const logBase = this.panel.yAxis.logBase;\n\n    const xBucketNumber = this.panel.xBucketNumber || X_BUCKET_NUMBER_DEFAULT;\n    const xBucketSizeByNumber = Math.floor((this.range.to.valueOf() - this.range.from.valueOf()) / xBucketNumber);\n\n    // Parse X bucket size (number or interval)\n    const isIntervalString = kbn.intervalRegex.test(this.panel.xBucketSize);\n    if (isIntervalString) {\n      xBucketSize = rangeUtil.intervalToMs(this.panel.xBucketSize);\n    } else if (\n      isNaN(Number(this.panel.xBucketSize)) ||\n      this.panel.xBucketSize === '' ||\n      this.panel.xBucketSize === null\n    ) {\n      xBucketSize = xBucketSizeByNumber;\n    } else {\n      xBucketSize = Number(this.panel.xBucketSize);\n    }\n\n    // Calculate Y bucket size\n    heatmapStats = this.parseSeries(this.series);\n    const yBucketNumber = this.panel.yBucketNumber || Y_BUCKET_NUMBER_DEFAULT;\n    if (logBase !== 1) {\n      yBucketSize = this.panel.yAxis.splitFactor;\n    } else {\n      if (heatmapStats.max === heatmapStats.min) {\n        if (heatmapStats.max) {\n          yBucketSize = heatmapStats.max / Y_BUCKET_NUMBER_DEFAULT;\n        } else {\n          yBucketSize = 1;\n        }\n      } else {\n        yBucketSize = (heatmapStats.max - heatmapStats.min) / yBucketNumber;\n      }\n      yBucketSize = this.panel.yBucketSize || yBucketSize;\n    }\n\n    bucketsData = convertToHeatMap(this.series, yBucketSize, xBucketSize, logBase);\n\n    // Set default Y range if no data\n    if (!heatmapStats.min && !heatmapStats.max) {\n      heatmapStats = { min: -1, max: 1, minLog: 1 };\n      yBucketSize = 1;\n    }\n\n    const { cards, cardStats } = convertToCards(bucketsData, this.panel.hideZeroBuckets);\n\n    this.data = {\n      buckets: bucketsData,\n      heatmapStats: heatmapStats,\n      xBucketSize: xBucketSize,\n      yBucketSize: yBucketSize,\n      cards: cards,\n      cardStats: cardStats,\n    };\n  }\n\n  convertHistogramToHeatmapData() {\n    if (!this.range || !this.series) {\n      return;\n    }\n\n    const panelDatasource = this.getPanelDataSourceType();\n    let xBucketSize, yBucketSize, bucketsData, tsBuckets;\n\n    // Try to sort series by bucket bound, if datasource doesn't do it.\n    if (!includes(dsSupportHistogramSort, panelDatasource)) {\n      this.series.sort(sortSeriesByLabel);\n    }\n\n    if (this.panel.reverseYBuckets) {\n      this.series.reverse();\n    }\n\n    // Convert histogram to heatmap. Each histogram bucket represented by the series which name is\n    // a top (or bottom, depends of datasource) bucket bound. Further, these values will be used as Y axis labels.\n    bucketsData = histogramToHeatmap(this.series);\n\n    tsBuckets = map(this.series, 'label');\n    const yBucketBound = this.panel.yBucketBound;\n    if (\n      (panelDatasource === 'prometheus' && yBucketBound !== 'lower' && yBucketBound !== 'middle') ||\n      yBucketBound === 'upper'\n    ) {\n      // Prometheus labels are upper inclusive bounds, so add empty bottom bucket label.\n      tsBuckets = [''].concat(tsBuckets);\n    } else {\n      // Elasticsearch uses labels as lower bucket bounds, so add empty top bucket label.\n      // Use this as a default mode as well.\n      tsBuckets.push('');\n    }\n\n    // Calculate bucket size based on heatmap data\n    const xBucketBoundSet = map(keys(bucketsData), (key) => Number(key));\n    xBucketSize = calculateBucketSize(xBucketBoundSet);\n    // Always let yBucketSize=1 in 'tsbuckets' mode\n    yBucketSize = 1;\n\n    const { cards, cardStats } = convertToCards(bucketsData, this.panel.hideZeroBuckets);\n\n    this.data = {\n      buckets: bucketsData,\n      xBucketSize: xBucketSize,\n      yBucketSize: yBucketSize,\n      tsBuckets: tsBuckets,\n      cards: cards,\n      cardStats: cardStats,\n    };\n  }\n\n  getPanelDataSourceType() {\n    if (this.datasource && this.datasource.meta && this.datasource.meta.id) {\n      return this.datasource.meta.id;\n    } else {\n      return 'unknown';\n    }\n  }\n\n  // This should only be called from the snapshot callback\n  onSnapshotLoad(dataList: LegacyResponseData[]) {\n    this.onDataFramesReceived(getProcessedDataFrames(dataList));\n  }\n\n  // Directly support DataFrame\n  onDataFramesReceived(data: DataFrame[]) {\n    this.series = this.processor.getSeriesList({ dataList: data, range: this.range }).map((ts) => {\n      ts.color = undefined; // remove whatever the processor set\n      ts.flotpairs = ts.getFlotPairs(this.panel.nullPointMode);\n      return ts;\n    });\n\n    this.dataWarning = null;\n    const datapointsCount = reduce(\n      this.series,\n      (sum, series) => {\n        return sum + series.datapoints.length;\n      },\n      0\n    );\n\n    if (datapointsCount === 0) {\n      this.dataWarning = {\n        title: 'No data points',\n        tip: 'No datapoints returned from data query',\n      };\n    } else {\n      for (const series of this.series) {\n        if (series.isOutsideRange) {\n          this.dataWarning = {\n            title: 'Data points outside time range',\n            tip: 'Can be caused by timezone mismatch or missing time filter in query',\n          };\n          break;\n        }\n      }\n    }\n\n    this.render();\n  }\n\n  onDataError() {\n    this.series = [];\n    this.render();\n  }\n\n  onCardColorChange(newColor: any) {\n    this.panel.color.cardColor = newColor;\n    this.render();\n  }\n\n  parseSeries(series: TimeSeries[]) {\n    const min = _min(map(series, (s) => s.stats.min));\n    const minLog = _min(map(series, (s) => s.stats.logmin));\n    const max = _max(map(series, (s) => s.stats.max));\n\n    return {\n      max,\n      min,\n      minLog,\n    };\n  }\n\n  parseHistogramSeries(series: TimeSeries[]) {\n    const bounds = map(series, (s) => Number(s.alias));\n    const min = _min(bounds);\n    const minLog = _min(bounds);\n    const max = _max(bounds);\n\n    return {\n      max: max,\n      min: min,\n      minLog: minLog,\n    };\n  }\n\n  link(scope: any, elem: any, attrs: any, ctrl: any) {\n    rendering(scope, elem, attrs, ctrl);\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 { TableFooterCalc } from './models.gen';\nimport { config } from 'app/core/config';\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 React, { Component } from 'react';\nimport { Select, Table } from '@grafana/ui';\nimport {\n  DataFrame,\n  FieldMatcherID,\n  getDataSourceRef,\n  getFrameDisplayName,\n  PanelProps,\n  SelectableValue,\n} from '@grafana/data';\nimport { PanelOptions } from './models.gen';\nimport { css } from '@emotion/css';\nimport { config } from 'app/core/config';\nimport { FilterItem, TableSortByFieldState } from '@grafana/ui/src/components/Table/types';\nimport { dispatch } from '../../../store/store';\nimport { applyFilterFromTable } from '../../../features/variables/adhoc/actions';\nimport { getDashboardSrv } from '../../../features/dashboard/services/DashboardSrv';\nimport { getFooterCells } from './footer';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\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      />\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 } = 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 <div className={tableStyles.noData}>No data</div>;\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\n              menuShouldPortal\n              options={names}\n              value={names[currentIndex]}\n              onChange={this.onChangeTableSelection}\n            />\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","//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\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}\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};\n","import {\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';\nimport { omitBy, isNil, isNumber, defaultTo } from 'lodash';\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: 'last',\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","import {\n  FieldOverrideContext,\n  FieldType,\n  getFieldDisplayName,\n  PanelPlugin,\n  ReducerID,\n  standardEditorsRegistry,\n} from '@grafana/data';\nimport { TablePanel } from './TablePanel';\nimport { PanelOptions, defaultPanelOptions, defaultPanelFieldConfig } from './models.gen';\nimport { TableFieldOptions } from '@grafana/schema';\nimport { tableMigrationHandler, tablePanelChangedHandler } from './migrations';\nimport { TableCellDisplayMode } from '@grafana/ui';\nimport { TableSuggestionsSupplier } from './suggestions';\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: '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 header',\n        description: \"To display table's header or not to display\",\n        defaultValue: defaultPanelOptions.showHeader,\n      })\n      .addBooleanSwitch({\n        path: 'footer.show',\n        name: 'Show Footer',\n        description: \"To display table's footer or not to display\",\n        defaultValue: defaultPanelOptions.footer?.show,\n      })\n      .addCustomEditor({\n        id: 'footer.reducer',\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        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  })\n  .setSuggestionsSupplier(new TableSuggestionsSupplier());\n","import { VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { TableFieldOptions } from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\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","import { findIndex, isObject, map } from 'lodash';\nimport flatten from 'app/core/utils/flatten';\nimport TimeSeries from 'app/core/time_series2';\nimport TableModel, { mergeTablesIntoModel } from 'app/core/table_model';\nimport { TableTransform } from './types';\nimport { Column, TableData } from '@grafana/data';\n\nconst transformers: { [key: string]: TableTransform } = {};\nexport const timeSeriesFormatFilterer = (data: any): any[] => {\n  if (!Array.isArray(data)) {\n    return data.datapoints ? [data] : [];\n  }\n\n  return data.reduce((acc, series) => {\n    if (!series.datapoints) {\n      return acc;\n    }\n\n    return acc.concat(series);\n  }, []);\n};\n\nexport const tableDataFormatFilterer = (data: any): any[] => {\n  if (!Array.isArray(data)) {\n    return data.columns ? [data] : [];\n  }\n\n  return data.reduce((acc, series) => {\n    if (!series.columns) {\n      return acc;\n    }\n\n    return acc.concat(series);\n  }, []);\n};\n\ntransformers['timeseries_to_rows'] = {\n  description: 'Time series to rows',\n  getColumns: () => {\n    return [];\n  },\n  transform: (data, panel, model) => {\n    model.columns = [{ text: 'Time', type: 'date' }, { text: 'Metric' }, { text: 'Value' }];\n    const filteredData = timeSeriesFormatFilterer(data);\n\n    for (let i = 0; i < filteredData.length; i++) {\n      const series = filteredData[i];\n      for (let y = 0; y < series.datapoints.length; y++) {\n        const dp = series.datapoints[y];\n        model.rows.push([dp[1], series.target, dp[0]]);\n      }\n    }\n  },\n};\n\ntransformers['timeseries_to_columns'] = {\n  description: 'Time series to columns',\n  getColumns: () => {\n    return [];\n  },\n  transform: (data, panel, model) => {\n    model.columns.push({ text: 'Time', type: 'date' });\n\n    // group by time\n    const points: any = {};\n    const filteredData = timeSeriesFormatFilterer(data);\n\n    for (let i = 0; i < filteredData.length; i++) {\n      const series = filteredData[i];\n      model.columns.push({ text: series.target });\n\n      for (let y = 0; y < series.datapoints.length; y++) {\n        const dp = series.datapoints[y];\n        const timeKey = dp[1].toString();\n\n        if (!points[timeKey]) {\n          points[timeKey] = { time: dp[1] };\n          points[timeKey][i] = dp[0];\n        } else {\n          points[timeKey][i] = dp[0];\n        }\n      }\n    }\n\n    for (const time in points) {\n      const point = points[time];\n      const values = [point.time];\n\n      for (let i = 0; i < filteredData.length; i++) {\n        const value = point[i];\n        values.push(value);\n      }\n\n      model.rows.push(values);\n    }\n  },\n};\n\ntransformers['timeseries_aggregations'] = {\n  description: 'Time series aggregations',\n  getColumns: () => {\n    return [\n      { text: 'Avg', value: 'avg' },\n      { text: 'Min', value: 'min' },\n      { text: 'Max', value: 'max' },\n      { text: 'Total', value: 'total' },\n      { text: 'Current', value: 'current' },\n      { text: 'Count', value: 'count' },\n    ];\n  },\n  transform: (data, panel, model) => {\n    let i, y;\n    model.columns.push({ text: 'Metric' });\n\n    for (i = 0; i < panel.columns.length; i++) {\n      model.columns.push({ text: panel.columns[i].text });\n    }\n\n    const filteredData = timeSeriesFormatFilterer(data);\n\n    for (i = 0; i < filteredData.length; i++) {\n      const series = new TimeSeries({\n        datapoints: filteredData[i].datapoints,\n        alias: filteredData[i].target,\n      });\n\n      series.getFlotPairs('connected');\n      const cells = [series.alias];\n\n      for (y = 0; y < panel.columns.length; y++) {\n        cells.push(series.stats[panel.columns[y].value]);\n      }\n\n      model.rows.push(cells);\n    }\n  },\n};\n\ntransformers['annotations'] = {\n  description: 'Annotations',\n  getColumns: () => {\n    return [];\n  },\n  transform: (data, panel, model) => {\n    model.columns.push({ text: 'Time', type: 'date' });\n    model.columns.push({ text: 'Title' });\n    model.columns.push({ text: 'Text' });\n    model.columns.push({ text: 'Tags' });\n\n    if (!data || !data.annotations || data.annotations.length === 0) {\n      return;\n    }\n\n    for (let i = 0; i < data.annotations.length; i++) {\n      const evt = data.annotations[i];\n      model.rows.push([evt.time, evt.title, evt.text, evt.tags]);\n    }\n  },\n};\n\ntransformers['table'] = {\n  description: 'Table',\n  getColumns: (data) => {\n    if (!data || data.length === 0) {\n      return [];\n    }\n\n    // Single query returns data columns as is\n    if (data.length === 1) {\n      return [...data[0].columns];\n    }\n\n    const filteredData = tableDataFormatFilterer(data);\n\n    // Track column indexes: name -> index\n    const columnNames: any = {};\n\n    // Union of all columns\n    const columns = filteredData.reduce((acc: Column[], series: TableData) => {\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    }, []);\n\n    return columns;\n  },\n  transform: (data: any[], panel, model) => {\n    if (!data || data.length === 0) {\n      return;\n    }\n    const filteredData = tableDataFormatFilterer(data);\n    const noTableIndex = findIndex(filteredData, (d) => 'columns' in d && 'rows' in d);\n    if (noTableIndex < 0) {\n      throw {\n        message: `Result of query #${String.fromCharCode(\n          65 + noTableIndex\n        )} is not in table format, try using another transform.`,\n      };\n    }\n\n    mergeTablesIntoModel(model, ...filteredData);\n  },\n};\n\ntransformers['json'] = {\n  description: 'JSON Data',\n  getColumns: (data) => {\n    if (!data || data.length === 0) {\n      return [];\n    }\n\n    const names: any = {};\n    for (let i = 0; i < data.length; i++) {\n      const series = data[i];\n      if (series.type !== 'docs') {\n        continue;\n      }\n\n      // only look at 100 docs\n      const maxDocs = Math.min(series.datapoints.length, 100);\n      for (let y = 0; y < maxDocs; y++) {\n        const doc = series.datapoints[y];\n        const flattened = flatten(doc, {});\n        for (const propName in flattened) {\n          names[propName] = true;\n        }\n      }\n    }\n\n    return map(names, (value, key) => {\n      return { text: key, value: key };\n    });\n  },\n  transform: (data, panel, model) => {\n    let i, y, z;\n\n    for (const column of panel.columns) {\n      const tableCol: any = { text: column.text };\n\n      // if filterable data then set columns to filterable\n      if (data.length > 0 && data[0].filterable) {\n        tableCol.filterable = true;\n      }\n\n      model.columns.push(tableCol);\n    }\n\n    if (model.columns.length === 0) {\n      model.columns.push({ text: 'JSON' });\n    }\n\n    for (i = 0; i < data.length; i++) {\n      const series = data[i];\n\n      for (y = 0; y < series.datapoints.length; y++) {\n        const dp = series.datapoints[y];\n        const values = [];\n\n        if (isObject(dp) && panel.columns.length > 0) {\n          const flattened = flatten(dp);\n          for (z = 0; z < panel.columns.length; z++) {\n            values.push(flattened[panel.columns[z].value]);\n          }\n        } else {\n          values.push(JSON.stringify(dp));\n        }\n\n        model.rows.push(values);\n      }\n    }\n  },\n};\n\nfunction transformDataToTable(data: any, panel: any) {\n  const model = new TableModel();\n\n  if (!data || data.length === 0) {\n    return model;\n  }\n\n  const transformer = transformers[panel.transform];\n  if (!transformer) {\n    throw { message: 'Transformer ' + panel.transform + ' not found' };\n  }\n\n  transformer.transform(data, panel, model);\n  return model;\n}\n\nexport { transformers, transformDataToTable };\n","import { find, map, without } from 'lodash';\nimport { transformers } from './transformers';\nimport { ColumnStyle } from './types';\n\nexport class TablePanelEditorCtrl {\n  panel: any;\n  panelCtrl: any;\n  transformers: any;\n  fontSizes: any;\n  addColumnSegment: any;\n  getColumnNames: any;\n  canSetColumns = false;\n  columnsHelpMessage = '';\n\n  /** @ngInject */\n  constructor($scope: any, private uiSegmentSrv: any) {\n    $scope.editor = this;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n    this.transformers = transformers;\n    this.fontSizes = ['80%', '90%', '100%', '110%', '120%', '130%', '150%', '160%', '180%', '200%', '220%', '250%'];\n    this.addColumnSegment = uiSegmentSrv.newPlusButton();\n    this.updateTransformHints();\n  }\n\n  updateTransformHints() {\n    this.canSetColumns = false;\n    this.columnsHelpMessage = '';\n\n    switch (this.panel.transform) {\n      case 'timeseries_aggregations': {\n        this.canSetColumns = true;\n        break;\n      }\n      case 'json': {\n        this.canSetColumns = true;\n        break;\n      }\n      case 'table': {\n        this.columnsHelpMessage = 'Columns and their order are determined by the data query';\n      }\n    }\n  }\n\n  getColumnOptions() {\n    if (!this.panelCtrl.dataRaw) {\n      return Promise.resolve([]);\n    }\n    const columns = this.transformers[this.panel.transform].getColumns(this.panelCtrl.dataRaw);\n    const segments = map(columns, (c: any) => this.uiSegmentSrv.newSegment({ value: c.text }));\n    return Promise.resolve(segments);\n  }\n\n  addColumn() {\n    const columns = transformers[this.panel.transform].getColumns(this.panelCtrl.dataRaw);\n    const column: any = find(columns, { text: this.addColumnSegment.value });\n\n    if (column) {\n      this.panel.columns.push(column);\n      this.render();\n    }\n\n    const plusButton = this.uiSegmentSrv.newPlusButton();\n    this.addColumnSegment.html = plusButton.html;\n    this.addColumnSegment.value = plusButton.value;\n  }\n\n  transformChanged() {\n    this.panel.columns = [];\n    if (this.panel.transform === 'annotations') {\n      this.panelCtrl.refresh();\n    } else {\n      if (this.panel.transform === 'timeseries_aggregations') {\n        this.panel.columns.push({ text: 'Avg', value: 'avg' });\n      }\n\n      this.updateTransformHints();\n      this.render();\n    }\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  removeColumn(column: ColumnStyle) {\n    this.panel.columns = without(this.panel.columns, column);\n    this.panelCtrl.render();\n  }\n}\n\nexport function tablePanelEditor(uiSegmentSrv: any) {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/table-old/editor.html',\n    controller: TablePanelEditorCtrl,\n  };\n}\n","import { map, without } from 'lodash';\nimport { getValueFormats } from '@grafana/data';\n\nexport class ColumnOptionsCtrl {\n  panel: any;\n  panelCtrl: any;\n  colorModes: any;\n  columnStyles: any;\n  columnTypes: any;\n  fontSizes: any;\n  dateFormats: any;\n  addColumnSegment: any;\n  unitFormats: any;\n  getColumnNames: any;\n  activeStyleIndex: number;\n  mappingTypes: any;\n\n  alignTypes: any;\n  static readonly alignTypesEnum = [\n    { text: 'auto', value: '' },\n    { text: 'left', value: 'left' },\n    { text: 'center', value: 'center' },\n    { text: 'right', value: 'right' },\n  ];\n\n  /** @ngInject */\n  constructor($scope: any) {\n    $scope.editor = this;\n\n    this.activeStyleIndex = 0;\n    this.panelCtrl = $scope.ctrl;\n    this.panel = this.panelCtrl.panel;\n    this.unitFormats = getValueFormats();\n    this.colorModes = [\n      { text: 'Disabled', value: null },\n      { text: 'Cell', value: 'cell' },\n      { text: 'Value', value: 'value' },\n      { text: 'Row', value: 'row' },\n    ];\n    this.columnTypes = [\n      { text: 'Number', value: 'number' },\n      { text: 'String', value: 'string' },\n      { text: 'Date', value: 'date' },\n      { text: 'Hidden', value: 'hidden' },\n    ];\n    this.fontSizes = ['80%', '90%', '100%', '110%', '120%', '130%', '150%', '160%', '180%', '200%', '220%', '250%'];\n    this.dateFormats = [\n      { text: 'YYYY-MM-DD HH:mm:ss', value: 'YYYY-MM-DD HH:mm:ss' },\n      { text: 'YYYY-MM-DD HH:mm:ss.SSS', value: 'YYYY-MM-DD HH:mm:ss.SSS' },\n      { text: 'MM/DD/YY h:mm:ss a', value: 'MM/DD/YY h:mm:ss a' },\n      { text: 'MMMM D, YYYY LT', value: 'MMMM D, YYYY LT' },\n      { text: 'YYYY-MM-DD', value: 'YYYY-MM-DD' },\n    ];\n    this.mappingTypes = [\n      { text: 'Value to text', value: 1 },\n      { text: 'Range to text', value: 2 },\n    ];\n    this.alignTypes = ColumnOptionsCtrl.alignTypesEnum;\n\n    this.getColumnNames = () => {\n      if (!this.panelCtrl.table) {\n        return [];\n      }\n      return map(this.panelCtrl.table.columns, (col: any) => {\n        return col.text;\n      });\n    };\n\n    this.onColorChange = this.onColorChange.bind(this);\n  }\n\n  render() {\n    this.panelCtrl.render();\n  }\n\n  setUnitFormat(column: any) {\n    return (value: any) => {\n      column.unit = value;\n      this.panelCtrl.render();\n    };\n  }\n\n  addColumnStyle() {\n    const newStyleRule: object = {\n      unit: 'short',\n      type: 'number',\n      alias: '',\n      decimals: 2,\n      colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n      colorMode: null,\n      pattern: '',\n      dateFormat: 'YYYY-MM-DD HH:mm:ss',\n      thresholds: [],\n      mappingType: 1,\n      align: 'auto',\n    };\n\n    const styles = this.panel.styles;\n    const stylesCount = styles.length;\n    let indexToInsert = stylesCount;\n\n    // check if last is a catch all rule, then add it before that one\n    if (stylesCount > 0) {\n      const last = styles[stylesCount - 1];\n      if (last.pattern === '/.*/') {\n        indexToInsert = stylesCount - 1;\n      }\n    }\n\n    styles.splice(indexToInsert, 0, newStyleRule);\n    this.activeStyleIndex = indexToInsert;\n  }\n\n  removeColumnStyle(style: any) {\n    this.panel.styles = without(this.panel.styles, style);\n  }\n\n  invertColorOrder(index: number) {\n    const ref = this.panel.styles[index].colors;\n    const copy = ref[0];\n    ref[0] = ref[2];\n    ref[2] = copy;\n    this.panelCtrl.render();\n  }\n\n  onColorChange(style: any, colorIndex: number) {\n    return (newColor: string) => {\n      style.colors[colorIndex] = newColor;\n      this.render();\n    };\n  }\n\n  addValueMap(style: any) {\n    if (!style.valueMaps) {\n      style.valueMaps = [];\n    }\n    style.valueMaps.push({ value: '', text: '' });\n    this.panelCtrl.render();\n  }\n\n  removeValueMap(style: any, index: number) {\n    style.valueMaps.splice(index, 1);\n    this.panelCtrl.render();\n  }\n\n  addRangeMap(style: any) {\n    if (!style.rangeMaps) {\n      style.rangeMaps = [];\n    }\n    style.rangeMaps.push({ from: '', to: '', text: '' });\n    this.panelCtrl.render();\n  }\n\n  removeRangeMap(style: any, index: number) {\n    style.rangeMaps.splice(index, 1);\n    this.panelCtrl.render();\n  }\n}\n\nexport function columnOptionsTab() {\n  'use strict';\n  return {\n    restrict: 'E',\n    scope: true,\n    templateUrl: 'public/app/plugins/panel/table-old/column_options.html',\n    controller: ColumnOptionsCtrl,\n  };\n}\n","import { find, first, isArray, isString, escape } from 'lodash';\nimport {\n  escapeStringForRegex,\n  formattedValueToString,\n  getValueFormat,\n  ScopedVars,\n  stringStartsAsRegEx,\n  stringToJsRegex,\n  textUtil,\n  unEscapeStringFromRegex,\n  TimeZone,\n  dateTimeFormatISO,\n  dateTimeFormat,\n  getColorForTheme,\n  GrafanaTheme,\n} from '@grafana/data';\nimport { getTemplateSrv, TemplateSrv } from '@grafana/runtime';\nimport { ColumnRender, TableRenderModel, ColumnStyle } from './types';\nimport { ColumnOptionsCtrl } from './column_options';\n\nexport class TableRenderer {\n  formatters: any[] = [];\n  colorState: any;\n\n  constructor(\n    private panel: { styles: ColumnStyle[]; pageSize: number },\n    private table: TableRenderModel,\n    private timeZone: TimeZone,\n    private sanitize: (v: any) => any,\n    private templateSrv: TemplateSrv = getTemplateSrv(),\n    private theme: GrafanaTheme\n  ) {\n    this.initColumns();\n  }\n\n  setTable(table: TableRenderModel) {\n    this.table = table;\n\n    this.initColumns();\n  }\n\n  initColumns() {\n    this.formatters = [];\n    this.colorState = {};\n\n    for (let colIndex = 0; colIndex < this.table.columns.length; colIndex++) {\n      const column = this.table.columns[colIndex];\n      column.title = column.text;\n\n      for (let i = 0; i < this.panel.styles.length; i++) {\n        const style = this.panel.styles[i];\n\n        const escapedPattern = stringStartsAsRegEx(style.pattern)\n          ? style.pattern\n          : escapeStringForRegex(unEscapeStringFromRegex(style.pattern));\n        const regex = stringToJsRegex(escapedPattern);\n        if (column.text.match(regex)) {\n          column.style = style;\n\n          if (style.alias) {\n            column.title = textUtil.escapeHtml(column.text.replace(regex, style.alias));\n          }\n\n          break;\n        }\n      }\n\n      this.formatters[colIndex] = this.createColumnFormatter(column);\n    }\n  }\n\n  getColorForValue(value: number, style: ColumnStyle) {\n    if (!style.thresholds || !style.colors) {\n      return null;\n    }\n    for (let i = style.thresholds.length; i > 0; i--) {\n      if (value >= style.thresholds[i - 1]) {\n        return getColorForTheme(style.colors[i], this.theme);\n      }\n    }\n    return getColorForTheme(first(style.colors), this.theme);\n  }\n\n  defaultCellFormatter(v: any, style: ColumnStyle) {\n    if (v === null || v === void 0 || v === undefined) {\n      return '';\n    }\n\n    if (isArray(v)) {\n      v = v.join(', ');\n    }\n\n    if (style && style.sanitize) {\n      return this.sanitize(v);\n    } else {\n      return escape(v);\n    }\n  }\n\n  createColumnFormatter(column: ColumnRender) {\n    if (!column.style) {\n      return this.defaultCellFormatter;\n    }\n\n    if (column.style.type === 'hidden') {\n      return (v: any): undefined => undefined;\n    }\n\n    if (column.style.type === 'date') {\n      return (v: any) => {\n        if (v === undefined || v === null) {\n          return '-';\n        }\n\n        if (isArray(v)) {\n          v = v[0];\n        }\n\n        // if is an epoch (numeric string and len > 12)\n        if (isString(v) && !isNaN(v as any) && v.length > 12) {\n          v = parseInt(v, 10);\n        }\n\n        if (!column.style.dateFormat) {\n          return dateTimeFormatISO(v, {\n            timeZone: this.timeZone,\n          });\n        }\n\n        return dateTimeFormat(v, {\n          format: column.style.dateFormat,\n          timeZone: this.timeZone,\n        });\n      };\n    }\n\n    if (column.style.type === 'string') {\n      return (v: any): any => {\n        if (isArray(v)) {\n          v = v.join(', ');\n        }\n\n        const mappingType = column.style.mappingType || 0;\n\n        if (mappingType === 1 && column.style.valueMaps) {\n          for (let i = 0; i < column.style.valueMaps.length; i++) {\n            const map = column.style.valueMaps[i];\n\n            if (v === null) {\n              if (map.value === 'null') {\n                return map.text;\n              }\n              continue;\n            }\n\n            // Allow both numeric and string values to be mapped\n            if ((!isString(v) && Number(map.value) === Number(v)) || map.value === v) {\n              this.setColorState(v, column.style);\n              return this.defaultCellFormatter(map.text, column.style);\n            }\n          }\n        }\n\n        if (mappingType === 2 && column.style.rangeMaps) {\n          for (let i = 0; i < column.style.rangeMaps.length; i++) {\n            const map = column.style.rangeMaps[i];\n\n            if (v === null) {\n              if (map.from === 'null' && map.to === 'null') {\n                return map.text;\n              }\n              continue;\n            }\n\n            if (Number(map.from) <= Number(v) && Number(map.to) >= Number(v)) {\n              this.setColorState(v, column.style);\n              return this.defaultCellFormatter(map.text, column.style);\n            }\n          }\n        }\n\n        if (v === null || v === void 0) {\n          return '-';\n        }\n\n        this.setColorState(v, column.style);\n        return this.defaultCellFormatter(v, column.style);\n      };\n    }\n\n    if (column.style.type === 'number') {\n      const valueFormatter = getValueFormat(column.unit || column.style.unit);\n\n      return (v: any): any => {\n        if (v === null || v === void 0) {\n          return '-';\n        }\n\n        if (isNaN(v) || isArray(v)) {\n          return this.defaultCellFormatter(v, column.style);\n        }\n\n        this.setColorState(v, column.style);\n        return formattedValueToString(valueFormatter(v, column.style.decimals, null));\n      };\n    }\n\n    return (value: any) => {\n      return this.defaultCellFormatter(value, column.style);\n    };\n  }\n\n  setColorState(value: any, style: ColumnStyle) {\n    if (!style.colorMode) {\n      return;\n    }\n\n    if (value === null || value === void 0 || isArray(value)) {\n      return;\n    }\n\n    const numericValue = Number(value);\n    if (isNaN(numericValue)) {\n      return;\n    }\n\n    this.colorState[style.colorMode] = this.getColorForValue(numericValue, style);\n  }\n\n  renderRowVariables(rowIndex: number) {\n    const scopedVars: ScopedVars = {};\n    let cellVariable;\n    const row = this.table.rows[rowIndex];\n    for (let i = 0; i < row.length; i++) {\n      cellVariable = `__cell_${i}`;\n      scopedVars[cellVariable] = { value: row[i], text: row[i] ? row[i].toString() : '' };\n    }\n    return scopedVars;\n  }\n\n  formatColumnValue(colIndex: number, value: any) {\n    const fmt = this.formatters[colIndex];\n    if (fmt) {\n      return fmt(value);\n    }\n    return value;\n  }\n\n  renderCell(columnIndex: number, rowIndex: number, value: any, addWidthHack = false) {\n    value = this.formatColumnValue(columnIndex, value);\n\n    const column = this.table.columns[columnIndex];\n    const cellStyles = [];\n    let cellStyle = '';\n    const cellClasses = [];\n    let cellClass = '';\n\n    if (this.colorState.cell) {\n      cellStyles.push('background-color:' + this.colorState.cell);\n      cellClasses.push('table-panel-color-cell');\n      this.colorState.cell = null;\n    } else if (this.colorState.value) {\n      cellStyles.push('color:' + this.colorState.value);\n      this.colorState.value = null;\n    }\n    // because of the fixed table headers css only solution\n    // there is an issue if header cell is wider the cell\n    // this hack adds header content to cell (not visible)\n    let columnHtml = '';\n    if (addWidthHack) {\n      columnHtml = '<div class=\"table-panel-width-hack\">' + this.table.columns[columnIndex].title + '</div>';\n    }\n\n    if (value === undefined) {\n      cellStyles.push('display:none');\n      column.hidden = true;\n    } else {\n      column.hidden = false;\n    }\n\n    if (column.hidden === true) {\n      return '';\n    }\n\n    if (column.style && column.style.preserveFormat) {\n      cellClasses.push('table-panel-cell-pre');\n    }\n\n    if (column.style && column.style.align) {\n      const textAlign = find(ColumnOptionsCtrl.alignTypesEnum, ['text', column.style.align]);\n      if (textAlign && textAlign['value']) {\n        cellStyles.push(`text-align:${textAlign['value']}`);\n      }\n    }\n\n    if (cellStyles.length) {\n      cellStyle = ' style=\"' + cellStyles.join(';') + '\"';\n    }\n\n    if (column.style && column.style.link) {\n      // Render cell as link\n      const scopedVars = this.renderRowVariables(rowIndex);\n      scopedVars['__cell'] = { value: value, text: value ? value.toString() : '' };\n\n      const cellLink = this.templateSrv.replace(column.style.linkUrl, scopedVars, encodeURIComponent);\n      const sanitizedCellLink = textUtil.sanitizeUrl(cellLink);\n\n      const cellLinkTooltip = textUtil.escapeHtml(this.templateSrv.replace(column.style.linkTooltip, scopedVars));\n      const cellTarget = column.style.linkTargetBlank ? '_blank' : '';\n\n      cellClasses.push('table-panel-cell-link');\n\n      columnHtml += `<a href=\"${sanitizedCellLink}\" target=\"${cellTarget}\" data-link-tooltip data-original-title=\"${cellLinkTooltip}\" data-placement=\"right\"${cellStyle}>`;\n      columnHtml += `${value}`;\n      columnHtml += `</a>`;\n    } else {\n      columnHtml += value;\n    }\n\n    if (column.filterable) {\n      cellClasses.push('table-panel-cell-filterable');\n      columnHtml += `<a class=\"table-panel-filter-link\" data-link-tooltip data-original-title=\"Filter out value\" data-placement=\"bottom\"\n           data-row=\"${rowIndex}\" data-column=\"${columnIndex}\" data-operator=\"!=\">`;\n      columnHtml += `<i class=\"fa fa-search-minus\"></i>`;\n      columnHtml += `</a>`;\n      columnHtml += `<a class=\"table-panel-filter-link\" data-link-tooltip data-original-title=\"Filter for value\" data-placement=\"bottom\"\n           data-row=\"${rowIndex}\" data-column=\"${columnIndex}\" data-operator=\"=\">`;\n      columnHtml += `<i class=\"fa fa-search-plus\"></i>`;\n      columnHtml += `</a>`;\n    }\n\n    if (cellClasses.length) {\n      cellClass = ' class=\"' + cellClasses.join(' ') + '\"';\n    }\n\n    columnHtml = '<td' + cellClass + cellStyle + '>' + columnHtml + '</td>';\n    return columnHtml;\n  }\n\n  render(page: number) {\n    const pageSize = this.panel.pageSize || 100;\n    const startPos = page * pageSize;\n    const endPos = Math.min(startPos + pageSize, this.table.rows.length);\n    let html = '';\n\n    for (let y = startPos; y < endPos; y++) {\n      const row = this.table.rows[y];\n      let cellHtml = '';\n      let rowStyle = '';\n      const rowClasses = [];\n      let rowClass = '';\n      for (let i = 0; i < this.table.columns.length; i++) {\n        cellHtml += this.renderCell(i, y, row[i], y === startPos);\n      }\n\n      if (this.colorState.row) {\n        rowStyle = ' style=\"background-color:' + this.colorState.row + '\"';\n        rowClasses.push('table-panel-color-row');\n        this.colorState.row = null;\n      }\n\n      if (rowClasses.length) {\n        rowClass = ' class=\"' + rowClasses.join(' ') + '\"';\n      }\n\n      html += '<tr ' + rowClass + rowStyle + '>' + cellHtml + '</tr>';\n    }\n\n    return html;\n  }\n\n  render_values() {\n    const rows = [];\n    const visibleColumns = this.table.columns.filter((column) => !column.hidden);\n\n    for (let y = 0; y < this.table.rows.length; y++) {\n      const row = this.table.rows[y];\n      const newRow = [];\n      for (let i = 0; i < this.table.columns.length; i++) {\n        if (!this.table.columns[i].hidden) {\n          newRow.push(this.formatColumnValue(i, row[i]));\n        }\n      }\n      rows.push(newRow);\n    }\n    return {\n      columns: visibleColumns,\n      rows: rows,\n    };\n  }\n}\n","import { defaults } from 'lodash';\nimport $ from 'jquery';\nimport { MetricsPanelCtrl } from 'app/plugins/sdk';\nimport config from 'app/core/config';\nimport { transformDataToTable } from './transformers';\nimport { tablePanelEditor } from './editor';\nimport { columnOptionsTab } from './column_options';\nimport { TableRenderer } from './renderer';\nimport { isTableData, PanelEvents, PanelPlugin, PanelProps } from '@grafana/data';\nimport { dispatch } from 'app/store/store';\nimport { ComponentType } from 'react';\nimport { applyFilterFromTable } from 'app/features/variables/adhoc/actions';\n\nexport class TablePanelCtrl extends MetricsPanelCtrl {\n  static templateUrl = 'module.html';\n\n  pageIndex: number;\n  dataRaw: any;\n  table: any;\n  renderer: any;\n  panelHasRowColorMode: boolean;\n  panelHasLinks: boolean;\n\n  panelDefaults: any = {\n    targets: [{}],\n    transform: 'timeseries_to_columns',\n    pageSize: null,\n    showHeader: true,\n    styles: [\n      {\n        type: 'date',\n        pattern: 'Time',\n        alias: 'Time',\n        dateFormat: 'YYYY-MM-DD HH:mm:ss',\n        align: 'auto',\n      },\n      {\n        unit: 'short',\n        type: 'number',\n        alias: '',\n        decimals: 2,\n        colors: ['rgba(245, 54, 54, 0.9)', 'rgba(237, 129, 40, 0.89)', 'rgba(50, 172, 45, 0.97)'],\n        colorMode: null,\n        pattern: '/.*/',\n        thresholds: [],\n        align: 'right',\n      },\n    ],\n    columns: [],\n\n    fontSize: '100%',\n    sort: { col: 0, desc: true },\n  };\n\n  /** @ngInject */\n  constructor($scope: any, $injector: any, private annotationsSrv: any, private $sanitize: any) {\n    super($scope, $injector);\n\n    this.pageIndex = 0;\n\n    if (this.panel.styles === void 0) {\n      this.panel.styles = this.panel.columns;\n      this.panel.columns = this.panel.fields;\n      delete this.panel.columns;\n      delete this.panel.fields;\n    }\n\n    defaults(this.panel, this.panelDefaults);\n\n    this.panelHasRowColorMode = Boolean(this.panel.styles.find((style: any) => style.colorMode === 'row'));\n    this.panelHasLinks = Boolean(this.panel.styles.find((style: any) => style.link));\n\n    this.events.on(PanelEvents.dataReceived, this.onDataReceived.bind(this));\n    this.events.on(PanelEvents.dataSnapshotLoad, this.onDataReceived.bind(this));\n    this.events.on(PanelEvents.editModeInitialized, this.onInitEditMode.bind(this));\n  }\n\n  onInitEditMode() {\n    this.addEditorTab('Options', tablePanelEditor, 2);\n    this.addEditorTab('Column Styles', columnOptionsTab, 3);\n  }\n\n  migrateToPanel(type: string) {\n    this.onPluginTypeChange(config.panels[type]);\n  }\n\n  issueQueries(datasource: any) {\n    this.pageIndex = 0;\n\n    if (this.panel.transform === 'annotations') {\n      return this.annotationsSrv\n        .getAnnotations({\n          dashboard: this.dashboard,\n          panel: this.panel,\n          range: this.range,\n        })\n        .then((anno: any) => {\n          this.loading = false;\n          this.dataRaw = anno;\n          this.pageIndex = 0;\n          this.render();\n          return { data: this.dataRaw }; // Not used\n        });\n    }\n\n    return super.issueQueries(datasource);\n  }\n\n  onDataReceived(dataList: any) {\n    this.dataRaw = dataList;\n    this.pageIndex = 0;\n\n    // automatically correct transform mode based on data\n    if (this.dataRaw && this.dataRaw.length) {\n      if (isTableData(this.dataRaw[0])) {\n        this.panel.transform = 'table';\n      } else {\n        if (this.dataRaw[0].type === 'docs') {\n          this.panel.transform = 'json';\n        } else {\n          if (this.panel.transform === 'table' || this.panel.transform === 'json') {\n            this.panel.transform = 'timeseries_to_rows';\n          }\n        }\n      }\n    }\n\n    this.render();\n  }\n\n  render() {\n    this.table = transformDataToTable(this.dataRaw, this.panel);\n    this.table.sort(this.panel.sort);\n\n    this.renderer = new TableRenderer(\n      this.panel,\n      this.table,\n      this.dashboard.getTimezone(),\n      this.$sanitize,\n      this.templateSrv,\n      config.theme\n    );\n\n    return super.render(this.table);\n  }\n\n  toggleColumnSort(col: any, colIndex: any) {\n    // remove sort flag from current column\n    if (this.table.columns[this.panel.sort.col]) {\n      this.table.columns[this.panel.sort.col].sort = false;\n    }\n\n    if (this.panel.sort.col === colIndex) {\n      if (this.panel.sort.desc) {\n        this.panel.sort.desc = false;\n      } else {\n        this.panel.sort.col = null;\n      }\n    } else {\n      this.panel.sort.col = colIndex;\n      this.panel.sort.desc = true;\n    }\n    this.render();\n  }\n\n  link(scope: any, elem: JQuery, attrs: any, ctrl: TablePanelCtrl) {\n    let data: any;\n    const panel = ctrl.panel;\n    let pageCount = 0;\n\n    function getTableHeight() {\n      let panelHeight = ctrl.height;\n\n      if (pageCount > 1) {\n        panelHeight -= 26;\n      }\n\n      return panelHeight - 31 + 'px';\n    }\n\n    function appendTableRows(tbodyElem: JQuery) {\n      ctrl.renderer.setTable(data);\n      tbodyElem.empty();\n      tbodyElem.html(ctrl.renderer.render(ctrl.pageIndex));\n    }\n\n    function switchPage(e: any) {\n      const el = $(e.currentTarget);\n      ctrl.pageIndex = parseInt(el.text(), 10) - 1;\n      renderPanel();\n    }\n\n    function appendPaginationControls(footerElem: JQuery) {\n      footerElem.empty();\n\n      const pageSize = panel.pageSize || 100;\n      pageCount = Math.ceil(data.rows.length / pageSize);\n      if (pageCount === 1) {\n        return;\n      }\n\n      const startPage = Math.max(ctrl.pageIndex - 3, 0);\n      const endPage = Math.min(pageCount, startPage + 9);\n\n      const paginationList = $('<ul></ul>');\n\n      for (let i = startPage; i < endPage; i++) {\n        const activeClass = i === ctrl.pageIndex ? 'active' : '';\n        const pageLinkElem = $(\n          '<li><a class=\"table-panel-page-link pointer ' + activeClass + '\">' + (i + 1) + '</a></li>'\n        );\n        paginationList.append(pageLinkElem);\n      }\n\n      footerElem.append(paginationList);\n    }\n\n    function renderPanel() {\n      const panelElem = elem.parents('.panel-content');\n      const rootElem = elem.find('.table-panel-scroll');\n      const tbodyElem = elem.find('tbody');\n      const footerElem = elem.find('.table-panel-footer');\n\n      elem.css({ 'font-size': panel.fontSize });\n      panelElem.addClass('table-panel-content');\n\n      appendTableRows(tbodyElem);\n      appendPaginationControls(footerElem);\n\n      rootElem.css({ 'max-height': getTableHeight() });\n    }\n\n    // hook up link tooltips\n    elem.tooltip({\n      selector: '[data-link-tooltip]',\n    });\n\n    function addFilterClicked(e: any) {\n      const filterData = $(e.currentTarget).data();\n      const options = {\n        datasource: panel.datasource,\n        key: data.columns[filterData.column].text,\n        value: data.rows[filterData.row][filterData.column],\n        operator: filterData.operator,\n      };\n\n      dispatch(applyFilterFromTable(options));\n    }\n\n    elem.on('click', '.table-panel-page-link', switchPage);\n    elem.on('click', '.table-panel-filter-link', addFilterClicked);\n\n    const unbindDestroy = scope.$on('$destroy', () => {\n      elem.off('click', '.table-panel-page-link');\n      elem.off('click', '.table-panel-filter-link');\n      unbindDestroy();\n    });\n\n    ctrl.events.on(PanelEvents.render, (renderData: any) => {\n      data = renderData || data;\n      if (data) {\n        renderPanel();\n      }\n      ctrl.renderingCompleted();\n    });\n  }\n}\n\nexport const plugin = new PanelPlugin((null as unknown) as ComponentType<PanelProps<any>>);\nplugin.angularPanelCtrl = TablePanelCtrl;\nplugin.setNoPadding();\n","import { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React, { FC, MouseEvent } from 'react';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, stylesFactory, useTheme } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport store from 'app/core/store';\nimport { cardContent, cardStyle, iconStyle } from './sharedStyles';\nimport { TutorialCardType } from '../types';\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 React, { FC } from 'react';\nimport { Card } from '../types';\nimport { Icon, stylesFactory, useTheme } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { stylesFactory, useTheme } from '@grafana/ui';\nimport { TutorialCard } from './TutorialCard';\nimport { Card, SetupStep, TutorialCardType } from '../types';\nimport { DocsCard } from './DocsCard';\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 { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport store from 'app/core/store';\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:\n          '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 React, { PureComponent } from 'react';\nimport { PanelProps } from '@grafana/data';\nimport { Button, Spinner, stylesFactory } from '@grafana/ui';\nimport { config } from '@grafana/runtime';\nimport { css, cx } from '@emotion/css';\nimport { contextSrv } from 'app/core/core';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\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';\nimport { GettingStarted } from './GettingStarted';\n\n// Simplest possible panel plugin\nexport const plugin = new PanelPlugin(GettingStarted).setNoPadding();\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 { 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 { 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 React, { FC, useCallback } from 'react';\nimport { VizTooltipOptions } from '@grafana/schema';\nimport {\n  FieldDisplay,\n  FALLBACK_COLOR,\n  formattedValueToString,\n  GrafanaTheme2,\n  DataHoverClearEvent,\n  DataHoverEvent,\n} from '@grafana/data';\nimport {\n  useTheme2,\n  useStyles2,\n  SeriesTableRowProps,\n  DataLinksContextMenu,\n  SeriesTable,\n  usePanelContext,\n} from '@grafana/ui';\nimport { PieChartType, PieChartLabels } from './types';\nimport { useTooltip, useTooltipInPortal } from '@visx/tooltip';\nimport Pie, { PieArcDatum, ProvidedProps } from '@visx/shape/lib/shapes/Pie';\nimport { UseTooltipParams } from '@visx/tooltip/lib/hooks/useTooltip';\nimport { RadialGradient } from '@visx/gradient';\nimport { localPoint } from '@visx/event';\nimport { Group } from '@visx/group';\nimport tinycolor from 'tinycolor2';\nimport { css } from '@emotion/css';\n\nimport { useComponentInstanceId } from '@grafana/ui/src/utils/useComponetInstanceId';\nimport { getTooltipContainerStyles } from '@grafana/ui/src/themes/mixins';\nimport { selectors } from '@grafana/e2e-selectors';\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 config={arc.data.field} 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(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.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 { LegendDisplayMode } from '@grafana/schema';\nimport {\n  DataHoverClearEvent,\n  DataHoverEvent,\n  FALLBACK_COLOR,\n  FieldDisplay,\n  formattedValueToString,\n  getFieldDisplayValues,\n  PanelProps,\n} from '@grafana/data';\n\nimport { PieChart } from './PieChart';\n\nimport { PieChartLegendOptions, PieChartLegendValues, PieChartOptions } from './types';\nimport { Subscription } from 'rxjs';\nimport {\n  SeriesVisibilityChangeBehavior,\n  usePanelContext,\n  useTheme2,\n  VizLayout,\n  VizLegend,\n  VizLegendItem,\n} from '@grafana/ui';\nimport { filterDisplayItems, sumDisplayItemsReducer } from './utils';\n\nconst defaultLegendOptions: PieChartLegendOptions = {\n  displayMode: LegendDisplayMode.List,\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 } = 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 (\n      <div className=\"panel-empty\">\n        <p>No data</p>\n      </div>\n    );\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.displayMode === LegendDisplayMode.Hidden) {\n    return undefined;\n  }\n  const total = displayValues.filter(filterDisplayItems).reduce(sumDisplayItemsReducer, 0);\n\n  const legendItems = 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>((value, idx) => {\n      const hidden = value.field.custom.hideFrom.viz;\n      const display = value.display;\n      return {\n        label: display.title ?? '',\n        color: display.color ?? FALLBACK_COLOR,\n        yAxis: 1,\n        disabled: hidden,\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 = hidden ? 0 : display.numeric / total;\n            const percentOfTotal = fractionOfTotal * 100;\n\n            displayValues.push({\n              numeric: fractionOfTotal,\n              percent: percentOfTotal,\n              text:\n                hidden || isNaN(fractionOfTotal)\n                  ? props.fieldConfig.defaults.noValue ?? '-'\n                  : percentOfTotal.toFixed(0) + '%',\n              title: valuesToShow.length > 1 ? 'Percent' : '',\n            });\n          }\n\n          return displayValues;\n        },\n      };\n    });\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 { PieChartPanel } from './PieChartPanel';\nimport { PieChartOptions, PieChartType, PieChartLabels, PieChartLegendValues } from './types';\nimport { LegendDisplayMode } from '@grafana/schema';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { PieChartPanelChangedHandler } from './migrations';\nimport { addStandardDataReduceOptions } from '../stat/types';\nimport { PieChartSuggestionsSupplier } from './suggestions';\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.displayMode !== LegendDisplayMode.Hidden,\n    });\n  })\n  .setSuggestionsSupplier(new PieChartSuggestionsSupplier());\n","import { FieldColorModeId, FieldConfigProperty, FieldMatcherID, PanelModel } from '@grafana/data';\nimport { LegendDisplayMode } from '@grafana/schema';\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 = { placement: 'right', values: [], displayMode: LegendDisplayMode.Table, calcs: [] };\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.displayMode = LegendDisplayMode.Hidden;\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.displayMode = LegendDisplayMode.Hidden;\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.displayMode = LegendDisplayMode.Hidden;\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 { LegendDisplayMode } from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\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.displayMode = LegendDisplayMode.Hidden;\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 { SingleStatBaseOptions, BarGaugeDisplayMode } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nexport interface BarGaugeOptions extends SingleStatBaseOptions {\n  displayMode: BarGaugeDisplayMode;\n  showUnfilled: boolean;\n}\n\nexport const displayModes: Array<SelectableValue<string>> = [\n  { value: BarGaugeDisplayMode.Gradient, label: 'Gradient' },\n  { value: BarGaugeDisplayMode.Lcd, label: 'Retro LCD' },\n  { value: BarGaugeDisplayMode.Basic, label: 'Basic' },\n];\n","import { commonOptionsBuilder, sharedSingleStatPanelChangedHandler } from '@grafana/ui';\nimport { PanelPlugin } from '@grafana/data';\nimport { BarGaugePanel } from './BarGaugePanel';\nimport { BarGaugeOptions, displayModes } from './types';\nimport { addOrientationOption, addStandardDataReduceOptions } from '../stat/types';\nimport { barGaugePanelMigrationHandler } from './BarGaugeMigrations';\nimport { BarGaugeSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<BarGaugeOptions>(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: displayModes,\n        },\n        defaultValue: 'gradient',\n      })\n      .addBooleanSwitch({\n        path: 'showUnfilled',\n        name: 'Show unfilled area',\n        description: 'When enabled renders the unfilled region as gray',\n        defaultValue: true,\n        showIf: (options: BarGaugeOptions) => options.displayMode !== 'lcd',\n      });\n  })\n  .setPanelChangeHandler(sharedSingleStatPanelChangedHandler)\n  .setMigrationHandler(barGaugePanelMigrationHandler)\n  .setSuggestionsSupplier(new BarGaugeSuggestionsSupplier());\n","import { PanelModel } from '@grafana/data';\nimport { sharedSingleStatMigrationHandler } from '@grafana/ui';\nimport { BarGaugeOptions } from './types';\n\nexport const barGaugePanelMigrationHandler = (panel: PanelModel<BarGaugeOptions>): Partial<BarGaugeOptions> => {\n  return sharedSingleStatMigrationHandler(panel);\n};\n","import { VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data';\nimport { BarGaugeDisplayMode } from '@grafana/ui';\nimport { SuggestionName } from 'app/types/suggestions';\nimport { BarGaugeOptions } from './types';\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<BarGaugeOptions, {}>({\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 {\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\n/**\n * @alpha\n */\nexport interface BarChartOptions extends OptionsWithLegend, OptionsWithTooltip, OptionsWithTextFormatting {\n  orientation: VizOrientation;\n  stacking: StackingMode;\n  showValue: VisibilityMode;\n  barWidth: number;\n  groupWidth: number;\n  xTickLabelRotation: number;\n  xTickLabelMaxLength: number;\n  rawValue: (seriesIdx: number, valueIdx: number) => number;\n}\n\n/**\n * @alpha\n */\nexport interface BarChartFieldConfig extends AxisConfig, HideableFieldConfig {\n  lineWidth?: number; // 0\n  fillOpacity?: number; // 100\n  gradientMode?: GraphGradientMode;\n}\n\n/**\n * @alpha\n */\nexport const defaultBarChartFieldConfig: BarChartFieldConfig = {\n  lineWidth: 1,\n  fillOpacity: 80,\n  gradientMode: GraphGradientMode.None,\n  axisSoftMin: 0,\n};\n","import uPlot, { Axis, AlignedData, Scale } from 'uplot';\nimport { pointWithin, Quadtree, Rect } from './quadtree';\nimport { distribute, SPACE_BETWEEN } from './distribute';\nimport { DataFrame, GrafanaTheme2 } from '@grafana/data';\nimport { calculateFontSize, PlotTooltipInterpolator } from '@grafana/ui';\nimport {\n  StackingMode,\n  VisibilityMode,\n  ScaleDirection,\n  ScaleOrientation,\n  VizTextDisplayOptions,\n  VizLegendOptions,\n} from '@grafana/schema';\nimport { preparePlotData } from '../../../../../packages/grafana-ui/src/components/uPlot/utils';\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  showValue: VisibilityMode;\n  stacking: StackingMode;\n  rawValue: (seriesIdx: number, valueIdx: number) => number | null;\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}\n\n/**\n * @internal\n */\nexport function getConfig(opts: BarsOptions, theme: GrafanaTheme2) {\n  const { xOri, xDir: dir, rawValue, formatValue, showValue } = 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 } = opts;\n\n  if (isStacked) {\n    [groupWidth, barWidth] = [barWidth, groupWidth];\n  }\n\n  let qt: Quadtree;\n  let hovered: Rect | undefined = undefined;\n\n  let barMark = document.createElement('div');\n  barMark.classList.add('bar-mark');\n  barMark.style.position = 'absolute';\n  barMark.style.background = 'rgba(255,255,255,0.4)';\n\n  const xSplits: Axis.Splits = (u: uPlot) => {\n    const _dir = dir * (isXHorizontal ? 1 : -1);\n\n    // for distr: 2 scales, the splits array should contain indices into data[0] rather than values\n    let splits = u.data[0].map((v, i) => i);\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) => {\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 = 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; // TODO: clamp to 1?\n\n    let upScale = 1 / (1 - pctOffset * 2);\n    let offset = (upScale * rn - rn) / 2;\n\n    min -= offset;\n    max += offset;\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  let barsPctLayout: Array<null | { offs: number[]; size: number[] }> = [];\n  let barRects: Rect[] = [];\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 barsBuilder = uPlot.paths.bars!({\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    },\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\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      barRects.push(barRect);\n    },\n  });\n\n  const init = (u: uPlot) => {\n    let over = u.over;\n    over.style.overflow = 'hidden';\n    over.appendChild(barMark);\n  };\n\n  // Build bars\n  const drawClear = (u: uPlot) => {\n    qt = qt || new Quadtree(0, 0, u.bbox.width, u.bbox.height);\n\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    barRects.length = 0;\n    vSpace = hSpace = Infinity;\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  // uPlot hook to draw the labels on the bar chart.\n  const draw = (u: uPlot) => {\n    if (showValue === VisibilityMode.Never) {\n      return;\n    }\n    // pre-cache formatted labels\n    let texts = Array(barRects.length);\n    let labelOffset = LABEL_OFFSET_MAX;\n\n    barRects.forEach((r, i) => {\n      texts[i] = formatValue(r.sidx, rawValue(r.sidx, r.didx)! / (pctStacked ? alignedTotals![r.sidx][r.didx]! : 1));\n      labelOffset = Math.min(labelOffset, Math.round(LABEL_OFFSET_FACTOR * (isXHorizontal ? r.w : r.h)));\n    });\n\n    let fontSize = opts.text?.valueSize ?? VALUE_MAX_FONT_SIZE;\n\n    if (hasAutoValueSize) {\n      for (let i = 0; i < barRects.length; i++) {\n        fontSize = Math.round(\n          Math.min(\n            fontSize,\n            VALUE_MAX_FONT_SIZE,\n            calculateFontSize(\n              texts[i],\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        );\n\n        if (fontSize < VALUE_MIN_FONT_SIZE && showValue !== VisibilityMode.Always) {\n          return;\n        }\n      }\n    }\n\n    u.ctx.save();\n\n    u.ctx.fillStyle = theme.colors.text.primary;\n    u.ctx.font = `${fontSize}px ${theme.typography.fontFamily}`;\n\n    let middleShift = isXHorizontal ? 0 : -Math.round(MIDDLE_BASELINE_SHIFT * fontSize);\n\n    let curAlign: CanvasTextAlign, curBaseline: CanvasTextBaseline;\n\n    barRects.forEach((r, i) => {\n      let value = rawValue(r.sidx, r.didx);\n      let text = texts[i];\n\n      if (value != null) {\n        let align: CanvasTextAlign = isXHorizontal ? 'center' : value < 0 ? 'right' : 'left';\n        let baseline: CanvasTextBaseline = isXHorizontal ? (value < 0 ? 'top' : 'alphabetic') : '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        u.ctx.fillText(\n          text,\n          u.bbox.left + (isXHorizontal ? r.x + r.w / 2 : value < 0 ? r.x - labelOffset : r.x + r.w + labelOffset),\n          u.bbox.top +\n            (isXHorizontal ? (value < 0 ? r.y + r.h + labelOffset : r.y - labelOffset) : r.y + r.h / 2 - middleShift)\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    let found: Rect | undefined;\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        found = o;\n      }\n    });\n\n    if (found) {\n      // prettier-ignore\n      if (found !== hovered) {\n          barMark.style.display = '';\n          barMark.style.left   = found.x / devicePixelRatio + 'px';\n          barMark.style.top    = found.y / devicePixelRatio + 'px';\n          barMark.style.width  = found.w / devicePixelRatio + 'px';\n          barMark.style.height = found.h / devicePixelRatio + 'px';\n          hovered = found;\n          updateActiveSeriesIdx(hovered.sidx);\n          updateActiveDatapointIdx(hovered.didx);\n          updateTooltipPosition();\n        }\n    } else if (hovered !== undefined) {\n      updateActiveSeriesIdx(hovered!.sidx);\n      updateActiveDatapointIdx(hovered!.didx);\n      updateTooltipPosition();\n      hovered = undefined;\n      barMark.style.display = 'none';\n    } else {\n      updateTooltipPosition(true);\n    }\n  };\n\n  let alignedTotals: AlignedData | null = null;\n\n  function prepData(frames: DataFrame[]) {\n    alignedTotals = null;\n\n    return preparePlotData(\n      frames,\n      ({ totals }) => {\n        alignedTotals = totals;\n      },\n      opts.legend\n    );\n  }\n\n  return {\n    cursor: {\n      x: false,\n      y: false,\n      points: { show: false },\n    },\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  ArrayVector,\n  DataFrame,\n  Field,\n  FieldType,\n  formattedValueToString,\n  getDisplayProcessor,\n  getFieldColorModeForField,\n  getFieldSeriesColor,\n  GrafanaTheme2,\n  MutableDataFrame,\n  VizOrientation,\n} from '@grafana/data';\nimport { BarChartFieldConfig, BarChartOptions, defaultBarChartFieldConfig } from './types';\nimport { BarsOptions, getConfig } from './bars';\nimport { FIXED_UNIT, measureText, UPlotConfigBuilder, UPlotConfigPrepFn, UPLOT_AXIS_FONT_SIZE } from '@grafana/ui';\nimport { Padding } from 'uplot';\nimport {\n  AxisPlacement,\n  ScaleDirection,\n  ScaleDistribution,\n  ScaleOrientation,\n  StackingMode,\n  VizLegendOptions,\n} from '@grafana/schema';\nimport { collectStackingGroups, orderIdsByCalcs } from '../../../../../packages/grafana-ui/src/components/uPlot/utils';\nimport { orderBy } from 'lodash';\n\n/** @alpha */\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 const preparePlotConfigBuilder: UPlotConfigPrepFn<BarChartOptions> = ({\n  frame,\n  theme,\n  orientation,\n  showValue,\n  groupWidth,\n  barWidth,\n  stacking,\n  text,\n  rawValue,\n  allFrames,\n  xTickLabelRotation,\n  xTickLabelMaxLength,\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    stacking,\n    rawValue,\n    formatValue,\n    text,\n    showValue,\n    legend,\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  builder.addAxis({\n    scaleKey: 'x',\n    isTime: false,\n    placement: vizOrientation.xOri === 0 ? AxisPlacement.Bottom : AxisPlacement.Left,\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  });\n\n  let seriesIndex = 0;\n  const legendOrdered = isLegendOrdered(legend);\n  const stackingGroups: Map<string, number[]> = new Map();\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    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: 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      // 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: customConfig.axisSoftMin,\n      softMax: customConfig.axisSoftMax,\n      orientation: vizOrientation.yOri,\n      direction: vizOrientation.yDir,\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) => formattedValueToString(field.display!(v)),\n        theme,\n        grid: { show: customConfig.axisGridShow },\n      });\n    }\n\n    collectStackingGroups(field, stackingGroups, seriesIndex);\n  }\n\n  if (stackingGroups.size !== 0) {\n    for (const [_, seriesIds] of stackingGroups.entries()) {\n      const seriesIdxs = orderIdsByCalcs({ ids: seriesIds, legend, frame });\n      for (let j = seriesIdxs.length - 1; j > 0; j--) {\n        builder.addBand({\n          series: [seriesIdxs[j], seriesIdxs[j - 1]],\n        });\n      }\n    }\n  }\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 [0, paddingRight, paddingBottom, paddingLeft];\n}\n\n/** @internal */\nexport function preparePlotFrame(data: DataFrame[]) {\n  const firstFrame = data[0];\n  const firstString = firstFrame.fields.find((f) => f.type === FieldType.string);\n\n  if (!firstString) {\n    throw new Error('No string field in DF');\n  }\n\n  const resultFrame = new MutableDataFrame();\n  resultFrame.addField(firstString);\n\n  for (const f of firstFrame.fields) {\n    if (f.type === FieldType.number) {\n      resultFrame.addField(f);\n    }\n  }\n\n  return resultFrame;\n}\n\n/** @internal */\nexport function prepareGraphableFrames(\n  series: DataFrame[],\n  theme: GrafanaTheme2,\n  options: BarChartOptions\n): DataFrame[] | null {\n  if (!series?.length) {\n    return null;\n  }\n\n  const frames: DataFrame[] = [];\n  const firstFrame = series[0];\n\n  if (!firstFrame.fields.some((f) => f.type === FieldType.string)) {\n    return null;\n  }\n\n  if (!firstFrame.fields.some((f) => f.type === FieldType.number)) {\n    return null;\n  }\n\n  const legendOrdered = isLegendOrdered(options.legend);\n  let seriesIndex = 0;\n\n  for (let frame of series) {\n    const fields: Field[] = [];\n    for (const field of frame.fields) {\n      if (field.type === FieldType.number) {\n        field.state = field.state ?? {};\n\n        field.state.seriesIndex = seriesIndex++;\n\n        let copy = {\n          ...field,\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      } else {\n        fields.push({ ...field });\n      }\n    }\n\n    let orderedFields: Field[] | undefined;\n\n    if (legendOrdered) {\n      orderedFields = orderBy(\n        fields,\n        ({ state }) => {\n          return state?.calcs?.[options.legend.sortBy!.toLowerCase()];\n        },\n        options.legend.sortDesc ? 'desc' : 'asc'\n      );\n      // The string field needs to be the first one\n      if (orderedFields[orderedFields.length - 1].type === FieldType.string) {\n        orderedFields.unshift(orderedFields.pop()!);\n      }\n    }\n\n    frames.push({\n      ...frame,\n      fields: orderedFields || fields,\n    });\n  }\n\n  return frames;\n}\n\nexport const isLegendOrdered = (options: VizLegendOptions) => Boolean(options?.sortBy && options.sortDesc !== null);\n","import React, { useRef } from 'react';\nimport { DataFrame, FieldType, TimeRange } from '@grafana/data';\nimport { GraphNG, GraphNGProps, PlotLegend, UPlotConfigBuilder, usePanelContext, useTheme2 } from '@grafana/ui';\nimport { LegendDisplayMode } from '@grafana/schema';\nimport { BarChartOptions } from './types';\nimport { isLegendOrdered, preparePlotConfigBuilder, preparePlotFrame } from './utils';\nimport { PropDiffFn } from '../../../../../packages/grafana-ui/src/components/GraphNG/GraphNG';\n\n/**\n * @alpha\n */\nexport interface BarChartProps\n  extends BarChartOptions,\n    Omit<GraphNGProps, 'prepConfig' | 'propsToDiff' | 'renderLegend' | 'theme'> {}\n\nconst propsToDiff: Array<string | PropDiffFn> = [\n  'orientation',\n  'barWidth',\n  'xTickLabelRotation',\n  'xTickLabelMaxLength',\n  'groupWidth',\n  'stacking',\n  'showValue',\n  'legend',\n  (prev: BarChartProps, next: BarChartProps) => next.text?.valueSize === prev.text?.valueSize,\n];\n\nexport const BarChart: React.FC<BarChartProps> = (props) => {\n  const theme = useTheme2();\n  const { eventBus } = usePanelContext();\n\n  const frame0Ref = useRef<DataFrame>();\n  frame0Ref.current = props.frames[0];\n\n  const renderLegend = (config: UPlotConfigBuilder) => {\n    if (!config || props.legend.displayMode === LegendDisplayMode.Hidden) {\n      return null;\n    }\n\n    return <PlotLegend data={props.frames} config={config} maxHeight=\"35%\" maxWidth=\"60%\" {...props.legend} />;\n  };\n\n  const rawValue = (seriesIdx: number, valueIdx: number) => {\n    // When sorted by legend state.seriesIndex is not changed and is not equal to the sorted index of the field\n    if (isLegendOrdered(props.legend)) {\n      return frame0Ref.current!.fields[seriesIdx].values.get(valueIdx);\n    }\n\n    let field = frame0Ref.current!.fields.find(\n      (f) => f.type === FieldType.number && f.state?.seriesIndex === seriesIdx - 1\n    );\n    return field!.values.get(valueIdx);\n  };\n\n  const prepConfig = (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => {\n    const {\n      timeZone,\n      orientation,\n      barWidth,\n      showValue,\n      groupWidth,\n      stacking,\n      legend,\n      tooltip,\n      text,\n      xTickLabelRotation,\n      xTickLabelMaxLength,\n    } = props;\n\n    return preparePlotConfigBuilder({\n      frame: alignedFrame,\n      getTimeRange,\n      theme,\n      timeZone,\n      eventBus,\n      orientation,\n      barWidth,\n      showValue,\n      groupWidth,\n      xTickLabelRotation,\n      xTickLabelMaxLength,\n      stacking,\n      legend,\n      tooltip,\n      text,\n      rawValue,\n      allFrames: props.frames,\n    });\n  };\n\n  return (\n    <GraphNG\n      {...props}\n      theme={theme}\n      frames={props.frames}\n      prepConfig={prepConfig}\n      propsToDiff={propsToDiff}\n      preparePlotFrame={preparePlotFrame}\n      renderLegend={renderLegend}\n    />\n  );\n};\nBarChart.displayName = 'BarChart';\n","import {\n  DataFrame,\n  FieldColorModeId,\n  FieldConfigProperty,\n  FieldType,\n  PanelPlugin,\n  VizOrientation,\n} from '@grafana/data';\nimport { BarChartPanel } from './BarChartPanel';\nimport { StackingMode, VisibilityMode } from '@grafana/schema';\nimport { graphFieldOptions, commonOptionsBuilder } from '@grafana/ui';\nimport { BarChartFieldConfig, BarChartOptions, defaultBarChartFieldConfig } from 'app/plugins/panel/barchart/types';\nimport { BarChartSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<BarChartOptions, 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, true);\n      commonOptionsBuilder.addHideFrom(builder);\n    },\n  })\n  .setPanelOptions((builder) => {\n    builder\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: VizOrientation.Auto,\n      })\n      .addSliderInput({\n        path: 'xTickLabelRotation',\n        name: 'Rotate bar labels',\n        defaultValue: 0,\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: 'Auto',\n          min: 0,\n        },\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: VisibilityMode.Auto,\n      })\n      .addRadio({\n        path: 'stacking',\n        name: 'Stacking',\n        settings: {\n          options: graphFieldOptions.stacking,\n        },\n        defaultValue: StackingMode.None,\n      })\n      .addSliderInput({\n        path: 'groupWidth',\n        name: 'Group width',\n        defaultValue: 0.7,\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: 0.97,\n        settings: {\n          min: 0,\n          max: 1,\n          step: 0.01,\n        },\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 React, { useMemo } from 'react';\nimport { TooltipDisplayMode, StackingMode } from '@grafana/schema';\nimport { PanelProps, TimeRange, VizOrientation } from '@grafana/data';\nimport { measureText, TooltipPlugin, UPLOT_AXIS_FONT_SIZE, useTheme2 } from '@grafana/ui';\nimport { BarChartOptions } from './types';\nimport { BarChart } from './BarChart';\nimport { prepareGraphableFrames } from './utils';\nimport { PanelDataErrorView } from '@grafana/runtime';\n\ninterface Props extends PanelProps<BarChartOptions> {}\n\n/**\n * @alpha\n */\nexport const BarChartPanel: React.FunctionComponent<Props> = ({ data, options, width, height, timeZone, id }) => {\n  const theme = useTheme2();\n\n  const frames = useMemo(() => prepareGraphableFrames(data?.series, theme, options), [data, theme, options]);\n  const orientation = useMemo(() => {\n    if (!options.orientation || options.orientation === VizOrientation.Auto) {\n      return width < height ? VizOrientation.Horizontal : VizOrientation.Vertical;\n    }\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 aproximation.\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  // Force 'multi' tooltip setting or stacking mode\n  const tooltip = useMemo(() => {\n    if (options.stacking === StackingMode.Normal || options.stacking === StackingMode.Percent) {\n      return { ...options.tooltip, mode: TooltipDisplayMode.Multi };\n    }\n    return options.tooltip;\n  }, [options.tooltip, options.stacking]);\n\n  if (!frames) {\n    return <PanelDataErrorView panelId={id} data={data} needsStringField={true} needsNumberField={true} />;\n  }\n\n  return (\n    <BarChart\n      frames={frames}\n      timeZone={timeZone}\n      timeRange={({ from: 1, to: 1 } as unknown) as TimeRange} // HACK\n      structureRev={data.structureRev}\n      width={width}\n      height={height}\n      {...options}\n      orientation={orientation}\n      xTickLabelMaxLength={xTickLabelMaxLength}\n    >\n      {(config, alignedFrame) => {\n        return <TooltipPlugin data={alignedFrame} config={config} mode={tooltip.mode} timeZone={timeZone} />;\n      }}\n    </BarChart>\n  );\n};\n","import { VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data';\nimport { LegendDisplayMode, StackingMode, VisibilityMode } from '@grafana/schema';\nimport { SuggestionName } from 'app/types/suggestions';\nimport { BarChartFieldConfig, BarChartOptions } from './types';\n\nexport class BarChartSuggestionsSupplier {\n  getListWithDefaults(builder: VisualizationSuggestionsBuilder) {\n    return builder.getListAppender<BarChartOptions, BarChartFieldConfig>({\n      name: SuggestionName.BarChart,\n      pluginId: 'barchart',\n      options: {\n        showValue: VisibilityMode.Never,\n        legend: {\n          displayMode: LegendDisplayMode.Hidden,\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","import React, { useCallback, useMemo, useRef, useLayoutEffect, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { LogRows, CustomScrollbar, LogLabels, useStyles2, usePanelContext } from '@grafana/ui';\nimport {\n  PanelProps,\n  Field,\n  Labels,\n  GrafanaTheme2,\n  LogsSortOrder,\n  LogRowModel,\n  DataHoverClearEvent,\n  DataHoverEvent,\n} from '@grafana/data';\nimport { Options } from './types';\nimport { dataFrameToLogsModel, dedupLogRows } from 'app/core/logs_model';\nimport { getFieldLinksForExplore } from 'app/features/explore/utils/links';\nimport { COMMON_LABELS } from '../../../core/logs_model';\n\ninterface LogsPanelProps extends PanelProps<Options> {}\n\nexport const LogsPanel: React.FunctionComponent<LogsPanelProps> = ({\n  data,\n  timeZone,\n  options: {\n    showLabels,\n    showTime,\n    wrapLogMessage,\n    showCommonLabels,\n    prettifyLogMessage,\n    sortOrder,\n    dedupStrategy,\n    enableLogDetails,\n  },\n  title,\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) {\n    return (\n      <div className=\"panel-empty\">\n        <p>No data found in response</p>\n      </div>\n    );\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';\nimport { Options } from './types';\nimport { LogsPanel } from './LogsPanel';\nimport { LogsPanelSuggestionsSupplier } from './suggestions';\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: 'Descending' },\n            { value: LogsSortOrder.Ascending, label: 'Ascending' },\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';\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';\nexport const PROXY_PREFIX = 'https://cors-anywhere.herokuapp.com/';\n","// Libraries\nimport React, { PureComponent } from 'react';\n\n// Utils & Services\nimport { CustomScrollbar, stylesFactory } from '@grafana/ui';\n\nimport config from 'app/core/config';\nimport { feedToDataFrame } from './utils';\nimport { loadRSSFeed } from './rss';\n\n// Types\nimport { PanelProps, DataFrameView, dateTimeFormat, GrafanaTheme2, textUtil } from '@grafana/data';\nimport { NewsItem } from './types';\nimport { PanelOptions } from './models.gen';\nimport { DEFAULT_FEED_URL, PROXY_PREFIX } from './constants';\nimport { css, cx } from '@emotion/css';\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  constructor(props: Props) {\n    super(props);\n\n    this.state = {};\n  }\n\n  componentDidMount(): void {\n    this.loadChannel();\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\n        ? options.useProxy\n          ? `${PROXY_PREFIX}${options.feedUrl}`\n          : options.feedUrl\n        : DEFAULT_FEED_URL;\n      const res = await loadRSSFeed(url);\n      const frame = feedToDataFrame(res);\n      this.setState({\n        news: new DataFrameView<NewsItem>(frame),\n        isError: false,\n      });\n    } catch (err) {\n      console.error('Error Loading News', err);\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 News</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 { RssFeed, RssItem } from './types';\n\nexport async function loadRSSFeed(url: string): Promise<RssFeed> {\n  const rsp = await fetch(url);\n  const txt = await rsp.text();\n  const domParser = new DOMParser();\n  const doc = domParser.parseFromString(txt, 'text/xml');\n  const feed: RssFeed = {\n    items: [],\n  };\n\n  const getProperty = (node: Element, property: string) => {\n    const propNode = node.querySelector(property);\n    if (propNode) {\n      return propNode.textContent ?? '';\n    }\n    return '';\n  };\n\n  doc.querySelectorAll('item').forEach((node) => {\n    const item: RssItem = {\n      title: getProperty(node, 'title'),\n      link: getProperty(node, 'link'),\n      content: getProperty(node, 'description'),\n      pubDate: getProperty(node, 'pubDate'),\n    };\n\n    const imageNode = node.querySelector(\"meta[property='og:image']\");\n    if (imageNode) {\n      item.ogImage = imageNode.getAttribute('content');\n    }\n\n    feed.items.push(item);\n  });\n\n  return feed;\n}\n","import { RssFeed } from './types';\nimport { ArrayVector, FieldType, DataFrame, dateTime } from '@grafana/data';\n\nexport function feedToDataFrame(feed: RssFeed): 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 was autogenerated by cuetsy. DO NOT EDIT!\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nexport const modelVersion = Object.freeze([0, 0]);\n\nexport interface PanelOptions {\n  feedUrl?: string;\n  showImage?: boolean;\n  useProxy?: boolean;\n}\n\nexport const defaultPanelOptions: PanelOptions = {\n  showImage: true,\n};\n","import { isString } from 'lodash';\nimport { PanelPlugin } from '@grafana/data';\nimport { NewsPanel } from './NewsPanel';\nimport { PanelOptions, defaultPanelOptions } from './models.gen';\nimport { DEFAULT_FEED_URL, PROXY_PREFIX } from './constants';\n\nexport const plugin = new PanelPlugin<PanelOptions>(NewsPanel).setPanelOptions((builder) => {\n  builder\n    .addTextInput({\n      path: 'feedUrl',\n      name: 'URL',\n      description: 'Only RSS feed formats are supported (not Atom).',\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      showIf: (currentConfig: PanelOptions) => {\n        return isString(currentConfig.feedUrl) && !currentConfig.feedUrl.startsWith(PROXY_PREFIX);\n      },\n      defaultValue: defaultPanelOptions.showImage,\n    })\n    .addBooleanSwitch({\n      path: 'useProxy',\n      name: 'Use Proxy',\n      description: 'If the feed is unable to connect, consider a CORS proxy',\n      showIf: (currentConfig: PanelOptions) => {\n        return isString(currentConfig.feedUrl) && !currentConfig.feedUrl.startsWith(PROXY_PREFIX);\n      },\n      defaultValue: defaultPanelOptions.useProxy,\n    });\n});\n","import React, { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { Select, Alert, Label, stylesFactory } from '@grafana/ui';\nimport {\n  LiveChannelScope,\n  LiveChannelAddress,\n  SelectableValue,\n  StandardEditorProps,\n  GrafanaTheme,\n} from '@grafana/data';\n\nimport { LivePanelOptions } from './types';\nimport { config } from 'app/core/config';\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\n              menuShouldPortal\n              options={scopes}\n              value={scopes.find((s) => s.value === scope)}\n              onChange={this.onScopeChanged}\n            />\n          </div>\n\n          {scope && (\n            <div className={style.dropWrap}>\n              <Label>Namespace</Label>\n              <Select\n                menuShouldPortal\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                menuShouldPortal\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 { 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 React, { PureComponent } from 'react';\nimport { Unsubscribable, PartialObserver } from 'rxjs';\nimport { Alert, stylesFactory, Button, JSONFormatter, CustomScrollbar, CodeEditor } from '@grafana/ui';\nimport {\n  GrafanaTheme,\n  PanelProps,\n  LiveChannelStatusEvent,\n  isValidLiveChannelAddress,\n  LiveChannelEvent,\n  isLiveChannelStatusEvent,\n  isLiveChannelMessageEvent,\n  LiveChannelConnectionState,\n  PanelData,\n  LoadingState,\n  applyFieldOverrides,\n  StreamingDataFrame,\n  LiveChannelAddress,\n} from '@grafana/data';\nimport { TablePanel } from '../table/TablePanel';\nimport { LivePanelOptions, MessageDisplayMode } from './types';\nimport { config, getGrafanaLiveSrv } from '@grafana/runtime';\nimport { css, cx } from '@emotion/css';\nimport { isEqual } from 'lodash';\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';\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","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, { PureComponent } from 'react';\nimport { CustomScrollbar } from '@grafana/ui';\nimport {\n  BusEvent,\n  CircularVector,\n  DataHoverEvent,\n  DataHoverClearEvent,\n  DataSelectEvent,\n  EventBus,\n} from '@grafana/data';\nimport { PartialObserver, Unsubscribable } from 'rxjs';\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';\nimport {\n  compareArrayValues,\n  compareDataFrameStructures,\n  fieldReducers,\n  getFieldDisplayName,\n  getFrameDisplayName,\n  PanelProps,\n  ReducerID,\n} from '@grafana/data';\n\nimport { DebugPanelOptions, UpdateCounters, UpdateConfig } from './types';\nimport { IconButton } from '@grafana/ui';\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}&nbsp;</span>}\n            {showCounters.dataChanged && <span>Data: {this.counters.dataChanged}&nbsp;</span>}\n            {showCounters.schemaChanged && <span>Schema: {this.counters.schemaChanged}&nbsp;</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, { Component } from 'react';\nimport {\n  EventBus,\n  LegacyGraphHoverEvent,\n  LegacyGraphHoverClearEvent,\n  DataHoverEvent,\n  DataHoverClearEvent,\n  BusEventBase,\n} from '@grafana/data';\nimport { Subscription } from 'rxjs';\nimport { CustomScrollbar } from '@grafana/ui';\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, { FormEvent } from 'react';\nimport { PanelOptionsEditorProps, PanelProps } from '@grafana/data';\nimport { Field, Input, usePanelContext } from '@grafana/ui';\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","import React, { Component } from 'react';\nimport { PanelProps } from '@grafana/data';\n\nimport { DebugPanelOptions, DebugMode } from './types';\nimport { EventBusLoggerPanel } from './EventBusLogger';\nimport { RenderInfoViewer } from './RenderInfoViewer';\nimport { CursorView } from './CursorView';\nimport { StateView } from './StateView';\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';\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 React, { FC } from 'react';\nimport { css } from '@emotion/css';\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';\nimport { WelcomeBanner } from './Welcome';\n\nexport const plugin = new PanelPlugin(WelcomeBanner).setNoPadding();\n","import React from 'react';\nimport { PanelProps } from '@grafana/data';\nimport memoizeOne from 'memoize-one';\nimport { Options } from './types';\nimport { NodeGraph } from './NodeGraph';\nimport { getNodeGraphDataFrames } from './utils';\nimport { useLinks } from '../../../features/explore/utils/links';\n\nexport const NodeGraphPanel: React.FunctionComponent<PanelProps<Options>> = ({ width, height, data }) => {\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)} getLinks={getLinks} />\n    </div>\n  );\n};\n","import { PanelPlugin } from '@grafana/data';\nimport { NodeGraphPanel } from './NodeGraphPanel';\nimport { Options } from './types';\n\nexport const plugin = new PanelPlugin<Options>(NodeGraphPanel);\n","import React from 'react';\nimport uPlot, { AlignedData } from 'uplot';\nimport {\n  VizLegendOptions,\n  LegendDisplayMode,\n  ScaleDistribution,\n  AxisPlacement,\n  ScaleDirection,\n  ScaleOrientation,\n} from '@grafana/schema';\nimport {\n  DataFrame,\n  formattedValueToString,\n  getFieldColorModeForField,\n  getFieldSeriesColor,\n  GrafanaTheme2,\n} from '@grafana/data';\nimport { Themeable2, UPlotConfigBuilder, UPlotChart, VizLayout, PlotLegend } from '@grafana/ui';\n\nimport {\n  histogramBucketSizes,\n  histogramFrameBucketMaxFieldName,\n} from '@grafana/data/src/transformations/transformers/histogram';\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  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, vals: any[]) => vals.map(xAxisFormatter),\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  builder.addAxis({\n    scaleKey: 'y',\n    isTime: false,\n    placement: AxisPlacement.Left,\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: i,\n        frameIndex: 0,\n      },\n    });\n  }\n\n  return builder;\n};\n\nconst preparePlotData = (frame: DataFrame) => {\n  let data: AlignedData = [] as any;\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;\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.displayMode === LegendDisplayMode.Hidden) {\n      return null;\n    }\n\n    return <PlotLegend data={[this.props.alignedFrame]} 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} 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    placement: 'bottom',\n    calcs: [],\n  },\n  tooltip: {\n    mode: TooltipDisplayMode.Multi,\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';\nimport { PanelProps, buildHistogram, getHistogramFields } from '@grafana/data';\n\nimport { Histogram, getBucketSize } from './Histogram';\nimport { PanelOptions } from './models.gen';\nimport { useTheme2 } from '@grafana/ui';\n\ntype Props = PanelProps<PanelOptions>;\n\nimport { histogramFieldsToFrame } from '@grafana/data/src/transformations/transformers/histogram';\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      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';\n\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 { HistogramPanel } from './HistogramPanel';\nimport { commonOptionsBuilder, graphFieldOptions } from '@grafana/ui';\nimport { PanelFieldConfig, PanelOptions, defaultPanelFieldConfig, defaultPanelOptions } from './models.gen';\nimport { originalDataHasHistogram } from './utils';\n\nimport { histogramFieldInfo } from '@grafana/data/src/transformations/transformers/histogram';\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        },\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        },\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 { AlertmanagerGroup, AlertState } from 'app/plugins/datasource/alertmanager/types';\nimport React, { useState, useEffect } from 'react';\nimport { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { useStyles2, LinkButton } from '@grafana/ui';\nimport { css } from '@emotion/css';\n\nimport { AlertLabels } from 'app/features/alerting/unified/components/AlertLabels';\nimport { AlertGroupHeader } from 'app/features/alerting/unified/components/alert-groups/AlertGroupHeader';\nimport { CollapseToggle } from 'app/features/alerting/unified/components/CollapseToggle';\nimport { getNotificationsTextColors } from 'app/features/alerting/unified/styles/notifications';\nimport { makeAMLink, makeLabelBasedSilenceLink } from 'app/features/alerting/unified/utils/misc';\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 from 'react';\nimport { PanelPlugin } from '@grafana/data';\nimport { AlertGroupPanelOptions } from './types';\nimport { AlertGroupsPanel } from './AlertGroupsPanel';\nimport { AlertManagerPicker } from 'app/features/alerting/unified/components/AlertManagerPicker';\nimport { GRAFANA_RULES_SOURCE_NAME } from 'app/features/alerting/unified/utils/datasource';\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        return (\n          <AlertManagerPicker\n            current={props.value}\n            onChange={(alertManagerSourceName) => {\n              return props.onChange(alertManagerSourceName);\n            }}\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';\nimport { PanelProps } from '@grafana/data';\nimport { CustomScrollbar } from '@grafana/ui';\nimport { config } from '@grafana/runtime';\n\nimport { AlertmanagerGroup, Matcher } from 'app/plugins/datasource/alertmanager/types';\nimport { fetchAlertGroupsAction } from 'app/features/alerting/unified/state/actions';\nimport { initialAsyncRequestState } from 'app/features/alerting/unified/utils/redux';\nimport { NOTIFICATIONS_POLL_INTERVAL_MS } from 'app/features/alerting/unified/utils/constants';\nimport { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector';\n\nimport { AlertGroup } from './AlertGroup';\nimport { AlertGroupPanelOptions } from './types';\nimport { parseMatchers } from 'app/features/alerting/unified/utils/alertmanager';\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 { labelsMatchMatchers } from 'app/features/alerting/unified/utils/alertmanager';\nimport { AlertmanagerGroup, Matcher } from 'app/plugins/datasource/alertmanager/types';\nimport { useMemo } from 'react';\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","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 * as textPanel from 'app/plugins/panel/text/module';\nimport * as timeseriesPanel from 'app/plugins/panel/timeseries/module';\nimport * as stateTimelinePanel from 'app/plugins/panel/state-timeline/module';\nimport * as statusHistoryPanel from 'app/plugins/panel/status-history/module';\nimport * as candlestickPanel from 'app/plugins/panel/candlestick/module';\nimport * as graphPanel from 'app/plugins/panel/graph/module';\nimport * as xyChartPanel from 'app/plugins/panel/xychart/module';\nimport * as dashListPanel from 'app/plugins/panel/dashlist/module';\nimport * as pluginsListPanel from 'app/plugins/panel/pluginlist/module';\nimport * as alertListPanel from 'app/plugins/panel/alertlist/module';\nimport * as annoListPanel from 'app/plugins/panel/annolist/module';\nimport * as heatmapPanel from 'app/plugins/panel/heatmap/module';\nimport * as tablePanel from 'app/plugins/panel/table/module';\nimport * as oldTablePanel from 'app/plugins/panel/table-old/module';\nimport * as statPanel from 'app/plugins/panel/stat/module';\nimport * as gettingStartedPanel from 'app/plugins/panel/gettingstarted/module';\nimport * as gaugePanel from 'app/plugins/panel/gauge/module';\nimport * as pieChartPanel from 'app/plugins/panel/piechart/module';\nimport * as barGaugePanel from 'app/plugins/panel/bargauge/module';\nimport * as barChartPanel from 'app/plugins/panel/barchart/module';\nimport * as logsPanel from 'app/plugins/panel/logs/module';\nimport * as newsPanel from 'app/plugins/panel/news/module';\nimport * as livePanel from 'app/plugins/panel/live/module';\nimport * as debugPanel from 'app/plugins/panel/debug/module';\nimport * as welcomeBanner from 'app/plugins/panel/welcome/module';\nimport * as nodeGraph from 'app/plugins/panel/nodeGraph/module';\nimport * as histogramPanel from 'app/plugins/panel/histogram/module';\nimport * as alertGroupsPanel from 'app/plugins/panel/alertGroups/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');\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/pluginlist/module': pluginsListPanel,\n  'app/plugins/panel/alertlist/module': alertListPanel,\n  'app/plugins/panel/annolist/module': annoListPanel,\n  'app/plugins/panel/heatmap/module': heatmapPanel,\n  'app/plugins/panel/table/module': tablePanel,\n  'app/plugins/panel/table-old/module': oldTablePanel,\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/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","// eslint-disable-next-line lodash/import-scope\nimport _ from 'lodash';\nimport * as sdk from 'app/plugins/sdk';\nimport kbn from 'app/core/utils/kbn';\nimport moment from 'moment'; // eslint-disable-line no-restricted-imports\nimport angular from 'angular';\nimport jquery from 'jquery';\n\n// Experimental module exports\nimport prismjs from 'prismjs';\nimport slate from 'slate';\n// @ts-ignore\nimport slateReact from '@grafana/slate-react';\n// @ts-ignore\nimport slatePlain from 'slate-plain-serializer';\nimport react from 'react';\nimport reactDom from 'react-dom';\nimport * as reactRedux from 'react-redux';\nimport * as redux from 'redux';\n\nimport config from 'app/core/config';\nimport TimeSeries from 'app/core/time_series2';\nimport TableModel from 'app/core/table_model';\nimport { coreModule } from 'app/angular/core_module';\nimport { appEvents, contextSrv } from 'app/core/core';\nimport * as flatten from 'app/core/utils/flatten';\nimport * as ticks from 'app/core/utils/ticks';\nimport { BackendSrv, getBackendSrv } from 'app/core/services/backend_srv';\nimport { promiseToDigest } from 'app/angular/promiseToDigest';\nimport impressionSrv from 'app/core/services/impression_srv';\nimport builtInPlugins from './built_in_plugins';\nimport * as d3 from 'd3';\nimport * as emotion from '@emotion/css';\nimport * as grafanaData from '@grafana/data';\nimport * as grafanaUIraw from '@grafana/ui';\nimport * as grafanaRuntime from '@grafana/runtime';\nimport { GenericDataSourcePlugin } from '../datasources/settings/PluginSettings';\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\n// rxjs\nimport * as rxjs from 'rxjs';\nimport * as rxjsOperators from 'rxjs/operators';\n// routing\nimport * as reactRouter from 'react-router-dom';\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\nfunction 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('angular', angular);\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/plugins/sdk', sdk);\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/utils/promiseToDigest', {\n  promiseToDigest: promiseToDigest,\n  __esModule: true,\n});\n\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_module', coreModule);\nexposeToPlugin('app/core/core', {\n  coreModule: coreModule,\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 { isEmpty, isString, set } from 'lodash';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { dateTimeFormat, dateTimeFormatTimeAgo, setWeekStart, TimeZone } from '@grafana/data';\n\nimport { Team, ThunkResult, UserDTO, UserOrg, UserSession } from 'app/types';\nimport config from 'app/core/config';\nimport { contextSrv } from 'app/core/core';\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: dateTimeFormat(session.createdAt, { format: 'MMMM DD, YYYY' }),\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 React, { ReactNode, useState } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { DataQuery, DataSourceInstanceSettings, GrafanaTheme } from '@grafana/data';\nimport { DataSourcePicker } from '@grafana/runtime';\nimport { Icon, Input, FieldValidationMessage, useStyles } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\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}\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 { 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 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","// Libraries\nimport React, { PureComponent, ReactNode } from 'react';\nimport classNames from 'classnames';\nimport { cloneDeep, has } from 'lodash';\n// Utils & Services\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { ErrorBoundaryAlert, HorizontalGroup } from '@grafana/ui';\nimport {\n  CoreApp,\n  DataQuery,\n  DataSourceApi,\n  DataSourceInstanceSettings,\n  EventBusExtended,\n  EventBusSrv,\n  HistoryItem,\n  LoadingState,\n  PanelData,\n  PanelEvents,\n  TimeRange,\n  toLegacyResponseData,\n} from '@grafana/data';\nimport { QueryEditorRowHeader } from './QueryEditorRowHeader';\nimport {\n  QueryOperationRow,\n  QueryOperationRowRenderProps,\n} from 'app/core/components/QueryOperationRow/QueryOperationRow';\nimport { QueryOperationAction } from 'app/core/components/QueryOperationRow/QueryOperationAction';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { OperationRowHelp } from 'app/core/components/QueryOperationRow/OperationRowHelp';\nimport { RowActionComponents } from './QueryActionComponent';\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}\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  renderExtraActions = () => {\n    const { query, queries, data, onAddQuery, dataSource } = this.props;\n    return 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\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 { 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      />\n    );\n  };\n\n  render() {\n    const { query, id, index, visualization } = this.props;\n    const { datasource, showingHelp } = 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                    datasource={datasource}\n                  />\n                </OperationRowHelp>\n              )}\n              {editor}\n            </ErrorBoundaryAlert>\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  // No matching series\n  if (!series.length) {\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    return undefined;\n  }\n\n  // Only say this is an error if the error links to the query\n  let state = LoadingState.Done;\n  const error = data.error && data.error.refId === refId ? data.error : undefined;\n  if (error) {\n    state = LoadingState.Error;\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 { DashboardQueryRunnerOptions, DashboardQueryRunnerWorker, DashboardQueryRunnerWorkerResult } from './types';\nimport { from, Observable } from 'rxjs';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { catchError, map } from 'rxjs/operators';\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 { from, Observable, of } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { AnnotationEvent, DataSourceApi } from '@grafana/data';\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    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 { Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { AnnotationEvent, DataSourceApi } from '@grafana/data';\n\nimport { AnnotationQueryRunner, AnnotationQueryRunnerOptions } from './types';\nimport { PanelModel } from '../../../dashboard/state';\nimport { executeAnnotationQuery } from '../../../annotations/executeAnnotationQuery';\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 { cloneDeep } from 'lodash';\nimport { from, merge, Observable, of } from 'rxjs';\nimport { catchError, filter, finalize, map, mergeAll, mergeMap, reduce, takeUntil } from 'rxjs/operators';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AnnotationQuery, DataSourceApi } from '@grafana/data';\n\nimport {\n  AnnotationQueryRunner,\n  DashboardQueryRunnerOptions,\n  DashboardQueryRunnerWorker,\n  DashboardQueryRunnerWorkerResult,\n} from './types';\nimport { emptyResult, handleDatasourceSrvError, translateQueryResult } from './utils';\nimport { LegacyAnnotationQueryRunner } from './LegacyAnnotationQueryRunner';\nimport { AnnotationsQueryRunner } from './AnnotationsQueryRunner';\nimport { AnnotationQueryFinished, AnnotationQueryStarted } from '../../../../types/events';\nimport { getDashboardQueryRunner } from './DashboardQueryRunner';\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    return Boolean(annotations);\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","import { DashboardQueryRunnerOptions, DashboardQueryRunnerWorker, DashboardQueryRunnerWorkerResult } from './types';\nimport { from, Observable } from 'rxjs';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { catchError, map } from 'rxjs/operators';\nimport { emptyResult, handleDashboardQueryRunnerWorkerError } from './utils';\nimport { PromAlertingRuleState, PromRulesResponse } from 'app/types/unified-alerting-dto';\nimport { AlertState, AlertStateInfo } from '@grafana/data';\nimport { isAlertingRule } from 'app/features/alerting/unified/utils/rules';\nimport { Annotation } from 'app/features/alerting/unified/utils/constants';\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    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';\nimport { AnnotationQuery } from '@grafana/data';\n\nimport { dedupAnnotations } from 'app/features/annotations/events_processing';\nimport {\n  DashboardQueryRunner,\n  DashboardQueryRunnerOptions,\n  DashboardQueryRunnerResult,\n  DashboardQueryRunnerWorker,\n  DashboardQueryRunnerWorkerResult,\n} from './types';\nimport { AlertStatesWorker } from './AlertStatesWorker';\nimport { SnapshotWorker } from './SnapshotWorker';\nimport { AnnotationsWorker } from './AnnotationsWorker';\nimport { getAnnotationsByPanelId } from './utils';\nimport { DashboardModel } from '../../../dashboard/state';\nimport { getTimeSrv, TimeSrv } from '../../../dashboard/services/TimeSrv';\nimport { RefreshEvent } from '@grafana/runtime';\nimport { config } from 'app/core/config';\nimport { UnifiedAlertStatesWorker } from './UnifiedAlertStatesWorker';\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';\nimport { AnnotationEvent } from '@grafana/data';\n\nimport { DashboardQueryRunnerOptions, DashboardQueryRunnerWorker, DashboardQueryRunnerWorkerResult } from './types';\nimport { emptyResult, getAnnotationsByPanelId, translateQueryResult } from './utils';\nimport { DashboardModel } from '../../../dashboard/state';\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';\nimport { AnnotationEvent, AnnotationQuery, DataFrame, DataFrameView, DataSourceApi } from '@grafana/data';\nimport { config, toDataQueryError } from '@grafana/runtime';\n\nimport { dispatch } from 'app/store/store';\nimport { createErrorNotification } from '../../../../core/copy/appNotification';\nimport { notifyApp } from '../../../../core/reducers/appNotification';\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","// Libraries\nimport { cloneDeep } from 'lodash';\nimport { MonoTypeOperatorFunction, Observable, of, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\n// Services & Utils\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { preProcessPanelData, runRequest } from './runRequest';\nimport { isSharedDashboardQuery, runSharedRequest } from '../../../plugins/datasource/dashboard';\n\n// Types\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 { getDashboardQueryRunner } from './DashboardQueryRunner/DashboardQueryRunner';\nimport { mergePanelAndDashData } from './mergePanelAndDashData';\nimport { PanelModel } from '../../dashboard/state';\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  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;\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\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 processedCount = 0;\n    let lastConfigRev = -1;\n    const fastCompare = (a: DataFrame, b: DataFrame) => {\n      return compareDataFrameStructures(a, b, true);\n    };\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 sameStructure = false;\n\n        if (withFieldConfig && data.series?.length) {\n          // Apply field defaults and overrides\n          let fieldConfig = this.dataConfigSource.getFieldOverrideOptions();\n          let processFields = fieldConfig != null;\n\n          // If the shape is the same, we can skip field overrides\n          if (\n            data.state === LoadingState.Streaming &&\n            processFields &&\n            processedCount > 0 &&\n            lastData.length &&\n            lastConfigRev === this.dataConfigSource.configRev\n          ) {\n            const sameTypes = compareArrayValues(lastData, processedData.series, fastCompare);\n            if (sameTypes) {\n              // Keep the previous field config settings\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                      // add global range calculation here? (not optimal for streaming)\n                      range: undefined,\n                    },\n                  })),\n                })),\n              };\n              processFields = false;\n              sameStructure = true;\n            }\n          }\n\n          if (processFields) {\n            lastConfigRev = this.dataConfigSource.configRev!;\n            processedCount++; // results with data\n            processedData = {\n              ...processedData,\n              series: applyFieldOverrides({\n                timeZone: data.request?.timezone ?? 'browser',\n                data: processedData.series,\n                ...fieldConfig!,\n              }),\n            };\n          }\n        }\n\n        if (!sameStructure) {\n          sameStructure = compareArrayValues(lastData, processedData.series, compareDataFrameStructures);\n        }\n        if (!sameStructure) {\n          structureRev++;\n        }\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          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      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      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);\n\n      // Attach the data source 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 ? 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.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\nasync function getDataSource(\n  datasource: DataSourceRef | string | DataSourceApi | null,\n  scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n  if (datasource && (datasource as any).query) {\n    return datasource as DataSourceApi;\n  }\n  return await getDatasourceSrv().get(datasource as string, scopedVars);\n}\n","import { combineLatest, Observable, of } from 'rxjs';\nimport { ArrayDataFrame, PanelData } from '@grafana/data';\nimport { DashboardQueryRunnerResult } from './DashboardQueryRunner/types';\nimport { mergeMap } from 'rxjs/operators';\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 { BackendSrv } from 'app/core/services/backend_srv';\nimport { MonoTypeOperatorFunction } from 'rxjs';\nimport { finalize } from 'rxjs/operators';\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 { from, merge, Observable, of, timer } from 'rxjs';\nimport { isString, map as isArray } from 'lodash';\nimport { catchError, map, mapTo, share, takeUntil, tap } from 'rxjs/operators';\n// Utils & Services\nimport { backendSrv } from 'app/core/services/backend_srv';\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 { emitDataRequestEvent } from './queryAnalytics';\nimport { dataSource as expressionDatasource } from 'app/features/expressions/ExpressionDatasource';\nimport { ExpressionQuery } from 'app/features/expressions/types';\nimport { cancelNetworkRequestsOnUnsubscribe } from './processing/canceler';\nimport { isExpressionReference } from '@grafana/runtime/src/utils/DataSourceWithBackend';\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  packets[packet.key || 'A'] = 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      console.error('runRequest.catchError', err);\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\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  const dataFrames: DataFrame[] = [];\n\n  for (const result of results) {\n    const dataFrame = guessFieldTypes(toDataFrame(result));\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    dataFrames.push(dataFrame);\n  }\n\n  return dataFrames;\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 = getProcessedDataFrames(series);\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 { getDashboardSrv } from '../../dashboard/services/DashboardSrv';\nimport { PanelData, LoadingState, DataSourceApi, CoreApp, urlUtil } from '@grafana/data';\nimport { reportMetaAnalytics, MetaAnalyticsEventName, DataRequestEventPayload } from '@grafana/runtime';\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 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    };\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 React, { FC, FormEvent } from 'react';\nimport { css } from '@emotion/css';\nimport { HorizontalGroup, RadioButtonGroup, stylesFactory, useTheme, Checkbox } from '@grafana/ui';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { SortPicker } from 'app/core/components/Select/SortPicker';\nimport { TagFilter } from 'app/core/components/TagFilter/TagFilter';\nimport { SearchSrv } from 'app/core/services/search_srv';\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\nconst searchSrv = new SearchSrv();\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  query: DashboardQuery;\n  showStarredFilter?: boolean;\n  hideLayout?: boolean;\n}\n\nexport const ActionRow: FC<Props> = ({\n  onLayoutChange,\n  onSortChange,\n  onStarredFilterChange = () => {},\n  onTagFilterChange,\n  query,\n  showStarredFilter,\n  hideLayout,\n}) => {\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.actionRow}>\n      <div className={styles.rowContainer}>\n        <HorizontalGroup spacing=\"md\" width=\"auto\">\n          {!hideLayout ? (\n            <RadioButtonGroup options={layoutOptions} onChange={onLayoutChange} value={query.layout} />\n          ) : null}\n          <SortPicker onChange={onSortChange} value={query.sort?.value} />\n        </HorizontalGroup>\n      </div>\n      <HorizontalGroup spacing=\"md\" width=\"auto\">\n        {showStarredFilter && (\n          <div className={styles.checkboxWrapper}>\n            <Checkbox label=\"Filter by starred\" onChange={onStarredFilterChange} value={query.starred} />\n          </div>\n        )}\n        <TagFilter isClearable tags={query.tag} tagOptions={searchSrv.getDashboardTags} onChange={onTagFilterChange} />\n      </HorizontalGroup>\n    </div>\n  );\n};\n\nActionRow.displayName = 'ActionRow';\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    actionRow: css`\n      display: none;\n\n      @media only screen and (min-width: ${theme.breakpoints.md}) {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        padding: ${theme.spacing.lg} 0;\n        width: 100%;\n      }\n    `,\n    rowContainer: css`\n      margin-right: ${theme.spacing.md};\n    `,\n    checkboxWrapper: css`\n      label {\n        line-height: 1.2;\n      }\n    `,\n  };\n});\n","import React, { FC } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { ConfirmModal, stylesFactory, useTheme } from '@grafana/ui';\nimport { getLocationSrv } from '@grafana/runtime';\nimport { DashboardSection, OnDeleteItems } from '../types';\nimport { getCheckedUids } from '../utils';\nimport { deleteFoldersAndDashboards } from 'app/features/manage-dashboards/state/actions';\n\ninterface Props {\n  onDeleteItems: OnDeleteItems;\n  results: DashboardSection[];\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 uids = getCheckedUids(results);\n  const { folders, dashboards } = uids;\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 += `selected dashboard${dashEnding}?`;\n  }\n\n  const deleteItems = () => {\n    deleteFoldersAndDashboards(folders, dashboards).then(() => {\n      onDismiss();\n      // Redirect to /dashboard in case folder was deleted from f/:folder.uid\n      getLocationSrv().update({ path: '/dashboards' });\n      onDeleteItems(folders, dashboards);\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 { DashboardSection, DashboardSectionItem, SearchAction } from '../types';\nimport { TOGGLE_ALL_CHECKED, TOGGLE_CHECKED, MOVE_ITEMS, DELETE_ITEMS } from './actionTypes';\nimport { dashboardsSearchState, DashboardsSearchState, searchReducer } from './dashboardSearch';\nimport { mergeReducers } from '../utils';\n\nexport interface ManageDashboardsState extends DashboardsSearchState {\n  allChecked: boolean;\n}\n\nexport const manageDashboardsState: ManageDashboardsState = {\n  ...dashboardsSearchState,\n  allChecked: false,\n};\n\nconst reducer = (state: ManageDashboardsState, action: SearchAction) => {\n  switch (action.type) {\n    case TOGGLE_ALL_CHECKED:\n      const newAllChecked = !state.allChecked;\n      return {\n        ...state,\n        results: state.results.map((result) => {\n          return {\n            ...result,\n            checked: newAllChecked,\n            items: result.items.map((item) => ({ ...item, checked: newAllChecked })),\n          };\n        }),\n        allChecked: newAllChecked,\n      };\n    case TOGGLE_CHECKED:\n      const { id } = action.payload;\n      return {\n        ...state,\n        results: state.results.map((result) => {\n          if (result.id === id) {\n            return {\n              ...result,\n              checked: !result.checked,\n              items: result.items.map((item) => ({ ...item, checked: !result.checked })),\n            };\n          }\n          return {\n            ...result,\n            items: result.items.map((item) => (item.id === id ? { ...item, checked: !item.checked } : item)),\n          };\n        }),\n      };\n    case MOVE_ITEMS: {\n      const dashboards: DashboardSectionItem[] = action.payload.dashboards;\n      const folder: DashboardSection = action.payload.folder;\n      const uids = dashboards.map((db) => db.uid);\n      return {\n        ...state,\n        results: state.results.map((result) => {\n          if (folder.id === result.id) {\n            return result.expanded\n              ? {\n                  ...result,\n                  items: [...result.items, ...dashboards.map((db) => ({ ...db, checked: false }))],\n                  checked: false,\n                }\n              : result;\n          } else {\n            return { ...result, items: result.items.filter((item) => !uids.includes(item.uid)) };\n          }\n        }),\n      };\n    }\n    case DELETE_ITEMS: {\n      const { folders, dashboards } = action.payload;\n      if (!folders.length && !dashboards.length) {\n        return state;\n      }\n      return {\n        ...state,\n        results: state.results.reduce((filtered, result) => {\n          if (!folders.includes(result.uid)) {\n            return [...filtered, { ...result, items: result.items.filter((item) => !dashboards.includes(item.uid)) }];\n          }\n          return filtered;\n        }, [] as DashboardSection[]),\n      };\n    }\n    default:\n      return state;\n  }\n};\n\nexport const manageDashboardsReducer = mergeReducers([searchReducer, reducer]);\n","import { useCallback, useMemo, useReducer } from 'react';\nimport { FolderDTO } from 'app/types';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { DashboardQuery, DashboardSection, OnDeleteItems, OnMoveItems, OnToggleChecked } from '../types';\nimport { DELETE_ITEMS, MOVE_ITEMS, TOGGLE_ALL_CHECKED, TOGGLE_CHECKED } from '../reducers/actionTypes';\nimport { manageDashboardsReducer, manageDashboardsState, ManageDashboardsState } from '../reducers/manageDashboards';\nimport { useSearch } from './useSearch';\nimport { GENERAL_FOLDER_ID } from '../constants';\n\nconst hasChecked = (section: DashboardSection) => {\n  return section.checked || section.items.some((item) => item.checked);\n};\n\nexport const useManageDashboards = (\n  query: DashboardQuery,\n  state: Partial<ManageDashboardsState> = {},\n  folder?: FolderDTO\n) => {\n  const reducer = useReducer(manageDashboardsReducer, {\n    ...manageDashboardsState,\n    ...state,\n  });\n\n  const {\n    state: { results, loading, initialLoading, allChecked },\n    onToggleSection,\n    dispatch,\n  } = useSearch<ManageDashboardsState>(query, reducer, {});\n\n  const onToggleChecked: OnToggleChecked = useCallback(\n    (item) => {\n      dispatch({ type: TOGGLE_CHECKED, payload: item });\n    },\n    [dispatch]\n  );\n\n  const onToggleAllChecked = () => {\n    dispatch({ type: TOGGLE_ALL_CHECKED });\n  };\n\n  const onDeleteItems: OnDeleteItems = (folders, dashboards) => {\n    dispatch({ type: DELETE_ITEMS, payload: { folders, dashboards } });\n  };\n\n  const onMoveItems: OnMoveItems = (selectedDashboards, folder) => {\n    dispatch({ type: MOVE_ITEMS, payload: { dashboards: selectedDashboards, folder } });\n  };\n\n  const canMove = useMemo(() => results.some((result) => result.items.some((item) => item.checked)), [results]);\n\n  const canDelete = useMemo(() => {\n    const somethingChecked = results.some(hasChecked);\n    const includesGeneralFolder = results.find((result) => result.checked && result.id === GENERAL_FOLDER_ID);\n    return somethingChecked && !includesGeneralFolder;\n  }, [results]);\n\n  const canSave = folder?.canSave;\n  const hasEditPermissionInFolders = folder ? canSave : contextSrv.hasEditPermissionInFolders;\n  const noFolders = canSave && folder?.id && results.length === 0 && !loading && !initialLoading;\n\n  return {\n    results,\n    loading,\n    initialLoading,\n    canSave,\n    allChecked,\n    hasEditPermissionInFolders,\n    canMove,\n    canDelete,\n    onToggleSection,\n    onToggleChecked,\n    onToggleAllChecked,\n    onDeleteItems,\n    onMoveItems,\n    noFolders,\n  };\n};\n","import React, { FC } from 'react';\nimport { HorizontalGroup, LinkButton } from '@grafana/ui';\n\nexport interface Props {\n  folderId?: number;\n  isEditor: boolean;\n  canEdit?: boolean;\n}\n\nexport const DashboardActions: FC<Props> = ({ folderId, isEditor, canEdit }) => {\n  const actionUrl = (type: string) => {\n    let url = `dashboard/${type}`;\n\n    if (folderId) {\n      url += `?folderId=${folderId}`;\n    }\n\n    return url;\n  };\n\n  return (\n    <div>\n      <HorizontalGroup spacing=\"md\" align=\"center\">\n        {canEdit && <LinkButton href={actionUrl('new')}>New Dashboard</LinkButton>}\n        {!folderId && isEditor && <LinkButton href=\"dashboards/folder/new\">New Folder</LinkButton>}\n        {canEdit && <LinkButton href={actionUrl('import')}>Import</LinkButton>}\n      </HorizontalGroup>\n    </div>\n  );\n};\n","import React, { FC, memo, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { stylesFactory, useTheme, Spinner, FilterInput } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { FolderDTO } from 'app/types';\nimport { useManageDashboards } from '../hooks/useManageDashboards';\nimport { SearchLayout } from '../types';\nimport { ConfirmDeleteModal } from './ConfirmDeleteModal';\nimport { MoveToFolderModal } from './MoveToFolderModal';\nimport { useSearchQuery } from '../hooks/useSearchQuery';\nimport { SearchResultsFilter } from './SearchResultsFilter';\nimport { SearchResults } from './SearchResults';\nimport { DashboardActions } from './DashboardActions';\n\nexport interface Props {\n  folder?: FolderDTO;\n}\n\nconst { isEditor } = contextSrv;\n\nexport const ManageDashboards: FC<Props> = memo(({ folder }) => {\n  const folderId = folder?.id;\n  const folderUid = folder?.uid;\n  const theme = useTheme();\n  const styles = getStyles(theme);\n  const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);\n  const [isMoveModalOpen, setIsMoveModalOpen] = useState(false);\n  const defaultLayout = folderId ? SearchLayout.List : SearchLayout.Folders;\n  const queryParamsDefaults = {\n    skipRecent: true,\n    skipStarred: true,\n    folderIds: folderId ? [folderId] : [],\n    layout: defaultLayout,\n  };\n\n  const {\n    query,\n    hasFilters,\n    onQueryChange,\n    onTagFilterChange,\n    onStarredFilterChange,\n    onTagAdd,\n    onSortChange,\n    onLayoutChange,\n  } = useSearchQuery(queryParamsDefaults);\n\n  const {\n    results,\n    loading,\n    initialLoading,\n    canSave,\n    allChecked,\n    hasEditPermissionInFolders,\n    canMove,\n    canDelete,\n    onToggleSection,\n    onToggleChecked,\n    onToggleAllChecked,\n    onDeleteItems,\n    onMoveItems,\n    noFolders,\n  } = useManageDashboards(query, {}, folder);\n\n  const onMoveTo = () => {\n    setIsMoveModalOpen(true);\n  };\n\n  const onItemDelete = () => {\n    setIsDeleteModalOpen(true);\n  };\n\n  if (initialLoading) {\n    return <Spinner className={styles.spinner} />;\n  }\n\n  if (noFolders && !hasFilters) {\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=${folderId}`}\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    <div className={styles.container}>\n      <div className=\"page-action-bar\">\n        <div className=\"gf-form gf-form--grow m-r-2\">\n          <FilterInput value={query.query} onChange={onQueryChange} placeholder={'Search dashboards by name'} />\n        </div>\n        <DashboardActions isEditor={isEditor} canEdit={hasEditPermissionInFolders || canSave} folderId={folderId} />\n      </div>\n\n      <div className={styles.results}>\n        <SearchResultsFilter\n          allChecked={allChecked}\n          canDelete={hasEditPermissionInFolders && canDelete}\n          canMove={hasEditPermissionInFolders && canMove}\n          deleteItem={onItemDelete}\n          moveTo={onMoveTo}\n          onToggleAllChecked={onToggleAllChecked}\n          onStarredFilterChange={onStarredFilterChange}\n          onSortChange={onSortChange}\n          onTagFilterChange={onTagFilterChange}\n          query={query}\n          hideLayout={!!folderUid}\n          onLayoutChange={onLayoutChange}\n          editable={hasEditPermissionInFolders}\n        />\n        <SearchResults\n          loading={loading}\n          results={results}\n          editable={hasEditPermissionInFolders}\n          onTagSelected={onTagAdd}\n          onToggleSection={onToggleSection}\n          onToggleChecked={onToggleChecked}\n          layout={query.layout}\n        />\n      </div>\n      <ConfirmDeleteModal\n        onDeleteItems={onDeleteItems}\n        results={results}\n        isOpen={isDeleteModalOpen}\n        onDismiss={() => setIsDeleteModalOpen(false)}\n      />\n      <MoveToFolderModal\n        onMoveItems={onMoveItems}\n        results={results}\n        isOpen={isMoveModalOpen}\n        onDismiss={() => setIsMoveModalOpen(false)}\n      />\n    </div>\n  );\n});\n\nexport default ManageDashboards;\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  return {\n    container: css`\n      height: 100%;\n      display: flex;\n      flex-direction: column;\n    `,\n    results: css`\n      display: flex;\n      flex-direction: column;\n      flex: 1 1 0;\n      height: 100%;\n      padding-top: ${theme.spacing.lg};\n    `,\n    spinner: css`\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      min-height: 200px;\n    `,\n  };\n});\n","import React, { FC, useState } from 'react';\nimport { css } from '@emotion/css';\nimport { Button, HorizontalGroup, Modal, stylesFactory, useTheme } from '@grafana/ui';\nimport { AppEvents, GrafanaTheme } from '@grafana/data';\nimport { FolderInfo } from 'app/types';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport appEvents from 'app/core/app_events';\nimport { DashboardSection, OnMoveItems } from '../types';\nimport { getCheckedDashboards } from '../utils';\nimport { moveDashboards } from 'app/features/manage-dashboards/state/actions';\n\ninterface Props {\n  onMoveItems: OnMoveItems;\n  results: DashboardSection[];\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 selectedDashboards = getCheckedDashboards(results);\n\n  const moveTo = () => {\n    if (folder && selectedDashboards.length) {\n      const folderTitle = folder.title ?? 'General';\n\n      moveDashboards(selectedDashboards.map((d) => d.uid) as string[], 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          appEvents.emit(AppEvents.alertSuccess, [header, msg]);\n        }\n\n        if (result.totalCount === result.alreadyInFolderCount) {\n          appEvents.emit(AppEvents.alertError, ['Error', `Dashboard already belongs to folder ${folderTitle}`]);\n        } else {\n          onMoveItems(selectedDashboards, folder);\n        }\n\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 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, { FC, memo } from 'react';\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 React, { FC, useCallback } from 'react';\nimport { css } from '@emotion/css';\nimport { selectors as e2eSelectors } from '@grafana/e2e-selectors';\nimport { Card, Icon, IconName, TagList, useStyles2 } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { DashboardSectionItem, OnToggleChecked } from '../types';\nimport { SearchCheckbox } from './SearchCheckbox';\nimport { SEARCH_ITEM_HEIGHT } from '../constants';\n\nexport interface Props {\n  item: DashboardSectionItem;\n  editable?: boolean;\n  onTagSelected: (name: string) => any;\n  onToggleChecked?: OnToggleChecked;\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\nexport const SearchItem: FC<Props> = ({ item, editable, onToggleChecked, onTagSelected }) => {\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      heading={item.title}\n      href={item.url}\n      style={{ minHeight: SEARCH_ITEM_HEIGHT }}\n      className={styles.container}\n    >\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'} />\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} />\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\n      a {\n        padding: ${theme.spacing(1)} ${theme.spacing(2)};\n      }\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","import React, { FC, useCallback } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { useLocalStorage } from 'react-use';\nimport { GrafanaTheme } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, Spinner, stylesFactory, useTheme } from '@grafana/ui';\n\nimport { DashboardSection, OnToggleChecked } from '../types';\nimport { SearchCheckbox } from './SearchCheckbox';\nimport { getSectionIcon, getSectionStorageKey } from '../utils';\n\ninterface SectionHeaderProps {\n  editable?: boolean;\n  onSectionClick: (section: DashboardSection) => void;\n  onToggleChecked?: OnToggleChecked;\n  section: DashboardSection;\n}\n\nexport const SectionHeader: FC<SectionHeaderProps> = ({\n  section,\n  onSectionClick,\n  onToggleChecked,\n  editable = false,\n}) => {\n  const theme = useTheme();\n  const styles = getSectionHeaderStyles(theme, section.selected, editable);\n  const setSectionExpanded = useLocalStorage(getSectionStorageKey(section.title), true)[1];\n\n  const onSectionExpand = () => {\n    setSectionExpanded(!section.expanded);\n    onSectionClick(section);\n  };\n\n  const handleCheckboxClick = useCallback(\n    (ev: React.MouseEvent) => {\n      console.log('section header handleCheckboxClick');\n      ev.stopPropagation();\n      ev.preventDefault();\n\n      if (onToggleChecked) {\n        onToggleChecked(section);\n      }\n    },\n    [onToggleChecked, section]\n  );\n\n  return (\n    <div\n      className={styles.wrapper}\n      onClick={onSectionExpand}\n      data-testid={\n        section.expanded\n          ? selectors.components.Search.collapseFolder(section.id?.toString())\n          : selectors.components.Search.expandFolder(section.id?.toString())\n      }\n    >\n      <SearchCheckbox\n        className={styles.checkbox}\n        editable={editable}\n        checked={section.checked}\n        onClick={handleCheckboxClick}\n        aria-label=\"Select folder\"\n      />\n\n      <div className={styles.icon}>\n        <Icon name={getSectionIcon(section)} />\n      </div>\n\n      <div className={styles.text}>\n        {section.title}\n        {section.url && (\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      {section.itemsFetching ? <Spinner /> : <Icon name={section.expanded ? 'angle-down' : 'angle-right'} />}\n    </div>\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        display: flex;\n        align-items: center;\n        font-size: ${theme.typography.size.base};\n        padding: 12px;\n        color: ${theme.colors.textWeak};\n\n        &:hover,\n        &.selected {\n          color: ${theme.colors.text};\n        }\n\n        &:hover {\n          a {\n            opacity: 1;\n          }\n        }\n      `,\n      'pointer',\n      { selected }\n    ),\n    checkbox: css`\n      padding: 0 ${sm} 0 0;\n    `,\n    icon: css`\n      padding: 0 ${sm} 0 ${editable ? 0 : sm};\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  };\n});\n","import React, { FC, memo } from 'react';\nimport { css } from '@emotion/css';\nimport { FixedSizeList } from 'react-window';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Spinner, stylesFactory, useTheme } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { DashboardSection, OnToggleChecked, SearchLayout } from '../types';\nimport { SEARCH_ITEM_HEIGHT, SEARCH_ITEM_MARGIN } from '../constants';\nimport { SearchItem } from './SearchItem';\nimport { SectionHeader } from './SectionHeader';\n\nexport interface Props {\n  editable?: boolean;\n  loading?: boolean;\n  onTagSelected: (name: string) => any;\n  onToggleChecked?: OnToggleChecked;\n  onToggleSection: (section: DashboardSection) => void;\n  results: DashboardSection[];\n  layout?: string;\n}\n\nconst { sectionV2: sectionLabel, itemsV2: itemsLabel } = selectors.components.Search;\n\nexport const SearchResults: FC<Props> = memo(\n  ({ editable, loading, onTagSelected, onToggleChecked, onToggleSection, results, layout }) => {\n    const theme = useTheme();\n    const styles = getSectionStyles(theme);\n    const itemProps = { editable, onToggleChecked, onTagSelected };\n    const renderFolders = () => {\n      return (\n        <div className={styles.wrapper}>\n          {results.map((section) => {\n            return (\n              <div data-testid={sectionLabel} className={styles.section} key={section.id || section.title}>\n                {section.title && (\n                  <SectionHeader onSectionClick={onToggleSection} {...{ onToggleChecked, editable, section }} />\n                )}\n                {section.expanded && (\n                  <div data-testid={itemsLabel} className={styles.sectionItems}>\n                    {section.items.map((item) => (\n                      <SearchItem key={item.id} {...itemProps} item={item} />\n                    ))}\n                  </div>\n                )}\n              </div>\n            );\n          })}\n        </div>\n      );\n    };\n    const renderDashboards = () => {\n      const items = results[0]?.items;\n      return (\n        <div className={styles.listModeWrapper}>\n          <AutoSizer disableWidth>\n            {({ height }) => (\n              <FixedSizeList\n                className={styles.wrapper}\n                innerElementType=\"ul\"\n                itemSize={SEARCH_ITEM_HEIGHT + SEARCH_ITEM_MARGIN}\n                height={height}\n                itemCount={items.length}\n                width=\"100%\"\n              >\n                {({ index, style }) => {\n                  const item = items[index];\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 (\n                    <li style={style}>\n                      <SearchItem key={item.id} {...itemProps} item={item} />\n                    </li>\n                  );\n                }}\n              </FixedSizeList>\n            )}\n          </AutoSizer>\n        </div>\n      );\n    };\n\n    if (loading) {\n      return <Spinner className={styles.spinner} />;\n    } else if (!results || !results.length) {\n      return <div className={styles.noResults}>No dashboards matching your query were found.</div>;\n    }\n\n    return (\n      <div className={styles.resultsContainer}>\n        {layout === SearchLayout.Folders ? renderFolders() : renderDashboards()}\n      </div>\n    );\n  }\n);\n\nSearchResults.displayName = 'SearchResults';\n\nconst getSectionStyles = stylesFactory((theme: GrafanaTheme) => {\n  const { md } = theme.spacing;\n\n  return {\n    wrapper: css`\n      display: flex;\n      flex-direction: column;\n    `,\n    section: css`\n      display: flex;\n      flex-direction: column;\n      background: ${theme.colors.panelBg};\n      border-bottom: solid 1px ${theme.colors.border2};\n    `,\n    sectionItems: css`\n      margin: 0 24px 0 32px;\n    `,\n    spinner: css`\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      min-height: 100px;\n    `,\n    resultsContainer: css`\n      position: relative;\n      flex-grow: 10;\n      margin-bottom: ${md};\n      background: ${theme.colors.bg1};\n      border: 1px solid ${theme.colors.border1};\n      border-radius: 3px;\n      height: 100%;\n    `,\n    noResults: css`\n      padding: ${md};\n      background: ${theme.colors.bg2};\n      font-style: italic;\n      margin-top: ${theme.spacing.md};\n    `,\n    listModeWrapper: css`\n      position: relative;\n      height: 100%;\n      padding: ${md};\n    `,\n  };\n});\n","import React, { FC, FormEvent } from 'react';\nimport { css } from '@emotion/css';\nimport { Button, Checkbox, stylesFactory, useTheme, HorizontalGroup } from '@grafana/ui';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { DashboardQuery, SearchLayout } from '../types';\nimport { ActionRow } from './ActionRow';\n\nexport interface Props {\n  allChecked?: boolean;\n  canDelete?: boolean;\n  canMove?: boolean;\n  deleteItem: () => void;\n  hideLayout?: boolean;\n  moveTo: () => void;\n  onLayoutChange: (layout: SearchLayout) => void;\n  onSortChange: (value: SelectableValue) => void;\n  onStarredFilterChange: (event: FormEvent<HTMLInputElement>) => void;\n  onTagFilterChange: (tags: string[]) => void;\n  onToggleAllChecked: () => void;\n  query: DashboardQuery;\n  editable?: boolean;\n}\n\nexport const SearchResultsFilter: FC<Props> = ({\n  allChecked,\n  canDelete,\n  canMove,\n  deleteItem,\n  hideLayout,\n  moveTo,\n  onLayoutChange,\n  onSortChange,\n  onStarredFilterChange,\n  onTagFilterChange,\n  onToggleAllChecked,\n  query,\n  editable,\n}) => {\n  const showActions = canDelete || canMove;\n  const theme = useTheme();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.wrapper}>\n      {editable && (\n        <div className={styles.checkboxWrapper}>\n          <Checkbox aria-label=\"Select all\" value={allChecked} onChange={onToggleAllChecked} />\n        </div>\n      )}\n      {showActions ? (\n        <HorizontalGroup spacing=\"md\">\n          <Button disabled={!canMove} onClick={moveTo} icon=\"exchange-alt\" variant=\"secondary\">\n            Move\n          </Button>\n          <Button disabled={!canDelete} onClick={deleteItem} icon=\"trash-alt\" variant=\"destructive\">\n            Delete\n          </Button>\n        </HorizontalGroup>\n      ) : (\n        <ActionRow\n          {...{\n            hideLayout,\n            onLayoutChange,\n            onSortChange,\n            onStarredFilterChange,\n            onTagFilterChange,\n            query,\n          }}\n          showStarredFilter\n        />\n      )}\n    </div>\n  );\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme) => {\n  const { sm, md } = theme.spacing;\n  return {\n    wrapper: css`\n      height: ${theme.height.md}px;\n      display: flex;\n      justify-content: flex-start;\n      gap: ${theme.spacing.md};\n      align-items: center;\n      margin-bottom: ${sm};\n\n      > label {\n        height: 20px;\n        margin: 0 ${md} 0 ${sm};\n      }\n    `,\n    checkboxWrapper: css`\n      label {\n        line-height: 1.2;\n        width: max-content;\n      }\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_TITLE = 'General';\n","import { useCallback, useEffect } from 'react';\nimport { useDebounce } from 'react-use';\nimport { SearchSrv } from 'app/core/services/search_srv';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { FETCH_RESULTS, FETCH_ITEMS, TOGGLE_SECTION, SEARCH_START, FETCH_ITEMS_START } from '../reducers/actionTypes';\nimport { DashboardSection, UseSearch } from '../types';\nimport { hasId, getParsedQuery } from '../utils';\n\nconst searchSrv = new SearchSrv();\n\n/**\n * Base hook for search functionality.\n * Returns state and dispatch, among others, from 'reducer' param, so it can be\n * further extended.\n * @param query\n * @param reducer - return result of useReducer\n * @param params - custom params\n */\nexport const useSearch: UseSearch = (query, reducer, params = {}) => {\n  const { queryParsing } = params;\n  const [state, dispatch] = reducer;\n\n  const search = () => {\n    dispatch({ type: SEARCH_START });\n    const parsedQuery = getParsedQuery(query, queryParsing);\n    searchSrv.search(parsedQuery).then((results) => {\n      dispatch({ type: FETCH_RESULTS, payload: results });\n    });\n  };\n\n  // Set loading state before debounced search\n  useEffect(() => {\n    dispatch({ type: SEARCH_START });\n  }, [query.tag, query.sort, query.starred, query.layout, dispatch]);\n\n  useDebounce(search, 300, [query, queryParsing]);\n\n  const onToggleSection = useCallback(\n    (section: DashboardSection) => {\n      if (hasId(section.title) && !section.items.length) {\n        dispatch({ type: FETCH_ITEMS_START, payload: section.id });\n        backendSrv.search({ folderIds: [section.id] }).then((items) => {\n          dispatch({ type: FETCH_ITEMS, payload: { section, items } });\n          dispatch({ type: TOGGLE_SECTION, payload: section });\n        });\n      } else {\n        dispatch({ type: TOGGLE_SECTION, payload: section });\n      }\n    },\n    [dispatch]\n  );\n\n  return { state, dispatch, onToggleSection };\n};\n","import { FormEvent, useCallback, useReducer } from 'react';\nimport { debounce } from 'lodash';\nimport { SelectableValue } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { defaultQuery, defaultQueryParams, queryReducer } from '../reducers/searchQueryReducer';\nimport {\n  ADD_TAG,\n  CLEAR_FILTERS,\n  LAYOUT_CHANGE,\n  QUERY_CHANGE,\n  SET_TAGS,\n  TOGGLE_SORT,\n  TOGGLE_STARRED,\n} from '../reducers/actionTypes';\nimport { DashboardQuery, SearchLayout } from '../types';\nimport { hasFilters, parseRouteParams } from '../utils';\n\nconst updateLocation = debounce((query) => locationService.partial(query), 300);\n\nexport const useSearchQuery = (defaults: Partial<DashboardQuery>) => {\n  const queryParams = parseRouteParams(locationService.getSearchObject());\n  const initialState = { ...defaultQuery, ...defaults, ...queryParams };\n  const [query, dispatch] = useReducer(queryReducer, initialState);\n\n  const onQueryChange = (query: string) => {\n    dispatch({ type: QUERY_CHANGE, payload: query });\n    updateLocation({ query });\n  };\n\n  const onTagFilterChange = (tags: string[]) => {\n    dispatch({ type: SET_TAGS, payload: tags });\n    updateLocation({ tag: tags });\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 = () => {\n    dispatch({ type: CLEAR_FILTERS });\n    updateLocation(defaultQueryParams);\n  };\n\n  const onStarredFilterChange = (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 onSortChange = (sort: SelectableValue | null) => {\n    dispatch({ type: TOGGLE_SORT, payload: sort });\n    updateLocation({ sort: sort?.value, layout: SearchLayout.List });\n  };\n\n  const onLayoutChange = (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    onTagAdd,\n    onSortChange,\n    onLayoutChange,\n  };\n};\n","export const FETCH_RESULTS = 'FETCH_RESULTS';\nexport const TOGGLE_SECTION = 'TOGGLE_SECTION';\nexport const FETCH_ITEMS = 'FETCH_ITEMS';\nexport const FETCH_ITEMS_START = 'FETCH_ITEMS_START';\nexport const MOVE_SELECTION_UP = 'MOVE_SELECTION_UP';\nexport const MOVE_SELECTION_DOWN = 'MOVE_SELECTION_DOWN';\nexport const SEARCH_START = 'SEARCH_START';\n\n// Manage dashboards\nexport const TOGGLE_ALL_CHECKED = 'TOGGLE_ALL_CHECKED';\nexport const TOGGLE_CHECKED = 'TOGGLE_SECTION_CHECKED';\nexport const MOVE_ITEMS = 'MOVE_ITEMS';\nexport const DELETE_ITEMS = 'DELETE_ITEMS';\n\n// Search Query\nexport const TOGGLE_STARRED = 'TOGGLE_STARRED';\nexport const REMOVE_STARRED = 'REMOVE_STARRED';\nexport const QUERY_CHANGE = 'QUERY_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 { DashboardSection, SearchAction } from '../types';\nimport { getFlattenedSections, getLookupField, markSelected } from '../utils';\nimport {\n  FETCH_ITEMS,\n  FETCH_RESULTS,\n  TOGGLE_SECTION,\n  MOVE_SELECTION_DOWN,\n  MOVE_SELECTION_UP,\n  SEARCH_START,\n  FETCH_ITEMS_START,\n} from './actionTypes';\n\nexport interface DashboardsSearchState {\n  results: DashboardSection[];\n  loading: boolean;\n  selectedIndex: number;\n  /** Used for first time page load */\n  initialLoading: boolean;\n}\n\nexport const dashboardsSearchState: DashboardsSearchState = {\n  results: [],\n  loading: true,\n  initialLoading: true,\n  selectedIndex: 0,\n};\n\nexport const searchReducer = (state: DashboardsSearchState, action: SearchAction) => {\n  switch (action.type) {\n    case SEARCH_START:\n      if (!state.loading) {\n        return { ...state, loading: true };\n      }\n      return state;\n    case FETCH_RESULTS: {\n      const results = action.payload;\n      // Highlight the first item ('Starred' folder)\n      if (results.length > 0) {\n        results[0].selected = true;\n      }\n      return { ...state, results, loading: false, initialLoading: false };\n    }\n    case TOGGLE_SECTION: {\n      const section = action.payload;\n      const lookupField = getLookupField(section.title);\n      return {\n        ...state,\n        results: state.results.map((result: DashboardSection) => {\n          if (section[lookupField] === result[lookupField]) {\n            return { ...result, expanded: !result.expanded };\n          }\n          return result;\n        }),\n      };\n    }\n    case FETCH_ITEMS: {\n      const { section, items } = action.payload;\n      return {\n        ...state,\n        itemsFetching: false,\n        results: state.results.map((result: DashboardSection) => {\n          if (section.id === result.id) {\n            return { ...result, items, itemsFetching: false };\n          }\n          return result;\n        }),\n      };\n    }\n    case FETCH_ITEMS_START: {\n      const id = action.payload;\n      if (id) {\n        return {\n          ...state,\n          results: state.results.map((result) => (result.id === id ? { ...result, itemsFetching: true } : result)),\n        };\n      }\n      return state;\n    }\n    case MOVE_SELECTION_DOWN: {\n      const flatIds = getFlattenedSections(state.results);\n      if (state.selectedIndex < flatIds.length - 1) {\n        const newIndex = state.selectedIndex + 1;\n        const selectedId = flatIds[newIndex];\n        return {\n          ...state,\n          selectedIndex: newIndex,\n          results: markSelected(state.results, selectedId),\n        };\n      }\n      return state;\n    }\n    case MOVE_SELECTION_UP:\n      if (state.selectedIndex > 0) {\n        const flatIds = getFlattenedSections(state.results);\n        const newIndex = state.selectedIndex - 1;\n        const selectedId = flatIds[newIndex];\n        return {\n          ...state,\n          selectedIndex: newIndex,\n          results: markSelected(state.results, selectedId),\n        };\n      }\n      return state;\n    default:\n      return state;\n  }\n};\n","import { DashboardQuery, SearchQueryParams, SearchAction, SearchLayout } from '../types';\nimport {\n  ADD_TAG,\n  CLEAR_FILTERS,\n  LAYOUT_CHANGE,\n  QUERY_CHANGE,\n  REMOVE_STARRED,\n  REMOVE_TAG,\n  SET_TAGS,\n  TOGGLE_SORT,\n  TOGGLE_STARRED,\n} from './actionTypes';\n\nexport const defaultQuery: DashboardQuery = {\n  query: '',\n  tag: [],\n  starred: false,\n  skipRecent: false,\n  skipStarred: false,\n  folderIds: [],\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 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 { Dispatch } from 'react';\nimport { Action } from 'redux';\nimport { SelectableValue } from '@grafana/data';\nimport { FolderInfo } from '../../types';\n\nexport enum DashboardSearchItemType {\n  DashDB = 'dash-db',\n  DashHome = 'dash-home',\n  DashFolder = 'dash-folder',\n}\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\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  uid?: string;\n  uri: string;\n  url: string;\n  sortMeta?: number;\n  sortMetaName?: string;\n}\n\nexport interface DashboardSearchHit extends DashboardSectionItem, DashboardSection {}\n\nexport interface DashboardTag {\n  term: string;\n  count: number;\n}\n\nexport interface SearchAction extends Action {\n  payload?: any;\n}\n\nexport interface UidsToDelete {\n  folders: string[];\n  dashboards: string[];\n}\n\nexport interface DashboardQuery {\n  query: string;\n  tag: string[];\n  starred: boolean;\n  skipRecent: boolean;\n  skipStarred: boolean;\n  folderIds: number[];\n  sort: SelectableValue | null;\n  // Save sorting data between layouts\n  prevSort: SelectableValue | null;\n  layout: SearchLayout;\n}\n\nexport type SearchReducer<S> = [S, Dispatch<SearchAction>];\ninterface UseSearchParams {\n  queryParsing?: boolean;\n  searchCallback?: (folderUid: string | undefined) => any;\n  folderUid?: string;\n}\n\nexport type UseSearch = <S>(\n  query: DashboardQuery,\n  reducer: SearchReducer<S>,\n  params: UseSearchParams\n) => { state: S; dispatch: Dispatch<SearchAction>; onToggleSection: (section: DashboardSection) => void };\n\nexport type OnToggleChecked = (item: DashboardSectionItem | DashboardSection) => void;\nexport type OnDeleteItems = (folders: string[], dashboards: string[]) => void;\nexport type OnMoveItems = (selectedDashboards: DashboardSectionItem[], folder: FolderInfo | null) => void;\n\nexport enum SearchLayout {\n  List = 'list',\n  Folders = 'folders',\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","import { parse, SearchParserResult } from 'search-query-parser';\nimport { IconName } from '@grafana/ui';\nimport { UrlQueryMap } from '@grafana/data';\nimport { DashboardQuery, DashboardSection, DashboardSectionItem, SearchAction, UidsToDelete } from './types';\nimport { NO_ID_SECTIONS, SECTION_STORAGE_KEY } from './constants';\nimport { getDashboardSrv } from '../dashboard/services/DashboardSrv';\n\n/**\n * Check if folder has id. Only Recent and Starred folders are the ones without\n * ids so far, as they are created manually after results are fetched from API.\n * @param str\n */\nexport const hasId = (str: string) => {\n  return !NO_ID_SECTIONS.includes(str);\n};\n\n/**\n * Return ids for folders concatenated with their items ids, if section is expanded.\n * For items the id format is '{folderId}-{itemId}' to allow mapping them to their folders\n * @param sections\n */\nexport const getFlattenedSections = (sections: DashboardSection[]): string[] => {\n  return sections.flatMap((section) => {\n    const id = hasId(section.title) ? String(section.id) : section.title;\n\n    if (section.expanded && section.items.length) {\n      return [id, ...section.items.map((item) => `${id}-${item.id}`)];\n    }\n    return id;\n  });\n};\n\n/**\n * Get all items for currently expanded sections\n * @param sections\n */\nexport const getVisibleItems = (sections: DashboardSection[]) => {\n  return sections.flatMap((section) => {\n    if (section.expanded) {\n      return section.items;\n    }\n    return [];\n  });\n};\n/**\n * Since Recent and Starred folders don't have id, title field is used as id\n * @param title - title field of the section\n */\nexport const getLookupField = (title: string) => {\n  return hasId(title) ? 'id' : 'title';\n};\n\n/**\n * Go through all the folders and items in expanded folders and toggle their selected\n * prop according to currently selected index. Used for item highlighting when navigating\n * the search results list using keyboard arrows\n * @param sections\n * @param selectedId\n */\nexport const markSelected = (sections: DashboardSection[], selectedId: string) => {\n  return sections.map((result: DashboardSection) => {\n    const lookupField = getLookupField(selectedId);\n    result = { ...result, selected: String(result[lookupField]) === selectedId };\n\n    if (result.expanded && result.items.length) {\n      return {\n        ...result,\n        items: result.items.map((item) => {\n          const [sectionId, itemId] = selectedId.split('-');\n          const lookup = getLookupField(sectionId);\n          return { ...item, selected: String(item.id) === itemId && String(result[lookup]) === sectionId };\n        }),\n      };\n    }\n    return result;\n  });\n};\n\n/**\n * Find items with property 'selected' set true in a list of folders and their items.\n * Does recursive search in the items list.\n * @param sections\n */\nexport const findSelected = (sections: any): DashboardSection | DashboardSectionItem | null => {\n  let found = null;\n  for (const section of sections) {\n    if (section.expanded && section.items.length) {\n      found = findSelected(section.items);\n    }\n    if (section.selected) {\n      found = section;\n    }\n    if (found) {\n      return found;\n    }\n  }\n\n  return null;\n};\n\nexport const parseQuery = (query: string) => {\n  const parsedQuery = parse(query, {\n    keywords: ['folder'],\n  });\n\n  if (typeof parsedQuery === 'string') {\n    return {\n      text: parsedQuery,\n    } as SearchParserResult;\n  }\n\n  return parsedQuery;\n};\n\n/**\n * Merge multiple reducers into one, keeping the state structure flat (no nested\n * separate state for each reducer). If there are multiple state slices with the same\n * key, the latest reducer's state is applied.\n * Compared to Redux's combineReducers this allows multiple reducers to operate\n * on the same state or different slices of the same state. Useful when multiple\n * components have the same structure but different or extra logic when modifying it.\n * If reducers have the same action types, the action types from the rightmost reducer\n * take precedence\n * @param reducers\n */\nexport const mergeReducers = (reducers: any[]) => (prevState: any, action: SearchAction) => {\n  return reducers.reduce((nextState, reducer) => ({ ...nextState, ...reducer(nextState, action) }), prevState);\n};\n\n/**\n * Collect all the checked dashboards\n * @param sections\n */\nexport const getCheckedDashboards = (sections: DashboardSection[]): DashboardSectionItem[] => {\n  if (!sections.length) {\n    return [];\n  }\n\n  return sections.reduce((uids, section) => {\n    return section.items ? [...uids, ...section.items.filter((item) => item.checked)] : uids;\n  }, [] as DashboardSectionItem[]);\n};\n\n/**\n * Collect uids of all the checked dashboards\n * @param sections\n */\nexport const getCheckedDashboardsUids = (sections: DashboardSection[]) => {\n  if (!sections.length) {\n    return [];\n  }\n\n  return getCheckedDashboards(sections).map((item) => item.uid);\n};\n\n/**\n * Collect uids of all checked folders and dashboards. Used for delete operation, among others\n * @param sections\n */\nexport const getCheckedUids = (sections: DashboardSection[]): UidsToDelete => {\n  const emptyResults: UidsToDelete = { folders: [], dashboards: [] };\n\n  if (!sections.length) {\n    return emptyResults;\n  }\n\n  return sections.reduce((result, section) => {\n    if (section?.id !== 0 && section.checked) {\n      return { ...result, folders: [...result.folders, section.uid] } as UidsToDelete;\n    } else {\n      return { ...result, dashboards: getCheckedDashboardsUids(sections) } as UidsToDelete;\n    }\n  }, emptyResults);\n};\n\n/**\n * When search is done within a dashboard folder, add folder id to the search query\n * to narrow down the results to the folder\n * @param query\n * @param queryParsing\n */\nexport const getParsedQuery = (query: DashboardQuery, queryParsing = false) => {\n  const parsedQuery = { ...query, sort: query.sort?.value };\n  if (!queryParsing) {\n    return parsedQuery;\n  }\n\n  let folderIds: number[] = [];\n\n  if (parseQuery(query.query).folder === 'current') {\n    try {\n      const dash = getDashboardSrv().getCurrent();\n      if (dash?.meta.folderId) {\n        folderIds = [dash?.meta.folderId];\n      }\n    } catch (e) {\n      console.error(e);\n    }\n  }\n  return { ...parsedQuery, query: parseQuery(query.query).text as string, folderIds };\n};\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 section icon depending on expanded state. Currently works for folder icons only\n * @param section\n */\nexport const getSectionIcon = (section: DashboardSection): IconName => {\n  if (!hasId(section.title)) {\n    return section.icon as IconName;\n  }\n\n  return section.expanded ? 'folder-open' : 'folder';\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 { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Team, TeamGroup, TeamMember, TeamsState, TeamState } from 'app/types';\n\nexport const initialTeamsState: TeamsState = { teams: [], searchQuery: '', 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 };\n    },\n  },\n});\n\nexport const { teamsLoaded, setSearchQuery } = 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 kbn from 'app/core/utils/kbn';\nimport { dateTime, Registry, RegistryItem, textUtil, VariableModel } from '@grafana/data';\nimport { isArray, map, replace } from 'lodash';\nimport { formatVariableLabel } from '../variables/shared/formatVariable';\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../variables/state/types';\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';\nimport { deprecationWarning, ScopedVars, TimeRange } from '@grafana/data';\nimport { getFilteredVariables, getVariables, getVariableWithName } from '../variables/state/selectors';\nimport { variableRegex } from '../variables/utils';\nimport { isAdHoc } from '../variables/guard';\nimport { AdHocVariableFilter, AdHocVariableModel, VariableModel } from '../variables/types';\nimport { getDataSourceSrv, setTemplateSrv, TemplateSrv as BaseTemplateSrv } from '@grafana/runtime';\nimport { FormatOptions, formatRegistry, FormatRegistryID } from './formatRegistry';\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../variables/state/types';\nimport { variableAdapters } from '../variables/adapters';\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 || (variable.datasource == null && ds?.isDefault)) {\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  variableExists(expression: string): boolean {\n    const name = this.getVariableName(expression);\n    const variable = name && this.getVariableAtIndex(name);\n    return variable !== null && variable !== undefined;\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 { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { Invitee, OrgUser, UsersState } from 'app/types';\nimport config from 'app/core/config';\n\nexport const initialState: UsersState = {\n  invitees: [] as Invitee[],\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    inviteesLoaded: (state, action: PayloadAction<Invitee[]>): UsersState => {\n      return { ...state, hasFetched: true, invitees: 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 { inviteesLoaded, setUsersSearchQuery, setUsersSearchPage, usersLoaded } = usersSlice.actions;\n\nexport const usersReducer = usersSlice.reducer;\n\nexport default {\n  users: usersReducer,\n};\n","import React, { ChangeEvent, PropsWithChildren, ReactElement } from 'react';\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';\nimport { InlineFieldRow, VerticalGroup } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableWithMultiSupport } from '../types';\nimport { VariableEditorProps } from './types';\nimport { toVariableIdentifier, VariableIdentifier } from '../state/types';\nimport { VariableSectionHeader } from './VariableSectionHeader';\nimport { VariableSwitchField } from './VariableSwitchField';\nimport { VariableTextField } from './VariableTextField';\n\nexport interface SelectionOptionsEditorProps<Model extends VariableWithMultiSupport = VariableWithMultiSupport>\n  extends VariableEditorProps<Model> {\n  onMultiChanged: (identifier: VariableIdentifier, 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(toVariableIdentifier(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            ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsCustomAllInput}\n            labelWidth={20}\n          />\n        </InlineFieldRow>\n      )}\n    </VerticalGroup>\n  );\n};\nSelectionOptionsEditor.displayName = 'SelectionOptionsEditor';\n","import React, { useCallback } from 'react';\nimport { DataQuery, DataSourceApi, DataSourceJsonData, QueryEditorProps, StandardVariableQuery } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\n\nimport { LegacyVariableQueryEditor } from './LegacyVariableQueryEditor';\nimport {\n  hasCustomVariableSupport,\n  hasDatasourceVariableSupport,\n  hasLegacyVariableSupport,\n  hasStandardVariableSupport,\n} from '../guard';\nimport { importDataSourcePlugin } from '../../plugins/plugin_loader';\nimport { VariableQueryEditorType } from '../types';\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';\nimport { getDataSourceSrv, toDataQueryError } from '@grafana/runtime';\nimport { DataSourceRef } from '@grafana/data';\n\nimport { updateOptions } from '../state/actions';\nimport { QueryVariableModel } from '../types';\nimport { ThunkResult } from '../../../types';\nimport { getVariable } from '../state/selectors';\nimport {\n  addVariableEditorError,\n  changeVariableEditorExtended,\n  removeVariableEditorError,\n  VariableEditorState,\n} from '../editor/reducer';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { getVariableQueryEditor } from '../editor/getVariableQueryEditor';\nimport { getVariableQueryRunner } from './VariableQueryRunner';\nimport { variableQueryObserver } from './variableQueryObserver';\nimport { QueryVariableEditorState } from './reducer';\nimport { hasOngoingTransaction } from '../utils';\n\nexport const updateQueryVariableOptions = (\n  identifier: VariableIdentifier,\n  searchFilter?: string\n): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    try {\n      if (!hasOngoingTransaction(getState())) {\n        // we might have cancelled a batch so then variable state is removed\n        return;\n      }\n\n      const variableInState = getVariable<QueryVariableModel>(identifier.id, getState());\n      if (getState().templating.editor.id === variableInState.id) {\n        dispatch(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      const error = toDataQueryError(err);\n      if (getState().templating.editor.id === identifier.id) {\n        dispatch(addVariableEditorError({ errorProp: 'update', errorText: error.message }));\n      }\n\n      throw error;\n    }\n  };\n};\n\nexport const initQueryVariableEditor = (identifier: VariableIdentifier): ThunkResult<void> => async (\n  dispatch,\n  getState\n) => {\n  const variable = getVariable<QueryVariableModel>(identifier.id, getState());\n  await dispatch(changeQueryVariableDataSource(toVariableIdentifier(variable), variable.datasource));\n};\n\nexport const changeQueryVariableDataSource = (\n  identifier: VariableIdentifier,\n  name: DataSourceRef | null\n): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    try {\n      const editorState = getState().templating.editor as VariableEditorState<QueryVariableEditorState>;\n      const previousDatasource = editorState.extended?.dataSource;\n      const dataSource = await getDataSourceSrv().get(name ?? '');\n      if (previousDatasource && previousDatasource.type !== dataSource?.type) {\n        dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'query', propValue: '' })));\n      }\n      dispatch(changeVariableEditorExtended({ propName: 'dataSource', propValue: dataSource }));\n\n      const VariableQueryEditor = await getVariableQueryEditor(dataSource);\n      dispatch(changeVariableEditorExtended({ propName: 'VariableQueryEditor', propValue: VariableQueryEditor }));\n    } catch (err) {\n      console.error(err);\n    }\n  };\n};\n\nexport const changeQueryVariableQuery = (\n  identifier: VariableIdentifier,\n  query: any,\n  definition?: string\n): ThunkResult<void> => async (dispatch, getState) => {\n  const variableInState = getVariable<QueryVariableModel>(identifier.id, getState());\n  if (hasSelfReferencingQuery(variableInState.name, query)) {\n    const errorText = 'Query cannot contain a reference to itself. Variable: $' + variableInState.name;\n    dispatch(addVariableEditorError({ errorProp: 'query', errorText }));\n    return;\n  }\n\n  dispatch(removeVariableEditorError({ errorProp: 'query' }));\n  dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'query', propValue: query })));\n\n  if (definition) {\n    dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'definition', propValue: definition })));\n  } else if (typeof query === 'string') {\n    dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'definition', propValue: query })));\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';\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 React, { PropsWithChildren, useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\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      ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRefreshSelect}\n      tooltip=\"When to update the values of this variable.\"\n    />\n  );\n}\n","import React, { PropsWithChildren, useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\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      ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsSortSelect}\n      tooltip=\"How to sort the values of this variable.\"\n    />\n  );\n}\n","import React, { FormEvent, PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { css } from '@emotion/css';\nimport { InlineField, InlineFieldRow, VerticalGroup } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { DataSourcePicker, getTemplateSrv } from '@grafana/runtime';\nimport { DataSourceInstanceSettings, getDataSourceRef, LoadingState, SelectableValue } from '@grafana/data';\n\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { QueryVariableModel, VariableRefresh, VariableSort, VariableWithMultiSupport } from '../types';\nimport { QueryVariableEditorState } from './reducer';\nimport { changeQueryVariableDataSource, changeQueryVariableQuery, initQueryVariableEditor } from './actions';\nimport { VariableEditorState } from '../editor/reducer';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { StoreState } from '../../../types';\nimport { toVariableIdentifier } from '../state/types';\nimport { changeVariableMultiValue } from '../state/actions';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { isLegacyQueryEditor, isQueryEditor } from '../guard';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { QueryVariableRefreshSelect } from './QueryVariableRefreshSelect';\nimport { QueryVariableSortSelect } from './QueryVariableSortSelect';\n\nconst mapStateToProps = (state: StoreState) => ({\n  editor: state.templating.editor as VariableEditorState<QueryVariableEditorState>,\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(toVariableIdentifier(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        toVariableIdentifier(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(toVariableIdentifier(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(toVariableIdentifier(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 { editor, variable } = this.props;\n    if (!editor.extended || !editor.extended.dataSource || !editor.extended.VariableQueryEditor) {\n      return null;\n    }\n\n    const query = variable.query;\n    const datasource = editor.extended.dataSource;\n    const VariableQueryEditor = editor.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              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              ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRegExInput}\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 { VariableModel } from '../types';\n\nexport interface VariablePickerProps<Model extends VariableModel = VariableModel> {\n  variable: Model;\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';\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 { debounce, trim } from 'lodash';\nimport { StoreState, ThunkDispatch, ThunkResult } from 'app/types';\nimport { VariableOption, VariableWithMultiSupport, VariableWithOptions } from '../../types';\nimport { variableAdapters } from '../../adapters';\nimport { getVariable } from '../../state/selectors';\nimport { NavigationKey } from '../types';\nimport {\n  hideOptions,\n  moveOptionsHighlight,\n  OptionsPickerState,\n  showOptions,\n  toggleOption,\n  updateOptionsAndFilter,\n  updateOptionsFromSearch,\n  updateSearchQuery,\n} from './reducer';\nimport { changeVariableProp, setCurrentVariableValue } from '../../state/sharedReducer';\nimport { toVariablePayload, VariableIdentifier } from '../../state/types';\nimport { containsSearchFilter, getCurrentText } from '../../utils';\n\nexport const navigateOptions = (key: NavigationKey, clearOthers: boolean): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    if (key === NavigationKey.cancel) {\n      return await dispatch(commitChangesToVariable());\n    }\n\n    if (key === NavigationKey.select) {\n      return dispatch(toggleOptionByHighlight(clearOthers));\n    }\n\n    if (key === NavigationKey.selectAndClose) {\n      dispatch(toggleOptionByHighlight(clearOthers, true));\n      return await dispatch(commitChangesToVariable());\n    }\n\n    if (key === NavigationKey.moveDown) {\n      return dispatch(moveOptionsHighlight(1));\n    }\n\n    if (key === NavigationKey.moveUp) {\n      return dispatch(moveOptionsHighlight(-1));\n    }\n\n    return undefined;\n  };\n};\n\nexport const filterOrSearchOptions = (searchQuery = ''): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const { id, queryValue } = getState().templating.optionsPicker;\n    const { query, options } = getVariable<VariableWithOptions>(id, getState());\n    dispatch(updateSearchQuery(searchQuery));\n\n    if (trim(queryValue) === trim(searchQuery)) {\n      return;\n    }\n\n    if (containsSearchFilter(query)) {\n      return searchForOptionsWithDebounce(dispatch, getState, searchQuery);\n    }\n    return dispatch(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 = (callback?: (updated: any) => void): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const picker = getState().templating.optionsPicker;\n    const existing = getVariable<VariableWithMultiSupport>(picker.id, getState());\n    const currentPayload = { option: mapToCurrent(picker) };\n    const searchQueryPayload = { propName: 'queryValue', propValue: picker.queryValue };\n\n    dispatch(setCurrentVariableValue(toVariablePayload(existing, currentPayload)));\n    dispatch(changeVariableProp(toVariablePayload(existing, searchQueryPayload)));\n    const updated = getVariable<VariableWithMultiSupport>(picker.id, getState());\n    dispatch(hideOptions());\n\n    if (getCurrentText(existing) === getCurrentText(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 = ({ id }: VariableIdentifier, callback?: (updated: any) => void): ThunkResult<void> => async (\n  dispatch,\n  getState\n) => {\n  const picker = getState().templating.optionsPicker;\n\n  if (picker.id && picker.id !== id) {\n    await dispatch(commitChangesToVariable(callback));\n  }\n\n  const variable = getVariable<VariableWithMultiSupport>(id, getState());\n  dispatch(showOptions(variable));\n};\n\nexport const toggleOptionByHighlight = (clearOthers: boolean, forceSelect = false): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    const { highlightIndex, options } = getState().templating.optionsPicker;\n    const option = options[highlightIndex];\n    dispatch(toggleOption({ option, forceSelect, clearOthers }));\n  };\n};\n\nconst searchForOptions = async (dispatch: ThunkDispatch, getState: () => StoreState, searchQuery: string) => {\n  try {\n    const { id } = getState().templating.optionsPicker;\n    const existing = getVariable<VariableWithOptions>(id, getState());\n\n    const adapter = variableAdapters.get(existing.type);\n    await adapter.updateOptions(existing, searchQuery);\n\n    const updated = getVariable<VariableWithOptions>(id, getState());\n    dispatch(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, { PureComponent } from 'react';\nimport { Tooltip } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableOption } from '../../types';\nimport { css, cx } from '@emotion/css';\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 React, { FC, MouseEvent, useCallback } from 'react';\nimport { css } from '@emotion/css';\nimport { Icon, Tooltip, useStyles } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme } from '@grafana/data';\n\ninterface Props {\n  onClick: () => void;\n  text: string;\n  loading: boolean;\n  onCancel: () => void;\n  /**\n   *  htmlFor, needed for the label\n   */\n  id: string;\n}\n\nexport const VariableLink: FC<Props> = ({ loading, onClick: propsOnClick, text, onCancel, id }) => {\n  const styles = useStyles(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    >\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 = useStyles(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: GrafanaTheme) => ({\n  container: css`\n    max-width: 500px;\n    padding-right: 10px;\n    padding: 0 ${theme.spacing.sm};\n    background-color: ${theme.colors.formInputBg};\n    border: 1px solid ${theme.colors.formInputBorder};\n    border-radius: ${theme.border.radius.sm};\n    display: flex;\n    align-items: center;\n    color: ${theme.colors.text};\n    height: ${theme.height.md}px;\n\n    .label-tag {\n      margin: 0 5px;\n    }\n  `,\n  textAndTags: css`\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    margin-right: ${theme.spacing.xxs};\n    user-select: none;\n  `,\n});\n","import React, { ComponentType, PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { ClickOutsideWrapper } from '@grafana/ui';\nimport { LoadingState } from '@grafana/data';\n\nimport { StoreState } from 'app/types';\nimport { VariableInput } from '../shared/VariableInput';\nimport { commitChangesToVariable, filterOrSearchOptions, navigateOptions, openOptions } from './actions';\nimport { OptionsPickerState, toggleAllOptions, toggleOption } from './reducer';\nimport { VariableOption, VariableWithMultiSupport, VariableWithOptions } from '../../types';\nimport { VariableOptions } from '../shared/VariableOptions';\nimport { isMulti } from '../../guard';\nimport { VariablePickerProps } from '../types';\nimport { formatVariableLabel } from '../../shared/formatVariable';\nimport { toVariableIdentifier } from '../../state/types';\nimport { getVariableQueryRunner } from '../../query/VariableQueryRunner';\nimport { VariableLink } from '../shared/VariableLink';\n\nexport const optionPickerFactory = <Model extends VariableWithOptions | VariableWithMultiSupport>(): ComponentType<\n  VariablePickerProps<Model>\n> => {\n  const mapDispatchToProps = {\n    openOptions,\n    commitChangesToVariable,\n    filterOrSearchOptions,\n    toggleAllOptions,\n    toggleOption,\n    navigateOptions,\n  };\n\n  const mapStateToProps = (state: StoreState) => ({\n    picker: state.templating.optionsPicker,\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(toVariableIdentifier(this.props.variable), this.props.onVariableChange);\n    onHideOptions = () => this.props.commitChangesToVariable(this.props.onVariableChange);\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({ option, clearOthers, forceSelect: false });\n      this.onHideOptions();\n    };\n\n    onToggleMultiValueVariable = (option: VariableOption, clearOthers: boolean) => {\n      this.props.toggleOption({ option, clearOthers, forceSelect: false });\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={variable.id}\n          text={linkText}\n          onClick={this.onShowOptions}\n          loading={loading}\n          onCancel={this.onCancel}\n        />\n      );\n    }\n\n    onCancel = () => {\n      getVariableQueryRunner().cancelRequest(toVariableIdentifier(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={id}\n            value={picker.queryValue}\n            onChange={this.props.filterOrSearchOptions}\n            onNavigate={this.props.navigateOptions}\n            aria-expanded={true}\n            aria-controls={`options-${id}`}\n          />\n          <VariableOptions\n            values={picker.options}\n            onToggle={this.onToggleOption}\n            onToggleAll={this.props.toggleAllOptions}\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 { cloneDeep } from 'lodash';\n\nimport { QueryVariableModel, VariableRefresh } from '../types';\nimport { initialQueryVariableModelState, queryVariableReducer } from './reducer';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { QueryVariableEditor } from './QueryVariableEditor';\nimport { updateQueryVariableOptions } from './actions';\nimport { ALL_VARIABLE_TEXT, toVariableIdentifier } from '../state/types';\nimport { containsVariable, isAllVariable } from '../utils';\nimport { optionPickerFactory } from '../pickers';\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(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async (variable, searchFilter) => {\n      await dispatch(updateQueryVariableOptions(toVariableIdentifier(variable), searchFilter));\n    },\n    getSaveModel: (variable) => {\n      const { index, id, state, global, queryValue, ...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 { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { CustomVariableModel, initialVariableModelState, VariableOption } from '../types';\nimport {\n  ALL_VARIABLE_TEXT,\n  ALL_VARIABLE_VALUE,\n  getInstanceState,\n  VariablePayload,\n  initialVariablesState,\n  VariablesState,\n} from '../state/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 React, { FormEvent, PureComponent } from 'react';\nimport { CustomVariableModel, VariableWithMultiSupport } from '../types';\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { connectWithStore } from 'app/core/utils/connectWithReduxStore';\nimport { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { VerticalGroup } from '@grafana/ui';\nimport { StoreState } from 'app/types';\nimport { changeVariableMultiValue } from '../state/actions';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextAreaField } from '../editor/VariableTextAreaField';\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            />\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 { cloneDeep } from 'lodash';\nimport { CustomVariableModel } from '../types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { customVariableReducer, initialCustomVariableModelState } from './reducer';\nimport { CustomVariableEditor } from './CustomVariableEditor';\nimport { updateCustomVariableOptions } from './actions';\nimport { ALL_VARIABLE_TEXT, toVariableIdentifier } from '../state/types';\nimport { isAllVariable } from '../utils';\nimport { optionPickerFactory } from '../pickers';\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(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async (variable) => {\n      await dispatch(updateCustomVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: (variable) => {\n      const { index, id, state, global, ...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 { validateVariableSelectionState } from '../state/actions';\nimport { ThunkResult } from 'app/types';\nimport { createCustomOptionsFromQuery } from './reducer';\nimport { toVariablePayload, VariableIdentifier } from '../state/types';\n\nexport const updateCustomVariableOptions = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch) => {\n    await dispatch(createCustomOptionsFromQuery(toVariablePayload(identifier)));\n    await dispatch(validateVariableSelectionState(identifier));\n  };\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\n\nimport { initialVariableModelState, TextBoxVariableModel, VariableOption } from '../types';\nimport { getInstanceState, VariablePayload, initialVariablesState, VariablesState } from '../state/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 React, { ChangeEvent, FocusEvent, KeyboardEvent, ReactElement, useCallback, useEffect, useState } from 'react';\n\nimport { TextBoxVariableModel } from '../types';\nimport { toVariablePayload } from '../state/types';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { VariablePickerProps } from '../pickers/types';\nimport { Input } from '@grafana/ui';\nimport { variableAdapters } from '../adapters';\nimport { useDispatch } from 'react-redux';\n\nexport interface Props extends VariablePickerProps<TextBoxVariableModel> {}\n\nexport function TextBoxVariablePicker({ variable, onVariableChange }: 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.current.value === updatedValue) {\n      return;\n    }\n\n    dispatch(\n      changeVariableProp(\n        toVariablePayload({ id: variable.id, type: variable.type }, { propName: 'query', propValue: updatedValue })\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((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      onKeyDown={onKeyDown}\n      placeholder=\"Enter variable value\"\n      id={variable.id}\n    />\n  );\n}\n","import React, { FormEvent, ReactElement, useCallback } from 'react';\nimport { VerticalGroup } from '@grafana/ui';\n\nimport { TextBoxVariableModel } from '../types';\nimport { VariableEditorProps } from '../editor/types';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { selectors } from '@grafana/e2e-selectors';\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        ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.TextBoxVariable.textBoxOptionsQueryInput}\n      />\n    </VerticalGroup>\n  );\n}\n","import { TextBoxVariableModel } from '../types';\nimport { ThunkResult } from '../../../types';\nimport { getVariable } from '../state/selectors';\nimport { variableAdapters } from '../adapters';\nimport { createTextBoxOptions } from './reducer';\nimport { toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport { setOptionFromUrl } from '../state/actions';\nimport { UrlQueryValue } from '@grafana/data';\nimport { changeVariableProp } from '../state/sharedReducer';\nimport { ensureStringValues } from '../utils';\n\nexport const updateTextBoxVariableOptions = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    await dispatch(createTextBoxOptions(toVariablePayload(identifier)));\n\n    const variableInState = getVariable<TextBoxVariableModel>(identifier.id, getState());\n    await variableAdapters.get(identifier.type).setValue(variableInState, variableInState.options[0], true);\n  };\n};\n\nexport const setTextBoxVariableOptionsFromUrl = (\n  identifier: VariableIdentifier,\n  urlValue: UrlQueryValue\n): ThunkResult<void> => async (dispatch, getState) => {\n  const variableInState = getVariable<TextBoxVariableModel>(identifier.id, getState());\n\n  const stringUrlValue = ensureStringValues(urlValue);\n  dispatch(changeVariableProp(toVariablePayload(variableInState, { propName: 'query', propValue: stringUrlValue })));\n\n  await dispatch(setOptionFromUrl(toVariableIdentifier(variableInState), stringUrlValue));\n};\n","import { cloneDeep } from 'lodash';\n\nimport { TextBoxVariableModel } from '../types';\nimport { initialTextBoxVariableModelState, textBoxVariableReducer } from './reducer';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { TextBoxVariablePicker } from './TextBoxVariablePicker';\nimport { TextBoxVariableEditor } from './TextBoxVariableEditor';\nimport { setTextBoxVariableOptionsFromUrl, updateTextBoxVariableOptions } from './actions';\nimport { toVariableIdentifier } from '../state/types';\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(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setTextBoxVariableOptionsFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async (variable) => {\n      await dispatch(updateTextBoxVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: (variable, saveCurrentAsDefault) => {\n      const { index, id, state, global, originalQuery, ...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 { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { ConstantVariableModel, initialVariableModelState, VariableHide, VariableOption } from '../types';\nimport { getInstanceState, VariablePayload, initialVariablesState, VariablesState } from '../state/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 React, { FormEvent, PureComponent } from 'react';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { VerticalGroup } from '@grafana/ui';\n\nimport { ConstantVariableModel } from '../types';\nimport { VariableEditorProps } from '../editor/types';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextField } from '../editor/VariableTextField';\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          ariaLabel={selectors.pages.Dashboard.Settings.Variables.Edit.ConstantVariable.constantOptionsQueryInput}\n          grow\n        />\n      </VerticalGroup>\n    );\n  }\n}\n","import { validateVariableSelectionState } from '../state/actions';\nimport { ThunkResult } from 'app/types';\nimport { createConstantOptionsFromQuery } from './reducer';\nimport { toVariablePayload, VariableIdentifier } from '../state/types';\n\nexport const updateConstantVariableOptions = (identifier: VariableIdentifier): ThunkResult<void> => {\n  return async (dispatch) => {\n    await dispatch(createConstantOptionsFromQuery(toVariablePayload(identifier)));\n    await dispatch(validateVariableSelectionState(identifier));\n  };\n};\n","import { cloneDeep } from 'lodash';\nimport { ConstantVariableModel } from '../types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { constantVariableReducer, initialConstantVariableModelState } from './reducer';\nimport { ConstantVariableEditor } from './ConstantVariableEditor';\nimport { updateConstantVariableOptions } from './actions';\nimport { toVariableIdentifier } from '../state/types';\nimport { optionPickerFactory } from '../pickers';\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(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async (variable) => {\n      await dispatch(updateConstantVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: (variable) => {\n      const { index, id, state, global, current, options, ...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 { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { DataSourceInstanceSettings } from '@grafana/data';\n\nimport { DataSourceVariableModel, initialVariableModelState, VariableOption, VariableRefresh } from '../types';\nimport {\n  ALL_VARIABLE_TEXT,\n  ALL_VARIABLE_VALUE,\n  getInstanceState,\n  initialVariablesState,\n  VariablePayload,\n  VariablesState,\n} from '../state/types';\n\nexport interface DataSourceVariableEditorState {\n  dataSourceTypes: Array<{ text: string; value: string }>;\n}\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 { MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { InlineFieldRow, VerticalGroup } from '@grafana/ui';\n\nimport { DataSourceVariableModel, VariableWithMultiSupport } from '../types';\nimport { OnPropChangeArguments, VariableEditorProps } from '../editor/types';\nimport { SelectionOptionsEditor } from '../editor/SelectionOptionsEditor';\nimport { VariableEditorState } from '../editor/reducer';\nimport { DataSourceVariableEditorState } from './reducer';\nimport { initDataSourceVariableEditor } from './actions';\nimport { StoreState } from '../../../types';\nimport { connectWithStore } from '../../../core/utils/connectWithReduxStore';\nimport { changeVariableMultiValue } from '../state/actions';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { SelectableValue } from '@grafana/data';\nimport { VariableTextField } from '../editor/VariableTextField';\n\nexport interface OwnProps extends VariableEditorProps<DataSourceVariableModel> {}\n\ninterface ConnectedProps {\n  editor: VariableEditorState<DataSourceVariableEditorState>;\n}\n\ninterface DispatchProps {\n  initDataSourceVariableEditor: typeof initDataSourceVariableEditor;\n  changeVariableMultiValue: typeof changeVariableMultiValue;\n}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport class DataSourceVariableEditorUnConnected extends PureComponent<Props> {\n  componentDidMount() {\n    this.props.initDataSourceVariableEditor();\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    if (!this.props.editor.extended?.dataSourceTypes?.length) {\n      return '';\n    }\n    const foundItem = this.props.editor.extended?.dataSourceTypes.find((ds) => ds.value === this.props.variable.query);\n    const value = foundItem ? foundItem.value : this.props.editor.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 typeOptions = this.props.editor.extended?.dataSourceTypes?.length\n      ? this.props.editor.extended?.dataSourceTypes?.map((ds) => ({ value: ds.value ?? '', label: ds.text }))\n      : [];\n    const typeValue = typeOptions.find((o) => o.value === this.props.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              />\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={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  editor: state.templating.editor as VariableEditorState<DataSourceVariableEditorState>,\n});\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {\n  initDataSourceVariableEditor,\n  changeVariableMultiValue,\n};\n\nexport const DataSourceVariableEditor = connectWithStore(\n  DataSourceVariableEditorUnConnected,\n  mapStateToProps,\n  mapDispatchToProps\n);\n","import { chain } from 'lodash';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { stringToJsRegex } from '@grafana/data';\n\nimport { toVariablePayload, VariableIdentifier } from '../state/types';\nimport { ThunkResult } from '../../../types';\nimport { createDataSourceOptions } from './reducer';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport { getVariable } from '../state/selectors';\nimport { DataSourceVariableModel } from '../types';\nimport { changeVariableEditorExtended } from '../editor/reducer';\n\nexport interface DataSourceVariableActionDependencies {\n  getDatasourceSrv: typeof getDatasourceSrv;\n}\n\nexport const updateDataSourceVariableOptions = (\n  identifier: VariableIdentifier,\n  dependencies: DataSourceVariableActionDependencies = { getDatasourceSrv: getDatasourceSrv }\n): ThunkResult<void> => async (dispatch, getState) => {\n  const sources = dependencies.getDatasourceSrv().getList({ metrics: true, variables: false });\n  const variableInState = getVariable<DataSourceVariableModel>(identifier.id, 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(createDataSourceOptions(toVariablePayload(identifier, { sources, regex })));\n  await dispatch(validateVariableSelectionState(identifier));\n};\n\nexport const initDataSourceVariableEditor = (\n  dependencies: DataSourceVariableActionDependencies = { getDatasourceSrv: getDatasourceSrv }\n): ThunkResult<void> => (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(\n    changeVariableEditorExtended({\n      propName: 'dataSourceTypes',\n      propValue: dataSourceTypes,\n    })\n  );\n};\n","import { cloneDeep } from 'lodash';\nimport { DataSourceVariableModel } from '../types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { dataSourceVariableReducer, initialDataSourceVariableModelState } from './reducer';\nimport { ALL_VARIABLE_TEXT, toVariableIdentifier } from '../state/types';\nimport { DataSourceVariableEditor } from './DataSourceVariableEditor';\nimport { updateDataSourceVariableOptions } from './actions';\nimport { containsVariable, isAllVariable } from '../utils';\nimport { optionPickerFactory } from '../pickers';\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(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async (variable) => {\n      await dispatch(updateDataSourceVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: (variable) => {\n      const { index, id, state, global, ...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 { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { initialVariableModelState, IntervalVariableModel, VariableOption, VariableRefresh } from '../types';\nimport { getInstanceState, VariablePayload, initialVariablesState, VariablesState } from '../state/types';\nimport { map } from 'lodash';\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 React, { ChangeEvent, FormEvent, PureComponent } from 'react';\nimport { InlineFieldRow, VerticalGroup } from '@grafana/ui';\n\nimport { IntervalVariableModel } from '../types';\nimport { VariableEditorProps } from '../editor/types';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableTextField } from '../editor/VariableTextField';\nimport { VariableSwitchField } from '../editor/VariableSwitchField';\nimport { VariableSelectField } from '../editor/VariableSelectField';\nimport { SelectableValue } from '@grafana/data';\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            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 { rangeUtil } from '@grafana/data';\n\nimport { toVariablePayload, VariableIdentifier } from '../state/types';\nimport { ThunkResult } from '../../../types';\nimport { createIntervalOptions } from './reducer';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { getVariable } from '../state/selectors';\nimport { IntervalVariableModel } from '../types';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { getTemplateSrv, TemplateSrv } from '../../templating/template_srv';\n\nexport const updateIntervalVariableOptions = (identifier: VariableIdentifier): ThunkResult<void> => async (\n  dispatch\n) => {\n  await dispatch(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  identifier: VariableIdentifier,\n  dependencies: UpdateAutoValueDependencies = {\n    calculateInterval: rangeUtil.calculateInterval,\n    getTimeSrv: getTimeSrv,\n    templateSrv: getTemplateSrv(),\n  }\n): ThunkResult<void> => (dispatch, getState) => {\n  const variableInState = getVariable<IntervalVariableModel>(identifier.id, 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';\nimport { IntervalVariableModel } from '../types';\nimport { dispatch } from '../../../store/store';\nimport { setOptionAsCurrent, setOptionFromUrl } from '../state/actions';\nimport { VariableAdapter } from '../adapters';\nimport { initialIntervalVariableModelState, intervalVariableReducer } from './reducer';\nimport { toVariableIdentifier } from '../state/types';\nimport { IntervalVariableEditor } from './IntervalVariableEditor';\nimport { updateAutoValue, updateIntervalVariableOptions } from './actions';\nimport { optionPickerFactory } from '../pickers';\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(toVariableIdentifier(variable)));\n      await dispatch(setOptionAsCurrent(toVariableIdentifier(variable), option, emitChanges));\n    },\n    setValueFromUrl: async (variable, urlValue) => {\n      await dispatch(updateAutoValue(toVariableIdentifier(variable)));\n      await dispatch(setOptionFromUrl(toVariableIdentifier(variable), urlValue));\n    },\n    updateOptions: async (variable) => {\n      await dispatch(updateIntervalVariableOptions(toVariableIdentifier(variable)));\n    },\n    getSaveModel: (variable) => {\n      const { index, id, state, global, ...rest } = cloneDeep(variable);\n      return rest;\n    },\n    getValueForUrl: (variable) => {\n      return variable.current.value;\n    },\n  };\n};\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { AdHocVariableFilter, AdHocVariableModel } from 'app/features/variables/types';\nimport { VariablePickerProps } from '../../pickers/types';\nimport { addFilter, changeFilter, removeFilter } from '../actions';\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(this.props.variable.id, filter);\n  };\n\n  removeFilter = (index: number) => {\n    this.props.removeFilter(this.props.variable.id, index);\n  };\n\n  changeFilter = (index: number, filter: AdHocVariableFilter) => {\n    this.props.changeFilter(this.props.variable.id, {\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        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 React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { Alert, InlineFieldRow, VerticalGroup } from '@grafana/ui';\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\n\nimport { AdHocVariableModel } from '../types';\nimport { VariableEditorProps } from '../editor/types';\nimport { VariableEditorState } from '../editor/reducer';\nimport { AdHocVariableEditorState } from './reducer';\nimport { changeVariableDatasource, initAdHocVariableEditor } from './actions';\nimport { StoreState } from 'app/types';\nimport { VariableSectionHeader } from '../editor/VariableSectionHeader';\nimport { VariableSelectField } from '../editor/VariableSelectField';\n\nconst mapStateToProps = (state: StoreState) => ({\n  editor: state.templating.editor as VariableEditorState<AdHocVariableEditorState>,\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    this.props.initAdHocVariableEditor();\n  }\n\n  onDatasourceChanged = (option: SelectableValue<DataSourceRef>) => {\n    this.props.changeVariableDatasource(option.value);\n  };\n\n  render() {\n    const { variable, editor } = this.props;\n    const dataSources = editor.extended?.dataSources ?? [];\n    const infoText = editor.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          {infoText ? <Alert title={infoText} severity=\"info\" /> : null}\n        </VerticalGroup>\n      </VerticalGroup>\n    );\n  }\n}\n\nexport const AdHocVariableEditor = connector(AdHocVariableEditorUnConnected);\n","import { AdHocVariableFilter } from 'app/features/variables/types';\nimport { UrlQueryValue } from '@grafana/data';\nimport { isArray, isString } from 'lodash';\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 { AdHocVariableModel } from '../types';\nimport { dispatch } from '../../../store/store';\nimport { VariableAdapter } from '../adapters';\nimport { AdHocPicker } from './picker/AdHocPicker';\nimport { adHocVariableReducer, initialAdHocVariableModelState } from './reducer';\nimport { AdHocVariableEditor } from './AdHocVariableEditor';\nimport { setFiltersFromUrl } from './actions';\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(variable.id, filters));\n    },\n    updateOptions: noop,\n    getSaveModel: (variable) => {\n      const { index, id, state, global, ...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 { ComponentType } from 'react';\nimport { Reducer } from 'redux';\nimport { Registry, UrlQueryValue, VariableType } from '@grafana/data';\n\nimport { VariableModel, VariableOption } from './types';\nimport { VariableEditorProps } from './editor/types';\nimport { VariablePickerProps } from './pickers/types';\nimport { createQueryVariableAdapter } from './query/adapter';\nimport { createCustomVariableAdapter } from './custom/adapter';\nimport { createTextBoxVariableAdapter } from './textbox/adapter';\nimport { createConstantVariableAdapter } from './constant/adapter';\nimport { createDataSourceVariableAdapter } from './datasource/adapter';\nimport { createIntervalVariableAdapter } from './interval/adapter';\nimport { createAdHocVariableAdapter } from './adhoc/adapter';\nimport { createSystemVariableAdapter } from './system/adapter';\nimport { VariablesState } from './state/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 getDefaultVariableAdapters = () => [\n  createQueryVariableAdapter(),\n  createCustomVariableAdapter(),\n  createTextBoxVariableAdapter(),\n  createConstantVariableAdapter(),\n  createDataSourceVariableAdapter(),\n  createIntervalVariableAdapter(),\n  createAdHocVariableAdapter(),\n  createSystemVariableAdapter(),\n];\n\nexport const variableAdapters = new Registry<VariableAdapter<any>>();\n","import { ComponentType } from 'react';\nimport { LoadingState } from '@grafana/data';\n\nimport { initialVariableModelState, SystemVariable, VariableHide } from '../types';\nimport { VariableAdapter } from '../adapters';\nimport { VariablePickerProps } from '../pickers/types';\nimport { VariableEditorProps } from '../editor/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 { cloneDeep } from 'lodash';\nimport { StoreState, ThunkResult } from 'app/types';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { changeVariableEditorExtended } from '../editor/reducer';\nimport { addVariable, changeVariableProp } from '../state/sharedReducer';\nimport { getNewVariabelIndex, getVariable } from '../state/selectors';\nimport { AddVariable, toVariableIdentifier, toVariablePayload, VariableIdentifier } from '../state/types';\nimport {\n  AdHocVariabelFilterUpdate,\n  filterAdded,\n  filterRemoved,\n  filtersRestored,\n  filterUpdated,\n  initialAdHocVariableModelState,\n} from './reducer';\nimport { AdHocVariableFilter, AdHocVariableModel } from 'app/features/variables/types';\nimport { variableUpdated } from '../state/actions';\nimport { isAdHoc } from '../guard';\nimport { DataSourceRef, getDataSourceRef } from '@grafana/data';\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    console.log('getVariableByOptions', options, getState().templating.variables);\n\n    if (!variable) {\n      dispatch(createAdHocVariable(options));\n      variable = getVariableByOptions(options, getState());\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(variable.id, filter));\n    }\n\n    const filter = { ...variable.filters[index], operator: options.operator };\n    return await dispatch(changeFilter(variable.id, { index, filter }));\n  };\n};\n\nexport const changeFilter = (id: string, update: AdHocVariabelFilterUpdate): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filterUpdated(toVariablePayload(variable, update)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const removeFilter = (id: string, index: number): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filterRemoved(toVariablePayload(variable, index)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const addFilter = (id: string, filter: AdHocVariableFilter): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filterAdded(toVariablePayload(variable, filter)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const setFiltersFromUrl = (id: string, filters: AdHocVariableFilter[]): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(id, getState());\n    dispatch(filtersRestored(toVariablePayload(variable, filters)));\n    await dispatch(variableUpdated(toVariableIdentifier(variable), true));\n  };\n};\n\nexport const changeVariableDatasource = (datasource?: DataSourceRef): ThunkResult<void> => {\n  return async (dispatch, getState) => {\n    const { editor } = getState().templating;\n    const variable = getVariable(editor.id, getState());\n\n    const loadingText = 'Ad hoc filters are applied automatically to all queries that target this data source';\n\n    dispatch(\n      changeVariableEditorExtended({\n        propName: 'infoText',\n        propValue: loadingText,\n      })\n    );\n    dispatch(changeVariableProp(toVariablePayload(variable, { propName: 'datasource', propValue: datasource })));\n\n    const ds = await getDatasourceSrv().get(datasource);\n\n    if (!ds || !ds.getTagKeys) {\n      dispatch(\n        changeVariableEditorExtended({\n          propName: 'infoText',\n          propValue: 'This data source does not support ad hoc filters yet.',\n        })\n      );\n    }\n  };\n};\n\nexport const initAdHocVariableEditor = (): ThunkResult<void> => (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    changeVariableEditorExtended({\n      propName: 'dataSources',\n      propValue: selectable,\n    })\n  );\n};\n\nconst createAdHocVariable = (options: AdHocTableOptions): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    const model = {\n      ...cloneDeep(initialAdHocVariableModelState),\n      datasource: options.datasource,\n      name: filterTableName,\n      id: filterTableName,\n    };\n\n    const global = false;\n    const index = getNewVariabelIndex(getState());\n    const identifier: VariableIdentifier = { type: 'adhoc', id: model.id };\n\n    dispatch(\n      addVariable(\n        toVariablePayload<AddVariable>(identifier, { global, model, index })\n      )\n    );\n  };\n};\n\nconst getVariableByOptions = (options: AdHocTableOptions, state: StoreState): AdHocVariableModel => {\n  return Object.values(state.templating.variables).find(\n    (v) => isAdHoc(v) && v.datasource?.uid === options.datasource.uid\n  ) as AdHocVariableModel;\n};\n","import React, { FC, ReactElement } from 'react';\nimport { Icon, SegmentAsync } from '@grafana/ui';\nimport { getDatasourceSrv } from '../../../plugins/datasource_srv';\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\n\ninterface Props {\n  datasource: DataSourceRef;\n  filterKey: string | null;\n  onChange: (item: SelectableValue<string | null>) => void;\n}\n\nconst MIN_WIDTH = 90;\nexport const AdHocFilterKey: FC<Props> = ({ datasource, onChange, filterKey }) => {\n  const loadKeys = () => fetchFilterKeys(datasource);\n  const loadKeysWithRemove = () => fetchFilterKeysWithRemove(datasource);\n\n  if (filterKey === null) {\n    return (\n      <div className=\"gf-form\" data-testid=\"AdHocFilterKey-add-key-wrapper\">\n        <SegmentAsync\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        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 (datasource: DataSourceRef): 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();\n  return metrics.map((m) => ({ label: m.text, value: m.text }));\n};\n\nconst fetchFilterKeysWithRemove = async (datasource: DataSourceRef): Promise<Array<SelectableValue<string>>> => {\n  const keys = await fetchFilterKeys(datasource);\n  return [REMOVE_VALUE, ...keys];\n};\n","import React, { FC } from 'react';\nimport { Segment } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\ninterface Props {\n  value: string;\n  onChange: (item: SelectableValue<string>) => void;\n}\n\nconst options = ['=', '!=', '<', '>', '=~', '!~'].map<SelectableValue<string>>((value) => ({\n  label: value,\n  value,\n}));\n\nexport const OperatorSegment: FC<Props> = ({ value, onChange }) => {\n  return <Segment className=\"query-segment-operator\" value={value} options={options} onChange={onChange} />;\n};\n","import React, { FC } from 'react';\nimport { SegmentAsync } from '@grafana/ui';\nimport { getDatasourceSrv } from '../../../plugins/datasource_srv';\nimport { DataSourceRef, MetricFindValue, SelectableValue } from '@grafana/data';\n\ninterface Props {\n  datasource: DataSourceRef;\n  filterKey: string;\n  filterValue?: string;\n  onChange: (item: SelectableValue<string>) => void;\n  placeHolder?: string;\n}\n\nexport const AdHocFilterValue: FC<Props> = ({ datasource, onChange, filterKey, filterValue, placeHolder }) => {\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        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';\nimport { OperatorSegment } from './OperatorSegment';\nimport { AdHocVariableFilter } from 'app/features/variables/types';\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\nimport { AdHocFilterKey } from './AdHocFilterKey';\nimport { AdHocFilterValue } from './AdHocFilterValue';\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}\n\nexport const AdHocFilterRenderer: FC<Props> = ({\n  datasource,\n  filter: { key, operator, value },\n  onKeyChange,\n  onOperatorChange,\n  onValueChange,\n  placeHolder,\n}) => {\n  return (\n    <>\n      <AdHocFilterKey datasource={datasource} filterKey={key} onChange={onKeyChange} />\n      <div className=\"gf-form\">\n        <OperatorSegment value={operator} onChange={onOperatorChange} />\n      </div>\n      <AdHocFilterValue\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';\nimport { AdHocVariableFilter } from 'app/features/variables/types';\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\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}\n\nexport const AdHocFilterBuilder: FC<Props> = ({ datasource, appendBefore, onCompleted }) => {\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((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 <AdHocFilterKey datasource={datasource} filterKey={key} onChange={onKeyChanged} />;\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      />\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';\nimport { AdHocVariableFilter } from 'app/features/variables/types';\nimport { DataSourceRef, SelectableValue } from '@grafana/data';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { ConditionSegment } from './ConditionSegment';\nimport { REMOVE_FILTER_KEY } from './AdHocFilterKey';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\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}\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 } = this.props;\n\n    return (\n      <div className=\"gf-form-inline\">\n        {this.renderFilters(filters)}\n        <AdHocFilterBuilder\n          datasource={this.props.datasource!}\n          appendBefore={filters.length > 0 ? <ConditionSegment label=\"AND\" /> : null}\n          onCompleted={this.appendFilterToVariable}\n        />\n      </div>\n    );\n  }\n\n  renderFilters(filters: AdHocVariableFilter[]) {\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));\n      return segments;\n    }, []);\n  }\n\n  renderFilterSegments(filter: AdHocVariableFilter, index: number) {\n    return (\n      <React.Fragment key={`filter-${index}`}>\n        <AdHocFilterRenderer\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        />\n      </React.Fragment>\n    );\n  }\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { DataSourceRef } from '@grafana/data';\n\nimport { AdHocVariableFilter, AdHocVariableModel, initialVariableModelState } from 'app/features/variables/types';\nimport { getInstanceState, initialVariablesState, VariablePayload, VariablesState } from '../state/types';\n\nexport interface AdHocVariabelFilterUpdate {\n  index: number;\n  filter: AdHocVariableFilter;\n}\nexport interface AdHocVariableEditorState {\n  infoText: string;\n  dataSources: Array<{ text: string; value: DataSourceRef | null }>;\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","import React, { FC, useCallback, useState } from 'react';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { VariableQueryProps } from 'app/types/plugins';\nimport { VariableTextAreaField } from './VariableTextAreaField';\nimport { useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\n\nexport const LEGACY_VARIABLE_QUERY_EDITOR_NAME = 'Grafana-LegacyVariableQueryEditor';\n\nexport const LegacyVariableQueryEditor: FC<VariableQueryProps> = ({ 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 React, { PropsWithChildren, ReactElement } from 'react';\nimport { useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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 React, { PropsWithChildren, ReactElement } from 'react';\nimport { InlineFormLabel, Select, useStyles } from '@grafana/ui';\nimport { GrafanaTheme, SelectableValue } from '@grafana/data';\nimport { css } from '@emotion/css';\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  ariaLabel?: string;\n  width?: number;\n  labelWidth?: number;\n}\n\nexport function VariableSelectField({\n  name,\n  value,\n  options,\n  tooltip,\n  onChange,\n  ariaLabel,\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 aria-label={ariaLabel}>\n        <Select\n          inputId={inputId}\n          menuShouldPortal\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 React, { FormEvent, PropsWithChildren, ReactElement, useCallback } from 'react';\nimport { InlineField, TextArea, useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\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  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}: 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      />\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';\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  ariaLabel?: string;\n  tooltip?: PopoverContent;\n  required?: boolean;\n  width?: number;\n  labelWidth?: number;\n  grow?: boolean;\n  onBlur?: (event: FormEvent<HTMLInputElement>) => void;\n}\n\nexport function VariableTextField({\n  value,\n  name,\n  placeholder,\n  onChange,\n  ariaLabel,\n  width,\n  labelWidth,\n  required,\n  onBlur,\n  tooltip,\n  grow,\n}: PropsWithChildren<VariableTextFieldProps>): ReactElement {\n  return (\n    <InlineField 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        aria-label={ariaLabel}\n        required={required}\n      />\n    </InlineField>\n  );\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { VariablePayload } from '../state/types';\n\ntype VariableEditorExtension<ExtendedProps extends {} = {}> = { [P in keyof ExtendedProps]: ExtendedProps[P] };\nexport interface VariableEditorState<ExtendedProps extends {} = {}> {\n  id: string;\n  name: string;\n  errors: Record<string, string>;\n  isValid: boolean;\n  extended: VariableEditorExtension<ExtendedProps> | 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: (\n      state: VariableEditorState,\n      action: PayloadAction<{ propName: string; propValue: any }>\n    ) => {\n      state.extended = {\n        ...state.extended,\n        [action.payload.propName]: action.payload.propValue,\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 { ScopedVars, UrlQueryMap } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { variableAdapters } from './adapters';\n\nexport function getVariablesUrlParams(scopedVars?: ScopedVars): UrlQueryMap {\n  const params: UrlQueryMap = {};\n  const variables = getTemplateSrv().getVariables();\n\n  // console.log(variables)\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';\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 {\n  AdHocVariableModel,\n  ConstantVariableModel,\n  QueryVariableModel,\n  VariableQueryEditorType,\n  VariableWithMultiSupport,\n  VariableWithOptions,\n} from './types';\nimport { VariableQueryProps } from '../../types';\nimport { LEGACY_VARIABLE_QUERY_EDITOR_NAME } from './editor/LegacyVariableQueryEditor';\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 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<VariableQueryProps> {\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 { UsagesToNetwork, VariableUsageTree } from './utils';\nimport { createSlice, PayloadAction } from '@reduxjs/toolkit';\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 { variableAdapters } from '../adapters';\nimport { DashboardModel, PanelModel } from '../../dashboard/state';\nimport { isAdHoc } from '../guard';\nimport { safeStringifyValue } from '../../../core/utils/explore';\nimport { VariableModel } from '../types';\nimport { containsVariable, variableRegex, variableRegexExec } from '../utils';\nimport { DataLinkBuiltInVars } from '@grafana/data';\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\nfunction getVariableName(expression: string) {\n  const match = variableRegexExec(expression);\n  if (!match) {\n    return null;\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 */\nexport function getAllAffectedPanelIdsForVariableChange(\n  variableId: string,\n  variables: VariableModel[],\n  panels: PanelModel[]\n): number[] {\n  const flattenedPanels = flattenPanels(panels);\n  let affectedPanelIds: number[] = getAffectedPanelIdsForVariable(variableId, flattenedPanels);\n  const affectedPanelIdsForAllVariables = getAffectedPanelIdsForVariable(\n    DataLinkBuiltInVars.includeVars,\n    flattenedPanels\n  );\n  affectedPanelIds = [...new Set([...affectedPanelIdsForAllVariables, ...affectedPanelIds])];\n\n  const dependencies = getDependenciesForVariable(variableId, variables, new Set());\n  for (const dependency of dependencies) {\n    const affectedPanelIdsForDependency = getAffectedPanelIdsForVariable(dependency, flattenedPanels);\n    affectedPanelIds = [...new Set([...affectedPanelIdsForDependency, ...affectedPanelIds])];\n  }\n\n  return affectedPanelIds;\n}\n\nexport function getDependenciesForVariable(\n  variableId: string,\n  variables: VariableModel[],\n  deps: Set<string>\n): Set<string> {\n  if (!variables.length) {\n    return deps;\n  }\n\n  for (const variable of variables) {\n    if (variable.name === variableId) {\n      continue;\n    }\n\n    const depends = variableAdapters.get(variable.type).dependsOn(variable, { name: variableId });\n    if (!depends) {\n      continue;\n    }\n\n    deps.add(variable.name);\n    deps = getDependenciesForVariable(variable.name, variables, deps);\n  }\n\n  return deps;\n}\n\nexport function getAffectedPanelIdsForVariable(variableId: string, panels: PanelModel[]): number[] {\n  if (!panels.length) {\n    return [];\n  }\n\n  const affectedPanelIds: number[] = [];\n  const repeatRegex = new RegExp(`\"repeat\":\"${variableId}\"`);\n  for (const panel of panels) {\n    const panelAsJson = safeStringifyValue(panel.getSaveModel());\n\n    // check for repeats that don't use variableRegex\n    const repeatMatches = panelAsJson.match(repeatRegex);\n    if (repeatMatches?.length) {\n      affectedPanelIds.push(panel.id);\n      continue;\n    }\n\n    const matches = panelAsJson.match(variableRegex);\n    if (!matches) {\n      continue;\n    }\n\n    for (const match of matches) {\n      const variableName = getVariableName(match);\n      if (variableName === variableId) {\n        affectedPanelIds.push(panel.id);\n        break;\n      }\n    }\n  }\n\n  return affectedPanelIds;\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","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';\nimport { VariableOption, VariableWithOptions } from '../../types';\nimport { ALL_VARIABLE_VALUE } from '../../state/types';\nimport { isMulti, isQuery } from '../../guard';\nimport { applyStateChanges } from '../../../../core/utils/applyStateChanges';\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 initialState: 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,\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 { ...initialState };\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: () => initialState,\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 { from, Observable, of } from 'rxjs';\nimport { mergeMap } from 'rxjs/operators';\nimport {\n  DataQuery,\n  DataQueryRequest,\n  DataSourceApi,\n  getDefaultTimeRange,\n  LoadingState,\n  PanelData,\n  VariableSupportType,\n} from '@grafana/data';\n\nimport { QueryVariableModel } from '../types';\nimport {\n  hasCustomVariableSupport,\n  hasDatasourceVariableSupport,\n  hasLegacyVariableSupport,\n  hasStandardVariableSupport,\n} from '../guard';\nimport { getLegacyQueryOptions } from '../utils';\nimport { TimeSrv } from '../../dashboard/services/TimeSrv';\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 { from, of, OperatorFunction } from 'rxjs';\nimport { map, mergeMap } from 'rxjs/operators';\n\nimport { QueryVariableModel } from '../types';\nimport { ThunkDispatch } from '../../../types';\nimport { toVariableIdentifier, toVariablePayload } from '../state/types';\nimport { validateVariableSelectionState } from '../state/actions';\nimport { FieldType, getFieldDisplayName, isDataFrame, MetricFindValue, PanelData } from '@grafana/data';\nimport { updateVariableOptions } from './reducer';\nimport { getTemplatedRegex } from '../utils';\nimport { getProcessedDataFrames } from 'app/features/query/state/runRequest';\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        const templatedRegex = getTemplatedRegexFunc(variable);\n        const payload = toVariablePayload(variable, { results, templatedRegex });\n        dispatch(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(toVariableIdentifier(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 { merge, Observable, of, Subject, throwError, Unsubscribable } from 'rxjs';\nimport { catchError, filter, finalize, mergeMap, take, takeUntil } from 'rxjs/operators';\nimport {\n  CoreApp,\n  DataQuery,\n  DataQueryRequest,\n  DataSourceApi,\n  getDefaultTimeRange,\n  LoadingState,\n  PanelData,\n  ScopedVars,\n} from '@grafana/data';\n\nimport { VariableIdentifier } from '../state/types';\nimport { getVariable } from '../state/selectors';\nimport { QueryVariableModel, VariableRefresh } from '../types';\nimport { StoreState, ThunkDispatch } from '../../../types';\nimport { dispatch, getState } from '../../../store/store';\nimport { getTemplatedRegex } from '../utils';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getTimeSrv } from '../../dashboard/services/TimeSrv';\nimport { QueryRunners } from './queryRunners';\nimport { runRequest } from '../../query/state/runRequest';\nimport { toMetricFindValues, updateOptionsState, validateVariableSelection } from './operators';\n\ninterface UpdateOptionsArgs {\n  identifier: VariableIdentifier;\n  datasource: DataSourceApi;\n  searchFilter?: string;\n}\n\nexport interface UpdateOptionsResults {\n  state: LoadingState;\n  identifier: VariableIdentifier;\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: VariableIdentifier }>;\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: VariableIdentifier }>();\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: VariableIdentifier): Observable<UpdateOptionsResults> {\n    return this.updateOptionsResults.asObservable().pipe(filter((result) => result.identifier === identifier));\n  }\n\n  cancelRequest(identifier: VariableIdentifier): 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 beforeUid = getState().templating.transaction.uid;\n\n      this.updateOptionsResults.next({ identifier, state: LoadingState.Loading });\n\n      const variable = getVariable<QueryVariableModel>(identifier.id, 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 afterUid = getState().templating.transaction.uid;\n\n            return beforeUid === afterUid;\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 { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { isNumber, sortBy, toLower, uniqBy } from 'lodash';\nimport { DataSourceApi, MetricFindValue, stringToJsRegex } from '@grafana/data';\n\nimport {\n  initialVariableModelState,\n  QueryVariableModel,\n  VariableOption,\n  VariableQueryEditorType,\n  VariableRefresh,\n  VariableSort,\n} from '../types';\n\nimport {\n  ALL_VARIABLE_TEXT,\n  ALL_VARIABLE_VALUE,\n  getInstanceState,\n  initialVariablesState,\n  NONE_VARIABLE_TEXT,\n  NONE_VARIABLE_VALUE,\n  VariablePayload,\n  VariablesState,\n} from '../state/types';\n\ninterface VariableOptionsUpdate {\n  templatedRegex: string;\n  results: MetricFindValue[];\n}\n\nexport interface QueryVariableEditorState {\n  VariableQueryEditor: VariableQueryEditorType;\n  dataSource: DataSourceApi | null;\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 { VariableModel } from '@grafana/data';\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: any = {};\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  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","import angular from 'angular';\nimport { castArray, isEqual } from 'lodash';\nimport {\n  DataQuery,\n  getDataSourceRef,\n  isDataSourceRef,\n  LoadingState,\n  TimeRange,\n  UrlQueryMap,\n  UrlQueryValue,\n} from '@grafana/data';\n\nimport {\n  DashboardVariableModel,\n  initialVariableModelState,\n  OrgVariableModel,\n  QueryVariableModel,\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 { AppNotification, StoreState, ThunkResult } from '../../../types';\nimport { getVariable, getVariables } from './selectors';\nimport { variableAdapters } from '../adapters';\nimport { Graph } from '../../../core/utils/dag';\nimport { notifyApp } from 'app/core/actions';\nimport {\n  addVariable,\n  changeVariableProp,\n  setCurrentVariableValue,\n  variableStateCompleted,\n  variableStateFailed,\n  variableStateFetching,\n  variableStateNotStarted,\n} from './sharedReducer';\nimport {\n  ALL_VARIABLE_TEXT,\n  ALL_VARIABLE_VALUE,\n  toVariableIdentifier,\n  toVariablePayload,\n  VariableIdentifier,\n} from './types';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getTemplateSrv, TemplateSrv } from '../../templating/template_srv';\nimport { alignCurrentWithMulti } from '../shared/multiOptions';\nimport {\n  hasCurrent,\n  hasLegacyVariableSupport,\n  hasOptions,\n  hasStandardVariableSupport,\n  isAdHoc,\n  isConstant,\n  isMulti,\n  isQuery,\n} from '../guard';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { DashboardModel } from 'app/features/dashboard/state';\nimport { createErrorNotification } from '../../../core/copy/appNotification';\nimport {\n  TransactionStatus,\n  variablesClearTransaction,\n  variablesCompleteTransaction,\n  variablesInitTransaction,\n} from './transactionReducer';\nimport { getBackendSrv } from '../../../core/services/backend_srv';\nimport { cleanVariables } from './variablesReducer';\nimport {\n  ensureStringValues,\n  ExtendedUrlQueryMap,\n  getCurrentText,\n  getVariableRefresh,\n  hasOngoingTransaction,\n} from '../utils';\nimport { store } from 'app/store/store';\nimport { getDatasourceSrv } from '../../plugins/datasource_srv';\nimport { cleanEditorState } from '../editor/reducer';\nimport { cleanPickerState } from '../pickers/OptionsPicker/reducer';\nimport { locationService } from '@grafana/runtime';\nimport { appEvents } from '../../../core/core';\nimport { getAllAffectedPanelIdsForVariableChange } from '../inspect/utils';\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 = (list: VariableModel[]): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    let orderIndex = 0;\n    for (let index = 0; index < list.length; index++) {\n      const model = fixSelectedInconsistency(list[index]);\n      if (!variableAdapters.getIfExists(model.type)) {\n        continue;\n      }\n\n      dispatch(addVariable(toVariablePayload(model, { global: false, index: orderIndex++, model })));\n    }\n\n    getTemplateSrv().updateTimeRange(getTimeSrv().timeRange());\n\n    const variables = getVariables(getState());\n    for (let index = 0; index < variables.length; index++) {\n      const variable = variables[index];\n      dispatch(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 = (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      addVariable(\n        toVariablePayload(dashboardModel, {\n          global: dashboardModel.global,\n          index: dashboardModel.index,\n          model: dashboardModel,\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      addVariable(toVariablePayload(orgModel, { global: orgModel.global, index: orgModel.index, model: orgModel }))\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      addVariable(toVariablePayload(userModel, { global: userModel.global, index: userModel.index, model: userModel }))\n    );\n  };\n};\n\nexport const changeVariableMultiValue = (identifier: VariableIdentifier, multi: boolean): ThunkResult<void> => {\n  return (dispatch, getState) => {\n    const variable = getVariable<VariableWithMultiSupport>(identifier.id, getState());\n    const current = alignCurrentWithMulti(variable.current, multi);\n\n    dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'multi', propValue: multi })));\n    dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'current', propValue: current })));\n  };\n};\n\nexport const processVariableDependencies = async (variable: VariableModel, state: StoreState) => {\n  const dependencies: VariableModel[] = [];\n\n  for (const otherVariable of getVariables(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        dependencies.push(otherVariable);\n      }\n    }\n  }\n\n  if (!isWaitingForDependencies(dependencies, state)) {\n    return;\n  }\n\n  await new Promise<void>((resolve) => {\n    const unsubscribe = store.subscribe(() => {\n      if (!isWaitingForDependencies(dependencies, store.getState())) {\n        unsubscribe();\n        resolve();\n      }\n    });\n  });\n};\n\nconst isWaitingForDependencies = (dependencies: VariableModel[], state: StoreState): boolean => {\n  if (dependencies.length === 0) {\n    return false;\n  }\n\n  const variables = getVariables(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: VariableIdentifier,\n  queryParams: UrlQueryMap\n): ThunkResult<Promise<void>> => {\n  return async (dispatch, getState) => {\n    const variable = getVariable(identifier.id, 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(toVariableIdentifier(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 = (): ThunkResult<Promise<void>> => {\n  return async (dispatch, getState) => {\n    const queryParams = locationService.getSearchObject();\n    const promises = getVariables(getState()).map(\n      async (variable: VariableModel) => await dispatch(processVariable(toVariableIdentifier(variable), queryParams))\n    );\n\n    await Promise.all(promises);\n  };\n};\n\nexport const setOptionFromUrl = (\n  identifier: VariableIdentifier,\n  urlValue: UrlQueryValue\n): ThunkResult<Promise<void>> => {\n  return async (dispatch, getState) => {\n    const stringUrlValue = ensureStringValues(urlValue);\n    const variable = getVariable(identifier.id, getState());\n    if (getVariableRefresh(variable) !== VariableRefresh.never) {\n      // updates options\n      await dispatch(updateOptions(toVariableIdentifier(variable)));\n    }\n\n    // get variable from state\n    const variableFromState = getVariable<VariableWithOptions>(variable.id, 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: VariableIdentifier,\n  defaultValue?: string\n): ThunkResult<Promise<void>> => {\n  return (dispatch, getState) => {\n    const variableInState = getVariable<VariableWithOptions>(identifier.id, 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: VariableIdentifier,\n  current: VariableOption,\n  emitChanges: boolean\n): ThunkResult<Promise<void>> => {\n  return async (dispatch) => {\n    dispatch(setCurrentVariableValue(toVariablePayload(identifier, { option: current })));\n    return await dispatch(variableUpdated(identifier, emitChanges));\n  };\n};\n\nconst 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: VariableIdentifier,\n  emitChangeEvents: boolean,\n  events: typeof appEvents = appEvents\n): ThunkResult<Promise<void>> => {\n  return async (dispatch, getState) => {\n    const state = getState();\n    const variableInState = getVariable(identifier.id, state);\n\n    // if we're initializing variables ignore cascading update because we are in a boot up scenario\n    if (state.templating.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(toVariableIdentifier(variableInState)));\n        dispatch(completeVariableLoading(identifier));\n      }\n      return Promise.resolve();\n    }\n\n    const variables = getVariables(state);\n    const g = createGraph(variables);\n    const panels = state.dashboard?.getModel()?.panels ?? [];\n    const event: VariablesChangedEvent = isAdHoc(variableInState)\n      ? { refreshAll: true, panelIds: [] } // for adhoc variables we don't know which panels that will be impacted\n      : { refreshAll: false, panelIds: getAllAffectedPanelIdsForVariableChange(variableInState.id, variables, panels) };\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(toVariableIdentifier(variable)));\n      });\n    }\n\n    return Promise.all(promises).then(() => {\n      if (emitChangeEvents) {\n        events.publish(new VariablesChanged(event));\n        locationService.partial(getQueryWithVariables(getState));\n      }\n    });\n  };\n};\n\nexport interface OnTimeRangeUpdatedDependencies {\n  templateSrv: TemplateSrv;\n  events: typeof appEvents;\n}\n\nexport const onTimeRangeUpdated = (\n  timeRange: TimeRange,\n  dependencies: OnTimeRangeUpdatedDependencies = { templateSrv: getTemplateSrv(), events: appEvents }\n): ThunkResult<Promise<void>> => async (dispatch, getState) => {\n  dependencies.templateSrv.updateTimeRange(timeRange);\n  const variablesThatNeedRefresh = getVariables(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: VariableWithOptions) =>\n    dispatch(timeRangeUpdated(toVariableIdentifier(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 = (identifier: VariableIdentifier): ThunkResult<Promise<void>> => async (dispatch, getState) => {\n  const variableInState = getVariable<VariableWithOptions>(identifier.id);\n  const previousOptions = variableInState.options.slice();\n\n  await dispatch(updateOptions(toVariableIdentifier(variableInState), true));\n\n  const updatedVariable = getVariable<VariableWithOptions>(identifier.id, getState());\n  const updatedOptions = updatedVariable.options;\n\n  if (angular.toJson(previousOptions) !== angular.toJson(updatedOptions)) {\n    const dashboard = getState().dashboard.getModel();\n    dashboard?.templateVariableValueUpdated();\n  }\n};\n\nexport const templateVarsChangedInUrl = (\n  vars: ExtendedUrlQueryMap,\n  events: typeof appEvents = appEvents\n): ThunkResult<void> => async (dispatch, getState) => {\n  const update: Array<Promise<any>> = [];\n  const dashboard = getState().dashboard.getModel();\n  for (const variable of getVariables(getState())) {\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  if (update.length) {\n    await Promise.all(update);\n    events.publish(new VariablesChangedInUrl({ panelIds: [], refreshAll: true }));\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 = (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 getVariables(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 = (dashboardUid: string, dashboard: DashboardModel): ThunkResult<void> => async (\n  dispatch,\n  getState\n) => {\n  try {\n    const transactionState = getState().templating.transaction;\n    if (transactionState.status === TransactionStatus.Fetching) {\n      // previous dashboard is still fetching variables, cancel all requests\n      dispatch(cancelVariables());\n    }\n\n    // Start init transaction\n    dispatch(variablesInitTransaction({ uid: dashboardUid }));\n    // Add system variables like __dashboard and __user\n    dispatch(addSystemTemplateVariables(dashboard));\n    // Load all variables into redux store\n    dispatch(initDashboardTemplating(dashboard.templating.list));\n    // Migrate data source name to ref\n    dispatch(migrateVariablesDatasourceNameToRef());\n    // Process all variable updates\n    await dispatch(processVariables());\n    // Mark update as complete\n    dispatch(variablesCompleteTransaction({ uid: dashboardUid }));\n  } catch (err) {\n    dispatch(notifyApp(createVariableErrorNotification('Templating init failed', err)));\n    console.error(err);\n  }\n};\n\nexport function migrateVariablesDatasourceNameToRef(\n  getDatasourceSrvFunc: typeof getDatasourceSrv = getDatasourceSrv\n): ThunkResult<void> {\n  return function (dispatch, getState) {\n    const variables = getVariables(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 ? { uid: nameOrRef } : getDataSourceRef(ds);\n      dispatch(changeVariableProp(toVariablePayload(variable, { propName: 'datasource', propValue: dsRef })));\n    }\n  };\n}\n\nexport const cleanUpVariables = (): ThunkResult<void> => (dispatch) => {\n  dispatch(cleanVariables());\n  dispatch(cleanEditorState());\n  dispatch(cleanPickerState());\n  dispatch(variablesClearTransaction());\n};\n\ntype CancelVariablesDependencies = { getBackendSrv: typeof getBackendSrv };\nexport const cancelVariables = (\n  dependencies: CancelVariablesDependencies = { getBackendSrv: getBackendSrv }\n): ThunkResult<void> => (dispatch) => {\n  dependencies.getBackendSrv().cancelAllInFlightRequests();\n  dispatch(cleanUpVariables());\n};\n\nexport const updateOptions = (identifier: VariableIdentifier, rethrow = false): ThunkResult<Promise<void>> => async (\n  dispatch,\n  getState\n) => {\n  try {\n    if (!hasOngoingTransaction(getState())) {\n      // we might have cancelled a batch so then variable state is removed\n      return;\n    }\n\n    const variableInState = getVariable(identifier.id, getState());\n    dispatch(variableStateFetching(toVariablePayload(variableInState)));\n    await dispatch(upgradeLegacyQueries(toVariableIdentifier(variableInState)));\n    await variableAdapters.get(variableInState.type).updateOptions(variableInState);\n    dispatch(completeVariableLoading(identifier));\n  } catch (error) {\n    dispatch(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?: VariableIdentifier\n): AppNotification =>\n  createErrorNotification(\n    `${identifier ? `Templating [${identifier.id}]` : 'Templating'}`,\n    `${message} ${error.message}`\n  );\n\nexport const completeVariableLoading = (identifier: VariableIdentifier): ThunkResult<void> => (dispatch, getState) => {\n  if (!hasOngoingTransaction(getState())) {\n    // we might have cancelled a batch so then variable state is removed\n    return;\n  }\n\n  const variableInState = getVariable(identifier.id, getState());\n\n  if (variableInState.state !== LoadingState.Done) {\n    dispatch(variableStateCompleted(toVariablePayload(variableInState)));\n  }\n};\n\nexport function upgradeLegacyQueries(\n  identifier: VariableIdentifier,\n  getDatasourceSrvFunc: typeof getDatasourceSrv = getDatasourceSrv\n): ThunkResult<void> {\n  return async function (dispatch, getState) {\n    if (!hasOngoingTransaction(getState())) {\n      // we might have cancelled a batch so then variable state is removed\n      return;\n    }\n\n    const variable = getVariable<QueryVariableModel>(identifier.id, 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}-${identifier.id}-Variable-Query`,\n        query: variable.query,\n      };\n\n      dispatch(changeVariableProp(toVariablePayload(identifier, { propName: 'query', propValue: query })));\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 { StoreState } from '../../../types';\nimport { VariableModel } from '../types';\nimport { getState } from '../../../store/store';\nimport memoizeOne from 'memoize-one';\n\nexport const getVariable = <T extends VariableModel = VariableModel>(\n  id: string,\n  state: StoreState = getState(),\n  throwWhenMissing = true\n): T => {\n  if (!state.templating.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 state.templating.variables[id] as T;\n};\n\nexport const getFilteredVariables = (filter: (model: VariableModel) => boolean, state: StoreState = getState()) => {\n  return Object.values(state.templating.variables)\n    .filter(filter)\n    .sort((s1, s2) => s1.index - s2.index);\n};\n\nexport const getVariableWithName = (name: string, state: StoreState = getState()) => {\n  return getVariable(name, state, false);\n};\n\nexport const getVariables = (state: StoreState = getState()): VariableModel[] => {\n  const filter = (variable: VariableModel) => {\n    return variable.type !== 'system';\n  };\n\n  return getFilteredVariables(filter, state);\n};\n\nexport const getSubMenuVariables = memoizeOne((variables: Record<string, VariableModel>): VariableModel[] => {\n  return getVariables(getState());\n});\n\nexport const getEditorVariables = (state: StoreState): VariableModel[] => {\n  return getVariables(state);\n};\n\nexport type GetVariables = typeof getVariables;\n\nexport const getNewVariabelIndex = (state: StoreState = getState()): number => {\n  return Object.values(state.templating.variables).length;\n};\n\nexport function getVariablesIsDirty(state: StoreState = getState()): boolean {\n  return state.templating.transaction.isDirty;\n}\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { cloneDeep, defaults as lodashDefaults } from 'lodash';\nimport { LoadingState, VariableType } from '@grafana/data';\nimport { VariableModel, VariableOption, VariableWithOptions } from '../types';\nimport { AddVariable, getInstanceState, initialVariablesState, VariablePayload, VariablesState } from './types';\nimport { variableAdapters } from '../adapters';\nimport { changeVariableNameSucceeded } from '../editor/reducer';\nimport { ensureStringValues } from '../utils';\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 = Object.keys(state).length;\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 variables = Object.values(state).map((s) => s);\n      const fromVariable = variables.find((v) => v.index === action.payload.data.fromIndex);\n      const toVariable = variables.find((v) => v.index === action.payload.data.toIndex);\n\n      if (fromVariable) {\n        state[fromVariable.id].index = action.payload.data.toIndex;\n      }\n\n      if (toVariable) {\n        state[toVariable.id].index = action.payload.data.fromIndex;\n      }\n    },\n    changeVariableType: (state: VariablesState, action: PayloadAction<VariablePayload<{ newType: VariableType }>>) => {\n      const { id } = action.payload;\n      const { label, name, index, description } = state[id];\n\n      state[id] = {\n        ...cloneDeep(variableAdapters.get(action.payload.data.newType).initialState),\n        id: id,\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        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';\nimport {\n  addVariable,\n  changeVariableOrder,\n  changeVariableProp,\n  changeVariableType,\n  duplicateVariable,\n  removeVariable,\n} from './sharedReducer';\n\nexport enum TransactionStatus {\n  NotStarted = 'Not started',\n  Fetching = 'Fetching',\n  Completed = 'Completed',\n}\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.type,\n    addVariable.type,\n    changeVariableProp.type,\n    changeVariableOrder.type,\n    duplicateVariable.type,\n    changeVariableType.type,\n  ].includes(action.type);\n}\n\nexport const {\n  variablesInitTransaction,\n  variablesClearTransaction,\n  variablesCompleteTransaction,\n} = transactionSlice.actions;\n\nexport const transactionReducer = transactionSlice.reducer;\n","import { VariableModel } from '../types';\nimport { VariableType } from '@grafana/data';\n\nexport 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\nexport interface VariablesState extends Record<string, VariableModel> {}\n\nexport const initialVariablesState: VariablesState = {};\n\nexport const getInstanceState = <Model extends VariableModel = VariableModel>(state: VariablesState, id: string) => {\n  return state[id] as Model;\n};\n\nexport interface VariableIdentifier {\n  type: VariableType;\n  id: 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\nexport const toVariableIdentifier = (variable: VariableModel): VariableIdentifier => {\n  return { type: variable.type, id: variable.id };\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 { createAction } from '@reduxjs/toolkit';\nimport { variableAdapters } from '../adapters';\nimport { sharedReducer } from './sharedReducer';\nimport { VariableModel } from '../types';\nimport { AnyAction } from 'redux';\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';\nimport {\n  BusEventWithPayload,\n  DataQuery,\n  DataSourceJsonData,\n  DataSourceRef,\n  LoadingState,\n  QueryEditorProps,\n  VariableModel as BaseVariableModel,\n  VariableType,\n} from '@grafana/data';\n\nimport { NEW_VARIABLE_ID } from './state/types';\nimport { VariableQueryProps } from '../../types';\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  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  name: '',\n  label: null,\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 type VariableQueryEditorType<\n  TQuery extends DataQuery = DataQuery,\n  TOptions extends DataSourceJsonData = DataSourceJsonData\n> = ComponentType<VariableQueryProps> | 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';\nimport { ScopedVars, UrlQueryMap, UrlQueryValue, VariableType } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from './state/types';\nimport { QueryVariableModel, VariableModel, VariableRefresh } from './types';\nimport { getTimeSrv } from '../dashboard/services/TimeSrv';\nimport { variableAdapters } from './adapters';\nimport { safeStringifyValue } from 'app/core/utils/explore';\nimport { StoreState } from '../../types';\nimport { getState } from '../../store/store';\nimport { TransactionStatus } from './state/transactionReducer';\n\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * \\$(\\w+)                          $var1\n * \\[\\[([\\s\\S]+?)(?::(\\w+))?\\]\\]    [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?::(\\w+))?}             ${var3} or ${var3:fmt3}\n */\nexport const variableRegex = /\\$(\\w+)|\\[\\[([\\s\\S]+?)(?::(\\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 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(state: StoreState = getState()): boolean {\n  return state.templating.transaction.status !== TransactionStatus.NotStarted;\n}\n","import { PreloadPlugin } from '@grafana/data';\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 { attachDebugger, createLogger } from '@grafana/ui';\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';\nimport { contextSrv } from '../context_srv';\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 { getEchoSrv, EchoEventType } from '@grafana/runtime';\nimport { captureException } from '@sentry/browser';\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';\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 React, { useCallback } from 'react';\nimport { LegacyForms, Select, StatsPicker } from '@grafana/ui';\nimport {\n  DataTransformerID,\n  ReducerID,\n  SelectableValue,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\n\nimport { ReduceTransformerMode, ReduceTransformerOptions } from '@grafana/data/src/transformations/transformers/reduce';\nimport { selectors } from '@grafana/e2e-selectors';\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            menuShouldPortal\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 React from 'react';\nimport {\n  DataTransformerID,\n  KeyValue,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n  getFieldDisplayName,\n  stringToJsRegex,\n} from '@grafana/data';\nimport { Field, Input, FilterPill, HorizontalGroup } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { FilterFieldsByNameTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByName';\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';\nimport {\n  DataTransformerID,\n  KeyValue,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { HorizontalGroup, FilterPill } from '@grafana/ui';\n\nimport { FilterFramesByRefIdTransformerOptions } from '@grafana/data/src/transformations/transformers/filterByRefId';\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  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 { Field, FieldType } from '@grafana/data';\nimport { isString, isUndefined } from 'lodash';\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';\nimport { Input } from '@grafana/ui';\nimport { ValueMatcherID, BasicValueMatcherOptions } from '@grafana/data';\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 { ValueMatcherID } from '@grafana/data';\nimport React from 'react';\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';\nimport { Input } from '@grafana/ui';\nimport { ValueMatcherID, RangeValueMatcherOptions } from '@grafana/data';\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 ({ 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';\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';\nimport { Button, Select } from '@grafana/ui';\nimport { Field, SelectableValue, valueMatchers } from '@grafana/data';\nimport { FilterByValueFilter } from '@grafana/data/src/transformations/transformers/filterByValue';\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          menuShouldPortal\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          menuShouldPortal\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 React, { useMemo, useCallback } from 'react';\nimport { css } from '@emotion/css';\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 { Button, RadioButtonGroup, stylesFactory } from '@grafana/ui';\nimport { cloneDeep } from 'lodash';\nimport {\n  FilterByValueFilter,\n  FilterByValueMatch,\n  FilterByValueTransformerOptions,\n  FilterByValueType,\n} from '@grafana/data/src/transformations/transformers/filterByValue';\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 { DataFrame, getFieldDisplayName } from '@grafana/data';\nimport { useMemo } from 'react';\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","import React, { useCallback, useMemo } from 'react';\nimport { css } from '@emotion/css';\nimport { DragDropContext, Draggable, Droppable, DropResult } from 'react-beautiful-dnd';\nimport {\n  DataTransformerID,\n  GrafanaTheme,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { stylesFactory, useTheme, Input, IconButton, Icon, FieldValidationMessage } from '@grafana/ui';\n\nimport { OrganizeFieldsTransformerOptions } from '@grafana/data/src/transformations/transformers/organize';\nimport { createOrderFieldsComparer } from '@grafana/data/src/transformations/transformers/order';\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\n          className=\"gf-form-inline\"\n          ref={provided.innerRef}\n          {...provided.draggableProps}\n          {...provided.dragHandleProps}\n        >\n          <div className=\"gf-form gf-form--grow\">\n            <div className=\"gf-form-label gf-form-label--justify-left width-30\">\n              <Icon name=\"draggabledots\" title=\"Drag and drop to reorder\" size=\"lg\" className={styles.draggable} />\n              <IconButton\n                className={styles.toggle}\n                size=\"md\"\n                name={visible ? 'eye' : 'eye-slash'}\n                surface=\"header\"\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';\nimport {\n  DataTransformerID,\n  SelectableValue,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { Select } from '@grafana/ui';\n\nimport { SeriesToColumnsOptions } from '@grafana/data/src/transformations/transformers/seriesToColumns';\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 menuShouldPortal 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, { ChangeEvent } from 'react';\nimport { of, OperatorFunction } from 'rxjs';\nimport { map } from 'rxjs/operators';\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 { FilterPill, HorizontalGroup, Input, LegacyForms, Select, StatsPicker } from '@grafana/ui';\nimport {\n  BinaryOptions,\n  CalculateFieldMode,\n  CalculateFieldTransformerOptions,\n  getNameFromOptions,\n  ReduceOptions,\n} from '@grafana/data/src/transformations/transformers/calculateField';\n\nimport { defaults } from 'lodash';\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            menuShouldPortal\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            menuShouldPortal\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            menuShouldPortal\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              menuShouldPortal\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, { useMemo } from 'react';\nimport {\n  DataTransformerID,\n  SelectableValue,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { InlineField, InlineFieldRow, RadioButtonGroup, Select, FilterPill } from '@grafana/ui';\n\nimport {\n  LabelsToFieldsMode,\n  LabelsToFieldsOptions,\n} from '@grafana/data/src/transformations/transformers/labelsToFields';\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          <>\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          </>\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              menuShouldPortal\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, { useCallback } from 'react';\nimport { css, cx } from '@emotion/css';\nimport {\n  DataTransformerID,\n  ReducerID,\n  SelectableValue,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { Select, StatsPicker, stylesFactory } from '@grafana/ui';\n\nimport {\n  GroupByFieldOptions,\n  GroupByOperationID,\n  GroupByTransformerOptions,\n} from '@grafana/data/src/transformations/transformers/groupBy';\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            menuShouldPortal\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';\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { InlineField, InlineSwitch, InlineFieldRow, Select } from '@grafana/ui';\nimport { SortByField, SortByTransformerOptions } from '@grafana/data/src/transformations/transformers/sortBy';\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                menuShouldPortal\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 React from 'react';\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { MergeTransformerOptions } from '../../../../../packages/grafana-data/src/transformations/transformers/merge';\nimport { FieldValidationMessage } from '@grafana/ui';\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 React from 'react';\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, { ChangeEvent } from 'react';\nimport {\n  DataTransformerID,\n  SelectableValue,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { Input, Select } from '@grafana/ui';\nimport {\n  ConcatenateFrameNameMode,\n  ConcatenateTransformerOptions,\n} from '@grafana/data/src/transformations/transformers/concat';\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              menuShouldPortal\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 from 'react';\nimport {\n  DataTransformerID,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n  stringToJsRegex,\n} from '@grafana/data';\nimport { Field, Input } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { RenameByRegexTransformerOptions } from '@grafana/data/src/transformations/transformers/renameByRegex';\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, { FormEvent, useCallback } from 'react';\nimport { DataTransformerID, standardTransformers, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\n\nimport {\n  HistogramTransformerOptions,\n  histogramFieldInfo,\n} from '@grafana/data/src/transformations/transformers/histogram';\nimport { InlineField, InlineFieldRow, InlineSwitch, Input } from '@grafana/ui';\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    (evt: FormEvent<HTMLInputElement>) => {\n      const val = evt.currentTarget.valueAsNumber;\n      onChange({\n        ...options,\n        bucketSize: isNaN(val) ? undefined : val,\n      });\n    },\n    [onChange, options]\n  );\n\n  const onBucketOffsetChanged = useCallback(\n    (evt: FormEvent<HTMLInputElement>) => {\n      const val = evt.currentTarget.valueAsNumber;\n      onChange({\n        ...options,\n        bucketOffset: isNaN(val) ? undefined : 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          <Input type=\"number\" 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          <Input\n            type=\"number\"\n            value={options.bucketOffset}\n            placeholder=\"none\"\n            onChange={onBucketOffsetChanged}\n            min={0}\n          />\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 {\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';\nimport { isArray } from 'lodash';\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 { map } from 'rxjs/operators';\nimport {\n  ArrayVector,\n  DataFrame,\n  DataTransformerID,\n  DataTransformerInfo,\n  Field,\n  getFieldDisplayName,\n  Labels,\n} from '@grafana/data';\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';\nimport { DataFrame, getFieldDisplayName, GrafanaTheme2, ReducerID, SelectableValue } from '@grafana/data';\nimport { Select, StatsPicker, useStyles2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport {\n  configMapHandlers,\n  evaluteFieldMappings,\n  FieldToConfigMapHandler,\n  FieldToConfigMapping,\n  lookUpConfigHandler as findConfigHandlerFor,\n} from '../fieldToConfigMapping/fieldToConfigMapping';\nimport { capitalize } from 'lodash';\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                menuShouldPortal\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 React from 'react';\nimport { PluginState, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { rowsToFieldsTransformer, RowToFieldsTransformOptions } from './rowsToFields';\nimport { FieldToConfigMappingEditor } from '../fieldToConfigMapping/FieldToConfigMappingEditor';\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 { map } from 'rxjs/operators';\nimport {\n  ArrayVector,\n  DataFrame,\n  DataTransformerID,\n  DataTransformerInfo,\n  FieldMatcherID,\n  getFieldDisplayName,\n  getFieldMatcher,\n  MatcherConfig,\n  reduceField,\n} from '@grafana/data';\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 React from 'react';\nimport {\n  FieldMatcherID,\n  GrafanaTheme2,\n  PluginState,\n  SelectableValue,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\nimport { configFromDataTransformer, ConfigFromQueryTransformOptions } from './configFromQuery';\nimport { fieldMatchersUI, InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';\nimport { FieldToConfigMappingEditor } from '../fieldToConfigMapping/FieldToConfigMappingEditor';\nimport { css } from '@emotion/css';\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 menuShouldPortal onChange={onRefIdChange} options={refIds} value={currentRefId} width={30} />\n        </InlineField>\n      </InlineFieldRow>\n      <InlineFieldRow>\n        <InlineField label=\"Apply to\" labelWidth={20}>\n          <Select menuShouldPortal 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 {\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';\nimport { map } from 'rxjs/operators';\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        enforceSort: true,\n        keepOriginIndices: true,\n      });\n      return frame ? [frame] : [];\n    };\n  },\n};\n","import React, { useCallback } from 'react';\nimport { GrafanaTheme2, SelectableValue, TransformerRegistryItem, TransformerUIProps } from '@grafana/data';\nimport { prepareTimeSeriesTransformer, PrepareTimeSeriesOptions, timeSeriesFormat } from './prepareTimeSeries';\nimport { InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\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            menuShouldPortal\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 React, { ChangeEvent, useCallback } from 'react';\nimport {\n  DataTransformerID,\n  FieldNamePickerConfigSettings,\n  FieldType,\n  SelectableValue,\n  StandardEditorsRegistryItem,\n  standardTransformers,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\n\nimport { ConvertFieldTypeTransformerOptions } from '@grafana/data/src/transformations/transformers/convertFieldType';\nimport { Button, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';\nimport { FieldNamePicker } from '../../../../../packages/grafana-ui/src/components/MatchersUI/FieldNamePicker';\nimport { ConvertFieldTypeOptions } from '../../../../../packages/grafana-data/src/transformations/transformers/convertFieldType';\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  ];\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                menuShouldPortal\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 {\n  ArrayVector,\n  DataFrame,\n  DataTransformerID,\n  Field,\n  FieldMatcher,\n  FieldMatcherID,\n  fieldMatchers,\n  FieldType,\n  DataTransformerInfo,\n} from '@grafana/data';\nimport { COUNTRIES_GAZETTEER_PATH, Gazetteer, getGazetteer } from 'app/plugins/panel/geomap/gazetteer/gazetteer';\nimport { mergeMap, from } from 'rxjs';\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  return addFieldsFromGazetteer(frames, gaz, fieldMatches);\n}\n\nexport function addFieldsFromGazetteer(frames: DataFrame[], gaz: Gazetteer, matcher: FieldMatcher): DataFrame[] {\n  return frames.map((frame) => {\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 lat = new Array<Number>(values.length);\n        const lon = new Array<Number>(values.length);\n\n        //for each value find the corresponding value in the gazetteer\n        for (let v = 0; v < values.length; v++) {\n          const foundMatchingValue = gaz.find(values[v]);\n\n          //for now start by adding lat and lon\n          if (foundMatchingValue && foundMatchingValue?.coords.length) {\n            lon[v] = foundMatchingValue.coords[0];\n            lat[v] = foundMatchingValue.coords[1];\n          }\n        }\n        fields.push({ name: 'lon', type: FieldType.number, values: new ArrayVector(lon), config: {} });\n        fields.push({ name: 'lat', type: FieldType.number, values: new ArrayVector(lat), config: {} });\n      }\n    }\n    return {\n      ...frame,\n      fields,\n    };\n  });\n}\n","import React, { useCallback } from 'react';\nimport {\n  DataTransformerID,\n  FieldNamePickerConfigSettings,\n  PluginState,\n  StandardEditorsRegistryItem,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\n\nimport { InlineField, InlineFieldRow } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\nimport { GazetteerPathEditor } from 'app/plugins/panel/geomap/editor/GazetteerPathEditor';\nimport { GazetteerPathEditorConfigSettings } from 'app/plugins/panel/geomap/types';\nimport { FieldLookupOptions, fieldLookupTransformer } from './fieldLookup';\nimport { FieldType } from '../../../../../../packages/grafana-data/src';\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 { 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\n// strips quotes and leading/trailing braces in prom labels\nconst stripDecor = /['\"]|^\\{|\\}$/g;\n// splits on whitespace and other label pair delimiters\nconst splitLines = /[\\s,;&]+/g;\n// splits kv pairs\nconst splitPair = /[=:]/g;\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: (v: string) => {\n    const obj: Record<string, any> = {};\n\n    v.trim()\n      .replace(stripDecor, '')\n      .split(splitLines)\n      .forEach((pair) => {\n        let [k, v] = pair.split(splitPair);\n\n        if (k != null) {\n          obj[k] = v;\n        }\n      });\n\n    return obj;\n  },\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 {\n  ArrayVector,\n  DataFrame,\n  DataTransformerID,\n  Field,\n  FieldType,\n  getFieldTypeFromValue,\n  SynchronousDataTransformerInfo,\n} from '@grafana/data';\nimport { findField } from 'app/features/dimensions';\nimport { isString } from 'lodash';\nimport { map } from 'rxjs/operators';\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    throw new Error('json field not found');\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';\nimport {\n  DataTransformerID,\n  FieldNamePickerConfigSettings,\n  PluginState,\n  SelectableValue,\n  StandardEditorsRegistryItem,\n  TransformerRegistryItem,\n  TransformerUIProps,\n} from '@grafana/data';\n\nimport { InlineField, InlineFieldRow, InlineSwitch, Select } from '@grafana/ui';\nimport { FieldNamePicker } from '@grafana/ui/src/components/MatchersUI/FieldNamePicker';\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  state: PluginState.alpha,\n};\n","import { TransformerRegistryItem } from '@grafana/data';\nimport { reduceTransformRegistryItem } from '../components/TransformersUI/ReduceTransformerEditor';\nimport { filterFieldsByNameTransformRegistryItem } from '../components/TransformersUI/FilterByNameTransformerEditor';\nimport { filterFramesByRefIdTransformRegistryItem } from '../components/TransformersUI/FilterByRefIdTransformerEditor';\nimport { filterByValueTransformRegistryItem } from '../components/TransformersUI/FilterByValueTransformer/FilterByValueTransformerEditor';\nimport { organizeFieldsTransformRegistryItem } from '../components/TransformersUI/OrganizeFieldsTransformerEditor';\nimport { seriesToFieldsTransformerRegistryItem } from '../components/TransformersUI/SeriesToFieldsTransformerEditor';\nimport { calculateFieldTransformRegistryItem } from '../components/TransformersUI/CalculateFieldTransformerEditor';\nimport { labelsToFieldsTransformerRegistryItem } from '../components/TransformersUI/LabelsToFieldsTransformerEditor';\nimport { groupByTransformRegistryItem } from '../components/TransformersUI/GroupByTransformerEditor';\nimport { sortByTransformRegistryItem } from '../components/TransformersUI/SortByTransformerEditor';\nimport { mergeTransformerRegistryItem } from '../components/TransformersUI/MergeTransformerEditor';\nimport { seriesToRowsTransformerRegistryItem } from '../components/TransformersUI/SeriesToRowsTransformerEditor';\nimport { concatenateTransformRegistryItem } from '../components/TransformersUI/ConcatenateTransformerEditor';\nimport { renameByRegexTransformRegistryItem } from '../components/TransformersUI/RenameByRegexTransformer';\nimport { histogramTransformRegistryItem } from '../components/TransformersUI/HistogramTransformerEditor';\nimport { rowsToFieldsTransformRegistryItem } from '../components/TransformersUI/rowsToFields/RowsToFieldsTransformerEditor';\nimport { configFromQueryTransformRegistryItem } from '../components/TransformersUI/configFromQuery/ConfigFromQueryTransformerEditor';\nimport { prepareTimeseriesTransformerRegistryItem } from '../components/TransformersUI/prepareTimeSeries/PrepareTimeSeriesEditor';\nimport { convertFieldTypeTransformRegistryItem } from '../components/TransformersUI/ConvertFieldTypeTransformerEditor';\nimport { fieldLookupTransformRegistryItem } from '../components/TransformersUI/lookupGazetteer/FieldLookupTransformerEditor';\nimport { extractFieldsTransformRegistryItem } from '../components/TransformersUI/extractFields/ExtractFieldsTransformerEditor';\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    fieldLookupTransformRegistryItem,\n    extractFieldsTransformRegistryItem,\n  ];\n};\n","import { Event, Severity } from '@sentry/browser';\nimport { logger, parseRetryAfterHeader, PromiseBuffer, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\nimport { Response, Status } from '@sentry/types';\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\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 = new PromiseBuffer(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: 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    if (!this._buffer.isReady()) {\n      const reason = `Dropping frontend log event due to too many requests in flight.`;\n      console.warn(reason);\n      return Promise.resolve({\n        event,\n        reason,\n        status: Status.Skipped,\n      });\n    }\n\n    return this._buffer.add(\n      () =>\n        new SyncPromise<Response>((resolve, reject) => {\n          window\n            .fetch(sentryReq.url, options)\n            .then((response) => {\n              const status = Status.fromHttpCode(response.status);\n\n              if (status === Status.Success) {\n                resolve({ status });\n                return;\n              }\n\n              if (status === Status.RateLimit) {\n                const now = Date.now();\n                const retryAfterHeader = response.headers.get('Retry-After');\n                this._disabledUntil = new Date(now + parseRetryAfterHeader(now, retryAfterHeader));\n                logger.warn(`Too many requests, backing off till: ${this._disabledUntil}`);\n              }\n\n              reject(response);\n            })\n            .catch(reject);\n        })\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 { getEchoSrv, EchoEventType } from '@grafana/runtime';\nimport { BaseTransport } from '@sentry/browser/dist/transports';\nimport { Event } from '@sentry/browser';\nimport { Status } from '@sentry/types';\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: Status.Success, event });\n  }\n}\n","import { EchoBackend, EchoEventType } from '@grafana/runtime';\nimport { SentryConfig } from '@grafana/data/src/types/config';\nimport { BrowserOptions, init as initSentry, setUser as sentrySetUser } from '@sentry/browser';\nimport { FetchTransport } from '@sentry/browser/dist/transports';\nimport { CustomEndpointTransport } from './transports/CustomEndpointTransport';\nimport { EchoSrvTransport } from './transports/EchoSrvTransport';\nimport { BuildInfo } from '@grafana/data';\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 }));\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 { navIndexReducer as navIndex } from './navModel';\nimport { appNotificationsReducer as appNotifications } from './appNotification';\n\nexport default {\n  navIndex,\n  appNotifications,\n};\n","import { combineReducers } from '@reduxjs/toolkit';\nimport { optionsPickerReducer } from '../pickers/OptionsPicker/reducer';\nimport { variableEditorReducer } from '../editor/reducer';\nimport { variablesReducer } from './variablesReducer';\nimport { transactionReducer } from './transactionReducer';\nimport { variableInspectReducer } from '../inspect/reducer';\n\nexport const templatingReducers = combineReducers({\n  editor: variableEditorReducer,\n  variables: variablesReducer,\n  optionsPicker: optionsPickerReducer,\n  transaction: transactionReducer,\n  inspect: variableInspectReducer,\n});\n\nexport type TemplatingState = ReturnType<typeof templatingReducers>;\n\nexport default {\n  templating: templatingReducers,\n};\n","import { AnyAction, combineReducers } from 'redux';\nimport { CleanUp, cleanUpAction } from '../actions/cleanUp';\nimport sharedReducers from 'app/core/reducers';\nimport alertingReducers from 'app/features/alerting/state/reducers';\nimport teamsReducers from 'app/features/teams/state/reducers';\nimport apiKeysReducers from 'app/features/api-keys/state/reducers';\nimport foldersReducers from 'app/features/folders/state/reducers';\nimport dashboardReducers from 'app/features/dashboard/state/reducers';\nimport exploreReducers from 'app/features/explore/state/main';\nimport { reducer as pluginsReducer } from 'app/features/plugins/admin/state/reducer';\nimport dataSourcesReducers from 'app/features/datasources/state/reducers';\nimport usersReducers from 'app/features/users/state/reducers';\nimport userReducers from 'app/features/profile/state/reducers';\nimport organizationReducers from 'app/features/org/state/reducers';\nimport ldapReducers from 'app/features/admin/state/reducers';\nimport templatingReducers from 'app/features/variables/state/reducers';\nimport importDashboardReducers from 'app/features/manage-dashboards/state/reducers';\nimport panelEditorReducers from 'app/features/dashboard/components/PanelEditor/state/reducers';\nimport panelsReducers from 'app/features/panel/state/reducers';\n\nconst rootReducers = {\n  ...sharedReducers,\n  ...alertingReducers,\n  ...teamsReducers,\n  ...apiKeysReducers,\n  ...foldersReducers,\n  ...dashboardReducers,\n  ...exploreReducers,\n  ...dataSourcesReducers,\n  ...usersReducers,\n  ...userReducers,\n  ...organizationReducers,\n  ...ldapReducers,\n  ...templatingReducers,\n  ...importDashboardReducers,\n  ...panelEditorReducers,\n  ...panelsReducers,\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 React, { FC } from 'react';\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';\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';\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';\nimport { LdapPermissions } from 'app/types';\nimport { Icon } from '@grafana/ui';\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';\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 && (\n                    <>\n                      <td>{group.groupDN}</td>\n                      {!group.orgRole && (\n                        <>\n                          <td />\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                      )}\n                    </>\n                  )}\n                  {group.orgName && (\n                    <>\n                      <td>{group.orgName}</td>\n                      <td>{group.orgRole}</td>\n                    </>\n                  )}\n                </tr>\n              );\n            })}\n          </tbody>\n        </table>\n      </div>\n    </div>\n  );\n};\n","import React, { FC } from 'react';\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';\nimport { LdapUserMappingInfo } from './LdapUserMappingInfo';\nimport { LdapUserPermissions } from './LdapUserPermissions';\nimport { LdapUserGroups } from './LdapUserGroups';\nimport { LdapUserTeams } from './LdapUserTeams';\nimport { LdapUser } from 'app/types';\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';\nimport { NavModel } from '@grafana/data';\nimport { Alert, Button, LegacyForms } from '@grafana/ui';\nconst { FormField } = LegacyForms;\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport config from 'app/core/config';\nimport Page from 'app/core/components/Page/Page';\nimport { LdapConnectionStatus } from './LdapConnectionStatus';\nimport { LdapSyncInfo } from './LdapSyncInfo';\nimport { LdapUserInfo } from './LdapUserInfo';\nimport {\n  AppNotificationSeverity,\n  LdapError,\n  LdapUser,\n  StoreState,\n  SyncInfo,\n  LdapConnectionInfo,\n  AccessControlAction,\n} from 'app/types';\nimport {\n  loadLdapState,\n  loadLdapSyncStatus,\n  loadUserMapping,\n  clearUserError,\n  clearUserMappingInfo,\n} from '../state/actions';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { contextSrv } from 'app/core/core';\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            {config.licenseInfo.hasLicense && 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 React, { FC, PureComponent, useRef, useState } from 'react';\nimport { AccessControlAction, UserDTO } from 'app/types';\nimport { css, cx } from '@emotion/css';\nimport { config } from 'app/core/config';\nimport { GrafanaTheme } from '@grafana/data';\nimport { Button, ConfirmButton, ConfirmModal, Input, LegacyInputStatus, stylesFactory } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\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.hasPermission(AccessControlAction.UsersWrite);\n  const passwordChangeLocked = user.isExternal || !contextSrv.hasPermission(AccessControlAction.UsersPasswordUpdate);\n  const canDelete = contextSrv.hasPermission(AccessControlAction.UsersDelete);\n  const canDisable = contextSrv.hasPermission(AccessControlAction.UsersDisable);\n  const canEnable = contextSrv.hasPermission(AccessControlAction.UsersEnable);\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 React, { useState } from 'react';\nimport { ConfirmButton, RadioButtonGroup, Icon } from '@grafana/ui';\nimport { AccessControlAction } from 'app/types';\nimport { contextSrv } from 'app/core/core';\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 React, { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { ConfirmButton, ConfirmModal, Button } from '@grafana/ui';\nimport { AccessControlAction, UserSession } from 'app/types';\nimport { contextSrv } from 'app/core/core';\n\ninterface Props {\n  sessions: UserSession[];\n\n  onSessionRevoke: (id: number) => void;\n  onAllSessionsRevoke: () => void;\n}\n\ninterface State {\n  showLogoutModal: boolean;\n}\n\nexport class UserSessions 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 } = 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>{session.createdAt}</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","import React, { PureComponent } from 'react';\nimport { dateTimeFormat } from '@grafana/data';\nimport { AccessControlAction, SyncInfo, UserDTO } from 'app/types';\nimport { Button, LinkButton } from '@grafana/ui';\nimport { contextSrv } from 'app/core/core';\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 { AsyncSelect } from '@grafana/ui';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { Organization } from 'app/types';\nimport { SelectableValue } from '@grafana/data';\nimport { useAsyncFn } from 'react-use';\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}\n\nexport function OrgPicker({ onSelected, className, inputId, autoFocus }: 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    return orgs.map((org) => ({ value: { id: org.id, name: org.name }, label: org.name }));\n  });\n\n  return (\n    <AsyncSelect\n      menuShouldPortal\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 React, { PureComponent, ReactElement } from 'react';\nimport { css, cx } from '@emotion/css';\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 { GrafanaTheme, GrafanaTheme2 } from '@grafana/data';\nimport { AccessControlAction, Organization, OrgRole, UserDTO, UserOrg } from 'app/types';\nimport { OrgPicker, OrgSelectItem } from 'app/core/components/Select/OrgPicker';\nimport { OrgRolePicker } from './OrgRolePicker';\nimport { contextSrv } from 'app/core/core';\nimport { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker';\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    const canAddToOrg = contextSrv.hasPermission(AccessControlAction.OrgUsersAdd);\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 isOpen={showAddOrgModal} onOrgAdd={onOrgAdd} onDismiss={this.dismissOrgAddModal} />\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  };\n\n  onOrgRemove = () => {\n    const { org } = this.props;\n    this.props.onOrgRemove(org.orgId);\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.OrgUsersRoleUpdate);\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.accessControlEnabled() ? (\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                  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\n  onOrgAdd(orgId: number, role: string): void;\n\n  onDismiss?(): void;\n}\n\ninterface AddToOrgModalState {\n  selectedOrg: Organization | null;\n  role: OrgRole;\n}\n\nexport class AddToOrgModal extends PureComponent<AddToOrgModalProps, AddToOrgModalState> {\n  state: AddToOrgModalState = {\n    selectedOrg: null,\n    role: OrgRole.Admin,\n  };\n\n  onOrgSelect = (org: OrgSelectItem) => {\n    this.setState({ selectedOrg: org.value! });\n  };\n\n  onOrgRoleChange = (newRole: OrgRole) => {\n    this.setState({\n      role: newRole,\n    });\n  };\n\n  onAddUserToOrg = () => {\n    const { selectedOrg, role } = this.state;\n    this.props.onOrgAdd(selectedOrg!.id, role);\n  };\n\n  onCancel = () => {\n    if (this.props.onDismiss) {\n      this.props.onDismiss();\n    }\n  };\n\n  render() {\n    const { isOpen } = this.props;\n    const { role } = 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} autoFocus />\n        </Field>\n        <Field label=\"Role\">\n          <OrgRolePicker inputId=\"new-org-role-input\" value={role} onChange={this.onOrgRoleChange} />\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\" 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&apos;s role is not editable because it is synchronized from your auth provider. Refer to\n              the&nbsp;\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              &nbsp;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&apos;s built-in role is not editable because it is synchronized from your auth provider. Refer to\n            the&nbsp;\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            &nbsp;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, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { NavModel } from '@grafana/data';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport config from 'app/core/config';\nimport Page from 'app/core/components/Page/Page';\nimport { UserProfile } from './UserProfile';\nimport { UserPermissions } from './UserPermissions';\nimport { UserSessions } from './UserSessions';\nimport { UserLdapSyncInfo } from './UserLdapSyncInfo';\nimport { StoreState, UserDTO, UserOrg, UserSession, SyncInfo, UserAdminError, AccessControlAction } from 'app/types';\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';\nimport { UserOrgs } from './UserOrgs';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { contextSrv } from 'app/core/core';\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 && config.licenseInfo.hasLicense && 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';\nimport { LinkButton, VerticalGroup } from '@grafana/ui';\nimport { css } from '@emotion/css';\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","import React from 'react';\nimport config from 'app/core/config';\nimport { css, cx } from '@emotion/css';\nimport { Icon, IconName, LinkButton, useStyles, useTheme2, VerticalGroup } from '@grafana/ui';\nimport { GrafanaTheme, GrafanaTheme2, DEFAULT_SAML_NAME } from '@grafana/data';\nimport { pickBy } from 'lodash';\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 && config.oauth.google,\n      name: 'Google',\n      icon: 'google',\n    },\n    azuread: {\n      bgColor: '#2f2f2f',\n      enabled: oauthEnabled && config.oauth.azuread,\n      name: 'Microsoft',\n      icon: 'microsoft',\n    },\n    github: {\n      bgColor: '#464646',\n      enabled: oauthEnabled && config.oauth.github,\n      name: 'GitHub',\n      icon: 'github',\n    },\n    gitlab: {\n      bgColor: '#fc6d26',\n      enabled: oauthEnabled && config.oauth.gitlab,\n      name: 'GitLab',\n      icon: 'gitlab',\n    },\n    grafanacom: {\n      bgColor: '#262628',\n      enabled: oauthEnabled && config.oauth.grafana_com,\n      name: 'Grafana.com',\n      hrefName: 'grafana_com',\n      icon: 'grafana',\n    },\n    okta: {\n      bgColor: '#2f2f2f',\n      enabled: oauthEnabled && config.oauth.okta,\n      name: 'Okta',\n      icon: 'okta',\n    },\n    oauth: {\n      bgColor: '#262628',\n      enabled: oauthEnabled && config.oauth.generic_oauth,\n      name: oauthEnabled && config.oauth.generic_oauth ? config.oauth.generic_oauth.name : 'OAuth',\n      icon: '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","// Libraries\nimport React, { FC } from 'react';\nimport { css } from '@emotion/css';\n\n// Components\nimport { UserSignup } from './UserSignup';\nimport { LoginServiceButtons } from './LoginServiceButtons';\nimport LoginCtrl from './LoginCtrl';\nimport { LoginForm } from './LoginForm';\nimport { ChangePassword } from '../ForgottenPassword/ChangePassword';\nimport { Branding } from 'app/core/components/Branding/Branding';\nimport { HorizontalGroup, LinkButton } from '@grafana/ui';\nimport { LoginLayout, InnerBox } from './LoginLayout';\nimport config from 'app/core/config';\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, { FunctionComponent } from 'react';\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 { locationService } from '@grafana/runtime';\nimport { useLocation } from 'react-router-dom';\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 React, { FunctionComponent } from 'react';\nimport { Button, stylesFactory } from '@grafana/ui';\nimport { css } from '@emotion/css';\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 from 'react';\nimport Loadable from 'react-loadable';\nimport { LoadingChunkPlaceHolder } from './LoadingChunkPlaceHolder';\nimport { ErrorLoadingChunk } from './ErrorLoadingChunk';\nimport { GrafanaRouteComponent } from 'app/core/navigation/types';\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 React, { PureComponent } from 'react';\nimport { connect, MapStateToProps } from 'react-redux';\nimport { NavModel } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Icon } from '@grafana/ui';\nimport Page from '../Page/Page';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { StoreState } from 'app/types';\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 { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport';\nimport { RouteDescriptor } from 'app/core/navigation/types';\nimport { isGrafanaAdmin } from './permissions';\nimport { PluginAdminRoutes } from './types';\n\nconst DEFAULT_ROUTES = [\n  {\n    path: '/plugins',\n    routeName: PluginAdminRoutes.Home,\n    component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n  },\n  {\n    path: '/plugins/browse',\n    routeName: PluginAdminRoutes.Browse,\n    component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n  },\n  {\n    path: '/plugins/:pluginId/',\n    routeName: PluginAdminRoutes.Details,\n    component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginPage\" */ './pages/PluginDetails')),\n  },\n];\n\nconst ADMIN_ROUTES = [\n  {\n    path: '/admin/plugins',\n    routeName: PluginAdminRoutes.HomeAdmin,\n    component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n  },\n  {\n    path: '/admin/plugins/browse',\n    routeName: PluginAdminRoutes.BrowseAdmin,\n    component: SafeDynamicImport(() => import(/* webpackChunkName: \"PluginListPage\" */ './pages/Browse')),\n  },\n  {\n    path: '/admin/plugins/:pluginId/',\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 { 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 React from 'react';\nimport { Redirect } from 'react-router-dom';\nimport { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport';\nimport { config } from 'app/core/config';\nimport { RouteDescriptor } from 'app/core/navigation/types';\nimport { uniq } from 'lodash';\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    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"AlertRuleListIndex\" */ 'app/features/alerting/unified/RuleList')\n    ),\n  },\n  {\n    path: '/alerting/routes',\n    roles: () => ['Admin', 'Editor'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"AlertAmRoutes\" */ 'app/features/alerting/unified/AmRoutes')\n    ),\n  },\n  {\n    path: '/alerting/silences',\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"AlertSilences\" */ 'app/features/alerting/unified/Silences')\n    ),\n  },\n  {\n    path: '/alerting/silence/new',\n    roles: () => ['Editor', 'Admin'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"AlertSilences\" */ 'app/features/alerting/unified/Silences')\n    ),\n  },\n  {\n    path: '/alerting/silence/:id/edit',\n    roles: () => ['Editor', 'Admin'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"AlertSilences\" */ 'app/features/alerting/unified/Silences')\n    ),\n  },\n  {\n    path: '/alerting/notifications',\n    roles: config.unifiedAlertingEnabled ? () => ['Editor', 'Admin'] : undefined,\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n    ),\n  },\n  {\n    path: '/alerting/notifications/templates/new',\n    roles: () => ['Editor', 'Admin'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n    ),\n  },\n  {\n    path: '/alerting/notifications/templates/:id/edit',\n    roles: () => ['Editor', 'Admin'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n    ),\n  },\n  {\n    path: '/alerting/notifications/receivers/new',\n    roles: () => ['Editor', 'Admin'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n    ),\n  },\n  {\n    path: '/alerting/notifications/receivers/:id/edit',\n    roles: () => ['Editor', 'Admin'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n    ),\n  },\n  {\n    path: '/alerting/notifications/global-config',\n    roles: () => ['Admin', 'Editor'],\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"NotificationsListPage\" */ 'app/features/alerting/unified/Receivers')\n    ),\n  },\n  {\n    path: '/alerting/groups/',\n    component: SafeDynamicImport(\n      () => import(/* webpackChunkName: \"AlertGroups\" */ 'app/features/alerting/unified/AlertGroups')\n    ),\n  },\n  {\n    path: '/alerting/new',\n    pageClass: 'page-alerting',\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    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    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    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: \"Alerting feature toggle page\"*/ 'app/features/alerting/FeatureTogglePage')\n    ),\n  }));\n}\n","import React from 'react';\nimport LdapPage from 'app/features/admin/ldap/LdapPage';\nimport UserAdminPage from 'app/features/admin/UserAdminPage';\nimport { LoginPage } from 'app/core/components/Login/LoginPage';\nimport config from 'app/core/config';\nimport { AccessControlAction, DashboardRoutes } from 'app/types';\nimport { SafeDynamicImport } from '../core/components/DynamicImports/SafeDynamicImport';\nimport { RouteDescriptor } from '../core/navigation/types';\nimport { Redirect } from 'react-router-dom';\nimport ErrorPage from 'app/core/components/ErrorPage/ErrorPage';\nimport { getRoutes as getPluginCatalogRoutes } from 'app/features/plugins/admin/routes';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getLiveRoutes } from 'app/features/live/pages/routes';\nimport { getAlertingRoutes } from 'app/features/alerting/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      // TODO[Router]\n      //roles: () => (contextSrv.hasEditPermissionInFolders ? [contextSrv.user.orgRole] : ['Admin']),\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      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      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',\n      component: SafeDynamicImport(\n        () => import(/* webpackChunkName: \"DataSourcesListPage\"*/ 'app/features/datasources/DataSourcesListPage')\n      ),\n    },\n    {\n      path: '/datasources/edit/:uid/',\n      component: SafeDynamicImport(\n        () =>\n          import(\n            /* webpackChunkName: \"DataSourceSettingsPage\"*/ '../features/datasources/settings/DataSourceSettingsPage'\n          )\n      ),\n    },\n    {\n      path: '/datasources/edit/:uid/dashboards',\n      component: SafeDynamicImport(\n        () => import(/* webpackChunkName: \"DataSourceDashboards\"*/ 'app/features/datasources/DataSourceDashboards')\n      ),\n    },\n    {\n      path: '/datasources/new',\n      component: SafeDynamicImport(\n        () => import(/* webpackChunkName: \"NewDataSourcePage\"*/ '../features/datasources/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: 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(() => (config.viewersCanEdit ? [] : ['Editor', 'Admin']), [\n          AccessControlAction.DataSourcesExplore,\n        ]),\n      component: SafeDynamicImport(() => import(/* webpackChunkName: \"explore\" */ 'app/features/explore/Wrapper')),\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: () => ['Editor', 'Admin'],\n      component: SafeDynamicImport(\n        () => import(/* webpackChunkName: \"ApiKeysPage\" */ 'app/features/api-keys/ApiKeysPage')\n      ),\n    },\n    {\n      path: '/org/teams',\n      roles: () => (config.editorsCanAdmin ? [] : ['Editor', 'Admin']),\n      component: SafeDynamicImport(() => import(/* webpackChunkName: \"TeamList\" */ 'app/features/teams/TeamList')),\n    },\n    {\n      path: '/org/teams/new',\n\n      roles: () => (config.editorsCanAdmin ? [] : ['Admin']),\n      component: SafeDynamicImport(() => import(/* webpackChunkName: \"CreateTeam\" */ 'app/features/teams/CreateTeam')),\n    },\n    {\n      path: '/org/teams/edit/:id/:page?',\n      roles: () => (config.editorsCanAdmin ? [] : ['Admin']),\n      component: SafeDynamicImport(() => import(/* webpackChunkName: \"TeamPages\" */ 'app/features/teams/TeamPages')),\n    },\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    // 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/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    },\n    {\n      path: '/invite/:code',\n      component: SafeDynamicImport(\n        () => import(/* webpackChunkName: \"SignupInvited\" */ 'app/features/users/SignupInvited')\n      ),\n      pageClass: 'sidemenu-hidden',\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    },\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    },\n    {\n      path: '/user/password/send-reset-email',\n      pageClass: 'sidemenu-hidden',\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    },\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/:id',\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/:id',\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: '/library-panels',\n      component: SafeDynamicImport(\n        () => import(/* webpackChunkName: \"LibraryPanelsPage\"*/ 'app/features/library-panels/LibraryPanelsPage')\n      ),\n    },\n    ...getPluginCatalogRoutes(),\n    ...getLiveRoutes(),\n    ...getAlertingRoutes(),\n    ...extraRoutes,\n    {\n      path: '/*',\n      component: ErrorPage,\n    },\n    // TODO[Router]\n    // ...playlistRoutes,\n  ];\n}\n","import { Location } from 'history';\nimport { NavModelItem, NavSection } from '@grafana/data';\nimport { getConfig } from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\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';\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          text: 'Keyboard shortcuts',\n          icon: 'keyboard',\n          onClick: onOpenShortcuts,\n        },\n      ];\n    }\n\n    if (link.showOrgSwitcher) {\n      link.children = [\n        ...menuItems,\n        {\n          text: 'Switch organization',\n          icon: 'arrow-random',\n          onClick: toggleOrgSwitcher,\n        },\n      ];\n    }\n  });\n  return items;\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 newNavigationEnabled = getConfig().featureToggles.newNavigation;\n  const dashboardLinkMatch = newNavigationEnabled ? '/dashboards' : '/';\n\n  for (const link of navTree) {\n    const linkPathname = stripQueryParams(link.url);\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","import React from 'react';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { UserOrgDTO } from '@grafana/data';\nimport { Modal, Button, CustomScrollbar } from '@grafana/ui';\n\nimport { contextSrv } from 'app/core/services/context_srv';\nimport config from 'app/core/config';\nimport { css } from '@emotion/css';\n\ninterface Props {\n  onDismiss: () => void;\n}\n\ninterface State {\n  orgs: UserOrgDTO[];\n}\n\nexport class OrgSwitcher extends React.PureComponent<Props, State> {\n  state: State = {\n    orgs: [],\n  };\n\n  componentDidMount() {\n    this.getUserOrgs();\n  }\n\n  getUserOrgs = async () => {\n    const orgs: UserOrgDTO[] = await getBackendSrv().get('/api/user/orgs');\n    this.setState({ orgs });\n  };\n\n  setCurrentOrg = async (org: UserOrgDTO) => {\n    await getBackendSrv().post(`/api/user/using/${org.orgId}`);\n    this.setWindowLocation(`${config.appSubUrl}${config.appSubUrl.endsWith('/') ? '' : '/'}?orgId=${org.orgId}`);\n  };\n\n  setWindowLocation(href: string) {\n    window.location.href = href;\n  }\n\n  render() {\n    const { onDismiss } = this.props;\n    const { orgs } = this.state;\n\n    const currentOrgId = contextSrv.user.orgId;\n    const contentClassName = css({\n      display: 'flex',\n      maxHeight: 'calc(85vh - 42px)',\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={() => this.setCurrentOrg(org)}>\n                        Switch to\n                      </Button>\n                    )}\n                  </td>\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        </CustomScrollbar>\n      </Modal>\n    );\n  }\n}\n","import React from 'react';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, IconName, Link, useTheme2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\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: string;\n  url?: string;\n}\n\nexport function NavBarMenuItem({ icon, isActive, isDivider, onClick, styleOverrides, target, text, url }: Props) {\n  const theme = useTheme2();\n  const styles = getStyles(theme, isActive, styleOverrides);\n\n  const linkContent = (\n    <div className={styles.linkContent}>\n      <div>\n        {icon && <Icon data-testid=\"dropdown-child-icon\" name={icon} className={styles.icon} />}\n        {text}\n      </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={styles.element} onClick={onClick}>\n      {linkContent}\n    </button>\n  );\n\n  if (url) {\n    element =\n      !target && url.startsWith('/') ? (\n        <Link className={styles.element} href={url} target={target} onClick={onClick}>\n          {linkContent}\n        </Link>\n      ) : (\n        <a href={url} target={target} className={styles.element} onClick={onClick}>\n          {linkContent}\n        </a>\n      );\n  }\n\n  return isDivider ? <li data-testid=\"dropdown-child-divider\" className={styles.divider} /> : <li>{element}</li>;\n}\n\nNavBarMenuItem.displayName = 'NavBarMenuItem';\n\nconst getStyles = (theme: GrafanaTheme2, isActive: Props['isActive'], styleOverrides: Props['styleOverrides']) => ({\n  divider: css`\n    border-bottom: 1px solid ${theme.colors.border.weak};\n    height: 1px;\n    margin: ${theme.spacing(1)} 0;\n    overflow: hidden;\n  `,\n  element: css`\n    align-items: center;\n    background: none;\n    border: none;\n    color: ${isActive ? theme.colors.text.primary : theme.colors.text.secondary};\n    display: flex;\n    font-size: inherit;\n    height: 100%;\n    padding: 5px 12px 5px 10px;\n    position: relative;\n    text-align: left;\n    white-space: nowrap;\n    width: 100%;\n\n    &:hover,\n    &:focus-visible {\n      background-color: ${theme.colors.action.hover};\n      color: ${theme.colors.text.primary};\n    }\n\n    &:focus-visible {\n      box-shadow: none;\n      outline: 2px solid ${theme.colors.primary.main};\n      outline-offset: -2px;\n      transition: none;\n    }\n\n    &::before {\n      display: ${isActive ? 'block' : 'none'};\n      content: ' ';\n      position: absolute;\n      left: 0;\n      top: 0;\n      bottom: 0;\n      width: 4px;\n      border-radius: 2px;\n      background-image: ${theme.colors.gradients.brandVertical};\n    }\n    ${styleOverrides};\n  `,\n  externalLinkIcon: css`\n    color: ${theme.colors.text.secondary};\n    margin-left: ${theme.spacing(1)};\n  `,\n  icon: css`\n    margin-right: ${theme.spacing(1)};\n  `,\n  linkContent: css`\n    display: flex;\n    flex: 1;\n    flex-direction: row;\n    justify-content: space-between;\n  `,\n});\n","import React from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { IconName, useTheme2 } from '@grafana/ui';\nimport { NavBarMenuItem } from './NavBarMenuItem';\n\ninterface Props {\n  headerTarget?: HTMLAnchorElement['target'];\n  headerText: string;\n  headerUrl?: string;\n  isVisible?: boolean;\n  items?: NavModelItem[];\n  onHeaderClick?: () => void;\n  reverseDirection?: boolean;\n  subtitleText?: string;\n}\n\nconst NavBarDropdown = ({\n  headerTarget,\n  headerText,\n  headerUrl,\n  isVisible,\n  items = [],\n  onHeaderClick,\n  reverseDirection = false,\n  subtitleText,\n}: Props) => {\n  const filteredItems = items.filter((item) => !item.hideFromMenu);\n  const theme = useTheme2();\n  const styles = getStyles(theme, reverseDirection, filteredItems, isVisible);\n\n  return (\n    <ul className={`${styles.menu} navbar-dropdown`} role=\"menu\">\n      <NavBarMenuItem\n        onClick={onHeaderClick}\n        styleOverrides={styles.header}\n        target={headerTarget}\n        text={headerText}\n        url={headerUrl}\n      />\n      {filteredItems.map((child, index) => (\n        <NavBarMenuItem\n          key={index}\n          isDivider={child.divider}\n          icon={child.icon as IconName}\n          onClick={child.onClick}\n          styleOverrides={styles.item}\n          target={child.target}\n          text={child.text}\n          url={child.url}\n        />\n      ))}\n      {subtitleText && <li className={styles.subtitle}>{subtitleText}</li>}\n    </ul>\n  );\n};\n\nexport default NavBarDropdown;\n\nconst getStyles = (\n  theme: GrafanaTheme2,\n  reverseDirection: Props['reverseDirection'],\n  filteredItems: Props['items'],\n  isVisible: Props['isVisible']\n) => {\n  const adjustHeightForBorder = filteredItems!.length === 0;\n\n  return {\n    header: css`\n      background-color: ${theme.colors.background.secondary};\n      color: ${theme.colors.text.primary};\n      height: ${theme.components.sidemenu.width - (adjustHeightForBorder ? 2 : 1)}px;\n      font-size: ${theme.typography.h4.fontSize};\n      font-weight: ${theme.typography.h4.fontWeight};\n      padding: ${theme.spacing(1)} ${theme.spacing(2)};\n      white-space: nowrap;\n      width: 100%;\n    `,\n    item: css`\n      color: ${theme.colors.text.primary};\n    `,\n    menu: css`\n      background-color: ${theme.colors.background.primary};\n      border: 1px solid ${theme.components.panel.borderColor};\n      bottom: ${reverseDirection ? 0 : 'auto'};\n      box-shadow: ${theme.shadows.z3};\n      display: flex;\n      flex-direction: ${reverseDirection ? 'column-reverse' : 'column'};\n      left: 100%;\n      list-style: none;\n      min-width: 140px;\n      opacity: ${isVisible ? 1 : 0};\n      position: absolute;\n      top: ${reverseDirection ? 'auto' : 0};\n      transition: ${theme.transitions.create('opacity')};\n      visibility: ${isVisible ? 'visible' : 'hidden'};\n      z-index: ${theme.zIndex.sidemenu};\n    `,\n    subtitle: css`\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      white-space: nowrap;\n    `,\n  };\n};\n","import React, { ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { Link, useTheme2 } from '@grafana/ui';\nimport NavBarDropdown from './NavBarDropdown';\n\nexport interface Props {\n  isActive?: boolean;\n  children: ReactNode;\n  className?: string;\n  label: string;\n  menuItems?: NavModelItem[];\n  menuSubTitle?: string;\n  onClick?: () => void;\n  reverseMenuDirection?: boolean;\n  showMenu?: boolean;\n  target?: HTMLAnchorElement['target'];\n  url?: string;\n}\n\nconst NavBarItem = ({\n  isActive = false,\n  children,\n  className,\n  label,\n  menuItems = [],\n  menuSubTitle,\n  onClick,\n  reverseMenuDirection = false,\n  showMenu = true,\n  target,\n  url,\n}: Props) => {\n  const theme = useTheme2();\n  const styles = getStyles(theme, isActive);\n  let element = (\n    <button className={styles.element} onClick={onClick} aria-label={label}>\n      <span className={styles.icon}>{children}</span>\n    </button>\n  );\n\n  if (url) {\n    element =\n      !target && url.startsWith('/') ? (\n        <Link\n          className={styles.element}\n          href={url}\n          target={target}\n          aria-label={label}\n          onClick={onClick}\n          aria-haspopup=\"true\"\n        >\n          <span className={styles.icon}>{children}</span>\n        </Link>\n      ) : (\n        <a href={url} target={target} className={styles.element} onClick={onClick} aria-label={label}>\n          <span className={styles.icon}>{children}</span>\n        </a>\n      );\n  }\n\n  return (\n    <div className={cx(styles.container, className)}>\n      {element}\n      {showMenu && (\n        <NavBarDropdown\n          headerTarget={target}\n          headerText={label}\n          headerUrl={url}\n          items={menuItems}\n          onHeaderClick={onClick}\n          reverseDirection={reverseMenuDirection}\n          subtitleText={menuSubTitle}\n        />\n      )}\n    </div>\n  );\n};\n\nexport default NavBarItem;\n\nconst getStyles = (theme: GrafanaTheme2, isActive: Props['isActive']) => ({\n  container: css`\n    position: relative;\n    color: ${isActive ? theme.colors.text.primary : theme.colors.text.secondary};\n\n    &:hover {\n      background-color: ${theme.colors.action.hover};\n      color: ${theme.colors.text.primary};\n\n      // TODO don't use a hardcoded class here, use isVisible in NavBarDropdown\n      .navbar-dropdown {\n        opacity: 1;\n        visibility: visible;\n      }\n    }\n  `,\n  element: css`\n    background-color: transparent;\n    border: none;\n    color: inherit;\n    display: block;\n    line-height: ${theme.components.sidemenu.width}px;\n    padding: 0;\n    text-align: center;\n    width: ${theme.components.sidemenu.width}px;\n\n    &::before {\n      display: ${isActive ? 'block' : 'none'};\n      content: ' ';\n      position: absolute;\n      left: 0;\n      top: 0;\n      bottom: 0;\n      width: 4px;\n      border-radius: 2px;\n      background-image: ${theme.colors.gradients.brandVertical};\n    }\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  icon: css`\n    height: 100%;\n    width: 100%;\n\n    img {\n      border-radius: 50%;\n      height: ${theme.spacing(3)};\n      width: ${theme.spacing(3)};\n    }\n  `,\n});\n","import React, { ReactNode } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\nimport config from '../../config';\n\nexport interface Props {\n  children: ReactNode;\n  className?: string;\n}\n\nexport function NavBarSection({ children, className }: Props) {\n  const newNavigationEnabled = config.featureToggles.newNavigation;\n  const theme = useTheme2();\n  const styles = getStyles(theme, newNavigationEnabled);\n\n  return (\n    <div data-testid=\"navbar-section\" className={cx(styles.container, className)}>\n      {children}\n    </div>\n  );\n}\n\nconst getStyles = (theme: GrafanaTheme2, newNavigationEnabled: boolean) => ({\n  container: css`\n    display: none;\n\n    ${theme.breakpoints.up('md')} {\n      background-color: ${newNavigationEnabled ? theme.colors.background.primary : 'inherit'};\n      border: ${newNavigationEnabled ? `1px solid ${theme.components.panel.borderColor}` : 'none'};\n      border-radius: 2px;\n      display: flex;\n      flex-direction: inherit;\n    }\n  `,\n});\n","import React, { useRef } from 'react';\nimport { GrafanaTheme2, NavModelItem } from '@grafana/data';\nimport { CustomScrollbar, Icon, IconButton, IconName, useTheme2 } from '@grafana/ui';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay } from '@react-aria/overlays';\nimport { css } from '@emotion/css';\nimport { NavBarMenuItem } from './NavBarMenuItem';\n\nexport interface Props {\n  activeItem?: NavModelItem;\n  navItems: NavModelItem[];\n  onClose: () => void;\n}\n\nexport function NavBarMenu({ activeItem, navItems, onClose }: Props) {\n  const theme = useTheme2();\n  const styles = getStyles(theme);\n  const ref = useRef(null);\n  const { overlayProps } = useOverlay(\n    {\n      isDismissable: true,\n      isOpen: true,\n      onClose,\n    },\n    ref\n  );\n\n  return (\n    <FocusScope contain restoreFocus autoFocus>\n      <div data-testid=\"navbarmenu\" className={styles.container} ref={ref} {...overlayProps}>\n        <div className={styles.header}>\n          <Icon name=\"bars\" size=\"xl\" />\n          <IconButton aria-label=\"Close navigation menu\" name=\"times\" onClick={onClose} size=\"xl\" variant=\"secondary\" />\n        </div>\n        <nav className={styles.content}>\n          <CustomScrollbar>\n            <ul>\n              {navItems.map((link, index) => (\n                <div className={styles.section} key={index}>\n                  <NavBarMenuItem\n                    isActive={activeItem === link}\n                    onClick={() => {\n                      link.onClick?.();\n                      onClose();\n                    }}\n                    styleOverrides={styles.sectionHeader}\n                    target={link.target}\n                    text={link.text}\n                    url={link.url}\n                  />\n                  {link.children?.map(\n                    (childLink, childIndex) =>\n                      !childLink.divider && (\n                        <NavBarMenuItem\n                          key={childIndex}\n                          icon={childLink.icon as IconName}\n                          isActive={activeItem === childLink}\n                          isDivider={childLink.divider}\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                        />\n                      )\n                  )}\n                </div>\n              ))}\n            </ul>\n          </CustomScrollbar>\n        </nav>\n      </div>\n    </FocusScope>\n  );\n}\n\nNavBarMenu.displayName = 'NavBarMenu';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  container: css`\n    background-color: ${theme.colors.background.canvas};\n    bottom: 0;\n    display: flex;\n    flex-direction: column;\n    left: 0;\n    min-width: 300px;\n    position: fixed;\n    right: 0;\n    top: 0;\n\n    ${theme.breakpoints.up('md')} {\n      border-right: 1px solid ${theme.colors.border.weak};\n      right: unset;\n    }\n  `,\n  content: css`\n    display: flex;\n    flex-direction: column;\n    overflow: auto;\n  `,\n  header: css`\n    border-bottom: 1px solid ${theme.colors.border.weak};\n    display: flex;\n    justify-content: space-between;\n    padding: ${theme.spacing(2)};\n  `,\n  item: css`\n    padding: ${theme.spacing(1)} ${theme.spacing(2)};\n  `,\n  section: css`\n    border-bottom: 1px solid ${theme.colors.border.weak};\n  `,\n  sectionHeader: css`\n    color: ${theme.colors.text.primary};\n    font-size: ${theme.typography.h5.fontSize};\n    padding: ${theme.spacing(1)} ${theme.spacing(2)};\n  `,\n});\n","import React, { FC, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { css, cx } from '@emotion/css';\nimport { cloneDeep } from 'lodash';\nimport { GrafanaTheme2, NavModelItem, NavSection } from '@grafana/data';\nimport { Icon, IconName, useTheme2 } from '@grafana/ui';\nimport { locationService } from '@grafana/runtime';\nimport { Branding } from 'app/core/components/Branding/Branding';\nimport config from 'app/core/config';\nimport { KioskMode } from 'app/types';\nimport { enrichConfigItems, getActiveItem, isMatchOrChildMatch, isSearchActive, SEARCH_ITEM_ID } from './utils';\nimport { OrgSwitcher } from '../OrgSwitcher';\nimport NavBarItem from './NavBarItem';\nimport { NavBarSection } from './NavBarSection';\nimport { NavBarMenu } from './NavBarMenu';\n\nconst homeUrl = config.appSubUrl || '/';\n\nconst onOpenSearch = () => {\n  locationService.partial({ search: 'open' });\n};\n\nconst searchItem: NavModelItem = {\n  id: SEARCH_ITEM_ID,\n  onClick: onOpenSearch,\n  text: 'Search dashboards',\n};\n\nexport const NavBar: FC = React.memo(() => {\n  const theme = useTheme2();\n  const styles = getStyles(theme);\n  const location = useLocation();\n  const query = new URLSearchParams(location.search);\n  const kiosk = query.get('kiosk') as KioskMode;\n  const [showSwitcherModal, setShowSwitcherModal] = useState(false);\n  const toggleSwitcherModal = () => {\n    setShowSwitcherModal(!showSwitcherModal);\n  };\n  const navTree: NavModelItem[] = cloneDeep(config.bootData.navTree);\n  const topItems = navTree.filter((item) => item.section === NavSection.Core);\n  const bottomItems = enrichConfigItems(\n    navTree.filter((item) => item.section === NavSection.Config),\n    location,\n    toggleSwitcherModal\n  );\n  const activeItem = isSearchActive(location) ? searchItem : getActiveItem(navTree, location.pathname);\n\n  const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n\n  if (kiosk !== null) {\n    return null;\n  }\n\n  return (\n    <nav className={cx(styles.sidemenu, 'sidemenu')} data-testid=\"sidemenu\" aria-label=\"Main menu\">\n      <div className={styles.mobileSidemenuLogo} onClick={() => setMobileMenuOpen(!mobileMenuOpen)} key=\"hamburger\">\n        <Icon name=\"bars\" size=\"xl\" />\n      </div>\n\n      <NavBarSection>\n        <NavBarItem url={homeUrl} label=\"Home\" className={styles.grafanaLogo} showMenu={false}>\n          <Branding.MenuLogo />\n        </NavBarItem>\n        <NavBarItem\n          className={styles.search}\n          isActive={activeItem === searchItem}\n          label={searchItem.text}\n          onClick={searchItem.onClick}\n        >\n          <Icon name=\"search\" size=\"xl\" />\n        </NavBarItem>\n      </NavBarSection>\n\n      <NavBarSection>\n        {topItems.map((link, index) => (\n          <NavBarItem\n            key={`${link.id}-${index}`}\n            isActive={isMatchOrChildMatch(link, activeItem)}\n            label={link.text}\n            menuItems={link.children}\n            target={link.target}\n            url={link.url}\n          >\n            {link.icon && <Icon name={link.icon as IconName} size=\"xl\" />}\n            {link.img && <img src={link.img} alt={`${link.text} logo`} />}\n          </NavBarItem>\n        ))}\n      </NavBarSection>\n\n      <div className={styles.spacer} />\n\n      <NavBarSection>\n        {bottomItems.map((link, index) => (\n          <NavBarItem\n            key={`${link.id}-${index}`}\n            isActive={isMatchOrChildMatch(link, activeItem)}\n            label={link.text}\n            menuItems={link.children}\n            menuSubTitle={link.subTitle}\n            onClick={link.onClick}\n            reverseMenuDirection\n            target={link.target}\n            url={link.url}\n          >\n            {link.icon && <Icon name={link.icon as IconName} size=\"xl\" />}\n            {link.img && <img src={link.img} alt={`${link.text} logo`} />}\n          </NavBarItem>\n        ))}\n      </NavBarSection>\n\n      {showSwitcherModal && <OrgSwitcher onDismiss={toggleSwitcherModal} />}\n      {mobileMenuOpen && (\n        <NavBarMenu\n          activeItem={activeItem}\n          navItems={[searchItem, ...topItems, ...bottomItems]}\n          onClose={() => setMobileMenuOpen(false)}\n        />\n      )}\n    </nav>\n  );\n});\n\nNavBar.displayName = 'NavBar';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  search: css`\n    display: none;\n    margin-top: ${theme.spacing(5)};\n\n    ${theme.breakpoints.up('md')} {\n      display: block;\n    }\n  `,\n  sidemenu: css`\n    display: flex;\n    flex-direction: column;\n    position: fixed;\n    z-index: ${theme.zIndex.sidemenu};\n\n    ${theme.breakpoints.up('md')} {\n      background: ${theme.colors.background.primary};\n      border-right: 1px solid ${theme.components.panel.borderColor};\n      padding: 0 0 ${theme.spacing(1)} 0;\n      position: relative;\n      width: ${theme.components.sidemenu.width}px;\n    }\n\n    .sidemenu-hidden & {\n      display: none;\n    }\n  `,\n  grafanaLogo: css`\n    display: none;\n    img {\n      height: ${theme.spacing(3.5)};\n      width: ${theme.spacing(3.5)};\n    }\n\n    ${theme.breakpoints.up('md')} {\n      align-items: center;\n      display: flex;\n      justify-content: center;\n    }\n  `,\n  mobileSidemenuLogo: css`\n    align-items: center;\n    cursor: pointer;\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    padding: ${theme.spacing(2)};\n\n    ${theme.breakpoints.up('md')} {\n      display: none;\n    }\n  `,\n  spacer: css`\n    flex: 1;\n  `,\n});\n","import React, { FC, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { css, cx } from '@emotion/css';\nimport { cloneDeep } from 'lodash';\nimport { GrafanaTheme2, NavModelItem, NavSection } from '@grafana/data';\nimport { Icon, IconName, useTheme2 } from '@grafana/ui';\nimport { locationService } from '@grafana/runtime';\nimport { Branding } from 'app/core/components/Branding/Branding';\nimport config from 'app/core/config';\nimport { KioskMode } from 'app/types';\nimport { enrichConfigItems, getActiveItem, isMatchOrChildMatch, isSearchActive, SEARCH_ITEM_ID } from './utils';\nimport { OrgSwitcher } from '../OrgSwitcher';\nimport { NavBarSection } from './NavBarSection';\nimport NavBarItem from './NavBarItem';\nimport { NavBarMenu } from './NavBarMenu';\n\nconst onOpenSearch = () => {\n  locationService.partial({ search: 'open' });\n};\n\nconst searchItem: NavModelItem = {\n  id: SEARCH_ITEM_ID,\n  onClick: onOpenSearch,\n  text: 'Search dashboards',\n};\n\nexport const NavBarNext: FC = React.memo(() => {\n  const theme = useTheme2();\n  const styles = getStyles(theme);\n  const location = useLocation();\n  const query = new URLSearchParams(location.search);\n  const kiosk = query.get('kiosk') as KioskMode;\n  const [showSwitcherModal, setShowSwitcherModal] = useState(false);\n  const toggleSwitcherModal = () => {\n    setShowSwitcherModal(!showSwitcherModal);\n  };\n  const navTree: NavModelItem[] = cloneDeep(config.bootData.navTree);\n  const coreItems = navTree.filter((item) => item.section === NavSection.Core);\n  const pluginItems = navTree.filter((item) => item.section === NavSection.Plugin);\n  const configItems = enrichConfigItems(\n    navTree.filter((item) => item.section === NavSection.Config),\n    location,\n    toggleSwitcherModal\n  );\n  const activeItem = isSearchActive(location) ? searchItem : getActiveItem(navTree, location.pathname);\n  const [menuOpen, setMenuOpen] = useState(false);\n\n  if (kiosk !== null) {\n    return null;\n  }\n\n  return (\n    <nav className={cx(styles.sidemenu, 'sidemenu')} data-testid=\"sidemenu\" aria-label=\"Main menu\">\n      <div className={styles.mobileSidemenuLogo} onClick={() => setMenuOpen(!menuOpen)} key=\"hamburger\">\n        <Icon name=\"bars\" size=\"xl\" />\n      </div>\n\n      <NavBarSection>\n        <NavBarItem\n          onClick={() => setMenuOpen(!menuOpen)}\n          label=\"Main menu\"\n          className={styles.grafanaLogo}\n          showMenu={false}\n        >\n          <Branding.MenuLogo />\n        </NavBarItem>\n        <NavBarItem\n          className={styles.search}\n          isActive={activeItem === searchItem}\n          label={searchItem.text}\n          onClick={searchItem.onClick}\n        >\n          <Icon name=\"search\" size=\"xl\" />\n        </NavBarItem>\n      </NavBarSection>\n\n      <NavBarSection>\n        {coreItems.map((link, index) => (\n          <NavBarItem\n            key={`${link.id}-${index}`}\n            isActive={isMatchOrChildMatch(link, activeItem)}\n            label={link.text}\n            menuItems={link.children}\n            target={link.target}\n            url={link.url}\n          >\n            {link.icon && <Icon name={link.icon as IconName} size=\"xl\" />}\n            {link.img && <img src={link.img} alt={`${link.text} logo`} />}\n          </NavBarItem>\n        ))}\n      </NavBarSection>\n\n      {pluginItems.length > 0 && (\n        <NavBarSection>\n          {pluginItems.map((link, index) => (\n            <NavBarItem\n              key={`${link.id}-${index}`}\n              isActive={isMatchOrChildMatch(link, activeItem)}\n              label={link.text}\n              menuItems={link.children}\n              menuSubTitle={link.subTitle}\n              onClick={link.onClick}\n              target={link.target}\n              url={link.url}\n            >\n              {link.icon && <Icon name={link.icon as IconName} size=\"xl\" />}\n              {link.img && <img src={link.img} alt={`${link.text} logo`} />}\n            </NavBarItem>\n          ))}\n        </NavBarSection>\n      )}\n\n      <div className={styles.spacer} />\n\n      <NavBarSection>\n        {configItems.map((link, index) => (\n          <NavBarItem\n            key={`${link.id}-${index}`}\n            isActive={isMatchOrChildMatch(link, activeItem)}\n            label={link.text}\n            menuItems={link.children}\n            menuSubTitle={link.subTitle}\n            onClick={link.onClick}\n            reverseMenuDirection\n            target={link.target}\n            url={link.url}\n          >\n            {link.icon && <Icon name={link.icon as IconName} size=\"xl\" />}\n            {link.img && <img src={link.img} alt={`${link.text} logo`} />}\n          </NavBarItem>\n        ))}\n      </NavBarSection>\n\n      {showSwitcherModal && <OrgSwitcher onDismiss={toggleSwitcherModal} />}\n      {menuOpen && (\n        <NavBarMenu\n          activeItem={activeItem}\n          navItems={[searchItem, ...coreItems, ...pluginItems, ...configItems]}\n          onClose={() => setMenuOpen(false)}\n        />\n      )}\n    </nav>\n  );\n});\n\nNavBarNext.displayName = 'NavBar';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  search: css`\n    display: none;\n    margin-top: 0;\n\n    ${theme.breakpoints.up('md')} {\n      display: block;\n    }\n  `,\n  sidemenu: css`\n    display: flex;\n    flex-direction: column;\n    position: fixed;\n    z-index: ${theme.zIndex.sidemenu};\n\n    ${theme.breakpoints.up('md')} {\n      gap: ${theme.spacing(1)};\n      margin-left: ${theme.spacing(1)};\n      padding: ${theme.spacing(1)} 0;\n      position: relative;\n      width: ${theme.components.sidemenu.width}px;\n    }\n\n    .sidemenu-hidden & {\n      display: none;\n    }\n  `,\n  grafanaLogo: css`\n    align-items: center;\n    display: flex;\n    img {\n      height: ${theme.spacing(3)};\n      width: ${theme.spacing(3)};\n    }\n    justify-content: center;\n  `,\n  mobileSidemenuLogo: css`\n    align-items: center;\n    cursor: pointer;\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    padding: ${theme.spacing(2)};\n\n    ${theme.breakpoints.up('md')} {\n      display: none;\n    }\n  `,\n  spacer: css`\n    flex: 1;\n  `,\n});\n","import React from 'react';\n// @ts-ignore\nimport Drop from 'tether-drop';\nimport { GrafanaRouteComponentProps } from './types';\nimport { locationSearchToObject, navigationLogger, reportPageview } from '@grafana/runtime';\nimport { keybindingSrv } from '../services/keybindingSrv';\n\nexport interface Props extends Omit<GrafanaRouteComponentProps, 'queryParams'> {}\n\nexport class GrafanaRoute extends React.Component<Props> {\n  componentDidMount() {\n    this.updateBodyClassNames();\n    this.cleanupDOM();\n    // unbinds all and re-bind global keybindins\n    keybindingSrv.reset();\n    keybindingSrv.initGlobals();\n    reportPageview();\n    navigationLogger('GrafanaRoute', false, 'Mounted', this.props.match);\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    this.cleanupDOM();\n    reportPageview();\n    navigationLogger('GrafanaRoute', false, 'Updated', this.props, prevProps);\n  }\n\n  componentWillUnmount() {\n    this.updateBodyClassNames(true);\n    navigationLogger('GrafanaRoute', false, 'Unmounted', this.props.route);\n  }\n\n  getPageClasses() {\n    return this.props.route.pageClass ? this.props.route.pageClass.split(' ') : [];\n  }\n\n  updateBodyClassNames(clear = false) {\n    for (const cls of this.getPageClasses()) {\n      if (clear) {\n        document.body.classList.remove(cls);\n      } else {\n        document.body.classList.add(cls);\n      }\n    }\n  }\n\n  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\n  render() {\n    const { props } = this;\n    navigationLogger('GrafanaRoute', false, 'Rendered', props.route);\n\n    const RouteComponent = props.route.component;\n\n    return <RouteComponent {...props} queryParams={locationSearchToObject(props.location.search)} />;\n  }\n}\n","import React, { Component } from 'react';\nimport { AppNotification } from 'app/types';\nimport { Alert } from '@grafana/ui';\n\ninterface Props {\n  appNotification: AppNotification;\n  onClearNotification: (id: string) => void;\n}\n\nexport default class AppNotificationItem extends Component<Props> {\n  shouldComponentUpdate(nextProps: Props) {\n    return this.props.appNotification.id !== nextProps.appNotification.id;\n  }\n\n  componentDidMount() {\n    const { appNotification, onClearNotification } = this.props;\n    setTimeout(() => {\n      onClearNotification(appNotification.id);\n    }, appNotification.timeout);\n  }\n\n  render() {\n    const { appNotification, onClearNotification } = this.props;\n\n    return (\n      <Alert\n        severity={appNotification.severity}\n        title={appNotification.title}\n        onRemove={() => onClearNotification(appNotification.id)}\n        elevated\n      >\n        {appNotification.component || appNotification.text}\n      </Alert>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport appEvents from 'app/core/app_events';\nimport AppNotificationItem from './AppNotificationItem';\nimport { notifyApp, clearAppNotification } from 'app/core/actions';\nimport { StoreState } from 'app/types';\n\nimport {\n  createErrorNotification,\n  createSuccessNotification,\n  createWarningNotification,\n} from '../../copy/appNotification';\nimport { AppEvents } from '@grafana/data';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { VerticalGroup } from '@grafana/ui';\n\nexport interface OwnProps {}\n\nconst mapStateToProps = (state: StoreState, props: OwnProps) => ({\n  appNotifications: state.appNotifications.appNotifications,\n});\n\nconst mapDispatchToProps = {\n  notifyApp,\n  clearAppNotification,\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.clearAppNotification(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 React, { FC } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme } from '@grafana/data';\nimport { DashboardQuery } from '../types';\nimport { useStyles } from '@grafana/ui';\n\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;\n\ninterface SearchFieldProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n  query: DashboardQuery;\n  onChange: (query: string) => void;\n  onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n  clearable?: boolean;\n  width?: number;\n}\n\nconst getSearchFieldStyles = (theme: GrafanaTheme) => ({\n  wrapper: css`\n    width: 100%;\n    display: flex;\n    position: relative;\n    align-items: center;\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.colors.border1};\n    font-size: 20px;\n    line-height: 38px;\n    width: 100%;\n\n    &::placeholder {\n      color: ${theme.colors.textWeak};\n    }\n  `,\n  spacer: css`\n    flex-grow: 1;\n  `,\n  icon: cx(\n    css`\n      color: ${theme.colors.textWeak};\n      padding: 0 ${theme.spacing.md};\n    `\n  ),\n  clearButton: css`\n    font-size: ${theme.typography.size.sm};\n    color: ${theme.colors.textWeak};\n    text-decoration: underline;\n\n    &:hover {\n      cursor: pointer;\n      color: ${theme.colors.textStrong};\n    }\n  `,\n});\n\nexport const SearchField: FC<SearchFieldProps> = ({ query, onChange, size, clearable, className, ...inputProps }) => {\n  const styles = useStyles(getSearchFieldStyles);\n\n  return (\n    <div className={cx(styles.wrapper, className)}>\n      <input\n        type=\"text\"\n        placeholder=\"Search dashboards by name\"\n        value={query.query}\n        onChange={(event: React.ChangeEvent<HTMLInputElement>) => {\n          onChange(event.currentTarget.value);\n        }}\n        tabIndex={0}\n        spellCheck={false}\n        className={styles.input}\n        {...inputProps}\n      />\n\n      <div className={styles.spacer} />\n    </div>\n  );\n};\n","import React, { FC, memo } from 'react';\nimport { css } from '@emotion/css';\nimport { useTheme2, CustomScrollbar, stylesFactory, IconButton } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useSearchQuery } from '../hooks/useSearchQuery';\nimport { useDashboardSearch } from '../hooks/useDashboardSearch';\nimport { SearchField } from './SearchField';\nimport { SearchResults } from './SearchResults';\nimport { ActionRow } from './ActionRow';\n\nexport interface Props {\n  onCloseSearch: () => void;\n}\n\nexport const DashboardSearch: FC<Props> = memo(({ onCloseSearch }) => {\n  const { query, onQueryChange, onTagFilterChange, onTagAdd, onSortChange, onLayoutChange } = useSearchQuery({});\n  const { results, loading, onToggleSection, onKeyDown } = useDashboardSearch(query, onCloseSearch);\n  const theme = useTheme2();\n  const styles = getStyles(theme);\n\n  return (\n    <div tabIndex={0} className={styles.overlay}>\n      <div className={styles.container}>\n        <div className={styles.searchField}>\n          <SearchField query={query} onChange={onQueryChange} onKeyDown={onKeyDown} autoFocus clearable />\n          <div className={styles.closeBtn}>\n            <IconButton name=\"times\" surface=\"panel\" onClick={onCloseSearch} size=\"xxl\" tooltip=\"Close search\" />\n          </div>\n        </div>\n        <div className={styles.search}>\n          <ActionRow\n            {...{\n              onLayoutChange,\n              onSortChange,\n              onTagFilterChange,\n              query,\n            }}\n          />\n          <CustomScrollbar>\n            <SearchResults\n              results={results}\n              loading={loading}\n              onTagSelected={onTagAdd}\n              editable={false}\n              onToggleSection={onToggleSection}\n              layout={query.layout}\n            />\n          </CustomScrollbar>\n        </div>\n      </div>\n    </div>\n  );\n});\n\nDashboardSearch.displayName = 'DashboardSearch';\n\nexport default DashboardSearch;\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\n      ${theme.breakpoints.up('md')} {\n        left: ${theme.components.sidemenu.width}px;\n        z-index: ${theme.zIndex.navbarFixed + 1};\n      }\n    `,\n    container: css`\n      max-width: 1400px;\n      margin: 0 auto;\n      padding: ${theme.spacing(2)};\n\n      height: 100%;\n\n      ${theme.breakpoints.up('md')} {\n        padding: ${theme.spacing(4)};\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      height: 100%;\n      padding-bottom: ${theme.spacing(3)};\n    `,\n  };\n});\n","import { KeyboardEvent, useReducer } from 'react';\nimport { getLocationSrv } from '@grafana/runtime';\nimport { DashboardQuery, DashboardSearchItemType, DashboardSection } from '../types';\nimport { MOVE_SELECTION_DOWN, MOVE_SELECTION_UP } from '../reducers/actionTypes';\nimport { dashboardsSearchState, DashboardsSearchState, searchReducer } from '../reducers/dashboardSearch';\nimport { findSelected } from '../utils';\nimport { useSearch } from './useSearch';\nimport { locationUtil } from '@grafana/data';\n\nexport const useDashboardSearch = (query: DashboardQuery, onCloseSearch: () => void) => {\n  const reducer = useReducer(searchReducer, dashboardsSearchState);\n  const {\n    state: { results, loading },\n    onToggleSection,\n    dispatch,\n  } = useSearch<DashboardsSearchState>(query, reducer, { queryParsing: true });\n\n  const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n    switch (event.key) {\n      case 'Escape':\n        onCloseSearch();\n        break;\n      case 'ArrowUp':\n        dispatch({ type: MOVE_SELECTION_UP });\n        break;\n      case 'ArrowDown':\n        dispatch({ type: MOVE_SELECTION_DOWN });\n        break;\n      case 'Enter':\n        const selectedItem = findSelected(results);\n        if (selectedItem) {\n          if (selectedItem.type === DashboardSearchItemType.DashFolder) {\n            onToggleSection(selectedItem as DashboardSection);\n          } else {\n            getLocationSrv().update({\n              path: locationUtil.stripBaseFromUrl(selectedItem.url),\n            });\n            // Delay closing to prevent current page flicker\n            setTimeout(onCloseSearch, 0);\n          }\n        }\n    }\n  };\n\n  return {\n    results,\n    loading,\n    onToggleSection,\n    onKeyDown,\n  };\n};\n","import React, { FC, memo } from 'react';\nimport DashboardSearch from './DashboardSearch';\nimport { useUrlParams } from 'app/core/navigation/hooks';\nimport { defaultQueryParams } from '../reducers/searchQueryReducer';\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 { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config, getGrafanaLiveSrv } from '@grafana/runtime';\nimport { Alert, stylesFactory } from '@grafana/ui';\nimport React, { PureComponent } from 'react';\nimport { Unsubscribable } from 'rxjs';\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 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 React, { ComponentType } from 'react';\nimport { Router, Route, Redirect, Switch } from 'react-router-dom';\nimport { config, locationService, navigationLogger } from '@grafana/runtime';\nimport { Provider } from 'react-redux';\nimport { store } from 'app/store/store';\nimport { ErrorBoundaryAlert, GlobalStyles, ModalRoot, ModalsProvider } from '@grafana/ui';\nimport { GrafanaApp } from './app';\nimport { getAppRoutes } from 'app/routes/routes';\nimport { ConfigContext, ThemeProvider } from './core/utils/ConfigProvider';\nimport { RouteDescriptor } from './core/navigation/types';\nimport { contextSrv } from './core/services/context_srv';\nimport { NavBar } from './core/components/NavBar/NavBar';\nimport { NavBarNext } from './core/components/NavBar/NavBarNext';\nimport { GrafanaRoute } from './core/navigation/GrafanaRoute';\nimport { AppNotificationList } from './core/components/AppNotifications/AppNotificationList';\nimport { SearchWrapper } from 'app/features/search';\nimport { LiveConnectionWarning } from './features/live/LiveConnectionWarning';\nimport { AngularRoot } from './angular/AngularRoot';\n\ninterface AppWrapperProps {\n  app: GrafanaApp;\n}\n\ninterface AppWrapperState {\n  ngInjector: any;\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}\nexport class AppWrapper extends React.Component<AppWrapperProps, AppWrapperState> {\n  container = React.createRef<HTMLDivElement>();\n\n  constructor(props: AppWrapperProps) {\n    super(props);\n\n    this.state = {\n      ngInjector: null,\n    };\n  }\n\n  componentDidMount() {\n    if (this.container) {\n      this.bootstrapNgApp();\n    } else {\n      throw new Error('Failed to boot angular app, no container to attach to');\n    }\n  }\n\n  bootstrapNgApp() {\n    const injector = this.props.app.angularApp.bootstrap();\n    this.setState({ ngInjector: injector });\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  render() {\n    navigationLogger('AppWrapper', false, 'rendering');\n\n    const newNavigationEnabled = config.featureToggles.newNavigation;\n\n    return (\n      <Provider store={store}>\n        <ErrorBoundaryAlert style=\"page\">\n          <ConfigContext.Provider value={config}>\n            <ThemeProvider>\n              <ModalsProvider>\n                <GlobalStyles />\n                <div className=\"grafana-app\">\n                  <Router history={locationService.getHistory()}>\n                    {newNavigationEnabled ? <NavBarNext /> : <NavBar />}\n                    <main className=\"main-view\">\n                      {pageBanners.map((Banner, index) => (\n                        <Banner key={index.toString()} />\n                      ))}\n\n                      <AngularRoot ref={this.container} />\n                      <AppNotificationList />\n                      <SearchWrapper />\n                      {this.state.ngInjector && this.renderRoutes()}\n                      {bodyRenderHooks.map((Hook, index) => (\n                        <Hook key={index.toString()} />\n                      ))}\n                    </main>\n                  </Router>\n                </div>\n                <LiveConnectionWarning />\n                <ModalRoot />\n              </ModalsProvider>\n            </ThemeProvider>\n          </ConfigContext.Provider>\n        </ErrorBoundaryAlert>\n      </Provider>\n    );\n  }\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 it's an absolute link to another domain or web application\n        if (href.indexOf('://') > 0) {\n          window.location.href = 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 {\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';\nimport { cloneDeep } from 'lodash';\nimport { from, Observable, ReplaySubject, Unsubscribable } from 'rxjs';\nimport { first } from 'rxjs/operators';\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 as any).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 && (datasource as any).query) {\n    return datasource as DataSourceApi;\n  }\n  return await getDatasourceSrv().get(datasource, scopedVars);\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 $ from 'jquery';\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\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 as any).ga =\n      (window as any).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 as any).ga) {\n      return;\n    }\n\n    (window as any).ga('set', { page: e.payload.page });\n    (window as any).ga('send', 'pageview');\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';\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';\nimport { EchoBackend, EchoEventType, isInteractionEvent, isPageviewEvent, PageviewEchoEvent } from '@grafana/runtime';\nimport { User } from '../sentry/types';\n\nexport interface RudderstackBackendOptions {\n  writeKey: string;\n  dataPlaneUrl: string;\n  user?: User;\n}\n\nexport class RudderstackBackend implements EchoBackend<PageviewEchoEvent, RudderstackBackendOptions> {\n  supportedEvents = [EchoEventType.Pageview, EchoEventType.Interaction];\n\n  constructor(public options: RudderstackBackendOptions) {\n    const url = `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);\n\n    if (options.user) {\n      (rds as any).identify(options.user.email, {\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\n  // Not using Echo buffering, addEvent above sends events to GA as soon as they appear\n  flush = () => {};\n}\n","import React, { FC, useCallback, useState } from 'react';\nimport debounce from 'debounce-promise';\nimport { SelectableValue, StandardEditorProps } from '@grafana/data';\nimport { DashboardSearchHit } from 'app/features/search/types';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { AsyncSelect } from '@grafana/ui';\nimport { useAsync } from 'react-use';\n\nexport interface DashboardPickerOptions {\n  placeholder?: string;\n  isClearable?: boolean;\n}\n\nconst getDashboards = (query = '') => {\n  return backendSrv.search({ type: 'dash-db', query, limit: 100 }).then((result: DashboardSearchHit[]) => {\n    return result.map((item: DashboardSearchHit) => ({\n      value: item.uid,\n      label: `${item?.folderTitle ?? 'General'}/${item.title}`,\n    }));\n  });\n};\n\n/** This will return the item UID */\nexport const DashboardPicker: FC<StandardEditorProps<string, any, any>> = ({ value, onChange, item }) => {\n  const [current, setCurrent] = useState<SelectableValue<string>>();\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  useAsync(async () => {\n    if (!value) {\n      setCurrent(undefined);\n      return;\n    }\n    const res = await backendSrv.getDashboardByUid(value);\n    setCurrent({\n      value: res.dashboard.uid,\n      label: `${res.meta?.folderTitle ?? 'General'}/${res.dashboard.title}`,\n    });\n    return undefined;\n  }, [value]);\n\n  const onPicked = useCallback(\n    (sel: SelectableValue<string>) => {\n      onChange(sel?.value);\n    },\n    [onChange]\n  );\n  const debouncedSearch = debounce(getDashboards, 300);\n  const { placeholder, isClearable } = item?.settings ?? {};\n\n  return (\n    <AsyncSelect\n      menuShouldPortal\n      isClearable={isClearable}\n      defaultOptions={true}\n      loadOptions={debouncedSearch}\n      onChange={onPicked}\n      placeholder={placeholder ?? 'Select dashboard'}\n      noOptionsMessage=\"No dashboards found\"\n      value={current}\n    />\n  );\n};\n","import { DashboardPicker, DashboardPickerOptions } from './DashboardPicker';\nimport { getStandardOptionEditors } from '@grafana/ui';\nimport { StandardEditorsRegistryItem } from '@grafana/data';\n\n/**\n * Returns collection of standard option editors definitions\n */\nexport const getAllOptionEditors = () => {\n  const dashboardPicker: StandardEditorsRegistryItem<string, DashboardPickerOptions> = {\n    id: 'dashboard-uid',\n    name: 'Dashboard',\n    description: 'Select dashboard',\n    editor: DashboardPicker as any,\n  };\n  return [...getStandardOptionEditors(), dashboardPicker];\n};\n","import React from 'react';\nimport { CoreApp, GrafanaTheme2, PanelDataSummary, VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { usePanelContext, useStyles2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { PanelDataErrorViewProps } from '@grafana/runtime';\nimport { CardButton } from 'app/core/components/CardButton';\nimport { useDispatch } from 'react-redux';\nimport { toggleVizPicker } from 'app/features/dashboard/components/PanelEditor/state/reducers';\nimport { changePanelPlugin } from '../state/actions';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport store from 'app/core/store';\nimport { LS_VISUALIZATION_SELECT_TAB_KEY } from 'app/core/constants';\nimport { VisualizationSelectPaneTab } from 'app/features/dashboard/components/PanelEditor/types';\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, message, needsNumberField, needsTimeField, needsStringField }: PanelDataErrorViewProps,\n  dataSummary: PanelDataSummary\n): string {\n  if (message) {\n    return message;\n  }\n\n  if (!data.series || data.series.length === 0) {\n    return '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","// @ts-ignore\nimport baron from 'baron';\nimport { PanelEvents } from '@grafana/data';\nimport { PanelModel } from '../../features/dashboard/state';\nimport { PanelCtrl } from './panel_ctrl';\nimport { Subscription } from 'rxjs';\nimport { PanelDirectiveReadyEvent, RenderEvent } from 'app/types/events';\nimport { coreModule } from 'app/angular/core_module';\nimport { RefreshEvent } from '@grafana/runtime';\n\nconst panelTemplate = `\n  <ng-transclude class=\"panel-height-helper\"></ng-transclude>\n`;\n\ncoreModule.directive('grafanaPanel', ($rootScope, $document, $timeout) => {\n  return {\n    restrict: 'E',\n    template: panelTemplate,\n    transclude: true,\n    scope: { ctrl: '=' },\n    link: (scope: any, elem) => {\n      const ctrl: PanelCtrl = scope.ctrl;\n      const panel: PanelModel = scope.ctrl.panel;\n      const subs = new Subscription();\n\n      let panelScrollbar: any;\n\n      function resizeScrollableContent() {\n        if (panelScrollbar) {\n          panelScrollbar.update();\n        }\n      }\n\n      ctrl.events.on(PanelEvents.componentDidMount, () => {\n        if ((ctrl as any).__proto__.constructor.scrollable) {\n          const scrollRootClass = 'baron baron__root baron__clipper panel-content--scrollable';\n          const scrollerClass = 'baron__scroller';\n          const scrollBarHTML = `\n            <div class=\"baron__track\">\n              <div class=\"baron__bar\"></div>\n            </div>\n          `;\n\n          const scrollRoot = elem;\n          const scroller = elem.find(':first').find(':first');\n\n          scrollRoot.addClass(scrollRootClass);\n          $(scrollBarHTML).appendTo(scrollRoot);\n          scroller.addClass(scrollerClass);\n\n          panelScrollbar = baron({\n            root: scrollRoot[0],\n            scroller: scroller[0],\n            bar: '.baron__bar',\n            barOnCls: '_scrollbar',\n            scrollingCls: '_scrolling',\n          });\n\n          panelScrollbar.scroll();\n        }\n      });\n\n      function updateDimensionsFromParentScope() {\n        ctrl.height = scope.$parent.$parent.size.height;\n        ctrl.width = scope.$parent.$parent.size.width;\n      }\n\n      updateDimensionsFromParentScope();\n\n      // Pass PanelModel events down to angular controller event emitter\n      subs.add(\n        panel.events.subscribe(RefreshEvent, () => {\n          updateDimensionsFromParentScope();\n          ctrl.events.emit('refresh');\n        })\n      );\n\n      subs.add(\n        panel.events.subscribe(RenderEvent, (event) => {\n          // this event originated from angular so no need to bubble it back\n          if (event.payload?.fromAngular) {\n            return;\n          }\n\n          updateDimensionsFromParentScope();\n\n          $timeout(() => {\n            resizeScrollableContent();\n            ctrl.events.emit('render');\n          });\n        })\n      );\n\n      subs.add(\n        ctrl.events.subscribe(RenderEvent, (event) => {\n          // this event originated from angular so bubble it to react so the PanelChromeAngular can update the panel header alert state\n          if (event.payload) {\n            event.payload.fromAngular = true;\n            panel.events.publish(event);\n          }\n        })\n      );\n\n      scope.$on('$destroy', () => {\n        elem.off();\n\n        // Remove PanelModel.event subs\n        subs.unsubscribe();\n        // Remove Angular controller event subs\n        ctrl.events.emit(PanelEvents.panelTeardown);\n        ctrl.events.removeAllListeners();\n\n        if (panelScrollbar) {\n          panelScrollbar.dispose();\n        }\n      });\n\n      panel.events.publish(PanelDirectiveReadyEvent);\n    },\n  };\n});\n","import angular from 'angular';\n\nconst directiveModule = angular.module('grafana.directives');\nconst directiveCache: any = {};\n\n/** @ngInject */\nfunction panelEditorTab(dynamicDirectiveSrv: any) {\n  return dynamicDirectiveSrv.create({\n    scope: {\n      ctrl: '=',\n      editorTab: '=',\n    },\n    directive: (scope: any) => {\n      const pluginId = scope.ctrl.pluginId;\n      const tabName = scope.editorTab.title\n        .toLowerCase()\n        .replace(' ', '-')\n        .replace('&', '')\n        .replace(' ', '')\n        .replace(' ', '-');\n\n      if (directiveCache[pluginId]) {\n        if (directiveCache[pluginId][tabName]) {\n          return directiveCache[pluginId][tabName];\n        }\n      } else {\n        directiveCache[pluginId] = [];\n      }\n\n      const result = {\n        fn: () => scope.editorTab.directiveFn(),\n        name: `panel-editor-tab-${pluginId}${tabName}`,\n      };\n\n      directiveCache[pluginId][tabName] = result;\n\n      return result;\n    },\n  });\n}\n\ndirectiveModule.directive('panelEditorTab', panelEditorTab);\n","import { coreModule } from 'app/angular/core_module';\n\nexport class QueryRowCtrl {\n  target: any;\n  queryCtrl: any;\n  panelCtrl: any;\n  panel: any;\n  hasTextEditMode = false;\n\n  $onInit() {\n    this.panelCtrl = this.queryCtrl.panelCtrl;\n    this.target = this.queryCtrl.target;\n    this.panel = this.panelCtrl.panel;\n\n    if (this.hasTextEditMode && this.queryCtrl.toggleEditorMode) {\n      // expose this function to react parent component\n      this.panelCtrl.toggleEditorMode = this.queryCtrl.toggleEditorMode.bind(this.queryCtrl);\n    }\n\n    if (this.queryCtrl.getCollapsedText) {\n      // expose this function to react parent component\n      this.panelCtrl.getCollapsedText = this.queryCtrl.getCollapsedText.bind(this.queryCtrl);\n    }\n  }\n}\n\n/** @ngInject */\nfunction queryEditorRowDirective() {\n  return {\n    restrict: 'E',\n    controller: QueryRowCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    templateUrl: 'public/app/angular/panel/partials/query_editor_row.html',\n    transclude: true,\n    scope: {\n      queryCtrl: '=',\n      canCollapse: '=',\n      hasTextEditMode: '=',\n    },\n  };\n}\n\ncoreModule.directive('queryEditorRow', queryEditorRowDirective);\n","import { isArray, isNull, isObject, isUndefined } from 'lodash';\nimport angular from 'angular';\nimport coreModule from '../core_module';\nimport { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport { dateTime } from '@grafana/data';\n\ncoreModule.filter('stringSort', () => {\n  return (input: any) => {\n    return input.sort();\n  };\n});\n\ncoreModule.filter('slice', () => {\n  return (arr: any[], start: any, end: any) => {\n    if (!isUndefined(arr)) {\n      return arr.slice(start, end);\n    }\n    return arr;\n  };\n});\n\ncoreModule.filter('stringify', () => {\n  return (arr: any[]) => {\n    if (isObject(arr) && !isArray(arr)) {\n      return angular.toJson(arr);\n    } else {\n      return isNull(arr) ? null : arr.toString();\n    }\n  };\n});\n\ncoreModule.filter('moment', () => {\n  return (date: string, mode: string) => {\n    switch (mode) {\n      case 'ago':\n        return dateTime(date).fromNow();\n    }\n    return dateTime(date).fromNow();\n  };\n});\n\nfunction interpolateTemplateVars(templateSrv: TemplateSrv = getTemplateSrv()) {\n  const filterFunc: any = (text: string, scope: any) => {\n    let scopedVars;\n    if (scope.ctrl) {\n      scopedVars = (scope.ctrl.panel || scope.ctrl.row).scopedVars;\n    } else {\n      scopedVars = scope.row.scopedVars;\n    }\n\n    return templateSrv.replaceWithText(text, scopedVars);\n  };\n\n  filterFunc.$stateful = true;\n  return filterFunc;\n}\n\ncoreModule.filter('interpolateTemplateVars', interpolateTemplateVars);\nexport default {};\n","import coreModule from 'app/angular/core_module';\n\nexport class AlertSrv {\n  constructor() {}\n\n  set() {\n    console.warn('old deprecated alert srv being used');\n  }\n}\n\n// this is just added to not break old plugins that might be using it\ncoreModule.service('alertSrv', AlertSrv);\n","import angular from 'angular';\nimport coreModule from '../core_module';\n\nclass DynamicDirectiveSrv {\n  /** @ngInject */\n  constructor(private $compile: angular.ICompileService) {}\n\n  addDirective(element: any, name: string, scope: any) {\n    const child = angular.element(document.createElement(name));\n    this.$compile(child)(scope);\n\n    element.empty();\n    element.append(child);\n  }\n\n  link(scope: any, elem: JQLite, attrs: any, options: any) {\n    const directiveInfo = options.directive(scope);\n    if (!directiveInfo || !directiveInfo.fn) {\n      elem.empty();\n      return;\n    }\n\n    if (!directiveInfo.fn.registered) {\n      coreModule.directive(attrs.$normalize(directiveInfo.name), directiveInfo.fn);\n      directiveInfo.fn.registered = true;\n    }\n\n    this.addDirective(elem, directiveInfo.name, scope);\n  }\n\n  create(options: any) {\n    const directiveDef = {\n      restrict: 'E',\n      scope: options.scope,\n      link: (scope: any, elem: JQLite, attrs: any) => {\n        if (options.watchPath) {\n          let childScope: any = null;\n          scope.$watch(options.watchPath, () => {\n            if (childScope) {\n              childScope.$destroy();\n            }\n            childScope = scope.$new();\n            this.link(childScope, elem, attrs, options);\n          });\n        } else {\n          this.link(scope, elem, attrs, options);\n        }\n      },\n    };\n\n    return directiveDef;\n  }\n}\n\ncoreModule.service('dynamicDirectiveSrv', DynamicDirectiveSrv);\n","//\n// This is using ng-react with this PR applied https://github.com/ngReact/ngReact/pull/199\n//\n\n// # ngReact\n// ### Use React Components inside of your Angular applications\n//\n// Composed of\n// - reactComponent (generic directive for delegating off to React Components)\n// - reactDirective (factory for creating specific directives that correspond to reactComponent directives)\n\nimport { kebabCase } from 'lodash';\nimport React, { ComponentType } from 'react';\nimport ReactDOM from 'react-dom';\nimport angular, { auto } from 'angular';\n\n// get a react component from name (components can be an angular injectable e.g. value, factory or\n// available on window\nfunction getReactComponent(name: string | Function, $injector: auto.IInjectorService): ComponentType {\n  // if name is a function assume it is component and return it\n  if (angular.isFunction(name)) {\n    return (name as unknown) as ComponentType;\n  }\n\n  // a React component name must be specified\n  if (!name) {\n    throw new Error('ReactComponent name attribute must be specified');\n  }\n\n  // ensure the specified React component is accessible, and fail fast if it's not\n  let reactComponent;\n  try {\n    reactComponent = $injector.get(name);\n  } catch (e) {}\n\n  if (!reactComponent) {\n    try {\n      reactComponent = name.split('.').reduce((current, namePart) => {\n        // @ts-ignore\n        return current[namePart];\n      }, window);\n    } catch (e) {}\n  }\n\n  if (!reactComponent) {\n    throw Error('Cannot find react component ' + name);\n  }\n\n  return (reactComponent as unknown) as ComponentType;\n}\n\n// wraps a function with scope.$apply, if already applied just return\nfunction applied(fn: any, scope: any) {\n  if (fn.wrappedInApply) {\n    return fn;\n  }\n  // this had the equivalent of `eslint-disable-next-line prefer-arrow/prefer-arrow-functions`\n  const wrapped: any = function () {\n    const args = arguments;\n    const phase = scope.$root.$$phase;\n    if (phase === '$apply' || phase === '$digest') {\n      return fn.apply(null, args);\n    } else {\n      return scope.$apply(() => {\n        return fn.apply(null, args);\n      });\n    }\n  };\n  wrapped.wrappedInApply = true;\n  return wrapped;\n}\n\n/**\n * wraps functions on obj in scope.$apply\n *\n * keeps backwards compatibility, as if propsConfig is not passed, it will\n * work as before, wrapping all functions and won't wrap only when specified.\n *\n * @version 0.4.1\n * @param obj react component props\n * @param scope current scope\n * @param propsConfig configuration object for all properties\n * @returns {Object} props with the functions wrapped in scope.$apply\n */\nfunction applyFunctions(obj: any, scope: any, propsConfig?: any): object {\n  return Object.keys(obj || {}).reduce((prev, key) => {\n    const value = obj[key];\n    const config = (propsConfig || {})[key] || {};\n    /**\n     * wrap functions in a function that ensures they are scope.$applied\n     * ensures that when function is called from a React component\n     * the Angular digest cycle is run\n     */\n    // @ts-ignore\n    prev[key] = angular.isFunction(value) && config.wrapApply !== false ? applied(value, scope) : value;\n\n    return prev;\n  }, {});\n}\n\n/**\n *\n * @param watchDepth (value of HTML watch-depth attribute)\n * @param scope (angular scope)\n *\n * Uses the watchDepth attribute to determine how to watch props on scope.\n * If watchDepth attribute is NOT reference or collection, watchDepth defaults to deep watching by value\n */\nfunction watchProps(watchDepth: string, scope: any, watchExpressions: any[], listener: any) {\n  const supportsWatchCollection = angular.isFunction(scope.$watchCollection);\n  const supportsWatchGroup = angular.isFunction(scope.$watchGroup);\n\n  const watchGroupExpressions = [];\n\n  for (const expr of watchExpressions) {\n    const actualExpr = getPropExpression(expr);\n    const exprWatchDepth = getPropWatchDepth(watchDepth, expr);\n\n    // ignore empty expressions & expressions with functions\n    if (!actualExpr || actualExpr.match(/\\(.*\\)/) || exprWatchDepth === 'one-time') {\n      continue;\n    }\n\n    if (exprWatchDepth === 'collection' && supportsWatchCollection) {\n      scope.$watchCollection(actualExpr, listener);\n    } else if (exprWatchDepth === 'reference' && supportsWatchGroup) {\n      watchGroupExpressions.push(actualExpr);\n    } else {\n      scope.$watch(actualExpr, listener, exprWatchDepth !== 'reference');\n    }\n  }\n\n  if (watchDepth === 'one-time') {\n    listener();\n  }\n\n  if (watchGroupExpressions.length) {\n    scope.$watchGroup(watchGroupExpressions, listener);\n  }\n}\n\n// render React component, with scope[attrs.props] being passed in as the component props\nfunction renderComponent(component: any, props: object, scope: any, elem: Element[]) {\n  scope.$evalAsync(() => {\n    ReactDOM.render(React.createElement(component, props), elem[0]);\n  });\n}\n\n// get prop name from prop (string or array)\nfunction getPropName(prop: any) {\n  return Array.isArray(prop) ? prop[0] : prop;\n}\n\n// get prop name from prop (string or array)\nfunction getPropConfig(prop: any) {\n  return Array.isArray(prop) ? prop[1] : {};\n}\n\n// get prop expression from prop (string or array)\nfunction getPropExpression(prop: any) {\n  return Array.isArray(prop) ? prop[0] : prop;\n}\n\n/**\n * Finds the normalized attribute knowing that React props accept any type of capitalization and it also handles\n * kabab case attributes which can be used in case the attribute would also be a standard html attribute and would be\n * evaluated by the browser as such.\n * @param attrs All attributes of the component.\n * @param propName Name of the prop that react component expects.\n */\nfunction findAttribute(attrs: string, propName: string): string {\n  const index = Object.keys(attrs).find((attr) => {\n    return attr.toLowerCase() === propName.toLowerCase() || attr.toLowerCase() === kebabCase(propName);\n  });\n  // @ts-ignore\n  return attrs[index];\n}\n\n// get watch depth of prop (string or array)\nfunction getPropWatchDepth(defaultWatch: string, prop: string | any[]) {\n  const customWatchDepth = Array.isArray(prop) && angular.isObject(prop[1]) && prop[1].watchDepth;\n  return customWatchDepth || defaultWatch;\n}\n\n// # reactComponent\n// Directive that allows React components to be used in Angular templates.\n//\n// Usage:\n//     <react-component name=\"Hello\" props=\"name\"/>\n//\n// This requires that there exists an injectable or globally available 'Hello' React component.\n// The 'props' attribute is optional and is passed to the component.\n//\n// The following would would create and register the component:\n//\n//     var module = angular.module('ace.react.components');\n//     module.value('Hello', React.createClass({\n//         render: function() {\n//             return <div>Hello {this.props.name}</div>;\n//         }\n//     }));\n//\nconst reactComponent = ($injector: any): any => {\n  return {\n    restrict: 'E',\n    replace: true,\n    link: function (scope: any, elem: Element[], attrs: any) {\n      const reactComponent = getReactComponent(attrs.name, $injector);\n\n      const renderMyComponent = () => {\n        const scopeProps = scope.$eval(attrs.props);\n        const props = applyFunctions(scopeProps, scope);\n\n        renderComponent(reactComponent, props, scope, elem);\n      };\n\n      // If there are props, re-render when they change\n      attrs.props ? watchProps(attrs.watchDepth, scope, [attrs.props], renderMyComponent) : renderMyComponent();\n\n      // cleanup when scope is destroyed\n      scope.$on('$destroy', () => {\n        if (!attrs.onScopeDestroy) {\n          ReactDOM.unmountComponentAtNode(elem[0]);\n        } else {\n          scope.$eval(attrs.onScopeDestroy, {\n            unmountComponent: ReactDOM.unmountComponentAtNode.bind(this, elem[0]),\n          });\n        }\n      });\n    },\n  };\n};\n\n// # reactDirective\n// Factory function to create directives for React components.\n//\n// With a component like this:\n//\n//     var module = angular.module('ace.react.components');\n//     module.value('Hello', React.createClass({\n//         render: function() {\n//             return <div>Hello {this.props.name}</div>;\n//         }\n//     }));\n//\n// A directive can be created and registered with:\n//\n//     module.directive('hello', function(reactDirective) {\n//         return reactDirective('Hello', ['name']);\n//     });\n//\n// Where the first argument is the injectable or globally accessible name of the React component\n// and the second argument is an array of property names to be watched and passed to the React component\n// as props.\n//\n// This directive can then be used like this:\n//\n//     <hello name=\"name\"/>\n//\nconst reactDirective = ($injector: auto.IInjectorService) => {\n  return (reactComponentName: string, props: string[], conf: any, injectableProps: any) => {\n    const directive = {\n      restrict: 'E',\n      replace: true,\n      link: function (scope: any, elem: Element[], attrs: any) {\n        const reactComponent = getReactComponent(reactComponentName, $injector);\n\n        // if props is not defined, fall back to use the React component's propTypes if present\n        props = props || Object.keys(reactComponent.propTypes || {});\n\n        // for each of the properties, get their scope value and set it to scope.props\n        const renderMyComponent = () => {\n          let scopeProps: any = {};\n          const config: any = {};\n\n          props.forEach((prop) => {\n            const propName = getPropName(prop);\n            scopeProps[propName] = scope.$eval(findAttribute(attrs, propName));\n            config[propName] = getPropConfig(prop);\n          });\n\n          scopeProps = applyFunctions(scopeProps, scope, config);\n          scopeProps = angular.extend({}, scopeProps, injectableProps);\n          renderComponent(reactComponent, scopeProps, scope, elem);\n        };\n\n        // watch each property name and trigger an update whenever something changes,\n        // to update scope.props with new values\n        const propExpressions = props.map((prop) => {\n          return Array.isArray(prop)\n            ? [findAttribute(attrs, prop[0]), getPropConfig(prop)]\n            : findAttribute(attrs, prop);\n        });\n\n        // If we don't have any props, then our watch statement won't fire.\n        props.length ? watchProps(attrs.watchDepth, scope, propExpressions, renderMyComponent) : renderMyComponent();\n\n        // cleanup when scope is destroyed\n        scope.$on('$destroy', () => {\n          if (!attrs.onScopeDestroy) {\n            ReactDOM.unmountComponentAtNode(elem[0]);\n          } else {\n            scope.$eval(attrs.onScopeDestroy, {\n              unmountComponent: ReactDOM.unmountComponentAtNode.bind(this, elem[0]),\n            });\n          }\n        });\n      },\n    };\n    return angular.extend(directive, conf);\n  };\n};\n\nconst ngModule = angular.module('react', []);\nngModule.directive('reactComponent', ['$injector', reactComponent]);\nngModule.factory('reactDirective', ['$injector', reactDirective]);\n","import { each, isString, map } from 'lodash';\nimport coreModule from '../core_module';\n\n/** @ngInject */\nexport function uiSegmentSrv(this: any, $sce: any, templateSrv: any) {\n  const self = this;\n\n  class MetricSegment {\n    value: string;\n    html: any;\n    type: any;\n    expandable?: boolean;\n    text?: string;\n    cssClass?: string;\n    fake?: boolean;\n    custom?: boolean;\n    selectMode?: any;\n\n    constructor(options: any) {\n      if (options === '*' || options.value === '*') {\n        this.value = '*';\n        this.html = $sce.trustAsHtml('<i class=\"fa fa-asterisk\"><i>');\n        this.type = options.type;\n        this.expandable = true;\n        return;\n      }\n\n      if (isString(options)) {\n        this.value = options;\n        this.html = $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(this.value));\n        return;\n      }\n\n      // temp hack to work around legacy inconsistency in segment model\n      this.text = options.value;\n\n      this.cssClass = options.cssClass;\n      this.custom = options.custom;\n      this.type = options.type;\n      this.fake = options.fake;\n      this.value = options.value;\n      this.selectMode = options.selectMode;\n      this.expandable = options.expandable;\n      this.html = options.html || $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(this.value));\n    }\n  }\n\n  this.getSegmentForValue = function (value: string, fallbackText: string) {\n    if (value) {\n      return this.newSegment(value);\n    } else {\n      return this.newSegment({ value: fallbackText, fake: true });\n    }\n  };\n\n  this.newSelectMeasurement = () => {\n    return new MetricSegment({ value: 'select measurement', fake: true });\n  };\n\n  this.newFake = (text: string, type: string, cssClass: string) => {\n    return new MetricSegment({ value: text, fake: true, type: type, cssClass: cssClass });\n  };\n\n  this.newSegment = (options: any) => {\n    return new MetricSegment(options);\n  };\n\n  this.newKey = (key: string) => {\n    return new MetricSegment({ value: key, type: 'key', cssClass: 'query-segment-key' });\n  };\n\n  this.newKeyValue = (value: string) => {\n    return new MetricSegment({ value: value, type: 'value', cssClass: 'query-segment-value' });\n  };\n\n  this.newCondition = (condition: string) => {\n    return new MetricSegment({ value: condition, type: 'condition', cssClass: 'query-keyword' });\n  };\n\n  this.newOperator = (op: string) => {\n    return new MetricSegment({ value: op, type: 'operator', cssClass: 'query-segment-operator' });\n  };\n\n  this.newOperators = (ops: string[]) => {\n    return map(ops, (op) => {\n      return new MetricSegment({ value: op, type: 'operator', cssClass: 'query-segment-operator' });\n    });\n  };\n\n  this.transformToSegments = (addTemplateVars: boolean, variableTypeFilter: string) => {\n    return (results: any[]) => {\n      const segments = map(results, (segment) => {\n        return self.newSegment({ value: segment.text, expandable: segment.expandable });\n      });\n\n      if (addTemplateVars) {\n        each(templateSrv.getVariables(), (variable) => {\n          if (variableTypeFilter === void 0 || variableTypeFilter === variable.type) {\n            segments.unshift(self.newSegment({ type: 'value', value: '$' + variable.name, expandable: true }));\n          }\n        });\n      }\n\n      return segments;\n    };\n  };\n\n  this.newSelectMetric = () => {\n    return new MetricSegment({ value: 'select metric', fake: true });\n  };\n\n  this.newPlusButton = () => {\n    return new MetricSegment({\n      fake: true,\n      html: '<i class=\"fa fa-plus \"></i>',\n      type: 'plus-button',\n      cssClass: 'query-part',\n    });\n  };\n}\n\ncoreModule.service('uiSegmentSrv', uiSegmentSrv);\n","import { extend } from 'lodash';\nimport coreModule from 'app/angular/core_module';\n// @ts-ignore\nimport Drop from 'tether-drop';\nimport { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\n\n/** @ngInject */\nfunction popoverSrv(this: any, $compile: any, $rootScope: GrafanaRootScope, $timeout: any) {\n  let openDrop: any = null;\n\n  this.close = () => {\n    if (openDrop) {\n      openDrop.close();\n    }\n  };\n\n  this.show = (options: any) => {\n    if (openDrop) {\n      openDrop.close();\n      openDrop = null;\n    }\n\n    const scope = extend($rootScope.$new(true), options.model);\n    let drop: any;\n\n    const cleanUp = () => {\n      setTimeout(() => {\n        scope.$destroy();\n\n        if (drop.tether) {\n          drop.destroy();\n        }\n\n        if (options.onClose) {\n          options.onClose();\n        }\n      });\n\n      openDrop = null;\n    };\n\n    scope.dismiss = () => {\n      drop.close();\n    };\n\n    const contentElement = document.createElement('div');\n    contentElement.innerHTML = options.template;\n\n    $compile(contentElement)(scope);\n\n    $timeout(() => {\n      drop = new Drop({\n        target: options.element,\n        content: contentElement,\n        position: options.position,\n        classes: options.classNames || 'drop-popover',\n        openOn: options.openOn,\n        hoverCloseDelay: 200,\n        tetherOptions: {\n          constraints: [{ to: 'scrollParent', attachment: 'together' }],\n        },\n      });\n\n      drop.on('close', () => {\n        cleanUp();\n      });\n\n      openDrop = drop;\n      openDrop.open();\n    }, 100);\n\n    // return close function\n    return () => {\n      if (drop) {\n        drop.close();\n      }\n    };\n  };\n}\n\ncoreModule.service('popoverSrv', popoverSrv);\n","import { without, each } from 'lodash';\nimport coreModule from 'app/angular/core_module';\nimport { ITimeoutService } from 'angular';\n\n// This service really just tracks a list of $timeout promises to give us a\n// method for canceling them all when we need to\nexport class Timer {\n  timers: Array<angular.IPromise<any>> = [];\n\n  /** @ngInject */\n  constructor(private $timeout: ITimeoutService) {}\n\n  register(promise: angular.IPromise<any>) {\n    this.timers.push(promise);\n    return promise;\n  }\n\n  cancel(promise: angular.IPromise<any>) {\n    this.timers = without(this.timers, promise);\n    this.$timeout.cancel(promise);\n  }\n\n  cancelAll() {\n    each(this.timers, (t) => {\n      this.$timeout.cancel(t);\n    });\n    this.timers = [];\n  }\n}\n\ncoreModule.service('timer', Timer);\n","import angular from 'angular';\nimport coreModule from 'app/angular/core_module';\nimport { assign } from 'lodash';\n\nimport { AngularComponent, AngularLoader as AngularLoaderInterface } from '@grafana/runtime';\nimport { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\n\nexport class AngularLoader implements AngularLoaderInterface {\n  /** @ngInject */\n  constructor(private $compile: any, private $rootScope: GrafanaRootScope) {}\n\n  load(elem: any, scopeProps: any, template: string): AngularComponent {\n    const scope = this.$rootScope.$new();\n\n    assign(scope, scopeProps);\n\n    const compiledElem = this.$compile(template)(scope);\n    const rootNode = angular.element(elem);\n    rootNode.append(compiledElem);\n\n    return {\n      destroy: () => {\n        scope.$destroy();\n        compiledElem.remove();\n      },\n      digest: () => {\n        if (!scope.$$phase) {\n          scope.$digest();\n        }\n      },\n      getScope: () => {\n        return scope;\n      },\n    };\n  }\n}\n\ncoreModule.service('angularLoader', AngularLoader);\n","import { each, reduce } from 'lodash';\nimport $ from 'jquery';\nimport coreModule from './core_module';\n\n/** @ngInject */\nexport function dropdownTypeahead($compile: any) {\n  const inputTemplate =\n    '<input type=\"text\"' +\n    ' class=\"gf-form-input input-medium tight-form-input\"' +\n    ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const buttonTemplate =\n    '<a class=\"gf-form-label tight-form-func dropdown-toggle\"' +\n    ' tabindex=\"1\" gf-dropdown=\"menuItems\" data-toggle=\"dropdown\"' +\n    ' ><i class=\"fa fa-plus\"></i></a>';\n\n  return {\n    scope: {\n      menuItems: '=dropdownTypeahead',\n      dropdownTypeaheadOnSelect: '&dropdownTypeaheadOnSelect',\n      model: '=ngModel',\n    },\n    link: ($scope: any, elem: any, attrs: any) => {\n      const $input = $(inputTemplate);\n      const $button = $(buttonTemplate);\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      if (attrs.linkText) {\n        $button.html(attrs.linkText);\n      }\n\n      if (attrs.ngModel) {\n        $scope.$watch('model', (newValue: any) => {\n          each($scope.menuItems, (item) => {\n            each(item.submenu, (subItem) => {\n              if (subItem.value === newValue) {\n                $button.html(subItem.text);\n              }\n            });\n          });\n        });\n      }\n\n      const typeaheadValues = reduce(\n        $scope.menuItems,\n        (memo: any[], value, index) => {\n          if (!value.submenu) {\n            value.click = 'menuItemSelected(' + index + ')';\n            memo.push(value.text);\n          } else {\n            each(value.submenu, (item, subIndex) => {\n              item.click = 'menuItemSelected(' + index + ',' + subIndex + ')';\n              memo.push(value.text + ' ' + item.text);\n            });\n          }\n          return memo;\n        },\n        []\n      );\n\n      const closeDropdownMenu = () => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        elem.removeClass('open');\n      };\n\n      $scope.menuItemSelected = (index: number, subIndex: number) => {\n        const menuItem = $scope.menuItems[index];\n        const payload: any = { $item: menuItem };\n        if (menuItem.submenu && subIndex !== void 0) {\n          payload.$subItem = menuItem.submenu[subIndex];\n        }\n        $scope.dropdownTypeaheadOnSelect(payload);\n        closeDropdownMenu();\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: typeaheadValues,\n        minLength: 1,\n        items: 10,\n        updater: (value: string) => {\n          const result: any = {};\n          each($scope.menuItems, (menuItem) => {\n            each(menuItem.submenu, (submenuItem) => {\n              if (value === menuItem.text + ' ' + submenuItem.text) {\n                result.$subItem = submenuItem;\n                result.$item = menuItem;\n              }\n            });\n          });\n\n          if (result.$item) {\n            $scope.$apply(() => {\n              $scope.dropdownTypeaheadOnSelect(result);\n            });\n          }\n\n          $input.trigger('blur');\n          return '';\n        },\n      });\n\n      $button.click(() => {\n        $button.hide();\n        $input.show();\n        $input.focus();\n      });\n\n      $input.keyup(() => {\n        elem.toggleClass('open', $input.val() === '');\n      });\n\n      elem.mousedown((evt: Event) => {\n        evt.preventDefault();\n      });\n\n      $input.blur(() => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        // clicking the function dropdown menu won't\n        // work if you remove class at once\n        setTimeout(() => {\n          elem.removeClass('open');\n        }, 200);\n      });\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\n/** @ngInject */\nexport function dropdownTypeahead2($compile: any) {\n  const inputTemplate =\n    '<input type=\"text\"' + ' class=\"gf-form-input\"' + ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const buttonTemplate =\n    '<a class=\"{{buttonTemplateClass}} dropdown-toggle\"' +\n    ' tabindex=\"1\" gf-dropdown=\"menuItems\" data-toggle=\"dropdown\"' +\n    ' ><i class=\"fa fa-plus\"></i></a>';\n\n  return {\n    scope: {\n      menuItems: '=dropdownTypeahead2',\n      dropdownTypeaheadOnSelect: '&dropdownTypeaheadOnSelect',\n      model: '=ngModel',\n      buttonTemplateClass: '@',\n    },\n    link: ($scope: any, elem: any, attrs: any) => {\n      const $input = $(inputTemplate);\n\n      if (!$scope.buttonTemplateClass) {\n        $scope.buttonTemplateClass = 'gf-form-input';\n      }\n\n      const $button = $(buttonTemplate);\n      const timeoutId = {\n        blur: null as any,\n      };\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      if (attrs.linkText) {\n        $button.html(attrs.linkText);\n      }\n\n      if (attrs.ngModel) {\n        $scope.$watch('model', (newValue: any) => {\n          each($scope.menuItems, (item) => {\n            each(item.submenu, (subItem) => {\n              if (subItem.value === newValue) {\n                $button.html(subItem.text);\n              }\n            });\n          });\n        });\n      }\n\n      const typeaheadValues = reduce(\n        $scope.menuItems,\n        (memo: any[], value, index) => {\n          if (!value.submenu) {\n            value.click = 'menuItemSelected(' + index + ')';\n            memo.push(value.text);\n          } else {\n            each(value.submenu, (item, subIndex) => {\n              item.click = 'menuItemSelected(' + index + ',' + subIndex + ')';\n              memo.push(value.text + ' ' + item.text);\n            });\n          }\n          return memo;\n        },\n        []\n      );\n\n      const closeDropdownMenu = () => {\n        $input.hide();\n        $input.val('');\n        $button.show();\n        $button.focus();\n        elem.removeClass('open');\n      };\n\n      $scope.menuItemSelected = (index: number, subIndex: number) => {\n        const menuItem = $scope.menuItems[index];\n        const payload: any = { $item: menuItem };\n        if (menuItem.submenu && subIndex !== void 0) {\n          payload.$subItem = menuItem.submenu[subIndex];\n        }\n        $scope.dropdownTypeaheadOnSelect(payload);\n        closeDropdownMenu();\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: typeaheadValues,\n        minLength: 1,\n        items: 10,\n        updater: (value: string) => {\n          const result: any = {};\n          each($scope.menuItems, (menuItem) => {\n            each(menuItem.submenu, (submenuItem) => {\n              if (value === menuItem.text + ' ' + submenuItem.text) {\n                result.$subItem = submenuItem;\n                result.$item = menuItem;\n              }\n            });\n          });\n\n          if (result.$item) {\n            $scope.$apply(() => {\n              $scope.dropdownTypeaheadOnSelect(result);\n            });\n          }\n\n          $input.trigger('blur');\n          return '';\n        },\n      });\n\n      $button.click(() => {\n        $button.hide();\n        $input.show();\n        $input.focus();\n      });\n\n      $input.keyup(() => {\n        elem.toggleClass('open', $input.val() === '');\n      });\n\n      elem.mousedown((evt: Event) => {\n        evt.preventDefault();\n        timeoutId.blur = null;\n      });\n\n      $input.blur(() => {\n        timeoutId.blur = setTimeout(() => {\n          closeDropdownMenu();\n        }, 1);\n      });\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\ncoreModule.directive('dropdownTypeahead', dropdownTypeahead);\ncoreModule.directive('dropdownTypeahead2', dropdownTypeahead2);\n","import coreModule from './core_module';\n\n/** @ngInject */\nexport function autofillEventFix($compile: any) {\n  return {\n    link: ($scope: any, elem: any) => {\n      const input = elem[0];\n      const dispatchChangeEvent = () => {\n        const event = new Event('change');\n        return input.dispatchEvent(event);\n      };\n      const onAnimationStart = ({ animationName }: AnimationEvent) => {\n        switch (animationName) {\n          case 'onAutoFillStart':\n            return dispatchChangeEvent();\n          case 'onAutoFillCancel':\n            return dispatchChangeEvent();\n        }\n        return null;\n      };\n\n      // const onChange = (evt: Event) => console.log(evt);\n\n      input.addEventListener('animationstart', onAnimationStart);\n      // input.addEventListener('change', onChange);\n\n      $scope.$on('$destroy', () => {\n        input.removeEventListener('animationstart', onAnimationStart);\n        // input.removeEventListener('change', onChange);\n      });\n    },\n  };\n}\n\ncoreModule.directive('autofillEventFix', autofillEventFix);\n","import { debounce, find, indexOf, map, escape, unescape } from 'lodash';\nimport $ from 'jquery';\nimport coreModule from './core_module';\nimport { TemplateSrv } from 'app/features/templating/template_srv';\n\n/** @ngInject */\nexport function metricSegment($compile: any, $sce: any, templateSrv: TemplateSrv) {\n  const inputTemplate =\n    '<input type=\"text\" data-provide=\"typeahead\" ' +\n    ' class=\"gf-form-input input-medium\"' +\n    ' spellcheck=\"false\" style=\"display:none\"></input>';\n\n  const linkTemplate =\n    '<a class=\"gf-form-label\" ng-class=\"segment.cssClass\" ' +\n    'tabindex=\"1\" give-focus=\"segment.focus\" ng-bind-html=\"segment.html\"></a>';\n\n  const selectTemplate =\n    '<a class=\"gf-form-input gf-form-input--dropdown\" ng-class=\"segment.cssClass\" ' +\n    'tabindex=\"1\" give-focus=\"segment.focus\" ng-bind-html=\"segment.html\"></a>';\n\n  return {\n    scope: {\n      segment: '=',\n      getOptions: '&',\n      onChange: '&',\n      debounce: '@',\n    },\n    link: ($scope: any, elem: any) => {\n      const $input = $(inputTemplate);\n      const segment = $scope.segment;\n      const $button = $(segment.selectMode ? selectTemplate : linkTemplate);\n      let options = null;\n      let cancelBlur: any = null;\n      let linkMode = true;\n      const debounceLookup = $scope.debounce;\n\n      $input.appendTo(elem);\n      $button.appendTo(elem);\n\n      $scope.updateVariableValue = (value: string) => {\n        if (value === '' || segment.value === value) {\n          return;\n        }\n\n        $scope.$apply(() => {\n          const selected: any = find($scope.altSegments, { value: value });\n          if (selected) {\n            segment.value = selected.value;\n            segment.html = selected.html || $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(selected.value));\n            segment.fake = false;\n            segment.expandable = selected.expandable;\n\n            if (selected.type) {\n              segment.type = selected.type;\n            }\n          } else if (segment.custom !== 'false') {\n            segment.value = value;\n            segment.html = $sce.trustAsHtml(templateSrv.highlightVariablesAsHtml(value));\n            segment.expandable = true;\n            segment.fake = false;\n          }\n\n          $scope.onChange();\n        });\n      };\n\n      $scope.switchToLink = (fromClick: boolean) => {\n        if (linkMode && !fromClick) {\n          return;\n        }\n\n        clearTimeout(cancelBlur);\n        cancelBlur = null;\n        linkMode = true;\n        $input.hide();\n        $button.show();\n        $scope.updateVariableValue($input.val());\n      };\n\n      $scope.inputBlur = () => {\n        // happens long before the click event on the typeahead options\n        // need to have long delay because the blur\n        cancelBlur = setTimeout($scope.switchToLink, 200);\n      };\n\n      $scope.source = (query: string, callback: any) => {\n        $scope.$apply(() => {\n          $scope.getOptions({ $query: query }).then((altSegments: any) => {\n            $scope.altSegments = altSegments;\n            options = map($scope.altSegments, (alt) => {\n              return escape(alt.value);\n            });\n\n            // add custom values\n            if (segment.custom !== 'false') {\n              if (!segment.fake && indexOf(options, segment.value) === -1) {\n                options.unshift(escape(segment.value));\n              }\n            }\n\n            callback(options);\n          });\n        });\n      };\n\n      $scope.updater = (value: string) => {\n        value = unescape(value);\n        if (value === segment.value) {\n          clearTimeout(cancelBlur);\n          $input.focus();\n          return value;\n        }\n\n        $input.val(value);\n        $scope.switchToLink(true);\n\n        return value;\n      };\n\n      $scope.matcher = function (item: string) {\n        if (linkMode) {\n          return false;\n        }\n        let str = this.query;\n        if (str[0] === '/') {\n          str = str.substring(1);\n        }\n        if (str[str.length - 1] === '/') {\n          str = str.substring(0, str.length - 1);\n        }\n        try {\n          return item.toLowerCase().match(str.toLowerCase());\n        } catch (e) {\n          return false;\n        }\n      };\n\n      $input.attr('data-provide', 'typeahead');\n      $input.typeahead({\n        source: $scope.source,\n        minLength: 0,\n        items: 10000,\n        updater: $scope.updater,\n        matcher: $scope.matcher,\n      });\n\n      const typeahead = $input.data('typeahead');\n      typeahead.lookup = function () {\n        this.query = this.$element.val() || '';\n        const items = this.source(this.query, $.proxy(this.process, this));\n        return items ? this.process(items) : items;\n      };\n\n      if (debounceLookup) {\n        typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n      }\n\n      $button.keydown((evt) => {\n        // trigger typeahead on down arrow or enter key\n        if (evt.keyCode === 40 || evt.keyCode === 13) {\n          $button.click();\n        }\n      });\n\n      $button.click(() => {\n        options = null;\n        $input.css('width', Math.max($button.width()!, 80) + 16 + 'px');\n\n        $button.hide();\n        $input.show();\n        $input.focus();\n\n        linkMode = false;\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      });\n\n      $input.blur($scope.inputBlur);\n\n      $compile(elem.contents())($scope);\n    },\n  };\n}\n\n/** @ngInject */\nexport function metricSegmentModel(uiSegmentSrv: any) {\n  return {\n    template:\n      '<metric-segment segment=\"segment\" get-options=\"getOptionsInternal()\" on-change=\"onSegmentChange()\"></metric-segment>',\n    restrict: 'E',\n    scope: {\n      property: '=',\n      options: '=',\n      getOptions: '&',\n      onChange: '&',\n    },\n    link: {\n      pre: function postLink($scope: any, elem: any, attrs: any) {\n        let cachedOptions: any;\n\n        $scope.valueToSegment = (value: any) => {\n          const option: any = find($scope.options, { value: value });\n          const segment = {\n            cssClass: attrs.cssClass,\n            custom: attrs.custom,\n            value: option ? option.text : value,\n            selectMode: attrs.selectMode,\n          };\n\n          return uiSegmentSrv.newSegment(segment);\n        };\n\n        $scope.getOptionsInternal = () => {\n          if ($scope.options) {\n            cachedOptions = $scope.options;\n            return Promise.resolve(\n              map($scope.options, (option) => {\n                return { value: option.text };\n              })\n            );\n          } else {\n            return $scope.getOptions().then((options: any) => {\n              cachedOptions = options;\n              return map(options, (option) => {\n                if (option.html) {\n                  return option;\n                }\n                return { value: option.text };\n              });\n            });\n          }\n        };\n\n        $scope.onSegmentChange = () => {\n          if (cachedOptions) {\n            const option: any = find(cachedOptions, { text: $scope.segment.value });\n            if (option && option.value !== $scope.property) {\n              $scope.property = option.value;\n            } else if (attrs.custom !== 'false') {\n              $scope.property = $scope.segment.value;\n            }\n          } else {\n            $scope.property = $scope.segment.value;\n          }\n\n          // needs to call this after digest so\n          // property is synced with outerscope\n          $scope.$$postDigest(() => {\n            $scope.$apply(() => {\n              $scope.onChange();\n            });\n          });\n        };\n\n        $scope.segment = $scope.valueToSegment($scope.property);\n      },\n    },\n  };\n}\n\ncoreModule.directive('metricSegment', metricSegment);\ncoreModule.directive('metricSegmentModel', metricSegmentModel);\n","import angular from 'angular';\nimport Clipboard from 'clipboard';\nimport coreModule from './core_module';\nimport { appEvents } from 'app/core/core';\nimport { AppEvents } from '@grafana/data';\n\n/** @ngInject */\nfunction tip($compile: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      let _t =\n        '<i class=\"grafana-tip fa fa-' +\n        (attrs.icon || 'question-circle') +\n        '\" bs-tooltip=\"\\'' +\n        // here we double-html-encode any special characters in the source string\n        // this is needed so that the final html contains the encoded entities as they\n        // will be decoded when _t is parsed by angular\n        elem.text().replace(/[\\'\\\"\\\\{}<>&]/g, (m: string) => '&amp;#' + m.charCodeAt(0) + ';') +\n        '\\'\"></i>';\n      elem.replaceWith($compile(angular.element(_t))(scope));\n    },\n  };\n}\n\nfunction clipboardButton() {\n  return {\n    scope: {\n      getText: '&clipboardButton',\n    },\n    link: (scope: any, elem: any) => {\n      scope.clipboard = new Clipboard(elem[0], {\n        text: () => {\n          return scope.getText();\n        },\n      });\n\n      scope.clipboard.on('success', () => {\n        appEvents.emit(AppEvents.alertSuccess, ['Content copied to clipboard']);\n      });\n\n      scope.$on('$destroy', () => {\n        if (scope.clipboard) {\n          scope.clipboard.destroy();\n        }\n      });\n    },\n  };\n}\n\n/** @ngInject */\nfunction compile($compile: any) {\n  return {\n    restrict: 'A',\n    link: (scope: any, element: any, attrs: any) => {\n      scope.$watch(\n        (scope: any) => {\n          return scope.$eval(attrs.compile);\n        },\n        (value: any) => {\n          element.html(value);\n          $compile(element.contents())(scope);\n        }\n      );\n    },\n  };\n}\n\nfunction watchChange() {\n  return {\n    scope: { onchange: '&watchChange' },\n    link: (scope: any, element: any) => {\n      element.on('input', () => {\n        scope.$apply(() => {\n          scope.onchange({ inputValue: element.val() });\n        });\n      });\n    },\n  };\n}\n\n/** @ngInject */\nfunction editorOptBool($compile: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      const ngchange = attrs.change ? ' ng-change=\"' + attrs.change + '\"' : '';\n      const tip = attrs.tip ? ' <tip>' + attrs.tip + '</tip>' : '';\n      const showIf = attrs.showIf ? ' ng-show=\"' + attrs.showIf + '\" ' : '';\n\n      const template =\n        '<div class=\"editor-option gf-form-checkbox text-center\"' +\n        showIf +\n        '>' +\n        ' <label for=\"' +\n        attrs.model +\n        '\" class=\"small\">' +\n        attrs.text +\n        tip +\n        '</label>' +\n        '<input class=\"cr1\" id=\"' +\n        attrs.model +\n        '\" type=\"checkbox\" ' +\n        '       ng-model=\"' +\n        attrs.model +\n        '\"' +\n        ngchange +\n        '       ng-checked=\"' +\n        attrs.model +\n        '\"></input>' +\n        ' <label for=\"' +\n        attrs.model +\n        '\" class=\"cr1\"></label>';\n      elem.replaceWith($compile(angular.element(template))(scope));\n    },\n  };\n}\n\n/** @ngInject */\nfunction editorCheckbox($compile: any, $interpolate: any) {\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any) => {\n      const text = $interpolate(attrs.text)(scope);\n      const model = $interpolate(attrs.model)(scope);\n      const ngchange = attrs.change ? ' ng-change=\"' + attrs.change + '\"' : '';\n      const tip = attrs.tip ? ' <tip>' + attrs.tip + '</tip>' : '';\n      const label = '<label for=\"' + scope.$id + model + '\" class=\"checkbox-label\">' + text + tip + '</label>';\n\n      let template =\n        '<input class=\"cr1\" id=\"' +\n        scope.$id +\n        model +\n        '\" type=\"checkbox\" ' +\n        '       ng-model=\"' +\n        model +\n        '\"' +\n        ngchange +\n        '       ng-checked=\"' +\n        model +\n        '\"></input>' +\n        ' <label for=\"' +\n        scope.$id +\n        model +\n        '\" class=\"cr1\"></label>';\n\n      template = template + label;\n      elem.addClass('gf-form-checkbox');\n      elem.html($compile(angular.element(template))(scope));\n    },\n  };\n}\n\n/** @ngInject */\nfunction gfDropdown($parse: any, $compile: any, $timeout: any) {\n  function buildTemplate(items: any, placement?: any) {\n    const upclass = placement === 'top' ? 'dropup' : '';\n    const ul = ['<ul class=\"dropdown-menu ' + upclass + '\" role=\"menu\" aria-labelledby=\"drop1\">', '</ul>'];\n\n    for (let index = 0; index < items.length; index++) {\n      const item = items[index];\n\n      if (item.divider) {\n        ul.splice(index + 1, 0, '<li class=\"divider\"></li>');\n        continue;\n      }\n\n      let li =\n        '<li' +\n        (item.submenu && item.submenu.length ? ' class=\"dropdown-submenu\"' : '') +\n        '>' +\n        '<a tabindex=\"-1\" ng-href=\"' +\n        (item.href || '') +\n        '\"' +\n        (item.click ? ' ng-click=\"' + item.click + '\"' : '') +\n        (item.target ? ' target=\"' + item.target + '\"' : '') +\n        (item.method ? ' data-method=\"' + item.method + '\"' : '') +\n        '>' +\n        (item.text || '') +\n        '</a>';\n\n      if (item.submenu && item.submenu.length) {\n        li += buildTemplate(item.submenu).join('\\n');\n      }\n\n      li += '</li>';\n      ul.splice(index + 1, 0, li);\n    }\n\n    return ul;\n  }\n\n  return {\n    restrict: 'EA',\n    scope: true,\n    link: function postLink(scope: any, iElement: any, iAttrs: any) {\n      const getter = $parse(iAttrs.gfDropdown),\n        items = getter(scope);\n      $timeout(() => {\n        const placement = iElement.data('placement');\n        const dropdown = angular.element(buildTemplate(items, placement).join(''));\n        dropdown.insertAfter(iElement);\n        $compile(iElement.next('ul.dropdown-menu'))(scope);\n      });\n\n      iElement.addClass('dropdown-toggle').attr('data-toggle', 'dropdown');\n    },\n  };\n}\n\ncoreModule.directive('tip', tip);\ncoreModule.directive('clipboardButton', clipboardButton);\ncoreModule.directive('compile', compile);\ncoreModule.directive('watchChange', watchChange);\ncoreModule.directive('editorOptBool', editorOptBool);\ncoreModule.directive('editorCheckbox', editorCheckbox);\ncoreModule.directive('gfDropdown', gfDropdown);\n","import coreModule from './core_module';\nimport { rangeUtil } from '@grafana/data';\n\nfunction ngModelOnBlur() {\n  return {\n    restrict: 'A',\n    priority: 1,\n    require: 'ngModel',\n    link: (scope: any, elm: any, attr: any, ngModelCtrl: any) => {\n      if (attr.type === 'radio' || attr.type === 'checkbox') {\n        return;\n      }\n\n      elm.off('input keydown change');\n      elm.bind('blur', () => {\n        scope.$apply(() => {\n          ngModelCtrl.$setViewValue(elm.val());\n        });\n      });\n    },\n  };\n}\n\nfunction emptyToNull() {\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    link: (scope: any, elm: any, attrs: any, ctrl: any) => {\n      ctrl.$parsers.push((viewValue: any) => {\n        if (viewValue === '') {\n          return null;\n        }\n        return viewValue;\n      });\n    },\n  };\n}\n\nfunction validTimeSpan() {\n  return {\n    require: 'ngModel',\n    link: (scope: any, elm: any, attrs: any, ctrl: any) => {\n      ctrl.$validators.integer = (modelValue: any, viewValue: any) => {\n        if (ctrl.$isEmpty(modelValue)) {\n          return true;\n        }\n        if (viewValue.indexOf('$') === 0 || viewValue.indexOf('+$') === 0) {\n          return true; // allow template variable\n        }\n        const info = rangeUtil.describeTextRange(viewValue);\n        return info.invalid !== true;\n      };\n    },\n  };\n}\n\ncoreModule.directive('ngModelOnblur', ngModelOnBlur);\ncoreModule.directive('emptyToNull', emptyToNull);\ncoreModule.directive('validTimeSpan', validTimeSpan);\n","import angular from 'angular';\nimport { getTagColorsFromName } from '@grafana/ui';\nimport $ from 'jquery';\nimport coreModule from './core_module';\nimport 'vendor/tagsinput/bootstrap-tagsinput.js';\n\nfunction setColor(name: string, element: JQuery) {\n  const { color, borderColor } = getTagColorsFromName(name);\n  element.css('background-color', color);\n  element.css('border-color', borderColor);\n}\n\nfunction tagColorFromName() {\n  return {\n    scope: { tagColorFromName: '=' },\n    link: (scope: any, element: any) => {\n      setColor(scope.tagColorFromName, element);\n    },\n  };\n}\n\nfunction bootstrapTagsinput() {\n  function getItemProperty(scope: any, property: any) {\n    if (!property) {\n      return undefined;\n    }\n\n    if (angular.isFunction(scope.$parent[property])) {\n      return scope.$parent[property];\n    }\n\n    return (item: any) => {\n      return item[property];\n    };\n  }\n\n  return {\n    restrict: 'EA',\n    scope: {\n      model: '=ngModel',\n      onTagsUpdated: '&',\n    },\n    template: '<select multiple></select>',\n    replace: false,\n    link: function (scope: any, element: any, attrs: any) {\n      if (!angular.isArray(scope.model)) {\n        scope.model = [];\n      }\n\n      const select = $('select', element);\n\n      if (attrs.placeholder) {\n        select.attr('placeholder', attrs.placeholder);\n      }\n\n      select.tagsinput({\n        typeahead: {\n          source: angular.isFunction(scope.$parent[attrs.typeaheadSource])\n            ? scope.$parent[attrs.typeaheadSource]\n            : null,\n        },\n        widthClass: attrs.widthClass,\n        itemValue: getItemProperty(scope, attrs.itemvalue),\n        itemText: getItemProperty(scope, attrs.itemtext),\n        tagClass: angular.isFunction(scope.$parent[attrs.tagclass])\n          ? scope.$parent[attrs.tagclass]\n          : () => {\n              return attrs.tagclass;\n            },\n      });\n\n      select.on('itemAdded', (event: any) => {\n        if (scope.model.indexOf(event.item) === -1) {\n          scope.model.push(event.item);\n          if (scope.onTagsUpdated) {\n            scope.onTagsUpdated();\n          }\n        }\n        const tagElement = select\n          .next()\n          .children('span')\n          .filter(() => {\n            return $(this).text() === event.item;\n          });\n        setColor(event.item, tagElement);\n      });\n\n      select.on('itemRemoved', (event: any) => {\n        const idx = scope.model.indexOf(event.item);\n        if (idx !== -1) {\n          scope.model.splice(idx, 1);\n          if (scope.onTagsUpdated) {\n            scope.onTagsUpdated();\n          }\n        }\n      });\n\n      scope.$watch(\n        'model',\n        () => {\n          if (!angular.isArray(scope.model)) {\n            scope.model = [];\n          }\n\n          select.tagsinput('removeAll');\n\n          for (let i = 0; i < scope.model.length; i++) {\n            select.tagsinput('add', scope.model[i]);\n          }\n        },\n        true\n      );\n    },\n  };\n}\n\ncoreModule.directive('tagColorFromName', tagColorFromName);\ncoreModule.directive('bootstrapTagsinput', bootstrapTagsinput);\n","import $ from 'jquery';\nimport coreModule from './core_module';\n\nfunction getBlockNodes(nodes: any[]) {\n  let node = nodes[0];\n  const endNode = nodes[nodes.length - 1];\n  let blockNodes: any[] | undefined;\n  node = node.nextSibling;\n\n  for (let i = 1; node !== endNode && node; i++) {\n    if (blockNodes || nodes[i] !== node) {\n      if (!blockNodes) {\n        blockNodes = $([].slice.call(nodes, 0, i)) as any;\n      }\n\n      blockNodes!.push(node);\n    }\n    node = node.nextSibling;\n  }\n\n  return blockNodes || nodes;\n}\n\n/** @ngInject */\nfunction rebuildOnChange($animate: any) {\n  return {\n    multiElement: true,\n    terminal: true,\n    transclude: true,\n    priority: 600,\n    restrict: 'E',\n    link: (scope: any, elem: any, attrs: any, ctrl: any, transclude: any) => {\n      let block: any, childScope: any, previousElements: any;\n\n      function cleanUp() {\n        if (previousElements) {\n          previousElements.remove();\n          previousElements = null;\n        }\n        if (childScope) {\n          childScope.$destroy();\n          childScope = null;\n        }\n        if (block) {\n          previousElements = getBlockNodes(block.clone);\n          $animate.leave(previousElements).then(() => {\n            previousElements = null;\n          });\n          block = null;\n        }\n      }\n\n      scope.$watch(attrs.property, function rebuildOnChangeAction(value: any, oldValue: any) {\n        if (childScope && value !== oldValue) {\n          cleanUp();\n        }\n\n        if (!childScope && (value || attrs.showNull)) {\n          transclude((clone: any, newScope: any) => {\n            childScope = newScope;\n            clone[clone.length++] = document.createComment(' end rebuild on change ');\n            block = { clone: clone };\n            $animate.enter(clone, elem.parent(), elem);\n          });\n        } else {\n          cleanUp();\n        }\n      });\n    },\n  };\n}\n\ncoreModule.directive('rebuildOnChange', rebuildOnChange);\n","import coreModule from './core_module';\n\ncoreModule.directive('giveFocus', () => {\n  return (scope: any, element: any, attrs: any) => {\n    element.click((e: any) => {\n      e.stopPropagation();\n    });\n\n    scope.$watch(\n      attrs.giveFocus,\n      (newValue: any) => {\n        if (!newValue) {\n          return;\n        }\n        setTimeout(() => {\n          element.focus();\n          const domEl: any = element[0];\n          if (domEl.setSelectionRange) {\n            const pos = element.val().length * 2;\n            domEl.setSelectionRange(pos, pos);\n          }\n        }, 200);\n      },\n      true\n    );\n  };\n});\n\nexport default {};\n","import angular from 'angular';\nimport coreModule from './core_module';\nimport { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\n\nexport class DeltaCtrl {\n  observer: any;\n\n  /** @ngInject */\n  constructor() {\n    const waitForCompile = () => {};\n\n    this.observer = new MutationObserver(waitForCompile);\n\n    const observerConfig = {\n      attributes: true,\n      attributeFilter: ['class'],\n      characterData: false,\n      childList: true,\n      subtree: false,\n    };\n\n    this.observer.observe(angular.element('.delta-html')[0], observerConfig);\n  }\n\n  $onDestroy() {\n    this.observer.disconnect();\n  }\n}\n\nexport function delta() {\n  return {\n    controller: DeltaCtrl,\n    replace: false,\n    restrict: 'A',\n  };\n}\ncoreModule.directive('diffDelta', delta);\n\n// Link to JSON line number\nexport class LinkJSONCtrl {\n  /** @ngInject */\n  constructor(private $scope: any, private $rootScope: GrafanaRootScope, private $anchorScroll: any) {}\n\n  goToLine(line: number) {\n    let unbind: () => void;\n\n    const scroll = () => {\n      this.$anchorScroll(`l${line}`);\n      unbind();\n    };\n\n    this.$scope.switchView().then(() => {\n      unbind = this.$rootScope.$on('json-diff-ready', scroll.bind(this));\n    });\n  }\n}\n\nexport function linkJson() {\n  return {\n    controller: LinkJSONCtrl,\n    controllerAs: 'ctrl',\n    replace: true,\n    restrict: 'E',\n    scope: {\n      line: '@lineDisplay',\n      link: '@lineLink',\n      switchView: '&',\n    },\n    template: `<a class=\"diff-linenum btn btn-inverse btn-small\" ng-click=\"ctrl.goToLine(link)\">Line {{ line }}</a>`,\n  };\n}\ncoreModule.directive('diffLinkJson', linkJson);\n","import coreModule from 'app/angular/core_module';\nimport { provideTheme } from 'app/core/utils/ConfigProvider';\n\nexport function react2AngularDirective(name: string, component: any, options: any) {\n  coreModule.directive(name, [\n    'reactDirective',\n    (reactDirective) => {\n      return reactDirective(provideTheme(component), options);\n    },\n  ]);\n}\n","import { isArray } from 'lodash';\nimport coreModule from './core_module';\n\nexport function arrayJoin() {\n  'use strict';\n\n  return {\n    restrict: 'A',\n    require: 'ngModel',\n    link: (scope: any, element: any, attr: any, ngModel: any) => {\n      function split_array(text: string) {\n        return (text || '').split(',');\n      }\n\n      function join_array(text: string) {\n        if (isArray(text)) {\n          return ((text || '') as any).join(',');\n        } else {\n          return text;\n        }\n      }\n\n      ngModel.$parsers.push(split_array);\n      ngModel.$formatters.push(join_array);\n    },\n  };\n}\n\ncoreModule.directive('arrayJoin', arrayJoin);\n","import React from 'react';\nimport { LegacyForms } from '@grafana/ui';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { SelectableValue, toOption } from '@grafana/data';\n\nimport CloudMonitoringDatasource from '../datasource';\nimport { AnnotationsHelp, LabelFilter, Metrics, Project, QueryEditorRow } from './';\nimport { AnnotationTarget, EditorMode, MetricDescriptor, MetricKind } from '../types';\n\nconst { Input } = LegacyForms;\n\nexport interface Props {\n  onQueryChange: (target: AnnotationTarget) => void;\n  target: AnnotationTarget;\n  datasource: CloudMonitoringDatasource;\n  templateSrv: TemplateSrv;\n}\n\ninterface State extends AnnotationTarget {\n  variableOptionGroup: SelectableValue<string>;\n  variableOptions: Array<SelectableValue<string>>;\n  labels: any;\n  [key: string]: any;\n}\n\nconst DefaultTarget: State = {\n  editorMode: EditorMode.Visual,\n  projectName: '',\n  projects: [],\n  metricType: '',\n  filters: [],\n  metricKind: MetricKind.GAUGE,\n  valueType: '',\n  refId: 'annotationQuery',\n  title: '',\n  text: '',\n  labels: {},\n  variableOptionGroup: {},\n  variableOptions: [],\n};\n\nexport class AnnotationQueryEditor extends React.Component<Props, State> {\n  state: State = DefaultTarget;\n\n  async UNSAFE_componentWillMount() {\n    // Unfortunately, migrations like this need to go UNSAFE_componentWillMount. As soon as there's\n    // migration hook for this module.ts, we can do the migrations there instead.\n    const { target, datasource } = this.props;\n    if (!target.projectName) {\n      target.projectName = datasource.getDefaultProject();\n    }\n\n    const variableOptionGroup = {\n      label: 'Template Variables',\n      options: datasource.getVariables().map(toOption),\n    };\n\n    const projects = await datasource.getProjects();\n    this.setState({\n      variableOptionGroup,\n      variableOptions: variableOptionGroup.options,\n      ...target,\n      projects,\n    });\n\n    datasource\n      .getLabels(target.metricType, target.projectName, target.refId)\n      .then((labels) => this.setState({ labels }));\n  }\n\n  onMetricTypeChange = ({ valueType, metricKind, type, unit }: MetricDescriptor) => {\n    const { onQueryChange, datasource } = this.props;\n    this.setState(\n      {\n        metricType: type,\n        unit,\n        valueType,\n        metricKind,\n      },\n      () => {\n        onQueryChange(this.state);\n      }\n    );\n    datasource.getLabels(type, this.state.refId, this.state.projectName).then((labels) => this.setState({ labels }));\n  };\n\n  onChange(prop: string, value: string | string[]) {\n    this.setState({ [prop]: value }, () => {\n      this.props.onQueryChange(this.state);\n    });\n  }\n\n  render() {\n    const { metricType, projectName, filters, title, text, variableOptionGroup, labels, variableOptions } = this.state;\n    const { datasource } = this.props;\n\n    return (\n      <>\n        <Project\n          templateVariableOptions={variableOptions}\n          datasource={datasource}\n          projectName={projectName || datasource.getDefaultProject()}\n          onChange={(value) => this.onChange('projectName', value)}\n        />\n        <Metrics\n          projectName={projectName}\n          metricType={metricType}\n          templateSrv={datasource.templateSrv}\n          datasource={datasource}\n          templateVariableOptions={variableOptions}\n          onChange={(metric) => this.onMetricTypeChange(metric)}\n        >\n          {(metric) => (\n            <>\n              <LabelFilter\n                labels={labels}\n                filters={filters}\n                onChange={(value) => this.onChange('filters', value)}\n                variableOptionGroup={variableOptionGroup}\n              />\n            </>\n          )}\n        </Metrics>\n\n        <QueryEditorRow label=\"Title\">\n          <Input\n            type=\"text\"\n            className=\"gf-form-input width-20\"\n            value={title}\n            onChange={(e) => this.onChange('title', e.target.value)}\n          />\n        </QueryEditorRow>\n        <QueryEditorRow label=\"Text\">\n          <Input\n            type=\"text\"\n            className=\"gf-form-input width-20\"\n            value={text}\n            onChange={(e) => this.onChange('text', e.target.value)}\n          />\n        </QueryEditorRow>\n\n        <AnnotationsHelp />\n      </>\n    );\n  }\n}\n","import React, { ChangeEvent } from 'react';\nimport { Switch, Input } from '@grafana/ui';\nimport { CloudWatchAnnotationQuery, CloudWatchMetricsQuery } from '../types';\nimport { PanelData } from '@grafana/data';\nimport { CloudWatchDatasource } from '../datasource';\nimport { MetricStatEditor } from './MetricStatEditor';\nimport EditorHeader from './ui/EditorHeader';\nimport InlineSelect from './ui/InlineSelect';\nimport { Space } from './ui/Space';\nimport { useRegions } from '../hooks';\nimport EditorRow from './ui/EditorRow';\nimport EditorField from './ui/EditorField';\n\nexport type Props = {\n  query: CloudWatchAnnotationQuery;\n  datasource: CloudWatchDatasource;\n  onChange: (value: CloudWatchAnnotationQuery) => void;\n  data?: PanelData;\n};\n\nexport function AnnotationQueryEditor(props: React.PropsWithChildren<Props>) {\n  const { query, onChange, datasource } = props;\n\n  const [regions, regionIsLoading] = useRegions(datasource);\n\n  return (\n    <>\n      <EditorHeader>\n        <InlineSelect\n          label=\"Region\"\n          value={regions.find((v) => v.value === query.region)}\n          placeholder=\"Select region\"\n          allowCustomValue\n          onChange={({ value: region }) => region && onChange({ ...query, region })}\n          options={regions}\n          isLoading={regionIsLoading}\n        />\n      </EditorHeader>\n      <Space v={0.5} />\n      <MetricStatEditor\n        {...props}\n        disableExpressions={true}\n        onChange={(editorQuery: CloudWatchMetricsQuery) => onChange({ ...query, ...editorQuery })}\n        onRunQuery={() => {}}\n      ></MetricStatEditor>\n      <Space v={0.5} />\n      <EditorRow>\n        <EditorField label=\"Period\" width={26} tooltip=\"Minimum interval between points in seconds.\">\n          <Input\n            value={query.period || ''}\n            placeholder=\"auto\"\n            onChange={(event: ChangeEvent<HTMLInputElement>) => onChange({ ...query, period: event.target.value })}\n          />\n        </EditorField>\n        <EditorField label=\"Enable Prefix Matching\" optional={true}>\n          <Switch\n            value={query.prefixMatching}\n            onChange={(e) => {\n              onChange({\n                ...query,\n                prefixMatching: e.currentTarget.checked,\n              });\n            }}\n          />\n        </EditorField>\n        <EditorField label=\"Action\" optional={true}>\n          <Input\n            disabled={!query.prefixMatching}\n            value={query.actionPrefix || ''}\n            onChange={(event: ChangeEvent<HTMLInputElement>) =>\n              onChange({ ...query, actionPrefix: event.target.value })\n            }\n          />\n        </EditorField>\n        <EditorField label=\"Alarm Name\" optional={true}>\n          <Input\n            disabled={!query.prefixMatching}\n            value={query.alarmNamePrefix || ''}\n            onChange={(event: ChangeEvent<HTMLInputElement>) =>\n              onChange({ ...query, alarmNamePrefix: event.target.value })\n            }\n          />\n        </EditorField>\n      </EditorRow>\n    </>\n  );\n}\n","import React, { useMemo, useCallback, FC } from 'react';\nimport { flatten } from 'lodash';\n\nimport { LegacyForms } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { Variable } from 'app/types/templates';\nconst { Select } = LegacyForms;\n\nexport interface Props {\n  onChange: (value: string | undefined) => void;\n  options: Array<SelectableValue<string>>;\n  isSearchable: boolean;\n  value: string;\n  placeholder?: string;\n  className?: string;\n  variables?: Variable[];\n}\n\nexport const MetricSelect: FC<Props> = (props) => {\n  const { value, placeholder, className, isSearchable, onChange } = props;\n  const options = useSelectOptions(props);\n  const selected = useSelectedOption(options, value);\n  const onChangeValue = useCallback((selectable: SelectableValue<string>) => onChange(selectable.value), [onChange]);\n\n  return (\n    <Select\n      menuShouldPortal\n      className={className}\n      isMulti={false}\n      isClearable={false}\n      backspaceRemovesValue={false}\n      onChange={onChangeValue}\n      options={options}\n      isSearchable={isSearchable}\n      maxMenuHeight={500}\n      placeholder={placeholder}\n      noOptionsMessage={() => 'No options found'}\n      value={selected}\n    />\n  );\n};\n\nconst useSelectOptions = ({ variables = [], options }: Props): Array<SelectableValue<string>> => {\n  return useMemo(() => {\n    if (!Array.isArray(variables) || variables.length === 0) {\n      return options;\n    }\n\n    return [\n      {\n        label: 'Template Variables',\n        options: variables.map(({ name }) => ({\n          label: `$${name}`,\n          value: `$${name}`,\n        })),\n      },\n      ...options,\n    ];\n  }, [variables, options]);\n};\n\nconst useSelectedOption = (options: Array<SelectableValue<string>>, value: string): SelectableValue<string> => {\n  return useMemo(() => {\n    const allOptions = options.every((o) => o.options) ? flatten(options.map((o) => o.options)) : options;\n    return allOptions.find((option) => option.value === value);\n  }, [options, value]);\n};\n","// Libraries\nimport React, { memo } from 'react';\n// Types\nimport { LokiQuery } from '../types';\nimport { LokiQueryField } from './LokiQueryField';\nimport { LokiOptionFields } from './LokiOptionFields';\nimport LokiDatasource from '../datasource';\n\ninterface Props {\n  expr: string;\n  maxLines?: number;\n  instant?: boolean;\n  datasource: LokiDatasource;\n  onChange: (query: LokiQuery) => void;\n}\n\nexport const LokiAnnotationsQueryEditor = memo(function LokiAnnotationQueryEditor(props: Props) {\n  const { expr, maxLines, instant, datasource, onChange } = props;\n\n  const queryWithRefId: LokiQuery = {\n    refId: '',\n    expr,\n    maxLines,\n    instant,\n  };\n  return (\n    <div className=\"gf-form-group\">\n      <LokiQueryField\n        datasource={datasource}\n        query={queryWithRefId}\n        onChange={onChange}\n        onRunQuery={() => {}}\n        onBlur={() => {}}\n        history={[]}\n        ExtraFieldElement={\n          <LokiOptionFields\n            queryType={queryWithRefId.instant ? 'instant' : 'range'}\n            lineLimitValue={queryWithRefId?.maxLines?.toString() || ''}\n            resolution={queryWithRefId.resolution || 1}\n            query={queryWithRefId}\n            onRunQuery={() => {}}\n            onChange={onChange}\n          />\n        }\n      />\n    </div>\n  );\n});\n","import { react2AngularDirective } from 'app/angular/react2angular';\nimport { QueryEditor as CloudMonitoringQueryEditor } from 'app/plugins/datasource/cloud-monitoring/components/QueryEditor';\nimport { AnnotationQueryEditor as CloudMonitoringAnnotationQueryEditor } from 'app/plugins/datasource/cloud-monitoring/components/AnnotationQueryEditor';\nimport { AnnotationQueryEditor as CloudWatchAnnotationQueryEditor } from 'app/plugins/datasource/cloudwatch/components/AnnotationQueryEditor';\nimport PageHeader from '../core/components/PageHeader/PageHeader';\nimport EmptyListCTA from '../core/components/EmptyListCTA/EmptyListCTA';\nimport { TagFilter } from '../core/components/TagFilter/TagFilter';\nimport { MetricSelect } from '../core/components/Select/MetricSelect';\nimport {\n  ColorPicker,\n  DataLinksInlineEditor,\n  DataSourceHttpSettings,\n  GraphContextMenu,\n  Icon,\n  LegacyForms,\n  SeriesColorPickerPopoverWithTheme,\n  Spinner,\n  UnitPicker,\n} from '@grafana/ui';\nimport { LokiAnnotationsQueryEditor } from '../plugins/datasource/loki/components/AnnotationsQueryEditor';\nimport { HelpModal } from '../core/components/help/HelpModal';\nimport { Footer } from '../core/components/Footer/Footer';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { SearchField, SearchResults, SearchResultsFilter } from '../features/search';\nimport { TimePickerSettings } from 'app/features/dashboard/components/DashboardSettings/TimePickerSettings';\nimport QueryEditor from 'app/plugins/datasource/grafana-azure-monitor-datasource/components/QueryEditor/QueryEditor';\n\nconst { SecretFormField } = LegacyForms;\n\nexport function registerAngularDirectives() {\n  react2AngularDirective('footer', Footer, []);\n  react2AngularDirective('icon', Icon, [\n    'name',\n    'size',\n    'type',\n    ['onClick', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('spinner', Spinner, ['inline']);\n  react2AngularDirective('helpModal', HelpModal, []);\n  react2AngularDirective('pageHeader', PageHeader, ['model', 'noTabs']);\n  react2AngularDirective('emptyListCta', EmptyListCTA, [\n    'title',\n    'buttonIcon',\n    'buttonLink',\n    'buttonTitle',\n    ['onClick', { watchDepth: 'reference', wrapApply: true }],\n    'proTip',\n    'proTipLink',\n    'proTipLinkTitle',\n    'proTipTarget',\n    'infoBox',\n    'infoBoxTitle',\n  ]);\n  //Search\n  react2AngularDirective('searchField', SearchField, [\n    'query',\n    'autoFocus',\n    ['onChange', { watchDepth: 'reference' }],\n    ['onKeyDown', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('searchResults', SearchResults, [\n    'results',\n    'editable',\n    'selectors',\n    ['onSelectionChanged', { watchDepth: 'reference' }],\n    ['onTagSelected', { watchDepth: 'reference' }],\n    ['onFolderExpanding', { watchDepth: 'reference' }],\n    ['onToggleSelection', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('searchFilters', SearchResultsFilter, [\n    'allChecked',\n    'canMove',\n    'canDelete',\n    'tagFilterOptions',\n    'selectedStarredFilter',\n    'selectedTagFilter',\n    ['onSelectAllChanged', { watchDepth: 'reference' }],\n    ['deleteItem', { watchDepth: 'reference' }],\n    ['moveTo', { watchDepth: 'reference' }],\n    ['onStarredFilterChange', { watchDepth: 'reference' }],\n    ['onTagFilterChange', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('tagFilter', TagFilter, [\n    'tags',\n    ['onChange', { watchDepth: 'reference' }],\n    ['tagOptions', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('colorPicker', ColorPicker, [\n    'color',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('seriesColorPickerPopover', SeriesColorPickerPopoverWithTheme, [\n    'color',\n    'series',\n    'onColorChange',\n    'onToggleAxis',\n  ]);\n  react2AngularDirective('unitPicker', UnitPicker, [\n    'value',\n    'width',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('metricSelect', MetricSelect, [\n    'options',\n    'onChange',\n    'value',\n    'isSearchable',\n    'className',\n    'placeholder',\n    ['variables', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('cloudMonitoringQueryEditor', CloudMonitoringQueryEditor, [\n    'target',\n    'onQueryChange',\n    'onExecuteQuery',\n    ['events', { watchDepth: 'reference' }],\n    ['datasource', { watchDepth: 'reference' }],\n    ['templateSrv', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('cloudMonitoringAnnotationQueryEditor', CloudMonitoringAnnotationQueryEditor, [\n    'target',\n    'onQueryChange',\n    ['datasource', { watchDepth: 'reference' }],\n    ['templateSrv', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('cloudwatchAnnotationQueryEditor', CloudWatchAnnotationQueryEditor, [\n    'query',\n    'onChange',\n    ['datasource', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('secretFormField', SecretFormField, [\n    'value',\n    'isConfigured',\n    'inputWidth',\n    'labelWidth',\n    ['onReset', { watchDepth: 'reference', wrapApply: true }],\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('graphContextMenu', GraphContextMenu, [\n    'x',\n    'y',\n    'itemsGroup',\n    ['onClose', { watchDepth: 'reference', wrapApply: true }],\n    ['getContextMenuSource', { watchDepth: 'reference', wrapApply: true }],\n    ['timeZone', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  // We keep the drilldown terminology here because of as using data-* directive\n  // being in conflict with HTML data attributes\n  react2AngularDirective('drilldownLinksEditor', DataLinksInlineEditor, [\n    'value',\n    'links',\n    'suggestions',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  react2AngularDirective('lokiAnnotationsQueryEditor', LokiAnnotationsQueryEditor, [\n    'expr',\n    'maxLines',\n    'instant',\n    'onChange',\n    ['datasource', { watchDepth: 'reference' }],\n  ]);\n  react2AngularDirective('datasourceHttpSettingsNext', DataSourceHttpSettings, [\n    'defaultUrl',\n    'showAccessOptions',\n    'dataSourceConfig',\n    'showForwardOAuthIdentityOption',\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n  react2AngularDirective('folderPicker', FolderPicker, [\n    'labelClass',\n    'rootName',\n    'enableCreateNew',\n    'enableReset',\n    'initialTitle',\n    'initialFolderId',\n    'dashboardId',\n    'onCreateFolder',\n    ['enterFolderCreation', { watchDepth: 'reference', wrapApply: true }],\n    ['exitFolderCreation', { watchDepth: 'reference', wrapApply: true }],\n    ['onLoad', { watchDepth: 'reference', wrapApply: true }],\n    ['onChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  react2AngularDirective('timePickerSettings', TimePickerSettings, [\n    'renderCount',\n    'refreshIntervals',\n    'timePickerHidden',\n    'nowDelay',\n    'timezone',\n    ['onTimeZoneChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onRefreshIntervalChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onNowDelayChange', { watchDepth: 'reference', wrapApply: true }],\n    ['onHideTimePickerChange', { watchDepth: 'reference', wrapApply: true }],\n  ]);\n\n  react2AngularDirective('azureMonitorQueryEditor', QueryEditor, [\n    'query',\n    ['datasource', { watchDepth: 'reference' }],\n    'onChange',\n  ]);\n}\n","import { debounce, each, map, partial, escape, unescape } from 'lodash';\nimport $ from 'jquery';\nimport coreModule from 'app/angular/core_module';\nimport { promiseToDigest } from '../promiseToDigest';\n\nconst template = `\n<div class=\"dropdown cascade-open\">\n<a ng-click=\"showActionsMenu()\" class=\"query-part-name pointer dropdown-toggle\" data-toggle=\"dropdown\">{{part.def.type}}</a>\n<span>(</span><span class=\"query-part-parameters\"></span><span>)</span>\n<ul class=\"dropdown-menu\">\n  <li ng-repeat=\"action in partActions\">\n    <a ng-click=\"triggerPartAction(action)\">{{action.text}}</a>\n  </li>\n</ul>\n`;\n\n/** @ngInject */\nexport function queryPartEditorDirective(templateSrv: any) {\n  const paramTemplate = '<input type=\"text\" class=\"hide input-mini tight-form-func-param\"></input>';\n\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      part: '=',\n      handleEvent: '&',\n      debounce: '@',\n    },\n    link: function postLink($scope: any, elem: any) {\n      const part = $scope.part;\n      const partDef = part.def;\n      const $paramsContainer = elem.find('.query-part-parameters');\n      const debounceLookup = $scope.debounce;\n\n      $scope.partActions = [];\n\n      function clickFuncParam(this: any, paramIndex: number) {\n        const $link = $(this);\n        const $input = $link.next();\n\n        $input.val(part.params[paramIndex]);\n        $input.css('width', $link.width()! + 16 + 'px');\n\n        $link.hide();\n        $input.show();\n        $input.focus();\n        $input.select();\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      }\n\n      function inputBlur(this: any, paramIndex: number) {\n        const $input = $(this);\n        const $link = $input.prev();\n        const newValue = $input.val();\n\n        if (newValue !== '' || part.def.params[paramIndex].optional) {\n          $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n          part.updateParam($input.val(), paramIndex);\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'part-param-changed' } });\n          });\n        }\n\n        $input.hide();\n        $link.show();\n      }\n\n      function inputKeyPress(this: any, paramIndex: number, e: any) {\n        if (e.which === 13) {\n          inputBlur.call(this, paramIndex);\n        }\n      }\n\n      function inputKeyDown(this: any) {\n        this.style.width = (3 + this.value.length) * 8 + 'px';\n      }\n\n      function addTypeahead($input: JQuery, param: any, paramIndex: number) {\n        if (!param.options && !param.dynamicLookup) {\n          return;\n        }\n\n        const typeaheadSource = (query: string, callback: any) => {\n          if (param.options) {\n            let options = param.options;\n            if (param.type === 'int') {\n              options = map(options, (val) => {\n                return val.toString();\n              });\n            }\n            return options;\n          }\n\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'get-param-options' } }).then((result: any) => {\n              const dynamicOptions = map(result, (op) => {\n                return escape(op.value);\n              });\n              callback(dynamicOptions);\n            });\n          });\n        };\n\n        $input.attr('data-provide', 'typeahead');\n\n        $input.typeahead({\n          source: typeaheadSource,\n          minLength: 0,\n          items: 1000,\n          updater: (value: string) => {\n            value = unescape(value);\n            setTimeout(() => {\n              inputBlur.call($input[0], paramIndex);\n            }, 0);\n            return value;\n          },\n        });\n\n        const typeahead = $input.data('typeahead');\n        typeahead.lookup = function () {\n          this.query = this.$element.val() || '';\n          const items = this.source(this.query, $.proxy(this.process, this));\n          return items ? this.process(items) : items;\n        };\n\n        if (debounceLookup) {\n          typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n        }\n      }\n\n      $scope.showActionsMenu = () => {\n        promiseToDigest($scope)(\n          $scope.handleEvent({ $event: { name: 'get-part-actions' } }).then((res: any) => {\n            $scope.partActions = res;\n          })\n        );\n      };\n\n      $scope.triggerPartAction = (action: string) => {\n        $scope.handleEvent({ $event: { name: 'action', action: action } });\n      };\n\n      function addElementsAndCompile() {\n        each(partDef.params, (param: any, index: number) => {\n          if (param.optional && part.params.length <= index) {\n            return;\n          }\n\n          if (index > 0) {\n            $('<span>, </span>').appendTo($paramsContainer);\n          }\n\n          const paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);\n          const $paramLink = $('<a class=\"graphite-func-param-link pointer\">' + paramValue + '</a>');\n          const $input = $(paramTemplate);\n\n          $paramLink.appendTo($paramsContainer);\n          $input.appendTo($paramsContainer);\n\n          $input.blur(partial(inputBlur, index));\n          $input.keyup(inputKeyDown);\n          $input.keypress(partial(inputKeyPress, index));\n          $paramLink.click(partial(clickFuncParam, index));\n\n          addTypeahead($input, param, index);\n        });\n      }\n\n      function relink() {\n        $paramsContainer.empty();\n        addElementsAndCompile();\n      }\n\n      relink();\n    },\n  };\n}\n\ncoreModule.directive('queryPartEditor', queryPartEditorDirective);\n","import { debounce, find, indexOf, map, isObject, escape, unescape } from 'lodash';\nimport coreModule from '../../core_module';\nimport { ISCEService } from 'angular';\nimport { promiseToDigest } from '../../promiseToDigest';\n\nfunction typeaheadMatcher(this: any, item: string) {\n  let str = this.query;\n  if (str === '') {\n    return true;\n  }\n  if (str[0] === '/') {\n    str = str.substring(1);\n  }\n  if (str[str.length - 1] === '/') {\n    str = str.substring(0, str.length - 1);\n  }\n  return item.toLowerCase().match(str.toLowerCase());\n}\n\nexport class FormDropdownCtrl {\n  inputElement: JQLite;\n  linkElement: JQLite;\n  model: any;\n  display: any;\n  text: any;\n  options: any;\n  cssClass: any;\n  cssClasses: any;\n  allowCustom: any;\n  labelMode: boolean;\n  linkMode: boolean;\n  cancelBlur: any;\n  onChange: any;\n  getOptions: any;\n  optionCache: any;\n  lookupText: boolean;\n  placeholder: any;\n  startOpen: any;\n  debounce: boolean;\n\n  /** @ngInject */\n  constructor(private $scope: any, $element: JQLite, private $sce: ISCEService, private templateSrv: any) {\n    this.inputElement = $element.find('input').first();\n    this.linkElement = $element.find('a').first();\n    this.linkMode = true;\n    this.cancelBlur = null;\n    this.labelMode = false;\n    this.lookupText = false;\n    this.debounce = false;\n\n    // listen to model changes\n    $scope.$watch('ctrl.model', this.modelChanged.bind(this));\n  }\n\n  $onInit() {\n    if (this.labelMode) {\n      this.cssClasses = 'gf-form-label ' + this.cssClass;\n    } else {\n      this.cssClasses = 'gf-form-input gf-form-input--dropdown ' + this.cssClass;\n    }\n\n    if (this.placeholder) {\n      this.inputElement.attr('placeholder', this.placeholder);\n    }\n\n    this.inputElement.attr('data-provide', 'typeahead');\n    this.inputElement.typeahead({\n      source: this.typeaheadSource.bind(this),\n      minLength: 0,\n      items: 10000,\n      updater: this.typeaheadUpdater.bind(this),\n      matcher: typeaheadMatcher,\n    });\n\n    // modify typeahead lookup\n    // this = typeahead\n    const typeahead = this.inputElement.data('typeahead');\n    typeahead.lookup = function () {\n      this.query = this.$element.val() || '';\n      this.source(this.query, this.process.bind(this));\n    };\n\n    if (this.debounce) {\n      typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n    }\n\n    this.linkElement.keydown((evt) => {\n      // trigger typeahead on down arrow or enter key\n      if (evt.keyCode === 40 || evt.keyCode === 13) {\n        this.linkElement.click();\n      }\n    });\n\n    this.inputElement.keydown((evt) => {\n      if (evt.keyCode === 13) {\n        setTimeout(() => {\n          this.inputElement.blur();\n        }, 300);\n      }\n    });\n\n    this.inputElement.blur(this.inputBlur.bind(this));\n\n    if (this.startOpen) {\n      setTimeout(this.open.bind(this), 0);\n    }\n  }\n\n  getOptionsInternal(query: string) {\n    return promiseToDigest(this.$scope)(Promise.resolve(this.getOptions({ $query: query })));\n  }\n\n  isPromiseLike(obj: any) {\n    return obj && typeof obj.then === 'function';\n  }\n\n  modelChanged() {\n    if (isObject(this.model)) {\n      this.updateDisplay((this.model as any).text);\n    } else {\n      // if we have text use it\n      if (this.lookupText) {\n        this.getOptionsInternal('').then((options: any) => {\n          const item: any = find(options, { value: this.model });\n          this.updateDisplay(item ? item.text : this.model);\n        });\n      } else {\n        this.updateDisplay(this.model);\n      }\n    }\n  }\n\n  typeaheadSource(query: string, callback: (res: any) => void) {\n    this.getOptionsInternal(query).then((options: any) => {\n      this.optionCache = options;\n\n      // extract texts\n      const optionTexts = map(options, (op: any) => {\n        return escape(op.text);\n      });\n\n      // add custom values\n      if (this.allowCustom && this.text !== '') {\n        if (indexOf(optionTexts, this.text) === -1) {\n          optionTexts.unshift(this.text);\n        }\n      }\n\n      callback(optionTexts);\n    });\n  }\n\n  typeaheadUpdater(text: string) {\n    if (text === this.text) {\n      clearTimeout(this.cancelBlur);\n      this.inputElement.focus();\n      return text;\n    }\n\n    this.inputElement.val(text);\n    this.switchToLink(true);\n    return text;\n  }\n\n  switchToLink(fromClick: boolean) {\n    if (this.linkMode && !fromClick) {\n      return;\n    }\n\n    clearTimeout(this.cancelBlur);\n    this.cancelBlur = null;\n    this.linkMode = true;\n    this.inputElement.hide();\n    this.linkElement.show();\n    this.updateValue(this.inputElement.val() as string);\n  }\n\n  inputBlur() {\n    // happens long before the click event on the typeahead options\n    // need to have long delay because the blur\n    this.cancelBlur = setTimeout(this.switchToLink.bind(this), 200);\n  }\n\n  updateValue(text: string) {\n    text = unescape(text);\n\n    if (text === '' || this.text === text) {\n      return;\n    }\n\n    this.$scope.$apply(() => {\n      const option: any = find(this.optionCache, { text: text });\n\n      if (option) {\n        if (isObject(this.model)) {\n          this.model = option;\n        } else {\n          this.model = option.value;\n        }\n        this.text = option.text;\n      } else if (this.allowCustom) {\n        if (isObject(this.model)) {\n          (this.model as any).text = (this.model as any).value = text;\n        } else {\n          this.model = text;\n        }\n        this.text = text;\n      }\n\n      // needs to call this after digest so\n      // property is synced with outerscope\n      this.$scope.$$postDigest(() => {\n        this.$scope.$apply(() => {\n          this.onChange({ $option: option });\n        });\n      });\n    });\n  }\n\n  updateDisplay(text: string) {\n    this.text = text;\n    this.display = this.$sce.trustAsHtml(this.templateSrv.highlightVariablesAsHtml(text));\n  }\n\n  open() {\n    this.inputElement.css('width', Math.max(this.linkElement.width()!, 80) + 16 + 'px');\n\n    this.inputElement.show();\n    this.inputElement.focus();\n\n    this.linkElement.hide();\n    this.linkMode = false;\n\n    const typeahead = this.inputElement.data('typeahead');\n    if (typeahead) {\n      this.inputElement.val('');\n      typeahead.lookup();\n    }\n  }\n}\n\nconst template = `\n<input type=\"text\"\n  data-provide=\"typeahead\"\n  class=\"gf-form-input\"\n  spellcheck=\"false\"\n  style=\"display:none\">\n</input>\n<a ng-class=\"ctrl.cssClasses\"\n   tabindex=\"1\"\n   ng-click=\"ctrl.open()\"\n   give-focus=\"ctrl.focus\"\n   ng-bind-html=\"ctrl.display || '&nbsp;'\">\n</a>\n`;\n\nexport function formDropdownDirective() {\n  return {\n    restrict: 'E',\n    template: template,\n    controller: FormDropdownCtrl,\n    bindToController: true,\n    controllerAs: 'ctrl',\n    scope: {\n      model: '=',\n      getOptions: '&',\n      onChange: '&',\n      cssClass: '@',\n      allowCustom: '@',\n      labelMode: '@',\n      lookupText: '@',\n      placeholder: '@',\n      startOpen: '@',\n      debounce: '@',\n    },\n  };\n}\n\ncoreModule.directive('gfFormDropdown', formDropdownDirective);\n","import $ from 'jquery';\n// @ts-ignore\nimport baron from 'baron';\nimport coreModule from 'app/angular/core_module';\n\nconst scrollBarHTML = `\n<div class=\"baron__track\">\n  <div class=\"baron__bar\"></div>\n</div>\n`;\n\nconst scrollRootClass = 'baron baron__root';\nconst scrollerClass = 'baron__scroller';\n\nexport function geminiScrollbar() {\n  return {\n    restrict: 'A',\n    link: (scope: any, elem: any, attrs: any) => {\n      let scrollRoot = elem.parent();\n      const scroller = elem;\n\n      if (attrs.grafanaScrollbar && attrs.grafanaScrollbar === 'scrollonroot') {\n        scrollRoot = scroller;\n      }\n\n      scrollRoot.addClass(scrollRootClass);\n      $(scrollBarHTML).appendTo(scrollRoot);\n      elem.addClass(scrollerClass);\n\n      const scrollParams = {\n        root: scrollRoot[0],\n        scroller: scroller[0],\n        bar: '.baron__bar',\n        barOnCls: '_scrollbar',\n        scrollingCls: '_scrolling',\n        track: '.baron__track',\n        direction: 'v',\n      };\n\n      const scrollbar = baron(scrollParams);\n\n      scope.$on('$destroy', () => {\n        scrollbar.dispose();\n      });\n    },\n  };\n}\n\ncoreModule.directive('grafanaScrollbar', geminiScrollbar);\n","import coreModule from 'app/angular/core_module';\nimport { JsonExplorer } from '@grafana/ui';\n\ncoreModule.directive('jsonTree', [\n  function jsonTreeDirective() {\n    return {\n      restrict: 'E',\n      scope: {\n        object: '=',\n        startExpanded: '@',\n        rootName: '@',\n      },\n      link: (scope: any, elem) => {\n        let expansionLevel = scope.startExpanded;\n        if (scope.startExpanded === 'true') {\n          expansionLevel = 2;\n        } else if (scope.startExpanded === 'false') {\n          expansionLevel = 1;\n        }\n        const jsonObject = { [scope.rootName]: scope.object };\n        const jsonExp = new JsonExplorer(jsonObject, expansionLevel, {\n          animateOpen: true,\n        });\n        const html = jsonExp.render(true);\n        elem.append(html);\n      },\n    };\n  },\n]);\n","import coreModule from 'app/angular/core_module';\n\nconst template = `\n<label for=\"check-{{ctrl.id}}\" class=\"gf-form-switch-container\">\n  <div class=\"gf-form-label {{ctrl.labelClass}}\" ng-show=\"ctrl.label\">\n    {{ctrl.label}}\n    <info-popover mode=\"right-normal\" ng-if=\"ctrl.tooltip\" position=\"top center\">\n      {{ctrl.tooltip}}\n    </info-popover>\n  </div>\n  <div class=\"gf-form-switch {{ctrl.switchClass}}\" ng-if=\"ctrl.show\">\n    <input id=\"check-{{ctrl.id}}\" type=\"checkbox\" ng-model=\"ctrl.checked\" ng-change=\"ctrl.internalOnChange()\">\n    <span class=\"gf-form-switch__slider\"></span>\n  </div>\n</label>\n`;\n\nconst checkboxTemplate = `\n<label for=\"check-{{ctrl.id}}\" class=\"gf-form-switch-container\">\n   <div class=\"gf-form-label {{ctrl.labelClass}}\" ng-show=\"ctrl.label\">\n    {{ctrl.label}}\n    <info-popover mode=\"right-normal\" ng-if=\"ctrl.tooltip\" position=\"top center\">\n      {{ctrl.tooltip}}\n    </info-popover>\n  </div>\n  <div class=\"gf-form-checkbox {{ctrl.switchClass}}\" ng-if=\"ctrl.show\">\n    <input id=\"check-{{ctrl.id}}\" type=\"checkbox\" ng-model=\"ctrl.checked\" ng-change=\"ctrl.internalOnChange()\">\n    <span class=\"gf-form-switch__checkbox\"></span>\n  </div>\n</label>\n`;\n\nexport class SwitchCtrl {\n  onChange: any;\n  checked: any;\n  show: any;\n  id: any;\n  label?: string;\n\n  /** @ngInject */\n  constructor($scope: any, private $timeout: any) {\n    this.show = true;\n    this.id = $scope.$id;\n  }\n\n  internalOnChange() {\n    return this.$timeout(() => {\n      return this.onChange();\n    });\n  }\n}\n\nexport function switchDirective() {\n  return {\n    restrict: 'E',\n    controller: SwitchCtrl,\n    controllerAs: 'ctrl',\n    bindToController: true,\n    scope: {\n      checked: '=',\n      label: '@',\n      labelClass: '@',\n      tooltip: '@',\n      switchClass: '@',\n      onChange: '&',\n    },\n    template: template,\n  };\n}\n\nexport function checkboxDirective() {\n  return {\n    restrict: 'E',\n    controller: SwitchCtrl,\n    controllerAs: 'ctrl',\n    bindToController: true,\n    scope: {\n      checked: '=',\n      label: '@',\n      labelClass: '@',\n      tooltip: '@',\n      switchClass: '@',\n      onChange: '&',\n    },\n    template: checkboxTemplate,\n  };\n}\n\ncoreModule.directive('gfFormSwitch', switchDirective);\ncoreModule.directive('gfFormCheckbox', checkboxDirective);\n","import { each } from 'lodash';\nimport coreModule from 'app/angular/core_module';\n// @ts-ignore\nimport Drop from 'tether-drop';\n\nexport function infoPopover() {\n  return {\n    restrict: 'E',\n    template: `<icon name=\"'info-circle'\" style=\"margin-left: 10px;\" size=\"'xs'\"></icon>`,\n    transclude: true,\n    link: (scope: any, elem: any, attrs: any, ctrl: any, transclude: any) => {\n      const offset = attrs.offset || '0 -10px';\n      const position = attrs.position || 'right middle';\n      let classes = 'drop-help drop-hide-out-of-bounds';\n      const openOn = 'hover';\n\n      elem.addClass('gf-form-help-icon');\n\n      if (attrs.wide) {\n        classes += ' drop-wide';\n      }\n\n      if (attrs.mode) {\n        elem.addClass('gf-form-help-icon--' + attrs.mode);\n      }\n\n      transclude((clone: any, newScope: any) => {\n        const content = document.createElement('div');\n        content.className = 'markdown-html';\n\n        each(clone, (node) => {\n          content.appendChild(node);\n        });\n\n        const dropOptions = {\n          target: elem[0],\n          content: content,\n          position: position,\n          classes: classes,\n          openOn: openOn,\n          hoverOpenDelay: 400,\n          tetherOptions: {\n            offset: offset,\n            constraints: [\n              {\n                to: 'window',\n                attachment: 'together',\n                pin: true,\n              },\n            ],\n          },\n        };\n\n        // Create drop in next digest after directive content is rendered.\n        scope.$applyAsync(() => {\n          const drop = new Drop(dropOptions);\n\n          const unbind = scope.$on('$destroy', () => {\n            drop.destroy();\n            unbind();\n          });\n        });\n      });\n    },\n  };\n}\n\ncoreModule.directive('infoPopover', infoPopover);\n","/**\n * Wrapper for the new ngReact <color-picker> directive for backward compatibility.\n * Allows remaining <spectrum-picker> untouched in outdated plugins.\n * Technically, it's just a wrapper for react component with two-way data binding support.\n */\nimport coreModule from '../core_module';\n\n/** @ngInject */\nexport function spectrumPicker() {\n  return {\n    restrict: 'E',\n    require: 'ngModel',\n    scope: true,\n    replace: true,\n    template: '<color-picker color=\"ngModel.$viewValue\" on-change=\"onColorChange\"></color-picker>',\n    link: (scope: any, element: any, attrs: any, ngModel: any) => {\n      scope.ngModel = ngModel;\n      scope.onColorChange = (color: string) => {\n        ngModel.$setViewValue(color);\n      };\n    },\n  };\n}\ncoreModule.directive('spectrumPicker', spectrumPicker);\n","/**\n * codeEditor directive based on Ace code editor\n * https://github.com/ajaxorg/ace\n *\n * Basic usage:\n * <code-editor content=\"ctrl.target.query\" on-change=\"ctrl.panelCtrl.refresh()\"\n *  data-mode=\"sql\" data-show-gutter>\n * </code-editor>\n *\n * Params:\n * content:      Editor content.\n * onChange:     Function called on content change (invoked on editor blur, ctrl+enter, not on every change).\n * getCompleter: Function returned external completer. Completer is an object implemented getCompletions() method,\n *               see Prometheus Data Source implementation for details.\n *\n * Some Ace editor options available via data-* attributes:\n * data-mode               - Language mode (text, sql, javascript, etc.). Default is 'text'.\n * data-theme              - Editor theme (eg 'solarized_dark').\n * data-max-lines          - Max editor height in lines. Editor grows automatically from 1 to maxLines.\n * data-show-gutter        - Show gutter (contains line numbers and additional info).\n * data-tab-size           - Tab size, default is 2.\n * data-behaviours-enabled - Specifies whether to use behaviors or not. \"Behaviors\" in this case is the auto-pairing of\n *                           special characters, like quotation marks, parenthesis, or brackets.\n * data-snippets-enabled   - Specifies whether to use snippets or not. \"Snippets\" are small pieces of code that can be\n *                           inserted via the completion box.\n *\n * Keybindings:\n * Ctrl-Enter (Command-Enter): run onChange() function\n */\n\nimport coreModule from 'app/angular/core_module';\nimport config from 'app/core/config';\n\nconst DEFAULT_THEME_DARK = 'ace/theme/grafana-dark';\nconst DEFAULT_THEME_LIGHT = 'ace/theme/textmate';\nconst DEFAULT_MODE = 'text';\nconst DEFAULT_MAX_LINES = 10;\nconst DEFAULT_TAB_SIZE = 2;\nconst DEFAULT_BEHAVIORS = true;\nconst DEFAULT_SNIPPETS = true;\n\nconst editorTemplate = `<div></div>`;\n\nasync function link(scope: any, elem: any, attrs: any) {\n  // Options\n  const langMode = attrs.mode || DEFAULT_MODE;\n  const maxLines = attrs.maxLines || DEFAULT_MAX_LINES;\n  const showGutter = attrs.showGutter !== undefined;\n  const tabSize = attrs.tabSize || DEFAULT_TAB_SIZE;\n  const behavioursEnabled = attrs.behavioursEnabled ? attrs.behavioursEnabled === 'true' : DEFAULT_BEHAVIORS;\n  const snippetsEnabled = attrs.snippetsEnabled ? attrs.snippetsEnabled === 'true' : DEFAULT_SNIPPETS;\n\n  // Initialize editor\n  const aceElem = elem.get(0);\n  const { default: ace } = await import(/* webpackChunkName: \"brace\" */ 'brace');\n  await import('brace/ext/language_tools');\n  await import('brace/theme/textmate');\n  await import('brace/mode/text');\n  await import('brace/snippets/text');\n  await import('brace/mode/sql');\n  await import('brace/snippets/sql');\n  await import('brace/mode/sqlserver');\n  await import('brace/snippets/sqlserver');\n  await import('brace/mode/markdown');\n  await import('brace/snippets/markdown');\n  await import('brace/mode/json');\n  await import('brace/snippets/json');\n\n  // @ts-ignore\n  await import('./theme-grafana-dark');\n\n  const codeEditor = ace.edit(aceElem);\n  const editorSession = codeEditor.getSession();\n\n  const editorOptions = {\n    maxLines: maxLines,\n    showGutter: showGutter,\n    tabSize: tabSize,\n    behavioursEnabled: behavioursEnabled,\n    highlightActiveLine: false,\n    showPrintMargin: false,\n    autoScrollEditorIntoView: true, // this is needed if editor is inside scrollable page\n  };\n\n  // Set options\n  codeEditor.setOptions(editorOptions);\n  // disable depreacation warning\n  codeEditor.$blockScrolling = Infinity;\n  // Padding hacks\n  (codeEditor.renderer as any).setScrollMargin(10, 10);\n  codeEditor.renderer.setPadding(10);\n\n  setThemeMode();\n  setLangMode(langMode);\n  setEditorContent(scope.content);\n\n  // Add classes\n  elem.addClass('gf-code-editor');\n  const textarea = elem.find('textarea');\n  textarea.addClass('gf-form-input');\n\n  if (scope.codeEditorFocus) {\n    setTimeout(() => {\n      textarea.focus();\n      const domEl = textarea[0];\n      if (domEl.setSelectionRange) {\n        const pos = textarea.val().length * 2;\n        domEl.setSelectionRange(pos, pos);\n      }\n    }, 100);\n  }\n\n  // Event handlers\n  editorSession.on('change', (e) => {\n    scope.$apply(() => {\n      const newValue = codeEditor.getValue();\n      scope.content = newValue;\n    });\n  });\n\n  // Sync with outer scope - update editor content if model has been changed from outside of directive.\n  scope.$watch('content', (newValue: any, oldValue: any) => {\n    const editorValue = codeEditor.getValue();\n    if (newValue !== editorValue && newValue !== oldValue) {\n      scope.$$postDigest(() => {\n        setEditorContent(newValue);\n      });\n    }\n  });\n\n  codeEditor.on('blur', () => {\n    scope.onChange();\n  });\n\n  scope.$on('$destroy', () => {\n    codeEditor.destroy();\n  });\n\n  // Keybindings\n  codeEditor.commands.addCommand({\n    name: 'executeQuery',\n    bindKey: { win: 'Ctrl-Enter', mac: 'Command-Enter' },\n    exec: () => {\n      scope.onChange();\n    },\n  });\n\n  function setLangMode(lang: string) {\n    ace.acequire('ace/ext/language_tools');\n    codeEditor.setOptions({\n      enableBasicAutocompletion: true,\n      enableLiveAutocompletion: true,\n      enableSnippets: snippetsEnabled,\n    });\n\n    if (scope.getCompleter()) {\n      // make copy of array as ace seems to share completers array between instances\n      const anyEditor = codeEditor as any;\n      anyEditor.completers = anyEditor.completers.slice();\n      anyEditor.completers.push(scope.getCompleter());\n    }\n\n    const aceModeName = `ace/mode/${lang}`;\n    editorSession.setMode(aceModeName);\n  }\n\n  function setThemeMode() {\n    let theme = DEFAULT_THEME_DARK;\n    if (config.bootData.user.lightTheme) {\n      theme = DEFAULT_THEME_LIGHT;\n    }\n\n    codeEditor.setTheme(theme);\n  }\n\n  function setEditorContent(value: string) {\n    codeEditor.setValue(value);\n    codeEditor.clearSelection();\n  }\n}\n\nexport function codeEditorDirective() {\n  return {\n    restrict: 'E',\n    template: editorTemplate,\n    scope: {\n      content: '=',\n      datasource: '=',\n      codeEditorFocus: '<',\n      onChange: '&',\n      getCompleter: '&',\n    },\n    link: link,\n  };\n}\n\ncoreModule.directive('codeEditor', codeEditorDirective);\n","import { debounce, each, indexOf, map, partial, escape, unescape } from 'lodash';\nimport $ from 'jquery';\nimport coreModule from 'app/angular/core_module';\n\nconst template = `\n<div class=\"dropdown cascade-open\">\n<a ng-click=\"showActionsMenu()\" class=\"query-part-name pointer dropdown-toggle\" data-toggle=\"dropdown\">{{part.label}}</a>\n<span>{{part.def.wrapOpen}}</span><span class=\"query-part-parameters\"></span><span>{{part.def.wrapClose}}</span>\n<ul class=\"dropdown-menu\">\n  <li ng-repeat=\"action in partActions\">\n    <a ng-click=\"triggerPartAction(action)\">{{action.text}}</a>\n  </li>\n</ul>\n`;\n\n/** @ngInject */\nexport function sqlPartEditorDirective(templateSrv: any) {\n  const paramTemplate = '<input type=\"text\" class=\"hide input-mini\"></input>';\n\n  return {\n    restrict: 'E',\n    template: template,\n    scope: {\n      part: '=',\n      handleEvent: '&',\n      debounce: '@',\n    },\n    link: function postLink($scope: any, elem: any) {\n      const part = $scope.part;\n      const partDef = part.def;\n      const $paramsContainer = elem.find('.query-part-parameters');\n      const debounceLookup = $scope.debounce;\n      let cancelBlur: any = null;\n\n      $scope.partActions = [];\n\n      function clickFuncParam(this: any, paramIndex: number) {\n        const $link = $(this);\n        const $input = $link.next();\n\n        $input.val(part.params[paramIndex]);\n        $input.css('width', $link.width()! + 16 + 'px');\n\n        $link.hide();\n        $input.show();\n        $input.focus();\n        $input.select();\n\n        const typeahead = $input.data('typeahead');\n        if (typeahead) {\n          $input.val('');\n          typeahead.lookup();\n        }\n      }\n\n      function inputBlur($input: JQuery, paramIndex: number) {\n        cancelBlur = setTimeout(() => {\n          switchToLink($input, paramIndex);\n        }, 200);\n      }\n\n      function switchToLink($input: JQuery, paramIndex: number) {\n        const $link = $input.prev();\n        const newValue = $input.val();\n\n        if (newValue !== '' || part.def.params[paramIndex].optional) {\n          $link.html(templateSrv.highlightVariablesAsHtml(newValue));\n\n          part.updateParam($input.val(), paramIndex);\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'part-param-changed' } });\n          });\n        }\n\n        $input.hide();\n        $link.show();\n      }\n\n      function inputKeyPress(this: any, paramIndex: number, e: any) {\n        if (e.which === 13) {\n          switchToLink($(this), paramIndex);\n        }\n      }\n\n      function inputKeyDown(this: any) {\n        this.style.width = (3 + this.value.length) * 8 + 'px';\n      }\n\n      function addTypeahead($input: JQuery, param: any, paramIndex: number) {\n        if (!param.options && !param.dynamicLookup) {\n          return;\n        }\n\n        const typeaheadSource = (query: string, callback: any) => {\n          if (param.options) {\n            let options = param.options;\n            if (param.type === 'int') {\n              options = map(options, (val) => {\n                return val.toString();\n              });\n            }\n            return options;\n          }\n\n          $scope.$apply(() => {\n            $scope.handleEvent({ $event: { name: 'get-param-options', param: param } }).then((result: any) => {\n              const dynamicOptions = map(result, (op) => {\n                return escape(op.value);\n              });\n\n              // add current value to dropdown if it's not in dynamicOptions\n              if (indexOf(dynamicOptions, part.params[paramIndex]) === -1) {\n                dynamicOptions.unshift(escape(part.params[paramIndex]));\n              }\n\n              callback(dynamicOptions);\n            });\n          });\n        };\n\n        $input.attr('data-provide', 'typeahead');\n\n        $input.typeahead({\n          source: typeaheadSource,\n          minLength: 0,\n          items: 1000,\n          updater: (value: string) => {\n            value = unescape(value);\n            if (value === part.params[paramIndex]) {\n              clearTimeout(cancelBlur);\n              $input.focus();\n              return value;\n            }\n            return value;\n          },\n        });\n\n        const typeahead = $input.data('typeahead');\n        typeahead.lookup = function () {\n          this.query = this.$element.val() || '';\n          const items = this.source(this.query, $.proxy(this.process, this));\n          return items ? this.process(items) : items;\n        };\n\n        if (debounceLookup) {\n          typeahead.lookup = debounce(typeahead.lookup, 500, { leading: true });\n        }\n      }\n\n      $scope.showActionsMenu = () => {\n        $scope.handleEvent({ $event: { name: 'get-part-actions' } }).then((res: any) => {\n          $scope.partActions = res;\n        });\n      };\n\n      $scope.triggerPartAction = (action: string) => {\n        $scope.handleEvent({ $event: { name: 'action', action: action } });\n      };\n\n      function addElementsAndCompile() {\n        each(partDef.params, (param: any, index: number) => {\n          if (param.optional && part.params.length <= index) {\n            return;\n          }\n\n          if (index > 0) {\n            $('<span>' + partDef.separator + '</span>').appendTo($paramsContainer);\n          }\n\n          const paramValue = templateSrv.highlightVariablesAsHtml(part.params[index]);\n          const $paramLink = $('<a class=\"query-part__link\">' + paramValue + '</a>');\n          const $input = $(paramTemplate);\n\n          $paramLink.appendTo($paramsContainer);\n          $input.appendTo($paramsContainer);\n\n          $input.blur(partial(inputBlur, $input, index));\n          $input.keyup(inputKeyDown);\n          $input.keypress(partial(inputKeyPress, index));\n          $paramLink.click(partial(clickFuncParam, index));\n\n          addTypeahead($input, param, index);\n        });\n      }\n\n      function relink() {\n        $paramsContainer.empty();\n        addElementsAndCompile();\n      }\n\n      relink();\n    },\n  };\n}\n\ncoreModule.directive('sqlPartEditor', sqlPartEditorDirective);\n","import { coreModule } from 'app/angular/core_module';\n\ncoreModule.directive('datasourceHttpSettings', () => {\n  return {\n    scope: {\n      current: '=',\n      suggestUrl: '@',\n      noDirectAccess: '@',\n      showForwardOAuthIdentityOption: '@',\n    },\n    templateUrl: 'public/app/angular/partials/http_settings_next.html',\n    link: {\n      pre: ($scope: any) => {\n        // do not show access option if direct access is disabled\n        $scope.showAccessOption = $scope.noDirectAccess !== 'true';\n        $scope.onChange = (datasourceSetting: any) => {\n          $scope.current = datasourceSetting;\n        };\n      },\n    },\n  };\n});\n","import { coreModule } from 'app/angular/core_module';\n\ncoreModule.directive('datasourceTlsAuthSettings', () => {\n  return {\n    scope: {\n      current: '=',\n    },\n    templateUrl: 'public/app/angular/partials/tls_auth_settings.html',\n  };\n});\n","import angular, { ILocationService } from 'angular';\nimport { each } from 'lodash';\n\nimport config from 'app/core/config';\nimport coreModule from 'app/angular/core_module';\n\nimport { DataSourceApi, PanelEvents } from '@grafana/data';\nimport { importDataSourcePlugin, importAppPlugin } from '../../features/plugins/plugin_loader';\nimport { importPanelPlugin } from '../../features/plugins/importPanelPlugin';\n\n/** @ngInject */\nfunction pluginDirectiveLoader($compile: any, $http: any, $templateCache: any, $location: ILocationService) {\n  function getTemplate(component: { template: any; templateUrl: any }) {\n    if (component.template) {\n      return Promise.resolve(component.template);\n    }\n    const cached = $templateCache.get(component.templateUrl);\n    if (cached) {\n      return Promise.resolve(cached);\n    }\n    return $http.get(component.templateUrl).then((res: any) => {\n      return res.data;\n    });\n  }\n\n  function relativeTemplateUrlToAbs(templateUrl: string, baseUrl: string) {\n    if (!templateUrl) {\n      return undefined;\n    }\n    if (templateUrl.indexOf('public') === 0) {\n      return templateUrl;\n    }\n    return baseUrl + '/' + templateUrl;\n  }\n\n  function getPluginComponentDirective(options: any) {\n    // handle relative template urls for plugin templates\n    options.Component.templateUrl = relativeTemplateUrlToAbs(options.Component.templateUrl, options.baseUrl);\n\n    return () => {\n      return {\n        templateUrl: options.Component.templateUrl,\n        template: options.Component.template,\n        restrict: 'E',\n        controller: options.Component,\n        controllerAs: 'ctrl',\n        bindToController: true,\n        scope: options.bindings,\n        link: (scope: any, elem: any, attrs: any, ctrl: any) => {\n          if (ctrl.link) {\n            ctrl.link(scope, elem, attrs, ctrl);\n          }\n          if (ctrl.init) {\n            ctrl.init();\n          }\n        },\n      };\n    };\n  }\n\n  function loadPanelComponentInfo(scope: any, attrs: any) {\n    const componentInfo: any = {\n      name: 'panel-plugin-' + scope.panel.type,\n      bindings: { dashboard: '=', panel: '=', row: '=' },\n      attrs: {\n        dashboard: 'dashboard',\n        panel: 'panel',\n        class: 'panel-height-helper',\n      },\n    };\n\n    const panelInfo = config.panels[scope.panel.type];\n    return importPanelPlugin(panelInfo.id).then((panelPlugin) => {\n      const PanelCtrl = panelPlugin.angularPanelCtrl;\n      componentInfo.Component = PanelCtrl;\n\n      if (!PanelCtrl || PanelCtrl.registered) {\n        return componentInfo;\n      }\n\n      if (PanelCtrl.templatePromise) {\n        return PanelCtrl.templatePromise.then((res: any) => {\n          return componentInfo;\n        });\n      }\n\n      if (panelInfo) {\n        PanelCtrl.templateUrl = relativeTemplateUrlToAbs(PanelCtrl.templateUrl, panelInfo.baseUrl);\n      }\n\n      PanelCtrl.templatePromise = getTemplate(PanelCtrl).then((template: any) => {\n        PanelCtrl.templateUrl = null;\n        PanelCtrl.template = `<grafana-panel ctrl=\"ctrl\" class=\"panel-height-helper\">${template}</grafana-panel>`;\n        return componentInfo;\n      });\n\n      return PanelCtrl.templatePromise;\n    });\n  }\n\n  function getModule(scope: any, attrs: any): any {\n    switch (attrs.type) {\n      // QueryCtrl\n      case 'query-ctrl': {\n        const ds: DataSourceApi = scope.ctrl.datasource as DataSourceApi;\n\n        return Promise.resolve({\n          baseUrl: ds.meta.baseUrl,\n          name: 'query-ctrl-' + ds.meta.id,\n          bindings: { target: '=', panelCtrl: '=', datasource: '=' },\n          attrs: {\n            target: 'ctrl.target',\n            'panel-ctrl': 'ctrl',\n            datasource: 'ctrl.datasource',\n          },\n          Component: ds.components!.QueryCtrl,\n        });\n      }\n      // Annotations\n      case 'annotations-query-ctrl': {\n        const baseUrl = scope.ctrl.currentDatasource.meta.baseUrl;\n        const pluginId = scope.ctrl.currentDatasource.meta.id;\n\n        return importDataSourcePlugin(scope.ctrl.currentDatasource.meta).then((dsPlugin) => {\n          return {\n            baseUrl,\n            name: 'annotations-query-ctrl-' + pluginId,\n            bindings: { annotation: '=', datasource: '=' },\n            attrs: {\n              annotation: 'ctrl.currentAnnotation',\n              datasource: 'ctrl.currentDatasource',\n            },\n            Component: dsPlugin.components.AnnotationsQueryCtrl,\n          };\n        });\n      }\n      // Datasource ConfigCtrl\n      case 'datasource-config-ctrl': {\n        const dsMeta = scope.ctrl.datasourceMeta;\n        const angularUrl = $location.url();\n        return importDataSourcePlugin(dsMeta).then((dsPlugin) => {\n          scope.$watch(\n            'ctrl.current',\n            () => {\n              // This watcher can trigger when we navigate away due to late digests\n              // This check is to stop onModelChanged from being called when navigating away\n              // as it triggers a redux action which comes before the angular $routeChangeSucces and\n              // This makes the bridgeSrv think location changed from redux before detecting it was actually\n              // changed from angular.\n              if (angularUrl === $location.url()) {\n                scope.onModelChanged(scope.ctrl.current);\n              }\n            },\n            true\n          );\n\n          return {\n            baseUrl: dsMeta.baseUrl,\n            name: 'ds-config-' + dsMeta.id,\n            bindings: { meta: '=', current: '=' },\n            attrs: { meta: 'ctrl.datasourceMeta', current: 'ctrl.current' },\n            Component: dsPlugin.angularConfigCtrl,\n          };\n        });\n      }\n      // AppConfigCtrl\n      case 'app-config-ctrl': {\n        const model = scope.ctrl.model;\n        return importAppPlugin(model).then((appPlugin) => {\n          return {\n            baseUrl: model.baseUrl,\n            name: 'app-config-' + model.id,\n            bindings: { appModel: '=', appEditCtrl: '=' },\n            attrs: { 'app-model': 'ctrl.model', 'app-edit-ctrl': 'ctrl' },\n            Component: appPlugin.angularConfigCtrl,\n          };\n        });\n      }\n      // Panel\n      case 'panel': {\n        return loadPanelComponentInfo(scope, attrs);\n      }\n      default: {\n        return Promise.reject({\n          message: 'Could not find component type: ' + attrs.type,\n        });\n      }\n    }\n  }\n\n  function appendAndCompile(scope: any, elem: JQuery, componentInfo: any) {\n    const child = angular.element(document.createElement(componentInfo.name));\n    each(componentInfo.attrs, (value, key) => {\n      child.attr(key, value);\n    });\n\n    $compile(child)(scope);\n    elem.empty();\n\n    // let a binding digest cycle complete before adding to dom\n    setTimeout(() => {\n      scope.$applyAsync(() => {\n        elem.append(child);\n        setTimeout(() => {\n          scope.$applyAsync(() => {\n            scope.$broadcast(PanelEvents.componentDidMount.name);\n          });\n        });\n      });\n    });\n  }\n\n  function registerPluginComponent(scope: any, elem: JQuery, attrs: any, componentInfo: any) {\n    if (componentInfo.notFound) {\n      elem.empty();\n      return;\n    }\n\n    if (!componentInfo.Component) {\n      throw {\n        message: 'Failed to find exported plugin component for ' + componentInfo.name,\n      };\n    }\n\n    if (!componentInfo.Component.registered) {\n      const directiveName = attrs.$normalize(componentInfo.name);\n      const directiveFn = getPluginComponentDirective(componentInfo);\n      coreModule.directive(directiveName, directiveFn);\n      componentInfo.Component.registered = true;\n    }\n\n    appendAndCompile(scope, elem, componentInfo);\n  }\n\n  return {\n    restrict: 'E',\n    link: (scope: any, elem: JQuery, attrs: any) => {\n      getModule(scope, attrs)\n        .then((componentInfo: any) => {\n          registerPluginComponent(scope, elem, attrs, componentInfo);\n        })\n        .catch((err: any) => {\n          console.error('Plugin component error', err);\n        });\n    },\n  };\n}\n\ncoreModule.directive('pluginComponent', pluginDirectiveLoader);\n","// Libraries\n// eslint-disable-next-line lodash/import-scope\nimport _ from 'lodash';\nimport $ from 'jquery';\n\n// Utils and servies\nimport { colors } from '@grafana/ui';\nimport { setLegacyAngularInjector, setAppEvents, setAngularLoader } from '@grafana/runtime';\nimport config from 'app/core/config';\nimport coreModule from 'app/angular/core_module';\nimport appEvents from 'app/core/app_events';\nimport { AngularLoader } from 'app/angular/services/AngularLoader';\n\n// Types\nimport { CoreEvents, AppEventEmitter, AppEventConsumer } from 'app/types';\nimport { UtilSrv } from './services/UtilSrv';\nimport { ContextSrv } from 'app/core/services/context_srv';\nimport { IRootScopeService, IAngularEvent, auto } from 'angular';\nimport { AppEvent } from '@grafana/data';\nimport { initGrafanaLive } from 'app/features/live';\n\nexport type GrafanaRootScope = IRootScopeService & AppEventEmitter & AppEventConsumer & { colors: string[] };\n\nexport class GrafanaCtrl {\n  /** @ngInject */\n  constructor(\n    $scope: any,\n    utilSrv: UtilSrv,\n    $rootScope: GrafanaRootScope,\n    contextSrv: ContextSrv,\n    angularLoader: AngularLoader,\n    $injector: auto.IInjectorService\n  ) {\n    // make angular loader service available to react components\n    setAngularLoader(angularLoader);\n    setLegacyAngularInjector($injector);\n    setAppEvents(appEvents);\n\n    initGrafanaLive();\n\n    $scope.init = () => {\n      $scope.contextSrv = contextSrv;\n      $scope.appSubUrl = config.appSubUrl;\n      $scope._ = _;\n      utilSrv.init();\n    };\n\n    $rootScope.colors = colors;\n\n    $rootScope.onAppEvent = function <T>(\n      event: AppEvent<T> | string,\n      callback: (event: IAngularEvent, ...args: any[]) => void,\n      localScope?: any\n    ) {\n      let unbind;\n      if (typeof event === 'string') {\n        unbind = $rootScope.$on(event, callback);\n      } else {\n        unbind = $rootScope.$on(event.name, callback);\n      }\n\n      let callerScope = this;\n      if (callerScope.$id === 1 && !localScope) {\n        console.warn('warning rootScope onAppEvent called without localscope');\n      }\n      if (localScope) {\n        callerScope = localScope;\n      }\n      callerScope.$on('$destroy', unbind);\n    };\n\n    $rootScope.appEvent = <T>(event: AppEvent<T> | string, payload?: T | any) => {\n      if (typeof event === 'string') {\n        $rootScope.$emit(event, payload);\n        appEvents.emit(event, payload);\n      } else {\n        $rootScope.$emit(event.name, payload);\n        appEvents.emit(event, payload);\n      }\n    };\n\n    $scope.init();\n  }\n}\n\n/** @ngInject */\nexport function grafanaAppDirective() {\n  return {\n    restrict: 'E',\n    controller: GrafanaCtrl,\n    link: (scope: IRootScopeService & AppEventEmitter, elem: JQuery) => {\n      const body = $('body');\n      // see https://github.com/zenorocha/clipboard.js/issues/155\n      $.fn.modal.Constructor.prototype.enforceFocus = () => {};\n\n      appEvents.on(CoreEvents.toggleSidemenuHidden, () => {\n        body.toggleClass('sidemenu-hidden');\n      });\n\n      // handle in active view state class\n      let lastActivity = new Date().getTime();\n      let activeUser = true;\n      const inActiveTimeLimit = 60 * 5000;\n\n      function checkForInActiveUser() {\n        if (!activeUser) {\n          return;\n        }\n        // only go to activity low mode on dashboard page\n        if (!body.hasClass('page-dashboard')) {\n          return;\n        }\n\n        if (new Date().getTime() - lastActivity > inActiveTimeLimit) {\n          activeUser = false;\n          body.addClass('view-mode--inactive');\n        }\n      }\n\n      function userActivityDetected() {\n        lastActivity = new Date().getTime();\n        if (!activeUser) {\n          activeUser = true;\n          body.removeClass('view-mode--inactive');\n        }\n      }\n\n      // mouse and keyboard is user activity\n      body.mousemove(userActivityDetected);\n      body.keydown(userActivityDetected);\n      // set useCapture = true to catch event here\n      document.addEventListener('wheel', userActivityDetected, { capture: true, passive: true });\n      // treat tab change as activity\n      document.addEventListener('visibilitychange', userActivityDetected);\n\n      // check every 2 seconds\n      setInterval(checkForInActiveUser, 2000);\n\n      // handle document clicks that should hide things\n      body.click((evt) => {\n        const target = $(evt.target);\n        if (target.parents().length === 0) {\n          return;\n        }\n\n        // ensure dropdown menu doesn't impact on z-index\n        body.find('.dropdown-menu-open').removeClass('dropdown-menu-open');\n\n        // for stuff that animates, slides out etc, clicking it needs to\n        // hide it right away\n        const clickAutoHide = target.closest('[data-click-hide]');\n        if (clickAutoHide.length) {\n          const clickAutoHideParent = clickAutoHide.parent();\n          clickAutoHide.detach();\n          setTimeout(() => {\n            clickAutoHideParent.append(clickAutoHide);\n          }, 100);\n        }\n\n        // hide popovers\n        const popover = elem.find('.popover');\n        if (popover.length > 0 && target.parents('.graph-legend').length === 0) {\n          popover.hide();\n        }\n      });\n    },\n  };\n}\n\ncoreModule.directive('grafanaApp', grafanaAppDirective);\n","// This is empty for now, as I think it's not going to be necessary.\n// This replaces Angular RouteProvider implementation with a dummy one to keep the ball rolling\n\nimport { navigationLogger } from '@grafana/runtime';\n\nexport class RouteProvider {\n  constructor() {\n    navigationLogger('Patch angular', false, 'RouteProvider');\n  }\n\n  $get() {\n    return this;\n  }\n}\n","// This is empty for now, as I think it's not going to be necessary.\n// This replaces Angular RouteParamsProvider implementation with a dummy one to keep the ball rolling\n\nimport { navigationLogger } from '@grafana/runtime';\n\nexport class RouteParamsProvider {\n  constructor() {\n    navigationLogger('Patch angular', false, 'RouteParamsProvider');\n  }\n  $get = () => {\n    // throw new Error('TODO: Refactor $routeParams');\n  };\n}\n","import { coreModule } from './core_module';\nimport { RouteProvider } from '../core/navigation/patch/RouteProvider';\nimport { RouteParamsProvider } from '../core/navigation/patch/RouteParamsProvider';\nimport { ILocationService } from 'angular';\nimport { AngularLocationWrapper } from './AngularLocationWrapper';\n\n// Neutralizing Angular’s location tampering\n// https://stackoverflow.com/a/19825756\nconst tamperAngularLocation = () => {\n  coreModule.config([\n    '$provide',\n    ($provide: any) => {\n      $provide.decorator('$browser', [\n        '$delegate',\n        ($delegate: any) => {\n          $delegate.onUrlChange = () => {};\n          $delegate.url = () => '';\n\n          return $delegate;\n        },\n      ]);\n    },\n  ]);\n};\n\n// Intercepting $location service with implementation based on history\nconst interceptAngularLocation = () => {\n  coreModule.config([\n    '$provide',\n    ($provide: any) => {\n      $provide.decorator('$location', [\n        '$delegate',\n        ($delegate: ILocationService) => {\n          $delegate = (new AngularLocationWrapper() as unknown) as ILocationService;\n          return $delegate;\n        },\n      ]);\n    },\n  ]);\n  coreModule.provider('$route', RouteProvider);\n  coreModule.provider('$routeParams', RouteParamsProvider);\n};\n\nexport function initAngularRoutingBridge() {\n  tamperAngularLocation();\n  interceptAngularLocation();\n}\n","import { cloneDeep } from 'lodash';\nimport { AnnotationEvent, deprecationWarning } from '@grafana/data';\n\nimport { deleteAnnotation, saveAnnotation, updateAnnotation } from 'app/features/annotations/api';\nimport { AnnotationQueryOptions } from 'app/features/annotations/types';\n\n/**\n * @deprecated AnnotationsSrv is deprecated in favor of DashboardQueryRunner\n */\nexport class AnnotationsSrv {\n  /**\n   * @deprecated clearPromiseCaches is deprecated\n   */\n  clearPromiseCaches() {\n    deprecationWarning('annotations_srv.ts', 'clearPromiseCaches', 'DashboardQueryRunner');\n  }\n\n  /**\n   * @deprecated getAnnotations is deprecated in favor of DashboardQueryRunner.getResult\n   */\n  getAnnotations(options: AnnotationQueryOptions) {\n    deprecationWarning('annotations_srv.ts', 'getAnnotations', 'DashboardQueryRunner.getResult');\n    return Promise.resolve({ annotations: [], alertState: undefined });\n  }\n\n  /**\n   * @deprecated getAlertStates is deprecated in favor of DashboardQueryRunner.getResult\n   */\n  getAlertStates(options: any) {\n    deprecationWarning('annotations_srv.ts', 'getAlertStates', 'DashboardQueryRunner.getResult');\n    return Promise.resolve(undefined);\n  }\n\n  /**\n   * @deprecated getGlobalAnnotations is deprecated in favor of DashboardQueryRunner.getResult\n   */\n  getGlobalAnnotations(options: AnnotationQueryOptions) {\n    deprecationWarning('annotations_srv.ts', 'getGlobalAnnotations', 'DashboardQueryRunner.getResult');\n    return Promise.resolve([]);\n  }\n\n  /**\n   * @deprecated saveAnnotationEvent is deprecated\n   */\n  saveAnnotationEvent(annotation: AnnotationEvent) {\n    deprecationWarning('annotations_srv.ts', 'saveAnnotationEvent', 'api/saveAnnotation');\n    return saveAnnotation(annotation);\n  }\n\n  /**\n   * @deprecated updateAnnotationEvent is deprecated\n   */\n  updateAnnotationEvent(annotation: AnnotationEvent) {\n    deprecationWarning('annotations_srv.ts', 'updateAnnotationEvent', 'api/updateAnnotation');\n    return updateAnnotation(annotation);\n  }\n\n  /**\n   * @deprecated deleteAnnotationEvent is deprecated\n   */\n  deleteAnnotationEvent(annotation: AnnotationEvent) {\n    deprecationWarning('annotations_srv.ts', 'deleteAnnotationEvent', 'api/deleteAnnotation');\n    return deleteAnnotation(annotation);\n  }\n\n  /**\n   * @deprecated translateQueryResult is deprecated in favor of DashboardQueryRunner/utils/translateQueryResult\n   */\n  translateQueryResult(annotation: any, results: any) {\n    deprecationWarning('annotations_srv.ts', 'translateQueryResult', 'DashboardQueryRunner/utils/translateQueryResult');\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 = annotation.iconColor;\n      item.type = annotation.name;\n      item.isRegion = item.timeEnd && item.time !== item.timeEnd;\n    }\n\n    return results;\n  }\n}\n","import { GrafanaRootScope } from 'app/angular/GrafanaCtrl';\nimport { HideModalEvent, ShowModalEvent } from '../../types/events';\nimport { deprecationWarning } from '@grafana/data';\nimport { appEvents } from 'app/core/app_events';\n\n/**\n * Old legacy utilSrv exposed to angular services and handles angular modals.\n * Not used by any core or known external plugin.\n */\nexport class UtilSrv {\n  modalScope: any;\n\n  /** @ngInject */\n  constructor(private $rootScope: GrafanaRootScope, private $modal: any) {}\n\n  init() {\n    appEvents.subscribe(ShowModalEvent, (e) => this.showModal(e.payload));\n    appEvents.subscribe(HideModalEvent, this.hideModal.bind(this));\n  }\n\n  /**\n   * @deprecated use showModalReact instead that has this capability built in\n   */\n  hideModal() {\n    deprecationWarning('UtilSrv', 'hideModal', 'showModalReact');\n    if (this.modalScope && this.modalScope.dismiss) {\n      this.modalScope.dismiss();\n    }\n  }\n\n  /**\n   * @deprecated use showModalReact instead\n   */\n  showModal(options: any) {\n    deprecationWarning('UtilSrv', 'showModal', 'showModalReact');\n    if (this.modalScope && this.modalScope.dismiss) {\n      this.modalScope.dismiss();\n    }\n\n    this.modalScope = options.scope;\n\n    if (options.model) {\n      this.modalScope = this.$rootScope.$new();\n      this.modalScope.model = options.model;\n    } else if (!this.modalScope) {\n      this.modalScope = this.$rootScope.$new();\n    }\n\n    const modal = this.$modal({\n      modalClass: options.modalClass,\n      template: options.src,\n      templateHtml: options.templateHtml,\n      persist: false,\n      show: false,\n      scope: this.modalScope,\n      keyboard: false,\n      backdrop: options.backdrop,\n    });\n\n    Promise.resolve(modal).then((modalEl) => {\n      modalEl.modal('show');\n    });\n  }\n}\n","import angular from 'angular';\nimport 'angular-route';\nimport 'angular-sanitize';\nimport 'angular-bindonce';\nimport 'vendor/bootstrap/bootstrap';\nimport 'vendor/angular-other/angular-strap';\nimport { config } from 'app/core/config';\nimport coreModule, { angularModules } from 'app/angular/core_module';\nimport { DashboardLoaderSrv } from 'app/features/dashboard/services/DashboardLoaderSrv';\nimport { registerAngularDirectives } from './angular_wrappers';\nimport { initAngularRoutingBridge } from './bridgeReactAngularRouting';\nimport { monkeyPatchInjectorWithPreAssignedBindings } from './injectorMonkeyPatch';\nimport { extend } from 'lodash';\nimport { getTimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { registerComponents } from './registerComponents';\n\nexport class AngularApp {\n  ngModuleDependencies: any[];\n  preBootModules: any[];\n  registerFunctions: any;\n\n  constructor() {\n    this.preBootModules = [];\n    this.ngModuleDependencies = [];\n    this.registerFunctions = {};\n  }\n\n  init() {\n    const app = angular.module('grafana', []);\n\n    app.config(\n      (\n        $controllerProvider: angular.IControllerProvider,\n        $compileProvider: angular.ICompileProvider,\n        $filterProvider: angular.IFilterProvider,\n        $httpProvider: angular.IHttpProvider,\n        $provide: angular.auto.IProvideService\n      ) => {\n        if (config.buildInfo.env !== 'development') {\n          $compileProvider.debugInfoEnabled(false);\n        }\n\n        $httpProvider.useApplyAsync(true);\n\n        this.registerFunctions.controller = $controllerProvider.register;\n        this.registerFunctions.directive = $compileProvider.directive;\n        this.registerFunctions.factory = $provide.factory;\n        this.registerFunctions.service = $provide.service;\n        this.registerFunctions.filter = $filterProvider.register;\n\n        $provide.decorator('$http', [\n          '$delegate',\n          '$templateCache',\n          ($delegate: any, $templateCache: any) => {\n            const get = $delegate.get;\n            $delegate.get = (url: string, config: any) => {\n              if (url.match(/\\.html$/)) {\n                // some template's already exist in the cache\n                if (!$templateCache.get(url)) {\n                  url += '?v=' + new Date().getTime();\n                }\n              }\n              return get(url, config);\n            };\n            return $delegate;\n          },\n        ]);\n      }\n    );\n\n    this.ngModuleDependencies = [\n      'grafana.core',\n      'ngSanitize',\n      '$strap.directives',\n      'grafana',\n      'pasvaz.bindonce',\n      'react',\n    ];\n\n    // makes it possible to add dynamic stuff\n    angularModules.forEach((m: angular.IModule) => {\n      this.useModule(m);\n    });\n\n    // register react angular wrappers\n    angular.module('grafana.services').service('dashboardLoaderSrv', DashboardLoaderSrv);\n\n    coreModule.factory('timeSrv', () => getTimeSrv());\n    coreModule.factory('templateSrv', () => getTemplateSrv());\n\n    registerAngularDirectives();\n    registerComponents();\n    initAngularRoutingBridge();\n\n    // disable tool tip animation\n    $.fn.tooltip.defaults.animation = false;\n  }\n\n  useModule(module: angular.IModule) {\n    if (this.preBootModules) {\n      this.preBootModules.push(module);\n    } else {\n      extend(module, this.registerFunctions);\n    }\n    this.ngModuleDependencies.push(module.name);\n    return module;\n  }\n\n  bootstrap() {\n    const injector = angular.bootstrap(document.getElementById('ngRoot')!, this.ngModuleDependencies);\n\n    monkeyPatchInjectorWithPreAssignedBindings(injector);\n\n    injector.invoke(() => {\n      this.preBootModules.forEach((module) => {\n        extend(module, this.registerFunctions);\n      });\n\n      // I don't know\n      return () => {};\n    });\n\n    return injector;\n  }\n}\n","import { getBackendSrv, getDataSourceSrv } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/core';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { validationSrv } from 'app/features/manage-dashboards/services/ValidationSrv';\nimport { getLinkSrv } from 'app/features/panel/panellinks/link_srv';\nimport coreModule from './core_module';\nimport { AnnotationsSrv } from './services/annotations_srv';\nimport { UtilSrv } from './services/UtilSrv';\n\nexport function registerComponents() {\n  coreModule.factory('backendSrv', () => getBackendSrv());\n  coreModule.factory('contextSrv', () => contextSrv);\n  coreModule.factory('dashboardSrv', () => getDashboardSrv());\n  coreModule.factory('datasourceSrv', () => getDataSourceSrv());\n  coreModule.factory('linkSrv', () => getLinkSrv());\n  coreModule.factory('validationSrv', () => validationSrv);\n  coreModule.service('annotationsSrv', AnnotationsSrv);\n  coreModule.service('utilSrv', UtilSrv);\n}\n","export function monkeyPatchInjectorWithPreAssignedBindings(injector: any) {\n  injector.oldInvoke = injector.invoke;\n  injector.invoke = (fn: any, self: any, locals: any, serviceName: any) => {\n    const parentScope = locals?.$scope?.$parent;\n\n    if (parentScope) {\n      // PanelCtrl\n      if (parentScope.panel) {\n        self.panel = parentScope.panel;\n      }\n\n      // Panels & dashboard SettingsCtrl\n      if (parentScope.dashboard) {\n        self.dashboard = parentScope.dashboard;\n      }\n\n      // Query editors\n      if (parentScope.ctrl?.target) {\n        self.panelCtrl = parentScope.ctrl;\n        self.datasource = parentScope.ctrl.datasource;\n        self.target = parentScope.ctrl.target;\n      }\n\n      // Data source ConfigCtrl\n      if (parentScope.ctrl?.datasourceMeta) {\n        self.meta = parentScope.ctrl.datasourceMeta;\n        self.current = parentScope.ctrl.current;\n      }\n\n      // Data source AnnotationsQueryCtrl\n      if (parentScope.ctrl?.currentAnnotation) {\n        self.annotation = parentScope.ctrl.currentAnnotation;\n        self.datasource = parentScope.ctrl.currentDatasource;\n      }\n\n      // App config ctrl\n      if (parentScope.isAppConfigCtrl) {\n        self.appEditCtrl = parentScope.ctrl;\n        self.appModel = parentScope.ctrl.model;\n      }\n\n      // App page ctrl\n      if (parentScope.$parent?.$parent?.ctrl?.appModel) {\n        self.appModel = parentScope.$parent?.$parent?.ctrl?.appModel;\n      }\n    }\n\n    return injector.oldInvoke(fn, self, locals, serviceName);\n  };\n}\n","import { connectWithProvider } from '../../utils/connectWithReduxStore';\nimport { ModalRoot, ModalsProvider } from '@grafana/ui';\nimport React from 'react';\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 ReactDOM from 'react-dom';\n\nimport appEvents from 'app/core/app_events';\nimport { AngularModalProxy } from '../components/modals/AngularModalProxy';\nimport { provideTheme } from '../utils/ConfigProvider';\nimport { ShowConfirmModalEvent, ShowConfirmModalPayload, ShowModalReactEvent } from '../../types/events';\nimport { ConfirmModal, ConfirmModalProps } from '@grafana/ui';\nimport { textUtil } from '@grafana/data';\nimport { CopyPanelEvent } from '@grafana/runtime';\nimport { copyPanel } from 'app/features/dashboard/utils/panel';\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(provideTheme(AngularModalProxy), 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), modalProps);\n    this.reactModalRoot.appendChild(this.reactModalNode);\n    ReactDOM.render(elem, this.reactModalNode);\n  }\n}\n","import 'symbol-observable';\nimport 'core-js';\nimport 'regenerator-runtime/runtime';\n\nimport 'whatwg-fetch'; // fetch polyfill needed for PhantomJs rendering\nimport 'abortcontroller-polyfill/dist/polyfill-patch-fetch'; // fetch polyfill needed for PhantomJs rendering\nimport './polyfills/old-mediaquerylist'; // Safari < 14 does not have mql.addEventListener()\nimport 'file-saver';\nimport 'jquery';\n\n// eslint-disable-next-line lodash/import-scope\nimport _ from 'lodash';\nimport ReactDOM from 'react-dom';\nimport React from 'react';\nimport config from 'app/core/config';\n// @ts-ignore ignoring this for now, otherwise we would have to extend _ interface with move\nimport {\n  locationUtil,\n  monacoLanguageRegistry,\n  setLocale,\n  setTimeZoneResolver,\n  setWeekStart,\n  standardEditorsRegistry,\n  standardFieldConfigEditorRegistry,\n  standardTransformersRegistry,\n} from '@grafana/data';\nimport { arrayMove } from 'app/core/utils/arrayMove';\nimport { preloadPlugins } from './features/plugins/pluginPreloader';\nimport {\n  locationService,\n  registerEchoBackend,\n  setBackendSrv,\n  setDataSourceSrv,\n  setEchoSrv,\n  setLocationSrv,\n  setQueryRunnerFactory,\n} from '@grafana/runtime';\nimport { Echo } from './core/services/echo/Echo';\nimport { reportPerformance } from './core/services/echo/EchoSrv';\nimport { PerformanceBackend } from './core/services/echo/backends/PerformanceBackend';\nimport 'app/features/all';\nimport { getScrollbarWidth, getStandardFieldConfigs } from '@grafana/ui';\nimport { getDefaultVariableAdapters, variableAdapters } from './features/variables/adapters';\nimport { initDevFeatures } from './dev';\nimport { getStandardTransformers } from 'app/core/utils/standardTransformers';\nimport { SentryEchoBackend } from './core/services/echo/backends/sentry/SentryBackend';\nimport { setVariableQueryRunner, VariableQueryRunner } from './features/variables/query/VariableQueryRunner';\nimport { configureStore } from './store/configureStore';\nimport { AppWrapper } from './AppWrapper';\nimport { interceptLinkClicks } from './core/navigation/patch/interceptLinkClicks';\nimport { PanelRenderer } from './features/panel/components/PanelRenderer';\nimport { QueryRunner } from './features/query/state/QueryRunner';\nimport { getTimeSrv } from './features/dashboard/services/TimeSrv';\nimport { getVariablesUrlParams } from './features/variables/getAllVariableValuesForUrl';\nimport getDefaultMonacoLanguages from '../lib/monaco-languages';\nimport { contextSrv } from './core/services/context_srv';\nimport { GAEchoBackend } from './core/services/echo/backends/analytics/GABackend';\nimport { ApplicationInsightsBackend } from './core/services/echo/backends/analytics/ApplicationInsightsBackend';\nimport { RudderstackBackend } from './core/services/echo/backends/analytics/RudderstackBackend';\nimport { getAllOptionEditors } from './core/components/editors/registry';\nimport { backendSrv } from './core/services/backend_srv';\nimport { setPanelRenderer } from '@grafana/runtime/src/components/PanelRenderer';\nimport { PanelDataErrorView } from './features/panel/components/PanelDataErrorView';\nimport { setPanelDataErrorView } from '@grafana/runtime/src/components/PanelDataErrorView';\nimport { DatasourceSrv } from './features/plugins/datasource_srv';\nimport { AngularApp } from './angular';\nimport { ModalManager } from './core/services/ModalManager';\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 as any).context('.', true, /extensions\\/index.ts/);\nconst extensionsExports = extensionsIndex.keys().map((key: any) => {\n  return extensionsIndex(key);\n});\n\nif (process.env.NODE_ENV === 'development') {\n  initDevFeatures();\n}\n\nexport class GrafanaApp {\n  angularApp: AngularApp;\n\n  constructor() {\n    this.angularApp = new AngularApp();\n  }\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(getStandardFieldConfigs);\n      standardTransformersRegistry.setInit(getStandardTransformers);\n      variableAdapters.setInit(getDefaultVariableAdapters);\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\n      // init modal manager\n      const modalManager = new ModalManager();\n      modalManager.init();\n\n      // Init angular\n      this.angularApp.init();\n\n      // Preload selected app plugins\n      await preloadPlugins(config.pluginsToPreload);\n\n      ReactDOM.render(\n        React.createElement(AppWrapper, {\n          app: this,\n        }),\n        document.getElementById('reactRoot')\n      );\n    } catch (error: any) {\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\n    if (performance && performance.getEntriesByType) {\n      performance.mark(loadMetricName);\n\n      const paintMetrics = performance.getEntriesByType('paint');\n\n      for (const metric of paintMetrics) {\n        reportPerformance(\n          `frontend_boot_${metric.name}_time_seconds`,\n          Math.round(metric.startTime + metric.duration) / 1000\n        );\n      }\n\n      const loadMetric = performance.getEntriesByName(loadMetricName)[0];\n      reportPerformance(loadMetric.name, Math.round(loadMetric.startTime + loadMetric.duration) / 1000);\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\n  if ((config as any).googleAnalyticsId) {\n    registerEchoBackend(\n      new GAEchoBackend({\n        googleAnalyticsId: (config as any).googleAnalyticsId,\n      })\n    );\n  }\n\n  if ((config as any).rudderstackWriteKey && (config as any).rudderstackDataPlaneUrl) {\n    registerEchoBackend(\n      new RudderstackBackend({\n        writeKey: (config as any).rudderstackWriteKey,\n        dataPlaneUrl: (config as any).rudderstackDataPlaneUrl,\n        user: config.bootData.user,\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\nexport default new GrafanaApp();\n","import { configureStore as reduxConfigureStore } from '@reduxjs/toolkit';\nimport { setStore } from './store';\nimport { StoreState } from 'app/types/store';\nimport { addReducer, createRootReducer } from '../core/reducers/root';\nimport { buildInitialState } from '../core/reducers/navModel';\nimport { ThunkMiddlewareFor } from '@reduxjs/toolkit/src/getDefaultMiddleware';\nimport { AnyAction } from 'redux';\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<\n    StoreState,\n    AnyAction,\n    ReadonlyArray<ThunkMiddlewareFor<StoreState, { thunk: true }>>\n  >({\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","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 as any).nonce) {\n  __webpack_nonce__ = (window as any).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};\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};\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};\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};\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  status: 'string';\n}\nexport enum AlertManagerImplementation {\n  cortex = 'cortex',\n  prometheus = 'prometheus',\n}\n\nexport type AlertManagerDataSourceJsonData = DataSourceJsonData & { implementation?: AlertManagerImplementation };\n","import React from 'react';\nimport { TextArea } from '@grafana/ui';\n\nexport interface Props {\n  onChange: (query: string) => void;\n  onRunQuery: () => void;\n  query: string;\n}\n\nexport function MQLQueryEditor({ query, onChange, onRunQuery }: React.PropsWithChildren<Props>) {\n  const onKeyDown = (event: any) => {\n    if (event.key === 'Enter' && (event.shiftKey || event.ctrlKey)) {\n      event.preventDefault();\n      onRunQuery();\n    }\n  };\n\n  return (\n    <>\n      <TextArea\n        name=\"Query\"\n        className=\"slate-query-field\"\n        value={query}\n        rows={10}\n        placeholder=\"Enter a Cloud Monitoring MQL query (Run with Shift+Enter)\"\n        onBlur={onRunQuery}\n        onChange={(e) => onChange(e.currentTarget.value)}\n        onKeyDown={onKeyDown}\n      />\n    </>\n  );\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Project, VisualMetricQueryEditor, AliasBy } from '.';\nimport {\n  MetricQuery,\n  MetricDescriptor,\n  EditorMode,\n  MetricKind,\n  PreprocessorType,\n  AlignmentTypes,\n  CustomMetaData,\n  ValueTypes,\n  SLOQuery,\n} from '../types';\nimport { getAlignmentPickerData } from '../functions';\nimport CloudMonitoringDatasource from '../datasource';\nimport { MQLQueryEditor } from './MQLQueryEditor';\n\nexport interface Props {\n  refId: string;\n  customMetaData: CustomMetaData;\n  variableOptionGroup: SelectableValue<string>;\n  onChange: (query: MetricQuery) => void;\n  onRunQuery: () => void;\n  query: MetricQuery;\n  datasource: CloudMonitoringDatasource;\n}\n\ninterface State {\n  labels: any;\n  [key: string]: any;\n}\n\nexport const defaultState: State = {\n  labels: {},\n};\n\nexport const defaultQuery: (dataSource: CloudMonitoringDatasource) => MetricQuery = (dataSource) => ({\n  editorMode: EditorMode.Visual,\n  projectName: dataSource.getDefaultProject(),\n  metricType: '',\n  metricKind: MetricKind.GAUGE,\n  valueType: '',\n  crossSeriesReducer: 'REDUCE_MEAN',\n  alignmentPeriod: 'cloud-monitoring-auto',\n  perSeriesAligner: AlignmentTypes.ALIGN_MEAN,\n  groupBys: [],\n  filters: [],\n  aliasBy: '',\n  query: '',\n  preprocessor: PreprocessorType.None,\n});\n\nfunction Editor({\n  refId,\n  query,\n  datasource,\n  onChange: onQueryChange,\n  onRunQuery,\n  customMetaData,\n  variableOptionGroup,\n}: React.PropsWithChildren<Props>) {\n  const [state, setState] = useState<State>(defaultState);\n  const { projectName, metricType, groupBys, editorMode, crossSeriesReducer } = query;\n\n  useEffect(() => {\n    if (projectName && metricType) {\n      datasource\n        .getLabels(metricType, refId, projectName)\n        .then((labels) => setState((prevState) => ({ ...prevState, labels })));\n    }\n  }, [datasource, groupBys, metricType, projectName, refId, crossSeriesReducer]);\n\n  const onChange = useCallback(\n    (metricQuery: MetricQuery | SLOQuery) => {\n      onQueryChange({ ...query, ...metricQuery });\n      onRunQuery();\n    },\n    [onQueryChange, onRunQuery, query]\n  );\n\n  const onMetricTypeChange = useCallback(\n    ({ valueType, metricKind, type }: MetricDescriptor) => {\n      const preprocessor =\n        metricKind === MetricKind.GAUGE || valueType === ValueTypes.DISTRIBUTION\n          ? PreprocessorType.None\n          : PreprocessorType.Rate;\n      const { perSeriesAligner } = getAlignmentPickerData(valueType, metricKind, state.perSeriesAligner, preprocessor);\n      onChange({\n        ...query,\n        perSeriesAligner,\n        metricType: type,\n        valueType,\n        metricKind,\n        preprocessor,\n      });\n    },\n    [onChange, query, state]\n  );\n\n  return (\n    <>\n      <Project\n        templateVariableOptions={variableOptionGroup.options}\n        projectName={projectName}\n        datasource={datasource}\n        onChange={(projectName) => {\n          onChange({ ...query, projectName });\n        }}\n      />\n\n      {editorMode === EditorMode.Visual && (\n        <VisualMetricQueryEditor\n          labels={state.labels}\n          variableOptionGroup={variableOptionGroup}\n          customMetaData={customMetaData}\n          onMetricTypeChange={onMetricTypeChange}\n          onChange={onChange}\n          datasource={datasource}\n          query={query}\n        />\n      )}\n\n      {editorMode === EditorMode.MQL && (\n        <MQLQueryEditor\n          onChange={(q: string) => onQueryChange({ ...query, query: q })}\n          onRunQuery={onRunQuery}\n          query={query.query}\n        ></MQLQueryEditor>\n      )}\n\n      <AliasBy\n        value={query.aliasBy}\n        onChange={(aliasBy) => {\n          onChange({ ...query, aliasBy });\n        }}\n      />\n    </>\n  );\n}\n\nexport const MetricQueryEditor = React.memo(Editor);\n","import React, { PureComponent } from 'react';\nimport { css } from '@emotion/css';\nimport { QueryEditorProps, toOption } from '@grafana/data';\nimport { Button, Select } from '@grafana/ui';\nimport { MetricQueryEditor, SLOQueryEditor, QueryEditorRow } from './';\nimport { CloudMonitoringQuery, MetricQuery, QueryType, SLOQuery, EditorMode } from '../types';\nimport { SELECT_WIDTH, QUERY_TYPES } from '../constants';\nimport { defaultQuery } from './MetricQueryEditor';\nimport { defaultQuery as defaultSLOQuery } from './SLO/SLOQueryEditor';\nimport CloudMonitoringDatasource from '../datasource';\n\nexport type Props = QueryEditorProps<CloudMonitoringDatasource, CloudMonitoringQuery>;\n\nexport class QueryEditor extends PureComponent<Props> {\n  async UNSAFE_componentWillMount() {\n    const { datasource, query } = this.props;\n\n    // Unfortunately, migrations like this need to go UNSAFE_componentWillMount. As soon as there's\n    // migration hook for this module.ts, we can do the migrations there instead.\n    if (!this.props.query.hasOwnProperty('metricQuery')) {\n      const { hide, refId, datasource, key, queryType, maxLines, metric, ...metricQuery } = this.props.query as any;\n      this.props.query.metricQuery = metricQuery;\n    }\n\n    if (!this.props.query.hasOwnProperty('queryType')) {\n      this.props.query.queryType = QueryType.METRICS;\n    }\n\n    await datasource.ensureGCEDefaultProject();\n    if (!query.metricQuery.projectName) {\n      this.props.query.metricQuery.projectName = datasource.getDefaultProject();\n    }\n  }\n\n  onQueryChange(prop: string, value: MetricQuery | SLOQuery) {\n    this.props.onChange({ ...this.props.query, [prop]: value });\n    this.props.onRunQuery();\n  }\n\n  render() {\n    const { datasource, query, onRunQuery, onChange } = this.props;\n    const metricQuery = { ...defaultQuery(datasource), ...query.metricQuery };\n    const sloQuery = { ...defaultSLOQuery(datasource), ...query.sloQuery };\n    const queryType = query.queryType || QueryType.METRICS;\n    const meta = this.props.data?.series.length ? this.props.data?.series[0].meta : {};\n    const customMetaData = meta?.custom ?? {};\n    const variableOptionGroup = {\n      label: 'Template Variables',\n      expanded: false,\n      options: datasource.getVariables().map(toOption),\n    };\n\n    return (\n      <>\n        <QueryEditorRow\n          label=\"Query type\"\n          fillComponent={\n            query.queryType !== QueryType.SLO && (\n              <Button\n                variant=\"secondary\"\n                className={css`\n                  margin-left: auto;\n                `}\n                icon=\"edit\"\n                onClick={() =>\n                  this.onQueryChange('metricQuery', {\n                    ...metricQuery,\n                    editorMode: metricQuery.editorMode === EditorMode.MQL ? EditorMode.Visual : EditorMode.MQL,\n                  })\n                }\n              >\n                {metricQuery.editorMode === EditorMode.MQL ? 'Switch to builder' : 'Edit MQL'}\n              </Button>\n            )\n          }\n        >\n          <Select\n            menuShouldPortal\n            width={SELECT_WIDTH}\n            value={queryType}\n            options={QUERY_TYPES}\n            onChange={({ value }) => {\n              onChange({ ...query, sloQuery, queryType: value! });\n              onRunQuery();\n            }}\n          />\n        </QueryEditorRow>\n\n        {queryType === QueryType.METRICS && (\n          <MetricQueryEditor\n            refId={query.refId}\n            variableOptionGroup={variableOptionGroup}\n            customMetaData={customMetaData}\n            onChange={(metricQuery: MetricQuery) => {\n              this.props.onChange({ ...this.props.query, metricQuery });\n            }}\n            onRunQuery={onRunQuery}\n            datasource={datasource}\n            query={metricQuery}\n          ></MetricQueryEditor>\n        )}\n\n        {queryType === QueryType.SLO && (\n          <SLOQueryEditor\n            variableOptionGroup={variableOptionGroup}\n            customMetaData={customMetaData}\n            onChange={(query: SLOQuery) => this.onQueryChange('sloQuery', query)}\n            onRunQuery={onRunQuery}\n            datasource={datasource}\n            query={sloQuery}\n          ></SLOQueryEditor>\n        )}\n      </>\n    );\n  }\n}\n","import React, { useEffect, useState } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { QueryEditorRow } from '..';\nimport CloudMonitoringDatasource from '../../datasource';\nimport { SLOQuery } from '../../types';\nimport { SELECT_WIDTH } from '../../constants';\n\nexport interface Props {\n  onChange: (query: SLOQuery) => void;\n  query: SLOQuery;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  datasource: CloudMonitoringDatasource;\n}\n\nexport const Service: React.FC<Props> = ({ query, templateVariableOptions, onChange, datasource }) => {\n  const [services, setServices] = useState<Array<SelectableValue<string>>>([]);\n  const { projectName } = query;\n\n  useEffect(() => {\n    if (!projectName) {\n      return;\n    }\n\n    datasource.getSLOServices(projectName).then((services: Array<SelectableValue<string>>) => {\n      setServices([\n        {\n          label: 'Template Variables',\n          options: templateVariableOptions,\n        },\n        ...services,\n      ]);\n    });\n  }, [datasource, projectName, templateVariableOptions]);\n\n  return (\n    <QueryEditorRow label=\"Service\">\n      <Select\n        menuShouldPortal\n        width={SELECT_WIDTH}\n        allowCustomValue\n        value={query?.serviceId && { value: query?.serviceId, label: query?.serviceName || query?.serviceId }}\n        placeholder=\"Select service\"\n        options={services}\n        onChange={({ value: serviceId = '', label: serviceName = '' }) =>\n          onChange({ ...query, serviceId, serviceName, sloId: '' })\n        }\n      />\n    </QueryEditorRow>\n  );\n};\n","import React, { useEffect, useState } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { QueryEditorRow } from '..';\nimport CloudMonitoringDatasource from '../../datasource';\nimport { SLOQuery } from '../../types';\nimport { SELECT_WIDTH } from '../../constants';\n\nexport interface Props {\n  onChange: (query: SLOQuery) => void;\n  query: SLOQuery;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  datasource: CloudMonitoringDatasource;\n}\n\nexport const SLO: React.FC<Props> = ({ query, templateVariableOptions, onChange, datasource }) => {\n  const [slos, setSLOs] = useState<Array<SelectableValue<string>>>([]);\n  const { projectName, serviceId } = query;\n\n  useEffect(() => {\n    if (!projectName || !serviceId) {\n      return;\n    }\n\n    datasource.getServiceLevelObjectives(projectName, serviceId).then((sloIds: Array<SelectableValue<string>>) => {\n      setSLOs([\n        {\n          label: 'Template Variables',\n          options: templateVariableOptions,\n        },\n        ...sloIds,\n      ]);\n    });\n  }, [datasource, projectName, serviceId, templateVariableOptions]);\n\n  return (\n    <QueryEditorRow label=\"SLO\">\n      <Select\n        menuShouldPortal\n        width={SELECT_WIDTH}\n        allowCustomValue\n        value={query?.sloId && { value: query?.sloId, label: query?.sloName || query?.sloId }}\n        placeholder=\"Select SLO\"\n        options={slos}\n        onChange={async ({ value: sloId = '', label: sloName = '' }) => {\n          const slos = await datasource.getServiceLevelObjectives(projectName, serviceId);\n          const slo = slos.find(({ value }) => value === datasource.templateSrv.replace(sloId));\n          onChange({ ...query, sloId, sloName, goal: slo?.goal });\n        }}\n      />\n    </QueryEditorRow>\n  );\n};\n","import React from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { QueryEditorRow } from '..';\nimport CloudMonitoringDatasource from '../../datasource';\nimport { SLOQuery } from '../../types';\nimport { SELECT_WIDTH, SELECTORS } from '../../constants';\n\nexport interface Props {\n  onChange: (query: SLOQuery) => void;\n  query: SLOQuery;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  datasource: CloudMonitoringDatasource;\n}\n\nexport const Selector: React.FC<Props> = ({ query, templateVariableOptions, onChange, datasource }) => {\n  return (\n    <QueryEditorRow label=\"Selector\">\n      <Select\n        menuShouldPortal\n        width={SELECT_WIDTH}\n        allowCustomValue\n        value={[...SELECTORS, ...templateVariableOptions].find((s) => s.value === query?.selectorName ?? '')}\n        options={[\n          {\n            label: 'Template Variables',\n            options: templateVariableOptions,\n          },\n          ...SELECTORS,\n        ]}\n        onChange={({ value: selectorName }) => onChange({ ...query, selectorName: selectorName ?? '' })}\n      />\n    </QueryEditorRow>\n  );\n};\n","import React from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Project, AliasBy, AlignmentPeriod, AlignmentPeriodLabel, QueryEditorRow } from '..';\nimport { AlignmentTypes, CustomMetaData, SLOQuery } from '../../types';\nimport CloudMonitoringDatasource from '../../datasource';\nimport { Selector, Service, SLO } from '.';\nimport { SELECT_WIDTH } from '../../constants';\n\nexport interface Props {\n  customMetaData: CustomMetaData;\n  variableOptionGroup: SelectableValue<string>;\n  onChange: (query: SLOQuery) => void;\n  onRunQuery: () => void;\n  query: SLOQuery;\n  datasource: CloudMonitoringDatasource;\n}\n\nexport const defaultQuery: (dataSource: CloudMonitoringDatasource) => SLOQuery = (dataSource) => ({\n  projectName: dataSource.getDefaultProject(),\n  alignmentPeriod: 'cloud-monitoring-auto',\n  perSeriesAligner: AlignmentTypes.ALIGN_MEAN,\n  aliasBy: '',\n  selectorName: 'select_slo_health',\n  serviceId: '',\n  serviceName: '',\n  sloId: '',\n  sloName: '',\n});\n\nexport function SLOQueryEditor({\n  query,\n  datasource,\n  onChange,\n  variableOptionGroup,\n  customMetaData,\n}: React.PropsWithChildren<Props>) {\n  return (\n    <>\n      <Project\n        templateVariableOptions={variableOptionGroup.options}\n        projectName={query.projectName}\n        datasource={datasource}\n        onChange={(projectName) => onChange({ ...query, projectName })}\n      />\n      <Service\n        datasource={datasource}\n        templateVariableOptions={variableOptionGroup.options}\n        query={query}\n        onChange={onChange}\n      ></Service>\n      <SLO\n        datasource={datasource}\n        templateVariableOptions={variableOptionGroup.options}\n        query={query}\n        onChange={onChange}\n      ></SLO>\n      <Selector\n        datasource={datasource}\n        templateVariableOptions={variableOptionGroup.options}\n        query={query}\n        onChange={onChange}\n      ></Selector>\n\n      <QueryEditorRow label=\"Alignment period\">\n        <AlignmentPeriod\n          templateVariableOptions={variableOptionGroup.options}\n          query={{\n            ...query,\n            perSeriesAligner: query.selectorName === 'select_slo_health' ? 'ALIGN_MEAN' : 'ALIGN_NEXT_OLDER',\n          }}\n          onChange={onChange}\n          selectWidth={SELECT_WIDTH}\n        />\n        <AlignmentPeriodLabel datasource={datasource} customMetaData={customMetaData} />\n      </QueryEditorRow>\n\n      <AliasBy value={query.aliasBy} onChange={(aliasBy) => onChange({ ...query, aliasBy })} />\n    </>\n  );\n}\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport CloudMonitoringDatasource from '../datasource';\nimport { SELECT_WIDTH } from '../constants';\nimport { QueryEditorRow } from '.';\n\nexport interface Props {\n  datasource: CloudMonitoringDatasource;\n  onChange: (projectName: string) => void;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  projectName: string;\n}\n\nexport function Project({ projectName, datasource, onChange, templateVariableOptions }: Props) {\n  const [projects, setProjects] = useState<Array<SelectableValue<string>>>([]);\n  useEffect(() => {\n    datasource.getProjects().then((projects) => setProjects(projects));\n  }, [datasource]);\n\n  const projectsWithTemplateVariables = useMemo(\n    () => [\n      projects,\n      {\n        label: 'Template Variables',\n        options: templateVariableOptions,\n      },\n      ...projects,\n    ],\n    [projects, templateVariableOptions]\n  );\n\n  return (\n    <QueryEditorRow label=\"Project\">\n      <Select\n        menuShouldPortal\n        width={SELECT_WIDTH}\n        allowCustomValue\n        formatCreateLabel={(v) => `Use project: ${v}`}\n        onChange={({ value }) => onChange(value!)}\n        options={projectsWithTemplateVariables}\n        value={{ value: projectName, label: projectName }}\n        placeholder=\"Select Project\"\n      />\n    </QueryEditorRow>\n  );\n}\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { startCase, uniqBy } from 'lodash';\n\nimport { Select } from '@grafana/ui';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { SelectableValue } from '@grafana/data';\nimport { QueryEditorRow, QueryEditorField } from '.';\nimport CloudMonitoringDatasource from '../datasource';\nimport { INNER_LABEL_WIDTH, LABEL_WIDTH, SELECT_WIDTH } from '../constants';\nimport { MetricDescriptor } from '../types';\n\nexport interface Props {\n  onChange: (metricDescriptor: MetricDescriptor) => void;\n  templateSrv: TemplateSrv;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  datasource: CloudMonitoringDatasource;\n  projectName: string;\n  metricType: string;\n  children: (metricDescriptor?: MetricDescriptor) => JSX.Element;\n}\n\ninterface State {\n  metricDescriptors: MetricDescriptor[];\n  metrics: any[];\n  services: any[];\n  service: string;\n  metric: string;\n  metricDescriptor?: MetricDescriptor;\n  projectName: string | null;\n}\n\nexport function Metrics(props: Props) {\n  const [state, setState] = useState<State>({\n    metricDescriptors: [],\n    metrics: [],\n    services: [],\n    service: '',\n    metric: '',\n    projectName: null,\n  });\n\n  const { services, service, metrics, metricDescriptors } = state;\n  const { metricType, templateVariableOptions, projectName, templateSrv, datasource, onChange, children } = props;\n\n  const getSelectedMetricDescriptor = useCallback(\n    (metricDescriptors: MetricDescriptor[], metricType: string) => {\n      return metricDescriptors.find((md) => md.type === templateSrv.replace(metricType))!;\n    },\n    [templateSrv]\n  );\n\n  useEffect(() => {\n    const getMetricsList = (metricDescriptors: MetricDescriptor[]) => {\n      const selectedMetricDescriptor = getSelectedMetricDescriptor(metricDescriptors, metricType);\n      if (!selectedMetricDescriptor) {\n        return [];\n      }\n      const metricsByService = metricDescriptors\n        .filter((m) => m.service === selectedMetricDescriptor.service)\n        .map((m) => ({\n          service: m.service,\n          value: m.type,\n          label: m.displayName,\n          description: m.description,\n        }));\n      return metricsByService;\n    };\n\n    const loadMetricDescriptors = async () => {\n      if (projectName) {\n        const metricDescriptors = await datasource.getMetricTypes(projectName);\n        const services = getServicesList(metricDescriptors);\n        const metrics = getMetricsList(metricDescriptors);\n        const service = metrics.length > 0 ? metrics[0].service : '';\n        const metricDescriptor = getSelectedMetricDescriptor(metricDescriptors, metricType);\n        setState((prevState) => ({\n          ...prevState,\n          metricDescriptors,\n          services,\n          metrics,\n          service: service,\n          metricDescriptor,\n        }));\n      }\n    };\n    loadMetricDescriptors();\n  }, [datasource, getSelectedMetricDescriptor, metricType, projectName]);\n\n  const onServiceChange = ({ value: service }: any) => {\n    const metrics = metricDescriptors\n      .filter((m: MetricDescriptor) => m.service === templateSrv.replace(service))\n      .map((m: MetricDescriptor) => ({\n        service: m.service,\n        value: m.type,\n        label: m.displayName,\n        description: m.description,\n      }));\n\n    if (metrics.length > 0 && !metrics.some((m) => m.value === templateSrv.replace(metricType))) {\n      onMetricTypeChange(metrics[0], { service, metrics });\n    } else {\n      setState({ ...state, service, metrics });\n    }\n  };\n\n  const onMetricTypeChange = ({ value }: SelectableValue<string>, extra: any = {}) => {\n    const metricDescriptor = getSelectedMetricDescriptor(state.metricDescriptors, value!);\n    setState({ ...state, metricDescriptor, ...extra });\n    onChange({ ...metricDescriptor, type: value! });\n  };\n\n  const getServicesList = (metricDescriptors: MetricDescriptor[]) => {\n    const services = metricDescriptors.map((m) => ({\n      value: m.service,\n      label: startCase(m.serviceShortName),\n    }));\n\n    return services.length > 0 ? uniqBy(services, (s) => s.value) : [];\n  };\n\n  return (\n    <>\n      <QueryEditorRow>\n        <QueryEditorField labelWidth={LABEL_WIDTH} label=\"Service\">\n          <Select\n            menuShouldPortal\n            width={SELECT_WIDTH}\n            onChange={onServiceChange}\n            value={[...services, ...templateVariableOptions].find((s) => s.value === service)}\n            options={[\n              {\n                label: 'Template Variables',\n                options: templateVariableOptions,\n              },\n              ...services,\n            ]}\n            placeholder=\"Select Services\"\n          ></Select>\n        </QueryEditorField>\n        <QueryEditorField label=\"Metric name\" labelWidth={INNER_LABEL_WIDTH}>\n          <Select\n            menuShouldPortal\n            width={SELECT_WIDTH}\n            onChange={onMetricTypeChange}\n            value={[...metrics, ...templateVariableOptions].find((s) => s.value === metricType)}\n            options={[\n              {\n                label: 'Template Variables',\n                options: templateVariableOptions,\n              },\n              ...metrics,\n            ]}\n            placeholder=\"Select Metric\"\n          ></Select>\n        </QueryEditorField>\n      </QueryEditorRow>\n\n      {children(state.metricDescriptor)}\n    </>\n  );\n}\n","import React, { FunctionComponent, useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { MultiSelect } from '@grafana/ui';\nimport { labelsToGroupedOptions } from '../functions';\nimport { SYSTEM_LABELS, INPUT_WIDTH } from '../constants';\nimport { MetricDescriptor, MetricQuery } from '../types';\nimport { Aggregation, QueryEditorRow } from '.';\n\nexport interface Props {\n  variableOptionGroup: SelectableValue<string>;\n  labels: string[];\n  metricDescriptor?: MetricDescriptor;\n  onChange: (query: MetricQuery) => void;\n  query: MetricQuery;\n}\n\nexport const GroupBy: FunctionComponent<Props> = ({\n  labels: groupBys = [],\n  query,\n  onChange,\n  variableOptionGroup,\n  metricDescriptor,\n}) => {\n  const options = useMemo(() => [variableOptionGroup, ...labelsToGroupedOptions([...groupBys, ...SYSTEM_LABELS])], [\n    groupBys,\n    variableOptionGroup,\n  ]);\n\n  return (\n    <QueryEditorRow\n      label=\"Group by\"\n      tooltip=\"You can reduce the amount of data returned for a metric by combining different time series. To combine multiple time series, you can specify a grouping and a function. Grouping is done on the basis of labels. The grouping function is used to combine the time series in the group into a single time series.\"\n    >\n      <MultiSelect\n        menuShouldPortal\n        width={INPUT_WIDTH}\n        placeholder=\"Choose label\"\n        options={options}\n        value={query.groupBys ?? []}\n        onChange={(options) => {\n          onChange({ ...query, groupBys: options.map((o) => o.value!) });\n        }}\n      ></MultiSelect>\n      <Aggregation\n        metricDescriptor={metricDescriptor}\n        templateVariableOptions={variableOptionGroup.options}\n        crossSeriesReducer={query.crossSeriesReducer}\n        groupBys={query.groupBys ?? []}\n        onChange={(crossSeriesReducer) => onChange({ ...query, crossSeriesReducer })}\n      ></Aggregation>\n    </QueryEditorRow>\n  );\n};\n","import React, { FC } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { SELECT_WIDTH } from '../constants';\nimport { CustomMetaData, MetricQuery, SLOQuery } from '../types';\nimport { AlignmentFunction, AlignmentPeriod, AlignmentPeriodLabel, QueryEditorField, QueryEditorRow } from '.';\nimport CloudMonitoringDatasource from '../datasource';\n\nexport interface Props {\n  onChange: (query: MetricQuery | SLOQuery) => void;\n  query: MetricQuery;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  customMetaData: CustomMetaData;\n  datasource: CloudMonitoringDatasource;\n}\n\nexport const Alignment: FC<Props> = ({ templateVariableOptions, onChange, query, customMetaData, datasource }) => {\n  return (\n    <QueryEditorRow\n      label=\"Alignment function\"\n      tooltip=\"The process of alignment consists of collecting all data points received in a fixed length of time, applying a function to combine those data points, and assigning a timestamp to the result.\"\n      fillComponent={<AlignmentPeriodLabel datasource={datasource} customMetaData={customMetaData} />}\n    >\n      <AlignmentFunction templateVariableOptions={templateVariableOptions} query={query} onChange={onChange} />\n      <QueryEditorField label=\"Alignment period\">\n        <AlignmentPeriod\n          selectWidth={SELECT_WIDTH}\n          templateVariableOptions={templateVariableOptions}\n          query={query}\n          onChange={onChange}\n        />\n      </QueryEditorField>\n    </QueryEditorRow>\n  );\n};\n","import React, { FunctionComponent, useCallback, useMemo } from 'react';\nimport { flatten } from 'lodash';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { CustomControlProps } from '@grafana/ui/src/components/Select/types';\nimport { Button, HorizontalGroup, Select, VerticalGroup } from '@grafana/ui';\nimport { labelsToGroupedOptions, stringArrayToFilters } from '../functions';\nimport { Filter } from '../types';\nimport { SELECT_WIDTH } from '../constants';\nimport { QueryEditorRow } from '.';\n\nexport interface Props {\n  labels: { [key: string]: string[] };\n  filters: string[];\n  onChange: (filters: string[]) => void;\n  variableOptionGroup: SelectableValue<string>;\n}\n\nconst operators = ['=', '!=', '=~', '!=~'];\n\nconst FilterButton = React.forwardRef<HTMLButtonElement, CustomControlProps<string>>(\n  ({ value, isOpen, invalid, ...rest }, ref) => {\n    return <Button {...rest} ref={ref} variant=\"secondary\" icon=\"plus\"></Button>;\n  }\n);\nFilterButton.displayName = 'FilterButton';\n\nconst OperatorButton = React.forwardRef<HTMLButtonElement, CustomControlProps<string>>(({ value, ...rest }, ref) => {\n  return (\n    <Button {...rest} ref={ref} variant=\"secondary\">\n      <span className=\"query-segment-operator\">{value?.label}</span>\n    </Button>\n  );\n});\nOperatorButton.displayName = 'OperatorButton';\n\nexport const LabelFilter: FunctionComponent<Props> = ({\n  labels = {},\n  filters: filterArray,\n  onChange,\n  variableOptionGroup,\n}) => {\n  const filters = useMemo(() => stringArrayToFilters(filterArray), [filterArray]);\n  const options = useMemo(() => [variableOptionGroup, ...labelsToGroupedOptions(Object.keys(labels))], [\n    labels,\n    variableOptionGroup,\n  ]);\n\n  const filtersToStringArray = useCallback((filters: Filter[]) => {\n    const strArr = flatten(filters.map(({ key, operator, value, condition }) => [key, operator, value, condition!]));\n    return strArr.slice(0, strArr.length - 1);\n  }, []);\n\n  const AddFilter = () => {\n    return (\n      <Select\n        menuShouldPortal\n        allowCustomValue\n        options={[variableOptionGroup, ...labelsToGroupedOptions(Object.keys(labels))]}\n        onChange={({ value: key = '' }) =>\n          onChange(filtersToStringArray([...filters, { key, operator: '=', condition: 'AND', value: '' }]))\n        }\n        menuPlacement=\"bottom\"\n        renderControl={FilterButton}\n      />\n    );\n  };\n\n  return (\n    <QueryEditorRow\n      label=\"Filter\"\n      tooltip={\n        'To reduce the amount of data charted, apply a filter. A filter has three components: a label, a comparison, and a value. The comparison can be an equality, inequality, or regular expression.'\n      }\n      noFillEnd={filters.length > 1}\n    >\n      <VerticalGroup spacing=\"xs\" width=\"auto\">\n        {filters.map(({ key, operator, value, condition }, index) => {\n          // Add the current key and value as options if they are manually entered\n          const keyPresent = options.some((op) => {\n            if (op.options) {\n              return options.some((opp) => opp.label === key);\n            }\n            return op.label === key;\n          });\n          if (!keyPresent) {\n            options.push({ label: key, value: key });\n          }\n\n          const valueOptions = labels.hasOwnProperty(key)\n            ? [variableOptionGroup, ...labels[key].map(toOption)]\n            : [variableOptionGroup];\n          const valuePresent = valueOptions.some((op) => {\n            return op.label === value;\n          });\n          if (!valuePresent) {\n            valueOptions.push({ label: value, value });\n          }\n\n          return (\n            <HorizontalGroup key={index} spacing=\"xs\" width=\"auto\">\n              <Select\n                menuShouldPortal\n                width={SELECT_WIDTH}\n                allowCustomValue\n                formatCreateLabel={(v) => `Use label key: ${v}`}\n                value={key}\n                options={options}\n                onChange={({ value: key = '' }) => {\n                  onChange(\n                    filtersToStringArray(\n                      filters.map((f, i) => (i === index ? { key, operator, condition, value: '' } : f))\n                    )\n                  );\n                }}\n              />\n              <Select\n                menuShouldPortal\n                value={operator}\n                options={operators.map(toOption)}\n                onChange={({ value: operator = '=' }) =>\n                  onChange(filtersToStringArray(filters.map((f, i) => (i === index ? { ...f, operator } : f))))\n                }\n                menuPlacement=\"bottom\"\n                renderControl={OperatorButton}\n              />\n              <Select\n                menuShouldPortal\n                width={SELECT_WIDTH}\n                formatCreateLabel={(v) => `Use label value: ${v}`}\n                allowCustomValue\n                value={value}\n                placeholder=\"add filter value\"\n                options={valueOptions}\n                onChange={({ value = '' }) =>\n                  onChange(filtersToStringArray(filters.map((f, i) => (i === index ? { ...f, value } : f))))\n                }\n              />\n              <Button\n                variant=\"secondary\"\n                size=\"md\"\n                icon=\"trash-alt\"\n                aria-label=\"Remove\"\n                onClick={() => onChange(filtersToStringArray(filters.filter((_, i) => i !== index)))}\n              ></Button>\n              {index + 1 === filters.length && Object.values(filters).every(({ value }) => value) && <AddFilter />}\n            </HorizontalGroup>\n          );\n        })}\n        {!filters.length && <AddFilter />}\n      </VerticalGroup>\n    </QueryEditorRow>\n  );\n};\n","import React, { FC } from 'react';\n\nexport const AnnotationsHelp: FC = () => {\n  return (\n    <div className=\"gf-form grafana-info-box alert-info\">\n      <div>\n        <h5>Annotation Query Format</h5>\n        <p>\n          An annotation is an event that is overlaid on top of graphs. Annotation rendering is expensive so it is\n          important to limit the number of rows returned.{' '}\n        </p>\n        <p>\n          The Title and Text fields support templating and can use data returned from the query. For example, the Title\n          field could have the following text:\n        </p>\n        <code>\n          {`${'{{metric.type}}'}`} has value: {`${'{{metric.value}}'}`}\n        </code>\n        <p>\n          Example Result: <code>monitoring.googleapis.com/uptime_check/http_status has this value: 502</code>\n        </p>\n        <label>Patterns:</label>\n        <p>\n          <code>{`${'{{metric.value}}'}`}</code> = value of the metric/point\n        </p>\n        <p>\n          <code>{`${'{{metric.type}}'}`}</code> = metric type e.g. compute.googleapis.com/instance/cpu/usage_time\n        </p>\n        <p>\n          <code>{`${'{{metric.name}}'}`}</code> = name part of metric e.g. instance/cpu/usage_time\n        </p>\n        <p>\n          <code>{`${'{{metric.service}}'}`}</code> = service part of metric e.g. compute\n        </p>\n        <p>\n          <code>{`${'{{metric.label.label_name}}'}`}</code> = Metric label metadata e.g. metric.label.instance_name\n        </p>\n        <p>\n          <code>{`${'{{resource.label.label_name}}'}`}</code> = Resource label metadata e.g. resource.label.zone\n        </p>\n      </div>\n    </div>\n  );\n};\n","import React, { FC, useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport { MetricQuery } from '../types';\nimport { getAlignmentPickerData } from '../functions';\nimport { SELECT_WIDTH } from '../constants';\n\nexport interface Props {\n  onChange: (query: MetricQuery) => void;\n  query: MetricQuery;\n  templateVariableOptions: Array<SelectableValue<string>>;\n}\n\nexport const AlignmentFunction: FC<Props> = ({ query, templateVariableOptions, onChange }) => {\n  const { valueType, metricKind, perSeriesAligner: psa, preprocessor } = query;\n  const { perSeriesAligner, alignOptions } = useMemo(\n    () => getAlignmentPickerData(valueType, metricKind, psa, preprocessor),\n    [valueType, metricKind, psa, preprocessor]\n  );\n\n  return (\n    <Select\n      menuShouldPortal\n      width={SELECT_WIDTH}\n      onChange={({ value }) => onChange({ ...query, perSeriesAligner: value! })}\n      value={[...alignOptions, ...templateVariableOptions].find((s) => s.value === perSeriesAligner)}\n      options={[\n        {\n          label: 'Template Variables',\n          options: templateVariableOptions,\n        },\n        {\n          label: 'Alignment options',\n          expanded: true,\n          options: alignOptions,\n        },\n      ]}\n      placeholder=\"Select Alignment\"\n    ></Select>\n  );\n};\n","import React, { useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport { ALIGNMENT_PERIODS } from '../constants';\nimport { MetricQuery, SLOQuery } from '../types';\n\nexport interface Props<TQuery> {\n  onChange(query: TQuery): void;\n  query: TQuery;\n  templateVariableOptions: Array<SelectableValue<string>>;\n  selectWidth?: number;\n}\n\nexport function AlignmentPeriod<TQuery extends MetricQuery | SLOQuery>({\n  templateVariableOptions,\n  onChange,\n  query,\n  selectWidth,\n}: Props<TQuery>) {\n  const options = useMemo(\n    () =>\n      ALIGNMENT_PERIODS.map((ap) => ({\n        ...ap,\n        label: ap.text,\n      })),\n    []\n  );\n  const visibleOptions = useMemo(() => options.filter((ap) => !ap.hidden), [options]);\n\n  return (\n    <Select\n      menuShouldPortal\n      width={selectWidth}\n      onChange={({ value }) => onChange({ ...query, alignmentPeriod: value! })}\n      value={[...options, ...templateVariableOptions].find((s) => s.value === query.alignmentPeriod)}\n      options={[\n        {\n          label: 'Template Variables',\n          options: templateVariableOptions,\n        },\n        {\n          label: 'Aggregations',\n          expanded: true,\n          options: visibleOptions,\n        },\n      ]}\n      placeholder=\"Select Alignment\"\n    ></Select>\n  );\n}\n","import React, { FC, useMemo } from 'react';\nimport { rangeUtil } from '@grafana/data';\nimport { ALIGNMENTS } from '../constants';\nimport CloudMonitoringDatasource from '../datasource';\nimport { CustomMetaData } from '../types';\n\nexport interface Props {\n  customMetaData: CustomMetaData;\n  datasource: CloudMonitoringDatasource;\n}\n\nexport const AlignmentPeriodLabel: FC<Props> = ({ customMetaData, datasource }) => {\n  const { perSeriesAligner, alignmentPeriod } = customMetaData;\n  const formatAlignmentText = useMemo(() => {\n    if (!alignmentPeriod || !perSeriesAligner) {\n      return '';\n    }\n\n    const alignment = ALIGNMENTS.find((ap) => ap.value === datasource.templateSrv.replace(perSeriesAligner));\n    const seconds = parseInt(alignmentPeriod ?? ''.replace(/[^0-9]/g, ''), 10);\n    const hms = rangeUtil.secondsToHms(seconds);\n    return `${hms} interval (${alignment?.text ?? ''})`;\n  }, [datasource, perSeriesAligner, alignmentPeriod]);\n\n  return <label>{formatAlignmentText}</label>;\n};\n","import React, { FunctionComponent, useState } from 'react';\nimport { debounce } from 'lodash';\nimport { Input } from '@grafana/ui';\nimport { QueryEditorRow } from '.';\nimport { INPUT_WIDTH } from '../constants';\n\nexport interface Props {\n  onChange: (alias: any) => void;\n  value?: string;\n}\n\nexport const AliasBy: FunctionComponent<Props> = ({ value = '', onChange }) => {\n  const [alias, setAlias] = useState(value ?? '');\n\n  const propagateOnChange = debounce(onChange, 1000);\n\n  onChange = (e: any) => {\n    setAlias(e.target.value);\n    propagateOnChange(e.target.value);\n  };\n\n  return (\n    <QueryEditorRow label=\"Alias by\">\n      <Input width={INPUT_WIDTH} value={alias} onChange={onChange} />\n    </QueryEditorRow>\n  );\n};\n","import React, { FC, useMemo } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport { QueryEditorField } from '.';\nimport { getAggregationOptionsByMetric } from '../functions';\nimport { MetricDescriptor, ValueTypes, MetricKind } from '../types';\n\nexport interface Props {\n  onChange: (metricDescriptor: string) => void;\n  metricDescriptor?: MetricDescriptor;\n  crossSeriesReducer: string;\n  groupBys: string[];\n  templateVariableOptions: Array<SelectableValue<string>>;\n}\n\nexport const Aggregation: FC<Props> = (props) => {\n  const aggOptions = useAggregationOptionsByMetric(props);\n  const selected = useSelectedFromOptions(aggOptions, props);\n\n  return (\n    <QueryEditorField labelWidth={18} label=\"Group by function\" data-testid=\"cloud-monitoring-aggregation\">\n      <Select\n        menuShouldPortal\n        width={16}\n        onChange={({ value }) => props.onChange(value!)}\n        value={selected}\n        options={[\n          {\n            label: 'Template Variables',\n            options: props.templateVariableOptions,\n          },\n          {\n            label: 'Aggregations',\n            expanded: true,\n            options: aggOptions,\n          },\n        ]}\n        placeholder=\"Select Reducer\"\n      />\n    </QueryEditorField>\n  );\n};\n\nconst useAggregationOptionsByMetric = ({ metricDescriptor }: Props): Array<SelectableValue<string>> => {\n  const valueType = metricDescriptor?.valueType;\n  const metricKind = metricDescriptor?.metricKind;\n\n  return useMemo(() => {\n    if (!valueType || !metricKind) {\n      return [];\n    }\n\n    return getAggregationOptionsByMetric(valueType as ValueTypes, metricKind as MetricKind).map((a) => ({\n      ...a,\n      label: a.text,\n    }));\n  }, [valueType, metricKind]);\n};\n\nconst useSelectedFromOptions = (aggOptions: Array<SelectableValue<string>>, props: Props) => {\n  return useMemo(() => {\n    const allOptions = [...aggOptions, ...props.templateVariableOptions];\n    return allOptions.find((s) => s.value === props.crossSeriesReducer);\n  }, [aggOptions, props.crossSeriesReducer, props.templateVariableOptions]);\n};\n","import React, { FC } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { HorizontalGroup, InlineLabel, PopoverContent, Select, InlineField } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { INNER_LABEL_WIDTH, LABEL_WIDTH } from '../constants';\n\ninterface VariableQueryFieldProps {\n  onChange: (value: string) => void;\n  options: SelectableValue[];\n  value: string;\n  label: string;\n  allowCustomValue?: boolean;\n}\n\nexport const VariableQueryField: FC<VariableQueryFieldProps> = ({\n  label,\n  onChange,\n  value,\n  options,\n  allowCustomValue = false,\n}) => {\n  return (\n    <InlineField label={label} labelWidth={20}>\n      <Select\n        menuShouldPortal\n        width={25}\n        allowCustomValue={allowCustomValue}\n        value={value}\n        onChange={({ value }) => onChange(value!)}\n        options={options}\n      />\n    </InlineField>\n  );\n};\n\nexport interface Props {\n  children: React.ReactNode;\n  tooltip?: PopoverContent;\n  label?: React.ReactNode;\n  className?: string;\n  noFillEnd?: boolean;\n  labelWidth?: number;\n  fillComponent?: React.ReactNode;\n}\n\nexport const QueryEditorRow: FC<Props> = ({\n  children,\n  label,\n  tooltip,\n  fillComponent,\n  noFillEnd = false,\n  labelWidth = LABEL_WIDTH,\n  ...rest\n}) => {\n  return (\n    <div className=\"gf-form\" {...rest}>\n      {label && (\n        <InlineLabel width={labelWidth} tooltip={tooltip}>\n          {label}\n        </InlineLabel>\n      )}\n      <div\n        className={css`\n          margin-right: 4px;\n        `}\n      >\n        <HorizontalGroup spacing=\"xs\" width=\"auto\">\n          {children}\n        </HorizontalGroup>\n      </div>\n      <div className={'gf-form--grow'}>\n        {noFillEnd || <div className={'gf-form-label gf-form-label--grow'}>{fillComponent}</div>}\n      </div>\n    </div>\n  );\n};\n\nexport const QueryEditorField: FC<Props> = ({ children, label, tooltip, labelWidth = INNER_LABEL_WIDTH, ...rest }) => {\n  return (\n    <>\n      {label && (\n        <InlineLabel width={labelWidth} tooltip={tooltip} {...rest}>\n          {label}\n        </InlineLabel>\n      )}\n      {children}\n    </>\n  );\n};\n","import React from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Metrics, LabelFilter, GroupBy, Preprocessor, Alignment } from '.';\nimport { MetricQuery, MetricDescriptor, CustomMetaData, SLOQuery } from '../types';\nimport CloudMonitoringDatasource from '../datasource';\n\nexport interface Props {\n  customMetaData: CustomMetaData;\n  variableOptionGroup: SelectableValue<string>;\n  onMetricTypeChange: (query: MetricDescriptor) => void;\n  onChange: (query: MetricQuery | SLOQuery) => void;\n  query: MetricQuery;\n  datasource: CloudMonitoringDatasource;\n  labels: any;\n}\n\nfunction Editor({\n  query,\n  labels,\n  datasource,\n  onChange,\n  onMetricTypeChange,\n  customMetaData,\n  variableOptionGroup,\n}: React.PropsWithChildren<Props>) {\n  return (\n    <Metrics\n      templateSrv={datasource.templateSrv}\n      projectName={query.projectName}\n      metricType={query.metricType}\n      templateVariableOptions={variableOptionGroup.options}\n      datasource={datasource}\n      onChange={onMetricTypeChange}\n    >\n      {(metric) => (\n        <>\n          <LabelFilter\n            labels={labels}\n            filters={query.filters!}\n            onChange={(filters: string[]) => onChange({ ...query, filters })}\n            variableOptionGroup={variableOptionGroup}\n          />\n          <Preprocessor metricDescriptor={metric} query={query} onChange={onChange} />\n          <GroupBy\n            labels={Object.keys(labels)}\n            query={query}\n            onChange={onChange}\n            variableOptionGroup={variableOptionGroup}\n            metricDescriptor={metric}\n          />\n          <Alignment\n            datasource={datasource}\n            templateVariableOptions={variableOptionGroup.options}\n            query={query}\n            customMetaData={customMetaData}\n            onChange={onChange}\n          />\n        </>\n      )}\n    </Metrics>\n  );\n}\n\nexport const VisualMetricQueryEditor = React.memo(Editor);\n","import React, { FunctionComponent, useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { RadioButtonGroup } from '@grafana/ui';\nimport { MetricDescriptor, MetricKind, MetricQuery, PreprocessorType, ValueTypes } from '../types';\nimport { getAlignmentPickerData } from '../functions';\nimport { QueryEditorRow } from '.';\n\nconst NONE_OPTION = { label: 'None', value: PreprocessorType.None };\n\nexport interface Props {\n  metricDescriptor?: MetricDescriptor;\n  onChange: (query: MetricQuery) => void;\n  query: MetricQuery;\n}\n\nexport const Preprocessor: FunctionComponent<Props> = ({ query, metricDescriptor, onChange }) => {\n  const options = useOptions(metricDescriptor);\n  return (\n    <QueryEditorRow\n      label=\"Pre-processing\"\n      tooltip=\"Preprocessing options are displayed when the selected metric has a metric kind of delta or cumulative. The specific options available are determined by the metic's value type. If you select 'Rate', data points are aligned and converted to a rate per time series. If you select 'Delta', data points are aligned by their delta (difference) per time series\"\n    >\n      <RadioButtonGroup\n        onChange={(value: PreprocessorType) => {\n          const { valueType, metricKind, perSeriesAligner: psa } = query;\n          const { perSeriesAligner } = getAlignmentPickerData(valueType, metricKind, psa, value);\n          onChange({ ...query, preprocessor: value, perSeriesAligner });\n        }}\n        value={query.preprocessor ?? PreprocessorType.None}\n        options={options}\n      ></RadioButtonGroup>\n    </QueryEditorRow>\n  );\n};\n\nconst useOptions = (metricDescriptor?: MetricDescriptor): Array<SelectableValue<PreprocessorType>> => {\n  const metricKind = metricDescriptor?.metricKind;\n  const valueType = metricDescriptor?.valueType;\n\n  return useMemo(() => {\n    if (!metricKind || metricKind === MetricKind.GAUGE || valueType === ValueTypes.DISTRIBUTION) {\n      return [NONE_OPTION];\n    }\n\n    const options = [\n      NONE_OPTION,\n      {\n        label: 'Rate',\n        value: PreprocessorType.Rate,\n        description: 'Data points are aligned and converted to a rate per time series',\n      },\n    ];\n\n    return metricKind === MetricKind.CUMULATIVE\n      ? [\n          ...options,\n          {\n            label: 'Delta',\n            value: PreprocessorType.Delta,\n            description: 'Data points are aligned by their delta (difference) per time series',\n          },\n        ]\n      : options;\n  }, [metricKind, valueType]);\n};\n","import { AuthType, MetricKind, QueryType, ValueTypes } from './types';\n\n// not super excited about using uneven numbers, but this makes it align perfectly with rows that has two fields\nexport const INPUT_WIDTH = 71;\nexport const LABEL_WIDTH = 19;\nexport const INNER_LABEL_WIDTH = 14;\nexport const SELECT_WIDTH = 28;\nexport const AUTH_TYPES = [\n  { value: 'Google JWT File', key: AuthType.JWT },\n  { value: 'GCE Default Service Account', key: AuthType.GCE },\n];\n\nexport const ALIGNMENTS = [\n  {\n    text: 'delta',\n    value: 'ALIGN_DELTA',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.CUMULATIVE, MetricKind.DELTA],\n  },\n  {\n    text: 'rate',\n    value: 'ALIGN_RATE',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.CUMULATIVE, MetricKind.DELTA],\n  },\n  {\n    text: 'interpolate',\n    value: 'ALIGN_INTERPOLATE',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'next older',\n    value: 'ALIGN_NEXT_OLDER',\n    valueTypes: [\n      ValueTypes.INT64,\n      ValueTypes.DOUBLE,\n      ValueTypes.MONEY,\n      ValueTypes.DISTRIBUTION,\n      ValueTypes.STRING,\n      ValueTypes.VALUE_TYPE_UNSPECIFIED,\n      ValueTypes.BOOL,\n    ],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'min',\n    value: 'ALIGN_MIN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'max',\n    value: 'ALIGN_MAX',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'mean',\n    value: 'ALIGN_MEAN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'count',\n    value: 'ALIGN_COUNT',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'sum',\n    value: 'ALIGN_SUM',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'stddev',\n    value: 'ALIGN_STDDEV',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'count true',\n    value: 'ALIGN_COUNT_TRUE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'count false',\n    value: 'ALIGN_COUNT_FALSE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'fraction true',\n    value: 'ALIGN_FRACTION_TRUE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE],\n  },\n  {\n    text: 'percentile 99',\n    value: 'ALIGN_PERCENTILE_99',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percentile 95',\n    value: 'ALIGN_PERCENTILE_95',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percentile 50',\n    value: 'ALIGN_PERCENTILE_50',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percentile 05',\n    value: 'ALIGN_PERCENTILE_05',\n    valueTypes: [ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'percent change',\n    value: 'ALIGN_PERCENT_CHANGE',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n];\n\nexport const AGGREGATIONS = [\n  {\n    text: 'none',\n    value: 'REDUCE_NONE',\n    valueTypes: [\n      ValueTypes.INT64,\n      ValueTypes.DOUBLE,\n      ValueTypes.MONEY,\n      ValueTypes.DISTRIBUTION,\n      ValueTypes.BOOL,\n      ValueTypes.STRING,\n    ],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'mean',\n    value: 'REDUCE_MEAN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: 'min',\n    value: 'REDUCE_MIN',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'max',\n    value: 'REDUCE_MAX',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'sum',\n    value: 'REDUCE_SUM',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'std. dev.',\n    value: 'REDUCE_STDDEV',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE, MetricKind.METRIC_KIND_UNSPECIFIED],\n  },\n  {\n    text: 'count',\n    value: 'REDUCE_COUNT',\n    valueTypes: [\n      ValueTypes.INT64,\n      ValueTypes.DOUBLE,\n      ValueTypes.MONEY,\n      ValueTypes.DISTRIBUTION,\n      ValueTypes.BOOL,\n      ValueTypes.STRING,\n    ],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: 'count true',\n    value: 'REDUCE_COUNT_TRUE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: 'count false',\n    value: 'REDUCE_COUNT_FALSE',\n    valueTypes: [ValueTypes.BOOL],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA],\n  },\n  {\n    text: '99th percentile',\n    value: 'REDUCE_PERCENTILE_99',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: '95th percentile',\n    value: 'REDUCE_PERCENTILE_95',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: '50th percentile',\n    value: 'REDUCE_PERCENTILE_50',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n  {\n    text: '5th percentile',\n    value: 'REDUCE_PERCENTILE_05',\n    valueTypes: [ValueTypes.INT64, ValueTypes.DOUBLE, ValueTypes.MONEY, ValueTypes.DISTRIBUTION],\n    metricKinds: [MetricKind.GAUGE, MetricKind.DELTA, MetricKind.CUMULATIVE],\n  },\n];\n\nexport const ALIGNMENT_PERIODS = [\n  { text: 'grafana auto', value: 'grafana-auto' },\n  { text: 'stackdriver auto', value: 'stackdriver-auto', hidden: true },\n  { text: 'cloud monitoring auto', value: 'cloud-monitoring-auto' },\n  { text: '1m', value: '+60s' },\n  { text: '2m', value: '+120s' },\n  { text: '5m', value: '+300s' },\n  { text: '10m', value: '+600s' },\n  { text: '30m', value: '+1800s' },\n  { text: '1h', value: '+3600s' },\n  { text: '3h', value: '+7200s' },\n  { text: '6h', value: '+21600s' },\n  { text: '1d', value: '+86400s' },\n  { text: '3d', value: '+259200s' },\n  { text: '1w', value: '+604800s' },\n];\n\nexport const SYSTEM_LABELS = [\n  'metadata.system_labels.cloud_account',\n  'metadata.system_labels.name',\n  'metadata.system_labels.region',\n  'metadata.system_labels.state',\n  'metadata.system_labels.instance_group',\n  'metadata.system_labels.node_name',\n  'metadata.system_labels.service_name',\n  'metadata.system_labels.top_level_controller_type',\n  'metadata.system_labels.top_level_controller_name',\n  'metadata.system_labels.container_image',\n];\n\nexport const SELECTORS = [\n  { label: 'SLI Value', value: 'select_slo_health' },\n  { label: 'SLO Compliance', value: 'select_slo_compliance' },\n  { label: 'SLO Error Budget Remaining', value: 'select_slo_budget_fraction' },\n];\n\nexport const QUERY_TYPES = [\n  { label: 'Metrics', value: QueryType.METRICS },\n  { label: 'Service Level Objectives (SLO)', value: QueryType.SLO },\n];\n","import { chunk, flatten, initial, startCase, uniqBy } from 'lodash';\nimport { ALIGNMENTS, AGGREGATIONS, SYSTEM_LABELS } from './constants';\nimport CloudMonitoringDatasource from './datasource';\nimport { TemplateSrv, getTemplateSrv } from '@grafana/runtime';\nimport { MetricDescriptor, ValueTypes, MetricKind, AlignmentTypes, PreprocessorType, Filter } from './types';\n\nconst templateSrv: TemplateSrv = getTemplateSrv();\n\nexport const extractServicesFromMetricDescriptors = (metricDescriptors: MetricDescriptor[]) =>\n  uniqBy(metricDescriptors, 'service');\n\nexport const getMetricTypesByService = (metricDescriptors: MetricDescriptor[], service: string) =>\n  metricDescriptors.filter((m: MetricDescriptor) => m.service === service);\n\nexport const getMetricTypes = (\n  metricDescriptors: MetricDescriptor[],\n  metricType: string,\n  interpolatedMetricType: string,\n  selectedService: string\n) => {\n  const metricTypes = getMetricTypesByService(metricDescriptors, selectedService).map((m) => ({\n    value: m.type,\n    name: m.displayName,\n  }));\n  const metricTypeExistInArray = metricTypes.some(\n    (m: { value: string; name: string }) => m.value === interpolatedMetricType\n  );\n  const metricTypeByService = metricTypes.length ? metricTypes[0].value : '';\n  const selectedMetricType = metricTypeExistInArray ? metricType : metricTypeByService;\n  return {\n    metricTypes,\n    selectedMetricType,\n  };\n};\n\nexport const getAlignmentOptionsByMetric = (\n  metricValueType: string,\n  metricKind: string,\n  preprocessor?: PreprocessorType\n) => {\n  if (preprocessor && preprocessor === PreprocessorType.Rate) {\n    metricKind = MetricKind.GAUGE;\n  }\n\n  return !metricValueType\n    ? []\n    : ALIGNMENTS.filter((i) => {\n        return (\n          i.valueTypes.indexOf(metricValueType as ValueTypes) !== -1 &&\n          i.metricKinds.indexOf(metricKind as MetricKind) !== -1\n        );\n      });\n};\n\nexport const getAggregationOptionsByMetric = (valueType: ValueTypes, metricKind: MetricKind) => {\n  return !metricKind\n    ? []\n    : AGGREGATIONS.filter((i) => {\n        return i.valueTypes.indexOf(valueType) !== -1 && i.metricKinds.indexOf(metricKind) !== -1;\n      });\n};\n\nexport const getLabelKeys = async (\n  datasource: CloudMonitoringDatasource,\n  selectedMetricType: string,\n  projectName: string\n) => {\n  const refId = 'handleLabelKeysQuery';\n  const labels = await datasource.getLabels(selectedMetricType, refId, projectName);\n  return [...Object.keys(labels), ...SYSTEM_LABELS];\n};\n\nexport const getAlignmentPickerData = (\n  valueType: string | undefined = ValueTypes.DOUBLE,\n  metricKind: string | undefined = MetricKind.GAUGE,\n  perSeriesAligner: string | undefined = AlignmentTypes.ALIGN_MEAN,\n  preprocessor?: PreprocessorType\n) => {\n  const alignOptions = getAlignmentOptionsByMetric(valueType!, metricKind!, preprocessor!).map((option) => ({\n    ...option,\n    label: option.text,\n  }));\n  if (!alignOptions.some((o: { value: string }) => o.value === templateSrv.replace(perSeriesAligner))) {\n    perSeriesAligner = alignOptions.length > 0 ? alignOptions[0].value : AlignmentTypes.ALIGN_MEAN;\n  }\n  return { alignOptions, perSeriesAligner };\n};\n\nexport const labelsToGroupedOptions = (groupBys: string[]) => {\n  const groups = groupBys.reduce((acc: any, curr: string) => {\n    const arr = curr.split('.').map(startCase);\n    const group = (arr.length === 2 ? arr : initial(arr)).join(' ');\n    const option = {\n      value: curr,\n      label: curr,\n    };\n    if (acc[group]) {\n      acc[group] = [...acc[group], option];\n    } else {\n      acc[group] = [option];\n    }\n    return acc;\n  }, {});\n  return Object.entries(groups).map(([label, options]) => ({ label, options, expanded: true }), []);\n};\n\nexport const filtersToStringArray = (filters: Filter[]) => {\n  const strArr = flatten(filters.map(({ key, operator, value, condition }) => [key, operator, value, condition!]));\n  return strArr.filter((_, i) => i !== strArr.length - 1);\n};\n\nexport const stringArrayToFilters = (filterArray: string[]) =>\n  chunk(filterArray, 4).map(([key, operator, value, condition = 'AND']) => ({\n    key,\n    operator,\n    value,\n    condition,\n  }));\n\nexport const formatCloudMonitoringError = (error: any) => {\n  let message = error.statusText ?? '';\n  if (error.data && error.data.error) {\n    try {\n      const res = JSON.parse(error.data.error);\n      message += res.error.code + '. ' + res.error.message;\n    } catch (err) {\n      message += error.data.error;\n    }\n  } else if (error.data && error.data.message) {\n    try {\n      message = JSON.parse(error.data.message).error.message;\n    } catch (err) {\n      error.error = err;\n    }\n  }\n  return message;\n};\n","import { DataQuery, DataSourceJsonData, SelectableValue } from '@grafana/data';\n\nexport enum AuthType {\n  JWT = 'jwt',\n  GCE = 'gce',\n}\n\nexport const authTypes: Array<SelectableValue<string>> = [\n  { label: 'Google JWT File', value: AuthType.JWT },\n  { label: 'GCE Default Service Account', value: AuthType.GCE },\n];\n\nexport enum MetricFindQueryTypes {\n  Projects = 'projects',\n  Services = 'services',\n  DefaultProject = 'defaultProject',\n  MetricTypes = 'metricTypes',\n  LabelKeys = 'labelKeys',\n  LabelValues = 'labelValues',\n  ResourceTypes = 'resourceTypes',\n  Aggregations = 'aggregations',\n  Aligners = 'aligners',\n  AlignmentPeriods = 'alignmentPeriods',\n  Selectors = 'selectors',\n  SLOServices = 'sloServices',\n  SLO = 'slo',\n}\n\nexport interface CloudMonitoringVariableQuery extends DataQuery {\n  selectedQueryType: string;\n  selectedService: string;\n  selectedMetricType: string;\n  selectedSLOService: string;\n  labelKey: string;\n  projects: SelectableValue[];\n  sloServices: SelectableValue[];\n  projectName: string;\n}\n\nexport interface VariableQueryData {\n  selectedQueryType: string;\n  metricDescriptors: MetricDescriptor[];\n  selectedService: string;\n  selectedMetricType: string;\n  selectedSLOService: string;\n  labels: string[];\n  labelKey: string;\n  metricTypes: Array<{ value: string; name: string }>;\n  services: SelectableValue[];\n  projects: SelectableValue[];\n  sloServices: SelectableValue[];\n  projectName: string;\n  loading: boolean;\n}\n\nexport interface Aggregation {\n  crossSeriesReducer?: string;\n  groupBys?: string[];\n}\n\nexport enum QueryType {\n  METRICS = 'metrics',\n  SLO = 'slo',\n}\n\nexport enum EditorMode {\n  Visual = 'visual',\n  MQL = 'mql',\n}\n\nexport enum PreprocessorType {\n  None = 'none',\n  Rate = 'rate',\n  Delta = 'delta',\n}\n\nexport enum MetricKind {\n  METRIC_KIND_UNSPECIFIED = 'METRIC_KIND_UNSPECIFIED',\n  GAUGE = 'GAUGE',\n  DELTA = 'DELTA',\n  CUMULATIVE = 'CUMULATIVE',\n}\n\nexport enum ValueTypes {\n  VALUE_TYPE_UNSPECIFIED = 'VALUE_TYPE_UNSPECIFIED',\n  BOOL = 'BOOL',\n  INT64 = 'INT64',\n  DOUBLE = 'DOUBLE',\n  STRING = 'STRING',\n  DISTRIBUTION = 'DISTRIBUTION',\n  MONEY = 'MONEY',\n}\n\nexport enum AlignmentTypes {\n  ALIGN_DELTA = 'ALIGN_DELTA',\n  ALIGN_RATE = 'ALIGN_RATE',\n  ALIGN_INTERPOLATE = 'ALIGN_INTERPOLATE',\n  ALIGN_NEXT_OLDER = 'ALIGN_NEXT_OLDER',\n  ALIGN_MIN = 'ALIGN_MIN',\n  ALIGN_MAX = 'ALIGN_MAX',\n  ALIGN_MEAN = 'ALIGN_MEAN',\n  ALIGN_COUNT = 'ALIGN_COUNT',\n  ALIGN_SUM = 'ALIGN_SUM',\n  ALIGN_STDDEV = 'ALIGN_STDDEV',\n  ALIGN_COUNT_TRUE = 'ALIGN_COUNT_TRUE',\n  ALIGN_COUNT_FALSE = 'ALIGN_COUNT_FALSE',\n  ALIGN_FRACTION_TRUE = 'ALIGN_FRACTION_TRUE',\n  ALIGN_PERCENTILE_99 = 'ALIGN_PERCENTILE_99',\n  ALIGN_PERCENTILE_95 = 'ALIGN_PERCENTILE_95',\n  ALIGN_PERCENTILE_50 = 'ALIGN_PERCENTILE_50',\n  ALIGN_PERCENTILE_05 = 'ALIGN_PERCENTILE_05',\n  ALIGN_PERCENT_CHANGE = 'ALIGN_PERCENT_CHANGE',\n}\n\nexport interface BaseQuery {\n  projectName: string;\n  perSeriesAligner?: string;\n  alignmentPeriod?: string;\n  aliasBy?: string;\n}\n\nexport interface MetricQuery extends BaseQuery {\n  editorMode: EditorMode;\n  metricType: string;\n  crossSeriesReducer: string;\n  groupBys?: string[];\n  filters?: string[];\n  metricKind?: MetricKind;\n  valueType?: string;\n  view?: string;\n  query: string;\n  preprocessor?: PreprocessorType;\n}\n\nexport interface SLOQuery extends BaseQuery {\n  selectorName: string;\n  serviceId: string;\n  serviceName: string;\n  sloId: string;\n  sloName: string;\n  goal?: number;\n}\n\nexport interface CloudMonitoringQuery extends DataQuery {\n  datasourceId?: number; // Should not be necessary anymore\n  queryType: QueryType;\n  metricQuery: MetricQuery;\n  sloQuery?: SLOQuery;\n  intervalMs: number;\n  type: string;\n}\n\nexport interface CloudMonitoringOptions extends DataSourceJsonData {\n  defaultProject?: string;\n  gceDefaultProject?: string;\n  authenticationType?: string;\n  clientEmail?: string;\n  tokenUri?: string;\n}\n\nexport interface CloudMonitoringSecureJsonData {\n  privateKey?: string;\n}\n\nexport interface AnnotationTarget {\n  projectName: string;\n  metricType: string;\n  refId: string;\n  filters: string[];\n  metricKind: MetricKind;\n  valueType: string;\n  title: string;\n  text: string;\n}\n\nexport interface QueryMeta {\n  alignmentPeriod: string;\n  rawQuery: string;\n  rawQueryString: string;\n  metricLabels: { [key: string]: string[] };\n  resourceLabels: { [key: string]: string[] };\n  resourceTypes: string[];\n}\n\nexport interface MetricDescriptor {\n  valueType: string;\n  metricKind: MetricKind;\n  type: string;\n  unit: string;\n  service: string;\n  serviceShortName: string;\n  displayName: string;\n  description: string;\n}\n\nexport interface Segment {\n  type: string;\n  value: string;\n}\n\nexport interface Filter {\n  key: string;\n  operator: string;\n  value: string;\n  condition?: string;\n}\n\nexport interface CustomMetaData {\n  perSeriesAligner?: string;\n  alignmentPeriod?: string;\n}\n\nexport interface PostResponse {\n  results: Record<string, any>;\n}\n","const JSURL = require('jsurl');\n\nexport interface AwsUrl {\n  end: string;\n  start: string;\n  timeType?: 'ABSOLUTE' | 'RELATIVE';\n  tz?: 'local' | 'UTC';\n  unit?: string;\n  editorString: string;\n  isLiveTail: boolean;\n  source: string[];\n}\n\nexport function encodeUrl(obj: AwsUrl, region: string): string {\n  return `https://${region}.console.aws.amazon.com/cloudwatch/home?region=${region}#logs-insights:queryDetail=${JSURL.stringify(\n    obj\n  )}`;\n}\n","export const TRIGGER_SUGGEST = {\n  id: 'editor.action.triggerSuggest',\n  title: '',\n};\n","export default {\n  id: 'cloudwatch-sql',\n  extensions: ['.cloudwatchSql'],\n  aliases: ['CloudWatch', 'cloudwatch', 'CloudWatchSQL'],\n  mimetypes: [],\n  loader: () => import('./language'),\n};\n","import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\n\ninterface CloudWatchLanguage extends monacoType.languages.IMonarchLanguage {\n  keywords: string[];\n  operators: string[];\n  builtinFunctions: string[];\n}\n\nexport const SELECT = 'SELECT';\nexport const FROM = 'FROM';\nexport const WHERE = 'WHERE';\nexport const GROUP = 'GROUP';\nexport const ORDER = 'ORDER';\nexport const BY = 'BY';\nexport const DESC = 'DESC';\nexport const ASC = 'ASC';\nexport const LIMIT = 'LIMIT';\nexport const WITH = 'WITH';\nexport const SCHEMA = 'SCHEMA';\n\nexport const KEYWORDS = [SELECT, FROM, WHERE, GROUP, ORDER, BY, DESC, ASC, LIMIT, WITH, SCHEMA];\nexport const STATISTICS = ['AVG', 'COUNT', 'MAX', 'MIN', 'SUM'];\n\nexport const AND = 'AND';\nexport const LOGICAL_OPERATORS = [AND];\n\nexport const EQUALS = '=';\nexport const NOT_EQUALS = '!=';\nexport const COMPARISON_OPERATORS = [EQUALS, NOT_EQUALS];\n\nexport const language: CloudWatchLanguage = {\n  defaultToken: '',\n  tokenPostfix: '.sql',\n  ignoreCase: true,\n  brackets: [\n    { open: '[', close: ']', token: 'delimiter.square' },\n    { open: '(', close: ')', token: 'delimiter.parenthesis' },\n  ],\n  keywords: KEYWORDS,\n  operators: LOGICAL_OPERATORS,\n  builtinFunctions: STATISTICS,\n  tokenizer: {\n    root: [\n      [/\\$[a-zA-Z0-9-_]+/, 'variable'],\n      { include: '@comments' },\n      { include: '@whitespace' },\n      { include: '@numbers' },\n      { include: '@strings' },\n      { include: '@complexIdentifiers' },\n      [/[;,.]/, 'delimiter'],\n      [/[()]/, '@brackets'],\n      [\n        /[\\w@#$]+/,\n        {\n          cases: {\n            '@keywords': 'keyword',\n            '@operators': 'operator',\n            '@builtinFunctions': 'predefined',\n            '@default': 'identifier',\n          },\n        },\n      ],\n      [/[=!%&+\\-*/|~^]/, 'operator'], // TODO: strip these options\n    ],\n    whitespace: [[/\\s+/, 'white']],\n    comments: [[/--+.*/, 'comment']],\n    comment: [\n      [/[^*/]+/, 'comment'],\n      [/./, 'comment'],\n    ],\n    numbers: [\n      [/0[xX][0-9a-fA-F]*/, 'number'],\n      [/[$][+-]*\\d*(\\.\\d*)?/, 'number'],\n      [/((\\d+(\\.\\d*)?)|(\\.\\d+))([eE][\\-+]?\\d+)?/, 'number'],\n    ],\n    strings: [\n      [/N'/, { token: 'string', next: '@string' }],\n      [/'/, { token: 'string', next: '@string' }],\n      [/\"/, { token: 'type', next: '@string_double' }],\n    ],\n    string: [\n      [/[^']+/, 'string'],\n      [/''/, 'string'],\n      [/'/, { token: 'string', next: '@pop' }],\n    ],\n    string_double: [\n      [/[^\\\\\"]+/, 'type'],\n      [/\"/, 'type', '@pop'],\n    ],\n    complexIdentifiers: [\n      [/\\[/, { token: 'identifier.quote', next: '@bracketedIdentifier' }],\n      [/\"/, { token: 'identifier.quote', next: '@quotedIdentifier' }],\n    ],\n    bracketedIdentifier: [\n      [/[^\\]]+/, 'identifier'],\n      [/]]/, 'identifier'],\n      [/]/, { token: 'identifier.quote', next: '@pop' }],\n    ],\n    quotedIdentifier: [\n      [/[^\"]+/, 'identifier'],\n      [/\"\"/, 'identifier'],\n      [/\"/, { token: 'identifier.quote', next: '@pop' }],\n    ],\n  },\n};\n\nexport const conf: monacoType.languages.LanguageConfiguration = {\n  comments: {\n    lineComment: '--',\n    blockComment: ['/*', '*/'],\n  },\n  brackets: [\n    ['{', '}'],\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","const byRE = /\\s+by\\s+/im;\n\n/**\n * groups look like this: (@a.foo)( as )(bar),\n * group 1 is the field, group 2 is \" as \" and group 3 is the alias\n * this regex will not advance past any non-identifier or whitespace characters, e.g. |\n */\nconst groupsRE = /([\\w$@().]+)(?:(\\s+as\\s+)([\\w$]+))?\\s*,?\\s*/iy;\n\nexport function getStatsGroups(query: string): string[] {\n  let groups = [];\n\n  // find \" by \"\n  let b;\n  if ((b = query.match(byRE))) {\n    // continue incremental scanning from there for groups & aliases\n    groupsRE.lastIndex = b.index! + b[0].length;\n\n    let g;\n    while ((g = groupsRE.exec(query))) {\n      groups.push(g[2] ? g[3] : g[1]);\n      groupsRE.lastIndex = g.index + g[0].length;\n    }\n  }\n\n  return groups;\n}\n","// Libraries\nimport React, { ReactNode } from 'react';\nimport { intersectionBy, debounce, unionBy } from 'lodash';\n\nimport {\n  BracesPlugin,\n  LegacyForms,\n  MultiSelect,\n  QueryField,\n  Select,\n  SlatePrism,\n  TypeaheadInput,\n  TypeaheadOutput,\n} from '@grafana/ui';\n\n// Utils & Services\n// dom also includes Element polyfills\nimport { Editor, Node, Plugin } from 'slate';\nimport syntax from '../syntax';\n\n// Types\nimport { AbsoluteTimeRange, QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { CloudWatchJsonData, CloudWatchLogsQuery, CloudWatchQuery } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\nimport { CloudWatchLanguageProvider } from '../language_provider';\nimport { css } from '@emotion/css';\nimport { ExploreId } from 'app/types';\nimport { dispatch } from 'app/store/store';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { InputActionMeta } from '@grafana/ui/src/components/Select/types';\nimport { getStatsGroups } from '../utils/query/getStatsGroups';\n\nexport interface CloudWatchLogsQueryFieldProps\n  extends QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData> {\n  absoluteRange: AbsoluteTimeRange;\n  onLabelsRefresh?: () => void;\n  ExtraFieldElement?: ReactNode;\n  exploreId: ExploreId;\n  allowCustomValue?: boolean;\n}\n\nconst containerClass = css`\n  flex-grow: 1;\n  min-height: 35px;\n`;\n\nconst rowGap = css`\n  gap: 3px;\n`;\n\ninterface State {\n  selectedLogGroups: Array<SelectableValue<string>>;\n  availableLogGroups: Array<SelectableValue<string>>;\n  loadingLogGroups: boolean;\n  regions: Array<SelectableValue<string>>;\n  selectedRegion: SelectableValue<string>;\n  invalidLogGroups: boolean;\n  hint:\n    | {\n        message: string;\n        fix: {\n          label: string;\n          action: () => void;\n        };\n      }\n    | undefined;\n}\n\nexport class CloudWatchLogsQueryField extends React.PureComponent<CloudWatchLogsQueryFieldProps, State> {\n  state: State = {\n    selectedLogGroups:\n      (this.props.query as CloudWatchLogsQuery).logGroupNames?.map((logGroup) => ({\n        value: logGroup,\n        label: logGroup,\n      })) ?? [],\n    availableLogGroups: [],\n    regions: [],\n    invalidLogGroups: false,\n    selectedRegion: (this.props.query as CloudWatchLogsQuery).region\n      ? {\n          label: (this.props.query as CloudWatchLogsQuery).region,\n          value: (this.props.query as CloudWatchLogsQuery).region,\n          text: (this.props.query as CloudWatchLogsQuery).region,\n        }\n      : { label: 'default', value: 'default', text: 'default' },\n    loadingLogGroups: false,\n    hint: undefined,\n  };\n\n  plugins: Plugin[];\n\n  constructor(props: CloudWatchLogsQueryFieldProps, context: React.Context<any>) {\n    super(props, context);\n\n    this.plugins = [\n      BracesPlugin(),\n      SlatePrism(\n        {\n          onlyIn: (node: Node) => node.object === 'block' && node.type === 'code_block',\n          getSyntax: (node: Node) => 'cloudwatch',\n        },\n        { ...(prismLanguages as LanguageMap), cloudwatch: syntax }\n      ),\n    ];\n  }\n\n  fetchLogGroupOptions = async (region: string, logGroupNamePrefix?: string) => {\n    try {\n      const logGroups: string[] = await this.props.datasource.describeLogGroups({\n        refId: this.props.query.refId,\n        region,\n        logGroupNamePrefix,\n      });\n\n      return logGroups.map((logGroup) => ({\n        value: logGroup,\n        label: logGroup,\n      }));\n    } catch (err) {\n      let errMessage = 'unknown error';\n      if (typeof err !== 'string') {\n        try {\n          errMessage = JSON.stringify(err);\n        } catch (e) {}\n      } else {\n        errMessage = err;\n      }\n      dispatch(notifyApp(createErrorNotification(errMessage)));\n      return [];\n    }\n  };\n\n  onLogGroupSearch = (searchTerm: string, region: string, actionMeta: InputActionMeta) => {\n    if (actionMeta.action !== 'input-change') {\n      return Promise.resolve();\n    }\n\n    // No need to fetch matching log groups if the search term isn't valid\n    // This is also useful for preventing searches when a user is typing out a log group with template vars\n    // See https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_LogGroup.html for the source of the pattern below\n    const logGroupNamePattern = /^[\\.\\-_/#A-Za-z0-9]+$/;\n    if (!logGroupNamePattern.test(searchTerm)) {\n      return Promise.resolve();\n    }\n\n    this.setState({\n      loadingLogGroups: true,\n    });\n\n    return this.fetchLogGroupOptions(region, searchTerm)\n      .then((matchingLogGroups) => {\n        this.setState((state) => ({\n          availableLogGroups: unionBy(state.availableLogGroups, matchingLogGroups, 'value'),\n        }));\n      })\n      .finally(() => {\n        this.setState({\n          loadingLogGroups: false,\n        });\n      });\n  };\n\n  onLogGroupSearchDebounced = debounce(this.onLogGroupSearch, 300);\n\n  componentDidMount = () => {\n    const { datasource, query, onChange } = this.props;\n\n    this.setState({\n      loadingLogGroups: true,\n    });\n\n    query.region &&\n      this.fetchLogGroupOptions(query.region).then((logGroups) => {\n        this.setState((state) => {\n          const selectedLogGroups = state.selectedLogGroups;\n          if (onChange) {\n            const nextQuery = {\n              ...query,\n              logGroupNames: selectedLogGroups.map((group) => group.value!),\n            };\n\n            onChange(nextQuery);\n          }\n\n          return {\n            loadingLogGroups: false,\n            availableLogGroups: logGroups,\n            selectedLogGroups,\n          };\n        });\n      });\n\n    datasource.getRegions().then((regions) => {\n      this.setState({\n        regions,\n      });\n    });\n  };\n\n  onChangeQuery = (value: string) => {\n    // Send text change to parent\n    const { query, onChange } = this.props;\n    const { selectedLogGroups, selectedRegion } = this.state;\n\n    if (onChange) {\n      const nextQuery = {\n        ...query,\n        expression: value,\n        logGroupNames: selectedLogGroups?.map((logGroupName) => logGroupName.value!) ?? [],\n        region: selectedRegion.value ?? 'default',\n        statsGroups: getStatsGroups(value),\n      };\n      onChange(nextQuery);\n    }\n  };\n\n  setSelectedLogGroups = (selectedLogGroups: Array<SelectableValue<string>>) => {\n    this.setState({\n      selectedLogGroups,\n    });\n\n    const { onChange, query } = this.props;\n    onChange?.({\n      ...(query as CloudWatchLogsQuery),\n      logGroupNames: selectedLogGroups.map((logGroupName) => logGroupName.value!) ?? [],\n    });\n  };\n\n  setCustomLogGroups = (v: string) => {\n    const customLogGroup: SelectableValue<string> = { value: v, label: v };\n    const selectedLogGroups = [...this.state.selectedLogGroups, customLogGroup];\n    this.setSelectedLogGroups(selectedLogGroups);\n  };\n\n  setSelectedRegion = async (v: SelectableValue<string>) => {\n    this.setState({\n      selectedRegion: v,\n      loadingLogGroups: true,\n    });\n\n    const logGroups = await this.fetchLogGroupOptions(v.value!);\n\n    this.setState((state) => {\n      const selectedLogGroups = intersectionBy(state.selectedLogGroups, logGroups, 'value');\n\n      const { onChange, query } = this.props;\n      if (onChange) {\n        const nextQuery = {\n          ...query,\n          region: v.value ?? 'default',\n          logGroupNames: selectedLogGroups.map((group) => group.value!),\n        };\n\n        onChange(nextQuery);\n      }\n      return {\n        availableLogGroups: logGroups,\n        selectedLogGroups: selectedLogGroups,\n        loadingLogGroups: false,\n      };\n    });\n  };\n\n  onTypeahead = async (typeahead: TypeaheadInput): Promise<TypeaheadOutput> => {\n    const { datasource, query } = this.props;\n    const { selectedLogGroups } = this.state;\n\n    if (!datasource.languageProvider) {\n      return { suggestions: [] };\n    }\n\n    const cloudwatchLanguageProvider = datasource.languageProvider as CloudWatchLanguageProvider;\n    const { history, absoluteRange } = this.props;\n    const { prefix, text, value, wrapperClasses, labelKey, editor } = typeahead;\n\n    return await cloudwatchLanguageProvider.provideCompletionItems(\n      { text, value, prefix, wrapperClasses, labelKey, editor },\n      {\n        history,\n        absoluteRange,\n        logGroupNames: selectedLogGroups.map((logGroup) => logGroup.value!),\n        region: query.region,\n      }\n    );\n  };\n\n  onQueryFieldClick = (_event: Event, _editor: Editor, next: () => any) => {\n    const { selectedLogGroups, loadingLogGroups } = this.state;\n\n    const queryFieldDisabled = loadingLogGroups || selectedLogGroups.length === 0;\n\n    if (queryFieldDisabled) {\n      this.setState({\n        invalidLogGroups: true,\n      });\n    }\n\n    next();\n  };\n\n  onOpenLogGroupMenu = () => {\n    this.setState({\n      invalidLogGroups: false,\n    });\n  };\n\n  render() {\n    const { ExtraFieldElement, data, query, datasource, allowCustomValue } = this.props;\n    const {\n      selectedLogGroups,\n      availableLogGroups,\n      regions,\n      selectedRegion,\n      loadingLogGroups,\n      hint,\n      invalidLogGroups,\n    } = this.state;\n\n    const showError = data && data.error && data.error.refId === query.refId;\n    const cleanText = datasource.languageProvider ? datasource.languageProvider.cleanText : undefined;\n\n    const MAX_LOG_GROUPS = 20;\n\n    return (\n      <>\n        <div className={`gf-form gf-form--grow flex-grow-1 ${rowGap}`}>\n          <LegacyForms.FormField\n            label=\"Region\"\n            labelWidth={4}\n            inputEl={\n              <Select\n                menuShouldPortal\n                options={regions}\n                value={selectedRegion}\n                onChange={(v) => this.setSelectedRegion(v)}\n                width={18}\n                placeholder=\"Choose Region\"\n                maxMenuHeight={500}\n              />\n            }\n          />\n\n          <LegacyForms.FormField\n            label=\"Log Groups\"\n            labelWidth={6}\n            className=\"flex-grow-1\"\n            inputEl={\n              <MultiSelect\n                menuShouldPortal\n                allowCustomValue={allowCustomValue}\n                options={unionBy(availableLogGroups, selectedLogGroups, 'value')}\n                value={selectedLogGroups}\n                onChange={(v) => {\n                  this.setSelectedLogGroups(v);\n                }}\n                onCreateOption={(v) => {\n                  this.setCustomLogGroups(v);\n                }}\n                className={containerClass}\n                closeMenuOnSelect={false}\n                isClearable={true}\n                invalid={invalidLogGroups}\n                isOptionDisabled={() => selectedLogGroups.length >= MAX_LOG_GROUPS}\n                placeholder=\"Choose Log Groups\"\n                maxVisibleValues={4}\n                noOptionsMessage=\"No log groups available\"\n                isLoading={loadingLogGroups}\n                onOpenMenu={this.onOpenLogGroupMenu}\n                onInputChange={(value, actionMeta) => {\n                  this.onLogGroupSearchDebounced(value, selectedRegion.value ?? 'default', actionMeta);\n                }}\n              />\n            }\n          />\n        </div>\n        <div className=\"gf-form-inline gf-form-inline--nowrap flex-grow-1\">\n          <div className=\"gf-form gf-form--grow flex-shrink-1\">\n            <QueryField\n              additionalPlugins={this.plugins}\n              query={query.expression ?? ''}\n              onChange={this.onChangeQuery}\n              onBlur={this.props.onBlur}\n              onClick={this.onQueryFieldClick}\n              onRunQuery={this.props.onRunQuery}\n              onTypeahead={this.onTypeahead}\n              cleanText={cleanText}\n              placeholder=\"Enter a CloudWatch Logs Insights query (run with Shift+Enter)\"\n              portalOrigin=\"cloudwatch\"\n              disabled={loadingLogGroups || selectedLogGroups.length === 0}\n            />\n          </div>\n          {ExtraFieldElement}\n        </div>\n        {hint && (\n          <div className=\"query-row-break\">\n            <div className=\"text-warning\">\n              {hint.message}\n              <a className=\"text-link muted\" onClick={hint.fix.action}>\n                {hint.fix.label}\n              </a>\n            </div>\n          </div>\n        )}\n        {showError ? (\n          <div className=\"query-row-break\">\n            <div className=\"prom-query-field-info text-error\">{data?.error?.message}</div>\n          </div>\n        ) : null}\n      </>\n    );\n  }\n}\n","import React, { Component } from 'react';\n\nimport { CloudWatchLogsQuery } from '../types';\nimport { PanelData } from '@grafana/data';\nimport { Icon } from '@grafana/ui';\nimport { encodeUrl, AwsUrl } from '../aws_url';\nimport { CloudWatchDatasource } from '../datasource';\n\ninterface Props {\n  query: CloudWatchLogsQuery;\n  panelData?: PanelData;\n  datasource: CloudWatchDatasource;\n}\n\ninterface State {\n  href: string;\n}\n\nexport default class CloudWatchLink extends Component<Props, State> {\n  state: State = { href: '' };\n\n  async componentDidUpdate(prevProps: Props) {\n    const { panelData: panelDataNew } = this.props;\n    const { panelData: panelDataOld } = prevProps;\n\n    if (panelDataOld !== panelDataNew && panelDataNew?.request) {\n      const href = this.getExternalLink();\n      this.setState({ href });\n    }\n  }\n\n  getExternalLink(): string {\n    const { query, panelData, datasource } = this.props;\n\n    const range = panelData?.request?.range;\n\n    if (!range) {\n      return '';\n    }\n\n    const start = range.from.toISOString();\n    const end = range.to.toISOString();\n\n    const urlProps: AwsUrl = {\n      end,\n      start,\n      timeType: 'ABSOLUTE',\n      tz: 'UTC',\n      editorString: query.expression ?? '',\n      isLiveTail: false,\n      source: query.logGroupNames ?? [],\n    };\n\n    return encodeUrl(urlProps, datasource.getActualRegion(query.region));\n  }\n\n  render() {\n    const { href } = this.state;\n    return (\n      <a href={href} target=\"_blank\" rel=\"noopener noreferrer\">\n        <Icon name=\"share-alt\" /> CloudWatch Logs Insights\n      </a>\n    );\n  }\n}\n","// Libraries\nimport React, { memo } from 'react';\n\n// Types\nimport { AbsoluteTimeRange, QueryEditorProps } from '@grafana/data';\nimport { InlineFormLabel } from '@grafana/ui';\nimport { CloudWatchDatasource } from '../datasource';\nimport { CloudWatchJsonData, CloudWatchLogsQuery, CloudWatchQuery } from '../types';\nimport { CloudWatchLogsQueryField } from './LogsQueryField';\nimport CloudWatchLink from './CloudWatchLink';\nimport { css } from '@emotion/css';\n\ntype Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData> & {\n  allowCustomValue?: boolean;\n};\n\nconst labelClass = css`\n  margin-left: 3px;\n  flex-grow: 0;\n`;\n\nexport const CloudWatchLogsQueryEditor = memo(function CloudWatchLogsQueryEditor(props: Props) {\n  const { query, data, datasource, onRunQuery, onChange, exploreId, allowCustomValue = false } = props;\n\n  let absolute: AbsoluteTimeRange;\n  if (data?.request?.range?.from) {\n    const { range } = data.request;\n    absolute = {\n      from: range.from.valueOf(),\n      to: range.to.valueOf(),\n    };\n  } else {\n    absolute = {\n      from: Date.now() - 10000,\n      to: Date.now(),\n    };\n  }\n\n  return (\n    <CloudWatchLogsQueryField\n      exploreId={exploreId}\n      datasource={datasource}\n      query={query}\n      onBlur={() => {}}\n      onChange={(val: CloudWatchQuery) => {\n        onChange({ ...val, queryMode: 'Logs' });\n      }}\n      onRunQuery={onRunQuery}\n      history={[]}\n      data={data}\n      absoluteRange={absolute}\n      allowCustomValue={allowCustomValue}\n      ExtraFieldElement={\n        <InlineFormLabel className={`gf-form-label--btn ${labelClass}`} width=\"auto\" tooltip=\"Link to Graph in AWS\">\n          <CloudWatchLink query={query as CloudWatchLogsQuery} panelData={data} datasource={datasource} />\n        </InlineFormLabel>\n      }\n    />\n  );\n});\n\nexport default CloudWatchLogsQueryEditor;\n","import React from 'react';\nimport { Switch, Select } from '@grafana/ui';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { CloudWatchDatasource } from '../../datasource';\nimport EditorRows from '../ui/EditorRows';\nimport EditorRow from '../ui/EditorRow';\nimport EditorFieldGroup from '../ui/EditorFieldGroup';\nimport EditorField from '../ui/EditorField';\nimport { appendTemplateVariables, toOption } from '../../utils/utils';\nimport { useDimensionKeys, useMetrics, useNamespaces } from '../../hooks';\nimport { Dimensions } from '..';\n\nexport type Props = {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  disableExpressions?: boolean;\n  onChange: (value: CloudWatchMetricsQuery) => void;\n  onRunQuery: () => void;\n};\n\nexport function MetricStatEditor({\n  query,\n  datasource,\n  disableExpressions = false,\n  onChange,\n  onRunQuery,\n}: React.PropsWithChildren<Props>) {\n  const { region, namespace, metricName, dimensions } = query;\n  const namespaces = useNamespaces(datasource);\n  const metrics = useMetrics(datasource, region, namespace);\n  const dimensionKeys = useDimensionKeys(datasource, region, namespace, metricName, dimensions ?? {});\n\n  const onQueryChange = (query: CloudWatchMetricsQuery) => {\n    onChange(query);\n    onRunQuery();\n  };\n\n  return (\n    <EditorRows>\n      <EditorRow>\n        <EditorFieldGroup>\n          <EditorField label=\"Namespace\" width={26}>\n            <Select\n              value={query.namespace}\n              allowCustomValue\n              options={namespaces}\n              onChange={({ value: namespace }) => {\n                if (namespace) {\n                  onQueryChange({ ...query, namespace });\n                }\n              }}\n            />\n          </EditorField>\n          <EditorField label=\"Metric name\" width={16}>\n            <Select\n              value={query.metricName}\n              allowCustomValue\n              options={metrics}\n              onChange={({ value: metricName }) => {\n                if (metricName) {\n                  onQueryChange({ ...query, metricName });\n                }\n              }}\n            />\n          </EditorField>\n\n          <EditorField label=\"Statistic\" width={16}>\n            <Select\n              inputId={`${query.refId}-metric-stat-editor-select-statistic`}\n              allowCustomValue\n              value={toOption(query.statistic ?? datasource.standardStatistics[0])}\n              options={appendTemplateVariables(\n                datasource,\n                datasource.standardStatistics.filter((s) => s !== query.statistic).map(toOption)\n              )}\n              onChange={({ value: statistic }) => {\n                if (\n                  !statistic ||\n                  (!datasource.standardStatistics.includes(statistic) &&\n                    !/^p\\d{2}(?:\\.\\d{1,2})?$/.test(statistic) &&\n                    !statistic.startsWith('$'))\n                ) {\n                  return;\n                }\n\n                onQueryChange({ ...query, statistic });\n              }}\n            />\n          </EditorField>\n        </EditorFieldGroup>\n      </EditorRow>\n\n      <EditorRow>\n        <EditorField label=\"Dimensions\">\n          <Dimensions\n            query={query}\n            onChange={(dimensions) => onQueryChange({ ...query, dimensions })}\n            dimensionKeys={dimensionKeys}\n            disableExpressions={disableExpressions}\n            datasource={datasource}\n          />\n        </EditorField>\n      </EditorRow>\n      {!disableExpressions && (\n        <EditorRow>\n          <EditorField\n            label=\"Match exact\"\n            optional={true}\n            tooltip=\"Only show metrics that exactly match all defined dimension names.\"\n          >\n            <Switch\n              id={`${query.refId}-cloudwatch-match-exact`}\n              value={!!query.matchExact}\n              onChange={(e) => {\n                onQueryChange({\n                  ...query,\n                  matchExact: e.currentTarget.checked,\n                });\n              }}\n            />\n          </EditorField>\n        </EditorRow>\n      )}\n    </EditorRows>\n  );\n}\n","import React from 'react';\n\ninterface FlexItemProps {\n  grow?: number;\n  shrink?: number;\n}\n\nconst FlexItem: React.FC<FlexItemProps> = ({ grow, shrink }) => {\n  return <div style={{ display: 'block', flexGrow: grow, flexShrink: shrink }} />;\n};\n\nexport default FlexItem;\n","import React, { useCallback, useState } from 'react';\nimport { pick } from 'lodash';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Button, ConfirmModal, RadioButtonGroup } from '@grafana/ui';\n\nimport { CloudWatchDatasource } from '../datasource';\nimport {\n  CloudWatchMetricsQuery,\n  CloudWatchQuery,\n  CloudWatchQueryMode,\n  MetricEditorMode,\n  MetricQueryType,\n} from '../types';\nimport EditorHeader from './ui/EditorHeader';\nimport InlineSelect from './ui/InlineSelect';\nimport FlexItem from './ui/FlexItem';\nimport { useRegions } from '../hooks';\n\ninterface QueryHeaderProps {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  onChange: (query: CloudWatchQuery) => void;\n  onRunQuery: () => void;\n  sqlCodeEditorIsDirty: boolean;\n}\n\nconst apiModes: Array<SelectableValue<CloudWatchQueryMode>> = [\n  { label: 'CloudWatch Metrics', value: 'Metrics' },\n  { label: 'CloudWatch Logs', value: 'Logs' },\n];\n\nconst metricEditorModes: Array<SelectableValue<MetricQueryType>> = [\n  { label: 'Metric Search', value: MetricQueryType.Search },\n  { label: 'Metric Query', value: MetricQueryType.Query },\n];\n\nconst editorModes = [\n  { label: 'Builder', value: MetricEditorMode.Builder },\n  { label: 'Code', value: MetricEditorMode.Code },\n];\n\nconst QueryHeader: React.FC<QueryHeaderProps> = ({ query, sqlCodeEditorIsDirty, datasource, onChange, onRunQuery }) => {\n  const { metricEditorMode, metricQueryType, queryMode, region } = query;\n  const [showConfirm, setShowConfirm] = useState(false);\n\n  const [regions, regionIsLoading] = useRegions(datasource);\n\n  const onEditorModeChange = useCallback(\n    (newMetricEditorMode: MetricEditorMode) => {\n      if (\n        sqlCodeEditorIsDirty &&\n        metricQueryType === MetricQueryType.Query &&\n        metricEditorMode === MetricEditorMode.Code\n      ) {\n        setShowConfirm(true);\n        return;\n      }\n      onChange({ ...query, metricEditorMode: newMetricEditorMode });\n    },\n    [setShowConfirm, onChange, sqlCodeEditorIsDirty, query, metricEditorMode, metricQueryType]\n  );\n\n  const onQueryModeChange = ({ value }: SelectableValue<CloudWatchQueryMode>) => {\n    if (value !== queryMode) {\n      const commonProps = pick(query, 'id', 'region', 'namespace', 'refId', 'hide', 'key', 'queryType', 'datasource');\n\n      onChange({\n        ...commonProps,\n        queryMode: value,\n      });\n    }\n  };\n\n  return (\n    <EditorHeader>\n      <InlineSelect\n        label=\"Region\"\n        value={regions.find((v) => v.value === region)}\n        placeholder=\"Select region\"\n        allowCustomValue\n        onChange={({ value: region }) => region && onChange({ ...query, region: region })}\n        options={regions}\n        isLoading={regionIsLoading}\n      />\n\n      <InlineSelect value={queryMode} options={apiModes} onChange={onQueryModeChange} />\n\n      <InlineSelect\n        value={metricEditorModes.find((m) => m.value === metricQueryType)}\n        options={metricEditorModes}\n        onChange={({ value }) => {\n          onChange({ ...query, metricQueryType: value });\n        }}\n      />\n\n      <FlexItem grow={1} />\n\n      <RadioButtonGroup options={editorModes} size=\"sm\" value={metricEditorMode} onChange={onEditorModeChange} />\n\n      {query.metricQueryType === MetricQueryType.Query && query.metricEditorMode === MetricEditorMode.Code && (\n        <Button variant=\"secondary\" size=\"sm\" onClick={() => onRunQuery()}>\n          Run query\n        </Button>\n      )}\n\n      <ConfirmModal\n        isOpen={showConfirm}\n        title=\"Are you sure?\"\n        body=\"You will lose manual changes done to the query if you go back to the visual builder.\"\n        confirmText=\"Yes, I am sure.\"\n        dismissText=\"No, continue editing the query manually.\"\n        icon=\"exclamation-triangle\"\n        onConfirm={() => {\n          setShowConfirm(false);\n          onChange({ ...query, metricEditorMode: MetricEditorMode.Builder });\n        }}\n        onDismiss={() => setShowConfirm(false)}\n      />\n    </EditorHeader>\n  );\n};\n\nexport default QueryHeader;\n","import React, { PureComponent, ChangeEvent } from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\nimport { Input } from '@grafana/ui';\nimport {\n  CloudWatchQuery,\n  CloudWatchMetricsQuery,\n  CloudWatchJsonData,\n  MetricQueryType,\n  MetricEditorMode,\n} from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { Alias, MetricStatEditor, MathExpressionQueryField, SQLBuilderEditor, SQLCodeEditor } from './';\n\nimport EditorRow from './ui/EditorRow';\nimport EditorField from './ui/EditorField';\nimport { Space } from './ui/Space';\nimport QueryHeader from './QueryHeader';\nimport { isMetricsQuery } from '../guards';\n\nexport type Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>;\n\ninterface State {\n  sqlCodeEditorIsDirty: boolean;\n}\n\nexport const normalizeQuery = ({\n  namespace,\n  metricName,\n  expression,\n  dimensions,\n  region,\n  id,\n  alias,\n  statistic,\n  period,\n  sqlExpression,\n  metricQueryType,\n  metricEditorMode,\n  ...rest\n}: CloudWatchMetricsQuery): CloudWatchMetricsQuery => {\n  const normalizedQuery = {\n    queryMode: 'Metrics' as const,\n    namespace: namespace ?? '',\n    metricName: metricName ?? '',\n    expression: expression ?? '',\n    dimensions: dimensions ?? {},\n    region: region ?? 'default',\n    id: id ?? '',\n    alias: alias ?? '',\n    statistic: statistic ?? 'Average',\n    period: period ?? '',\n    metricQueryType: metricQueryType ?? MetricQueryType.Search,\n    metricEditorMode: metricEditorMode ?? MetricEditorMode.Builder,\n    sqlExpression: sqlExpression ?? '',\n    ...rest,\n  };\n  return !rest.hasOwnProperty('matchExact') ? { ...normalizedQuery, matchExact: true } : normalizedQuery;\n};\n\nexport class MetricsQueryEditor extends PureComponent<Props, State> {\n  state = {\n    sqlCodeEditorIsDirty: false,\n  };\n\n  componentDidMount = () => {\n    const metricsQuery = this.props.query as CloudWatchMetricsQuery;\n    const query = normalizeQuery(metricsQuery);\n    this.props.onChange(query);\n  };\n\n  onChange = (query: CloudWatchQuery) => {\n    const { onChange, onRunQuery } = this.props;\n    onChange(query);\n    onRunQuery();\n  };\n\n  render() {\n    const { onRunQuery, datasource } = this.props;\n    const metricsQuery = this.props.query as CloudWatchMetricsQuery;\n    const query = normalizeQuery(metricsQuery);\n\n    return (\n      <>\n        <QueryHeader\n          query={query}\n          onRunQuery={onRunQuery}\n          datasource={datasource}\n          onChange={(newQuery) => {\n            if (isMetricsQuery(newQuery) && newQuery.metricEditorMode !== query.metricEditorMode) {\n              this.setState({ sqlCodeEditorIsDirty: false });\n            }\n            this.onChange(newQuery);\n          }}\n          sqlCodeEditorIsDirty={this.state.sqlCodeEditorIsDirty}\n        />\n        <Space v={0.5} />\n\n        {query.metricQueryType === MetricQueryType.Search && (\n          <>\n            {query.metricEditorMode === MetricEditorMode.Builder && (\n              <MetricStatEditor {...{ ...this.props, query }}></MetricStatEditor>\n            )}\n            {query.metricEditorMode === MetricEditorMode.Code && (\n              <MathExpressionQueryField\n                onRunQuery={onRunQuery}\n                expression={query.expression ?? ''}\n                onChange={(expression) => this.props.onChange({ ...query, expression })}\n              ></MathExpressionQueryField>\n            )}\n          </>\n        )}\n        {query.metricQueryType === MetricQueryType.Query && (\n          <>\n            {query.metricEditorMode === MetricEditorMode.Code && (\n              <SQLCodeEditor\n                region={query.region}\n                sql={query.sqlExpression ?? ''}\n                onChange={(sqlExpression) => {\n                  if (!this.state.sqlCodeEditorIsDirty) {\n                    this.setState({ sqlCodeEditorIsDirty: true });\n                  }\n                  this.props.onChange({ ...metricsQuery, sqlExpression });\n                }}\n                onRunQuery={onRunQuery}\n                datasource={datasource}\n              />\n            )}\n\n            {query.metricEditorMode === MetricEditorMode.Builder && (\n              <>\n                <SQLBuilderEditor\n                  query={query}\n                  onChange={this.props.onChange}\n                  onRunQuery={onRunQuery}\n                  datasource={datasource}\n                ></SQLBuilderEditor>\n              </>\n            )}\n          </>\n        )}\n        <Space v={0.5} />\n        <EditorRow>\n          <EditorField\n            label=\"ID\"\n            width={26}\n            optional\n            tooltip=\"ID can be used to reference other queries in math expressions. The ID can include numbers, letters, and underscore, and must start with a lowercase letter.\"\n          >\n            <Input\n              onBlur={onRunQuery}\n              onChange={(event: ChangeEvent<HTMLInputElement>) =>\n                this.onChange({ ...metricsQuery, id: event.target.value })\n              }\n              type=\"text\"\n              invalid={!!query.id && !/^$|^[a-z][a-zA-Z0-9_]*$/.test(query.id)}\n              value={query.id}\n            />\n          </EditorField>\n\n          <EditorField label=\"Period\" width={26} tooltip=\"Minimum interval between points in seconds.\">\n            <Input\n              value={query.period || ''}\n              placeholder=\"auto\"\n              onBlur={onRunQuery}\n              onChange={(event: ChangeEvent<HTMLInputElement>) =>\n                this.onChange({ ...metricsQuery, period: event.target.value })\n              }\n            />\n          </EditorField>\n\n          <EditorField\n            label=\"Alias\"\n            width={26}\n            optional\n            tooltip=\"Change time series legend name using this field. See documentation for replacement variable formats.\"\n          >\n            <Alias\n              value={metricsQuery.alias ?? ''}\n              onChange={(value: string) => this.onChange({ ...metricsQuery, alias: value })}\n            />\n          </EditorField>\n        </EditorRow>\n      </>\n    );\n  }\n}\n","import { CloudWatchMetricsQuery, CloudWatchQuery } from './types';\n\nexport const isMetricsQuery = (query: CloudWatchQuery): query is CloudWatchMetricsQuery => {\n  return query.queryMode === 'Metrics';\n};\n","import React, { PureComponent } from 'react';\nimport { pick } from 'lodash';\nimport { QueryEditorProps, ExploreMode } from '@grafana/data';\nimport { Segment } from '@grafana/ui';\nimport { CloudWatchJsonData, CloudWatchQuery } from '../types';\nimport { CloudWatchDatasource } from '../datasource';\nimport { QueryInlineField } from './';\nimport { MetricsQueryEditor } from './MetricsQueryEditor';\nimport LogsQueryEditor from './LogsQueryEditor';\n\nexport type Props = QueryEditorProps<CloudWatchDatasource, CloudWatchQuery, CloudWatchJsonData>;\n\nconst apiModes = {\n  Metrics: { label: 'CloudWatch Metrics', value: 'Metrics' },\n  Logs: { label: 'CloudWatch Logs', value: 'Logs' },\n};\n\nexport class PanelQueryEditor extends PureComponent<Props> {\n  render() {\n    const { query } = this.props;\n    const apiMode = query.queryMode ?? 'Metrics';\n\n    return (\n      <>\n        {/* TODO: Remove this in favor of the QueryHeader */}\n        {apiMode === ExploreMode.Logs && (\n          <QueryInlineField label=\"Query Mode\">\n            <Segment\n              value={apiModes[apiMode]}\n              options={Object.values(apiModes)}\n              onChange={({ value }) => {\n                const newMode = (value as 'Metrics' | 'Logs') ?? 'Metrics';\n                if (newMode !== apiModes[apiMode].value) {\n                  const commonProps = pick(\n                    query,\n                    'id',\n                    'region',\n                    'namespace',\n                    'refId',\n                    'hide',\n                    'key',\n                    'queryType',\n                    'datasource'\n                  );\n\n                  this.props.onChange({\n                    ...commonProps,\n                    queryMode: newMode,\n                  } as CloudWatchQuery);\n                }\n              }}\n            />\n          </QueryInlineField>\n        )}\n        {apiMode === ExploreMode.Logs ? (\n          <LogsQueryEditor {...this.props} allowCustomValue />\n        ) : (\n          <MetricsQueryEditor {...this.props} />\n        )}\n      </>\n    );\n  }\n}\n","import { Button } from '@grafana/ui';\nimport React, { Fragment } from 'react';\nimport Stack from './Stack';\n\ninterface EditorListProps<T> {\n  items: T[];\n  renderItem: (item: Partial<T>, onChangeItem: (item: T) => void, onDeleteItem: () => void) => React.ReactElement;\n  onChange: (items: Array<Partial<T>>) => void;\n}\n\nfunction EditorList<T>({ items, renderItem, onChange }: EditorListProps<T>) {\n  const onAddItem = () => {\n    const newItems = [...items, {}];\n\n    onChange(newItems);\n  };\n\n  const onChangeItem = (itemIndex: number, newItem: T) => {\n    const newItems = [...items];\n    newItems[itemIndex] = newItem;\n    onChange(newItems);\n  };\n\n  const onDeleteItem = (itemIndex: number) => {\n    const newItems = [...items];\n    newItems.splice(itemIndex, 1);\n    onChange(newItems);\n  };\n\n  return (\n    <Stack>\n      {items.map((item, index) => (\n        <Fragment key={index}>\n          {renderItem(\n            item,\n            (newItem) => onChangeItem(index, newItem),\n            () => onDeleteItem(index)\n          )}\n        </Fragment>\n      ))}\n      <Button onClick={onAddItem} variant=\"secondary\" size=\"md\" icon=\"plus\" aria-label=\"Add\" />\n    </Stack>\n  );\n}\n\nexport default EditorList;\n","import React from 'react';\nimport { css } from '@emotion/css';\nimport { stylesFactory, useTheme2 } from '@grafana/ui';\nimport { GrafanaTheme2 } from '@grafana/data';\n\ninterface InputGroupProps {}\n\nconst InputGroup: React.FC<InputGroupProps> = ({ children }) => {\n  const theme = useTheme2();\n  const styles = useStyles(theme);\n\n  return <div className={styles.root}>{children}</div>;\n};\n\nconst useStyles = stylesFactory((theme: GrafanaTheme2) => ({\n  root: css({\n    display: 'flex',\n\n    // Style the direct children of the component\n    '> *': {\n      '&:not(:first-child)': {\n        // Negative margin hides the double-border on adjacent selects\n        marginLeft: -1,\n      },\n\n      '&:first-child': {\n        borderTopRightRadius: 0,\n        borderBottomRightRadius: 0,\n      },\n\n      '&:last-child': {\n        borderTopLeftRadius: 0,\n        borderBottomLeftRadius: 0,\n      },\n\n      '&:not(:first-child):not(:last-child)': {\n        borderRadius: 0,\n      },\n\n      position: 'relative',\n      zIndex: 1,\n\n      '&:hover': {\n        zIndex: 2,\n      },\n      '&:focus-within': {\n        zIndex: 2,\n      },\n    },\n  }),\n}));\n\nexport default InputGroup;\n","import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '@grafana/ui';\nimport { Button, ButtonProps } from '@grafana/ui/src/components/Button';\nimport React from 'react';\n\ninterface AccessoryButtonProps extends ButtonProps {}\n\nconst AccessoryButton: React.FC<AccessoryButtonProps> = ({ className, ...props }) => {\n  const theme = useTheme2();\n  const styles = getButtonStyles(theme);\n\n  return <Button {...props} className={cx(className, styles.button)} />;\n};\n\nconst getButtonStyles = stylesFactory((theme: GrafanaTheme2) => ({\n  button: css({\n    paddingLeft: theme.spacing(3 / 2),\n    paddingRight: theme.spacing(3 / 2),\n  }),\n}));\n\nexport default AccessoryButton;\n","import React, { FunctionComponent, useMemo } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { Select, stylesFactory, useTheme2 } from '@grafana/ui';\n\nimport { useAsyncFn } from 'react-use';\nimport { GrafanaTheme2, SelectableValue, toOption } from '@grafana/data';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchMetricsQuery, Dimensions } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\nimport { DimensionFilterCondition } from './Dimensions';\nimport InputGroup from '../ui/InputGroup';\nimport AccessoryButton from '../ui/AccessoryButton';\n\nexport interface Props {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  filter: DimensionFilterCondition;\n  dimensionKeys: Array<SelectableValue<string>>;\n  disableExpressions: boolean;\n  onChange: (value: DimensionFilterCondition) => void;\n  onDelete: () => void;\n}\n\nconst wildcardOption = { value: '*', label: '*' };\n\nconst excludeCurrentKey = (dimensions: Dimensions, currentKey: string | undefined) =>\n  Object.entries(dimensions ?? {}).reduce<Dimensions>((acc, [key, value]) => {\n    if (key !== currentKey) {\n      return { ...acc, [key]: value };\n    }\n    return acc;\n  }, {});\n\nexport const FilterItem: FunctionComponent<Props> = ({\n  filter,\n  query: { region, namespace, metricName, dimensions },\n  datasource,\n  dimensionKeys,\n  disableExpressions,\n  onChange,\n  onDelete,\n}) => {\n  const dimensionsExcludingCurrentKey = useMemo(() => excludeCurrentKey(dimensions ?? {}, filter.key), [\n    dimensions,\n    filter,\n  ]);\n\n  const loadDimensionValues = async () => {\n    if (!filter.key) {\n      return [];\n    }\n\n    return datasource\n      .getDimensionValues(region, namespace, metricName, filter.key, dimensionsExcludingCurrentKey)\n      .then((result: Array<SelectableValue<string>>) => {\n        if (result.length && !disableExpressions) {\n          result.unshift(wildcardOption);\n        }\n        return appendTemplateVariables(datasource, result);\n      });\n  };\n\n  const [state, loadOptions] = useAsyncFn(loadDimensionValues, [filter.key, dimensions]);\n  const theme = useTheme2();\n  const styles = getOperatorStyles(theme);\n\n  return (\n    <div data-testid=\"cloudwatch-dimensions-filter-item\">\n      <InputGroup>\n        <Select\n          inputId=\"cloudwatch-dimensions-filter-item-key\"\n          width=\"auto\"\n          value={filter.key ? toOption(filter.key) : null}\n          allowCustomValue\n          options={dimensionKeys}\n          onChange={(change) => {\n            if (change.label) {\n              onChange({ key: change.label, value: undefined });\n            }\n          }}\n        />\n\n        <span className={cx(styles.root)}>=</span>\n\n        <Select\n          inputId=\"cloudwatch-dimensions-filter-item-value\"\n          onOpenMenu={loadOptions}\n          width=\"auto\"\n          value={filter.value ? toOption(filter.value) : null}\n          allowCustomValue\n          isLoading={state.loading}\n          options={state.value}\n          onChange={(change) => {\n            if (change.value) {\n              onChange({ ...filter, value: change.value });\n            }\n          }}\n        />\n        <AccessoryButton aria-label=\"remove\" icon=\"times\" variant=\"secondary\" onClick={onDelete} />\n      </InputGroup>\n    </div>\n  );\n};\n\nconst getOperatorStyles = stylesFactory((theme: GrafanaTheme2) => ({\n  root: css({\n    padding: theme.spacing(0, 1),\n    alignSelf: 'center',\n  }),\n}));\n","import React, { useMemo, useState } from 'react';\nimport { isEqual } from 'lodash';\nimport { SelectableValue } from '@grafana/data';\nimport { Dimensions as DimensionsType, CloudWatchMetricsQuery } from '../../types';\nimport EditorList from '../ui/EditorList';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { FilterItem } from './FilterItem';\n\nexport interface Props {\n  query: CloudWatchMetricsQuery;\n  onChange: (dimensions: DimensionsType) => void;\n  datasource: CloudWatchDatasource;\n  dimensionKeys: Array<SelectableValue<string>>;\n  disableExpressions: boolean;\n}\n\nexport interface DimensionFilterCondition {\n  key?: string;\n  operator?: string;\n  value?: string;\n}\n\nconst dimensionsToFilterConditions = (dimensions: DimensionsType | undefined) =>\n  Object.entries(dimensions ?? {}).reduce<DimensionFilterCondition[]>((acc, [key, value]) => {\n    if (value && typeof value === 'string') {\n      const filter = {\n        key,\n        value,\n        operator: '=',\n      };\n      return [...acc, filter];\n    }\n    return acc;\n  }, []);\n\nconst filterConditionsToDimensions = (filters: DimensionFilterCondition[]) => {\n  return filters.reduce<DimensionsType>((acc, { key, value }) => {\n    if (key && value) {\n      return { ...acc, [key]: value };\n    }\n    return acc;\n  }, {});\n};\n\nexport const Dimensions: React.FC<Props> = ({ query, datasource, dimensionKeys, disableExpressions, onChange }) => {\n  const dimensionFilters = useMemo(() => dimensionsToFilterConditions(query.dimensions), [query.dimensions]);\n  const [items, setItems] = useState<DimensionFilterCondition[]>(dimensionFilters);\n  const onDimensionsChange = (newItems: Array<Partial<DimensionFilterCondition>>) => {\n    setItems(newItems);\n\n    // The onChange event should only be triggered in the case there is a complete dimension object.\n    // So when a new key is added that does not yet have a value, it should not trigger an onChange event.\n    const newDimensions = filterConditionsToDimensions(newItems);\n    if (!isEqual(newDimensions, query.dimensions)) {\n      onChange(newDimensions);\n    }\n  };\n\n  return (\n    <EditorList\n      items={items}\n      onChange={onDimensionsChange}\n      renderItem={makeRenderFilter(datasource, query, dimensionKeys, disableExpressions)}\n    />\n  );\n};\n\nfunction makeRenderFilter(\n  datasource: CloudWatchDatasource,\n  query: CloudWatchMetricsQuery,\n  dimensionKeys: Array<SelectableValue<string>>,\n  disableExpressions: boolean\n) {\n  function renderFilter(\n    item: DimensionFilterCondition,\n    onChange: (item: DimensionFilterCondition) => void,\n    onDelete: () => void\n  ) {\n    return (\n      <FilterItem\n        filter={item}\n        onChange={(item) => onChange(item)}\n        datasource={datasource}\n        query={query}\n        disableExpressions={disableExpressions}\n        dimensionKeys={dimensionKeys}\n        onDelete={onDelete}\n      />\n    );\n  }\n\n  return renderFilter;\n}\n","import React, { InputHTMLAttributes, FunctionComponent } from 'react';\nimport { InlineFormLabel } from '@grafana/ui';\n\nexport interface Props extends InputHTMLAttributes<HTMLInputElement> {\n  label: string;\n  tooltip?: string;\n  children?: React.ReactNode;\n}\n\nexport const QueryField: FunctionComponent<Partial<Props>> = ({ label, tooltip, children }) => (\n  <>\n    <InlineFormLabel width={8} className=\"query-keyword\" tooltip={tooltip}>\n      {label}\n    </InlineFormLabel>\n    {children}\n  </>\n);\n\nexport const QueryInlineField: FunctionComponent<Props> = ({ ...props }) => {\n  return (\n    <div className={'gf-form-inline'}>\n      <QueryField {...props} />\n      <div className=\"gf-form gf-form--grow\">\n        <div className=\"gf-form-label gf-form-label--grow\" />\n      </div>\n    </div>\n  );\n};\n","import React, { FunctionComponent, useState } from 'react';\nimport { debounce } from 'lodash';\nimport { Input } from '@grafana/ui';\n\nexport interface Props {\n  onChange: (alias: any) => void;\n  value: string;\n}\n\nexport const Alias: FunctionComponent<Props> = ({ value = '', onChange }) => {\n  const [alias, setAlias] = useState(value);\n\n  const propagateOnChange = debounce(onChange, 1500);\n\n  onChange = (e: any) => {\n    setAlias(e.target.value);\n    propagateOnChange(e.target.value);\n  };\n\n  return <Input type=\"text\" value={alias} onChange={onChange} />;\n};\n","export enum QueryEditorPropertyType {\n  String = 'string',\n}\n\nexport interface QueryEditorProperty {\n  type: QueryEditorPropertyType;\n  name?: string;\n}\n\nexport type QueryEditorOperatorType = string | boolean | number;\ntype QueryEditorOperatorValueType = QueryEditorOperatorType | QueryEditorOperatorType[];\n\nexport interface QueryEditorOperator<T extends QueryEditorOperatorValueType> {\n  name?: string;\n  value?: T;\n}\n\nexport interface QueryEditorOperatorExpression {\n  type: QueryEditorExpressionType.Operator;\n  property: QueryEditorProperty;\n  operator: QueryEditorOperator<QueryEditorOperatorValueType>;\n}\n\nexport interface QueryEditorArrayExpression {\n  type: QueryEditorExpressionType.And | QueryEditorExpressionType.Or;\n  expressions: QueryEditorExpression[] | QueryEditorArrayExpression[];\n}\n\nexport interface QueryEditorPropertyExpression {\n  type: QueryEditorExpressionType.Property;\n  property: QueryEditorProperty;\n}\n\nexport enum QueryEditorExpressionType {\n  Property = 'property',\n  Operator = 'operator',\n  Or = 'or',\n  And = 'and',\n  GroupBy = 'groupBy',\n  Function = 'function',\n  FunctionParameter = 'functionParameter',\n}\n\nexport type QueryEditorExpression =\n  | QueryEditorArrayExpression\n  | QueryEditorPropertyExpression\n  | QueryEditorGroupByExpression\n  | QueryEditorFunctionExpression\n  | QueryEditorFunctionParameterExpression\n  | QueryEditorOperatorExpression;\n\nexport interface QueryEditorGroupByExpression {\n  type: QueryEditorExpressionType.GroupBy;\n  property: QueryEditorProperty;\n}\n\nexport interface QueryEditorFunctionExpression {\n  type: QueryEditorExpressionType.Function;\n  name?: string;\n  parameters?: QueryEditorFunctionParameterExpression[];\n}\n\nexport interface QueryEditorFunctionParameterExpression {\n  type: QueryEditorExpressionType.FunctionParameter;\n  name?: string;\n}\n","import { SelectableValue } from './../../../../../../../packages/grafana-data/src/types/select';\nimport { SCHEMA } from '../../cloudwatch-sql/language';\nimport {\n  QueryEditorExpressionType,\n  QueryEditorPropertyType,\n  QueryEditorFunctionParameterExpression,\n  QueryEditorArrayExpression,\n  QueryEditorOperatorExpression,\n  QueryEditorGroupByExpression,\n} from '../../expressions';\nimport { SQLExpression, CloudWatchMetricsQuery, Dimensions } from '../../types';\n\nexport function getMetricNameFromExpression(selectExpression: SQLExpression['select']): string | undefined {\n  return selectExpression?.parameters?.[0].name;\n}\n\nexport function getNamespaceFromExpression(fromExpression: SQLExpression['from']): string | undefined {\n  // It's just a simple `FROM \"AWS/EC2\"` expression\n  if (fromExpression?.type === QueryEditorExpressionType.Property) {\n    return fromExpression.property.name; // PR TODO: do we need to test the type here? It can only be string?\n  }\n\n  // It's a more complicated `FROM SCHEMA(\"AWS/EC2\", ...)` expression\n  if (fromExpression?.type === QueryEditorExpressionType.Function) {\n    // TODO: do we need to test the name of the function?\n    return fromExpression.parameters?.[0].name;\n  }\n\n  return undefined;\n}\n\nexport function getSchemaLabelKeys(fromExpression: SQLExpression['from']): string[] | undefined {\n  // Schema label keys are second to n arguments in the from expression function\n  if (fromExpression?.type === QueryEditorExpressionType.Function && fromExpression?.parameters?.length) {\n    if (fromExpression?.parameters?.length <= 1) {\n      return [];\n    }\n\n    // ignore the first arg (the namespace)\n    const paramExpressions = fromExpression?.parameters.slice(1);\n    return paramExpressions.reduce<string[]>((acc, curr) => (curr.name ? [...acc, curr.name] : acc), []);\n  }\n\n  return undefined;\n}\n\nexport function isUsingWithSchema(fromExpression: SQLExpression['from']): boolean {\n  return fromExpression?.type === QueryEditorExpressionType.Function && fromExpression.name === SCHEMA;\n}\n\n/** Given a partial operator expression, return a non-partial if it's valid, or undefined */\nexport function sanitizeOperator(\n  expression: Partial<QueryEditorOperatorExpression>\n): QueryEditorOperatorExpression | undefined {\n  const key = expression.property?.name;\n  const value = expression.operator?.value;\n  const operator = expression.operator?.name;\n\n  if (key && value && operator) {\n    return {\n      type: QueryEditorExpressionType.Operator,\n      property: {\n        type: QueryEditorPropertyType.String,\n        name: key,\n      },\n      operator: {\n        value,\n        name: operator,\n      },\n    };\n  }\n\n  return undefined;\n}\n\n/**\n * Given an array of Expressions, flattens them to the leaf Operator expressions.\n * Note, this loses context of any nested ANDs or ORs, so will not be useful once we support nested conditions */\nfunction flattenOperatorExpressions(\n  expressions: QueryEditorArrayExpression['expressions']\n): QueryEditorOperatorExpression[] {\n  return expressions.flatMap((expression) => {\n    if (expression.type === QueryEditorExpressionType.Operator) {\n      return expression;\n    }\n\n    if (expression.type === QueryEditorExpressionType.And || expression.type === QueryEditorExpressionType.Or) {\n      return flattenOperatorExpressions(expression.expressions);\n    }\n\n    // Expressions that we don't expect to find in the WHERE filter will be ignored\n    return [];\n  });\n}\n\n/** Returns a flattened list of WHERE filters, losing all context of nested filters or AND vs OR. Not suitable\n * if the UI supports nested conditions\n */\nexport function getFlattenedFilters(sql: SQLExpression): QueryEditorOperatorExpression[] {\n  const where = sql.where;\n  return flattenOperatorExpressions(where?.expressions ?? []);\n}\n\n/**\n * Given an array of Expressions, flattens them to the leaf Operator expressions.\n * Note, this loses context of any nested ANDs or ORs, so will not be useful once we support nested conditions */\nfunction flattenGroupByExpressions(\n  expressions: QueryEditorArrayExpression['expressions']\n): QueryEditorGroupByExpression[] {\n  return expressions.flatMap((expression) => {\n    if (expression.type === QueryEditorExpressionType.GroupBy) {\n      return expression;\n    }\n\n    // Expressions that we don't expect to find in the GROUP BY will be ignored\n    return [];\n  });\n}\n\n/** Returns a flattened list of GROUP BY expressions, losing all context of nested filters or AND vs OR.\n */\nexport function getFlattenedGroupBys(sql: SQLExpression): QueryEditorGroupByExpression[] {\n  const groupBy = sql.groupBy;\n  return flattenGroupByExpressions(groupBy?.expressions ?? []);\n}\n\n/** Converts a string array to a Dimensions object with null values  **/\nexport function stringArrayToDimensions(arr: string[]): Dimensions {\n  return arr.reduce((acc, curr) => {\n    if (curr) {\n      return { ...acc, [curr]: null };\n    }\n    return acc;\n  }, {});\n}\n\nexport function setSql(query: CloudWatchMetricsQuery, sql: SQLExpression): CloudWatchMetricsQuery {\n  return {\n    ...query,\n    sql: {\n      ...(query.sql ?? {}),\n      ...sql,\n    },\n  };\n}\n\nexport function setNamespace(query: CloudWatchMetricsQuery, namespace: string | undefined): CloudWatchMetricsQuery {\n  const sql = query.sql ?? {};\n\n  if (namespace === undefined) {\n    return setSql(query, {\n      from: undefined,\n    });\n  }\n\n  // It's just a simple `FROM \"AWS/EC2\"` expression\n  if (!sql.from || sql.from.type === QueryEditorExpressionType.Property) {\n    return setSql(query, {\n      from: {\n        type: QueryEditorExpressionType.Property,\n        property: {\n          type: QueryEditorPropertyType.String,\n          name: namespace,\n        },\n      },\n    });\n  }\n\n  // It's a more complicated `FROM SCHEMA(\"AWS/EC2\", ...)` expression\n  if (sql.from.type === QueryEditorExpressionType.Function) {\n    const namespaceParam: QueryEditorFunctionParameterExpression = {\n      type: QueryEditorExpressionType.FunctionParameter,\n      name: namespace,\n    };\n\n    const labelKeys = (sql.from.parameters ?? []).slice(1);\n\n    return setSql(query, {\n      from: {\n        type: QueryEditorExpressionType.Function,\n        name: SCHEMA,\n        parameters: [namespaceParam, ...labelKeys],\n      },\n    });\n  }\n\n  // TODO: do the with schema bit\n  return query;\n}\n\nexport function setSchemaLabels(\n  query: CloudWatchMetricsQuery,\n  schemaLabels: Array<SelectableValue<string>> | SelectableValue<string>\n): CloudWatchMetricsQuery {\n  const sql = query.sql ?? {};\n  schemaLabels = Array.isArray(schemaLabels) ? schemaLabels.map((l) => l.value) : [schemaLabels.value];\n\n  // schema labels are the second parameter in the schema function. `... FROM SCHEMA(\"AWS/EC2\", label1, label2 ...)`\n  if (sql.from?.type === QueryEditorExpressionType.Function && sql.from.parameters?.length) {\n    const parameters: QueryEditorFunctionParameterExpression[] = (schemaLabels ?? []).map((label: string) => ({\n      type: QueryEditorExpressionType.FunctionParameter,\n      name: label,\n    }));\n    const namespaceParam = (sql.from.parameters ?? [])[0];\n\n    return setSql(query, {\n      from: {\n        type: QueryEditorExpressionType.Function,\n        name: SCHEMA,\n        parameters: [namespaceParam, ...parameters],\n      },\n    });\n  }\n\n  return query;\n}\n\nexport function setMetricName(query: CloudWatchMetricsQuery, metricName: string): CloudWatchMetricsQuery {\n  const param: QueryEditorFunctionParameterExpression = {\n    type: QueryEditorExpressionType.FunctionParameter,\n    name: metricName,\n  };\n\n  return setSql(query, {\n    select: {\n      type: QueryEditorExpressionType.Function,\n      ...(query.sql?.select ?? {}),\n      parameters: [param],\n    },\n  });\n}\n\nexport function setAggregation(query: CloudWatchMetricsQuery, aggregation: string): CloudWatchMetricsQuery {\n  return setSql(query, {\n    select: {\n      type: QueryEditorExpressionType.Function,\n      ...(query.sql?.select ?? {}),\n      name: aggregation,\n    },\n  });\n}\n\nexport function setOrderBy(query: CloudWatchMetricsQuery, aggregation: string): CloudWatchMetricsQuery {\n  return setSql(query, {\n    orderBy: {\n      type: QueryEditorExpressionType.Function,\n      name: aggregation,\n    },\n  });\n}\n\nexport function setWithSchema(query: CloudWatchMetricsQuery, withSchema: boolean): CloudWatchMetricsQuery {\n  const namespace = getNamespaceFromExpression((query.sql ?? {}).from);\n\n  if (withSchema) {\n    const namespaceParam: QueryEditorFunctionParameterExpression = {\n      type: QueryEditorExpressionType.FunctionParameter,\n      name: namespace,\n    };\n\n    return setSql(query, {\n      from: {\n        type: QueryEditorExpressionType.Function,\n        name: SCHEMA,\n        parameters: [namespaceParam],\n      },\n    });\n  }\n\n  return setSql(query, {\n    from: {\n      type: QueryEditorExpressionType.Property,\n      property: {\n        type: QueryEditorPropertyType.String,\n        name: namespace,\n      },\n    },\n  });\n}\n\n/** Sets the left hand side (InstanceId) in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionProperty(\n  expression: Partial<QueryEditorOperatorExpression>,\n  property: string\n): QueryEditorOperatorExpression {\n  return {\n    type: QueryEditorExpressionType.Operator,\n    property: {\n      type: QueryEditorPropertyType.String,\n      name: property,\n    },\n    operator: expression.operator ?? {},\n  };\n}\n\n/** Sets the operator (\"==\") in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionName(\n  expression: Partial<QueryEditorOperatorExpression>,\n  name: string\n): QueryEditorOperatorExpression {\n  return {\n    type: QueryEditorExpressionType.Operator,\n    property: expression.property ?? {\n      type: QueryEditorPropertyType.String,\n    },\n    operator: {\n      ...expression.operator,\n      name,\n    },\n  };\n}\n\n/** Sets the right hand side (\"i-abc123445\") in an OperatorExpression\n * Accepts a partial expression to use in an editor\n */\nexport function setOperatorExpressionValue(\n  expression: Partial<QueryEditorOperatorExpression>,\n  value: string\n): QueryEditorOperatorExpression {\n  return {\n    type: QueryEditorExpressionType.Operator,\n    property: expression.property ?? {\n      type: QueryEditorPropertyType.String,\n    },\n    operator: {\n      ...expression.operator,\n      value,\n    },\n  };\n}\n\n/** Creates a GroupByExpression for a specified field\n */\nexport function setGroupByField(field: string): QueryEditorGroupByExpression {\n  return {\n    type: QueryEditorExpressionType.GroupBy,\n    property: {\n      type: QueryEditorPropertyType.String,\n      name: field,\n    },\n  };\n}\n","import { SelectableValue, toOption } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport React, { useMemo, useState } from 'react';\nimport { useAsyncFn } from 'react-use';\nimport { COMPARISON_OPERATORS, EQUALS } from '../../cloudwatch-sql/language';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { QueryEditorExpressionType, QueryEditorOperatorExpression, QueryEditorPropertyType } from '../../expressions';\nimport { useDimensionKeys } from '../../hooks';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\nimport AccessoryButton from '../ui/AccessoryButton';\nimport EditorList from '../ui/EditorList';\nimport InputGroup from '../ui/InputGroup';\nimport {\n  getFlattenedFilters,\n  getMetricNameFromExpression,\n  getNamespaceFromExpression,\n  sanitizeOperator,\n  setOperatorExpressionName,\n  setOperatorExpressionProperty,\n  setOperatorExpressionValue,\n  setSql,\n} from './utils';\n\ninterface SQLFilterProps {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst OPERATORS = COMPARISON_OPERATORS.map(toOption);\n\nconst SQLFilter: React.FC<SQLFilterProps> = ({ query, onQueryChange, datasource }) => {\n  const filtersFromQuery = useMemo(() => getFlattenedFilters(query.sql ?? {}), [query.sql]);\n  const [filters, setFilters] = useState<QueryEditorOperatorExpression[]>(filtersFromQuery);\n\n  const onChange = (newItems: Array<Partial<QueryEditorOperatorExpression>>) => {\n    // As new (empty object) items come in, with need to make sure they have the correct type\n    const cleaned = newItems.map(\n      (v): QueryEditorOperatorExpression => ({\n        type: QueryEditorExpressionType.Operator,\n        property: v.property ?? { type: QueryEditorPropertyType.String },\n        operator: v.operator ?? {\n          name: EQUALS,\n        },\n      })\n    );\n\n    setFilters(cleaned);\n\n    // Only save valid and complete filters into the query state\n    const validExpressions: QueryEditorOperatorExpression[] = [];\n    for (const operatorExpression of cleaned) {\n      const validated = sanitizeOperator(operatorExpression);\n      if (validated) {\n        validExpressions.push(validated);\n      }\n    }\n\n    const where = validExpressions.length\n      ? {\n          type: QueryEditorExpressionType.And as const,\n          expressions: validExpressions,\n        }\n      : undefined;\n\n    onQueryChange(setSql(query, { where }));\n  };\n\n  return <EditorList items={filters} onChange={onChange} renderItem={makeRenderFilter(datasource, query)} />;\n};\n\n// Making component functions in the render body is not recommended, but it works for now.\n// If some problems arise (perhaps with state going missing), consider this to be a potential cause\nfunction makeRenderFilter(datasource: CloudWatchDatasource, query: CloudWatchMetricsQuery) {\n  function renderFilter(\n    item: Partial<QueryEditorOperatorExpression>,\n    onChange: (item: QueryEditorOperatorExpression) => void,\n    onDelete: () => void\n  ) {\n    return <FilterItem datasource={datasource} query={query} filter={item} onChange={onChange} onDelete={onDelete} />;\n  }\n\n  return renderFilter;\n}\n\nexport default SQLFilter;\n\ninterface FilterItemProps {\n  datasource: CloudWatchDatasource;\n  query: CloudWatchMetricsQuery;\n  filter: Partial<QueryEditorOperatorExpression>;\n  onChange: (item: QueryEditorOperatorExpression) => void;\n  onDelete: () => void;\n}\n\nconst FilterItem: React.FC<FilterItemProps> = (props) => {\n  const { datasource, query, filter, onChange, onDelete } = props;\n  const sql = query.sql ?? {};\n\n  const namespace = getNamespaceFromExpression(sql.from);\n  const metricName = getMetricNameFromExpression(sql.select);\n\n  const dimensionKeys = useDimensionKeys(datasource, query.region, namespace, metricName);\n\n  const loadDimensionValues = async () => {\n    if (!filter.property?.name) {\n      return [];\n    }\n\n    return datasource\n      .getDimensionValues(query.region, namespace, metricName, filter.property.name, {})\n      .then((result: Array<SelectableValue<string>>) => {\n        return appendTemplateVariables(datasource, result);\n      });\n  };\n\n  const [state, loadOptions] = useAsyncFn(loadDimensionValues, [\n    query.region,\n    namespace,\n    metricName,\n    filter.property?.name,\n  ]);\n\n  return (\n    <InputGroup>\n      <Select\n        width=\"auto\"\n        value={filter.property?.name ? toOption(filter.property?.name) : null}\n        options={dimensionKeys}\n        allowCustomValue\n        onChange={({ value }) => value && onChange(setOperatorExpressionProperty(filter, value))}\n        menuShouldPortal\n      />\n\n      <Select\n        width=\"auto\"\n        value={filter.operator?.name && toOption(filter.operator.name)}\n        options={OPERATORS}\n        onChange={({ value }) => value && onChange(setOperatorExpressionName(filter, value))}\n        menuShouldPortal\n      />\n\n      <Select\n        width=\"auto\"\n        isLoading={state.loading}\n        value={\n          filter.operator?.value && typeof filter.operator?.value === 'string' ? toOption(filter.operator?.value) : null\n        }\n        options={state.value}\n        allowCustomValue\n        onOpenMenu={loadOptions}\n        onChange={({ value }) => value && onChange(setOperatorExpressionValue(filter, value))}\n        menuShouldPortal\n      />\n\n      <AccessoryButton aria-label=\"remove\" icon=\"times\" variant=\"secondary\" onClick={onDelete} />\n    </InputGroup>\n  );\n};\n","import { SelectableValue, toOption } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport React, { useMemo, useState } from 'react';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { QueryEditorExpressionType, QueryEditorGroupByExpression, QueryEditorPropertyType } from '../../expressions';\nimport { useDimensionKeys } from '../../hooks';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport AccessoryButton from '../ui/AccessoryButton';\nimport EditorList from '../ui/EditorList';\nimport InputGroup from '../ui/InputGroup';\nimport {\n  getFlattenedGroupBys,\n  getMetricNameFromExpression,\n  getNamespaceFromExpression,\n  setGroupByField,\n  setSql,\n} from './utils';\n\ninterface SQLGroupByProps {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst SQLGroupBy: React.FC<SQLGroupByProps> = ({ query, datasource, onQueryChange }) => {\n  const sql = query.sql ?? {};\n  const groupBysFromQuery = useMemo(() => getFlattenedGroupBys(query.sql ?? {}), [query.sql]);\n  const [items, setItems] = useState<QueryEditorGroupByExpression[]>(groupBysFromQuery);\n\n  const namespace = getNamespaceFromExpression(sql.from);\n  const metricName = getMetricNameFromExpression(sql.select);\n\n  const baseOptions = useDimensionKeys(datasource, query.region, namespace, metricName);\n  const options = useMemo(\n    // Exclude options we've already selected\n    () => baseOptions.filter((option) => !groupBysFromQuery.some((v) => v.property.name === option.value)),\n    [baseOptions, groupBysFromQuery]\n  );\n\n  const onChange = (newItems: Array<Partial<QueryEditorGroupByExpression>>) => {\n    // As new (empty object) items come in, with need to make sure they have the correct type\n    const cleaned = newItems.map(\n      (v): QueryEditorGroupByExpression => ({\n        type: QueryEditorExpressionType.GroupBy,\n        property: {\n          type: QueryEditorPropertyType.String,\n          name: v.property?.name,\n        },\n      })\n    );\n\n    setItems(cleaned);\n\n    // Only save complete expressions into the query state;\n    const completeExpressions = cleaned.filter((v) => v.property?.name);\n\n    const groupBy = completeExpressions.length\n      ? {\n          type: QueryEditorExpressionType.And as const,\n          expressions: completeExpressions,\n        }\n      : undefined;\n\n    onQueryChange(setSql(query, { groupBy }));\n  };\n\n  return <EditorList items={items} onChange={onChange} renderItem={makeRenderItem(options)} />;\n};\n\nfunction makeRenderItem(options: Array<SelectableValue<string>>) {\n  function renderItem(\n    item: Partial<QueryEditorGroupByExpression>,\n    onChange: (item: QueryEditorGroupByExpression) => void,\n    onDelete: () => void\n  ) {\n    return <GroupByItem options={options} item={item} onChange={onChange} onDelete={onDelete} />;\n  }\n\n  return renderItem;\n}\n\ninterface GroupByItemProps {\n  options: Array<SelectableValue<string>>;\n  item: Partial<QueryEditorGroupByExpression>;\n  onChange: (item: QueryEditorGroupByExpression) => void;\n  onDelete: () => void;\n}\n\nconst GroupByItem: React.FC<GroupByItemProps> = (props) => {\n  const { options, item, onChange, onDelete } = props;\n  const fieldName = item.property?.name;\n\n  return (\n    <InputGroup>\n      <Select\n        width=\"auto\"\n        value={fieldName ? toOption(fieldName) : null}\n        options={options}\n        allowCustomValue\n        onChange={({ value }) => value && onChange(setGroupByField(value))}\n        menuShouldPortal\n      />\n\n      <AccessoryButton aria-label=\"remove\" icon=\"times\" variant=\"secondary\" onClick={onDelete} />\n    </InputGroup>\n  );\n};\n\nexport default SQLGroupBy;\n","import { toOption } from '@grafana/data';\nimport { Select, Switch } from '@grafana/ui';\nimport React, { useEffect, useMemo } from 'react';\nimport { STATISTICS } from '../../cloudwatch-sql/language';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { useDimensionKeys, useMetrics, useNamespaces } from '../../hooks';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\nimport EditorField from '../ui/EditorField';\nimport EditorFieldGroup from '../ui/EditorFieldGroup';\nimport {\n  stringArrayToDimensions,\n  getMetricNameFromExpression,\n  getNamespaceFromExpression,\n  getSchemaLabelKeys as getSchemaLabels,\n  isUsingWithSchema,\n  setAggregation,\n  setMetricName,\n  setNamespace,\n  setSchemaLabels,\n  setWithSchema,\n} from './utils';\n\ninterface SQLBuilderSelectRowProps {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst AGGREGATIONS = STATISTICS.map(toOption);\n\nconst SQLBuilderSelectRow: React.FC<SQLBuilderSelectRowProps> = ({ datasource, query, onQueryChange }) => {\n  const sql = query.sql ?? {};\n\n  const aggregation = sql.select?.name;\n  useEffect(() => {\n    if (!aggregation) {\n      onQueryChange(setAggregation(query, STATISTICS[0]));\n    }\n  }, [aggregation, onQueryChange, query]);\n\n  const metricName = getMetricNameFromExpression(sql.select);\n  const namespace = getNamespaceFromExpression(sql.from);\n  const schemaLabels = getSchemaLabels(sql.from);\n  const withSchemaEnabled = isUsingWithSchema(sql.from);\n\n  const namespaceOptions = useNamespaces(datasource);\n  const metricOptions = useMetrics(datasource, query.region, namespace);\n  const existingFilters = useMemo(() => stringArrayToDimensions(schemaLabels ?? []), [schemaLabels]);\n  const unusedDimensionKeys = useDimensionKeys(datasource, query.region, namespace, metricName, existingFilters);\n  const dimensionKeys = useMemo(\n    () => (schemaLabels?.length ? [...unusedDimensionKeys, ...schemaLabels.map(toOption)] : unusedDimensionKeys),\n    [unusedDimensionKeys, schemaLabels]\n  );\n\n  return (\n    <>\n      <EditorFieldGroup>\n        <EditorField label=\"Namespace\" width={16}>\n          <Select\n            value={namespace ? toOption(namespace) : null}\n            inputId={`${query.refId}-cloudwatch-sql-namespace`}\n            options={namespaceOptions}\n            allowCustomValue\n            onChange={({ value }) => value && onQueryChange(setNamespace(query, value))}\n            menuShouldPortal\n          />\n        </EditorField>\n\n        <EditorField label=\"With schema\">\n          <Switch\n            id={`${query.refId}-cloudwatch-sql-withSchema`}\n            value={withSchemaEnabled}\n            onChange={(ev) =>\n              ev.target instanceof HTMLInputElement && onQueryChange(setWithSchema(query, ev.target.checked))\n            }\n          />\n        </EditorField>\n\n        {withSchemaEnabled && (\n          <EditorField label=\"Schema labels\">\n            <Select\n              id={`${query.refId}-cloudwatch-sql-schema-label-keys`}\n              width=\"auto\"\n              isMulti={true}\n              disabled={!namespace}\n              value={schemaLabels ? schemaLabels.map(toOption) : null}\n              options={dimensionKeys}\n              allowCustomValue\n              onChange={(item) => item && onQueryChange(setSchemaLabels(query, item))}\n              menuShouldPortal\n            />\n          </EditorField>\n        )}\n      </EditorFieldGroup>\n\n      <EditorFieldGroup>\n        <EditorField label=\"Metric name\" width={16}>\n          <Select\n            value={metricName ? toOption(metricName) : null}\n            options={metricOptions}\n            allowCustomValue\n            onChange={({ value }) => value && onQueryChange(setMetricName(query, value))}\n            menuShouldPortal\n          />\n        </EditorField>\n\n        <EditorField label=\"Aggregation\" width={16}>\n          <Select\n            value={aggregation ? toOption(aggregation) : null}\n            options={appendTemplateVariables(datasource, AGGREGATIONS)}\n            onChange={({ value }) => value && onQueryChange(setAggregation(query, value))}\n            menuShouldPortal\n          />\n        </EditorField>\n      </EditorFieldGroup>\n    </>\n  );\n};\n\nexport default SQLBuilderSelectRow;\n","import { getTemplateSrv, TemplateSrv } from 'app/features/templating/template_srv';\nimport { SQLExpression } from '../types';\nimport {\n  QueryEditorArrayExpression,\n  QueryEditorExpression,\n  QueryEditorExpressionType,\n  QueryEditorFunctionExpression,\n  QueryEditorOperatorExpression,\n  QueryEditorPropertyExpression,\n} from '../expressions';\n\nexport default class SQLGenerator {\n  constructor(private templateSrv: TemplateSrv = getTemplateSrv()) {}\n\n  expressionToSqlQuery({\n    select,\n    from,\n    where,\n    groupBy,\n    orderBy,\n    orderByDirection,\n    limit,\n  }: SQLExpression): string | undefined {\n    if (!from || !select?.name || !select?.parameters?.length) {\n      return undefined;\n    }\n\n    let parts: string[] = [];\n    this.appendSelect(select, parts);\n    this.appendFrom(from, parts);\n    this.appendWhere(where, parts, true, where?.expressions?.length ?? 0);\n    this.appendGroupBy(groupBy, parts);\n    this.appendOrderBy(orderBy, orderByDirection, parts);\n    this.appendLimit(limit, parts);\n\n    return parts.join(' ');\n  }\n\n  private appendSelect(select: QueryEditorFunctionExpression | undefined, parts: string[]) {\n    parts.push('SELECT');\n    this.appendFunction(select, parts);\n  }\n\n  private appendFrom(from: QueryEditorPropertyExpression | QueryEditorFunctionExpression | undefined, parts: string[]) {\n    parts.push('FROM');\n    from?.type === QueryEditorExpressionType.Function\n      ? this.appendFunction(from, parts)\n      : parts.push(this.formatValue(from?.property?.name ?? ''));\n  }\n\n  private appendWhere(\n    filter: QueryEditorExpression | undefined,\n    parts: string[],\n    isTopLevelExpression: boolean,\n    topLevelExpressionsCount: number\n  ) {\n    if (!filter) {\n      return;\n    }\n\n    const hasChildExpressions = 'expressions' in filter && filter.expressions.length > 0;\n    if (isTopLevelExpression && hasChildExpressions) {\n      parts.push('WHERE');\n    }\n\n    if (filter.type === QueryEditorExpressionType.And) {\n      const andParts: string[] = [];\n      filter.expressions.map((exp) => this.appendWhere(exp, andParts, false, topLevelExpressionsCount));\n      if (andParts.length === 0) {\n        return;\n      }\n      const andCombined = andParts.join(' AND ');\n      const wrapInParentheses = !isTopLevelExpression && topLevelExpressionsCount > 1 && andParts.length > 1;\n      return parts.push(wrapInParentheses ? `(${andCombined})` : andCombined);\n    }\n\n    if (filter.type === QueryEditorExpressionType.Or) {\n      const orParts: string[] = [];\n      filter.expressions.map((exp) => this.appendWhere(exp, orParts, false, topLevelExpressionsCount));\n      if (orParts.length === 0) {\n        return;\n      }\n      const orCombined = orParts.join(' OR ');\n      const wrapInParentheses = !isTopLevelExpression && topLevelExpressionsCount > 1 && orParts.length > 1;\n      parts.push(wrapInParentheses ? `(${orCombined})` : orCombined);\n      return;\n    }\n\n    if (filter.type === QueryEditorExpressionType.Operator) {\n      return this.appendOperator(filter, parts);\n    }\n  }\n\n  private appendGroupBy(groupBy: QueryEditorArrayExpression | undefined, parts: string[]) {\n    const groupByParts: string[] = [];\n    for (const expression of groupBy?.expressions ?? []) {\n      if (expression?.type !== QueryEditorExpressionType.GroupBy || !expression.property.name) {\n        continue;\n      }\n      groupByParts.push(this.formatValue(expression.property.name));\n    }\n\n    if (groupByParts.length > 0) {\n      parts.push(`GROUP BY ${groupByParts.join(', ')}`);\n    }\n  }\n\n  private appendOrderBy(\n    orderBy: QueryEditorFunctionExpression | undefined,\n    orderByDirection: string | undefined,\n    parts: string[]\n  ) {\n    if (orderBy) {\n      parts.push('ORDER BY');\n      this.appendFunction(orderBy, parts);\n      parts.push(orderByDirection ?? 'ASC');\n    }\n  }\n\n  private appendLimit(limit: number | undefined, parts: string[]) {\n    limit && parts.push(`LIMIT ${limit}`);\n  }\n\n  private appendOperator(expression: QueryEditorOperatorExpression, parts: string[], prefix?: string) {\n    const { property, operator } = expression;\n\n    if (!property.name || !operator.name || !operator.value) {\n      return;\n    }\n\n    parts.push(`${this.formatValue(property.name)} ${operator.name} '${operator.value}'`);\n  }\n\n  private appendFunction(select: QueryEditorFunctionExpression | undefined, parts: string[]) {\n    if (!select?.name) {\n      return;\n    }\n\n    const params = (select.parameters ?? [])\n      .map((p) => p.name && this.formatValue(p.name))\n      .filter(Boolean)\n      .join(', ');\n\n    parts.push(`${select.name}(${params})`);\n  }\n\n  private formatValue(label: string): string {\n    const specialCharacters = /[/\\s\\.-]/; // slash, space, dot or dash\n\n    const interpolated = this.templateSrv.replace(label, {}, 'raw');\n    if (specialCharacters.test(interpolated)) {\n      return `\"${label}\"`;\n    }\n\n    return label;\n  }\n}\n","import { SelectableValue, toOption } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport React from 'react';\nimport { ASC, DESC, STATISTICS } from '../../cloudwatch-sql/language';\nimport { CloudWatchDatasource } from '../../datasource';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { appendTemplateVariables } from '../../utils/utils';\nimport AccessoryButton from '../ui/AccessoryButton';\nimport EditorField from '../ui/EditorField';\nimport EditorFieldGroup from '../ui/EditorFieldGroup';\nimport { setOrderBy, setSql } from './utils';\n\ninterface SQLBuilderSelectRowProps {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  onQueryChange: (query: CloudWatchMetricsQuery) => void;\n}\n\nconst orderByDirections: Array<SelectableValue<string>> = [\n  { label: ASC, value: ASC },\n  { label: DESC, value: DESC },\n];\n\nconst SQLOrderByGroup: React.FC<SQLBuilderSelectRowProps> = ({ query, onQueryChange, datasource }) => {\n  const sql = query.sql ?? {};\n  const orderBy = sql.orderBy?.name;\n  const orderByDirection = sql.orderByDirection;\n\n  return (\n    <EditorFieldGroup>\n      <EditorField label=\"Order by\" optional width={16}>\n        <>\n          <Select\n            onChange={({ value }) => value && onQueryChange(setOrderBy(query, value))}\n            options={appendTemplateVariables(datasource, STATISTICS.map(toOption))}\n            value={orderBy ? toOption(orderBy) : null}\n            menuShouldPortal\n          />\n          {orderBy && (\n            <AccessoryButton\n              aria-label=\"remove\"\n              icon=\"times\"\n              variant=\"secondary\"\n              onClick={() => onQueryChange(setSql(query, { orderBy: undefined }))}\n            />\n          )}\n        </>\n      </EditorField>\n\n      <EditorField label=\"Direction\" width={16}>\n        <Select\n          inputId=\"cloudwatch-sql-order-by-direction\"\n          disabled={!orderBy}\n          value={orderByDirection ? toOption(orderByDirection) : orderByDirections[0]}\n          options={appendTemplateVariables(datasource, orderByDirections)}\n          onChange={(item) => item && onQueryChange(setSql(query, { orderByDirection: item.value }))}\n          menuShouldPortal\n        />\n      </EditorField>\n    </EditorFieldGroup>\n  );\n};\n\nexport default SQLOrderByGroup;\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { CloudWatchMetricsQuery } from '../../types';\nimport { CloudWatchDatasource } from '../../datasource';\nimport EditorRow from '../ui/EditorRow';\nimport EditorRows from '../ui/EditorRows';\nimport EditorField from '../ui/EditorField';\nimport SQLFilter from './SQLFilter';\nimport SQLGroupBy from './SQLGroupBy';\nimport SQLBuilderSelectRow from './SQLBuilderSelectRow';\nimport SQLGenerator from '../../cloudwatch-sql/SQLGenerator';\nimport SQLOrderByGroup from './SQLOrderByGroup';\nimport { Input } from '@grafana/ui';\nimport { setSql } from './utils';\n\nexport type Props = {\n  query: CloudWatchMetricsQuery;\n  datasource: CloudWatchDatasource;\n  onChange: (value: CloudWatchMetricsQuery) => void;\n  onRunQuery: () => void;\n};\n\nexport function SQLBuilderEditor({ query, datasource, onChange, onRunQuery }: React.PropsWithChildren<Props>) {\n  const sql = query.sql ?? {};\n\n  const onQueryChange = useCallback(\n    (query: CloudWatchMetricsQuery) => {\n      const sqlGenerator = new SQLGenerator();\n      const sqlString = sqlGenerator.expressionToSqlQuery(query.sql ?? {});\n      const fullQuery = {\n        ...query,\n        sqlExpression: sqlString,\n      };\n\n      onChange(fullQuery);\n      onRunQuery();\n    },\n    [onChange, onRunQuery]\n  );\n\n  const [sqlPreview, setSQLPreview] = useState<string | undefined>();\n  useEffect(() => {\n    const sqlGenerator = new SQLGenerator();\n    const sqlString = sqlGenerator.expressionToSqlQuery(query.sql ?? {});\n    if (sqlPreview !== sqlString) {\n      setSQLPreview(sqlString);\n    }\n  }, [query, sqlPreview, setSQLPreview]);\n\n  return (\n    <EditorRows>\n      <EditorRow>\n        <SQLBuilderSelectRow query={query} onQueryChange={onQueryChange} datasource={datasource} />\n      </EditorRow>\n\n      <EditorRow>\n        <EditorField label=\"Filter\" optional={true}>\n          <SQLFilter query={query} onQueryChange={onQueryChange} datasource={datasource} />\n        </EditorField>\n      </EditorRow>\n\n      <EditorRow>\n        <EditorField label=\"Group by\" optional>\n          <SQLGroupBy query={query} onQueryChange={onQueryChange} datasource={datasource} />\n        </EditorField>\n\n        <SQLOrderByGroup query={query} onQueryChange={onQueryChange} datasource={datasource}></SQLOrderByGroup>\n\n        <EditorField label=\"Limit\" optional>\n          <Input\n            value={sql.limit}\n            onChange={(e) => {\n              const val = e.currentTarget.valueAsNumber;\n              onQueryChange(setSql(query, { limit: isNaN(val) ? undefined : val }));\n            }}\n            type=\"number\"\n            min={1}\n          />\n        </EditorField>\n      </EditorRow>\n\n      {sqlPreview && (\n        <EditorRow>\n          {process.env.NODE_ENV === 'development' && <pre>{JSON.stringify(query.sql ?? {}, null, 2)}</pre>}\n          <pre>{sqlPreview ?? ''}</pre>\n        </EditorRow>\n      )}\n    </EditorRows>\n  );\n}\n","import React from 'react';\nimport { Input } from '@grafana/ui';\n\nexport interface Props {\n  onChange: (query: string) => void;\n  onRunQuery: () => void;\n  expression: string;\n}\n\nexport function MathExpressionQueryField({ expression: query, onChange, onRunQuery }: React.PropsWithChildren<Props>) {\n  const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n    if (event.key === 'Enter' && (event.shiftKey || event.ctrlKey)) {\n      event.preventDefault();\n      onRunQuery();\n    }\n  };\n\n  return (\n    <Input\n      name=\"Query\"\n      value={query}\n      placeholder=\"Enter a math expression\"\n      onBlur={onRunQuery}\n      onChange={(e) => onChange(e.currentTarget.value)}\n      onKeyDown={onKeyDown}\n    />\n  );\n}\n","import { Monaco } from '@grafana/ui';\nimport { CompletionItemProvider } from './completion/CompletionItemProvider';\nimport language from './definition';\n\nexport const registerLanguage = (monaco: Monaco, sqlCompletionItemProvider: CompletionItemProvider) => {\n  const { id, loader } = language;\n\n  const languages = monaco.languages.getLanguages();\n  if (languages.find((l) => l.id === id)) {\n    return;\n  }\n\n  monaco.languages.register({ id });\n  loader().then((monarch) => {\n    monaco.languages.setMonarchTokensProvider(id, monarch.language);\n    monaco.languages.setLanguageConfiguration(id, monarch.conf);\n    monaco.languages.registerCompletionItemProvider(id, sqlCompletionItemProvider.getCompletionProvider(monaco));\n  });\n};\n","import React, { FunctionComponent, useCallback, useEffect } from 'react';\nimport type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';\nimport { CodeEditor, Monaco } from '@grafana/ui';\nimport { CloudWatchDatasource } from '../datasource';\nimport language from '../cloudwatch-sql/definition';\nimport { TRIGGER_SUGGEST } from '../cloudwatch-sql/completion/commands';\nimport { registerLanguage } from '../cloudwatch-sql/register';\n\nexport interface Props {\n  region: string;\n  sql: string;\n  onChange: (sql: string) => void;\n  onRunQuery: () => void;\n  datasource: CloudWatchDatasource;\n}\n\nexport const SQLCodeEditor: FunctionComponent<Props> = ({ region, sql, onChange, onRunQuery, datasource }) => {\n  useEffect(() => {\n    datasource.sqlCompletionItemProvider.setRegion(region);\n  }, [region, datasource]);\n\n  const onEditorMount = useCallback(\n    (editor: monacoType.editor.IStandaloneCodeEditor, monaco: Monaco) => {\n      editor.onDidFocusEditorText(() => editor.trigger(TRIGGER_SUGGEST.id, TRIGGER_SUGGEST.id, {}));\n      editor.addCommand(monaco.KeyMod.Shift | monaco.KeyCode.Enter, () => {\n        const text = editor.getValue();\n        onChange(text);\n        onRunQuery();\n      });\n    },\n    [onChange, onRunQuery]\n  );\n\n  return (\n    <CodeEditor\n      height={'150px'}\n      language={language.id}\n      value={sql}\n      onBlur={(value) => {\n        if (value !== sql) {\n          onChange(value);\n        }\n      }}\n      showMiniMap={false}\n      showLineNumbers={true}\n      onBeforeEditorMount={(monaco: Monaco) => registerLanguage(monaco, datasource.sqlCompletionItemProvider)}\n      onEditorDidMount={onEditorMount}\n    />\n  );\n};\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Field, Icon, PopoverContent, stylesFactory, Tooltip, useTheme2, ReactUtils } from '@grafana/ui';\nimport { Space } from 'app/plugins/datasource/grafana-azure-monitor-datasource/components/Space';\nimport React from 'react';\n\ninterface EditorFieldProps {\n  label: string;\n  children: React.ReactElement;\n  width?: number;\n  optional?: boolean;\n  tooltip?: PopoverContent;\n}\n\nconst EditorField: React.FC<EditorFieldProps> = (props) => {\n  const { label, optional, tooltip, children } = props;\n\n  const theme = useTheme2();\n  const styles = getStyles(theme, props);\n  const childInputId = ReactUtils.getChildId(children);\n\n  const labelEl = (\n    <>\n      <label className={styles.label} htmlFor={childInputId}>\n        {label}\n        {optional && <span className={styles.optional}> - optional</span>}\n        {tooltip && (\n          <Tooltip placement=\"top\" content={tooltip} theme=\"info\">\n            <Icon name=\"info-circle\" size=\"sm\" className={styles.icon} />\n          </Tooltip>\n        )}\n      </label>\n      <Space v={0.5} />\n    </>\n  );\n\n  return (\n    <div className={styles.root}>\n      <Field className={styles.field} label={labelEl}>\n        <div className={styles.child}>{children}</div>\n      </Field>\n    </div>\n  );\n};\n\nexport default EditorField;\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, props: EditorFieldProps) => {\n  return {\n    root: css({\n      minWidth: theme.spacing(props.width ?? 0),\n    }),\n    label: css({\n      fontSize: 12,\n    }),\n    optional: css({\n      fontStyle: 'italic',\n      color: theme.colors.text.secondary,\n    }),\n    field: css({\n      marginBottom: 0, // GrafanaUI/Field has a bottom margin which we must remove\n    }),\n\n    // TODO: really poor hack to align the switch\n    // Find a better solution to this\n    child: css({\n      display: 'flex',\n      alignItems: 'center',\n      minHeight: 30,\n    }),\n    icon: css({\n      color: theme.colors.text.secondary,\n      marginLeft: theme.spacing(1),\n      ':hover': {\n        color: theme.colors.text.primary,\n      },\n    }),\n  };\n});\n","import React from 'react';\nimport Stack from './Stack';\n\ninterface EditorFieldGroupProps {}\n\nconst EditorFieldGroup: React.FC<EditorFieldGroupProps> = ({ children }) => {\n  return <Stack gap={1}>{children}</Stack>;\n};\n\nexport default EditorFieldGroup;\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '@grafana/ui';\nimport React from 'react';\nimport Stack from './Stack';\n\ninterface EditorHeaderProps {}\n\nconst EditorHeader: React.FC<EditorHeaderProps> = ({ children }) => {\n  const theme = useTheme2();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.root}>\n      <Stack gap={3} alignItems=\"center\">\n        {children}\n      </Stack>\n    </div>\n  );\n};\n\nexport default EditorHeader;\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => ({\n  root: css({\n    padding: theme.spacing(0, 1),\n  }),\n}));\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '@grafana/ui';\nimport React from 'react';\nimport Stack from './Stack';\n\ninterface EditorRowProps {}\n\nconst EditorRow: React.FC<EditorRowProps> = ({ children }) => {\n  const theme = useTheme2();\n  const styles = getStyles(theme);\n\n  return (\n    <div className={styles.root}>\n      <Stack gap={4}>{children}</Stack>\n    </div>\n  );\n};\n\nexport default EditorRow;\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2) => {\n  return {\n    root: css({\n      padding: theme.spacing(1),\n      backgroundColor: theme.colors.background.secondary,\n      borderRadius: theme.shape.borderRadius(1),\n    }),\n  };\n});\n","import React from 'react';\nimport Stack from './Stack';\n\ninterface EditorRowsProps {}\n\nconst EditorRows: React.FC<EditorRowsProps> = ({ children }) => {\n  return (\n    <Stack gap={0.5} direction=\"column\">\n      {children}\n    </Stack>\n  );\n};\n\nexport default EditorRows;\n","import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Select, stylesFactory, useTheme2 } from '@grafana/ui';\nimport {\n  SelectContainerProps,\n  SelectContainer as BaseSelectContainer,\n} from '@grafana/ui/src/components/Select/SelectContainer';\nimport { SelectCommonProps } from '@grafana/ui/src/components/Select/types';\nimport React, { useState } from 'react';\nimport { GroupTypeBase } from 'react-select';\n\ninterface InlineSelectProps<T> extends SelectCommonProps<T> {\n  label?: string;\n}\n\nfunction InlineSelect<T>({ label: labelProp, ...props }: InlineSelectProps<T>) {\n  const theme = useTheme2();\n  const [id] = useState(() => Math.random().toString(16).slice(2));\n  const styles = getSelectStyles(theme);\n  const components = {\n    SelectContainer,\n    ValueContainer,\n    SingleValue: ValueContainer,\n  };\n\n  return (\n    <div className={styles.root}>\n      {labelProp && (\n        <label className={styles.label} htmlFor={id}>\n          {labelProp}\n          {':'}&nbsp;\n        </label>\n      )}\n      <Select openMenuOnFocus inputId={id} {...props} width=\"auto\" components={components} />\n    </div>\n  );\n}\n\nexport default InlineSelect;\n\nconst SelectContainer = <Option, isMulti extends boolean, Group extends GroupTypeBase<Option>>(\n  props: SelectContainerProps<Option, isMulti, Group>\n) => {\n  const { children } = props;\n\n  const theme = useTheme2();\n  const styles = getSelectStyles(theme);\n\n  return (\n    <BaseSelectContainer {...props} className={cx(props.className, styles.container)}>\n      {children}\n    </BaseSelectContainer>\n  );\n};\n\nconst ValueContainer = <Option, isMulti extends boolean, Group extends GroupTypeBase<Option>>(\n  props: SelectContainerProps<Option, isMulti, Group>\n) => {\n  const { className, children } = props;\n  const theme = useTheme2();\n  const styles = getSelectStyles(theme);\n\n  return <div className={cx(className, styles.valueContainer)}>{children}</div>;\n};\n\nconst getSelectStyles = stylesFactory((theme: GrafanaTheme2) => ({\n  root: css({\n    display: 'flex',\n    fontSize: 12,\n    alignItems: 'center',\n  }),\n\n  label: css({\n    color: theme.colors.text.secondary,\n  }),\n\n  container: css({\n    background: 'none',\n    borderColor: 'transparent',\n  }),\n\n  valueContainer: css({\n    display: 'flex',\n    alignItems: 'center',\n    flex: 'initial',\n    color: theme.colors.text.secondary,\n    fontSize: 12,\n  }),\n}));\n","import React, { CSSProperties } from 'react';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '@grafana/ui';\n\ninterface StackProps {\n  direction?: CSSProperties['flexDirection'];\n  alignItems?: CSSProperties['alignItems'];\n  wrap?: boolean;\n  gap?: number;\n}\n\nconst Stack: React.FC<StackProps> = ({ children, ...props }) => {\n  const theme = useTheme2();\n  const styles = useStyles(theme, props);\n\n  return <div className={styles.root}>{children}</div>;\n};\n\nconst useStyles = stylesFactory((theme: GrafanaTheme2, props: StackProps) => ({\n  root: css({\n    display: 'flex',\n    flexDirection: props.direction ?? 'row',\n    flexWrap: props.wrap ?? true ? 'wrap' : undefined,\n    alignItems: props.alignItems,\n    gap: theme.spacing(props.gap ?? 2),\n  }),\n}));\n\nexport default Stack;\n","import { useEffect, useState } from 'react';\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { appendTemplateVariables } from './utils/utils';\nimport { Dimensions } from './types';\nimport { CloudWatchDatasource } from './datasource';\nimport { useDeepCompareEffect } from 'react-use';\n\nexport const useRegions = (datasource: CloudWatchDatasource): [Array<SelectableValue<string>>, boolean] => {\n  const [regionsIsLoading, setRegionsIsLoading] = useState<boolean>(false);\n  const [regions, setRegions] = useState<Array<SelectableValue<string>>>([{ label: 'default', value: 'default' }]);\n\n  useEffect(() => {\n    setRegionsIsLoading(true);\n\n    const variableOptionGroup = {\n      label: 'Template Variables',\n      options: datasource.getVariables().map(toOption),\n    };\n\n    datasource\n      .getRegions()\n      .then((regions: Array<SelectableValue<string>>) => setRegions([...regions, variableOptionGroup]))\n      .finally(() => setRegionsIsLoading(false));\n  }, [datasource]);\n\n  return [regions, regionsIsLoading];\n};\n\nexport const useNamespaces = (datasource: CloudWatchDatasource) => {\n  const [namespaces, setNamespaces] = useState<Array<SelectableValue<string>>>([]);\n  useEffect(() => {\n    datasource.getNamespaces().then((namespaces) => {\n      setNamespaces(appendTemplateVariables(datasource, namespaces));\n    });\n  }, [datasource]);\n\n  return namespaces;\n};\n\nexport const useMetrics = (datasource: CloudWatchDatasource, region: string, namespace: string | undefined) => {\n  const [metrics, setMetrics] = useState<Array<SelectableValue<string>>>([]);\n  useEffect(() => {\n    datasource.getMetrics(namespace, region).then((result: Array<SelectableValue<string>>) => {\n      setMetrics(appendTemplateVariables(datasource, result));\n    });\n  }, [datasource, region, namespace]);\n\n  return metrics;\n};\n\nexport const useDimensionKeys = (\n  datasource: CloudWatchDatasource,\n  region: string,\n  namespace: string | undefined,\n  metricName: string | undefined,\n  dimensionFilter?: Dimensions\n) => {\n  const [dimensionKeys, setDimensionKeys] = useState<Array<SelectableValue<string>>>([]);\n\n  // doing deep comparison to avoid making new api calls to list metrics unless dimension filter object props changes\n  useDeepCompareEffect(() => {\n    datasource\n      .getDimensionKeys(namespace, region, dimensionFilter, metricName)\n      .then((result: Array<SelectableValue<string>>) => {\n        setDimensionKeys(appendTemplateVariables(datasource, result));\n      });\n  }, [datasource, region, namespace, metricName, dimensionFilter]);\n\n  return dimensionKeys;\n};\n","import { Grammar } from 'prismjs';\nimport { CompletionItem } from '@grafana/ui';\n\nexport const QUERY_COMMANDS: CompletionItem[] = [\n  {\n    label: 'fields',\n    documentation: 'Retrieves the specified fields from log events',\n  },\n  { label: 'display', documentation: 'Specifies which fields to display in the query results' },\n  {\n    label: 'filter',\n    documentation: 'Filters the results of a query based on one or more conditions',\n  },\n  {\n    label: 'stats',\n    documentation: 'Calculates aggregate statistics based on the values of log fields',\n  },\n  { label: 'sort', documentation: 'Sorts the retrieved log events' },\n  { label: 'limit', documentation: 'Specifies the number of log events returned by the query' },\n  {\n    label: 'parse',\n    documentation:\n      'Extracts data from a log field, creating one or more ephemeral fields that you can process further in the query',\n  },\n];\n\nexport const COMPARISON_OPERATORS = ['=', '!=', '<', '<=', '>', '>='];\nexport const ARITHMETIC_OPERATORS = ['+', '-', '*', '/', '^', '%'];\n\nexport const NUMERIC_OPERATORS = [\n  {\n    label: 'abs',\n    detail: 'abs(a)',\n    documentation: 'Absolute value.',\n  },\n  {\n    label: 'ceil',\n    detail: 'ceil(a)',\n    documentation: 'Round to ceiling (the smallest integer that is greater than the value of a).',\n  },\n  {\n    label: 'floor',\n    detail: 'floor(a)',\n    documentation: 'Round to floor (the largest integer that is smaller than the value of a).',\n  },\n  {\n    label: 'greatest',\n    detail: 'greatest(a,b, ... z)',\n    documentation: 'Returns the largest value.',\n  },\n  {\n    label: 'least',\n    detail: 'least(a, b, ... z)',\n    documentation: 'Returns the smallest value.',\n  },\n  {\n    label: 'log',\n    detail: 'log(a)',\n    documentation: 'Natural logarithm.',\n  },\n  {\n    label: 'sqrt',\n    detail: 'sqrt(a)',\n    documentation: 'Square root.',\n  },\n];\n\nexport const GENERAL_FUNCTIONS = [\n  {\n    label: 'ispresent',\n    detail: 'ispresent(fieldname)',\n    documentation: 'Returns true if the field exists.',\n  },\n  {\n    label: 'coalesce',\n    detail: 'coalesce(fieldname1, fieldname2, ... fieldnamex)',\n    documentation: 'Returns the first non-null value from the list.',\n  },\n];\n\nexport const STRING_FUNCTIONS = [\n  {\n    label: 'isempty',\n    detail: 'isempty(fieldname)',\n    documentation: 'Returns true if the field is missing or is an empty string.',\n  },\n  {\n    label: 'isblank',\n    detail: 'isblank(fieldname)',\n    documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n  },\n  {\n    label: 'concat',\n    detail: 'concat(string1, string2, ... stringz)',\n    documentation: 'Concatenates the strings.',\n  },\n  {\n    label: 'ltrim',\n    detail: 'ltrim(string) or ltrim(string1, string2)',\n    documentation:\n      'Remove white space from the left of the string. If the function has a second string argument, it removes the characters of string2 from the left of string1.',\n  },\n  {\n    label: 'rtrim',\n    detail: 'rtrim(string) or rtrim(string1, string2)',\n    documentation:\n      'Remove white space from the right of the string. If the function has a second string argument, it removes the characters of string2 from the right of string1.',\n  },\n  {\n    label: 'trim',\n    detail: 'trim(string) or trim(string1, string2)',\n    documentation:\n      'Remove white space from both ends of the string. If the function has a second string argument, it removes the characters of string2 from both sides of string1.',\n  },\n  {\n    label: 'strlen',\n    detail: 'strlen(string)',\n    documentation: 'Returns the length of the string in Unicode code points.',\n  },\n  {\n    label: 'toupper',\n    detail: 'toupper(string)',\n    documentation: 'Converts the string to uppercase.',\n  },\n  {\n    label: 'tolower',\n    detail: 'tolower(string)',\n    documentation: 'Converts the string to lowercase.',\n  },\n  {\n    label: 'substr',\n    detail: 'substr(string1, x), or substr(string1, x, y)',\n    documentation:\n      'Returns a substring from the index specified by the number argument to the end of the string. If the function has a second number argument, it contains the length of the substring to be retrieved.',\n  },\n  {\n    label: 'replace',\n    detail: 'replace(string1, string2, string3)',\n    documentation: 'Replaces all instances of string2 in string1 with string3.',\n  },\n  {\n    label: 'strcontains',\n    detail: 'strcontains(string1, string2)',\n    documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n  },\n];\n\nexport const DATETIME_FUNCTIONS = [\n  {\n    label: 'bin',\n    detail: 'bin(period)',\n    documentation: 'Rounds the value of @timestamp to the given period and then truncates.',\n  },\n  {\n    label: 'datefloor',\n    detail: 'datefloor(a, period)',\n    documentation: 'Truncates the timestamp to the given period.',\n  },\n  {\n    label: 'dateceil',\n    detail: 'dateceil(a, period)',\n    documentation: 'Rounds up the timestamp to the given period and then truncates.',\n  },\n  {\n    label: 'fromMillis',\n    detail: 'fromMillis(fieldname)',\n    documentation:\n      'Interprets the input field as the number of milliseconds since the Unix epoch and converts it to a timestamp.',\n  },\n  {\n    label: 'toMillis',\n    detail: 'toMillis(fieldname)',\n    documentation:\n      'Converts the timestamp found in the named field into a number representing the milliseconds since the Unix epoch.',\n  },\n];\n\nexport const IP_FUNCTIONS = [\n  {\n    label: 'isValidIp',\n    detail: 'isValidIp(fieldname)',\n    documentation: 'Returns true if the field is a valid v4 or v6 IP address.',\n  },\n  {\n    label: 'isValidIpV4',\n    detail: 'isValidIpV4(fieldname)',\n    documentation: 'Returns true if the field is a valid v4 IP address.',\n  },\n  {\n    label: 'isValidIpV6',\n    detail: 'isValidIpV6(fieldname)',\n    documentation: 'Returns true if the field is a valid v6 IP address.',\n  },\n  {\n    label: 'isIpInSubnet',\n    detail: 'isIpInSubnet(fieldname, string)',\n    documentation: 'Returns true if the field is a valid v4 or v6 IP address within the specified v4 or v6 subnet.',\n  },\n  {\n    label: 'isIpv4InSubnet',\n    detail: 'isIpv4InSubnet(fieldname, string)',\n    documentation: 'Returns true if the field is a valid v4 IP address within the specified v4 subnet.',\n  },\n  {\n    label: 'isIpv6InSubnet',\n    detail: 'isIpv6InSubnet(fieldname, string)',\n    documentation: 'Returns true if the field is a valid v6 IP address within the specified v6 subnet.',\n  },\n];\n\nexport const BOOLEAN_FUNCTIONS = [\n  {\n    label: 'ispresent',\n    detail: 'ispresent(fieldname)',\n    documentation: 'Returns true if the field exists.',\n  },\n  {\n    label: 'isempty',\n    detail: 'isempty(fieldname)',\n    documentation: 'Returns true if the field is missing or is an empty string.',\n  },\n  {\n    label: 'isblank',\n    detail: 'isblank(fieldname)',\n    documentation: 'Returns true if the field is missing, an empty string, or contains only white space.',\n  },\n  {\n    label: 'strcontains',\n    detail: 'strcontains(string1, string2)',\n    documentation: 'Returns 1 if string1 contains string2 and 0 otherwise.',\n  },\n  ...IP_FUNCTIONS,\n];\n\nexport const AGGREGATION_FUNCTIONS_STATS = [\n  {\n    label: 'avg',\n    detail: 'avg(NumericFieldname)',\n    documentation: 'The average of the values in the specified field.',\n  },\n  {\n    label: 'count',\n    detail: 'count(fieldname) or count(*)',\n    documentation: 'Counts the log records.',\n  },\n  {\n    label: 'count_distinct',\n    detail: 'count_distinct(fieldname)',\n    documentation: 'Returns the number of unique values for the field.',\n  },\n  {\n    label: 'max',\n    detail: 'max(fieldname)',\n    documentation: 'The maximum of the values for this log field in the queried logs.',\n  },\n  {\n    label: 'min',\n    detail: 'min(fieldname)',\n    documentation: 'The minimum of the values for this log field in the queried logs.',\n  },\n  {\n    label: 'pct',\n    detail: 'pct(fieldname, value)',\n    documentation: 'A percentile indicates the relative standing of a value in a datas.',\n  },\n  {\n    label: 'stddev',\n    detail: 'stddev(NumericFieldname)',\n    documentation: 'The standard deviation of the values in the specified field.',\n  },\n  {\n    label: 'sum',\n    detail: 'sum(NumericFieldname)',\n    documentation: 'The sum of the values in the specified field.',\n  },\n];\n\nexport const NON_AGGREGATION_FUNCS_STATS = [\n  {\n    label: 'earliest',\n    detail: 'earliest(fieldname)',\n    documentation:\n      'Returns the value of fieldName from the log event that has the earliest time stamp in the queried logs.',\n  },\n  {\n    label: 'latest',\n    detail: 'latest(fieldname)',\n    documentation:\n      'Returns the value of fieldName from the log event that has the latest time stamp in the queried logs.',\n  },\n  {\n    label: 'sortsFirst',\n    detail: 'sortsFirst(fieldname)',\n    documentation: 'Returns the value of fieldName that sorts first in the queried logs.',\n  },\n  {\n    label: 'sortsLast',\n    detail: 'sortsLast(fieldname)',\n    documentation: 'Returns the value of fieldName that sorts last in the queried logs.',\n  },\n];\n\nexport const STATS_FUNCS = [...AGGREGATION_FUNCTIONS_STATS, ...NON_AGGREGATION_FUNCS_STATS];\n\nexport const KEYWORDS = ['as', 'like', 'by', 'in', 'desc', 'asc'];\nexport const FIELD_AND_FILTER_FUNCTIONS = [\n  ...NUMERIC_OPERATORS,\n  ...GENERAL_FUNCTIONS,\n  ...STRING_FUNCTIONS,\n  ...DATETIME_FUNCTIONS,\n  ...IP_FUNCTIONS,\n];\n\nexport const FUNCTIONS = [...FIELD_AND_FILTER_FUNCTIONS, ...STATS_FUNCS];\n\nconst tokenizer: Grammar = {\n  comment: {\n    pattern: /^#.*/,\n    greedy: true,\n  },\n  backticks: {\n    pattern: /`.*?`/,\n    alias: 'string',\n    greedy: true,\n  },\n  quote: {\n    pattern: /\".*?\"/,\n    alias: 'string',\n    greedy: true,\n  },\n  regex: {\n    pattern: /\\/.*?\\/(?=\\||\\s*$|,)/,\n    greedy: true,\n  },\n  'query-command': {\n    pattern: new RegExp(`\\\\b(?:${QUERY_COMMANDS.map((command) => command.label).join('|')})\\\\b`, 'i'),\n    alias: 'function',\n  },\n  function: {\n    pattern: new RegExp(`\\\\b(?:${FUNCTIONS.map((f) => f.label).join('|')})\\\\b`, 'i'),\n  },\n  keyword: {\n    pattern: new RegExp(`(\\\\s+)(${KEYWORDS.join('|')})(?=\\\\s+)`, 'i'),\n    lookbehind: true,\n  },\n  // 'log-group-name': {\n  //   pattern: /[\\.\\-_/#A-Za-z0-9]+/,\n  // },\n  'field-name': {\n    pattern: /(@?[_a-zA-Z]+[_.0-9a-zA-Z]*)|(`((\\\\`)|([^`]))*?`)/,\n    greedy: true,\n  },\n  number: /\\b-?\\d+((\\.\\d*)?([eE][+-]?\\d+)?)?\\b/,\n  'command-separator': {\n    pattern: /\\|/,\n    alias: 'punctuation',\n  },\n  'comparison-operator': {\n    pattern: /([<>]=?)|(!?=)/,\n  },\n  punctuation: /[{}()`,.]/,\n  whitespace: /\\s+/,\n};\n\nexport default tokenizer;\n","import { DataQuery, DataSourceRef, SelectableValue } from '@grafana/data';\nimport { AwsAuthDataSourceSecureJsonData, AwsAuthDataSourceJsonData } from '@grafana/aws-sdk';\n\nexport interface Dimensions {\n  [key: string]: string | string[];\n}\n\nimport {\n  QueryEditorArrayExpression,\n  QueryEditorFunctionExpression,\n  QueryEditorPropertyExpression,\n} from './expressions';\n\nexport type CloudWatchQueryMode = 'Metrics' | 'Logs';\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 DataQuery {\n  queryMode?: 'Metrics';\n  metricQueryType?: MetricQueryType;\n  metricEditorMode?: MetricEditorMode;\n\n  //common props\n  id: string;\n  region: string;\n  namespace: string;\n  period?: string;\n  alias?: string;\n\n  //Basic editor builder props\n  metricName?: string;\n  dimensions?: Dimensions;\n  matchExact?: boolean;\n  statistic?: string;\n  /**\n   * @deprecated use statistic\n   */\n  statistics?: string[];\n\n  // Math expression query\n  expression?: string;\n\n  sqlExpression?: string;\n\n  sql?: SQLExpression;\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\n  id: string;\n  region: string;\n  expression?: string;\n  logGroupNames?: string[];\n  statsGroups?: string[];\n}\n\nexport type CloudWatchQuery = CloudWatchMetricsQuery | CloudWatchLogsQuery;\n\nexport const isCloudWatchLogsQuery = (cloudwatchQuery: CloudWatchQuery): cloudwatchQuery is CloudWatchLogsQuery =>\n  (cloudwatchQuery as CloudWatchLogsQuery).queryMode === 'Logs';\n\ninterface AnnotationProperties {\n  enable: boolean;\n  name: string;\n  iconColor: string;\n  prefixMatching: boolean;\n  actionPrefix: string;\n  alarmNamePrefix: string;\n}\n\nexport type CloudWatchAnnotationQuery = CloudWatchMetricsQuery & AnnotationProperties;\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}\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}\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 interface MetricFindSuggestData {\n  text: string;\n  label: string;\n  value: string;\n}\n","import { SelectableValue } from '@grafana/data';\nimport { CloudWatchDatasource } from './../datasource';\n\nexport const toOption = (value: string) => ({ label: value, value });\n\nexport const appendTemplateVariables = (datasource: CloudWatchDatasource, values: SelectableValue[]) => [\n  ...values,\n  { label: 'Template Variables', options: datasource.getVariables().map(toOption) },\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';\nimport { QueryRunnerOptions } from 'app/features/query/state/PanelQueryRunner';\nimport { DashboardQuery, SHARED_DASHBOARD_QUERY } from './types';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport {\n  DataQuery,\n  DataQueryRequest,\n  DataSourceApi,\n  DataSourceRef,\n  getDefaultTimeRange,\n  LoadingState,\n  PanelData,\n} from '@grafana/data';\n\nexport function isSharedDashboardQuery(datasource: string | DataSourceRef | DataSourceApi | null) {\n  if (!datasource) {\n    // default datasource\n    return false;\n  }\n  if (datasource === SHARED_DASHBOARD_QUERY || (datasource as any)?.uid === SHARED_DASHBOARD_QUERY) {\n    return true;\n  }\n  const ds = datasource as DataSourceApi;\n  return ds.meta && ds.meta.name === 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 React, { ReactElement } from 'react';\nimport { css } from '@emotion/css';\nimport { Icon, useStyles } from '@grafana/ui';\nimport { GrafanaTheme } from '@grafana/data';\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          &nbsp;\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 React, { PureComponent } from 'react';\nimport { LegacyForms, VerticalGroup } from '@grafana/ui';\nimport { DataQuery, PanelData, SelectableValue } from '@grafana/data';\nimport { css } from '@emotion/css';\n\nimport { DashboardQuery, ResultInfo, SHARED_DASHBOARD_QUERY } from './types';\nimport config from 'app/core/config';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { filterPanelDataToQuery } from 'app/features/query/components/QueryEditorRow';\nimport { DashboardQueryRow } from './DashboardQueryRow';\n\nconst { Select } = LegacyForms;\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\ntype State = {\n  defaultDatasource: string;\n  results: ResultInfo[];\n};\n\nexport class DashboardQueryEditor extends PureComponent<Props, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      defaultDatasource: '',\n      results: [],\n    };\n  }\n\n  getQuery(): DashboardQuery {\n    return this.props.queries[0] as DashboardQuery;\n  }\n\n  async componentDidMount() {\n    await this.updateState();\n  }\n\n  async componentDidUpdate(prevProps: Props) {\n    const { panelData, queries } = this.props;\n\n    if (prevProps.panelData !== panelData || prevProps.queries !== queries) {\n      await this.updateState();\n    }\n  }\n\n  async updateState() {\n    const { panelData, queries } = this.props;\n\n    const query = queries[0] as DashboardQuery;\n    const defaultDS = await getDatasourceSrv().get();\n    const dashboard = getDashboardSrv().getCurrent();\n    const panel = dashboard?.getPanelById(query.panelId ?? -124134);\n\n    if (!panel) {\n      this.setState({ defaultDatasource: defaultDS.name });\n      return;\n    }\n\n    const mainDS = await getDatasourceSrv().get(panel.datasource);\n    const info: ResultInfo[] = [];\n\n    for (const query of panel.targets) {\n      const ds = query.datasource ? await getDatasourceSrv().get(query.datasource) : mainDS;\n      const fmt = ds.getQueryDisplayText ? ds.getQueryDisplayText : getQueryDisplayText;\n\n      const qData = filterPanelDataToQuery(panelData, query.refId);\n      const queryData = qData ? qData : panelData;\n\n      info.push({\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    this.setState({ defaultDatasource: defaultDS.name, results: info });\n  }\n\n  onPanelChanged = (id: number) => {\n    const query = this.getQuery();\n\n    this.props.onChange([\n      {\n        ...query,\n        panelId: id,\n      } as DashboardQuery,\n    ]);\n    this.props.onRunQueries();\n  };\n\n  renderQueryData(editURL: string) {\n    const { results } = this.state;\n\n    return (\n      <VerticalGroup spacing=\"sm\">\n        {results.map((target, index) => {\n          return <DashboardQueryRow editURL={editURL} target={target} key={`DashboardQueryRow-${index}`} />;\n        })}\n      </VerticalGroup>\n    );\n  }\n\n  getPanelDescription = (panel: PanelModel): string => {\n    const { defaultDatasource } = this.state;\n    const datasource = panel.datasource ? panel.datasource : defaultDatasource;\n    const dsname = getDatasourceSrv().getInstanceSettings(datasource)?.name;\n\n    if (panel.targets.length === 1) {\n      return '1 query to ' + dsname;\n    }\n\n    return panel.targets.length + ' queries to ' + dsname;\n  };\n\n  render() {\n    const dashboard = getDashboardSrv().getCurrent();\n    if (!dashboard) {\n      return null;\n    }\n\n    const query = this.getQuery();\n\n    let selected: SelectableValue<number> | undefined;\n    const panels: Array<SelectableValue<number>> = [];\n\n    for (const panel of dashboard.panels) {\n      const plugin = config.panels[panel.type];\n      if (!plugin) {\n        continue;\n      }\n\n      if (panel.targets && panel.id !== dashboard.panelInEdit?.id && panel.datasource?.uid !== SHARED_DASHBOARD_QUERY) {\n        const item = {\n          value: panel.id,\n          label: panel.title ? panel.title : 'Panel ' + panel.id,\n          description: this.getPanelDescription(panel),\n          imgUrl: plugin.info.logos.small,\n        };\n\n        panels.push(item);\n\n        if (query.panelId === panel.id) {\n          selected = item;\n        }\n      }\n    }\n\n    if (panels.length < 1) {\n      return (\n        <div className={css({ padding: '10px' })}>\n          This dashboard does not have other panels. Add queries to other panels and try again\n        </div>\n      );\n    }\n\n    // Same as current URL, but different panelId\n    const editURL = `d/${dashboard.uid}/${dashboard.title}?&editPanel=${query.panelId}`;\n\n    return (\n      <div>\n        <div className=\"gf-form\">\n          <div className=\"gf-form-label\">Use results from panel</div>\n          <Select\n            menuShouldPortal\n            placeholder=\"Choose panel\"\n            isSearchable={true}\n            options={panels}\n            value={selected}\n            onChange={(item) => this.onPanelChanged(item.value!)}\n          />\n        </div>\n        <div className={css({ padding: '16px' })}>{query.panelId && this.renderQueryData(editURL)}</div>\n      </div>\n    );\n  }\n}\n","// Unfortunately this list is manually maintained as there's no (nice) automated way to get\n// data from Azure.\n\nexport const locationMetadata = [\n  {\n    location: 'eastus',\n    displayName: 'East US',\n    supportsLogs: true,\n  },\n  {\n    location: 'eastus2',\n    displayName: 'East US 2',\n    supportsLogs: true,\n  },\n  {\n    location: 'southcentralus',\n    displayName: 'South Central US',\n    supportsLogs: true,\n  },\n  {\n    location: 'westus2',\n    displayName: 'West US 2',\n    supportsLogs: true,\n  },\n  {\n    location: 'westus3',\n    displayName: 'West US 3',\n    supportsLogs: true,\n  },\n  {\n    location: 'australiaeast',\n    displayName: 'Australia East',\n    supportsLogs: true,\n  },\n  {\n    location: 'southeastasia',\n    displayName: 'Southeast Asia',\n    supportsLogs: true,\n  },\n  {\n    location: 'northeurope',\n    displayName: 'North Europe',\n    supportsLogs: true,\n  },\n  {\n    location: 'uksouth',\n    displayName: 'UK South',\n    supportsLogs: true,\n  },\n  {\n    location: 'westeurope',\n    displayName: 'West Europe',\n    supportsLogs: true,\n  },\n  {\n    location: 'centralus',\n    displayName: 'Central US',\n    supportsLogs: true,\n  },\n  {\n    location: 'northcentralus',\n    displayName: 'North Central US',\n    supportsLogs: true,\n  },\n  {\n    location: 'westus',\n    displayName: 'West US',\n    supportsLogs: true,\n  },\n  {\n    location: 'southafricanorth',\n    displayName: 'South Africa North',\n    supportsLogs: true,\n  },\n  {\n    location: 'centralindia',\n    displayName: 'Central India',\n    supportsLogs: true,\n  },\n  {\n    location: 'eastasia',\n    displayName: 'East Asia',\n    supportsLogs: true,\n  },\n  {\n    location: 'japaneast',\n    displayName: 'Japan East',\n    supportsLogs: true,\n  },\n  {\n    location: 'jioindiawest',\n    displayName: 'Jio India West',\n    supportsLogs: true,\n  },\n  {\n    location: 'koreacentral',\n    displayName: 'Korea Central',\n    supportsLogs: true,\n  },\n  {\n    location: 'canadacentral',\n    displayName: 'Canada Central',\n    supportsLogs: true,\n  },\n  {\n    location: 'francecentral',\n    displayName: 'France Central',\n    supportsLogs: true,\n  },\n  {\n    location: 'germanywestcentral',\n    displayName: 'Germany West Central',\n    supportsLogs: true,\n  },\n  {\n    location: 'norwayeast',\n    displayName: 'Norway East',\n    supportsLogs: true,\n  },\n  {\n    location: 'switzerlandnorth',\n    displayName: 'Switzerland North',\n    supportsLogs: true,\n  },\n  {\n    location: 'uaenorth',\n    displayName: 'UAE North',\n    supportsLogs: true,\n  },\n  {\n    location: 'brazilsouth',\n    displayName: 'Brazil South',\n    supportsLogs: true,\n  },\n  {\n    location: 'centralusstage',\n    displayName: 'Central US (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'eastusstage',\n    displayName: 'East US (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'eastus2stage',\n    displayName: 'East US 2 (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'northcentralusstage',\n    displayName: 'North Central US (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'southcentralusstage',\n    displayName: 'South Central US (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'westusstage',\n    displayName: 'West US (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'westus2stage',\n    displayName: 'West US 2 (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'asia',\n    displayName: 'Asia',\n    supportsLogs: true,\n  },\n  {\n    location: 'asiapacific',\n    displayName: 'Asia Pacific',\n    supportsLogs: true,\n  },\n  {\n    location: 'australia',\n    displayName: 'Australia',\n    supportsLogs: true,\n  },\n  {\n    location: 'brazil',\n    displayName: 'Brazil',\n    supportsLogs: true,\n  },\n  {\n    location: 'canada',\n    displayName: 'Canada',\n    supportsLogs: true,\n  },\n  {\n    location: 'europe',\n    displayName: 'Europe',\n    supportsLogs: true,\n  },\n  {\n    location: 'global',\n    displayName: 'Global',\n    supportsLogs: true,\n  },\n  {\n    location: 'india',\n    displayName: 'India',\n    supportsLogs: true,\n  },\n  {\n    location: 'japan',\n    displayName: 'Japan',\n    supportsLogs: true,\n  },\n  {\n    location: 'uk',\n    displayName: 'United Kingdom',\n    supportsLogs: true,\n  },\n  {\n    location: 'unitedstates',\n    displayName: 'United States',\n    supportsLogs: true,\n  },\n  {\n    location: 'eastasiastage',\n    displayName: 'East Asia (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'southeastasiastage',\n    displayName: 'Southeast Asia (Stage)',\n    supportsLogs: true,\n  },\n  {\n    location: 'westcentralus',\n    displayName: 'West Central US',\n    supportsLogs: true,\n  },\n  {\n    location: 'southafricawest',\n    displayName: 'South Africa West',\n    supportsLogs: true,\n  },\n  {\n    location: 'australiacentral',\n    displayName: 'Australia Central',\n    supportsLogs: true,\n  },\n  {\n    location: 'australiacentral2',\n    displayName: 'Australia Central 2',\n    supportsLogs: true,\n  },\n  {\n    location: 'australiasoutheast',\n    displayName: 'Australia Southeast',\n    supportsLogs: true,\n  },\n  {\n    location: 'japanwest',\n    displayName: 'Japan West',\n    supportsLogs: true,\n  },\n  {\n    location: 'koreasouth',\n    displayName: 'Korea South',\n    supportsLogs: true,\n  },\n  {\n    location: 'southindia',\n    displayName: 'South India',\n    supportsLogs: true,\n  },\n  {\n    location: 'westindia',\n    displayName: 'West India',\n    supportsLogs: true,\n  },\n  {\n    location: 'canadaeast',\n    displayName: 'Canada East',\n    supportsLogs: true,\n  },\n  {\n    location: 'francesouth',\n    displayName: 'France South',\n    supportsLogs: true,\n  },\n  {\n    location: 'germanynorth',\n    displayName: 'Germany North',\n    supportsLogs: true,\n  },\n  {\n    location: 'norwaywest',\n    displayName: 'Norway West',\n    supportsLogs: true,\n  },\n  {\n    location: 'switzerlandwest',\n    displayName: 'Switzerland West',\n    supportsLogs: true,\n  },\n  {\n    location: 'ukwest',\n    displayName: 'UK West',\n    supportsLogs: true,\n  },\n  {\n    location: 'uaecentral',\n    displayName: 'UAE Central',\n    supportsLogs: true,\n  },\n  {\n    location: 'brazilsoutheast',\n    displayName: 'Brazil Southeast',\n    supportsLogs: true,\n  },\n];\n\nexport const logsSupportedLocationsKusto = locationMetadata\n  .filter((v) => v.supportsLogs)\n  .map((v) => `\"${v.location}\"`)\n  .join(',');\n\n// Object, keyed by location ID\nexport const locationDisplayNames: Record<string, string> = locationMetadata.reduce(\n  (acc, location) => ({\n    ...acc,\n    [location.location]: location.displayName,\n  }),\n  {}\n);\n","// Unfortunately this list is manually maintained as there's no (nice) automated way to get\n// data from Azure.\n\nexport const resourceTypeMetadata = [\n  {\n    resourceType: 'microsoft.analysisservices/servers',\n    displayName: 'Analysis Services',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.synapse/workspaces/bigdatapools',\n    displayName: 'Apache Spark pool',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.apimanagement/service',\n    displayName: 'API Management service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.appconfiguration/configurationstores',\n    displayName: 'App Configuration',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.web/sites/slots',\n    displayName: 'App Service (Slot)',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.web/hostingenvironments',\n    displayName: 'App Service Environment',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.web/serverfarms',\n    displayName: 'App Service plan',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.web/sites',\n    displayName: 'App Service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/applicationgateways',\n    displayName: 'Application gateway',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.insights/components',\n    displayName: 'Application Insights',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.automation/automationaccounts',\n    displayName: 'Automation Account',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.insights/autoscalesettings',\n    displayName: 'Autoscale Settings',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.aadiam/azureadmetrics',\n    displayName: 'Azure AD Metrics',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.cache/redis',\n    displayName: 'Azure Cache for Redis',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.documentdb/databaseaccounts',\n    displayName: 'Azure Cosmos DB account',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.kusto/clusters',\n    displayName: 'Azure Data Explorer Cluster',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.dbformariadb/servers',\n    displayName: 'Azure Database for MariaDB server',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.dbformysql/servers',\n    displayName: 'Azure Database for MySQL server',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.dbforpostgresql/flexibleservers',\n    displayName: 'Azure Database for PostgreSQL flexible server',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.dbforpostgresql/servergroupsv2',\n    displayName: 'Azure Database for PostgreSQL server group',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.dbforpostgresql/servers',\n    displayName: 'Azure Database for PostgreSQL server',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.dbforpostgresql/serversv2',\n    displayName: 'Azure Database for PostgreSQL server v2',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.resources/subscriptions',\n    displayName: 'Subscription',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.appplatform/spring',\n    displayName: 'Azure Spring Cloud',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.databoxedge/databoxedgedevices',\n    displayName: 'Azure Stack Edge / Data Box Gateway',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.azurestackresourcemonitor/storageaccountmonitor',\n    displayName: 'Azure Stack Resource Monitor',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.synapse/workspaces',\n    displayName: 'Synapse workspace',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/bastionhosts',\n    displayName: 'Bastion',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.batch/batchaccounts',\n    displayName: 'Batch account',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.botservice/botservices',\n    displayName: 'Bot Service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.netapp/netappaccounts/capacitypools',\n    displayName: 'Capacity pool',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.classiccompute/domainnames',\n    displayName: 'Cloud service (classic)',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.vmwarecloudsimple/virtualmachines',\n    displayName: 'CloudSimple Virtual Machine',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.cognitiveservices/accounts',\n    displayName: 'Cognitive Services',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/networkwatchers/connectionmonitors',\n    displayName: 'Connection Monitors',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/connections',\n    displayName: 'Connection',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.containerinstance/containergroups',\n    displayName: 'Container instances',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.containerregistry/registries',\n    displayName: 'Container registry',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.insights/qos',\n    displayName: 'Custom Metric Usage',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.customerinsights/hubs',\n    displayName: 'CustomerInsights',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.datafactory/datafactories',\n    displayName: 'Data factory',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.datafactory/factories',\n    displayName: 'Data factory (V2)',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.datalakeanalytics/accounts',\n    displayName: 'Data Lake Analytics',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.datalakestore/accounts',\n    displayName: 'Data Lake Storage Gen1',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.datashare/accounts',\n    displayName: 'Data Share',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.synapse/workspaces/sqlpools',\n    displayName: 'Dedicated SQL pool',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.devices/provisioningservices',\n    displayName: 'Device Provisioning Service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.compute/disks',\n    displayName: 'Disk',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/dnszones',\n    displayName: 'DNS zone',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.eventgrid/domains',\n    displayName: 'Event Grid Domain',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.eventgrid/systemtopics',\n    displayName: 'Event Grid System Topic',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.eventgrid/topics',\n    displayName: 'Event Grid Topic',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.eventhub/clusters',\n    displayName: 'Event Hubs Cluster',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.eventhub/namespaces',\n    displayName: 'Event Hubs Namespace',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/expressroutecircuits',\n    displayName: 'ExpressRoute circuit',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/expressrouteports',\n    displayName: 'ExpressRoute Direct',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/expressroutegateways',\n    displayName: 'ExpressRoute Gateways',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.fabric.admin/fabriclocations',\n    displayName: 'Fabric Locations',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/azurefirewalls',\n    displayName: 'Firewall',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/frontdoors',\n    displayName: 'Front Door',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.hdinsight/clusters',\n    displayName: 'HDInsight cluster',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.storagecache/caches',\n    displayName: 'HPC cache',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.logic/integrationserviceenvironments',\n    displayName: 'Integration Service Environment',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.iotcentral/iotapps',\n    displayName: 'IoT Central Application',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.devices/iothubs',\n    displayName: 'IoT Hub',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.keyvault/vaults',\n    displayName: 'Key vault',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.kubernetes/connectedclusters',\n    displayName: 'Kubernetes - Azure Arc',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.containerservice/managedclusters',\n    displayName: 'Kubernetes service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.media/mediaservices/liveevents',\n    displayName: 'Live event',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/loadbalancers',\n    displayName: 'Load balancer',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.operationalinsights/workspaces',\n    displayName: 'Log Analytics workspace',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.logic/workflows',\n    displayName: 'Logic app',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.machinelearningservices/workspaces',\n    displayName: 'Machine learning',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.media/mediaservices',\n    displayName: 'Media service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/natgateways',\n    displayName: 'NAT gateway',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/networkinterfaces',\n    displayName: 'Network interface',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/networkvirtualappliances',\n    displayName: 'Network Virtual Appliances',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/networkwatchers',\n    displayName: 'Network Watcher',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.notificationhubs/namespaces/notificationhubs',\n    displayName: 'Notification Hub',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/p2svpngateways',\n    displayName: 'P2S VPN Gateways',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.peering/peeringservices',\n    displayName: 'Peering Service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.powerbidedicated/capacities',\n    displayName: 'Power BI Embedded',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/privateendpoints',\n    displayName: 'Private endpoint',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/privatelinkservices',\n    displayName: 'Private link service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/publicipaddresses',\n    displayName: 'Public IP address',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.cache/redisenterprise',\n    displayName: 'Redis Enterprise',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.relay/namespaces',\n    displayName: 'Relay',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.synapse/workspaces/scopepools',\n    displayName: 'Scope pool',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.search/searchservices',\n    displayName: 'Search service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.servicebus/namespaces',\n    displayName: 'Service Bus Namespace',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.signalrservice/signalr',\n    displayName: 'SignalR',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.operationsmanagement/solutions',\n    displayName: 'Solution',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.sql/servers/databases',\n    displayName: 'SQL database',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.sql/servers/elasticpools',\n    displayName: 'SQL elastic pool',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.sql/managedinstances',\n    displayName: 'SQL managed instance',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.storage/storageaccounts',\n    displayName: 'Storage account',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.classicstorage/storageaccounts',\n    displayName: 'Storage account (classic)',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.storagesync/storagesyncservices',\n    displayName: 'Storage Sync Service',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.streamanalytics/streamingjobs',\n    displayName: 'Stream Analytics job',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.media/mediaservices/streamingendpoints',\n    displayName: 'Streaming Endpoint',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.timeseriesinsights/environments',\n    displayName: 'Time Series Insights environment',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/trafficmanagerprofiles',\n    displayName: 'Traffic Manager profile',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.compute/virtualmachinescalesets',\n    displayName: 'Virtual machine scale set',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.compute/virtualmachines',\n    displayName: 'Virtual machine',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.classiccompute/virtualmachines',\n    displayName: 'Virtual machine (classic)',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/virtualnetworkgateways',\n    displayName: 'Virtual network gateway',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.netapp/netappaccounts/capacitypools/volumes',\n    displayName: 'Volume',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.network/vpngateways',\n    displayName: 'VPN Gateways',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.cdn/cdnwebapplicationfirewallpolicies',\n    displayName: 'Content Delivery Network WAF policy',\n    supportsLogs: true,\n  },\n  {\n    resourceType: 'microsoft.web/hostingenvironments/workerpools',\n    displayName: 'WorkerPools',\n    supportsLogs: true,\n  },\n];\n\nexport const logsSupportedResourceTypesKusto = resourceTypeMetadata\n  .filter((v) => v.supportsLogs)\n  .map((v) => `\"${v.resourceType}\"`)\n  .join(',');\n\n// Object, keyed by resourceType ID\nexport const resourceTypeDisplayNames: Record<string, string> = resourceTypeMetadata.reduce(\n  (acc, resourceType) => ({\n    ...acc,\n    [resourceType.resourceType]: resourceType.displayName,\n  }),\n  {}\n);\n","import { InlineField } from '@grafana/ui';\nimport React from 'react';\nimport { Props as InlineFieldProps } from '@grafana/ui/src/components/Forms/InlineField';\n\nconst DEFAULT_LABEL_WIDTH = 18;\n\nexport const Field = (props: InlineFieldProps) => {\n  return <InlineField labelWidth={DEFAULT_LABEL_WIDTH} {...props} />;\n};\n","export class Deferred<T = any> {\n  resolve?: (reason: T | PromiseLike<T>) => void;\n  reject?: (reason?: any) => void;\n  promise: Promise<T>;\n\n  constructor() {\n    this.resolve = undefined;\n    this.reject = undefined;\n\n    this.promise = new Promise((resolve, reject) => {\n      this.resolve = resolve;\n      this.reject = reject;\n    });\n    Object.freeze(this);\n  }\n}\n","import { CodeEditor, Monaco, MonacoEditor } from '@grafana/ui';\nimport { Deferred } from 'app/core/utils/deferred';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { AzureQueryEditorFieldProps } from '../../types';\nimport { setKustoQuery } from './setQueryValue';\n\ninterface MonacoPromise {\n  editor: MonacoEditor;\n  monaco: Monaco;\n}\n\ninterface MonacoLanguages {\n  kusto: {\n    getKustoWorker: () => Promise<\n      (\n        url: any\n      ) => Promise<{\n        setSchema: (schema: any, clusterUrl: string, name: string) => void;\n      }>\n    >;\n  };\n}\n\nconst QueryField: React.FC<AzureQueryEditorFieldProps> = ({ query, datasource, onQueryChange }) => {\n  const monacoPromiseRef = useRef<Deferred<MonacoPromise>>();\n  function getPromise() {\n    if (!monacoPromiseRef.current) {\n      monacoPromiseRef.current = new Deferred<MonacoPromise>();\n    }\n\n    return monacoPromiseRef.current.promise;\n  }\n\n  useEffect(() => {\n    if (!query.azureLogAnalytics?.resource) {\n      return;\n    }\n\n    const promises = [\n      datasource.azureLogAnalyticsDatasource.getKustoSchema(query.azureLogAnalytics.resource),\n      getPromise(),\n    ] as const;\n\n    // the kusto schema call might fail, but its okay for that to happen silently\n    Promise.all(promises).then(([schema, { monaco, editor }]) => {\n      const languages = (monaco.languages as unknown) as MonacoLanguages;\n\n      languages.kusto\n        .getKustoWorker()\n        .then((kusto) => {\n          const model = editor.getModel();\n          return model && kusto(model.uri);\n        })\n        .then((worker) => {\n          worker?.setSchema(schema, 'https://help.kusto.windows.net', 'Samples');\n        });\n    });\n  }, [datasource.azureLogAnalyticsDatasource, query.azureLogAnalytics?.resource]);\n\n  const handleEditorMount = useCallback((editor: MonacoEditor, monaco: Monaco) => {\n    monacoPromiseRef.current?.resolve?.({ editor, monaco });\n  }, []);\n\n  const onChange = useCallback(\n    (newQuery: string) => {\n      onQueryChange(setKustoQuery(query, newQuery));\n    },\n    [onQueryChange, query]\n  );\n\n  return (\n    <CodeEditor\n      value={query.azureLogAnalytics?.query ?? ''}\n      language=\"kusto\"\n      height={200}\n      width=\"100%\"\n      showMiniMap={false}\n      onBlur={onChange}\n      onSave={onChange}\n      onEditorDidMount={handleEditorMount}\n    />\n  );\n};\n\nexport default QueryField;\n","import React, { useCallback, useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport { AzureQueryEditorFieldProps } from '../../types';\nimport { Field } from '../Field';\nimport { setFormatAs } from './setQueryValue';\n\nconst FORMAT_OPTIONS: Array<SelectableValue<string>> = [\n  { label: 'Time series', value: 'time_series' },\n  { label: 'Table', value: 'table' },\n];\n\nconst FormatAsField: React.FC<AzureQueryEditorFieldProps> = ({ query, variableOptionGroup, onQueryChange }) => {\n  const options = useMemo(() => [...FORMAT_OPTIONS, variableOptionGroup], [variableOptionGroup]);\n\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      const { value } = change;\n      if (!value) {\n        return;\n      }\n\n      const newQuery = setFormatAs(query, value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  return (\n    <Field label=\"Format as\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-logs-workspaces-field\"\n        value={query.azureLogAnalytics?.resultFormat}\n        onChange={handleChange}\n        options={options}\n        width={38}\n      />\n    </Field>\n  );\n};\n\nexport default FormatAsField;\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  table: css({\n    width: '100%',\n    tableLayout: 'fixed',\n  }),\n\n  tableScroller: css({\n    maxHeight: '50vh',\n    overflow: 'auto',\n  }),\n\n  header: css({\n    background: theme.colors.background.secondary,\n  }),\n\n  row: css({\n    borderBottom: `1px solid ${theme.colors.border.weak}`,\n\n    '&:last-of-type': {\n      borderBottomColor: theme.colors.border.medium,\n    },\n  }),\n\n  disabledRow: css({\n    opacity: 0.5,\n  }),\n\n  cell: css({\n    padding: theme.spacing(1, 1, 1, 0),\n    width: '25%',\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    '&:first-of-type': {\n      width: '50%',\n      padding: theme.spacing(1, 1, 1, 2),\n    },\n  }),\n\n  collapseButton: css({ margin: 0 }),\n\n  loadingCell: css({\n    textAlign: 'center',\n  }),\n\n  spinner: css({\n    marginBottom: 0,\n  }),\n\n  nestedEntry: css({\n    display: 'flex',\n    alignItems: 'center',\n  }),\n\n  entryContentItem: css({\n    margin: theme.spacing(0, 1, 0, 0),\n  }),\n\n  truncated: css({\n    minWidth: 0,\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    whiteSpace: 'nowrap',\n  }),\n});\n\nexport default getStyles;\n","import { cx } from '@emotion/css';\nimport { Checkbox, Icon, IconButton, LoadingPlaceholder, useStyles2, useTheme2, FadeTransition } from '@grafana/ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Space } from '../Space';\nimport getStyles from './styles';\nimport { ResourceRowType, ResourceRow, ResourceRowGroup } from './types';\nimport { findRow } from './utils';\n\ninterface NestedRowsProps {\n  rows: ResourceRowGroup;\n  level: number;\n  selectedRows: ResourceRowGroup;\n  requestNestedRows: (row: ResourceRow) => Promise<void>;\n  onRowSelectedChange: (row: ResourceRow, selected: boolean) => void;\n}\n\nconst NestedRows: React.FC<NestedRowsProps> = ({\n  rows,\n  selectedRows,\n  level,\n  requestNestedRows,\n  onRowSelectedChange,\n}) => (\n  <>\n    {rows.map((row) => (\n      <NestedRow\n        key={row.id}\n        row={row}\n        selectedRows={selectedRows}\n        level={level}\n        requestNestedRows={requestNestedRows}\n        onRowSelectedChange={onRowSelectedChange}\n      />\n    ))}\n  </>\n);\n\ninterface NestedRowProps {\n  row: ResourceRow;\n  level: number;\n  selectedRows: ResourceRowGroup;\n  requestNestedRows: (row: ResourceRow) => Promise<void>;\n  onRowSelectedChange: (row: ResourceRow, selected: boolean) => void;\n}\n\nconst NestedRow: React.FC<NestedRowProps> = ({ row, selectedRows, level, requestNestedRows, onRowSelectedChange }) => {\n  const styles = useStyles2(getStyles);\n  const initialOpenStatus = row.type === ResourceRowType.Subscription ? 'open' : 'closed';\n  const [rowStatus, setRowStatus] = useState<'open' | 'closed' | 'loading'>(initialOpenStatus);\n\n  const isSelected = !!selectedRows.find((v) => v.id === row.id);\n  const isDisabled = selectedRows.length > 0 && !isSelected;\n  const isOpen = rowStatus === 'open';\n\n  const onRowToggleCollapse = async () => {\n    if (rowStatus === 'open') {\n      setRowStatus('closed');\n      return;\n    }\n    setRowStatus('loading');\n    await requestNestedRows(row);\n    setRowStatus('open');\n  };\n\n  // opens the resource group on load of component if there was a previously saved selection\n  useEffect(() => {\n    // Assuming we don't have multi-select yet\n    const selectedRow = selectedRows[0];\n\n    const containsChild = selectedRow && !!findRow(row.children ?? [], selectedRow.id);\n\n    if (containsChild) {\n      setRowStatus('open');\n    }\n  }, [selectedRows, row]);\n\n  return (\n    <>\n      <tr className={cx(styles.row, isDisabled && styles.disabledRow)} key={row.id}>\n        <td className={styles.cell}>\n          <NestedEntry\n            level={level}\n            isSelected={isSelected}\n            isDisabled={isDisabled}\n            isOpen={isOpen}\n            entry={row}\n            onToggleCollapse={onRowToggleCollapse}\n            onSelectedChange={onRowSelectedChange}\n          />\n        </td>\n\n        <td className={styles.cell}>{row.typeLabel}</td>\n\n        <td className={styles.cell}>{row.location ?? '-'}</td>\n      </tr>\n\n      {isOpen && row.children && Object.keys(row.children).length > 0 && (\n        <NestedRows\n          rows={row.children}\n          selectedRows={selectedRows}\n          level={level + 1}\n          requestNestedRows={requestNestedRows}\n          onRowSelectedChange={onRowSelectedChange}\n        />\n      )}\n\n      <FadeTransition visible={rowStatus === 'loading'}>\n        <tr>\n          <td className={cx(styles.cell, styles.loadingCell)} colSpan={3}>\n            <LoadingPlaceholder text=\"Loading...\" className={styles.spinner} />\n          </td>\n        </tr>\n      </FadeTransition>\n    </>\n  );\n};\n\ninterface EntryIconProps {\n  entry: ResourceRow;\n  isOpen: boolean;\n}\n\nconst EntryIcon: React.FC<EntryIconProps> = ({ isOpen, entry: { type } }) => {\n  switch (type) {\n    case ResourceRowType.Subscription:\n      return <Icon name=\"layer-group\" />;\n\n    case ResourceRowType.ResourceGroup:\n      return <Icon name={isOpen ? 'folder-open' : 'folder'} />;\n\n    case ResourceRowType.Resource:\n      return <Icon name=\"cube\" />;\n\n    case ResourceRowType.VariableGroup:\n      return <Icon name=\"x\" />;\n\n    case ResourceRowType.Variable:\n      return <Icon name=\"x\" />;\n\n    default:\n      return null;\n  }\n};\n\ninterface NestedEntryProps {\n  level: number;\n  entry: ResourceRow;\n  isSelected: boolean;\n  isOpen: boolean;\n  isDisabled: boolean;\n  onToggleCollapse: (row: ResourceRow) => void;\n  onSelectedChange: (row: ResourceRow, selected: boolean) => void;\n}\n\nconst NestedEntry: React.FC<NestedEntryProps> = ({\n  entry,\n  isSelected,\n  isDisabled,\n  isOpen,\n  level,\n  onToggleCollapse,\n  onSelectedChange,\n}) => {\n  const theme = useTheme2();\n  const styles = useStyles2(getStyles);\n  const hasChildren = !!entry.children;\n  // Subscriptions, resource groups, resources, and variables are all selectable, so\n  // the top-level variable group is the only thing that cannot be selected.\n  const isSelectable = entry.type !== ResourceRowType.VariableGroup;\n\n  const handleToggleCollapse = useCallback(() => {\n    onToggleCollapse(entry);\n  }, [onToggleCollapse, entry]);\n\n  const handleSelectedChanged = useCallback(\n    (ev: React.ChangeEvent<HTMLInputElement>) => {\n      const isSelected = ev.target.checked;\n      onSelectedChange(entry, isSelected);\n    },\n    [entry, onSelectedChange]\n  );\n\n  const checkboxId = `checkbox_${entry.id}`;\n\n  return (\n    <div className={styles.nestedEntry} style={{ marginLeft: level * (3 * theme.spacing.gridSize) }}>\n      {/* When groups are selectable, I *think* we will want to show a 2-wide space instead\n            of the collapse button for leaf rows that have no children to get them to align */}\n\n      {hasChildren ? (\n        <IconButton\n          className={styles.collapseButton}\n          name={isOpen ? 'angle-down' : 'angle-right'}\n          aria-label={isOpen ? 'Collapse' : 'Expand'}\n          onClick={handleToggleCollapse}\n          id={entry.id}\n        />\n      ) : (\n        <Space layout=\"inline\" h={2} />\n      )}\n\n      <Space layout=\"inline\" h={2} />\n\n      {isSelectable && (\n        <>\n          <Checkbox id={checkboxId} onChange={handleSelectedChanged} disabled={isDisabled} value={isSelected} />\n          <Space layout=\"inline\" h={2} />\n        </>\n      )}\n\n      <EntryIcon entry={entry} isOpen={isOpen} />\n      <Space layout=\"inline\" h={1} />\n\n      <label htmlFor={checkboxId} className={cx(styles.entryContentItem, styles.truncated)}>\n        {entry.name}\n      </label>\n    </div>\n  );\n};\n\nexport default NestedRows;\n","import React from 'react';\nimport { cx } from '@emotion/css';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport NestedRows from './NestedRows';\nimport getStyles from './styles';\nimport { ResourceRow, ResourceRowGroup } from './types';\n\ninterface NestedResourceTableProps {\n  rows: ResourceRowGroup;\n  selectedRows: ResourceRowGroup;\n  noHeader?: boolean;\n  requestNestedRows: (row: ResourceRow) => Promise<void>;\n  onRowSelectedChange: (row: ResourceRow, selected: boolean) => void;\n}\n\nconst NestedResourceTable: React.FC<NestedResourceTableProps> = ({\n  rows,\n  selectedRows,\n  noHeader,\n  requestNestedRows,\n  onRowSelectedChange,\n}) => {\n  const styles = useStyles2(getStyles);\n\n  return (\n    <>\n      <table className={styles.table}>\n        {!noHeader && (\n          <thead>\n            <tr className={cx(styles.row, styles.header)}>\n              <td className={styles.cell}>Scope</td>\n              <td className={styles.cell}>Type</td>\n              <td className={styles.cell}>Location</td>\n            </tr>\n          </thead>\n        )}\n      </table>\n\n      <div className={styles.tableScroller}>\n        <table className={styles.table}>\n          <tbody>\n            <NestedRows\n              rows={rows}\n              selectedRows={selectedRows}\n              level={0}\n              requestNestedRows={requestNestedRows}\n              onRowSelectedChange={onRowSelectedChange}\n            />\n          </tbody>\n        </table>\n      </div>\n    </>\n  );\n};\n\nexport default NestedResourceTable;\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport NestedResourceTable from './NestedResourceTable';\nimport { ResourceRow, ResourceRowGroup } from './types';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, LoadingPlaceholder, useStyles2 } from '@grafana/ui';\nimport ResourcePickerData from '../../resourcePicker/resourcePickerData';\nimport { Space } from '../Space';\nimport { addResources, findRow, parseResourceURI } from './utils';\n\ninterface ResourcePickerProps {\n  resourcePickerData: ResourcePickerData;\n  resourceURI: string | undefined;\n  templateVariables: string[];\n\n  onApply: (resourceURI: string | undefined) => void;\n  onCancel: () => void;\n}\n\nconst ResourcePicker = ({\n  resourcePickerData,\n  resourceURI,\n  templateVariables,\n  onApply,\n  onCancel,\n}: ResourcePickerProps) => {\n  const styles = useStyles2(getStyles);\n\n  const [azureRows, setAzureRows] = useState<ResourceRowGroup>([]);\n  const [internalSelected, setInternalSelected] = useState<string | undefined>(resourceURI);\n  const [isLoading, setIsLoading] = useState(false);\n\n  // Sync the resourceURI prop to internal state\n  useEffect(() => {\n    setInternalSelected(resourceURI);\n  }, [resourceURI]);\n\n  const rows = useMemo(() => {\n    const templateVariableRow = resourcePickerData.transformVariablesToRow(templateVariables);\n    return templateVariables.length ? [...azureRows, templateVariableRow] : azureRows;\n  }, [resourcePickerData, azureRows, templateVariables]);\n\n  // Map the selected item into an array of rows\n  const selectedResourceRows = useMemo(() => {\n    const found = internalSelected && findRow(rows, internalSelected);\n    return found\n      ? [\n          {\n            ...found,\n            children: undefined,\n          },\n        ]\n      : [];\n  }, [internalSelected, rows]);\n\n  // Request resources for a expanded resource group\n  const requestNestedRows = useCallback(\n    async (resourceGroup: ResourceRow) => {\n      // If we already have children, we don't need to re-fetch them. Also abort if we're expanding the special\n      // template variable group, though that shouldn't happen in practice\n      if (resourceGroup.children?.length || resourceGroup.id === ResourcePickerData.templateVariableGroupID) {\n        return;\n      }\n\n      // fetch and set nested resources for the resourcegroup into the bigger state object\n      const resources = await resourcePickerData.getResourcesForResourceGroup(resourceGroup);\n      const newRows = addResources(azureRows, resourceGroup.id, resources);\n      setAzureRows(newRows);\n    },\n    [resourcePickerData, azureRows]\n  );\n\n  // Select\n  const handleSelectionChanged = useCallback((row: ResourceRow, isSelected: boolean) => {\n    isSelected ? setInternalSelected(row.id) : setInternalSelected(undefined);\n  }, []);\n\n  // Request initial data on first mount\n  useEffect(() => {\n    setIsLoading(true);\n    resourcePickerData.getResourcePickerData().then((initalRows) => {\n      setIsLoading(false);\n      setAzureRows(initalRows);\n    });\n  }, [resourcePickerData]);\n\n  // Request sibling resources for a selected resource - in practice should only be on first mount\n  useEffect(() => {\n    if (!internalSelected || !rows.length) {\n      return;\n    }\n\n    // If we can find this resource in the rows, then we don't need to load anything\n    const foundResourceRow = findRow(rows, internalSelected);\n    if (foundResourceRow) {\n      return;\n    }\n\n    const parsedURI = parseResourceURI(internalSelected);\n    const resourceGroupURI = `/subscriptions/${parsedURI?.subscriptionID}/resourceGroups/${parsedURI?.resourceGroup}`;\n    const resourceGroupRow = findRow(rows, resourceGroupURI);\n\n    if (!resourceGroupRow) {\n      // We haven't loaded the data from Azure yet\n      return;\n    }\n\n    requestNestedRows(resourceGroupRow);\n  }, [requestNestedRows, internalSelected, rows]);\n\n  const handleApply = useCallback(() => {\n    onApply(internalSelected);\n  }, [internalSelected, onApply]);\n\n  return (\n    <div>\n      {isLoading ? (\n        <div className={styles.loadingWrapper}>\n          <LoadingPlaceholder text={'Loading resources...'} />\n        </div>\n      ) : (\n        <>\n          <NestedResourceTable\n            rows={rows}\n            requestNestedRows={requestNestedRows}\n            onRowSelectedChange={handleSelectionChanged}\n            selectedRows={selectedResourceRows}\n          />\n\n          <div className={styles.selectionFooter}>\n            {selectedResourceRows.length > 0 && (\n              <>\n                <Space v={2} />\n                <h5>Selection</h5>\n                <NestedResourceTable\n                  rows={selectedResourceRows}\n                  requestNestedRows={requestNestedRows}\n                  onRowSelectedChange={handleSelectionChanged}\n                  selectedRows={selectedResourceRows}\n                  noHeader={true}\n                />\n              </>\n            )}\n\n            <Space v={2} />\n\n            <Button onClick={handleApply}>Apply</Button>\n            <Space layout=\"inline\" h={1} />\n            <Button onClick={onCancel} variant=\"secondary\">\n              Cancel\n            </Button>\n          </div>\n        </>\n      )}\n    </div>\n  );\n};\n\nexport default ResourcePicker;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  selectionFooter: css({\n    position: 'sticky',\n    bottom: 0,\n    background: theme.colors.background.primary,\n    paddingTop: theme.spacing(2),\n  }),\n  loadingWrapper: css({\n    textAlign: 'center',\n    paddingTop: theme.spacing(2),\n    paddingBottom: theme.spacing(2),\n    color: theme.colors.text.secondary,\n  }),\n});\n","import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, Icon, Modal, useStyles2 } from '@grafana/ui';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport Datasource from '../../datasource';\nimport { AzureQueryEditorFieldProps, AzureResourceSummaryItem } from '../../types';\nimport { Field } from '../Field';\nimport ResourcePicker from '../ResourcePicker';\nimport { parseResourceURI } from '../ResourcePicker/utils';\nimport { Space } from '../Space';\nimport { setResource } from './setQueryValue';\n\nfunction parseResourceDetails(resourceURI: string) {\n  const parsed = parseResourceURI(resourceURI);\n\n  if (!parsed) {\n    return undefined;\n  }\n\n  return {\n    subscriptionName: parsed.subscriptionID,\n    resourceGroupName: parsed.resourceGroup,\n    resourceName: parsed.resource,\n  };\n}\n\nconst ResourceField: React.FC<AzureQueryEditorFieldProps> = ({ query, datasource, onQueryChange }) => {\n  const styles = useStyles2(getStyles);\n  const { resource } = query.azureLogAnalytics ?? {};\n  const [pickerIsOpen, setPickerIsOpen] = useState(false);\n\n  const handleOpenPicker = useCallback(() => {\n    setPickerIsOpen(true);\n  }, []);\n\n  const closePicker = useCallback(() => {\n    setPickerIsOpen(false);\n  }, []);\n\n  const handleApply = useCallback(\n    (resourceURI: string | undefined) => {\n      onQueryChange(setResource(query, resourceURI));\n      closePicker();\n    },\n    [closePicker, onQueryChange, query]\n  );\n\n  const templateVariables = datasource.getVariables();\n\n  return (\n    <>\n      <Modal\n        className={styles.modal}\n        title=\"Select a resource\"\n        isOpen={pickerIsOpen}\n        onDismiss={closePicker}\n        // The growing number of rows added to the modal causes a focus\n        // error in the modal, making it impossible to click on new elements\n        trapFocus={false}\n      >\n        <ResourcePicker\n          resourcePickerData={datasource.resourcePickerData}\n          resourceURI={resource}\n          templateVariables={templateVariables}\n          onApply={handleApply}\n          onCancel={closePicker}\n        />\n      </Modal>\n\n      <Field label=\"Resource\">\n        <Button variant=\"secondary\" onClick={handleOpenPicker} type=\"button\">\n          <ResourceLabel resource={resource} datasource={datasource} />\n        </Button>\n      </Field>\n    </>\n  );\n};\n\ninterface ResourceLabelProps {\n  resource: string | undefined;\n  datasource: Datasource;\n}\n\nconst ResourceLabel = ({ resource, datasource }: ResourceLabelProps) => {\n  const [resourceComponents, setResourceComponents] = useState(parseResourceDetails(resource ?? ''));\n\n  useEffect(() => {\n    if (resource && parseResourceDetails(resource)) {\n      datasource.resourcePickerData.getResourceURIDisplayProperties(resource).then(setResourceComponents);\n    } else {\n      setResourceComponents(undefined);\n    }\n  }, [datasource.resourcePickerData, resource]);\n\n  if (!resource) {\n    return <>Select a resource</>;\n  }\n\n  if (resourceComponents) {\n    return <FormattedResource resource={resourceComponents} />;\n  }\n\n  if (resource.startsWith('$')) {\n    return (\n      <span>\n        <Icon name=\"x\" /> {resource}\n      </span>\n    );\n  }\n\n  return <>{resource}</>;\n};\n\ninterface FormattedResourceProps {\n  resource: AzureResourceSummaryItem;\n}\n\nconst FormattedResource = ({ resource }: FormattedResourceProps) => {\n  return (\n    <span>\n      <Icon name=\"layer-group\" /> {resource.subscriptionName}\n      {resource.resourceGroupName && (\n        <>\n          <Separator />\n          <Icon name=\"folder\" /> {resource.resourceGroupName}\n        </>\n      )}\n      {resource.resourceName && (\n        <>\n          <Separator />\n          <Icon name=\"cube\" /> {resource.resourceName}\n        </>\n      )}\n    </span>\n  );\n};\n\nconst Separator = () => (\n  <>\n    <Space layout=\"inline\" h={2} />\n    {'/'}\n    <Space layout=\"inline\" h={2} />\n  </>\n);\n\nexport default ResourceField;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  modal: css({\n    width: theme.breakpoints.values.lg,\n  }),\n});\n","import { useEffect, useState } from 'react';\nimport { AzureMonitorQuery } from '../../types';\nimport Datasource from '../../datasource';\nimport { isGUIDish } from '../ResourcePicker/utils';\n\nasync function migrateWorkspaceQueryToResourceQuery(\n  datasource: Datasource,\n  query: AzureMonitorQuery,\n  onChange: (newQuery: AzureMonitorQuery) => void\n) {\n  if (query.azureLogAnalytics?.workspace !== undefined && !query.azureLogAnalytics.resource) {\n    const isWorkspaceGUID = isGUIDish(query.azureLogAnalytics.workspace);\n    let resource: string;\n\n    if (isWorkspaceGUID) {\n      resource = await datasource.resourcePickerData.getResourceURIFromWorkspace(query.azureLogAnalytics.workspace);\n    } else {\n      // The value of workspace is probably a template variable so we just migrate it over as-is\n      resource = query.azureLogAnalytics.workspace;\n    }\n\n    const newQuery = {\n      ...query,\n      azureLogAnalytics: {\n        ...query.azureLogAnalytics,\n        resource: resource,\n        workspace: undefined,\n      },\n    };\n\n    delete newQuery.azureLogAnalytics.workspace;\n\n    onChange(newQuery);\n  }\n}\n\ninterface ErrorMessage {\n  title: string;\n  message: string;\n}\n\nexport default function useMigrations(\n  datasource: Datasource,\n  query: AzureMonitorQuery,\n  onChange: (newQuery: AzureMonitorQuery) => void\n) {\n  const [migrationError, setMigrationError] = useState<ErrorMessage>();\n\n  useEffect(() => {\n    migrateWorkspaceQueryToResourceQuery(datasource, query, onChange).catch((err) =>\n      setMigrationError({\n        title: 'Unable to migrate workspace as a resource',\n        message: err.message,\n      })\n    );\n  }, [datasource, query, onChange]);\n\n  return migrationError;\n}\n","import React from 'react';\nimport { AzureMonitorErrorish, AzureMonitorOption, AzureMonitorQuery } from '../../types';\nimport Datasource from '../../datasource';\nimport { Alert, InlineFieldRow } from '@grafana/ui';\nimport QueryField from './QueryField';\nimport FormatAsField from './FormatAsField';\nimport ResourceField from './ResourceField';\nimport useMigrations from './useMigrations';\n\ninterface LogsQueryEditorProps {\n  query: AzureMonitorQuery;\n  datasource: Datasource;\n  subscriptionId?: string;\n  onChange: (newQuery: AzureMonitorQuery) => void;\n  variableOptionGroup: { label: string; options: AzureMonitorOption[] };\n  setError: (source: string, error: AzureMonitorErrorish | undefined) => void;\n  hideFormatAs?: boolean;\n}\n\nconst LogsQueryEditor: React.FC<LogsQueryEditorProps> = ({\n  query,\n  datasource,\n  subscriptionId,\n  variableOptionGroup,\n  onChange,\n  setError,\n  hideFormatAs,\n}) => {\n  const migrationError = useMigrations(datasource, query, onChange);\n\n  return (\n    <div data-testid=\"azure-monitor-logs-query-editor\">\n      <InlineFieldRow>\n        <ResourceField\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n      </InlineFieldRow>\n\n      <QueryField\n        query={query}\n        datasource={datasource}\n        subscriptionId={subscriptionId}\n        variableOptionGroup={variableOptionGroup}\n        onQueryChange={onChange}\n        setError={setError}\n      />\n\n      {!hideFormatAs && (\n        <FormatAsField\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n      )}\n\n      {migrationError && <Alert title={migrationError.title}>{migrationError.message}</Alert>}\n    </div>\n  );\n};\n\nexport default LogsQueryEditor;\n","import { AzureMonitorQuery } from '../../types';\n\nexport function setKustoQuery(query: AzureMonitorQuery, kustoQuery: string): AzureMonitorQuery {\n  return {\n    ...query,\n    azureLogAnalytics: {\n      ...query.azureLogAnalytics,\n      query: kustoQuery,\n    },\n  };\n}\n\nexport function setFormatAs(query: AzureMonitorQuery, formatAs: string): AzureMonitorQuery {\n  return {\n    ...query,\n    azureLogAnalytics: {\n      ...query.azureLogAnalytics,\n      resultFormat: formatAs,\n    },\n  };\n}\n\nexport function setResource(query: AzureMonitorQuery, resourceURI: string | undefined): AzureMonitorQuery {\n  return {\n    ...query,\n    azureLogAnalytics: {\n      ...query.azureLogAnalytics,\n      resource: resourceURI,\n    },\n  };\n}\n","import { AzureMetricDimension, AzureMonitorQuery } from '../../types';\n\nexport function setSubscriptionID(query: AzureMonitorQuery, subscriptionID: string): AzureMonitorQuery {\n  if (query.subscription === subscriptionID) {\n    return query;\n  }\n\n  return {\n    ...query,\n    subscription: subscriptionID,\n    azureMonitor: {\n      ...query.azureMonitor,\n      resourceGroup: undefined,\n      metricDefinition: undefined,\n      metricNamespace: undefined,\n      resourceName: undefined,\n      metricName: undefined,\n      aggregation: undefined,\n      timeGrain: '',\n      dimensionFilters: [],\n    },\n  };\n}\n\nexport function setResourceGroup(query: AzureMonitorQuery, resourceGroup: string | undefined): AzureMonitorQuery {\n  if (query.azureMonitor?.resourceGroup === resourceGroup) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      resourceGroup: resourceGroup,\n      metricDefinition: undefined,\n      metricNamespace: undefined,\n      resourceName: undefined,\n      metricName: undefined,\n      aggregation: undefined,\n      timeGrain: '',\n      dimensionFilters: [],\n    },\n  };\n}\n\n// In the query as \"metricDefinition\" for some reason\nexport function setResourceType(query: AzureMonitorQuery, resourceType: string | undefined): AzureMonitorQuery {\n  if (query.azureMonitor?.metricDefinition === resourceType) {\n    return query;\n  }\n\n  const newQuery = {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      metricDefinition: resourceType,\n      resourceName: undefined,\n      metricNamespace: undefined,\n      metricName: undefined,\n      aggregation: undefined,\n      timeGrain: '',\n      dimensionFilters: [],\n    },\n  };\n\n  return newQuery;\n}\n\nexport function setResourceName(query: AzureMonitorQuery, resourceName: string | undefined): AzureMonitorQuery {\n  if (query.azureMonitor?.resourceName === resourceName) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      resourceName: resourceName,\n      metricNamespace: undefined,\n      metricName: undefined,\n      aggregation: undefined,\n      timeGrain: '',\n      dimensionFilters: [],\n    },\n  };\n}\n\nexport function setMetricNamespace(query: AzureMonitorQuery, metricNamespace: string | undefined): AzureMonitorQuery {\n  if (query.azureMonitor?.metricNamespace === metricNamespace) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      metricNamespace: metricNamespace,\n      metricName: undefined,\n      aggregation: undefined,\n      timeGrain: '',\n      dimensionFilters: [],\n    },\n  };\n}\n\nexport function setMetricName(query: AzureMonitorQuery, metricName: string | undefined): AzureMonitorQuery {\n  if (query.azureMonitor?.metricName === metricName) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      metricName: metricName,\n      aggregation: undefined,\n      timeGrain: '',\n      dimensionFilters: [],\n    },\n  };\n}\n\nexport function setAggregation(query: AzureMonitorQuery, aggregation: string): AzureMonitorQuery {\n  if (query.azureMonitor?.aggregation === aggregation) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      aggregation: aggregation,\n    },\n  };\n}\n\nexport function setTimeGrain(query: AzureMonitorQuery, timeGrain: string): AzureMonitorQuery {\n  if (query.azureMonitor?.timeGrain === timeGrain) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      timeGrain: timeGrain,\n    },\n  };\n}\n\nexport function setDimensionFilters(query: AzureMonitorQuery, dimensions: AzureMetricDimension[]): AzureMonitorQuery {\n  if (query.azureMonitor?.dimensionFilters === dimensions) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      dimensionFilters: dimensions,\n    },\n  };\n}\n\nexport function appendDimensionFilter(\n  query: AzureMonitorQuery,\n  dimension = '',\n  operator = 'eq',\n  filter = ''\n): AzureMonitorQuery {\n  const existingFilters = query.azureMonitor?.dimensionFilters ?? [];\n\n  return setDimensionFilters(query, [\n    ...existingFilters,\n    {\n      dimension,\n      operator,\n      filter,\n    },\n  ]);\n}\n\nexport function removeDimensionFilter(query: AzureMonitorQuery, indexToRemove: number): AzureMonitorQuery {\n  const existingFilters = query.azureMonitor?.dimensionFilters ?? [];\n  const newFilters = [...existingFilters];\n  newFilters.splice(indexToRemove, 1);\n  return setDimensionFilters(query, newFilters);\n}\n\nexport function setDimensionFilterValue<Key extends keyof AzureMetricDimension>(\n  query: AzureMonitorQuery,\n  index: number,\n  fieldName: Key,\n  value: AzureMetricDimension[Key]\n): AzureMonitorQuery {\n  const existingFilters = query.azureMonitor?.dimensionFilters ?? [];\n  const newFilters = [...existingFilters];\n  const newFilter = newFilters[index];\n  newFilter[fieldName] = value;\n  return setDimensionFilters(query, newFilters);\n}\n\nexport function setTop(query: AzureMonitorQuery, top: string): AzureMonitorQuery {\n  if (query.azureMonitor?.top === top) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      top: top,\n    },\n  };\n}\n\nexport function setLegendAlias(query: AzureMonitorQuery, alias: string): AzureMonitorQuery {\n  if (query.azureMonitor?.alias === alias) {\n    return query;\n  }\n\n  return {\n    ...query,\n    azureMonitor: {\n      ...query.azureMonitor,\n      alias: alias,\n    },\n  };\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { SelectableValue } from '@grafana/data';\nimport { Select, MultiSelect } from '@grafana/ui';\n\nimport { AzureMonitorQuery, AzureQueryEditorFieldProps, AzureMonitorOption, AzureQueryType } from '../types';\nimport { findOptions } from '../utils/common';\nimport { Field } from './Field';\n\ninterface SubscriptionFieldProps extends AzureQueryEditorFieldProps {\n  onQueryChange: (newQuery: AzureMonitorQuery) => void;\n  subscriptions: AzureMonitorOption[];\n  multiSelect?: boolean;\n}\n\nconst SubscriptionField: React.FC<SubscriptionFieldProps> = ({\n  query,\n  subscriptions,\n  variableOptionGroup,\n  onQueryChange,\n  multiSelect = false,\n}) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      if (!change.value) {\n        return;\n      }\n\n      let newQuery: AzureMonitorQuery = {\n        ...query,\n        subscription: change.value,\n      };\n\n      if (query.queryType === AzureQueryType.AzureMonitor) {\n        newQuery.azureMonitor = {\n          ...newQuery.azureMonitor,\n          resourceGroup: undefined,\n          metricDefinition: undefined,\n          metricNamespace: undefined,\n          resourceName: undefined,\n          metricName: undefined,\n          aggregation: undefined,\n          timeGrain: '',\n          dimensionFilters: [],\n        };\n      }\n\n      onQueryChange(newQuery);\n    },\n    [query, onQueryChange]\n  );\n\n  const onSubscriptionsChange = useCallback(\n    (change: Array<SelectableValue<string>>) => {\n      if (!change) {\n        return;\n      }\n\n      query.subscriptions = change.map((c) => c.value ?? '');\n\n      onQueryChange(query);\n    },\n    [query, onQueryChange]\n  );\n\n  const options = useMemo(() => [...subscriptions, variableOptionGroup], [subscriptions, variableOptionGroup]);\n\n  return multiSelect ? (\n    <Field label=\"Subscriptions\">\n      <MultiSelect\n        menuShouldPortal\n        isClearable\n        value={findOptions([...subscriptions, ...variableOptionGroup.options], query.subscriptions)}\n        inputId=\"azure-monitor-subscriptions-field\"\n        onChange={onSubscriptionsChange}\n        options={options}\n        width={38}\n      />\n    </Field>\n  ) : (\n    <Field label=\"Subscription\">\n      <Select\n        menuShouldPortal\n        value={query.subscription}\n        inputId=\"azure-monitor-subscriptions-field\"\n        onChange={handleChange}\n        options={options}\n        width={38}\n        allowCustomValue\n      />\n    </Field>\n  );\n};\n\nexport default SubscriptionField;\n","import React, { useCallback, useMemo } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps, AzureMonitorOption } from '../../types';\nimport { setMetricNamespace } from './setQueryValue';\n\ninterface MetricNamespaceFieldProps extends AzureQueryEditorFieldProps {\n  metricNamespaces: AzureMonitorOption[];\n}\n\nconst MetricNamespaceField: React.FC<MetricNamespaceFieldProps> = ({\n  metricNamespaces,\n  query,\n  variableOptionGroup,\n  onQueryChange,\n}) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      if (!change.value) {\n        return;\n      }\n\n      const newQuery = setMetricNamespace(query, change.value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  const options = useMemo(() => [...metricNamespaces, variableOptionGroup], [metricNamespaces, variableOptionGroup]);\n  const optionValues = metricNamespaces.map((m) => m.value).concat(variableOptionGroup.options.map((p) => p.value));\n  const value = query.azureMonitor?.metricNamespace;\n  if (value && !optionValues.includes(value)) {\n    options.push({ label: value, value });\n  }\n\n  return (\n    <Field label=\"Metric namespace\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-metrics-metric-namespace-field\"\n        value={query.azureMonitor?.metricNamespace}\n        onChange={handleChange}\n        options={options}\n        width={38}\n        allowCustomValue\n      />\n    </Field>\n  );\n};\n\nexport default MetricNamespaceField;\n","import React, { useCallback, useMemo } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps, AzureMonitorOption } from '../../types';\nimport { setResourceType } from './setQueryValue';\n\ninterface NamespaceFieldProps extends AzureQueryEditorFieldProps {\n  resourceTypes: AzureMonitorOption[];\n}\n\nconst NamespaceField: React.FC<NamespaceFieldProps> = ({\n  resourceTypes,\n  query,\n  variableOptionGroup,\n  onQueryChange,\n}) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      if (!change.value) {\n        return;\n      }\n\n      const newQuery = setResourceType(query, change.value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  const options = useMemo(() => [...resourceTypes, variableOptionGroup], [resourceTypes, variableOptionGroup]);\n\n  return (\n    <Field label=\"Resource type\">\n      {/* It's expected that the label reads Resource type but the property is metricDefinition */}\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-metrics-resource-type-field\"\n        value={query.azureMonitor?.metricDefinition}\n        onChange={handleChange}\n        options={options}\n        width={38}\n        allowCustomValue\n      />\n    </Field>\n  );\n};\n\nexport default NamespaceField;\n","import React, { useCallback, useMemo } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps, AzureMonitorOption } from '../../types';\nimport { setResourceGroup } from './setQueryValue';\n\ninterface ResourceGroupsFieldProps extends AzureQueryEditorFieldProps {\n  resourceGroups: AzureMonitorOption[];\n}\n\nconst ResourceGroupsField: React.FC<ResourceGroupsFieldProps> = ({\n  query,\n  resourceGroups,\n  variableOptionGroup,\n  onQueryChange,\n  setError,\n}) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      const newQuery = setResourceGroup(query, change.value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  const options = useMemo(() => [...resourceGroups, variableOptionGroup], [resourceGroups, variableOptionGroup]);\n\n  return (\n    <Field label=\"Resource group\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-metrics-resource-group-field\"\n        value={query.azureMonitor?.resourceGroup}\n        onChange={handleChange}\n        options={options}\n        width={38}\n        allowCustomValue\n      />\n    </Field>\n  );\n};\n\nexport default ResourceGroupsField;\n","import React, { useCallback, useMemo } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps, AzureMonitorOption } from '../../types';\nimport { setResourceName } from './setQueryValue';\n\ninterface ResourceNameFieldProps extends AzureQueryEditorFieldProps {\n  resourceNames: AzureMonitorOption[];\n}\n\nconst ResourceNameField: React.FC<ResourceNameFieldProps> = ({\n  resourceNames,\n  query,\n  variableOptionGroup,\n  onQueryChange,\n}) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      const newQuery = setResourceName(query, change.value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  const options = useMemo(() => [...resourceNames, variableOptionGroup], [resourceNames, variableOptionGroup]);\n  const value = query.azureMonitor?.resourceName ?? null;\n\n  return (\n    <Field label=\"Resource name\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-metrics-resource-name-field\"\n        value={value}\n        onChange={handleChange}\n        options={options}\n        width={38}\n        allowCustomValue\n      />\n    </Field>\n  );\n};\n\nexport default ResourceNameField;\n","import React, { useCallback, useMemo } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps, AzureMonitorOption } from '../../types';\nimport { setMetricName } from './setQueryValue';\n\ninterface MetricNameProps extends AzureQueryEditorFieldProps {\n  metricNames: AzureMonitorOption[];\n}\n\nconst MetricNameField: React.FC<MetricNameProps> = ({ metricNames, query, variableOptionGroup, onQueryChange }) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      if (!change.value) {\n        return;\n      }\n\n      const newQuery = setMetricName(query, change.value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  const options = useMemo(() => [...metricNames, variableOptionGroup], [metricNames, variableOptionGroup]);\n\n  return (\n    <Field label=\"Metric\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-metrics-metric-field\"\n        value={query.azureMonitor?.metricName ?? null}\n        onChange={handleChange}\n        options={options}\n        width={38}\n        allowCustomValue\n      />\n    </Field>\n  );\n};\n\nexport default MetricNameField;\n","import React, { useCallback, useMemo } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps, AzureMonitorOption } from '../../types';\nimport { setAggregation } from './setQueryValue';\n\ninterface AggregationFieldProps extends AzureQueryEditorFieldProps {\n  aggregationOptions: AzureMonitorOption[];\n  isLoading: boolean;\n}\n\nconst AggregationField: React.FC<AggregationFieldProps> = ({\n  query,\n  variableOptionGroup,\n  onQueryChange,\n  aggregationOptions,\n  isLoading,\n}) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      if (!change.value) {\n        return;\n      }\n\n      const newQuery = setAggregation(query, change.value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  const options = useMemo(() => [...aggregationOptions, variableOptionGroup], [\n    aggregationOptions,\n    variableOptionGroup,\n  ]);\n\n  return (\n    <Field label=\"Aggregation\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-metrics-aggregation-field\"\n        value={query.azureMonitor?.aggregation}\n        onChange={handleChange}\n        options={options}\n        width={38}\n        isLoading={isLoading}\n      />\n    </Field>\n  );\n};\n\nexport default AggregationField;\n","import React, { useCallback, useMemo } from 'react';\nimport { Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\n\nimport { Field } from '../Field';\nimport TimegrainConverter from '../../time_grain_converter';\nimport { AzureQueryEditorFieldProps, AzureMonitorOption } from '../../types';\nimport { setTimeGrain } from './setQueryValue';\n\ninterface TimeGrainFieldProps extends AzureQueryEditorFieldProps {\n  timeGrainOptions: AzureMonitorOption[];\n}\n\nconst TimeGrainField: React.FC<TimeGrainFieldProps> = ({\n  query,\n  timeGrainOptions,\n  variableOptionGroup,\n  onQueryChange,\n}) => {\n  const handleChange = useCallback(\n    (change: SelectableValue<string>) => {\n      if (!change.value) {\n        return;\n      }\n\n      const newQuery = setTimeGrain(query, change.value);\n      onQueryChange(newQuery);\n    },\n    [onQueryChange, query]\n  );\n\n  const timeGrains = useMemo(() => {\n    const autoInterval = TimegrainConverter.findClosestTimeGrain(\n      '1m',\n      timeGrainOptions.map((o) => TimegrainConverter.createKbnUnitFromISO8601Duration(o.value)) || [\n        '1m',\n        '5m',\n        '15m',\n        '30m',\n        '1h',\n        '6h',\n        '12h',\n        '1d',\n      ]\n    );\n\n    const baseTimeGrains = timeGrainOptions.map((v) => (v.value === 'auto' ? { ...v, description: autoInterval } : v));\n\n    return [...baseTimeGrains, variableOptionGroup];\n  }, [timeGrainOptions, variableOptionGroup]);\n\n  return (\n    <Field label=\"Time grain\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-metrics-time-grain-field\"\n        value={query.azureMonitor?.timeGrain}\n        onChange={handleChange}\n        options={timeGrains}\n        width={38}\n      />\n    </Field>\n  );\n};\n\nexport default TimeGrainField;\n","import React, { useMemo } from 'react';\nimport { Button, Select, Input, HorizontalGroup, VerticalGroup, InlineLabel } from '@grafana/ui';\n\nimport { Field } from '../Field';\nimport { AzureMetricDimension, AzureMonitorOption, AzureQueryEditorFieldProps } from '../../types';\nimport { appendDimensionFilter, removeDimensionFilter, setDimensionFilterValue } from './setQueryValue';\n\ninterface DimensionFieldsProps extends AzureQueryEditorFieldProps {\n  dimensionOptions: AzureMonitorOption[];\n}\n\nconst DimensionFields: React.FC<DimensionFieldsProps> = ({ query, dimensionOptions, onQueryChange }) => {\n  const dimensionFilters = useMemo(() => query.azureMonitor?.dimensionFilters ?? [], [\n    query.azureMonitor?.dimensionFilters,\n  ]);\n\n  const addFilter = () => {\n    onQueryChange(appendDimensionFilter(query));\n  };\n\n  const removeFilter = (index: number) => {\n    onQueryChange(removeDimensionFilter(query, index));\n  };\n\n  const onFieldChange = <Key extends keyof AzureMetricDimension>(\n    filterIndex: number,\n    fieldName: Key,\n    value: AzureMetricDimension[Key]\n  ) => {\n    onQueryChange(setDimensionFilterValue(query, filterIndex, fieldName, value));\n  };\n\n  const onFilterInputChange = (index: number, ev: React.FormEvent) => {\n    if (ev.target instanceof HTMLInputElement) {\n      onFieldChange(index, 'filter', ev.target.value);\n    }\n  };\n\n  return (\n    <Field label=\"Dimension\">\n      <VerticalGroup spacing=\"xs\">\n        {dimensionFilters.map((filter, index) => (\n          <HorizontalGroup key={index} spacing=\"xs\">\n            <Select\n              menuShouldPortal\n              placeholder=\"Field\"\n              value={filter.dimension}\n              options={dimensionOptions}\n              onChange={(v) => onFieldChange(index, 'dimension', v.value ?? '')}\n              width={38}\n            />\n            <InlineLabel aria-label=\"equals\">==</InlineLabel>\n            <Input placeholder=\"\" value={filter.filter} onChange={(ev) => onFilterInputChange(index, ev)} />\n            <Button\n              variant=\"secondary\"\n              size=\"md\"\n              icon=\"trash-alt\"\n              aria-label=\"Remove\"\n              onClick={() => removeFilter(index)}\n            ></Button>\n          </HorizontalGroup>\n        ))}\n\n        <Button variant=\"secondary\" size=\"md\" onClick={addFilter}>\n          Add new dimension\n        </Button>\n      </VerticalGroup>\n    </Field>\n  );\n};\n\nexport default DimensionFields;\n","import React, { useCallback, useState } from 'react';\nimport { Input } from '@grafana/ui';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps } from '../../types';\nimport { setTop } from './setQueryValue';\n\nconst TopField: React.FC<AzureQueryEditorFieldProps> = ({ onQueryChange, query }) => {\n  const [value, setValue] = useState<string>(query.azureMonitor?.top ?? '');\n\n  // As calling onQueryChange initiates a the datasource refresh, we only want to call it once\n  // the field loses focus\n  const handleChange = useCallback((ev: React.FormEvent) => {\n    if (ev.target instanceof HTMLInputElement) {\n      setValue(ev.target.value);\n    }\n  }, []);\n\n  const handleBlur = useCallback(() => {\n    const newQuery = setTop(query, value);\n    onQueryChange(newQuery);\n  }, [onQueryChange, query, value]);\n\n  return (\n    <Field label=\"Top\">\n      <Input\n        id=\"azure-monitor-metrics-top-field\"\n        value={value}\n        onChange={handleChange}\n        onBlur={handleBlur}\n        width={16}\n      />\n    </Field>\n  );\n};\n\nexport default TopField;\n","import React, { useCallback, useState } from 'react';\nimport { Input } from '@grafana/ui';\n\nimport { Field } from '../Field';\nimport { AzureQueryEditorFieldProps } from '../../types';\nimport { setLegendAlias } from './setQueryValue';\n\nconst LegendFormatField: React.FC<AzureQueryEditorFieldProps> = ({ onQueryChange, query }) => {\n  const [value, setValue] = useState<string>(query.azureMonitor?.alias ?? '');\n\n  // As calling onQueryChange initiates a the datasource refresh, we only want to call it once\n  // the field loses focus\n  const handleChange = useCallback((ev: React.FormEvent) => {\n    if (ev.target instanceof HTMLInputElement) {\n      setValue(ev.target.value);\n    }\n  }, []);\n\n  const handleBlur = useCallback(() => {\n    const newQuery = setLegendAlias(query, value);\n    onQueryChange(newQuery);\n  }, [onQueryChange, query, value]);\n\n  return (\n    <Field label=\"Legend format\">\n      <Input\n        id=\"azure-monitor-metrics-legend-field\"\n        placeholder=\"Alias patterns\"\n        value={value}\n        onChange={handleChange}\n        onBlur={handleBlur}\n        width={38}\n      />\n    </Field>\n  );\n};\n\nexport default LegendFormatField;\n","import { useEffect, useMemo, useState } from 'react';\n\nimport Datasource from '../../datasource';\nimport { AzureMonitorErrorish, AzureMonitorOption, AzureMonitorQuery } from '../../types';\nimport { hasOption, toOption } from '../../utils/common';\nimport { setMetricNamespace, setSubscriptionID } from './setQueryValue';\n\nexport interface MetricMetadata {\n  aggOptions: AzureMonitorOption[];\n  timeGrains: AzureMonitorOption[];\n  dimensions: AzureMonitorOption[];\n  isLoading: boolean;\n\n  // These two properties are only used within the hook, and not elsewhere\n  supportedAggTypes: string[];\n  primaryAggType: string | undefined;\n}\n\ntype SetErrorFn = (source: string, error: AzureMonitorErrorish | undefined) => void;\ntype OnChangeFn = (newQuery: AzureMonitorQuery) => void;\n\nexport type DataHook = (\n  query: AzureMonitorQuery,\n  datasource: Datasource,\n  onChange: OnChangeFn,\n  setError: SetErrorFn\n) => AzureMonitorOption[];\n\nexport function useAsyncState<T>(asyncFn: () => Promise<T>, setError: Function, dependencies: unknown[]) {\n  // Use the lazy initial state functionality of useState to assign a random ID to the API call\n  // to track where errors come from. See useLastError.\n  const [errorSource] = useState(() => Math.random());\n  const [value, setValue] = useState<T>();\n\n  const finalValue = useMemo(() => value ?? [], [value]);\n\n  useEffect(() => {\n    asyncFn()\n      .then((results) => {\n        setValue(results);\n        setError(errorSource, undefined);\n      })\n      .catch((err) => {\n        setError(errorSource, err);\n      });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, dependencies);\n\n  return finalValue;\n}\n\nexport const updateSubscriptions = (\n  query: AzureMonitorQuery,\n  subscriptionOptions: AzureMonitorOption[],\n  onChange: OnChangeFn,\n  defaultSubscription?: string\n) => {\n  const { subscription } = query;\n\n  // Return early if subscriptions havent loaded, or if the query already has a subscription\n  if (\n    !subscriptionOptions.length ||\n    (subscription && (hasOption(subscriptionOptions, subscription) || subscription.includes('$')))\n  ) {\n    return;\n  }\n\n  const defaultSub = defaultSubscription || subscriptionOptions[0].value;\n\n  if (!subscription && defaultSub && hasOption(subscriptionOptions, defaultSub)) {\n    onChange(setSubscriptionID(query, defaultSub));\n  }\n\n  // Check if the current subscription is in the list of subscriptions\n  if (subscription && !hasOption(subscriptionOptions, subscription)) {\n    if (hasOption(subscriptionOptions, defaultSub)) {\n      // Use the default sub if is on theh list\n      onChange(setSubscriptionID(query, defaultSub));\n    } else {\n      // Neither the current subscription nor the defaultSub is on the list, remove it\n      onChange(setSubscriptionID(query, ''));\n    }\n  }\n};\n\nexport const useSubscriptions: DataHook = (query, datasource, onChange, setError) => {\n  const defaultSubscription = datasource.azureMonitorDatasource.defaultSubscriptionId;\n  const { subscription } = query;\n\n  const subscriptionOptions = useAsyncState(\n    async () => {\n      const results = await datasource.azureMonitorDatasource.getSubscriptions();\n      const options = formatOptions(results, subscription);\n\n      return options;\n    },\n    setError,\n    []\n  );\n\n  useEffect(() => {\n    updateSubscriptions(query, subscriptionOptions, onChange, defaultSubscription);\n  }, [subscriptionOptions, query, defaultSubscription, onChange]);\n\n  return subscriptionOptions;\n};\n\nexport const useResourceGroups: DataHook = (query, datasource, onChange, setError) => {\n  const { subscription } = query;\n  const { resourceGroup } = query.azureMonitor ?? {};\n\n  return useAsyncState(\n    async () => {\n      if (!subscription) {\n        return;\n      }\n\n      const results = await datasource.getResourceGroups(subscription);\n      const options = formatOptions(results, resourceGroup);\n\n      return options;\n    },\n    setError,\n    [subscription]\n  );\n};\n\nexport const useResourceTypes: DataHook = (query, datasource, onChange, setError) => {\n  const { subscription } = query;\n  const { resourceGroup, metricDefinition } = query.azureMonitor ?? {};\n\n  return useAsyncState(\n    async () => {\n      if (!(subscription && resourceGroup)) {\n        return;\n      }\n\n      const results = await datasource.getMetricDefinitions(subscription, resourceGroup);\n      const options = formatOptions(results, metricDefinition);\n\n      return options;\n    },\n    setError,\n    [subscription, resourceGroup]\n  );\n};\n\nexport const useResourceNames: DataHook = (query, datasource, onChange, setError) => {\n  const { subscription } = query;\n  const { resourceGroup, metricDefinition, resourceName } = query.azureMonitor ?? {};\n\n  return useAsyncState(\n    async () => {\n      if (!(subscription && resourceGroup && metricDefinition)) {\n        return;\n      }\n\n      const results = await datasource.getResourceNames(subscription, resourceGroup, metricDefinition);\n      const options = formatOptions(results, resourceName);\n\n      return options;\n    },\n    setError,\n    [subscription, resourceGroup, metricDefinition]\n  );\n};\n\nexport const useMetricNamespaces: DataHook = (query, datasource, onChange, setError) => {\n  const { subscription } = query;\n  const { resourceGroup, metricDefinition, resourceName, metricNamespace } = query.azureMonitor ?? {};\n\n  const metricNamespaces = useAsyncState(\n    async () => {\n      if (!(subscription && resourceGroup && metricDefinition && resourceName)) {\n        return;\n      }\n\n      const results = await datasource.getMetricNamespaces(subscription, resourceGroup, metricDefinition, resourceName);\n      const options = formatOptions(results, metricNamespace);\n\n      // Do some cleanup of the query state if need be\n      if (!metricNamespace && options.length) {\n        onChange(setMetricNamespace(query, options[0].value));\n      }\n\n      return options;\n    },\n    setError,\n    [subscription, resourceGroup, metricDefinition, resourceName]\n  );\n\n  return metricNamespaces;\n};\n\nexport const useMetricNames: DataHook = (query, datasource, onChange, setError) => {\n  const { subscription } = query;\n  const { resourceGroup, metricDefinition, resourceName, metricNamespace, metricName } = query.azureMonitor ?? {};\n\n  return useAsyncState(\n    async () => {\n      if (!(subscription && resourceGroup && metricDefinition && resourceName && metricNamespace)) {\n        return;\n      }\n\n      const results = await datasource.getMetricNames(\n        subscription,\n        resourceGroup,\n        metricDefinition,\n        resourceName,\n        metricNamespace\n      );\n\n      const options = formatOptions(results, metricName);\n\n      return options;\n    },\n    setError,\n    [subscription, resourceGroup, metricDefinition, resourceName, metricNamespace]\n  );\n};\n\nexport const useMetricMetadata = (query: AzureMonitorQuery, datasource: Datasource, onChange: OnChangeFn) => {\n  const [metricMetadata, setMetricMetadata] = useState<MetricMetadata>({\n    aggOptions: [],\n    timeGrains: [],\n    dimensions: [],\n    isLoading: false,\n    supportedAggTypes: [],\n    primaryAggType: undefined,\n  });\n\n  const { subscription } = query;\n  const { resourceGroup, metricDefinition, resourceName, metricNamespace, metricName, aggregation, timeGrain } =\n    query.azureMonitor ?? {};\n\n  // Fetch new metric metadata when the fields change\n  useEffect(() => {\n    if (!(subscription && resourceGroup && metricDefinition && resourceName && metricNamespace && metricName)) {\n      return;\n    }\n\n    datasource\n      .getMetricMetadata(subscription, resourceGroup, metricDefinition, resourceName, metricNamespace, metricName)\n      .then((metadata) => {\n        // TODO: Move the aggregationTypes and timeGrain defaults into `getMetricMetadata`\n        const aggregations = (metadata.supportedAggTypes || [metadata.primaryAggType]).map((v) => ({\n          label: v,\n          value: v,\n        }));\n\n        setMetricMetadata({\n          aggOptions: aggregations,\n          timeGrains: metadata.supportedTimeGrains,\n          dimensions: metadata.dimensions,\n          isLoading: false,\n          supportedAggTypes: metadata.supportedAggTypes ?? [],\n          primaryAggType: metadata.primaryAggType,\n        });\n      });\n  }, [datasource, subscription, resourceGroup, metricDefinition, resourceName, metricNamespace, metricName]);\n\n  // Update the query state in response to the meta data changing\n  useEffect(() => {\n    const aggregationIsValid = aggregation && metricMetadata.supportedAggTypes.includes(aggregation);\n\n    const newAggregation = aggregationIsValid ? aggregation : metricMetadata.primaryAggType;\n    const newTimeGrain = timeGrain || 'auto';\n\n    if (newAggregation !== aggregation || newTimeGrain !== timeGrain) {\n      onChange({\n        ...query,\n        azureMonitor: {\n          ...query.azureMonitor,\n          aggregation: newAggregation,\n          timeGrain: newTimeGrain,\n        },\n      });\n    }\n  }, [onChange, metricMetadata, aggregation, timeGrain, query]);\n\n  return metricMetadata;\n};\n\nfunction formatOptions(\n  rawResults: Array<{\n    text: string;\n    value: string;\n  }>,\n  selectedValue?: string\n) {\n  const options = rawResults.map(toOption);\n\n  // account for custom values that might have been set in json file like ones crafted with a template variable (ex: \"cloud-datasource-resource-$Environment\")\n  if (selectedValue && !options.find((option) => option.value === selectedValue)) {\n    options.push({ label: selectedValue, value: selectedValue });\n  }\n\n  return options;\n}\n","import React from 'react';\n\nimport Datasource from '../../datasource';\nimport { AzureMonitorQuery, AzureMonitorOption, AzureMonitorErrorish } from '../../types';\nimport SubscriptionField from '../SubscriptionField';\nimport MetricNamespaceField from './MetricNamespaceField';\nimport ResourceTypeField from './ResourceTypeField';\nimport ResourceGroupsField from './ResourceGroupsField';\nimport ResourceNameField from './ResourceNameField';\nimport MetricNameField from './MetricNameField';\nimport AggregationField from './AggregationField';\nimport TimeGrainField from './TimeGrainField';\nimport DimensionFields from './DimensionFields';\nimport TopField from './TopField';\nimport LegendFormatField from './LegendFormatField';\nimport { InlineFieldRow } from '@grafana/ui';\nimport {\n  useMetricNames,\n  useMetricNamespaces,\n  useResourceGroups,\n  useResourceNames,\n  useResourceTypes,\n  useSubscriptions,\n  useMetricMetadata,\n} from './dataHooks';\n\ninterface MetricsQueryEditorProps {\n  query: AzureMonitorQuery;\n  datasource: Datasource;\n  subscriptionId?: string;\n  onChange: (newQuery: AzureMonitorQuery) => void;\n  variableOptionGroup: { label: string; options: AzureMonitorOption[] };\n  setError: (source: string, error: AzureMonitorErrorish | undefined) => void;\n}\n\nconst MetricsQueryEditor: React.FC<MetricsQueryEditorProps> = ({\n  query,\n  datasource,\n  subscriptionId,\n  variableOptionGroup,\n  onChange,\n  setError,\n}) => {\n  const metricsMetadata = useMetricMetadata(query, datasource, onChange);\n  const subscriptions = useSubscriptions(query, datasource, onChange, setError);\n  const resourceGroups = useResourceGroups(query, datasource, onChange, setError);\n  const resourceTypes = useResourceTypes(query, datasource, onChange, setError);\n  const resourceNames = useResourceNames(query, datasource, onChange, setError);\n  const metricNames = useMetricNames(query, datasource, onChange, setError);\n  const metricNamespaces = useMetricNamespaces(query, datasource, onChange, setError);\n\n  return (\n    <div data-testid=\"azure-monitor-metrics-query-editor\">\n      <InlineFieldRow>\n        <SubscriptionField\n          subscriptions={subscriptions}\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n\n        <ResourceGroupsField\n          resourceGroups={resourceGroups}\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n      </InlineFieldRow>\n\n      <InlineFieldRow>\n        <ResourceTypeField\n          resourceTypes={resourceTypes}\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n        <ResourceNameField\n          resourceNames={resourceNames}\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n      </InlineFieldRow>\n\n      <InlineFieldRow>\n        <MetricNamespaceField\n          metricNamespaces={metricNamespaces}\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n        <MetricNameField\n          metricNames={metricNames}\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n      </InlineFieldRow>\n      <InlineFieldRow>\n        <AggregationField\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n          aggregationOptions={metricsMetadata?.aggOptions ?? []}\n          isLoading={metricsMetadata.isLoading}\n        />\n        <TimeGrainField\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n          timeGrainOptions={metricsMetadata?.timeGrains ?? []}\n        />\n      </InlineFieldRow>\n      <DimensionFields\n        query={query}\n        datasource={datasource}\n        subscriptionId={subscriptionId}\n        variableOptionGroup={variableOptionGroup}\n        onQueryChange={onChange}\n        setError={setError}\n        dimensionOptions={metricsMetadata?.dimensions ?? []}\n      />\n      <TopField\n        query={query}\n        datasource={datasource}\n        subscriptionId={subscriptionId}\n        variableOptionGroup={variableOptionGroup}\n        onQueryChange={onChange}\n        setError={setError}\n      />\n      <LegendFormatField\n        query={query}\n        datasource={datasource}\n        subscriptionId={subscriptionId}\n        variableOptionGroup={variableOptionGroup}\n        onQueryChange={onChange}\n        setError={setError}\n      />\n    </div>\n  );\n};\n\nexport default MetricsQueryEditor;\n","import React, { useCallback, useState } from 'react';\nimport { Select } from '@grafana/ui';\nimport { Field } from '../Field';\nimport { AzureMonitorQuery, AzureQueryType } from '../../types';\nimport { SelectableValue } from '@grafana/data';\n\ninterface QueryTypeFieldProps {\n  query: AzureMonitorQuery;\n  onQueryChange: (newQuery: AzureMonitorQuery) => void;\n}\n\nconst QueryTypeField: React.FC<QueryTypeFieldProps> = ({ query, onQueryChange }) => {\n  // Use useState to capture the initial value on first mount. We're not interested in when it changes\n  // We only show App Insights and Insights Analytics if they were initially selected. Otherwise, hide them.\n  const [initialQueryType] = useState(query.queryType);\n  const showAppInsights =\n    initialQueryType === AzureQueryType.ApplicationInsights || initialQueryType === AzureQueryType.InsightsAnalytics;\n\n  const queryTypes = [\n    { value: AzureQueryType.AzureMonitor, label: 'Metrics' },\n    { value: AzureQueryType.LogAnalytics, label: 'Logs' },\n    { value: AzureQueryType.AzureResourceGraph, label: 'Azure Resource Graph' },\n  ];\n\n  if (showAppInsights) {\n    queryTypes.push(\n      { value: AzureQueryType.ApplicationInsights, label: 'Application Insights' },\n      { value: AzureQueryType.InsightsAnalytics, label: 'Insights Analytics' }\n    );\n  }\n\n  const handleChange = useCallback(\n    (change: SelectableValue<AzureQueryType>) => {\n      change.value &&\n        onQueryChange({\n          ...query,\n          queryType: change.value,\n        });\n    },\n    [onQueryChange, query]\n  );\n\n  return (\n    <Field label=\"Service\">\n      <Select\n        menuShouldPortal\n        inputId=\"azure-monitor-query-type-field\"\n        value={query.queryType}\n        options={queryTypes}\n        onChange={handleChange}\n        width={38}\n      />\n    </Field>\n  );\n};\n\nexport default QueryTypeField;\n","import { CodeEditor } from '@grafana/ui';\nimport React, { useCallback } from 'react';\nimport { AzureQueryEditorFieldProps } from '../../types';\n\nconst QueryField: React.FC<AzureQueryEditorFieldProps> = ({ query, onQueryChange }) => {\n  const onChange = useCallback(\n    (newQuery: string) => {\n      onQueryChange({\n        ...query,\n        azureResourceGraph: {\n          ...query.azureResourceGraph,\n          query: newQuery,\n        },\n      });\n    },\n    [onQueryChange, query]\n  );\n\n  return (\n    <CodeEditor\n      value={query.azureResourceGraph?.query ?? ''}\n      language=\"kusto\"\n      height={200}\n      width={1000}\n      showMiniMap={false}\n      onBlur={onChange}\n      onSave={onChange}\n    />\n  );\n};\n\nexport default QueryField;\n","import React, { useEffect, useState, useRef } from 'react';\nimport { AzureMonitorErrorish, AzureMonitorOption, AzureMonitorQuery } from '../../types';\nimport Datasource from '../../datasource';\nimport { InlineFieldRow } from '@grafana/ui';\nimport SubscriptionField from '../SubscriptionField';\nimport QueryField from './QueryField';\n\ninterface LogsQueryEditorProps {\n  query: AzureMonitorQuery;\n  datasource: Datasource;\n  subscriptionId?: string;\n  onChange: (newQuery: AzureMonitorQuery) => void;\n  variableOptionGroup: { label: string; options: AzureMonitorOption[] };\n  setError: (source: string, error: AzureMonitorErrorish | undefined) => void;\n}\n\nconst ERROR_SOURCE = 'arg-subscriptions';\nconst ArgQueryEditor: React.FC<LogsQueryEditorProps> = ({\n  query,\n  datasource,\n  subscriptionId,\n  variableOptionGroup,\n  onChange,\n  setError,\n}) => {\n  const fetchedRef = useRef(false);\n  const [subscriptions, setSubscriptions] = useState<AzureMonitorOption[]>([]);\n\n  useEffect(() => {\n    if (fetchedRef.current) {\n      return;\n    }\n\n    fetchedRef.current = true;\n    datasource.azureMonitorDatasource\n      .getSubscriptions()\n      .then((results) => {\n        const fetchedSubscriptions = results.map((v) => ({ label: v.text, value: v.value, description: v.value }));\n        setSubscriptions(fetchedSubscriptions);\n        setError(ERROR_SOURCE, undefined);\n\n        if (!query.subscriptions?.length && fetchedSubscriptions?.length) {\n          onChange({\n            ...query,\n            subscriptions: [query.subscription ?? fetchedSubscriptions[0].value],\n          });\n        }\n      })\n      .catch((err) => setError(ERROR_SOURCE, err));\n  }, [datasource, onChange, query, setError]);\n\n  return (\n    <div data-testid=\"azure-monitor-logs-query-editor\">\n      <InlineFieldRow>\n        <SubscriptionField\n          multiSelect\n          subscriptions={subscriptions}\n          query={query}\n          datasource={datasource}\n          subscriptionId={subscriptionId}\n          variableOptionGroup={variableOptionGroup}\n          onQueryChange={onChange}\n          setError={setError}\n        />\n      </InlineFieldRow>\n\n      <QueryField\n        query={query}\n        datasource={datasource}\n        subscriptionId={subscriptionId}\n        variableOptionGroup={variableOptionGroup}\n        onQueryChange={onChange}\n        setError={setError}\n      />\n    </div>\n  );\n};\n\nexport default ArgQueryEditor;\n","import React from 'react';\nimport { AzureMonitorQuery } from '../../types';\nimport { Alert, Input } from '@grafana/ui';\nimport { Field } from '../Field';\n\nconst ReadOnlyTimeGrain = ({\n  timeGrainCount,\n  timeGrainType,\n  timeGrainUnit,\n}: {\n  timeGrainCount: string;\n  timeGrainType: string;\n  timeGrainUnit: string;\n}) => {\n  const timeFields = timeGrainType === 'specific' ? ['specific', timeGrainCount, timeGrainUnit] : [timeGrainType];\n\n  return (\n    <Field label=\"Timegrain\">\n      <>\n        {timeFields.map((timeField) => (\n          <Input value={timeField} disabled={true} onChange={() => {}} key={timeField} width={10} />\n        ))}\n      </>\n    </Field>\n  );\n};\n\nconst ApplicationInsightsEditor = ({ query }: { query: AzureMonitorQuery }) => {\n  const groupBy = query.appInsights?.dimension || [];\n\n  return (\n    <div data-testid=\"azure-monitor-application-insights-query-editor\">\n      <Field label=\"Metric\" disabled={true}>\n        <Input\n          value={query.appInsights?.metricName}\n          disabled={true}\n          onChange={() => {}}\n          id=\"azure-monitor-application-insights-metric\"\n        />\n      </Field>\n      <Field label=\"Aggregation\" disabled={true}>\n        <Input value={query.appInsights?.aggregation} disabled={true} onChange={() => {}} />\n      </Field>\n      {groupBy.length > 0 && (\n        <Field label=\"Group by\">\n          <>\n            {groupBy.map((dimension) => (\n              <Input value={dimension} disabled={true} onChange={() => {}} key={dimension} />\n            ))}\n          </>\n        </Field>\n      )}\n      <Field label=\"Filter\" disabled={true}>\n        <Input value={query.appInsights?.dimensionFilter} disabled={true} onChange={() => {}} />\n      </Field>\n      <ReadOnlyTimeGrain\n        timeGrainCount={query.appInsights?.timeGrainCount || ''}\n        timeGrainType={query.appInsights?.timeGrainType || 'auto'}\n        timeGrainUnit={query.appInsights?.timeGrainUnit || 'minute'}\n      />\n      <Field label=\"Legend format\" disabled={true}>\n        <Input placeholder=\"Alias patterns\" value={query.appInsights?.alias} onChange={() => {}} disabled={true} />\n      </Field>\n      <Alert severity=\"info\" title=\"Deprecated\">\n        Application Insights is deprecated and is now read only. Migrate your queries to Metrics to make changes.\n      </Alert>\n    </div>\n  );\n};\n\nexport default ApplicationInsightsEditor;\n","import { Alert, CodeEditor, Select } from '@grafana/ui';\nimport React from 'react';\nimport { AzureMonitorOption, AzureMonitorQuery } from '../../types';\nimport { Field } from '../Field';\nimport { Space } from '../Space';\n\ninterface InsightsAnalyticsEditorProps {\n  query: AzureMonitorQuery;\n}\n\nconst FORMAT_OPTIONS: Array<AzureMonitorOption<string>> = [\n  { label: 'Time series', value: 'time_series' },\n  { label: 'Table', value: 'table' },\n];\n\nconst InsightsAnalyticsEditor: React.FC<InsightsAnalyticsEditorProps> = ({ query }) => {\n  return (\n    <div data-testid=\"azure-monitor-insights-analytics-query-editor\">\n      <CodeEditor\n        language=\"kusto\"\n        value={query.insightsAnalytics?.query ?? ''}\n        height={200}\n        width=\"100%\"\n        readOnly={true}\n        showMiniMap={false}\n      />\n\n      <Field label=\"Format as\">\n        <Select\n          menuShouldPortal\n          inputId=\"azure-monitor-logs-workspaces-field\"\n          value={query.insightsAnalytics?.resultFormat}\n          disabled={true}\n          options={FORMAT_OPTIONS}\n          onChange={() => {}}\n          width={38}\n        />\n      </Field>\n\n      <Space v={2} />\n\n      <Alert severity=\"info\" title=\"Deprecated\">\n        Insights Analytics is deprecated and is now read only. Migrate your queries to Logs to make changes.\n      </Alert>\n    </div>\n  );\n};\n\nexport default InsightsAnalyticsEditor;\n","import { useEffect, useMemo } from 'react';\nimport { defaults } from 'lodash';\nimport { AzureMonitorQuery, AzureQueryType } from '../../types';\nimport deepEqual from 'fast-deep-equal';\nimport migrateQuery from '../../utils/migrateQuery';\n\nconst DEFAULT_QUERY = {\n  queryType: AzureQueryType.AzureMonitor,\n};\n\nconst prepareQuery = (query: AzureMonitorQuery) => {\n  // Note: _.defaults does not apply default values deeply.\n  const withDefaults = defaults({}, query, DEFAULT_QUERY);\n  const migratedQuery = migrateQuery(withDefaults);\n\n  // If we didn't make any changes to the object, then return the original object to keep the\n  // identity the same, and not trigger any other useEffects or anything.\n  return deepEqual(migratedQuery, query) ? query : migratedQuery;\n};\n\n/**\n * Returns queries with some defaults + migrations, and calls onChange function to notify if it changes\n */\nconst usePreparedQuery = (query: AzureMonitorQuery, onChangeQuery: (newQuery: AzureMonitorQuery) => void) => {\n  const preparedQuery = useMemo(() => prepareQuery(query), [query]);\n\n  useEffect(() => {\n    if (preparedQuery !== query) {\n      onChangeQuery(preparedQuery);\n    }\n  }, [preparedQuery, query, onChangeQuery]);\n\n  return preparedQuery;\n};\n\nexport default usePreparedQuery;\n","import { Alert } from '@grafana/ui';\nimport { QueryEditorProps } from '@grafana/data';\nimport React, { useCallback, useMemo } from 'react';\nimport AzureMonitorDatasource from '../../datasource';\nimport {\n  AzureMonitorQuery,\n  AzureQueryType,\n  AzureMonitorOption,\n  AzureMonitorErrorish,\n  AzureDataSourceJsonData,\n} from '../../types';\nimport MetricsQueryEditor from '../MetricsQueryEditor';\nimport QueryTypeField from './QueryTypeField';\nimport useLastError from '../../utils/useLastError';\nimport LogsQueryEditor from '../LogsQueryEditor';\nimport ArgQueryEditor from '../ArgQueryEditor';\nimport ApplicationInsightsEditor from '../ApplicationInsightsEditor';\nimport InsightsAnalyticsEditor from '../InsightsAnalyticsEditor';\nimport { Space } from '../Space';\nimport { debounce } from 'lodash';\nimport usePreparedQuery from './usePreparedQuery';\n\nexport type AzureMonitorQueryEditorProps = QueryEditorProps<\n  AzureMonitorDatasource,\n  AzureMonitorQuery,\n  AzureDataSourceJsonData\n>;\n\nconst QueryEditor: React.FC<AzureMonitorQueryEditorProps> = ({\n  query: baseQuery,\n  datasource,\n  onChange,\n  onRunQuery: baseOnRunQuery,\n}) => {\n  const [errorMessage, setError] = useLastError();\n  const onRunQuery = useMemo(() => debounce(baseOnRunQuery, 500), [baseOnRunQuery]);\n\n  const onQueryChange = useCallback(\n    (newQuery: AzureMonitorQuery) => {\n      onChange(newQuery);\n      onRunQuery();\n    },\n    [onChange, onRunQuery]\n  );\n\n  const query = usePreparedQuery(baseQuery, onQueryChange);\n\n  const subscriptionId = query.subscription || datasource.azureMonitorDatasource.defaultSubscriptionId;\n  const variableOptionGroup = {\n    label: 'Template Variables',\n    options: datasource.getVariables().map((v) => ({ label: v, value: v })),\n  };\n\n  return (\n    <div data-testid=\"azure-monitor-query-editor\">\n      <QueryTypeField query={query} onQueryChange={onQueryChange} />\n\n      <EditorForQueryType\n        subscriptionId={subscriptionId}\n        query={query}\n        datasource={datasource}\n        onChange={onQueryChange}\n        variableOptionGroup={variableOptionGroup}\n        setError={setError}\n      />\n\n      {errorMessage && (\n        <>\n          <Space v={2} />\n          <Alert severity=\"error\" title=\"An error occurred while requesting metadata from Azure Monitor\">\n            {errorMessage}\n          </Alert>\n        </>\n      )}\n    </div>\n  );\n};\n\ninterface EditorForQueryTypeProps extends Omit<AzureMonitorQueryEditorProps, 'onRunQuery'> {\n  subscriptionId?: string;\n  variableOptionGroup: { label: string; options: AzureMonitorOption[] };\n  setError: (source: string, error: AzureMonitorErrorish | undefined) => void;\n}\n\nconst EditorForQueryType: React.FC<EditorForQueryTypeProps> = ({\n  subscriptionId,\n  query,\n  datasource,\n  variableOptionGroup,\n  onChange,\n  setError,\n}) => {\n  switch (query.queryType) {\n    case AzureQueryType.AzureMonitor:\n      return (\n        <MetricsQueryEditor\n          subscriptionId={subscriptionId}\n          query={query}\n          datasource={datasource}\n          onChange={onChange}\n          variableOptionGroup={variableOptionGroup}\n          setError={setError}\n        />\n      );\n\n    case AzureQueryType.LogAnalytics:\n      return (\n        <LogsQueryEditor\n          subscriptionId={subscriptionId}\n          query={query}\n          datasource={datasource}\n          onChange={onChange}\n          variableOptionGroup={variableOptionGroup}\n          setError={setError}\n        />\n      );\n\n    case AzureQueryType.ApplicationInsights:\n      return <ApplicationInsightsEditor query={query} />;\n\n    case AzureQueryType.InsightsAnalytics:\n      return <InsightsAnalyticsEditor query={query} />;\n\n    case AzureQueryType.AzureResourceGraph:\n      return (\n        <ArgQueryEditor\n          subscriptionId={subscriptionId}\n          query={query}\n          datasource={datasource}\n          onChange={onChange}\n          variableOptionGroup={variableOptionGroup}\n          setError={setError}\n        />\n      );\n\n    default:\n      return <Alert title=\"Unknown query type\" />;\n  }\n\n  return null;\n};\n\nexport default QueryEditor;\n","export enum ResourceRowType {\n  Subscription = 'Subscription',\n  ResourceGroup = 'ResourceGroup',\n  Resource = 'Resource',\n  VariableGroup = 'TemplateVariableGroup',\n  Variable = 'TemplateVariable',\n}\n\nexport interface ResourceRow {\n  id: string;\n  name: string;\n  type: ResourceRowType;\n  typeLabel: string;\n  location?: string;\n  children?: ResourceRowGroup;\n}\n\nexport type ResourceRowGroup = ResourceRow[];\n","import produce from 'immer';\nimport { ResourceRow, ResourceRowGroup } from './types';\n\n// This regex matches URIs representing:\n//  - subscriptions: /subscriptions/44693801-6ee6-49de-9b2d-9106972f9572\n//  - resource groups: /subscriptions/44693801-6ee6-49de-9b2d-9106972f9572/resourceGroups/cloud-datasources\n//  - resources: /subscriptions/44693801-6ee6-49de-9b2d-9106972f9572/resourceGroups/cloud-datasources/providers/Microsoft.Compute/virtualMachines/GithubTestDataVM\nconst RESOURCE_URI_REGEX = /\\/subscriptions\\/(?<subscriptionID>[^/]+)(?:\\/resourceGroups\\/(?<resourceGroup>[^/]+)(?:\\/providers.+\\/(?<resource>[^/]+))?)?/;\n\ntype RegexGroups = Record<string, string | undefined>;\n\nexport function parseResourceURI(resourceURI: string) {\n  const matches = RESOURCE_URI_REGEX.exec(resourceURI);\n  const groups: RegexGroups = matches?.groups ?? {};\n  const { subscriptionID, resourceGroup, resource } = groups;\n\n  if (!subscriptionID) {\n    return undefined;\n  }\n\n  return { subscriptionID, resourceGroup, resource };\n}\n\nexport function isGUIDish(input: string) {\n  return !!input.match(/^[A-Z0-9]+/i);\n}\n\nexport function findRow(rows: ResourceRowGroup, id: string): ResourceRow | undefined {\n  for (const row of rows) {\n    if (row.id.toLowerCase() === id.toLowerCase()) {\n      return row;\n    }\n\n    if (row.children) {\n      const result = findRow(row.children, id);\n\n      if (result) {\n        return result;\n      }\n    }\n  }\n\n  return undefined;\n}\n\nexport function addResources(rows: ResourceRowGroup, targetResourceGroupID: string, newResources: ResourceRowGroup) {\n  return produce(rows, (draftState) => {\n    const draftRow = findRow(draftState, targetResourceGroupID);\n\n    if (!draftRow) {\n      // This case shouldn't happen often because we're usually coming here from a resource we already have\n      throw new Error('Unable to find resource');\n    }\n\n    draftRow.children = newResources;\n  });\n}\n","import React from 'react';\nimport { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { stylesFactory, useTheme2 } from '@grafana/ui';\n\nexport interface SpaceProps {\n  v?: number;\n  h?: number;\n  layout?: 'block' | 'inline';\n}\n\nexport const Space = (props: SpaceProps) => {\n  const theme = useTheme2();\n  const styles = getStyles(theme, props);\n\n  return <span className={cx(styles.wrapper)} />;\n};\n\nSpace.defaultProps = {\n  v: 0,\n  h: 0,\n  layout: 'block',\n};\n\nconst getStyles = stylesFactory((theme: GrafanaTheme2, props: SpaceProps) => ({\n  wrapper: css([\n    {\n      paddingRight: theme.spacing(props.h ?? 0),\n      paddingBottom: theme.spacing(props.v ?? 0),\n    },\n    props.layout === 'inline' && {\n      display: 'inline-block',\n    },\n    props.layout === 'block' && {\n      display: 'block',\n    },\n  ]),\n}));\n","import { DataSourceWithBackend } from '@grafana/runtime';\nimport { DataSourceInstanceSettings } from '../../../../../../packages/grafana-data/src';\nimport {\n  locationDisplayNames,\n  logsSupportedLocationsKusto,\n  logsSupportedResourceTypesKusto,\n  resourceTypeDisplayNames,\n} from '../azureMetadata';\nimport { ResourceRowType, ResourceRow, ResourceRowGroup } from '../components/ResourcePicker/types';\nimport { parseResourceURI } from '../components/ResourcePicker/utils';\nimport {\n  AzureDataSourceJsonData,\n  AzureGraphResponse,\n  AzureMonitorQuery,\n  AzureResourceGraphOptions,\n  AzureResourceSummaryItem,\n  RawAzureResourceGroupItem,\n  RawAzureResourceItem,\n} from '../types';\nimport { routeNames } from '../utils/common';\n\nconst RESOURCE_GRAPH_URL = '/providers/Microsoft.ResourceGraph/resources?api-version=2021-03-01';\n\nexport default class ResourcePickerData extends DataSourceWithBackend<AzureMonitorQuery, AzureDataSourceJsonData> {\n  private resourcePath: string;\n\n  constructor(instanceSettings: DataSourceInstanceSettings<AzureDataSourceJsonData>) {\n    super(instanceSettings);\n    this.resourcePath = `${routeNames.resourceGraph}`;\n  }\n\n  static readonly templateVariableGroupID = '$$grafana-templateVariables$$';\n\n  async getResourcePickerData() {\n    const query = `\n      resources\n        // Put subscription details on each row\n        | join kind=leftouter (\n          ResourceContainers\n            | where type == 'microsoft.resources/subscriptions'\n            | project subscriptionName=name, subscriptionURI=id, subscriptionId\n          ) on subscriptionId\n\n        // Put resource group details on each row\n        | join kind=leftouter (\n          ResourceContainers\n            | where type == 'microsoft.resources/subscriptions/resourcegroups'\n            | project resourceGroupURI=id, resourceGroupName=name, resourceGroup, subscriptionId\n          ) on resourceGroup, subscriptionId\n\n        | where type in (${logsSupportedResourceTypesKusto})\n\n        // Get only unique resource groups and subscriptions. Also acts like a project\n        | summarize count() by resourceGroupName, resourceGroupURI, subscriptionName, subscriptionURI\n        | order by subscriptionURI asc\n    `;\n\n    let resources: RawAzureResourceGroupItem[] = [];\n    let allFetched = false;\n    let $skipToken = undefined;\n    while (!allFetched) {\n      // The response may include several pages\n      let options: Partial<AzureResourceGraphOptions> = {};\n      if ($skipToken) {\n        options = {\n          $skipToken,\n        };\n      }\n      const resourceResponse = await this.makeResourceGraphRequest<RawAzureResourceGroupItem[]>(query, 1, options);\n      if (!resourceResponse.data.length) {\n        throw new Error('unable to fetch resource details');\n      }\n      resources = resources.concat(resourceResponse.data);\n      $skipToken = resourceResponse.$skipToken;\n      allFetched = !$skipToken;\n    }\n\n    return formatResourceGroupData(resources);\n  }\n\n  async getResourcesForResourceGroup(resourceGroup: ResourceRow) {\n    const { data: response } = await this.makeResourceGraphRequest<RawAzureResourceItem[]>(`\n      resources\n      | where id hasprefix \"${resourceGroup.id}\"\n      | where type in (${logsSupportedResourceTypesKusto}) and location in (${logsSupportedLocationsKusto})\n    `);\n\n    return formatResourceGroupChildren(response);\n  }\n\n  async getResourceURIDisplayProperties(resourceURI: string): Promise<AzureResourceSummaryItem> {\n    const { subscriptionID, resourceGroup } = parseResourceURI(resourceURI) ?? {};\n\n    if (!subscriptionID) {\n      throw new Error('Invalid resource URI passed');\n    }\n\n    // resourceGroupURI and resourceURI could be invalid values, but that's okay because the join\n    // will just silently fail as expected\n    const subscriptionURI = `/subscriptions/${subscriptionID}`;\n    const resourceGroupURI = `${subscriptionURI}/resourceGroups/${resourceGroup}`;\n\n    const query = `\n      resourcecontainers\n        | where type == \"microsoft.resources/subscriptions\"\n        | where id =~ \"${subscriptionURI}\"\n        | project subscriptionName=name, subscriptionId\n\n        | join kind=leftouter (\n          resourcecontainers\n            | where type == \"microsoft.resources/subscriptions/resourcegroups\"\n            | where id =~ \"${resourceGroupURI}\"\n            | project resourceGroupName=name, resourceGroup, subscriptionId\n        ) on subscriptionId\n\n        | join kind=leftouter (\n          resources\n            | where id =~ \"${resourceURI}\"\n            | project resourceName=name, subscriptionId\n        ) on subscriptionId\n\n        | project subscriptionName, resourceGroupName, resourceName\n    `;\n\n    const { data: response } = await this.makeResourceGraphRequest<AzureResourceSummaryItem[]>(query);\n\n    if (!response.length) {\n      throw new Error('unable to fetch resource details');\n    }\n\n    return response[0];\n  }\n\n  async getResourceURIFromWorkspace(workspace: string) {\n    const { data: response } = await this.makeResourceGraphRequest<RawAzureResourceItem[]>(`\n      resources\n      | where properties['customerId'] == \"${workspace}\"\n      | project id\n    `);\n\n    if (!response.length) {\n      throw new Error('unable to find resource for workspace ' + workspace);\n    }\n\n    return response[0].id;\n  }\n\n  async makeResourceGraphRequest<T = unknown>(\n    query: string,\n    maxRetries = 1,\n    reqOptions?: Partial<AzureResourceGraphOptions>\n  ): Promise<AzureGraphResponse<T>> {\n    try {\n      return await this.postResource(this.resourcePath + RESOURCE_GRAPH_URL, {\n        query: query,\n        options: {\n          resultFormat: 'objectArray',\n          ...reqOptions,\n        },\n      });\n    } catch (error) {\n      if (maxRetries > 0) {\n        return this.makeResourceGraphRequest(query, maxRetries - 1);\n      }\n\n      throw error;\n    }\n  }\n\n  transformVariablesToRow(templateVariables: string[]): ResourceRow {\n    return {\n      id: ResourcePickerData.templateVariableGroupID,\n      name: 'Template variables',\n      type: ResourceRowType.VariableGroup,\n      typeLabel: 'Variables',\n      children: templateVariables.map((v) => ({\n        id: v,\n        name: v,\n        type: ResourceRowType.Variable,\n        typeLabel: 'Variable',\n      })),\n    };\n  }\n}\n\nfunction formatResourceGroupData(rawData: RawAzureResourceGroupItem[]) {\n  // Subscriptions goes into the top level array\n  const rows: ResourceRowGroup = [];\n\n  // Array of all the resource groups, with subscription data on each row\n  for (const row of rawData) {\n    const resourceGroupRow: ResourceRow = {\n      name: row.resourceGroupName,\n      id: row.resourceGroupURI,\n      type: ResourceRowType.ResourceGroup,\n      typeLabel: 'Resource Group',\n      children: [],\n    };\n\n    const subscription = rows.find((v) => v.id === row.subscriptionURI);\n\n    if (subscription) {\n      if (!subscription.children) {\n        subscription.children = [];\n      }\n\n      subscription.children.push(resourceGroupRow);\n    } else {\n      const newSubscriptionRow = {\n        name: row.subscriptionName,\n        id: row.subscriptionURI,\n        typeLabel: 'Subscription',\n        type: ResourceRowType.Subscription,\n        children: [resourceGroupRow],\n      };\n\n      rows.push(newSubscriptionRow);\n    }\n  }\n\n  return rows;\n}\n\nfunction formatResourceGroupChildren(rawData: RawAzureResourceItem[]): ResourceRowGroup {\n  return rawData.map((item) => ({\n    name: item.name,\n    id: item.id,\n    resourceGroupName: item.resourceGroup,\n    type: ResourceRowType.Resource,\n    typeLabel: resourceTypeDisplayNames[item.type] || item.type,\n    location: locationDisplayNames[item.location] || item.location,\n  }));\n}\n","import { includes, filter } from 'lodash';\nimport { rangeUtil } from '@grafana/data';\n\nexport default class TimeGrainConverter {\n  static createISO8601Duration(timeGrain: string | number, timeGrainUnit: any) {\n    const timeIntervals = ['hour', 'minute', 'h', 'm'];\n    if (includes(timeIntervals, timeGrainUnit)) {\n      return `PT${timeGrain}${timeGrainUnit[0].toUpperCase()}`;\n    }\n\n    return `P${timeGrain}${timeGrainUnit[0].toUpperCase()}`;\n  }\n\n  static createISO8601DurationFromInterval(interval: string) {\n    const timeGrain = +interval.slice(0, interval.length - 1);\n    const unit = interval[interval.length - 1];\n\n    if (interval.indexOf('ms') > -1) {\n      return TimeGrainConverter.createISO8601Duration(1, 'm');\n    }\n\n    if (interval[interval.length - 1] === 's') {\n      let toMinutes = (timeGrain * 60) % 60;\n\n      if (toMinutes < 1) {\n        toMinutes = 1;\n      }\n\n      return TimeGrainConverter.createISO8601Duration(toMinutes, 'm');\n    }\n\n    return TimeGrainConverter.createISO8601Duration(timeGrain, unit);\n  }\n\n  static findClosestTimeGrain(interval: any, allowedTimeGrains: string[]) {\n    const timeGrains = filter(allowedTimeGrains, (o) => o !== 'auto');\n\n    let closest = timeGrains[0];\n    const intervalMs = rangeUtil.intervalToMs(interval);\n\n    for (let i = 0; i < timeGrains.length; i++) {\n      // abs (num - val) < abs (num - curr):\n      if (intervalMs > rangeUtil.intervalToMs(timeGrains[i])) {\n        if (i + 1 < timeGrains.length) {\n          closest = timeGrains[i + 1];\n        } else {\n          closest = timeGrains[i];\n        }\n      }\n    }\n\n    return closest;\n  }\n\n  static createTimeGrainFromISO8601Duration(duration: string) {\n    let offset = 1;\n    if (duration.substring(0, 2) === 'PT') {\n      offset = 2;\n    }\n\n    const value = duration.substring(offset, duration.length - 1);\n    const unit = duration.substring(duration.length - 1);\n\n    return value + ' ' + TimeGrainConverter.timeUnitToText(+value, unit);\n  }\n\n  static timeUnitToText(value: number, unit: string) {\n    let text = '';\n\n    if (unit === 'S') {\n      text = 'second';\n    }\n    if (unit === 'M') {\n      text = 'minute';\n    }\n    if (unit === 'H') {\n      text = 'hour';\n    }\n    if (unit === 'D') {\n      text = 'day';\n    }\n\n    if (value > 1) {\n      return text + 's';\n    }\n\n    return text;\n  }\n\n  static createKbnUnitFromISO8601Duration(duration: string) {\n    if (duration === 'auto') {\n      return 'auto';\n    }\n\n    let offset = 1;\n    if (duration.substring(0, 2) === 'PT') {\n      offset = 2;\n    }\n\n    const value = duration.substring(offset, duration.length - 1);\n    const unit = duration.substring(duration.length - 1);\n\n    return value + TimeGrainConverter.timeUnitToKbn(+value, unit);\n  }\n\n  static timeUnitToKbn(value: number, unit: string) {\n    if (unit === 'S') {\n      return 's';\n    }\n    if (unit === 'M') {\n      return 'm';\n    }\n    if (unit === 'H') {\n      return 'h';\n    }\n    if (unit === 'D') {\n      return 'd';\n    }\n\n    return '';\n  }\n}\n","import { DataQuery } from '@grafana/data';\nimport { GrafanaTemplateVariableQuery } from './templateVariables';\n\nexport enum AzureQueryType {\n  AzureMonitor = 'Azure Monitor',\n  ApplicationInsights = 'Application Insights',\n  InsightsAnalytics = 'Insights Analytics',\n  LogAnalytics = 'Azure Log Analytics',\n  AzureResourceGraph = 'Azure Resource Graph',\n  GrafanaTemplateVariableFn = 'Grafana Template Variable Function',\n}\n\n/**\n * Represents the query as it moves through the frontend query editor and datasource files.\n * It can represent new queries that are still being edited, so all properties are optional\n */\nexport interface AzureMonitorQuery extends DataQuery {\n  queryType?: AzureQueryType;\n\n  subscription?: string;\n\n  /** ARG uses multiple subscriptions */\n  subscriptions?: string[];\n\n  azureMonitor?: AzureMetricQuery;\n  azureLogAnalytics?: AzureLogsQuery;\n  azureResourceGraph?: AzureResourceGraphQuery;\n  grafanaTemplateVariableFn?: GrafanaTemplateVariableQuery;\n\n  /** @deprecated App Insights/Insights Analytics deprecated in v8 */\n  appInsights?: ApplicationInsightsQuery;\n\n  /** @deprecated App Insights/Insights Analytics deprecated in v8 */\n  insightsAnalytics?: InsightsAnalyticsQuery;\n}\n\n/**\n * Azure Monitor Metrics sub-query properties\n */\nexport interface AzureMetricQuery {\n  resourceGroup?: string;\n\n  /** Resource type */\n  metricDefinition?: string;\n\n  resourceName?: string;\n  metricNamespace?: string;\n  metricName?: string;\n  timeGrain?: string;\n  aggregation?: string;\n  dimensionFilters?: AzureMetricDimension[];\n  alias?: string;\n  top?: string;\n\n  /** @deprecated */\n  timeGrainUnit?: string;\n\n  /** @deprecated Remove this once angular is removed */\n  allowedTimeGrainsMs?: number[];\n\n  /** @deprecated This property was migrated to dimensionFilters and should only be accessed in the migration */\n  dimension?: string;\n\n  /** @deprecated This property was migrated to dimensionFilters and should only be accessed in the migration */\n  dimensionFilter?: string;\n}\n\n/**\n * Azure Monitor Logs sub-query properties\n */\nexport interface AzureLogsQuery {\n  query?: string;\n  resultFormat?: string;\n  resource?: string;\n\n  workspace?: string;\n}\n\n/**\n * Azure Monitor ARG sub-query properties\n */\nexport interface AzureResourceGraphQuery {\n  query?: string;\n  resultFormat?: string;\n}\n\n/**\n * Azure Monitor App Insights sub-query properties\n * @deprecated App Insights deprecated in v8 in favor of Metrics queries\n */\nexport interface ApplicationInsightsQuery {\n  metricName?: string;\n  timeGrain?: string;\n  timeGrainCount?: string;\n  timeGrainType?: string;\n  timeGrainUnit?: string;\n  aggregation?: string;\n  dimension?: string[]; // Was string before 7.1\n  dimensionFilter?: string;\n  alias?: string;\n\n  /** @deprecated Migrated to Insights Analytics query  */\n  rawQuery?: string;\n}\n\n/**\n * Azure Monitor Insights Analytics sub-query properties\n * @deprecated Insights Analytics deprecated in v8 in favor of Logs queries\n */\nexport interface InsightsAnalyticsQuery {\n  query?: string;\n  resultFormat?: string;\n\n  /** @deprecated Migrate field to query  */\n  rawQueryString?: string;\n}\n\nexport interface AzureMetricDimension {\n  dimension: string;\n  operator: string;\n  filter?: string;\n}\n","import { DataSourceInstanceSettings, DataSourceJsonData, DataSourceSettings, TableData } from '@grafana/data';\nimport Datasource from '../datasource';\n\nimport { AzureMonitorQuery } from './query';\n\nexport type AzureDataSourceSettings = DataSourceSettings<AzureDataSourceJsonData, AzureDataSourceSecureJsonData>;\nexport type AzureDataSourceInstanceSettings = DataSourceInstanceSettings<AzureDataSourceJsonData>;\n\nexport interface DatasourceValidationResult {\n  status: 'success' | 'error';\n  message: string;\n  title?: string;\n}\n\n/**\n * Azure clouds known to Azure Monitor.\n */\nexport enum AzureCloud {\n  Public = 'AzureCloud',\n  China = 'AzureChinaCloud',\n  USGovernment = 'AzureUSGovernment',\n  Germany = 'AzureGermanCloud',\n  None = '',\n}\n\nexport type AzureAuthType = 'msi' | 'clientsecret';\n\nexport type ConcealedSecret = symbol;\n\ninterface AzureCredentialsBase {\n  authType: AzureAuthType;\n  defaultSubscriptionId?: string;\n}\n\nexport interface AzureManagedIdentityCredentials extends AzureCredentialsBase {\n  authType: 'msi';\n}\n\nexport interface AzureClientSecretCredentials extends AzureCredentialsBase {\n  authType: 'clientsecret';\n  azureCloud?: string;\n  tenantId?: string;\n  clientId?: string;\n  clientSecret?: string | ConcealedSecret;\n}\n\nexport type AzureCredentials = AzureManagedIdentityCredentials | AzureClientSecretCredentials;\n\nexport interface AzureDataSourceJsonData extends DataSourceJsonData {\n  cloudName: string;\n  azureAuthType?: AzureAuthType;\n\n  // monitor\n  tenantId?: string;\n  clientId?: string;\n  subscriptionId?: string;\n\n  // logs\n  /** @deprecated Azure Logs credentials */\n  azureLogAnalyticsSameAs?: boolean;\n  /** @deprecated Azure Logs credentials */\n  logAnalyticsTenantId?: string;\n  /** @deprecated Azure Logs credentials */\n  logAnalyticsClientId?: string;\n  /** @deprecated Azure Logs credentials */\n  logAnalyticsSubscriptionId?: string;\n  /** @deprecated Azure Logs credentials */\n  logAnalyticsDefaultWorkspace?: string;\n\n  // App Insights\n  appInsightsAppId?: string;\n}\n\nexport interface AzureDataSourceSecureJsonData {\n  clientSecret?: string;\n  appInsightsApiKey?: string;\n}\n\n// Represents an errors that come back from frontend requests.\n// Not totally sure how accurate this type is.\nexport type AzureMonitorErrorish = Error;\n\n// Azure Monitor API Types\nexport interface AzureMonitorMetricsMetadataResponse {\n  value: AzureMonitorMetricMetadataItem[];\n}\n\nexport interface AzureMonitorMetricMetadataItem {\n  id: string;\n  resourceId: string;\n  primaryAggregationType: string;\n  supportedAggregationTypes: string[];\n  name: AzureMonitorLocalizedValue;\n  dimensions?: AzureMonitorLocalizedValue[];\n  metricAvailabilities?: AzureMonitorMetricAvailabilityMetadata[];\n}\n\nexport interface AzureMonitorMetricAvailabilityMetadata {\n  timeGrain: string;\n  retention: string;\n}\n\nexport interface AzureMonitorLocalizedValue {\n  value: string;\n  localizedValue: string;\n}\n\nexport interface AzureMonitorMetricDefinitionsResponse {\n  data: {\n    value: Array<{ name: string; type: string; location?: string }>;\n  };\n  status: number;\n  statusText: string;\n}\n\nexport interface AzureMonitorResourceGroupsResponse {\n  data: {\n    value: Array<{ name: string }>;\n  };\n  status: number;\n  statusText: string;\n}\n\nexport interface AzureLogsVariable {\n  text: string;\n  value: string;\n}\n\nexport interface AzureLogsTableData extends TableData {\n  columns: AzureLogsTableColumn[];\n  rows: any[];\n  type: string;\n}\n\nexport interface AzureLogsTableColumn {\n  text: string;\n  type: string;\n}\n\nexport interface AzureMonitorOption<T = string> {\n  label: string;\n  value: T;\n  options?: AzureMonitorOption[];\n}\n\nexport interface AzureQueryEditorFieldProps {\n  query: AzureMonitorQuery;\n  datasource: Datasource;\n  subscriptionId?: string;\n  variableOptionGroup: { label: string; options: AzureMonitorOption[] };\n\n  onQueryChange: (newQuery: AzureMonitorQuery) => void;\n  setError: (source: string, error: AzureMonitorErrorish | undefined) => void;\n}\n\nexport interface AzureResourceSummaryItem {\n  subscriptionName: string;\n  resourceGroupName: string | undefined;\n  resourceName: string | undefined;\n}\n\nexport interface RawAzureResourceGroupItem {\n  subscriptionURI: string;\n  subscriptionName: string;\n\n  resourceGroupURI: string;\n  resourceGroupName: string;\n}\n\nexport interface RawAzureResourceItem {\n  id: string;\n  name: string;\n  subscriptionId: string;\n  resourceGroup: string;\n  type: string;\n  location: string;\n}\n\nexport interface AzureGraphResponse<T = unknown> {\n  data: T;\n  // skipToken is used for pagination, to get the next page\n  $skipToken?: string;\n}\n\n// https://docs.microsoft.com/en-us/rest/api/azureresourcegraph/resourcegraph(2021-03-01)/resources/resources#queryrequestoptions\nexport interface AzureResourceGraphOptions {\n  $skip: number;\n  $skipToken: string;\n  $top: number;\n  allowPartialScopes: boolean;\n  resultFormat: 'objectArray' | 'table';\n}\n","import { map } from 'lodash';\nimport { rangeUtil } from '@grafana/data';\nimport TimegrainConverter from '../time_grain_converter';\nimport { AzureMonitorOption } from '../types';\n\nexport const hasOption = (options: AzureMonitorOption[], value: string): boolean =>\n  options.some((v) => (v.options ? hasOption(v.options, value) : v.value === value));\n\nexport const findOptions = (options: AzureMonitorOption[], values: string[] = []) => {\n  if (values.length === 0) {\n    return [];\n  }\n  const set = values.reduce((accum, item) => {\n    accum.add(item);\n    return accum;\n  }, new Set());\n  return options.filter((option) => set.has(option.value));\n};\n\nexport const toOption = (v: { text: string; value: string }) => ({ value: v.value, label: v.text });\n\nexport function convertTimeGrainsToMs<T extends { value: string }>(timeGrains: T[]) {\n  const allowedTimeGrainsMs: number[] = [];\n  timeGrains.forEach((tg: any) => {\n    if (tg.value !== 'auto') {\n      allowedTimeGrainsMs.push(rangeUtil.intervalToMs(TimegrainConverter.createKbnUnitFromISO8601Duration(tg.value)));\n    }\n  });\n  return allowedTimeGrainsMs;\n}\n\n// Route definitions shared with the backend.\n// Check: /pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go <registerRoutes>\nexport const routeNames = {\n  azureMonitor: 'azuremonitor',\n  logAnalytics: 'loganalytics',\n  appInsights: 'appinsights',\n  resourceGraph: 'resourcegraph',\n};\n\nexport function interpolateVariable(value: any, variable: { multi: any; includeAll: any }) {\n  if (typeof value === 'string') {\n    if (variable.multi || variable.includeAll) {\n      return \"'\" + value + \"'\";\n    } else {\n      return value;\n    }\n  }\n\n  if (typeof value === 'number') {\n    return value;\n  }\n\n  const quotedValues = map(value, (val) => {\n    if (typeof value === 'number') {\n      return value;\n    }\n\n    return \"'\" + val + \"'\";\n  });\n  return quotedValues.join(',');\n}\n","export 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 { AzureMonitorQuery, AzureQueryType } from '../types';\nimport TimegrainConverter from '../time_grain_converter';\nimport {\n  appendDimensionFilter,\n  setTimeGrain as setMetricsTimeGrain,\n} from '../components/MetricsQueryEditor/setQueryValue';\nimport { setKustoQuery } from '../components/LogsQueryEditor/setQueryValue';\n\nconst OLD_DEFAULT_DROPDOWN_VALUE = 'select';\n\nexport default function migrateQuery(query: AzureMonitorQuery): AzureMonitorQuery {\n  let workingQuery = query;\n\n  // The old angular controller also had a `migrateApplicationInsightsKeys` migraiton that\n  // migrated old properties to other properties that still do not appear to be used anymore, so\n  // we decided to not include that migration anymore\n  // See https://github.com/grafana/grafana/blob/a6a09add/public/app/plugins/datasource/grafana-azure-monitor-datasource/query_ctrl.ts#L269-L288\n\n  workingQuery = migrateTimeGrains(workingQuery);\n  workingQuery = migrateLogAnalyticsToFromTimes(workingQuery);\n  workingQuery = migrateToDefaultNamespace(workingQuery);\n  workingQuery = migrateApplicationInsightsDimensions(workingQuery);\n  workingQuery = migrateMetricsDimensionFilters(workingQuery);\n\n  return workingQuery;\n}\n\nfunction migrateTimeGrains(query: AzureMonitorQuery): AzureMonitorQuery {\n  let workingQuery = query;\n\n  if (workingQuery.azureMonitor?.timeGrainUnit && workingQuery.azureMonitor.timeGrain !== 'auto') {\n    const newTimeGrain = TimegrainConverter.createISO8601Duration(\n      workingQuery.azureMonitor.timeGrain ?? 'auto',\n      workingQuery.azureMonitor.timeGrainUnit\n    );\n    workingQuery = setMetricsTimeGrain(workingQuery, newTimeGrain);\n\n    delete workingQuery.azureMonitor?.timeGrainUnit;\n  }\n\n  if (workingQuery.appInsights?.timeGrainUnit && workingQuery.appInsights.timeGrain !== 'auto') {\n    const appInsights = {\n      ...workingQuery.appInsights,\n    };\n\n    if (workingQuery.appInsights.timeGrainCount) {\n      appInsights.timeGrain = TimegrainConverter.createISO8601Duration(\n        workingQuery.appInsights.timeGrainCount,\n        workingQuery.appInsights.timeGrainUnit\n      );\n    } else {\n      appInsights.timeGrainCount = workingQuery.appInsights.timeGrain;\n\n      if (workingQuery.appInsights.timeGrain) {\n        appInsights.timeGrain = TimegrainConverter.createISO8601Duration(\n          workingQuery.appInsights.timeGrain,\n          workingQuery.appInsights.timeGrainUnit\n        );\n      }\n    }\n\n    workingQuery = {\n      ...workingQuery,\n      appInsights: appInsights,\n    };\n  }\n\n  return workingQuery;\n}\n\nfunction migrateLogAnalyticsToFromTimes(query: AzureMonitorQuery): AzureMonitorQuery {\n  let workingQuery = query;\n\n  if (workingQuery.azureLogAnalytics?.query?.match(/\\$__from\\s/gi)) {\n    workingQuery = setKustoQuery(\n      workingQuery,\n      workingQuery.azureLogAnalytics.query.replace(/\\$__from\\s/gi, '$__timeFrom() ')\n    );\n  }\n\n  if (workingQuery.azureLogAnalytics?.query?.match(/\\$__to\\s/gi)) {\n    workingQuery = setKustoQuery(\n      workingQuery,\n      workingQuery.azureLogAnalytics.query.replace(/\\$__to\\s/gi, '$__timeTo() ')\n    );\n  }\n\n  return workingQuery;\n}\n\nfunction migrateToDefaultNamespace(query: AzureMonitorQuery): AzureMonitorQuery {\n  const haveMetricNamespace =\n    query.azureMonitor?.metricNamespace && query.azureMonitor.metricNamespace !== OLD_DEFAULT_DROPDOWN_VALUE;\n\n  if (!haveMetricNamespace && query.azureMonitor?.metricDefinition) {\n    return {\n      ...query,\n      azureMonitor: {\n        ...query.azureMonitor,\n        metricNamespace: query.azureMonitor.metricDefinition,\n      },\n    };\n  }\n\n  return query;\n}\n\nfunction migrateApplicationInsightsDimensions(query: AzureMonitorQuery): AzureMonitorQuery {\n  const dimension = query?.appInsights?.dimension as unknown;\n\n  if (dimension && typeof dimension === 'string') {\n    return {\n      ...query,\n      appInsights: {\n        ...query.appInsights,\n        dimension: [dimension],\n      },\n    };\n  }\n\n  return query;\n}\n\n// Exported because its also used directly in the datasource.ts for some reason\nfunction migrateMetricsDimensionFilters(query: AzureMonitorQuery): AzureMonitorQuery {\n  let workingQuery = query;\n\n  const oldDimension = workingQuery.azureMonitor?.dimension;\n  if (oldDimension && oldDimension !== 'None') {\n    workingQuery = appendDimensionFilter(workingQuery, oldDimension, 'eq', workingQuery.azureMonitor?.dimensionFilter);\n  }\n\n  return workingQuery;\n}\n\n// datasource.ts also contains some migrations, which have been moved to here. Unsure whether\n// they should also do all the other migrations...\nexport function datasourceMigrations(query: AzureMonitorQuery): AzureMonitorQuery {\n  let workingQuery = query;\n\n  if (workingQuery.queryType === AzureQueryType.ApplicationInsights && workingQuery.appInsights?.rawQuery) {\n    workingQuery = {\n      ...workingQuery,\n      queryType: AzureQueryType.InsightsAnalytics,\n      appInsights: undefined,\n      insightsAnalytics: {\n        query: workingQuery.appInsights.rawQuery,\n        resultFormat: 'time_series',\n      },\n    };\n  }\n\n  if (!workingQuery.queryType) {\n    workingQuery = {\n      ...workingQuery,\n      queryType: AzureQueryType.AzureMonitor,\n    };\n  }\n\n  if (workingQuery.queryType === AzureQueryType.AzureMonitor && workingQuery.azureMonitor) {\n    workingQuery = migrateMetricsDimensionFilters(workingQuery);\n  }\n\n  return workingQuery;\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { AzureMonitorErrorish } from '../types';\nimport messageFromError from './messageFromError';\n\ntype SourcedError = [string, AzureMonitorErrorish];\n\nexport default function useLastError() {\n  const [errors, setErrors] = useState<SourcedError[]>([]);\n\n  // Handles errors from any child components that request data to display their options\n  const addError = useCallback((errorSource: string, error: AzureMonitorErrorish | undefined) => {\n    setErrors((errors) => {\n      const errorsCopy = [...errors];\n      const index = errors.findIndex(([vSource]) => vSource === errorSource);\n\n      // If there's already an error, remove it. If we're setting a new error\n      // below, we'll move it to the front\n      if (index > -1) {\n        errorsCopy.splice(index, 1);\n      }\n\n      // And then add the new error to the top of the array. If error is defined, it was already\n      // removed above.\n      if (error) {\n        errorsCopy.unshift([errorSource, error]);\n      }\n\n      return errorsCopy;\n    });\n  }, []);\n\n  const errorMessage = useMemo(() => {\n    const recentError = errors[0];\n    return recentError && messageFromError(recentError[1]);\n  }, [errors]);\n\n  return [errorMessage, addError] as const;\n}\n","import { useRef } from 'react';\nimport { uniqueId } from 'lodash';\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","// Libraries\nimport React, { memo } from 'react';\nimport { css, cx } from '@emotion/css';\nimport { map } from 'lodash';\n\n// Types\nimport { InlineFormLabel, RadioButtonGroup, InlineField, Input, Select } from '@grafana/ui';\nimport { SelectableValue } from '@grafana/data';\nimport { LokiQuery } from '../types';\n\nexport interface LokiOptionFieldsProps {\n  lineLimitValue: string;\n  resolution: number;\n  queryType: LokiQueryType;\n  query: LokiQuery;\n  onChange: (value: LokiQuery) => void;\n  onRunQuery: () => void;\n  runOnBlur?: boolean;\n}\n\ntype LokiQueryType = 'instant' | 'range';\n\nconst queryTypeOptions: Array<SelectableValue<LokiQueryType>> = [\n  { value: 'range', label: 'Range', description: 'Run query over a range of time.' },\n  {\n    value: 'instant',\n    label: 'Instant',\n    description: 'Run query against a single point in time. For this query, the \"To\" time is used.',\n  },\n];\n\nexport const DEFAULT_RESOLUTION: SelectableValue<number> = {\n  value: 1,\n  label: '1/1',\n};\n\nconst RESOLUTION_OPTIONS: Array<SelectableValue<number>> = [DEFAULT_RESOLUTION].concat(\n  map([2, 3, 4, 5, 10], (value: number) => ({\n    value,\n    label: '1/' + value,\n  }))\n);\n\nexport function LokiOptionFields(props: LokiOptionFieldsProps) {\n  const { lineLimitValue, resolution, queryType, query, onRunQuery, runOnBlur, onChange } = props;\n\n  function onChangeQueryLimit(value: string) {\n    const nextQuery = { ...query, maxLines: preprocessMaxLines(value) };\n    onChange(nextQuery);\n  }\n\n  function onQueryTypeChange(value: LokiQueryType) {\n    let nextQuery;\n    if (value === 'instant') {\n      nextQuery = { ...query, instant: true, range: false };\n    } else {\n      nextQuery = { ...query, instant: false, range: true };\n    }\n    onChange(nextQuery);\n  }\n\n  function preprocessMaxLines(value: string): number {\n    if (value.length === 0) {\n      // empty input - falls back to dataSource.maxLines limit\n      return NaN;\n    } else if (value.length > 0 && (isNaN(+value) || +value < 0)) {\n      // input with at least 1 character and that is either incorrect (value in the input field is not a number) or negative\n      // falls back to the limit of 0 lines\n      return 0;\n    } else {\n      // default case - correct input\n      return +value;\n    }\n  }\n\n  function onMaxLinesChange(e: React.SyntheticEvent<HTMLInputElement>) {\n    if (query.maxLines !== preprocessMaxLines(e.currentTarget.value)) {\n      onChangeQueryLimit(e.currentTarget.value);\n    }\n  }\n\n  function onReturnKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n    if (e.key === 'Enter') {\n      onRunQuery();\n    }\n  }\n\n  function onResolutionChange(option: SelectableValue<number>) {\n    const nextQuery = { ...query, resolution: option.value };\n    onChange(nextQuery);\n  }\n\n  return (\n    <div aria-label=\"Loki extra field\" className=\"gf-form-inline\">\n      {/*Query type field*/}\n      <div\n        data-testid=\"queryTypeField\"\n        className={cx(\n          'gf-form explore-input-margin',\n          css`\n            flex-wrap: nowrap;\n          `\n        )}\n        aria-label=\"Query type field\"\n      >\n        <InlineFormLabel width=\"auto\">Query type</InlineFormLabel>\n\n        <RadioButtonGroup\n          options={queryTypeOptions}\n          value={queryType}\n          onChange={(type: LokiQueryType) => {\n            onQueryTypeChange(type);\n            if (runOnBlur) {\n              onRunQuery();\n            }\n          }}\n        />\n      </div>\n      {/*Line limit field*/}\n      <div\n        data-testid=\"lineLimitField\"\n        className={cx(\n          'gf-form',\n          css`\n            flex-wrap: nowrap;\n          `\n        )}\n        aria-label=\"Line limit field\"\n      >\n        <InlineField label=\"Line limit\" tooltip={'Upper limit for number of log lines returned by query.'}>\n          <Input\n            className=\"width-4\"\n            placeholder=\"auto\"\n            type=\"number\"\n            min={0}\n            onChange={onMaxLinesChange}\n            onKeyDown={onReturnKeyDown}\n            value={lineLimitValue}\n            onBlur={() => {\n              if (runOnBlur) {\n                onRunQuery();\n              }\n            }}\n          />\n        </InlineField>\n        <InlineField\n          label=\"Resolution\"\n          tooltip={\n            'Resolution 1/1 sets step parameter of Loki metrics range queries such that each pixel corresponds to one data point. For better performance, lower resolutions can be picked. 1/2 only retrieves a data point for every other pixel, and 1/10 retrieves one data point per 10 pixels.'\n          }\n        >\n          <Select\n            isSearchable={false}\n            onChange={onResolutionChange}\n            options={RESOLUTION_OPTIONS}\n            value={resolution}\n            aria-label=\"Select resolution\"\n          />\n        </InlineField>\n      </div>\n    </div>\n  );\n}\n\nexport default memo(LokiOptionFields);\n","import React, { ChangeEvent } from 'react';\nimport {\n  Button,\n  HighlightPart,\n  HorizontalGroup,\n  Input,\n  Label,\n  LoadingPlaceholder,\n  withTheme2,\n  BrowserLabel as LokiLabel,\n  fuzzyMatch,\n} from '@grafana/ui';\nimport LokiLanguageProvider from '../language_provider';\nimport PromQlLanguageProvider from '../../prometheus/language_provider';\nimport { css, cx } from '@emotion/css';\nimport { FixedSizeList } from 'react-window';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { sortBy } from 'lodash';\n\n// Hard limit on labels to render\nconst MAX_LABEL_COUNT = 1000;\nconst MAX_VALUE_COUNT = 10000;\nconst MAX_AUTO_SELECT = 4;\nconst EMPTY_SELECTOR = '{}';\n\nexport interface BrowserProps {\n  // TODO #33976: Is it possible to use a common interface here? For example: LabelsLanguageProvider\n  languageProvider: LokiLanguageProvider | PromQlLanguageProvider;\n  onChange: (selector: string) => void;\n  theme: GrafanaTheme2;\n  autoSelect?: number;\n  hide?: () => void;\n  lastUsedLabels: string[];\n  storeLastUsedLabels: (labels: string[]) => void;\n  deleteLastUsedLabels: () => void;\n}\n\ninterface BrowserState {\n  labels: SelectableLabel[];\n  searchTerm: string;\n  status: string;\n  error: string;\n  validationStatus: string;\n}\n\ninterface FacettableValue {\n  name: string;\n  selected?: boolean;\n  highlightParts?: HighlightPart[];\n  order?: number;\n}\n\nexport interface SelectableLabel {\n  name: string;\n  selected?: boolean;\n  loading?: boolean;\n  values?: FacettableValue[];\n  hidden?: boolean;\n  facets?: number;\n}\n\nexport function buildSelector(labels: SelectableLabel[]): string {\n  const selectedLabels = [];\n  for (const label of labels) {\n    if (label.selected && label.values && label.values.length > 0) {\n      const selectedValues = label.values.filter((value) => value.selected).map((value) => value.name);\n      if (selectedValues.length > 1) {\n        selectedLabels.push(`${label.name}=~\"${selectedValues.join('|')}\"`);\n      } else if (selectedValues.length === 1) {\n        selectedLabels.push(`${label.name}=\"${selectedValues[0]}\"`);\n      }\n    }\n  }\n  return ['{', selectedLabels.join(','), '}'].join('');\n}\n\nexport function facetLabels(\n  labels: SelectableLabel[],\n  possibleLabels: Record<string, string[]>,\n  lastFacetted?: string\n): SelectableLabel[] {\n  return labels.map((label) => {\n    const possibleValues = possibleLabels[label.name];\n    if (possibleValues) {\n      let existingValues: FacettableValue[];\n      if (label.name === lastFacetted && label.values) {\n        // Facetting this label, show all values\n        existingValues = label.values;\n      } else {\n        // Keep selection in other facets\n        const selectedValues: Set<string> = new Set(\n          label.values?.filter((value) => value.selected).map((value) => value.name) || []\n        );\n        // Values for this label have not been requested yet, let's use the facetted ones as the initial values\n        existingValues = possibleValues.map((value) => ({ name: value, selected: selectedValues.has(value) }));\n      }\n      return { ...label, loading: false, values: existingValues, facets: existingValues.length };\n    }\n\n    // Label is facetted out, hide all values\n    return { ...label, loading: false, hidden: !possibleValues, values: undefined, facets: 0 };\n  });\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  wrapper: css`\n    background-color: ${theme.colors.background.secondary};\n    padding: ${theme.spacing(2)};\n    width: 100%;\n  `,\n  list: css`\n    margin-top: ${theme.spacing(1)};\n    display: flex;\n    flex-wrap: wrap;\n    max-height: 200px;\n    overflow: auto;\n  `,\n  section: css`\n    & + & {\n      margin: ${theme.spacing(2, 0)};\n    }\n    position: relative;\n  `,\n  selector: css`\n    font-family: ${theme.typography.fontFamilyMonospace};\n    margin-bottom: ${theme.spacing(1)};\n  `,\n  status: css`\n    padding: ${theme.spacing(0.5)};\n    color: ${theme.colors.text.secondary};\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    /* using absolute positioning because flex interferes with ellipsis */\n    position: absolute;\n    width: 50%;\n    right: 0;\n    text-align: right;\n    transition: opacity 100ms linear;\n    opacity: 0;\n  `,\n  statusShowing: css`\n    opacity: 1;\n  `,\n  error: css`\n    color: ${theme.colors.error.main};\n  `,\n  valueList: css`\n    margin-right: ${theme.spacing(1)};\n  `,\n  valueListWrapper: css`\n    border-left: 1px solid ${theme.colors.border.medium};\n    margin: ${theme.spacing(1, 0)};\n    padding: ${theme.spacing(1, 0, 1, 1)};\n  `,\n  valueListArea: css`\n    display: flex;\n    flex-wrap: wrap;\n    margin-top: ${theme.spacing(1)};\n  `,\n  valueTitle: css`\n    margin-left: -${theme.spacing(0.5)};\n    margin-bottom: ${theme.spacing(1)};\n  `,\n  validationStatus: css`\n    padding: ${theme.spacing(0.5)};\n    margin-bottom: ${theme.spacing(1)};\n    color: ${theme.colors.text.maxContrast};\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  `,\n});\n\nexport class UnthemedLokiLabelBrowser extends React.Component<BrowserProps, BrowserState> {\n  state: BrowserState = {\n    labels: [] as SelectableLabel[],\n    searchTerm: '',\n    status: 'Ready',\n    error: '',\n    validationStatus: '',\n  };\n\n  onChangeSearch = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ searchTerm: event.target.value });\n  };\n\n  onClickRunLogsQuery = () => {\n    const selector = buildSelector(this.state.labels);\n    this.props.onChange(selector);\n  };\n\n  onClickRunMetricsQuery = () => {\n    const selector = buildSelector(this.state.labels);\n    const query = `rate(${selector}[$__interval])`;\n    this.props.onChange(query);\n  };\n\n  onClickClear = () => {\n    this.setState((state) => {\n      const labels: SelectableLabel[] = state.labels.map((label) => ({\n        ...label,\n        values: undefined,\n        selected: false,\n        loading: false,\n        hidden: false,\n        facets: undefined,\n      }));\n      return { labels, searchTerm: '', status: '', error: '', validationStatus: '' };\n    });\n    this.props.deleteLastUsedLabels();\n  };\n\n  onClickLabel = (name: string, value: string | undefined, event: React.MouseEvent<HTMLElement>) => {\n    const label = this.state.labels.find((l) => l.name === name);\n    if (!label) {\n      return;\n    }\n    // Toggle selected state\n    const selected = !label.selected;\n    let nextValue: Partial<SelectableLabel> = { selected };\n    if (label.values && !selected) {\n      // Deselect all values if label was deselected\n      const values = label.values.map((value) => ({ ...value, selected: false }));\n      nextValue = { ...nextValue, facets: 0, values };\n    }\n    // Resetting search to prevent empty results\n    this.setState({ searchTerm: '' });\n    this.updateLabelState(name, nextValue, '', () => this.doFacettingForLabel(name));\n  };\n\n  onClickValue = (name: string, value: string | undefined, event: React.MouseEvent<HTMLElement>) => {\n    const label = this.state.labels.find((l) => l.name === name);\n    if (!label || !label.values) {\n      return;\n    }\n    // Resetting search to prevent empty results\n    this.setState({ searchTerm: '' });\n    // Toggling value for selected label, leaving other values intact\n    const values = label.values.map((v) => ({ ...v, selected: v.name === value ? !v.selected : v.selected }));\n    this.updateLabelState(name, { values }, '', () => this.doFacetting(name));\n  };\n\n  onClickValidate = () => {\n    const selector = buildSelector(this.state.labels);\n    this.validateSelector(selector);\n  };\n\n  updateLabelState(name: string, updatedFields: Partial<SelectableLabel>, status = '', cb?: () => void) {\n    this.setState((state) => {\n      const labels: SelectableLabel[] = state.labels.map((label) => {\n        if (label.name === name) {\n          return { ...label, ...updatedFields };\n        }\n        return label;\n      });\n      // New status overrides errors\n      const error = status ? '' : state.error;\n      return { labels, status, error, validationStatus: '' };\n    }, cb);\n  }\n\n  componentDidMount() {\n    const { languageProvider, autoSelect = MAX_AUTO_SELECT, lastUsedLabels } = this.props;\n    if (languageProvider) {\n      const selectedLabels: string[] = lastUsedLabels;\n      languageProvider.start().then(() => {\n        let rawLabels: string[] = languageProvider.getLabelKeys();\n        if (rawLabels.length > MAX_LABEL_COUNT) {\n          const error = `Too many labels found (showing only ${MAX_LABEL_COUNT} of ${rawLabels.length})`;\n          rawLabels = rawLabels.slice(0, MAX_LABEL_COUNT);\n          this.setState({ error });\n        }\n        // Auto-select all labels if label list is small enough\n        const labels: SelectableLabel[] = rawLabels.map((label, i, arr) => ({\n          name: label,\n          selected: (arr.length <= autoSelect && selectedLabels.length === 0) || selectedLabels.includes(label),\n          loading: false,\n        }));\n        // Pre-fetch values for selected labels\n        this.setState({ labels }, () => {\n          this.state.labels.forEach((label) => {\n            if (label.selected) {\n              this.fetchValues(label.name, EMPTY_SELECTOR);\n            }\n          });\n        });\n      });\n    }\n  }\n\n  doFacettingForLabel(name: string) {\n    const label = this.state.labels.find((l) => l.name === name);\n    if (!label) {\n      return;\n    }\n    const selectedLabels = this.state.labels.filter((label) => label.selected).map((label) => label.name);\n    this.props.storeLastUsedLabels(selectedLabels);\n    if (label.selected) {\n      // Refetch values for newly selected label...\n      if (!label.values) {\n        this.fetchValues(name, buildSelector(this.state.labels));\n      }\n    } else {\n      // Only need to facet when deselecting labels\n      this.doFacetting();\n    }\n  }\n\n  doFacetting = (lastFacetted?: string) => {\n    const selector = buildSelector(this.state.labels);\n    if (selector === EMPTY_SELECTOR) {\n      // Clear up facetting\n      const labels: SelectableLabel[] = this.state.labels.map((label) => {\n        return { ...label, facets: 0, values: undefined, hidden: false };\n      });\n      this.setState({ labels }, () => {\n        // Get fresh set of values\n        this.state.labels.forEach((label) => label.selected && this.fetchValues(label.name, selector));\n      });\n    } else {\n      // Do facetting\n      this.fetchSeries(selector, lastFacetted);\n    }\n  };\n\n  async fetchValues(name: string, selector: string) {\n    const { languageProvider } = this.props;\n    this.updateLabelState(name, { loading: true }, `Fetching values for ${name}`);\n    try {\n      let rawValues = await languageProvider.getLabelValues(name);\n      // If selector changed, clear loading state and discard result by returning early\n      if (selector !== buildSelector(this.state.labels)) {\n        this.updateLabelState(name, { loading: false }, '');\n        return;\n      }\n      if (rawValues.length > MAX_VALUE_COUNT) {\n        const error = `Too many values for ${name} (showing only ${MAX_VALUE_COUNT} of ${rawValues.length})`;\n        rawValues = rawValues.slice(0, MAX_VALUE_COUNT);\n        this.setState({ error });\n      }\n      const values: FacettableValue[] = rawValues.map((value) => ({ name: value }));\n      this.updateLabelState(name, { values, loading: false });\n    } catch (error) {\n      console.error(error);\n    }\n  }\n\n  async fetchSeries(selector: string, lastFacetted?: string) {\n    const { languageProvider } = this.props;\n    if (lastFacetted) {\n      this.updateLabelState(lastFacetted, { loading: true }, `Facetting labels for ${selector}`);\n    }\n    try {\n      const possibleLabels = await languageProvider.fetchSeriesLabels(selector, true);\n      // If selector changed, clear loading state and discard result by returning early\n      if (selector !== buildSelector(this.state.labels)) {\n        if (lastFacetted) {\n          this.updateLabelState(lastFacetted, { loading: false });\n        }\n        return;\n      }\n      if (Object.keys(possibleLabels).length === 0) {\n        this.setState({ error: `Empty results, no matching label for ${selector}` });\n        return;\n      }\n      const labels: SelectableLabel[] = facetLabels(this.state.labels, possibleLabels, lastFacetted);\n      this.setState({ labels, error: '' });\n      if (lastFacetted) {\n        this.updateLabelState(lastFacetted, { loading: false });\n      }\n    } catch (error) {\n      console.error(error);\n    }\n  }\n\n  async validateSelector(selector: string) {\n    const { languageProvider } = this.props;\n    this.setState({ validationStatus: `Validating selector ${selector}`, error: '' });\n    const streams = await languageProvider.fetchSeries(selector);\n    this.setState({ validationStatus: `Selector is valid (${streams.length} streams found)` });\n  }\n\n  render() {\n    const { theme } = this.props;\n    const { labels, searchTerm, status, error, validationStatus } = this.state;\n    if (labels.length === 0) {\n      return <LoadingPlaceholder text=\"Loading labels...\" />;\n    }\n    const styles = getStyles(theme);\n    const selector = buildSelector(this.state.labels);\n    const empty = selector === EMPTY_SELECTOR;\n\n    let selectedLabels = labels.filter((label) => label.selected && label.values);\n    if (searchTerm) {\n      selectedLabels = selectedLabels.map((label) => {\n        const searchResults = label.values!.filter((value) => {\n          // Always return selected values\n          if (value.selected) {\n            value.highlightParts = undefined;\n            return true;\n          }\n          const fuzzyMatchResult = fuzzyMatch(value.name.toLowerCase(), searchTerm.toLowerCase());\n          if (fuzzyMatchResult.found) {\n            value.highlightParts = fuzzyMatchResult.ranges;\n            value.order = fuzzyMatchResult.distance;\n            return true;\n          } else {\n            return false;\n          }\n        });\n        return {\n          ...label,\n          values: sortBy(searchResults, (value) => (value.selected ? -Infinity : value.order)),\n        };\n      });\n    } else {\n      // Clear highlight parts when searchTerm is cleared\n      selectedLabels = this.state.labels\n        .filter((label) => label.selected && label.values)\n        .map((label) => ({\n          ...label,\n          values: label?.values ? label.values.map((value) => ({ ...value, highlightParts: undefined })) : [],\n        }));\n    }\n\n    return (\n      <div className={styles.wrapper}>\n        <div className={styles.section}>\n          <Label description=\"Which labels would you like to consider for your search?\">\n            1. Select labels to search in\n          </Label>\n          <div className={styles.list}>\n            {labels.map((label) => (\n              <LokiLabel\n                key={label.name}\n                name={label.name}\n                loading={label.loading}\n                active={label.selected}\n                hidden={label.hidden}\n                facets={label.facets}\n                onClick={this.onClickLabel}\n              />\n            ))}\n          </div>\n        </div>\n        <div className={styles.section}>\n          <Label description=\"Choose the label values that you would like to use for the query. Use the search field to find values across selected labels.\">\n            2. Find values for the selected labels\n          </Label>\n          <div>\n            <Input onChange={this.onChangeSearch} aria-label=\"Filter expression for values\" value={searchTerm} />\n          </div>\n          <div className={styles.valueListArea}>\n            {selectedLabels.map((label) => (\n              <div role=\"list\" key={label.name} className={styles.valueListWrapper}>\n                <div className={styles.valueTitle} aria-label={`Values for ${label.name}`}>\n                  <LokiLabel\n                    name={label.name}\n                    loading={label.loading}\n                    active={label.selected}\n                    hidden={label.hidden}\n                    //If no facets, we want to show number of all label values\n                    facets={label.facets || label.values?.length}\n                    onClick={this.onClickLabel}\n                  />\n                </div>\n                <FixedSizeList\n                  height={200}\n                  itemCount={label.values?.length || 0}\n                  itemSize={28}\n                  itemKey={(i) => (label.values as FacettableValue[])[i].name}\n                  width={200}\n                  className={styles.valueList}\n                >\n                  {({ index, style }) => {\n                    const value = label.values?.[index];\n                    if (!value) {\n                      return null;\n                    }\n                    return (\n                      <div style={style}>\n                        <LokiLabel\n                          name={label.name}\n                          value={value?.name}\n                          active={value?.selected}\n                          highlightParts={value?.highlightParts}\n                          onClick={this.onClickValue}\n                          searchTerm={searchTerm}\n                        />\n                      </div>\n                    );\n                  }}\n                </FixedSizeList>\n              </div>\n            ))}\n          </div>\n        </div>\n        <div className={styles.section}>\n          <Label>3. Resulting selector</Label>\n          <div aria-label=\"selector\" className={styles.selector}>\n            {selector}\n          </div>\n          {validationStatus && <div className={styles.validationStatus}>{validationStatus}</div>}\n          <HorizontalGroup>\n            <Button aria-label=\"Use selector as logs button\" disabled={empty} onClick={this.onClickRunLogsQuery}>\n              Show logs\n            </Button>\n            <Button\n              aria-label=\"Use selector as metrics button\"\n              variant=\"secondary\"\n              disabled={empty}\n              onClick={this.onClickRunMetricsQuery}\n            >\n              Show logs rate\n            </Button>\n            <Button\n              aria-label=\"Validate submit button\"\n              variant=\"secondary\"\n              disabled={empty}\n              onClick={this.onClickValidate}\n            >\n              Validate selector\n            </Button>\n            <Button aria-label=\"Selector clear button\" variant=\"secondary\" onClick={this.onClickClear}>\n              Clear\n            </Button>\n            <div className={cx(styles.status, (status || error) && styles.statusShowing)}>\n              <span className={error ? styles.error : ''}>{error || status}</span>\n            </div>\n          </HorizontalGroup>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport const LokiLabelBrowser = withTheme2(UnthemedLokiLabelBrowser);\n","import { TimeRange } from '@grafana/data';\n\nfunction roundMsToMin(milliseconds: number): number {\n  return roundSecToMin(milliseconds / 1000);\n}\n\nfunction roundSecToMin(seconds: number): number {\n  return Math.floor(seconds / 60);\n}\n\nexport function shouldRefreshLabels(range?: TimeRange, prevRange?: TimeRange): boolean {\n  if (range && prevRange) {\n    const sameMinuteFrom = roundMsToMin(range.from.valueOf()) === roundMsToMin(prevRange.from.valueOf());\n    const sameMinuteTo = roundMsToMin(range.to.valueOf()) === roundMsToMin(prevRange.to.valueOf());\n    // If both are same, don't need to refresh\n    return !(sameMinuteFrom && sameMinuteTo);\n  }\n  return false;\n}\n","import React, { ReactNode } from 'react';\nimport {\n  SlatePrism,\n  TypeaheadOutput,\n  SuggestionsState,\n  QueryField,\n  TypeaheadInput,\n  BracesPlugin,\n  DOMUtil,\n  Icon,\n} from '@grafana/ui';\nimport { Plugin, Node } from 'slate';\nimport { LokiLabelBrowser } from './LokiLabelBrowser';\nimport { QueryEditorProps } from '@grafana/data';\nimport { LokiQuery, LokiOptions } from '../types';\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\nimport LokiLanguageProvider from '../language_provider';\nimport { shouldRefreshLabels } from '../language_utils';\nimport LokiDatasource from '../datasource';\nimport { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider';\n\nconst LAST_USED_LABELS_KEY = 'grafana.datasources.loki.browser.labels';\n\nfunction getChooserText(hasSyntax: boolean, hasLogLabels: boolean) {\n  if (!hasSyntax) {\n    return 'Loading labels...';\n  }\n  if (!hasLogLabels) {\n    return '(No logs found)';\n  }\n  return 'Log browser';\n}\n\nfunction willApplySuggestion(suggestion: string, { typeaheadContext, typeaheadText }: SuggestionsState): string {\n  // Modify suggestion based on context\n  switch (typeaheadContext) {\n    case 'context-labels': {\n      const nextChar = DOMUtil.getNextCharacter();\n      if (!nextChar || nextChar === '}' || nextChar === ',') {\n        suggestion += '=';\n      }\n      break;\n    }\n\n    case 'context-label-values': {\n      // Always add quotes and remove existing ones instead\n      if (!typeaheadText.match(/^(!?=~?\"|\")/)) {\n        suggestion = `\"${suggestion}`;\n      }\n      if (DOMUtil.getNextCharacter() !== '\"') {\n        suggestion = `${suggestion}\"`;\n      }\n      break;\n    }\n\n    default:\n  }\n  return suggestion;\n}\n\nexport interface LokiQueryFieldProps extends QueryEditorProps<LokiDatasource, LokiQuery, LokiOptions> {\n  ExtraFieldElement?: ReactNode;\n  placeholder?: string;\n  'data-testid'?: string;\n}\n\ninterface LokiQueryFieldState {\n  labelsLoaded: boolean;\n  labelBrowserVisible: boolean;\n}\n\nexport class LokiQueryField extends React.PureComponent<LokiQueryFieldProps, LokiQueryFieldState> {\n  plugins: Plugin[];\n\n  constructor(props: LokiQueryFieldProps) {\n    super(props);\n\n    this.state = { labelsLoaded: false, labelBrowserVisible: false };\n\n    this.plugins = [\n      BracesPlugin(),\n      SlatePrism(\n        {\n          onlyIn: (node: Node) => node.object === 'block' && node.type === 'code_block',\n          getSyntax: (node: Node) => 'logql',\n        },\n        { ...(prismLanguages as LanguageMap), logql: this.props.datasource.languageProvider.getSyntax() }\n      ),\n    ];\n  }\n\n  async componentDidMount() {\n    await this.props.datasource.languageProvider.start();\n    this.setState({ labelsLoaded: true });\n  }\n\n  componentDidUpdate(prevProps: LokiQueryFieldProps) {\n    const {\n      range,\n      datasource: { languageProvider },\n    } = this.props;\n    const refreshLabels = shouldRefreshLabels(range, prevProps.range);\n    // We want to refresh labels when range changes (we round up intervals to a minute)\n    if (refreshLabels) {\n      languageProvider.fetchLabels();\n    }\n  }\n\n  onChangeLabelBrowser = (selector: string) => {\n    this.onChangeQuery(selector, true);\n    this.setState({ labelBrowserVisible: false });\n  };\n\n  onChangeQuery = (value: string, override?: boolean) => {\n    // Send text change to parent\n    const { query, onChange, onRunQuery } = this.props;\n    if (onChange) {\n      const nextQuery = { ...query, expr: value };\n      onChange(nextQuery);\n\n      if (override && onRunQuery) {\n        onRunQuery();\n      }\n    }\n  };\n\n  onClickChooserButton = () => {\n    this.setState((state) => ({ labelBrowserVisible: !state.labelBrowserVisible }));\n  };\n\n  onTypeahead = async (typeahead: TypeaheadInput): Promise<TypeaheadOutput> => {\n    const { datasource } = this.props;\n\n    if (!datasource.languageProvider) {\n      return { suggestions: [] };\n    }\n\n    const lokiLanguageProvider = datasource.languageProvider as LokiLanguageProvider;\n    const { history } = this.props;\n    const { prefix, text, value, wrapperClasses, labelKey } = typeahead;\n\n    const result = await lokiLanguageProvider.provideCompletionItems(\n      { text, value, prefix, wrapperClasses, labelKey },\n      { history }\n    );\n    return result;\n  };\n\n  render() {\n    const {\n      ExtraFieldElement,\n      query,\n      datasource,\n      placeholder = 'Enter a Loki query (run with Shift+Enter)',\n    } = this.props;\n\n    const { labelsLoaded, labelBrowserVisible } = this.state;\n    const lokiLanguageProvider = datasource.languageProvider as LokiLanguageProvider;\n    const cleanText = datasource.languageProvider ? lokiLanguageProvider.cleanText : undefined;\n    const hasLogLabels = lokiLanguageProvider.getLabelKeys().length > 0;\n    const chooserText = getChooserText(labelsLoaded, hasLogLabels);\n    const buttonDisabled = !(labelsLoaded && hasLogLabels);\n\n    return (\n      <LocalStorageValueProvider<string[]> storageKey={LAST_USED_LABELS_KEY} defaultValue={[]}>\n        {(lastUsedLabels, onLastUsedLabelsSave, onLastUsedLabelsDelete) => {\n          return (\n            <>\n              <div\n                className=\"gf-form-inline gf-form-inline--xs-view-flex-column flex-grow-1\"\n                data-testid={this.props['data-testid']}\n              >\n                <button\n                  className=\"gf-form-label query-keyword pointer\"\n                  onClick={this.onClickChooserButton}\n                  disabled={buttonDisabled}\n                >\n                  {chooserText}\n                  <Icon name={labelBrowserVisible ? 'angle-down' : 'angle-right'} />\n                </button>\n                <div className=\"gf-form gf-form--grow flex-shrink-1 min-width-15\">\n                  <QueryField\n                    additionalPlugins={this.plugins}\n                    cleanText={cleanText}\n                    query={query.expr}\n                    onTypeahead={this.onTypeahead}\n                    onWillApplySuggestion={willApplySuggestion}\n                    onChange={this.onChangeQuery}\n                    onBlur={this.props.onBlur}\n                    onRunQuery={this.props.onRunQuery}\n                    placeholder={placeholder}\n                    portalOrigin=\"loki\"\n                  />\n                </div>\n              </div>\n              {labelBrowserVisible && (\n                <div className=\"gf-form\">\n                  <LokiLabelBrowser\n                    languageProvider={lokiLanguageProvider}\n                    onChange={this.onChangeLabelBrowser}\n                    lastUsedLabels={lastUsedLabels || []}\n                    storeLastUsedLabels={onLastUsedLabelsSave}\n                    deleteLastUsedLabels={onLastUsedLabelsDelete}\n                  />\n                </div>\n              )}\n\n              {ExtraFieldElement}\n            </>\n          );\n        }}\n      </LocalStorageValueProvider>\n    );\n  }\n}\n","function roundDec(val: number, dec: number) {\n  return Math.round(val * (dec = 10 ** dec)) / dec;\n}\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) => roundDec(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 = roundDec(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 */\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 React, { PureComponent } from 'react';\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';\n\nimport { config } from 'app/core/config';\nimport { BarGaugeOptions } from './types';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\nimport { isNumber } from 'lodash';\n\nexport class BarGaugePanel extends PureComponent<PanelProps<BarGaugeOptions>> {\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} config={value.field}>\n            {(api) => this.renderComponent(valueProps, api)}\n          </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        minVizHeight={10}\n        itemSpacing={this.getItemSpacing()}\n        orientation={options.orientation}\n      />\n    );\n  }\n}\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';\nimport { FieldDisplay, getFieldDisplayValues, PanelProps } from '@grafana/data';\nimport { DataLinksContextMenu, Gauge, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\n\nimport { config } from 'app/core/config';\nimport { GaugeOptions } from './types';\nimport { clearNameForSingleSeries } from '../bargauge/BarGaugePanel';\n\nexport class GaugePanel extends PureComponent<PanelProps<GaugeOptions>> {\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} config={value.field}>\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","import { PanelPlugin } from '@grafana/data';\nimport { GaugePanel } from './GaugePanel';\nimport { GaugeOptions } from './types';\nimport { addOrientationOption, addStandardDataReduceOptions } from '../stat/types';\nimport { gaugePanelMigrationHandler, gaugePanelChangedHandler } from './GaugeMigrations';\nimport { commonOptionsBuilder } from '@grafana/ui';\nimport { GaugeSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<GaugeOptions>(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: false,\n      })\n      .addBooleanSwitch({\n        path: 'showThresholdMarkers',\n        name: 'Show threshold markers',\n        description: 'Renders the thresholds as an outer bar',\n        defaultValue: true,\n      });\n\n    commonOptionsBuilder.addTextSizeOptions(builder);\n  })\n  .setPanelChangeHandler(gaugePanelChangedHandler)\n  .setSuggestionsSupplier(new GaugeSuggestionsSupplier())\n  .setMigrationHandler(gaugePanelMigrationHandler);\n","import { sharedSingleStatPanelChangedHandler, sharedSingleStatMigrationHandler } from '@grafana/ui';\nimport { PanelModel } from '@grafana/data';\nimport { GaugeOptions } from './types';\n\n// This is called when the panel first loads\nexport const gaugePanelMigrationHandler = (panel: PanelModel<GaugeOptions>): Partial<GaugeOptions> => {\n  return sharedSingleStatMigrationHandler(panel);\n};\n\n// This is called when the panel changes from another panel\nexport const gaugePanelChangedHandler = (\n  panel: PanelModel<Partial<GaugeOptions>> | any,\n  prevPluginId: string,\n  prevOptions: any\n) => {\n  // This handles most config changes\n  const opts = sharedSingleStatPanelChangedHandler(panel, prevPluginId, prevOptions) as GaugeOptions;\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';\nimport { GaugeOptions } from './types';\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<GaugeOptions, {}>({\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 React, { PureComponent } from 'react';\nimport { stylesFactory } from '@grafana/ui';\nimport { DataFrame, Field, formattedValueToString, getFieldDisplayName, GrafanaTheme2 } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { config } from 'app/core/config';\nimport { FeatureLike } from 'ol/Feature';\n\nexport interface Props {\n  data?: DataFrame; // source data\n  feature?: FeatureLike;\n  rowIndex?: number; // the hover row\n  columnIndex?: number; // the hover column\n}\n\nexport class DataHoverView extends PureComponent<Props> {\n  style = getStyles(config.theme2);\n\n  render() {\n    const { data, feature, rowIndex, columnIndex } = this.props;\n\n    if (feature) {\n      return (\n        <table className={this.style.infoWrap}>\n          <tbody>\n            {Object.entries(feature.getProperties()).map(\n              (e, i) =>\n                e[0] === 'geometry' || ( //don't include geojson feature geometry\n                  <tr key={`${e}-${i}`}>\n                    <th>{`${e[0]}: `}</th>\n                    <td>{`${e[1]}`}</td>\n                  </tr>\n                )\n            )}\n          </tbody>\n        </table>\n      );\n    }\n\n    if (!data || rowIndex == null) {\n      return null;\n    }\n\n    return (\n      <table className={this.style.infoWrap}>\n        <tbody>\n          {data.fields.map((f, i) => (\n            <tr key={`${i}/${rowIndex}`} className={i === columnIndex ? this.style.highlight : ''}>\n              <th>{getFieldDisplayName(f, data)}:</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 React, { FC, useMemo, useState, useEffect } from 'react';\nimport { StandardEditorProps, SelectableValue, GrafanaTheme2 } from '@grafana/data';\nimport { Alert, Select, stylesFactory, useTheme2 } from '@grafana/ui';\nimport { COUNTRIES_GAZETTEER_PATH, Gazetteer, getGazetteer } from '../gazetteer/gazetteer';\nimport { css } from '@emotion/css';\nimport { GazetteerPathEditorConfigSettings } from '../types';\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 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        menuShouldPortal\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 { KeyValue } from '@grafana/data';\nimport { getBackendSrv } from '@grafana/runtime';\nimport { loadWorldmapPoints } from './worldmap';\nimport { loadFromGeoJSON } from './geojson';\n\n// http://geojson.xyz/\n\nexport interface PlacenameInfo {\n  coords: [number, number]; // lon, lat (WGS84)\n  props?: Record<string, any>;\n}\n\nexport interface Gazetteer {\n  path: string;\n  error?: string;\n  find: (key: string) => PlacenameInfo | undefined;\n  count?: number;\n  examples: (count: number) => string[];\n}\n\n// Without knowing the datatype pick a good lookup function\nexport function loadGazetteer(path: string, data: any): Gazetteer {\n  // Check for legacy worldmap syntax\n  if (Array.isArray(data)) {\n    const first = data[0] as any;\n    if (first.latitude && first.longitude && (first.key || first.keys)) {\n      return loadWorldmapPoints(path, data);\n    }\n  }\n\n  // try loading geojson\n  const features = data?.features;\n  if (Array.isArray(features) && data?.type === 'FeatureCollection') {\n    return loadFromGeoJSON(path, data);\n  }\n\n  return {\n    path,\n    error: 'Unable to parse locations',\n    find: (k) => undefined,\n    examples: (v) => [],\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 { 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 info: PlacenameInfo = {\n      coords: [v.longitude, v.latitude],\n    };\n    if (v.name) {\n      values.set(v.name, info);\n      values.set(v.name.toUpperCase(), info);\n      info.props = { name: v.name };\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 GeoJSON from 'ol/format/GeoJSON';\nimport { PlacenameInfo, Gazetteer } from './gazetteer';\n\nexport interface GeoJSONPoint {\n  key?: string;\n  keys?: string[]; // new in grafana 8.1+\n  latitude: number;\n  longitude: number;\n  name?: string;\n}\n\nexport function loadFromGeoJSON(path: string, body: any): Gazetteer {\n  const data = new GeoJSON().readFeatures(body);\n  let count = 0;\n  const values = new Map<string, PlacenameInfo>();\n  for (const f of data) {\n    const coords = f.getGeometry().getFlatCoordinates(); //for now point, eventually geometry\n    const info: PlacenameInfo = {\n      coords: coords,\n    };\n    const id = f.getId();\n    if (id) {\n      if (typeof id === 'number') {\n        values.set(id.toString(), info);\n      } else {\n        values.set(id, info);\n        values.set(id.toUpperCase(), info);\n      }\n    }\n    const properties = f.getProperties();\n    if (properties) {\n      for (const k of Object.keys(properties)) {\n        if (k.includes('_code') || k.includes('_id')) {\n          const value = properties[k];\n          if (value) {\n            if (typeof value === 'number') {\n              values.set(value.toString(), info);\n            } else {\n              values.set(value, info);\n              values.set(value.toUpperCase(), info);\n            }\n          }\n        }\n      }\n    }\n\n    count++;\n  }\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 { useEffect, useRef, RefObject, useState, useMemo } from 'react';\nimport useMountedState from 'react-use/lib/useMountedState';\nimport { Bounds } from './utils';\nimport usePrevious from 'react-use/lib/usePrevious';\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 React, { MouseEvent, memo } from 'react';\nimport cx from 'classnames';\nimport { Field, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, useTheme2 } from '@grafana/ui';\nimport { NodeDatum } from './types';\nimport { css } from '@emotion/css';\nimport tinycolor from 'tinycolor2';\nimport { statToString } from './utils';\n\nconst nodeR = 40;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  mainGroup: css`\n    cursor: pointer;\n    font-size: 10px;\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: boolean;\n}) {\n  const { node, onMouseEnter, onMouseLeave, onClick, hovering } = props;\n  const styles = useStyles2(getStyles);\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      {hovering && <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 - (hovering ? 100 : 35)} y={node.y - 15} width={hovering ? '200' : '70'} height=\"40\">\n          <div className={cx(styles.statsText, hovering && 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 - (hovering ? 100 : 50)}\n          y={node.y + nodeR + 5}\n          width={hovering ? '200' : '100'}\n          height=\"40\"\n        >\n          <div className={cx(styles.titleText, hovering && 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 React, { MouseEvent, memo } from 'react';\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, { useState } from 'react';\nimport { Button, HorizontalGroup, useStyles, VerticalGroup } from '@grafana/ui';\nimport { css } from '@emotion/css';\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'} variant={'link'} 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 { 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 { fromPairs, uniq } from 'lodash';\nimport { useMemo } from 'react';\nimport { EdgeDatumLayout, NodeDatum, NodesMarker } from './types';\nimport { Config } from './layout';\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 { EdgeDatum, EdgeDatumLayout, NodeDatum } from './types';\nimport { Field } from '@grafana/data';\nimport { useNodeLimit } from './useNodeLimit';\nimport useMountedState from 'react-use/lib/useMountedState';\nimport { graphBounds } from './utils';\nimport { createWorker } from './createLayoutWorker';\nimport { useUnmount } from 'react-use';\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 { nodes: nodesWithLimit, edges: edgesWithLimit, markers } = 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(() => graphBounds([...nodesWithLimit, ...(markers || []).map((m) => m.node)]), [\n    nodesWithLimit,\n    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 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=\"strokeWidth\"\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 React, { memo } from 'react';\nimport { EdgeDatum, NodeDatum } from './types';\nimport { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\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 React, { MouseEvent, useCallback, useState } from 'react';\nimport { EdgeDatum, NodeDatum } from './types';\nimport { DataFrame, Field, GrafanaTheme, LinkModel } from '@grafana/data';\nimport { getEdgeFields, getNodeFields } from './utils';\nimport { css } from '@emotion/css';\nimport { Config } from './layout';\nimport { ContextMenu, MenuGroup, MenuItem, stylesFactory, useTheme } from '@grafana/ui';\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  return (\n    <div>\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 React, { MouseEvent, memo } from 'react';\nimport { NodesMarker } from './types';\nimport { GrafanaTheme } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { stylesFactory, useTheme } from '@grafana/ui';\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 React, { useCallback } from 'react';\nimport { NodeDatum } from './types';\nimport { Field, FieldColorModeId, getColorForTheme, GrafanaTheme } from '@grafana/data';\nimport { identity } from 'lodash';\nimport { Config } from './layout';\nimport { css } from '@emotion/css';\nimport { LegendDisplayMode } from '@grafana/schema';\nimport { Icon, useStyles, useTheme, VizLegend, VizLegendItem, VizLegendListItem } from '@grafana/ui';\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 = getColorForTheme(f.config.color?.fixedColor || '', theme);\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 = getColorForTheme('', theme);\n    }\n\n    return item;\n  });\n}\n","import React, { memo, MouseEvent, MutableRefObject, useCallback, useMemo, useState } from 'react';\nimport cx from 'classnames';\nimport useMeasure from 'react-use/lib/useMeasure';\nimport { Icon, Spinner, useStyles2, useTheme2 } from '@grafana/ui';\nimport { usePanning } from './usePanning';\nimport { EdgeDatum, NodeDatum, NodesMarker } from './types';\nimport { Node } from './Node';\nimport { Edge } from './Edge';\nimport { ViewControls } from './ViewControls';\nimport { DataFrame, GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { useZoom } from './useZoom';\nimport { Config, defaultConfig, useLayout } from './layout';\nimport { EdgeArrowMarker } from './EdgeArrowMarker';\nimport { css } from '@emotion/css';\nimport { useCategorizeFrames } from './useCategorizeFrames';\nimport { EdgeLabel } from './EdgeLabel';\nimport { useContextMenu } from './useContextMenu';\nimport { processNodes, Bounds } from './utils';\nimport { Marker } from './Marker';\nimport { Legend } from './Legend';\nimport { useHighlight } from './useHighlight';\nimport { useFocusPositionOnLayout } from './useFocusPositionOnLayout';\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  // 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\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(() => processNodes(firstNodesDataFrame, firstEdgesDataFrame, theme), [\n    firstEdgesDataFrame,\n    firstNodesDataFrame,\n    theme,\n  ]);\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&nbsp;\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              hoveringId={nodeHover || 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// These components are here as a perf optimisation to prevent going through all nodes and edges on every pan/zoom.\n\ninterface NodesProps {\n  nodes: NodeDatum[];\n  onMouseEnter: (id: string) => void;\n  onMouseLeave: (id: string) => void;\n  onClick: (event: MouseEvent<SVGElement>, node: NodeDatum) => void;\n  hoveringId?: 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={props.hoveringId === n.id}\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';\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';\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  FieldType,\n  GrafanaTheme2,\n  MutableDataFrame,\n  NodeGraphDataFrameFieldNames,\n} from '@grafana/data';\nimport { EdgeDatum, NodeDatum } 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 fieldsCache = new FieldCache(nodes);\n  return {\n    id: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.id),\n    title: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.title),\n    subTitle: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.subTitle),\n    mainStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.mainStat),\n    secondaryStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.secondaryStat),\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 fieldsCache = new FieldCache(edges);\n  return {\n    id: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.id),\n    source: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.source),\n    target: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.target),\n    mainStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.mainStat),\n    secondaryStat: fieldsCache.getFieldByName(NodeGraphDataFrameFieldNames.secondaryStat),\n    details: findFieldsByPrefix(edges, NodeGraphDataFrameFieldNames.detail),\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[]) {\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  return frames.filter((frame) => frame.meta?.preferredVisualisationType === 'nodeGraph');\n}\n","import React, { PureComponent } from 'react';\nimport {\n  BigValue,\n  BigValueGraphMode,\n  DataLinksContextMenu,\n  VizRepeater,\n  VizRepeaterRenderValueProps,\n  BigValueTextMode,\n} from '@grafana/ui';\nimport {\n  DisplayValueAlignmentFactors,\n  FieldDisplay,\n  FieldType,\n  getDisplayValueAlignmentFactors,\n  getFieldDisplayValues,\n  NumericRange,\n  PanelProps,\n} from '@grafana/data';\n\nimport { config } from 'app/core/config';\nimport { StatPanelOptions } from './types';\nimport { DataLinksContextMenuApi } from '@grafana/ui/src/components/DataLinks/DataLinksContextMenu';\nimport { findNumericFieldMinMax } from '@grafana/data/src/field/fieldOverrides';\nimport { isNumber } from 'lodash';\n\nexport class StatPanel extends PureComponent<PanelProps<StatPanelOptions>> {\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} config={value.field}>\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","import {\n  BigValueColorMode,\n  BigValueTextMode,\n  commonOptionsBuilder,\n  sharedSingleStatMigrationHandler,\n} from '@grafana/ui';\nimport { PanelPlugin } from '@grafana/data';\nimport { addOrientationOption, addStandardDataReduceOptions, StatPanelOptions } from './types';\nimport { StatPanel } from './StatPanel';\nimport { statPanelChangedHandler } from './StatMigrations';\nimport { StatSuggestionsSupplier } from './suggestions';\n\nexport const plugin = new PanelPlugin<StatPanelOptions>(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: 'auto',\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: 'area',\n        settings: {\n          options: [\n            { value: 'none', label: 'None' },\n            { value: 'area', label: 'Area' },\n          ],\n        },\n      })\n      .addRadio({\n        path: 'justifyMode',\n        name: 'Text alignment',\n        defaultValue: 'auto',\n        category: mainCategory,\n        settings: {\n          options: [\n            { value: 'auto', label: 'Auto' },\n            { value: 'center', label: 'Center' },\n          ],\n        },\n      });\n  })\n  .setNoPadding()\n  .setPanelChangeHandler(statPanelChangedHandler)\n  .setSuggestionsSupplier(new StatSuggestionsSupplier())\n  .setMigrationHandler(sharedSingleStatMigrationHandler);\n","import { sharedSingleStatPanelChangedHandler, BigValueGraphMode, BigValueColorMode } from '@grafana/ui';\nimport { FieldColorModeId, FieldConfigSource, PanelModel } from '@grafana/data';\nimport { StatPanelOptions } from './types';\nimport { BigValueTextMode } from '@grafana/ui/src/components/BigValue/BigValue';\n\n// This is called when the panel changes from another panel\nexport const statPanelChangedHandler = (\n  panel: PanelModel<Partial<StatPanelOptions>> | any,\n  prevPluginId: string,\n  prevOptions: any\n) => {\n  // This handles most config changes\n  const options = sharedSingleStatPanelChangedHandler(panel, prevPluginId, prevOptions) as StatPanelOptions;\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/ui';\nimport { SuggestionName } from 'app/types/suggestions';\nimport { StatPanelOptions } from './types';\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<StatPanelOptions, {}>({\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 {\n  SingleStatBaseOptions,\n  BigValueColorMode,\n  BigValueGraphMode,\n  BigValueJustifyMode,\n  BigValueTextMode,\n} from '@grafana/ui';\nimport {\n  ReducerID,\n  standardEditorsRegistry,\n  FieldOverrideContext,\n  getFieldDisplayName,\n  escapeStringForRegex,\n  VizOrientation,\n  PanelOptionsEditorBuilder,\n} from '@grafana/data';\n\n// Structure copied from angular\nexport interface StatPanelOptions extends SingleStatBaseOptions {\n  graphMode: BigValueGraphMode;\n  colorMode: BigValueColorMode;\n  justifyMode: BigValueJustifyMode;\n  textMode: BigValueTextMode;\n}\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    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 { DashboardCursorSync } from '@grafana/data';\nimport { HideableFieldConfig, OptionsWithLegend, OptionsWithTooltip, VisibilityMode } from '@grafana/schema';\n\n/**\n * @alpha\n */\nexport interface TimelineOptions extends OptionsWithLegend, OptionsWithTooltip {\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}\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';\nimport { FIXED_UNIT } from '@grafana/ui/src/components/GraphNG/GraphNG';\nimport { pointWithin, Quadtree, Rect } from 'app/plugins/panel/barchart/quadtree';\nimport { distribute, SPACE_BETWEEN } from 'app/plugins/panel/barchart/distribute';\nimport { TimelineFieldConfig, TimelineMode, TimelineValueAlignment } from './types';\nimport { GrafanaTheme2, TimeRange } from '@grafana/data';\nimport { VisibilityMode } from '@grafana/schema';\nimport { alpha } from '@grafana/data/src/themes/colorManipulator';\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  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    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              if (dataY[ix] != null) {\n                let left = Math.round(valToPosX(dataX[ix], scaleX, xDim, xOff));\n\n                let nextIx = ix;\n                while (dataY[++nextIx] === undefined && nextIx < dataY.length) {}\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                  dataY[ix],\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 { XYFieldMatchers } from '@grafana/ui/src/components/GraphNG/types';\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  outerJoinDataFrames,\n  ThresholdsMode,\n} from '@grafana/data';\nimport {\n  FIXED_UNIT,\n  SeriesVisibilityChangeMode,\n  UPlotConfigBuilder,\n  UPlotConfigPrepFn,\n  VizLegendItem,\n} from '@grafana/ui';\nimport { getConfig, TimelineCoreOptions } from './timeline';\nimport { VizLegendOptions, AxisPlacement, ScaleDirection, ScaleOrientation } from '@grafana/schema';\nimport { TimelineFieldConfig, TimelineOptions } from './types';\nimport { PlotTooltipInterpolator } from '@grafana/ui/src/components/uPlot/types';\nimport { preparePlotData } from '../../../../../packages/grafana-ui/src/components/uPlot/utils';\nimport uPlot from 'uplot';\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 function preparePlotFrame(data: DataFrame[], dimFields: XYFieldMatchers) {\n  return outerJoinDataFrames({\n    frames: data,\n    joinBy: dimFields.x,\n    keep: dimFields.y,\n    keepOriginIndices: true,\n  });\n}\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<TimelineOptions> = ({\n  frame,\n  theme,\n  timeZone,\n  getTimeRange,\n  mode,\n  eventBus,\n  sync,\n  rowHeight,\n  colWidth,\n  showValue,\n  alignValue,\n}) => {\n  const builder = new UPlotConfigBuilder(timeZone);\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 getValueColor = (seriesIdx: number, value: any) => {\n    const field = frame.fields[seriesIdx];\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  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    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,\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(preparePlotData);\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,\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\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 prev: Threshold | undefined = undefined;\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      prev = undefined;\n    }\n    const active = getActiveThreshold(v, thresholds.steps);\n    if (active === prev) {\n      vals[i] = undefined;\n    } else {\n      vals[i] = thresholdToText.get(active);\n    }\n    prev = active;\n  }\n\n  return {\n    ...field,\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  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  for (let frame of series) {\n    let isTimeseries = false;\n    let changed = false;\n    const fields: Field[] = [];\n    for (let field of frame.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                // magic value for join() to leave nulls alone\n                spanNulls: -1,\n              },\n            },\n          };\n\n          if (mergeValues) {\n            let merged = unsetSameFutureValues(field.values.toArray());\n            if (merged) {\n              fields.push({\n                ...field,\n                values: new ArrayVector(merged),\n              });\n              changed = true;\n              continue;\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          ...frame,\n          fields,\n        });\n      } else {\n        frames.push(frame);\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.displayMode === 'hidden') {\n    return undefined;\n  }\n\n  const fields = allNonTimeFields(frames);\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  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) {\n      end = rightPointer;\n    } else {\n      rightPointer++;\n    }\n  }\n\n  return end;\n}\n","import React, { useMemo } from 'react';\nimport { LineStyle } from '@grafana/schema';\nimport { FieldOverrideEditorProps, SelectableValue } from '@grafana/data';\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            menuShouldPortal\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            &nbsp;\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, { useMemo } from 'react';\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      menuShouldPortal\n      options={names}\n      value={current}\n      onChange={(v) => {\n        onChange(v.value);\n      }}\n    />\n  );\n};\n","import React from 'react';\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>&lt;</div>}\n          spellCheck={false}\n        />\n      )}\n    </HorizontalGroup>\n  );\n};\n","import React, { useCallback } from 'react';\nimport { GraphTresholdsStyleMode } from '@grafana/schema';\nimport { FieldOverrideEditorProps, SelectableValue } from '@grafana/data';\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 (\n    <Select inputId={id} menuShouldPortal value={value.mode} options={item.settings.options} onChange={onChangeCb} />\n  );\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} from '@grafana/schema';\n\nimport { graphFieldOptions, commonOptionsBuilder } from '@grafana/ui';\n\nimport { LineStyleEditor } from './LineStyleEditor';\nimport { FillBellowToEditor } from './FillBelowToEditor';\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};\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      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","import { makeClassES5Compatible } from '@grafana/data';\nimport { loadPluginCss } from '@grafana/runtime';\nimport { PanelCtrl as PanelCtrlES6 } from 'app/angular/panel/panel_ctrl';\nimport { MetricsPanelCtrl as MetricsPanelCtrlES6 } from 'app/angular/panel/metrics_panel_ctrl';\nimport { QueryCtrl as QueryCtrlES6 } from 'app/angular/panel/query_ctrl';\n\nconst PanelCtrl = makeClassES5Compatible(PanelCtrlES6);\nconst MetricsPanelCtrl = makeClassES5Compatible(MetricsPanelCtrlES6);\nconst QueryCtrl = makeClassES5Compatible(QueryCtrlES6);\n\nexport { PanelCtrl, MetricsPanelCtrl, QueryCtrl, loadPluginCss };\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 { StoreState } from 'app/types';\nimport { Store } from 'redux';\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 {\n      templating: {\n        variables: {},\n      },\n    } 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\nexport class ZoomOutEvent extends BusEventWithPayload<number> {\n  static type = 'zoom-out';\n}\n\nexport enum ShiftTimeEventPayload {\n  Left = -1,\n  Right = 1,\n}\nexport class ShiftTimeEvent extends BusEventWithPayload<ShiftTimeEventPayload> {\n  static type = 'shift-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';\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} from '@grafana/data';\nimport { ExploreGraphStyle } from 'app/core/utils/explore';\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   * History of all queries\n   */\n  richHistory: RichHistoryQuery[];\n\n  /**\n   * True if local storage quota was exceeded when a new item was added. This is to prevent showing\n   * multiple errors when local storage is full.\n   */\n  localStorageFull: 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\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: PanelData;\n\n  /**\n   * Panel Id that is set if we come to explore from a penel. Used so we can get back to it and optionally modify the\n   * query of that panel.\n   */\n  originPanelId?: number | null;\n\n  showLogs?: boolean;\n  showMetrics?: boolean;\n  showTable?: boolean;\n  showTrace?: boolean;\n  showNodeGraph?: boolean;\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: PanelData }>;\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}\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 = {\n  ts: number;\n  datasourceName: string;\n  datasourceId: string;\n  starred: boolean;\n  comment: string;\n  queries: DataQuery[];\n  sessionName: string;\n  timeRange?: string;\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 { DashboardAcl } from './acl';\nimport { DataQuery } from '@grafana/data';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\n\nexport interface DashboardDTO {\n  redirectUri?: string;\n  dashboard: DashboardDataDTO;\n  meta: DashboardMeta;\n}\n\nexport interface DashboardMeta {\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  fromExplore?: boolean;\n  canMakeEditable?: boolean;\n  submenuEnabled?: boolean;\n  provisioned?: boolean;\n  provisionedExternalId?: string;\n  isStarred?: boolean;\n  showSettings?: boolean;\n  expires?: string;\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}\n\nexport interface DashboardDataDTO {\n  title: string;\n}\n\nexport enum DashboardRoutes {\n  Home = 'home-dashboard',\n  New = 'new-dashboard',\n  Normal = 'normal-dashboard',\n  Scripted = 'scripted-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  isInitSlow: boolean;\n  initError: DashboardInitError | null;\n  permissions: DashboardAcl[];\n  modifiedQueries: QueriesToUpdateOnDashboardLoad | null;\n}\n","export interface AppNotification {\n  id: string;\n  severity: AppNotificationSeverity;\n  icon: string;\n  title: string;\n  text: string;\n  component?: React.ReactElement;\n  timeout: AppNotificationTimeout;\n}\n\nexport enum AppNotificationSeverity {\n  Success = 'success',\n  Warning = 'warning',\n  Error = 'error',\n  Info = 'info',\n}\n\nexport enum AppNotificationTimeout {\n  Warning = 5000,\n  Success = 3000,\n  Error = 7000,\n}\n\nexport interface AppNotificationsState {\n  appNotifications: AppNotification[];\n}\n","/**\n * UserPermission is a map storing permissions in a form of\n * {\n *   action: { scope: scope }\n * }\n */\nexport type UserPermission = {\n  [key: string]: { [key: string]: string };\n};\n\n// Permission actions\nexport enum AccessControlAction {\n  UsersRead = 'users:read',\n  UsersWrite = 'users:write',\n  UsersTeamRead = 'users.teams:read',\n  UsersAuthTokenList = 'users.authtoken:list',\n  UsersAuthTokenUpdate = 'users.authtoken:update',\n  UsersPasswordUpdate = 'users.password:update',\n  UsersDelete = 'users:delete',\n  UsersCreate = 'users:create',\n  UsersEnable = 'users:enable',\n  UsersDisable = 'users:disable',\n  UsersPermissionsUpdate = 'users.permissions:update',\n  UsersLogout = 'users:logout',\n  UsersQuotasList = 'users.quotas:list',\n  UsersQuotasUpdate = 'users.quotas:update',\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  OrgUsersRoleUpdate = 'org.users.role:update',\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\n  ActionServerStatsRead = 'server.stats:read',\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\nexport enum PromRuleType {\n  Alerting = 'alerting',\n  Recording = 'recording',\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 | GrafanaAlertState, 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}\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}\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  rules: R[];\n};\n\nexport type PostableRulerRuleGroupDTO = RulerRuleGroupDTO<PostableRuleDTO>;\n\nexport type RulerRulesConfigDTO = { [namespace: string]: RulerRuleGroupDTO[] };\n","/**\n * AngularStrap - Twitter Bootstrap directives for AngularJS\n * @version v0.7.5 - 2013-07-21\n * @link http://mgcrea.github.com/angular-strap\n * @author Olivier Louvignes <olivier@mg-crea.com>\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\nangular.module('$strap.config', []).value('$strapConfig', {});\nangular.module('$strap.filters', ['$strap.config']);\nangular.module('$strap.directives', ['$strap.config']);\nangular.module('$strap', [\n  '$strap.filters',\n  '$strap.directives',\n  '$strap.config'\n]);\n'use strict';\nangular.module('$strap.directives').factory('$modal', [\n  '$rootScope',\n  '$compile',\n  '$http',\n  '$timeout',\n  '$q',\n  '$templateCache',\n  '$strapConfig',\n  function ($rootScope, $compile, $http, $timeout, $q, $templateCache, $strapConfig) {\n    var ModalFactory = function ModalFactory(config) {\n      function Modal(config) {\n        var options = angular.extend({ show: true }, $strapConfig.modal, config);\n        var scope = options.scope ? options.scope : $rootScope.$new()\n        var templateUrl = options.template;\n        return $q.when(options.templateHtml || $templateCache.get(templateUrl) || $http.get(templateUrl, { cache: true }).then(function (res) {\n          return res.data;\n        })).then(function onSuccess(template) {\n          var id = scope.$id;\n          if (templateUrl) {\n            id += templateUrl.replace('.html', '').replace(/[\\/|\\.|:]/g, '-');\n          }\n          // grafana change, removed fade\n          var $modal = $('<div class=\"modal hide\" tabindex=\"-1\"></div>').attr('id', id).html(template);\n          if (options.modalClass)\n            $modal.addClass(options.modalClass);\n          $('body').append($modal);\n          $timeout(function () {\n            $compile($modal)(scope);\n          });\n          scope.$modal = function (name) {\n            $modal.modal(name);\n          };\n          angular.forEach([\n            'show',\n            'hide'\n          ], function (name) {\n            scope[name] = function () {\n              $modal.modal(name);\n            };\n          });\n          scope.dismiss = scope.hide;\n          angular.forEach([\n            'show',\n            'shown',\n            'hide',\n            'hidden'\n          ], function (name) {\n            $modal.on(name, function (ev) {\n              scope.$emit('modal-' + name, ev);\n            });\n          });\n          $modal.on('shown', function (ev) {\n            $('input[autofocus], textarea[autofocus]', $modal).first().trigger('focus');\n          });\n          $modal.on('hidden', function (ev) {\n            if (!options.persist)\n              scope.$destroy();\n          });\n          scope.$on('$destroy', function () {\n            $modal.remove();\n          });\n          $modal.modal(options);\n          return $modal;\n        });\n      }\n      return new Modal(config);\n    };\n    return ModalFactory;\n  }\n])\n\n'use strict';\nangular.module('$strap.directives').directive('bsTooltip', [\n  '$parse',\n  '$compile',\n  function ($parse, $compile) {\n    return {\n      restrict: 'A',\n      scope: true,\n      link: function postLink(scope, element, attrs, ctrl) {\n        var getter = $parse(attrs.bsTooltip), setter = getter.assign, value = getter(scope);\n        scope.$watch(attrs.bsTooltip, function (newValue, oldValue) {\n          if (newValue !== oldValue) {\n            value = newValue;\n          }\n        });\n        // Grafana change, always hide other tooltips\n        if (true) {\n          element.on('show', function (ev) {\n            $('.tooltip.in').each(function () {\n              var $this = $(this), tooltip = $this.data('tooltip');\n              if (tooltip && !tooltip.$element.is(element)) {\n                $this.tooltip('hide');\n              }\n            });\n          });\n        }\n        element.tooltip({\n          title: function () {\n            return angular.isFunction(value) ? value.apply(null, arguments) : value;\n          },\n          html: true,\n          container: 'body', // Grafana change\n        });\n        var tooltip = element.data('tooltip');\n        tooltip.show = function () {\n          var r = $.fn.tooltip.Constructor.prototype.show.apply(this, arguments);\n          this.tip().data('tooltip', this);\n          return r;\n        };\n        scope._tooltip = function (event) {\n          element.tooltip(event);\n        };\n        scope.hide = function () {\n          element.tooltip('hide');\n        };\n        scope.show = function () {\n          element.tooltip('show');\n        };\n        scope.dismiss = scope.hide;\n      }\n    };\n  }\n]);\n\n'use strict';\nangular.module('$strap.directives').directive('bsTypeahead', [\n  '$parse',\n  function ($parse) {\n    return {\n      restrict: 'A',\n      require: '?ngModel',\n      link: function postLink(scope, element, attrs, controller) {\n        var getter = $parse(attrs.bsTypeahead), setter = getter.assign, value = getter(scope);\n        scope.$watch(attrs.bsTypeahead, function (newValue, oldValue) {\n          if (newValue !== oldValue) {\n            value = newValue;\n          }\n        });\n        element.attr('data-provide', 'typeahead');\n        element.typeahead({\n          source: function (query) {\n            return angular.isFunction(value) ? value.apply(null, arguments) : value;\n          },\n          minLength: attrs.minLength || 1,\n          items: attrs.items,\n          updater: function (value) {\n            if (controller) {\n              scope.$apply(function () {\n                controller.$setViewValue(value);\n              });\n            }\n            scope.$emit('typeahead-updated', value);\n            return value;\n          }\n        });\n        var typeahead = element.data('typeahead');\n        typeahead.lookup = function (ev) {\n          var items;\n          this.query = this.$element.val() || '';\n          if (this.query.length < this.options.minLength) {\n            return this.shown ? this.hide() : this;\n          }\n          items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source;\n          return items ? this.process(items) : this;\n        };\n        if (!!attrs.matchAll) {\n          typeahead.matcher = function (item) {\n            return true;\n          };\n        }\n        if (attrs.minLength === '0') {\n          setTimeout(function () {\n            element.on('focus', function () {\n              element.val().length === 0 && setTimeout(element.typeahead.bind(element, 'lookup'), 200);\n            });\n          });\n        }\n      }\n    };\n  }\n]);\n","/* ===================================================\n * bootstrap-transition.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#transitions\n * ===================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n   * ======================================================= */\n\n  $(function () {\n\n    $.support.transition = (function () {\n\n      var transitionEnd = (function () {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n               'WebkitTransition' : 'webkitTransitionEnd'\n            ,  'MozTransition'    : 'transitionend'\n            ,  'OTransition'      : 'oTransitionEnd otransitionend'\n            ,  'transition'       : 'transitionend'\n            }\n          , name\n\n        for (name in transEndEventNames){\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);/* ==========================================================\n * bootstrap-alert.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#alerts\n * ==========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n/* ============================================================\n * bootstrap-dropdown.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#dropdowns\n * ============================================================\n * Copyright 2013 Twitter, 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\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        if ('ontouchstart' in document.documentElement) {\n          // if mobile we we use a backdrop because click events don't delegate\n          $('<div class=\"dropdown-backdrop\"/>').insertBefore($(this)).on('click', clearMenus)\n        }\n        $parent.toggleClass('open')\n      }\n\n      $this.focus()\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) {\n        if (e.which == 27) $parent.find(toggle).focus()\n        return $this.click()\n      }\n\n      $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    $('.dropdown-backdrop').remove()\n    $(toggle).each(function () {\n      getParent($(this)).removeClass('open')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      // grafana backport fix from bootstrap 3\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = selector && $(selector)\n\n    if (!$parent || !$parent.length) $parent = $this.parent()\n\n    return $parent\n  }\n\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n /* DROPDOWN NO CONFLICT\n  * ==================== */\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(document)\n    .on('click.dropdown.data-api', clearMenus)\n    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n/* =========================================================\n * bootstrap-modal.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#modals\n * =========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = true\n\n        this.escape()\n\n        this.backdrop(function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element.show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element\n            .addClass('in')\n            .attr('aria-hidden', false)\n\n          that.enforceFocus()\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :\n            that.$element.focus().trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        this.escape()\n\n        $(document).off('focusin.modal')\n\n        this.$element\n          .removeClass('in')\n          .attr('aria-hidden', true)\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.hideWithTransition() :\n          this.hideModal()\n      }\n\n    , enforceFocus: function () {\n        var that = this\n        $(document).on('focusin.modal', function (e) {\n          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n            that.$element.focus()\n          }\n        })\n      }\n\n    , escape: function () {\n        var that = this\n        if (this.isShown && this.options.keyboard) {\n          this.$element.on('keyup.dismiss.modal', function ( e ) {\n            e.which == 27 && that.hide()\n          })\n        } else if (!this.isShown) {\n          this.$element.off('keyup.dismiss.modal')\n        }\n      }\n\n    , hideWithTransition: function () {\n        var that = this\n          , timeout = setTimeout(function () {\n              that.$element.off($.support.transition.end)\n              that.hideModal()\n            }, 500)\n\n        this.$element.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          that.hideModal()\n        })\n      }\n\n    , hideModal: function () {\n        var that = this\n        this.$element.hide()\n        this.backdrop(function () {\n          that.removeBackdrop()\n          that.$element.trigger('hidden')\n        })\n      }\n\n    , removeBackdrop: function () {\n        this.$backdrop && this.$backdrop.remove()\n        this.$backdrop = null\n      }\n\n    , backdrop: function (callback) {\n        var that = this\n          , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n        if (this.isShown && this.options.backdrop) {\n          var doAnimate = $.support.transition && animate\n\n          this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n            .appendTo(document.body)\n\n          this.$backdrop.click(\n            this.options.backdrop == 'static' ?\n              $.proxy(this.$element[0].focus, this.$element[0])\n            : $.proxy(this.hide, this)\n          )\n\n          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n          this.$backdrop.addClass('in')\n\n          if (!callback) return\n\n          doAnimate ?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (!this.isShown && this.$backdrop) {\n          this.$backdrop.removeClass('in')\n\n          $.support.transition && this.$element.hasClass('fade')?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (callback) {\n          callback()\n        }\n      }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL NO CONFLICT\n  * ================= */\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(document).on('click.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this = $(this)\n      , href = $this.attr('href')\n      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option)\n      .one('hide', function () {\n        $this.focus()\n      })\n  })\n\n}(window.jQuery);\n/* ===========================================================\n * bootstrap-tooltip.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TOOLTIP PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Tooltip = function (element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n  , init: function (type, element, options) {\n      var eventIn\n        , eventOut\n        , triggers\n        , trigger\n        , i\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      triggers = this.options.trigger.split(' ')\n\n      for (i = triggers.length; i--;) {\n        trigger = triggers[i]\n        if (trigger == 'click') {\n          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n        } else if (trigger != 'manual') {\n          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'\n          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n        }\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n  , getOptions: function (options) {\n      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n        , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n  , enter: function (e) {\n      var defaults = $.fn[this.type].defaults\n        , options = {}\n        , self\n\n      this._options && $.each(this._options, function (key, value) {\n        if (defaults[key] != value) options[key] = value\n      }, this)\n\n      self = $(e.currentTarget)[this.type](options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n  , leave: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n  , show: function () {\n      var $tip\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n        , e = $.Event('show')\n\n      if (this.hasContent() && this.enabled) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        $tip\n          .detach()\n          .css({ top: 0, left: 0, display: 'block' })\n\n        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n        pos = this.getPosition()\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (placement) {\n          case 'bottom':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'top':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'left':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}\n            break\n          case 'right':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}\n            break\n\n          // extend placements (top)\n          case 'topLeft':\n            tp = {top: pos.top - actualHeight,  left: pos.left + pos.width / 2 - (actualWidth * .10)};\n            break;\n          case 'topRight':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - (actualWidth * .90)};\n            break;\n\n          // extend placements (right)\n          case 'rightTop':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight *.10), left: pos.left + pos.width};\n            break;\n          case 'rightBottom':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight * .90), left: pos.left + pos.width};\n            break;\n\n          // extend placements (bottom)\n          case 'bottomLeft':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - (actualWidth * .10)};\n            break;\n          case 'bottomRight':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - (actualWidth * .90)};\n            break;\n\n          // extend placements (left)\n          case 'leftTop':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight *.10), left: pos.left - actualWidth};\n            break;\n          case 'leftBottom':\n            tp = {top: pos.top + pos.height / 2 - (actualHeight * .90), left: pos.left - actualWidth};\n            break;\n\n\n        }\n\n        this.applyPlacement(tp, placement)\n        this.$element.trigger('shown')\n      }\n    }\n\n  , applyPlacement: function(offset, placement){\n      var $tip = this.tip()\n        , width = $tip[0].offsetWidth\n        , height = $tip[0].offsetHeight\n        , actualWidth\n        , actualHeight\n        , delta\n        , replace\n\n      $tip\n        .offset(offset)\n        .addClass(placement)\n        .addClass('in')\n\n      actualWidth = $tip[0].offsetWidth\n      actualHeight = $tip[0].offsetHeight\n\n      if (placement == 'top' && actualHeight != height) {\n        offset.top = offset.top + height - actualHeight\n        replace = true\n      }\n\n      if (placement == 'bottom' || placement == 'top') {\n        delta = 0\n\n        if (offset.left < 0){\n          delta = offset.left * -2\n          offset.left = 0\n          $tip.offset(offset)\n          actualWidth = $tip[0].offsetWidth\n          actualHeight = $tip[0].offsetHeight\n        }\n\n        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n      } else {\n        this.replaceArrow(actualHeight - height, actualHeight, 'top')\n      }\n\n      if (replace) $tip.offset(offset)\n    }\n\n  , replaceArrow: function(delta, dimension, position){\n      this\n        .arrow()\n        .css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n    }\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n  , hide: function () {\n      var that = this\n        , $tip = this.tip()\n        , e = $.Event('hide')\n\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function () {\n          $tip.off($.support.transition.end).detach()\n        }, 500)\n\n        $tip.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          $tip.detach()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.detach()\n\n      this.$element.trigger('hidden')\n\n      return this\n    }\n\n  , fixTitle: function () {\n      var $e = this.$element\n      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n      }\n    }\n\n  , hasContent: function () {\n      return this.getTitle()\n    }\n\n  , getPosition: function () {\n      var el = this.$element[0]\n      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n        width: el.offsetWidth\n      , height: el.offsetHeight\n      }, this.$element.offset())\n    }\n\n  , getTitle: function () {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n      return title\n    }\n\n  , tip: function () {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n  , arrow: function(){\n      return this.$arrow = this.$arrow || this.tip().find(\".tooltip-arrow\")\n    }\n\n  , validate: function () {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n  , enable: function () {\n      this.enabled = true\n    }\n\n  , disable: function () {\n      this.enabled = false\n    }\n\n  , toggleEnabled: function () {\n      this.enabled = !this.enabled\n    }\n\n  , toggle: function (e) {\n      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this\n      self.tip().hasClass('in') ? self.hide() : self.show()\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n\n /* TOOLTIP PLUGIN DEFINITION\n  * ========================= */\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n\n /* TOOLTIP NO CONFLICT\n  * =================== */\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================\n * bootstrap-tab.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tabs\n * ========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TAB CLASS DEFINITION\n  * ==================== */\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n  , show: function () {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ( $this.parent('li').hasClass('active') ) return\n\n      previous = $ul.find('.active:last a')[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function () {\n        $this.trigger({\n          type: 'shown'\n        , relatedTarget: previous\n        })\n      })\n    }\n\n  , activate: function ( element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n            && $.support.transition\n            && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if ( element.parent('.dropdown-menu') ) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n\n /* TAB PLUGIN DEFINITION\n  * ===================== */\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n /* TAB NO CONFLICT\n  * =============== */\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n /* TAB DATA-API\n  * ============ */\n\n  $(document).on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);/* =============================================================\n * bootstrap-typeahead.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#typeahead\n * =============================================================\n * Copyright 2013 Twitter, 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\n!function($){\n\n  \"use strict\"; // jshint ;_;\n\n\n /* TYPEAHEAD PUBLIC CLASS DEFINITION\n  * ================================= */\n\n  var Typeahead = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.source = this.options.source\n    this.$menu = $(this.options.menu)\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n  , select: function () {\n    // CHANGE (rashidkpc) If nothing is selected, use existing value\n      var val = this.$menu.find('.active').attr('data-value') || this.$element.val();\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n  , updater: function (item) {\n      return item\n    }\n\n  , show: function () {\n      var pos = $.extend({}, this.$element.position(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu\n        .insertAfter(this.$element)\n        .css({\n          top: pos.top + pos.height\n        , left: pos.left\n        })\n        .show()\n\n      this.shown = true\n      return this\n    }\n\n  , hide: function () {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n  , lookup: function (event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n    , process: function (items) {\n      var that = this\n\n      items = $.grep(items, function (item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n  , matcher: function (item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n  , sorter: function (items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n  , highlighter: function (item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      if (!query) {\n        return item;\n      }\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {\n        return '<strong>' + match + '</strong>'\n      });\n    }\n\n  , render: function (items) {\n      var that = this\n\n      items = $(items).map(function (i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      // CHANGE (rashidpc) Do not select first element by default\n      // items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n  , next: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n  , prev: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n  , listen: function () {\n      this.$element\n        .on('focus',    $.proxy(this.focus, this))\n        .on('blur',     $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup',    $.proxy(this.keyup, this))\n\n      if (this.eventSupported('keydown')) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))\n    },\n\n    destroy: function () {\n      this.$element.off().removeData('typeahead');\n      this.$menu.off();\n    }\n\n  , eventSupported: function(eventName) {\n      var isSupported = eventName in this.$element\n      if (!isSupported) {\n        this.$element.setAttribute(eventName, 'return;')\n        isSupported = typeof this.$element[eventName] === 'function'\n      }\n      return isSupported\n    }\n\n  , move: function (e) {\n      if (!this.shown) return\n\n      // grafana change, shift+left parenthesis\n      if (e.shiftKey && e.keyCode === 40) {\n        return;\n      }\n\n      switch(e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n  , keydown: function (e) {\n      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27,57])\n      this.move(e)\n    }\n\n  , keypress: function (e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n  , keyup: function (e) {\n      switch(e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n        case 16: // shift\n        case 17: // ctrl\n        case 18: // alt\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup();\n      }\n\n      if(e.keyCode === 13 && typeof this.$menu.find('.active').attr('data-value') === 'undefined') {\n        // CHANGE (rashidkpc). Enter was hit, nothing was selected from typeahead, submit form\n        this.$element.submit();\n      } else {\n        e.stopPropagation()\n        e.preventDefault()\n      }\n\n  }\n\n  , focus: function (e) {\n      this.focused = true\n    }\n\n  , blur: function (e) {\n      this.focused = false\n      if (!this.mousedover && this.shown) this.hide()\n    }\n\n  , click: function (e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n      this.$element.focus()\n    }\n\n  , mouseenter: function (e) {\n      this.mousedover = true\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n  , mouseleave: function (e) {\n      this.mousedover = false\n      if (!this.focused && this.shown) this.hide()\n    }\n\n  }\n\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  var old = $.fn.typeahead\n\n  $.fn.typeahead = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n  , items: 8\n  , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n  , item: '<li><a href=\"#\"></a></li>'\n  , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n\n /* TYPEAHEAD NO CONFLICT\n  * =================== */\n\n  $.fn.typeahead.noConflict = function () {\n    $.fn.typeahead = old\n    return this\n  }\n\n\n /* TYPEAHEAD DATA-API\n  * ================== */\n\n  $(document).on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function (e) {\n    var $this = $(this)\n    if ($this.data('typeahead')) return\n    $this.typeahead($this.data())\n  })\n\n}(window.jQuery);\n/* ==========================================================\n * bootstrap-affix.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#affix\n * ==========================================================\n * Copyright 2013 Twitter, 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\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* AFFIX CLASS DEFINITION\n  * ====================== */\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window)\n      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n      'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n      'top'    : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n\n /* AFFIX PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n\n /* AFFIX NO CONFLICT\n  * ================= */\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n /* AFFIX DATA-API\n  * ============== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n\n}(window.jQuery);\n","/* 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\t// Cache the prototype hasOwnProperty for faster access\n\n\tvar 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\t///////////////////////////////////////////////////////////////////////////\n\t// The Canvas object is a wrapper around an HTML5 <canvas> tag.\n\t//\n\t// @constructor\n\t// @param {string} cls List of classes to apply to the canvas.\n\t// @param {element} container Element onto which to append the canvas.\n\t//\n\t// Requiring a container is a little iffy, but unfortunately canvas\n\t// operations don't work unless the canvas is attached to the DOM.\n\n\tfunction Canvas(cls, container) {\n\n\t\tvar element = container.children(\".\" + cls)[0];\n\n\t\tif (element == null) {\n\n\t\t\telement = document.createElement(\"canvas\");\n\t\t\telement.className = cls;\n\n\t\t\t$(element).css({ direction: \"ltr\", position: \"absolute\", left: 0, top: 0 })\n\t\t\t\t.appendTo(container);\n\n\t\t\t// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas\n\n\t\t\tif (!element.getContext) {\n\t\t\t\tif (window.G_vmlCanvasManager) {\n\t\t\t\t\telement = window.G_vmlCanvasManager.initElement(element);\n\t\t\t\t} else {\n\t\t\t\t\tthrow 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\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element = element;\n\n\t\tvar context = this.context = element.getContext(\"2d\");\n\n\t\t// Determine the screen's ratio of physical to device-independent\n\t\t// pixels.  This is the ratio between the canvas width that the browser\n\t\t// advertises and the number of pixels actually present in that space.\n\n\t\t// The iPhone 4, for example, has a device-independent width of 320px,\n\t\t// but its screen is actually 640px wide.  It therefore has a pixel\n\t\t// ratio of 2, while most normal devices have a ratio of 1.\n\n\t\tvar devicePixelRatio = window.devicePixelRatio || 1,\n\t\t\tbackingStoreRatio =\n\t\t\t\tcontext.webkitBackingStorePixelRatio ||\n\t\t\t\tcontext.mozBackingStorePixelRatio ||\n\t\t\t\tcontext.msBackingStorePixelRatio ||\n\t\t\t\tcontext.oBackingStorePixelRatio ||\n\t\t\t\tcontext.backingStorePixelRatio || 1;\n\n\t\tthis.pixelRatio = devicePixelRatio / backingStoreRatio;\n\n\t\t// Size the canvas to match the internal dimensions of its container\n\n\t\tthis.resize(container.width(), container.height());\n\n\t\t// Collection of HTML div layers for text overlaid onto the canvas\n\n\t\tthis.textContainer = null;\n\t\tthis.text = {};\n\n\t\t// Cache of text fragments and metrics, so we can avoid expensively\n\t\t// re-calculating them when the plot is re-rendered in a loop.\n\n\t\tthis._textCache = {};\n\t\tthis._textSizeCache = window.flotTextSizeCache = window.flotTextSizeCache || {};\n\t}\n\n\t// Resizes the canvas to the given dimensions.\n\t//\n\t// @param {number} width New width of the canvas, in pixels.\n\t// @param {number} width New height of the canvas, in pixels.\n\n\tCanvas.prototype.resize = function(width, height) {\n\n\t\tif (width <= 0 || height <= 0) {\n\t\t\tthrow new Error(\"Invalid dimensions for plot, width = \" + width + \", height = \" + height);\n\t\t}\n\n\t\tvar element = this.element,\n\t\t\tcontext = this.context,\n\t\t\tpixelRatio = this.pixelRatio;\n\n\t\t// Resize the canvas, increasing its density based on the display's\n\t\t// pixel ratio; basically giving it more pixels without increasing the\n\t\t// size of its element, to take advantage of the fact that retina\n\t\t// displays have that many more pixels in the same advertised space.\n\n\t\t// Resizing should reset the state (excanvas seems to be buggy though)\n\n\t\tif (this.width != width) {\n\t\t\telement.width = width * pixelRatio;\n\t\t\telement.style.width = width + \"px\";\n\t\t\tthis.width = width;\n\t\t}\n\n\t\tif (this.height != height) {\n\t\t\telement.height = height * pixelRatio;\n\t\t\telement.style.height = height + \"px\";\n\t\t\tthis.height = height;\n\t\t}\n\n\t\t// Save the context, so we can reset in case we get replotted.  The\n\t\t// restore ensure that we're really back at the initial state, and\n\t\t// should be safe even if we haven't saved the initial state yet.\n\n\t\tcontext.restore();\n\t\tcontext.save();\n\n\t\t// Scale the coordinate space to match the display density; so even though we\n\t\t// may have twice as many pixels, we still want lines and other drawing to\n\t\t// appear at the same size; the extra pixels will just make them crisper.\n\n\t\tcontext.scale(pixelRatio, pixelRatio);\n\t};\n\n\t// Clears the entire canvas area, not including any overlaid HTML text\n\n\tCanvas.prototype.clear = function() {\n\t\tthis.context.clearRect(0, 0, this.width, this.height);\n\t};\n\n\t// Finishes rendering the canvas, including managing the text overlay.\n\n\tCanvas.prototype.render = function() {\n\n\t\tvar cache = this._textCache;\n\n\t\t// For each text layer, add elements marked as active that haven't\n\t\t// already been rendered, and remove those that are no longer active.\n\n\t\tfor (var layerKey in cache) {\n\t\t\tif (hasOwnProperty.call(cache, layerKey)) {\n\n\t\t\t\tvar layer = this.getTextLayer(layerKey),\n\t\t\t\t\tlayerCache = cache[layerKey];\n\n\t\t\t\tlayer.hide();\n\n\t\t\t\tfor (var styleKey in layerCache) {\n\t\t\t\t\tif (hasOwnProperty.call(layerCache, styleKey)) {\n\t\t\t\t\t\tvar styleCache = layerCache[styleKey];\n\t\t\t\t\t\tfor (var key in styleCache) {\n\t\t\t\t\t\t\tif (hasOwnProperty.call(styleCache, key)) {\n\n\t\t\t\t\t\t\t\tvar positions = styleCache[key].positions;\n\n\t\t\t\t\t\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\t\t\t\t\t\t\tif (position.active) {\n\t\t\t\t\t\t\t\t\t\tif (!position.rendered) {\n\t\t\t\t\t\t\t\t\t\t\tlayer.append(position.element);\n\t\t\t\t\t\t\t\t\t\t\tposition.rendered = true;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tpositions.splice(i--, 1);\n\t\t\t\t\t\t\t\t\t\tif (position.rendered) {\n\t\t\t\t\t\t\t\t\t\t\tposition.element.detach();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (positions.length == 0) {\n\t\t\t\t\t\t\t\t\tdelete styleCache[key];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlayer.show();\n\t\t\t}\n\t\t}\n\t};\n\n\t// Creates (if necessary) and returns the text overlay container.\n\t//\n\t// @param {string} classes String of space-separated CSS classes used to\n\t//     uniquely identify the text layer.\n\t// @return {object} The jQuery-wrapped text-layer div.\n\n\tCanvas.prototype.getTextLayer = function(classes) {\n\n\t\tvar layer = this.text[classes];\n\n\t\t// Create the text layer if it doesn't exist\n\n\t\tif (layer == null) {\n\n\t\t\t// Create the text layer container, if it doesn't exist\n\n\t\t\tif (this.textContainer == null) {\n\t\t\t\tthis.textContainer = $(\"<div class='flot-text flot-temp-elem'></div>\")\n\t\t\t\t\t.css({\n\t\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t'font-size': \"smaller\",\n\t\t\t\t\t\tcolor: \"#545454\"\n\t\t\t\t\t})\n\t\t\t\t\t.insertAfter(this.element);\n\t\t\t}\n\n\t\t\tlayer = this.text[classes] = $(\"<div></div>\")\n\t\t\t\t.addClass(classes)\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tright: 0\n\t\t\t\t})\n\t\t\t\t.appendTo(this.textContainer);\n\t\t}\n\n\t\treturn layer;\n\t};\n\n\t// Creates (if necessary) and returns a text info object.\n\t//\n\t// The object looks like this:\n\t//\n\t// {\n\t//     width: Width of the text's wrapper div.\n\t//     height: Height of the text's wrapper div.\n\t//     element: The jQuery-wrapped HTML div containing the text.\n\t//     positions: Array of positions at which this text is drawn.\n\t// }\n\t//\n\t// The positions array contains objects that look like this:\n\t//\n\t// {\n\t//     active: Flag indicating whether the text should be visible.\n\t//     rendered: Flag indicating whether the text is currently visible.\n\t//     element: The jQuery-wrapped HTML div containing the text.\n\t//     x: X coordinate at which to draw the text.\n\t//     y: Y coordinate at which to draw the text.\n\t// }\n\t//\n\t// Each position after the first receives a clone of the original element.\n\t//\n\t// The idea is that that the width, height, and general 'identity' of the\n\t// text is constant no matter where it is placed; the placements are a\n\t// secondary property.\n\t//\n\t// Canvas maintains a cache of recently-used text info objects; getTextInfo\n\t// either returns the cached element or creates a new entry.\n\t//\n\t// @param {string} layer A string of space-separated CSS classes uniquely\n\t//     identifying the layer containing this text.\n\t// @param {string} text Text string to retrieve info for.\n\t// @param {(string|object)=} font Either a string of space-separated CSS\n\t//     classes or a font-spec object, defining the text's font and style.\n\t// @param {number=} angle Angle at which to rotate the text, in degrees.\n\t//     Angle is currently unused, it will be implemented in the future.\n\t// @param {number=} width Maximum width of the text before it wraps.\n\t// @return {object} a text info object.\n\n\tCanvas.prototype.getTextInfo = function(layer, text, font, angle, width) {\n\n\t\tvar textStyle, layerCache, styleCache, info;\n\n\t\t// Cast the value to a string, in case we were given a number or such\n\n\t\ttext = \"\" + text;\n\n\t\t// If the font is a font-spec object, generate a CSS font definition\n\n\t\tif (typeof font === \"object\") {\n\t\t\ttextStyle = font.style + \" \" + font.variant + \" \" + font.weight + \" \" + font.size + \"px/\" + font.lineHeight + \"px \" + font.family;\n\t\t} else {\n\t\t\ttextStyle = font;\n\t\t}\n\n\t\t// Retrieve (or create) the cache for the text's layer and styles\n\n\t\tlayerCache = this._textCache[layer];\n\n\t\tif (layerCache == null) {\n\t\t\tlayerCache = this._textCache[layer] = {};\n\t\t}\n\n\t\tstyleCache = layerCache[textStyle];\n\n\t\tif (styleCache == null) {\n\t\t\tstyleCache = layerCache[textStyle] = {};\n\t\t}\n\n\t\tinfo = styleCache[text];\n\n\t\t// If we can't find a matching element in our cache, create a new one\n\n\t\tif (info == null) {\n\n\t\t\tvar element = $(\"<div></div>\").html(text)\n\t\t\t\t.css({\n\t\t\t\t\tposition: \"absolute\",\n\t\t\t\t\t'max-width': width,\n\t\t\t\t\ttop: -9999\n\t\t\t\t})\n\t\t\t\t.appendTo(this.getTextLayer(layer));\n\n\t\t\tif (typeof font === \"object\") {\n\t\t\t\telement.css({\n\t\t\t\t\tfont: textStyle,\n\t\t\t\t\tcolor: font.color\n\t\t\t\t});\n\t\t\t} else if (typeof font === \"string\") {\n\t\t\t\telement.addClass(font);\n\t\t\t}\n\n      info = styleCache[text] = { element: element, positions: [] };\n\n      var size = this._textSizeCache[text];\n\t\t\tif (size) {\n        info.width = size.width;\n        info.height = size.height;\n\t\t\t} else {\n        info.width = element.outerWidth(true);\n        info.height = element.outerHeight(true);\n        this._textSizeCache[text] = { width: info.width, height: info.height };\n\t\t\t}\n\t\t\telement.detach();\n\t\t}\n\n\t\treturn info;\n\t};\n\n\t// Adds a text string to the canvas text overlay.\n\t//\n\t// The text isn't drawn immediately; it is marked as rendering, which will\n\t// result in its addition to the canvas on the next render pass.\n\t//\n\t// @param {string} layer A string of space-separated CSS classes uniquely\n\t//     identifying the layer containing this text.\n\t// @param {number} x X coordinate at which to draw the text.\n\t// @param {number} y Y coordinate at which to draw the text.\n\t// @param {string} text Text string to draw.\n\t// @param {(string|object)=} font Either a string of space-separated CSS\n\t//     classes or a font-spec object, defining the text's font and style.\n\t// @param {number=} angle Angle at which to rotate the text, in degrees.\n\t//     Angle is currently unused, it will be implemented in the future.\n\t// @param {number=} width Maximum width of the text before it wraps.\n\t// @param {string=} halign Horizontal alignment of the text; either \"left\",\n\t//     \"center\" or \"right\".\n\t// @param {string=} valign Vertical alignment of the text; either \"top\",\n\t//     \"middle\" or \"bottom\".\n\n\tCanvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {\n\n\t\tvar info = this.getTextInfo(layer, text, font, angle, width),\n\t\t\tpositions = info.positions;\n\n\t\t// Tweak the div's position to match the text's alignment\n\n\t\tif (halign == \"center\") {\n\t\t\tx -= info.width / 2;\n\t\t} else if (halign == \"right\") {\n\t\t\tx -= info.width;\n\t\t}\n\n\t\tif (valign == \"middle\") {\n\t\t\ty -= info.height / 2;\n\t\t} else if (valign == \"bottom\") {\n\t\t\ty -= info.height;\n\t\t}\n\n\t\t// Determine whether this text already exists at this position.\n\t\t// If so, mark it for inclusion in the next render pass.\n\n\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\tif (position.x == x && position.y == y) {\n\t\t\t\tposition.active = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If the text doesn't exist at this position, create a new entry\n\n\t\t// For the very first position we'll re-use the original element,\n\t\t// while for subsequent ones we'll clone it.\n\n\t\tposition = {\n\t\t\tactive: true,\n\t\t\trendered: false,\n\t\t\telement: positions.length ? info.element.clone() : info.element,\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\n\t\tpositions.push(position);\n\n\t\t// Move the element to its final position within the container\n\n\t\tposition.element.css({\n\t\t\ttop: Math.round(y),\n\t\t\tleft: Math.round(x),\n\t\t\t'text-align': halign\t// In case the text wraps\n\t\t});\n\t};\n\n\t// Removes one or more text strings from the canvas text overlay.\n\t//\n\t// If no parameters are given, all text within the layer is removed.\n\t//\n\t// Note that the text is not immediately removed; it is simply marked as\n\t// inactive, which will result in its removal on the next render pass.\n\t// This avoids the performance penalty for 'clear and redraw' behavior,\n\t// where we potentially get rid of all text on a layer, but will likely\n\t// add back most or all of it later, as when redrawing axes, for example.\n\t//\n\t// @param {string} layer A string of space-separated CSS classes uniquely\n\t//     identifying the layer containing this text.\n\t// @param {number=} x X coordinate of the text.\n\t// @param {number=} y Y coordinate of the text.\n\t// @param {string=} text Text string to remove.\n\t// @param {(string|object)=} font Either a string of space-separated CSS\n\t//     classes or a font-spec object, defining the text's font and style.\n\t// @param {number=} angle Angle at which the text is rotated, in degrees.\n\t//     Angle is currently unused, it will be implemented in the future.\n\n\tCanvas.prototype.removeText = function(layer, x, y, text, font, angle) {\n\t\tif (text == null) {\n\t\t\tvar layerCache = this._textCache[layer];\n\t\t\tif (layerCache != null) {\n\t\t\t\tfor (var styleKey in layerCache) {\n\t\t\t\t\tif (hasOwnProperty.call(layerCache, styleKey)) {\n\t\t\t\t\t\tvar styleCache = layerCache[styleKey];\n\t\t\t\t\t\tfor (var key in styleCache) {\n\t\t\t\t\t\t\tif (hasOwnProperty.call(styleCache, key)) {\n\t\t\t\t\t\t\t\tvar positions = styleCache[key].positions;\n\t\t\t\t\t\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\t\t\t\t\t\t\tposition.active = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar positions = this.getTextInfo(layer, text, font, angle).positions;\n\t\t\tfor (var i = 0, position; position = positions[i]; i++) {\n\t\t\t\tif (position.x == x && position.y == y) {\n\t\t\t\t\tposition.active = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t///////////////////////////////////////////////////////////////////////////\n\t// 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        \tvar width = placeholder.width(),\n        \t\theight = 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            \toptions.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                        \tpoints[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\t\t\t\taxis.tickFormatter = function (value, axis) {\n\n\t\t\t\t\tvar factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;\n\t\t\t\t\tvar formatted = \"\" + Math.round(value * factor) / factor;\n\n\t\t\t\t\t// If tickDecimals was specified, ensure that we have exactly that\n\t\t\t\t\t// much precision; otherwise default to the value's own precision.\n\n\t\t\t\t\tif (axis.tickDecimals != null) {\n\t\t\t\t\t\tvar decimal = formatted.indexOf(\".\");\n\t\t\t\t\t\tvar precision = decimal == -1 ? 0 : formatted.length - decimal - 1;\n\t\t\t\t\t\tif (precision < axis.tickDecimals) {\n\t\t\t\t\t\t\treturn (precision ? formatted : formatted + \".\") + (\"\" + factor).substr(1, axis.tickDecimals - precision);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\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                $(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                \tentries.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 { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),\n                         dataIndex: j,\n                         series: series[i],\n                         seriesIndex: i };\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","(function ($) {\n  \"use strict\";\n\n  var defaultOptions = {\n    tagClass: function(item) {\n      return 'label label-info';\n    },\n    itemValue: function(item) {\n      return item ? item.toString() : item;\n    },\n    itemText: function(item) {\n      return this.itemValue(item);\n    },\n    freeInput: true,\n    maxTags: undefined,\n    confirmKeys: [13],\n    onTagExists: function(item, $tag) {\n      $tag.hide().fadeIn();\n    }\n  };\n\n  /**\n   * Constructor function\n   */\n  function TagsInput(element, options) {\n    this.itemsArray = [];\n\n    this.$element = $(element);\n    this.$element.hide();\n\n    this.widthClass = options.widthClass || 'width-9';\n    this.isSelect = (element.tagName === 'SELECT');\n    this.multiple = (this.isSelect && element.hasAttribute('multiple'));\n    this.objectItems = options && options.itemValue;\n    this.placeholderText = element.hasAttribute('placeholder') ? this.$element.attr('placeholder') : '';\n\n    this.$container = $('<div class=\"bootstrap-tagsinput\"></div>');\n    this.$input = $('<input class=\"gf-form-input ' + this.widthClass + '\" type=\"text\" placeholder=\"' + this.placeholderText + '\"/>').appendTo(this.$container);\n\n    this.$element.after(this.$container);\n\n    this.build(options);\n  }\n\n  TagsInput.prototype = {\n    constructor: TagsInput,\n\n    /**\n     * Adds the given item as a new tag. Pass true to dontPushVal to prevent\n     * updating the elements val()\n     */\n    add: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.options.maxTags && self.itemsArray.length >= self.options.maxTags)\n        return;\n\n      // Ignore falsey values, except false\n      if (item !== false && !item)\n        return;\n\n      // Throw an error when trying to add an object while the itemValue option was not set\n      if (typeof item === \"object\" && !self.objectItems)\n        throw(\"Can't add objects when itemValue option is not set\");\n\n      // Ignore strings only containg whitespace\n      if (item.toString().match(/^\\s*$/))\n        return;\n\n      // If SELECT but not multiple, remove current tag\n      if (self.isSelect && !self.multiple && self.itemsArray.length > 0)\n        self.remove(self.itemsArray[0]);\n\n      if (typeof item === \"string\" && this.$element[0].tagName === 'INPUT') {\n        var items = item.split(',');\n        if (items.length > 1) {\n          for (var i = 0; i < items.length; i++) {\n            this.add(items[i], true);\n          }\n\n          if (!dontPushVal)\n            self.pushVal();\n          return;\n        }\n      }\n\n      var itemValue = self.options.itemValue(item),\n          itemText = self.options.itemText(item),\n          tagClass = self.options.tagClass(item);\n\n      // Ignore items already added\n      var existing = $.grep(self.itemsArray, function(item) { return self.options.itemValue(item) === itemValue; } )[0];\n      if (existing) {\n        // Invoke onTagExists\n        if (self.options.onTagExists) {\n          var $existingTag = $(\".tag\", self.$container).filter(function() { return $(this).data(\"item\") === existing; });\n          self.options.onTagExists(item, $existingTag);\n        }\n        return;\n      }\n\n      // register item in internal array and map\n      self.itemsArray.push(item);\n\n      // add a tag element\n      var $tag = $('<span class=\"tag ' + htmlEncode(tagClass) + '\">' + htmlEncode(itemText) + '<span data-role=\"remove\"></span></span>');\n      $tag.data('item', item);\n      self.findInputWrapper().before($tag);\n      $tag.after(' ');\n\n      // add <option /> if item represents a value not present in one of the <select />'s options\n      if (self.isSelect && !$('option[value=\"' + escape(itemValue) + '\"]',self.$element)[0]) {\n        var $option = $('<option selected>' + htmlEncode(itemText) + '</option>');\n        $option.data('item', item);\n        $option.attr('value', itemValue);\n        self.$element.append($option);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Add class when reached maxTags\n      if (self.options.maxTags === self.itemsArray.length)\n        self.$container.addClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemAdded', { item: item }));\n    },\n\n    /**\n     * Removes the given item. Pass true to dontPushVal to prevent updating the\n     * elements val()\n     */\n    remove: function(item, dontPushVal) {\n      var self = this;\n\n      if (self.objectItems) {\n        if (typeof item === \"object\")\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  self.options.itemValue(item); } )[0];\n        else\n          item = $.grep(self.itemsArray, function(other) { return self.options.itemValue(other) ==  item; } )[0];\n      }\n\n      if (item) {\n        $('.tag', self.$container).filter(function() { return $(this).data('item') === item; }).remove();\n        $('option', self.$element).filter(function() { return $(this).data('item') === item; }).remove();\n        self.itemsArray.splice($.inArray(item, self.itemsArray), 1);\n      }\n\n      if (!dontPushVal)\n        self.pushVal();\n\n      // Remove class when reached maxTags\n      if (self.options.maxTags > self.itemsArray.length)\n        self.$container.removeClass('bootstrap-tagsinput-max');\n\n      self.$element.trigger($.Event('itemRemoved',  { item: item }));\n    },\n\n    /**\n     * Removes all items\n     */\n    removeAll: function() {\n      var self = this;\n\n      $('.tag', self.$container).remove();\n      $('option', self.$element).remove();\n\n      while(self.itemsArray.length > 0)\n        self.itemsArray.pop();\n\n      self.pushVal();\n\n      if (self.options.maxTags && !this.isEnabled())\n        this.enable();\n    },\n\n    /**\n     * Refreshes the tags so they match the text/value of their corresponding\n     * item.\n     */\n    refresh: function() {\n      var self = this;\n      $('.tag', self.$container).each(function() {\n        var $tag = $(this),\n            item = $tag.data('item'),\n            itemValue = self.options.itemValue(item),\n            itemText = self.options.itemText(item),\n            tagClass = self.options.tagClass(item);\n\n          // Update tag's class and inner text\n          $tag.attr('class', null);\n          $tag.addClass('tag ' + htmlEncode(tagClass));\n          $tag.contents().filter(function() {\n            return this.nodeType == 3;\n          })[0].nodeValue = htmlEncode(itemText);\n\n          if (self.isSelect) {\n            var option = $('option', self.$element).filter(function() { return $(this).data('item') === item; });\n            option.attr('value', itemValue);\n          }\n      });\n    },\n\n    /**\n     * Returns the items added as tags\n     */\n    items: function() {\n      return this.itemsArray;\n    },\n\n    /**\n     * Assembly value by retrieving the value of each item, and set it on the\n     * element.\n     */\n    pushVal: function() {\n      var self = this,\n          val = $.map(self.items(), function(item) {\n            return self.options.itemValue(item).toString();\n          });\n\n      self.$element.val(val, true).trigger('change');\n    },\n\n    /**\n     * Initializes the tags input behaviour on the element\n     */\n    build: function(options) {\n      var self = this;\n\n      self.options = $.extend({}, defaultOptions, options);\n      var typeahead = self.options.typeahead || {};\n\n      // When itemValue is set, freeInput should always be false\n      if (self.objectItems)\n        self.options.freeInput = false;\n\n      makeOptionItemFunction(self.options, 'itemValue');\n      makeOptionItemFunction(self.options, 'itemText');\n      makeOptionItemFunction(self.options, 'tagClass');\n\n      // for backwards compatibility, self.options.source is deprecated\n      if (self.options.source)\n        typeahead.source = self.options.source;\n\n      if (typeahead.source && $.fn.typeahead) {\n        makeOptionFunction(typeahead, 'source');\n\n        self.$input.typeahead({\n          source: function (query, process) {\n            function processItems(items) {\n              var texts = [];\n\n              for (var i = 0; i < items.length; i++) {\n                var text = self.options.itemText(items[i]);\n                map[text] = items[i];\n                texts.push(text);\n              }\n              process(texts);\n            }\n\n            this.map = {};\n            var map = this.map,\n                data = typeahead.source(query);\n\n            if ($.isFunction(data.success)) {\n              // support for Angular promises\n              data.success(processItems);\n            } else {\n              // support for functions and jquery promises\n              $.when(data)\n               .then(processItems);\n            }\n          },\n          updater: function (text) {\n            self.add(this.map[text]);\n          },\n          matcher: function (text) {\n            return (text.toLowerCase().indexOf(this.query.trim().toLowerCase()) !== -1);\n          },\n          sorter: function (texts) {\n            return texts.sort();\n          },\n          highlighter: function (text) {\n            var regex = new RegExp( '(' + this.query + ')', 'gi' );\n            return text.replace( regex, \"<strong>$1</strong>\" );\n          }\n        });\n      }\n\n      self.$container.on('click', $.proxy(function(event) {\n        self.$input.focus();\n      }, self));\n\n      self.$container.on('blur', 'input', $.proxy(function(event) {\n        var $input = $(event.target);\n        self.add($input.val());\n        $input.val('');\n        event.preventDefault();\n      }, self));\n\n      self.$container.on('keydown', 'input', $.proxy(function(event) {\n        var $input = $(event.target),\n            $inputWrapper = self.findInputWrapper();\n\n        switch (event.which) {\n          // BACKSPACE\n          case 8:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var prev = $inputWrapper.prev();\n              if (prev) {\n                self.remove(prev.data('item'));\n              }\n            }\n            break;\n\n          // DELETE\n          case 46:\n            if (doGetCaretPosition($input[0]) === 0) {\n              var next = $inputWrapper.next();\n              if (next) {\n                self.remove(next.data('item'));\n              }\n            }\n            break;\n\n          // LEFT ARROW\n          case 37:\n            // Try to move the input before the previous tag\n            var $prevTag = $inputWrapper.prev();\n            if ($input.val().length === 0 && $prevTag[0]) {\n              $prevTag.before($inputWrapper);\n              $input.focus();\n            }\n            break;\n          // RIGHT ARROW\n          case 39:\n            // Try to move the input after the next tag\n            var $nextTag = $inputWrapper.next();\n            if ($input.val().length === 0 && $nextTag[0]) {\n              $nextTag.after($inputWrapper);\n              $input.focus();\n            }\n            break;\n         default:\n            // When key corresponds one of the confirmKeys, add current input\n            // as a new tag\n            if (self.options.freeInput && $.inArray(event.which, self.options.confirmKeys) >= 0) {\n              self.add($input.val());\n              $input.val('');\n              event.preventDefault();\n            }\n        }\n\n        // Reset internal input's size\n        $input.attr('size', Math.max(this.inputSize, $input.val().length));\n      }, self));\n\n      // Remove icon clicked\n      self.$container.on('click', '[data-role=remove]', $.proxy(function(event) {\n        self.remove($(event.target).closest('.tag').data('item'));\n        // Grafana mod, if tags input used in popover the click event will bubble up and hide popover\n        event.stopPropagation();\n      }, self));\n\n      // Only add existing value as tags when using strings as tags\n      if (self.options.itemValue === defaultOptions.itemValue) {\n        if (self.$element[0].tagName === 'INPUT') {\n            self.add(self.$element.val());\n        } else {\n          $('option', self.$element).each(function() {\n            self.add($(this).attr('value'), true);\n          });\n        }\n      }\n    },\n\n    /**\n     * Removes all tagsinput behaviour and unregsiter all event handlers\n     */\n    destroy: function() {\n      var self = this;\n\n      // Unbind events\n      self.$container.off('keypress', 'input');\n      self.$container.off('click', '[role=remove]');\n\n      self.$container.remove();\n      self.$element.removeData('tagsinput');\n      self.$element.show();\n    },\n\n    /**\n     * Sets focus on the tagsinput\n     */\n    focus: function() {\n      this.$input.focus();\n    },\n\n    /**\n     * Returns the internal input element\n     */\n    input: function() {\n      return this.$input;\n    },\n\n    /**\n     * Returns the element which is wrapped around the internal input. This\n     * is normally the $container, but typeahead.js moves the $input element.\n     */\n    findInputWrapper: function() {\n      var elt = this.$input[0],\n          container = this.$container[0];\n      while(elt && elt.parentNode !== container)\n        elt = elt.parentNode;\n\n      return $(elt);\n    }\n  };\n\n  /**\n   * Register JQuery plugin\n   */\n  $.fn.tagsinput = function(arg1, arg2) {\n    var results = [];\n\n    this.each(function() {\n      var tagsinput = $(this).data('tagsinput');\n\n      // Initialize a new tags input\n      if (!tagsinput) {\n        tagsinput = new TagsInput(this, arg1);\n        $(this).data('tagsinput', tagsinput);\n        results.push(tagsinput);\n\n        if (this.tagName === 'SELECT') {\n          $('option', $(this)).attr('selected', 'selected');\n        }\n\n        // Init tags from $(this).val()\n        $(this).val($(this).val());\n      } else {\n        // Invoke function on existing tags input\n        var retVal = tagsinput[arg1](arg2);\n        if (retVal !== undefined)\n          results.push(retVal);\n      }\n    });\n\n    if ( typeof arg1 == 'string') {\n      // Return the results from the invoked function calls\n      return results.length > 1 ? results : results[0];\n    } else {\n      return results;\n    }\n  };\n\n  $.fn.tagsinput.Constructor = TagsInput;\n\n  /**\n   * Most options support both a string or number as well as a function as\n   * option value. This function makes sure that the option with the given\n   * key in the given options is wrapped in a function\n   */\n  function makeOptionItemFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var propertyName = options[key];\n      options[key] = function(item) { return item[propertyName]; };\n    }\n  }\n  function makeOptionFunction(options, key) {\n    if (typeof options[key] !== 'function') {\n      var value = options[key];\n      options[key] = function() { return value; };\n    }\n  }\n  /**\n   * HtmlEncodes the given value\n   */\n  var htmlEncodeContainer = $('<div />');\n  function htmlEncode(value) {\n    if (value) {\n      return htmlEncodeContainer.text(value).html();\n    } else {\n      return '';\n    }\n  }\n\n  /**\n   * Returns the position of the caret in the given input field\n   * http://flightschool.acylt.com/devnotes/caret-position-woes/\n   */\n  function doGetCaretPosition(oField) {\n    var iCaretPos = 0;\n    if (document.selection) {\n      oField.focus ();\n      var oSel = document.selection.createRange();\n      oSel.moveStart ('character', -oField.value.length);\n      iCaretPos = oSel.text.length;\n    } else if (oField.selectionStart || oField.selectionStart == '0') {\n      iCaretPos = oField.selectionStart;\n    }\n    return (iCaretPos);\n  }\n\n  /**\n   * Initialize tagsinput behaviour on inputs and selects which have\n   * data-role=tagsinput\n   */\n  $(function() {\n    $(\"input[data-role=tagsinput], select[multiple][data-role=tagsinput]\").tagsinput();\n  });\n})(window.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","appendRow","row","isString","parse","makeFieldParser","val","set","StreamingFrameAction","PushMode","StreamingDataFrame","opts","wide","Set","number","action","Replace","options","maxLength","maxDelta","alwaysReplace","msg","packetInfo","pushMode","timeFieldIndex","findIndex","labels","niceSchemaFields","slice","a","b","fA","fB","hasSameStructure","schemaFields","len","forEach","sf","isWide","of","ents","labeledTables","vrecs","tableKeys","tables","Map","cols","r","table","c","transpose","label","has","addLabel","dummyTable","join","appended","Append","newData","deltaIdx","concat","nlen","sliceIdx","deltaLookup","low","high","num","arr","lo","hi","mid","bitwise","floor","closestIdx","circPush","state","calcs","labelCount","size","parsedLabels","split","kv","trim","proto","getLastStreamingDataFramePacket","pi","createDimension","columns","getColumnsFromDimension","dimension","getColumnFromDimension","column","getValueFromDimension","getAllValuesFromDimension","getDimensionByName","dimensions","compareDataFrameStructures","skipConfig","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","CircularDataFrame","CircularVector","convertTableToDataFrame","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","Float64Array","isTimeSeries","Boolean","isTimeSerie","anySeriesWithTimeField","defaultTimeZoneResolver","DefaultTimeZone","setTimeZoneResolver","resolver","getTimeZone","timeZone","units","isMathString","substring","roundUp","timezone","fiscalYearStartMonth","isDate","dateTime","time","parseString","mathString","dateTimeForTimeZone","indexOf","ISO_8601","parseDateMath","isValid","date","strippedMathString","replace","charAt","isFiscal","isNaN","parseInt","numFrom","roundToFiscal","endOf","startOf","subtract","fyStartMonth","month","DEFAULT_SYSTEM_DATE_FORMAT","SystemDateFormatsState","second","minute","hour","day","year","update","settings","fullDate","interval","useBrowserLocale","fullDateMS","localTimeFormat","hour12","getTimeFieldUnit","useMsResolution","locale","fallback","missingIntlDateTimeFormatSupport","navigator","languages","dateTimeFormat","Intl","DateTimeFormat","parts","formatToParts","mapping","resolvedOptions","weekday","era","dayPeriod","timeZoneName","part","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","groups","delimiter","group","substr","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","acc","match","abbreviations","addDurationToDate","durationToMilliseconds","now","getTime","isValidDate","dateString","isValidDuration","durationString","isValidGoDuration","timeUnits","setLocale","language","getLocale","getLocaleData","toUtc","input","formatInput","toDuration","dateTimeAsMoment","getWeekdayIndex","wd","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","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","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","mappings","isStringUnit","prefix","color","percent","numeric","anyToNumber","mappingResult","getValueMappingResult","visualization","getColorByName","decimals","scaleResult","noValue","getRawDisplayProcessor","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","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","cache","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","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","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","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","p","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","hasInitialized","renderMarkdown","marked","pedantic","gfm","smartLists","smartypants","xhtml","html","noSanitize","sanitize","textUtil","escapeHtml","hasAnsiCodes","sanitizeUrl","specialChars","escapeStringForRegex","escaped","currentChar","unEscapeStringFromRegex","stringStartsAsRegEx","stringToJsRegex","RegExp","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","rest","offset","FLAGS_REGEXP","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","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","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","renameByRegexTransformer","DataTransformerID","defaultOptions","regex","renamePattern","operator","renameFieldsByRegex","newDisplayName","convertFieldTypeTransformer","conversions","targetField","destinationType","dateFormat","transformer","timeParsed","framesCopy","conversion","convertFieldType","convertFieldTypes","ensureTimeField","numValues","fieldToNumberField","stringValues","fieldToStringField","booleanValues","fieldToBooleanField","iso8601Regex","firstValueTypeIsNumber","timeValues","firstDefined","isISO8601","fieldToTimeField","standardTransformers","noopTransformer","filterFieldsTransformer","filterFieldsByNameTransformer","filterFramesTransformer","filterFramesByRefIdTransformer","filterByValueTransformer","orderFieldsTransformer","organizeFieldsTransformer","reduceTransformer","concatenateTransformer","calculateFieldTransformer","seriesToColumnsTransformer","seriesToRowsTransformer","renameFieldsTransformer","labelsToFieldsTransformer","ensureColumnsTransformer","groupByTransformer","sortByTransformer","mergeTransformer","histogramTransformer","standardTransformersRegistry","getOperator","transformation","mergeMap","before","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","binaryOperators","findFieldValuesWithNameOrConstant","BinaryOperationVector","operation","getBinaryCreator","binary","getNameFromOptions","replaceFields","AsNumberVector","ConstantVector","ConcatenateFrameNameMode","frameNameMode","FieldName","frameNameLabel","dataFrames","concatenateFields","sameLength","Drop","Label","FilterByValueType","FilterByValueMatch","filters","any","matchAll","fieldIndexByName","groupFieldIndexByName","matchers","createFilterValueMatchers","matching","processed","frameLength","noop","fieldName","GroupByOperationID","groupBy","groupByFields","shouldGroupOnField","valuesByGroupKey","groupKey","valuesByField","groupKeys","shouldCalculateField","aggregations","valuesByAggregation","fieldWithValuesForGroup","aggregation","aggregationField","detectFieldType","aggregate","sourceField","histogramBucketSizes","histFilter","histSort","histogramFieldInfo","bucketSize","bucketOffset","combine","hist","buildHistogram","histogramFieldsToFrame","histogramFrameBucketMinFieldName","histogramFrameBucketMaxFieldName","getHistogramFields","bucketMin","bucketMax","counts","allValues","smallestDelta","targetSize","_bucketSize","getBucket","incrRoundDn","incr","histograms","fieldHist","histogram","joinedHists","histIdx","bucketIdx","filterOut","entry","bins","createTheme","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","DataFrameType","VariableOrigin","VariableSuggestionsScope","DashboardCursorSync","DataTopic","AnnotationEventFieldSource","NavSection","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","datasource","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","moveItemImmutably","clone","splice","call","keepTime","timeRangeFrom","timeRangeTo","includeVars","seriesName","valueTime","valueNumeric","valueText","valueRaw","valueCalc","onClickFn","interpolatedQuery","stringifiedQuery","JSON","stringify","query","err","replacedQuery","interpolateQuery","datasourceName","generateInternalHref","datasourceUid","encodeURIComponent","serializeStateToUrlParam","queries","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","parser","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","cleanSelector","getTimeRangeUrlParams","getVariablesUrlParams","grafanaConfig","appSubUrl","stripBaseFromUrl","stripExtraChars","endsWith","isAbsoluteUrl","segmentToStrip","window","location","initialize","dependencies","getTimeRangeForUrl","assureBaseUrl","updateSearchParams","partial","urlSearchParams","URLSearchParams","curURL","URL","searchParams","newSearchParams","urlUtil","params","processUrl","disableSanitizeHtml","getColorForTheme","getColorFromHexRgbOrName","classicColors","objRemoveUndefined","toOption","getSeriesTimeStep","previousTime","returnTimeStep","MAX_VALUE","currentTime","timeStep","hasMsResolution","encodeURIComponentAsAngularJS","pctEncodeSpaces","toUrlParams","rbracket","valueQueryPart","buildParams","tryDecodeURIComponent","decodeURIComponent","renderUrl","appendQueryToUrl","stringToAppend","pos","getUrlSearchParams","searchParamsSegments","search","keyValuePair","parseKeyValue","keyValue","splitPoint","parsedVal","urlState","compact","valueMappings","vm","MappingType","valueAsNumber","SpecialValueMatch","LegacyMappingType","getMappedValue","emptyResult","ValueToText","upgraded","isValueMapping","upgradeOldAngularValueMapping","convertOldAngularValueMappings","migratedThresholds","mappingType","valueMaps","rangeMaps","old","newMappings","RangeToText","unshift","withLoadingIndicator","whileLoading","timer","mapTo","takeUntil","categories","hasBuiltIndex","NEGATIVE_INFINITY","POSITIVE_INFINITY","dec","log","abs","LN10","magn","pow","getDecimalsForValue","formatted","decimalPos","precision","toFixedScaled","ext","toFixedUnit","asPrefix","booleanValueFormatter","scaledUnits","extArray","scaledDecimals","maximumFractionDigits","simpleCountUnit","symbol","scaler","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","transform","predicate","vector","FormattedVector","formatter","IndexVector","Components","TimePicker","openButton","fromField","toField","applyTimeRange","calendar","closeButton","absoluteTimeRangeTitle","DataSource","TestData","QueryTab","scenarioSelectContainer","scenarioSelect","noise","seriesCount","spread","startValue","Jaeger","traceIDInput","Prometheus","configPage","exemplarsAddButton","internalLinkSwitch","exemplarMarker","Menu","MenuComponent","MenuGroup","MenuItem","SubMenu","container","icon","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","addQuery","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","ValuePicker","Search","sectionV2","items","itemsV2","collapseFolder","sectionId","expandFolder","dashboardItem","dashboardItems","DashboardLinks","dropDown","LoadingIndicator","CallToActionCard","buttonV2","DataLinksContextMenu","singleLink","CodeEditor","DashboardImportPage","textarea","submit","ImportDashboardForm","PanelAlertTabContent","VisualizationPreview","selectors","pages","Login","username","password","skip","Home","readOnly","saveAndTest","DataSources","dataSources","dataSourceName","AddDataSource","dataSourcePlugins","ConfirmModal","AddDashboard","addNewPanel","addNewRow","addNewPanelLibrary","Dashboard","DashNav","nav","navV2","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","generalTypeSelect","generalLabelInput","generalHideSelect","selectionOptionsMultiSwitch","selectionOptionsIncludeAllSwitch","selectionOptionsCustomAllInput","previewOfValuesOption","submitButton","QueryVariable","queryOptionsDataSourceSelect","queryOptionsRefreshSelect","queryOptionsRegExInput","queryOptionsSortSelect","queryOptionsQueryInput","valueGroupsTagsEnabledSwitch","valueGroupsTagsTagsQueryInput","valueGroupsTagsTagsValuesQueryInput","ConstantVariable","constantOptionsQueryInput","TextBoxVariable","textBoxOptionsQueryInput","Dashboards","dashboards","SaveDashboardAsModal","save","SaveDashboardModal","saveVariables","saveTimerange","SharePanelModal","linkToRenderedImage","Explore","graph","scrollBar","SoloPanel","PluginsList","listItem","signatureErrorNotice","PluginPage","signatureInfo","disabledInfo","PlaylistForm","itemRow","itemIdType","itemTagType","itemMoveUp","itemMoveDown","itemDelete","PanelDataErrorView","setPanelDataErrorView","renderer","PanelRenderer","setPanelRenderer","GrafanaBootConfig","accesscontrol","trimDefaults","tempoServiceGraph","tempoSearch","tempoBackendSearch","recordedQueries","newNavigation","fullRangeLogsVolume","enabled","dsn","customEndpoint","sampleRate","managedIdentityEnabled","bootData","user","lightTheme","theme2","v1","datasources","windowTitlePrefix","panels","newPanelTitle","playlist_timespan","unsaved_changes_warning","appUrl","buildInfo","version","commit","env","isEnterprise","viewersCanEdit","editorsCanAdmin","dateFormats","grafanaBootData","navTree","MetaAnalyticsEventName","isPageviewEvent","isInteractionEvent","interactionName","SystemJS","System","loadPluginCss","import","reportMetaAnalytics","getEchoSrv","addEvent","EchoEventType","reportPageview","locationService","pathname","hash","reportInteraction","logInfo","contexts","captureMessage","logWarning","logDebug","logError","captureException","factory","setQueryRunnerFactory","instance","createQueryRunner","PureComponent","getDataSourceSrv","actionMeta","onClear","dsSettings","dataSourceSrv","getInstanceSettings","setState","getCurrentValue","hideTextValue","noDefault","imgUrl","logos","small","hideText","getDataSourceOptions","alerting","tracing","metrics","mixed","dashboard","pluginId","isDefault","autoFocus","onBlur","openMenuOnFocus","width","isClearable","inputId","menuShouldPortal","className","isMulti","backspaceRemovesValue","maxMenuHeight","noOptionsMessage","getOptionLabel","o","HorizontalGroup","align","justify","PluginSignatureBadge","status","singletonInstance","setEchoSrv","registerEchoBackend","backend","addBackend","setDataSourceSrv","setBackendSrv","getBackendSrv","setAngularLoader","getAngularLoader","setLocationSrv","getLocationSrv","setTemplateSrv","getTemplateSrv","singleton","setLegacyAngularInjector","getLegacyAngularInjector","setGrafanaLiveSrv","getGrafanaLiveSrv","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","ExpressionDatasourceRef","freeze","isExpressionReference","HealthCheckError","details","HealthStatus","DataSourceWithBackend","standardStreamOptionsProvider","request","maxDataPoints","requestId","targets","filterQuery","q","datasourceId","rawRef","applyTemplateVariables","fetch","method","switchMap","rsp","toDataQueryResponse","channel","req","live","staticdata","streams","getDataStream","toStreamingDataResponse","streamOptionsProvider","catchError","interpolateVariablesInQueries","post","showErrorAlert","then","catch","callHealthCheck","OK","rangeRaw","LoadingState","refIDs","dr","js","df","toDataQueryError","toTestingStatus","queryResponse","frameToMetricFindValue","AxisPlacement","VisibilityMode","GraphDrawStyle","LineInterpolation","ScaleDistribution","GraphGradientMode","StackingMode","BarAlignment","ScaleOrientation","ScaleDirection","GraphTresholdsStyleMode","LegendDisplayMode","BigValueColorMode","BigValueGraphMode","BigValueJustifyMode","BigValueTextMode","TableCellDisplayMode","TooltipDisplayMode","BarGaugeDisplayMode","Auto","getIconFromSeverity","React","onRemove","children","buttonContent","elevated","bottomSpacing","restProps","useTheme2","styles","getStyles","cx","role","buttonWrapper","variant","shape","css","shadows","typography","preparePlotFrame","yFieldConfig","defaultConfig","drawStyle","showPoints","axisPlacement","Sparkline","alignedDataFrame","preparePlotData","configBuilder","prepareConfig","componentDidUpdate","prevProps","rebuildConfig","isEqual","getYRange","UPlotConfigBuilder","setCursor","show","addScale","scaleKey","orientation","direction","isTime","addAxis","placement","customConfig","seriesColor","colorMode","pointsMode","addSeries","pxAlign","lineColor","lineWidth","lineInterpolation","pointSize","fillOpacity","fillColor","LINE_HEIGHT","BigValueLayout","valueColor","panelPadding","textValues","alignmentFactors","textMode","titleToAlignTo","valueToAlignTo","Value","Name","None","ValueAndName","getTextValues","justifyCenter","justifyMode","Center","shouldJustifyCenter","titleFontSize","valueFontSize","chartHeight","chartWidth","maxTextWidth","maxTextHeight","titleSize","valueSize","getTitleStyles","Background","getTextColorForBackground","getValueStyles","position","textAlign","getValueAndTitleContainerStyles","alignItems","justifyContent","flexGrow","getPanelStyles","panelStyles","padding","themeFactor","isDark","bgColor2","spin","toRgbString","bgColor3","flexDirection","renderChart","brighten","setAlpha","style","getChartStyles","bottom","WideNoChartLayout","valueWidthPercent","calculateFontSize","WideWithChartLayout","StackedWithChartLayout","titleHeight","StackedWithNoChartLayout","BigValue","layout","buildLayout","valueAndTitleContainerStyles","valueStyles","titleStyles","FormattedValueDisplay","Button","fullWidth","otherProps","getButtonStyles","iconOnly","deprecatedPropWarning","LinkButton","linkButtonStyles","tabIndex","getPropertiesForButtonSize","variantStyles","getPropertiesForVariant","disabledStyles","cursor","boxShadow","pointerEvents","transition","getPropertiesForDisabled","focusStyle","getFocusStyles","paddingMinusBorder","verticalAlign","getMouseFocusStyles","img","marginRight","marginLeft","getButtonVariantStyles","transitions","colorManipulator","borderColor","outline","textDecoration","buttonFill","ButtonGroup","forwardRef","useStyles2","ToolbarButton","imgSrc","imgAlt","isOpen","narrow","ariaLabel","buttonStyles","buttonFullWidth","contentStyles","contentWithIcon","contentWithRightIcon","getButtonAriaLabel","renderIcon","alt","Icon","Tooltip","primaryVariant","destructiveVariant","orangeDark","destructive","styleMixins","breakpoints","ToolbarButtonRow","disableDivFocus","Cascader","optionPath","selectOptions","cpy","flattenOptions","singleLabel","separator","memoizeOne","selectedOptions","rcValue","focusCascade","activeLabel","displayAllSelectedLevels","onSelect","valueArray","isSearching","searchableOptions","getSearchableOptions","setInitialValue","initialValue","initValue","allowCustomValue","changeOnSelect","onCreateOption","formatCreateLabel","onChangeCascader","fieldNames","expandIcon","popupClassName","I","onBlurCascade","onKeyDown","onInputKeyDown","marginBottom","onChanged","fromRCOptions","onLoadDataCascader","onLoadData","fromRCOption","ClickOutsideWrapper","createRef","hasEventListener","domNode","myRef","contains","addEventListener","onOutsideClick","useCapture","includeButtonPress","componentWillUnmount","removeEventListener","colorPickerFactory","popover","Component","onColorChange","popoverElement","hideAfter","showPopper","hidePopper","popperProps","pickerTriggerRef","referenceElement","wrapperClassName","colorPicker","onMouseLeave","onMouseEnter","showColorPicker","hideColorPicker","ColorPicker","withTheme2","ColorPickerPopover","SeriesColorPicker","SeriesColorPickerPopover","stylesFactory","selectedColor","onColorSelect","primaryShade","ColorSwatch","isSelected","ColorSwatchVariant","upperFirst","marginTop","NamedColorsPalette","swatches","gridTemplateColumns","gridRowGap","gridColumnGap","ColorInput","newColor","updateColor","previousColor","debounce","Input","addonBefore","ColorPreview","getColorPreviewStyles","radius","colorInput","currentColor","setColor","useState","useThrottleFn","rgbaString","useMemo","UnThemedColorPickerPopover","tabName","activePicker","enableNamedColors","changeHandler","handleChange","renderCustomPicker","tabKey","customPickers","tabComponent","getTabClassName","onTabChange","componentName","warnAboutColorPickerPropsDeprecation","colorPickerPopover","colorPickerPopoverTabs","renderCustomPickerTabs","colorPickerPopoverContent","renderPicker","Small","tc","hasLabel","swatchSize","swatchStyles","useStyles","yaxis","onToggleAxis","colorPickerProps","colorPickerAxisSwitch","labelClass","colorPickerAxisSwitchLabel","SeriesColorPickerPopoverWithTheme","CustomScrollbar","autoHide","autoHideTimeout","setScrollTop","autoHeightMin","autoHeightMax","hideTracksWhenNotNeeded","hideHorizontalTrack","hideVerticalTrack","scrollRefCallback","updateAfterMountMs","scrollTop","useRef","useEffect","renderTrack","hideTrack","passedProps","isNil","setTimeout","scrollbar","renderTrackHorizontal","useCallback","renderTrackVertical","renderThumbHorizontal","renderThumbVertical","renderView","onScrollStop","getValues","classNames","customScrollbar","autoHeight","activeItem","itemValue","DataLinkSuggestions","suggestions","useClickAway","onClose","groupedSuggestions","indexOffset","DataLinkSuggestionsList","capitalize","activeIndex","activeIndexOffset","onSuggestionSelect","activeRef","selectedRef","renderItem","isActive","documentation","SelectionReference","getBoundingClientRect","selection","getSelection","node","anchorNode","parentElement","top","clientWidth","clientHeight","plugins","SlatePrism","onlyIn","getSyntax","Prism","builtInVariable","getInputStyles","suggestionsWrapper","wrapperOverrides","DataLinkInput","memo","editorRef","showingSuggestions","setShowingSuggestions","suggestionsIndex","setSuggestionsIndex","linkUrl","setLinkUrl","makeValue","prevLinkUrl","usePrevious","stateRef","activeIndexPosition","getElementPosition","suggestionElement","selectionRef","keyCode","ctrlKey","preventDefault","onVariableSelect","modulo","isFocused","Plain","onUrlChange","includeDollarSign","insertText","modifiers","rootBoundary","SCHEMA","_editor","DataLinksListItem","onEdit","getDataLinkListItemStyles","hasTitle","hasUrl","notConfigured","IconButton","infoText","DataLinkEditor","Field","Switch","DataLinkEditorModalContent","getSuggestions","onSave","onCancel","dirtyLink","setDirtyLink","Modal","DataLinksInlineEditor","editIndex","setEditIndex","isNew","setIsNew","getDataLinksInlineEditorStyles","linksSafe","isEditing","onDataLinkChange","onDataLinkCancel","onDataLinkRemove","closeOnBackdropClick","onDismiss","htmlProps","hasPrefix","hasSuffix","suffixStyle","reductionFactor","fontSizeReductionFactor","getFieldStyles","fieldHorizontal","fieldValidationWrapper","fieldValidationWrapperHorizontal","validationMessageHorizontalOverflow","horizontal","loading","required","htmlFor","getChildId","labelElement","getFieldValidationMessageStyles","baseStyle","vertical","fieldValidationMessageIcon","FieldValidationMessage","cssName","getLabelStyles","labelContent","chevron","labelProps","LegacyInputStatus","validationRules","errors","validationEvents","inputElementProps","EventsWithValidation","eventName","hasValidationEvent","async","persist","validatorAsync","Invalid","Valid","isInvalid","hideErrorMessage","inputRef","inputClassName","populateEventPropsWithStatus","IndicatorsContainer","selectProps","menuIsOpen","NoOptionsMessage","SelectOption","getOptionValue","isDisabled","isLoading","isSearchable","tooltipContent","tabSelectsValue","onCloseMenu","onOpenMenu","widthClass","SelectComponent","ReactSelect","creatableOptions","Creatable","selectClassNames","selectComponents","defaultProps","WrapInTooltip","onOpenMenuInternal","onCloseMenuInternal","captureMenuScroll","classNamePrefix","menuShouldScrollIntoView","resetSelectStyles","onMenuOpen","onMenuClose","Option","SingleValue","MenuList","Group","SelectOptionGroup","AsyncSelect","loadOptions","loadingMessage","isOpenInternal","showTooltip","uniqueId","stopPropagation","switchClass","tooltipPlacement","labelId","labelClassName","switchClassName","internalOnChange","RadioButton","getRadioButtonStyles","radio","radioLabel","textColor","textColorHover","labelHeight","RadioButtonGroup","disabledOptions","handleOnChange","groupName","activeButtonRef","radioGroup","isItemDisabled","flexWrap","getFocusStyle","focusCss","sharedInputStyle","borderColorHover","borderHover","autoFillBorder","inputPadding","inputSizes","inputSizesPixels","auto","FIXED_UNIT","GraphNG","Subscription","prepState","plotInstance","withConfig","alignedFrame","defaultPreparePlotFrame","pluginLog","prepConfig","getTimeRange","alignedData","prepData","handleCursorUpdate","u","valToPos","findMidPointYPosition","posToIdx","panelContext","subscription","throttleTime","structureRev","propsToDiff","propsChanged","nextProps","propName","sameProps","newState","unsubscribe","renderLegend","legend","vizWidth","vizHeight","plotRef","PanelContextRoot","nullToUndefThreshold","refValues","fieldValues","maxThreshold","prevRef","nullIdx","dimFields","outerJoinDataFrames","joinBy","keep","keepOriginIndices","refField","spanNulls","applySpanNullsThresholds","buildScaleKey","defaultPart","scaleRange","scaleSoftRange","axisSoftMin","axisSoftMax","scalePlacement","scaleUnit","scaleDistribution","getScaleDistributionPart","axisLabel","cacheInitialized","iconRoot","cacheItem","cacheStore","queue","alwaysMonoIcons","getIconStyles","xxs","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","initIconCache","svgSize","getSvgSize","svgHgt","svgWid","subDir","getIconSubDir","svgPath","iconName","iconType","pixelSize","hoverSize","iconColor","addonAfter","prefixRef","prefixRect","useMeasure","suffixRef","suffixRect","addon","inputWrapper","paddingLeft","paddingRight","loadingIndicator","inline","prefixSuffixStaticWidth","prefixSuffix","inputDisabled","Orientation","Layout","Horizontal","wrap","child","childWrapper","VerticalGroup","Vertical","Container","margin","grow","shrink","getContainerStyles","finalSpacing","marginCompensation","paddingSize","marginSize","inlineList","AbstractList","getItemKey","LogMessageAnsi","prevValue","ansicolor","accumulated","character","chunkText","highlight","findChunks","highlightClassName","getLogRowContextStyles","wrapLogMessage","afterContext","beforeContext","commonStyles","bg1","dropdownShadow","bg2","logs","LogRowContextGroupHeader","onLoadMoreContext","canLoadMoreRows","LogRowContextGroup","shouldScrollToBottom","listContainerRef","useLayoutEffect","offsetHeight","headerProps","LogRowContext","hasMoreContextRows","handleEscKeyDown","document","MAX_CHARACTERS","renderLogMessage","hasAnsi","highlights","needsHighlighter","restructureLog","prettifyLogMessage","UnThemedLogRowMessage","onToggleContext","updateLimit","contextIsOpen","getLogRowStyles","logLevel","restructuredEntry","logsRowMatchHighLight","outlineColor","positionRelative","rowWithContext","horizontalScroll","contextNewline","logsRowMessage","onContextToggle","LogRowMessage","logColor","isLight","gray5","gray2","hoverBgColor","logsRowMatchHighLightPreview","logsRowsTable","logsRow","logsRowDuplicates","logsRowLevel","logIconError","logsRowToggleDetails","logsRowLocalTime","logsRowLabels","logDetailsContainer","logDetailsTable","logsDetailsIcon","gray3","logDetailsLabel","logDetailsHeading","logDetailsValue","FieldNamePicker","useFieldDisplayNames","useSelectOptions","onSelectChange","frameHasName","selectedOption","placeholderText","noFieldsMessage","getFrameFieldsDisplayNames","displayNames","currentName","firstItem","fieldType","found","getFieldTypeIcon","closeOnEscape","contentClassName","propsOnDismiss","onClickBackdrop","trapFocus","getModalStyles","onEscKey","ev","headerClass","modalHeader","modalHeaderWithTabs","contain","restoreFocus","DefaultModalHeader","modalHeaderClose","surface","modalContent","iconTooltip","ButtonRow","leftItems","modalButtonRow","ModalHeader","modalHeaderTitle","overlay","modalHeaderIcon","ColorValueEditor","spot","formInputHeight","colorText","trashIcon","clickable","PanelContextProvider","Provider","usePanelContext","Portal","portalRoot","forwardedRef","createElement","appendChild","removeChild","ReactDOM","DropdownIndicator","SelectMenu","maxHeight","innerRef","innerProps","getSelectStyles","menu","SelectMenuOptions","renderOptionLabel","optionFocused","optionSelected","optionDisabled","optionIcon","optionImage","optionBody","optionDescription","UnthemedValueContainer","maxVisibleValues","showAllSelectedWhenOpen","valueChildren","otherChildren","truncatedValues","renderContainer","valueContainer","valueContainerMulti","ValueContainer","getInputControlStyles","focused","withPrefix","InputControl","MultiValueContainer","multiValueContainer","MultiValueRemove","multiValueRemove","findSelectedValue","CustomControl","renderControl","SelectBase","allowCreateWhileLoading","cacheOptions","closeMenuOnSelect","filterOption","inputValue","isOptionDisabled","minMenuHeight","menuPlacement","menuPosition","onInputChange","isValidNewOption","reactSelectRef","closeToBottom","setCloseToBottom","controlRef","distance","innerHeight","onChangeWithEmpty","ReactSelectComponent","creatableProps","selectedValue","asyncSelectProps","hasValue","filtered","cleanValue","commonSelectProps","menuShouldBlockScroll","menuPortalTarget","AsyncCreatable","ReactAsyncSelect","Placeholder","selectedValuesCount","indicatorChildren","renderExtraValuesIndicator","IndicatorSeparator","Control","ClearIndicator","clearValue","singleValueRemove","onMouseDown","Spinner","LoadingMessage","SelectContainer","menuPortal","minWidth","provided","opacity","MultiSelect","AsyncMultiSelect","getSelectContainerStyles","getSelectOptionGroupStyles","textStrong","UnthemedSelectOptionGroup","expanded","some","onToggleChildren","withTheme","delayedValue","setDelayedValue","onStartTime","timeout","timeSpent","turnOff","clearTimeout","useDelayedSwitch","FadeWithImage","SlideOutTransition","visible","FadeTransition","clearIndicator","control","dropdownIndicator","groupHeading","indicatorsContainer","indicatorSeparator","menuList","multiValue","multiValueLabel","iconClassName","StatsPicker","allowMultiple","defaultStat","notFound","difference","checkInput","onSelectionChange","inputProps","getSwitchStyles","switchIdRef","switch","InlineSwitch","showLabel","inlineContainer","inlineLabel","inlineLabelEnabled","FILTER_FOR_OPERATOR","FILTER_OUT_OPERATOR","counter","Counter","onChangeTab","tabsStyles","getTabStyles","linkClass","activeStyle","notActive","gradients","defaultTransitionStyles","transitionProperty","transitionDuration","transitionTimingFunction","transitionStyles","exited","entering","entered","transitionDelay","exiting","Popover","renderArrow","in","mountOnEnter","unmountOnExit","transitionState","scroll","resize","arrowProps","updatePopperPosition","PopoverController","hideTimeout","controllerProps","tooltipTriggerRef","popperBackgroundClassName","payloadProps","PartialHighlighter","highlightParts","indices","getStartIndices","highlighted","UnitPicker","groupOptions","sel","isFullWidth","isPicking","setIsPicking","VizLayout","containerStyle","legendRef","legendMeasure","maxWidth","legendStyle","UnThemedConfirmButton","showConfirm","confirmButtonRef","mainButtonRef","onConfirm","closeOnConfirm","confirmText","confirmVariant","confirmButtonVariant","buttonClass","buttonHide","buttonShow","buttonDisabled","confirmButtonClass","confirmButton","confirmButtonShow","confirmButtonHide","onClickButton","buttonContainer","onClickCancel","ConfirmButton","DeleteButton","tabContent","tabs","TabbedContainer","activeTab","setActiveTab","defaultTab","closeIconTooltip","TabsBar","TabContent","ClipboardButton","elem","getText","onClipboardCopy","onClipboardError","clipboard","Clipboard","destroy","buttonProps","setRef","popup","icons","ButtonCascader","loadData","LoadingPlaceholder","EmptySearchResult","useMenuFocus","localRef","isMenuOpen","openedWithArrow","setOpenedWithArrow","onOpen","focusedItem","setFocusedItem","menuItems","querySelectorAll","menuItem","useEffectOnce","firstMenuItem","querySelector","menuItemsCount","click","useImperativeHandle","handleKeys","handleFocus","onFocus","iconWrapper","subMenu","itemsWrapper","element","wrapperPos","innerWidth","getPosition","ariaChecked","childItems","setIsActive","isSubMenuOpen","setIsSubMenuOpen","hasSubMenu","Wrapper","itemStyle","rel","metaKey","shiftKey","ButtonSelectComponent","setIsOpen","menuWrapper","onChangeInternal","ButtonSelect","defaultIntervals","onIntervalChanged","getVariant","isLive","onRefresh","intervals","noIntervalPicker","currentValue","formatDuration","offOption","intervalsToOptions","onChangeSelect","refreshInterval","liveOption","mapOptionToTimeRange","rangeUtil","getStyle","weight","semibold","formLabel","TimePickerTitle","Header","getHeaderStyles","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","isReversed","backdrop","TimePickerCalendar","isFullscreen","overlayProps","useOverlay","isDismissable","ERROR_MESSAGES","TimeRangeForm","onApplyFromProps","fromValue","toValue","valueToState","setFrom","setTo","setOpen","fiscalYear","fyTooltip","fieldContainer","rawFrom","rawTo","valueAsString","fromInvalid","toInvalid","rangeInvalid","isSame","isBefore","isRangeInvalid","TimeRangeOption","uuidv4","getOptionsStyles","TimeRangeList","placeholderEmpty","Options","keyForOption","TimeZoneTitle","regular","TimeZoneDescription","useDescription","country","textWeak","TimeZoneOffset","formatUtcOffset","textBase","offsetClassName","WideTimeZoneOption","containerStyles","containerFocused","leftColumn","wideRow","spacer","rightColumn","CompactTimeZoneOption","TimeZoneGroup","border1","groupedTimeZones","useTimeZones","useSelectedTimeZone","filterBySearchIndex","useFilterBySearchIndex","TimeZoneOption","onChangeTz","selectable","searchIndex","getSearchIndex","toLower","isInternal","searchQuery","quickOptions","monthOptions","TimePickerFooter","onChangeTimeZone","onChangeFiscalYearStartMonth","setEditing","editMode","setEditMode","onToggleChangeTimeSettings","timeZoneContainer","editContainer","timeSettingContainer","fiscalYearField","hideQuickRanges","isContainerTall","leftSide","rightSide","timeRangeFilter","getNarrowScreenStyles","expandButton","form","getFullScreenStyles","recent","getEmptyListStyles","TimePickerContentWithScreenSize","showHistory","hideTimeZone","isHistoryEmpty","historyOptions","ranges","mapRangeToTimeOption","mapToHistoryOptions","timeOption","useTimeOption","searchTerm","setSearchQuery","filteredQuickOptions","FilterInput","NarrowScreenForm","FullScreenForm","TimePickerContent","useMedia","isAbsolute","collapsedFlag","setCollapsedFlag","collapsed","EmptyRecentList","ZoomOutTooltip","TimePickerTooltip","TimePickerButtonLabel","formattedRange","adjustedTimeRange","TimeRangePicker","onMoveBackward","onMoveForward","onZoom","timeSyncButton","isSynced","hasAbsolute","TimeOfDayPicker","minuteStep","showHour","showSeconds","picker","allowEmpty","showSecond","inputIcon","Caret","wrapperStyle","caretWrapper","bgColor","formInputBg","menuShadowColor","optionBgHover","dropdownOptionHoverBg","formInputBorder","formInputBgDisabled","formInputDisabledText","weekStarts","onChangeWeekStart","DatePicker","DatePickerWithInput","closeOnSelect","open","autoComplete","DateTimePicker","maxDate","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","condensePages","getListItem","pageButtons","pagesToRender","pageIndex","upperBoundIndex","differenceOfBounds","currentPageIsBetweenBounds","ellipsis","Tag","colorIndex","getTagStyles","getTagColor","gray98","TagList","FilterPill","confirmationText","dismissText","alternativeText","onAlternative","setDisabled","buttonRef","modalText","modalDescription","modalConfirmationInput","localeCompare","paddingTop","runQuery","documentChanged","onRichValueChange","textChanged","runOnChangeAndRunQuery","runOnChangeDebounced","cleanText","onRunQuery","lastExecutedValue","runOnChange","runOnRunQuery","onTypeahead","portalOrigin","onWillApplySuggestion","SuggestionsPlugin","RunnerPlugin","NewlinePlugin","ClearPlugin","SelectionShortcutsPlugin","IndentationPlugin","ClipboardPlugin","additionalPlugins","typeaheadContext","typeaheadPrefix","typeaheadText","syntax","mounted","syntaxLoaded","deleteBackward","classnames","autoCorrect","handleBlur","change","spellCheck","ReactMonacoEditorLazy","dependency","importStatement","useAsync","useAsyncDependency","ErrorWithStack","errorInfo","componentStack","stack","ReactMonacoEditor","CodeEditorSuggestionItemKind","getCompletionItems","monaco","suggestion","kind","mapKinds","sug","Method","CompletionItemKind","Property","Constant","registerSuggestions","registerCompletionItemProvider","triggerCharacters","provideCompletionItems","model","startLineNumber","lineNumber","endLineNumber","startColumn","endColumn","triggerCharacter","currentLine","getValueInRange","ch","findInsertIndex","UnthemedCodeEditor","customLanguage","Promise","resolve","getEditorValue","onBeforeEditorMount","completionCancel","onEditorDidMount","addCommand","KeyMod","CtrlCmd","KeyCode","KEY_S","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","getTabsBarStyles","hideBorder","tabsWrapper","ModalTabsHeader","ModalTabContent","ModalsContext","showModal","hideModal","ModalsProvider","ModalRoot","Consumer","ModalsController","pageIcon","onGoBack","titleHref","parentHref","mainStyle","toolbar","navElement","Link","titleText","parentLink","titleLink","parentIcon","titleDivider","h1Styles","leftActionItem","actionWrapper","titleWrapper","SetInterval","propsSubject","Subject","NEVER","tap","func","FilterActions","cell","tableStyles","onCellFilterAdded","onFilterFor","onFilterOut","filterWrapper","filterItem","DefaultCell","cellProps","cellStyle","displayMode","buildCellContainerStyle","cellContainer","getCellStyle","showFilters","getCellLinks","cellText","cellLink","TITLE_LINE_HEIGHT","wrapperStyles","overflow","titleDim","calculateTitleDimensions","whiteSpace","textOverflow","alignSelf","isVertical","renderBarAndValue","renderRetroBars","renderBasicAndGradientBars","showUnfilled","valueWidth","valueHeight","maxBarHeight","maxBarWidth","calculateBarAndValueDimensions","minValue","maxValue","valuePercent","getValuePercent","getValueColor","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","backgroundColor","maxTitleHeightRatio","textSize","measureText","textWidth","valueString","fontSizeToMeasureWith","realValueWidth","VALUE_LEFT_PADDING","positionValue","cssDirection","gradient","lastpos","thresholdValue","scheme","formattedValueString","Gradient","defaultScale","BarGaugeCell","barGaugeMode","Lcd","Basic","cellHeightInner","isObject","getObjectName","object","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","toggleOpen","appendChildren","removeChildren","openAtDepth","depth","remove","isNumberArray","renderArray","arrayWrapperSpan","skipChildren","skipRoot","togglerLink","togglerIcon","objectWrapperSpan","setAttribute","valuePreview","animated","addAChild","childrenElement","childrenRemoved","removeAChild","innerHTML","JSONFormatter","onDidRender","wrapperEl","wrapperRef","hasChildNodes","replaceChild","lastChild","renderJson","JSONViewCell","txt","JSONTooltip","ImageCell","imageCell","imageCellLink","getTableStyles","headerBg","resizerColor","cellHeight","cellPadding","rowHoverBg","lastChildExtraPadding","getScrollbarWidth","rowHeight","thead","tfoot","headerCell","headerCellLabel","headerFilter","resizeHandle","typeIcon","noData","EmptyCell","FooterRow","totalColumnsWidth","footerGroups","e2eSelectorsTable","footerGroup","getFooterGroupProps","footerGroupProps","headers","footerProps","getHeaderProps","renderFooterCell","getFooterValue","footerValues","FooterCell","getTextAlign","getCellComponent","filterByValue","filterValues","rowToFieldValue","fieldValue","sortOptions","sortCaseInsensitive","sensitivity","sortNumber","rowA","rowB","TableCell","columnIndex","columnCount","getCellProps","FilterList","caseSensitive","searchFilter","setSearchFilter","gutter","ITEM_HEIGHT","onCheckedChanged","newValues","itemCount","itemSize","filterList","isChecked","filterListRow","Checkbox","FilterPopup","preFilteredRows","filterValue","setFilter","uniqueValues","calculateUniqueFieldValues","valuesToOptions","unique","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","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","sortTypes","getTableProps","prepareRow","useTable","useFilters","useSortBy","useAbsoluteLayout","useResizeColumns","RenderRow","getRowProps","listHeight","TextArea","getTextAreaStyle","UnThemedTableInputCSV","onSeriesParsed","tableInputCsv","onTextChange","TableInputCSV","online","getTabContentStyle","Gauge","autoProps","calculateGaugeAutoProps","gaugeHeight","canvasElement","draw","getFormattedThresholds","isPercent","prev","showThresholdLabels","showThresholdMarkers","gaugeWidthReduceRatio","gaugeWidth","thresholdMarkersWidth","thresholdLabelFontSize","gauges","gauge","shadow","thresholdWidth","vMargin","font","family","sansSerif","plotSeries","$","renderVisualization","availableHeight","VizTooltipContainer","positionX","positionY","offsetX","offsetY","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","calculateTooltipPosition","getTooltipContainerStyles","VizTooltip","SeriesIcon","cssColor","getSeriesTableRowStyles","seriesTable","seriesTableRow","seriesTableCell","activeSeries","SeriesTableRow","SeriesTable","SingleModeGraphTooltip","activeDimensions","yAxis","processedTime","findHoverIndexFromData","xAxisDimension","middle","lower","upper","xPosition","graphTickFormatter","epoch","axis","timeformat","graphTimeFormat","ticks","secPerTick","oneDay","oneYear","MultiModeGraphTooltip","activeSeriesIndex","hoverInfo","yAxisDimensions","xAxisDimensions","xAxisPosition","hoverIndex","hoverDistance","pointTime","minDistance","minTime","datapointIndex","getMultiSeriesGraphHoverInfo","GraphTooltip","ContextMenu","renderMenuItems","renderHeader","menuRef","positionStyles","setPositionStyles","menuElement","rect","OFFSET","collisions","labelID","groupLabel","GraphContextMenu","getContextMenuSource","itemsGroup","contextDimensions","itemsToRender","valueFromDimensions","formattedValue","datapoint","GraphContextMenuHeader","isTooltipVisible","isContextVisible","onHorizontalRegionSelected","xaxis","contextPos","contextItem","tooltipElement","tooltipElementProps","tooltipMode","tooltipContentRenderer","tooltipComponent","dataIndex","tooltipContentProps","pageX","pageY","contextContentProps","$element","onPlotSelected","onPlotHover","onPlotClick","getYAxes","uniqBy","tickDecimals","yAxisConfig","showLines","showBars","isStacked","yaxes","flotOptions","zero","bars","getBarWidth","shadowSize","tickFormatter","grid","minBorderMargin","markings","borderWidth","hoverable","labelMarginX","mouseActiveRadius","crosshair","isVisible","noDataToBeDisplayed","renderTooltip","renderContextMenu","SeriesVisibilityChangeBehavior","ErrorIndicator","red88","PanelChrome","getHeaderHeight","contentStyle","getContentStyle","headerStyles","headerTitle","itemsRenderer","toRender","chromePadding","SeriesVisibilityChangeMode","PanelChromeComponent","VizLegendSeriesIcon","readonly","onSeriesColorChange","LegendTableItem","onLabelClick","onLabelMouseEnter","onLabelMouseOut","onMouseOut","itemWrapper","labelDisabled","yAxisLabel","getDisplayValues","VizLegendTable","sortKey","sortDesc","itemRenderer","onToggleSort","sortedItems","orderBy","columnTitle","headerSortable","withIcon","InlineList","VizLegendStatsList","VizLegendListItem","itemDisabled","linkDisabled","VizLegendList","itemRight","rightWrapper","itemBottom","bottomWrapper","sectionRight","itemStyles","seriesVisibilityChangeBehavior","Isolate","onToggleSeriesVisibility","onToggleLegendSort","dataId","onLegendLabelClick","Hide","AppendToSelection","ToggleSelection","mapMouseEventToMode","getGraphWithLegendStyles","graphContainer","legendContainer","GraphWithLegend","sortLegendBy","sortLegendDesc","legendDisplayMode","onSeriesToggle","hideEmpty","hideZero","legendItems","isZeroOnlySeries","isNullOnlySeries","shouldHideLegendItem","calculateSizeOfChild","parentWidth","parentHeight","numberOfChildren","ceil","sqrt","VizRepeater","renderCounter","getOrientation","renderGrid","renderValue","getAlignmentFactors","square","xCount","yCount","itemsOnLastRow","widthOnLastRow","calculateGridDimensions","xGrid","yGrid","itemWidth","itemHeight","autoGrid","minVizHeight","repeaterStyle","resolvedOrientation","getItemStylesForIndex","GraphSeriesToggler","hiddenSeries","toggledSeries","onHiddenSeriesChanged","newHiddenSeries","allSeriesLabels","collapse","collapseBody","bodyContentWrapper","loader","loaderActive","headerCollapsed","headerLabel","ControlledCollapse","onToggle","Collapse","collapsible","panelClass","loaderClass","CollapsableSection","collapsableSectionStyles","borderBottom","HIDDEN_LABELS","logsLabels","logsLabel","logsLabelValue","LogLabels","displayLabels","LogRowContextProvider","getRowContext","logsSortOrder","setLimit","setResult","setHasMoreContextRows","promises","dataResult","fieldCache","timestampField","idField","errorResult","getRowContexts","currentResult","hasMoreLogsBefore","hasMoreLogsAfter","currentResultBefore","currentResultAfter","valueBefore","valueAfter","memoizedGetParser","getAllFields","getFieldLinks","parseMessage","fieldsMap","getDerivedFields","fieldHash","allFields","sortFieldsLinkFirst","rowEntry","entryFieldIndex","fieldA","fieldB","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","DataLinkButton","UnThemedLogDetailsRow","showFieldsStats","fieldStats","onClickShowDetectedField","parsedKey","onClickHideDetectedField","onClickFilterLabel","parsedValue","onClickFilterOutLabel","getStats","toggleFieldsStats","showDetectedFields","noHoverBackground","hoverCursor","wordBreakAll","showingField","wrapLine","hasDetectedFieldsFunctionality","hasFilteringFunctionality","toggleFieldButton","hideField","showField","showStats","filterLabel","filterOutLabel","colSpan","LogDetailsRow","UnThemedLogDetails","getRows","showDuplicates","logsRowLevelDetails","logDetails","labelsAvailable","detectedFieldsAvailable","levelClassName","getStatsForDetectedField","LogDetails","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","omit","migrateFromValueOptions","migrateOldThresholds","moveThresholdsAndMappingsToField","oldTitle","convertOldAngularValueMapping","callToActionElement","WithContextMenu","setIsMenuOpen","setMenuPosition","openMenu","linksCounter","linkModelToContextMenuItems","renderMenuGroupItems","targetClassName","linkModel","InfoBox","urlTitle","docsLink","Badge","badge","sourceColor","FeatureInfoBox","featureState","getFeatureInfoBoxStyles","titleEl","FeatureBadge","branded","getPanelStateBadgeDisplayModel","ErrorBoundary","componentDidCatch","react","onError","onRecover","ErrorBoundaryAlert","withErrorBoundary","errorBoundaryProps","comp","InlineFormLabel","classes","FormField","labelWidth","inputWidth","inputEl","formField","SecretFormField","onReset","isConfigured","noRadiusInput","noRadiusButton","BasicAuthSettings","dataSourceConfig","basicAuthPassword","basicAuthUser","HttpProxySettings","showForwardOAuthIdentityOption","tlsAuth","tlsAuthWithCACert","tlsSkipVerify","oauthPassThru","InlineLabel","as","getInlineLabelStyles","textHeading","CertificationKey","hasCert","TLSAuthSettings","hasTLSCACert","tlsCACert","hasTLSClientCert","tlsClientCert","hasTLSClientKey","tlsClientKey","hasServerName","serverName","onResetClickFactory","newSecureJsonFields","onCertificateChangeFactory","newSecureJsonData","newJsonData","getCustomHeaderRowStyles","CustomHeaderRow","configured","_e","CustomHeadersSettings","fromEntries","headerIndex","headerId","updateSettings","onHeaderChange","onHeaderRemove","onHeaderReset","onHeaderAdd","SigV4AuthSettings","connectionConfigProps","awsDataSourceSettings","dataSourceSettings","sigV4AuthType","authType","sigV4Profile","profile","sigV4AssumeRoleArn","assumeRoleArn","sigV4ExternalId","externalId","sigV4Region","defaultRegion","sigV4Endpoint","endpoint","sigV4AccessKey","accessKey","sigV4SecretKey","secretKey","ConnectionConfig","skipHeader","skipEndpoint","ACCESS_OPTIONS","DEFAULT_ACCESS_OPTION","HttpAccessHelp","DataSourceHttpSettings","defaultUrl","showAccessOptions","sigV4AuthToggleEnabled","azureAuthSettings","urlTooltip","isAccessHelpVisible","setIsAccessHelpVisible","onSettingsChange","access","accessSelect","isValidUrl","notValidStyle","inputStyle","urlInput","keepCookies","cookies","basicAuth","withCredentials","azureAuthEnabled","azureAuth","sigV4Auth","azureSettingsUI","InlineFieldRow","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","setValue","setInputWidth","inputWidthStyle","SegmentSection","initialExpanded","setWidth","setExpandedWrapper","scrollableContent","drawer","actions","titleSpacing","closeOnMaskClick","subtitle","expandable","drawerStyles","isExpanded","setIsExpanded","currentWidth","maskClosable","getContainer","isHorizontal","hasMarks","railColor","trackColor","handleColor","hoverSyle","slider","cssCore","sliderInput","sliderInputVertical","sliderInputField","sliderInputFieldVertical","Slider","onAfterChange","ariaLabelForHandle","marks","included","SliderWithTooltip","SliderComponent","sliderValue","setSliderValue","onSliderChange","onSliderInputChange","onSliderInputBlur","sliderInputClassNames","sliderInputFieldClassNames","RangeSlider","formatTooltipResult","tooltipAlwaysVisible","RangeWithTooltip","createSliderWithTooltip","RangeComponent","tipProps","tipFormatter","StringValueEditor","useTextarea","onValueChange","nextValue","StringArrayEditor","showAdd","onRemoveString","getTheme","textInput","formInputBorderHover","NumberValueEditor","integer","SliderValueEditor","SelectValueEditor","getOptions","updateOptions","MultiSelectValueEditor","flatMap","Form","defaultValues","onSubmit","validateOnMount","validateFieldsOnMount","validateOn","useForm","handleSubmit","trigger","formState","Controller","FieldNameMatcherEditor","onChangeFromProps","fieldNameMatcherItem","optionsToLabel","FieldNameByRegexMatcherEditor","fieldNameByRegexMatcherItem","FieldTypeMatcherEditor","useFieldCounts","allTypes","fieldTypeMatcherItem","FieldsByFrameRefIdMatcher","referenceIDs","useFrameRefIds","fieldsByFrameRefIdItem","refIds","FieldNamesMatcherEditor","selections","fieldNamesMatcherItem","excludeFromPicker","fieldMatchersUI","getLegendStyles","heading","legendProps","getCheckboxStyles","checkmark","labelStyles","checkboxSize","getFormStyles","fieldValidationMessage","checkbox","validUrl","FieldSet","InlineSegmentGroup","FieldArray","prepend","swap","move","insert","useFieldArray","selectOptionInTest","optionOrOptions","combinedRef","refs","targetRef","useCombinedRefs","trimFileName","fileName","extension","FileUpload","onFileUpload","accept","setFileName","files","fileUpload","multiple","REMOVE_FILE","FileListItem","customFile","removeFile","progress","abortUpload","retryUpload","valueFormat","fileListContainer","fileNameWrapper","progressBar","FileDropzone","readAs","onLoad","fileListRenderer","setFiles","setFileProperty","oldFiles","oldFile","onDrop","acceptedFiles","rejectedFiles","customFiles","mapToCustomFile","reader","FileReader","read","readAsText","fileToModify","abort","onabort","DOMException","onprogress","loaded","onload","onerror","newFiles","getRootProps","getInputProps","isDragActive","useDropzone","fileList","dropzone","FileDropzoneDefaultChildren","primaryText","getPrimaryText","acceptMargin","getAcceptedFileTypeText","secondaryText","isValidTimeRange","TimeRangeInput","clearable","pickerInput","caretIcon","clearIcon","inputStyles","linkHover","formInputPlaceholderText","mapOptionToRelativeTimeRange","relativeToSeconds","isRangeValid","relative","isRelativeFormat","secondsToRelativeFormat","validOptions","RelativeTimeRangePicker","mapRelativeTimeRangeToOption","validation","clockIcon","fromError","toError","bodyHeight","calculateErrorHeight","CardInner","inner","getCardContainerStyles","CardContainer","disableEvents","disableHover","Card","getCardStyles","figure","secondaryActions","hasActions","onCardClick","onEnterKey","getEnterKeyHandler","actionRow","metadata","media","tagList","Tags","Figure","Meta","curr","BaseActions","cloneElement","Actions","SecondaryActions","getSignatureDisplayModel","graphFieldOptions","barAlignment","fillGradient","stacking","thresholdsDisplayModes","defaultFormatter","PlotLegend","vizLayoutLegendProps","getSeries","seriesConfig","dataFrameFieldIndex","getAxisPlacement","hideFrom","fieldCalcs","fieldReducer","XYCanvas","Marker","EventsCanvas","events","renderEventMarker","mapEventToXYCoords","renderToken","setRenderToken","isMounted","useMountedState","addHook","eventMarkers","markers","coords","bbox","devicePixelRatio","ZoomPlugin","setSelection","posToVal","setSelect","TooltipPlugin","sync","focusedSeriesIdx","setFocusedSeriesIdx","focusedPointIdx","setFocusedPointIdx","focusedPointIdxs","setFocusedPointIdxs","setCoords","plotMouseLeave","plotMouseEnter","over","tooltipInterpolator","getTooltipInterpolator","positionTooltip","idxs","xVal","viz","cL","cT","isCursourOutsideCanvas","getNamesToFieldIndex","originNames","origField","UnthemedTimeSeries","renderers","tweakAxis","tweakScale","setPrepData","xScaleKey","xScaleUnit","yScaleKey","axisGridShow","customRenderedFields","fieldMap","indicesOnly","stackingGroups","distribution","softMin","softMax","axisWidth","formatValue","pointsFilter","seriesIdx","gaps","firstIdx","lastIdx","xData","firstPos","lastPos","thisGap","nextGap","pathBuilder","pointsBuilder","originFrame","originField","dispName","fillBelowTo","addBand","lineStyle","barWidthFactor","barMaxWidth","gradientMode","hardMin","hardMax","thresholdsStyle","addThresholds","collectStackingGroups","seriesIds","seriesIdxs","orderIdsByCalcs","ids","fieldIndices","scaleKeys","dataIdx","self","hoveredIdx","cursorXVal","nonNullLft","nonNullRgt","xVals","curPos","rgtPos","lftDelta","rgtDelta","hoverEvent","pub","panelRelY","scales","setSync","preparePlotConfigBuilder","TimeSeries","GraphNGContext","useGraphNGContext","mapSeriesIndexToDataFrameFieldIndex","useContext","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","facets","matchHighLight","autoEscape","LegacyForms","enter","enterActive","exit","exitActive","measurement","UPlotChart","plot","reinitPlot","DEFAULT_PLOT_CONFIG","getConfig","uPlot","plotContainer","sameDims","sameConfig","sameData","prevTime","nextTime","sameTimeRange","setScale","setData","axes","_values","setSize","UPLOT_AXIS_FONT_SIZE","UPlotAxisBuilder","PlotConfigBuilder","optMinMax","calculateSpace","axisIdx","scaleMin","scaleMax","plotDim","side","sample","formatTime","calculateAxisSize","axisSize","gap","textWidthWithLimit","labelGap","space","splits","tickLabelRotation","gridColor","stroke","getUPlotSideFromAxis","rotate","assign","labelSize","labelFont","timeUnitSize","foundSpace","foundIncr","yearRoundedToDay","incrementRoundedToDay","makeDirectionalGradient","ctx","x0","y0","x1","y1","GradientDirection","Down","Left","Up","Right","createLinearGradient","builders","scaleGradient","scaleStops","discrete","minStopIdx","maxStopIdx","stopVal","minStopVal","maxStopVal","minStopPos","maxStopPos","ori","prevColor","grd","getCanvasContext","pct","addColorStop","getGradientRange","dataMin","dataMax","sc","ser","getDataRange","getScaleGradientFn","UPlotSeriesBuilder","lineConfig","getLineColor","paths","cap","dash","idx0","idx1","pathsBuilder","pathBuilders","linear","smooth","spline","stepBefore","stepped","stepAfter","barsCfgKey","mapDrawStyleToPathBuilder","useColor","_stroke","pointsConfig","spanGaps","getFill","opacityPercent","color1","color2","getHueGradientFn","cursorDefaults","drag","prox","ts","hook","hooks","addLines","xMin","xMax","transparentIndex","beginPath","moveTo","lineTo","strokeStyle","addAreas","fillStyle","fillRect","yMin","yMax","restore","getThresholdsDrawHook","hasLeftAxis","setMode","UPlotScaleBuilder","band","bands","setTooltipInterpolator","hasSync","setPadding","ensureNonOverlappingAxes","pointColorFn","alphaHex","tzDate","axesWithoutGridSet","firstValueAxisIdx","distr","rangeConfig","pad","hard","soft","hardMinOnly","hardMaxOnly","minMax","dir","minmax","paddingSide","sidesWithAxes","hasCrossAxis","onStackMeta","byPct","dataLength","alignedTotals","groupTotals","currentlyStacking","totals","sMaxIdx","sMinIdx","sVal","pluginLogger","addAxisConfig","hideScale","showIf","ScaleDistributionEditor","DISTRIBUTION_OPTIONS","LOG_DISTRIBUTION_OPTIONS","SeriesConfigEditor","onChangeToggle","startCase","addHideFrom","hideFromDefaults","addLegendOptions","includeLegendCalcs","addTooltipOptions","singleOnly","addTextSizeOptions","withTitle","StackingEditor","isOverride","addStackingConfig","ValueMappingEditRow","onDuplicate","onDupliate","onChangeColor","onClearColor","onUpdateMatchValue","onChangeText","onChangeFrom","onChangeTo","onChangePattern","onChangeSpecialMatch","specialMatch","specialMatchOptions","draggableId","draggableProps","dragHandleProps","dragHandle","typeColumn","rangeInputWrapper","textAlignCenter","regexInputWrapper","textTransform","ValueMappingsEditorModal","updateRows","buildEditRowModels","onChangeMapping","newList","onRemoveRow","mappingTypes","onAddValueMapping","onDuplicateMapping","sourceRow","tableWrap","editTable","onDragEnd","droppableId","droppableProps","editModelToSaveModel","editRows","ValueMappingsEditor","isEditorOpen","setIsEditorOpen","onCloseEditor","compactTable","ValueMappingsValueEditor","modes","ThresholdsEditor","newThresholds","latestThresholdInputRef","toThresholdsWithKey","renderInput","onChangeThresholdValue","inputPrefix","onChangeThresholdColor","percentIcon","onRemoveThreshold","ThemeContext","onAddThreshold","addButton","onModeChanged","formSpacingBase","ThresholdsValueEditor","UnitValueEditor","DataLinksValueEditor","FieldColorEditor","byValueSupport","FieldColorModeViz","onModeChange","newMode","onSeriesModeChange","bySeriesSupport","seriesModes","lastColor","StatsPickerEditor","getStandardFieldConfigs","getItemsCount","preferThresholdsMode","getStandardOptionEditors","strings","boolean","multiSelect","fieldColor","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","TypeaheadInfo","typeaheadItem","dangerouslySetInnerHTML","__html","monospace","typeaheadItemSelected","typeaheadItemMatch","typeaheadItemGroupTitle","TypeaheadItem","onClickItem","itemGroupTitleClassName","flattenGroupItems","groupedItems","calculateLongestLabel","allItems","longest","calculateListSizes","longestLabel","calculateSize","listWidth","calculateListWidth","calculateItemHeight","calculateListHeight","longestLabelHeight","longestLabelWidth","verticalPadding","totalHeight","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","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","mockTheme","mock","getElementStyles","getVariantStyles","getAgularPanelStyles","getPageStyles","maxWidthBreakpoint","GlobalStyles","cardChrome","hoverColor","listItemSelected","mediaUp","breakpoint","bodyBg","formFocusOutline","outlineOffset","stylesCreator","getAvailableIcons","fuzzyMatch","letter","letterIndex","lastRange","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","charCodeAt","djb2","scrollbarWidth","div","newStyles","MsOverflowStyle","offsetWidth","useForceUpdate","getPreviousCousin","selector","sibling","previousSibling","getNextCharacter","global","getRangeAt","textContent","Element","closest","ownerDocument","thebugger","throttle","LOGGIN_ENABLED","enable","disable","isEnabled","getContext","ctxFontStyle","fontStyle","cacheKey","fromCache","fontSizeBasedOnWidth","fontSizeBasedOnHeight","optimalSize","renderOrCallToRender","itemToRender","Word","Prefix","Fuzzy","nodes","inlines","Document","DEFAULT_PORTS","http","https","ftp","AngularLocationWrapper","absUrl","wrapInDeprecationWarning","host","port","protocol","replacement","arguments","newHash","hostname","parsedPath","paramValue","newUrl","QueryPartDef","defaultParams","addStrategy","QueryPart","def","updateText","innerExpr","hasMultipleParamsInString","strValue","optional","updateParam","partVal","functionRenderer","parameters","paramType","quote","suffixRenderer","coreModule","angularModules","MetricsPanelCtrl","PanelCtrl","$scope","$injector","panelData","processDataError","angularDirtyCheck","timeInfo","useDataFrames","handleDataFrames","legacy","handleQueryResult","contextSrv","datasourceSrv","timeSrv","templateSrv","onMetricsPanelRefresh","onPanelTearDown","onMetricsPanelMounted","queryRunner","getQueryRunner","querySubscription","withTransforms","withFieldConfig","panelDataObserver","otherPanelInFullscreenMode","snapshotData","updateTimeRange","$timeout","issueQueries","cancelled","$root","$$phase","$digest","newTimeData","applyPanelTimeOverrides","run","panelId","dashboardId","getTimezone","minInterval","cacheTimeout","snapshot","plugin","$parent","editorTabs","$location","timing","panelDidMount","panelInitialized","renderingCompleted","profiler","publishAppEvent","appEvent","initEditMode","editModeInitiated","addEditorTab","directiveFn","editorTab","templateUrl","getExtendedMenu","otherPanelInFullscreen","panelCtrl","ctrl","isLastQuery","templates","require","promiseToDigest","promise","finally","$evalAsync","cleanUpAction","createAction","appEvents","defaultStyle","SlideDown","inProp","Branding","CardButton","CloseButton","CopyToClipboard","onSuccess","clipboardjs","ClipboardJS","clearSelection","elType","initClipboardJS","getElementType","ctaStyle","infoBoxStyles","buttonIcon","buttonLink","buttonTitle","proTip","proTipLink","proTipLinkTitle","proTipTarget","infoBox","infoBoxTitle","ctaElementClassName","ctaElement","getFooterLinks","getVersionLinks","licenseInfo","stateInfo","edition","licenseUrl","hideVersion","hasUpdate","ChangePassword","onSkip","passwords","newPassword","confirmNew","LocalStorageValueProvider","storageKey","store","onSaveToStore","onDeleteFromStore","LoginCtrl","pw","oldPassword","resetCode","put","toGrafana","resetModel","confirmPassword","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","keyframes","minHeight","backgroundPosition","backgroundRepeat","Page","navModel","getTitleFromNavModel","PageHeader","Contents","PageLoader","SelectNav","customCss","defaultSelectedItem","navItem","hideFromTabs","Navigation","renderHeaderTitle","renderTitle","breadcrumbs","breadcrumbsResult","bc","headerCanvas","pageName","loadingText","PasswordField","showPassword","setShowPassword","TeamPicker","debouncedSearch","leading","trailing","teams","team","avatarUrl","onSelected","AddPermissions","AclTarget","userId","teamId","permission","onAddPermission","getCleanState","PermissionLevel","newItem","pickerClassName","dashboardAclTargets","onTypeChanged","UserPicker","onUserSelected","onTeamSelected","dashboardPermissionLevels","onPermissionChanged","showPermissionLevels","ItemAvatar","userAvatarUrl","teamAvatarUrl","ItemDescription","PermissionsListItem","onRemoveItem","folderInfo","inheritedFromRoot","inherited","currentPermissionLevel","dp","canViewFolderPermissions","DisabledPermissionListItem","PermissionList","isFetching","OperationRowHelp","markdown","markdownHelper","helpHtml","QueryOperationAction","QueryOperationRow","headerElement","draggable","isContentVisible","setIsContentVisible","getQueryOperationRowStyles","onRowToggle","useUpdateEffect","renderPropArgs","titleElement","ReactUtils","actionsElement","headerElementRendered","rowHeader","collapseIcon","dragIcon","inlineFormMargin","BuiltinRoleOption","fixedRoleGroupNames","ldap","RolePickerMenu","builtInRole","builtInRoles","appliedRoles","showGroups","builtinRolesDisabled","onBuiltInRoleSelect","onUpdate","setSelectedOptions","selectedBuiltInRole","setSelectedBuiltInRole","showSubMenu","setShowSubMenu","openedMenuGroup","setOpenedMenuGroup","subMenuOptions","setSubMenuOptions","subMenuNode","customStyles","customRoles","filterCustomRoles","sortRolesByName","fixedRoles","filterFixedRoles","optionGroups","getOptionGroups","getSelectedGroupOptions","selectedGroupOptions","getRoleGroup","groupSelected","g","groupPartiallySelected","onGroupChange","restOptions","onOpenSubMenu","onCloseSubMenu","onClearSubMenu","menuSection","groupHeader","builtInRoleSelector","newRole","RoleMenuGroupOption","partiallySelected","every","isNotDelegatable","RolePickerSubMenu","RoleMenuOption","hideDescription","menuButtonRow","selectedCustomRoles","roleUID","groupsMap","subMenuButtonRow","menuOptionDisabled","menuOptionCheckbox","menuOptionBody","menuOptionInfoSign","checkboxPartiallyChecked","menuOptionExpand","subMenuPortal","delegatable","RolePickerInput","onQueryChange","getRolePickerInputStyles","numberOfRoles","selectedRoles","RolePicker","getRoles","getRoleOptions","getBuiltinRoles","onRolesChange","onBuiltinRoleChange","roleOptions","setRoleOptions","setAppliedRoles","setSelectedRoles","setBuiltinRoles","setQuery","setIsLoading","userRoles","roles","newBuiltInRole","newRoles","UserRolePicker","orgId","updateUserRoles","fetchRoleOptions","fetchUserRoles","fetchBuiltinRoles","rolesUrl","builtinRolesUrl","userRolesUrl","isHandled","roleUids","skipInitialLoad","folder","folderName","folderId","getFolder","getInitialValues","getFolderById","initialFolderId","initialTitle","loadInitialValue","rootName","enableReset","permissionLevel","showRoot","searchFolders","hit","newFolder","createFolder","onFolderChange","resetFolder","rootFolder","enableCreateNew","createNewFolder","PermissionLevelString","searchSrv","SearchSrv","SortPicker","getSortOptions","DEFAULT_SORT","TagBadge","removeIcon","tagStyle","countLabel","TagOption","TagFilter","hideValues","tagOptions","debouncedLoadOptions","onTagChange","newTags","MultiValueLabel","tagFilter","TimePickerWithHistory","toAppend","toStore","onAppendToHistory","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","defaultSuccessNotification","AppNotificationSeverity","AppNotificationTimeout","defaultWarningNotification","defaultErrorNotification","createSuccessNotification","createErrorNotification","getMessageFromError","createWarningNotification","$win","$tooltip","addClass","appendTo","compile","injector","invoke","$compile","$rootScope","tmpScope","$new","extend","scopeData","$destroy","outerWidth","outerHeight","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","timeNanosecondField","logLevelField","getIdField","seriesLogLevel","tsNs","messageValue","timeFromNow","timeLocal","timeUtc","limits","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","with","throwError","complete","aggregatedLogsVolume","dataQueryResponse","statusText","toggleKioskMode","kiosk","getKioskMode","queryParam","KioskMode","exitKioskMode","panelsRendered","appNotificationsSlice","createSlice","appNotifications","notifyApp","newAlert","existingAlert","clearAppNotification","appNotification","appNotificationsReducer","buildInitialState","navIndex","buildNavIndex","parentItem","buildWarningNav","updateNavIndex","updateConfigurationSubtitle","getItemWithNewSubTitle","navIndexReducer","newPages","users","apikeys","getNavModel","onlyChild","getNotFoundModel","PreferencesService","resourceUri","preferences","backendSrv","load","FetchStatus","FetchQueue","Pending","InProgress","Done","updates","asObservable","noOfInProgress","noOfPending","printState","entriesWithoutOptions","getUpdate","publishUpdate","ResponseQueue","fetchQueue","responses","setInProgress","observable","FetchQueueWorker","responseQueue","maxParallelRequests","http2Enabled","getUpdates","concatMap","apiRequests","isDataQuery","dataRequests","noOfAllowedDataRequests","dataRequestToFetch","TokenRevokedModal","modalStyles","showMaxConcurrentSessions","maxConcurrentSessions","infobox","CANCEL_ALL_REQUESTS_REQUEST_ID","BackendSrv","deps","fromFetch","logout","noBackendCache","internalFetch","lastValueFrom","response","subscriptions","getResponses","setDone","inFlightRequests","parseRequestOptions","fromFetchStream","getFromFetchStream","failureStream","toFailureStream","successStream","ok","showSuccessAlert","inspectorStream","processRequestError","handleStreamCancellation","resolveCancelerIfExists","cancelAllInFlightRequests","retry","isLocalUrl","Authorization","hideFromInspector","parseUrlFromOptions","parseInitFromOptions","redirected","parseResponseBody","responseType","share","isSignedIn","inputStream","fetchErrorResponse","retryWhen","attempts","firstAttempt","ShowModalReactEvent","loginPing","showApplicationErrorAlert","cancelRequest","throwIfEmpty","HTTP_REQUEST_CANCELED","getInspectorStream","withNoBackendCache","getDashboardByUid","getFolderByUid","User","isGrafanaAdmin","orgRole","orgName","orgCount","helpFlags1","hasEditPermissionInFolders","email","isEditor","hasRole","minRefreshInterval","setLoggedOut","accessControlEnabled","hasPermission","permissions","isGrafanaVisible","visibilityState","isAllowedInterval","getValidInterval","hasAccessToExplore","AccessControlAction","hasAccess","fallBack","evaluatePermission","addDashboardImpression","impressionsKey","impressionKey","impressions","imp","pop","getDashboardOpened","toggleTheme","runtimeOnly","currentTheme","newTheme","newCssLink","bodyLinks","getElementsByTagName","service","currentPref","keybindingSrv","reset","Mousetrap","initGlobals","showHelpModal","goToHome","openAlerting","goToProfile","openSearch","bindGlobal","globalEsc","anyDoc","activeElement","nodeName","hasAttribute","closeSearch","editview","inspect","inspectTab","editPanel","viewPanel","showDashEditView","keyArg","returnValue","keyType","bindWithPanelId","dataset","panelid","withFocusedPanel","setupDashboardBindings","graphTooltip","startRefresh","canSave","SaveDashboardModalProxy","ZoomOutEvent","ShiftTimeEvent","ShiftTimeEventPayload","canEditPanelById","isViewing","getPanelById","getExploreUrl","getDatasourceSrv","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","isStarred","getStarred","starred","hasFilters","folderIds","SearchLayout","skipRecent","skipStarred","handleSearchResult","folderUid","folderTitle","folderUrl","getDashboardTags","localStorage","getBool","exists","getObject","ret","setObject","errorToThrow","removeItem","TableModel","columnMap","addColumn","addRow","areRowsMatching","otherRow","foundFieldToMatch","mergeTablesIntoModel","dst","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","ConfigContext","ThemeProvider","setTheme","provideTheme","provideConfig","CorsWorker","Worker","scriptUrl","urlParts","scriptsBasePathUrl","importScripts","objectURL","createObjectURL","Blob","revokeObjectURL","processAclItems","processAclItem","sortRank","userLogin","arrayMove","array","fromIndex","toIndex","connectWithStore","WrappedComponent","ConnectedWrappedComponent","connect","connectWithProvider","DEFAULT_RANGE","lastUsedDatasourceKeyForOrgId","exploreDatasource","exploreTargets","timeRangeForUrl","exploreState","originPanelId","buildQueryTransaction","exploreId","queryOptions","scanning","combinedKey","lowLimit","getIntervals","app","liveStreaming","generateKey","done","clearQueryKeys","isSegment","ParseUrlStateIndex","safeStringifyValue","EXPLORE_GRAPH_STYLES","toGraphStyle","parseUrlState","safeParseJson","SegmentsStart","RangeFrom","RangeTo","parsedSegments","generateEmptyQuery","getNextRefIdChar","generateNewKeyAndAddRefIdIfMissing","ensureQueries","allQueries","validKeys","hasNonEmptyQuery","updateHistory","updatedHistory","historyKey","getQueryKeys","datasourceInstance","newQueryKeys","primaryKey","rawRange","parseRawTime","getTimeRangeFromUrl","refreshIntervalToSortOrder","convertToWebSocketUrl","stopQueryState","copyStringToClipboard","execCommand","parseHeaders","isAppJson","isContentTypeApplicationJson","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","toPercent","outOf","addSlashes","queryColorDot","diameter","slugifyForUrl","additionalDecimals","roundValue","getUnitFormats","receiver","isUtc","Reflect","getRefId","hide","letters","RICH_HISTORY_KEY","RICH_HISTORY_SETTING_KEYS","retentionPeriod","starredTabAsFirstTab","activeDatasourceOnly","datasourceFilters","SortOrder","MAX_HISTORY_ITEMS","addToRichHistory","richHistory","comment","sessionName","showQuotaExceededError","showLimitExceededWarning","newQueriesToSave","strippedQuery","notEmptyQuery","retentionPeriodLastTs","createRetentionPeriodBoundary","queriesToKeep","newQueriesToCompare","lastQueriesToCompare","limitExceeded","dispatch","localStorageFull","getRichHistory","transformedRichHistory","transformedQueries","individualQuery","isParsable","createDataQuery","migrateRichHistory","deleteAllFromRichHistory","updateStarredInRichHistory","updateCommentInRichHistory","newComment","deleteQueryInRichHistory","createUrlFromRichHistory","serializedState","baseUrl","mapNumbertoTimeInSlider","isLastTs","today","setDate","createQueryHeading","DatasourceAZ","DatasourceZA","createQueryText","queryDsInstance","getQueryDisplayText","mapQueriesToHeadings","mappedQueriesToHeadings","createDatasourcesList","queriesDatasources","dsName","isRemoved","filterAndSortQueries","listOfDatasourceFilters","timeFilter","filteredQueriesByDs","filterQueriesByDataSource","filteredQueriesByDsAndSearchFilter","filterQueriesBySearchFilter","filteredQueriesToBeSorted","filterQueriesByTime","sortFunc","Ascending","Descending","sortQueries","getRelativeURLPath","createShortLink","createAndCopyShortLink","shortLink","getShiftedTimeRange","origRange","getZoomedTimeRange","center","OrgRolePicker","loadAdminUserPage","userAdminPageLoadedAction","userProfileLoadedAction","loadUserProfile","orgs","userOrgsLoadedAction","loadUserOrgs","loadUserSessions","loadLdapSyncStatus","userError","userAdminPageFailedAction","updateUser","setUserPassword","disableUser","enableUser","deleteUser","updateUserPermissions","addOrgUser","loginOrEmail","updateOrgUserRole","patch","deleteOrgUser","sessions","session","seenAt","createdAt","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","totalCount","userAdmin","hiddenReducerTypes","ThresholdMapper","conditions","condition","evaluator","op","value1","value2","alertThreshold","alertQueryDef","dynamicLookup","EvalFunction","joinEvalMatches","metric","Metric","getStateDisplayModel","iconClass","stateClass","conditionTypes","evalFunctions","IsAbove","IsBelow","IsOutsideRange","IsWithinRange","HasNoValue","evalOperators","noDataModes","executionErrorModes","reducerTypes","createReducerPart","getAlertAnnotationInfo","ah","evalMatches","alertStateSortScore","firing","no_data","pending","paused","inactive","combineReducers","promRules","createAsyncMapSlice","fetchPromRulesAction","rulesSourceName","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","lotexSupportsRuleEditing","checkIfLotexSupportsEditingRulesAction","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","AlertLabel","onRemoveLabel","bold","AlertLabels","AlertManagerPicker","GRAFANA_RULES_SOURCE_NAME","getAllDataSources","DataSourceType","CollapseToggle","isCollapsed","restOfProps","StateTag","common","good","bad","neutral","AlertGroupHeader","textStyles","getNotificationsTextColors","alerts","countByStatus","statusObj","pluralize","RuleFolderPicker","AlertStateTag","alertStateToState","alertStateToReadable","useUnifiedAlertingSelector","equalityFn","useSelector","fetchAlertManagerConfig","getDatasourceAPIId","template_files","alertmanager_config","fetchStatus","receivers","receiversResponseContainsErrors","getReceiverResultError","isFetchError","grafana_managed_receiver_configs","isTestReceiversResult","receiversResult","fetchExternalAlertmanagerConfig","escapeQuotes","setRulerRuleGroup","fetchRulerRules","dashboardUID","rulerGetRequest","fetchRulerRulesGroup","deleteRulerRulesGroup","empty","hasErrorMessage","isResponseError","isCortexErrorResponse","isRulerNotSupported","RULER_NOT_SUPPORTED_MSG","createAsyncThunk","withSerializedError","nsMap","rules","fetchRules","isVanillaPrometheusAlertManagerDataSource","retryWhile","messageFromError","fetchExternalAlertmanagers","fetchSilences","fetchAllPromAndRulerRulesAction","force","getStore","getAllRulesSourceNames","fetchAllPromRulesAction","findEditableRule","ruleIdentifier","isGrafanaRuleIdentifier","namespaces","isGrafanaRulerRule","grafana_alert","ruleSourceName","isCloudRuleIdentifier","identifier","ruleId","isPrometheusRuleIdentifier","deleteRule","ruleWithLocation","isGrafanaRulesSource","deleteRuleAction","withAppEvents","navigateTo","successMessage","saveGrafanaRule","existing","evaluateEvery","formRule","formValuesToRulerGrafanaRuleDTO","freshExisting","targetFolderGroups","fetchRulerRulesNamespace","currentGroupName","existingGroups","newGroupName","getUniqueGroupName","newUid","redirectOnSave","RuleFormType","formValuesToRulerRuleDTO","targetGroup","saveLotexRule","alertId","fetchAnnotations","oldConfig","newConfig","redirectPath","refetch","thunkAPI","latestConfig","updateAlertManagerConfig","addDefaultsToAlertmanagerConfig","makeAMLink","alertmanagerSourceName","silenced","inhibited","isRegex","fetchAlerts","expireSilenceAction","silenceId","silenceID","expireSilence","exitOnSave","createOrUpdateSilence","deleteReceiverAction","receiverName","deleteTemplateAction","templateName","newTemplates","fetchFolderIfNotFetchedAction","dispatched","fetchAlertGroups","deleteAlertManagerConfig","namespaceName","newNamespaceName","groupInterval","rulesResult","existingGroup","deleteNamespace","addExternalAlertmanagersAction","alertManagerUrls","alertManagers","alertmanagers","addAlertManagers","route","isReceiverUsedInRoute","routes","isReceiverUsed","matcherToOperator","MatcherOperator","matcherToMatcherField","matcherFieldToMatcher","matcherOperatorToValue","matcherFieldOptions","matcherOperators","parseMatcher","trimmed","operatorsFound","unescapeMatcherValue","parseMatchers","matcherQueryString","labelsMatchMatchers","labelValue","nameMatches","valueMatches","getAllAlertmanagerDataSources","getAlertmanagerByUid","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","annotationLabels","summary","runbookURL","panelID","RulesDataSourceTypes","Loki","getRulesDataSources","getAlertManagerDataSources","Alertmanager","getAllRulesSources","getRulesSourceName","rulesSource","isCloudRulesSource","getDataSourceByName","implementation","AlertManagerImplementation","getRulesSourceByName","parseQueryParamMatchers","matcherPairs","parsedMatchers","getMatcherQueryParams","validMatcherLabels","matcherUrlParams","createViewLink","ruleSource","returnTo","sourceName","paramId","paramSource","createExploreLink","ui","arrayToRecord","rec","getFiltersFromUrlParams","queryParams","alertState","dataSource","ruleType","getSilenceFiltersFromUrlParams","silenceState","recordToArray","record","alertManagerName","makeRuleBasedSilenceLink","makeLabelBasedSilenceLink","alertname","silenceUrlParams","shouldRetry","pause","makeAttempt","initialAsyncRequestState","requestStateReducer","asyncThunk","fulfilled","rejected","extraReducers","addDefaultCase","getEntityId","isAsyncThunkAction","asyncAction","entityId","arg","statusCode","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","panelToRuleFormValues","panelDataSourceRef","dsRef","queryVariables","interpolatedTarget","datasourceSettings","dataQueriesToGrafanaQueries","fromRulerRule","rulerRuleHash","hashRulerRule","fromCombinedRule","rulerRule","promRule","ruleHash","hashRule","fromRule","fromRuleWithLocation","equal","cloudRuleIdentifierPrefix","prometheusRuleIdentifierPrefix","escapeDollars","unesacapeDollars","tryParse","decodeFromUri","stringifyIdentifier","hashLabelsOrAnnotations","isRecordingRule","isAlertingRule","ruleIdentifierToRuleSourceName","PromRuleType","alertInstanceKey","isRulerNotSupportedResponse","resp","PromAlertingRuleState","flattenRules","GrafanaAlertState","getFirstActiveAt","activeAt","TimeOptions","timeOptions","positiveDurationValidationPattern","durationValidationPattern","saveAnnotation","updateAnnotation","deleteAnnotation","getAnnotationTags","executeAnnotationQuery","savedJsonAnno","standardAnnotationSupport","prepareAnnotation","prepareQuery","documentElement","__annotation","queryRequest","runRequest","processEvents","anno","hasTime","hasText","byName","evts","alertEventAndAnnotationFields","setter","getAnnotationsFromData","annotationEventNames","help","apiKeysSlice","hasFetched","includeExpired","keysIncludingExpired","apiKeysLoaded","includeExpiredToggled","apiKeys","DashboardExporter","makeExportable","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","newObj","DashNavButton","iconSize","noBorderContainer","DashNavTimeControls","setAutoRefresh","refreshDashboard","timepicker","hasDelay","nowDelay","adjustedFrom","adjustedTo","nextRange","setTime","refresh_intervals","getValidIntervals","timePickerValue","hideIntervalPicker","onChangeTimePicker","onMoveBack","onChangeRefreshInterval","mapDispatchToProps","updateTimeZoneForSession","connector","customLeftActions","customRightActions","getDashboardSrv","starDashboard","playlistSrv","addCustomContent","buttons","isPlaylistRunning","renderLeftActionsButton","kioskMode","canStar","canShare","onStarDashboard","renderPlaylistControls","onPlaylistPrev","onPlaylistStop","onPlaylistNext","renderTimeControls","hideTimePicker","renderRightActionsButton","onAddPanel","canEdit","showSettings","snapshotUrl","originalUrl","tvButton","onToggleTVMode","gotoSnapshotOrigin","onOpenSettings","AutoRefreshIntervals","refreshIntervals","onRefreshIntervalChange","getIntervalsFunc","validateIntervalsFunc","validateIntervals","setIntervals","invalidIntervalsMessage","setInvalidIntervalsMessage","intervalsString","onIntervalsChange","newIntervals","onIntervalsBlur","invalidMessage","cleanIntervals","TimePickerSettings","isNowDelayValid","onNowDelayChange","onHideTimePickerChange","timePickerHidden","onLiveNowChange","liveNow","onTimeZoneChange","onWeekStartChange","VariableValuesPreview","setPreviewLimit","previewOptions","setPreviewOptions","showMoreOptions","optionContainer","completeChangeVariableName","originalVariable","getVariable","changeVariableNameSucceeded","toVariablePayload","renamedIdentifier","toVariableIdentifier","addVariable","switchToEditMode","removeVariable","reIndex","setIdInEditor","switchToListMode","clearIdInEditor","getEditorVariables","getModel","usages","createUsagesNetwork","usagesNetwork","transformUsagesToNetwork","initInspect","VariableTypeSelect","getVariableTypes","VariableSelectField","variableAdapters","HIDE_OPTIONS","VariableHide","VariableHideSelect","VariableEditorEditorUnConnected","changeVariableName","changeVariableType","newType","changeVariableProp","propValue","onEditorUpdate","variableEditorMount","variableEditorUnMount","EditorToRender","onHandleSubmit","VariableSectionHeader","VariableTextField","V","onNameChange","onTypeChange","onLabelChange","onHideChange","onDescriptionChange","onPropChange","onPropChanged","hasOptions","variableEditorMounted","variableEditorUnMounted","errorText","changeVariableNameFailed","VariableEditorEditor","ownProps","templating","NetworkGraph","edges","onDoubleClick","network","onNodeDoubleClick","visJs","toVisNetworkNodes","toVisNetworkEdges","autoResize","improvedLayout","hierarchical","sortMethod","interaction","navigationButtons","dragNodes","Network","createNetwork","nodesWithStyle","DataSet","edgesWithStyle","edge","arrows","NetworkGraphModal","propsShow","setShow","VariableUsagesButton","isAdhoc","MoveType","VariableEditorList","onEditClick","moveType","onChangeVariableOrder","onDuplicateVariable","onRemoveVariable","EmptyListCTA","onAddClick","definition","passed","getVariableUsages","isAdHoc","VariableCheckIndicator","iconPassed","iconFailed","greenBase","VariablesUnknownButton","VariablesUnknownTable","changed","setChanged","setUsages","unknownsNetwork","getUnknownsNetwork","elapsed","CollapseLabel","NoUnknowns","UnknownTable","infoIcon","usage","firstColumn","defaultColumn","lastColumn","UnProvidedVariablesDependenciesButton","createDependencyNodes","createDependencyEdges","filterNodesWithDependencies","VariablesDependenciesButton","changeVariableOrder","duplicateVariable","switchToNewMode","nextId","getNextAvailableId","getNewVariabelIndex","idInEditor","VariableEditorContainerUnconnected","newId","variableToEdit","onChangeToListMode","onNewVariable","onEditVariable","VariableEditorContainer","getDashboardPermissions","addDashboardPermission","removeDashboardPermission","updateDashboardPermission","checkFolderPermissions","DashboardPermissionsUnconnected","isAdding","hasUnsavedFolderChange","PermissionsInfo","onOpenAddPermissions","AddPermission","onCancelAddPermission","DashboardPermissions","DeleteDashboardModal","isProvisioned","provisioned","onDeleteDashboard","deleteDashboard","useDashboardDelete","modalBody","getModalBody","ProvisionedDeleteModal","provisionedId","provisionedExternalId","totalAlerts","sumBy","DeleteDashboardButton","GRAPH_TOOLTIP_OPTIONS","updateTimeZone","updateTimeZoneDashboard","updateWeekStart","updateWeekStartDashboard","GeneralSettings","setRenderCounter","editable","AnnotationFieldMapper","updateFields","renderRow","onFieldNameChange","StandardAnnotationQueryEditor","getCurrent","running","verifyDataSource","fixed","renderStatus","rowStyle","onMappingChange","AngularEditorLoader","angularComponent","loadAngular","scopeProps","currentAnnotation","ignoreNextWatcherFiring","digest","currentDatasource","getScope","$watch","newAnnotation","AnnotationSettingsEdit","editIdx","setAnnotation","isNewAnnotation","ListNewButton","AnnotationSettingsList","onNew","updateAnnotations","onMove","arrayUtils","showEmptyListCTA","onDelete","DashboardSettingsHeader","AnnotationsSettings","setEditIdx","LinkSettingsList","setLinks","moveLink","duplicateLink","deleteLink","LinksSettings","newLink","LinkSettingsEdit","editLinkIdx","VersionsSettings","isAppending","historySrv","versions","decorateVersions","selectedVersions","newInfo","baseInfo","isNewLatest","lhs","rhs","viewMode","diffData","createdDateString","formatDate","created","ageString","getRelativeTime","versionId","getVersions","isLastPage","rev","canCompare","showButtons","hasMore","VersionHistory","isComparing","baseVersion","newVersion","VersionsHistorySpinner","onCheck","getDiff","JsonEditorSettings","dashboardJson","setDashboardJson","editWrapper","saveJSONDashboard","dashboardWatcher","MakeEditable","onMakeEditable","DashboardSettings","canMakeEditable","canAdmin","onPostSave","canSaveAs","scrollInner","settingsWrapper","loc","SaveDashboardButton","onSaveSuccess","settingsContent","asDropdown","linkTypeOptions","linkIconMap","question","bolt","doc","cloud","linkIconOptions","linkSettings","setLinkSettings","selectedItem","PANEL_EDITOR_UI_STATE_STORAGE_KEY","DEFAULT_PANEL_EDITOR_UI_STATE","isPanelOptionsVisible","rightPaneSize","topPaneSize","DisplayMode","pluginsSlice","storedUiState","migratedState","getPanel","PanelModel","getSourcePanel","initDone","shouldDiscardChanges","isVizPickerOpen","tableViewEnabled","updateEditorInitState","sourcePanel","setEditorPanelData","setDiscardChanges","setPanelEditorUIState","closeEditor","panelEditor","PanelEditorTabId","PanelEditTableToggle","displayModes","Fill","Exact","Off","VisualizationSelectPaneTab","SaveDashboardAsForm","$folder","copyTags","hideControls","autoUpdate","getSaveAsDashboardClone","getFormValues","dashboardName","validationSrv","onDashboardSave","useDashboardSave","dashboardSaveModelClone","setDashboardSaveModelClone","SaveDashboardErrorProxy","dashboardSaveModel","SaveDashboardAsButton","isHandledError","overwrite","ConfirmPluginDashboardSaveModal","getConfirmPluginDashboardSaveModalStyles","errorStatus","SaveProvisionedDashboardForm","dashboardJSON","saveToFile","saveAs","onCopyToClipboardSuccess","SaveProvisionedDashboard","SaveDashboardForm","hasTimeChanged","hasVariableChanged","hasVariableValuesChanged","resetOriginalVariables","resetOriginalTime","isChanged","modalProps","saveDashboardApiCall","saveDashboard","clearUnsavedChanges","DashboardSavedEvent","currentPath","useCurrentTimeRange","selectedTheme","buildBaseUrl","queryStart","buildSoloUrl","soloUrl","buildImageUrl","imageUrl","getLocalTimeZone","themeOptions","ShareLink","useShortUrl","shareUrl","shortenUrl","buildShareUrl","buildUrl","e2eSelectors","isDashboardSaved","onUseCurrentTimeRangeChange","onThemeChange","onUrlShorten","getShareUrl","onShareUrlCopy","expireOptions","ShareSnapshot","external","timeoutSeconds","saveSnapshot","snapshotExpires","scrubDashboard","cmdData","expires","deleteUrl","snapshotName","singlePanel","getSaveModel","gridPos","forEachPanel","selectedExpireOption","externalEnabled","sharingButtonText","getSnaphotShareOptions","shareOptions","renderStep1","onSnapshotNameChange","onExpireChange","onTimeoutChange","createSnapshot","renderStep2","getSnapshotUrl","onSnapshotUrlCopy","deleteSnapshot","renderStep3","ViewJsonModal","getClipboardText","disableHeight","ShareExport","shareExternally","exporter","openSaveAsDialog","openJsonModal","dashboardJsonPretty","onShareExternallyChange","onTrimDefaultsChange","onViewJson","onSaveAsFile","ShareEmbed","iframeHtml","buildIframeHtml","onIframeHtmlChange","getIframeHtml","onIframeHtmlCopy","ShareLibraryPanel","customDashboardTabs","customPanelTabs","getTabs","getActiveTab","onSelectTab","ActiveTab","getHistoryList","getDashboardVersion","restoreDashboard","useDashboardRestore","onRestoreDashboard","RevertDashboardModal","VersionHistoryTable","createdBy","VersionHistoryHeader","VersionsHistoryButtons","getDiffText","showProp","propIsNumeric","isNumeric","originalValue","getDiffOperationText","DiffValues","hasLeftValue","isUndefined","hasRightValue","replaceDiff","DiffTitle","getDiffTitleStyles","embolden","withoutDiff","_get","critical","DiffGroup","diffs","DiffViewer","oldValue","newValue","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","VersionHistoryComparison","compare","lhsMap","jsonMap","rhsMap","flow","pointers","jsonDiff","versionInfo","noMarginBottom","PanelHeaderMenuItem","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","canDelete","dashboardNotFound","loadDashboard","slug","_loadScriptedDashboard","_loadFromDatasource","isFolder","_executeScript","fromScript","dsid","reject","services","dashboardSrv","scriptResult","Function","scriptFunc","isFunction","dashboardLoaderSrv","DashboardSrv","removePanel","onRemovePanel","DashboardModel","setCurrent","parsedJson","TimeSrv","zoomOut","shiftTime","autoRefreshBlocked","initTimeFromUrl","parseTime","timeAtLoad","parseUrlParam","utcValue","getTimeWindow","timeWindow","timeWindowMs","paramsJSON","currentRefresh","isAllowedIntervalFn","isExistingInterval","minRefreshIntervalInIntervals","lowestRefreshInterval","getRefreshFromUrl","updateTimeRangeFromUrl","urlRange","timeHasChangedSinceLoad","stopAutoRefresh","currentUrlState","validInterval","refreshTimer","startNextRefreshTimer","timeRangeUpdated","afterMs","pauseAutoRefresh","previousAutoRefresh","resumeAutoRefresh","fromRouteUpdate","oldRefresh","urlParams","isRefreshOutsideThreshold","lastRefresh","totalRange","migrateMultipleStatsMetricsQuery","panelQueries","newQueries","statistics","statistic","newTarget","migrateMultipleStatsAnnotationQuery","annotationQuery","newAnnotations","DashboardMigrator","dashboardModel","updateSchema","oldVersion","schemaVersion","panelUpgrades","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","migrateCloudWatchQueries","migrateCloudWatchAnnotationQuery","isCloudWatchQuery","metricQueryType","MetricQueryType","metricEditorMode","MetricEditorMode","newAnnotationQueries","newAnnotationQuery","widthFactor","nextRowId","showRows","showTitle","repeat","repeatIteration","rowGridHeight","getGridHeight","rowPanelModel","rowArea","RowArea","panelWidth","panelHeight","panelPos","getPanelPosition","addPanel","rowYPos","area","callOnce","startPlace","endPlace","place","dashUri","seriesName1","fieldName1","nameOrRef","upgradeValueMappings","oldMappings","tooltipOptions","mutableKeys","infinityEqualsNull","findNextPanelID","sortedDeepCloneWithoutNulls","isPlainObject","getVariablesFromState","revision","ensureListExist","gnetId","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","original","onTimeRangeUpdated","refreshAll","panelIds","RenderEvent","lastResult","getLastResult","initEditPanel","getEditClone","initViewPanel","setIsViewing","exitViewPanel","refreshIfPanelsAffectedByVariableChange","exitPanelEditor","canEditPanel","panelA","panelB","configRev","hasUnsavedChanges","hasChanged","hasVariables","iteration","panelsToRemove","collapsedPanel","deleteScopeVars","pull","repeatPanel","cleanUpRowRepeats","rowPanels","processRowRepeats","rowPanelIndex","getRowPanels","getPanelRepeatClone","valueIndex","sourcePanelIndex","getRowRepeatClone","sourceRowPanel","insertPos","updateRepeatedPanelIds","getPanelRepeatVariable","repeatRow","getSelectedVariableOptions","repeatDirection","otherPanel","setScopedVars","variableOption","optionIndex","getRowHeight","panelBelowIndex","cloneRowPanel","isAllVariable","positions","maxPos","maxBy","removeRow","removePanels","toggleRow","isSubMenuVisible","newPanel","hasRepeat","yDiff","pushDownAmount","cycleGraphTooltip","sharedTooltipModeEnabled","sharedCrosshairModeOnly","cloneVariablesFrom","hasVariablesChanged","autoFitPanels","viewHeight","currentGridHeight","visibleHeight","submenuEnabled","scaleFactor","templateVariableValueUpdated","CoreEvents","getPanelByUrlId","panelUrlId","panelsWithLegends","onCount","panelLegendsOn","canAddAnnotations","shouldUpdateDashboardPanelFromJSON","updatedPanel","updated","variableIds","originalLibraryPanels","notPersistedProperties","hasRefreshed","cachedPluginOptions","getDisplayTitle","mustKeepProps","timeFrom","timeShift","hideTimeOverride","fullscreen","restoreModel","ensureQueryIds","generateNewKey","PanelOptionsChangedEvent","updateFieldConfig","resendLastResult","updateGridPos","newPos","runAllPanelQueries","dashboardTimezone","timeData","getOptionsToRemember","restorePanelOptions","restoreCustomOverrideRules","applyPluginOptionDefaults","isAfterPluginChange","getPanelOptionsWithDefaults","currentOptions","currentFieldConfig","pluginLoaded","getPluginVersion","clearPropertiesBeforePluginChange","filterFieldConfigOverrides","isStandardFieldProp","newPlugin","oldOptions","prevFieldConfig","oldPluginId","wasAngular","isAngularPlugin","updateQueries","PanelQueriesChangedEvent","itemIndex","sourceModel","sourceQueryRunner","useLastResultFrom","getTransformations","getFieldOverrideOptions","getDataSupport","PanelQueryRunner","setTransformations","PanelTransformationsChangedEvent","setProperty","extraVars","vars","allVariablesParams","loadDashboardPermissions","toUpdateItem","itemToUpdate","itemsToUpdate","itemToDelete","importDashboard","dashboardTitle","loadPluginDashboards","removeDashboard","uri","cleanUpDashboardAndVariables","cleanUpDashboard","cancelVariables","updateWeekStartForSession","optionsWithDefaults","mergeWith","objValue","srcValue","fieldConfigWithDefaults","existingFieldConfig","pluginDefaults","cleanProperties","fixThresholds","applyFieldConfigDefaults","fieldConfigWithOptimalColorMode","colorSettings","adaptFieldColorMode","parentPath","fullPath","existsInRegistry","isCustomFieldProp","currentOverride","initPhase","DashboardInitPhase","isInitSlow","modifiedQueries","initError","dashbardSlice","dashboardInitFetching","dashboardInitServices","dashboardInitSlow","dashboardInitCompleted","dashboardInitFailed","setDashboardQueriesToUpdateOnLoad","clearDashboardQueriesToUpdateOnLoad","loadSnapshotData","getProcessedDataFrames","worker","SnapshotWorker","annotationEvents","canWork","getAnnotationsInSnapshot","ask","text2","ShowConfirmModalEvent","yesText","copyPanel","sharePanel","addLibraryPanel","AddLibraryPanelModal","unlinkLibraryPanel","UnlinkModal","timeFromInterpolated","timeFromInfo","_isString","timeFromDate","timeShiftInterpolated","layoutMode","dataSourcesCount","dataSourceTypeSearchQuery","isLoadingDataSources","dataSourceMeta","dataSourceLoaded","dataSourcesLoaded","dataSourceMetaLoaded","dataSourcePluginsLoad","dataSourcePluginsLoaded","setDataSourcesSearchQuery","setDataSourcesLayoutMode","setDataSourceTypeSearchQuery","setDataSourceName","setIsDefault","initialDataSourceSettingsState","testingStatus","loadError","initDataSourceSettingsSucceeded","initDataSourceSettingsFailed","testDataSourceStarting","testDataSourceSucceeded","testDataSourceFailed","fixedColorOption","ColorDimensionEditor","defaultColor","isFixed","NumberInput","inputCorrected","corrected","currValue","onKeyPress","textOptions","TextDimensionMode","dummyFieldSettings","dummyStringSettings","TextDimensionEditor","onFieldChange","onFixedChange","cards","ResourceCards","defaultWidth","columnWidth","itemData","areEqual","sourceOptions","ResourcePicker","mediaType","ResourceFolderName","getFolders","currentFolder","setCurrentFolder","getFolderIfExists","directoryIndex","setDirectoryIndex","filteredIndex","setFilteredIndex","setSource","setNewValue","listFiles","getPublicOrAbsoluteUrl","shortName","iconContainer","iconPreview","cardsWrapper","resourceOptions","ResourceDimensionMode","ResourceDimensionEditor","openModal","showSourceRadio","resourceType","srcPath","placeholderValue","pointer","niceName","fixedValueOption","ScaleDimensionEditor","minMaxStep","validateScaleOptions","validateAndDoChange","validateScaleConfig","onMinChange","onMaxChange","hideRange","scalarOptions","ScalarDimensionMode","ScalarDimensionEditor","getColorDimension","isAssumed","getLastNotNullFieldValue","getColorDimensionForField","findField","getTextDimension","getTextDimensionForField","getScalarDimension","validated","getScalarDimensionForField","getResourceDimension","getScaledDimension","getScaledDimensionForField","scaled","ScaleDimensionMode","maxArea","PI","minArea","deltaArea","defaultTextConfig","getColorDimensionFromData","getScaleDimensionFromData","getResourceDimensionFromData","getTextDimensionFromData","findFieldIndex","updateDatasourceInstanceAction","changeDatasource","loadAndInitDatasource","currentDataSourceInstance","explore","importQueries","changeRefreshInterval","runQueries","datasourceReducer","graphResult","tableResult","logsVolumeDataProvider","logsVolumeData","createEmptyQueryResponse","queryKeys","datasourceMissing","changeSizeAction","initializeExploreAction","changeSize","changeGraphStyleAction","changeGraphStyle","graphStyle","storeGraphStyle","initializeExplore","datasourceNameOrUid","containerWidth","eventBridge","loadResult","updateTime","replaceUrl","richHistoryUpdatedAction","refreshExplore","newUrlQuery","itemState","newUrlState","urlDiff","getUrlStateFromPaneState","refreshQueries","getFiscalYearStartMonth","initialQueries","setQueriesAction","paneReducer","makeExplorePaneState","queryReducer","timeReducer","historyReducer","oldUrlState","historyUpdatedAction","updateRichHistory","updatedProperty","nextRichHistory","deleteRichHistory","syncTimesAction","localStorageFullAction","richHistoryLimitExceededAction","resetExploreAction","splitCloseAction","cleanupPaneAction","stateSave","urlStates","lastSavedUrl","splitOpen","leftState","ExploreId","rightUrlState","splitClose","itemId","navigateToExplore","openInNewWindow","initialExploreItemState","initialExploreState","syncedTimes","richHistoryLimitExceededWarningShown","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","cancelQueries","sourceDataSource","targetDataSource","importedQueries","nextQueries","modifyQueries","modification","modifier","preventSubmit","preserveCache","clearCache","exploreItemState","newQuerySub","cachedValue","getResultsFromCache","transaction","querySaved","loadingState","identity","nextHistory","selectedTimeRange","deepEqual","dataRange","canReuseLogsVolumeData","loadLogsVolumeData","setQueries","rawQueries","scanStart","addResultsToCache","createCacheKey","logsVolumeDataSubscription","nextQuery","processQueryResponse","isPaused","scanRange","CACHE_LIMIT","newCache","showLogs","showMetrics","showTable","showTrace","showNodeGraph","changeRangeAction","changeRefreshIntervalAction","absRange","actionRange","rangeInState","syncTimes","isTimeSynced","toRawTimeRange","GRAPH_STYLE_KEY","loadGraphStyle","pane","cacheIdx","getFieldLinksForExplore","splitOpenFn","getLinkSrv","getDataLinkUIModel","getTitleFromHref","useLinks","Resample","downsampler","downsamplingTypes","upsampler","upsamplingTypes","reducerFunctions","rt","eo","ef","Condition","onRemoveCondition","onEvaluateValueChange","newParams","buttonWidth","isRange","buttonSelectText","evalOperator","ea","conditionFunction","rf","evalFunction","buttonStyle","ClassicConditions","onConditionChange","defaultCondition","ExpressionQueryEditor","getDefaults","renderExpressionType","gelTypes","onSelectExpressionType","ExpressionDatasourceApi","getCollapsedText","module","author","screenshots","math","resample","classic","loadFolder","buildNavModel","saveFolder","deleteFolder","getFolderPermissions","loadFolderPermissions","setCanViewFolderPermissions","updateFolderPermission","removeFolderPermission","addFolderPermission","getLoadingNav","folderSlice","setFolderTitle","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","useDispatch","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","GrafanaLiveService","getConnectionState","centrifugeSrv","address","getPresence","promiseWithRemoteObservableAsObservable","promiseWithProxyObservable","remoteObservableAsObservable","remoteObs","subscriber","remoteSubPromise","comlink","nextValueInRemoteObs","remoteSub","CentrifugeServiceWorkerProxy","centrifugeWorker","observeOn","asyncScheduler","dataStreamSubscriberReadiness","random","initGrafanaLive","centrifugeServiceDeps","liveEnabled","CentrifugeService","hitTypes","validateNewDashboardName","validateNewFolderName","existingErrorMessage","nameLowerCased","hits","fetchGcomDashboard","fetchDashboard","setGcomDashboard","processInputs","processElements","fetchFailed","importDashboardJson","setJsonDashboard","__inputs","inputModel","InputType","setInputs","__elements","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","dashboardUid","task","DashboardSource","initialImportDashboardState","updatedAt","importDashboardSlice","Gcom","organizationSlice","organization","organizationLoaded","setOrganizationName","PanelPluginError","getPanelPluginLoadError","LoadError","getPanelPluginNotFound","silent","NotFound","defaultFieldConfig","onChangeTimeRange","externalFieldConfig","localFieldConfig","setFieldConfig","importPanelPlugin","useOptionDefaults","dataWithOverrides","useFieldOverrides","lfc","pluginIsLoading","PanelComponent","onFieldConfigChange","getFieldLinksSupplier","finalVars","getPanelLinksSupplier","timeRangeVars","seriesVars","buildLabelPath","getPanelLinksVariableSuggestions","getFieldVars","uniq","getDataFrameVars","getDataLinksVariableSuggestions","valueTimeVar","LinkSrv","onBuildUrl","getLinkUrl","getAnchorInfo","getPanelLinkAnchorInfo","initPanelState","pluginToLoad","loadPanelPlugin","panelModelAndPluginReady","changePanelPlugin","cleanUpKey","changeToLibraryPanel","newPluginId","oldType","clearLastResult","oldKey","panelsSlice","cleanUpAngularComponent","cleanUpPanelState","setPanelInstanceState","instanceState","setPanelAngularComponent","panelState","queryParamsToPreserve","locationUpdated","nextTimeoutId","numberOfLoops","startUrl","filteredParams","pickBy","nextDashboardUrl","validPlaylistUrl","stop","playlistId","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","byId","groupErrorsByPluginId","remotePlugin","mergeLocalAndRemote","localPlugin","popularity","downloads","typeCode","publishedAt","getPluginSignature","isInstalled","isCore","isDev","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","changes","install","isUpdating","invalidatePluginInCache","uninstall","panelPluginLoaded","pluginsAdapter","createEntityAdapter","isPendingRequest","isFulfilledRequest","isRejectedRequest","getOriginalActionType","requests","PluginListDisplayMode","isLoadingPluginDashboards","setDisplayMode","addCase","upsertMany","updateOne","addMatcher","RequestStatus","PluginAdminRoutes","PluginIconName","PluginStatus","PluginTabLabels","PluginTabIds","DatasourceSrv","settingsMapByName","defaultName","settingsMapByUid","settingsMapById","expressionDatasource","expressionInstanceSettings","getDataSourceSettingsByUid","isstring","nameOrUid","interpolatedName","variableInterpolation","loadDatasource","dsPlugin","importDataSourcePlugin","instantiate","anyInstance","getAll","dsVar","sorted","mixedInstanceSettings","dashboardInstanceSettings","grafanaInstanceSettings","getExternal","getAnnotationSources","getMetricSources","skipVariables","getDataSourceService","panelCache","getPanelPlugin","importPanelPluginFromMeta","importPluginModule","grafanaData","initializedAt","registerPluginInCache","encodeURI","locateWithCache","defaultBust","extractPath","tickStep","e10","e5","e2","step0","step1","getScaledDecimals","tickSize","getFlotTickSize","noTicks","maxDec","norm","getFlotRange","panelMin","panelMax","datamin","datamax","wideFactor","widen","getFlotTickDecimals","grafanaTimeFormat","logp","getPrecision","getStringPrecision","dotIndex","TextMode","defaultPanelOptions","Markdown","TextPanel","processContent","updateHTML","prepareHTML","interpolateAndSanitizeString","prepareMarkdown","HTML","TextPanelEditor","editorBox","oldTextPanel","AnnotationEditorForm","timeFormatter","clickAwayRef","createAnnotationState","createAnnotation","onAnnotationCreate","updateAnnotationState","onAnnotationUpdate","isUpdatingAnnotation","isRegionAnnotation","timeEnd","stateIndicator","editorForm","editorContainer","getCommonAnnotationStyles","markerTriangle","markerBar","AnnotationTooltip","avatar","editControls","alertText","isRegion","POPPER_CONFIG","AnnotationMarker","panelCtx","setIsEditing","markerRef","setMarkerRef","setTooltipRef","setEditorRef","popoverRenderTimeout","popper","usePopper","editorPopper","onAnnotationEdit","onAnnotationDelete","onPopoverMouseEnter","markerWrapper","attributes","AnnotationsPlugin","annotationsRef","views","clip","renderLine","setLineDash","closePath","annotationsView","mapAnnotationToXYCoords","renderMarker","markerStyle","ContextMenuPlugin","plotCanvas","setPoint","closeMenu","onMouseCapture","viewport","clientX","clientY","isClick","pts","pt","defaultItems","ContextMenuView","xFieldFmt","ExemplarMarker","getExemplarMarkerStyles","markerElement","setMarkerElement","popperElement","setPopperElement","popperStyles","exemplarsTable","valign","valueWrapper","viewBox","marble","activeMarble","symbols","getSymbol","bg","dark2","dark9","shadowColor","tableBgOdd","dark3","gray6","panelBg","ExemplarsPlugin","exemplars","mapExemplarToXYCoords","yScale","prepareGraphableFields","hasValueField","AnnotationEditor","popperTrigger","setPopperTrigger","editorPopover","setEditorPopover","overlayRange","AnnotationEditorPlugin","setBbox","isAddingAnnotation","setIsAddingAnnotation","annotating","setSelectHooks","mousedown","targ","mouseup","startAnnotating","ThresholdDragHandle","dragBounds","mapPositionToValue","outOfBounds","setCurrentValue","onStop","lastY","onDrag","bounds","handle","handleText","mainColor","arrowStyles","triangle","getArrowStyles","isOutOfBounds","ThresholdControlsPlugin","onThresholdsChange","thresholdHandles","handles","nextSteps","getThresholdColor","getFieldConfigFromOldAxis","validNumber","fillY2DynamicValues","y2","y1G","y2G","canEditThresholds","onSplitOpen","needsTimeField","needsNumberField","enableAnnotationCreation","aliasColors","hasFillBelowTo","seriesOverride","dashOverride","defaultGraphConfig","legendConfig","alignAsTable","enabledLegendValues","getReducersFromLegend","flotToGraphOptions","fr","migrateHideFrom","getGraphFieldConfig","commonOptionsBuilder","getSuggestionsForData","SuggestionName","cardOptions","previewModifier","TimelineChart","StateTimelineTooltip","datapointIdx","nextStateIdx","findNextStateIndex","nextStateTs","stateTs","toFragment","durationFragment","prepareTimelineFields","mergeValues","prepareTimelineLegendItems","renderCustomTooltip","valueFieldsCount","TimelineMode","valuemap","colorMaps","defaultTimelineFieldConfig","defaultStatusFieldConfig","colWidth","VizDisplayMode","CandleStyle","ColorStrategy","defaultColors","flat","CandlesVolume","candleStyle","Candles","colorStrategy","OpenClose","includeAllFields","candlestickFieldsInfo","volume","findFieldOrAuto","prepareCandlestickFields","aligned","enforceSort","timeSeriesFrames","used","autoOpenClose","Volume","modeOptions","candleStyles","OHLCBars","colorStrategies","CloseClose","numericFieldFilter","addFieldPicker","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","prevIdx","minDelta","stickWidth","outlineWidth","halfWidth","tPx","interDir","sign","intraDir","outerPath","vPx","hPx","lPx","oPx","cPx","btm","hgt","globalCompositeOperation","drawMarkers","createAnnotationToolip","eventManager","manager","editEvent","drop","openOn","hoverCloseDelay","tetherOptions","constraints","pin","attachment","markerElementToAttachTo","createEditPopover","editorOpen","editorOpened","editorClosed","DrawableEvent","drawFunc","clearFunc","moveFunc","_object","_drawFunc","_clearFunc","_moveFunc","_position","_width","_height","VisualEvent","drawableEvent","_options","_drawableEvent","_hidden","visual","getParent","_parent","isHidden","unhide","EventMarkers","_events","_types","_plot","eventsEnabled","getEvents","setTypes","setupEvents","partition","regions","ve","_buildDiv","vre","_buildRegDiv","ao","bo","drawEvents","insidePlot","_insidePlot","overlapPlot","_overlapPlot","updateEvents","getPlotOffset","getXAxes","p2c","_clearEvents","that","getPlaceholder","markerSize","markerShow","markerTooltip","eventTypeId","topOffset","eventSectionHeight","mouseenter","editModel","mouseleave","regionWidth","timeTo","xmin","xmax","regionStart","region","xc","point0","point1","coord0","coord1","coordMin","coordMax","hideEvents","showEvents","setEvents","processOptions","getSeriesFn","findHoverIndexFromDataPoints","posX","ps","pointsize","renderAndShow","absoluteTime","innerHtml","xMode","place_tt","getMultiSeriesPlotHoverInfo","lastValue","value_type","shared","detach","unhighlight","clearCrosshair","plotData","seriesHtml","tooltipFormat","allSeriesMode","pointOffset","setCrosshair","seriesHoverInfo","highlightClass","ThresholdManager","getHandleHtml","handleIndex","valueStr","initDragging","handleElem","parents","posTop","dragging","stopped","graphValue","c2p","$apply","cleanUp","needsCleanup","renderHandle","defaultHandleTopPos","handleTopPos","valueCanvasPos","toggleClass","shouldDrawHandles","hasSecondYAxis","editingThresholds","prepare","thresholdMargin","addFlotOptions","gtLimit","ltLimit","y2axis","colorModes","themeDependent","darkColor","lightColor","timeRegion","TimeRegionManager","timeRegions","tRange","hRange","fromStart","fromEnd","timeRegionColor","timeRegionsCopy","fromDayOfWeek","toDayOfWeek","parseTimeRange","dayOfWeek","isoWeekday","EventManager","addFlotEvents","$__alerting","$__ok","$__no_data","$__pending","$__editing","getRegions","colorString","addAlphaToRGB","addRegionMarking","convertToHistogramData","dataList","getSeriesValues","minBound","getBucketBound","maxBound","domain","histGenerator","bin","convertValuesToHistogram","alignYLevel","yAxes","checkCorrectAxes","yLeft","yRight","moveLevelToZero","expandStuckValues","oneSide","checkOneSide","checkOppositeSides","rate","checkTwoCross","rateLeft","rateRight","absLeftMin","absLeftMax","absRightMin","absRightMax","upLeft","downLeft","upRight","downRight","getRate","restoreLevelFromZero","LEGEND_STATS","LegendItem","renderLegendValues","asTable","legendValueItems","valueFormatted","LegendValue","onValueClick","seriesOptionClasses","valueItems","seriesLabel","LegendSeriesLabel","LegendSeriesIcon","GraphLegend","onToggleSeries","toggleSeriesExclusiveMode","sortLegend","_sortBy","optionalClass","sideWidth","seriesValuesProps","seriesHideProps","sortProps","legendClass","LegendTable","LegendSeriesList","statName","LegendTableHeaderItem","LegendWithThemeProvider","GraphElement","flotPosition","linksSupplier","contextMenu","contextMenuCtrl","thresholdManager","timeRegionManager","sortedSeries","onPanelTeardown","onGraphHover","onGraphHoverClear","legendElem","renderData","buildFlotPairs","graphHeight","renderPanel","legendOptions","legendReactElem","scrollContextElement","contextMenuSourceItem","getDataIndexWithNullValuesCorrection","hasLinksValue","fieldDisplay","setScrollContextElement","setMenuItemsSupplier","getContextMenuItemsSupplier","toggleMenu","correctIndex","shouldAbortRender","drawHook","dataWarning","actionText","processOffsetHook","gridMargin","panelOptions","processRangeHook","alignLevel","getMinTimeStepOfSeries","buildFlotOptions","prepareXAxis","configureYAxisOptions","sortSeries","callPlot","addXSeriesAxis","histMin","_min","histMax","_max","buckets","addXHistogramAxis","addXTableAxis","addTimeAxis","incrementRenderCounter","renderError","processOffset","processRange","stackpercent","percentage","translateFillOption","getFillGradient","haveSortBy","haveSortOrder","shouldSortBy","defaultTicks","tickValues","ticksNum","configureAxisMode","parseNumber","secondY","applyLogScale","minSetToZero","MIN_VALUE","inverseTransform","generateTicksForLogScaleYAxis","nextTick","maxNumTicks","numTicks","graphDirective","popoverSrv","restrict","template","SeriesOverridesCtrl","overrideMenu","currentOverrides","colorPickerModel","addOverrideOption","setOverride","subItem","addSeriesOverride","updateCurrentOverrides","openColorSelector","colorSelected","autoClose","removeOverride","getSeriesNames","ThresholdFormCtrl","$onInit","unbindDestroy","addThreshold","removeThreshold","onFillColorChange","onLineColorChange","onThresholdTypeChange","controller","bindToController","controllerAs","TimeRegionFormCtrl","editingTimeRegions","addTimeRegion","removeTimeRegion","annotationTooltipDirective","$sanitize","sanitizeString","titleStateClass","contents","EventEditorCtrl","tryEpochToMoment","timeFormated","$valid","crudFunction","getDashboardQueryRunner","DataProcessor","getSeriesList","toTimeSeries","isOutsideRange","setPanelDefaultsForNewXAxisMode","validateXAxisSeriesValue","getXAxisValueOptions","pluckDeep","propertyParts","AxesEditorCtrl","logScales","xAxisModes","Series","Histogram","xAxisStatOptions","setUnitFormat","xAxisModeChanged","onDataFramesReceived","xAxisValueChanged","axesEditorComponent","GraphContextMenuCtrl","menuItemsSupplier","GraphCtrl","hiddenSeriesTainted","panelDefaults","onDataSnapshotLoad","onInitEditMode","onInitPanelActions","fieldConfigUnit","subTabIndex","getDataWarning","annotationsFromDataFrames","tip","MIN_SAFE_INTEGER","getDataTimeRange","removeSeriesOverride","without","toggleLegend","legendValuesOptionChanged","migrateToReact","onPluginTypeChange","ScatterLineMode","defaultScatterConfig","categoryStyles","DimensionError","isGraphable","getSimpleFieldMatcher","getSimpleFieldNotMatcher","XYDimsEditor","frameNames","dims","NoData","BadFrameSelection","xIndex","getXYDimensions","numberFields","yFields","xName","sorter","prepScatter","ttip","yIndex","pointColorFixed","pointColorIndex","pointSizeConfig","pointSizeIndex","getScatterSeries","numericIndicies","prepSeries","pointColorMode","pointSizeHints","pointSizeFixed","pointSymbol","hints","scatterSeries","qt","hRect","drawBubbles","lft","wid","sidx","didx","scaleX","scaleY","valToPosX","valToPosY","xOff","yOff","xDim","yDim","arc","scatterInfo","showLine","deg360","xKey","yKey","pointHints","colorByValue","filtLft","filtRgt","filtBtm","filtTop","sizes","pointColors","pointAlpha","linePath","yVal","cy","strokeWidth","lineCap","dist","pointWithin","ocx","ocy","dx","dy","scatterIndex","Quadtree","_paths","asSingleValue","colorValues","colorAlphaValues","asArray","TooltipView","infoWrap","XYChartPanel2","scatterHoverCallback","initSeries","initFacets","Linear","LineStyleEditor","dashlistSectionHeader","dashlistSection","dashlistLink","dashlistStar","dashlistFolder","dashlistTitle","dashlistLinkBody","dashlistItem","IconToggle","toggleCheckbox","iconPropsOverride","iconProps","defaultChecked","checkBox","appearance","getFoldersWithEntries","extraFolders","searchHit","extra","filteredExtra","findOptionWithId","ALL_FOLDER","GENERAL_FOLDER","GENERAL_FOLDER_ID","GENERAL_FOLDER_TITLE","propsOnChange","setInitialized","setOption","setOptions","getFolderAsOption","getFoldersAsOptions","debouncePromise","setDashboards","replaceVars","starredDashboards","showStarred","maxItems","recentDashboards","showRecentlyViewed","searchedDashboards","showSearch","searched","dashMap","dashId","isRecent","isSearchResult","fetchDashboards","toggleDashboardStar","updatedDashboards","dashboardList","showHeadings","dashboardGroups","headings","UpdatePluginModal","pluginID","updateAllTip","inlineLogo","codeSmall","pluginList","sectionHeader","image","messageEnable","messageUpdate","messageNoUpdate","noneInstalled","emphasis","pluginState","core","isAdmin","defaultNavUrl","latestVersion","ShowOption","sortAlerts","Importance","TimeAsc","TimeDesc","alertName","AlphaDesc","getStateFilter","stateFilter","cardContainer","alertRuleList","alertRuleItem","alertRuleItemIcon","alertRuleItemText","alertRuleItemTime","alertRuleItemInfo","noAlertsMessage","alertIcon","AlertInstances","showInstances","displayInstances","setDisplayInstances","sortedAlerts","alertDuration","instanceDetails","getStateTagStyles","showIfCurrentState","showOptions","Current","alertList","setNoAlertsMessage","currentAlertState","dashboardQuery","dashboardAlerts","dashboardTag","currentAlerts","al","newStateDateAgo","execution_error","recentStateChanges","RecentChanges","currentDashboard","alertHistory","AlphaAsc","onlyAlertsOnDashboard","nameFilter","dashboardFilter","dashboardTags","filterObj","curFilter","unifiedAlertList","rulesDataSourceNames","clearInterval","promRulesRequests","haveResults","stateStyle","filteredRules","toLocaleLowerCase","filterRules","sortRules","rulesToDisplay","firstActiveAt","AnnotationListItemTags","onTagClicked","AnnotationListItem","onAvatarClick","onTagClick","showUser","showTags","showAvatar","showTimeStamp","showTimeStampEnd","TimeStamp","Avatar","AnnoListPanel","_timeOffset","navigateBefore","navigateAfter","navigateToPanel","queryTags","queryUser","onAnnoClick","onUserClick","doSearch","subs","onlyInTimeRange","onlyFromThisDashboard","hasFilter","onClearUser","renderTags","noneFound","truncate","getColorScale","colorScheme","colorInterpolator","d3ScaleChromatic","colorScaleInverted","invert","d3","scaleSequential","getOpacityScale","legendOpacityScale","colorScale","scaleLinear","scalePow","exponent","drawLegendValues","rangeFrom","rangeTo","legendWidth","valuesRange","childNodes","legendValueScale","tickStepSize","firstTick","getFirstCloseTick","isValueCloseTo","buildLegendTicks","axisBottom","colorRect","posY","svgElem","baseVal","getSvgElemHeight","getSvgElemX","attr","clearLegend","valueTo","attrs","colorSchemes","legendHeight","valuesNumber","rangeStep","selectAll","drawSimpleColorLegend","colorOptions","cardColor","drawSimpleOpacityLegend","cardStats","drawColorLegend","opacityScale","drawOpacityLegend","uiSegmentSrv","dataFormats","yBucketBoundModes","Upper","Lower","Middle","axesEditor","HeatmapDisplayEditorCtrl","heatmapDisplayEditor","sortSeriesByLabel","s1","s2","label1","label2","parseHistogramLabel","convertToCards","xBucket","yBucket","yBounds","convertToHeatMap","yBucketSize","xBucketSize","heatmap","bucketBound","pushToXBuckets","yBucketSplitFactor","getLogScaleBucketBounds","bucketNum","pushToYBuckets","convertToLogScaleValueBuckets","getBucketBounds","convertToValueBuckets","pointExt","getValueBucketBound","getLogScaleBucketBound","valueLog","powTop","additionalBucketSize","additionalLog","getDistance","HISTOGRAM_WIDTH","HeatmapTooltip","heatmapPanel","mouseOverBucket","originalFillColor","onMouseMove","xBucketIndex","yBucketIndex","getBucketIndexes","boundBottom","boundTop","yData","bucket","bucketIndex","countValueFormatter","bucketBoundFormatter","tooltipDecimals","tickValueFormatter","tooltipHtml","tsBuckets","valIndex","tsBucketsFormatted","yBucketBound","showHistogram","addHistogram","getXBucketIndex","getYBucketIndex","getSharedTooltipPos","xScale","histogramData","histXScale","barNumberFactor","histogramDomain","histYScale","pageYOffset","HeatmapRenderer","$heatmap","x2","dataRangeWidingFactor","drawSharedCrosshair","setElementHeight","getYAxisWidth","panelYAxisWidth","getPanelYAxisWidth","axisText","getBBox","getXAxisHeight","axisLinePosition","addXAxis","tickFormat","tickPadding","yAxisWidth","addYAxis","tickInterval","ticksUtils","heatmapStats","wideYAxisRange","decimalsAuto","tickSizeInner","tickSizeOuter","yWiding","addLogYAxis","adjustLogRange","minLog","adjustLogMin","adjustLogMax","logScaleTickValues","addYAxisFromBuckets","tickShift","domainMin","domainMax","tickValue","fixYAxisTickSize","addAxes","chartTop","chartBottom","dataFormat","xAxisHeight","addHeatmapCanvas","heatmapElem","cardPadding","cardRound","addHeatmap","yBuckets","emptyBucket","nullBucket","minBucket","newBucket","mergeZeroBuckets","cardsData","maxValueAuto","minValueAuto","setCardSize","getCardX","getCardWidth","getCardY","getCardHeight","getCardColor","getCardOpacity","highlightCard","resetCardHighLight","highlightColor","darker","strokeColor","brighter","currentCard","xGridSize","yGridSize","splitFactor","cardWidth","cardHeight","getEventOffset","elemOffset","mouseUpHandler","onMouseUp","one","selectionRange","limitSelection","drawSelection","getEventPos","drawCrosshair","emitGraphHoverEvent","posX1","posX2","selectionX","selectionWidth","reverseYBuckets","xBucketNumber","yBucketNumber","highlightCards","hideZeroBuckets","opacityScales","dsSupportHistogramSort","HeatmapCtrl","selectionActivated","onSnapshotLoad","onCardColorChange","unitFormats","convertHistogramToHeatmapData","convertTimeSeriesToHeatmapData","bucketsData","xBucketSizeByNumber","parseSeries","panelDatasource","getPanelDataSourceType","bound","histogramToHeatmap","calculateBucketSize","flotpairs","onDataError","parseHistogramSeries","rendering","getFormattedValue","TablePanel","matcherId","propId","panelModel","datasourceRef","applyFilterFromTable","renderTable","getFooterCells","showHeader","getCurrentFrameIndex","hasFields","inputHeight","selectWrapper","onChangeTableSelection","defaultPanelFieldConfig","transformsMap","timeseries_to_rows","timeseries_to_columns","timeseries_aggregations","columnsMap","colorModeMap","generateThresholds","migrateTableStyleToOverride","defaultTo","linkTooltip","linkTargetBlank","oldOpts","migrateTransformations","prevDefaults","migrateDefaults","transformers","timeSeriesFormatFilterer","tableDataFormatFilterer","filteredData","timeKey","noTableIndex","fromCharCode","maxDocs","z","tableCol","TablePanelEditorCtrl","fontSizes","addColumnSegment","newPlusButton","updateTransformHints","canSetColumns","columnsHelpMessage","getColumnOptions","dataRaw","segments","newSegment","plusButton","transformChanged","removeColumn","tablePanelEditor","ColumnOptionsCtrl","activeStyleIndex","columnTypes","alignTypes","alignTypesEnum","getColumnNames","addColumnStyle","stylesCount","indexToInsert","removeColumnStyle","invertColorOrder","addValueMap","removeValueMap","addRangeMap","removeRangeMap","columnOptionsTab","TableRenderer","initColumns","setTable","formatters","colorState","escapedPattern","createColumnFormatter","getColorForValue","defaultCellFormatter","setColorState","valueFormatter","numericValue","renderRowVariables","cellVariable","formatColumnValue","renderCell","addWidthHack","cellClasses","cellClass","columnHtml","preserveFormat","sanitizedCellLink","cellLinkTooltip","cellTarget","pageSize","startPos","endPos","cellHtml","rowClasses","rowClass","render_values","visibleColumns","newRow","TablePanelCtrl","annotationsSrv","panelHasRowColorMode","panelHasLinks","onDataReceived","migrateToPanel","getAnnotations","transformDataToTable","toggleColumnSort","pageCount","getTableHeight","panelElem","rootElem","tbodyElem","footerElem","appendTableRows","startPage","endPage","paginationList","activeClass","pageLinkElem","appendPaginationControls","filterData","cardStyle","completeGradient","darkThemeGradients","lightThemeGradients","borderGradient","iconStyle","blue95","cardContent","TutorialCard","handleTutorialClick","cardTitle","DocsCard","learnHref","learnUrl","Step","setup","step1TutorialTitle","keyPrefix","step1Key","step2Key","GettingStarted","checksDone","currentStep","subheading","check","checkedStepsPromises","checkedCardsPromises","checkedCards","checkedSteps","backForwardButtons","onPreviousClick","onForwardClick","headerLogo","PieChartType","PieChartLegendValues","PieChartLabels","useComponentInstanceId","idRef","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","arcs","highlightState","getHighlightState","api","PieSlice","PieLabel","tooltipTop","tooltipPortal","tooltipLeft","unstyled","applyPositionStyle","tooltipData","onMouseMoveOverArc","localPoint","ownerSVGElement","getTooltipData","pieStyle","getSvgStyle","labelRadius","labelX","labelY","startAngle","endAngle","cos","sin","getLabelPos","labelFontSize","textAnchor","Percent","pieArc","HighLightState","Highlighted","Deemphasized","Normal","svgArg","deemphasized","normal","defaultLegendOptions","getLegend","displayValues","valuesToShow","fractionOfTotal","percentOfTotal","setHighlightedTitle","setHighlightedSlice","resetHighlightedSlice","useSliceHighlightState","fd","hasFrames","legendType","Donut","addStandardDataReduceOptions","BarGaugePanel","addOrientationOption","defaultBarChartFieldConfig","groupDistr","SPACE_BETWEEN","barDistr","xOri","xDir","rawValue","showValue","isXHorizontal","hasAutoValueSize","pctStacked","hovered","groupWidth","barMark","barsPctLayout","barRects","vSpace","hSpace","barsBuilder","offs","barRect","LABEL_OFFSET_FACTOR","LABEL_OFFSET_MAX","xRange","pctOffset","distribute","di","lftPct","widPct","rn","xValues","xSplits","_dir","drawClear","groupCount","barCount","out","groupIdx","groupOffPct","groupDimPct","barIdx","barOffPct","barDimPct","distrOne","distrTwo","labelOffset","curAlign","curBaseline","middleShift","baseline","textBaseline","fillText","interpolateTooltip","updateActiveSeriesIdx","updateActiveDatapointIdx","updateTooltipPosition","xTickLabelRotation","xTickLabelMaxLength","vizOrientation","yOri","yDir","getBarCharScaleOrientation","shortenValue","rotateLabel","valueMaxLength","paddingBottom","getRotationPadding","legendOrdered","isLegendOrdered","firstFrame","firstString","resultFrame","BarChart","frame0Ref","valueIdx","orderedFields","prepareGraphableFrames","rotationAngle","needsStringField","countNumberFields","getListWithDefaults","isAscending","labelContainer","showCommonLabels","logsContainerRef","renderCommonLabels","DEFAULT_FEED_URL","PROXY_PREFIX","NewsPanel","loadChannel","feedUrl","useProxy","DOMParser","parseFromString","feed","getProperty","propNode","pubDate","imageNode","ogImage","getAttribute","loadRSSFeed","feedToDataFrame","news","isError","showImage","useWideLayout","itemWide","socialImage","socialImageWide","scopes","LiveChannelEditor","updateSelectOptions","dropWrap","onScopeChanged","onNamespaceChanged","findPathOption","onPathChanged","MessageDisplayMode","LivePanel","streamObserver","renderNotEnabled","renderMessage","renderPublish","onSaveJSON","onPublishClicked","statusClass","statusWrap","renderBody","halfHeight","brandPrimary","brandSuccess","brandWarning","brandDanger","Raw","DebugMode","EventBusLoggerPanel","eventObserver","RenderInfoViewer","dataChanged","schemaChanged","counters","shouldComponentUpdate","oldSeries","showCounters","lastRender","resetCounters","CursorView","DataHoverView","StateView","onInstanceStateChange","StateViewEditor","DebugPanel","Events","Cursor","State","ThrowError","Render","helpOptions","helpText","helpLinks","helpLink","memoizedGetNodeGraphDataFrames","getNodeGraphDataFrames","NodeGraph","getBucketSize","wantedMin","wantedMax","fullRangeMin","xAxisFormatter","incrs","minSpace","_space","bucketWidth","firstSplit","lastSplit","vis","originalDataHasHistogram","AlertGroup","expandAll","showAlerts","setShowAlerts","noGroupingText","startsAt","actionsRow","silencedBy","generatorURL","fingerprint","isAlertingEnabled","alertmanager","filteredResults","useFilteredGroups","fetchNotifications","hasResults","textPanel","timeseriesPanel","stateTimelinePanel","statusHistoryPanel","candlestickPanel","graphPanel","xyChartPanel","dashListPanel","pluginsListPanel","alertListPanel","annoListPanel","tablePanel","oldTablePanel","newsPanel","livePanel","statPanel","debugPanel","gettingStartedPanel","gaugePanel","pieChartPanel","barGaugePanel","barChartPanel","logsPanel","welcomeBanner","nodeGraph","histogramPanel","alertGroupsPanel","grafanaUI","grafanaUIraw","exposeToPlugin","grafanaRuntime","exports","locate","baseURL","defaultExtension","packages","esModule","authorization","jquery","rxjs","rxjsOperators","reactRouter","prismjs","slate","slateReact","slatePlain","reactDom","reactRedux","redux","emotion","__esModule","sdk","flotDeps","flotDep","fakeDep","builtInPlugins","importAppPlugin","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","hasTextEditMode","showingHelp","angularQueryEditor","getAngularQueryComponentScope","angularScope","renderAngularQueryEditor","getReactQueryEditor","toggleEditorMode","onRemoveQuery","onAddQuery","onToggleHelp","hideDisableQuery","hasEditorHelp","onToggleEditMode","renderExtraActions","onCopyQuery","onDisableQuery","renderHeaderExtras","renderCollapsedText","me","getQueryDataSourceIdentifier","dataSourceIdentifier","loadedDataSourceIdentifier","dataFilteredByRefId","filterPanelDataToQuery","notifyAngularQueryEditorsOfData","renderPluginEditor","DatasourceCheatsheet","renderActions","onClickExample","dedupAnnotations","dedup","eventsById","eventGroup","isPanelAlert","head","AlertStatesWorker","work","handleDashboardQueryRunnerWorkerError","LegacyAnnotationQueryRunner","canRun","handleAnnotationQueryRunnerError","AnnotationsQueryRunner","AnnotationsWorker","runners","getAnnotationsToProcessFilter","observables","handleDatasourceSrvError","runner","AnnotationQueryStarted","cancellations","translateQueryResult","finalize","AnnotationQueryFinished","mergeAll","UnifiedAlertStatesWorker","hasAlertRules","dashboard_uid","panelIdToAlertState","promAlertStateToAlertState","DashboardQueryRunnerImpl","workers","getResult","cancel","executeRun","ReplaySubject","runs","cancellationStream","runsSubscription","eventsSubscription","getAnnotationsByPanelId","workerObservables","resultSubscription","resultObservable","timerSubscription","timerObservable","dashboardQueryRunner","createDashboardQueryRunner","setDashboardQueryRunner","getAnnotationsFromSnapshot","notifyWithError","notification","getNextRequestId","dataConfigSource","subject","lastData","processedCount","lastConfigRev","fastCompare","snapshotPanelData","getTransformationsStream","processedData","sameStructure","processFields","isSharedDashboardQuery","pipeToSubject","runSharedRequest","getDataSource","lowerIntervalLimit","panelObservable","dashObservable","combineLatest","combined","dashData","cancelQuery","cancelNetworkRequestsOnUnsubscribe","setStructureRevision","processResponsePacket","packet","packets","dataItem","dataTopic","getRequestTimeRange","queryFunction","endTime","dataObservable","returnVal","callQueryMethod","eventData","datasourceType","dataSize","emitDataRequestEvent","STARTTIME","performance","processedDataFrames","annotationsProcessed","STOPTIME","timings","dataProcessingTime","layoutOptions","ActionRow","onLayoutChange","onSortChange","onStarredFilterChange","onTagFilterChange","showStarredFilter","hideLayout","rowContainer","checkboxWrapper","ConfirmDeleteModal","onDeleteItems","uids","getCheckedUids","folderCount","dashCount","dashEnding","folderEnding","manageDashboardsState","dashboardsSearchState","allChecked","manageDashboardsReducer","mergeReducers","searchReducer","TOGGLE_ALL_CHECKED","newAllChecked","TOGGLE_CHECKED","MOVE_ITEMS","db","DELETE_ITEMS","hasChecked","DashboardActions","actionUrl","ManageDashboards","isDeleteModalOpen","setIsDeleteModalOpen","isMoveModalOpen","setIsMoveModalOpen","queryParamsDefaults","onTagAdd","useSearchQuery","initialLoading","canMove","onToggleSection","onToggleChecked","onToggleAllChecked","onMoveItems","noFolders","useReducer","useSearch","somethingChecked","includesGeneralFolder","selectedDashboards","useManageDashboards","spinner","SearchResultsFilter","deleteItem","SearchResults","onTagSelected","MoveToFolderModal","setFolder","getCheckedDashboards","ending","SearchCheckbox","getIconFromMeta","metaIconMap","SearchItem","tagSelected","handleCheckboxClick","SEARCH_ITEM_HEIGHT","metaContainer","sortMetaName","sortMeta","SectionHeader","onSectionClick","getSectionHeaderStyles","setSectionExpanded","useLocalStorage","getSectionStorageKey","getSectionIcon","itemsFetching","sectionLabel","itemsLabel","getSectionStyles","itemProps","resultsContainer","listModeWrapper","disableWidth","innerElementType","SEARCH_ITEM_MARGIN","renderDashboards","noResults","showActions","NO_ID_SECTIONS","queryParsing","SEARCH_START","parsedQuery","getParsedQuery","FETCH_RESULTS","hasId","FETCH_ITEMS_START","FETCH_ITEMS","TOGGLE_SECTION","updateLocation","parseRouteParams","defaultQuery","ADD_TAG","QUERY_CHANGE","onClearFilters","CLEAR_FILTERS","defaultQueryParams","SET_TAGS","TOGGLE_STARRED","TOGGLE_SORT","LAYOUT_CHANGE","MOVE_SELECTION_UP","MOVE_SELECTION_DOWN","REMOVE_STARRED","REMOVE_TAG","selectedIndex","lookupField","getLookupField","flatIds","getFlattenedSections","newIndex","selectedId","markSelected","prevSort","findSelected","parseQuery","keywords","nextState","getCheckedDashboardsUids","emptyResults","cleanedParams","folderStr","teamsSlice","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","formatQueryParameter","runtimeDependencies","getFilteredVariables","getVariableWithName","srv","variableRegex","_variables","updateIndex","isNone","variableInitialized","getAdhocFilters","getAdHocVariables","variableUid","formatItem","setGrafanaVariable","grafanaVariables","setGlobalVariable","getVariableName","lastIndex","variableExists","getVariableAtIndex","highlightVariablesAsHtml","var1","var2","fmt2","var3","getAllValue","allValue","getFieldAccessor","fieldPath","fieldAccessorCache","getVariableValue","scopedVar","getVariableText","fmt3","getValueForUrl","systemValue","isAllValue","replaceWithText","invitees","searchPage","canInvite","externalUserMngInfo","externalUserMngLinkName","externalUserMngLinkUrl","usersSlice","usersLoaded","inviteesLoaded","setUsersSearchQuery","setUsersSearchPage","VariableSwitchField","useUniqueId","SelectionOptionsEditor","onMultiChanged","onMultiChangedProps","onIncludeAllChanged","onAllValueChanged","includeAll","StandardVariableQueryEditor","propsDatasource","propsQuery","LegacyVariableQueryEditor","updateQueryVariableOptions","hasOngoingTransaction","variableInState","removeVariableEditorError","errorProp","variableQueryObserver","responseSubscription","getVariableQueryRunner","getResponse","queueRequest","addVariableEditorError","changeQueryVariableDataSource","previousDatasource","extended","changeVariableEditorExtended","importDataSourcePluginFunc","hasCustomVariableSupport","hasDatasourceVariableSupport","hasStandardVariableSupport","hasLegacyVariableSupport","getVariableQueryEditor","flattenQuery","childProp","REFRESH_OPTIONS","QueryVariableRefreshSelect","SORT_OPTIONS","VariableSort","QueryVariableSortSelect","initQueryVariableEditor","changeQueryVariableQuery","hasSelfReferencingQuery","changeVariableMultiValue","QueryVariableEditorUnConnected","isLegacyQueryEditor","onLegacyQueryChange","isQueryEditor","onDataSourceChange","onRefreshChange","renderQueryEditor","onRegExChange","onRegExBlur","onSelectionOptionsChange","QueryVariableEditor","NavigationKey","VariableInput","clearOthers","navigateOptions","commitChangesToVariable","toggleOptionByHighlight","selectAndClose","moveDown","moveOptionsHighlight","moveUp","filterOrSearchOptions","queryValue","optionsPicker","updateSearchQuery","containsSearchFilter","searchForOptionsWithDebounce","updateOptionsAndFilter","currentPayload","mapToCurrent","searchQueryPayload","setCurrentVariableValue","hideOptions","getCurrentText","adapter","setVariable","openOptions","forceSelect","toggleOption","updateOptionsFromSearch","selectedValues","VariableOptions","handleEvent","onToggleAll","listStyles","renderMultiToggle","renderOption","selectClass","VariableLink","propsOnClick","VariableLinkText","textAndTags","optionPickerFactory","toggleAllOptions","OptionsPickerUnconnected","onVariableChange","onToggleMultiValueVariable","onToggleSingleValueVariable","onHideOptions","renderOptions","renderLink","linkText","onShowOptions","onToggleOption","OptionsPicker","createQueryVariableAdapter","initialQueryVariableModelState","queryVariableReducer","dependsOn","variableToTest","containsVariable","emitChanges","setOptionAsCurrent","setValueFromUrl","urlValue","setOptionFromUrl","initialCustomVariableModelState","initialVariableModelState","customVariableSlice","initialVariablesState","createCustomOptionsFromQuery","getInstanceState","textMatch","customVariableReducer","CustomVariableEditorUnconnected","VariableTextAreaField","CustomVariableEditor","createCustomVariableAdapter","validateVariableSelectionState","initialTextBoxVariableModelState","originalQuery","textBoxVariableSlice","createTextBoxOptions","textBoxVariableReducer","TextBoxVariablePicker","updatedValue","setUpdatedValue","updateVariable","TextBoxVariableEditor","createTextBoxVariableAdapter","stringUrlValue","ensureStringValues","setTextBoxVariableOptionsFromUrl","saveCurrentAsDefault","origQuery","beforeAdding","initialConstantVariableModelState","constantVariableSlice","createConstantOptionsFromQuery","constantVariableReducer","ConstantVariableEditor","createConstantVariableAdapter","initialDataSourceVariableModelState","dataSourceVariableSlice","createDataSourceOptions","dataSourceVariableReducer","DataSourceVariableEditorUnConnected","dataSourceTypes","foundItem","initDataSourceVariableEditor","typeOptions","typeValue","onDataSourceTypeChanged","DataSourceVariableEditor","createDataSourceVariableAdapter","updateDataSourceVariableOptions","initialIntervalVariableModelState","auto_count","auto_min","intervalVariableSlice","createIntervalOptions","intervalVariableReducer","IntervalVariableEditor","stepOptions","stepValue","onQueryChanged","onQueryBlur","onAutoChange","onAutoCountChanged","onAutoMinChanged","updateAutoValue","createIntervalVariableAdapter","addFilter","removeFilter","AdHocPickerUnconnected","AdHocFilter","AdHocPicker","initAdHocVariableEditor","changeVariableDatasource","AdHocVariableEditorUnConnected","onDatasourceChanged","AdHocVariableEditor","escapeDelimiter","unescapeDelimiter","toFilter","isFilter","createAdHocVariableAdapter","initialAdHocVariableModelState","adHocVariableReducer","urlParser","setFiltersFromUrl","getDefaultVariableAdapters","skipUrlSync","filterTableName","getVariableByOptions","createAdHocVariable","filterUpdated","variableUpdated","filterRemoved","filterAdded","filtersRestored","getTagKeys","AdHocFilterKey","filterKey","loadKeys","fetchFilterKeys","plusSegment","fetchFilterKeysWithRemove","REMOVE_FILTER_KEY","REMOVE_VALUE","OperatorSegment","AdHocFilterValue","placeHolder","fetchFilterValues","getTagValues","AdHocFilterRenderer","onKeyChange","onOperatorChange","AdHocFilterBuilder","appendBefore","onCompleted","setKey","setOperator","onKeyChanged","onOperatorChanged","onValueChanged","ConditionSegment","renderFilters","appendFilterToVariable","renderFilterSegments","adHocVariableSlice","LEGACY_VARIABLE_QUERY_EDITOR_NAME","sectionHeading","selectContainer","getLineCount","initialVariableEditorState","variableEditorReducerSlice","cleanEditorState","variableEditorReducer","withMulti","hasObjectProperty","hasCurrent","withProperty","metricFindQuery","variableSupport","toDataQuery","variableInspectReducerSlice","variableInspectReducer","variableRegexExec","validVariableNames","getPropsWithVariable","variableId","hasVariable","objectValues","newResult","unUsed","tree","unknowns","unknown","unknownVariables","unknownVariableNames","getUnknownVariableStrings","unknownVariable","createUnknownsNetwork","getAllAffectedPanelIdsForVariableChange","flattenedPanels","flattenPanels","affectedPanelIds","getAffectedPanelIdsForVariable","affectedPanelIdsForAllVariables","getDependenciesForVariable","affectedPanelIdsForDependency","repeatRegex","panelAsJson","repeatMatches","traverseTree","leafId","showGraph","countLeaves","applyStateChanges","cur","applyLimit","updateDefaultSelection","updateAllSelection","optionsPickerSlice","queryHasSearchFilter","nextIndex","optionsText","cleanPickerState","optionsPickerReducer","QueryRunners","LegacyQueryRunner","StandardQueryRunner","CustomQueryRunner","DatasourceQueryRunner","getRunnerForDatasource","getTarget","getEmptyMetricFindValueObservable","getLegacyQueryOptions","toMetricFindValues","firstValue","firstValueKey","areMetricFindValues","textIndex","stringIndex","expandableIndex","VariableQueryRunner","getTemplatedRegex","queryRunners","updateOptionsRequests","updateOptionsResults","cancelRequests","onNewRequest","getTemplatedRegexFunc","beforeUid","runnerArgs","getRequest","afterUid","templatedRegex","updateVariableOptions","updateOptionsState","validateVariableSelection","variableAsVars","searchFilterAsVars","setVariableQueryRunner","getAllMatches","metricNamesToVariableValues","variableRegEx","metricNames","valueGroup","textGroup","firstMatch","manyMatches","reverseSort","sortVariableValues","queryVariableSlice","NONE_VARIABLE_TEXT","NONE_VARIABLE_VALUE","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","fixSelectedInconsistency","isWaitingForDependencies","processVariable","otherVariable","processVariableDependencies","refreshableVariable","completeVariableLoading","getVariableRefresh","variableFromState","defaultText","foundOption","castArray","selectOptionsForCurrentValue","emitChangeEvents","TransactionStatus","upgradeLegacyQueries","v2","createGraph","getQueryWithVariables","variablesThatNeedRefresh","createVariableErrorNotification","previousOptions","updatedOptions","templateVarsChangedInUrl","isVariableUrlValueDifferentFromCurrent","removed","variableInModel","variableValue","queryParamsNew","initVariablesTransaction","variablesInitTransaction","orgModel","userModel","addSystemTemplateVariables","orderIndex","variableStateNotStarted","getDatasourceSrvFunc","migrateVariablesDatasourceNameToRef","variablesCompleteTransaction","cleanVariables","variablesClearTransaction","rethrow","variableStateFetching","variableStateFailed","variableStateCompleted","isDataQueryType","throwWhenMissing","getSubMenuVariables","sharedReducerSlice","lodashDefaults","variableStates","fromVariable","toVariable","sharedReducer","initialTransactionState","NotStarted","isDirty","transactionSlice","Fetching","Completed","actionAffectsDirtyState","transactionReducer","NEW_VARIABLE_ID","variablesReducer","globalVariables","allVariables","dontHide","variableString","getSearchFilterScopedVar","wildcardChar","__searchFilter","varMatch","queryVariable","getUrlValueForComparison","findTemplateVarChanges","preloadPlugin","echoLogger","echoLog","Echo","flushInterval","backends","flush","_meta","getMeta","_event","supportedEvents","userSignedIn","screenSize","windowSize","screen","userAgent","timeSinceNavigationStart","reportPerformance","PerformanceBackend","reduceTransformRegistryItem","onSelectMode","onToggleTime","onToggleLabels","FilterByNameTransformerEditor","isRegexValid","initOptions","configuredOptions","allNames","onInputBlur","onFieldToggle","filterFieldsByNameTransformRegistryItem","FilterByRefIdTransformerEditor","filterFramesByRefIdTransformRegistryItem","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","useAllFieldNamesFromDataFrames","OrganizeFieldsTransformerEditor","excludeByName","renameByName","orderedFieldNames","orderFieldNamesByIndex","onToggleVisibility","shouldExclude","startIndex","endIndex","reorderToIndex","onRenameField","DraggableFieldName","renamedFieldName","getFieldNameStyles","nameByIndex","organizeFieldsTransformRegistryItem","seriesToFieldsTransformerRegistryItem","onSelectField","byField","calculationModes","okTypes","CalculateFieldTransformerEditor","updateReduceOptions","updateBinaryOptions","extractAllNames","extractNamesAndSelected","renderReduceRow","onStatsChange","renderBinaryOperation","foundLeft","foundRight","leftNames","rightNames","ops","onBinaryLeftChanged","onBinaryOperationChanged","onBinaryRightChanged","onAliasChanged","onToggleReplaceFields","calculateFieldTransformRegistryItem","labelsToFieldsTransformerRegistryItem","labelNames","onToggleSelection","GroupByFieldConfiguration","onConfigChange","getStyling","rowSpacing","calculations","groupByTransformRegistryItem","sortByTransformRegistryItem","sorts","mergeTransformerRegistryItem","seriesToRowsTransformerRegistryItem","nameModes","ConcatenateTransformerEditor","onLabelChanged","concatenateTransformRegistryItem","RenameByRegexTransformerEditor","handleRegexChange","handleRegexBlur","handleRenameChange","handleRenameBlur","renameByRegexTransformRegistryItem","histogramTransformRegistryItem","onBucketSizeChanged","onBucketOffsetChanged","onToggleCombine","getFieldConfigFromFrame","evaluatedMappings","configValue","targetProperty","mappingValues","valueMap","mappingColors","mappingTexts","combineValueMappings","FieldConfigHandlerKey","configMapHandlers","Ignore","toNumericOrUndefined","defaultReducer","configMapHandlersIndex","lookUpConfigHandler","getConfigMapHandlersIndex","evaluteFieldMappings","withNameAndValue","nameFieldMappping","handlerKey","valueFieldMapping","nameField","automatic","rowsToFieldsTransformer","outFields","getLabelsFromRow","rowsToFields","fieldMapping","FieldToConfigMappingEditor","withReducers","configHandlerToSelectOption","configOption","findConfigHandlerFor","missingInFrame","getViewModelRows","configProps","labelCell","selectCell","existingIdx","onChangeConfigProperty","onChangeReducer","isAutomatic","rowsToFieldsTransformRegistryItem","configFromDataTransformer","configRefId","configFrame","reducedConfigFrame","newField","applyTo","outputFrame","dataConfig","extractConfigFromQuery","configFromQueryTransformRegistryItem","currentRefId","currentMatcher","matcherUI","matcherOption","timeSeriesFormat","toTimeSeriesMany","toTimeSeriesLong","valueFields","labelFields","uniqueValueNames","uniqueValueNamesToType","uniqueLabelKeys","labelKeyToWideIndices","uniqueFactorNamesToWideIndex","tKey","wideIndices","sortedTimeRowIndices","sortedUniqueLabelKeys","uniqueFactorNames","uniqueFactorNamesWithWideIndices","wideRowIndex","labelKeys","longFrame","timeWideRowIndex","rowValues","wideFieldIndex","wideField","prepareTimeSeriesTransformer","TimeSeriesWide","TimeSeriesMany","TimeSeriesLong","prepareTimeseriesTransformerRegistryItem","onSelectFormat","fieldNamePickerSettings","convertFieldTypeTransformRegistryItem","onSelectDestinationType","onInputFormat","onAddConvertFieldType","onRemoveConvertFieldType","fieldLookupTransformer","fieldMatches","gaz","getGazetteer","gazetteer","COUNTRIES_GAZETTEER_PATH","lat","lon","foundMatchingValue","addFieldsFromGazetteer","doGazetteerXform","fieldLookupSettings","fieldLookupTransformRegistryItem","onPickLookupField","onPickGazetteer","GazetteerPathEditor","FieldExtractorID","extJSON","stripDecor","splitLines","splitPair","fmts","KeyValues","pair","extAuto","fieldExtractors","extractFieldsTransformer","addExtractedFields","extractFieldsTransformRegistryItem","getStandardTransformers","CustomEndpointTransport","_buffer","PromiseBuffer","maxConcurrentRequests","sendEvent","_disabledUntil","reason","sentryReq","exception","Severity","fmtSentryErrorValue","breadcrumb","makeTimestamp","referrerPolicy","supportsReferrerPolicy","fetchParameters","isReady","SyncPromise","retryAfterHeader","parseRetryAfterHeader","EchoSrvTransport","BaseTransport","SentryEchoBackend","transports","FetchTransport","sentryOptions","release","environment","transport","ignoreErrors","sentrySetUser","initSentry","rootReducers","sharedReducers","alertingReducers","teamsReducers","apiKeysReducers","foldersReducers","dashboardReducers","exploreReducers","dataSourcesReducers","usersReducers","userReducers","organizationReducers","ldapReducers","templatingReducers","importDashboardReducers","panelEditorReducers","panelsReducers","pluginsReducer","addedReducers","createRootReducer","appReducer","stateSelector","stateSlice","recursiveCleanState","stateKey","LdapConnectionStatus","ldapConnectionInfo","serverInfo","available","LdapErrorBox","connectionErrors","errorElements","LdapSyncInfo","isSyncing","ldapSyncInfo","nextSyncTime","nextSync","handleSyncClick","schedule","LdapUserMappingInfo","showAttributeMapping","ldapValue","cfgAttrValue","LdapUserPermissions","LdapUserGroups","groupDN","LdapUserTeams","teamName","LdapUserInfo","ldapUser","LdapPage","fetchUserMapping","fetchLDAPStatus","canReadLDAPUser","onClearUserError","UserProfile","onUserUpdate","onUserDelete","onUserDisable","onUserEnable","onPasswordChange","showDeleteModal","setShowDeleteModal","showDisableModal","setShowDisableModal","deleteUserRef","showDeleteUserModal","disableUserRef","showDisableUserModal","authSource","authLabels","lockMessage","editLocked","isExternal","passwordChangeLocked","canDisable","canEnable","UserProfileRow","locked","inputType","buttonRow","inputElem","focusInput","LockedRow","setInputElem","onCancelClick","lockMessageClass","adminOptions","UserPermissions","onGrafanaAdminChange","currentAdminOption","setCurrentAdminOption","canChangePermissions","UserSessions","showLogoutModal","forceAllLogoutButton","onSessionRevoke","onAllSessionsRevoke","logoutFromAllDevicesClass","canLogout","showLogoutConfirmationModal","dismissLogoutConfirmationModal","UserLdapSyncInfo","onUserSync","debugLDAPMappingURL","canSyncLDAPUser","OrgPicker","getElementById","orgOptionsState","getOrgOptions","org","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","onOrgRoleSave","getAddToOrgModalStyles","selectedOrg","onOrgSelect","onAddUserToOrg","getChangeOrgButtonTheme","getTooltipStyles","UserAdminPage","isLDAPUser","canReadSessions","UserSignup","verifyEmailEnabled","getServiceStyles","divider","LoginDivider","getButtonStyleFor","LoginServiceButtons","enabledServices","oauthEnabled","saml","google","azuread","github","gitlab","grafanacom","hrefName","okta","oauth","loginServices","hasServices","forgottenPasswordStyles","LoginPage","LoadingChunkPlaceHolder","useUrlParams","useLocation","ErrorLoadingChunk","updateUrlParams","chunkNotFound","loadComponentHandler","pastDelay","SafeDynamicImport","Loadable","ErrorPage","flex","DEFAULT_ROUTES","routeName","ADMIN_ROUTES","liveRoutes","getLiveRoutes","featureToggles","commonRoutes","legacyRoutes","unifiedRoutes","pageClass","getAlertingRoutes","unifiedAlertingEnabled","alertingEnabled","extraRoutes","SEARCH_ITEM_ID","enrichConfigItems","toggleOrgSwitcher","onOpenShortcuts","profileNode","bottomNavItem","showOrgSwitcher","forcedLoginUrl","getForcedLoginUrl","isMatchOrChildMatch","itemToCheck","searchItem","stripQueryParams","isBetterMatch","newMatch","currentMatch","currentMatchUrl","newMatchUrl","getActiveItem","currentBestMatch","dashboardLinkMatch","linkPathname","isSearchActive","OrgSwitcher","setWindowLocation","getUserOrgs","currentOrgId","setCurrentOrg","NavBarMenuItem","styleOverrides","linkContent","externalLinkIcon","headerTarget","headerText","headerUrl","onHeaderClick","reverseDirection","subtitleText","filteredItems","hideFromMenu","adjustHeightForBorder","menuSubTitle","reverseMenuDirection","showMenu","NavBarSection","newNavigationEnabled","NavBarMenu","navItems","childLink","childIndex","homeUrl","NavBar","showSwitcherModal","setShowSwitcherModal","toggleSwitcherModal","topItems","bottomItems","mobileMenuOpen","setMobileMenuOpen","mobileSidemenuLogo","grafanaLogo","NavBarNext","coreItems","pluginItems","configItems","menuOpen","setMenuOpen","GrafanaRoute","updateBodyClassNames","cleanupDOM","getPageClasses","cls","tooltipById","tooltipsByClass","RouteComponent","AppNotificationItem","onClearNotification","AppNotificationListUnConnected","onClearAppNotification","AppNotificationList","getSearchFieldStyles","clearButton","SearchField","DashboardSearch","onCloseSearch","useDashboardSearch","searchField","closeBtn","SearchWrapper","LiveConnectionWarning","foot","AngularRoot","bodyRenderHooks","pageBanners","AppWrapper","exact","ngInjector","bootstrapNgApp","angularApp","bootstrap","renderRoutes","DashboardRoutes","renderRoute","Banner","Hook","interceptLinkClicks","tagName","parentNode","getParentAnchor","defaultPrevented","QueryRunner","monacoPath","scripts","loadKusto","parallelScripts","allPromises","loadScript","script","scriptEl","__monacoKustoResolvePromise","getDefaultMonacoLanguages","GAEchoBackend","dataType","googleAnalyticsId","ApplicationInsightsBackend","applicationInsights","trackPageView","trackEvent","applicationInsightsOpts","connectionString","endpointUrl","Microsoft","ApplicationInsights","loadAppInsights","RudderstackBackend","rudderanalytics","track","rds","methods","methodName","writeKey","dataPlaneUrl","identify","getDashboards","DashboardPicker","onPicked","getAllOptionEditors","dashboardPicker","getMessageFor","columnGap","rowGap","$document","transclude","panelScrollbar","updateDimensionsFromParentScope","__proto__","scrollable","scrollRootClass","scrollerClass","scrollBarHTML","scrollRoot","scroller","baron","barOnCls","scrollingCls","fromAngular","PanelDirectiveReadyEvent","directiveModule","directiveCache","panelEditorTab","dynamicDirectiveSrv","directive","QueryRowCtrl","queryCtrl","canCollapse","interpolateTemplateVars","filterFunc","$stateful","isNull","AlertSrv","DynamicDirectiveSrv","addDirective","directiveInfo","registered","$normalize","watchPath","childScope","getReactComponent","reactComponent","namePart","applyFunctions","propsConfig","wrapApply","wrappedInApply","wrapped","applied","watchProps","watchDepth","watchExpressions","supportsWatchCollection","$watchCollection","supportsWatchGroup","$watchGroup","watchGroupExpressions","actualExpr","exprWatchDepth","getPropWatchDepth","renderComponent","getPropConfig","findAttribute","kebabCase","defaultWatch","ngModule","$sce","MetricSegment","trustAsHtml","fake","selectMode","getSegmentForValue","fallbackText","newSelectMeasurement","newFake","newKeyValue","newCondition","newOperator","newOperators","transformToSegments","addTemplateVars","variableTypeFilter","newSelectMetric","openDrop","contentElement","tether","renderMyComponent","$eval","onScopeDestroy","unmountComponent","reactComponentName","conf","injectableProps","getPropName","propExpressions","propTypes","Timer","timers","cancelAll","AngularLoader","compiledElem","dropdownTypeahead","dropdownTypeaheadOnSelect","$input","$button","ngModel","typeaheadValues","subIndex","menuItemSelected","$item","$subItem","removeClass","minLength","updater","keyup","dropdownTypeahead2","buttonTemplateClass","timeoutId","closeDropdownMenu","autofillEventFix","dispatchChangeEvent","Event","dispatchEvent","onAnimationStart","animationName","metricSegment","cancelBlur","linkMode","debounceLookup","updateVariableValue","altSegments","switchToLink","fromClick","inputBlur","$query","unescape","keydown","metricSegmentModel","pre","cachedOptions","valueToSegment","getOptionsInternal","onSegmentChange","$$postDigest","_t","replaceWith","editorOptBool","ngchange","editorCheckbox","$interpolate","$id","gfDropdown","$parse","buildTemplate","ul","li","iElement","iAttrs","insertAfter","onchange","priority","elm","ngModelCtrl","$setViewValue","$parsers","viewValue","$validators","modelValue","$isEmpty","rebuildOnChange","$animate","multiElement","terminal","previousElements","endNode","blockNodes","nextSibling","getBlockNodes","showNull","newScope","createComment","tagColorFromName","getItemProperty","onTagsUpdated","tagsinput","typeaheadSource","itemvalue","itemText","itemtext","tagClass","tagclass","tagElement","giveFocus","domEl","setSelectionRange","DeltaCtrl","MutationObserver","attributeFilter","characterData","childList","subtree","$onDestroy","LinkJSONCtrl","$anchorScroll","goToLine","switchView","react2AngularDirective","reactDirective","$formatters","DefaultTarget","editorMode","EditorMode","projectName","projects","metricType","metricKind","MetricKind","valueType","variableOptionGroup","variableOptions","AnnotationQueryEditor","getLabels","getDefaultProject","getProjects","templateVariableOptions","onMetricTypeChange","regionIsLoading","useRegions","EditorHeader","InlineSelect","Space","MetricStatEditor","disableExpressions","editorQuery","EditorRow","EditorField","period","prefixMatching","actionPrefix","alarmNamePrefix","MetricSelect","useSelectedOption","LokiAnnotationsQueryEditor","maxLines","instant","queryWithRefId","LokiQueryField","ExtraFieldElement","LokiOptionFields","lineLimitValue","queryPartEditorDirective","partDef","$paramsContainer","clickFuncParam","paramIndex","$link","$event","inputKeyPress","which","inputKeyDown","addElementsAndCompile","param","$paramLink","keypress","dynamicOptions","addTypeahead","partActions","showActionsMenu","triggerPartAction","typeaheadMatcher","FormDropdownCtrl","inputElement","linkElement","labelMode","lookupText","modelChanged","cssClasses","typeaheadUpdater","startOpen","isPromiseLike","updateDisplay","optionCache","optionTexts","allowCustom","updateValue","$option","grafanaScrollbar","scrollParams","startExpanded","expansionLevel","jsonObject","SwitchCtrl","dropOptions","hoverOpenDelay","$applyAsync","langMode","showGutter","behavioursEnabled","snippetsEnabled","aceElem","ace","codeEditor","edit","editorSession","getSession","editorOptions","highlightActiveLine","showPrintMargin","autoScrollEditorIntoView","$blockScrolling","setScrollMargin","setThemeMode","lang","acequire","enableBasicAutocompletion","enableLiveAutocompletion","enableSnippets","getCompleter","anyEditor","completers","aceModeName","setLangMode","setEditorContent","codeEditorFocus","editorValue","bindKey","win","mac","sqlPartEditorDirective","suggestUrl","noDirectAccess","showAccessOption","datasourceSetting","pluginDirectiveLoader","$http","$templateCache","relativeTemplateUrlToAbs","loadPanelComponentInfo","componentInfo","bindings","class","panelPlugin","templatePromise","cached","getTemplate","registerPluginComponent","directiveName","getPluginComponentDirective","$broadcast","appendAndCompile","dsMeta","datasourceMeta","angularUrl","onModelChanged","appPlugin","appModel","appEditCtrl","getModule","GrafanaCtrl","utilSrv","angularLoader","onAppEvent","localScope","callerScope","$emit","lastActivity","activeUser","userActivityDetected","mousemove","capture","passive","hasClass","clickAutoHide","clickAutoHideParent","RouteProvider","$get","RouteParamsProvider","initAngularRoutingBridge","$provide","decorator","$delegate","AnnotationsSrv","clearPromiseCaches","getAlertStates","getGlobalAnnotations","saveAnnotationEvent","updateAnnotationEvent","deleteAnnotationEvent","UtilSrv","$modal","ShowModalEvent","HideModalEvent","modalScope","modalClass","templateHtml","keyboard","modalEl","AngularApp","preBootModules","ngModuleDependencies","registerFunctions","$controllerProvider","$compileProvider","$filterProvider","$httpProvider","debugInfoEnabled","useApplyAsync","useModule","CloudMonitoringQueryEditor","CloudMonitoringAnnotationQueryEditor","CloudWatchAnnotationQueryEditor","animation","oldInvoke","locals","serviceName","parentScope","isAppConfigCtrl","monkeyPatchInjectorWithPreAssignedBindings","AngularModalProxy","ModalManager","reactModalNode","reactModalRoot","showConfirmModal","showModalReact","onReactModalDismiss","altActionText","onAltAction","noText","text2htmlBind","extensionsIndex","extensionsExports","loadMetricName","getEntriesByType","mark","paintMetrics","loadMetric","getEntriesByName","initEchoSrv","addExtensionReducers","reduxConfigureStore","middleware","getDefaultMiddleware","thunk","serializableCheck","immutableCheck","devTools","preloadedState","setStore","configureStore","pluginsToPreload","preloadPlugins","__grafana_load_failed","public_cdn_path","__webpack_public_path__","nonce","__webpack_nonce__","__grafana_app_bundle_loaded","SilenceState","MQLQueryEditor","defaultState","crossSeriesReducer","alignmentPeriod","perSeriesAligner","AlignmentTypes","groupBys","aliasBy","preprocessor","PreprocessorType","Editor","customMetaData","metricQuery","ValueTypes","getAlignmentPickerData","MetricQueryEditor","QueryType","ensureGCEDefaultProject","sloQuery","defaultSLOQuery","fillComponent","SELECT_WIDTH","QUERY_TYPES","Service","setServices","getSLOServices","serviceId","sloId","SLO","slos","setSLOs","getServiceLevelObjectives","sloIds","sloName","slo","goal","Selector","SELECTORS","selectorName","SLOQueryEditor","selectWidth","Project","setProjects","projectsWithTemplateVariables","Metrics","metricDescriptors","getSelectedMetricDescriptor","getMetricTypes","getServicesList","selectedMetricDescriptor","getMetricsList","metricDescriptor","loadMetricDescriptors","serviceShortName","QueryEditorField","LABEL_WIDTH","INNER_LABEL_WIDTH","GroupBy","labelsToGroupedOptions","SYSTEM_LABELS","INPUT_WIDTH","Aggregation","Alignment","AlignmentPeriodLabel","AlignmentFunction","AlignmentPeriod","FilterButton","OperatorButton","LabelFilter","filterArray","stringArrayToFilters","filtersToStringArray","strArr","AddFilter","noFillEnd","opp","AnnotationsHelp","psa","alignOptions","ALIGNMENT_PERIODS","ap","visibleOptions","formatAlignmentText","alignment","ALIGNMENTS","AliasBy","setAlias","propagateOnChange","aggOptions","useAggregationOptionsByMetric","useSelectedFromOptions","getAggregationOptionsByMetric","VariableQueryField","Preprocessor","VisualMetricQueryEditor","NONE_OPTION","useOptions","AuthType","valueTypes","metricKinds","AGGREGATIONS","extractServicesFromMetricDescriptors","getMetricTypesByService","interpolatedMetricType","selectedService","metricTypes","metricTypeExistInArray","metricTypeByService","selectedMetricType","getAlignmentOptionsByMetric","metricValueType","getLabelKeys","authTypes","JWT","GCE","MetricFindQueryTypes","JSURL","encodeUrl","TRIGGER_SUGGEST","extensions","mimetypes","SELECT","FROM","WHERE","GROUP","ORDER","DESC","ASC","LIMIT","WITH","KEYWORDS","STATISTICS","AND","LOGICAL_OPERATORS","EQUALS","NOT_EQUALS","COMPARISON_OPERATORS","defaultToken","tokenPostfix","ignoreCase","brackets","builtinFunctions","tokenizer","cases","whitespace","numbers","string_double","complexIdentifiers","bracketedIdentifier","quotedIdentifier","lineComment","blockComment","autoClosingPairs","surroundingPairs","byRE","groupsRE","getStatsGroups","containerClass","CloudWatchLogsQueryField","selectedLogGroups","logGroupNames","logGroup","availableLogGroups","invalidLogGroups","selectedRegion","loadingLogGroups","hint","logGroupNamePrefix","describeLogGroups","errMessage","fetchLogGroupOptions","matchingLogGroups","unionBy","onLogGroupSearch","logGroups","logGroupName","statsGroups","customLogGroup","setSelectedLogGroups","intersectionBy","languageProvider","cloudwatchLanguageProvider","cloudwatch","showError","setSelectedRegion","setCustomLogGroups","onOpenLogGroupMenu","onLogGroupSearchDebounced","onChangeQuery","onQueryFieldClick","fix","CloudWatchLink","panelDataNew","panelDataOld","getExternalLink","urlProps","timeType","editorString","isLiveTail","getActualRegion","CloudWatchLogsQueryEditor","absolute","queryMode","metricName","useNamespaces","useMetrics","dimensionKeys","useDimensionKeys","EditorRows","EditorFieldGroup","standardStatistics","appendTemplateVariables","matchExact","flexShrink","apiModes","metricEditorModes","editorModes","sqlCodeEditorIsDirty","setShowConfirm","onEditorModeChange","newMetricEditorMode","commonProps","pick","normalizeQuery","sqlExpression","normalizedQuery","MetricsQueryEditor","metricsQuery","isMetricsQuery","sql","Logs","PanelQueryEditor","apiMode","LogsQueryEditor","Stack","Fragment","newItems","onChangeItem","onDeleteItem","borderTopRightRadius","borderBottomRightRadius","borderTopLeftRadius","borderBottomLeftRadius","wildcardOption","FilterItem","dimensionsExcludingCurrentKey","currentKey","excludeCurrentKey","getDimensionValues","getOperatorStyles","Dimensions","dimensionFilters","dimensionsToFilterConditions","setItems","newDimensions","makeRenderFilter","QueryInlineField","Alias","QueryEditorPropertyType","QueryEditorExpressionType","getMetricNameFromExpression","selectExpression","getNamespaceFromExpression","fromExpression","sanitizeOperator","Operator","flattenOperatorExpressions","expressions","And","Or","getFlattenedFilters","where","getFlattenedGroupBys","setSql","setAggregation","OPERATORS","filtersFromQuery","setFilters","validExpressions","operatorExpression","setOperatorExpressionValue","makeRenderItem","GroupByItem","groupBysFromQuery","baseOptions","completeExpressions","schemaLabels","getSchemaLabels","withSchemaEnabled","namespaceOptions","metricOptions","existingFilters","unusedDimensionKeys","namespaceParam","FunctionParameter","setNamespace","HTMLInputElement","withSchema","setWithSchema","setSchemaLabels","setMetricName","SQLGenerator","expressionToSqlQuery","orderByDirection","appendSelect","appendFrom","appendWhere","appendGroupBy","appendOrderBy","appendLimit","appendFunction","isTopLevelExpression","topLevelExpressionsCount","hasChildExpressions","andParts","exp","andCombined","wrapInParentheses","appendOperator","orParts","orCombined","groupByParts","interpolated","orderByDirections","setOrderBy","SQLBuilderEditor","fullQuery","sqlPreview","setSQLPreview","MathExpressionQueryField","SQLCodeEditor","sqlCompletionItemProvider","setRegion","onEditorMount","onDidFocusEditorText","Shift","Enter","getLanguages","monarch","setMonarchTokensProvider","setLanguageConfiguration","getCompletionProvider","registerLanguage","childInputId","labelEl","labelProp","regionsIsLoading","setRegionsIsLoading","setRegions","setNamespaces","getNamespaces","setMetrics","getMetrics","dimensionFilter","setDimensionKeys","useDeepCompareEffect","getDimensionKeys","QUERY_COMMANDS","NUMERIC_OPERATORS","STRING_FUNCTIONS","DATETIME_FUNCTIONS","IP_FUNCTIONS","BOOLEAN_FUNCTIONS","AGGREGATION_FUNCTIONS_STATS","STATS_FUNCS","FIELD_AND_FILTER_FUNCTIONS","FUNCTIONS","greedy","backticks","command","function","keyword","lookbehind","punctuation","CloudWatchLogsQueryStatus","isCloudWatchLogsQuery","cloudwatchQuery","SHARED_DASHBOARD_QUERY","listenToPanelId","getPanelIdFromQuery","getQueryError","listenToPanel","listenToRunner","modified","DashboardQueryRow","editURL","queryEditorRowHeader","logo","DashboardQueryEditor","getQuery","onRunQueries","defaultDatasource","dsname","updateState","defaultDS","mainDS","qData","queryData","renderQueryData","getPanelDescription","onPanelChanged","locationMetadata","supportsLogs","logsSupportedLocationsKusto","locationDisplayNames","resourceTypeMetadata","logsSupportedResourceTypesKusto","resourceTypeDisplayNames","Deferred","monacoPromiseRef","azureLogAnalytics","resource","azureLogAnalyticsDatasource","getKustoSchema","kusto","getKustoWorker","setSchema","handleEditorMount","setKustoQuery","FORMAT_OPTIONS","setFormatAs","resultFormat","tableLayout","tableScroller","borderBottomColor","disabledRow","collapseButton","loadingCell","nestedEntry","entryContentItem","truncated","NestedRows","selectedRows","requestNestedRows","onRowSelectedChange","NestedRow","initialOpenStatus","ResourceRowType","rowStatus","setRowStatus","selectedRow","findRow","NestedEntry","onToggleCollapse","onSelectedChange","typeLabel","EntryIcon","hasChildren","isSelectable","handleToggleCollapse","handleSelectedChanged","checkboxId","resourcePickerData","resourceURI","templateVariables","azureRows","setAzureRows","internalSelected","setInternalSelected","templateVariableRow","transformVariablesToRow","selectedResourceRows","resourceGroup","ResourcePickerData","resources","getResourcesForResourceGroup","newRows","addResources","handleSelectionChanged","getResourcePickerData","initalRows","parsedURI","parseResourceURI","resourceGroupURI","subscriptionID","resourceGroupRow","handleApply","loadingWrapper","selectionFooter","parseResourceDetails","subscriptionName","resourceGroupName","resourceName","ResourceLabel","resourceComponents","setResourceComponents","getResourceURIDisplayProperties","FormattedResource","Separator","pickerIsOpen","setPickerIsOpen","handleOpenPicker","closePicker","setResource","useMigrations","migrationError","setMigrationError","workspace","isGUIDish","getResourceURIFromWorkspace","migrateWorkspaceQueryToResourceQuery","subscriptionId","setError","hideFormatAs","kustoQuery","formatAs","setSubscriptionID","azureMonitor","metricDefinition","metricNamespace","timeGrain","setResourceGroup","setResourceType","setResourceName","setMetricNamespace","setTimeGrain","setDimensionFilters","appendDimensionFilter","removeDimensionFilter","indexToRemove","newFilters","setDimensionFilterValue","setTop","setLegendAlias","AzureQueryType","onSubscriptionsChange","findOptions","metricNamespaces","optionValues","resourceTypes","resourceGroups","resourceNames","aggregationOptions","timeGrainOptions","timeGrains","autoInterval","TimegrainConverter","dimensionOptions","filterIndex","onFilterInputChange","useAsyncState","asyncFn","errorSource","finalValue","useSubscriptions","defaultSubscription","azureMonitorDatasource","defaultSubscriptionId","subscriptionOptions","formatOptions","getSubscriptions","hasOption","defaultSub","updateSubscriptions","rawResults","metricsMetadata","metricMetadata","setMetricMetadata","supportedAggTypes","primaryAggType","getMetricMetadata","supportedTimeGrains","newAggregation","newTimeGrain","useMetricMetadata","getResourceGroups","useResourceGroups","getMetricDefinitions","useResourceTypes","getResourceNames","useResourceNames","getMetricNames","useMetricNames","getMetricNamespaces","useMetricNamespaces","ResourceTypeField","initialQueryType","showAppInsights","queryTypes","azureResourceGraph","ERROR_SOURCE","fetchedRef","setSubscriptions","fetchedSubscriptions","ReadOnlyTimeGrain","timeGrainCount","timeGrainType","timeGrainUnit","timeFields","appInsights","insightsAnalytics","DEFAULT_QUERY","preparedQuery","withDefaults","migratedQuery","migrateQuery","EditorForQueryType","baseQuery","baseOnRunQuery","useLastError","usePreparedQuery","RESOURCE_URI_REGEX","targetResourceGroupID","newResources","produce","draftState","draftRow","resourcePath","routeNames","$skipToken","allFetched","resourceResponse","makeResourceGraphRequest","rawData","subscriptionURI","newSubscriptionRow","formatResourceGroupData","maxRetries","reqOptions","postResource","templateVariableGroupID","TimeGrainConverter","createISO8601Duration","toMinutes","allowedTimeGrains","timeUnitToText","timeUnitToKbn","AzureCloud","accum","logAnalytics","resourceGraph","interpolateVariable","maybeAMessage","innererror","OLD_DEFAULT_DROPDOWN_VALUE","workingQuery","setMetricsTimeGrain","migrateTimeGrains","migrateLogAnalyticsToFromTimes","migrateToDefaultNamespace","migrateApplicationInsightsDimensions","migrateMetricsDimensionFilters","oldDimension","datasourceMigrations","setErrors","addError","errorsCopy","vSource","recentError","idRefLazy","queryTypeOptions","DEFAULT_RESOLUTION","RESOLUTION_OPTIONS","runOnBlur","preprocessMaxLines","onQueryTypeChange","onChangeQueryLimit","MAX_LABEL_COUNT","MAX_VALUE_COUNT","MAX_AUTO_SELECT","EMPTY_SELECTOR","buildSelector","selectedLabels","UnthemedLokiLabelBrowser","validationStatus","deleteLastUsedLabels","updateLabelState","doFacettingForLabel","doFacetting","validateSelector","lastFacetted","fetchValues","fetchSeries","updatedFields","autoSelect","lastUsedLabels","rawLabels","storeLastUsedLabels","rawValues","getLabelValues","possibleLabels","fetchSeriesLabels","possibleValues","existingValues","facetLabels","statusShowing","valueList","valueListWrapper","valueListArea","valueTitle","searchResults","fuzzyMatchResult","order","onClickLabel","onChangeSearch","onClickValue","onClickRunLogsQuery","onClickRunMetricsQuery","onClickValidate","onClickClear","LokiLabelBrowser","roundMsToMin","willApplySuggestion","DOMUtil","labelBrowserVisible","lokiLanguageProvider","labelsLoaded","logql","refreshLabels","prevRange","sameMinuteFrom","sameMinuteTo","shouldRefreshLabels","fetchLabels","hasLogLabels","chooserText","hasSyntax","getChooserText","onLastUsedLabelsSave","onLastUsedLabelsDelete","onClickChooserButton","onChangeLabelBrowser","roundDec","coord","iwid","numItems","sizeFactor","onlyIdx","_iwid","px","py","rlft","rtop","rrgt","rbtm","quads","hzMid","vtMid","startIsNorth","startIsWest","endIsEast","endIsSouth","oi","valueProps","menuProps","clearNameForSingleSeries","getItemSpacing","GaugePanel","thresholdMarkers","thresholdLabels","feature","getProperties","defaultPaths","setGaz","fetchData","examples","loadGazetteer","latitude","longitude","loadWorldmapPoints","features","GeoJSON","readFeatures","getGeometry","getFlatCoordinates","getId","loadFromGeoJSON","usePanning","isPanning","panRef","viewBounds","startMousePosition","prevPosition","currentPosition","stopPanning","unbindEvents","onPanStart","getEventXY","bindEvents","startPanning","onPan","cancelAnimationFrame","xDiff","inBounds","previousFocus","changedTouches","nodeR","mainGroup","mainCircle","hoverCircle","statsText","textHovering","hovering","ColorCircle","mainStat","statToString","dataFrameRowIndex","secondaryStat","fullStat","arcSections","nonZero","ArcSection","startPercent","endPercent","startXPos","startYPos","endXPos","endYPos","largeArc","shortenLine","markerEnd","ViewControls","onPlus","onMinus","disableZoomOut","disableZoomIn","showConfig","setShowConfig","gridLayout","stepDown","stepUp","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","useLayout","rawNodes","rawEdges","nodeCountLimit","rootNodeId","nodesGraph","setNodesGraph","edgesGraph","setEdgesGraph","setLoading","layoutWorkerCancelRef","useUnmount","onmessage","postMessage","terminate","defaultLayout","nodesGrid","edgesGrid","rawNodesCopy","rawEdgesCopy","spacingVertical","spacingHorizontal","perRow","midPoint","node1","node2","val1","val2","ascending","nodesWithLimit","edgesWithLimit","graphBounds","hiddenNodesCount","EdgeArrowMarker","refX","refY","markerUnits","markerWidth","markerHeight","orient","EdgeLabel","rx","getItemsRenderer","extraItems","defaultGroup","newTitle","mapMenuItem","NodeHeader","getNodeFields","EdgeHeader","getEdgeFields","formLabelMargin","formLabelPadding","onSort","sortable","colorItems","getColorLegendItems","svg","svgPanning","noDataMsg","viewControls","viewControlsWrapper","nodeLimit","edgesDataFrames","nodesDataFrames","useCategorizeFrames","measureRef","setConfig","nodeHover","setNodeHover","clearNodeHover","edgeHover","setEdgeHover","clearEdgeHover","useHover","firstNodesDataFrame","firstEdgesDataFrame","processNodes","focusedNodeId","setFocusedNodeId","setFocused","focusPosition","useFocusPositionOnLayout","zoomRef","onStepUp","onStepDown","isMaxZoom","isMinZoom","isMax","isMin","onWheel","wheelEvent","deltaY","newScale","useZoom","panningState","usePanAndZoom","onEdgeOpen","onNodeOpen","setMenu","extraNodeItem","useContextMenu","topLevelRef","highlightId","setHighlightId","useHighlight","Edges","nodeHoveringId","edgeHoveringId","Nodes","hoveringId","Markers","EdgeLabels","shouldShow","hasStats","vx","vy","mag","ratio","vx2","vy2","newx1","newy1","fieldsCache","findFieldsByPrefix","nodeFields","edgesMapped","edgeFields","StatPanel","graphMode","getTextMode","mainCategory","colorBackground","colorValue","includeFieldMatcher","valueOptionsCategory","alignValue","pxRatio","laneDistr","walk","yIdx","dim","offPct","dimPct","numSeries","isDiscrete","getFieldConfig","onHover","onLeave","hoverMarks","boxRectsBySeries","gapFactor","fillPaths","strokePaths","putBox","boxWidth","boxHeight","getFillColor","fillPath","strokePath","drawPoints","i0","i1","yMids","ix","boxRect","setHoverMark","hoveredAtCursor","doHover","foundAtCursor","cy2","ySplits","dataIncr","skipFactor","scalePad","iy","yValues","yRange","drawPaths","nextIx","colWid","barWid","xShift","seriesRects","hoveredSeriesIdx","hoveredDataIdx","shouldChangeHover","coreConfig","unsetSameFutureValues","prevVal","mergeThresholdValues","getThresholdItems","thresholdToText","textToColor","hasTimeseries","isTimeseries","merged","allNonTimeFields","stateColors","rightPointer","lineFillOptions","dashOptions","dotOptions","parseText","FillBellowToEditor","GAPS_OPTIONS","SpanNullsEditor","isThreshold","formattedTime","checkAndUpdate","ThresholdsStyleEditor","onChangeCb","PanelCtrlES6","MetricsPanelCtrlES6","QueryCtrlES6","oMatchMedia","matchMedia","mediaQueryString","mql","addListener","removeListener","newStore","DataSourcePermissionLevel","Team","Viewer","View","Admin","TeamPermissionLevel","teamsPermissionLevels","Member","toggleSidemenuHidden","graphClicked","thresholdChanged","PanelEditEnteredEvent","PanelEditExitedEvent","$q","$strapConfig","when","bsTooltip","$this","is","Constructor","_tooltip","bsTypeahead","shown","proxy","transitionEnd","transEndEventNames","jQuery","Dropdown","$el","clearMenus","insertBefore","$items","eq","noConflict","delegate","isShown","isDefaultPrevented","enforceFocus","hideWithTransition","removeBackdrop","$backdrop","animate","doAnimate","$target","eventIn","eventOut","triggers","fixTitle","hoverState","$tip","actualWidth","actualHeight","tp","hasContent","setContent","applyPlacement","replaceArrow","arrow","getTitle","$e","$arrow","toggleEnabled","removeData","$ul","relatedTarget","activate","$active","highlighter","$menu","grep","beginswith","caseInsensitive","$1","eventSupported","isSupported","suppressKeyPressRepeat","inArray","mousedover","Affix","affix","$window","checkPosition","scrollHeight","offsetBottom","offsetTop","unpin","affixed","$spy","triggerRedrawOverlay","lockCrosshair","unlockCrosshair","eventHolder","mouseout","drawOverlay","plotOffset","translate","adj","lineJoin","drawX","drawY","shutdown","processDatapoints","axisx","axisy","plotDashes","xoffset","yoffset","dashOnLength","dashOffLength","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","getLogger","calculateAutoValues","gaugeOptionsi","cellWidth","calculateAngle","drawArcWithShadow","rd1","rd2","lc","fc","drawArc","shadowOffsetX","shadowOffsetY","shadowBlur","drawThresholdValue","cellLayout","drawText","thresholdLabelMargin","toRad","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","make","extract","lookupColors","darkgrey","Canvas","G_vmlCanvasManager","initElement","backingStoreRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","pixelRatio","textContainer","_textCache","_textSizeCache","flotTextSizeCache","Plot","data_","options_","noColumns","labelFormatter","labelBoxBorderColor","backgroundOpacity","tickColor","autoscaleMargin","reserveSpace","tickLength","alignTicksWithAxis","minTickSize","xaxes","aboveData","axisMargin","markingsColor","markingsLineWidth","autoHighlight","redrawOverlayInterval","octx","plotWidth","plotHeight","processRawData","executeHooks","parseData","neededColors","maxIndex","colorPool","colorPoolSize","variation","colori","getOrCreateAxis","axisNumber","fillInSeriesOptions","topSentry","bottomSentry","fakeInfinity","updateAxis","allAxes","autoscale","insertSteps","nullify","ymin","ymax","processData","canvasToAxisCoords","redrawTimeout","onTouch","measureTickLabels","legacyStyles","layer","getTextInfo","allocateAxisBoxFirstPhase","lh","isXAxis","eventSectionPadding","innermost","outermost","box","setupGrid","showGrid","axisOpts","setRange","allocatedAxes","snaped","setupTickGeneration","setTicks","snapRangeToTicks","minMargin","margins","adjustLayoutForThingsStickingOut","allocateAxisBoxSecondPhase","it","setTransformationHelpers","halign","removeText","addText","fragments","rowStarted","lf","prependTo","insertLegend","tickGenerator","decimal","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","initPlugins","axisOptions","axisCount","fontSizeDefault","fontDefaults","x2axis","coloredAreas","coloredAreasColor","parseOptions","setupCanvases","triggerClickHoverEvent","isSelecting","cancelable","originalEvent","touch","mapFromTouchEvent","eventname","seriesFilter","canvasX","canvasY","mouseX","mouseY","maxDistance","smallestDistance","mx","my","maxx","maxy","findNearbyItem","drawBarHighlight","drawPointHighlight","indexOfHighlight","pointRadius","spec","co","brightness","clearRect","layerKey","getTextLayer","layerCache","styleKey","styleCache","rendered","textStyle","savedhandlers","updateSelection","onselectstart","ondrag","setSelectionPos","selectionIsSane","triggerSelectedEvent","c2","anyUsed","p1","p2","preventEvent","minSize","findMatchingSeries","qx","qy","newpoints","withlines","withbottom","withsteps","keyOffset","accumulateOffset","fromgap","stackBases","stackSums","getStackSums","_data","data_len","sums","key_idx","value_idx","percents","newPoints","floorInBase","monthNames","dayNames","strftime","hours12","leftPad","isAM","getDay","makeUtcWrapper","addProxyMethod","sourceObj","sourceMethod","targetObj","targetMethod","dateGenerator","timezoneJS","setTimezone","baseSpec","specMonths","specQuarters","axisName","setMonth","setFullYear","setMilliseconds","quarter","carry","useQuarters","hourCode","twelveHourClock","freeInput","maxTags","confirmKeys","onTagExists","$tag","fadeIn","itemsArray","isSelect","objectItems","$container","makeOptionItemFunction","dontPushVal","pushVal","$existingTag","htmlEncode","findInputWrapper","removeAll","nodeType","nodeValue","makeOptionFunction","processItems","$inputWrapper","doGetCaretPosition","$prevTag","$nextTag","inputSize","elt","arg1","arg2","retVal","htmlEncodeContainer","oField","iCaretPos","oSel","createRange","moveStart","selectionStart"],"sourceRoot":""}