{"version":3,"file":"1832.0dfd49f78dc93c695e30.js","mappings":"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","sources":["webpack://grafana/./public/app/core/components/PanelTypeFilter/PanelTypeFilter.tsx","webpack://grafana/./public/app/features/library-panels/components/DeleteLibraryPanelModal/reducer.ts","webpack://grafana/./public/app/features/library-panels/components/DeleteLibraryPanelModal/DeleteLibraryPanelModal.tsx","webpack://grafana/./public/app/features/library-panels/components/DeleteLibraryPanelModal/actions.ts","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelCard/LibraryPanelCard.tsx","webpack://grafana/./public/app/core/components/FolderFilter/FolderFilter.tsx","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelsSearch/reducer.ts","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelsSearch/LibraryPanelsSearch.tsx","webpack://grafana/./public/app/features/library-panels/components/LibraryPanelsView/LibraryPanelsView.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/panel/components/VizTypePicker/PanelTypeCard.tsx","webpack://grafana/./public/app/features/panel/state/util.ts","webpack://grafana/./public/app/features/plugins/components/PluginStateInfo.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, PanelPluginMeta, SelectableValue } from '@grafana/data';\nimport { Icon, Button, MultiSelect, useStyles2 } from '@grafana/ui';\nimport { getAllPanelPluginMeta } from 'app/features/panel/state/util';\n\nexport interface Props {\n  onChange: (plugins: PanelPluginMeta[]) => void;\n  maxMenuHeight?: number;\n}\n\nexport const PanelTypeFilter = ({ onChange: propsOnChange, maxMenuHeight }: Props): JSX.Element => {\n  const plugins = useMemo<PanelPluginMeta[]>(() => {\n    return getAllPanelPluginMeta();\n  }, []);\n  const options = useMemo(\n    () =>\n      plugins\n        .map((p) => ({ label: p.name, imgUrl: p.info.logos.small, value: p }))\n        .sort((a, b) => a.label?.localeCompare(b.label)),\n    [plugins]\n  );\n  const [value, setValue] = useState<Array<SelectableValue<PanelPluginMeta>>>([]);\n  const onChange = useCallback(\n    (plugins: Array<SelectableValue<PanelPluginMeta>>) => {\n      const changedPlugins = [];\n      for (const plugin of plugins) {\n        if (plugin.value) {\n          changedPlugins.push(plugin.value);\n        }\n      }\n      propsOnChange(changedPlugins);\n      setValue(plugins);\n    },\n    [propsOnChange]\n  );\n  const styles = useStyles2(getStyles);\n\n  const selectOptions = {\n    defaultOptions: true,\n    getOptionLabel: (i: any) => i.label,\n    getOptionValue: (i: any) => i.value,\n    noOptionsMessage: 'No Panel types found',\n    placeholder: 'Filter by type',\n    maxMenuHeight,\n    options,\n    value,\n    onChange,\n  };\n\n  return (\n    <div className={styles.container}>\n      {value.length > 0 && (\n        <Button\n          size=\"xs\"\n          icon=\"trash-alt\"\n          variant=\"link\"\n          className={styles.clear}\n          onClick={() => onChange([])}\n          aria-label=\"Clear types\"\n        >\n          Clear types\n        </Button>\n      )}\n      <MultiSelect menuShouldPortal {...selectOptions} prefix={<Icon name=\"filter\" />} aria-label=\"Panel Type filter\" />\n    </div>\n  );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    container: css`\n      label: container;\n      position: relative;\n      min-width: 180px;\n      flex-grow: 1;\n    `,\n    clear: css`\n      label: clear;\n      font-size: ${theme.spacing(1.5)};\n      position: absolute;\n      top: -${theme.spacing(4.5)};\n      right: 0;\n    `,\n  };\n}\n","import { createAction } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\n\nimport { LoadingState } from '@grafana/data';\nimport { DashboardSearchHit } 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: DashboardSearchHit[] }>(\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 React, { FC, useEffect, useMemo, useReducer } from 'react';\n\nimport { LoadingState } from '@grafana/data';\nimport { Button, Modal, useStyles } 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<Props> = ({ libraryPanel, onDismiss, onConfirm }) => {\n  const styles = useStyles(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    <Modal className={styles.modal} title=\"Delete library panel\" icon=\"trash-alt\" onDismiss={onDismiss} isOpen={true}>\n      {!done ? <LoadingIndicator /> : null}\n      {done ? (\n        <div>\n          {connected ? <HasConnectedDashboards dashboardTitles={dashboardTitles} /> : null}\n          {!connected ? <Confirm /> : null}\n\n          <Modal.ButtonRow>\n            <Button variant=\"secondary\" onClick={onDismiss} fill=\"outline\">\n              Cancel\n            </Button>\n            <Button variant=\"destructive\" onClick={onConfirm} disabled={connected}>\n              Delete\n            </Button>\n          </Modal.ButtonRow>\n        </div>\n      ) : null}\n    </Modal>\n  );\n};\n\nconst LoadingIndicator: FC = () => <span>Loading library panel...</span>;\n\nconst Confirm: FC = () => {\n  const styles = useStyles(getModalStyles);\n\n  return <div className={styles.modalText}>Do you want to delete this panel?</div>;\n};\n\nconst HasConnectedDashboards: FC<{ dashboardTitles: string[] }> = ({ dashboardTitles }) => {\n  const styles = useStyles(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    <div>\n      <p className={styles.textInfo}>\n        {'This library panel can not be deleted because it is connected to '}\n        <strong>{message}</strong>\n        {' Remove the library panel from the dashboards listed below and retry.'}\n      </p>\n      <table className={styles.myTable}>\n        <thead>\n          <tr>\n            <th>Dashboard name</th>\n          </tr>\n        </thead>\n        <tbody>\n          {dashboardTitles.map((title, i) => (\n            <tr key={`dash-title-${i}`}>\n              <td>{title}</td>\n            </tr>\n          ))}\n        </tbody>\n      </table>\n    </div>\n  );\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 { css } from '@emotion/css';\nimport React, { ReactElement, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Icon, Link, useStyles2 } from '@grafana/ui';\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\nexport const LibraryPanelCard: React.FC<LibraryPanelCardProps & { children?: JSX.Element | JSX.Element[] }> = ({\n  libraryPanel,\n  onClick,\n  onDelete,\n  showSecondaryActions,\n}) => {\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      <PanelTypeCard\n        isCurrent={false}\n        title={libraryPanel.name}\n        description={libraryPanel.description}\n        plugin={panelPlugin}\n        onClick={() => onClick?.(libraryPanel)}\n        onDelete={showSecondaryActions ? () => setShowDeletionModal(true) : undefined}\n      >\n        <FolderLink libraryPanel={libraryPanel} />\n      </PanelTypeCard>\n      {showDeletionModal && (\n        <DeleteLibraryPanelModal\n          libraryPanel={libraryPanel}\n          onConfirm={onDeletePanel}\n          onDismiss={() => setShowDeletionModal(false)}\n        />\n      )}\n    </>\n  );\n};\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      <span className={styles.metaContainer}>\n        <Icon name={'folder'} size=\"sm\" />\n        <span>{libraryPanel.meta.folderName}</span>\n      </span>\n    );\n  }\n\n  return (\n    <span className={styles.metaContainer}>\n      <Link href={`/dashboards/f/${libraryPanel.meta.folderUid}`}>\n        <Icon name={'folder-upload'} size=\"sm\" />\n        <span>{libraryPanel.meta.folderName}</span>\n      </Link>\n    </span>\n  );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    metaContainer: css`\n      display: flex;\n      align-items: center;\n      color: ${theme.colors.text.secondary};\n      font-size: ${theme.typography.bodySmall.fontSize};\n      padding-top: ${theme.spacing(0.5)};\n\n      svg {\n        margin-right: ${theme.spacing(0.5)};\n        margin-bottom: 3px;\n      }\n    `,\n  };\n}\n","import { css } from '@emotion/css';\nimport debounce from 'debounce-promise';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { AsyncMultiSelect, Icon, Button, useStyles2 } from '@grafana/ui';\nimport { getBackendSrv } from 'app/core/services/backend_srv';\nimport { FolderInfo, PermissionLevelString } from 'app/types';\n\nexport interface FolderFilterProps {\n  onChange: (folder: FolderInfo[]) => void;\n  maxMenuHeight?: number;\n}\n\nexport function FolderFilter({ onChange: propsOnChange, maxMenuHeight }: FolderFilterProps): JSX.Element {\n  const styles = useStyles2(getStyles);\n  const [loading, setLoading] = useState(false);\n  const getOptions = useCallback((searchString: string) => getFoldersAsOptions(searchString, setLoading), []);\n  const debouncedLoadOptions = useMemo(() => debounce(getOptions, 300), [getOptions]);\n  const [value, setValue] = useState<Array<SelectableValue<FolderInfo>>>([]);\n  const onChange = useCallback(\n    (folders: Array<SelectableValue<FolderInfo>>) => {\n      const changedFolders = [];\n      for (const folder of folders) {\n        if (folder.value) {\n          changedFolders.push(folder.value);\n        }\n      }\n      propsOnChange(changedFolders);\n      setValue(folders);\n    },\n    [propsOnChange]\n  );\n  const selectOptions = {\n    defaultOptions: true,\n    isMulti: true,\n    noOptionsMessage: 'No folders found',\n    placeholder: 'Filter by folder',\n    maxMenuHeight,\n    value,\n    onChange,\n  };\n\n  return (\n    <div className={styles.container}>\n      {value.length > 0 && (\n        <Button\n          size=\"xs\"\n          icon=\"trash-alt\"\n          variant=\"link\"\n          className={styles.clear}\n          onClick={() => onChange([])}\n          aria-label=\"Clear folders\"\n        >\n          Clear folders\n        </Button>\n      )}\n      <AsyncMultiSelect\n        menuShouldPortal\n        {...selectOptions}\n        isLoading={loading}\n        loadOptions={debouncedLoadOptions}\n        prefix={<Icon name=\"filter\" />}\n        aria-label=\"Folder filter\"\n      />\n    </div>\n  );\n}\n\nasync function getFoldersAsOptions(searchString: string, setLoading: (loading: boolean) => void) {\n  setLoading(true);\n\n  const params = {\n    query: searchString,\n    type: 'dash-folder',\n    permission: PermissionLevelString.View,\n  };\n\n  const searchHits = await getBackendSrv().search(params);\n  const options = searchHits.map((d) => ({ label: d.title, value: { id: d.id, title: d.title } }));\n  if (!searchString || 'general'.includes(searchString.toLowerCase())) {\n    options.unshift({ label: 'General', value: { id: 0, title: 'General' } });\n  }\n\n  setLoading(false);\n\n  return options;\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    container: css`\n      label: container;\n      position: relative;\n      min-width: 180px;\n      flex-grow: 1;\n    `,\n    clear: css`\n      label: clear;\n      font-size: ${theme.spacing(1.5)};\n      position: absolute;\n      top: -${theme.spacing(4.5)};\n      right: 0;\n    `,\n  };\n}\n","import { createAction } from '@reduxjs/toolkit';\nimport { AnyAction } from 'redux';\n\nimport { PanelPluginMeta, SelectableValue } from '@grafana/data';\n\nimport { FolderInfo } from '../../../../types';\n\nexport interface LibraryPanelsSearchState {\n  searchQuery: string;\n  sortDirection?: string;\n  panelFilter: string[];\n  folderFilter: string[];\n}\n\nexport const initialLibraryPanelsSearchState: LibraryPanelsSearchState = {\n  searchQuery: '',\n  panelFilter: [],\n  folderFilter: [],\n  sortDirection: undefined,\n};\n\nexport const searchChanged = createAction<string>('libraryPanels/search/searchChanged');\nexport const sortChanged = createAction<SelectableValue<string>>('libraryPanels/search/sortChanged');\nexport const panelFilterChanged = createAction<PanelPluginMeta[]>('libraryPanels/search/panelFilterChanged');\nexport const folderFilterChanged = createAction<FolderInfo[]>('libraryPanels/search/folderFilterChanged');\n\nexport const libraryPanelsSearchReducer = (state: LibraryPanelsSearchState, action: AnyAction) => {\n  if (searchChanged.match(action)) {\n    return { ...state, searchQuery: action.payload };\n  }\n\n  if (sortChanged.match(action)) {\n    return { ...state, sortDirection: action.payload.value };\n  }\n\n  if (panelFilterChanged.match(action)) {\n    return { ...state, panelFilter: action.payload.map((p) => p.id) };\n  }\n\n  if (folderFilterChanged.match(action)) {\n    return { ...state, folderFilter: action.payload.map((f) => String(f.id!)) };\n  }\n\n  return state;\n};\n","import { css } from '@emotion/css';\nimport React, { useReducer } from 'react';\n\nimport { GrafanaTheme2, PanelPluginMeta, SelectableValue } from '@grafana/data';\nimport { HorizontalGroup, useStyles2, VerticalGroup, FilterInput } from '@grafana/ui';\n\nimport { FolderFilter } from '../../../../core/components/FolderFilter/FolderFilter';\nimport { PanelTypeFilter } from '../../../../core/components/PanelTypeFilter/PanelTypeFilter';\nimport { SortPicker } from '../../../../core/components/Select/SortPicker';\nimport { DEFAULT_PER_PAGE_PAGINATION } from '../../../../core/constants';\nimport { FolderInfo } from '../../../../types';\nimport { LibraryElementDTO } from '../../types';\nimport { LibraryPanelsView } from '../LibraryPanelsView/LibraryPanelsView';\n\nimport {\n  folderFilterChanged,\n  initialLibraryPanelsSearchState,\n  libraryPanelsSearchReducer,\n  panelFilterChanged,\n  searchChanged,\n  sortChanged,\n} from './reducer';\n\nexport enum LibraryPanelsSearchVariant {\n  Tight = 'tight',\n  Spacious = 'spacious',\n}\n\nexport interface LibraryPanelsSearchProps {\n  onClick: (panel: LibraryElementDTO) => void;\n  variant?: LibraryPanelsSearchVariant;\n  showSort?: boolean;\n  showPanelFilter?: boolean;\n  showFolderFilter?: boolean;\n  showSecondaryActions?: boolean;\n  currentPanelId?: string;\n  currentFolderId?: number;\n  perPage?: number;\n}\n\nexport const LibraryPanelsSearch = ({\n  onClick,\n  variant = LibraryPanelsSearchVariant.Spacious,\n  currentPanelId,\n  currentFolderId,\n  perPage = DEFAULT_PER_PAGE_PAGINATION,\n  showPanelFilter = false,\n  showFolderFilter = false,\n  showSort = false,\n  showSecondaryActions = false,\n}: LibraryPanelsSearchProps): JSX.Element => {\n  const styles = useStyles2(getStyles);\n  const [{ sortDirection, panelFilter, folderFilter, searchQuery }, dispatch] = useReducer(libraryPanelsSearchReducer, {\n    ...initialLibraryPanelsSearchState,\n    folderFilter: currentFolderId ? [currentFolderId.toString(10)] : [],\n  });\n  const onFilterChange = (searchString: string) => dispatch(searchChanged(searchString));\n  const onSortChange = (sorting: SelectableValue<string>) => dispatch(sortChanged(sorting));\n  const onFolderFilterChange = (folders: FolderInfo[]) => dispatch(folderFilterChanged(folders));\n  const onPanelFilterChange = (plugins: PanelPluginMeta[]) => dispatch(panelFilterChanged(plugins));\n\n  if (variant === LibraryPanelsSearchVariant.Spacious) {\n    return (\n      <div className={styles.container}>\n        <VerticalGroup spacing=\"lg\">\n          <FilterInput\n            value={searchQuery}\n            onChange={onFilterChange}\n            placeholder={'Search by name or description'}\n            width={0}\n          />\n          <div className={styles.buttonRow}>\n            <HorizontalGroup\n              spacing=\"sm\"\n              justify={(showSort && showPanelFilter) || showFolderFilter ? 'space-between' : 'flex-end'}\n            >\n              {showSort && (\n                <SortPicker value={sortDirection} onChange={onSortChange} filter={['alpha-asc', 'alpha-desc']} />\n              )}\n              <HorizontalGroup\n                spacing=\"sm\"\n                justify={showFolderFilter && showPanelFilter ? 'space-between' : 'flex-end'}\n              >\n                {showFolderFilter && <FolderFilter onChange={onFolderFilterChange} />}\n                {showPanelFilter && <PanelTypeFilter onChange={onPanelFilterChange} />}\n              </HorizontalGroup>\n            </HorizontalGroup>\n          </div>\n          <div className={styles.libraryPanelsView}>\n            <LibraryPanelsView\n              onClickCard={onClick}\n              searchString={searchQuery}\n              sortDirection={sortDirection}\n              panelFilter={panelFilter}\n              folderFilter={folderFilter}\n              currentPanelId={currentPanelId}\n              showSecondaryActions={showSecondaryActions}\n              perPage={perPage}\n            />\n          </div>\n        </VerticalGroup>\n      </div>\n    );\n  }\n\n  return (\n    <div className={styles.container}>\n      <VerticalGroup spacing=\"xs\">\n        <div className={styles.tightButtonRow}>\n          <div className={styles.tightFilter}>\n            <FilterInput value={searchQuery} onChange={onFilterChange} placeholder={'Search by name'} width={0} />\n          </div>\n          <div className={styles.tightSortFilter}>\n            {showSort && <SortPicker value={sortDirection} onChange={onSortChange} />}\n            {showFolderFilter && <FolderFilter onChange={onFolderFilterChange} maxMenuHeight={200} />}\n            {showPanelFilter && <PanelTypeFilter onChange={onPanelFilterChange} maxMenuHeight={200} />}\n          </div>\n        </div>\n        <div className={styles.libraryPanelsView}>\n          <LibraryPanelsView\n            onClickCard={onClick}\n            searchString={searchQuery}\n            sortDirection={sortDirection}\n            panelFilter={panelFilter}\n            folderFilter={folderFilter}\n            currentPanelId={currentPanelId}\n            showSecondaryActions={showSecondaryActions}\n            perPage={perPage}\n          />\n        </div>\n      </VerticalGroup>\n    </div>\n  );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    container: css`\n      width: 100%;\n      overflow-y: auto;\n      padding: ${theme.spacing(1)};\n    `,\n    buttonRow: css`\n      display: flex;\n      justify-content: space-between;\n      width: 100%;\n      margin-top: ${theme.spacing(2)}; // Clear types link\n    `,\n    tightButtonRow: css`\n      display: flex;\n      justify-content: space-between;\n      width: 100%;\n      margin-top: ${theme.spacing(4)}; // Clear types link\n    `,\n    tightFilter: css`\n      flex-grow: 1;\n    `,\n    tightSortFilter: css`\n      flex-grow: 1;\n      padding: ${theme.spacing(0, 0, 0, 0.5)};\n    `,\n    libraryPanelsView: css`\n      width: 100%;\n    `,\n  };\n}\n","import { css, cx } from '@emotion/css';\nimport React, { useMemo, useReducer } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { GrafanaTheme, LoadingState } from '@grafana/data';\nimport { Pagination, useStyles } from '@grafana/ui';\n\nimport { LibraryElementDTO } from '../../types';\nimport { LibraryPanelCard } from '../LibraryPanelCard/LibraryPanelCard';\n\nimport { asyncDispatcher, deleteLibraryPanel, searchForLibraryPanels } from './actions';\nimport { changePage, initialLibraryPanelsViewState, libraryPanelsViewReducer } from './reducer';\n\ninterface LibraryPanelViewProps {\n  className?: string;\n  onClickCard: (panel: LibraryElementDTO) => void;\n  showSecondaryActions?: boolean;\n  currentPanelId?: string;\n  searchString: string;\n  sortDirection?: string;\n  panelFilter?: string[];\n  folderFilter?: string[];\n  perPage?: number;\n}\n\nexport const LibraryPanelsView: React.FC<LibraryPanelViewProps> = ({\n  className,\n  onClickCard,\n  searchString,\n  sortDirection,\n  panelFilter,\n  folderFilter,\n  showSecondaryActions,\n  currentPanelId: currentPanel,\n  perPage: propsPerPage = 40,\n}) => {\n  const styles = useStyles(getPanelViewStyles);\n  const [{ libraryPanels, page, perPage, numberOfPages, loadingState, currentPanelId }, dispatch] = useReducer(\n    libraryPanelsViewReducer,\n    {\n      ...initialLibraryPanelsViewState,\n      currentPanelId: currentPanel,\n      perPage: propsPerPage,\n    }\n  );\n  const asyncDispatch = useMemo(() => asyncDispatcher(dispatch), [dispatch]);\n  useDebounce(\n    () =>\n      asyncDispatch(\n        searchForLibraryPanels({\n          searchString,\n          sortDirection,\n          panelFilter,\n          folderFilter,\n          page,\n          perPage,\n          currentPanelId,\n        })\n      ),\n    300,\n    [searchString, sortDirection, panelFilter, folderFilter, page, asyncDispatch]\n  );\n  const onDelete = ({ uid }: LibraryElementDTO) =>\n    asyncDispatch(deleteLibraryPanel(uid, { searchString, page, perPage }));\n  const onPageChange = (page: number) => asyncDispatch(changePage({ page }));\n\n  return (\n    <div className={cx(styles.container, className)}>\n      <div className={styles.libraryPanelList}>\n        {loadingState === LoadingState.Loading ? (\n          <p>Loading library panels...</p>\n        ) : libraryPanels.length < 1 ? (\n          <p className={styles.noPanelsFound}>No library panels found.</p>\n        ) : (\n          libraryPanels?.map((item, i) => (\n            <LibraryPanelCard\n              key={`library-panel=${i}`}\n              libraryPanel={item}\n              onDelete={onDelete}\n              onClick={onClickCard}\n              showSecondaryActions={showSecondaryActions}\n            />\n          ))\n        )}\n      </div>\n      {libraryPanels.length ? (\n        <div className={styles.pagination}>\n          <Pagination\n            currentPage={page}\n            numberOfPages={numberOfPages}\n            onNavigate={onPageChange}\n            hideWhenSinglePage={true}\n          />\n        </div>\n      ) : null}\n    </div>\n  );\n};\n\nconst getPanelViewStyles = (theme: GrafanaTheme) => {\n  return {\n    container: css`\n      display: flex;\n      flex-direction: column;\n      flex-wrap: nowrap;\n    `,\n    libraryPanelList: css`\n      max-width: 100%;\n      display: grid;\n      grid-gap: ${theme.spacing.sm};\n    `,\n    searchHeader: css`\n      display: flex;\n    `,\n    newPanelButton: css`\n      margin-top: 10px;\n      align-self: flex-start;\n    `,\n    pagination: css`\n      align-self: center;\n      margin-top: ${theme.spacing.sm};\n    `,\n    noPanelsFound: css`\n      label: noPanelsFound;\n      min-height: 200px;\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 { deleteLibraryPanel as apiDeleteLibraryPanel, getLibraryPanels } from '../../state/api';\n\nimport { initialLibraryPanelsViewState, initSearch, searchCompleted } from './reducer';\n\ntype DispatchResult = (dispatch: Dispatch<AnyAction>) => void;\ninterface SearchArgs {\n  perPage: number;\n  page: number;\n  searchString: string;\n  sortDirection?: string;\n  panelFilter?: string[];\n  folderFilter?: string[];\n  currentPanelId?: string;\n}\n\nexport function searchForLibraryPanels(args: SearchArgs): DispatchResult {\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        folderFilter: args.folderFilter,\n      })\n    ).pipe(\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<AnyAction>) {\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<LibraryPanelsViewState, 'currentPanelId' | 'searchString' | 'loadingState' | 'numberOfPages'>\n>('libraryPanels/view/searchCompleted');\n\nexport const changePage = createAction<Pick<LibraryPanelsViewState, 'page'>>('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 { GrafanaTheme } from '@grafana/data';\n\nexport function getModalStyles(theme: GrafanaTheme) {\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.border.radius.sm};\n      border: 1px solid ${theme.colors.bg3};\n      background: ${theme.colors.bg1};\n      color: ${theme.colors.textSemiWeak};\n      font-size: ${theme.typography.size.md};\n      width: 100%;\n\n      thead {\n        color: #538ade;\n        font-size: ${theme.typography.size.sm};\n      }\n\n      th,\n      td {\n        padding: 6px 13px;\n        height: ${theme.spacing.xl};\n      }\n\n      tbody > tr:nth-child(odd) {\n        background: ${theme.colors.bg2};\n      }\n    `,\n    noteTextbox: css`\n      margin-bottom: ${theme.spacing.xl};\n    `,\n    textInfo: css`\n      color: ${theme.colors.textSemiWeak};\n      font-size: ${theme.typography.size.sm};\n    `,\n    dashboardSearch: css`\n      margin-top: ${theme.spacing.md};\n    `,\n    modal: css`\n      width: 500px;\n    `,\n    modalText: css`\n      font-size: ${theme.typography.heading.h4};\n      color: ${theme.colors.link};\n      margin-bottom: calc(${theme.spacing.d} * 2);\n      padding-top: ${theme.spacing.d};\n    `,\n  };\n}\n","import { css, cx } from '@emotion/css';\nimport React, { MouseEventHandler } from 'react';\n\nimport { GrafanaTheme2, isUnsignedPluginSignature, PanelPluginMeta, PluginState } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { IconButton, PluginSignatureBadge, useStyles2 } from '@grafana/ui';\nimport { PluginStateInfo } from 'app/features/plugins/components/PluginStateInfo';\n\ninterface Props {\n  isCurrent: boolean;\n  plugin: PanelPluginMeta;\n  title: string;\n  onClick: MouseEventHandler<HTMLDivElement>;\n  onDelete?: () => void;\n  disabled?: boolean;\n  showBadge?: boolean;\n  description?: string;\n}\n\nexport const PanelTypeCard: React.FC<Props> = ({\n  isCurrent,\n  title,\n  plugin,\n  onClick,\n  onDelete,\n  disabled,\n  showBadge,\n  description,\n  children,\n}) => {\n  const styles = useStyles2(getStyles);\n  const cssClass = cx({\n    [styles.item]: true,\n    [styles.disabled]: disabled || plugin.state === PluginState.deprecated,\n    [styles.current]: isCurrent,\n  });\n\n  return (\n    <div\n      className={cssClass}\n      aria-label={selectors.components.PluginVisualization.item(plugin.name)}\n      onClick={disabled ? undefined : onClick}\n      title={isCurrent ? 'Click again to close this section' : plugin.name}\n    >\n      <img className={styles.img} src={plugin.info.logos.small} alt=\"\" />\n\n      <div className={styles.itemContent}>\n        <div className={styles.name}>{title}</div>\n        {description ? <span className={styles.description}>{description}</span> : null}\n        {children}\n      </div>\n      {showBadge && (\n        <div className={cx(styles.badge, disabled && styles.disabled)}>\n          <PanelPluginBadge plugin={plugin} />\n        </div>\n      )}\n      {onDelete && (\n        <IconButton\n          name=\"trash-alt\"\n          onClick={(e) => {\n            e.stopPropagation();\n            onDelete();\n          }}\n          className={styles.deleteButton}\n          aria-label=\"Delete button on panel type card\"\n        />\n      )}\n    </div>\n  );\n};\n\nPanelTypeCard.displayName = 'PanelTypeCard';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    item: css`\n      position: relative;\n      display: flex;\n      flex-shrink: 0;\n      cursor: pointer;\n      background: ${theme.colors.background.secondary};\n      border-radius: ${theme.shape.borderRadius()};\n      box-shadow: ${theme.shadows.z1};\n      border: 1px solid ${theme.colors.background.secondary};\n      align-items: center;\n      padding: 8px;\n      width: 100%;\n      position: relative;\n      overflow: hidden;\n      transition: ${theme.transitions.create(['background'], {\n        duration: theme.transitions.duration.short,\n      })};\n\n      &:hover {\n        background: ${theme.colors.emphasize(theme.colors.background.secondary, 0.03)};\n      }\n    `,\n    itemContent: css`\n      overflow: hidden;\n      position: relative;\n      padding: ${theme.spacing(0, 1)};\n    `,\n    current: css`\n      label: currentVisualizationItem;\n      border: 1px solid ${theme.colors.primary.border};\n      background: ${theme.colors.action.selected};\n    `,\n    disabled: css`\n      opacity: 0.2;\n      filter: grayscale(1);\n      cursor: default;\n      pointer-events: none;\n    `,\n    name: css`\n      text-overflow: ellipsis;\n      overflow: hidden;\n      font-size: ${theme.typography.size.sm};\n      font-weight: ${theme.typography.fontWeightMedium};\n      width: 100%;\n    `,\n    description: css`\n      display: block;\n      text-overflow: ellipsis;\n      overflow: hidden;\n      color: ${theme.colors.text.secondary};\n      font-size: ${theme.typography.bodySmall.fontSize};\n      font-weight: ${theme.typography.fontWeightLight};\n      width: 100%;\n      max-height: 4.5em;\n    `,\n    img: css`\n      max-height: 38px;\n      width: 38px;\n      display: flex;\n      align-items: center;\n    `,\n    badge: css`\n      background: ${theme.colors.background.primary};\n    `,\n    deleteButton: css`\n      margin-left: auto;\n    `,\n  };\n};\n\ninterface PanelPluginBadgeProps {\n  plugin: PanelPluginMeta;\n}\n\nconst PanelPluginBadge: React.FC<PanelPluginBadgeProps> = ({ plugin }) => {\n  if (isUnsignedPluginSignature(plugin.signature)) {\n    return <PluginSignatureBadge status={plugin.signature} />;\n  }\n\n  return <PluginStateInfo state={plugin.state} />;\n};\n\nPanelPluginBadge.displayName = 'PanelPluginBadge';\n","import { PanelPluginMeta, PluginState, unEscapeStringFromRegex } from '@grafana/data';\nimport { config } from 'app/core/config';\n\nexport function getAllPanelPluginMeta(): PanelPluginMeta[] {\n  const allPanels = config.panels;\n\n  return Object.keys(allPanels)\n    .filter((key) => allPanels[key]['hideFromList'] === false)\n    .map((key) => allPanels[key])\n    .sort((a: PanelPluginMeta, b: PanelPluginMeta) => a.sort - b.sort);\n}\n\nexport function filterPluginList(\n  pluginsList: PanelPluginMeta[],\n  searchQuery: string, // Note: this will be an escaped regex string as it comes from `FilterInput`\n  current: PanelPluginMeta\n): PanelPluginMeta[] {\n  if (!searchQuery.length) {\n    return pluginsList.filter((p) => {\n      if (p.state === PluginState.deprecated) {\n        return current.id === p.id;\n      }\n      return true;\n    });\n  }\n\n  const query = unEscapeStringFromRegex(searchQuery).toLowerCase();\n  const first: PanelPluginMeta[] = [];\n  const match: PanelPluginMeta[] = [];\n  const isGraphQuery = 'graph'.startsWith(query);\n\n  for (const item of pluginsList) {\n    if (item.state === PluginState.deprecated && current.id !== item.id) {\n      continue;\n    }\n\n    const name = item.name.toLowerCase();\n    const idx = name.indexOf(query);\n\n    if (idx === 0) {\n      first.push(item);\n    } else if (idx > 0) {\n      match.push(item);\n    } else if (isGraphQuery && item.id === 'timeseries') {\n      first.push(item);\n    }\n  }\n\n  return first.concat(match);\n}\n","import React, { FC } from 'react';\n\nimport { PluginState } from '@grafana/data';\nimport { Badge, BadgeProps } from '@grafana/ui';\n\ninterface Props {\n  state?: PluginState;\n}\n\nexport const PluginStateInfo: FC<Props> = (props) => {\n  const display = getFeatureStateInfo(props.state);\n\n  if (!display) {\n    return null;\n  }\n\n  return <Badge color={display.color} title={display.tooltip} text={display.text} icon={display.icon} />;\n};\n\nfunction getFeatureStateInfo(state?: PluginState): BadgeProps | null {\n  switch (state) {\n    case PluginState.deprecated:\n      return {\n        text: 'Deprecated',\n        color: 'red',\n        tooltip: `This feature is deprecated and will be removed in a future release`,\n      };\n    case PluginState.alpha:\n      return {\n        text: 'Alpha',\n        color: 'blue',\n        tooltip: `This feature is experimental and future updates might not be backward compatible`,\n      };\n    case PluginState.beta:\n      return {\n        text: 'Beta',\n        color: 'blue',\n        tooltip: `This feature is close to complete but not fully tested`,\n      };\n    default:\n      return null;\n  }\n}\n"],"names":["PanelTypeFilter","onChange","propsOnChange","maxMenuHeight","plugins","useMemo","getAllPanelPluginMeta","options","map","p","label","name","imgUrl","info","logos","small","value","sort","a","b","localeCompare","setValue","useState","useCallback","changedPlugins","plugin","push","styles","useStyles2","getStyles","selectOptions","defaultOptions","getOptionLabel","i","getOptionValue","noOptionsMessage","placeholder","className","container","length","Button","size","icon","variant","clear","onClick","MultiSelect","menuShouldPortal","prefix","Icon","theme","css","spacing","initialDeleteLibraryPanelModalState","loadingState","LoadingState","dashboardTitles","searchCompleted","createAction","deleteLibraryPanelModalReducer","state","action","match","payload","dashboards","d","title","DeleteLibraryPanelModal","libraryPanel","onDismiss","onConfirm","useStyles","getModalStyles","dispatch","useReducer","asyncDispatch","asyncDispatcher","useEffect","async","apiGetConnectedDashboards","uid","getConnectedDashboards","connected","Boolean","done","Modal","modal","isOpen","LoadingIndicator","HasConnectedDashboards","Confirm","fill","disabled","modalText","suffix","message","textInfo","myTable","LibraryPanelCard","onDelete","showSecondaryActions","showDeletionModal","setShowDeletionModal","panelPlugin","config","model","type","getPanelPluginNotFound","meta","PanelTypeCard","isCurrent","description","undefined","FolderLink","folderUid","folderName","metaContainer","Link","href","colors","text","secondary","typography","bodySmall","fontSize","FolderFilter","loading","setLoading","getOptions","searchString","params","query","permission","PermissionLevelString","getBackendSrv","search","id","includes","toLowerCase","unshift","getFoldersAsOptions","debouncedLoadOptions","debounce","folders","changedFolders","folder","isMulti","AsyncMultiSelect","isLoading","loadOptions","initialLibraryPanelsSearchState","searchQuery","panelFilter","folderFilter","sortDirection","searchChanged","sortChanged","panelFilterChanged","folderFilterChanged","libraryPanelsSearchReducer","f","String","LibraryPanelsSearchVariant","LibraryPanelsSearch","Spacious","currentPanelId","currentFolderId","perPage","DEFAULT_PER_PAGE_PAGINATION","showPanelFilter","showFolderFilter","showSort","toString","onFilterChange","onSortChange","sorting","onFolderFilterChange","onPanelFilterChange","VerticalGroup","FilterInput","width","buttonRow","HorizontalGroup","justify","SortPicker","filter","libraryPanelsView","LibraryPanelsView","onClickCard","tightButtonRow","tightFilter","tightSortFilter","currentPanel","propsPerPage","getPanelViewStyles","libraryPanels","page","numberOfPages","libraryPanelsViewReducer","initialLibraryPanelsViewState","useDebounce","searchForLibraryPanels","deleteLibraryPanel","cx","libraryPanelList","noPanelsFound","item","pagination","Pagination","currentPage","onNavigate","changePage","hideWhenSinglePage","sm","searchHeader","newPanelButton","args","subscription","Subscription","dataObservable","from","getLibraryPanels","excludeUid","typeFilter","pipe","mergeMap","elements","totalCount","of","catchError","err","console","error","finalize","unsubscribe","share","add","merge","timer","mapTo","initSearch","takeUntil","subscribe","apiDeleteLibraryPanel","e","Function","Math","ceil","border","radius","bg3","bg1","textSemiWeak","md","xl","bg2","noteTextbox","dashboardSearch","heading","h4","link","showBadge","children","cssClass","PluginState","current","selectors","img","src","alt","itemContent","badge","PanelPluginBadge","IconButton","stopPropagation","deleteButton","displayName","background","shape","borderRadius","shadows","z1","transitions","create","duration","short","emphasize","primary","selected","fontWeightMedium","fontWeightLight","isUnsignedPluginSignature","signature","PluginSignatureBadge","status","allPanels","Object","keys","key","filterPluginList","pluginsList","unEscapeStringFromRegex","first","isGraphQuery","startsWith","idx","indexOf","concat","PluginStateInfo","props","display","color","tooltip","getFeatureStateInfo","Badge"],"sourceRoot":""}