1 |
- {"version":3,"file":"9586.765861b89116524c9aec.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 fill=\"text\"\n className={styles.clear}\n onClick={() => onChange([])}\n aria-label=\"Clear types\"\n >\n Clear types\n </Button>\n )}\n <MultiSelect {...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 fill=\"text\"\n className={styles.clear}\n onClick={() => onChange([])}\n aria-label=\"Clear folders\"\n >\n Clear folders\n </Button>\n )}\n <AsyncMultiSelect\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","fill","clear","onClick","MultiSelect","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","variant","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":""}
|