{"version":3,"file":"DashboardImport.06e6c4c03113061aae6c.js","mappings":"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","sources":["webpack://grafana/./public/app/features/library-panels/components/DeleteLibraryPanelModal/reducer.ts","webpack://grafana/./public/app/features/library-panels/components/DeleteLibraryPanelModal/actions.ts","webpack://grafana/./public/app/features/library-panels/components/DeleteLibraryPanelModal/DeleteLibraryPanelModal.tsx","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelCard/LibraryPanelCard.tsx","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelsView/actions.ts","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelsView/reducer.ts","webpack://grafana/./public/app/features/library-panels/styles.ts","webpack://grafana/./public/app/features/manage-dashboards/utils/validation.ts","webpack://grafana/./public/app/features/manage-dashboards/components/ImportDashboardLibraryPanelsList.tsx","webpack://grafana/./public/app/features/manage-dashboards/components/ImportDashboardForm.tsx","webpack://grafana/./public/app/features/manage-dashboards/components/ImportDashboardOverview.tsx","webpack://grafana/./public/app/features/manage-dashboards/DashboardImportPage.tsx"],"sourcesContent":["import { createAction } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\n\nimport { LoadingState } from '@grafana/data';\nimport { DashboardSearchItem } from 'app/features/search/types';\n\nexport interface DeleteLibraryPanelModalState {\n loadingState: LoadingState;\n dashboardTitles: string[];\n}\n\nexport const initialDeleteLibraryPanelModalState: DeleteLibraryPanelModalState = {\n loadingState: LoadingState.Loading,\n dashboardTitles: [],\n};\n\nexport const searchCompleted = createAction<{ dashboards: DashboardSearchItem[] }>(\n 'libraryPanels/delete/searchCompleted'\n);\n\nexport const deleteLibraryPanelModalReducer = (\n state: DeleteLibraryPanelModalState = initialDeleteLibraryPanelModalState,\n action: AnyAction\n): DeleteLibraryPanelModalState => {\n if (searchCompleted.match(action)) {\n return {\n ...state,\n dashboardTitles: action.payload.dashboards.map((d) => d.title),\n loadingState: LoadingState.Done,\n };\n }\n\n return state;\n};\n","import { getConnectedDashboards as apiGetConnectedDashboards } from '../../state/api';\nimport { DispatchResult, LibraryElementDTO } from '../../types';\n\nimport { searchCompleted } from './reducer';\n\nexport function getConnectedDashboards(libraryPanel: LibraryElementDTO): DispatchResult {\n return async function (dispatch) {\n const dashboards = await apiGetConnectedDashboards(libraryPanel.uid);\n dispatch(searchCompleted({ dashboards }));\n };\n}\n","import React, { FC, useEffect, useMemo, useReducer } from 'react';\n\nimport { LoadingState } from '@grafana/data';\nimport { Button, Modal, useStyles2 } from '@grafana/ui';\n\nimport { getModalStyles } from '../../styles';\nimport { LibraryElementDTO } from '../../types';\nimport { asyncDispatcher } from '../LibraryPanelsView/actions';\n\nimport { getConnectedDashboards } from './actions';\nimport { deleteLibraryPanelModalReducer, initialDeleteLibraryPanelModalState } from './reducer';\n\ninterface Props {\n libraryPanel: LibraryElementDTO;\n onConfirm: () => void;\n onDismiss: () => void;\n}\n\nexport const DeleteLibraryPanelModal: FC = ({ libraryPanel, onDismiss, onConfirm }) => {\n const styles = useStyles2(getModalStyles);\n const [{ dashboardTitles, loadingState }, dispatch] = useReducer(\n deleteLibraryPanelModalReducer,\n initialDeleteLibraryPanelModalState\n );\n const asyncDispatch = useMemo(() => asyncDispatcher(dispatch), [dispatch]);\n useEffect(() => {\n asyncDispatch(getConnectedDashboards(libraryPanel));\n }, [asyncDispatch, libraryPanel]);\n const connected = Boolean(dashboardTitles.length);\n const done = loadingState === LoadingState.Done;\n\n return (\n \n {!done ? : null}\n {done ? (\n
\n {connected ? : null}\n {!connected ? : null}\n\n \n \n \n \n
\n ) : null}\n
\n );\n};\n\nconst LoadingIndicator = () => Loading library panel...;\n\nconst Confirm = () => {\n const styles = useStyles2(getModalStyles);\n\n return
Do you want to delete this panel?
;\n};\n\nconst HasConnectedDashboards: FC<{ dashboardTitles: string[] }> = ({ dashboardTitles }) => {\n const styles = useStyles2(getModalStyles);\n const suffix = dashboardTitles.length === 1 ? 'dashboard.' : 'dashboards.';\n const message = `${dashboardTitles.length} ${suffix}`;\n if (dashboardTitles.length === 0) {\n return null;\n }\n\n return (\n
\n

\n {'This library panel can not be deleted because it is connected to '}\n {message}\n {' Remove the library panel from the dashboards listed below and retry.'}\n

\n \n \n \n \n \n \n \n {dashboardTitles.map((title, i) => (\n \n \n \n ))}\n \n
Dashboard name
{title}
\n
\n );\n};\n","import { css } from '@emotion/css';\nimport React, { ReactElement, useState } from 'react';\nimport Skeleton from 'react-loading-skeleton';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Icon, Link, useStyles2 } from '@grafana/ui';\nimport { SkeletonComponent, attachSkeleton } from '@grafana/ui/src/unstable';\nimport { getPanelPluginNotFound } from 'app/features/panel/components/PanelPluginError';\nimport { PanelTypeCard } from 'app/features/panel/components/VizTypePicker/PanelTypeCard';\n\nimport { LibraryElementDTO } from '../../types';\nimport { DeleteLibraryPanelModal } from '../DeleteLibraryPanelModal/DeleteLibraryPanelModal';\n\nexport interface LibraryPanelCardProps {\n libraryPanel: LibraryElementDTO;\n onClick: (panel: LibraryElementDTO) => void;\n onDelete?: (panel: LibraryElementDTO) => void;\n showSecondaryActions?: boolean;\n}\n\ntype Props = LibraryPanelCardProps & { children?: JSX.Element | JSX.Element[] };\n\nconst LibraryPanelCardComponent = ({ libraryPanel, onClick, onDelete, showSecondaryActions }: Props) => {\n const [showDeletionModal, setShowDeletionModal] = useState(false);\n\n const onDeletePanel = () => {\n onDelete?.(libraryPanel);\n setShowDeletionModal(false);\n };\n\n const panelPlugin = config.panels[libraryPanel.model.type] ?? getPanelPluginNotFound(libraryPanel.model.type).meta;\n\n return (\n <>\n onClick?.(libraryPanel)}\n onDelete={showSecondaryActions ? () => setShowDeletionModal(true) : undefined}\n >\n \n \n {showDeletionModal && (\n setShowDeletionModal(false)}\n />\n )}\n \n );\n};\n\nconst LibraryPanelCardSkeleton: SkeletonComponent> = ({\n showSecondaryActions,\n rootProps,\n}) => {\n const styles = useStyles2(getStyles);\n\n return (\n \n \n \n );\n};\n\nexport const LibraryPanelCard = attachSkeleton(LibraryPanelCardComponent, LibraryPanelCardSkeleton);\n\ninterface FolderLinkProps {\n libraryPanel: LibraryElementDTO;\n}\n\nfunction FolderLink({ libraryPanel }: FolderLinkProps): ReactElement | null {\n const styles = useStyles2(getStyles);\n\n if (!libraryPanel.meta?.folderUid && !libraryPanel.meta?.folderName) {\n return null;\n }\n\n if (!libraryPanel.meta.folderUid) {\n return (\n \n \n {libraryPanel.meta.folderName}\n \n );\n }\n\n return (\n \n \n \n {libraryPanel.meta.folderName}\n \n \n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n metaContainer: css({\n display: 'flex',\n alignItems: 'center',\n color: theme.colors.text.secondary,\n fontSize: theme.typography.bodySmall.fontSize,\n paddingTop: theme.spacing(0.5),\n\n svg: {\n marginRight: theme.spacing(0.5),\n marginBottom: 3,\n },\n }),\n };\n}\n","import { AnyAction } from '@reduxjs/toolkit';\nimport { Dispatch } from 'react';\nimport { from, merge, of, Subscription, timer } from 'rxjs';\nimport { catchError, finalize, mapTo, mergeMap, share, takeUntil } from 'rxjs/operators';\n\nimport { PanelPluginMeta } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { LibraryPanel } from '@grafana/schema';\nimport { getAllPanelPluginMeta } from 'app/features/panel/state/util';\n\nimport { deleteLibraryPanel as apiDeleteLibraryPanel, getLibraryPanels } from '../../state/api';\n\nimport { initialLibraryPanelsViewState, initSearch, searchCompleted } from './reducer';\n\ntype DispatchResult = (dispatch: Dispatch) => void;\ninterface SearchArgs {\n perPage: number;\n page: number;\n searchString: string;\n sortDirection?: string;\n panelFilter?: string[];\n folderFilterUIDs?: string[];\n currentPanelId?: string;\n isWidget?: boolean;\n}\n\nexport function searchForLibraryPanels(args: SearchArgs): DispatchResult {\n // Functions to support filtering out library panels per plugin type that have skipDataQuery set to true\n\n const findPluginMeta = (pluginMeta: PanelPluginMeta, libraryPanel: LibraryPanel) =>\n pluginMeta.id === libraryPanel.type;\n\n const filterLibraryPanels = (libraryPanels: LibraryPanel[], isWidget: boolean) => {\n const pluginMetaList = getAllPanelPluginMeta();\n\n return libraryPanels.filter((libraryPanel) => {\n const matchingPluginMeta = pluginMetaList.find((pluginMeta) => findPluginMeta(pluginMeta, libraryPanel));\n // widget mode filter\n if (isWidget) {\n return !!matchingPluginMeta?.skipDataQuery;\n }\n // non-widget mode filter\n return !matchingPluginMeta?.skipDataQuery;\n });\n };\n\n return function (dispatch) {\n const subscription = new Subscription();\n const dataObservable = from(\n getLibraryPanels({\n searchString: args.searchString,\n perPage: args.perPage,\n page: args.page,\n excludeUid: args.currentPanelId,\n sortDirection: args.sortDirection,\n typeFilter: args.panelFilter,\n folderFilterUIDs: args.folderFilterUIDs,\n })\n ).pipe(\n //filter out library panels per plugin type that have skipDataQuery set to true\n mergeMap((libraryPanelsResult) => {\n const { elements: libraryPanels } = libraryPanelsResult;\n\n if (config.featureToggles.vizAndWidgetSplit && args.isWidget !== undefined) {\n const filteredLibraryPanels = filterLibraryPanels(libraryPanels, args.isWidget);\n return of({ ...libraryPanelsResult, elements: filteredLibraryPanels });\n }\n\n return of({ ...libraryPanelsResult, elements: libraryPanels });\n }),\n mergeMap(({ perPage, elements: libraryPanels, page, totalCount }) =>\n of(searchCompleted({ libraryPanels, page, perPage, totalCount }))\n ),\n catchError((err) => {\n console.error(err);\n return of(searchCompleted({ ...initialLibraryPanelsViewState, page: args.page, perPage: args.perPage }));\n }),\n finalize(() => subscription.unsubscribe()), // make sure we unsubscribe\n share()\n );\n\n subscription.add(\n // If 50ms without a response dispatch a loading state\n // mapTo will translate the timer event into a loading state\n // takeUntil will cancel the timer emit when first response is received on the dataObservable\n merge(timer(50).pipe(mapTo(initSearch()), takeUntil(dataObservable)), dataObservable).subscribe(dispatch)\n );\n };\n}\n\nexport function deleteLibraryPanel(uid: string, args: SearchArgs): DispatchResult {\n return async function (dispatch) {\n try {\n await apiDeleteLibraryPanel(uid);\n searchForLibraryPanels(args)(dispatch);\n } catch (e) {\n console.error(e);\n }\n };\n}\n\nexport function asyncDispatcher(dispatch: Dispatch) {\n return function (action: any) {\n if (action instanceof Function) {\n return action(dispatch);\n }\n return dispatch(action);\n };\n}\n","import { createAction } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\n\nimport { LoadingState } from '@grafana/data';\n\nimport { LibraryElementDTO } from '../../types';\n\nexport interface LibraryPanelsViewState {\n loadingState: LoadingState;\n libraryPanels: LibraryElementDTO[];\n totalCount: number;\n perPage: number;\n page: number;\n numberOfPages: number;\n currentPanelId?: string;\n}\n\nexport const initialLibraryPanelsViewState: LibraryPanelsViewState = {\n loadingState: LoadingState.Loading,\n libraryPanels: [],\n totalCount: 0,\n perPage: 40,\n page: 1,\n numberOfPages: 0,\n currentPanelId: undefined,\n};\n\nexport const initSearch = createAction('libraryPanels/view/initSearch');\nexport const searchCompleted = createAction<\n Omit\n>('libraryPanels/view/searchCompleted');\n\nexport const changePage = createAction>('libraryPanels/view/changePage');\n\nexport const libraryPanelsViewReducer = (state: LibraryPanelsViewState, action: AnyAction) => {\n if (initSearch.match(action)) {\n return { ...state, loadingState: LoadingState.Loading };\n }\n\n if (searchCompleted.match(action)) {\n const { libraryPanels, page, perPage, totalCount } = action.payload;\n const numberOfPages = Math.ceil(totalCount / perPage);\n return {\n ...state,\n libraryPanels,\n perPage,\n totalCount,\n loadingState: LoadingState.Done,\n numberOfPages,\n page: page > numberOfPages ? page - 1 : page,\n };\n }\n\n if (changePage.match(action)) {\n return { ...state, page: action.payload.page };\n }\n\n return state;\n};\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport function getModalStyles(theme: GrafanaTheme2) {\n return {\n myTable: css`\n max-height: 204px;\n overflow-y: auto;\n margin-top: 11px;\n margin-bottom: 28px;\n border-radius: ${theme.shape.radius.default};\n border: 1px solid ${theme.colors.action.hover};\n background: ${theme.colors.background.primary};\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.h6.fontSize};\n width: 100%;\n\n thead {\n color: #538ade;\n font-size: ${theme.typography.bodySmall.fontSize};\n }\n\n th,\n td {\n padding: 6px 13px;\n height: ${theme.spacing(4)};\n }\n\n tbody > tr:nth-child(odd) {\n background: ${theme.colors.background.secondary};\n }\n `,\n noteTextbox: css`\n margin-bottom: ${theme.spacing(4)};\n `,\n textInfo: css`\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.size.sm};\n `,\n dashboardSearch: css`\n margin-top: ${theme.spacing(2)};\n `,\n modal: css`\n width: 500px;\n `,\n modalText: css`\n font-size: ${theme.typography.h4.fontSize};\n color: ${theme.colors.text.primary};\n margin-bottom: ${theme.spacing(4)};\n padding-top: ${theme.spacing(2)};\n `,\n };\n}\n","import { t } from 'i18next';\n\nimport { getBackendSrv } from '@grafana/runtime';\n\nimport { validationSrv } from '../services/ValidationSrv';\n\nexport const validateDashboardJson = (json: string) => {\n let dashboard;\n try {\n dashboard = JSON.parse(json);\n } catch (error) {\n return t('dashboard.validation.invalid-json', 'Not valid JSON');\n }\n if (dashboard && dashboard.hasOwnProperty('tags')) {\n if (Array.isArray(dashboard.tags)) {\n const hasInvalidTag = dashboard.tags.some((tag: string) => typeof tag !== 'string');\n if (hasInvalidTag) {\n return t('dashboard.validation.tags-expected-strings', 'tags expected array of strings');\n }\n } else {\n return t('dashboard.validation.tags-expected-array', 'tags expected array');\n }\n }\n return true;\n};\n\nexport const validateGcomDashboard = (gcomDashboard: string) => {\n // From DashboardImportCtrl\n const match = /(^\\d+$)|dashboards\\/(\\d+)/.exec(gcomDashboard);\n\n return match && (match[1] || match[2])\n ? true\n : t('dashboard.validation.invalid-dashboard-id', 'Could not find a valid Grafana.com ID');\n};\n\nexport const validateTitle = (newTitle: string, folderUid: string) => {\n return validationSrv\n .validateNewDashboardName(folderUid, newTitle)\n .then(() => {\n return true;\n })\n .catch((error) => {\n if (error.type === 'EXISTING') {\n return error.message;\n }\n });\n};\n\nexport const validateUid = (value: string) => {\n return getBackendSrv()\n .get(`/api/dashboards/uid/${value}`)\n .then((existingDashboard) => {\n return `Dashboard named '${existingDashboard?.dashboard.title}' in folder '${existingDashboard?.meta.folderTitle}' has the same UID`;\n })\n .catch((error) => {\n error.isHandled = true;\n return true;\n });\n};\n","import { css } from '@emotion/css';\nimport React, { ReactElement } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { LibraryPanel } from '@grafana/schema';\nimport { Field, useStyles2 } from '@grafana/ui';\n\nimport { LibraryPanelCard } from '../../library-panels/components/LibraryPanelCard/LibraryPanelCard';\nimport { LibraryPanelInput, LibraryPanelInputState } from '../state/reducers';\n\ninterface ImportDashboardLibraryPanelsListProps {\n inputs: LibraryPanelInput[];\n label: string;\n description: string;\n folderName?: string;\n}\n\nexport function ImportDashboardLibraryPanelsList({\n inputs,\n label,\n description,\n folderName,\n}: ImportDashboardLibraryPanelsListProps): ReactElement | null {\n const styles = useStyles2(getStyles);\n\n if (!Boolean(inputs?.length)) {\n return null;\n }\n\n return (\n
\n \n <>\n {inputs.map((input, index) => {\n const libraryPanelIndex = `elements[${index}]`;\n const libraryPanel =\n input.state === LibraryPanelInputState.New\n ? { ...input.model, meta: { ...input.model.meta, folderName: folderName ?? 'General' } }\n : { ...input.model };\n\n return (\n
\n undefined} />\n
\n );\n })}\n \n
\n
\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n spacer: css`\n margin-bottom: ${theme.spacing(2)};\n `,\n item: css`\n margin-bottom: ${theme.spacing(1)};\n `,\n };\n}\n","import React, { useEffect, useState } from 'react';\n\nimport { selectors } from '@grafana/e2e-selectors';\nimport { ExpressionDatasourceRef } from '@grafana/runtime/src/utils/DataSourceWithBackend';\nimport {\n Button,\n Field,\n FormAPI,\n FormFieldErrors,\n FormsOnSubmit,\n HorizontalGroup,\n Input,\n InputControl,\n Legend,\n} from '@grafana/ui';\nimport { OldFolderPicker } from 'app/core/components/Select/OldFolderPicker';\nimport { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker';\n\nimport {\n DashboardInput,\n DashboardInputs,\n DataSourceInput,\n ImportDashboardDTO,\n LibraryPanelInputState,\n} from '../state/reducers';\nimport { validateTitle, validateUid } from '../utils/validation';\n\nimport { ImportDashboardLibraryPanelsList } from './ImportDashboardLibraryPanelsList';\n\ninterface Props extends Pick, 'register' | 'errors' | 'control' | 'getValues' | 'watch'> {\n uidReset: boolean;\n inputs: DashboardInputs;\n initialFolderUid: string;\n\n onCancel: () => void;\n onUidReset: () => void;\n onSubmit: FormsOnSubmit;\n}\n\nexport const ImportDashboardForm = ({\n register,\n errors,\n control,\n getValues,\n uidReset,\n inputs,\n initialFolderUid,\n onUidReset,\n onCancel,\n onSubmit,\n watch,\n}: Props) => {\n const [isSubmitted, setSubmitted] = useState(false);\n const watchDataSources = watch('dataSources');\n const watchFolder = watch('folder');\n\n /*\n This useEffect is needed for overwriting a dashboard. It\n submits the form even if there's validation errors on title or uid.\n */\n useEffect(() => {\n if (isSubmitted && (errors.title || errors.uid)) {\n onSubmit(getValues());\n }\n }, [errors, getValues, isSubmitted, onSubmit]);\n const newLibraryPanels = inputs?.libraryPanels?.filter((i) => i.state === LibraryPanelInputState.New) ?? [];\n const existingLibraryPanels = inputs?.libraryPanels?.filter((i) => i.state === LibraryPanelInputState.Exists) ?? [];\n\n return (\n <>\n Options\n \n await validateTitle(v, getValues().folder.uid),\n })}\n type=\"text\"\n data-testid={selectors.components.ImportDashboardForm.name}\n />\n \n \n (\n \n )}\n name=\"folder\"\n control={control}\n />\n \n \n <>\n {!uidReset ? (\n await validateUid(v) })}\n addonAfter={!uidReset && }\n />\n ) : (\n await validateUid(v) })} />\n )}\n \n \n {inputs.dataSources &&\n inputs.dataSources.map((input: DataSourceInput, index: number) => {\n if (input.pluginId === ExpressionDatasourceRef.type) {\n return null;\n }\n const dataSourceOption = `dataSources.${index}` as const;\n const current = watchDataSources ?? [];\n return (\n \n (\n \n )}\n control={control}\n rules={{ required: true }}\n />\n \n );\n })}\n {inputs.constants &&\n inputs.constants.map((input: DashboardInput, index) => {\n const constantIndex = `constants.${index}` as const;\n return (\n \n \n \n );\n })}\n \n \n \n {\n setSubmitted(true);\n }}\n >\n {getButtonText(errors)}\n \n \n \n \n );\n};\n\nfunction getButtonVariant(errors: FormFieldErrors) {\n return errors && (errors.title || errors.uid) ? 'destructive' : 'primary';\n}\n\nfunction getButtonText(errors: FormFieldErrors) {\n return errors && (errors.title || errors.uid) ? 'Import (Overwrite)' : 'Import';\n}\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { dateTimeFormat } from '@grafana/data';\nimport { locationService, reportInteraction } from '@grafana/runtime';\nimport { Form, Legend } from '@grafana/ui';\nimport { StoreState } from 'app/types';\n\nimport { clearLoadedDashboard, importDashboard } from '../state/actions';\nimport { DashboardSource, ImportDashboardDTO } from '../state/reducers';\n\nimport { ImportDashboardForm } from './ImportDashboardForm';\n\nconst IMPORT_FINISHED_EVENT_NAME = 'dashboard_import_imported';\n\nconst mapStateToProps = (state: StoreState) => {\n const searchObj = locationService.getSearchObject();\n\n return {\n dashboard: state.importDashboard.dashboard,\n meta: state.importDashboard.meta,\n source: state.importDashboard.source,\n inputs: state.importDashboard.inputs,\n folder: searchObj.folderUid ? { uid: String(searchObj.folderUid) } : { uid: '' },\n };\n};\n\nconst mapDispatchToProps = {\n clearLoadedDashboard,\n importDashboard,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype Props = ConnectedProps;\n\ninterface State {\n uidReset: boolean;\n}\n\nclass ImportDashboardOverviewUnConnected extends PureComponent {\n state: State = {\n uidReset: false,\n };\n\n onSubmit = (form: ImportDashboardDTO) => {\n reportInteraction(IMPORT_FINISHED_EVENT_NAME);\n\n this.props.importDashboard(form);\n };\n\n onCancel = () => {\n this.props.clearLoadedDashboard();\n };\n\n onUidReset = () => {\n this.setState({ uidReset: true });\n };\n\n render() {\n const { dashboard, inputs, meta, source, folder } = this.props;\n const { uidReset } = this.state;\n\n return (\n <>\n {source === DashboardSource.Gcom && (\n
\n
\n \n Importing dashboard from{' '}\n \n Grafana.com\n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n
Published by{meta.orgName}
Updated on{dateTimeFormat(meta.updatedAt)}
\n
\n )}\n \n {({ register, errors, control, watch, getValues }) => (\n \n )}\n \n \n );\n }\n}\n\nexport const ImportDashboardOverview = connector(ImportDashboardOverviewUnConnected);\nImportDashboardOverview.displayName = 'ImportDashboardOverview';\n","import { css } from '@emotion/css';\nimport React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { AppEvents, GrafanaTheme2, LoadingState, NavModelItem } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport {\n Button,\n Field,\n Form,\n HorizontalGroup,\n Input,\n Spinner,\n stylesFactory,\n TextArea,\n Themeable2,\n VerticalGroup,\n FileDropzone,\n withTheme2,\n DropzoneFile,\n FileDropzoneDefaultChildren,\n LinkButton,\n TextLink,\n Label,\n} from '@grafana/ui';\nimport appEvents from 'app/core/app_events';\nimport { Page } from 'app/core/components/Page/Page';\nimport { t, Trans } from 'app/core/internationalization';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { StoreState } from 'app/types';\n\nimport { cleanUpAction } from '../../core/actions/cleanUp';\n\nimport { ImportDashboardOverview } from './components/ImportDashboardOverview';\nimport { fetchGcomDashboard, importDashboardJson } from './state/actions';\nimport { initialImportDashboardState } from './state/reducers';\nimport { validateDashboardJson, validateGcomDashboard } from './utils/validation';\n\ntype DashboardImportPageRouteSearchParams = {\n gcomDashboardId?: string;\n};\n\ntype OwnProps = Themeable2 & GrafanaRouteComponentProps<{}, DashboardImportPageRouteSearchParams>;\n\nconst IMPORT_STARTED_EVENT_NAME = 'dashboard_import_loaded';\nconst JSON_PLACEHOLDER = `{\n \"title\": \"Example - Repeating Dictionary variables\",\n \"uid\": \"_0HnEoN4z\",\n \"panels\": [...]\n ...\n}\n`;\n\nconst mapStateToProps = (state: StoreState) => ({\n loadingState: state.importDashboard.state,\n});\n\nconst mapDispatchToProps = {\n fetchGcomDashboard,\n importDashboardJson,\n cleanUpAction,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\ntype Props = OwnProps & ConnectedProps;\n\nclass UnthemedDashboardImport extends PureComponent {\n constructor(props: Props) {\n super(props);\n const { gcomDashboardId } = this.props.queryParams;\n if (gcomDashboardId) {\n this.getGcomDashboard({ gcomDashboard: gcomDashboardId });\n return;\n }\n }\n\n componentWillUnmount() {\n this.props.cleanUpAction({ cleanupAction: (state) => (state.importDashboard = initialImportDashboardState) });\n }\n\n // Do not display upload file list\n fileListRenderer = (file: DropzoneFile, removeFile: (file: DropzoneFile) => void) => null;\n\n onFileUpload = (result: string | ArrayBuffer | null) => {\n reportInteraction(IMPORT_STARTED_EVENT_NAME, {\n import_source: 'json_uploaded',\n });\n\n try {\n this.props.importDashboardJson(JSON.parse(String(result)));\n } catch (error) {\n if (error instanceof Error) {\n appEvents.emit(AppEvents.alertError, ['Import failed', 'JSON -> JS Serialization failed: ' + error.message]);\n }\n return;\n }\n };\n\n getDashboardFromJson = (formData: { dashboardJson: string }) => {\n reportInteraction(IMPORT_STARTED_EVENT_NAME, {\n import_source: 'json_pasted',\n });\n\n this.props.importDashboardJson(JSON.parse(formData.dashboardJson));\n };\n\n getGcomDashboard = (formData: { gcomDashboard: string }) => {\n reportInteraction(IMPORT_STARTED_EVENT_NAME, {\n import_source: 'gcom',\n });\n\n let dashboardId;\n const match = /(^\\d+$)|dashboards\\/(\\d+)/.exec(formData.gcomDashboard);\n if (match && match[1]) {\n dashboardId = match[1];\n } else if (match && match[2]) {\n dashboardId = match[2];\n }\n\n if (dashboardId) {\n this.props.fetchGcomDashboard(dashboardId);\n }\n };\n\n renderImportForm() {\n const styles = importStyles(this.props.theme);\n\n const GcomDashboardsLink = () => (\n \n grafana.com/dashboards\n \n );\n\n return (\n <>\n
\n \n \n \n
\n
\n
\n {({ register, errors }) => (\n \n \n \n Find and import dashboards for common applications at \n \n \n \n }\n invalid={!!errors.gcomDashboard}\n error={errors.gcomDashboard && errors.gcomDashboard.message}\n >\n \n Load\n \n }\n />\n \n )}\n \n
\n
\n
\n {({ register, errors }) => (\n <>\n \n \n \n \n \n \n Cancel\n \n \n \n )}\n \n
\n \n );\n }\n\n pageNav: NavModelItem = {\n text: 'Import dashboard',\n subTitle: 'Import dashboard from file or Grafana.com',\n };\n\n render() {\n const { loadingState } = this.props;\n\n return (\n \n \n {loadingState === LoadingState.Loading && (\n \n \n \n \n \n )}\n {[LoadingState.Error, LoadingState.NotStarted].includes(loadingState) && this.renderImportForm()}\n {loadingState === LoadingState.Done && }\n \n \n );\n }\n}\n\nconst DashboardImportUnConnected = withTheme2(UnthemedDashboardImport);\nconst DashboardImport = connector(DashboardImportUnConnected);\nDashboardImport.displayName = 'DashboardImport';\nexport default DashboardImport;\n\nconst importStyles = stylesFactory((theme: GrafanaTheme2) => {\n return {\n option: css`\n margin-bottom: ${theme.spacing(4)};\n max-width: 600px;\n `,\n labelWithLink: css`\n max-width: 100%;\n `,\n linkWithinLabel: css`\n font-size: inherit;\n `,\n };\n});\n"],"names":["initialDeleteLibraryPanelModalState","searchCompleted","deleteLibraryPanelModalReducer","state","action","d","getConnectedDashboards","libraryPanel","dispatch","dashboards","api","DeleteLibraryPanelModal","onDismiss","onConfirm","styles","dashboardTitles","loadingState","asyncDispatch","connected","done","Modal","LoadingIndicator","HasConnectedDashboards","Confirm","Button","suffix","message","title","i","LibraryPanelCardComponent","onClick","onDelete","showSecondaryActions","showDeletionModal","setShowDeletionModal","onDeletePanel","panelPlugin","config","PanelTypeCard","FolderLink","LibraryPanelCardSkeleton","rootProps","getStyles","LibraryPanelCard","Link","Icon","theme","searchForLibraryPanels","args","findPluginMeta","pluginMeta","filterLibraryPanels","libraryPanels","isWidget","pluginMetaList","matchingPluginMeta","subscription","dataObservable","libraryPanelsResult","filteredLibraryPanels","perPage","page","totalCount","err","deleteLibraryPanel","uid","e","asyncDispatcher","initialLibraryPanelsViewState","initSearch","changePage","libraryPanelsViewReducer","numberOfPages","getModalStyles","validateDashboardJson","json","dashboard","tag","validateGcomDashboard","gcomDashboard","match","validateTitle","newTitle","folderUid","error","validateUid","value","existingDashboard","ImportDashboardLibraryPanelsList","inputs","label","description","folderName","Field","input","index","libraryPanelIndex","ImportDashboardForm","register","errors","control","getValues","uidReset","initialFolderUid","onUidReset","onCancel","onSubmit","watch","isSubmitted","setSubmitted","watchDataSources","watchFolder","newLibraryPanels","existingLibraryPanels","Legend","Input","v","selectors","InputControl","ref","field","OldFolderPicker","dataSourceOption","current","DataSourcePicker","constantIndex","getButtonVariant","getButtonText","IMPORT_FINISHED_EVENT_NAME","mapStateToProps","searchObj","mapDispatchToProps","connector","ImportDashboardOverviewUnConnected","form","meta","source","folder","Form","ImportDashboardOverview","IMPORT_STARTED_EVENT_NAME","JSON_PLACEHOLDER","UnthemedDashboardImport","props","file","removeFile","result","formData","dashboardId","gcomDashboardId","importStyles","GcomDashboardsLink","TextLink","FileDropzone","Label","TextArea","Page","Spinner","DashboardImportUnConnected","DashboardImport","stylesFactory"],"sourceRoot":""}