{"version":3,"file":"DashboardPage.83746403e354ba80cece.js","mappings":"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ACA,uBACA,sBACA,0BACA,6BACA,gCACA,4BACA,2BACA,qBACA,wBACA,2BACA,uBACA,sBACA,aACA,gBACA,mBACA,eACA,cACA,uBACA,0BACA,6BACA,yBACA,wBACA,sBACA,yBACA,4BACA,wBACA,uBACA,iBACA,oBACA,uBACA,mBACA,kBACA,kBACA,qBACA,wBACA,oBACA,mBACA,kBACA,qBACA,wBACA,oBACA,mBACA,mBACA,sBACA,yBACA,qBACA,oBACA,qBACA,wBACA,2BACA,uBACA,sBACA,mBACA,sBACA,yBACA,qBACA,oBACA,iBACA,oBACA,uBACA,mBACA,kBACA,YACA,eACA,kBACA,cACA,aACA,SACA,YACA,eACA,WACA,UACA,iBACA,oBACA,uBACA,mBACA,kBACA,sBACA,yBACA,4BACA,wBACA,uBACA,sBACA,yBACA,4BACA,wBACA,uBACA,sBACA,yBACA,4BACA,wBACA,uBACA,mBACA,sBACA,yBACA,qBACA,oBACA,wBACA,2BACA,8BACA,0BACA,yBACA,wBACA,2BACA,8BACA,0BACA,yBACA,wBACA,2BACA,8BACA,0BACA,yBACA,eACA,kBACA,qBACA,iBACA,gBACA,oBACA,uBACA,0BACA,sBACA,qBACA,yBACA,4BACA,+BACA,2BACA,0BACA,0BACA,6BACA,gCACA,4BACA,2BACA,oBACA,uBACA,0BACA,sBACA,qBACA,oBACA,uBACA,0BACA,sBACA,qBACA,iBACA,oBACA,uBACA,mBACA,kBACA,cACA,iBACA,oBACA,gBACA,eACA,cACA,iBACA,oBACA,gBACA,eACA,oBACA,uBACA,0BACA,sBACA,qBACA,oBACA,uBACA,0BACA,sBACA,qBACA,mBACA,sBACA,yBACA,qBACA,oBACA,oBACA,uBACA,0BACA,sBACA,qBACA,mBACA,sBACA,yBACA,qBACA,oBACA,kBACA,qBACA,wBACA,oBACA,mBACA,uBACA,0BACA,6BACA,yBACA,wBACA,uBACA,0BACA,6BACA,yBACA,wBACA,uBACA,0BACA,6BACA,yBACA,wBACA,oBACA,uBACA,0BACA,sBACA,qBACA,yBACA,4BACA,+BACA,2BACA,0BACA,yBACA,4BACA,+BACA,2BACA,0BACA,yBACA,4BACA,+BACA,2BACA,0BACA,aACA,gBACA,mBACA,eACA,cACA,kBACA,qBACA,wBACA,oBACA,mBACA,kBACA,qBACA,wBACA,oBACA,mBACA,kBACA,qBACA,wBACA,oBACA,mBACA,eACA,kBACA,qBACA,iBACA,gBACA,cACA,iBACA,oBACA,gBACA,eACA,mBACA,sBACA,yBACA,qBACA,oBACA,mBACA,sBACA,yBACA,qBACA,oBACA,mBACA,sBACA,yBACA,qBACA,oBACA,gBACA,mBACA,sBACA,kBACA,iBACA,cACA,iBACA,oBACA,gBACA,eACA,YACA,eACA,kBACA,cACA,aACA,iBACA,oBACA,uBACA,mBACA,kBACA,sBACA,yBACA,4BACA,wBACA,uBACA,uBACA,0BACA,6BACA,yBACA,wBACA,iBACA,oBACA,uBACA,mBACA,kBACA,iBACA,oBACA,uBACA,mBACA,kBACA,cACA,iBACA,oBACA,gBACA,eACA,SACA,YACA,eACA,WACA,UACA,qBACA,wBACA,2BACA,uBACA,sBACA,YACA,eACA,kBACA,cACA,aACA,YACA,eACA,kBACA,cACA,aACA,aACA,gBACA,mBACA,eACA,cACA,cACA,iBACA,oBACA,gBACA,eACA,cACA,iBACA,oBACA,gBACA,eACA,cACA,iBACA,oBACA,gBACA,eACA,aACA,gBACA,mBACA,eACA,cACA,KACA,QACA,WACA,OACA,MACA,QACA,WACA,cACA,UACA,SACA,OACA,UACA,aACA,SACA,QACA,WACA,cACA,iBACA,aACA,YACA,KACA,QACA,WACA,OACA,MACA,QACA,WACA,cACA,UACA,SACA,cACA,iBACA,oBACA,gBACA,eACA,aACA,gBACA,mBACA,eACA,cACA,YACA,eACA,kBACA,cACA,aACA,aACA,gBACA,mBACA,eACA,cACA,kBACA,qBACA,wBACA,oBACA,mBACA,kBACA,qBACA,wBACA,oBACA,mBACA,kBACA,qBACA,wBACA,oBACA,mBACA,aACA,gBACA,mBACA,eACA,cACA,cACA,iBACA,oBACA,gBACA,eACA,UACA,aACA,gBACA,YACA,WACA,UACA,aACA,gBACA,YACA,WACA,mBACA,sBACA,yBACA,qBACA,oBACA,eACA,kBACA,qBACA,iBACA,gBACA,SACA,YACA,eACA,WACA,UACA,MACA,SACA,YACA,QACA,OACA,YACA,eACA,kBACA,cACA,aACA,UACA,aACA,gBACA,YACA,WACA,OACA,UACA,aACA,SACA,QACA,MACA,SACA,YACA,QACA,OACA,OACA,UACA,aACA,SACA,QACA,KACA,QACA,WACA,OACA,MACA,aACA,gBACA,mBACA,eACA,cACA,KACA,QACA,WACA,OACA,MACA,SACA,YACA,eACA,WACA,UACA,YACA,eACA,kBACA,cACA,aACA,gBACA,mBACA,sBACA,kBACA,iBACA,WACA,cACA,iBACA,aACA,YACA,WACA,cACA,iBACA,aACA,YACA,aACA,gBACA,mBACA,eACA,cACA,WACA,cACA,iBACA,aACA,YACA,QACA,WACA,cACA,UACA,SACA,OACA,UACA,aACA,SACA,QACA,aACA,gBACA,mBACA,eACA,cACA,sBACA,yBACA,4BACA,wBACA,uBACA,cACA,iBACA,oBACA,gBACA,eACA,uBACA,0BACA,6BACA,yBACA,wBACA,WACA,cACA,iBACA,aACA,YACA,iBACA,oBACA,uBACA,mBACA,kBACA,cACA,iBACA,oBACA,gBACA,eACA,YACA,eACA,kBACA,cACA,aACA,gBACA,mBACA,sBACA,kBACA,iBACA,cACA,iBACA,oBACA,gBACA,eACA,wBACA,2BACA,8BACA,0BACA,yBACA,kBACA,qBACA,wBACA,oBACA,mBACA,uBACA,0BACA,6BACA,yBACA,wBACA,uBACA,0BACA,6BACA,yBACA,wBACA,qBACA,wBACA,2BACA,uBACA,sBACA,sBACA,yBACA,4BACA,wBACA,uBACA,aACA,gBACA,mBACA,eACA,cACA,KACA,QACA,WACA,OACA,MACA,OACA,UACA,aACA,SACA,QACA,OACA,UACA,aACA,SACA,QACA,WACA,cACA,iBACA,aACA,YACA,kBACA,qBACA,wBACA,oBACA,mBACA,eACA,kBACA,qBACA,iBACA,gBACA,eACA,kBACA,qBACA,iBACA,gBACA,aACA,gBACA,mBACA,eACA,cACA,gBACA,mBACA,sBACA,kBACA,iBACA,gBACA,mBACA,sBACA,kBACA,iBACA,kBACA,qBACA,wBACA,oBACA,mBACA,UACA,aACA,gBACA,YACA,WACA,UACA,aACA,gBACA,YACA,WACA,aACA,gBACA,mBACA,eACA,cACA,aACA,gBACA,mBACA,eACA,cACA,eACA,kBACA,qBACA,iBACA,gBACA,eACA,kBACA,qBACA,iBACA,gBACA,oBACA,uBACA,0BACA,sBACA,qBACA,sBACA,yBACA,4BACA,wBACA,uBACA,mBACA,sBACA,yBACA,qBACA,oBACA,SACA,YACA,eACA,WACA,UACA,UACA,aACA,gBACA,YACA,WACA,KACA,QACA,WACA,OACA,MACA,mBACA,sBACA,yBACA,qBACA,oBACA,iBACA,oBACA,uBACA,mBACA,kBACA,kBACA,qBACA,wBACA,oBACA,mBACA,UACA,aACA,gBACA,YACA,WACA,KACA,QACA,WACA,OACA,MACA,UACA,aACA,gBACA,YACA,WACA,UACA,aACA,gBACA,YACA,WACA,aACA,gBACA,mBACA,eACA,cACA,YACA,eACA,kBACA,cACA,aACA,iBACA,oBACA,uBACA,mBACA,kBACA,MACA,SACA,YACA,QACA,OACA,OACA,UACA,aACA,SACA,QACA,gBACA,mBACA,sBACA,kBACA,iBACA,YACA,eACA,kBACA,cACA,aACA,aACA,gBACA,mBACA,eACA,cACA,YACA,eACA,kBACA,cACA,aACA,iBACA,oBACA,uBACA,mBACA,kBACA,oBACA,uBACA,0BACA,sBACA,qBACA,gBACA,mBACA,sBACA,kBACA,iBACA,SACA,YACA,eACA,WACA,UACA,iBACA,oBACA,uBACA,mBACA,kBACA,mBACA,sBACA,yBACA,qBACA,oBACA,eACA,kBACA,qBACA,iBACA,gBACA,kBACA,qBACA,wBACA,oBACA,mBACA,oBACA,uBACA,0BACA,sBACA,qBACA,aACA,gBACA,mBACA,eACA,cACA,cACA,iBACA,oBACA,gBACA,eACA,YACA,eACA,kBACA,cACA,aACA,OACA,UACA,aACA,SACA,QACA,WACA,cACA,iBACA,aACA,YACA,gBACA,mBACA,sBACA,kBACA,iBACA,YACA,eACA,kBACA,cACA,aACA,WACA,cACA,iBACA,aACA,YACA,aACA,gBACA,mBACA,eACA,cACA,eACA,kBACA,qBACA,iBACA,gBACA,aACA,gBACA,mBACA,eACA,cACA,WACA,cACA,iBACA,aACA,YACA,WACA,cACA,iBACA,aACA,YACA,YACA,eACA,kBACA,cACA,aACA,WACA,cACA,iBACA,aACA,YACA,eACA,kBACA,qBACA,iBACA,gBACA,YACA,eACA,kBACA,cACA,aACA,gBACA,mBACA,sBACA,kBACA,iBACA,WACA,cACA,iBACA,aACA,YACA,eACA,kBACA,qBACA,iBACA,gBACA,KACA,QACA,WACA,OACA,MACA,KACA,QACA,WACA,OACA,MACA,YACA,eACA,kBACA,cACA,aACA,iBACA,oBACA,uBACA,mBACA,kBACA,iBACA,oBACA,uBACA,mBACA,kBACA,mBACA,sBACA,yBACA,qBACA,oBACA,kBACA,qBACA,wBACA,oBACA,mBACA,oBACA,uBACA,0BACA,sBACA,qBACA,UACA,aACA,gBACA,YACA,WACA,QACA,WACA,cACA,UACA,SACA,UACA,aACA,gBACA,YACA,WACA,UACA,aACA,gBACA,YACA,WACA,eACA,kBACA,qBACA,iBACA,gBACA,gBACA,mBACA,sBACA,kBACA,iBACA,eACA,kBACA,qBACA,iBACA,gBACA,eACA,kBACA,qBACA,iBACA,gBACA,WACA,cACA,iBACA,aACA,YACA,eACA,kBACA,qBACA,iBACA,gBACA,YACA,eACA,kBACA,cACA,aACA,YACA,eACA,kBACA,cACA,aACA,UACA,aACA,gBACA,YACA,WACA,kBACA,qBACA,wBACA,oBACA,mBACA,oBACA,uBACA,0BACA,sBACA,qBACA,gBACA,mBACA,sBACA,kBACA,iBACA,mBACA,sBACA,yBACA,qBACA,oBACA,qBACA,wBACA,2BACA,uBACA,sBACA,cACA,iBACA,oBACA,gBACA,eACA,eACA,kBACA,qBACA,iBACA,gBACA,aACA,gBACA,mBACA,eACA,cACA,iBACA,oBACA,uBACA,mBACA,kBACA,kBACA,qBACA,wBACA,oBACA,mBACA,kBACA,qBACA,wBACA,oBACA,mBACA,KACA,QACA,WACA,OACA,MACA,cACA,iBACA,oBACA,gBACA,eACA,oBACA,uBACA,0BACA,sBACA,qBACA,gBACA,mBACA,sBACA,kBACA,iBACA,WACA,cACA,iBACA,aACA,YACA,KACA,QACA,WACA,OACA,MACA,KACA,QACA,WACA,OACA,MACA,IACA,OACA,UACA,MACA,KACA,SACA,YACA,eACA,WACA,UACA,MACA,SACA,YACA,QACA,OACA,MACA,SACA,YACA,QACA,OACA,SACA,YACA,eACA,WACA,UACA,SACA,YACA,eACA,WACA,UACA,QACA,WACA,cACA,UACA,SACA,YACA,eACA,kBACA,cACA,aACA,YACA,eACA,kBACA,cACA,aACA,eACA,kBACA,qBACA,iBACA,gBACA,IACA,OACA,UACA,MACA,KACA,iBACA,oBACA,uBACA,mBACA,kBACA,uBACA,0BACA,6BACA,yBACA,wBACA,wBACA,2BACA,8BACA,0BACA,yBACA,iBACA,oBACA,uBACA,mBACA,kBACA,sBACA,yBACA,4BACA,wBACA,uBACA,cACA,iBACA,oBACA,gBACA,eACA,eACA,kBACA,qBACA,iBACA,gBACA,UACA,aACA,gBACA,YACA,WACA,cACA,iBACA,oBACA,gBACA,eACA,YACA,eACA,kBACA,cACA,aACA,gBACA,mBACA,sBACA,kBACA,iBACA,qBACA,wBACA,2BACA,uBACA,sBACA,iBACA,oBACA,uBACA,mBACA,kBACA,sBACA,yBACA,4BACA,wBACA,uBACA,qBACA,wBACA,2BACA,uBACA,sBACA,sBACA,yBACA,4BACA,wBACA,uBACA,eACA,kBACA,qBACA,iBACA,gBACA,oBACA,uBACA,0BACA,sBACA,qBACA,uBACA,0BACA,6BACA,yBACA,wBACA,oBACA,uBACA,0BACA,sBACA,qBACA,aACA,gBACA,mBACA,eACA,cACA,kBACA,qBACA,wBACA,oBACA,mBACA,eACA,kBACA,qBACA,iBACA,gBACA,gBACA,mBACA,sBACA,kBACA,iBACA,aACA,gBACA,mBACA,eACA,cACA,gBACA,mBACA,sBACA,kBACA,iBACA,wBACA,2BACA,8BACA,0BACA,yBACA,MACA,SACA,YACA,QACA,OACA,cACA,iBACA,oBACA,gBACA,eACA,YACA,eACA,kBACA,cACA,aACA,eACA,kBACA,qBACA,iBACA,gBACA,kBACA,qBACA,wBACA,oBACA,mBACA,iBACA,oBACA,uBACA,mBACA,kBACA,aACA,gBACA,mBACA,eACA,cACA,kBACA,qBACA,wBACA,oBACA,mBACA,qBACA,wBACA,2BACA,uBACA,sBACA,qBACA,wBACA,2BACA,uBACA,sBACA,2BACA,8BACA,iCACA,6BACA,4BACA,OACA,UACA,aACA,SACA,QACA,cACA,iBACA,oBACA,gBACA,eACA,QACA,WACA,cACA,UACA,SACA,gBACA,mBACA,sBACA,kBACA,iBACA,KACA,QACA,WACA,OACA,MACA,aACA,gBACA,mBACA,eACA,cACA,OACA,UACA,aACA,SACA,QACA,OACA,UACA,aACA,SACA,QACA,KACA,QACA,WACA,OACA,MACA,aACA,gBACA,mBACA,eACA,cACA,SACA,YACA,eACA,WACA,UACA,QACA,WACA,cACA,UACA,SACA,aACA,gBACA,mBACA,eACA,cACA,YACA,eACA,kBACA,cACA,aACA,cACA,iBACA,oBACA,gBACA,eACA,WACA,cACA,iBACA,aACA,YACA,cACA,iBACA,oBACA,gBACA,eACA,SACA,YACA,eACA,WACA,UACA,WACA,cACA,iBACA,aACA,YACA,OACA,UACA,aACA,SACA,QACA,KACA,QACA,WACA,OACA,MACA,oBACA,uBACA,0BACA,sBACA,qBACA,aACA,gBACA,mBACA,eACA,c,iBCljDF,IAAI58B,EAAa,EAAQ,OACrB68B,EAAY,EAAQ,OAExBF,EAAOC,QAAU,SAASlxC,EAAOoxC,EAAUC,GACzC,IAAI/nD,EAAS0W,EAAMoxC,GACnB,GAAK9nD,EAAL,CAIA,IAAIgoD,EAAW,GAMf,GALAzvC,OAAOU,KAAKjZ,GAAQ0Z,SAAQ,SAASuuC,IACG,IAAlCj9B,EAAWqe,QAAQ4e,IACrBD,EAAS1wC,KAAK2wC,EAElB,IACID,EAAS7oD,OACX,MAAM,IAAI+oD,MAAM,QAAUJ,EAAW,cAAgBC,EAAgB,sBAAwBC,EAAS1rC,KAAK,MAT7G,CAWF,EAEAqrC,EAAOC,QAAQxkC,WAAa,SAAS1M,EAAOoxC,EAAUC,GACpD,IAAKrxC,EAAMoxC,GACT,MAAM,IAAII,MAAM,QAAUJ,EAAW,cAAgBC,EAAgB,gBAEvE,OAAOJ,EAAOC,QAAQlxC,EAAOoxC,EAAUC,EACzC,EAEAJ,EAAOC,QAAQO,iBAAmBN,EAAUO,UAAU,CACpDP,EAAUQ,QAAQV,EAAOC,SACzBD,EAAOC,S","sources":["webpack://grafana/./public/app/features/alerting/getAlertingValidationMessage.ts","webpack://grafana/./public/app/features/dashboard/components/DashboardLoading/DashboardFailed.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardLoading/DashboardLoading.tsx","webpack://grafana/./public/app/features/library-panels/components/SaveLibraryPanelModal/SaveLibraryPanelModal.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/state/actions.ts","webpack://grafana/./public/app/features/dashboard/components/SaveDashboard/UnsavedChangesModal.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardPrompt/DashboardPrompt.tsx","webpack://grafana/./public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts","webpack://grafana/./public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/usePanelLatestData.ts","webpack://grafana/./public/app/features/inspector/InspectMetadataTab.tsx","webpack://grafana/./public/app/features/dashboard/components/Inspector/InspectContent.tsx","webpack://grafana/./public/app/features/dashboard/components/Inspector/hooks.ts","webpack://grafana/./public/app/features/dashboard/components/Inspector/PanelInspector.tsx","webpack://grafana/./.yarn/__virtual__/react-split-pane-virtual-057ebfddec/3/opt/drone/yarncache/react-split-pane-npm-0.1.92-93dbf51dff-4890f17263.zip/node_modules/react-split-pane/dist/index.esm.js","webpack://grafana/./public/app/core/components/SplitPaneWrapper/SplitPaneWrapper.tsx","webpack://grafana/./public/app/features/variables/pickers/PickerRenderer.tsx","webpack://grafana/./public/app/features/dashboard/components/SubMenu/SubMenuItems.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/AngularPanelOptions.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/state/utils.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/DynamicConfigValueEditor.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/OverrideCategoryTitle.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelInfo/LibraryPanelInfo.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/getLibraryPanelOptions.tsx","webpack://grafana/./public/app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/getPanelFrameOptions.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/state/OptionSearchEngine.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/state/getRecentOptions.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/OptionsPaneOptions.tsx","webpack://grafana/./public/app/features/dashboard/state/selectors.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/VisualizationButton.tsx","webpack://grafana/./public/app/features/library-panels/components/ChangeLibraryPanelModal/ChangeLibraryPanelModal.tsx","webpack://grafana/./public/app/features/library-panels/components/PanelLibraryOptionsGroup/PanelLibraryOptionsGroup.tsx","webpack://grafana/./public/app/features/panel/state/getAllSuggestions.ts","webpack://grafana/./public/app/features/panel/components/VizTypePicker/VisualizationSuggestionCard.tsx","webpack://grafana/./public/app/features/panel/components/VizTypePicker/VisualizationSuggestions.tsx","webpack://grafana/./public/app/features/panel/components/VizTypePicker/VizTypePickerPlugin.tsx","webpack://grafana/./public/app/features/panel/components/VizTypePicker/VizTypePicker.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/VisualizationSelectPane.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/OptionsPane.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/PanelEditorTableView.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/PanelNotSupported.tsx","webpack://grafana/./public/app/features/alerting/StateHistory.tsx","webpack://grafana/./public/app/features/alerting/TestRuleResult.tsx","webpack://grafana/./public/app/features/alerting/AlertTab.tsx","webpack://grafana/./public/app/features/alerting/unified/components/panel-alerts-tab/NewRuleFromPanelButton.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/usePanelCombinedRules.ts","webpack://grafana/./public/app/features/alerting/unified/PanelAlertTabContent.tsx","webpack://grafana/./public/app/features/alerting/AlertTabIndex.tsx","webpack://grafana/./public/app/features/alerting/unified/PanelAlertTab.tsx","webpack://grafana/./public/app/core/utils/docsLinks.ts","webpack://grafana/./public/app/features/dashboard/components/TransformationsEditor/TransformationEditor.tsx","webpack://grafana/./public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRow.tsx","webpack://grafana/./public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRows.tsx","webpack://grafana/./public/app/features/dashboard/components/TransformationsEditor/TransformationsEditor.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/PanelEditorQueries.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/PanelEditorTabs.tsx","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/state/selectors.ts","webpack://grafana/./public/app/features/dashboard/components/PanelEditor/PanelEditor.tsx","webpack://grafana/./public/app/features/dashboard/components/PublicDashboardFooter/PublicDashboardsFooter.tsx","webpack://grafana/./public/app/features/dashboard/components/SubMenu/AnnotationPicker.tsx","webpack://grafana/./public/app/features/dashboard/components/SubMenu/Annotations.tsx","webpack://grafana/./public/app/features/dashboard/components/SubMenu/DashboardLinksDashboard.tsx","webpack://grafana/./public/app/features/dashboard/components/SubMenu/DashboardLinks.tsx","webpack://grafana/./public/app/features/dashboard/components/SubMenu/SubMenu.tsx","webpack://grafana/./public/app/features/dashboard/components/AddPanelWidget/AddPanelWidget.tsx","webpack://grafana/./public/app/features/dashboard/components/RowOptions/RowOptionsForm.tsx","webpack://grafana/./public/app/features/dashboard/components/RowOptions/RowOptionsModal.tsx","webpack://grafana/./public/app/features/dashboard/components/RowOptions/RowOptionsButton.tsx","webpack://grafana/./public/app/features/dashboard/components/DashboardRow/DashboardRow.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/DashboardGrid.tsx","webpack://grafana/./public/app/features/dashboard/containers/DashboardPage.tsx","webpack://grafana/./public/app/features/storage/StorageFolderPage.tsx","webpack://grafana/../../opt/drone/yarncache/react-style-proptype-npm-3.2.2-d7241ef02d-f0e646e148.zip/node_modules/react-style-proptype/src/css-properties.js","webpack://grafana/../../opt/drone/yarncache/react-style-proptype-npm-3.2.2-d7241ef02d-f0e646e148.zip/node_modules/react-style-proptype/src/index.js"],"sourcesContent":["import { DataQuery, DataSourceRef, DataTransformerConfig } from '@grafana/data';\nimport { DataSourceSrv } from '@grafana/runtime';\n\nexport const getDefaultCondition = () => ({\n  type: 'query',\n  query: { params: ['A', '5m', 'now'] },\n  reducer: { type: 'avg', params: [] as any[] },\n  evaluator: { type: 'gt', params: [null] as any[] },\n  operator: { type: 'and' },\n});\n\nexport const getAlertingValidationMessage = async (\n  transformations: DataTransformerConfig[] | undefined,\n  targets: DataQuery[],\n  datasourceSrv: DataSourceSrv,\n  datasource: DataSourceRef | null\n): Promise<string> => {\n  if (targets.length === 0) {\n    return 'Could not find any metric queries';\n  }\n\n  if (transformations && transformations.length) {\n    return 'Transformations are not supported in alert queries';\n  }\n\n  let alertingNotSupported = 0;\n  let templateVariablesNotSupported = 0;\n\n  for (const target of targets) {\n    const dsRef = target.datasource || datasource;\n    const ds = await datasourceSrv.get(dsRef);\n    if (!ds.meta.alerting) {\n      alertingNotSupported++;\n    } else if (ds.targetContainsTemplate && ds.targetContainsTemplate(target)) {\n      templateVariablesNotSupported++;\n    }\n  }\n\n  if (alertingNotSupported === targets.length) {\n    return 'The datasource does not support alerting queries';\n  }\n\n  if (templateVariablesNotSupported === targets.length) {\n    return 'Template variables are not supported in alert queries';\n  }\n\n  return '';\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Alert } from '@grafana/ui';\nimport { getMessageFromError } from 'app/core/utils/errors';\nimport { DashboardInitError, AppNotificationSeverity } from 'app/types';\n\nexport interface Props {\n  initError?: DashboardInitError;\n}\n\nexport const DashboardFailed = ({ initError }: Props) => {\n  if (!initError) {\n    return null;\n  }\n\n  return (\n    <div className={styles.dashboardLoading}>\n      <Alert severity={AppNotificationSeverity.Error} title={initError.message}>\n        {getMessageFromError(initError.error)}\n      </Alert>\n    </div>\n  );\n};\n\nexport const styles = {\n  dashboardLoading: css`\n    height: 60vh;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  `,\n};\n","import { css, keyframes } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { Button, HorizontalGroup, Spinner, useStyles2, VerticalGroup } from '@grafana/ui';\nimport { DashboardInitPhase } from 'app/types';\n\nexport interface Props {\n  initPhase: DashboardInitPhase;\n}\n\nexport const DashboardLoading = ({ initPhase }: Props) => {\n  const styles = useStyles2(getStyles);\n  const cancelVariables = () => {\n    locationService.push('/');\n  };\n\n  return (\n    <div className={styles.dashboardLoading}>\n      <div className={styles.dashboardLoadingText}>\n        <VerticalGroup spacing=\"md\">\n          <HorizontalGroup align=\"center\" justify=\"center\" spacing=\"xs\">\n            <Spinner inline={true} /> {initPhase}\n          </HorizontalGroup>{' '}\n          <HorizontalGroup align=\"center\" justify=\"center\">\n            <Button variant=\"secondary\" size=\"md\" icon=\"repeat\" onClick={cancelVariables}>\n              Cancel loading dashboard\n            </Button>\n          </HorizontalGroup>\n        </VerticalGroup>\n      </div>\n    </div>\n  );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n  // Amount of time we want to pass before we start showing loading spinner\n  const slowStartThreshold = '0.5s';\n\n  const invisibleToVisible = keyframes`\n    0% { opacity: 0%; }\n    100% { opacity: 100%; }\n  `;\n\n  return {\n    dashboardLoading: css`\n      height: 60vh;\n      display: flex;\n      opacity: 0%;\n      align-items: center;\n      justify-content: center;\n      animation: ${invisibleToVisible} 0s step-end ${slowStartThreshold} 1 normal forwards;\n    `,\n    dashboardLoadingText: css`\n      font-size: ${theme.typography.h4.fontSize};\n    `,\n  };\n};\n","import React, { useCallback, useState } from 'react';\nimport { useAsync, useDebounce } from 'react-use';\n\nimport { Button, Icon, Input, Modal, useStyles2 } from '@grafana/ui';\n\nimport { getConnectedDashboards } from '../../state/api';\nimport { getModalStyles } from '../../styles';\nimport { PanelModelWithLibraryPanel } from '../../types';\nimport { usePanelSave } from '../../utils/usePanelSave';\n\ninterface Props {\n  panel: PanelModelWithLibraryPanel;\n  folderId: number;\n  isUnsavedPrompt?: boolean;\n  onConfirm: () => void;\n  onDismiss: () => void;\n  onDiscard: () => void;\n}\n\nexport const SaveLibraryPanelModal = ({ panel, folderId, isUnsavedPrompt, onDismiss, onConfirm, onDiscard }: Props) => {\n  const [searchString, setSearchString] = useState('');\n  const dashState = useAsync(async () => {\n    const searchHits = await getConnectedDashboards(panel.libraryPanel.uid);\n    if (searchHits.length > 0) {\n      return searchHits.map((dash) => dash.title);\n    }\n\n    return [];\n  }, [panel.libraryPanel.uid]);\n\n  const [filteredDashboards, setFilteredDashboards] = useState<string[]>([]);\n  useDebounce(\n    () => {\n      if (!dashState.value) {\n        return setFilteredDashboards([]);\n      }\n\n      return setFilteredDashboards(\n        dashState.value.filter((dashName) => dashName.toLowerCase().includes(searchString.toLowerCase()))\n      );\n    },\n    300,\n    [dashState.value, searchString]\n  );\n\n  const { saveLibraryPanel } = usePanelSave();\n  const styles = useStyles2(getModalStyles);\n  const discardAndClose = useCallback(() => {\n    onDiscard();\n  }, [onDiscard]);\n\n  const title = isUnsavedPrompt ? 'Unsaved library panel changes' : 'Save library panel';\n\n  return (\n    <Modal title={title} icon=\"save\" onDismiss={onDismiss} isOpen={true}>\n      <div>\n        <p className={styles.textInfo}>\n          {'This update will affect '}\n          <strong>\n            {panel.libraryPanel.meta.connectedDashboards}{' '}\n            {panel.libraryPanel.meta.connectedDashboards === 1 ? 'dashboard' : 'dashboards'}.\n          </strong>\n          The following dashboards using the panel will be affected:\n        </p>\n        <Input\n          className={styles.dashboardSearch}\n          prefix={<Icon name=\"search\" />}\n          placeholder=\"Search affected dashboards\"\n          value={searchString}\n          onChange={(e) => setSearchString(e.currentTarget.value)}\n        />\n        {dashState.loading ? (\n          <p>Loading connected dashboards...</p>\n        ) : (\n          <table className={styles.myTable}>\n            <thead>\n              <tr>\n                <th>Dashboard name</th>\n              </tr>\n            </thead>\n            <tbody>\n              {filteredDashboards.map((dashName, i) => (\n                <tr key={`dashrow-${i}`}>\n                  <td>{dashName}</td>\n                </tr>\n              ))}\n            </tbody>\n          </table>\n        )}\n        <Modal.ButtonRow>\n          <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n            Cancel\n          </Button>\n          {isUnsavedPrompt && (\n            <Button variant=\"destructive\" onClick={discardAndClose}>\n              Discard\n            </Button>\n          )}\n          <Button\n            onClick={() => {\n              saveLibraryPanel(panel, folderId).then(() => {\n                onConfirm();\n              });\n            }}\n          >\n            Update all\n          </Button>\n        </Modal.ButtonRow>\n      </div>\n    </Modal>\n  );\n};\n","import { pick } from 'lodash';\n\nimport store from 'app/core/store';\nimport { cleanUpPanelState, initPanelState } from 'app/features/panel/state/actions';\nimport { panelModelAndPluginReady } from 'app/features/panel/state/reducers';\nimport { ThunkResult } from 'app/types';\n\nimport { DashboardModel, PanelModel } from '../../../state';\n\nimport {\n  closeEditor,\n  PANEL_EDITOR_UI_STATE_STORAGE_KEY,\n  PanelEditorUIState,\n  setDiscardChanges,\n  setPanelEditorUIState,\n  updateEditorInitState,\n} from './reducers';\n\nexport function initPanelEditor(sourcePanel: PanelModel, dashboard: DashboardModel): ThunkResult<void> {\n  return async (dispatch) => {\n    const panel = dashboard.initEditPanel(sourcePanel);\n\n    await dispatch(initPanelState(panel));\n\n    dispatch(\n      updateEditorInitState({\n        panel,\n        sourcePanel,\n      })\n    );\n  };\n}\n\nexport function discardPanelChanges(): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    const { getPanel } = getStore().panelEditor;\n    getPanel().configRev = 0;\n    dispatch(setDiscardChanges(true));\n  };\n}\n\nexport function updateDuplicateLibraryPanels(\n  modifiedPanel: PanelModel,\n  dashboard: DashboardModel | null\n): ThunkResult<void> {\n  return (dispatch) => {\n    if (modifiedPanel.libraryPanel?.uid === undefined || !dashboard) {\n      return;\n    }\n\n    const modifiedSaveModel = modifiedPanel.getSaveModel();\n    for (const panel of dashboard.panels) {\n      if (skipPanelUpdate(modifiedPanel, panel)) {\n        continue;\n      }\n\n      panel.restoreModel({\n        ...modifiedSaveModel,\n        ...pick(panel, 'gridPos', 'id'),\n      });\n\n      // Loaded plugin is not included in the persisted properties\n      // So is not handled by restoreModel\n      const pluginChanged = panel.plugin?.meta.id !== modifiedPanel.plugin?.meta.id;\n      panel.plugin = modifiedPanel.plugin;\n      panel.configRev++;\n\n      if (pluginChanged) {\n        panel.generateNewKey();\n\n        dispatch(panelModelAndPluginReady({ key: panel.key, plugin: panel.plugin! }));\n      }\n\n      // Resend last query result on source panel query runner\n      // But do this after the panel edit editor exit process has completed\n      setTimeout(() => {\n        panel.getQueryRunner().useLastResultFrom(modifiedPanel.getQueryRunner());\n      }, 20);\n    }\n\n    if (modifiedPanel.repeat) {\n      // We skip any repeated library panels so we need to update them by calling processRepeats\n      // But do this after the panel edit editor exit process has completed\n      setTimeout(() => dashboard.processRepeats(), 20);\n    }\n  };\n}\n\nexport function skipPanelUpdate(modifiedPanel: PanelModel, panelToUpdate: PanelModel): boolean {\n  // don't update library panels that aren't of the same type\n  if (panelToUpdate.libraryPanel?.uid !== modifiedPanel.libraryPanel!.uid) {\n    return true;\n  }\n\n  // don't update the modifiedPanel twice\n  if (panelToUpdate.id && panelToUpdate.id === modifiedPanel.id) {\n    return true;\n  }\n\n  // don't update library panels that are repeated\n  if (panelToUpdate.repeatPanelId) {\n    return true;\n  }\n\n  return false;\n}\n\nexport function exitPanelEditor(): ThunkResult<void> {\n  return async (dispatch, getStore) => {\n    const dashboard = getStore().dashboard.getModel();\n    const { getPanel, getSourcePanel, shouldDiscardChanges } = getStore().panelEditor;\n    const panel = getPanel();\n\n    if (dashboard) {\n      dashboard.exitPanelEditor();\n    }\n\n    if (hasPanelChangedInPanelEdit(panel) && !shouldDiscardChanges) {\n      const modifiedSaveModel = panel.getSaveModel();\n      const sourcePanel = getSourcePanel();\n      const panelTypeChanged = sourcePanel.type !== panel.type;\n\n      dispatch(updateDuplicateLibraryPanels(panel, dashboard));\n\n      sourcePanel.restoreModel(modifiedSaveModel);\n      sourcePanel.configRev++; // force check the configs\n\n      if (panelTypeChanged) {\n        // Loaded plugin is not included in the persisted properties so is not handled by restoreModel\n        sourcePanel.plugin = panel.plugin;\n        sourcePanel.generateNewKey();\n\n        await dispatch(panelModelAndPluginReady({ key: sourcePanel.key, plugin: panel.plugin! }));\n      }\n\n      // Resend last query result on source panel query runner\n      // But do this after the panel edit editor exit process has completed\n      setTimeout(() => {\n        sourcePanel.getQueryRunner().useLastResultFrom(panel.getQueryRunner());\n        sourcePanel.render();\n\n        // If all changes where saved then reset configRev after applying changes\n        if (panel.hasSavedPanelEditChange && !panel.hasChanged) {\n          sourcePanel.configRev = 0;\n        }\n      }, 20);\n    }\n\n    dispatch(cleanUpPanelState(panel.key));\n    dispatch(closeEditor());\n  };\n}\n\nfunction hasPanelChangedInPanelEdit(panel: PanelModel) {\n  return panel.hasChanged || panel.hasSavedPanelEditChange || panel.isAngularPlugin();\n}\n\nexport function updatePanelEditorUIState(uiState: Partial<PanelEditorUIState>): ThunkResult<void> {\n  return (dispatch, getStore) => {\n    const nextState = { ...getStore().panelEditor.ui, ...uiState };\n    dispatch(setPanelEditorUIState(nextState));\n    try {\n      store.setObject(PANEL_EDITOR_UI_STATE_STORAGE_KEY, nextState);\n    } catch (error) {\n      console.error(error);\n    }\n  };\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { Button, Modal } from '@grafana/ui';\n\nimport { DashboardModel } from '../../state';\n\nimport { SaveDashboardButton } from './SaveDashboardButton';\n\ninterface UnsavedChangesModalProps {\n  dashboard: DashboardModel;\n  onDiscard: () => void;\n  onDismiss: () => void;\n  onSaveSuccess?: () => void;\n}\n\nexport const UnsavedChangesModal: React.FC<UnsavedChangesModalProps> = ({\n  dashboard,\n  onSaveSuccess,\n  onDiscard,\n  onDismiss,\n}) => {\n  return (\n    <Modal\n      isOpen={true}\n      title=\"Unsaved changes\"\n      onDismiss={onDismiss}\n      icon=\"exclamation-triangle\"\n      className={css`\n        width: 500px;\n      `}\n    >\n      <h5>Do you want to save your changes?</h5>\n      <Modal.ButtonRow>\n        <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n          Cancel\n        </Button>\n        <Button variant=\"destructive\" onClick={onDiscard}>\n          Discard\n        </Button>\n        <SaveDashboardButton dashboard={dashboard} onSaveSuccess={onSaveSuccess} />\n      </Modal.ButtonRow>\n    </Modal>\n  );\n};\n","import * as H from 'history';\nimport { each, find } from 'lodash';\nimport React, { useContext, useEffect, useState } from 'react';\nimport { Prompt } from 'react-router-dom';\n\nimport { locationService } from '@grafana/runtime';\nimport { ModalsContext } from '@grafana/ui';\nimport { appEvents } from 'app/core/app_events';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { SaveLibraryPanelModal } from 'app/features/library-panels/components/SaveLibraryPanelModal/SaveLibraryPanelModal';\nimport { PanelModelWithLibraryPanel } from 'app/features/library-panels/types';\nimport { useDispatch } from 'app/types';\nimport { DashboardSavedEvent } from 'app/types/events';\n\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { discardPanelChanges, exitPanelEditor } from '../PanelEditor/state/actions';\nimport { UnsavedChangesModal } from '../SaveDashboard/UnsavedChangesModal';\n\nexport interface Props {\n  dashboard: DashboardModel;\n}\n\ninterface State {\n  original: object | null;\n  originalPath?: string;\n}\n\nexport const DashboardPrompt = React.memo(({ dashboard }: Props) => {\n  const [state, setState] = useState<State>({ original: null });\n  const dispatch = useDispatch();\n  const { original, originalPath } = state;\n  const { showModal, hideModal } = useContext(ModalsContext);\n\n  useEffect(() => {\n    // This timeout delay is to wait for panels to load and migrate scheme before capturing the original state\n    // This is to minimize unsaved changes warnings due to automatic schema migrations\n    const timeoutId = setTimeout(() => {\n      const originalPath = locationService.getLocation().pathname;\n      const original = dashboard.getSaveModelClone();\n      setState({ originalPath, original });\n    }, 1000);\n\n    const savedEventUnsub = appEvents.subscribe(DashboardSavedEvent, () => {\n      const original = dashboard.getSaveModelClone();\n      setState({ originalPath, original });\n    });\n\n    return () => {\n      clearTimeout(timeoutId);\n      savedEventUnsub.unsubscribe();\n    };\n  }, [dashboard, originalPath]);\n\n  useEffect(() => {\n    const handleUnload = (event: BeforeUnloadEvent) => {\n      if (ignoreChanges(dashboard, original)) {\n        return;\n      }\n      if (hasChanges(dashboard, original)) {\n        event.preventDefault();\n        // No browser actually displays this message anymore.\n        // But Chrome requires it to be defined else the popup won't show.\n        event.returnValue = '';\n      }\n    };\n    window.addEventListener('beforeunload', handleUnload);\n    return () => window.removeEventListener('beforeunload', handleUnload);\n  }, [dashboard, original]);\n\n  const onHistoryBlock = (location: H.Location) => {\n    const panelInEdit = dashboard.panelInEdit;\n    const search = new URLSearchParams(location.search);\n\n    // Are we leaving panel edit & library panel?\n    if (panelInEdit && panelInEdit.libraryPanel && panelInEdit.hasChanged && !search.has('editPanel')) {\n      showModal(SaveLibraryPanelModal, {\n        isUnsavedPrompt: true,\n        panel: dashboard.panelInEdit as PanelModelWithLibraryPanel,\n        folderId: dashboard.meta.folderId as number,\n        onConfirm: () => {\n          hideModal();\n          moveToBlockedLocationAfterReactStateUpdate(location);\n        },\n        onDiscard: () => {\n          dispatch(discardPanelChanges());\n          moveToBlockedLocationAfterReactStateUpdate(location);\n          hideModal();\n        },\n        onDismiss: hideModal,\n      });\n      return false;\n    }\n\n    // Are we still on the same dashboard?\n    if (originalPath === location.pathname || !original) {\n      // This is here due to timing reasons we want the exit panel editor state changes to happen before router update\n      if (panelInEdit && !search.has('editPanel')) {\n        dispatch(exitPanelEditor());\n      }\n\n      return true;\n    }\n\n    if (ignoreChanges(dashboard, original)) {\n      return true;\n    }\n\n    if (!hasChanges(dashboard, original)) {\n      return true;\n    }\n\n    showModal(UnsavedChangesModal, {\n      dashboard: dashboard,\n      onSaveSuccess: () => {\n        hideModal();\n        moveToBlockedLocationAfterReactStateUpdate(location);\n      },\n      onDiscard: () => {\n        setState({ ...state, original: null });\n        hideModal();\n        moveToBlockedLocationAfterReactStateUpdate(location);\n      },\n      onDismiss: hideModal,\n    });\n\n    return false;\n  };\n\n  return <Prompt when={true} message={onHistoryBlock} />;\n});\n\nDashboardPrompt.displayName = 'DashboardPrompt';\n\nfunction moveToBlockedLocationAfterReactStateUpdate(location?: H.Location | null) {\n  if (location) {\n    setTimeout(() => locationService.push(location), 10);\n  }\n}\n\n/**\n * For some dashboards and users changes should be ignored *\n */\nexport function ignoreChanges(current: DashboardModel, original: object | null) {\n  if (!original) {\n    return true;\n  }\n\n  // Ignore changes if the user has been signed out\n  if (!contextSrv.isSignedIn) {\n    return true;\n  }\n\n  if (!current || !current.meta) {\n    return true;\n  }\n\n  const { canSave, fromScript, fromFile } = current.meta;\n  if (!contextSrv.isEditor && !canSave) {\n    return true;\n  }\n\n  return !canSave || fromScript || fromFile;\n}\n\n/**\n * Remove stuff that should not count in diff\n */\nfunction cleanDashboardFromIgnoredChanges(dashData: unknown) {\n  // need to new up the domain model class to get access to expand / collapse row logic\n  const model = new DashboardModel(dashData);\n\n  // Expand all rows before making comparison. This is required because row expand / collapse\n  // change order of panel array and panel positions.\n  model.expandRows();\n\n  const dash = model.getSaveModelClone();\n\n  // ignore time and refresh\n  dash.time = 0;\n  dash.refresh = 0;\n  dash.schemaVersion = 0;\n  dash.timezone = 0;\n\n  dash.panels = [];\n\n  // ignore template variable values\n  each(dash.getVariables(), (variable: any) => {\n    variable.current = null;\n    variable.options = null;\n    variable.filters = null;\n  });\n\n  return dash;\n}\n\nexport function hasChanges(current: DashboardModel, original: unknown) {\n  if (current.hasUnsavedChanges()) {\n    return true;\n  }\n\n  const currentClean = cleanDashboardFromIgnoredChanges(current.getSaveModelClone());\n  const originalClean = cleanDashboardFromIgnoredChanges(original);\n\n  const currentTimepicker = find((currentClean as any).nav, { type: 'timepicker' });\n  const originalTimepicker = find((originalClean as any).nav, { type: 'timepicker' });\n\n  if (currentTimepicker && originalTimepicker) {\n    currentTimepicker.now = originalTimepicker.now;\n  }\n\n  const currentJson = JSON.stringify(currentClean, null);\n  const originalJson = JSON.stringify(originalClean, null);\n\n  return currentJson !== originalJson;\n}\n","import saveAs from 'file-saver';\n\nimport { dateTimeFormat, formattedValueToString, getValueFormat, SelectableValue } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { StateManagerBase } from 'app/core/services/StateManagerBase';\n\nimport { getTimeSrv } from '../../services/TimeSrv';\nimport { PanelModel } from '../../state';\nimport { setDashboardToFetchFromLocalStorage } from '../../state/initDashboard';\n\nimport { Randomize } from './randomizer';\nimport { getDebugDashboard, getGithubMarkdown } from './utils';\n\ninterface SupportSnapshotState {\n  currentTab: SnapshotTab;\n  showMessage: ShowMessage;\n  options: Array<SelectableValue<ShowMessage>>;\n  snapshotText: string;\n  markdownText: string;\n  snapshotSize?: string;\n  randomize: Randomize;\n  iframeLoading?: boolean;\n  loading?: boolean;\n  error?: {\n    title: string;\n    message: string;\n  };\n  panel: PanelModel;\n  panelTitle: string;\n\n  // eslint-disable-next-line\n  snapshot?: any;\n  snapshotUpdate: number;\n}\n\nexport enum SnapshotTab {\n  Support,\n  Data,\n}\n\nexport enum ShowMessage {\n  PanelSnapshot,\n  GithubComment,\n}\n\nexport class SupportSnapshotService extends StateManagerBase<SupportSnapshotState> {\n  constructor(panel: PanelModel) {\n    super({\n      panel,\n      panelTitle: panel.replaceVariables(panel.title, undefined, 'text') || 'Panel',\n      currentTab: SnapshotTab.Support,\n      showMessage: ShowMessage.GithubComment,\n      snapshotText: '',\n      markdownText: '',\n      randomize: {},\n      snapshotUpdate: 0,\n      options: [\n        {\n          label: 'GitHub comment',\n          description: 'Copy and paste this message into a GitHub issue or comment',\n          value: ShowMessage.GithubComment,\n        },\n        {\n          label: 'Panel support snapshot',\n          description: 'Dashboard JSON used to help troubleshoot visualization issues',\n          value: ShowMessage.PanelSnapshot,\n        },\n      ],\n    });\n  }\n\n  async buildDebugDashboard() {\n    const { panel, randomize, snapshotUpdate, iframeLoading, currentTab } = this.state;\n    const snapshot = await getDebugDashboard(panel, randomize, getTimeSrv().timeRange());\n    const snapshotText = JSON.stringify(snapshot, null, 2);\n    const markdownText = getGithubMarkdown(panel, snapshotText);\n    const snapshotSize = formattedValueToString(getValueFormat('bytes')(snapshotText?.length ?? 0));\n\n    if (iframeLoading && currentTab === SnapshotTab.Support) {\n      setDashboardToFetchFromLocalStorage({ meta: {}, dashboard: snapshot });\n    }\n\n    this.setState({ snapshot, snapshotText, markdownText, snapshotSize, snapshotUpdate: snapshotUpdate + 1 });\n  }\n\n  onCurrentTabChange = (value: SnapshotTab) => {\n    this.setState({ currentTab: value });\n  };\n\n  onShowMessageChange = (value: SelectableValue<ShowMessage>) => {\n    this.setState({ showMessage: value.value! });\n  };\n\n  onGetMarkdownForClipboard = () => {\n    const { markdownText } = this.state;\n    const maxLen = Math.pow(1024, 2) * 1.5; // 1.5MB\n\n    if (markdownText.length > maxLen) {\n      this.setState({\n        error: {\n          title: 'Copy to clipboard failed',\n          message: 'Snapshot is too large, consider download and attaching a file instead',\n        },\n      });\n\n      return '';\n    }\n\n    return markdownText;\n  };\n\n  onDownloadDashboard = () => {\n    const { snapshotText, panelTitle } = this.state;\n    const blob = new Blob([snapshotText], {\n      type: 'text/plain',\n    });\n    const fileName = `debug-${panelTitle}-${dateTimeFormat(new Date())}.json.txt`;\n    saveAs(blob, fileName);\n  };\n\n  onSetSnapshotText = (snapshotText: string) => {\n    this.setState({ snapshotText });\n  };\n\n  onToggleRandomize = (k: keyof Randomize) => {\n    const { randomize } = this.state;\n    this.setState({ randomize: { ...randomize, [k]: !randomize[k] } });\n  };\n\n  onPreviewDashboard = () => {\n    const { snapshot } = this.state;\n    if (snapshot) {\n      setDashboardToFetchFromLocalStorage({ meta: {}, dashboard: snapshot });\n      global.open(config.appUrl + 'dashboard/new', '_blank');\n    }\n  };\n\n  subscribeToIframeLoadingMessage() {\n    const handleEvent = (evt: MessageEvent<string>) => {\n      if (evt.data === 'GrafanaAppInit') {\n        setDashboardToFetchFromLocalStorage({ meta: {}, dashboard: this.state.snapshot });\n        this.setState({ iframeLoading: true });\n      }\n    };\n    window.addEventListener('message', handleEvent, false);\n\n    return function cleanup() {\n      window.removeEventListener('message', handleEvent);\n    };\n  }\n}\n","import { css } from '@emotion/css';\nimport React, { useMemo, useEffect } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { PanelPlugin, GrafanaTheme2, FeatureState } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { config } from '@grafana/runtime';\nimport {\n  Drawer,\n  Tab,\n  TabsBar,\n  CodeEditor,\n  useStyles2,\n  Field,\n  HorizontalGroup,\n  InlineSwitch,\n  Button,\n  Spinner,\n  Alert,\n  FeatureBadge,\n  Select,\n  ClipboardButton,\n  Icon,\n} from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { PanelModel } from 'app/features/dashboard/state';\n\nimport { ShowMessage, SnapshotTab, SupportSnapshotService } from './SupportSnapshotService';\n\ninterface Props {\n  panel: PanelModel;\n  plugin?: PanelPlugin | null;\n  onClose: () => void;\n}\n\nexport function HelpWizard({ panel, plugin, onClose }: Props) {\n  const styles = useStyles2(getStyles);\n  const service = useMemo(() => new SupportSnapshotService(panel), [panel]);\n\n  const {\n    currentTab,\n    loading,\n    error,\n    iframeLoading,\n    options,\n    showMessage,\n    snapshotSize,\n    markdownText,\n    snapshotText,\n    randomize,\n    panelTitle,\n    snapshotUpdate,\n  } = service.useState();\n\n  useEffect(() => {\n    service.buildDebugDashboard();\n  }, [service, plugin, randomize]);\n\n  useEffect(() => {\n    // Listen for messages from loaded iframe\n    return service.subscribeToIframeLoadingMessage();\n  }, [service]);\n\n  if (!plugin) {\n    return null;\n  }\n\n  const tabs = [\n    { label: 'Snapshot', value: SnapshotTab.Support },\n    { label: 'Data', value: SnapshotTab.Data },\n  ];\n\n  return (\n    <Drawer\n      title={`Get help with this panel`}\n      width=\"90%\"\n      onClose={onClose}\n      expandable\n      scrollableContent\n      subtitle={\n        <Stack direction=\"column\" gap={1}>\n          <Stack direction=\"row\" gap={1}>\n            <FeatureBadge featureState={FeatureState.beta} />\n            <a\n              href=\"https://grafana.com/docs/grafana/latest/troubleshooting/\"\n              target=\"blank\"\n              className=\"external-link\"\n              rel=\"noopener noreferrer\"\n            >\n              Troubleshooting docs <Icon name=\"external-link-alt\" />\n            </a>\n          </Stack>\n          <span className=\"muted\">\n            To request troubleshooting help, send a snapshot of this panel to Grafana Labs Technical Support. The\n            snapshot contains query response data and panel settings.\n          </span>\n        </Stack>\n      }\n      tabs={\n        <TabsBar>\n          {tabs.map((t, index) => (\n            <Tab\n              key={`${t.value}-${index}`}\n              label={t.label}\n              active={t.value === currentTab}\n              onChangeTab={() => service.onCurrentTabChange(t.value!)}\n            />\n          ))}\n        </TabsBar>\n      }\n    >\n      {loading && <Spinner />}\n      {error && <Alert title={error.title}>{error.message}</Alert>}\n\n      {currentTab === SnapshotTab.Data && (\n        <div className={styles.code}>\n          <div className={styles.opts}>\n            <Field label=\"Template\" className={styles.field}>\n              <Select options={options} value={showMessage} onChange={service.onShowMessageChange} />\n            </Field>\n\n            {showMessage === ShowMessage.GithubComment ? (\n              <ClipboardButton icon=\"copy\" getText={service.onGetMarkdownForClipboard}>\n                Copy to clipboard\n              </ClipboardButton>\n            ) : (\n              <Button icon=\"download-alt\" onClick={service.onDownloadDashboard}>\n                Download ({snapshotSize})\n              </Button>\n            )}\n          </div>\n          <AutoSizer disableWidth>\n            {({ height }) => (\n              <CodeEditor\n                width=\"100%\"\n                height={height}\n                language={showMessage === ShowMessage.GithubComment ? 'markdown' : 'json'}\n                showLineNumbers={true}\n                showMiniMap={true}\n                value={showMessage === ShowMessage.GithubComment ? markdownText : snapshotText}\n                readOnly={false}\n                onBlur={service.onSetSnapshotText}\n              />\n            )}\n          </AutoSizer>\n        </div>\n      )}\n      {currentTab === SnapshotTab.Support && (\n        <>\n          <Field\n            label=\"Randomize data\"\n            description=\"Modify the original data to hide sensitve information.  Note the lengths will stay the same, and duplicate values will be equal.\"\n          >\n            <HorizontalGroup>\n              <InlineSwitch\n                label=\"Labels\"\n                id=\"randomize-labels\"\n                showLabel={true}\n                value={Boolean(randomize.labels)}\n                onChange={() => service.onToggleRandomize('labels')}\n              />\n              <InlineSwitch\n                label=\"Field names\"\n                id=\"randomize-field-names\"\n                showLabel={true}\n                value={Boolean(randomize.names)}\n                onChange={() => service.onToggleRandomize('names')}\n              />\n              <InlineSwitch\n                label=\"String values\"\n                id=\"randomize-string-values\"\n                showLabel={true}\n                value={Boolean(randomize.values)}\n                onChange={() => service.onToggleRandomize('values')}\n              />\n            </HorizontalGroup>\n          </Field>\n\n          <Field label=\"Support snapshot\" description={`Panel: ${panelTitle}`}>\n            <Stack>\n              <Button icon=\"download-alt\" onClick={service.onDownloadDashboard}>\n                Dashboard ({snapshotSize})\n              </Button>\n              <ClipboardButton\n                icon=\"github\"\n                getText={service.onGetMarkdownForClipboard}\n                title=\"Copy a complete GitHub comment to the clipboard\"\n              >\n                Copy to clipboard\n              </ClipboardButton>\n              <Button\n                onClick={service.onPreviewDashboard}\n                variant=\"secondary\"\n                title=\"Open support snapshot dashboard in a new tab\"\n              >\n                Preview\n              </Button>\n            </Stack>\n          </Field>\n\n          <AutoSizer disableWidth>\n            {({ height }) => (\n              <>\n                <iframe\n                  title=\"Support snapshot preview\"\n                  src={`${config.appUrl}dashboard/new?orgId=${contextSrv.user.orgId}&kiosk&${snapshotUpdate}`}\n                  width=\"100%\"\n                  height={height - 100}\n                  frameBorder=\"0\"\n                  style={{\n                    display: iframeLoading ? 'block' : 'none',\n                    marginTop: 16,\n                  }}\n                />\n                {!iframeLoading && <div>&nbsp;</div>}\n              </>\n            )}\n          </AutoSizer>\n        </>\n      )}\n    </Drawer>\n  );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  code: css`\n    flex-grow: 1;\n    height: 100%;\n    overflow: scroll;\n  `,\n  field: css`\n    width: 100%;\n  `,\n  opts: css`\n    display: flex;\n    display: flex;\n    width: 100%;\n    flex-grow: 0;\n    align-items: center;\n    justify-content: flex-end;\n\n    button {\n      margin-left: 8px;\n    }\n  `,\n});\n","import { useEffect, useRef, useState } from 'react';\nimport { Unsubscribable } from 'rxjs';\n\nimport { DataQueryError, LoadingState, PanelData } from '@grafana/data';\n\nimport { GetDataOptions } from '../../../query/state/PanelQueryRunner';\nimport { PanelModel } from '../../state';\n\ninterface UsePanelLatestData {\n  data?: PanelData;\n  error?: DataQueryError;\n  isLoading: boolean;\n  hasSeries: boolean;\n}\n\n/**\n * Subscribes and returns latest panel data from PanelQueryRunner\n */\nexport const usePanelLatestData = (\n  panel: PanelModel,\n  options: GetDataOptions,\n  checkSchema?: boolean\n): UsePanelLatestData => {\n  const querySubscription = useRef<Unsubscribable>();\n  const [latestData, setLatestData] = useState<PanelData>();\n\n  useEffect(() => {\n    let lastRev = -1;\n    let lastUpdate = 0;\n\n    querySubscription.current = panel\n      .getQueryRunner()\n      .getData(options)\n      .subscribe({\n        next: (data) => {\n          if (checkSchema) {\n            if (lastRev === data.structureRev) {\n              const now = Date.now();\n              const elapsed = now - lastUpdate;\n              if (elapsed < 10000) {\n                return; // avoid updates if the schema has not changed for 10s\n              }\n              lastUpdate = now;\n            }\n            lastRev = data.structureRev ?? -1;\n          }\n          setLatestData(data);\n        },\n      });\n\n    return () => {\n      if (querySubscription.current) {\n        querySubscription.current.unsubscribe();\n      }\n    };\n    /**\n     * Adding separate options to dependencies array to avoid additional hook for comparing previous options with current.\n     * Otherwise, passing different references to the same object might cause troubles.\n     */\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [panel, options.withFieldConfig, options.withTransforms]);\n\n  return {\n    data: latestData,\n    error: latestData && latestData.error,\n    isLoading: latestData ? latestData.state === LoadingState.Loading : true,\n    hasSeries: latestData ? !!latestData.series : false,\n  };\n};\n","import React from 'react';\n\nimport { DataSourceApi, PanelData } from '@grafana/data';\nimport { Trans } from 'app/core/internationalization';\n\ninterface InspectMetadataTabProps {\n  data: PanelData;\n  metadataDatasource?: DataSourceApi;\n}\nexport const InspectMetadataTab: React.FC<InspectMetadataTabProps> = ({ data, metadataDatasource }) => {\n  if (!metadataDatasource || !metadataDatasource.components?.MetadataInspector) {\n    return <Trans i18nKey=\"dashboard.inspect-meta.no-inspector\">No Metadata Inspector</Trans>;\n  }\n  return <metadataDatasource.components.MetadataInspector datasource={metadataDatasource} data={data.series} />;\n};\n","import React, { useState } from 'react';\n\nimport { CoreApp, DataSourceApi, formattedValueToString, getValueFormat, PanelData, PanelPlugin } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { Drawer, Tab, TabsBar } from '@grafana/ui';\nimport { t, Trans } from 'app/core/internationalization';\nimport { InspectDataTab } from 'app/features/inspector/InspectDataTab';\nimport { InspectErrorTab } from 'app/features/inspector/InspectErrorTab';\nimport { InspectJSONTab } from 'app/features/inspector/InspectJSONTab';\nimport { InspectMetadataTab } from 'app/features/inspector/InspectMetadataTab';\nimport { InspectStatsTab } from 'app/features/inspector/InspectStatsTab';\nimport { QueryInspector } from 'app/features/inspector/QueryInspector';\nimport { InspectTab } from 'app/features/inspector/types';\n\nimport { GetDataOptions } from '../../../query/state/PanelQueryRunner';\nimport { DashboardModel, PanelModel } from '../../state';\n\ninterface Props {\n  dashboard: DashboardModel;\n  panel: PanelModel;\n  plugin?: PanelPlugin | null;\n  defaultTab?: InspectTab;\n  tabs: Array<{ label: string; value: InspectTab }>;\n  // The last raw response\n  data?: PanelData;\n  isDataLoading: boolean;\n  dataOptions: GetDataOptions;\n  // If the datasource supports custom metadata\n  metadataDatasource?: DataSourceApi;\n  onDataOptionsChange: (options: GetDataOptions) => void;\n  onClose: () => void;\n}\n\nexport const InspectContent = ({\n  panel,\n  plugin,\n  dashboard,\n  tabs,\n  data,\n  isDataLoading,\n  dataOptions,\n  metadataDatasource,\n  defaultTab,\n  onDataOptionsChange,\n  onClose,\n}: Props) => {\n  const [currentTab, setCurrentTab] = useState(defaultTab ?? InspectTab.Data);\n\n  if (!plugin) {\n    return null;\n  }\n\n  const error = data?.error;\n\n  // Validate that the active tab is actually valid and allowed\n  let activeTab = currentTab;\n  if (!tabs.find((item) => item.value === currentTab)) {\n    activeTab = InspectTab.JSON;\n  }\n\n  const panelTitle = getTemplateSrv().replace(panel.title, panel.scopedVars, 'text') || 'Panel';\n  const title = t('dashboard.inspect.title', 'Inspect: {{panelTitle}}', { panelTitle });\n\n  return (\n    <Drawer\n      title={title}\n      subtitle={data && formatStats(data)}\n      width=\"50%\"\n      onClose={onClose}\n      expandable\n      scrollableContent\n      tabs={\n        <TabsBar>\n          {tabs.map((tab, index) => {\n            return (\n              <Tab\n                key={`${tab.value}-${index}`}\n                label={tab.label}\n                active={tab.value === activeTab}\n                onChangeTab={() => setCurrentTab(tab.value || InspectTab.Data)}\n              />\n            );\n          })}\n        </TabsBar>\n      }\n    >\n      {activeTab === InspectTab.Data && (\n        <InspectDataTab\n          panel={panel}\n          data={data && data.series}\n          isLoading={isDataLoading}\n          options={dataOptions}\n          onOptionsChange={onDataOptionsChange}\n          timeZone={dashboard.timezone}\n          app={CoreApp.Dashboard}\n        />\n      )}\n      {data && activeTab === InspectTab.Meta && (\n        <InspectMetadataTab data={data} metadataDatasource={metadataDatasource} />\n      )}\n\n      {activeTab === InspectTab.JSON && (\n        <InspectJSONTab panel={panel} dashboard={dashboard} data={data} onClose={onClose} />\n      )}\n      {activeTab === InspectTab.Error && <InspectErrorTab error={error} />}\n      {data && activeTab === InspectTab.Stats && <InspectStatsTab data={data} timeZone={dashboard.getTimezone()} />}\n      {data && activeTab === InspectTab.Query && (\n        <QueryInspector panel={panel} data={data.series} onRefreshQuery={() => panel.refresh()} />\n      )}\n    </Drawer>\n  );\n};\n\nfunction formatStats(data: PanelData) {\n  const { request } = data;\n  if (!request) {\n    return '';\n  }\n\n  const queryCount = request.targets.length;\n  const requestTime = request.endTime ? request.endTime - request.startTime : 0;\n  const formatted = formattedValueToString(getValueFormat('ms')(requestTime));\n\n  return (\n    <Trans i18nKey=\"dashboard.inspect.subtitle\">\n      {{ queryCount }} queries with total query time of {{ formatted }}\n    </Trans>\n  );\n}\n","import { useMemo } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { DataQueryError, DataSourceApi, PanelData, PanelPlugin } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { t } from 'app/core/internationalization';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { InspectTab } from 'app/features/inspector/types';\n\nimport { supportsDataQuery } from '../PanelEditor/utils';\n\nimport { PanelInspectActionSupplier } from './PanelInspectActions';\n\n/**\n * Given PanelData return first data source supporting metadata inspector\n */\nexport const useDatasourceMetadata = (data?: PanelData) => {\n  const state = useAsync(async () => {\n    const targets = data?.request?.targets || [];\n\n    if (data && data.series && targets.length) {\n      for (const frame of data.series) {\n        if (frame.meta && frame.meta.custom) {\n          // get data source from first query\n          const dataSource = await getDataSourceSrv().get(targets[0].datasource);\n          if (dataSource && dataSource.components?.MetadataInspector) {\n            return dataSource;\n          }\n        }\n      }\n    }\n\n    return undefined;\n  }, [data]);\n  return state.value;\n};\n\n/**\n * Configures tabs for PanelInspector\n */\nexport const useInspectTabs = (\n  panel: PanelModel,\n  dashboard: DashboardModel,\n  plugin: PanelPlugin | undefined | null,\n  error?: DataQueryError,\n  metaDs?: DataSourceApi\n) => {\n  return useMemo(() => {\n    const tabs = [];\n    if (supportsDataQuery(plugin)) {\n      tabs.push({ label: t('dashboard.inspect.data-tab', 'Data'), value: InspectTab.Data });\n      tabs.push({ label: t('dashboard.inspect.stats-tab', 'Stats'), value: InspectTab.Stats });\n    }\n\n    if (metaDs) {\n      tabs.push({ label: t('dashboard.inspect.meta-tab', 'Meta Data'), value: InspectTab.Meta });\n    }\n\n    tabs.push({ label: t('dashboard.inspect.json-tab', 'JSON'), value: InspectTab.JSON });\n\n    if (error && error.message) {\n      tabs.push({ label: t('dashboard.inspect.error-tab', 'Error'), value: InspectTab.Error });\n    }\n\n    // This is a quick internal hack to allow custom actions in inspect\n    // For 8.1, something like this should be exposed through grafana/runtime\n    const supplier = (window as any).grafanaPanelInspectActionSupplier as PanelInspectActionSupplier;\n    if (supplier && supplier.getActions(panel)?.length) {\n      tabs.push({\n        label: t('dashboard.inspect.actions-tab', 'Actions'),\n        value: InspectTab.Actions,\n      });\n    }\n\n    if (dashboard.meta.canEdit && supportsDataQuery(plugin)) {\n      tabs.push({ label: t('dashboard.inspect.query-tab', 'Query'), value: InspectTab.Query });\n    }\n    return tabs;\n  }, [panel, plugin, metaDs, dashboard, error]);\n};\n","import React, { useState } from 'react';\nimport { connect, MapStateToProps } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { StoreState } from 'app/types';\n\nimport { GetDataOptions } from '../../../query/state/PanelQueryRunner';\nimport { HelpWizard } from '../HelpWizard/HelpWizard';\nimport { usePanelLatestData } from '../PanelEditor/usePanelLatestData';\n\nimport { InspectContent } from './InspectContent';\nimport { useDatasourceMetadata, useInspectTabs } from './hooks';\n\ninterface OwnProps {\n  dashboard: DashboardModel;\n  panel: PanelModel;\n}\n\nexport interface ConnectedProps {\n  plugin?: PanelPlugin | null;\n}\n\nexport type Props = OwnProps & ConnectedProps;\n\nconst PanelInspectorUnconnected = ({ panel, dashboard, plugin }: Props) => {\n  const [dataOptions, setDataOptions] = useState<GetDataOptions>({\n    withTransforms: false,\n    withFieldConfig: true,\n  });\n\n  const location = useLocation();\n  const { data, isLoading, error } = usePanelLatestData(panel, dataOptions, true);\n  const metaDs = useDatasourceMetadata(data);\n  const tabs = useInspectTabs(panel, dashboard, plugin, error, metaDs);\n  const defaultTab = new URLSearchParams(location.search).get('inspectTab') as InspectTab;\n\n  const onClose = () => {\n    locationService.partial({\n      inspect: null,\n      inspectTab: null,\n    });\n  };\n\n  if (!plugin) {\n    return null;\n  }\n\n  if (defaultTab === InspectTab.Help) {\n    return <HelpWizard panel={panel} plugin={plugin} onClose={onClose} />;\n  }\n\n  return (\n    <InspectContent\n      dashboard={dashboard}\n      panel={panel}\n      plugin={plugin}\n      defaultTab={defaultTab}\n      tabs={tabs}\n      data={data}\n      isDataLoading={isLoading}\n      dataOptions={dataOptions}\n      onDataOptionsChange={setDataOptions}\n      metadataDatasource={metaDs}\n      onClose={onClose}\n    />\n  );\n};\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, props) => {\n  const panelState = getPanelStateForModel(state, props.panel);\n  if (!panelState) {\n    return { plugin: null };\n  }\n\n  return {\n    plugin: panelState.plugin,\n  };\n};\n\nexport const PanelInspector = connect(mapStateToProps)(PanelInspectorUnconnected);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport stylePropType from 'react-style-proptype';\nimport { polyfill } from 'react-lifecycles-compat';\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) _setPrototypeOf(subClass, superClass);\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nfunction _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _createSuper(Derived) {\n  return function () {\n    var Super = _getPrototypeOf(Derived),\n        result;\n\n    if (_isNativeReflectConstruct()) {\n      var NewTarget = _getPrototypeOf(this).constructor;\n\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n\n    return _possibleConstructorReturn(this, result);\n  };\n}\n\nvar Pane = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(Pane, _React$PureComponent);\n\n  var _super = _createSuper(Pane);\n\n  function Pane() {\n    _classCallCheck(this, Pane);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(Pane, [{\n    key: \"render\",\n    value: function render() {\n      var _this$props = this.props,\n          children = _this$props.children,\n          className = _this$props.className,\n          split = _this$props.split,\n          styleProps = _this$props.style,\n          size = _this$props.size,\n          eleRef = _this$props.eleRef;\n      var classes = ['Pane', split, className];\n      var style = {\n        flex: 1,\n        position: 'relative',\n        outline: 'none'\n      };\n\n      if (size !== undefined) {\n        if (split === 'vertical') {\n          style.width = size;\n        } else {\n          style.height = size;\n          style.display = 'flex';\n        }\n\n        style.flex = 'none';\n      }\n\n      style = Object.assign({}, style, styleProps || {});\n      return /*#__PURE__*/React.createElement(\"div\", {\n        ref: eleRef,\n        className: classes.join(' '),\n        style: style\n      }, children);\n    }\n  }]);\n\n  return Pane;\n}(React.PureComponent);\n\nPane.propTypes = {\n  className: PropTypes.string.isRequired,\n  children: PropTypes.node.isRequired,\n  size: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  split: PropTypes.oneOf(['vertical', 'horizontal']),\n  style: stylePropType,\n  eleRef: PropTypes.func\n};\nPane.defaultProps = {};\n\nvar RESIZER_DEFAULT_CLASSNAME = 'Resizer';\n\nvar Resizer = /*#__PURE__*/function (_React$Component) {\n  _inherits(Resizer, _React$Component);\n\n  var _super = _createSuper(Resizer);\n\n  function Resizer() {\n    _classCallCheck(this, Resizer);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(Resizer, [{\n    key: \"render\",\n    value: function render() {\n      var _this$props = this.props,\n          className = _this$props.className,\n          _onClick = _this$props.onClick,\n          _onDoubleClick = _this$props.onDoubleClick,\n          _onMouseDown = _this$props.onMouseDown,\n          _onTouchEnd = _this$props.onTouchEnd,\n          _onTouchStart = _this$props.onTouchStart,\n          resizerClassName = _this$props.resizerClassName,\n          split = _this$props.split,\n          style = _this$props.style;\n      var classes = [resizerClassName, split, className];\n      return /*#__PURE__*/React.createElement(\"span\", {\n        role: \"presentation\",\n        className: classes.join(' '),\n        style: style,\n        onMouseDown: function onMouseDown(event) {\n          return _onMouseDown(event);\n        },\n        onTouchStart: function onTouchStart(event) {\n          event.preventDefault();\n\n          _onTouchStart(event);\n        },\n        onTouchEnd: function onTouchEnd(event) {\n          event.preventDefault();\n\n          _onTouchEnd(event);\n        },\n        onClick: function onClick(event) {\n          if (_onClick) {\n            event.preventDefault();\n\n            _onClick(event);\n          }\n        },\n        onDoubleClick: function onDoubleClick(event) {\n          if (_onDoubleClick) {\n            event.preventDefault();\n\n            _onDoubleClick(event);\n          }\n        }\n      });\n    }\n  }]);\n\n  return Resizer;\n}(React.Component);\n\nResizer.propTypes = {\n  className: PropTypes.string.isRequired,\n  onClick: PropTypes.func,\n  onDoubleClick: PropTypes.func,\n  onMouseDown: PropTypes.func.isRequired,\n  onTouchStart: PropTypes.func.isRequired,\n  onTouchEnd: PropTypes.func.isRequired,\n  split: PropTypes.oneOf(['vertical', 'horizontal']),\n  style: stylePropType,\n  resizerClassName: PropTypes.string.isRequired\n};\nResizer.defaultProps = {\n  resizerClassName: RESIZER_DEFAULT_CLASSNAME\n};\n\nfunction unFocus(document, window) {\n  if (document.selection) {\n    document.selection.empty();\n  } else {\n    try {\n      window.getSelection().removeAllRanges(); // eslint-disable-next-line no-empty\n    } catch (e) {}\n  }\n}\n\nfunction getDefaultSize(defaultSize, minSize, maxSize, draggedSize) {\n  if (typeof draggedSize === 'number') {\n    var min = typeof minSize === 'number' ? minSize : 0;\n    var max = typeof maxSize === 'number' && maxSize >= 0 ? maxSize : Infinity;\n    return Math.max(min, Math.min(max, draggedSize));\n  }\n\n  if (defaultSize !== undefined) {\n    return defaultSize;\n  }\n\n  return minSize;\n}\n\nfunction removeNullChildren(children) {\n  return React.Children.toArray(children).filter(function (c) {\n    return c;\n  });\n}\n\nvar SplitPane = /*#__PURE__*/function (_React$Component) {\n  _inherits(SplitPane, _React$Component);\n\n  var _super = _createSuper(SplitPane);\n\n  function SplitPane(props) {\n    var _this;\n\n    _classCallCheck(this, SplitPane);\n\n    _this = _super.call(this, props);\n    _this.onMouseDown = _this.onMouseDown.bind(_assertThisInitialized(_this));\n    _this.onTouchStart = _this.onTouchStart.bind(_assertThisInitialized(_this));\n    _this.onMouseMove = _this.onMouseMove.bind(_assertThisInitialized(_this));\n    _this.onTouchMove = _this.onTouchMove.bind(_assertThisInitialized(_this));\n    _this.onMouseUp = _this.onMouseUp.bind(_assertThisInitialized(_this)); // order of setting panel sizes.\n    // 1. size\n    // 2. getDefaultSize(defaultSize, minsize, maxSize)\n\n    var size = props.size,\n        defaultSize = props.defaultSize,\n        minSize = props.minSize,\n        maxSize = props.maxSize,\n        primary = props.primary;\n    var initialSize = size !== undefined ? size : getDefaultSize(defaultSize, minSize, maxSize, null);\n    _this.state = {\n      active: false,\n      resized: false,\n      pane1Size: primary === 'first' ? initialSize : undefined,\n      pane2Size: primary === 'second' ? initialSize : undefined,\n      // these are props that are needed in static functions. ie: gDSFP\n      instanceProps: {\n        size: size\n      }\n    };\n    return _this;\n  }\n\n  _createClass(SplitPane, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      document.addEventListener('mouseup', this.onMouseUp);\n      document.addEventListener('mousemove', this.onMouseMove);\n      document.addEventListener('touchmove', this.onTouchMove);\n      this.setState(SplitPane.getSizeUpdate(this.props, this.state));\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      document.removeEventListener('mouseup', this.onMouseUp);\n      document.removeEventListener('mousemove', this.onMouseMove);\n      document.removeEventListener('touchmove', this.onTouchMove);\n    }\n  }, {\n    key: \"onMouseDown\",\n    value: function onMouseDown(event) {\n      var eventWithTouches = Object.assign({}, event, {\n        touches: [{\n          clientX: event.clientX,\n          clientY: event.clientY\n        }]\n      });\n      this.onTouchStart(eventWithTouches);\n    }\n  }, {\n    key: \"onTouchStart\",\n    value: function onTouchStart(event) {\n      var _this$props = this.props,\n          allowResize = _this$props.allowResize,\n          onDragStarted = _this$props.onDragStarted,\n          split = _this$props.split;\n\n      if (allowResize) {\n        unFocus(document, window);\n        var position = split === 'vertical' ? event.touches[0].clientX : event.touches[0].clientY;\n\n        if (typeof onDragStarted === 'function') {\n          onDragStarted();\n        }\n\n        this.setState({\n          active: true,\n          position: position\n        });\n      }\n    }\n  }, {\n    key: \"onMouseMove\",\n    value: function onMouseMove(event) {\n      var eventWithTouches = Object.assign({}, event, {\n        touches: [{\n          clientX: event.clientX,\n          clientY: event.clientY\n        }]\n      });\n      this.onTouchMove(eventWithTouches);\n    }\n  }, {\n    key: \"onTouchMove\",\n    value: function onTouchMove(event) {\n      var _this$props2 = this.props,\n          allowResize = _this$props2.allowResize,\n          maxSize = _this$props2.maxSize,\n          minSize = _this$props2.minSize,\n          onChange = _this$props2.onChange,\n          split = _this$props2.split,\n          step = _this$props2.step;\n      var _this$state = this.state,\n          active = _this$state.active,\n          position = _this$state.position;\n\n      if (allowResize && active) {\n        unFocus(document, window);\n        var isPrimaryFirst = this.props.primary === 'first';\n        var ref = isPrimaryFirst ? this.pane1 : this.pane2;\n        var ref2 = isPrimaryFirst ? this.pane2 : this.pane1;\n\n        if (ref) {\n          var node = ref;\n          var node2 = ref2;\n\n          if (node.getBoundingClientRect) {\n            var width = node.getBoundingClientRect().width;\n            var height = node.getBoundingClientRect().height;\n            var current = split === 'vertical' ? event.touches[0].clientX : event.touches[0].clientY;\n            var size = split === 'vertical' ? width : height;\n            var positionDelta = position - current;\n\n            if (step) {\n              if (Math.abs(positionDelta) < step) {\n                return;\n              } // Integer division\n              // eslint-disable-next-line no-bitwise\n\n\n              positionDelta = ~~(positionDelta / step) * step;\n            }\n\n            var sizeDelta = isPrimaryFirst ? positionDelta : -positionDelta;\n            var pane1Order = parseInt(window.getComputedStyle(node).order);\n            var pane2Order = parseInt(window.getComputedStyle(node2).order);\n\n            if (pane1Order > pane2Order) {\n              sizeDelta = -sizeDelta;\n            }\n\n            var newMaxSize = maxSize;\n\n            if (maxSize !== undefined && maxSize <= 0) {\n              var splitPane = this.splitPane;\n\n              if (split === 'vertical') {\n                newMaxSize = splitPane.getBoundingClientRect().width + maxSize;\n              } else {\n                newMaxSize = splitPane.getBoundingClientRect().height + maxSize;\n              }\n            }\n\n            var newSize = size - sizeDelta;\n            var newPosition = position - positionDelta;\n\n            if (newSize < minSize) {\n              newSize = minSize;\n            } else if (maxSize !== undefined && newSize > newMaxSize) {\n              newSize = newMaxSize;\n            } else {\n              this.setState({\n                position: newPosition,\n                resized: true\n              });\n            }\n\n            if (onChange) onChange(newSize);\n            this.setState(_defineProperty({\n              draggedSize: newSize\n            }, isPrimaryFirst ? 'pane1Size' : 'pane2Size', newSize));\n          }\n        }\n      }\n    }\n  }, {\n    key: \"onMouseUp\",\n    value: function onMouseUp() {\n      var _this$props3 = this.props,\n          allowResize = _this$props3.allowResize,\n          onDragFinished = _this$props3.onDragFinished;\n      var _this$state2 = this.state,\n          active = _this$state2.active,\n          draggedSize = _this$state2.draggedSize;\n\n      if (allowResize && active) {\n        if (typeof onDragFinished === 'function') {\n          onDragFinished(draggedSize);\n        }\n\n        this.setState({\n          active: false\n        });\n      }\n    } // we have to check values since gDSFP is called on every render and more in StrictMode\n\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var _this$props4 = this.props,\n          allowResize = _this$props4.allowResize,\n          children = _this$props4.children,\n          className = _this$props4.className,\n          onResizerClick = _this$props4.onResizerClick,\n          onResizerDoubleClick = _this$props4.onResizerDoubleClick,\n          paneClassName = _this$props4.paneClassName,\n          pane1ClassName = _this$props4.pane1ClassName,\n          pane2ClassName = _this$props4.pane2ClassName,\n          paneStyle = _this$props4.paneStyle,\n          pane1StyleProps = _this$props4.pane1Style,\n          pane2StyleProps = _this$props4.pane2Style,\n          resizerClassName = _this$props4.resizerClassName,\n          resizerStyle = _this$props4.resizerStyle,\n          split = _this$props4.split,\n          styleProps = _this$props4.style;\n      var _this$state3 = this.state,\n          pane1Size = _this$state3.pane1Size,\n          pane2Size = _this$state3.pane2Size;\n      var disabledClass = allowResize ? '' : 'disabled';\n      var resizerClassNamesIncludingDefault = resizerClassName ? \"\".concat(resizerClassName, \" \").concat(RESIZER_DEFAULT_CLASSNAME) : resizerClassName;\n      var notNullChildren = removeNullChildren(children);\n\n      var style = _objectSpread2({\n        display: 'flex',\n        flex: 1,\n        height: '100%',\n        position: 'absolute',\n        outline: 'none',\n        overflow: 'hidden',\n        MozUserSelect: 'text',\n        WebkitUserSelect: 'text',\n        msUserSelect: 'text',\n        userSelect: 'text'\n      }, styleProps);\n\n      if (split === 'vertical') {\n        Object.assign(style, {\n          flexDirection: 'row',\n          left: 0,\n          right: 0\n        });\n      } else {\n        Object.assign(style, {\n          bottom: 0,\n          flexDirection: 'column',\n          minHeight: '100%',\n          top: 0,\n          width: '100%'\n        });\n      }\n\n      var classes = ['SplitPane', className, split, disabledClass];\n\n      var pane1Style = _objectSpread2({}, paneStyle, {}, pane1StyleProps);\n\n      var pane2Style = _objectSpread2({}, paneStyle, {}, pane2StyleProps);\n\n      var pane1Classes = ['Pane1', paneClassName, pane1ClassName].join(' ');\n      var pane2Classes = ['Pane2', paneClassName, pane2ClassName].join(' ');\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: classes.join(' '),\n        ref: function ref(node) {\n          _this2.splitPane = node;\n        },\n        style: style\n      }, /*#__PURE__*/React.createElement(Pane, {\n        className: pane1Classes,\n        key: \"pane1\",\n        eleRef: function eleRef(node) {\n          _this2.pane1 = node;\n        },\n        size: pane1Size,\n        split: split,\n        style: pane1Style\n      }, notNullChildren[0]), /*#__PURE__*/React.createElement(Resizer, {\n        className: disabledClass,\n        onClick: onResizerClick,\n        onDoubleClick: onResizerDoubleClick,\n        onMouseDown: this.onMouseDown,\n        onTouchStart: this.onTouchStart,\n        onTouchEnd: this.onMouseUp,\n        key: \"resizer\",\n        resizerClassName: resizerClassNamesIncludingDefault,\n        split: split,\n        style: resizerStyle || {}\n      }), /*#__PURE__*/React.createElement(Pane, {\n        className: pane2Classes,\n        key: \"pane2\",\n        eleRef: function eleRef(node) {\n          _this2.pane2 = node;\n        },\n        size: pane2Size,\n        split: split,\n        style: pane2Style\n      }, notNullChildren[1]));\n    }\n  }], [{\n    key: \"getDerivedStateFromProps\",\n    value: function getDerivedStateFromProps(nextProps, prevState) {\n      return SplitPane.getSizeUpdate(nextProps, prevState);\n    }\n  }, {\n    key: \"getSizeUpdate\",\n    value: function getSizeUpdate(props, state) {\n      var newState = {};\n      var instanceProps = state.instanceProps;\n\n      if (instanceProps.size === props.size && props.size !== undefined) {\n        return {};\n      }\n\n      var newSize = props.size !== undefined ? props.size : getDefaultSize(props.defaultSize, props.minSize, props.maxSize, state.draggedSize);\n\n      if (props.size !== undefined) {\n        newState.draggedSize = newSize;\n      }\n\n      var isPanel1Primary = props.primary === 'first';\n      newState[isPanel1Primary ? 'pane1Size' : 'pane2Size'] = newSize;\n      newState[isPanel1Primary ? 'pane2Size' : 'pane1Size'] = undefined;\n      newState.instanceProps = {\n        size: props.size\n      };\n      return newState;\n    }\n  }]);\n\n  return SplitPane;\n}(React.Component);\n\nSplitPane.propTypes = {\n  allowResize: PropTypes.bool,\n  children: PropTypes.arrayOf(PropTypes.node).isRequired,\n  className: PropTypes.string,\n  primary: PropTypes.oneOf(['first', 'second']),\n  minSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  maxSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  // eslint-disable-next-line react/no-unused-prop-types\n  defaultSize: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  size: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  split: PropTypes.oneOf(['vertical', 'horizontal']),\n  onDragStarted: PropTypes.func,\n  onDragFinished: PropTypes.func,\n  onChange: PropTypes.func,\n  onResizerClick: PropTypes.func,\n  onResizerDoubleClick: PropTypes.func,\n  style: stylePropType,\n  resizerStyle: stylePropType,\n  paneClassName: PropTypes.string,\n  pane1ClassName: PropTypes.string,\n  pane2ClassName: PropTypes.string,\n  paneStyle: stylePropType,\n  pane1Style: stylePropType,\n  pane2Style: stylePropType,\n  resizerClassName: PropTypes.string,\n  step: PropTypes.number\n};\nSplitPane.defaultProps = {\n  allowResize: true,\n  minSize: 50,\n  primary: 'first',\n  split: 'vertical',\n  paneClassName: '',\n  pane1ClassName: '',\n  pane2ClassName: ''\n};\npolyfill(SplitPane);\n\nexport default SplitPane;\nexport { Pane };\n","import { css, cx } from '@emotion/css';\nimport React, { createRef, MutableRefObject, PureComponent, ReactNode } from 'react';\nimport SplitPane from 'react-split-pane';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from 'app/core/config';\n\nenum Pane {\n  Right,\n  Top,\n}\n\ninterface Props {\n  leftPaneComponents: ReactNode[] | ReactNode;\n  rightPaneComponents: ReactNode;\n  uiState: { topPaneSize: number; rightPaneSize: number };\n  rightPaneVisible?: boolean;\n  updateUiState: (uiState: { topPaneSize?: number; rightPaneSize?: number }) => void;\n}\n\nexport class SplitPaneWrapper extends PureComponent<Props> {\n  rafToken: MutableRefObject<number | null> = createRef();\n  static defaultProps = {\n    rightPaneVisible: true,\n  };\n\n  componentDidMount() {\n    window.addEventListener('resize', this.updateSplitPaneSize);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.updateSplitPaneSize);\n  }\n\n  updateSplitPaneSize = () => {\n    if (this.rafToken.current !== undefined) {\n      window.cancelAnimationFrame(this.rafToken.current!);\n    }\n    this.rafToken.current = window.requestAnimationFrame(() => {\n      this.forceUpdate();\n    });\n  };\n\n  onDragFinished = (pane: Pane, size?: number) => {\n    document.body.style.cursor = 'auto';\n\n    // When the drag handle is just clicked size is undefined\n    if (!size) {\n      return;\n    }\n\n    const { updateUiState } = this.props;\n    if (pane === Pane.Top) {\n      updateUiState({\n        topPaneSize: size / window.innerHeight,\n      });\n    } else {\n      updateUiState({\n        rightPaneSize: size / window.innerWidth,\n      });\n    }\n  };\n\n  onDragStarted = () => {\n    document.body.style.cursor = 'row-resize';\n  };\n\n  renderHorizontalSplit() {\n    const { leftPaneComponents, uiState } = this.props;\n    const styles = getStyles(config.theme2);\n    const topPaneSize = uiState.topPaneSize >= 1 ? uiState.topPaneSize : uiState.topPaneSize * window.innerHeight;\n\n    /*\n      Guesstimate the height of the browser window minus\n      panel toolbar and editor toolbar (~120px). This is to prevent resizing\n      the preview window beyond the browser window.\n     */\n\n    if (Array.isArray(leftPaneComponents)) {\n      return (\n        <SplitPane\n          split=\"horizontal\"\n          maxSize={-200}\n          primary=\"first\"\n          size={topPaneSize}\n          pane2Style={{ minHeight: 0 }}\n          resizerClassName={styles.resizerH}\n          onDragStarted={this.onDragStarted}\n          onDragFinished={(size) => this.onDragFinished(Pane.Top, size)}\n        >\n          {leftPaneComponents}\n        </SplitPane>\n      );\n    }\n\n    return <div className={styles.singleLeftPane}>{leftPaneComponents}</div>;\n  }\n\n  render() {\n    const { rightPaneVisible, rightPaneComponents, uiState } = this.props;\n    // Limit options pane width to 90% of screen.\n    const styles = getStyles(config.theme2);\n\n    // Need to handle when width is relative. ie a percentage of the viewport\n    const rightPaneSize =\n      uiState.rightPaneSize <= 1 ? uiState.rightPaneSize * window.innerWidth : uiState.rightPaneSize;\n\n    if (!rightPaneVisible) {\n      return this.renderHorizontalSplit();\n    }\n\n    return (\n      <SplitPane\n        split=\"vertical\"\n        maxSize={-300}\n        size={rightPaneSize}\n        primary=\"second\"\n        resizerClassName={styles.resizerV}\n        onDragStarted={() => (document.body.style.cursor = 'col-resize')}\n        onDragFinished={(size) => this.onDragFinished(Pane.Right, size)}\n      >\n        {this.renderHorizontalSplit()}\n        {rightPaneComponents}\n      </SplitPane>\n    );\n  }\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  const handleColor = theme.v1.palette.blue95;\n  const paneSpacing = theme.spacing(2);\n\n  const resizer = css`\n    position: relative;\n\n    &::before {\n      content: '';\n      position: absolute;\n      transition: 0.2s border-color ease-in-out;\n    }\n\n    &::after {\n      background: ${theme.components.panel.borderColor};\n      content: '';\n      position: absolute;\n      left: 50%;\n      top: 50%;\n      transition: 0.2s background ease-in-out;\n      transform: translate(-50%, -50%);\n      border-radius: 4px;\n    }\n\n    &:hover {\n      &::before {\n        border-color: ${handleColor};\n      }\n\n      &::after {\n        background: ${handleColor};\n      }\n    }\n  `;\n\n  return {\n    singleLeftPane: css`\n      height: 100%;\n      position: absolute;\n      overflow: hidden;\n      width: 100%;\n    `,\n    resizerV: cx(\n      resizer,\n      css`\n        cursor: col-resize;\n        width: ${paneSpacing};\n\n        &::before {\n          border-right: 1px solid transparent;\n          height: 100%;\n          left: 50%;\n          transform: translateX(-50%);\n        }\n\n        &::after {\n          height: 200px;\n          width: 4px;\n        }\n      `\n    ),\n    resizerH: cx(\n      resizer,\n      css`\n        height: ${paneSpacing};\n        cursor: row-resize;\n        margin-left: ${paneSpacing};\n\n        &::before {\n          border-top: 1px solid transparent;\n          top: 50%;\n          transform: translateY(-50%);\n          width: 100%;\n        }\n\n        &::after {\n          height: 4px;\n          width: 200px;\n        }\n      `\n    ),\n  };\n};\n","import React, { FunctionComponent, PropsWithChildren, ReactElement, useMemo } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Tooltip } from '@grafana/ui';\n\nimport { variableAdapters } from '../adapters';\nimport { VariableHide, VariableModel } from '../types';\n\ninterface Props {\n  variable: VariableModel;\n  readOnly?: boolean;\n}\n\nexport const PickerRenderer: FunctionComponent<Props> = (props) => {\n  const PickerToRender = useMemo(() => variableAdapters.get(props.variable.type).picker, [props.variable]);\n\n  if (!props.variable) {\n    return <div>Couldn&apos;t load variable</div>;\n  }\n\n  return (\n    <div className=\"gf-form\">\n      <PickerLabel variable={props.variable} />\n      {props.variable.hide !== VariableHide.hideVariable && PickerToRender && (\n        <PickerToRender variable={props.variable} readOnly={props.readOnly ?? false} />\n      )}\n    </div>\n  );\n};\n\nfunction PickerLabel({ variable }: PropsWithChildren<Props>): ReactElement | null {\n  const labelOrName = useMemo(() => variable.label || variable.name, [variable]);\n\n  if (variable.hide !== VariableHide.dontHide) {\n    return null;\n  }\n\n  const elementId = `var-${variable.id}`;\n  if (variable.description) {\n    return (\n      <Tooltip content={variable.description} placement={'bottom'}>\n        <label\n          className=\"gf-form-label gf-form-label--variable\"\n          data-testid={selectors.pages.Dashboard.SubMenu.submenuItemLabels(labelOrName)}\n          htmlFor={elementId}\n        >\n          {labelOrName}\n        </label>\n      </Tooltip>\n    );\n  }\n\n  return (\n    <label\n      className=\"gf-form-label gf-form-label--variable\"\n      data-testid={selectors.pages.Dashboard.SubMenu.submenuItemLabels(labelOrName)}\n      htmlFor={elementId}\n    >\n      {labelOrName}\n    </label>\n  );\n}\n","import React, { FunctionComponent, useEffect, useState } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { PickerRenderer } from '../../../variables/pickers/PickerRenderer';\nimport { VariableHide, VariableModel } from '../../../variables/types';\n\ninterface Props {\n  variables: VariableModel[];\n  readOnly?: boolean;\n}\n\nexport const SubMenuItems: FunctionComponent<Props> = ({ variables, readOnly }) => {\n  const [visibleVariables, setVisibleVariables] = useState<VariableModel[]>([]);\n\n  useEffect(() => {\n    setVisibleVariables(variables.filter((state) => state.hide !== VariableHide.hideVariable));\n  }, [variables]);\n\n  if (visibleVariables.length === 0) {\n    return null;\n  }\n\n  return (\n    <>\n      {visibleVariables.map((variable) => {\n        return (\n          <div\n            key={variable.id}\n            className=\"submenu-item gf-form-inline\"\n            data-testid={selectors.pages.Dashboard.SubMenu.submenuItem}\n          >\n            <PickerRenderer variable={variable} readOnly={readOnly} />\n          </div>\n        );\n      })}\n    </>\n  );\n};\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { PanelPlugin, PanelPluginMeta } from '@grafana/data';\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport { changePanelPlugin } from 'app/features/panel/state/actions';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { StoreState } from 'app/types';\n\nimport { PanelModel, DashboardModel } from '../../state';\n\nimport { getSectionOpenState, saveSectionOpenState } from './state/utils';\n\ninterface OwnProps {\n  panel: PanelModel;\n  dashboard: DashboardModel;\n  plugin: PanelPlugin;\n}\n\nconst mapStateToProps = (state: StoreState, props: OwnProps) => ({\n  angularPanelComponent: getPanelStateForModel(state, props.panel)?.angularComponent,\n});\n\nconst mapDispatchToProps = { changePanelPlugin };\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\ntype Props = ConnectedProps<typeof connector> & OwnProps;\n\nexport class AngularPanelOptionsUnconnected extends PureComponent<Props> {\n  element?: HTMLElement | null;\n  angularOptions?: AngularComponent | null;\n\n  constructor(props: Props) {\n    super(props);\n  }\n\n  componentDidMount() {\n    this.loadAngularOptions();\n  }\n\n  componentDidUpdate(prevProps: Props) {\n    if (\n      this.props.plugin !== prevProps.plugin ||\n      this.props.angularPanelComponent !== prevProps.angularPanelComponent\n    ) {\n      this.cleanUpAngularOptions();\n    }\n\n    this.loadAngularOptions();\n  }\n\n  componentWillUnmount() {\n    this.cleanUpAngularOptions();\n  }\n\n  cleanUpAngularOptions() {\n    if (this.angularOptions) {\n      this.angularOptions.destroy();\n      this.angularOptions = null;\n    }\n  }\n\n  loadAngularOptions() {\n    const { panel, angularPanelComponent, changePanelPlugin } = this.props;\n\n    if (!this.element || !angularPanelComponent || this.angularOptions) {\n      return;\n    }\n\n    const scope = angularPanelComponent.getScope();\n\n    // When full page reloading in edit mode the angular panel has on fully compiled and instantiated yet\n    if (!scope.$$childHead) {\n      setTimeout(() => {\n        this.forceUpdate();\n      });\n      return;\n    }\n\n    const panelCtrl: PanelCtrl = scope.$$childHead.ctrl;\n    panelCtrl.initEditMode();\n    panelCtrl.onPluginTypeChange = (plugin: PanelPluginMeta) => {\n      changePanelPlugin({ panel, pluginId: plugin.id });\n    };\n\n    let template = '';\n    for (let i = 0; i < panelCtrl.editorTabs.length; i++) {\n      const tab = panelCtrl.editorTabs[i];\n      tab.isOpen = getSectionOpenState(tab.title, i === 0);\n\n      template += `\n      <div class=\"panel-options-group\" ng-cloak>\n        <div class=\"panel-options-group__header\" ng-click=\"toggleOptionGroup(${i})\" aria-label=\"${tab.title} section\">\n          <div class=\"panel-options-group__icon\">\n            <icon name=\"ctrl.editorTabs[${i}].isOpen ? 'angle-down' : 'angle-right'\"></icon>\n          </div>\n          <div class=\"panel-options-group__title\">${tab.title}</div>\n        </div>\n        <div class=\"panel-options-group__body\" ng-if=\"ctrl.editorTabs[${i}].isOpen\">\n          <panel-editor-tab editor-tab=\"ctrl.editorTabs[${i}]\" ctrl=\"ctrl\"></panel-editor-tab>\n        </div>\n      </div>\n      `;\n    }\n\n    const loader = getAngularLoader();\n    const scopeProps = {\n      ctrl: panelCtrl,\n      toggleOptionGroup: (index: number) => {\n        const tab = panelCtrl.editorTabs[index];\n        tab.isOpen = !tab.isOpen;\n        saveSectionOpenState(tab.title, Boolean(tab.isOpen));\n      },\n    };\n\n    this.angularOptions = loader.load(this.element, scopeProps, template);\n    this.angularOptions.digest();\n  }\n\n  render() {\n    return <div ref={(elem) => (this.element = elem)} />;\n  }\n}\n\nexport const AngularPanelOptions = connect(mapStateToProps, mapDispatchToProps)(AngularPanelOptionsUnconnected);\n","import store from 'app/core/store';\n\nexport function saveSectionOpenState(id: string, isOpen: boolean) {\n  store.set(`panel-edit-section-${id}`, isOpen ? 'true' : 'false');\n}\n\nexport function getSectionOpenState(id: string, defaultValue: boolean) {\n  return store.getBool(`panel-edit-section-${id}`, defaultValue);\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\nimport Highlighter from 'react-highlight-words';\n\nimport {\n  DynamicConfigValue,\n  FieldConfigOptionsRegistry,\n  FieldConfigProperty,\n  FieldOverrideContext,\n  GrafanaTheme2,\n} from '@grafana/data';\nimport { Counter, Field, HorizontalGroup, IconButton, Label, useStyles2 } from '@grafana/ui';\n\nimport { OptionsPaneCategory } from './OptionsPaneCategory';\n\ninterface DynamicConfigValueEditorProps {\n  property: DynamicConfigValue;\n  registry: FieldConfigOptionsRegistry;\n  onChange: (value: DynamicConfigValue) => void;\n  context: FieldOverrideContext;\n  onRemove: () => void;\n  isSystemOverride?: boolean;\n  searchQuery: string;\n}\n\nexport const DynamicConfigValueEditor: React.FC<DynamicConfigValueEditorProps> = ({\n  property,\n  context,\n  registry,\n  onChange,\n  onRemove,\n  isSystemOverride,\n  searchQuery,\n}) => {\n  const styles = useStyles2(getStyles);\n  const item = registry?.getIfExists(property.id);\n\n  if (!item) {\n    return null;\n  }\n\n  const isCollapsible =\n    Array.isArray(property.value) ||\n    property.id === FieldConfigProperty.Thresholds ||\n    property.id === FieldConfigProperty.Links ||\n    property.id === FieldConfigProperty.Mappings;\n\n  const labelCategory = item.category?.filter((c) => c !== item.name);\n  let editor;\n\n  /* eslint-disable react/display-name */\n  const renderLabel =\n    (includeDescription = true, includeCounter = false) =>\n    (isExpanded = false) =>\n      (\n        <HorizontalGroup justify=\"space-between\">\n          <Label category={labelCategory} description={includeDescription ? item.description : undefined}>\n            <Highlighter\n              textToHighlight={item.name}\n              searchWords={[searchQuery]}\n              highlightClassName={'search-fragment-highlight'}\n            />\n            {!isExpanded && includeCounter && item.getItemsCount && (\n              <Counter value={item.getItemsCount(property.value)} />\n            )}\n          </Label>\n          {!isSystemOverride && (\n            <div>\n              <IconButton name=\"times\" onClick={onRemove} />\n            </div>\n          )}\n        </HorizontalGroup>\n      );\n  /* eslint-enable react/display-name */\n\n  if (isCollapsible) {\n    editor = (\n      <OptionsPaneCategory\n        id={item.name}\n        renderTitle={renderLabel(false, true)}\n        className={css`\n          padding-left: 0;\n          padding-right: 0;\n        `}\n        isNested\n        isOpenDefault={property.value !== undefined}\n      >\n        <item.override\n          value={property.value}\n          onChange={(value) => {\n            onChange(value);\n          }}\n          item={item}\n          context={context}\n        />\n      </OptionsPaneCategory>\n    );\n  } else {\n    editor = (\n      <div>\n        <Field label={renderLabel()()} description={item.description}>\n          <item.override\n            value={property.value}\n            onChange={(value) => {\n              onChange(value);\n            }}\n            item={item}\n            context={context}\n          />\n        </Field>\n      </div>\n    );\n  }\n\n  return (\n    <div\n      className={cx(\n        isCollapsible && styles.collapsibleOverrideEditor,\n        !isCollapsible && 'dynamicConfigValueEditor--nonCollapsible'\n      )}\n    >\n      {editor}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    collapsibleOverrideEditor: css`\n      label: collapsibleOverrideEditor;\n      & + .dynamicConfigValueEditor--nonCollapsible {\n        margin-top: ${theme.spacing(1)};\n      }\n    `,\n  };\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { FieldConfigOptionsRegistry, GrafanaTheme2, ConfigOverrideRule } from '@grafana/data';\nimport { HorizontalGroup, Icon, IconButton, useStyles2 } from '@grafana/ui';\nimport { FieldMatcherUIRegistryItem } from '@grafana/ui/src/components/MatchersUI/types';\n\ninterface OverrideCategoryTitleProps {\n  isExpanded: boolean;\n  registry: FieldConfigOptionsRegistry;\n  matcherUi: FieldMatcherUIRegistryItem<any>;\n  override: ConfigOverrideRule;\n  overrideName: string;\n  onOverrideRemove: () => void;\n}\nexport const OverrideCategoryTitle: FC<OverrideCategoryTitleProps> = ({\n  isExpanded,\n  registry,\n  matcherUi,\n  overrideName,\n  override,\n  onOverrideRemove,\n}) => {\n  const styles = useStyles2(getStyles);\n  const properties = override.properties.map((p) => registry.getIfExists(p.id)).filter((prop) => !!prop);\n  const propertyNames = properties.map((p) => p?.name).join(', ');\n  const matcherOptions = matcherUi.optionsToLabel(override.matcher.options);\n\n  return (\n    <div>\n      <HorizontalGroup justify=\"space-between\">\n        <div>{overrideName}</div>\n        <IconButton name=\"trash-alt\" onClick={onOverrideRemove} title=\"Remove override\" />\n      </HorizontalGroup>\n      {!isExpanded && (\n        <div className={styles.overrideDetails}>\n          <div className={styles.options} title={matcherOptions}>\n            {matcherOptions} <Icon name=\"angle-right\" /> {propertyNames}\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\nOverrideCategoryTitle.displayName = 'OverrideTitle';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    matcherUi: css`\n      padding: ${theme.spacing(1)};\n    `,\n    propertyPickerWrapper: css`\n      margin-top: ${theme.spacing(2)};\n    `,\n    overrideDetails: css`\n      font-size: ${theme.typography.bodySmall.fontSize};\n      color: ${theme.colors.text.secondary};\n      font-weight: ${theme.typography.fontWeightRegular};\n    `,\n    options: css`\n      overflow: hidden;\n      padding-right: ${theme.spacing(4)};\n    `,\n    unknownLabel: css`\n      margin-bottom: 0;\n    `,\n  };\n};\n","import { css } from '@emotion/css';\nimport { cloneDeep } from 'lodash';\nimport React from 'react';\n\nimport {\n  FieldConfigOptionsRegistry,\n  SelectableValue,\n  isSystemOverride as isSystemOverrideGuard,\n  VariableSuggestionsScope,\n  DynamicConfigValue,\n  ConfigOverrideRule,\n  GrafanaTheme2,\n} from '@grafana/data';\nimport { fieldMatchersUI, useStyles2, ValuePicker } from '@grafana/ui';\nimport { getDataLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv';\n\nimport { DynamicConfigValueEditor } from './DynamicConfigValueEditor';\nimport { OptionsPaneCategoryDescriptor } from './OptionsPaneCategoryDescriptor';\nimport { OptionsPaneItemDescriptor } from './OptionsPaneItemDescriptor';\nimport { OverrideCategoryTitle } from './OverrideCategoryTitle';\nimport { OptionPaneRenderProps } from './types';\n\nexport function getFieldOverrideCategories(\n  props: OptionPaneRenderProps,\n  searchQuery: string\n): OptionsPaneCategoryDescriptor[] {\n  const categories: OptionsPaneCategoryDescriptor[] = [];\n  const currentFieldConfig = props.panel.fieldConfig;\n  const registry = props.plugin.fieldConfigRegistry;\n  const data = props.data?.series ?? [];\n\n  if (registry.isEmpty()) {\n    return [];\n  }\n\n  const onOverrideChange = (index: number, override: ConfigOverrideRule) => {\n    let overrides = cloneDeep(currentFieldConfig.overrides);\n    overrides[index] = override;\n    props.onFieldConfigsChange({ ...currentFieldConfig, overrides });\n  };\n\n  const onOverrideRemove = (overrideIndex: number) => {\n    let overrides = cloneDeep(currentFieldConfig.overrides);\n    overrides.splice(overrideIndex, 1);\n    props.onFieldConfigsChange({ ...currentFieldConfig, overrides });\n  };\n\n  const onOverrideAdd = (value: SelectableValue<string>) => {\n    props.onFieldConfigsChange({\n      ...currentFieldConfig,\n      overrides: [\n        ...currentFieldConfig.overrides,\n        {\n          matcher: {\n            id: value.value!,\n          },\n          properties: [],\n        },\n      ],\n    });\n  };\n\n  const context = {\n    data,\n    getSuggestions: (scope?: VariableSuggestionsScope) => getDataLinksVariableSuggestions(data, scope),\n    isOverride: true,\n  };\n\n  /**\n   * Main loop through all override rules\n   */\n  for (let idx = 0; idx < currentFieldConfig.overrides.length; idx++) {\n    const override = currentFieldConfig.overrides[idx];\n    const overrideName = `Override ${idx + 1}`;\n    const matcherUi = fieldMatchersUI.get(override.matcher.id);\n    const configPropertiesOptions = getOverrideProperties(registry);\n    const isSystemOverride = isSystemOverrideGuard(override);\n    // A way to force open new override categories\n    const forceOpen = override.properties.length === 0 ? 1 : 0;\n\n    const category = new OptionsPaneCategoryDescriptor({\n      title: overrideName,\n      id: overrideName,\n      forceOpen,\n      renderTitle: function renderOverrideTitle(isExpanded: boolean) {\n        return (\n          <OverrideCategoryTitle\n            override={override}\n            isExpanded={isExpanded}\n            registry={registry}\n            overrideName={overrideName}\n            matcherUi={matcherUi}\n            onOverrideRemove={() => onOverrideRemove(idx)}\n          />\n        );\n      },\n    });\n\n    const onMatcherConfigChange = (options: any) => {\n      override.matcher.options = options;\n      onOverrideChange(idx, override);\n    };\n\n    const onDynamicConfigValueAdd = (o: ConfigOverrideRule, value: SelectableValue<string>) => {\n      const registryItem = registry.get(value.value!);\n      const propertyConfig: DynamicConfigValue = {\n        id: registryItem.id,\n        value: registryItem.defaultValue,\n      };\n\n      if (override.properties) {\n        o.properties.push(propertyConfig);\n      } else {\n        o.properties = [propertyConfig];\n      }\n\n      onOverrideChange(idx, o);\n    };\n\n    /**\n     * Add override matcher UI element\n     */\n    category.addItem(\n      new OptionsPaneItemDescriptor({\n        title: matcherUi.name,\n        render: function renderMatcherUI() {\n          return (\n            <matcherUi.component\n              id={`${matcherUi.matcher.id}-${idx}`}\n              matcher={matcherUi.matcher}\n              data={props.data?.series ?? []}\n              options={override.matcher.options}\n              onChange={onMatcherConfigChange}\n            />\n          );\n        },\n      })\n    );\n\n    /**\n     * Loop through all override properties\n     */\n    for (let propIdx = 0; propIdx < override.properties.length; propIdx++) {\n      const property = override.properties[propIdx];\n      const registryItemForProperty = registry.getIfExists(property.id);\n\n      if (!registryItemForProperty) {\n        continue;\n      }\n\n      const onPropertyChange = (value: any) => {\n        override.properties[propIdx].value = value;\n        onOverrideChange(idx, override);\n      };\n\n      const onPropertyRemove = () => {\n        override.properties.splice(propIdx, 1);\n        onOverrideChange(idx, override);\n      };\n\n      /**\n       * Add override property item\n       */\n      category.addItem(\n        new OptionsPaneItemDescriptor({\n          title: registryItemForProperty.name,\n          skipField: true,\n          render: function renderPropertyEditor() {\n            return (\n              <DynamicConfigValueEditor\n                key={`${property.id}/${propIdx}`}\n                isSystemOverride={isSystemOverride}\n                onChange={onPropertyChange}\n                onRemove={onPropertyRemove}\n                property={property}\n                registry={registry}\n                context={context}\n                searchQuery={searchQuery}\n              />\n            );\n          },\n        })\n      );\n    }\n\n    /**\n     * Add button that adds new overrides\n     */\n    if (!isSystemOverride && override.matcher.options) {\n      category.addItem(\n        new OptionsPaneItemDescriptor({\n          title: '----------',\n          skipField: true,\n          render: function renderAddPropertyButton() {\n            return (\n              <ValuePicker\n                key=\"Add override property\"\n                label=\"Add override property\"\n                variant=\"secondary\"\n                isFullWidth={true}\n                icon=\"plus\"\n                menuPlacement=\"auto\"\n                options={configPropertiesOptions}\n                onChange={(v) => onDynamicConfigValueAdd(override, v)}\n              />\n            );\n          },\n        })\n      );\n    }\n\n    categories.push(category);\n  }\n\n  categories.push(\n    new OptionsPaneCategoryDescriptor({\n      title: 'add button',\n      id: 'add button',\n      customRender: function renderAddButton() {\n        return (\n          <AddOverrideButtonContainer key=\"Add override\">\n            <ValuePicker\n              icon=\"plus\"\n              label=\"Add field override\"\n              variant=\"secondary\"\n              menuPlacement=\"auto\"\n              isFullWidth={true}\n              size=\"md\"\n              options={fieldMatchersUI\n                .list()\n                .filter((o) => !o.excludeFromPicker)\n                .map<SelectableValue<string>>((i) => ({ label: i.name, value: i.id, description: i.description }))}\n              onChange={(value) => onOverrideAdd(value)}\n            />\n          </AddOverrideButtonContainer>\n        );\n      },\n    })\n  );\n\n  return categories;\n}\n\nfunction getOverrideProperties(registry: FieldConfigOptionsRegistry) {\n  return registry\n    .list()\n    .filter((o) => !o.hideFromOverrides)\n    .map((item) => {\n      let label = item.name;\n      if (item.category) {\n        label = [...item.category, item.name].join(' > ');\n      }\n      return {\n        label,\n        value: item.id,\n        description: item.description,\n      };\n    });\n}\n\nfunction AddOverrideButtonContainer({ children }: { children: React.ReactNode }) {\n  const styles = useStyles2(getBorderTopStyles);\n  return <div className={styles}>{children}</div>;\n}\n\nfunction getBorderTopStyles(theme: GrafanaTheme2) {\n  return css({\n    borderTop: `1px solid ${theme.colors.border.weak}`,\n    padding: `${theme.spacing(2)}`,\n    display: 'flex',\n  });\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { DateTimeInput, GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { PanelModelWithLibraryPanel } from '../../types';\n\ninterface Props {\n  panel: PanelModelWithLibraryPanel;\n  formatDate?: (dateString: DateTimeInput, format?: string) => string;\n}\n\nexport const LibraryPanelInformation = ({ panel, formatDate }: Props) => {\n  const styles = useStyles2(getStyles);\n\n  const meta = panel.libraryPanel?.meta;\n  if (!meta) {\n    return null;\n  }\n\n  return (\n    <div className={styles.info}>\n      <div className={styles.libraryPanelInfo}>\n        {`Used on ${meta.connectedDashboards} `}\n        {meta.connectedDashboards === 1 ? 'dashboard' : 'dashboards'}\n      </div>\n      <div className={styles.libraryPanelInfo}>\n        Last edited on {formatDate?.(meta.updated, 'L') ?? meta.updated} by\n        {meta.updatedBy.avatarUrl && (\n          <img\n            width=\"22\"\n            height=\"22\"\n            className={styles.userAvatar}\n            src={meta.updatedBy.avatarUrl}\n            alt={`Avatar for ${meta.updatedBy.name}`}\n          />\n        )}\n        {meta.updatedBy.name}\n      </div>\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    info: css`\n      line-height: 1;\n    `,\n    libraryPanelInfo: css`\n      color: ${theme.colors.text.secondary};\n      font-size: ${theme.typography.bodySmall.fontSize};\n    `,\n    userAvatar: css`\n      border-radius: 50%;\n      box-sizing: content-box;\n      width: 22px;\n      height: 22px;\n      padding-left: ${theme.spacing(1)};\n      padding-right: ${theme.spacing(1)};\n    `,\n  };\n};\n","import React from 'react';\n\nimport { Input } from '@grafana/ui';\nimport { LibraryPanelInformation } from 'app/features/library-panels/components/LibraryPanelInfo/LibraryPanelInfo';\n\nimport { isPanelModelLibraryPanel } from '../../../library-panels/guard';\n\nimport { OptionsPaneCategoryDescriptor } from './OptionsPaneCategoryDescriptor';\nimport { OptionsPaneItemDescriptor } from './OptionsPaneItemDescriptor';\nimport { OptionPaneRenderProps } from './types';\n\nexport function getLibraryPanelOptionsCategory(props: OptionPaneRenderProps): OptionsPaneCategoryDescriptor {\n  const { panel, onPanelConfigChange, dashboard } = props;\n  const descriptor = new OptionsPaneCategoryDescriptor({\n    title: 'Library panel options',\n    id: 'Library panel options',\n    isOpenDefault: true,\n  });\n\n  if (isPanelModelLibraryPanel(panel)) {\n    descriptor\n      .addItem(\n        new OptionsPaneItemDescriptor({\n          title: 'Name',\n          value: panel.libraryPanel.name,\n          popularRank: 1,\n          render: function renderName() {\n            return (\n              <Input\n                id=\"LibraryPanelFrameName\"\n                defaultValue={panel.libraryPanel.name}\n                onBlur={(e) =>\n                  onPanelConfigChange('libraryPanel', { ...panel.libraryPanel, name: e.currentTarget.value })\n                }\n              />\n            );\n          },\n        })\n      )\n      .addItem(\n        new OptionsPaneItemDescriptor({\n          title: 'Information',\n          render: function renderLibraryPanelInformation() {\n            return <LibraryPanelInformation panel={panel} formatDate={dashboard.formatDate} />;\n          },\n        })\n      );\n  }\n\n  return descriptor;\n}\n","import React, { FC, useCallback, useMemo } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Select } from '@grafana/ui';\nimport { useSelector } from 'app/types';\n\nimport { getLastKey, getVariablesByKey } from '../../../variables/state/selectors';\n\nexport interface Props {\n  id?: string;\n  repeat?: string | null;\n  onChange: (name: string | null) => void;\n}\n\nexport const RepeatRowSelect: FC<Props> = ({ repeat, onChange, id }) => {\n  const variables = useSelector((state) => {\n    return getVariablesByKey(getLastKey(state), state);\n  });\n\n  const variableOptions = useMemo(() => {\n    const options = variables.map((item: any) => {\n      return { label: item.name, value: item.name };\n    });\n\n    if (options.length === 0) {\n      options.unshift({\n        label: 'No template variables found',\n        value: null,\n      });\n    }\n\n    options.unshift({\n      label: 'Disable repeating',\n      value: null,\n    });\n\n    return options;\n  }, [variables]);\n\n  const onSelectChange = useCallback((option: SelectableValue<string | null>) => onChange(option.value!), [onChange]);\n\n  return <Select inputId={id} value={repeat} onChange={onSelectChange} options={variableOptions} />;\n};\n","import React from 'react';\n\nimport { DataLinksInlineEditor, Input, RadioButtonGroup, Select, Switch, TextArea } from '@grafana/ui';\nimport { getPanelLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv';\n\nimport { RepeatRowSelect } from '../RepeatRowSelect/RepeatRowSelect';\n\nimport { OptionsPaneCategoryDescriptor } from './OptionsPaneCategoryDescriptor';\nimport { OptionsPaneItemDescriptor } from './OptionsPaneItemDescriptor';\nimport { OptionPaneRenderProps } from './types';\n\nexport function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPaneCategoryDescriptor {\n  const { panel, onPanelConfigChange } = props;\n  const descriptor = new OptionsPaneCategoryDescriptor({\n    title: 'Panel options',\n    id: 'Panel options',\n    isOpenDefault: true,\n  });\n\n  return descriptor\n    .addItem(\n      new OptionsPaneItemDescriptor({\n        title: 'Title',\n        value: panel.title,\n        popularRank: 1,\n        render: function renderTitle() {\n          return (\n            <Input\n              id=\"PanelFrameTitle\"\n              defaultValue={panel.title}\n              onBlur={(e) => onPanelConfigChange('title', e.currentTarget.value)}\n            />\n          );\n        },\n      })\n    )\n    .addItem(\n      new OptionsPaneItemDescriptor({\n        title: 'Description',\n        description: panel.description,\n        value: panel.description,\n        render: function renderDescription() {\n          return (\n            <TextArea\n              id=\"description-text-area\"\n              defaultValue={panel.description}\n              onBlur={(e) => onPanelConfigChange('description', e.currentTarget.value)}\n            />\n          );\n        },\n      })\n    )\n    .addItem(\n      new OptionsPaneItemDescriptor({\n        title: 'Transparent background',\n        render: function renderTransparent() {\n          return (\n            <Switch\n              value={panel.transparent}\n              id=\"transparent-background\"\n              onChange={(e) => onPanelConfigChange('transparent', e.currentTarget.checked)}\n            />\n          );\n        },\n      })\n    )\n    .addCategory(\n      new OptionsPaneCategoryDescriptor({\n        title: 'Panel links',\n        id: 'Panel links',\n        isOpenDefault: false,\n        itemsCount: panel.links?.length,\n      }).addItem(\n        new OptionsPaneItemDescriptor({\n          title: 'Panel links',\n          render: function renderLinks() {\n            return (\n              <DataLinksInlineEditor\n                links={panel.links}\n                onChange={(links) => onPanelConfigChange('links', links)}\n                getSuggestions={getPanelLinksVariableSuggestions}\n                data={[]}\n              />\n            );\n          },\n        })\n      )\n    )\n    .addCategory(\n      new OptionsPaneCategoryDescriptor({\n        title: 'Repeat options',\n        id: 'Repeat options',\n        isOpenDefault: false,\n      })\n        .addItem(\n          new OptionsPaneItemDescriptor({\n            title: 'Repeat by variable',\n            description:\n              'Repeat this panel for each value in the selected variable. This is not visible while in edit mode. You need to go back to dashboard and then update the variable or reload the dashboard.',\n            render: function renderRepeatOptions() {\n              return (\n                <RepeatRowSelect\n                  id=\"repeat-by-variable-select\"\n                  repeat={panel.repeat}\n                  onChange={(value?: string | null) => {\n                    onPanelConfigChange('repeat', value);\n                  }}\n                />\n              );\n            },\n          })\n        )\n        .addItem(\n          new OptionsPaneItemDescriptor({\n            title: 'Repeat direction',\n            showIf: () => !!panel.repeat,\n            render: function renderRepeatOptions() {\n              const directionOptions = [\n                { label: 'Horizontal', value: 'h' },\n                { label: 'Vertical', value: 'v' },\n              ];\n\n              return (\n                <RadioButtonGroup\n                  options={directionOptions}\n                  value={panel.repeatDirection || 'h'}\n                  onChange={(value) => onPanelConfigChange('repeatDirection', value)}\n                />\n              );\n            },\n          })\n        )\n        .addItem(\n          new OptionsPaneItemDescriptor({\n            title: 'Max per row',\n            showIf: () => Boolean(panel.repeat && panel.repeatDirection === 'h'),\n            render: function renderOption() {\n              const maxPerRowOptions = [2, 3, 4, 6, 8, 12].map((value) => ({ label: value.toString(), value }));\n              return (\n                <Select\n                  options={maxPerRowOptions}\n                  value={panel.maxPerRow}\n                  onChange={(value) => onPanelConfigChange('maxPerRow', value.value)}\n                />\n              );\n            },\n          })\n        )\n    );\n}\n","import { OptionsPaneCategoryDescriptor } from '../OptionsPaneCategoryDescriptor';\nimport { OptionsPaneItemDescriptor } from '../OptionsPaneItemDescriptor';\n\nexport interface OptionSearchResults {\n  optionHits: OptionsPaneItemDescriptor[];\n  overrideHits: OptionsPaneCategoryDescriptor[];\n  totalCount: number;\n}\n\nexport class OptionSearchEngine {\n  constructor(\n    private categories: OptionsPaneCategoryDescriptor[],\n    private overrides: OptionsPaneCategoryDescriptor[]\n  ) {}\n\n  search(query: string): OptionSearchResults {\n    const searchRegex = new RegExp(query, 'i');\n\n    const optionHits = this.collectHits(this.categories, searchRegex, []);\n    const sortedHits = optionHits.sort(compareHit).map((x) => x.item);\n\n    const overrideHits = this.collectHits(this.overrides, searchRegex, []);\n    const sortedOverridesHits = overrideHits.sort(compareHit).map((x) => x.item);\n\n    return {\n      optionHits: sortedHits,\n      overrideHits: this.buildOverrideHitCategories(sortedOverridesHits),\n      totalCount: this.getAllOptionsCount(this.categories),\n    };\n  }\n\n  private collectHits(categories: OptionsPaneCategoryDescriptor[], searchRegex: RegExp, hits: SearchHit[]) {\n    for (const category of categories) {\n      const categoryNameMatch = searchRegex.test(category.props.title);\n\n      for (const item of category.items) {\n        if (searchRegex.test(item.props.title)) {\n          hits.push({ item: item, rank: 1 });\n          continue;\n        }\n        if (item.props.description && searchRegex.test(item.props.description)) {\n          hits.push({ item: item, rank: 2 });\n          continue;\n        }\n        if (categoryNameMatch) {\n          hits.push({ item: item, rank: 3 });\n        }\n      }\n\n      if (category.categories.length > 0) {\n        this.collectHits(category.categories, searchRegex, hits);\n      }\n    }\n\n    return hits;\n  }\n\n  getAllOptionsCount(categories: OptionsPaneCategoryDescriptor[]) {\n    let total = 0;\n\n    for (const category of categories) {\n      total += category.items.length;\n\n      if (category.categories.length > 0) {\n        total += this.getAllOptionsCount(category.categories);\n      }\n    }\n\n    return total;\n  }\n\n  buildOverrideHitCategories(hits: OptionsPaneItemDescriptor[]): OptionsPaneCategoryDescriptor[] {\n    const categories: Record<string, OptionsPaneCategoryDescriptor> = {};\n\n    for (const hit of hits) {\n      let category = categories[hit.parent.props.title];\n\n      if (!category) {\n        category = categories[hit.parent.props.title] = new OptionsPaneCategoryDescriptor(hit.parent.props);\n        // Add matcher item as that should always be shown\n        category.addItem(hit.parent.items[0]);\n      }\n\n      // Prevent adding matcher twice since it's automatically added for every override\n      if (category.items[0].props.title !== hit.props.title) {\n        category.addItem(hit);\n      }\n    }\n\n    return Object.values(categories);\n  }\n}\n\ninterface SearchHit {\n  item: OptionsPaneItemDescriptor;\n  rank: number;\n}\n\nfunction compareHit(left: SearchHit, right: SearchHit) {\n  return left.rank - right.rank;\n}\n","import { OptionsPaneCategoryDescriptor } from '../OptionsPaneCategoryDescriptor';\nimport { OptionsPaneItemDescriptor } from '../OptionsPaneItemDescriptor';\n\nexport function getRecentOptions(allOptions: OptionsPaneCategoryDescriptor[]) {\n  const popularOptions: OptionsPaneItemDescriptor[] = [];\n\n  for (const category of allOptions) {\n    for (const item of category.items) {\n      if (item.props.title === 'Unit') {\n        item.props.popularRank = 2;\n      }\n      if (item.props.title === 'Min') {\n        item.props.popularRank = 3;\n      }\n      if (item.props.title === 'Max') {\n        item.props.popularRank = 4;\n      }\n      if (item.props.title === 'Display name') {\n        item.props.popularRank = 5;\n      }\n\n      if (item.props.popularRank) {\n        popularOptions.push(item);\n      }\n    }\n  }\n\n  return popularOptions.sort((left, right) => left.props.popularRank! - right.props.popularRank!);\n}\n","import { css } from '@emotion/css';\nimport React, { useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { CustomScrollbar, FilterInput, RadioButtonGroup, useStyles2 } from '@grafana/ui';\n\nimport { isPanelModelLibraryPanel } from '../../../library-panels/guard';\n\nimport { AngularPanelOptions } from './AngularPanelOptions';\nimport { OptionsPaneCategory } from './OptionsPaneCategory';\nimport { OptionsPaneCategoryDescriptor } from './OptionsPaneCategoryDescriptor';\nimport { getFieldOverrideCategories } from './getFieldOverrideElements';\nimport { getLibraryPanelOptionsCategory } from './getLibraryPanelOptions';\nimport { getPanelFrameCategory } from './getPanelFrameOptions';\nimport { getVisualizationOptions } from './getVisualizationOptions';\nimport { OptionSearchEngine } from './state/OptionSearchEngine';\nimport { getRecentOptions } from './state/getRecentOptions';\nimport { OptionPaneRenderProps } from './types';\n\nexport const OptionsPaneOptions: React.FC<OptionPaneRenderProps> = (props) => {\n  const { plugin, dashboard, panel } = props;\n  const [searchQuery, setSearchQuery] = useState('');\n  const [listMode, setListMode] = useState(OptionFilter.All);\n  const styles = useStyles2(getStyles);\n\n  const [panelFrameOptions, vizOptions, libraryPanelOptions] = useMemo(\n    () => [getPanelFrameCategory(props), getVisualizationOptions(props), getLibraryPanelOptionsCategory(props)],\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [panel.configRev, props.data, props.instanceState, searchQuery]\n  );\n\n  const justOverrides = useMemo(\n    () => getFieldOverrideCategories(props, searchQuery),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [panel.configRev, props.data, props.instanceState, searchQuery]\n  );\n\n  const mainBoxElements: React.ReactNode[] = [];\n  const isSearching = searchQuery.length > 0;\n  const optionRadioFilters = useMemo(getOptionRadioFilters, []);\n\n  const allOptions = isPanelModelLibraryPanel(panel)\n    ? [libraryPanelOptions, panelFrameOptions, ...vizOptions]\n    : [panelFrameOptions, ...vizOptions];\n\n  if (isSearching) {\n    mainBoxElements.push(renderSearchHits(allOptions, justOverrides, searchQuery));\n\n    // If searching for angular panel, then we need to add notice that results are limited\n    if (props.plugin.angularPanelCtrl) {\n      mainBoxElements.push(\n        <div className={styles.searchNotice} key=\"Search notice\">\n          This is an old visualization type that does not support searching all options.\n        </div>\n      );\n    }\n  } else {\n    switch (listMode) {\n      case OptionFilter.All:\n        if (isPanelModelLibraryPanel(panel)) {\n          // Library Panel options first\n          mainBoxElements.push(libraryPanelOptions.render());\n        }\n        // Panel frame options second\n        mainBoxElements.push(panelFrameOptions.render());\n        // If angular add those options next\n        if (props.plugin.angularPanelCtrl) {\n          mainBoxElements.push(\n            <AngularPanelOptions plugin={plugin} dashboard={dashboard} panel={panel} key=\"AngularOptions\" />\n          );\n        }\n        // Then add all panel and field defaults\n        for (const item of vizOptions) {\n          mainBoxElements.push(item.render());\n        }\n\n        for (const item of justOverrides) {\n          mainBoxElements.push(item.render());\n        }\n        break;\n      case OptionFilter.Overrides:\n        for (const override of justOverrides) {\n          mainBoxElements.push(override.render());\n        }\n        break;\n      case OptionFilter.Recent:\n        mainBoxElements.push(\n          <OptionsPaneCategory id=\"Recent options\" title=\"Recent options\" key=\"Recent options\" forceOpen={1}>\n            {getRecentOptions(allOptions).map((item) => item.render())}\n          </OptionsPaneCategory>\n        );\n        break;\n    }\n  }\n\n  // only show radio buttons if we are searching or if the plugin has field config\n  const showSearchRadioButtons = !isSearching && !plugin.fieldConfigRegistry.isEmpty();\n\n  return (\n    <div className={styles.wrapper}>\n      <div className={styles.formBox}>\n        <div className={styles.formRow}>\n          <FilterInput width={0} value={searchQuery} onChange={setSearchQuery} placeholder={'Search options'} />\n        </div>\n        {showSearchRadioButtons && (\n          <div className={styles.formRow}>\n            <RadioButtonGroup options={optionRadioFilters} value={listMode} fullWidth onChange={setListMode} />\n          </div>\n        )}\n      </div>\n      <div className={styles.scrollWrapper}>\n        <CustomScrollbar autoHeightMin=\"100%\">\n          <div className={styles.mainBox}>{mainBoxElements}</div>\n        </CustomScrollbar>\n      </div>\n    </div>\n  );\n};\n\nfunction getOptionRadioFilters(): Array<SelectableValue<OptionFilter>> {\n  return [\n    { label: OptionFilter.All, value: OptionFilter.All },\n    { label: OptionFilter.Overrides, value: OptionFilter.Overrides },\n  ];\n}\n\nexport enum OptionFilter {\n  All = 'All',\n  Overrides = 'Overrides',\n  Recent = 'Recent',\n}\n\nfunction renderSearchHits(\n  allOptions: OptionsPaneCategoryDescriptor[],\n  overrides: OptionsPaneCategoryDescriptor[],\n  searchQuery: string\n) {\n  const engine = new OptionSearchEngine(allOptions, overrides);\n  const { optionHits, totalCount, overrideHits } = engine.search(searchQuery);\n\n  return (\n    <div key=\"search results\">\n      <OptionsPaneCategory\n        id=\"Found options\"\n        title={`Matched ${optionHits.length}/${totalCount} options`}\n        key=\"Normal options\"\n        forceOpen={1}\n      >\n        {optionHits.map((hit) => hit.render(searchQuery))}\n      </OptionsPaneCategory>\n      {overrideHits.map((override) => override.render(searchQuery))}\n    </div>\n  );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  wrapper: css`\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    flex: 1 1 0;\n\n    .search-fragment-highlight {\n      color: ${theme.colors.warning.text};\n      background: transparent;\n    }\n  `,\n  searchBox: css`\n    display: flex;\n    flex-direction: column;\n    min-height: 0;\n  `,\n  formRow: css`\n    margin-bottom: ${theme.spacing(1)};\n  `,\n  formBox: css`\n    padding: ${theme.spacing(1)};\n    background: ${theme.colors.background.primary};\n    border: 1px solid ${theme.components.panel.borderColor};\n    border-top-left-radius: ${theme.shape.borderRadius(1.5)};\n    border-bottom: none;\n  `,\n  closeButton: css`\n    margin-left: ${theme.spacing(1)};\n  `,\n  searchHits: css`\n    padding: ${theme.spacing(1, 1, 0, 1)};\n  `,\n  scrollWrapper: css`\n    flex-grow: 1;\n    min-height: 0;\n  `,\n  searchNotice: css`\n    font-size: ${theme.typography.size.sm};\n    color: ${theme.colors.text.secondary};\n    padding: ${theme.spacing(1)};\n    text-align: center;\n  `,\n  mainBox: css`\n    background: ${theme.colors.background.primary};\n    border: 1px solid ${theme.components.panel.borderColor};\n    border-top: none;\n    flex-grow: 1;\n  `,\n});\n","import { PanelPlugin } from '@grafana/data';\nimport { StoreState } from 'app/types';\n\nimport { getPanelPluginNotFound } from '../../panel/components/PanelPluginError';\n\nexport const getPanelPluginWithFallback =\n  (panelType: string) =>\n  (state: StoreState): PanelPlugin => {\n    const plugin = state.plugins.panels[panelType];\n    return plugin || getPanelPluginNotFound(`Panel plugin not found (${panelType})`, true);\n  };\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { ToolbarButton, ButtonGroup } from '@grafana/ui';\nimport { useDispatch, useSelector } from 'app/types';\n\nimport { PanelModel } from '../../state';\nimport { getPanelPluginWithFallback } from '../../state/selectors';\n\nimport { updatePanelEditorUIState } from './state/actions';\nimport { toggleVizPicker } from './state/reducers';\n\ntype Props = {\n  panel: PanelModel;\n};\n\nexport const VisualizationButton = ({ panel }: Props) => {\n  const dispatch = useDispatch();\n  const plugin = useSelector(getPanelPluginWithFallback(panel.type));\n  const isPanelOptionsVisible = useSelector((state) => state.panelEditor.ui.isPanelOptionsVisible);\n  const isVizPickerOpen = useSelector((state) => state.panelEditor.isVizPickerOpen);\n\n  const onToggleOpen = () => {\n    dispatch(toggleVizPicker(!isVizPickerOpen));\n  };\n\n  const onToggleOptionsPane = () => {\n    dispatch(updatePanelEditorUIState({ isPanelOptionsVisible: !isPanelOptionsVisible }));\n  };\n\n  if (!plugin) {\n    return null;\n  }\n\n  return (\n    <div className={styles.wrapper}>\n      <ButtonGroup>\n        <ToolbarButton\n          className={styles.vizButton}\n          tooltip=\"Click to change visualization\"\n          imgSrc={plugin.meta.info.logos.small}\n          isOpen={isVizPickerOpen}\n          onClick={onToggleOpen}\n          aria-label={selectors.components.PanelEditor.toggleVizPicker}\n          variant=\"canvas\"\n          fullWidth\n        >\n          {plugin.meta.name}\n        </ToolbarButton>\n        <ToolbarButton\n          tooltip={isPanelOptionsVisible ? 'Close options pane' : 'Show options pane'}\n          icon={isPanelOptionsVisible ? 'angle-right' : 'angle-left'}\n          onClick={onToggleOptionsPane}\n          variant=\"canvas\"\n          aria-label={selectors.components.PanelEditor.toggleVizOptions}\n        />\n      </ButtonGroup>\n    </div>\n  );\n};\n\nVisualizationButton.displayName = 'VisualizationTab';\n\nconst styles = {\n  wrapper: css`\n    display: flex;\n    flex-direction: column;\n  `,\n  vizButton: css`\n    text-align: left;\n  `,\n};\n","import React from 'react';\n\nimport { ConfirmModal } from '@grafana/ui';\n\nimport { PanelModel } from '../../../dashboard/state';\nimport { isPanelModelLibraryPanel } from '../../guard';\n\nexport interface ChangeLibraryPanelModalProps {\n  panel: PanelModel;\n  onConfirm: () => void;\n  onDismiss: () => void;\n}\n\nexport const ChangeLibraryPanelModal = ({ onConfirm, onDismiss, panel }: ChangeLibraryPanelModalProps): JSX.Element => {\n  const isLibraryPanel = isPanelModelLibraryPanel(panel);\n  const title = `${isLibraryPanel ? 'Changing' : 'Replace with'} library panel`;\n  const body = `${\n    isLibraryPanel ? 'Changing' : 'Replacing with a'\n  } library panel will remove any changes since last save.`;\n  return (\n    <ConfirmModal\n      onConfirm={onConfirm}\n      onDismiss={onDismiss}\n      confirmText={isLibraryPanel ? 'Change' : 'Replace'}\n      title={title}\n      body={body}\n      dismissText=\"Cancel\"\n      isOpen={true}\n    />\n  );\n};\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback, useState } from 'react';\n\nimport { PanelPluginMeta } from '@grafana/data';\nimport { Button, VerticalGroup } from '@grafana/ui';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { changeToLibraryPanel } from 'app/features/panel/state/actions';\nimport { useDispatch } from 'app/types';\n\nimport { PanelTypeFilter } from '../../../../core/components/PanelTypeFilter/PanelTypeFilter';\nimport { LibraryElementDTO } from '../../types';\nimport { AddLibraryPanelModal } from '../AddLibraryPanelModal/AddLibraryPanelModal';\nimport { ChangeLibraryPanelModal } from '../ChangeLibraryPanelModal/ChangeLibraryPanelModal';\nimport { LibraryPanelsView } from '../LibraryPanelsView/LibraryPanelsView';\n\ninterface Props {\n  panel: PanelModel;\n  searchQuery: string;\n}\n\nexport const PanelLibraryOptionsGroup: FC<Props> = ({ panel, searchQuery }) => {\n  const [showingAddPanelModal, setShowingAddPanelModal] = useState(false);\n  const [changeToPanel, setChangeToPanel] = useState<LibraryElementDTO | undefined>(undefined);\n  const [panelFilter, setPanelFilter] = useState<string[]>([]);\n  const onPanelFilterChange = useCallback(\n    (plugins: PanelPluginMeta[]) => {\n      setPanelFilter(plugins.map((p) => p.id));\n    },\n    [setPanelFilter]\n  );\n  const dashboard = getDashboardSrv().getCurrent();\n  const dispatch = useDispatch();\n\n  const useLibraryPanel = async () => {\n    if (!changeToPanel) {\n      return;\n    }\n\n    setChangeToPanel(undefined);\n    dispatch(changeToLibraryPanel(panel, changeToPanel));\n  };\n\n  const onAddToPanelLibrary = () => setShowingAddPanelModal(true);\n  const onDismissChangeToPanel = () => setChangeToPanel(undefined);\n\n  return (\n    <VerticalGroup spacing=\"md\">\n      {!panel.libraryPanel && (\n        <VerticalGroup align=\"center\">\n          <Button icon=\"plus\" onClick={onAddToPanelLibrary} variant=\"secondary\" fullWidth>\n            Create new library panel\n          </Button>\n        </VerticalGroup>\n      )}\n\n      <PanelTypeFilter onChange={onPanelFilterChange} />\n\n      <div className={styles.libraryPanelsView}>\n        <LibraryPanelsView\n          currentPanelId={panel.libraryPanel?.uid}\n          searchString={searchQuery}\n          panelFilter={panelFilter}\n          onClickCard={setChangeToPanel}\n          showSecondaryActions\n        />\n      </div>\n\n      {showingAddPanelModal && (\n        <AddLibraryPanelModal\n          panel={panel}\n          onDismiss={() => setShowingAddPanelModal(false)}\n          initialFolderId={dashboard?.meta.folderId}\n          isOpen={showingAddPanelModal}\n        />\n      )}\n\n      {changeToPanel && (\n        <ChangeLibraryPanelModal panel={panel} onDismiss={onDismissChangeToPanel} onConfirm={useLibraryPanel} />\n      )}\n    </VerticalGroup>\n  );\n};\n\nconst styles = {\n  libraryPanelsView: css`\n    width: 100%;\n  `,\n};\n","import {\n  PanelData,\n  VisualizationSuggestion,\n  VisualizationSuggestionsBuilder,\n  PanelModel,\n  VisualizationSuggestionScore,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { importPanelPlugin } from 'app/features/plugins/importPanelPlugin';\n\nexport const panelsToCheckFirst = [\n  'timeseries',\n  'barchart',\n  'gauge',\n  'stat',\n  'piechart',\n  'bargauge',\n  'table',\n  'state-timeline',\n  'status-history',\n  'logs',\n  'candlestick',\n];\n\nexport async function getAllSuggestions(data?: PanelData, panel?: PanelModel): Promise<VisualizationSuggestion[]> {\n  const builder = new VisualizationSuggestionsBuilder(data, panel);\n\n  for (const pluginId of panelsToCheckFirst) {\n    const plugin = await importPanelPlugin(pluginId);\n    const supplier = plugin.getSuggestionsSupplier();\n\n    if (supplier) {\n      supplier.getSuggestionsForData(builder);\n    }\n  }\n\n  const list = builder.getList();\n\n  if (builder.dataSummary.fieldCount === 0) {\n    for (const plugin of Object.values(config.panels)) {\n      if (!plugin.skipDataQuery || plugin.hideFromList) {\n        continue;\n      }\n\n      list.push({\n        name: plugin.name,\n        pluginId: plugin.id,\n        description: plugin.info.description,\n        cardOptions: {\n          imgSrc: plugin.info.logos.small,\n        },\n      });\n    }\n  }\n\n  return list.sort((a, b) => {\n    return (b.score ?? VisualizationSuggestionScore.OK) - (a.score ?? VisualizationSuggestionScore.OK);\n  });\n}\n","import { css, cx } from '@emotion/css';\nimport { cloneDeep } from 'lodash';\nimport React, { CSSProperties } from 'react';\n\nimport { GrafanaTheme2, PanelData, VisualizationSuggestion } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { PanelRenderer } from '../PanelRenderer';\n\nimport { VizTypeChangeDetails } from './types';\n\nexport interface Props {\n  data: PanelData;\n  width: number;\n  suggestion: VisualizationSuggestion;\n  showTitle?: boolean;\n  onChange: (details: VizTypeChangeDetails) => void;\n}\n\nexport function VisualizationSuggestionCard({ data, suggestion, onChange, width, showTitle }: Props) {\n  const styles = useStyles2(getStyles);\n  const { innerStyles, outerStyles, renderWidth, renderHeight } = getPreviewDimensionsAndStyles(width);\n  const cardOptions = suggestion.cardOptions ?? {};\n\n  const commonButtonProps = {\n    'aria-label': suggestion.name,\n    className: styles.vizBox,\n    'data-testid': selectors.components.VisualizationPreview.card(suggestion.name),\n    style: outerStyles,\n    onClick: () => {\n      onChange({\n        pluginId: suggestion.pluginId,\n        options: suggestion.options,\n        fieldConfig: suggestion.fieldConfig,\n      });\n    },\n  };\n\n  if (cardOptions.imgSrc) {\n    return (\n      <Tooltip content={suggestion.description ?? suggestion.name}>\n        <button {...commonButtonProps} className={cx(styles.vizBox, styles.imgBox)}>\n          <div className={styles.name}>{suggestion.name}</div>\n          <img className={styles.img} src={cardOptions.imgSrc} alt={suggestion.name} />\n        </button>\n      </Tooltip>\n    );\n  }\n\n  let preview = suggestion;\n  if (suggestion.cardOptions?.previewModifier) {\n    preview = cloneDeep(suggestion);\n    suggestion.cardOptions.previewModifier(preview);\n  }\n\n  return (\n    <button {...commonButtonProps}>\n      <Tooltip content={suggestion.name}>\n        <div style={innerStyles} className={styles.renderContainer}>\n          <PanelRenderer\n            title=\"\"\n            data={data}\n            pluginId={suggestion.pluginId}\n            width={renderWidth}\n            height={renderHeight}\n            options={preview.options}\n            fieldConfig={preview.fieldConfig}\n          />\n          <div className={styles.hoverPane} />\n        </div>\n      </Tooltip>\n    </button>\n  );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    hoverPane: css({\n      position: 'absolute',\n      top: 0,\n      right: 0,\n      left: 0,\n      borderRadius: theme.spacing(2),\n      bottom: 0,\n    }),\n    vizBox: css`\n      position: relative;\n      background: none;\n      border-radius: ${theme.shape.borderRadius(1)};\n      cursor: pointer;\n      border: 1px solid ${theme.colors.border.medium};\n\n      transition: ${theme.transitions.create(['background'], {\n        duration: theme.transitions.duration.short,\n      })};\n\n      &:hover {\n        background: ${theme.colors.background.secondary};\n      }\n    `,\n    imgBox: css`\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n\n      justify-self: center;\n      color: ${theme.colors.text.primary};\n      width: 100%;\n      display: flex;\n\n      justify-content: center;\n      align-items: center;\n      text-align: center;\n    `,\n    name: css`\n      padding-bottom: ${theme.spacing(0.5)};\n      margin-top: ${theme.spacing(-1)};\n      font-size: ${theme.typography.bodySmall.fontSize};\n      white-space: nowrap;\n      overflow: hidden;\n      color: ${theme.colors.text.secondary};\n      font-weight: ${theme.typography.fontWeightMedium};\n      text-overflow: ellipsis;\n    `,\n    img: css`\n      max-width: ${theme.spacing(8)};\n      max-height: ${theme.spacing(8)};\n    `,\n    renderContainer: css`\n      position: absolute;\n      transform-origin: left top;\n      top: 6px;\n      left: 6px;\n    `,\n  };\n};\n\ninterface PreviewDimensionsAndStyles {\n  renderWidth: number;\n  renderHeight: number;\n  innerStyles: CSSProperties;\n  outerStyles: CSSProperties;\n}\n\nfunction getPreviewDimensionsAndStyles(width: number): PreviewDimensionsAndStyles {\n  const aspectRatio = 16 / 10;\n  const showWidth = width;\n  const showHeight = width * (1 / aspectRatio);\n  const renderWidth = 350;\n  const renderHeight = renderWidth * (1 / aspectRatio);\n\n  const padding = 6;\n  const widthFactor = (showWidth - padding * 2) / renderWidth;\n  const heightFactor = (showHeight - padding * 2) / renderHeight;\n\n  return {\n    renderHeight,\n    renderWidth,\n    outerStyles: { width: showWidth, height: showHeight },\n    innerStyles: {\n      width: renderWidth,\n      height: renderHeight,\n      transform: `scale(${widthFactor}, ${heightFactor})`,\n    },\n  };\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useAsync, useLocalStorage } from 'react-use';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { GrafanaTheme2, PanelData, PanelPluginMeta, PanelModel, VisualizationSuggestion } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { getAllSuggestions } from '../../state/getAllSuggestions';\n\nimport { VisualizationSuggestionCard } from './VisualizationSuggestionCard';\nimport { VizTypeChangeDetails } from './types';\n\nexport interface Props {\n  current: PanelPluginMeta;\n  data?: PanelData;\n  panel?: PanelModel;\n  onChange: (options: VizTypeChangeDetails) => void;\n  searchQuery: string;\n  onClose: () => void;\n}\n\nexport function VisualizationSuggestions({ onChange, data, panel, searchQuery }: Props) {\n  const styles = useStyles2(getStyles);\n  const { value: suggestions } = useAsync(() => getAllSuggestions(data, panel), [data, panel]);\n  // temp test\n  const [showTitle, setShowTitle] = useLocalStorage(`VisualizationSuggestions.showTitle`, false);\n  const filteredSuggestions = filterSuggestionsBySearch(searchQuery, suggestions);\n\n  return (\n    <AutoSizer disableHeight style={{ width: '100%', height: '100%' }}>\n      {({ width }) => {\n        if (!width) {\n          return null;\n        }\n\n        const columnCount = Math.floor(width / 170);\n        const spaceBetween = 8 * (columnCount! - 1);\n        const previewWidth = (width - spaceBetween) / columnCount!;\n\n        return (\n          <div>\n            <div className={styles.filterRow}>\n              <div className={styles.infoText} onClick={() => setShowTitle(!showTitle)}>\n                Based on current data\n              </div>\n            </div>\n            <div className={styles.grid} style={{ gridTemplateColumns: `repeat(auto-fill, ${previewWidth - 1}px)` }}>\n              {filteredSuggestions.map((suggestion, index) => (\n                <VisualizationSuggestionCard\n                  key={index}\n                  data={data!}\n                  suggestion={suggestion}\n                  onChange={onChange}\n                  width={previewWidth}\n                  showTitle={showTitle}\n                />\n              ))}\n              {searchQuery && filteredSuggestions.length === 0 && (\n                <div className={styles.infoText}>No results matched your query</div>\n              )}\n            </div>\n          </div>\n        );\n      }}\n    </AutoSizer>\n  );\n}\n\nfunction filterSuggestionsBySearch(\n  searchQuery: string,\n  suggestions?: VisualizationSuggestion[]\n): VisualizationSuggestion[] {\n  if (!searchQuery || !suggestions) {\n    return suggestions || [];\n  }\n\n  const regex = new RegExp(searchQuery, 'i');\n\n  return suggestions.filter((s) => regex.test(s.name) || regex.test(s.pluginId));\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    heading: css({\n      ...theme.typography.h5,\n      margin: theme.spacing(0, 0.5, 1),\n    }),\n    filterRow: css({\n      display: 'flex',\n      flexDirection: 'row',\n      justifyContent: 'space-around',\n      alignItems: 'center',\n      paddingBottom: '8px',\n    }),\n    infoText: css({\n      fontSize: theme.typography.bodySmall.fontSize,\n      color: theme.colors.text.secondary,\n      fontStyle: 'italic',\n    }),\n    grid: css({\n      display: 'grid',\n      gridGap: theme.spacing(1),\n      gridTemplateColumns: 'repeat(auto-fill, 144px)',\n      marginBottom: theme.spacing(1),\n      justifyContent: 'space-evenly',\n    }),\n  };\n};\n","import React, { MouseEventHandler } from 'react';\n\nimport { PanelPluginMeta } from '@grafana/data';\n\nimport { PanelTypeCard } from './PanelTypeCard';\n\ninterface Props {\n  isCurrent: boolean;\n  plugin: PanelPluginMeta;\n  onClick: MouseEventHandler<HTMLDivElement>;\n  disabled: boolean;\n}\n\nexport const VizTypePickerPlugin = ({ isCurrent, plugin, onClick, disabled }: Props) => {\n  return (\n    <PanelTypeCard\n      title={plugin.name}\n      plugin={plugin}\n      description={plugin.info.description}\n      onClick={onClick}\n      isCurrent={isCurrent}\n      disabled={disabled}\n      showBadge={true}\n    />\n  );\n};\n\nVizTypePickerPlugin.displayName = 'VizTypePickerPlugin';\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2, PanelData, PanelPluginMeta } from '@grafana/data';\nimport { EmptySearchResult, useStyles2 } from '@grafana/ui';\n\nimport { filterPluginList, getAllPanelPluginMeta } from '../../state/util';\n\nimport { VizTypePickerPlugin } from './VizTypePickerPlugin';\nimport { VizTypeChangeDetails } from './types';\n\nexport interface Props {\n  current: PanelPluginMeta;\n  data?: PanelData;\n  onChange: (options: VizTypeChangeDetails) => void;\n  searchQuery: string;\n  onClose: () => void;\n}\n\nexport function VizTypePicker({ searchQuery, onChange, current, data }: Props) {\n  const styles = useStyles2(getStyles);\n  const pluginsList: PanelPluginMeta[] = useMemo(() => {\n    return getAllPanelPluginMeta();\n  }, []);\n\n  const filteredPluginTypes = useMemo((): PanelPluginMeta[] => {\n    return filterPluginList(pluginsList, searchQuery, current);\n  }, [current, pluginsList, searchQuery]);\n\n  if (filteredPluginTypes.length === 0) {\n    return <EmptySearchResult>Could not find anything matching your query</EmptySearchResult>;\n  }\n\n  return (\n    <div className={styles.grid}>\n      {filteredPluginTypes.map((plugin, index) => (\n        <VizTypePickerPlugin\n          disabled={false}\n          key={plugin.id}\n          isCurrent={plugin.id === current.id}\n          plugin={plugin}\n          onClick={(e) =>\n            onChange({\n              pluginId: plugin.id,\n              withModKey: Boolean(e.metaKey || e.ctrlKey || e.altKey),\n            })\n          }\n        />\n      ))}\n    </div>\n  );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    grid: css`\n      max-width: 100%;\n      display: grid;\n      grid-gap: ${theme.spacing(0.5)};\n    `,\n    heading: css({\n      ...theme.typography.h5,\n      margin: theme.spacing(0, 0.5, 1),\n    }),\n  };\n};\n","import { css } from '@emotion/css';\nimport React, { FC, useCallback, useRef, useState } from 'react';\nimport { useLocalStorage } from 'react-use';\n\nimport { GrafanaTheme2, PanelData, SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Button, CustomScrollbar, FilterInput, RadioButtonGroup, useStyles2 } from '@grafana/ui';\nimport { Field } from '@grafana/ui/src/components/Forms/Field';\nimport { LS_VISUALIZATION_SELECT_TAB_KEY } from 'app/core/constants';\nimport { PanelLibraryOptionsGroup } from 'app/features/library-panels/components/PanelLibraryOptionsGroup/PanelLibraryOptionsGroup';\nimport { VisualizationSuggestions } from 'app/features/panel/components/VizTypePicker/VisualizationSuggestions';\nimport { VizTypeChangeDetails } from 'app/features/panel/components/VizTypePicker/types';\nimport { useDispatch, useSelector } from 'app/types';\n\nimport { VizTypePicker } from '../../../panel/components/VizTypePicker/VizTypePicker';\nimport { changePanelPlugin } from '../../../panel/state/actions';\nimport { PanelModel } from '../../state/PanelModel';\nimport { getPanelPluginWithFallback } from '../../state/selectors';\n\nimport { toggleVizPicker } from './state/reducers';\nimport { VisualizationSelectPaneTab } from './types';\n\ninterface Props {\n  panel: PanelModel;\n  data?: PanelData;\n}\n\nexport const VisualizationSelectPane: FC<Props> = ({ panel, data }) => {\n  const plugin = useSelector(getPanelPluginWithFallback(panel.type));\n  const [searchQuery, setSearchQuery] = useState('');\n  const [listMode, setListMode] = useLocalStorage(\n    LS_VISUALIZATION_SELECT_TAB_KEY,\n    VisualizationSelectPaneTab.Visualizations\n  );\n\n  const dispatch = useDispatch();\n  const styles = useStyles2(getStyles);\n  const searchRef = useRef<HTMLInputElement | null>(null);\n\n  const onVizChange = useCallback(\n    (pluginChange: VizTypeChangeDetails) => {\n      dispatch(changePanelPlugin({ panel: panel, ...pluginChange }));\n\n      // close viz picker unless a mod key is pressed while clicking\n      if (!pluginChange.withModKey) {\n        dispatch(toggleVizPicker(false));\n      }\n    },\n    [dispatch, panel]\n  );\n\n  const onCloseVizPicker = () => {\n    dispatch(toggleVizPicker(false));\n  };\n\n  if (!plugin) {\n    return null;\n  }\n\n  const radioOptions: Array<SelectableValue<VisualizationSelectPaneTab>> = [\n    { label: 'Visualizations', value: VisualizationSelectPaneTab.Visualizations },\n    { label: 'Suggestions', value: VisualizationSelectPaneTab.Suggestions },\n    {\n      label: 'Library panels',\n      value: VisualizationSelectPaneTab.LibraryPanels,\n      description: 'Reusable panels you can share between multiple dashboards.',\n    },\n  ];\n\n  return (\n    <div className={styles.openWrapper}>\n      <div className={styles.formBox}>\n        <div className={styles.searchRow}>\n          <FilterInput\n            value={searchQuery}\n            onChange={setSearchQuery}\n            ref={searchRef}\n            autoFocus={true}\n            placeholder=\"Search for...\"\n          />\n          <Button\n            title=\"Close\"\n            variant=\"secondary\"\n            icon=\"angle-up\"\n            className={styles.closeButton}\n            aria-label={selectors.components.PanelEditor.toggleVizPicker}\n            onClick={onCloseVizPicker}\n          />\n        </div>\n        <Field className={styles.customFieldMargin}>\n          <RadioButtonGroup options={radioOptions} value={listMode} onChange={setListMode} fullWidth />\n        </Field>\n      </div>\n      <div className={styles.scrollWrapper}>\n        <CustomScrollbar autoHeightMin=\"100%\">\n          <div className={styles.scrollContent}>\n            {listMode === VisualizationSelectPaneTab.Visualizations && (\n              <VizTypePicker\n                current={plugin.meta}\n                onChange={onVizChange}\n                searchQuery={searchQuery}\n                data={data}\n                onClose={() => {}}\n              />\n            )}\n            {listMode === VisualizationSelectPaneTab.Suggestions && (\n              <VisualizationSuggestions\n                current={plugin.meta}\n                onChange={onVizChange}\n                searchQuery={searchQuery}\n                panel={panel}\n                data={data}\n                onClose={() => {}}\n              />\n            )}\n            {listMode === VisualizationSelectPaneTab.LibraryPanels && (\n              <PanelLibraryOptionsGroup searchQuery={searchQuery} panel={panel} key=\"Panel Library\" />\n            )}\n          </div>\n        </CustomScrollbar>\n      </div>\n    </div>\n  );\n};\n\nVisualizationSelectPane.displayName = 'VisualizationSelectPane';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    icon: css`\n      color: ${theme.v1.palette.gray33};\n    `,\n    wrapper: css`\n      display: flex;\n      flex-direction: column;\n      flex: 1 1 0;\n      height: 100%;\n    `,\n    vizButton: css`\n      text-align: left;\n    `,\n    scrollWrapper: css`\n      flex-grow: 1;\n      min-height: 0;\n    `,\n    scrollContent: css`\n      padding: ${theme.spacing(1)};\n    `,\n    openWrapper: css`\n      display: flex;\n      flex-direction: column;\n      flex: 1 1 100%;\n      height: 100%;\n      background: ${theme.colors.background.primary};\n      border: 1px solid ${theme.colors.border.weak};\n    `,\n    searchRow: css`\n      display: flex;\n      margin-bottom: ${theme.spacing(1)};\n    `,\n    closeButton: css`\n      margin-left: ${theme.spacing(1)};\n    `,\n    customFieldMargin: css`\n      margin-bottom: ${theme.spacing(1)};\n    `,\n    formBox: css`\n      padding: ${theme.spacing(1)};\n      padding-bottom: 0;\n    `,\n  };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { useStyles2 } from '@grafana/ui';\nimport { useSelector } from 'app/types';\n\nimport { OptionsPaneOptions } from './OptionsPaneOptions';\nimport { VisualizationButton } from './VisualizationButton';\nimport { VisualizationSelectPane } from './VisualizationSelectPane';\nimport { OptionPaneRenderProps } from './types';\nimport { usePanelLatestData } from './usePanelLatestData';\n\nexport const OptionsPane: React.FC<OptionPaneRenderProps> = ({\n  plugin,\n  panel,\n  onFieldConfigsChange,\n  onPanelOptionsChanged,\n  onPanelConfigChange,\n  dashboard,\n  instanceState,\n}) => {\n  const styles = useStyles2(getStyles);\n  const isVizPickerOpen = useSelector((state) => state.panelEditor.isVizPickerOpen);\n  const { data } = usePanelLatestData(panel, { withTransforms: true, withFieldConfig: false }, true);\n\n  return (\n    <div className={styles.wrapper} aria-label={selectors.components.PanelEditor.OptionsPane.content}>\n      {!isVizPickerOpen && (\n        <>\n          <div className={styles.vizButtonWrapper}>\n            <VisualizationButton panel={panel} />\n          </div>\n          <div className={styles.optionsWrapper}>\n            <OptionsPaneOptions\n              panel={panel}\n              dashboard={dashboard}\n              plugin={plugin}\n              instanceState={instanceState}\n              data={data}\n              onFieldConfigsChange={onFieldConfigsChange}\n              onPanelOptionsChanged={onPanelOptionsChanged}\n              onPanelConfigChange={onPanelConfigChange}\n            />\n          </div>\n        </>\n      )}\n      {isVizPickerOpen && <VisualizationSelectPane panel={panel} data={data} />}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    wrapper: css`\n      height: 100%;\n      width: 100%;\n      display: flex;\n      flex: 1 1 0;\n      flex-direction: column;\n      padding: 0;\n    `,\n    optionsWrapper: css`\n      flex-grow: 1;\n      min-height: 0;\n    `,\n    vizButtonWrapper: css`\n      padding: 0 ${theme.spacing(2, 2)} 0;\n    `,\n    legacyOptions: css`\n      label: legacy-options;\n      .panel-options-grid {\n        display: flex;\n        flex-direction: column;\n      }\n      .panel-options-group {\n        margin-bottom: 0;\n      }\n      .panel-options-group__body {\n        padding: ${theme.spacing(2)} 0;\n      }\n\n      .section {\n        display: block;\n        margin: ${theme.spacing(2)} 0;\n\n        &:first-child {\n          margin-top: 0;\n        }\n      }\n    `,\n  };\n};\n","import React, { useEffect, useState } from 'react';\n\nimport { RefreshEvent } from '@grafana/runtime';\nimport { PanelChrome } from '@grafana/ui';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\nimport { PanelRenderer } from 'app/features/panel/components/PanelRenderer';\nimport { PanelOptions } from 'app/plugins/panel/table/models.gen';\n\nimport PanelHeaderCorner from '../../dashgrid/PanelHeader/PanelHeaderCorner';\nimport { getTimeSrv } from '../../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../../state';\n\nimport { usePanelLatestData } from './usePanelLatestData';\n\nexport interface Props {\n  width: number;\n  height: number;\n  panel: PanelModel;\n  dashboard: DashboardModel;\n}\n\nexport function PanelEditorTableView({ width, height, panel, dashboard }: Props) {\n  const { data } = usePanelLatestData(panel, { withTransforms: true, withFieldConfig: false }, false);\n  const [options, setOptions] = useState<PanelOptions>({\n    frameIndex: 0,\n    showHeader: true,\n    showTypeIcons: true,\n  });\n\n  // Subscribe to panel event\n  useEffect(() => {\n    const timeSrv = getTimeSrv();\n\n    const sub = panel.events.subscribe(RefreshEvent, () => {\n      const timeData = applyPanelTimeOverrides(panel, timeSrv.timeRange());\n      panel.runAllPanelQueries({\n        dashboardId: dashboard.id,\n        dashboardUID: dashboard.uid,\n        dashboardTimezone: dashboard.getTimezone(),\n        timeData,\n        width,\n      });\n    });\n    return () => {\n      sub.unsubscribe();\n    };\n  }, [panel, dashboard, width]);\n\n  if (!data) {\n    return null;\n  }\n  return (\n    <PanelChrome width={width} height={height} padding=\"none\">\n      {(innerWidth, innerHeight) => (\n        <>\n          <PanelHeaderCorner panel={panel} error={data?.error?.message} />\n          <PanelRenderer\n            title=\"Raw data\"\n            pluginId=\"table\"\n            width={innerWidth}\n            height={innerHeight}\n            data={data}\n            options={options}\n            onOptionsChange={setOptions}\n          />\n        </>\n      )}\n    </PanelChrome>\n  );\n}\n","import React, { useCallback } from 'react';\n\nimport { locationService } from '@grafana/runtime';\nimport { Button, VerticalGroup } from '@grafana/ui';\nimport { Layout } from '@grafana/ui/src/components/Layout/Layout';\n\nimport { PanelEditorTabId } from './types';\n\nexport interface Props {\n  message: string;\n}\n\nexport function PanelNotSupported({ message }: Props): JSX.Element {\n  const onBackToQueries = useCallback(() => {\n    locationService.partial({ tab: PanelEditorTabId.Query });\n  }, []);\n\n  return (\n    <Layout justify=\"center\" style={{ marginTop: '100px' }}>\n      <VerticalGroup spacing=\"md\">\n        <h2>{message}</h2>\n        <div>\n          <Button size=\"md\" variant=\"secondary\" icon=\"arrow-left\" onClick={onBackToQueries}>\n            Go back to Queries\n          </Button>\n        </div>\n      </VerticalGroup>\n    </Layout>\n  );\n}\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { Icon, ConfirmButton, Button } from '@grafana/ui';\n\nimport { DashboardModel } from '../dashboard/state/DashboardModel';\n\nimport alertDef from './state/alertDef';\n\ninterface Props {\n  dashboard: DashboardModel;\n  panelId: number;\n  onRefresh: () => void;\n}\n\ninterface State {\n  stateHistoryItems: any[];\n}\n\nclass StateHistory extends PureComponent<Props, State> {\n  state: State = {\n    stateHistoryItems: [],\n  };\n\n  componentDidMount(): void {\n    const { dashboard, panelId } = this.props;\n\n    getBackendSrv()\n      .get(\n        `/api/annotations?dashboardId=${dashboard.id}&panelId=${panelId}&limit=50&type=alert`,\n        {},\n        `state-history-${dashboard.id}-${panelId}`\n      )\n      .then((data) => {\n        const items = data.map((item: any) => {\n          return {\n            stateModel: alertDef.getStateDisplayModel(item.newState),\n            time: dashboard.formatDate(item.time, 'MMM D, YYYY HH:mm:ss'),\n            info: alertDef.getAlertAnnotationInfo(item),\n          };\n        });\n\n        this.setState({\n          stateHistoryItems: items,\n        });\n      });\n  }\n\n  clearHistory = async () => {\n    const { dashboard, panelId, onRefresh } = this.props;\n\n    await getBackendSrv().post('/api/annotations/mass-delete', {\n      dashboardId: dashboard.id,\n      panelId: panelId,\n    });\n\n    this.setState({ stateHistoryItems: [] });\n    onRefresh();\n  };\n\n  render() {\n    const { stateHistoryItems } = this.state;\n\n    return (\n      <div>\n        {stateHistoryItems.length > 0 && (\n          <div className=\"p-b-1\">\n            <span className=\"muted\">Last 50 state changes</span>\n            <ConfirmButton onConfirm={this.clearHistory} confirmVariant=\"destructive\" confirmText=\"Clear\">\n              <Button\n                className={css`\n                  direction: ltr;\n                `}\n                variant=\"destructive\"\n                icon=\"trash-alt\"\n              >\n                Clear history\n              </Button>\n            </ConfirmButton>\n          </div>\n        )}\n        <ol className=\"alert-rule-list\">\n          {stateHistoryItems.length > 0 ? (\n            stateHistoryItems.map((item, index) => {\n              return (\n                <li className=\"alert-rule-item\" key={`${item.time}-${index}`}>\n                  <div className={`alert-rule-item__icon ${item.stateModel.stateClass}`}>\n                    <Icon name={item.stateModel.iconClass} size=\"xl\" />\n                  </div>\n                  <div className=\"alert-rule-item__body\">\n                    <div className=\"alert-rule-item__header\">\n                      <p className=\"alert-rule-item__name\">{item.alertName}</p>\n                      <div className=\"alert-rule-item__text\">\n                        <span className={`${item.stateModel.stateClass}`}>{item.stateModel.text}</span>\n                      </div>\n                    </div>\n                    {item.info}\n                  </div>\n                  <div className=\"alert-rule-item__time\">{item.time}</div>\n                </li>\n              );\n            })\n          ) : (\n            <i>No state changes recorded</i>\n          )}\n        </ol>\n      </div>\n    );\n  }\n}\n\nexport default StateHistory;\n","import React, { PureComponent } from 'react';\n\nimport { getBackendSrv } from '@grafana/runtime';\nimport { LoadingPlaceholder, JSONFormatter, Icon, HorizontalGroup, ClipboardButton } from '@grafana/ui';\n\nimport { DashboardModel, PanelModel } from '../dashboard/state';\n\nexport interface Props {\n  dashboard: DashboardModel;\n  panel: PanelModel;\n}\n\ninterface State {\n  isLoading: boolean;\n  allNodesExpanded: boolean | null;\n  testRuleResponse: {};\n}\n\nexport class TestRuleResult extends PureComponent<Props, State> {\n  readonly state: State = {\n    isLoading: false,\n    allNodesExpanded: null,\n    testRuleResponse: {},\n  };\n\n  formattedJson: any;\n  clipboard: any;\n\n  componentDidMount() {\n    this.testRule();\n  }\n\n  async testRule() {\n    const { dashboard, panel } = this.props;\n\n    // dashboard save model\n    const model = dashboard.getSaveModelClone();\n\n    // now replace panel to get current edits\n    model.panels = model.panels.map((dashPanel) => {\n      return dashPanel.id === panel.id ? panel.getSaveModel() : dashPanel;\n    });\n\n    const payload = { dashboard: model, panelId: panel.id };\n\n    this.setState({ isLoading: true });\n    const testRuleResponse = await getBackendSrv().post(`/api/alerts/test`, payload);\n    this.setState({ isLoading: false, testRuleResponse });\n  }\n\n  setFormattedJson = (formattedJson: any) => {\n    this.formattedJson = formattedJson;\n  };\n\n  getTextForClipboard = () => {\n    return JSON.stringify(this.formattedJson, null, 2);\n  };\n\n  onToggleExpand = () => {\n    this.setState((prevState) => ({\n      ...prevState,\n      allNodesExpanded: !this.state.allNodesExpanded,\n    }));\n  };\n\n  getNrOfOpenNodes = () => {\n    if (this.state.allNodesExpanded === null) {\n      return 3; // 3 is default, ie when state is null\n    } else if (this.state.allNodesExpanded) {\n      return 20;\n    }\n    return 1;\n  };\n\n  renderExpandCollapse = () => {\n    const { allNodesExpanded } = this.state;\n\n    const collapse = (\n      <>\n        <Icon name=\"minus-circle\" /> Collapse All\n      </>\n    );\n    const expand = (\n      <>\n        <Icon name=\"plus-circle\" /> Expand All\n      </>\n    );\n    return allNodesExpanded ? collapse : expand;\n  };\n\n  render() {\n    const { testRuleResponse, isLoading } = this.state;\n\n    if (isLoading === true) {\n      return <LoadingPlaceholder text=\"Evaluating rule\" />;\n    }\n\n    const openNodes = this.getNrOfOpenNodes();\n\n    return (\n      <>\n        <div className=\"pull-right\">\n          <HorizontalGroup spacing=\"md\">\n            <div onClick={this.onToggleExpand}>{this.renderExpandCollapse()}</div>\n            <ClipboardButton getText={this.getTextForClipboard} icon=\"copy\">\n              Copy to Clipboard\n            </ClipboardButton>\n          </HorizontalGroup>\n        </div>\n\n        <JSONFormatter json={testRuleResponse} open={openNodes} onDidRender={this.setFormattedJson} />\n      </>\n    );\n  }\n}\n","import React, { PureComponent } from 'react';\nimport { connect, MapDispatchToProps, MapStateToProps } from 'react-redux';\n\nimport { EventBusSrv } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { AngularComponent, config, getAngularLoader, getDataSourceSrv } from '@grafana/runtime';\nimport { Alert, Button, ConfirmModal, Container, CustomScrollbar, HorizontalGroup, Modal } from '@grafana/ui';\nimport EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { AppNotificationSeverity, StoreState } from 'app/types';\n\nimport { AlertState } from '../../plugins/datasource/alertmanager/types';\nimport { PanelNotSupported } from '../dashboard/components/PanelEditor/PanelNotSupported';\nimport { DashboardModel } from '../dashboard/state/DashboardModel';\nimport { PanelModel } from '../dashboard/state/PanelModel';\n\nimport StateHistory from './StateHistory';\nimport { TestRuleResult } from './TestRuleResult';\nimport { getAlertingValidationMessage } from './getAlertingValidationMessage';\n\ninterface AngularPanelController {\n  _enableAlert: () => void;\n  alertState: AlertState | null;\n  render: () => void;\n  refresh: () => void;\n}\n\ninterface OwnProps {\n  dashboard: DashboardModel;\n  panel: PanelModel;\n}\n\ninterface ConnectedProps {\n  angularPanelComponent?: AngularComponent | null;\n}\n\ninterface DispatchProps {}\n\nexport type Props = OwnProps & ConnectedProps & DispatchProps;\n\ninterface State {\n  validationMessage: string;\n  showStateHistory: boolean;\n  showDeleteConfirmation: boolean;\n  showTestRule: boolean;\n}\n\nclass UnConnectedAlertTab extends PureComponent<Props, State> {\n  element?: HTMLDivElement | null;\n  component?: AngularComponent;\n  panelCtrl?: AngularPanelController;\n\n  state: State = {\n    validationMessage: '',\n    showStateHistory: false,\n    showDeleteConfirmation: false,\n    showTestRule: false,\n  };\n\n  async componentDidMount() {\n    if (config.angularSupportEnabled) {\n      await import(/* webpackChunkName: \"AlertTabCtrl\" */ 'app/features/alerting/AlertTabCtrl');\n      this.loadAlertTab();\n    } else {\n      // TODO probably need to migrate AlertTab to react\n      alert('Angular support disabled, legacy alerting cannot function without angular support');\n    }\n  }\n\n  onAngularPanelUpdated = () => {\n    this.forceUpdate();\n  };\n\n  componentDidUpdate(prevProps: Props) {\n    this.loadAlertTab();\n  }\n\n  componentWillUnmount() {\n    if (this.component) {\n      this.component.destroy();\n    }\n  }\n\n  async loadAlertTab() {\n    const { panel, angularPanelComponent } = this.props;\n\n    if (!this.element || this.component) {\n      return;\n    }\n\n    if (angularPanelComponent) {\n      const scope = angularPanelComponent.getScope();\n\n      // When full page reloading in edit mode the angular panel has on fully compiled & instantiated yet\n      if (!scope.$$childHead) {\n        setTimeout(() => {\n          this.forceUpdate();\n        });\n        return;\n      }\n\n      this.panelCtrl = scope.$$childHead.ctrl;\n    } else {\n      this.panelCtrl = this.getReactAlertPanelCtrl();\n    }\n\n    const loader = getAngularLoader();\n    const template = '<alert-tab />';\n    const scopeProps = { ctrl: this.panelCtrl };\n\n    this.component = loader.load(this.element, scopeProps, template);\n\n    const validationMessage = await getAlertingValidationMessage(\n      panel.transformations,\n      panel.targets,\n      getDataSourceSrv(),\n      panel.datasource\n    );\n\n    if (validationMessage) {\n      this.setState({ validationMessage });\n    }\n  }\n\n  getReactAlertPanelCtrl() {\n    return {\n      panel: this.props.panel,\n      events: new EventBusSrv(),\n      render: () => {\n        this.props.panel.render();\n      },\n    } as any;\n  }\n\n  onAddAlert = () => {\n    this.panelCtrl?._enableAlert();\n    this.component?.digest();\n    this.forceUpdate();\n  };\n\n  onToggleModal = (prop: keyof Omit<State, 'validationMessage'>) => {\n    const value = this.state[prop];\n    this.setState({ ...this.state, [prop]: !value });\n  };\n\n  renderTestRule = () => {\n    if (!this.state.showTestRule) {\n      return null;\n    }\n\n    const { panel, dashboard } = this.props;\n    const onDismiss = () => this.onToggleModal('showTestRule');\n\n    return (\n      <Modal isOpen={true} icon=\"bug\" title=\"Testing rule\" onDismiss={onDismiss} onClickBackdrop={onDismiss}>\n        <TestRuleResult panel={panel} dashboard={dashboard} />\n      </Modal>\n    );\n  };\n\n  renderDeleteConfirmation = () => {\n    if (!this.state.showDeleteConfirmation) {\n      return null;\n    }\n\n    const { panel } = this.props;\n    const onDismiss = () => this.onToggleModal('showDeleteConfirmation');\n\n    return (\n      <ConfirmModal\n        isOpen={true}\n        icon=\"trash-alt\"\n        title=\"Delete\"\n        body={\n          <div>\n            Are you sure you want to delete this alert rule?\n            <br />\n            <small>You need to save dashboard for the delete to take effect.</small>\n          </div>\n        }\n        confirmText=\"Delete alert\"\n        onDismiss={onDismiss}\n        onConfirm={() => {\n          delete panel.alert;\n          panel.thresholds = [];\n          if (this.panelCtrl) {\n            this.panelCtrl.alertState = null;\n            this.panelCtrl.render();\n          }\n          this.component?.digest();\n          onDismiss();\n        }}\n      />\n    );\n  };\n\n  renderStateHistory = () => {\n    if (!this.state.showStateHistory) {\n      return null;\n    }\n\n    const { panel, dashboard } = this.props;\n    const onDismiss = () => this.onToggleModal('showStateHistory');\n\n    return (\n      <Modal isOpen={true} icon=\"history\" title=\"State history\" onDismiss={onDismiss} onClickBackdrop={onDismiss}>\n        <StateHistory dashboard={dashboard} panelId={panel.id} onRefresh={() => this.panelCtrl?.refresh()} />\n      </Modal>\n    );\n  };\n\n  render() {\n    const { alert, transformations } = this.props.panel;\n    const { validationMessage } = this.state;\n    const hasTransformations = transformations && transformations.length > 0;\n\n    if (!alert && validationMessage) {\n      return <PanelNotSupported message={validationMessage} />;\n    }\n\n    const model = {\n      title: 'Panel has no alert rule defined',\n      buttonIcon: 'bell' as const,\n      onClick: this.onAddAlert,\n      buttonTitle: 'Create Alert',\n    };\n\n    return (\n      <>\n        <CustomScrollbar autoHeightMin=\"100%\">\n          <Container padding=\"md\">\n            <div aria-label={selectors.components.AlertTab.content}>\n              {alert && hasTransformations && (\n                <Alert\n                  severity={AppNotificationSeverity.Error}\n                  title=\"Transformations are not supported in alert queries\"\n                />\n              )}\n\n              <div ref={(element) => (this.element = element)} />\n              {alert && (\n                <HorizontalGroup>\n                  <Button onClick={() => this.onToggleModal('showStateHistory')} variant=\"secondary\">\n                    State history\n                  </Button>\n                  <Button onClick={() => this.onToggleModal('showTestRule')} variant=\"secondary\">\n                    Test rule\n                  </Button>\n                  <Button onClick={() => this.onToggleModal('showDeleteConfirmation')} variant=\"destructive\">\n                    Delete\n                  </Button>\n                </HorizontalGroup>\n              )}\n              {!alert && !validationMessage && <EmptyListCTA {...model} />}\n            </div>\n          </Container>\n        </CustomScrollbar>\n\n        {this.renderTestRule()}\n        {this.renderDeleteConfirmation()}\n        {this.renderStateHistory()}\n      </>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, props) => {\n  return {\n    angularPanelComponent: getPanelStateForModel(state, props.panel)?.angularComponent,\n  };\n};\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = {};\n\nexport const AlertTab = connect(mapStateToProps, mapDispatchToProps)(UnConnectedAlertTab);\n","import React, { FC } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useAsync } from 'react-use';\n\nimport { urlUtil } from '@grafana/data';\nimport { logInfo } from '@grafana/runtime';\nimport { Alert, Button, LinkButton } from '@grafana/ui';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { useSelector } from 'app/types';\n\nimport { LogMessages } from '../../Analytics';\nimport { panelToRuleFormValues } from '../../utils/rule-form';\n\ninterface Props {\n  panel: PanelModel;\n  dashboard: DashboardModel;\n  className?: string;\n}\n\nexport const NewRuleFromPanelButton: FC<Props> = ({ dashboard, panel, className }) => {\n  const templating = useSelector((state) => {\n    return state.templating;\n  });\n\n  const location = useLocation();\n\n  const { loading, value: formValues } = useAsync(\n    () => panelToRuleFormValues(panel, dashboard),\n    // Templating variables are required to update formValues on each variable's change. It's used implicitly by the templating engine\n    [panel, dashboard, templating]\n  );\n\n  if (loading) {\n    return <Button disabled={true}>Create alert rule from this panel</Button>;\n  }\n\n  if (!formValues) {\n    return (\n      <Alert severity=\"info\" title=\"No alerting capable query found\">\n        Cannot create alerts from this panel because no query to an alerting capable datasource is found.\n      </Alert>\n    );\n  }\n\n  const ruleFormUrl = urlUtil.renderUrl('alerting/new', {\n    defaults: JSON.stringify(formValues),\n    returnTo: location.pathname + location.search,\n  });\n\n  return (\n    <LinkButton\n      icon=\"bell\"\n      onClick={() => logInfo(LogMessages.alertRuleFromPanel)}\n      href={ruleFormUrl}\n      className={className}\n      data-testid=\"create-alert-rule-button\"\n    >\n      Create alert rule from this panel\n    </LinkButton>\n  );\n};\n","import { SerializedError } from '@reduxjs/toolkit';\nimport { useEffect, useMemo } from 'react';\n\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { useDispatch } from 'app/types';\nimport { CombinedRule } from 'app/types/unified-alerting';\n\nimport { fetchPromRulesAction, fetchRulerRulesAction } from '../state/actions';\nimport { Annotation, RULE_LIST_POLL_INTERVAL_MS } from '../utils/constants';\nimport { GRAFANA_RULES_SOURCE_NAME } from '../utils/datasource';\nimport { initialAsyncRequestState } from '../utils/redux';\n\nimport { useCombinedRuleNamespaces } from './useCombinedRuleNamespaces';\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface Options {\n  dashboard: DashboardModel;\n  panel: PanelModel;\n\n  poll?: boolean;\n}\n\ninterface ReturnBag {\n  errors: SerializedError[];\n  rules: CombinedRule[];\n\n  loading?: boolean;\n}\n\nexport function usePanelCombinedRules({ dashboard, panel, poll = false }: Options): ReturnBag {\n  const dispatch = useDispatch();\n\n  const promRuleRequest =\n    useUnifiedAlertingSelector((state) => state.promRules[GRAFANA_RULES_SOURCE_NAME]) ?? initialAsyncRequestState;\n  const rulerRuleRequest =\n    useUnifiedAlertingSelector((state) => state.rulerRules[GRAFANA_RULES_SOURCE_NAME]) ?? initialAsyncRequestState;\n\n  // fetch rules, then poll every RULE_LIST_POLL_INTERVAL_MS\n  useEffect(() => {\n    const fetch = () => {\n      dispatch(\n        fetchPromRulesAction({\n          rulesSourceName: GRAFANA_RULES_SOURCE_NAME,\n          filter: { dashboardUID: dashboard.uid, panelId: panel.id },\n        })\n      );\n      dispatch(\n        fetchRulerRulesAction({\n          rulesSourceName: GRAFANA_RULES_SOURCE_NAME,\n          filter: { dashboardUID: dashboard.uid, panelId: panel.id },\n        })\n      );\n    };\n    fetch();\n    if (poll) {\n      const interval = setInterval(fetch, RULE_LIST_POLL_INTERVAL_MS);\n      return () => {\n        clearInterval(interval);\n      };\n    }\n    return () => {};\n  }, [dispatch, poll, panel.id, dashboard.uid]);\n\n  const loading = promRuleRequest.loading || rulerRuleRequest.loading;\n  const errors = [promRuleRequest.error, rulerRuleRequest.error].filter(\n    (err: SerializedError | undefined): err is SerializedError => !!err\n  );\n\n  const combinedNamespaces = useCombinedRuleNamespaces(GRAFANA_RULES_SOURCE_NAME);\n\n  // filter out rules that are relevant to this panel\n  const rules = useMemo(\n    (): CombinedRule[] =>\n      combinedNamespaces\n        .flatMap((ns) => ns.groups)\n        .flatMap((group) => group.rules)\n        .filter(\n          (rule) =>\n            rule.annotations[Annotation.dashboardUID] === dashboard.uid &&\n            rule.annotations[Annotation.panelID] === String(panel.id)\n        ),\n    [combinedNamespaces, dashboard, panel]\n  );\n\n  return {\n    rules,\n    errors,\n    loading,\n  };\n}\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Alert, CustomScrollbar, LoadingPlaceholder, useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\n\nimport { NewRuleFromPanelButton } from './components/panel-alerts-tab/NewRuleFromPanelButton';\nimport { RulesTable } from './components/rules/RulesTable';\nimport { usePanelCombinedRules } from './hooks/usePanelCombinedRules';\nimport { getRulesPermissions } from './utils/access-control';\n\ninterface Props {\n  dashboard: DashboardModel;\n  panel: PanelModel;\n}\n\nexport const PanelAlertTabContent: FC<Props> = ({ dashboard, panel }) => {\n  const styles = useStyles2(getStyles);\n  const { errors, loading, rules } = usePanelCombinedRules({\n    dashboard,\n    panel,\n    poll: true,\n  });\n  const permissions = getRulesPermissions('grafana');\n  const canCreateRules = contextSrv.hasPermission(permissions.create);\n\n  const alert = errors.length ? (\n    <Alert title=\"Errors loading rules\" severity=\"error\">\n      {errors.map((error, index) => (\n        <div key={index}>Failed to load Grafana rules state: {error.message || 'Unknown error.'}</div>\n      ))}\n    </Alert>\n  ) : null;\n\n  if (loading && !rules.length) {\n    return (\n      <div className={styles.innerWrapper}>\n        {alert}\n        <LoadingPlaceholder text=\"Loading rules...\" />\n      </div>\n    );\n  }\n\n  if (rules.length) {\n    return (\n      <CustomScrollbar autoHeightMin=\"100%\">\n        <div className={styles.innerWrapper}>\n          {alert}\n          <RulesTable rules={rules} />\n          {!!dashboard.meta.canSave && canCreateRules && (\n            <NewRuleFromPanelButton className={styles.newButton} panel={panel} dashboard={dashboard} />\n          )}\n        </div>\n      </CustomScrollbar>\n    );\n  }\n\n  return (\n    <div aria-label={selectors.components.PanelAlertTabContent.content} className={styles.noRulesWrapper}>\n      {alert}\n      {!!dashboard.uid && (\n        <>\n          <p>There are no alert rules linked to this panel.</p>\n          {!!dashboard.meta.canSave && canCreateRules && <NewRuleFromPanelButton panel={panel} dashboard={dashboard} />}\n        </>\n      )}\n      {!dashboard.uid && !!dashboard.meta.canSave && (\n        <Alert severity=\"info\" title=\"Dashboard not saved\">\n          Dashboard must be saved before alerts can be added.\n        </Alert>\n      )}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  newButton: css`\n    margin-top: ${theme.spacing(3)};\n  `,\n  innerWrapper: css`\n    padding: ${theme.spacing(2)};\n  `,\n  noRulesWrapper: css`\n    margin: ${theme.spacing(2)};\n    background-color: ${theme.colors.background.secondary};\n    padding: ${theme.spacing(3)};\n  `,\n});\n","import { config } from '@grafana/runtime';\n\nimport { AlertTab } from './AlertTab';\nimport { PanelAlertTabContent } from './unified/PanelAlertTabContent';\n\n// route between unified and \"old\" alerting pages based on feature flag\n\nexport default config.unifiedAlertingEnabled ? PanelAlertTabContent : AlertTab;\n","import React, { FC } from 'react';\n\nimport { Tab, TabProps } from '@grafana/ui/src/components/Tabs/Tab';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\n\nimport { usePanelCombinedRules } from './hooks/usePanelCombinedRules';\n\ninterface Props extends Omit<TabProps, 'counter' | 'ref'> {\n  panel: PanelModel;\n  dashboard: DashboardModel;\n}\n\n// it will load rule count from backend\nexport const PanelAlertTab: FC<Props> = ({ panel, dashboard, ...otherProps }) => {\n  const { rules, loading } = usePanelCombinedRules({ panel, dashboard });\n  return <Tab {...otherProps} counter={loading ? null : rules.length} />;\n};\n","import { DocsId } from '@grafana/data';\n\n// TODO: Documentation links\nconst DOCS_LINKS: Record<DocsId, string> = {\n  [DocsId.Transformations]: 'https://grafana.com/docs/grafana/latest/panels/transformations',\n  [DocsId.FieldConfig]: 'https://grafana.com/docs/grafana/latest/panels/field-configuration-options/',\n  [DocsId.FieldConfigOverrides]:\n    'https://grafana.com/docs/grafana/latest/panels/field-configuration-options/#override-a-field',\n};\n\nexport const getDocsLink = (id: DocsId) => DOCS_LINKS[id];\n","import { css } from '@emotion/css';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { mergeMap } from 'rxjs/operators';\n\nimport {\n  DataFrame,\n  DataTransformerConfig,\n  GrafanaTheme2,\n  transformDataFrame,\n  TransformerRegistryItem,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, JSONFormatter, useStyles2 } from '@grafana/ui';\n\nimport { TransformationsEditorTransformation } from './types';\n\ninterface TransformationEditorProps {\n  debugMode?: boolean;\n  index: number;\n  data: DataFrame[];\n  uiConfig: TransformerRegistryItem<any>;\n  configs: TransformationsEditorTransformation[];\n  onChange: (index: number, config: DataTransformerConfig) => void;\n}\n\nexport const TransformationEditor = ({\n  debugMode,\n  index,\n  data,\n  uiConfig,\n  configs,\n  onChange,\n}: TransformationEditorProps) => {\n  const styles = useStyles2(getStyles);\n  const [input, setInput] = useState<DataFrame[]>([]);\n  const [output, setOutput] = useState<DataFrame[]>([]);\n  const config = useMemo(() => configs[index], [configs, index]);\n\n  useEffect(() => {\n    const inputTransforms = configs.slice(0, index).map((t) => t.transformation);\n    const outputTransforms = configs.slice(index, index + 1).map((t) => t.transformation);\n    const inputSubscription = transformDataFrame(inputTransforms, data).subscribe(setInput);\n    const outputSubscription = transformDataFrame(inputTransforms, data)\n      .pipe(mergeMap((before) => transformDataFrame(outputTransforms, before)))\n      .subscribe(setOutput);\n\n    return function unsubscribe() {\n      inputSubscription.unsubscribe();\n      outputSubscription.unsubscribe();\n    };\n  }, [index, data, configs]);\n\n  const editor = useMemo(\n    () =>\n      React.createElement(uiConfig.editor, {\n        options: { ...uiConfig.transformation.defaultOptions, ...config.transformation.options },\n        input,\n        onChange: (opts) => {\n          onChange(index, { id: config.transformation.id, options: opts });\n        },\n      }),\n    [\n      uiConfig.editor,\n      uiConfig.transformation.defaultOptions,\n      config.transformation.options,\n      config.transformation.id,\n      input,\n      onChange,\n      index,\n    ]\n  );\n\n  return (\n    <div className={styles.editor} aria-label={selectors.components.TransformTab.transformationEditor(uiConfig.name)}>\n      {editor}\n      {debugMode && (\n        <div\n          className={styles.debugWrapper}\n          aria-label={selectors.components.TransformTab.transformationEditorDebugger(uiConfig.name)}\n        >\n          <div className={styles.debug}>\n            <div className={styles.debugTitle}>Transformation input data</div>\n            <div className={styles.debugJson}>\n              <JSONFormatter json={input} />\n            </div>\n          </div>\n          <div className={styles.debugSeparator}>\n            <Icon name=\"arrow-right\" />\n          </div>\n          <div className={styles.debug}>\n            <div className={styles.debugTitle}>Transformation output data</div>\n            <div className={styles.debugJson}>{output && <JSONFormatter json={output} />}</div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  const debugBorder = theme.isLight ? theme.v1.palette.gray85 : theme.v1.palette.gray15;\n\n  return {\n    title: css`\n      display: flex;\n      padding: 4px 8px 4px 8px;\n      position: relative;\n      height: 35px;\n      border-radius: 4px 4px 0 0;\n      flex-wrap: nowrap;\n      justify-content: space-between;\n      align-items: center;\n    `,\n    name: css`\n      font-weight: ${theme.typography.fontWeightMedium};\n      color: ${theme.colors.primary.text};\n    `,\n    iconRow: css`\n      display: flex;\n    `,\n    icon: css`\n      background: transparent;\n      border: none;\n      box-shadow: none;\n      cursor: pointer;\n      color: ${theme.colors.text.secondary};\n      margin-left: ${theme.spacing(1)};\n      &:hover {\n        color: ${theme.colors.text};\n      }\n    `,\n    editor: css``,\n    debugWrapper: css`\n      display: flex;\n      flex-direction: row;\n    `,\n    debugSeparator: css`\n      width: 48px;\n      min-height: 300px;\n      display: flex;\n      align-items: center;\n      align-self: stretch;\n      justify-content: center;\n      margin: 0 ${theme.spacing(0.5)};\n      color: ${theme.colors.primary.text};\n    `,\n    debugTitle: css`\n      padding: ${theme.spacing(1)} ${theme.spacing(0.25)};\n      font-family: ${theme.typography.fontFamilyMonospace};\n      font-size: ${theme.typography.bodySmall.fontSize};\n      color: ${theme.colors.text};\n      border-bottom: 1px solid ${debugBorder};\n      flex-grow: 0;\n      flex-shrink: 1;\n    `,\n\n    debug: css`\n      margin-top: ${theme.spacing(1)};\n      padding: 0 ${theme.spacing(1, 1, 1)};\n      border: 1px solid ${debugBorder};\n      background: ${theme.isLight ? theme.v1.palette.white : theme.v1.palette.gray05};\n      border-radius: ${theme.shape.borderRadius(1)};\n      width: 100%;\n      min-height: 300px;\n      display: flex;\n      flex-direction: column;\n      align-self: stretch;\n    `,\n    debugJson: css`\n      flex-grow: 1;\n      height: 100%;\n      overflow: hidden;\n      padding: ${theme.spacing(0.5)};\n    `,\n  };\n};\n","import React, { useCallback } from 'react';\nimport { useToggle } from 'react-use';\n\nimport { DataFrame, DataTransformerConfig, TransformerRegistryItem } from '@grafana/data';\nimport { HorizontalGroup } from '@grafana/ui';\nimport { OperationRowHelp } from 'app/core/components/QueryOperationRow/OperationRowHelp';\nimport { QueryOperationAction } from 'app/core/components/QueryOperationRow/QueryOperationAction';\nimport {\n  QueryOperationRow,\n  QueryOperationRowRenderProps,\n} from 'app/core/components/QueryOperationRow/QueryOperationRow';\nimport { PluginStateInfo } from 'app/features/plugins/components/PluginStateInfo';\n\nimport { TransformationEditor } from './TransformationEditor';\nimport { TransformationsEditorTransformation } from './types';\n\ninterface TransformationOperationRowProps {\n  id: string;\n  index: number;\n  data: DataFrame[];\n  uiConfig: TransformerRegistryItem<any>;\n  configs: TransformationsEditorTransformation[];\n  onRemove: (index: number) => void;\n  onChange: (index: number, config: DataTransformerConfig) => void;\n}\n\nexport const TransformationOperationRow: React.FC<TransformationOperationRowProps> = ({\n  onRemove,\n  index,\n  id,\n  data,\n  configs,\n  uiConfig,\n  onChange,\n}) => {\n  const [showDebug, toggleDebug] = useToggle(false);\n  const [showHelp, toggleHelp] = useToggle(false);\n  const disabled = configs[index].transformation.disabled;\n\n  const onDisableToggle = useCallback(\n    (index: number) => {\n      const current = configs[index].transformation;\n      onChange(index, {\n        ...current,\n        disabled: current.disabled ? undefined : true,\n      });\n    },\n    [onChange, configs]\n  );\n\n  const renderActions = ({ isOpen }: QueryOperationRowRenderProps) => {\n    return (\n      <HorizontalGroup align=\"center\" width=\"auto\">\n        {uiConfig.state && <PluginStateInfo state={uiConfig.state} />}\n        <QueryOperationAction\n          title=\"Show/hide transform help\"\n          icon=\"info-circle\"\n          onClick={toggleHelp}\n          active={showHelp}\n        />\n        <QueryOperationAction title=\"Debug\" disabled={!isOpen} icon=\"bug\" onClick={toggleDebug} active={showDebug} />\n        <QueryOperationAction\n          title=\"Disable/Enable transformation\"\n          icon={disabled ? 'eye-slash' : 'eye'}\n          onClick={() => onDisableToggle(index)}\n          active={disabled}\n        />\n        <QueryOperationAction title=\"Remove\" icon=\"trash-alt\" onClick={() => onRemove(index)} />\n      </HorizontalGroup>\n    );\n  };\n\n  return (\n    <QueryOperationRow\n      id={id}\n      index={index}\n      title={uiConfig.name}\n      draggable\n      actions={renderActions}\n      disabled={disabled}\n    >\n      {showHelp && <OperationRowHelp markdown={prepMarkdown(uiConfig)} />}\n      <TransformationEditor\n        debugMode={showDebug}\n        index={index}\n        data={data}\n        configs={configs}\n        uiConfig={uiConfig}\n        onChange={onChange}\n      />\n    </QueryOperationRow>\n  );\n};\n\nfunction prepMarkdown(uiConfig: TransformerRegistryItem<any>) {\n  let helpMarkdown = uiConfig.help ?? uiConfig.description;\n\n  return `\n${helpMarkdown}\n\nGo the <a href=\"https://grafana.com/docs/grafana/latest/panels/transformations/?utm_source=grafana\" target=\"_blank\" rel=\"noreferrer\">\ntransformation documentation\n</a> for more.\n`;\n}\n","import React from 'react';\n\nimport { DataFrame, DataTransformerConfig, standardTransformersRegistry } from '@grafana/data';\n\nimport { TransformationOperationRow } from './TransformationOperationRow';\nimport { TransformationsEditorTransformation } from './types';\n\ninterface TransformationOperationRowsProps {\n  data: DataFrame[];\n  configs: TransformationsEditorTransformation[];\n  onRemove: (index: number) => void;\n  onChange: (index: number, config: DataTransformerConfig) => void;\n}\n\nexport const TransformationOperationRows: React.FC<TransformationOperationRowsProps> = ({\n  data,\n  onChange,\n  onRemove,\n  configs,\n}) => {\n  return (\n    <>\n      {configs.map((t, i) => {\n        const uiConfig = standardTransformersRegistry.getIfExists(t.transformation.id);\n        if (!uiConfig) {\n          return null;\n        }\n\n        return (\n          <TransformationOperationRow\n            index={i}\n            id={`${t.id}`}\n            key={`${t.id}`}\n            data={data}\n            configs={configs}\n            uiConfig={uiConfig}\n            onRemove={onRemove}\n            onChange={onChange}\n          />\n        );\n      })}\n    </>\n  );\n};\n","import { css } from '@emotion/css';\nimport React, { ChangeEvent } from 'react';\nimport { DragDropContext, Droppable, DropResult } from 'react-beautiful-dnd';\nimport { Unsubscribable } from 'rxjs';\n\nimport {\n  DataFrame,\n  DataTransformerConfig,\n  DocsId,\n  GrafanaTheme2,\n  PanelData,\n  SelectableValue,\n  standardTransformersRegistry,\n  TransformerRegistryItem,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport {\n  Alert,\n  Button,\n  Container,\n  CustomScrollbar,\n  Themeable,\n  VerticalGroup,\n  withTheme,\n  Input,\n  IconButton,\n  useStyles2,\n  Card,\n} from '@grafana/ui';\nimport { LocalStorageValueProvider } from 'app/core/components/LocalStorageValueProvider';\nimport { getDocsLink } from 'app/core/utils/docsLinks';\nimport { PluginStateInfo } from 'app/features/plugins/components/PluginStateInfo';\n\nimport { AppNotificationSeverity } from '../../../../types';\nimport { PanelModel } from '../../state';\nimport { PanelNotSupported } from '../PanelEditor/PanelNotSupported';\n\nimport { TransformationOperationRows } from './TransformationOperationRows';\nimport { TransformationsEditorTransformation } from './types';\n\nconst LOCAL_STORAGE_KEY = 'dashboard.components.TransformationEditor.featureInfoBox.isDismissed';\n\ninterface TransformationsEditorProps extends Themeable {\n  panel: PanelModel;\n}\n\ninterface State {\n  data: DataFrame[];\n  transformations: TransformationsEditorTransformation[];\n  search: string;\n  showPicker?: boolean;\n}\n\nclass UnThemedTransformationsEditor extends React.PureComponent<TransformationsEditorProps, State> {\n  subscription?: Unsubscribable;\n\n  constructor(props: TransformationsEditorProps) {\n    super(props);\n    const transformations = props.panel.transformations || [];\n\n    const ids = this.buildTransformationIds(transformations);\n    this.state = {\n      transformations: transformations.map((t, i) => ({\n        transformation: t,\n        id: ids[i],\n      })),\n      data: [],\n      search: '',\n    };\n  }\n\n  onSearchChange = (event: ChangeEvent<HTMLInputElement>) => {\n    this.setState({ search: event.target.value });\n  };\n\n  onSearchKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n    if (event.key === 'Enter') {\n      const { search } = this.state;\n      if (search) {\n        const lower = search.toLowerCase();\n        const filtered = standardTransformersRegistry.list().filter((t) => {\n          const txt = (t.name + t.description).toLowerCase();\n          return txt.indexOf(lower) >= 0;\n        });\n        if (filtered.length > 0) {\n          this.onTransformationAdd({ value: filtered[0].id });\n        }\n      }\n    } else if (event.keyCode === 27) {\n      // Escape key\n      this.setState({ search: '', showPicker: false });\n      event.stopPropagation(); // don't exit the editor\n    }\n  };\n\n  buildTransformationIds(transformations: DataTransformerConfig[]) {\n    const transformationCounters: Record<string, number> = {};\n    const transformationIds: string[] = [];\n\n    for (let i = 0; i < transformations.length; i++) {\n      const transformation = transformations[i];\n      if (transformationCounters[transformation.id] === undefined) {\n        transformationCounters[transformation.id] = 0;\n      } else {\n        transformationCounters[transformation.id] += 1;\n      }\n      transformationIds.push(`${transformations[i].id}-${transformationCounters[transformations[i].id]}`);\n    }\n    return transformationIds;\n  }\n\n  componentDidMount() {\n    this.subscription = this.props.panel\n      .getQueryRunner()\n      .getData({ withTransforms: false, withFieldConfig: false })\n      .subscribe({\n        next: (panelData: PanelData) => this.setState({ data: panelData.series }),\n      });\n  }\n\n  componentWillUnmount() {\n    if (this.subscription) {\n      this.subscription.unsubscribe();\n    }\n  }\n\n  onChange(transformations: TransformationsEditorTransformation[]) {\n    this.setState({ transformations });\n    this.props.panel.setTransformations(transformations.map((t) => t.transformation));\n  }\n\n  // Transformation UIDs are stored in a name-X form. name is NOT unique hence we need to parse the IDs and increase X\n  // for transformations with the same name\n  getTransformationNextId = (name: string) => {\n    const { transformations } = this.state;\n    let nextId = 0;\n    const existingIds = transformations.filter((t) => t.id.startsWith(name)).map((t) => t.id);\n\n    if (existingIds.length !== 0) {\n      nextId = Math.max(...existingIds.map((i) => parseInt(i.match(/\\d+/)![0], 10))) + 1;\n    }\n\n    return `${name}-${nextId}`;\n  };\n\n  onTransformationAdd = (selectable: SelectableValue<string>) => {\n    const { transformations } = this.state;\n\n    const nextId = this.getTransformationNextId(selectable.value!);\n    this.setState({ search: '', showPicker: false });\n    this.onChange([\n      ...transformations,\n      {\n        id: nextId,\n        transformation: {\n          id: selectable.value as string,\n          options: {},\n        },\n      },\n    ]);\n  };\n\n  onTransformationChange = (idx: number, config: DataTransformerConfig) => {\n    const { transformations } = this.state;\n    const next = Array.from(transformations);\n    next[idx].transformation = config;\n    this.onChange(next);\n  };\n\n  onTransformationRemove = (idx: number) => {\n    const { transformations } = this.state;\n    const next = Array.from(transformations);\n    next.splice(idx, 1);\n    this.onChange(next);\n  };\n\n  onDragEnd = (result: DropResult) => {\n    const { transformations } = this.state;\n\n    if (!result || !result.destination) {\n      return;\n    }\n\n    const startIndex = result.source.index;\n    const endIndex = result.destination.index;\n    if (startIndex === endIndex) {\n      return;\n    }\n    const update = Array.from(transformations);\n    const [removed] = update.splice(startIndex, 1);\n    update.splice(endIndex, 0, removed);\n    this.onChange(update);\n  };\n\n  renderTransformationEditors = () => {\n    const { data, transformations } = this.state;\n\n    return (\n      <DragDropContext onDragEnd={this.onDragEnd}>\n        <Droppable droppableId=\"transformations-list\" direction=\"vertical\">\n          {(provided) => {\n            return (\n              <div ref={provided.innerRef} {...provided.droppableProps}>\n                <TransformationOperationRows\n                  configs={transformations}\n                  data={data}\n                  onRemove={this.onTransformationRemove}\n                  onChange={this.onTransformationChange}\n                />\n                {provided.placeholder}\n              </div>\n            );\n          }}\n        </Droppable>\n      </DragDropContext>\n    );\n  };\n\n  renderTransformsPicker() {\n    const { transformations, search } = this.state;\n    let suffix: React.ReactNode = null;\n    let xforms = standardTransformersRegistry.list().sort((a, b) => (a.name > b.name ? 1 : b.name > a.name ? -1 : 0));\n\n    if (search) {\n      const lower = search.toLowerCase();\n      const filtered = xforms.filter((t) => {\n        const txt = (t.name + t.description).toLowerCase();\n        return txt.indexOf(lower) >= 0;\n      });\n\n      suffix = (\n        <>\n          {filtered.length} / {xforms.length} &nbsp;&nbsp;\n          <IconButton\n            name=\"times\"\n            onClick={() => {\n              this.setState({ search: '' });\n            }}\n          />\n        </>\n      );\n\n      xforms = filtered;\n    }\n\n    const noTransforms = !transformations?.length;\n    const showPicker = noTransforms || this.state.showPicker;\n\n    if (!suffix && showPicker && !noTransforms) {\n      suffix = (\n        <IconButton\n          name=\"times\"\n          onClick={() => {\n            this.setState({ showPicker: false });\n          }}\n        />\n      );\n    }\n\n    return (\n      <>\n        {noTransforms && (\n          <Container grow={1}>\n            <LocalStorageValueProvider<boolean> storageKey={LOCAL_STORAGE_KEY} defaultValue={false}>\n              {(isDismissed, onDismiss) => {\n                if (isDismissed) {\n                  return null;\n                }\n\n                return (\n                  <Alert\n                    title=\"Transformations\"\n                    severity=\"info\"\n                    onRemove={() => {\n                      onDismiss(true);\n                    }}\n                  >\n                    <p>\n                      Transformations allow you to join, calculate, re-order, hide, and rename your query results before\n                      they are visualized. <br />\n                      Many transforms are not suitable if you&apos;re using the Graph visualization, as it currently\n                      only supports time series data. <br />\n                      It can help to switch to the Table visualization to understand what a transformation is doing.{' '}\n                    </p>\n                    <a\n                      href={getDocsLink(DocsId.Transformations)}\n                      className=\"external-link\"\n                      target=\"_blank\"\n                      rel=\"noreferrer\"\n                    >\n                      Read more\n                    </a>\n                  </Alert>\n                );\n              }}\n            </LocalStorageValueProvider>\n          </Container>\n        )}\n        {showPicker ? (\n          <VerticalGroup>\n            <Input\n              aria-label={selectors.components.Transforms.searchInput}\n              value={search ?? ''}\n              autoFocus={!noTransforms}\n              placeholder=\"Add transformation\"\n              onChange={this.onSearchChange}\n              onKeyDown={this.onSearchKeyDown}\n              suffix={suffix}\n            />\n\n            {xforms.map((t) => {\n              return (\n                <TransformationCard\n                  key={t.name}\n                  transform={t}\n                  onClick={() => {\n                    this.onTransformationAdd({ value: t.id });\n                  }}\n                />\n              );\n            })}\n          </VerticalGroup>\n        ) : (\n          <Button\n            icon=\"plus\"\n            variant=\"secondary\"\n            onClick={() => {\n              this.setState({ showPicker: true });\n            }}\n          >\n            Add transformation\n          </Button>\n        )}\n      </>\n    );\n  }\n\n  render() {\n    const {\n      panel: { alert },\n    } = this.props;\n    const { transformations } = this.state;\n\n    const hasTransforms = transformations.length > 0;\n\n    if (!hasTransforms && alert) {\n      return <PanelNotSupported message=\"Transformations can't be used on a panel with existing alerts\" />;\n    }\n\n    return (\n      <CustomScrollbar autoHeightMin=\"100%\">\n        <Container padding=\"md\">\n          <div aria-label={selectors.components.TransformTab.content}>\n            {hasTransforms && alert ? (\n              <Alert\n                severity={AppNotificationSeverity.Error}\n                title=\"Transformations can't be used on a panel with alerts\"\n              />\n            ) : null}\n            {hasTransforms && this.renderTransformationEditors()}\n            {this.renderTransformsPicker()}\n          </div>\n        </Container>\n      </CustomScrollbar>\n    );\n  }\n}\n\ninterface TransformationCardProps {\n  transform: TransformerRegistryItem<any>;\n  onClick: () => void;\n}\n\nfunction TransformationCard({ transform, onClick }: TransformationCardProps) {\n  const styles = useStyles2(getStyles);\n  return (\n    <Card\n      className={styles.card}\n      aria-label={selectors.components.TransformTab.newTransform(transform.name)}\n      onClick={onClick}\n    >\n      <Card.Heading>{transform.name}</Card.Heading>\n      <Card.Description>{transform.description}</Card.Description>\n      {transform.state && (\n        <Card.Tags>\n          <PluginStateInfo state={transform.state} />\n        </Card.Tags>\n      )}\n    </Card>\n  );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    card: css`\n      margin: 0;\n      padding: ${theme.spacing(1)};\n    `,\n  };\n};\n\nexport const TransformationsEditor = withTheme(UnThemedTransformationsEditor);\n","import React, { PureComponent } from 'react';\n\nimport { DataQuery, getDataSourceRef } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { QueryGroup } from 'app/features/query/components/QueryGroup';\nimport { QueryGroupDataSource, QueryGroupOptions } from 'app/types';\n\nimport { PanelModel } from '../../state';\n\ninterface Props {\n  /** Current panel */\n  panel: PanelModel;\n  /** Added here to make component re-render when queries change from outside */\n  queries: DataQuery[];\n}\n\nexport class PanelEditorQueries extends PureComponent<Props> {\n  constructor(props: Props) {\n    super(props);\n  }\n\n  buildQueryOptions(panel: PanelModel): QueryGroupOptions {\n    const dataSource: QueryGroupDataSource = panel.datasource ?? {\n      default: true,\n    };\n    const datasourceSettings = getDatasourceSrv().getInstanceSettings(dataSource);\n\n    return {\n      cacheTimeout: datasourceSettings?.meta.queryOptions?.cacheTimeout ? panel.cacheTimeout : undefined,\n      dataSource: {\n        default: datasourceSettings?.isDefault,\n        type: datasourceSettings?.type,\n        uid: datasourceSettings?.uid,\n      },\n      queries: panel.targets,\n      maxDataPoints: panel.maxDataPoints,\n      minInterval: panel.interval,\n      timeRange: {\n        from: panel.timeFrom,\n        shift: panel.timeShift,\n        hide: panel.hideTimeOverride,\n      },\n    };\n  }\n\n  async componentDidMount() {\n    const { panel } = this.props;\n\n    // If the panel model has no datasource property load the default data source property and update the persisted model\n    // Because this part of the panel model is not in redux yet we do a forceUpdate.\n    if (!panel.datasource) {\n      const ds = getDatasourceSrv().getInstanceSettings(null);\n      panel.datasource = getDataSourceRef(ds!);\n      this.forceUpdate();\n    }\n  }\n\n  onRunQueries = () => {\n    this.props.panel.refresh();\n  };\n\n  onOpenQueryInspector = () => {\n    locationService.partial({\n      inspect: this.props.panel.id,\n      inspectTab: 'query',\n    });\n  };\n\n  onOptionsChange = (options: QueryGroupOptions) => {\n    const { panel } = this.props;\n\n    panel.updateQueries(options);\n\n    if (options.dataSource.uid !== panel.datasource?.uid) {\n      // trigger queries when changing data source\n      setTimeout(this.onRunQueries, 10);\n    }\n\n    this.forceUpdate();\n  };\n\n  render() {\n    const { panel } = this.props;\n\n    // If no panel data soruce set, wait with render. Will be set to default in componentDidMount\n    if (!panel.datasource) {\n      return null;\n    }\n\n    const options = this.buildQueryOptions(panel);\n\n    return (\n      <QueryGroup\n        options={options}\n        queryRunner={panel.getQueryRunner()}\n        onRunQueries={this.onRunQueries}\n        onOpenQueryInspector={this.onOpenQueryInspector}\n        onOptionsChange={this.onOptionsChange}\n      />\n    );\n  }\n}\n","import { css } from '@emotion/css';\nimport React, { FC, useEffect } from 'react';\nimport { Subscription } from 'rxjs';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Tab, TabContent, TabsBar, toIconName, useForceUpdate, useStyles2 } from '@grafana/ui';\nimport AlertTabIndex from 'app/features/alerting/AlertTabIndex';\nimport { PanelAlertTab } from 'app/features/alerting/unified/PanelAlertTab';\nimport { PanelQueriesChangedEvent, PanelTransformationsChangedEvent } from 'app/types/events';\n\nimport { DashboardModel, PanelModel } from '../../state';\nimport { TransformationsEditor } from '../TransformationsEditor/TransformationsEditor';\n\nimport { PanelEditorQueries } from './PanelEditorQueries';\nimport { PanelEditorTab, PanelEditorTabId } from './types';\n\ninterface PanelEditorTabsProps {\n  panel: PanelModel;\n  dashboard: DashboardModel;\n  tabs: PanelEditorTab[];\n  onChangeTab: (tab: PanelEditorTab) => void;\n}\n\nexport const PanelEditorTabs: FC<PanelEditorTabsProps> = React.memo(({ panel, dashboard, tabs, onChangeTab }) => {\n  const forceUpdate = useForceUpdate();\n  const styles = useStyles2(getStyles);\n\n  useEffect(() => {\n    const eventSubs = new Subscription();\n    eventSubs.add(panel.events.subscribe(PanelQueriesChangedEvent, forceUpdate));\n    eventSubs.add(panel.events.subscribe(PanelTransformationsChangedEvent, forceUpdate));\n    return () => eventSubs.unsubscribe();\n  }, [panel, dashboard, forceUpdate]);\n\n  const activeTab = tabs.find((item) => item.active)!;\n\n  if (tabs.length === 0) {\n    return null;\n  }\n\n  return (\n    <div className={styles.wrapper}>\n      <TabsBar className={styles.tabBar} hideBorder>\n        {tabs.map((tab) => {\n          if (tab.id === PanelEditorTabId.Alert) {\n            return renderAlertTab(tab, panel, dashboard, onChangeTab);\n          }\n          return (\n            <Tab\n              key={tab.id}\n              label={tab.text}\n              active={tab.active}\n              onChangeTab={() => onChangeTab(tab)}\n              icon={toIconName(tab.icon)}\n              counter={getCounter(panel, tab)}\n            />\n          );\n        })}\n      </TabsBar>\n      <TabContent className={styles.tabContent}>\n        {activeTab.id === PanelEditorTabId.Query && <PanelEditorQueries panel={panel} queries={panel.targets} />}\n        {activeTab.id === PanelEditorTabId.Alert && <AlertTabIndex panel={panel} dashboard={dashboard} />}\n        {activeTab.id === PanelEditorTabId.Transform && <TransformationsEditor panel={panel} />}\n      </TabContent>\n    </div>\n  );\n});\n\nPanelEditorTabs.displayName = 'PanelEditorTabs';\n\nfunction getCounter(panel: PanelModel, tab: PanelEditorTab) {\n  switch (tab.id) {\n    case PanelEditorTabId.Query:\n      return panel.targets.length;\n    case PanelEditorTabId.Alert:\n      return panel.alert ? 1 : 0;\n    case PanelEditorTabId.Transform:\n      const transformations = panel.getTransformations() ?? [];\n      return transformations.length;\n  }\n\n  return null;\n}\n\nfunction renderAlertTab(\n  tab: PanelEditorTab,\n  panel: PanelModel,\n  dashboard: DashboardModel,\n  onChangeTab: (tab: PanelEditorTab) => void\n) {\n  const alertingDisabled = !config.alertingEnabled && !config.unifiedAlertingEnabled;\n\n  if (alertingDisabled) {\n    return null;\n  }\n\n  if (config.unifiedAlertingEnabled) {\n    return (\n      <PanelAlertTab\n        key={tab.id}\n        label={tab.text}\n        active={tab.active}\n        onChangeTab={() => onChangeTab(tab)}\n        icon={toIconName(tab.icon)}\n        panel={panel}\n        dashboard={dashboard}\n      />\n    );\n  }\n\n  if (config.alertingEnabled) {\n    return (\n      <Tab\n        key={tab.id}\n        label={tab.text}\n        active={tab.active}\n        onChangeTab={() => onChangeTab(tab)}\n        icon={toIconName(tab.icon)}\n        counter={getCounter(panel, tab)}\n      />\n    );\n  }\n\n  return null;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    wrapper: css`\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n    `,\n    tabBar: css`\n      padding-left: ${theme.spacing(2)};\n    `,\n    tabContent: css`\n      padding: 0;\n      display: flex;\n      flex-direction: column;\n      flex-grow: 1;\n      min-height: 0;\n      background: ${theme.colors.background.primary};\n      border: 1px solid ${theme.components.panel.borderColor};\n      border-left: none;\n      border-bottom: none;\n      border-top-right-radius: ${theme.shape.borderRadius(1.5)};\n    `,\n  };\n};\n","import memoizeOne from 'memoize-one';\n\nimport { PanelPlugin } from '@grafana/data';\nimport { getConfig } from 'app/core/config';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getRulesPermissions } from 'app/features/alerting/unified/utils/access-control';\nimport { GRAFANA_RULES_SOURCE_NAME } from 'app/features/alerting/unified/utils/datasource';\n\nimport { PanelEditorTab, PanelEditorTabId } from '../types';\n\nexport const getPanelEditorTabs = memoizeOne((tab?: string, plugin?: PanelPlugin) => {\n  const tabs: PanelEditorTab[] = [];\n\n  if (!plugin) {\n    return tabs;\n  }\n\n  let defaultTab = PanelEditorTabId.Visualize;\n\n  if (plugin.meta.skipDataQuery) {\n    return [];\n  }\n\n  if (!plugin.meta.skipDataQuery) {\n    defaultTab = PanelEditorTabId.Query;\n\n    tabs.push({\n      id: PanelEditorTabId.Query,\n      text: 'Query',\n      icon: 'database',\n      active: false,\n    });\n\n    tabs.push({\n      id: PanelEditorTabId.Transform,\n      text: 'Transform',\n      icon: 'process',\n      active: false,\n    });\n  }\n\n  const { alertingEnabled, unifiedAlertingEnabled } = getConfig();\n  const hasRuleReadPermissions = contextSrv.hasPermission(getRulesPermissions(GRAFANA_RULES_SOURCE_NAME).read);\n  const isAlertingAvailable = alertingEnabled || (unifiedAlertingEnabled && hasRuleReadPermissions);\n\n  const isGraph = plugin.meta.id === 'graph';\n  const isTimeseries = plugin.meta.id === 'timeseries';\n\n  if ((isAlertingAvailable && isGraph) || isTimeseries) {\n    tabs.push({\n      id: PanelEditorTabId.Alert,\n      text: 'Alert',\n      icon: 'bell',\n      active: false,\n    });\n  }\n\n  const activeTab = tabs.find((item) => item.id === (tab || defaultTab)) ?? tabs[0];\n  activeTab.active = true;\n\n  return tabs;\n});\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { Subscription } from 'rxjs';\n\nimport { FieldConfigSource, GrafanaTheme2, NavModel, NavModelItem, PageLayoutType } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Stack } from '@grafana/experimental';\nimport { config, locationService } from '@grafana/runtime';\nimport {\n  Button,\n  HorizontalGroup,\n  InlineSwitch,\n  ModalsController,\n  PageToolbar,\n  RadioButtonGroup,\n  stylesFactory,\n  Themeable2,\n  ToolbarButton,\n  ToolbarButtonRow,\n  withTheme2,\n} from '@grafana/ui';\nimport { AppChromeUpdate } from 'app/core/components/AppChrome/AppChromeUpdate';\nimport { Page } from 'app/core/components/Page/Page';\nimport { SplitPaneWrapper } from 'app/core/components/SplitPaneWrapper/SplitPaneWrapper';\nimport { appEvents } from 'app/core/core';\nimport { SubMenuItems } from 'app/features/dashboard/components/SubMenu/SubMenuItems';\nimport { SaveLibraryPanelModal } from 'app/features/library-panels/components/SaveLibraryPanelModal/SaveLibraryPanelModal';\nimport { PanelModelWithLibraryPanel } from 'app/features/library-panels/types';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { updateTimeZoneForSession } from 'app/features/profile/state/reducers';\nimport { StoreState } from 'app/types';\nimport { PanelOptionsChangedEvent, ShowModalReactEvent } from 'app/types/events';\n\nimport { notifyApp } from '../../../../core/actions';\nimport { UnlinkModal } from '../../../library-panels/components/UnlinkModal/UnlinkModal';\nimport { isPanelModelLibraryPanel } from '../../../library-panels/guard';\nimport { getVariablesByKey } from '../../../variables/state/selectors';\nimport { DashboardPanel } from '../../dashgrid/DashboardPanel';\nimport { DashboardModel, PanelModel } from '../../state';\nimport { DashNavTimeControls } from '../DashNav/DashNavTimeControls';\nimport { SaveDashboardDrawer } from '../SaveDashboard/SaveDashboardDrawer';\n\nimport { OptionsPane } from './OptionsPane';\nimport { PanelEditorTableView } from './PanelEditorTableView';\nimport { PanelEditorTabs } from './PanelEditorTabs';\nimport { VisualizationButton } from './VisualizationButton';\nimport { discardPanelChanges, initPanelEditor, updatePanelEditorUIState } from './state/actions';\nimport { toggleTableView } from './state/reducers';\nimport { getPanelEditorTabs } from './state/selectors';\nimport { DisplayMode, displayModes, PanelEditorTab } from './types';\nimport { calculatePanelSize } from './utils';\n\ninterface OwnProps {\n  dashboard: DashboardModel;\n  sourcePanel: PanelModel;\n  sectionNav: NavModel;\n  pageNav: NavModelItem;\n  className?: string;\n  tab?: string;\n}\n\nconst mapStateToProps = (state: StoreState, ownProps: OwnProps) => {\n  const panel = state.panelEditor.getPanel();\n  const panelState = getPanelStateForModel(state, panel);\n\n  return {\n    panel,\n    plugin: panelState?.plugin,\n    instanceState: panelState?.instanceState,\n    initDone: state.panelEditor.initDone,\n    uiState: state.panelEditor.ui,\n    tableViewEnabled: state.panelEditor.tableViewEnabled,\n    variables: getVariablesByKey(ownProps.dashboard.uid, state),\n  };\n};\n\nconst mapDispatchToProps = {\n  initPanelEditor,\n  discardPanelChanges,\n  updatePanelEditorUIState,\n  updateTimeZoneForSession,\n  toggleTableView,\n  notifyApp,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype Props = OwnProps & ConnectedProps<typeof connector> & Themeable2;\n\ninterface State {\n  showSaveLibraryPanelModal?: boolean;\n}\n\nexport class PanelEditorUnconnected extends PureComponent<Props> {\n  private eventSubs?: Subscription;\n\n  state: State = {\n    showSaveLibraryPanelModal: false,\n  };\n\n  componentDidMount() {\n    this.props.initPanelEditor(this.props.sourcePanel, this.props.dashboard);\n  }\n\n  componentDidUpdate() {\n    const { panel, initDone } = this.props;\n\n    if (initDone && !this.eventSubs) {\n      this.eventSubs = new Subscription();\n      this.eventSubs.add(panel.events.subscribe(PanelOptionsChangedEvent, this.triggerForceUpdate));\n    }\n  }\n\n  componentWillUnmount() {\n    // redux action exitPanelEditor is called on location change from DashboardPrompt\n    this.eventSubs?.unsubscribe();\n  }\n\n  triggerForceUpdate = () => {\n    this.forceUpdate();\n  };\n\n  onBack = () => {\n    locationService.partial({\n      editPanel: null,\n      tab: null,\n      showCategory: null,\n    });\n  };\n\n  onDiscard = () => {\n    this.props.discardPanelChanges();\n    this.onBack();\n  };\n\n  onSaveDashboard = () => {\n    appEvents.publish(\n      new ShowModalReactEvent({\n        component: SaveDashboardDrawer,\n        props: { dashboard: this.props.dashboard },\n      })\n    );\n  };\n\n  onSaveLibraryPanel = async () => {\n    if (!isPanelModelLibraryPanel(this.props.panel)) {\n      // New library panel, no need to display modal\n      return;\n    }\n\n    this.setState({ showSaveLibraryPanelModal: true });\n  };\n\n  onChangeTab = (tab: PanelEditorTab) => {\n    locationService.partial({\n      tab: tab.id,\n    });\n  };\n\n  onFieldConfigChange = (config: FieldConfigSource) => {\n    // we do not need to trigger force update here as the function call below\n    // fires PanelOptionsChangedEvent which we subscribe to above\n    this.props.panel.updateFieldConfig({\n      ...config,\n    });\n  };\n\n  onPanelOptionsChanged = (options: any) => {\n    // we do not need to trigger force update here as the function call below\n    // fires PanelOptionsChangedEvent which we subscribe to above\n    this.props.panel.updateOptions(options);\n  };\n\n  onPanelConfigChanged = (configKey: keyof PanelModel, value: any) => {\n    this.props.panel.setProperty(configKey, value);\n    this.props.panel.render();\n    this.forceUpdate();\n  };\n\n  onDisplayModeChange = (mode?: DisplayMode) => {\n    const { updatePanelEditorUIState } = this.props;\n    if (this.props.tableViewEnabled) {\n      this.props.toggleTableView();\n    }\n    updatePanelEditorUIState({\n      mode: mode,\n    });\n  };\n\n  onToggleTableView = () => {\n    this.props.toggleTableView();\n  };\n\n  renderPanel(styles: EditorStyles, isOnlyPanel: boolean) {\n    const { dashboard, panel, uiState, tableViewEnabled, theme } = this.props;\n\n    return (\n      <div className={styles.mainPaneWrapper} key=\"panel\">\n        {this.renderPanelToolbar(styles)}\n        <div className={styles.panelWrapper}>\n          <AutoSizer>\n            {({ width, height }) => {\n              if (width < 3 || height < 3) {\n                return null;\n              }\n\n              // If no tabs limit height so panel does not extend to edge\n              if (isOnlyPanel) {\n                height -= theme.spacing.gridSize * 2;\n              }\n\n              if (tableViewEnabled) {\n                return <PanelEditorTableView width={width} height={height} panel={panel} dashboard={dashboard} />;\n              }\n\n              const panelSize = calculatePanelSize(uiState.mode, width, height, panel);\n\n              return (\n                <div className={styles.centeringContainer} style={{ width, height }}>\n                  <div style={panelSize} data-panelid={panel.id}>\n                    <DashboardPanel\n                      key={panel.key}\n                      stateKey={panel.key}\n                      dashboard={dashboard}\n                      panel={panel}\n                      isEditing={true}\n                      isViewing={false}\n                      lazy={false}\n                      width={panelSize.width}\n                      height={panelSize.height}\n                    />\n                  </div>\n                </div>\n              );\n            }}\n          </AutoSizer>\n        </div>\n      </div>\n    );\n  }\n\n  renderPanelAndEditor(styles: EditorStyles) {\n    const { panel, dashboard, plugin, tab } = this.props;\n    const tabs = getPanelEditorTabs(tab, plugin);\n    const isOnlyPanel = tabs.length === 0;\n    const panelPane = this.renderPanel(styles, isOnlyPanel);\n\n    if (tabs.length === 0) {\n      return panelPane;\n    }\n\n    return [\n      panelPane,\n      <div\n        className={styles.tabsWrapper}\n        aria-label={selectors.components.PanelEditor.DataPane.content}\n        key=\"panel-editor-tabs\"\n      >\n        <PanelEditorTabs\n          key={panel.key}\n          panel={panel}\n          dashboard={dashboard}\n          tabs={tabs}\n          onChangeTab={this.onChangeTab}\n        />\n      </div>,\n    ];\n  }\n\n  renderTemplateVariables(styles: EditorStyles) {\n    const { variables } = this.props;\n\n    if (!variables.length) {\n      return null;\n    }\n\n    return (\n      <div className={styles.variablesWrapper}>\n        <SubMenuItems variables={variables} />\n      </div>\n    );\n  }\n\n  renderPanelToolbar(styles: EditorStyles) {\n    const { dashboard, uiState, variables, updateTimeZoneForSession, panel, tableViewEnabled } = this.props;\n\n    return (\n      <div className={styles.panelToolbar}>\n        <HorizontalGroup justify={variables.length > 0 ? 'space-between' : 'flex-end'} align=\"flex-start\">\n          {this.renderTemplateVariables(styles)}\n          <Stack gap={1}>\n            <InlineSwitch\n              label=\"Table view\"\n              showLabel={true}\n              id=\"table-view\"\n              value={tableViewEnabled}\n              onClick={this.onToggleTableView}\n              aria-label={selectors.components.PanelEditor.toggleTableView}\n            />\n            <RadioButtonGroup value={uiState.mode} options={displayModes} onChange={this.onDisplayModeChange} />\n            <DashNavTimeControls dashboard={dashboard} onChangeTimeZone={updateTimeZoneForSession} isOnCanvas={true} />\n            {!uiState.isPanelOptionsVisible && <VisualizationButton panel={panel} />}\n          </Stack>\n        </HorizontalGroup>\n      </div>\n    );\n  }\n\n  renderEditorActions() {\n    const size = config.featureToggles.topnav ? 'sm' : 'md';\n    let editorActions = [\n      <Button\n        onClick={this.onDiscard}\n        title=\"Undo all changes\"\n        key=\"discard\"\n        size={size}\n        variant=\"destructive\"\n        fill=\"outline\"\n      >\n        Discard\n      </Button>,\n      this.props.panel.libraryPanel ? (\n        <Button\n          onClick={this.onSaveLibraryPanel}\n          variant=\"primary\"\n          size={size}\n          title=\"Apply changes and save library panel\"\n          key=\"save-panel\"\n        >\n          Save library panel\n        </Button>\n      ) : (\n        <Button\n          onClick={this.onSaveDashboard}\n          title=\"Apply changes and save dashboard\"\n          key=\"save\"\n          size={size}\n          variant=\"secondary\"\n        >\n          Save\n        </Button>\n      ),\n      <Button\n        onClick={this.onBack}\n        variant=\"primary\"\n        title=\"Apply changes and go back to dashboard\"\n        data-testid={selectors.components.PanelEditor.applyButton}\n        key=\"apply\"\n        size={size}\n      >\n        Apply\n      </Button>,\n    ];\n\n    if (this.props.panel.libraryPanel) {\n      editorActions.splice(\n        1,\n        0,\n        <ModalsController key=\"unlink-controller\">\n          {({ showModal, hideModal }) => {\n            return (\n              <ToolbarButton\n                onClick={() => {\n                  showModal(UnlinkModal, {\n                    onConfirm: () => {\n                      this.props.panel.unlinkLibraryPanel();\n                      this.forceUpdate();\n                    },\n                    onDismiss: hideModal,\n                    isOpen: true,\n                  });\n                }}\n                title=\"Disconnects this panel from the library panel so that you can edit it regularly.\"\n                key=\"unlink\"\n              >\n                Unlink\n              </ToolbarButton>\n            );\n          }}\n        </ModalsController>\n      );\n\n      // Remove \"Apply\" button\n      editorActions.pop();\n    }\n\n    return editorActions;\n  }\n\n  renderOptionsPane() {\n    const { plugin, dashboard, panel, instanceState } = this.props;\n\n    if (!plugin) {\n      return <div />;\n    }\n\n    return (\n      <OptionsPane\n        plugin={plugin}\n        dashboard={dashboard}\n        panel={panel}\n        instanceState={instanceState}\n        onFieldConfigsChange={this.onFieldConfigChange}\n        onPanelOptionsChanged={this.onPanelOptionsChanged}\n        onPanelConfigChange={this.onPanelConfigChanged}\n      />\n    );\n  }\n\n  onGoBackToDashboard = () => {\n    locationService.partial({ editPanel: null, tab: null, showCategory: null });\n  };\n\n  onConfirmAndDismissLibarayPanelModel = () => {\n    this.setState({ showSaveLibraryPanelModal: false });\n  };\n\n  renderToolbar() {\n    if (config.featureToggles.topnav) {\n      return (\n        <AppChromeUpdate\n          actions={<ToolbarButtonRow alignment=\"right\">{this.renderEditorActions()}</ToolbarButtonRow>}\n        />\n      );\n    }\n\n    return (\n      <PageToolbar title={this.props.dashboard.title} section=\"Edit Panel\" onGoBack={this.onGoBackToDashboard}>\n        {this.renderEditorActions()}\n      </PageToolbar>\n    );\n  }\n\n  render() {\n    const { initDone, updatePanelEditorUIState, uiState, theme, sectionNav, pageNav, className } = this.props;\n    const styles = getStyles(theme, this.props);\n\n    if (!initDone) {\n      return null;\n    }\n\n    return (\n      <Page\n        navModel={sectionNav}\n        pageNav={pageNav}\n        aria-label={selectors.components.PanelEditor.General.content}\n        layout={PageLayoutType.Custom}\n        toolbar={this.renderToolbar()}\n        className={className}\n      >\n        <div className={styles.wrapper}>\n          <div className={styles.verticalSplitPanesWrapper}>\n            <SplitPaneWrapper\n              leftPaneComponents={this.renderPanelAndEditor(styles)}\n              rightPaneComponents={this.renderOptionsPane()}\n              uiState={uiState}\n              updateUiState={updatePanelEditorUIState}\n              rightPaneVisible={uiState.isPanelOptionsVisible}\n            />\n          </div>\n          {this.state.showSaveLibraryPanelModal && (\n            <SaveLibraryPanelModal\n              panel={this.props.panel as PanelModelWithLibraryPanel}\n              folderId={this.props.dashboard.meta.folderId as number}\n              onConfirm={this.onConfirmAndDismissLibarayPanelModel}\n              onDiscard={this.onDiscard}\n              onDismiss={this.onConfirmAndDismissLibarayPanelModel}\n            />\n          )}\n        </div>\n      </Page>\n    );\n  }\n}\n\nexport const PanelEditor = withTheme2(connector(PanelEditorUnconnected));\n\n/*\n * Styles\n */\nexport const getStyles = stylesFactory((theme: GrafanaTheme2, props: Props) => {\n  const { uiState } = props;\n  const paneSpacing = theme.spacing(2);\n\n  return {\n    wrapper: css({\n      width: '100%',\n      flexGrow: 1,\n      minHeight: 0,\n      display: 'flex',\n      paddingTop: config.featureToggles.topnav ? theme.spacing(2) : 0,\n    }),\n    verticalSplitPanesWrapper: css`\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      width: 100%;\n      position: relative;\n    `,\n    mainPaneWrapper: css`\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      width: 100%;\n      padding-right: ${uiState.isPanelOptionsVisible ? 0 : paneSpacing};\n    `,\n    variablesWrapper: css`\n      label: variablesWrapper;\n      display: flex;\n      flex-grow: 1;\n      flex-wrap: wrap;\n      gap: ${theme.spacing(1, 2)};\n    `,\n    panelWrapper: css`\n      flex: 1 1 0;\n      min-height: 0;\n      width: 100%;\n      padding-left: ${paneSpacing};\n    `,\n    tabsWrapper: css`\n      height: 100%;\n      width: 100%;\n    `,\n    panelToolbar: css`\n      display: flex;\n      padding: 0 0 ${paneSpacing} ${paneSpacing};\n      justify-content: space-between;\n      flex-wrap: wrap;\n    `,\n    toolbarLeft: css`\n      padding-left: ${theme.spacing(1)};\n    `,\n    centeringContainer: css`\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      position: relative;\n      flex-direction: column;\n    `,\n  };\n});\n\ntype EditorStyles = ReturnType<typeof getStyles>;\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, colorManipulator } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nexport interface PublicDashboardFooterCfg {\n  hide: boolean;\n  text: string;\n  logo: string;\n  link: string;\n}\n\nexport const PublicDashboardFooter = function () {\n  const styles = useStyles2(getStyles);\n  const conf = getPublicDashboardFooterConfig();\n\n  return conf.hide ? null : (\n    <div className={styles.footer}>\n      <span className={styles.logoText}>\n        <a href={conf.link} target=\"_blank\" rel=\"noreferrer noopener\">\n          {conf.text} <img className={styles.logoImg} alt=\"\" src={conf.logo}></img>\n        </a>\n      </span>\n    </div>\n  );\n};\n\nexport function setPublicDashboardFooterConfigFn(fn: typeof getPublicDashboardFooterConfig) {\n  getPublicDashboardFooterConfig = fn;\n}\nexport let getPublicDashboardFooterConfig = (): PublicDashboardFooterCfg => ({\n  hide: false,\n  text: 'powered by Grafana',\n  logo: 'public/img/grafana_icon.svg',\n  link: 'https://grafana.com/',\n});\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  footer: css`\n    position: absolute;\n    height: 30px;\n    bottom: 0;\n    width: 100%;\n    background-color: ${colorManipulator.alpha(theme.colors.background.canvas, 0.7)};\n    text-align: right;\n    font-size: ${theme.typography.body.fontSize};\n    z-index: ${theme.zIndex.navbarFixed};\n  `,\n  logoText: css`\n    margin-right: ${theme.spacing(1)};\n  `,\n  logoImg: css`\n    height: 100%;\n    padding: ${theme.spacing(0.25, 0, 0.5, 0)};\n  `,\n});\n","import { css } from '@emotion/css';\nimport React, { useEffect, useState } from 'react';\n\nimport { AnnotationQuery, EventBus, GrafanaTheme2 } from '@grafana/data';\nimport { InlineField, InlineFieldRow, InlineSwitch, useStyles2 } from '@grafana/ui';\nimport { LoadingIndicator } from '@grafana/ui/src/components/PanelChrome/LoadingIndicator';\n\nimport { AnnotationQueryFinished, AnnotationQueryStarted } from '../../../../types/events';\nimport { getDashboardQueryRunner } from '../../../query/state/DashboardQueryRunner/DashboardQueryRunner';\n\nexport interface AnnotationPickerProps {\n  events: EventBus;\n  annotation: AnnotationQuery;\n  onEnabledChanged: (annotation: AnnotationQuery) => void;\n}\n\nexport const AnnotationPicker = ({ annotation, events, onEnabledChanged }: AnnotationPickerProps): JSX.Element => {\n  const [loading, setLoading] = useState(false);\n  const styles = useStyles2(getStyles);\n  const onCancel = () => getDashboardQueryRunner().cancel(annotation);\n\n  useEffect(() => {\n    const started = events.getStream(AnnotationQueryStarted).subscribe({\n      next: (event) => {\n        if (event.payload === annotation) {\n          setLoading(true);\n        }\n      },\n    });\n    const stopped = events.getStream(AnnotationQueryFinished).subscribe({\n      next: (event) => {\n        if (event.payload === annotation) {\n          setLoading(false);\n        }\n      },\n    });\n\n    return () => {\n      started.unsubscribe();\n      stopped.unsubscribe();\n    };\n  });\n\n  return (\n    <div key={annotation.name} className={styles.annotation}>\n      <InlineFieldRow>\n        <InlineField label={annotation.name} disabled={loading}>\n          <InlineSwitch value={annotation.enable} onChange={() => onEnabledChanged(annotation)} disabled={loading} />\n        </InlineField>\n        <div className={styles.indicator}>\n          <LoadingIndicator loading={loading} onCancel={onCancel} />\n        </div>\n      </InlineFieldRow>\n    </div>\n  );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    annotation: css`\n      display: inline-block;\n      margin-right: ${theme.spacing(1)};\n\n      .fa-caret-down {\n        font-size: 75%;\n        padding-left: ${theme.spacing(1)};\n      }\n\n      .gf-form-inline .gf-form {\n        margin-bottom: 0;\n      }\n    `,\n    indicator: css`\n      align-self: center;\n      padding: 0 ${theme.spacing(0.5)};\n    `,\n  };\n}\n","import React, { FunctionComponent, useEffect, useState } from 'react';\n\nimport { AnnotationQuery, DataQuery, EventBus } from '@grafana/data';\n\nimport { AnnotationPicker } from './AnnotationPicker';\n\ninterface Props {\n  events: EventBus;\n  annotations: AnnotationQuery[];\n  onAnnotationChanged: (annotation: AnnotationQuery<DataQuery>) => void;\n}\n\nexport const Annotations: FunctionComponent<Props> = ({ annotations, onAnnotationChanged, events }) => {\n  const [visibleAnnotations, setVisibleAnnotations] = useState<AnnotationQuery[]>([]);\n  useEffect(() => {\n    setVisibleAnnotations(annotations.filter((annotation) => annotation.hide !== true));\n  }, [annotations]);\n\n  if (visibleAnnotations.length === 0) {\n    return null;\n  }\n\n  return (\n    <>\n      {visibleAnnotations.map((annotation) => (\n        <AnnotationPicker\n          events={events}\n          annotation={annotation}\n          onEnabledChanged={onAnnotationChanged}\n          key={annotation.name}\n        />\n      ))}\n    </>\n  );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { useRef, useState, useLayoutEffect } from 'react';\nimport { useAsync } from 'react-use';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { sanitize, sanitizeUrl } from '@grafana/data/src/text/sanitize';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, ToolbarButton, Tooltip, useStyles2 } from '@grafana/ui';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSearchItem } from 'app/features/search/types';\n\nimport { getLinkSrv } from '../../../panel/panellinks/link_srv';\nimport { DashboardLink } from '../../state/DashboardModel';\n\ninterface Props {\n  link: DashboardLink;\n  linkInfo: { title: string; href: string };\n  dashboardUID: string;\n}\n\nexport const DashboardLinksDashboard = (props: Props) => {\n  const { link, linkInfo } = props;\n  const listRef = useRef<HTMLUListElement>(null);\n  const [dropdownCssClass, setDropdownCssClass] = useState('invisible');\n  const [opened, setOpened] = useState(0);\n  const resolvedLinks = useResolvedLinks(props, opened);\n  const styles = useStyles2(getStyles);\n\n  useLayoutEffect(() => {\n    setDropdownCssClass(getDropdownLocationCssClass(listRef.current));\n  }, [resolvedLinks]);\n\n  if (link.asDropdown) {\n    return (\n      <LinkElement link={link} key=\"dashlinks-dropdown\" data-testid={selectors.components.DashboardLinks.dropDown}>\n        <>\n          <ToolbarButton\n            onClick={() => setOpened(Date.now())}\n            className={cx('gf-form-label gf-form-label--dashlink', styles.button)}\n            data-placement=\"bottom\"\n            data-toggle=\"dropdown\"\n            aria-expanded={!!opened}\n            aria-controls=\"dropdown-list\"\n            aria-haspopup=\"menu\"\n          >\n            <Icon aria-hidden name=\"bars\" className={styles.iconMargin} />\n            <span>{linkInfo.title}</span>\n          </ToolbarButton>\n          <ul\n            id=\"dropdown-list\"\n            className={`dropdown-menu ${styles.dropdown} ${dropdownCssClass}`}\n            role=\"menu\"\n            ref={listRef}\n          >\n            {resolvedLinks.length > 0 &&\n              resolvedLinks.map((resolvedLink, index) => {\n                return (\n                  <li role=\"none\" key={`dashlinks-dropdown-item-${resolvedLink.uid}-${index}`}>\n                    <a\n                      role=\"menuitem\"\n                      href={resolvedLink.url}\n                      target={link.targetBlank ? '_blank' : undefined}\n                      rel=\"noreferrer\"\n                      data-testid={selectors.components.DashboardLinks.link}\n                      aria-label={`${resolvedLink.title} dashboard`}\n                    >\n                      {resolvedLink.title}\n                    </a>\n                  </li>\n                );\n              })}\n          </ul>\n        </>\n      </LinkElement>\n    );\n  }\n\n  return (\n    <>\n      {resolvedLinks.length > 0 &&\n        resolvedLinks.map((resolvedLink, index) => {\n          return (\n            <LinkElement\n              link={link}\n              key={`dashlinks-list-item-${resolvedLink.uid}-${index}`}\n              data-testid={selectors.components.DashboardLinks.container}\n            >\n              <a\n                className=\"gf-form-label gf-form-label--dashlink\"\n                href={resolvedLink.url}\n                target={link.targetBlank ? '_blank' : undefined}\n                rel=\"noreferrer\"\n                data-testid={selectors.components.DashboardLinks.link}\n                aria-label={`${resolvedLink.title} dashboard`}\n              >\n                <Icon aria-hidden name=\"apps\" style={{ marginRight: '4px' }} />\n                <span>{resolvedLink.title}</span>\n              </a>\n            </LinkElement>\n          );\n        })}\n    </>\n  );\n};\n\ninterface LinkElementProps {\n  link: DashboardLink;\n  key: string;\n  children: JSX.Element;\n}\n\nconst LinkElement: React.FC<LinkElementProps> = (props) => {\n  const { link, children, ...rest } = props;\n\n  return (\n    <div {...rest} className=\"gf-form\">\n      {link.tooltip && <Tooltip content={link.tooltip}>{children}</Tooltip>}\n      {!link.tooltip && <>{children}</>}\n    </div>\n  );\n};\n\nconst useResolvedLinks = ({ link, dashboardUID }: Props, opened: number): ResolvedLinkDTO[] => {\n  const { tags } = link;\n  const result = useAsync(() => searchForTags(tags), [tags, opened]);\n  if (!result.value) {\n    return [];\n  }\n  return resolveLinks(dashboardUID, link, result.value);\n};\n\ninterface ResolvedLinkDTO {\n  uid: string;\n  url: string;\n  title: string;\n}\n\nexport async function searchForTags(\n  tags: string[],\n  dependencies: { getBackendSrv: typeof getBackendSrv } = { getBackendSrv }\n): Promise<DashboardSearchItem[]> {\n  const limit = 100;\n  const searchHits: DashboardSearchItem[] = await dependencies.getBackendSrv().search({ tag: tags, limit });\n\n  return searchHits;\n}\n\nexport function resolveLinks(\n  dashboardUID: string,\n  link: DashboardLink,\n  searchHits: DashboardSearchItem[],\n  dependencies: { getLinkSrv: typeof getLinkSrv; sanitize: typeof sanitize; sanitizeUrl: typeof sanitizeUrl } = {\n    getLinkSrv,\n    sanitize,\n    sanitizeUrl,\n  }\n): ResolvedLinkDTO[] {\n  return searchHits\n    .filter((searchHit) => searchHit.uid !== dashboardUID)\n    .map((searchHit) => {\n      const uid = searchHit.uid;\n      const title = dependencies.sanitize(searchHit.title);\n      const resolvedLink = dependencies.getLinkSrv().getLinkUrl({ ...link, url: searchHit.url });\n      const url = dependencies.sanitizeUrl(resolvedLink);\n\n      return { uid, title, url };\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.left + pos.width + 10 > window.innerWidth) {\n    return 'pull-left';\n  } else {\n    return 'pull-right';\n  }\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    iconMargin: css({\n      marginRight: theme.spacing(0.5),\n    }),\n    dropdown: css({\n      maxWidth: 'max(30vw, 300px)',\n      maxHeight: '70vh',\n      overflowY: 'auto',\n      a: {\n        overflow: 'hidden',\n        textOverflow: 'ellipsis',\n        whiteSpace: 'nowrap',\n      },\n    }),\n    button: css({\n      color: theme.colors.text.primary,\n    }),\n  };\n}\n","import React, { FC } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { sanitizeUrl } from '@grafana/data/src/text/sanitize';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { TimeRangeUpdatedEvent } from '@grafana/runtime';\nimport { Icon, Tooltip, useForceUpdate } from '@grafana/ui';\n\nimport { getLinkSrv } from '../../../panel/panellinks/link_srv';\nimport { DashboardModel } from '../../state';\nimport { DashboardLink } from '../../state/DashboardModel';\nimport { linkIconMap } from '../LinksSettings/LinkSettingsEdit';\n\nimport { DashboardLinksDashboard } from './DashboardLinksDashboard';\n\nexport interface Props {\n  dashboard: DashboardModel;\n  links: DashboardLink[];\n}\n\nexport const DashboardLinks: FC<Props> = ({ dashboard, links }) => {\n  const forceUpdate = useForceUpdate();\n\n  useEffectOnce(() => {\n    const sub = dashboard.events.subscribe(TimeRangeUpdatedEvent, forceUpdate);\n    return () => sub.unsubscribe();\n  });\n\n  if (!links.length) {\n    return null;\n  }\n\n  return (\n    <>\n      {links.map((link: DashboardLink, index: number) => {\n        const linkInfo = getLinkSrv().getAnchorInfo(link);\n        const key = `${link.title}-$${index}`;\n\n        if (link.type === 'dashboards') {\n          return <DashboardLinksDashboard key={key} link={link} linkInfo={linkInfo} dashboardUID={dashboard.uid} />;\n        }\n\n        const icon = linkIconMap[link.icon];\n\n        const linkElement = (\n          <a\n            className=\"gf-form-label gf-form-label--dashlink\"\n            href={sanitizeUrl(linkInfo.href)}\n            target={link.targetBlank ? '_blank' : undefined}\n            rel=\"noreferrer\"\n            data-testid={selectors.components.DashboardLinks.link}\n          >\n            {icon && <Icon aria-hidden name={icon} style={{ marginRight: '4px' }} />}\n            <span>{linkInfo.title}</span>\n          </a>\n        );\n\n        return (\n          <div key={key} className=\"gf-form\" data-testid={selectors.components.DashboardLinks.container}>\n            {link.tooltip ? <Tooltip content={linkInfo.tooltip}>{linkElement}</Tooltip> : linkElement}\n          </div>\n        );\n      })}\n    </>\n  );\n};\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { connect, MapStateToProps } from 'react-redux';\n\nimport { AnnotationQuery, DataQuery } from '@grafana/data';\n\nimport { StoreState } from '../../../../types';\nimport { getSubMenuVariables, getVariablesState } from '../../../variables/state/selectors';\nimport { VariableModel } from '../../../variables/types';\nimport { DashboardModel } from '../../state';\nimport { DashboardLink } from '../../state/DashboardModel';\n\nimport { Annotations } from './Annotations';\nimport { DashboardLinks } from './DashboardLinks';\nimport { SubMenuItems } from './SubMenuItems';\n\ninterface OwnProps {\n  dashboard: DashboardModel;\n  links: DashboardLink[];\n  annotations: AnnotationQuery[];\n}\n\ninterface ConnectedProps {\n  variables: VariableModel[];\n}\n\ninterface DispatchProps {}\n\ntype Props = OwnProps & ConnectedProps & DispatchProps;\n\nclass SubMenuUnConnected extends PureComponent<Props> {\n  onAnnotationStateChanged = (updatedAnnotation: AnnotationQuery<DataQuery>) => {\n    // we're mutating dashboard state directly here until annotations are in Redux.\n    for (let index = 0; index < this.props.dashboard.annotations.list.length; index++) {\n      const annotation = this.props.dashboard.annotations.list[index];\n      if (annotation.name === updatedAnnotation.name) {\n        annotation.enable = !annotation.enable;\n        break;\n      }\n    }\n    this.props.dashboard.startRefresh();\n    this.forceUpdate();\n  };\n\n  render() {\n    const { dashboard, variables, links, annotations } = this.props;\n\n    if (!dashboard.isSubMenuVisible()) {\n      return null;\n    }\n\n    const readOnlyVariables = dashboard.meta.isSnapshot ?? false;\n\n    return (\n      <div className=\"submenu-controls\">\n        <form aria-label=\"Template variables\" className={styles}>\n          <SubMenuItems variables={variables} readOnly={readOnlyVariables} />\n        </form>\n        <Annotations\n          annotations={annotations}\n          onAnnotationChanged={this.onAnnotationStateChanged}\n          events={dashboard.events}\n        />\n        <div className=\"gf-form gf-form--grow\" />\n        {dashboard && <DashboardLinks dashboard={dashboard} links={links} />}\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, ownProps) => {\n  const { uid } = ownProps.dashboard;\n  const templatingState = getVariablesState(uid, state);\n  return {\n    variables: getSubMenuVariables(uid, templatingState.variables),\n  };\n};\n\nconst styles = css`\n  display: flex;\n  flex-wrap: wrap;\n  display: contents;\n`;\n\nexport const SubMenu = connect(mapStateToProps)(SubMenuUnConnected);\n\nSubMenu.displayName = 'SubMenu';\n","import { css, cx, keyframes } from '@emotion/css';\nimport { chain, cloneDeep, defaults, find, sortBy } from 'lodash';\nimport React, { useMemo, useState } from 'react';\nimport { connect, MapDispatchToProps } from 'react-redux';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { locationService, reportInteraction } from '@grafana/runtime';\nimport { Icon, IconButton, useStyles2 } from '@grafana/ui';\nimport { CardButton } from 'app/core/components/CardButton';\nimport config from 'app/core/config';\nimport { LS_PANEL_COPY_KEY } from 'app/core/constants';\nimport store from 'app/core/store';\nimport { addPanel } from 'app/features/dashboard/state/reducers';\n\nimport {\n  LibraryPanelsSearch,\n  LibraryPanelsSearchVariant,\n} from '../../../library-panels/components/LibraryPanelsSearch/LibraryPanelsSearch';\nimport { LibraryElementDTO } from '../../../library-panels/types';\nimport { DashboardModel, PanelModel } from '../../state';\n\nexport type PanelPluginInfo = { id: any; defaults: { gridPos: { w: any; h: any }; title: any } };\n\nexport interface OwnProps {\n  panel: PanelModel;\n  dashboard: DashboardModel;\n}\n\nexport interface DispatchProps {\n  addPanel: typeof addPanel;\n}\n\nexport type Props = OwnProps & DispatchProps;\n\nconst getCopiedPanelPlugins = () => {\n  const panels = chain(config.panels)\n    .filter({ hideFromList: false })\n    .map((item) => item)\n    .value();\n  const copiedPanels = [];\n\n  const copiedPanelJson = store.get(LS_PANEL_COPY_KEY);\n  if (copiedPanelJson) {\n    const copiedPanel = JSON.parse(copiedPanelJson);\n    const pluginInfo: any = find(panels, { id: copiedPanel.type });\n    if (pluginInfo) {\n      const pluginCopy = cloneDeep(pluginInfo);\n      pluginCopy.name = copiedPanel.title;\n      pluginCopy.sort = -1;\n      pluginCopy.defaults = copiedPanel;\n      copiedPanels.push(pluginCopy);\n    }\n  }\n\n  return sortBy(copiedPanels, 'sort');\n};\n\nexport const AddPanelWidgetUnconnected = ({ panel, dashboard }: Props) => {\n  const [addPanelView, setAddPanelView] = useState(false);\n\n  const onCancelAddPanel = (evt: React.MouseEvent<HTMLButtonElement>) => {\n    evt.preventDefault();\n    dashboard.removePanel(panel);\n  };\n\n  const onBack = () => {\n    setAddPanelView(false);\n  };\n\n  const onCreateNewPanel = () => {\n    const { gridPos } = panel;\n\n    const newPanel: Partial<PanelModel> = {\n      type: 'timeseries',\n      title: 'Panel Title',\n      gridPos: { x: gridPos.x, y: gridPos.y, w: gridPos.w, h: gridPos.h },\n    };\n\n    dashboard.addPanel(newPanel);\n    dashboard.removePanel(panel);\n\n    locationService.partial({ editPanel: newPanel.id });\n  };\n\n  const onPasteCopiedPanel = (panelPluginInfo: PanelPluginInfo) => {\n    const { gridPos } = panel;\n\n    const newPanel: any = {\n      type: panelPluginInfo.id,\n      title: 'Panel Title',\n      gridPos: {\n        x: gridPos.x,\n        y: gridPos.y,\n        w: panelPluginInfo.defaults.gridPos.w,\n        h: panelPluginInfo.defaults.gridPos.h,\n      },\n    };\n\n    // apply panel template / defaults\n    if (panelPluginInfo.defaults) {\n      defaults(newPanel, panelPluginInfo.defaults);\n      newPanel.title = panelPluginInfo.defaults.title;\n      store.delete(LS_PANEL_COPY_KEY);\n    }\n\n    dashboard.addPanel(newPanel);\n    dashboard.removePanel(panel);\n  };\n\n  const onAddLibraryPanel = (panelInfo: LibraryElementDTO) => {\n    const { gridPos } = panel;\n\n    const newPanel: PanelModel = {\n      ...panelInfo.model,\n      gridPos,\n      libraryPanel: panelInfo,\n    };\n\n    dashboard.addPanel(newPanel);\n    dashboard.removePanel(panel);\n  };\n\n  const onCreateNewRow = () => {\n    const newRow: any = {\n      type: 'row',\n      title: 'Row title',\n      gridPos: { x: 0, y: 0 },\n    };\n\n    dashboard.addPanel(newRow);\n    dashboard.removePanel(panel);\n  };\n\n  const styles = useStyles2(getStyles);\n  const copiedPanelPlugins = useMemo(() => getCopiedPanelPlugins(), []);\n\n  return (\n    <div className={styles.wrapper}>\n      <div className={cx('panel-container', styles.callToAction)}>\n        <AddPanelWidgetHandle onCancel={onCancelAddPanel} onBack={addPanelView ? onBack : undefined} styles={styles}>\n          {addPanelView ? 'Add panel from panel library' : 'Add panel'}\n        </AddPanelWidgetHandle>\n        {addPanelView ? (\n          <LibraryPanelsSearch onClick={onAddLibraryPanel} variant={LibraryPanelsSearchVariant.Tight} showPanelFilter />\n        ) : (\n          <div className={styles.actionsWrapper}>\n            <CardButton\n              icon=\"file-blank\"\n              aria-label={selectors.pages.AddDashboard.addNewPanel}\n              onClick={() => {\n                reportInteraction('Create new panel');\n                onCreateNewPanel();\n              }}\n            >\n              Add a new panel\n            </CardButton>\n            <CardButton\n              icon=\"wrap-text\"\n              aria-label={selectors.pages.AddDashboard.addNewRow}\n              onClick={() => {\n                reportInteraction('Create new row');\n                onCreateNewRow();\n              }}\n            >\n              Add a new row\n            </CardButton>\n            <CardButton\n              icon=\"book-open\"\n              aria-label={selectors.pages.AddDashboard.addNewPanelLibrary}\n              onClick={() => {\n                reportInteraction('Add a panel from the panel library');\n                setAddPanelView(true);\n              }}\n            >\n              Add a panel from the panel library\n            </CardButton>\n            {copiedPanelPlugins.length === 1 && (\n              <CardButton\n                icon=\"clipboard-alt\"\n                aria-label={selectors.pages.AddDashboard.addNewPanelLibrary}\n                onClick={() => {\n                  reportInteraction('Paste panel from clipboard');\n                  onPasteCopiedPanel(copiedPanelPlugins[0]);\n                }}\n              >\n                Paste panel from clipboard\n              </CardButton>\n            )}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n};\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = { addPanel };\n\nexport const AddPanelWidget = connect(undefined, mapDispatchToProps)(AddPanelWidgetUnconnected);\n\ninterface AddPanelWidgetHandleProps {\n  onCancel: (e: React.MouseEvent<HTMLButtonElement>) => void;\n  onBack?: () => void;\n  children?: string;\n  styles: AddPanelStyles;\n}\n\nconst AddPanelWidgetHandle: React.FC<AddPanelWidgetHandleProps> = ({ children, onBack, onCancel, styles }) => {\n  return (\n    <div className={cx(styles.headerRow, 'grid-drag-handle')}>\n      {onBack && (\n        <div className={styles.backButton}>\n          <IconButton aria-label=\"Go back\" name=\"arrow-left\" onClick={onBack} size=\"xl\" />\n        </div>\n      )}\n      {!onBack && (\n        <div className={styles.backButton}>\n          <Icon name=\"panel-add\" size=\"md\" />\n        </div>\n      )}\n      {children && <span>{children}</span>}\n      <div className=\"flex-grow-1\" />\n      <IconButton aria-label=\"Close 'Add Panel' widget\" name=\"times\" onClick={onCancel} />\n    </div>\n  );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  const pulsate = keyframes`\n    0% {box-shadow: 0 0 0 2px ${theme.colors.background.canvas}, 0 0 0px 4px ${theme.colors.primary.main};}\n    50% {box-shadow: 0 0 0 2px ${theme.components.dashboard.background}, 0 0 0px 4px ${tinycolor(\n    theme.colors.primary.main\n  )\n    .darken(20)\n    .toHexString()};}\n    100% {box-shadow: 0 0 0 2px ${theme.components.dashboard.background}, 0 0 0px 4px  ${theme.colors.primary.main};}\n  `;\n\n  return {\n    // wrapper is used to make sure box-shadow animation isn't cut off in dashboard page\n    wrapper: css`\n      height: 100%;\n      padding-top: ${theme.spacing(0.5)};\n    `,\n    callToAction: css`\n      overflow: hidden;\n      outline: 2px dotted transparent;\n      outline-offset: 2px;\n      box-shadow: 0 0 0 2px black, 0 0 0px 4px #1f60c4;\n      animation: ${pulsate} 2s ease infinite;\n    `,\n    actionsWrapper: css`\n      height: 100%;\n      display: grid;\n      grid-template-columns: repeat(2, 1fr);\n      column-gap: ${theme.spacing(1)};\n      row-gap: ${theme.spacing(1)};\n      padding: ${theme.spacing(0, 1, 1, 1)};\n\n      // This is to make the last action full width (if by itself)\n      & > div:nth-child(2n-1):nth-last-of-type(1) {\n        grid-column: span 2;\n      }\n    `,\n    headerRow: css`\n      display: flex;\n      align-items: center;\n      height: 38px;\n      flex-shrink: 0;\n      width: 100%;\n      font-size: ${theme.typography.fontSize};\n      font-weight: ${theme.typography.fontWeightMedium};\n      padding-left: ${theme.spacing(1)};\n      transition: background-color 0.1s ease-in-out;\n      cursor: move;\n\n      &:hover {\n        background: ${theme.colors.background.secondary};\n      }\n    `,\n    backButton: css`\n      display: flex;\n      align-items: center;\n      cursor: pointer;\n      padding-left: ${theme.spacing(0.5)};\n      width: ${theme.spacing(4)};\n    `,\n    noMargin: css`\n      margin: 0;\n    `,\n  };\n};\n\ntype AddPanelStyles = ReturnType<typeof getStyles>;\n","import React, { FC, useCallback, useState } from 'react';\n\nimport { Button, Field, Form, Modal, Input } from '@grafana/ui';\n\nimport { RepeatRowSelect } from '../RepeatRowSelect/RepeatRowSelect';\n\nexport type OnRowOptionsUpdate = (title: string, repeat?: string | null) => void;\n\nexport interface Props {\n  title: string;\n  repeat?: string | null;\n  onUpdate: OnRowOptionsUpdate;\n  onCancel: () => void;\n}\n\nexport const RowOptionsForm: FC<Props> = ({ repeat, title, onUpdate, onCancel }) => {\n  const [newRepeat, setNewRepeat] = useState<string | null | undefined>(repeat);\n  const onChangeRepeat = useCallback((name?: string | null) => setNewRepeat(name), [setNewRepeat]);\n\n  return (\n    <Form\n      defaultValues={{ title }}\n      onSubmit={(formData: { title: string }) => {\n        onUpdate(formData.title, newRepeat);\n      }}\n    >\n      {({ register }) => (\n        <>\n          <Field label=\"Title\">\n            <Input {...register('title')} type=\"text\" />\n          </Field>\n\n          <Field label=\"Repeat for\">\n            <RepeatRowSelect repeat={newRepeat} onChange={onChangeRepeat} />\n          </Field>\n\n          <Modal.ButtonRow>\n            <Button type=\"button\" variant=\"secondary\" onClick={onCancel} fill=\"outline\">\n              Cancel\n            </Button>\n            <Button type=\"submit\">Update</Button>\n          </Modal.ButtonRow>\n        </>\n      )}\n    </Form>\n  );\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { Modal, stylesFactory } from '@grafana/ui';\n\nimport { OnRowOptionsUpdate, RowOptionsForm } from './RowOptionsForm';\n\nexport interface RowOptionsModalProps {\n  title: string;\n  repeat?: string | null;\n  onDismiss: () => void;\n  onUpdate: OnRowOptionsUpdate;\n}\n\nexport const RowOptionsModal: FC<RowOptionsModalProps> = ({ repeat, title, onDismiss, onUpdate }) => {\n  const styles = getStyles();\n  return (\n    <Modal isOpen={true} title=\"Row options\" icon=\"copy\" onDismiss={onDismiss} className={styles.modal}>\n      <RowOptionsForm repeat={repeat} title={title} onCancel={onDismiss} onUpdate={onUpdate} />\n    </Modal>\n  );\n};\n\nconst getStyles = stylesFactory(() => {\n  return {\n    modal: css`\n      label: RowOptionsModal;\n      width: 500px;\n    `,\n  };\n});\n","import React, { FC } from 'react';\n\nimport { Icon, ModalsController } from '@grafana/ui';\n\nimport { OnRowOptionsUpdate } from './RowOptionsForm';\nimport { RowOptionsModal } from './RowOptionsModal';\n\nexport interface RowOptionsButtonProps {\n  title: string;\n  repeat?: string | null;\n  onUpdate: OnRowOptionsUpdate;\n}\n\nexport const RowOptionsButton: FC<RowOptionsButtonProps> = ({ repeat, title, onUpdate }) => {\n  const onUpdateChange = (hideModal: () => void) => (title: string, repeat?: string | null) => {\n    onUpdate(title, repeat);\n    hideModal();\n  };\n\n  return (\n    <ModalsController>\n      {({ showModal, hideModal }) => {\n        return (\n          <button\n            type=\"button\"\n            className=\"pointer\"\n            aria-label=\"Row options\"\n            onClick={() => {\n              showModal(RowOptionsModal, { title, repeat, onDismiss: hideModal, onUpdate: onUpdateChange(hideModal) });\n            }}\n          >\n            <Icon name=\"cog\" />\n          </button>\n        );\n      }}\n    </ModalsController>\n  );\n};\n\nRowOptionsButton.displayName = 'RowOptionsButton';\n","import classNames from 'classnames';\nimport React from 'react';\nimport { Unsubscribable } from 'rxjs';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { getTemplateSrv, RefreshEvent } from '@grafana/runtime';\nimport { Icon } from '@grafana/ui';\nimport appEvents from 'app/core/app_events';\n\nimport { ShowConfirmModalEvent } from '../../../../types/events';\nimport { DashboardModel } from '../../state/DashboardModel';\nimport { PanelModel } from '../../state/PanelModel';\nimport { RowOptionsButton } from '../RowOptions/RowOptionsButton';\n\nexport interface DashboardRowProps {\n  panel: PanelModel;\n  dashboard: DashboardModel;\n}\n\nexport class DashboardRow extends React.Component<DashboardRowProps> {\n  sub?: Unsubscribable;\n\n  componentDidMount() {\n    this.sub = this.props.dashboard.events.subscribe(RefreshEvent, this.onVariableUpdated);\n  }\n\n  componentWillUnmount() {\n    if (this.sub) {\n      this.sub.unsubscribe();\n    }\n  }\n\n  onVariableUpdated = () => {\n    this.forceUpdate();\n  };\n\n  onToggle = () => {\n    this.props.dashboard.toggleRow(this.props.panel);\n  };\n\n  onUpdate = (title: string, repeat?: string | null) => {\n    this.props.panel.setProperty('title', title);\n    this.props.panel.setProperty('repeat', repeat ?? undefined);\n    this.props.panel.render();\n    this.props.dashboard.processRepeats();\n    this.forceUpdate();\n  };\n\n  onDelete = () => {\n    appEvents.publish(\n      new ShowConfirmModalEvent({\n        title: 'Delete row',\n        text: 'Are you sure you want to remove this row and all its panels?',\n        altActionText: 'Delete row only',\n        icon: 'trash-alt',\n        onConfirm: () => {\n          this.props.dashboard.removeRow(this.props.panel, true);\n        },\n        onAltAction: () => {\n          this.props.dashboard.removeRow(this.props.panel, false);\n        },\n      })\n    );\n  };\n\n  render() {\n    const classes = classNames({\n      'dashboard-row': true,\n      'dashboard-row--collapsed': this.props.panel.collapsed,\n    });\n\n    const title = getTemplateSrv().replace(this.props.panel.title, this.props.panel.scopedVars, 'text');\n    const count = this.props.panel.panels ? this.props.panel.panels.length : 0;\n    const panels = count === 1 ? 'panel' : 'panels';\n    const canEdit = this.props.dashboard.meta.canEdit === true;\n\n    return (\n      <div className={classes} data-testid=\"dashboard-row-container\">\n        <button\n          className=\"dashboard-row__title pointer\"\n          type=\"button\"\n          data-testid={selectors.components.DashboardRow.title(title)}\n          onClick={this.onToggle}\n        >\n          <Icon name={this.props.panel.collapsed ? 'angle-right' : 'angle-down'} />\n          {title}\n          <span className=\"dashboard-row__panel_count\">\n            ({count} {panels})\n          </span>\n        </button>\n        {canEdit && (\n          <div className=\"dashboard-row__actions\">\n            <RowOptionsButton\n              title={this.props.panel.title}\n              repeat={this.props.panel.repeat}\n              onUpdate={this.onUpdate}\n            />\n            <button type=\"button\" className=\"pointer\" onClick={this.onDelete} aria-label=\"Delete row\">\n              <Icon name=\"trash-alt\" />\n            </button>\n          </div>\n        )}\n        {this.props.panel.collapsed === true && (\n          <div className=\"dashboard-row__toggle-target\" onClick={this.onToggle}>\n            &nbsp;\n          </div>\n        )}\n        {canEdit && <div data-testid=\"dashboard-row-drag\" className=\"dashboard-row__drag grid-drag-handle\" />}\n      </div>\n    );\n  }\n}\n","import classNames from 'classnames';\nimport React, { PureComponent, CSSProperties } from 'react';\nimport ReactGridLayout, { ItemCallback } from 'react-grid-layout';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { Subscription } from 'rxjs';\n\nimport { config } from '@grafana/runtime';\nimport { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN, GRID_COLUMN_COUNT } from 'app/core/constants';\nimport { DashboardPanelsChangedEvent } from 'app/types/events';\n\nimport { AddPanelWidget } from '../components/AddPanelWidget';\nimport { DashboardRow } from '../components/DashboardRow';\nimport { DashboardModel, PanelModel } from '../state';\nimport { GridPos } from '../state/PanelModel';\n\nimport { DashboardPanel } from './DashboardPanel';\n\nexport interface Props {\n  dashboard: DashboardModel;\n  isEditable: boolean;\n  editPanel: PanelModel | null;\n  viewPanel: PanelModel | null;\n}\n\nexport interface State {\n  isLayoutInitialized: boolean;\n}\n\nexport class DashboardGrid extends PureComponent<Props, State> {\n  private panelMap: { [key: string]: PanelModel } = {};\n  private eventSubs = new Subscription();\n  private windowHeight = 1200;\n  private windowWidth = 1920;\n  private gridWidth = 0;\n  /** Used to keep track of mobile panel layout position */\n  private lastPanelBottom = 0;\n\n  constructor(props: Props) {\n    super(props);\n\n    this.state = {\n      isLayoutInitialized: false,\n    };\n  }\n\n  componentDidMount() {\n    const { dashboard } = this.props;\n    this.eventSubs.add(dashboard.events.subscribe(DashboardPanelsChangedEvent, this.triggerForceUpdate));\n  }\n\n  componentWillUnmount() {\n    this.eventSubs.unsubscribe();\n  }\n\n  buildLayout() {\n    const layout: ReactGridLayout.Layout[] = [];\n    this.panelMap = {};\n\n    for (const panel of this.props.dashboard.panels) {\n      if (!panel.key) {\n        panel.key = `panel-${panel.id}-${Date.now()}`;\n      }\n      this.panelMap[panel.key] = panel;\n\n      if (!panel.gridPos) {\n        console.log('panel without gridpos');\n        continue;\n      }\n\n      const panelPos: ReactGridLayout.Layout = {\n        i: panel.key,\n        x: panel.gridPos.x,\n        y: panel.gridPos.y,\n        w: panel.gridPos.w,\n        h: panel.gridPos.h,\n      };\n\n      if (panel.type === 'row') {\n        panelPos.w = GRID_COLUMN_COUNT;\n        panelPos.h = 1;\n        panelPos.isResizable = false;\n        panelPos.isDraggable = panel.collapsed;\n      }\n\n      layout.push(panelPos);\n    }\n\n    return layout;\n  }\n\n  onLayoutChange = (newLayout: ReactGridLayout.Layout[]) => {\n    for (const newPos of newLayout) {\n      this.panelMap[newPos.i!].updateGridPos(newPos, this.state.isLayoutInitialized);\n    }\n\n    this.props.dashboard.sortPanelsByGridPos();\n\n    // This is called on grid mount as it can correct invalid initial grid positions\n    if (!this.state.isLayoutInitialized) {\n      this.setState({ isLayoutInitialized: true });\n    }\n  };\n\n  triggerForceUpdate = () => {\n    this.forceUpdate();\n  };\n\n  updateGridPos = (item: ReactGridLayout.Layout, layout: ReactGridLayout.Layout[]) => {\n    this.panelMap[item.i!].updateGridPos(item);\n  };\n\n  onResize: ItemCallback = (layout, oldItem, newItem) => {\n    const panel = this.panelMap[newItem.i!];\n    panel.updateGridPos(newItem);\n  };\n\n  onResizeStop: ItemCallback = (layout, oldItem, newItem) => {\n    this.updateGridPos(newItem, layout);\n  };\n\n  onDragStop: ItemCallback = (layout, oldItem, newItem) => {\n    this.updateGridPos(newItem, layout);\n  };\n\n  getPanelScreenPos(panel: PanelModel, gridWidth: number): { top: number; bottom: number } {\n    let top = 0;\n\n    // mobile layout\n    if (gridWidth < config.theme2.breakpoints.values.md) {\n      // In mobile layout panels are stacked so we just add the panel vertical margin to the last panel bottom position\n      top = this.lastPanelBottom + GRID_CELL_VMARGIN;\n    } else {\n      // For top position we need to add back the vertical margin removed by translateGridHeightToScreenHeight\n      top = translateGridHeightToScreenHeight(panel.gridPos.y) + GRID_CELL_VMARGIN;\n    }\n\n    this.lastPanelBottom = top + translateGridHeightToScreenHeight(panel.gridPos.h);\n\n    return { top, bottom: this.lastPanelBottom };\n  }\n\n  renderPanels(gridWidth: number) {\n    const panelElements = [];\n\n    // Reset last panel bottom\n    this.lastPanelBottom = 0;\n\n    // This is to avoid layout re-flows, accessing window.innerHeight can trigger re-flow\n    // We assume here that if width change height might have changed as well\n    if (this.gridWidth !== gridWidth) {\n      this.windowHeight = window.innerHeight ?? 1000;\n      this.windowWidth = window.innerWidth;\n      this.gridWidth = gridWidth;\n    }\n\n    for (const panel of this.props.dashboard.panels) {\n      const panelClasses = classNames({ 'react-grid-item--fullscreen': panel.isViewing });\n\n      panelElements.push(\n        <GrafanaGridItem\n          key={panel.key}\n          className={panelClasses}\n          data-panelid={panel.id}\n          gridPos={panel.gridPos}\n          gridWidth={gridWidth}\n          windowHeight={this.windowHeight}\n          windowWidth={this.windowWidth}\n          isViewing={panel.isViewing}\n        >\n          {(width: number, height: number) => {\n            return this.renderPanel(panel, width, height);\n          }}\n        </GrafanaGridItem>\n      );\n    }\n\n    return panelElements;\n  }\n\n  renderPanel(panel: PanelModel, width: number, height: number) {\n    if (panel.type === 'row') {\n      return <DashboardRow key={panel.key} panel={panel} dashboard={this.props.dashboard} />;\n    }\n\n    if (panel.type === 'add-panel') {\n      return <AddPanelWidget key={panel.key} panel={panel} dashboard={this.props.dashboard} />;\n    }\n\n    return (\n      <DashboardPanel\n        key={panel.key}\n        stateKey={panel.key}\n        panel={panel}\n        dashboard={this.props.dashboard}\n        isEditing={panel.isEditing}\n        isViewing={panel.isViewing}\n        width={width}\n        height={height}\n      />\n    );\n  }\n\n  render() {\n    const { isEditable } = this.props;\n\n    /**\n     * We have a parent with \"flex: 1 1 0\" we need to reset it to \"flex: 1 1 auto\" to have the AutoSizer\n     * properly working. For more information go here:\n     * https://github.com/bvaughn/react-virtualized/blob/master/docs/usingAutoSizer.md#can-i-use-autosizer-within-a-flex-container\n     */\n    return (\n      <div style={{ flex: '1 1 auto', display: this.props.editPanel ? 'none' : undefined }}>\n        <AutoSizer disableHeight>\n          {({ width }) => {\n            if (width === 0) {\n              return null;\n            }\n\n            const draggable = width <= 769 ? false : isEditable;\n\n            /*\n            Disable draggable if mobile device, solving an issue with unintentionally\n            moving panels. https://github.com/grafana/grafana/issues/18497\n            theme.breakpoints.md = 769\n          */\n            return (\n              /**\n               * The children is using a width of 100% so we need to guarantee that it is wrapped\n               * in an element that has the calculated size given by the AutoSizer. The AutoSizer\n               * has a width of 0 and will let its content overflow its div.\n               */\n              <div style={{ width: `${width}px`, height: '100%' }}>\n                <ReactGridLayout\n                  width={width}\n                  isDraggable={draggable}\n                  isResizable={isEditable}\n                  containerPadding={[0, 0]}\n                  useCSSTransforms={false}\n                  margin={[GRID_CELL_VMARGIN, GRID_CELL_VMARGIN]}\n                  cols={GRID_COLUMN_COUNT}\n                  rowHeight={GRID_CELL_HEIGHT}\n                  draggableHandle=\".grid-drag-handle\"\n                  layout={this.buildLayout()}\n                  onDragStop={this.onDragStop}\n                  onResize={this.onResize}\n                  onResizeStop={this.onResizeStop}\n                  onLayoutChange={this.onLayoutChange}\n                >\n                  {this.renderPanels(width)}\n                </ReactGridLayout>\n              </div>\n            );\n          }}\n        </AutoSizer>\n      </div>\n    );\n  }\n}\n\ninterface GrafanaGridItemProps extends Record<string, any> {\n  gridWidth?: number;\n  gridPos?: GridPos;\n  isViewing: string;\n  windowHeight: number;\n  windowWidth: number;\n  children: any;\n}\n\n/**\n * A hacky way to intercept the react-layout-grid item dimensions and pass them to DashboardPanel\n */\nconst GrafanaGridItem = React.forwardRef<HTMLDivElement, GrafanaGridItemProps>((props, ref) => {\n  const theme = config.theme2;\n  let width = 100;\n  let height = 100;\n\n  const { gridWidth, gridPos, isViewing, windowHeight, windowWidth, ...divProps } = props;\n  const style: CSSProperties = props.style ?? {};\n\n  if (isViewing) {\n    // In fullscreen view mode a single panel take up full width & 85% height\n    width = gridWidth!;\n    height = windowHeight * 0.85;\n    style.height = height;\n    style.width = '100%';\n  } else if (windowWidth < theme.breakpoints.values.md) {\n    // Mobile layout is a bit different, every panel take up full width\n    width = props.gridWidth!;\n    height = translateGridHeightToScreenHeight(gridPos!.h);\n    style.height = height;\n    style.width = '100%';\n  } else {\n    // Normal grid layout. The grid framework passes width and height directly to children as style props.\n    width = parseFloat(props.style.width);\n    height = parseFloat(props.style.height);\n  }\n\n  // props.children[0] is our main children. RGL adds the drag handle at props.children[1]\n  return (\n    <div {...divProps} ref={ref}>\n      {/* Pass width and height to children as render props */}\n      {[props.children[0](width, height), props.children.slice(1)]}\n    </div>\n  );\n});\n\n/**\n * This translates grid height dimensions to real pixels\n */\nfunction translateGridHeightToScreenHeight(gridHeight: number): number {\n  return gridHeight * (GRID_CELL_HEIGHT + GRID_CELL_VMARGIN) - GRID_CELL_VMARGIN;\n}\n\nGrafanaGridItem.displayName = 'GridItemWithDimensions';\n","import { cx } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { NavModel, NavModelItem, TimeRange, PageLayoutType, locationUtil } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { config, locationService } from '@grafana/runtime';\nimport { Themeable2, withTheme2 } from '@grafana/ui';\nimport { notifyApp } from 'app/core/actions';\nimport { Page } from 'app/core/components/Page/Page';\nimport { GrafanaContext, GrafanaContextType } from 'app/core/context/GrafanaContext';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { getKioskMode } from 'app/core/navigation/kiosk';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { getPageNavFromSlug, getRootContentNavModel } from 'app/features/storage/StorageFolderPage';\nimport { DashboardRoutes, KioskMode, StoreState } from 'app/types';\nimport { PanelEditEnteredEvent, PanelEditExitedEvent } from 'app/types/events';\n\nimport { cancelVariables, templateVarsChangedInUrl } from '../../variables/state/actions';\nimport { findTemplateVarChanges } from '../../variables/utils';\nimport { DashNav } from '../components/DashNav';\nimport { DashboardFailed } from '../components/DashboardLoading/DashboardFailed';\nimport { DashboardLoading } from '../components/DashboardLoading/DashboardLoading';\nimport { DashboardPrompt } from '../components/DashboardPrompt/DashboardPrompt';\nimport { DashboardSettings } from '../components/DashboardSettings';\nimport { PanelInspector } from '../components/Inspector/PanelInspector';\nimport { PanelEditor } from '../components/PanelEditor/PanelEditor';\nimport { PublicDashboardFooter } from '../components/PublicDashboardFooter/PublicDashboardsFooter';\nimport { SubMenu } from '../components/SubMenu/SubMenu';\nimport { DashboardGrid } from '../dashgrid/DashboardGrid';\nimport { liveTimer } from '../dashgrid/liveTimer';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { cleanUpDashboardAndVariables } from '../state/actions';\nimport { initDashboard } from '../state/initDashboard';\n\nexport interface DashboardPageRouteParams {\n  uid?: string;\n  type?: string;\n  slug?: string;\n  accessToken?: string;\n}\n\nexport type DashboardPageRouteSearchParams = {\n  tab?: string;\n  folderId?: string;\n  editPanel?: string;\n  viewPanel?: string;\n  editview?: string;\n  shareView?: string;\n  panelType?: string;\n  inspect?: string;\n  from?: string;\n  to?: string;\n  refresh?: string;\n  kiosk?: string | true;\n};\n\nexport const mapStateToProps = (state: StoreState) => ({\n  initPhase: state.dashboard.initPhase,\n  initError: state.dashboard.initError,\n  dashboard: state.dashboard.getModel(),\n  navIndex: state.navIndex,\n});\n\nconst mapDispatchToProps = {\n  initDashboard,\n  cleanUpDashboardAndVariables,\n  notifyApp,\n  cancelVariables,\n  templateVarsChangedInUrl,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype OwnProps = {\n  isPublic?: boolean;\n};\n\nexport type Props = OwnProps &\n  Themeable2 &\n  GrafanaRouteComponentProps<DashboardPageRouteParams, DashboardPageRouteSearchParams> &\n  ConnectedProps<typeof connector>;\n\nexport interface State {\n  editPanel: PanelModel | null;\n  viewPanel: PanelModel | null;\n  updateScrollTop?: number;\n  rememberScrollTop?: number;\n  showLoadingState: boolean;\n  panelNotFound: boolean;\n  editPanelAccessDenied: boolean;\n  scrollElement?: HTMLDivElement;\n  pageNav?: NavModelItem;\n  sectionNav?: NavModel;\n}\n\nexport class UnthemedDashboardPage extends PureComponent<Props, State> {\n  declare context: GrafanaContextType;\n  static contextType = GrafanaContext;\n\n  private forceRouteReloadCounter = 0;\n  state: State = this.getCleanState();\n\n  getCleanState(): State {\n    return {\n      editPanel: null,\n      viewPanel: null,\n      showLoadingState: false,\n      panelNotFound: false,\n      editPanelAccessDenied: false,\n    };\n  }\n\n  componentDidMount() {\n    this.initDashboard();\n    this.forceRouteReloadCounter = (this.props.history.location.state as any)?.routeReloadCounter || 0;\n  }\n\n  componentWillUnmount() {\n    this.closeDashboard();\n  }\n\n  closeDashboard() {\n    this.props.cleanUpDashboardAndVariables();\n    this.setState(this.getCleanState());\n  }\n\n  initDashboard() {\n    const { dashboard, isPublic, match, queryParams } = this.props;\n\n    if (dashboard) {\n      this.closeDashboard();\n    }\n\n    this.props.initDashboard({\n      urlSlug: match.params.slug,\n      urlUid: match.params.uid,\n      urlType: match.params.type,\n      urlFolderId: queryParams.folderId,\n      panelType: queryParams.panelType,\n      routeName: this.props.route.routeName,\n      fixUrl: !isPublic,\n      accessToken: match.params.accessToken,\n      keybindingSrv: this.context.keybindings,\n    });\n\n    // small delay to start live updates\n    setTimeout(this.updateLiveTimer, 250);\n  }\n\n  componentDidUpdate(prevProps: Props, prevState: State) {\n    const { dashboard, match, templateVarsChangedInUrl } = this.props;\n    const routeReloadCounter = (this.props.history.location.state as any)?.routeReloadCounter;\n\n    if (!dashboard) {\n      return;\n    }\n\n    if (\n      prevProps.match.params.uid !== match.params.uid ||\n      (routeReloadCounter !== undefined && this.forceRouteReloadCounter !== routeReloadCounter)\n    ) {\n      this.initDashboard();\n      this.forceRouteReloadCounter = routeReloadCounter;\n      return;\n    }\n\n    if (prevProps.location.search !== this.props.location.search) {\n      const prevUrlParams = prevProps.queryParams;\n      const urlParams = this.props.queryParams;\n\n      if (urlParams?.from !== prevUrlParams?.from || urlParams?.to !== prevUrlParams?.to) {\n        getTimeSrv().updateTimeRangeFromUrl();\n        this.updateLiveTimer();\n      }\n\n      if (!prevUrlParams?.refresh && urlParams?.refresh) {\n        getTimeSrv().setAutoRefresh(urlParams.refresh);\n      }\n\n      const templateVarChanges = findTemplateVarChanges(this.props.queryParams, prevProps.queryParams);\n\n      if (templateVarChanges) {\n        templateVarsChangedInUrl(dashboard.uid, templateVarChanges);\n      }\n    }\n\n    // entering edit mode\n    if (this.state.editPanel && !prevState.editPanel) {\n      dashboardWatcher.setEditingState(true);\n\n      // Some panels need to be notified when entering edit mode\n      this.props.dashboard?.events.publish(new PanelEditEnteredEvent(this.state.editPanel.id));\n    }\n\n    // leaving edit mode\n    if (!this.state.editPanel && prevState.editPanel) {\n      dashboardWatcher.setEditingState(false);\n\n      // Some panels need kicked when leaving edit mode\n      this.props.dashboard?.events.publish(new PanelEditExitedEvent(prevState.editPanel.id));\n    }\n\n    if (this.state.editPanelAccessDenied) {\n      this.props.notifyApp(createErrorNotification('Permission to edit panel denied'));\n      locationService.partial({ editPanel: null });\n    }\n\n    if (this.state.panelNotFound) {\n      this.props.notifyApp(createErrorNotification(`Panel not found`));\n      locationService.partial({ editPanel: null, viewPanel: null });\n    }\n  }\n\n  updateLiveTimer = () => {\n    let tr: TimeRange | undefined = undefined;\n    if (this.props.dashboard?.liveNow) {\n      tr = getTimeSrv().timeRange();\n    }\n    liveTimer.setLiveTimeRange(tr);\n  };\n\n  static getDerivedStateFromProps(props: Props, state: State) {\n    const { dashboard, queryParams } = props;\n\n    const urlEditPanelId = queryParams.editPanel;\n    const urlViewPanelId = queryParams.viewPanel;\n\n    if (!dashboard) {\n      return state;\n    }\n\n    const updatedState = { ...state };\n\n    // Entering edit mode\n    if (!state.editPanel && urlEditPanelId) {\n      const panel = dashboard.getPanelByUrlId(urlEditPanelId);\n      if (panel) {\n        if (dashboard.canEditPanel(panel)) {\n          updatedState.editPanel = panel;\n          updatedState.rememberScrollTop = state.scrollElement?.scrollTop;\n        } else {\n          updatedState.editPanelAccessDenied = true;\n        }\n      } else {\n        updatedState.panelNotFound = true;\n      }\n    }\n    // Leaving edit mode\n    else if (state.editPanel && !urlEditPanelId) {\n      updatedState.editPanel = null;\n      updatedState.updateScrollTop = state.rememberScrollTop;\n    }\n\n    // Entering view mode\n    if (!state.viewPanel && urlViewPanelId) {\n      const panel = dashboard.getPanelByUrlId(urlViewPanelId);\n      if (panel) {\n        // This mutable state feels wrong to have in getDerivedStateFromProps\n        // Should move this state out of dashboard in the future\n        dashboard.initViewPanel(panel);\n        updatedState.viewPanel = panel;\n        updatedState.rememberScrollTop = state.scrollElement?.scrollTop;\n        updatedState.updateScrollTop = 0;\n      } else {\n        updatedState.panelNotFound = true;\n      }\n    }\n    // Leaving view mode\n    else if (state.viewPanel && !urlViewPanelId) {\n      // This mutable state feels wrong to have in getDerivedStateFromProps\n      // Should move this state out of dashboard in the future\n      dashboard.exitViewPanel(state.viewPanel);\n      updatedState.viewPanel = null;\n      updatedState.updateScrollTop = state.rememberScrollTop;\n    }\n\n    // if we removed url edit state, clear any panel not found state\n    if (state.panelNotFound || (state.editPanelAccessDenied && !urlEditPanelId)) {\n      updatedState.panelNotFound = false;\n      updatedState.editPanelAccessDenied = false;\n    }\n\n    return updateStatePageNavFromProps(props, updatedState);\n  }\n\n  onAddPanel = () => {\n    const { dashboard } = this.props;\n\n    if (!dashboard) {\n      return;\n    }\n\n    // Return if the \"Add panel\" exists already\n    if (dashboard.panels.length > 0 && dashboard.panels[0].type === 'add-panel') {\n      return;\n    }\n\n    // Move all panels down by the height of the \"add panel\" widget.\n    // This is to work around an issue with react-grid-layout that can mess up the layout\n    // in certain configurations. (See https://github.com/react-grid-layout/react-grid-layout/issues/1787)\n    const addPanelWidgetHeight = 8;\n    for (const panel of dashboard.panelIterator()) {\n      panel.gridPos.y += addPanelWidgetHeight;\n    }\n\n    dashboard.addPanel({\n      type: 'add-panel',\n      gridPos: { x: 0, y: 0, w: 12, h: addPanelWidgetHeight },\n      title: 'Panel Title',\n    });\n\n    // scroll to top after adding panel\n    this.setState({ updateScrollTop: 0 });\n  };\n\n  setScrollRef = (scrollElement: HTMLDivElement): void => {\n    this.setState({ scrollElement });\n  };\n\n  getInspectPanel() {\n    const { dashboard, queryParams } = this.props;\n\n    const inspectPanelId = queryParams.inspect;\n\n    if (!dashboard || !inspectPanelId) {\n      return null;\n    }\n\n    const inspectPanel = dashboard.getPanelById(parseInt(inspectPanelId, 10));\n\n    // cannot inspect panels plugin is not already loaded\n    if (!inspectPanel) {\n      return null;\n    }\n\n    return inspectPanel;\n  }\n\n  render() {\n    const { dashboard, initError, queryParams, isPublic } = this.props;\n    const { editPanel, viewPanel, updateScrollTop, pageNav, sectionNav } = this.state;\n    const kioskMode = !isPublic ? getKioskMode(this.props.queryParams) : KioskMode.Full;\n\n    if (!dashboard || !pageNav || !sectionNav) {\n      return <DashboardLoading initPhase={this.props.initPhase} />;\n    }\n\n    const inspectPanel = this.getInspectPanel();\n    const showSubMenu = !editPanel && !kioskMode && !this.props.queryParams.editview;\n\n    const toolbar = kioskMode !== KioskMode.Full && !queryParams.editview && (\n      <header data-testid={selectors.pages.Dashboard.DashNav.navV2}>\n        <DashNav\n          dashboard={dashboard}\n          title={dashboard.title}\n          folderTitle={dashboard.meta.folderTitle}\n          isFullscreen={!!viewPanel}\n          onAddPanel={this.onAddPanel}\n          kioskMode={kioskMode}\n          hideTimePicker={dashboard.timepicker.hidden}\n          shareModalActiveTab={this.props.queryParams.shareView}\n        />\n      </header>\n    );\n\n    const pageClassName = cx({\n      'panel-in-fullscreen': Boolean(viewPanel),\n      'page-hidden': Boolean(queryParams.editview || editPanel),\n    });\n\n    return (\n      <>\n        <Page\n          navModel={sectionNav}\n          pageNav={pageNav}\n          layout={PageLayoutType.Canvas}\n          toolbar={toolbar}\n          className={pageClassName}\n          scrollRef={this.setScrollRef}\n          scrollTop={updateScrollTop}\n        >\n          <DashboardPrompt dashboard={dashboard} />\n\n          {initError && <DashboardFailed />}\n          {showSubMenu && (\n            <section aria-label={selectors.pages.Dashboard.SubMenu.submenu}>\n              <SubMenu dashboard={dashboard} annotations={dashboard.annotations.list} links={dashboard.links} />\n            </section>\n          )}\n\n          <DashboardGrid\n            dashboard={dashboard}\n            isEditable={!!dashboard.meta.canEdit}\n            viewPanel={viewPanel}\n            editPanel={editPanel}\n          />\n\n          {inspectPanel && <PanelInspector dashboard={dashboard} panel={inspectPanel} />}\n        </Page>\n        {editPanel && (\n          <PanelEditor\n            dashboard={dashboard}\n            sourcePanel={editPanel}\n            tab={this.props.queryParams.tab}\n            sectionNav={sectionNav}\n            pageNav={pageNav}\n          />\n        )}\n        {queryParams.editview && (\n          <DashboardSettings\n            dashboard={dashboard}\n            editview={queryParams.editview}\n            pageNav={pageNav}\n            sectionNav={sectionNav}\n          />\n        )}\n        {\n          // TODO: assess if there are other places where we may want a footer, which may reveal a better place to add this\n          isPublic && <PublicDashboardFooter />\n        }\n      </>\n    );\n  }\n}\n\nfunction updateStatePageNavFromProps(props: Props, state: State): State {\n  const { dashboard } = props;\n\n  if (!dashboard) {\n    return state;\n  }\n\n  let pageNav = state.pageNav;\n  let sectionNav = state.sectionNav;\n\n  if (!pageNav || dashboard.title !== pageNav.text) {\n    pageNav = {\n      text: dashboard.title,\n      url: locationUtil.getUrlForPartial(props.history.location, {\n        editview: null,\n        editPanel: null,\n        viewPanel: null,\n      }),\n    };\n  }\n\n  // Check if folder changed\n  const { folderTitle, folderUid } = dashboard.meta;\n  if (folderTitle && folderUid && pageNav && pageNav.parentItem?.text !== folderTitle) {\n    pageNav = {\n      ...pageNav,\n      parentItem: {\n        text: folderTitle,\n        url: `/dashboards/f/${dashboard.meta.folderUid}`,\n      },\n    };\n  }\n\n  if (props.route.routeName === DashboardRoutes.Path) {\n    sectionNav = getRootContentNavModel();\n    const pageNav = getPageNavFromSlug(props.match.params.slug!);\n    if (pageNav?.parentItem) {\n      pageNav.parentItem = pageNav.parentItem;\n    }\n  } else {\n    sectionNav = getNavModel(props.navIndex, config.featureToggles.topnav ? 'dashboards/browse' : 'dashboards');\n  }\n\n  if (state.editPanel || state.viewPanel) {\n    pageNav = {\n      ...pageNav,\n      text: `${state.editPanel ? 'Edit' : 'View'} panel`,\n      parentItem: pageNav,\n      url: undefined,\n    };\n  }\n\n  if (state.pageNav === pageNav && state.sectionNav === sectionNav) {\n    return state;\n  }\n\n  return {\n    ...state,\n    pageNav,\n    sectionNav,\n  };\n}\n\nexport const DashboardPage = withTheme2(UnthemedDashboardPage);\nDashboardPage.displayName = 'DashboardPage';\nexport default connector(DashboardPage);\n","import React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { DataFrame, NavModel, NavModelItem } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Alert, Card, Icon, Spinner } from '@grafana/ui';\nimport { Page } from 'app/core/components/Page/Page';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\n\nimport { getGrafanaStorage } from './storage';\n\nexport interface Props extends GrafanaRouteComponentProps<{ slug: string }> {}\n\nexport function StorageFolderPage(props: Props) {\n  const slug = props.match.params.slug ?? '';\n  const listing = useAsync((): Promise<DataFrame | undefined> => {\n    return getGrafanaStorage().list('content/' + slug);\n  }, [slug]);\n\n  const childRoot = slug.length > 0 ? `g/${slug}/` : 'g/';\n  const pageNav = getPageNavFromSlug(slug);\n\n  const renderListing = () => {\n    if (listing.value) {\n      const names = listing.value.fields[0].values.toArray();\n      return names.map((item: string) => {\n        let name = item;\n        const isFolder = name.indexOf('.') < 0;\n        const isDash = !isFolder && name.endsWith('.json');\n        const url = `${childRoot}${name}`;\n\n        return (\n          <Card key={name} href={isFolder || isDash ? url : undefined}>\n            <Card.Heading>{name}</Card.Heading>\n            <Card.Figure>\n              <Icon name={isFolder ? 'folder' : isDash ? 'gf-grid' : 'file-alt'} size=\"sm\" />\n            </Card.Figure>\n          </Card>\n        );\n      });\n    }\n    if (listing.loading) {\n      return <Spinner />;\n    }\n    return <div>?</div>;\n  };\n\n  const navModel = getRootContentNavModel();\n\n  return (\n    <Page navModel={navModel} pageNav={pageNav}>\n      {!config.featureToggles.topnav && (\n        <div>\n          <Alert title=\"Enable the topnav feature toggle\">This page is designed assuming topnav is enabled</Alert>\n        </div>\n      )}\n      {renderListing()}\n    </Page>\n  );\n}\n\nexport function getPageNavFromSlug(slug: string) {\n  const parts = slug.split('/');\n  let pageNavs: NavModelItem[] = [];\n  let url = 'g';\n  let lastPageNav: NavModelItem | undefined;\n\n  for (let i = 0; i < parts.length; i++) {\n    url += `/${parts[i]}`;\n    pageNavs.push({ text: parts[i], url, parentItem: lastPageNav });\n    lastPageNav = pageNavs[pageNavs.length - 1];\n  }\n\n  return lastPageNav;\n}\n\nexport function getRootContentNavModel(): NavModel {\n  return { main: { text: 'C:' }, node: { text: 'Content', url: '/g' } };\n}\n\nexport default StorageFolderPage;\n","// GENERATED DO NOT EDIT\nmodule.exports = [\n  \"alignContent\",\n  \"MozAlignContent\",\n  \"WebkitAlignContent\",\n  \"MSAlignContent\",\n  \"OAlignContent\",\n  \"alignItems\",\n  \"MozAlignItems\",\n  \"WebkitAlignItems\",\n  \"MSAlignItems\",\n  \"OAlignItems\",\n  \"alignSelf\",\n  \"MozAlignSelf\",\n  \"WebkitAlignSelf\",\n  \"MSAlignSelf\",\n  \"OAlignSelf\",\n  \"all\",\n  \"MozAll\",\n  \"WebkitAll\",\n  \"MSAll\",\n  \"OAll\",\n  \"animation\",\n  \"MozAnimation\",\n  \"WebkitAnimation\",\n  \"MSAnimation\",\n  \"OAnimation\",\n  \"animationDelay\",\n  \"MozAnimationDelay\",\n  \"WebkitAnimationDelay\",\n  \"MSAnimationDelay\",\n  \"OAnimationDelay\",\n  \"animationDirection\",\n  \"MozAnimationDirection\",\n  \"WebkitAnimationDirection\",\n  \"MSAnimationDirection\",\n  \"OAnimationDirection\",\n  \"animationDuration\",\n  \"MozAnimationDuration\",\n  \"WebkitAnimationDuration\",\n  \"MSAnimationDuration\",\n  \"OAnimationDuration\",\n  \"animationFillMode\",\n  \"MozAnimationFillMode\",\n  \"WebkitAnimationFillMode\",\n  \"MSAnimationFillMode\",\n  \"OAnimationFillMode\",\n  \"animationIterationCount\",\n  \"MozAnimationIterationCount\",\n  \"WebkitAnimationIterationCount\",\n  \"MSAnimationIterationCount\",\n  \"OAnimationIterationCount\",\n  \"animationName\",\n  \"MozAnimationName\",\n  \"WebkitAnimationName\",\n  \"MSAnimationName\",\n  \"OAnimationName\",\n  \"animationPlayState\",\n  \"MozAnimationPlayState\",\n  \"WebkitAnimationPlayState\",\n  \"MSAnimationPlayState\",\n  \"OAnimationPlayState\",\n  \"animationTimingFunction\",\n  \"MozAnimationTimingFunction\",\n  \"WebkitAnimationTimingFunction\",\n  \"MSAnimationTimingFunction\",\n  \"OAnimationTimingFunction\",\n  \"backfaceVisibility\",\n  \"MozBackfaceVisibility\",\n  \"WebkitBackfaceVisibility\",\n  \"MSBackfaceVisibility\",\n  \"OBackfaceVisibility\",\n  \"background\",\n  \"MozBackground\",\n  \"WebkitBackground\",\n  \"MSBackground\",\n  \"OBackground\",\n  \"backgroundAttachment\",\n  \"MozBackgroundAttachment\",\n  \"WebkitBackgroundAttachment\",\n  \"MSBackgroundAttachment\",\n  \"OBackgroundAttachment\",\n  \"backgroundBlendMode\",\n  \"MozBackgroundBlendMode\",\n  \"WebkitBackgroundBlendMode\",\n  \"MSBackgroundBlendMode\",\n  \"OBackgroundBlendMode\",\n  \"backgroundClip\",\n  \"MozBackgroundClip\",\n  \"WebkitBackgroundClip\",\n  \"MSBackgroundClip\",\n  \"OBackgroundClip\",\n  \"backgroundColor\",\n  \"MozBackgroundColor\",\n  \"WebkitBackgroundColor\",\n  \"MSBackgroundColor\",\n  \"OBackgroundColor\",\n  \"backgroundImage\",\n  \"MozBackgroundImage\",\n  \"WebkitBackgroundImage\",\n  \"MSBackgroundImage\",\n  \"OBackgroundImage\",\n  \"backgroundOrigin\",\n  \"MozBackgroundOrigin\",\n  \"WebkitBackgroundOrigin\",\n  \"MSBackgroundOrigin\",\n  \"OBackgroundOrigin\",\n  \"backgroundPosition\",\n  \"MozBackgroundPosition\",\n  \"WebkitBackgroundPosition\",\n  \"MSBackgroundPosition\",\n  \"OBackgroundPosition\",\n  \"backgroundRepeat\",\n  \"MozBackgroundRepeat\",\n  \"WebkitBackgroundRepeat\",\n  \"MSBackgroundRepeat\",\n  \"OBackgroundRepeat\",\n  \"backgroundSize\",\n  \"MozBackgroundSize\",\n  \"WebkitBackgroundSize\",\n  \"MSBackgroundSize\",\n  \"OBackgroundSize\",\n  \"blockSize\",\n  \"MozBlockSize\",\n  \"WebkitBlockSize\",\n  \"MSBlockSize\",\n  \"OBlockSize\",\n  \"border\",\n  \"MozBorder\",\n  \"WebkitBorder\",\n  \"MSBorder\",\n  \"OBorder\",\n  \"borderBlockEnd\",\n  \"MozBorderBlockEnd\",\n  \"WebkitBorderBlockEnd\",\n  \"MSBorderBlockEnd\",\n  \"OBorderBlockEnd\",\n  \"borderBlockEndColor\",\n  \"MozBorderBlockEndColor\",\n  \"WebkitBorderBlockEndColor\",\n  \"MSBorderBlockEndColor\",\n  \"OBorderBlockEndColor\",\n  \"borderBlockEndStyle\",\n  \"MozBorderBlockEndStyle\",\n  \"WebkitBorderBlockEndStyle\",\n  \"MSBorderBlockEndStyle\",\n  \"OBorderBlockEndStyle\",\n  \"borderBlockEndWidth\",\n  \"MozBorderBlockEndWidth\",\n  \"WebkitBorderBlockEndWidth\",\n  \"MSBorderBlockEndWidth\",\n  \"OBorderBlockEndWidth\",\n  \"borderBlockStart\",\n  \"MozBorderBlockStart\",\n  \"WebkitBorderBlockStart\",\n  \"MSBorderBlockStart\",\n  \"OBorderBlockStart\",\n  \"borderBlockStartColor\",\n  \"MozBorderBlockStartColor\",\n  \"WebkitBorderBlockStartColor\",\n  \"MSBorderBlockStartColor\",\n  \"OBorderBlockStartColor\",\n  \"borderBlockStartStyle\",\n  \"MozBorderBlockStartStyle\",\n  \"WebkitBorderBlockStartStyle\",\n  \"MSBorderBlockStartStyle\",\n  \"OBorderBlockStartStyle\",\n  \"borderBlockStartWidth\",\n  \"MozBorderBlockStartWidth\",\n  \"WebkitBorderBlockStartWidth\",\n  \"MSBorderBlockStartWidth\",\n  \"OBorderBlockStartWidth\",\n  \"borderBottom\",\n  \"MozBorderBottom\",\n  \"WebkitBorderBottom\",\n  \"MSBorderBottom\",\n  \"OBorderBottom\",\n  \"borderBottomColor\",\n  \"MozBorderBottomColor\",\n  \"WebkitBorderBottomColor\",\n  \"MSBorderBottomColor\",\n  \"OBorderBottomColor\",\n  \"borderBottomLeftRadius\",\n  \"MozBorderBottomLeftRadius\",\n  \"WebkitBorderBottomLeftRadius\",\n  \"MSBorderBottomLeftRadius\",\n  \"OBorderBottomLeftRadius\",\n  \"borderBottomRightRadius\",\n  \"MozBorderBottomRightRadius\",\n  \"WebkitBorderBottomRightRadius\",\n  \"MSBorderBottomRightRadius\",\n  \"OBorderBottomRightRadius\",\n  \"borderBottomStyle\",\n  \"MozBorderBottomStyle\",\n  \"WebkitBorderBottomStyle\",\n  \"MSBorderBottomStyle\",\n  \"OBorderBottomStyle\",\n  \"borderBottomWidth\",\n  \"MozBorderBottomWidth\",\n  \"WebkitBorderBottomWidth\",\n  \"MSBorderBottomWidth\",\n  \"OBorderBottomWidth\",\n  \"borderCollapse\",\n  \"MozBorderCollapse\",\n  \"WebkitBorderCollapse\",\n  \"MSBorderCollapse\",\n  \"OBorderCollapse\",\n  \"borderColor\",\n  \"MozBorderColor\",\n  \"WebkitBorderColor\",\n  \"MSBorderColor\",\n  \"OBorderColor\",\n  \"borderImage\",\n  \"MozBorderImage\",\n  \"WebkitBorderImage\",\n  \"MSBorderImage\",\n  \"OBorderImage\",\n  \"borderImageOutset\",\n  \"MozBorderImageOutset\",\n  \"WebkitBorderImageOutset\",\n  \"MSBorderImageOutset\",\n  \"OBorderImageOutset\",\n  \"borderImageRepeat\",\n  \"MozBorderImageRepeat\",\n  \"WebkitBorderImageRepeat\",\n  \"MSBorderImageRepeat\",\n  \"OBorderImageRepeat\",\n  \"borderImageSlice\",\n  \"MozBorderImageSlice\",\n  \"WebkitBorderImageSlice\",\n  \"MSBorderImageSlice\",\n  \"OBorderImageSlice\",\n  \"borderImageSource\",\n  \"MozBorderImageSource\",\n  \"WebkitBorderImageSource\",\n  \"MSBorderImageSource\",\n  \"OBorderImageSource\",\n  \"borderImageWidth\",\n  \"MozBorderImageWidth\",\n  \"WebkitBorderImageWidth\",\n  \"MSBorderImageWidth\",\n  \"OBorderImageWidth\",\n  \"borderInlineEnd\",\n  \"MozBorderInlineEnd\",\n  \"WebkitBorderInlineEnd\",\n  \"MSBorderInlineEnd\",\n  \"OBorderInlineEnd\",\n  \"borderInlineEndColor\",\n  \"MozBorderInlineEndColor\",\n  \"WebkitBorderInlineEndColor\",\n  \"MSBorderInlineEndColor\",\n  \"OBorderInlineEndColor\",\n  \"borderInlineEndStyle\",\n  \"MozBorderInlineEndStyle\",\n  \"WebkitBorderInlineEndStyle\",\n  \"MSBorderInlineEndStyle\",\n  \"OBorderInlineEndStyle\",\n  \"borderInlineEndWidth\",\n  \"MozBorderInlineEndWidth\",\n  \"WebkitBorderInlineEndWidth\",\n  \"MSBorderInlineEndWidth\",\n  \"OBorderInlineEndWidth\",\n  \"borderInlineStart\",\n  \"MozBorderInlineStart\",\n  \"WebkitBorderInlineStart\",\n  \"MSBorderInlineStart\",\n  \"OBorderInlineStart\",\n  \"borderInlineStartColor\",\n  \"MozBorderInlineStartColor\",\n  \"WebkitBorderInlineStartColor\",\n  \"MSBorderInlineStartColor\",\n  \"OBorderInlineStartColor\",\n  \"borderInlineStartStyle\",\n  \"MozBorderInlineStartStyle\",\n  \"WebkitBorderInlineStartStyle\",\n  \"MSBorderInlineStartStyle\",\n  \"OBorderInlineStartStyle\",\n  \"borderInlineStartWidth\",\n  \"MozBorderInlineStartWidth\",\n  \"WebkitBorderInlineStartWidth\",\n  \"MSBorderInlineStartWidth\",\n  \"OBorderInlineStartWidth\",\n  \"borderLeft\",\n  \"MozBorderLeft\",\n  \"WebkitBorderLeft\",\n  \"MSBorderLeft\",\n  \"OBorderLeft\",\n  \"borderLeftColor\",\n  \"MozBorderLeftColor\",\n  \"WebkitBorderLeftColor\",\n  \"MSBorderLeftColor\",\n  \"OBorderLeftColor\",\n  \"borderLeftStyle\",\n  \"MozBorderLeftStyle\",\n  \"WebkitBorderLeftStyle\",\n  \"MSBorderLeftStyle\",\n  \"OBorderLeftStyle\",\n  \"borderLeftWidth\",\n  \"MozBorderLeftWidth\",\n  \"WebkitBorderLeftWidth\",\n  \"MSBorderLeftWidth\",\n  \"OBorderLeftWidth\",\n  \"borderRadius\",\n  \"MozBorderRadius\",\n  \"WebkitBorderRadius\",\n  \"MSBorderRadius\",\n  \"OBorderRadius\",\n  \"borderRight\",\n  \"MozBorderRight\",\n  \"WebkitBorderRight\",\n  \"MSBorderRight\",\n  \"OBorderRight\",\n  \"borderRightColor\",\n  \"MozBorderRightColor\",\n  \"WebkitBorderRightColor\",\n  \"MSBorderRightColor\",\n  \"OBorderRightColor\",\n  \"borderRightStyle\",\n  \"MozBorderRightStyle\",\n  \"WebkitBorderRightStyle\",\n  \"MSBorderRightStyle\",\n  \"OBorderRightStyle\",\n  \"borderRightWidth\",\n  \"MozBorderRightWidth\",\n  \"WebkitBorderRightWidth\",\n  \"MSBorderRightWidth\",\n  \"OBorderRightWidth\",\n  \"borderSpacing\",\n  \"MozBorderSpacing\",\n  \"WebkitBorderSpacing\",\n  \"MSBorderSpacing\",\n  \"OBorderSpacing\",\n  \"borderStyle\",\n  \"MozBorderStyle\",\n  \"WebkitBorderStyle\",\n  \"MSBorderStyle\",\n  \"OBorderStyle\",\n  \"borderTop\",\n  \"MozBorderTop\",\n  \"WebkitBorderTop\",\n  \"MSBorderTop\",\n  \"OBorderTop\",\n  \"borderTopColor\",\n  \"MozBorderTopColor\",\n  \"WebkitBorderTopColor\",\n  \"MSBorderTopColor\",\n  \"OBorderTopColor\",\n  \"borderTopLeftRadius\",\n  \"MozBorderTopLeftRadius\",\n  \"WebkitBorderTopLeftRadius\",\n  \"MSBorderTopLeftRadius\",\n  \"OBorderTopLeftRadius\",\n  \"borderTopRightRadius\",\n  \"MozBorderTopRightRadius\",\n  \"WebkitBorderTopRightRadius\",\n  \"MSBorderTopRightRadius\",\n  \"OBorderTopRightRadius\",\n  \"borderTopStyle\",\n  \"MozBorderTopStyle\",\n  \"WebkitBorderTopStyle\",\n  \"MSBorderTopStyle\",\n  \"OBorderTopStyle\",\n  \"borderTopWidth\",\n  \"MozBorderTopWidth\",\n  \"WebkitBorderTopWidth\",\n  \"MSBorderTopWidth\",\n  \"OBorderTopWidth\",\n  \"borderWidth\",\n  \"MozBorderWidth\",\n  \"WebkitBorderWidth\",\n  \"MSBorderWidth\",\n  \"OBorderWidth\",\n  \"bottom\",\n  \"MozBottom\",\n  \"WebkitBottom\",\n  \"MSBottom\",\n  \"OBottom\",\n  \"boxDecorationBreak\",\n  \"MozBoxDecorationBreak\",\n  \"WebkitBoxDecorationBreak\",\n  \"MSBoxDecorationBreak\",\n  \"OBoxDecorationBreak\",\n  \"boxShadow\",\n  \"MozBoxShadow\",\n  \"WebkitBoxShadow\",\n  \"MSBoxShadow\",\n  \"OBoxShadow\",\n  \"boxSizing\",\n  \"MozBoxSizing\",\n  \"WebkitBoxSizing\",\n  \"MSBoxSizing\",\n  \"OBoxSizing\",\n  \"breakAfter\",\n  \"MozBreakAfter\",\n  \"WebkitBreakAfter\",\n  \"MSBreakAfter\",\n  \"OBreakAfter\",\n  \"breakBefore\",\n  \"MozBreakBefore\",\n  \"WebkitBreakBefore\",\n  \"MSBreakBefore\",\n  \"OBreakBefore\",\n  \"breakInside\",\n  \"MozBreakInside\",\n  \"WebkitBreakInside\",\n  \"MSBreakInside\",\n  \"OBreakInside\",\n  \"captionSide\",\n  \"MozCaptionSide\",\n  \"WebkitCaptionSide\",\n  \"MSCaptionSide\",\n  \"OCaptionSide\",\n  \"caretColor\",\n  \"MozCaretColor\",\n  \"WebkitCaretColor\",\n  \"MSCaretColor\",\n  \"OCaretColor\",\n  \"ch\",\n  \"MozCh\",\n  \"WebkitCh\",\n  \"MSCh\",\n  \"OCh\",\n  \"clear\",\n  \"MozClear\",\n  \"WebkitClear\",\n  \"MSClear\",\n  \"OClear\",\n  \"clip\",\n  \"MozClip\",\n  \"WebkitClip\",\n  \"MSClip\",\n  \"OClip\",\n  \"clipPath\",\n  \"MozClipPath\",\n  \"WebkitClipPath\",\n  \"MSClipPath\",\n  \"OClipPath\",\n  \"cm\",\n  \"MozCm\",\n  \"WebkitCm\",\n  \"MSCm\",\n  \"OCm\",\n  \"color\",\n  \"MozColor\",\n  \"WebkitColor\",\n  \"MSColor\",\n  \"OColor\",\n  \"columnCount\",\n  \"MozColumnCount\",\n  \"WebkitColumnCount\",\n  \"MSColumnCount\",\n  \"OColumnCount\",\n  \"columnFill\",\n  \"MozColumnFill\",\n  \"WebkitColumnFill\",\n  \"MSColumnFill\",\n  \"OColumnFill\",\n  \"columnGap\",\n  \"MozColumnGap\",\n  \"WebkitColumnGap\",\n  \"MSColumnGap\",\n  \"OColumnGap\",\n  \"columnRule\",\n  \"MozColumnRule\",\n  \"WebkitColumnRule\",\n  \"MSColumnRule\",\n  \"OColumnRule\",\n  \"columnRuleColor\",\n  \"MozColumnRuleColor\",\n  \"WebkitColumnRuleColor\",\n  \"MSColumnRuleColor\",\n  \"OColumnRuleColor\",\n  \"columnRuleStyle\",\n  \"MozColumnRuleStyle\",\n  \"WebkitColumnRuleStyle\",\n  \"MSColumnRuleStyle\",\n  \"OColumnRuleStyle\",\n  \"columnRuleWidth\",\n  \"MozColumnRuleWidth\",\n  \"WebkitColumnRuleWidth\",\n  \"MSColumnRuleWidth\",\n  \"OColumnRuleWidth\",\n  \"columnSpan\",\n  \"MozColumnSpan\",\n  \"WebkitColumnSpan\",\n  \"MSColumnSpan\",\n  \"OColumnSpan\",\n  \"columnWidth\",\n  \"MozColumnWidth\",\n  \"WebkitColumnWidth\",\n  \"MSColumnWidth\",\n  \"OColumnWidth\",\n  \"columns\",\n  \"MozColumns\",\n  \"WebkitColumns\",\n  \"MSColumns\",\n  \"OColumns\",\n  \"content\",\n  \"MozContent\",\n  \"WebkitContent\",\n  \"MSContent\",\n  \"OContent\",\n  \"counterIncrement\",\n  \"MozCounterIncrement\",\n  \"WebkitCounterIncrement\",\n  \"MSCounterIncrement\",\n  \"OCounterIncrement\",\n  \"counterReset\",\n  \"MozCounterReset\",\n  \"WebkitCounterReset\",\n  \"MSCounterReset\",\n  \"OCounterReset\",\n  \"cursor\",\n  \"MozCursor\",\n  \"WebkitCursor\",\n  \"MSCursor\",\n  \"OCursor\",\n  \"deg\",\n  \"MozDeg\",\n  \"WebkitDeg\",\n  \"MSDeg\",\n  \"ODeg\",\n  \"direction\",\n  \"MozDirection\",\n  \"WebkitDirection\",\n  \"MSDirection\",\n  \"ODirection\",\n  \"display\",\n  \"MozDisplay\",\n  \"WebkitDisplay\",\n  \"MSDisplay\",\n  \"ODisplay\",\n  \"dpcm\",\n  \"MozDpcm\",\n  \"WebkitDpcm\",\n  \"MSDpcm\",\n  \"ODpcm\",\n  \"dpi\",\n  \"MozDpi\",\n  \"WebkitDpi\",\n  \"MSDpi\",\n  \"ODpi\",\n  \"dppx\",\n  \"MozDppx\",\n  \"WebkitDppx\",\n  \"MSDppx\",\n  \"ODppx\",\n  \"em\",\n  \"MozEm\",\n  \"WebkitEm\",\n  \"MSEm\",\n  \"OEm\",\n  \"emptyCells\",\n  \"MozEmptyCells\",\n  \"WebkitEmptyCells\",\n  \"MSEmptyCells\",\n  \"OEmptyCells\",\n  \"ex\",\n  \"MozEx\",\n  \"WebkitEx\",\n  \"MSEx\",\n  \"OEx\",\n  \"filter\",\n  \"MozFilter\",\n  \"WebkitFilter\",\n  \"MSFilter\",\n  \"OFilter\",\n  \"flexBasis\",\n  \"MozFlexBasis\",\n  \"WebkitFlexBasis\",\n  \"MSFlexBasis\",\n  \"OFlexBasis\",\n  \"flexDirection\",\n  \"MozFlexDirection\",\n  \"WebkitFlexDirection\",\n  \"MSFlexDirection\",\n  \"OFlexDirection\",\n  \"flexFlow\",\n  \"MozFlexFlow\",\n  \"WebkitFlexFlow\",\n  \"MSFlexFlow\",\n  \"OFlexFlow\",\n  \"flexGrow\",\n  \"MozFlexGrow\",\n  \"WebkitFlexGrow\",\n  \"MSFlexGrow\",\n  \"OFlexGrow\",\n  \"flexShrink\",\n  \"MozFlexShrink\",\n  \"WebkitFlexShrink\",\n  \"MSFlexShrink\",\n  \"OFlexShrink\",\n  \"flexWrap\",\n  \"MozFlexWrap\",\n  \"WebkitFlexWrap\",\n  \"MSFlexWrap\",\n  \"OFlexWrap\",\n  \"float\",\n  \"MozFloat\",\n  \"WebkitFloat\",\n  \"MSFloat\",\n  \"OFloat\",\n  \"font\",\n  \"MozFont\",\n  \"WebkitFont\",\n  \"MSFont\",\n  \"OFont\",\n  \"fontFamily\",\n  \"MozFontFamily\",\n  \"WebkitFontFamily\",\n  \"MSFontFamily\",\n  \"OFontFamily\",\n  \"fontFeatureSettings\",\n  \"MozFontFeatureSettings\",\n  \"WebkitFontFeatureSettings\",\n  \"MSFontFeatureSettings\",\n  \"OFontFeatureSettings\",\n  \"fontKerning\",\n  \"MozFontKerning\",\n  \"WebkitFontKerning\",\n  \"MSFontKerning\",\n  \"OFontKerning\",\n  \"fontLanguageOverride\",\n  \"MozFontLanguageOverride\",\n  \"WebkitFontLanguageOverride\",\n  \"MSFontLanguageOverride\",\n  \"OFontLanguageOverride\",\n  \"fontSize\",\n  \"MozFontSize\",\n  \"WebkitFontSize\",\n  \"MSFontSize\",\n  \"OFontSize\",\n  \"fontSizeAdjust\",\n  \"MozFontSizeAdjust\",\n  \"WebkitFontSizeAdjust\",\n  \"MSFontSizeAdjust\",\n  \"OFontSizeAdjust\",\n  \"fontStretch\",\n  \"MozFontStretch\",\n  \"WebkitFontStretch\",\n  \"MSFontStretch\",\n  \"OFontStretch\",\n  \"fontStyle\",\n  \"MozFontStyle\",\n  \"WebkitFontStyle\",\n  \"MSFontStyle\",\n  \"OFontStyle\",\n  \"fontSynthesis\",\n  \"MozFontSynthesis\",\n  \"WebkitFontSynthesis\",\n  \"MSFontSynthesis\",\n  \"OFontSynthesis\",\n  \"fontVariant\",\n  \"MozFontVariant\",\n  \"WebkitFontVariant\",\n  \"MSFontVariant\",\n  \"OFontVariant\",\n  \"fontVariantAlternates\",\n  \"MozFontVariantAlternates\",\n  \"WebkitFontVariantAlternates\",\n  \"MSFontVariantAlternates\",\n  \"OFontVariantAlternates\",\n  \"fontVariantCaps\",\n  \"MozFontVariantCaps\",\n  \"WebkitFontVariantCaps\",\n  \"MSFontVariantCaps\",\n  \"OFontVariantCaps\",\n  \"fontVariantEastAsian\",\n  \"MozFontVariantEastAsian\",\n  \"WebkitFontVariantEastAsian\",\n  \"MSFontVariantEastAsian\",\n  \"OFontVariantEastAsian\",\n  \"fontVariantLigatures\",\n  \"MozFontVariantLigatures\",\n  \"WebkitFontVariantLigatures\",\n  \"MSFontVariantLigatures\",\n  \"OFontVariantLigatures\",\n  \"fontVariantNumeric\",\n  \"MozFontVariantNumeric\",\n  \"WebkitFontVariantNumeric\",\n  \"MSFontVariantNumeric\",\n  \"OFontVariantNumeric\",\n  \"fontVariantPosition\",\n  \"MozFontVariantPosition\",\n  \"WebkitFontVariantPosition\",\n  \"MSFontVariantPosition\",\n  \"OFontVariantPosition\",\n  \"fontWeight\",\n  \"MozFontWeight\",\n  \"WebkitFontWeight\",\n  \"MSFontWeight\",\n  \"OFontWeight\",\n  \"fr\",\n  \"MozFr\",\n  \"WebkitFr\",\n  \"MSFr\",\n  \"OFr\",\n  \"grad\",\n  \"MozGrad\",\n  \"WebkitGrad\",\n  \"MSGrad\",\n  \"OGrad\",\n  \"grid\",\n  \"MozGrid\",\n  \"WebkitGrid\",\n  \"MSGrid\",\n  \"OGrid\",\n  \"gridArea\",\n  \"MozGridArea\",\n  \"WebkitGridArea\",\n  \"MSGridArea\",\n  \"OGridArea\",\n  \"gridAutoColumns\",\n  \"MozGridAutoColumns\",\n  \"WebkitGridAutoColumns\",\n  \"MSGridAutoColumns\",\n  \"OGridAutoColumns\",\n  \"gridAutoFlow\",\n  \"MozGridAutoFlow\",\n  \"WebkitGridAutoFlow\",\n  \"MSGridAutoFlow\",\n  \"OGridAutoFlow\",\n  \"gridAutoRows\",\n  \"MozGridAutoRows\",\n  \"WebkitGridAutoRows\",\n  \"MSGridAutoRows\",\n  \"OGridAutoRows\",\n  \"gridColumn\",\n  \"MozGridColumn\",\n  \"WebkitGridColumn\",\n  \"MSGridColumn\",\n  \"OGridColumn\",\n  \"gridColumnEnd\",\n  \"MozGridColumnEnd\",\n  \"WebkitGridColumnEnd\",\n  \"MSGridColumnEnd\",\n  \"OGridColumnEnd\",\n  \"gridColumnGap\",\n  \"MozGridColumnGap\",\n  \"WebkitGridColumnGap\",\n  \"MSGridColumnGap\",\n  \"OGridColumnGap\",\n  \"gridColumnStart\",\n  \"MozGridColumnStart\",\n  \"WebkitGridColumnStart\",\n  \"MSGridColumnStart\",\n  \"OGridColumnStart\",\n  \"gridGap\",\n  \"MozGridGap\",\n  \"WebkitGridGap\",\n  \"MSGridGap\",\n  \"OGridGap\",\n  \"gridRow\",\n  \"MozGridRow\",\n  \"WebkitGridRow\",\n  \"MSGridRow\",\n  \"OGridRow\",\n  \"gridRowEnd\",\n  \"MozGridRowEnd\",\n  \"WebkitGridRowEnd\",\n  \"MSGridRowEnd\",\n  \"OGridRowEnd\",\n  \"gridRowGap\",\n  \"MozGridRowGap\",\n  \"WebkitGridRowGap\",\n  \"MSGridRowGap\",\n  \"OGridRowGap\",\n  \"gridRowStart\",\n  \"MozGridRowStart\",\n  \"WebkitGridRowStart\",\n  \"MSGridRowStart\",\n  \"OGridRowStart\",\n  \"gridTemplate\",\n  \"MozGridTemplate\",\n  \"WebkitGridTemplate\",\n  \"MSGridTemplate\",\n  \"OGridTemplate\",\n  \"gridTemplateAreas\",\n  \"MozGridTemplateAreas\",\n  \"WebkitGridTemplateAreas\",\n  \"MSGridTemplateAreas\",\n  \"OGridTemplateAreas\",\n  \"gridTemplateColumns\",\n  \"MozGridTemplateColumns\",\n  \"WebkitGridTemplateColumns\",\n  \"MSGridTemplateColumns\",\n  \"OGridTemplateColumns\",\n  \"gridTemplateRows\",\n  \"MozGridTemplateRows\",\n  \"WebkitGridTemplateRows\",\n  \"MSGridTemplateRows\",\n  \"OGridTemplateRows\",\n  \"height\",\n  \"MozHeight\",\n  \"WebkitHeight\",\n  \"MSHeight\",\n  \"OHeight\",\n  \"hyphens\",\n  \"MozHyphens\",\n  \"WebkitHyphens\",\n  \"MSHyphens\",\n  \"OHyphens\",\n  \"hz\",\n  \"MozHz\",\n  \"WebkitHz\",\n  \"MSHz\",\n  \"OHz\",\n  \"imageOrientation\",\n  \"MozImageOrientation\",\n  \"WebkitImageOrientation\",\n  \"MSImageOrientation\",\n  \"OImageOrientation\",\n  \"imageRendering\",\n  \"MozImageRendering\",\n  \"WebkitImageRendering\",\n  \"MSImageRendering\",\n  \"OImageRendering\",\n  \"imageResolution\",\n  \"MozImageResolution\",\n  \"WebkitImageResolution\",\n  \"MSImageResolution\",\n  \"OImageResolution\",\n  \"imeMode\",\n  \"MozImeMode\",\n  \"WebkitImeMode\",\n  \"MSImeMode\",\n  \"OImeMode\",\n  \"in\",\n  \"MozIn\",\n  \"WebkitIn\",\n  \"MSIn\",\n  \"OIn\",\n  \"inherit\",\n  \"MozInherit\",\n  \"WebkitInherit\",\n  \"MSInherit\",\n  \"OInherit\",\n  \"initial\",\n  \"MozInitial\",\n  \"WebkitInitial\",\n  \"MSInitial\",\n  \"OInitial\",\n  \"inlineSize\",\n  \"MozInlineSize\",\n  \"WebkitInlineSize\",\n  \"MSInlineSize\",\n  \"OInlineSize\",\n  \"isolation\",\n  \"MozIsolation\",\n  \"WebkitIsolation\",\n  \"MSIsolation\",\n  \"OIsolation\",\n  \"justifyContent\",\n  \"MozJustifyContent\",\n  \"WebkitJustifyContent\",\n  \"MSJustifyContent\",\n  \"OJustifyContent\",\n  \"khz\",\n  \"MozKhz\",\n  \"WebkitKhz\",\n  \"MSKhz\",\n  \"OKhz\",\n  \"left\",\n  \"MozLeft\",\n  \"WebkitLeft\",\n  \"MSLeft\",\n  \"OLeft\",\n  \"letterSpacing\",\n  \"MozLetterSpacing\",\n  \"WebkitLetterSpacing\",\n  \"MSLetterSpacing\",\n  \"OLetterSpacing\",\n  \"lineBreak\",\n  \"MozLineBreak\",\n  \"WebkitLineBreak\",\n  \"MSLineBreak\",\n  \"OLineBreak\",\n  \"lineHeight\",\n  \"MozLineHeight\",\n  \"WebkitLineHeight\",\n  \"MSLineHeight\",\n  \"OLineHeight\",\n  \"listStyle\",\n  \"MozListStyle\",\n  \"WebkitListStyle\",\n  \"MSListStyle\",\n  \"OListStyle\",\n  \"listStyleImage\",\n  \"MozListStyleImage\",\n  \"WebkitListStyleImage\",\n  \"MSListStyleImage\",\n  \"OListStyleImage\",\n  \"listStylePosition\",\n  \"MozListStylePosition\",\n  \"WebkitListStylePosition\",\n  \"MSListStylePosition\",\n  \"OListStylePosition\",\n  \"listStyleType\",\n  \"MozListStyleType\",\n  \"WebkitListStyleType\",\n  \"MSListStyleType\",\n  \"OListStyleType\",\n  \"margin\",\n  \"MozMargin\",\n  \"WebkitMargin\",\n  \"MSMargin\",\n  \"OMargin\",\n  \"marginBlockEnd\",\n  \"MozMarginBlockEnd\",\n  \"WebkitMarginBlockEnd\",\n  \"MSMarginBlockEnd\",\n  \"OMarginBlockEnd\",\n  \"marginBlockStart\",\n  \"MozMarginBlockStart\",\n  \"WebkitMarginBlockStart\",\n  \"MSMarginBlockStart\",\n  \"OMarginBlockStart\",\n  \"marginBottom\",\n  \"MozMarginBottom\",\n  \"WebkitMarginBottom\",\n  \"MSMarginBottom\",\n  \"OMarginBottom\",\n  \"marginInlineEnd\",\n  \"MozMarginInlineEnd\",\n  \"WebkitMarginInlineEnd\",\n  \"MSMarginInlineEnd\",\n  \"OMarginInlineEnd\",\n  \"marginInlineStart\",\n  \"MozMarginInlineStart\",\n  \"WebkitMarginInlineStart\",\n  \"MSMarginInlineStart\",\n  \"OMarginInlineStart\",\n  \"marginLeft\",\n  \"MozMarginLeft\",\n  \"WebkitMarginLeft\",\n  \"MSMarginLeft\",\n  \"OMarginLeft\",\n  \"marginRight\",\n  \"MozMarginRight\",\n  \"WebkitMarginRight\",\n  \"MSMarginRight\",\n  \"OMarginRight\",\n  \"marginTop\",\n  \"MozMarginTop\",\n  \"WebkitMarginTop\",\n  \"MSMarginTop\",\n  \"OMarginTop\",\n  \"mask\",\n  \"MozMask\",\n  \"WebkitMask\",\n  \"MSMask\",\n  \"OMask\",\n  \"maskClip\",\n  \"MozMaskClip\",\n  \"WebkitMaskClip\",\n  \"MSMaskClip\",\n  \"OMaskClip\",\n  \"maskComposite\",\n  \"MozMaskComposite\",\n  \"WebkitMaskComposite\",\n  \"MSMaskComposite\",\n  \"OMaskComposite\",\n  \"maskImage\",\n  \"MozMaskImage\",\n  \"WebkitMaskImage\",\n  \"MSMaskImage\",\n  \"OMaskImage\",\n  \"maskMode\",\n  \"MozMaskMode\",\n  \"WebkitMaskMode\",\n  \"MSMaskMode\",\n  \"OMaskMode\",\n  \"maskOrigin\",\n  \"MozMaskOrigin\",\n  \"WebkitMaskOrigin\",\n  \"MSMaskOrigin\",\n  \"OMaskOrigin\",\n  \"maskPosition\",\n  \"MozMaskPosition\",\n  \"WebkitMaskPosition\",\n  \"MSMaskPosition\",\n  \"OMaskPosition\",\n  \"maskRepeat\",\n  \"MozMaskRepeat\",\n  \"WebkitMaskRepeat\",\n  \"MSMaskRepeat\",\n  \"OMaskRepeat\",\n  \"maskSize\",\n  \"MozMaskSize\",\n  \"WebkitMaskSize\",\n  \"MSMaskSize\",\n  \"OMaskSize\",\n  \"maskType\",\n  \"MozMaskType\",\n  \"WebkitMaskType\",\n  \"MSMaskType\",\n  \"OMaskType\",\n  \"maxHeight\",\n  \"MozMaxHeight\",\n  \"WebkitMaxHeight\",\n  \"MSMaxHeight\",\n  \"OMaxHeight\",\n  \"maxWidth\",\n  \"MozMaxWidth\",\n  \"WebkitMaxWidth\",\n  \"MSMaxWidth\",\n  \"OMaxWidth\",\n  \"minBlockSize\",\n  \"MozMinBlockSize\",\n  \"WebkitMinBlockSize\",\n  \"MSMinBlockSize\",\n  \"OMinBlockSize\",\n  \"minHeight\",\n  \"MozMinHeight\",\n  \"WebkitMinHeight\",\n  \"MSMinHeight\",\n  \"OMinHeight\",\n  \"minInlineSize\",\n  \"MozMinInlineSize\",\n  \"WebkitMinInlineSize\",\n  \"MSMinInlineSize\",\n  \"OMinInlineSize\",\n  \"minWidth\",\n  \"MozMinWidth\",\n  \"WebkitMinWidth\",\n  \"MSMinWidth\",\n  \"OMinWidth\",\n  \"mixBlendMode\",\n  \"MozMixBlendMode\",\n  \"WebkitMixBlendMode\",\n  \"MSMixBlendMode\",\n  \"OMixBlendMode\",\n  \"mm\",\n  \"MozMm\",\n  \"WebkitMm\",\n  \"MSMm\",\n  \"OMm\",\n  \"ms\",\n  \"MozMs\",\n  \"WebkitMs\",\n  \"MSMs\",\n  \"OMs\",\n  \"objectFit\",\n  \"MozObjectFit\",\n  \"WebkitObjectFit\",\n  \"MSObjectFit\",\n  \"OObjectFit\",\n  \"objectPosition\",\n  \"MozObjectPosition\",\n  \"WebkitObjectPosition\",\n  \"MSObjectPosition\",\n  \"OObjectPosition\",\n  \"offsetBlockEnd\",\n  \"MozOffsetBlockEnd\",\n  \"WebkitOffsetBlockEnd\",\n  \"MSOffsetBlockEnd\",\n  \"OOffsetBlockEnd\",\n  \"offsetBlockStart\",\n  \"MozOffsetBlockStart\",\n  \"WebkitOffsetBlockStart\",\n  \"MSOffsetBlockStart\",\n  \"OOffsetBlockStart\",\n  \"offsetInlineEnd\",\n  \"MozOffsetInlineEnd\",\n  \"WebkitOffsetInlineEnd\",\n  \"MSOffsetInlineEnd\",\n  \"OOffsetInlineEnd\",\n  \"offsetInlineStart\",\n  \"MozOffsetInlineStart\",\n  \"WebkitOffsetInlineStart\",\n  \"MSOffsetInlineStart\",\n  \"OOffsetInlineStart\",\n  \"opacity\",\n  \"MozOpacity\",\n  \"WebkitOpacity\",\n  \"MSOpacity\",\n  \"OOpacity\",\n  \"order\",\n  \"MozOrder\",\n  \"WebkitOrder\",\n  \"MSOrder\",\n  \"OOrder\",\n  \"orphans\",\n  \"MozOrphans\",\n  \"WebkitOrphans\",\n  \"MSOrphans\",\n  \"OOrphans\",\n  \"outline\",\n  \"MozOutline\",\n  \"WebkitOutline\",\n  \"MSOutline\",\n  \"OOutline\",\n  \"outlineColor\",\n  \"MozOutlineColor\",\n  \"WebkitOutlineColor\",\n  \"MSOutlineColor\",\n  \"OOutlineColor\",\n  \"outlineOffset\",\n  \"MozOutlineOffset\",\n  \"WebkitOutlineOffset\",\n  \"MSOutlineOffset\",\n  \"OOutlineOffset\",\n  \"outlineStyle\",\n  \"MozOutlineStyle\",\n  \"WebkitOutlineStyle\",\n  \"MSOutlineStyle\",\n  \"OOutlineStyle\",\n  \"outlineWidth\",\n  \"MozOutlineWidth\",\n  \"WebkitOutlineWidth\",\n  \"MSOutlineWidth\",\n  \"OOutlineWidth\",\n  \"overflow\",\n  \"MozOverflow\",\n  \"WebkitOverflow\",\n  \"MSOverflow\",\n  \"OOverflow\",\n  \"overflowWrap\",\n  \"MozOverflowWrap\",\n  \"WebkitOverflowWrap\",\n  \"MSOverflowWrap\",\n  \"OOverflowWrap\",\n  \"overflowX\",\n  \"MozOverflowX\",\n  \"WebkitOverflowX\",\n  \"MSOverflowX\",\n  \"OOverflowX\",\n  \"overflowY\",\n  \"MozOverflowY\",\n  \"WebkitOverflowY\",\n  \"MSOverflowY\",\n  \"OOverflowY\",\n  \"padding\",\n  \"MozPadding\",\n  \"WebkitPadding\",\n  \"MSPadding\",\n  \"OPadding\",\n  \"paddingBlockEnd\",\n  \"MozPaddingBlockEnd\",\n  \"WebkitPaddingBlockEnd\",\n  \"MSPaddingBlockEnd\",\n  \"OPaddingBlockEnd\",\n  \"paddingBlockStart\",\n  \"MozPaddingBlockStart\",\n  \"WebkitPaddingBlockStart\",\n  \"MSPaddingBlockStart\",\n  \"OPaddingBlockStart\",\n  \"paddingBottom\",\n  \"MozPaddingBottom\",\n  \"WebkitPaddingBottom\",\n  \"MSPaddingBottom\",\n  \"OPaddingBottom\",\n  \"paddingInlineEnd\",\n  \"MozPaddingInlineEnd\",\n  \"WebkitPaddingInlineEnd\",\n  \"MSPaddingInlineEnd\",\n  \"OPaddingInlineEnd\",\n  \"paddingInlineStart\",\n  \"MozPaddingInlineStart\",\n  \"WebkitPaddingInlineStart\",\n  \"MSPaddingInlineStart\",\n  \"OPaddingInlineStart\",\n  \"paddingLeft\",\n  \"MozPaddingLeft\",\n  \"WebkitPaddingLeft\",\n  \"MSPaddingLeft\",\n  \"OPaddingLeft\",\n  \"paddingRight\",\n  \"MozPaddingRight\",\n  \"WebkitPaddingRight\",\n  \"MSPaddingRight\",\n  \"OPaddingRight\",\n  \"paddingTop\",\n  \"MozPaddingTop\",\n  \"WebkitPaddingTop\",\n  \"MSPaddingTop\",\n  \"OPaddingTop\",\n  \"pageBreakAfter\",\n  \"MozPageBreakAfter\",\n  \"WebkitPageBreakAfter\",\n  \"MSPageBreakAfter\",\n  \"OPageBreakAfter\",\n  \"pageBreakBefore\",\n  \"MozPageBreakBefore\",\n  \"WebkitPageBreakBefore\",\n  \"MSPageBreakBefore\",\n  \"OPageBreakBefore\",\n  \"pageBreakInside\",\n  \"MozPageBreakInside\",\n  \"WebkitPageBreakInside\",\n  \"MSPageBreakInside\",\n  \"OPageBreakInside\",\n  \"pc\",\n  \"MozPc\",\n  \"WebkitPc\",\n  \"MSPc\",\n  \"OPc\",\n  \"perspective\",\n  \"MozPerspective\",\n  \"WebkitPerspective\",\n  \"MSPerspective\",\n  \"OPerspective\",\n  \"perspectiveOrigin\",\n  \"MozPerspectiveOrigin\",\n  \"WebkitPerspectiveOrigin\",\n  \"MSPerspectiveOrigin\",\n  \"OPerspectiveOrigin\",\n  \"pointerEvents\",\n  \"MozPointerEvents\",\n  \"WebkitPointerEvents\",\n  \"MSPointerEvents\",\n  \"OPointerEvents\",\n  \"position\",\n  \"MozPosition\",\n  \"WebkitPosition\",\n  \"MSPosition\",\n  \"OPosition\",\n  \"pt\",\n  \"MozPt\",\n  \"WebkitPt\",\n  \"MSPt\",\n  \"OPt\",\n  \"px\",\n  \"MozPx\",\n  \"WebkitPx\",\n  \"MSPx\",\n  \"OPx\",\n  \"q\",\n  \"MozQ\",\n  \"WebkitQ\",\n  \"MSQ\",\n  \"OQ\",\n  \"quotes\",\n  \"MozQuotes\",\n  \"WebkitQuotes\",\n  \"MSQuotes\",\n  \"OQuotes\",\n  \"rad\",\n  \"MozRad\",\n  \"WebkitRad\",\n  \"MSRad\",\n  \"ORad\",\n  \"rem\",\n  \"MozRem\",\n  \"WebkitRem\",\n  \"MSRem\",\n  \"ORem\",\n  \"resize\",\n  \"MozResize\",\n  \"WebkitResize\",\n  \"MSResize\",\n  \"OResize\",\n  \"revert\",\n  \"MozRevert\",\n  \"WebkitRevert\",\n  \"MSRevert\",\n  \"ORevert\",\n  \"right\",\n  \"MozRight\",\n  \"WebkitRight\",\n  \"MSRight\",\n  \"ORight\",\n  \"rubyAlign\",\n  \"MozRubyAlign\",\n  \"WebkitRubyAlign\",\n  \"MSRubyAlign\",\n  \"ORubyAlign\",\n  \"rubyMerge\",\n  \"MozRubyMerge\",\n  \"WebkitRubyMerge\",\n  \"MSRubyMerge\",\n  \"ORubyMerge\",\n  \"rubyPosition\",\n  \"MozRubyPosition\",\n  \"WebkitRubyPosition\",\n  \"MSRubyPosition\",\n  \"ORubyPosition\",\n  \"s\",\n  \"MozS\",\n  \"WebkitS\",\n  \"MSS\",\n  \"OS\",\n  \"scrollBehavior\",\n  \"MozScrollBehavior\",\n  \"WebkitScrollBehavior\",\n  \"MSScrollBehavior\",\n  \"OScrollBehavior\",\n  \"scrollSnapCoordinate\",\n  \"MozScrollSnapCoordinate\",\n  \"WebkitScrollSnapCoordinate\",\n  \"MSScrollSnapCoordinate\",\n  \"OScrollSnapCoordinate\",\n  \"scrollSnapDestination\",\n  \"MozScrollSnapDestination\",\n  \"WebkitScrollSnapDestination\",\n  \"MSScrollSnapDestination\",\n  \"OScrollSnapDestination\",\n  \"scrollSnapType\",\n  \"MozScrollSnapType\",\n  \"WebkitScrollSnapType\",\n  \"MSScrollSnapType\",\n  \"OScrollSnapType\",\n  \"shapeImageThreshold\",\n  \"MozShapeImageThreshold\",\n  \"WebkitShapeImageThreshold\",\n  \"MSShapeImageThreshold\",\n  \"OShapeImageThreshold\",\n  \"shapeMargin\",\n  \"MozShapeMargin\",\n  \"WebkitShapeMargin\",\n  \"MSShapeMargin\",\n  \"OShapeMargin\",\n  \"shapeOutside\",\n  \"MozShapeOutside\",\n  \"WebkitShapeOutside\",\n  \"MSShapeOutside\",\n  \"OShapeOutside\",\n  \"tabSize\",\n  \"MozTabSize\",\n  \"WebkitTabSize\",\n  \"MSTabSize\",\n  \"OTabSize\",\n  \"tableLayout\",\n  \"MozTableLayout\",\n  \"WebkitTableLayout\",\n  \"MSTableLayout\",\n  \"OTableLayout\",\n  \"textAlign\",\n  \"MozTextAlign\",\n  \"WebkitTextAlign\",\n  \"MSTextAlign\",\n  \"OTextAlign\",\n  \"textAlignLast\",\n  \"MozTextAlignLast\",\n  \"WebkitTextAlignLast\",\n  \"MSTextAlignLast\",\n  \"OTextAlignLast\",\n  \"textCombineUpright\",\n  \"MozTextCombineUpright\",\n  \"WebkitTextCombineUpright\",\n  \"MSTextCombineUpright\",\n  \"OTextCombineUpright\",\n  \"textDecoration\",\n  \"MozTextDecoration\",\n  \"WebkitTextDecoration\",\n  \"MSTextDecoration\",\n  \"OTextDecoration\",\n  \"textDecorationColor\",\n  \"MozTextDecorationColor\",\n  \"WebkitTextDecorationColor\",\n  \"MSTextDecorationColor\",\n  \"OTextDecorationColor\",\n  \"textDecorationLine\",\n  \"MozTextDecorationLine\",\n  \"WebkitTextDecorationLine\",\n  \"MSTextDecorationLine\",\n  \"OTextDecorationLine\",\n  \"textDecorationStyle\",\n  \"MozTextDecorationStyle\",\n  \"WebkitTextDecorationStyle\",\n  \"MSTextDecorationStyle\",\n  \"OTextDecorationStyle\",\n  \"textEmphasis\",\n  \"MozTextEmphasis\",\n  \"WebkitTextEmphasis\",\n  \"MSTextEmphasis\",\n  \"OTextEmphasis\",\n  \"textEmphasisColor\",\n  \"MozTextEmphasisColor\",\n  \"WebkitTextEmphasisColor\",\n  \"MSTextEmphasisColor\",\n  \"OTextEmphasisColor\",\n  \"textEmphasisPosition\",\n  \"MozTextEmphasisPosition\",\n  \"WebkitTextEmphasisPosition\",\n  \"MSTextEmphasisPosition\",\n  \"OTextEmphasisPosition\",\n  \"textEmphasisStyle\",\n  \"MozTextEmphasisStyle\",\n  \"WebkitTextEmphasisStyle\",\n  \"MSTextEmphasisStyle\",\n  \"OTextEmphasisStyle\",\n  \"textIndent\",\n  \"MozTextIndent\",\n  \"WebkitTextIndent\",\n  \"MSTextIndent\",\n  \"OTextIndent\",\n  \"textOrientation\",\n  \"MozTextOrientation\",\n  \"WebkitTextOrientation\",\n  \"MSTextOrientation\",\n  \"OTextOrientation\",\n  \"textOverflow\",\n  \"MozTextOverflow\",\n  \"WebkitTextOverflow\",\n  \"MSTextOverflow\",\n  \"OTextOverflow\",\n  \"textRendering\",\n  \"MozTextRendering\",\n  \"WebkitTextRendering\",\n  \"MSTextRendering\",\n  \"OTextRendering\",\n  \"textShadow\",\n  \"MozTextShadow\",\n  \"WebkitTextShadow\",\n  \"MSTextShadow\",\n  \"OTextShadow\",\n  \"textTransform\",\n  \"MozTextTransform\",\n  \"WebkitTextTransform\",\n  \"MSTextTransform\",\n  \"OTextTransform\",\n  \"textUnderlinePosition\",\n  \"MozTextUnderlinePosition\",\n  \"WebkitTextUnderlinePosition\",\n  \"MSTextUnderlinePosition\",\n  \"OTextUnderlinePosition\",\n  \"top\",\n  \"MozTop\",\n  \"WebkitTop\",\n  \"MSTop\",\n  \"OTop\",\n  \"touchAction\",\n  \"MozTouchAction\",\n  \"WebkitTouchAction\",\n  \"MSTouchAction\",\n  \"OTouchAction\",\n  \"transform\",\n  \"MozTransform\",\n  \"WebkitTransform\",\n  \"msTransform\",\n  \"OTransform\",\n  \"transformBox\",\n  \"MozTransformBox\",\n  \"WebkitTransformBox\",\n  \"MSTransformBox\",\n  \"OTransformBox\",\n  \"transformOrigin\",\n  \"MozTransformOrigin\",\n  \"WebkitTransformOrigin\",\n  \"MSTransformOrigin\",\n  \"OTransformOrigin\",\n  \"transformStyle\",\n  \"MozTransformStyle\",\n  \"WebkitTransformStyle\",\n  \"MSTransformStyle\",\n  \"OTransformStyle\",\n  \"transition\",\n  \"MozTransition\",\n  \"WebkitTransition\",\n  \"MSTransition\",\n  \"OTransition\",\n  \"transitionDelay\",\n  \"MozTransitionDelay\",\n  \"WebkitTransitionDelay\",\n  \"MSTransitionDelay\",\n  \"OTransitionDelay\",\n  \"transitionDuration\",\n  \"MozTransitionDuration\",\n  \"WebkitTransitionDuration\",\n  \"MSTransitionDuration\",\n  \"OTransitionDuration\",\n  \"transitionProperty\",\n  \"MozTransitionProperty\",\n  \"WebkitTransitionProperty\",\n  \"MSTransitionProperty\",\n  \"OTransitionProperty\",\n  \"transitionTimingFunction\",\n  \"MozTransitionTimingFunction\",\n  \"WebkitTransitionTimingFunction\",\n  \"MSTransitionTimingFunction\",\n  \"OTransitionTimingFunction\",\n  \"turn\",\n  \"MozTurn\",\n  \"WebkitTurn\",\n  \"MSTurn\",\n  \"OTurn\",\n  \"unicodeBidi\",\n  \"MozUnicodeBidi\",\n  \"WebkitUnicodeBidi\",\n  \"MSUnicodeBidi\",\n  \"OUnicodeBidi\",\n  \"unset\",\n  \"MozUnset\",\n  \"WebkitUnset\",\n  \"MSUnset\",\n  \"OUnset\",\n  \"verticalAlign\",\n  \"MozVerticalAlign\",\n  \"WebkitVerticalAlign\",\n  \"MSVerticalAlign\",\n  \"OVerticalAlign\",\n  \"vh\",\n  \"MozVh\",\n  \"WebkitVh\",\n  \"MSVh\",\n  \"OVh\",\n  \"visibility\",\n  \"MozVisibility\",\n  \"WebkitVisibility\",\n  \"MSVisibility\",\n  \"OVisibility\",\n  \"vmax\",\n  \"MozVmax\",\n  \"WebkitVmax\",\n  \"MSVmax\",\n  \"OVmax\",\n  \"vmin\",\n  \"MozVmin\",\n  \"WebkitVmin\",\n  \"MSVmin\",\n  \"OVmin\",\n  \"vw\",\n  \"MozVw\",\n  \"WebkitVw\",\n  \"MSVw\",\n  \"OVw\",\n  \"whiteSpace\",\n  \"MozWhiteSpace\",\n  \"WebkitWhiteSpace\",\n  \"MSWhiteSpace\",\n  \"OWhiteSpace\",\n  \"widows\",\n  \"MozWidows\",\n  \"WebkitWidows\",\n  \"MSWidows\",\n  \"OWidows\",\n  \"width\",\n  \"MozWidth\",\n  \"WebkitWidth\",\n  \"MSWidth\",\n  \"OWidth\",\n  \"willChange\",\n  \"MozWillChange\",\n  \"WebkitWillChange\",\n  \"MSWillChange\",\n  \"OWillChange\",\n  \"wordBreak\",\n  \"MozWordBreak\",\n  \"WebkitWordBreak\",\n  \"MSWordBreak\",\n  \"OWordBreak\",\n  \"wordSpacing\",\n  \"MozWordSpacing\",\n  \"WebkitWordSpacing\",\n  \"MSWordSpacing\",\n  \"OWordSpacing\",\n  \"wordWrap\",\n  \"MozWordWrap\",\n  \"WebkitWordWrap\",\n  \"MSWordWrap\",\n  \"OWordWrap\",\n  \"writingMode\",\n  \"MozWritingMode\",\n  \"WebkitWritingMode\",\n  \"MSWritingMode\",\n  \"OWritingMode\",\n  \"zIndex\",\n  \"MozZIndex\",\n  \"WebkitZIndex\",\n  \"MSZIndex\",\n  \"OZIndex\",\n  \"fontSize\",\n  \"MozFontSize\",\n  \"WebkitFontSize\",\n  \"MSFontSize\",\n  \"OFontSize\",\n  \"flex\",\n  \"MozFlex\",\n  \"WebkitFlex\",\n  \"MSFlex\",\n  \"OFlex\",\n  \"fr\",\n  \"MozFr\",\n  \"WebkitFr\",\n  \"MSFr\",\n  \"OFr\",\n  \"overflowScrolling\",\n  \"MozOverflowScrolling\",\n  \"WebkitOverflowScrolling\",\n  \"MSOverflowScrolling\",\n  \"OOverflowScrolling\",\n  \"userSelect\",\n  \"MozUserSelect\",\n  \"WebkitUserSelect\",\n  \"MSUserSelect\",\n  \"OUserSelect\"\n]\n","var properties = require('./css-properties.js');\nvar PropTypes = require('prop-types');\n\nmodule.exports = function(props, propName, componentName) {\n  var styles = props[propName];\n  if (!styles) {\n    return;\n  }\n\n  var failures = [];\n  Object.keys(styles).forEach(function(styleKey){\n    if (properties.indexOf(styleKey) === -1) {\n      failures.push(styleKey);\n    }\n  });\n  if (failures.length) {\n    throw new Error('Prop ' + propName + ' passed to ' + componentName + '. Has invalid keys ' + failures.join(', '));\n  }\n};\n\nmodule.exports.isRequired = function(props, propName, componentName) {\n  if (!props[propName]) {\n    throw new Error('Prop ' + propName + ' passed to ' + componentName + ' is required');\n  }\n  return module.exports(props, propName, componentName);\n};\n\nmodule.exports.supportingArrays = PropTypes.oneOfType([\n  PropTypes.arrayOf(module.exports),\n  module.exports\n]);\n"],"names":["getDefaultCondition","type","query","params","reducer","evaluator","operator","getAlertingValidationMessage","async","transformations","targets","datasourceSrv","datasource","length","alertingNotSupported","templateVariablesNotSupported","target","dsRef","ds","get","meta","alerting","targetContainsTemplate","DashboardFailed","initError","className","styles","dashboardLoading","Alert","severity","AppNotificationSeverity","title","message","getMessageFromError","error","css","DashboardLoading","initPhase","useStyles2","getStyles","dashboardLoadingText","spacing","align","justify","Spinner","inline","Button","variant","size","icon","onClick","locationService","theme","invisibleToVisible","keyframes","typography","h4","fontSize","SaveLibraryPanelModal","panel","folderId","isUnsavedPrompt","onDismiss","onConfirm","onDiscard","searchString","setSearchString","useState","dashState","useAsync","searchHits","getConnectedDashboards","libraryPanel","uid","map","dash","filteredDashboards","setFilteredDashboards","useDebounce","value","filter","dashName","toLowerCase","includes","saveLibraryPanel","usePanelSave","getModalStyles","discardAndClose","useCallback","Modal","isOpen","textInfo","connectedDashboards","Input","I","dashboardSearch","prefix","Icon","name","placeholder","onChange","e","currentTarget","loading","myTable","i","fill","then","discardPanelChanges","dispatch","getStore","getPanel","panelEditor","configRev","setDiscardChanges","skipPanelUpdate","modifiedPanel","panelToUpdate","id","repeatPanelId","exitPanelEditor","dashboard","getModel","getSourcePanel","shouldDiscardChanges","hasChanged","hasSavedPanelEditChange","isAngularPlugin","hasPanelChangedInPanelEdit","modifiedSaveModel","getSaveModel","sourcePanel","panelTypeChanged","undefined","panels","restoreModel","pick","pluginChanged","plugin","generateNewKey","panelModelAndPluginReady","key","setTimeout","getQueryRunner","useLastResultFrom","repeat","processRepeats","updateDuplicateLibraryPanels","render","cleanUpPanelState","closeEditor","updatePanelEditorUIState","uiState","nextState","ui","setPanelEditorUIState","store","PANEL_EDITOR_UI_STATE_STORAGE_KEY","console","UnsavedChangesModal","onSaveSuccess","SaveDashboardButton","DashboardPrompt","React","state","setState","original","useDispatch","originalPath","showModal","hideModal","useContext","ModalsContext","useEffect","timeoutId","pathname","getSaveModelClone","savedEventUnsub","appEvents","DashboardSavedEvent","clearTimeout","unsubscribe","handleUnload","event","ignoreChanges","hasChanges","preventDefault","returnValue","window","addEventListener","removeEventListener","when","location","panelInEdit","search","URLSearchParams","has","moveToBlockedLocationAfterReactStateUpdate","current","contextSrv","canSave","fromScript","fromFile","cleanDashboardFromIgnoredChanges","dashData","model","DashboardModel","expandRows","time","refresh","schemaVersion","timezone","each","getVariables","variable","options","filters","hasUnsavedChanges","currentClean","originalClean","currentTimepicker","find","nav","originalTimepicker","now","JSON","stringify","displayName","SnapshotTab","ShowMessage","SupportSnapshotService","StateManagerBase","constructor","super","panelTitle","replaceVariables","currentTab","Support","showMessage","GithubComment","snapshotText","markdownText","randomize","snapshotUpdate","label","description","PanelSnapshot","this","maxLen","Math","pow","blob","Blob","fileName","dateTimeFormat","Date","saveAs","k","snapshot","setDashboardToFetchFromLocalStorage","global","open","config","iframeLoading","getDebugDashboard","getTimeSrv","timeRange","getGithubMarkdown","snapshotSize","formattedValueToString","getValueFormat","subscribeToIframeLoadingMessage","handleEvent","evt","data","HelpWizard","onClose","service","useMemo","buildDebugDashboard","tabs","Data","Drawer","width","expandable","scrollableContent","subtitle","Stack","direction","gap","featureState","FeatureState","href","rel","TabsBar","t","index","Tab","active","onChangeTab","onCurrentTabChange","code","opts","Field","field","Select","onShowMessageChange","ClipboardButton","getText","onGetMarkdownForClipboard","onDownloadDashboard","disableWidth","height","CodeEditor","language","showLineNumbers","showMiniMap","readOnly","onBlur","onSetSnapshotText","showLabel","Boolean","labels","onToggleRandomize","names","values","onPreviewDashboard","src","frameBorder","style","display","marginTop","usePanelLatestData","checkSchema","querySubscription","useRef","latestData","setLatestData","lastRev","lastUpdate","getData","subscribe","next","structureRev","withFieldConfig","withTransforms","isLoading","LoadingState","hasSeries","series","InspectMetadataTab","metadataDatasource","components","MetadataInspector","i18nKey","InspectContent","isDataLoading","dataOptions","defaultTab","onDataOptionsChange","setCurrentTab","InspectTab","activeTab","item","getTemplateSrv","replace","scopedVars","formatStats","tab","InspectDataTab","onOptionsChange","timeZone","app","CoreApp","InspectJSONTab","InspectErrorTab","InspectStatsTab","getTimezone","QueryInspector","onRefreshQuery","request","queryCount","requestTime","endTime","startTime","formatted","PanelInspector","connect","props","panelState","getPanelStateForModel","setDataOptions","useLocation","metaDs","frame","custom","dataSource","getDataSourceSrv","useDatasourceMetadata","supportsDataQuery","push","supplier","grafanaPanelInspectActionSupplier","getActions","canEdit","useInspectTabs","inspect","inspectTab","_classCallCheck","instance","Constructor","TypeError","_defineProperties","descriptor","enumerable","configurable","writable","Object","defineProperty","_createClass","protoProps","staticProps","prototype","obj","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","apply","_objectSpread2","arguments","source","forEach","getOwnPropertyDescriptors","defineProperties","_inherits","subClass","superClass","create","_setPrototypeOf","_getPrototypeOf","o","setPrototypeOf","getPrototypeOf","__proto__","p","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","toString","call","_assertThisInitialized","self","ReferenceError","_possibleConstructorReturn","_createSuper","Derived","result","Super","NewTarget","Pane","_React$PureComponent","_super","_this$props","children","split","styleProps","eleRef","classes","flex","position","outline","assign","ref","join","propTypes","defaultProps","RESIZER_DEFAULT_CLASSNAME","Resizer","_React$Component","_onClick","_onDoubleClick","onDoubleClick","_onMouseDown","onMouseDown","_onTouchEnd","onTouchEnd","_onTouchStart","onTouchStart","resizerClassName","role","unFocus","document","selection","empty","getSelection","removeAllRanges","getDefaultSize","defaultSize","minSize","maxSize","draggedSize","min","max","Infinity","SplitPane","_this","bind","onMouseMove","onTouchMove","onMouseUp","primary","initialSize","resized","pane1Size","pane2Size","instanceProps","getSizeUpdate","eventWithTouches","touches","clientX","clientY","allowResize","onDragStarted","_this$props2","step","_this$state","isPrimaryFirst","pane1","pane2","ref2","node","node2","getBoundingClientRect","positionDelta","abs","sizeDelta","parseInt","getComputedStyle","order","newMaxSize","splitPane","newSize","newPosition","_this$props3","onDragFinished","_this$state2","_this2","_this$props4","onResizerClick","onResizerDoubleClick","paneClassName","pane1ClassName","pane2ClassName","paneStyle","pane1StyleProps","pane1Style","pane2StyleProps","pane2Style","resizerStyle","_this$state3","disabledClass","resizerClassNamesIncludingDefault","concat","notNullChildren","c","removeNullChildren","overflow","MozUserSelect","WebkitUserSelect","msUserSelect","userSelect","flexDirection","left","right","bottom","minHeight","top","pane1Classes","pane2Classes","nextProps","prevState","newState","isPanel1Primary","isRequired","SplitPaneWrapper","PureComponent","createRef","rafToken","cancelAnimationFrame","requestAnimationFrame","forceUpdate","pane","body","cursor","updateUiState","Top","topPaneSize","innerHeight","rightPaneSize","innerWidth","componentDidMount","updateSplitPaneSize","componentWillUnmount","renderHorizontalSplit","leftPaneComponents","Array","isArray","resizerH","singleLeftPane","rightPaneVisible","rightPaneComponents","resizerV","Right","handleColor","v1","palette","blue95","paneSpacing","resizer","borderColor","cx","PickerRenderer","PickerToRender","variableAdapters","picker","PickerLabel","hide","VariableHide","labelOrName","elementId","Tooltip","content","placement","selectors","htmlFor","SubMenuItems","variables","visibleVariables","setVisibleVariables","mapStateToProps","angularPanelComponent","angularComponent","mapDispatchToProps","changePanelPlugin","AngularPanelOptionsUnconnected","loadAngularOptions","componentDidUpdate","prevProps","cleanUpAngularOptions","angularOptions","destroy","element","scope","getScope","$$childHead","panelCtrl","ctrl","initEditMode","onPluginTypeChange","pluginId","template","editorTabs","defaultValue","loader","getAngularLoader","scopeProps","toggleOptionGroup","saveSectionOpenState","load","digest","elem","AngularPanelOptions","DynamicConfigValueEditor","property","context","registry","onRemove","isSystemOverride","searchQuery","getIfExists","isCollapsible","FieldConfigProperty","labelCategory","category","editor","renderLabel","includeDescription","includeCounter","isExpanded","Label","textToHighlight","searchWords","highlightClassName","getItemsCount","Counter","IconButton","OptionsPaneCategory","renderTitle","isNested","isOpenDefault","override","collapsibleOverrideEditor","OverrideCategoryTitle","matcherUi","overrideName","onOverrideRemove","propertyNames","properties","prop","matcherOptions","optionsToLabel","matcher","overrideDetails","propertyPickerWrapper","bodySmall","colors","text","secondary","fontWeightRegular","unknownLabel","getFieldOverrideCategories","categories","currentFieldConfig","fieldConfig","fieldConfigRegistry","isEmpty","onOverrideChange","overrides","cloneDeep","onFieldConfigsChange","overrideIndex","splice","getSuggestions","getDataLinksVariableSuggestions","isOverride","idx","fieldMatchersUI","configPropertiesOptions","getOverrideProperties","isSystemOverrideGuard","forceOpen","OptionsPaneCategoryDescriptor","onMatcherConfigChange","onDynamicConfigValueAdd","registryItem","propertyConfig","addItem","OptionsPaneItemDescriptor","component","propIdx","registryItemForProperty","onPropertyChange","onPropertyRemove","skipField","ValuePicker","isFullWidth","menuPlacement","v","customRender","AddOverrideButtonContainer","excludeFromPicker","onOverrideAdd","list","hideFromOverrides","getBorderTopStyles","borderTop","border","weak","padding","LibraryPanelInformation","formatDate","info","libraryPanelInfo","updated","updatedBy","avatarUrl","userAvatar","alt","getLibraryPanelOptionsCategory","onPanelConfigChange","isPanelModelLibraryPanel","popularRank","RepeatRowSelect","useSelector","getVariablesByKey","getLastKey","variableOptions","unshift","onSelectChange","option","inputId","getPanelFrameCategory","TextArea","Switch","transparent","checked","addCategory","itemsCount","links","DataLinksInlineEditor","getPanelLinksVariableSuggestions","showIf","RadioButtonGroup","repeatDirection","maxPerRowOptions","maxPerRow","OptionSearchEngine","searchRegex","RegExp","sortedHits","collectHits","sort","compareHit","x","sortedOverridesHits","optionHits","overrideHits","buildOverrideHitCategories","totalCount","getAllOptionsCount","hits","categoryNameMatch","test","items","rank","total","hit","parent","getRecentOptions","allOptions","popularOptions","OptionsPaneOptions","setSearchQuery","listMode","setListMode","OptionFilter","All","panelFrameOptions","vizOptions","libraryPanelOptions","getVisualizationOptions","instanceState","justOverrides","mainBoxElements","isSearching","optionRadioFilters","getOptionRadioFilters","engine","renderSearchHits","angularPanelCtrl","searchNotice","Overrides","Recent","showSearchRadioButtons","wrapper","formBox","formRow","FilterInput","fullWidth","scrollWrapper","CustomScrollbar","autoHeightMin","mainBox","warning","searchBox","background","shape","borderRadius","closeButton","sm","getPanelPluginWithFallback","panelType","plugins","getPanelPluginNotFound","VisualizationButton","isPanelOptionsVisible","isVizPickerOpen","ButtonGroup","ToolbarButton","vizButton","tooltip","imgSrc","logos","small","toggleVizPicker","ChangeLibraryPanelModal","isLibraryPanel","ConfirmModal","confirmText","dismissText","PanelLibraryOptionsGroup","showingAddPanelModal","setShowingAddPanelModal","changeToPanel","setChangeToPanel","panelFilter","setPanelFilter","onPanelFilterChange","getDashboardSrv","getCurrent","PanelTypeFilter","libraryPanelsView","LibraryPanelsView","currentPanelId","onClickCard","showSecondaryActions","AddLibraryPanelModal","initialFolderId","changeToLibraryPanel","panelsToCheckFirst","VisualizationSuggestionCard","suggestion","showTitle","innerStyles","outerStyles","renderWidth","renderHeight","aspectRatio","showHeight","transform","getPreviewDimensionsAndStyles","cardOptions","commonButtonProps","vizBox","imgBox","img","preview","previewModifier","renderContainer","PanelRenderer","hoverPane","medium","transitions","duration","short","fontWeightMedium","VisualizationSuggestions","suggestions","builder","VisualizationSuggestionsBuilder","importPanelPlugin","getSuggestionsSupplier","getSuggestionsForData","getList","dataSummary","fieldCount","skipDataQuery","hideFromList","a","b","score","VisualizationSuggestionScore","getAllSuggestions","setShowTitle","useLocalStorage","filteredSuggestions","regex","s","filterSuggestionsBySearch","disableHeight","columnCount","floor","previewWidth","filterRow","infoText","grid","gridTemplateColumns","heading","h5","margin","justifyContent","alignItems","paddingBottom","color","fontStyle","gridGap","marginBottom","VizTypePickerPlugin","isCurrent","disabled","PanelTypeCard","showBadge","VizTypePicker","pluginsList","getAllPanelPluginMeta","filteredPluginTypes","filterPluginList","EmptySearchResult","withModKey","metaKey","ctrlKey","altKey","VisualizationSelectPane","LS_VISUALIZATION_SELECT_TAB_KEY","VisualizationSelectPaneTab","searchRef","onVizChange","pluginChange","radioOptions","openWrapper","searchRow","autoFocus","customFieldMargin","scrollContent","gray33","OptionsPane","onPanelOptionsChanged","vizButtonWrapper","optionsWrapper","legacyOptions","PanelEditorTableView","setOptions","frameIndex","showHeader","showTypeIcons","timeSrv","sub","events","RefreshEvent","timeData","applyPanelTimeOverrides","runAllPanelQueries","dashboardId","dashboardUID","dashboardTimezone","PanelChrome","PanelHeaderCorner","PanelNotSupported","onBackToQueries","PanelEditorTabId","Layout","StateHistory","stateHistoryItems","panelId","onRefresh","getBackendSrv","post","stateModel","alertDef","ConfirmButton","clearHistory","confirmVariant","stateClass","iconClass","alertName","TestRuleResult","allNodesExpanded","testRuleResponse","formattedJson","collapse","expand","testRule","dashPanel","payload","LoadingPlaceholder","openNodes","getNrOfOpenNodes","onToggleExpand","renderExpandCollapse","getTextForClipboard","JSONFormatter","json","onDidRender","setFormattedJson","UnConnectedAlertTab","validationMessage","showStateHistory","showDeleteConfirmation","showTestRule","_enableAlert","onToggleModal","onClickBackdrop","alert","thresholds","alertState","loadAlertTab","getReactAlertPanelCtrl","EventBusSrv","hasTransformations","buttonIcon","onAddAlert","buttonTitle","EmptyListCTA","renderTestRule","renderDeleteConfirmation","renderStateHistory","AlertTab","NewRuleFromPanelButton","templating","formValues","panelToRuleFormValues","ruleFormUrl","urlUtil","defaults","returnTo","logInfo","LogMessages","usePanelCombinedRules","poll","promRuleRequest","useUnifiedAlertingSelector","promRules","GRAFANA_RULES_SOURCE_NAME","initialAsyncRequestState","rulerRuleRequest","rulerRules","fetch","fetchPromRulesAction","rulesSourceName","fetchRulerRulesAction","interval","setInterval","RULE_LIST_POLL_INTERVAL_MS","clearInterval","errors","err","combinedNamespaces","useCombinedRuleNamespaces","rules","flatMap","ns","groups","group","rule","annotations","Annotation","String","newButton","innerWrapper","noRulesWrapper","permissions","getRulesPermissions","canCreateRules","RulesTable","PanelAlertTab","otherProps","counter","DOCS_LINKS","DocsId","TransformationEditor","debugMode","uiConfig","configs","input","setInput","output","setOutput","inputTransforms","slice","transformation","outputTransforms","inputSubscription","transformDataFrame","outputSubscription","pipe","mergeMap","before","defaultOptions","debugWrapper","debug","debugTitle","debugJson","debugSeparator","debugBorder","isLight","gray85","gray15","iconRow","fontFamilyMonospace","white","gray05","TransformationOperationRow","showDebug","toggleDebug","useToggle","showHelp","toggleHelp","onDisableToggle","QueryOperationRow","draggable","actions","PluginStateInfo","QueryOperationAction","OperationRowHelp","markdown","prepMarkdown","help","TransformationOperationRows","standardTransformersRegistry","UnThemedTransformationsEditor","lower","filtered","indexOf","onTransformationAdd","keyCode","showPicker","stopPropagation","nextId","existingIds","startsWith","match","selectable","getTransformationNextId","from","destination","startIndex","endIndex","update","removed","onDragEnd","droppableId","provided","innerRef","droppableProps","onTransformationRemove","onTransformationChange","ids","buildTransformationIds","transformationCounters","transformationIds","subscription","panelData","setTransformations","renderTransformsPicker","suffix","xforms","noTransforms","grow","LocalStorageValueProvider","storageKey","isDismissed","onSearchChange","onKeyDown","onSearchKeyDown","TransformationCard","hasTransforms","renderTransformationEditors","Card","card","TransformationsEditor","withTheme","PanelEditorQueries","updateQueries","onRunQueries","buildQueryOptions","default","datasourceSettings","getDatasourceSrv","getInstanceSettings","cacheTimeout","queryOptions","isDefault","queries","maxDataPoints","minInterval","timeFrom","shift","timeShift","hideTimeOverride","getDataSourceRef","QueryGroup","queryRunner","onOpenQueryInspector","PanelEditorTabs","useForceUpdate","eventSubs","Subscription","add","PanelQueriesChangedEvent","PanelTransformationsChangedEvent","tabBar","hideBorder","toIconName","getCounter","renderAlertTab","TabContent","tabContent","AlertTabIndex","getTransformations","getPanelEditorTabs","memoizeOne","alertingEnabled","unifiedAlertingEnabled","getConfig","hasRuleReadPermissions","read","isAlertingAvailable","isGraph","isTimeseries","initPanelEditor","initEditPanel","initPanelState","updateEditorInitState","updateTimeZoneForSession","toggleTableView","notifyApp","connector","ownProps","initDone","tableViewEnabled","PanelEditorUnconnected","showSaveLibraryPanelModal","editPanel","showCategory","onBack","ShowModalReactEvent","SaveDashboardDrawer","updateFieldConfig","updateOptions","configKey","setProperty","mode","PanelOptionsChangedEvent","triggerForceUpdate","renderPanel","isOnlyPanel","mainPaneWrapper","renderPanelToolbar","panelWrapper","gridSize","panelSize","calculatePanelSize","centeringContainer","DashboardPanel","stateKey","isEditing","isViewing","lazy","renderPanelAndEditor","panelPane","tabsWrapper","renderTemplateVariables","variablesWrapper","panelToolbar","onToggleTableView","displayModes","onDisplayModeChange","DashNavTimeControls","onChangeTimeZone","isOnCanvas","renderEditorActions","editorActions","onSaveLibraryPanel","onSaveDashboard","UnlinkModal","unlinkLibraryPanel","pop","renderOptionsPane","onFieldConfigChange","onPanelConfigChanged","renderToolbar","AppChromeUpdate","A","ToolbarButtonRow","alignment","PageToolbar","section","onGoBack","onGoBackToDashboard","sectionNav","pageNav","Page","navModel","layout","PageLayoutType","toolbar","verticalSplitPanesWrapper","onConfirmAndDismissLibarayPanelModel","PanelEditor","withTheme2","stylesFactory","flexGrow","paddingTop","toolbarLeft","PublicDashboardFooter","conf","getPublicDashboardFooterConfig","footer","logoText","link","logoImg","logo","colorManipulator","alpha","canvas","zIndex","navbarFixed","AnnotationPicker","annotation","onEnabledChanged","setLoading","started","getStream","AnnotationQueryStarted","stopped","AnnotationQueryFinished","InlineFieldRow","InlineField","enable","indicator","LoadingIndicator","onCancel","getDashboardQueryRunner","cancel","Annotations","onAnnotationChanged","visibleAnnotations","setVisibleAnnotations","DashboardLinksDashboard","linkInfo","listRef","dropdownCssClass","setDropdownCssClass","opened","setOpened","resolvedLinks","useResolvedLinks","useLayoutEffect","wrapperPos","parentElement","pos","getDropdownLocationCssClass","asDropdown","LinkElement","button","iconMargin","dropdown","resolvedLink","url","targetBlank","marginRight","rest","tags","dependencies","limit","tag","searchForTags","getLinkSrv","sanitize","sanitizeUrl","searchHit","getLinkUrl","resolveLinks","maxWidth","maxHeight","overflowY","textOverflow","whiteSpace","DashboardLinks","useEffectOnce","TimeRangeUpdatedEvent","getAnchorInfo","linkIconMap","linkElement","SubMenuUnConnected","updatedAnnotation","startRefresh","isSubMenuVisible","readOnlyVariables","isSnapshot","onAnnotationStateChanged","SubMenu","templatingState","getVariablesState","getSubMenuVariables","addPanel","AddPanelWidget","addPanelView","setAddPanelView","copiedPanelPlugins","chain","copiedPanels","copiedPanelJson","LS_PANEL_COPY_KEY","copiedPanel","parse","pluginInfo","pluginCopy","sortBy","getCopiedPanelPlugins","callToAction","AddPanelWidgetHandle","removePanel","LibraryPanelsSearch","panelInfo","gridPos","newPanel","LibraryPanelsSearchVariant","showPanelFilter","actionsWrapper","CardButton","reportInteraction","y","w","h","onCreateNewPanel","panelPluginInfo","onPasteCopiedPanel","headerRow","backButton","pulsate","main","tinycolor","darken","toHexString","noMargin","RowOptionsForm","onUpdate","newRepeat","setNewRepeat","onChangeRepeat","Form","defaultValues","onSubmit","formData","register","RowOptionsModal","modal","RowOptionsButton","onUpdateChange","DashboardRow","toggleRow","ShowConfirmModalEvent","altActionText","removeRow","onAltAction","onVariableUpdated","classNames","collapsed","count","onToggle","onDelete","DashboardGrid","newLayout","newPos","panelMap","updateGridPos","isLayoutInitialized","sortPanelsByGridPos","oldItem","newItem","DashboardPanelsChangedEvent","buildLayout","log","panelPos","GRID_COLUMN_COUNT","isResizable","isDraggable","getPanelScreenPos","gridWidth","lastPanelBottom","GRID_CELL_VMARGIN","translateGridHeightToScreenHeight","renderPanels","panelElements","windowHeight","windowWidth","panelClasses","GrafanaGridItem","isEditable","containerPadding","useCSSTransforms","cols","rowHeight","GRID_CELL_HEIGHT","draggableHandle","onDragStop","onResize","onResizeStop","onLayoutChange","divProps","breakpoints","md","parseFloat","gridHeight","navIndex","initDashboard","cleanUpDashboardAndVariables","cancelVariables","templateVarsChangedInUrl","UnthemedDashboardPage","getCleanState","tr","liveNow","liveTimer","panelIterator","updateScrollTop","scrollElement","viewPanel","showLoadingState","panelNotFound","editPanelAccessDenied","forceRouteReloadCounter","history","routeReloadCounter","closeDashboard","isPublic","queryParams","urlSlug","slug","urlUid","urlType","urlFolderId","routeName","route","fixUrl","accessToken","keybindingSrv","keybindings","updateLiveTimer","prevUrlParams","urlParams","to","updateTimeRangeFromUrl","setAutoRefresh","templateVarChanges","findTemplateVarChanges","dashboardWatcher","publish","PanelEditEnteredEvent","PanelEditExitedEvent","createErrorNotification","static","urlEditPanelId","urlViewPanelId","updatedState","getPanelByUrlId","canEditPanel","rememberScrollTop","scrollTop","initViewPanel","exitViewPanel","locationUtil","editview","folderTitle","folderUid","parentItem","DashboardRoutes","getRootContentNavModel","getPageNavFromSlug","getNavModel","updateStatePageNavFromProps","getInspectPanel","inspectPanelId","inspectPanel","getPanelById","kioskMode","KioskMode","getKioskMode","showSubMenu","DashNav","isFullscreen","onAddPanel","hideTimePicker","timepicker","hidden","shareModalActiveTab","shareView","pageClassName","scrollRef","setScrollRef","DashboardSettings","D","GrafanaContext","DashboardPage","StorageFolderPage","listing","getGrafanaStorage","childRoot","fields","toArray","isFolder","isDash","endsWith","renderListing","parts","lastPageNav","pageNavs","module","exports","PropTypes","propName","componentName","failures","styleKey","Error","supportingArrays","oneOfType","arrayOf"],"sourceRoot":""}