{"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> </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'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} \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'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 \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":""}