{"version":3,"file":"4336.7ff3318b7404e8a6f932.js","mappings":"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","sources":["webpack://grafana/./public/app/core/components/PanelTypeFilter/PanelTypeFilter.tsx","webpack://grafana/./public/app/core/components/Select/SortPicker.tsx","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/core/components/FolderFilter/FolderFilter.tsx","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 { config } from '@grafana/runtime';\nimport { Icon, Button, MultiSelect, useStyles2 } from '@grafana/ui';\nimport { getAllPanelPluginMeta, getVizPluginMeta, getWidgetPluginMeta } from 'app/features/panel/state/util';\n\nexport interface Props {\n onChange: (plugins: PanelPluginMeta[]) => void;\n maxMenuHeight?: number;\n isWidget?: boolean;\n}\n\nexport const PanelTypeFilter = ({ onChange: propsOnChange, maxMenuHeight, isWidget = false }: Props): JSX.Element => {\n const getPluginMetaData = (): PanelPluginMeta[] => {\n if (config.featureToggles.vizAndWidgetSplit) {\n return isWidget ? getWidgetPluginMeta() : getVizPluginMeta();\n } else {\n return getAllPanelPluginMeta();\n }\n };\n\n const plugins = useMemo(getPluginMetaData, [isWidget]);\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>>([]);\n const onChange = useCallback(\n (plugins: Array>) => {\n const changedPlugins = plugins.filter((p) => p.value).map((p) => p.value!);\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: SelectableValue) => i.label,\n getOptionValue: (i: SelectableValue) => 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
\n {value.length > 0 && (\n onChange([])}\n aria-label=\"Clear types\"\n >\n Clear types\n \n )}\n {...selectOptions} prefix={} aria-label=\"Panel Type filter\" />\n
\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 React from 'react';\nimport { useAsync } from 'react-use';\n\nimport { SelectableValue } from '@grafana/data';\nimport { Icon, Select } from '@grafana/ui';\nimport { DEFAULT_SORT } from 'app/features/search/constants';\nimport { getGrafanaSearcher } from 'app/features/search/service';\n\nexport interface Props {\n onChange: (sortValue: SelectableValue) => void;\n value?: string;\n placeholder?: string;\n getSortOptions?: () => Promise;\n filter?: string[];\n isClearable?: boolean;\n}\n\nconst defaultSortOptionsGetter = (): Promise => {\n return getGrafanaSearcher().getSortOptions();\n};\n\nexport function SortPicker({ onChange, value, placeholder, filter, getSortOptions, isClearable }: Props) {\n // Using sync Select and manual options fetching here since we need to find the selected option by value\n const options = useAsync<() => Promise>(async () => {\n const vals = await (getSortOptions ?? defaultSortOptionsGetter)();\n if (filter) {\n return vals.filter((v) => filter.includes(v.value));\n }\n return vals;\n }, [getSortOptions, filter]);\n\n if (options.loading) {\n return null;\n }\n\n const isDesc = Boolean(value?.includes('desc') || value?.startsWith('-')); // bluge syntax starts with \"-\"\n return (\n opt.value === value) ?? null}\n options={options.value}\n aria-label=\"Sort\"\n placeholder={placeholder ?? `Sort (Default ${DEFAULT_SORT.label})`}\n prefix={}\n isClearable={isClearable}\n />\n );\n}\n","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';\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\ntype Props = LibraryPanelCardProps & { children?: JSX.Element | JSX.Element[] };\n\nexport const LibraryPanelCard = ({ 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\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 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 { DashboardSearchItemType } from 'app/features/search/types';\nimport { FolderInfo, PermissionLevelString } from 'app/types';\n\nexport interface FolderFilterProps {\n onChange: (folder: FolderInfo[]) => void;\n maxMenuHeight?: number;\n}\n\nexport function FolderFilter({ onChange, 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\n const [value, setValue] = useState>>([]);\n const onSelectOptionChange = useCallback(\n (folders: Array>) => {\n const changedFolderIds = folders.filter((f) => Boolean(f.value)).map((f) => f.value!);\n onChange(changedFolderIds);\n setValue(folders);\n },\n [onChange]\n );\n\n return (\n
\n {value.length > 0 && (\n onChange([])}\n aria-label=\"Clear folders\"\n >\n Clear folders\n \n )}\n }\n aria-label=\"Folder filter\"\n defaultOptions\n />\n
\n );\n}\n\nasync function getFoldersAsOptions(\n searchString: string,\n setLoading: (loading: boolean) => void\n): Promise>> {\n setLoading(true);\n\n const params = {\n query: searchString,\n type: DashboardSearchItemType.DashFolder,\n permission: PermissionLevelString.View,\n };\n\n // FIXME: stop using id from search and use UID instead\n const searchHits = await getBackendSrv().search(params);\n const options = searchHits.map((d) => ({ label: d.title, value: { uid: d.uid, title: d.title } }));\n if (!searchString || 'general'.includes(searchString.toLowerCase())) {\n options.unshift({ label: 'General', value: { uid: 'general', 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 { css } from '@emotion/css';\nimport React, { useCallback, useState } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { GrafanaTheme2, PanelPluginMeta, SelectableValue } from '@grafana/data';\nimport { useStyles2, VerticalGroup, FilterInput } from '@grafana/ui';\nimport { FolderInfo } from 'app/types';\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 { LibraryElementDTO } from '../../types';\nimport { LibraryPanelsView } from '../LibraryPanelsView/LibraryPanelsView';\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 currentFolderUID?: string;\n perPage?: number;\n}\n\nexport const LibraryPanelsSearch = ({\n onClick,\n variant = LibraryPanelsSearchVariant.Spacious,\n currentPanelId,\n currentFolderUID,\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(useCallback((theme) => getStyles(theme, variant), [variant]));\n\n const [searchQuery, setSearchQuery] = useState('');\n const [debouncedSearchQuery, setDebouncedSearchQuery] = useState('');\n useDebounce(() => setDebouncedSearchQuery(searchQuery), 200, [searchQuery]);\n\n const [sortDirection, setSortDirection] = useState>({});\n const [folderFilter, setFolderFilter] = useState(currentFolderUID ? [currentFolderUID] : []);\n const [panelFilter, setPanelFilter] = useState([]);\n\n const sortOrFiltersVisible = showSort || showPanelFilter || showFolderFilter;\n const verticalGroupSpacing = variant === LibraryPanelsSearchVariant.Tight ? 'lg' : 'xs';\n\n return (\n
\n \n
\n
\n \n
\n {sortOrFiltersVisible && (\n \n )}\n
\n\n
\n \n
\n
\n
\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2, variant: LibraryPanelsSearchVariant) {\n const tightLayout = css`\n flex-direction: row;\n row-gap: ${theme.spacing(1)};\n `;\n return {\n filterInputWrapper: css`\n flex-grow: ${variant === LibraryPanelsSearchVariant.Tight ? 1 : 'initial'};\n `,\n container: css`\n width: 100%;\n overflow-y: auto;\n padding: ${theme.spacing(1)};\n `,\n libraryPanelsView: css`\n width: 100%;\n `,\n gridContainer: css`\n ${variant === LibraryPanelsSearchVariant.Tight ? tightLayout : ''};\n display: flex;\n flex-direction: column;\n width: 100%;\n column-gap: ${theme.spacing(1)};\n row-gap: ${theme.spacing(1)};\n padding-bottom: ${theme.spacing(2)};\n `,\n };\n}\n\ninterface SearchControlsProps {\n showSort: boolean;\n showPanelFilter: boolean;\n showFolderFilter: boolean;\n sortDirection?: string;\n onSortChange: (sortValue: SelectableValue) => void;\n onFolderFilterChange: (folder: string[]) => void;\n onPanelFilterChange: (plugins: string[]) => void;\n variant?: LibraryPanelsSearchVariant;\n}\n\nconst SearchControls = React.memo(\n ({\n variant = LibraryPanelsSearchVariant.Spacious,\n showSort,\n showPanelFilter,\n showFolderFilter,\n sortDirection,\n onSortChange,\n onFolderFilterChange,\n onPanelFilterChange,\n }: SearchControlsProps) => {\n const styles = useStyles2(useCallback((theme) => getRowStyles(theme, variant), [variant]));\n const panelFilterChanged = useCallback(\n (plugins: PanelPluginMeta[]) => onPanelFilterChange(plugins.map((p) => p.id)),\n [onPanelFilterChange]\n );\n const folderFilterChanged = useCallback(\n (folders: FolderInfo[]) => onFolderFilterChange(folders.map((f) => f.uid ?? '')),\n [onFolderFilterChange]\n );\n\n return (\n
\n {showSort && }\n {(showFolderFilter || showPanelFilter) && (\n
\n {showFolderFilter && }\n {showPanelFilter && }\n
\n )}\n
\n );\n }\n);\nSearchControls.displayName = 'SearchControls';\n\nfunction getRowStyles(theme: GrafanaTheme2, variant = LibraryPanelsSearchVariant.Spacious) {\n const searchRowContainer = css`\n display: flex;\n gap: ${theme.spacing(1)};\n flex-grow: 1;\n flex-direction: row;\n justify-content: end;\n `;\n const searchRowContainerTight = css`\n ${searchRowContainer};\n flex-grow: initial;\n flex-direction: column;\n justify-content: normal;\n `;\n const filterContainer = css`\n display: flex;\n flex-direction: row;\n margin-left: auto;\n gap: 4px;\n `;\n const filterContainerTight = css`\n ${filterContainer};\n flex-direction: column;\n margin-left: initial;\n `;\n\n switch (variant) {\n case LibraryPanelsSearchVariant.Spacious:\n return {\n container: searchRowContainer,\n filterContainer: filterContainer,\n };\n case LibraryPanelsSearchVariant.Tight:\n return {\n container: searchRowContainerTight,\n filterContainer: filterContainerTight,\n };\n }\n}\n","import { css, cx } from '@emotion/css';\nimport React, { useMemo, useReducer } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { GrafanaTheme2, LoadingState } from '@grafana/data';\nimport { Pagination, useStyles2 } 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 isWidget?: boolean;\n}\n\nexport const LibraryPanelsView = ({\n className,\n onClickCard,\n searchString,\n sortDirection,\n panelFilter,\n folderFilter,\n showSecondaryActions,\n currentPanelId: currentPanel,\n perPage: propsPerPage = 40,\n isWidget,\n}: LibraryPanelViewProps) => {\n const styles = useStyles2(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 folderFilterUIDs: folderFilter,\n page,\n perPage,\n currentPanelId,\n isWidget,\n })\n ),\n 300,\n [searchString, sortDirection, panelFilter, folderFilter, page, asyncDispatch]\n );\n const onDelete = ({ uid }: LibraryElementDTO) =>\n asyncDispatch(\n deleteLibraryPanel(uid, {\n searchString,\n sortDirection,\n panelFilter,\n folderFilterUIDs: folderFilter,\n page,\n perPage,\n })\n );\n const onPageChange = (page: number) => asyncDispatch(changePage({ page }));\n\n return (\n
\n
\n {loadingState === LoadingState.Loading ? (\n

Loading library panels...

\n ) : libraryPanels.length < 1 ? (\n

No library panels found.

\n ) : (\n libraryPanels?.map((item, i) => (\n \n ))\n )}\n
\n {libraryPanels.length ? (\n
\n \n
\n ) : null}\n
\n );\n};\n\nconst getPanelViewStyles = (theme: GrafanaTheme2) => {\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(1)};\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(1)};\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 { 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 { 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;\n onDelete?: () => void;\n disabled?: boolean;\n showBadge?: boolean;\n description?: string;\n}\n\nexport const PanelTypeCard = ({\n isCurrent,\n title,\n plugin,\n onClick,\n onDelete,\n disabled,\n showBadge,\n description,\n children,\n}: React.PropsWithChildren) => {\n const styles = useStyles2(getStyles);\n const isDisabled = disabled || plugin.state === PluginState.deprecated;\n const cssClass = cx({\n [styles.item]: true,\n [styles.itemDisabled]: isDisabled,\n [styles.current]: isCurrent,\n });\n\n return (\n // TODO: fix keyboard a11y\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events\n \n \"\"\n\n
\n
{title}
\n {description ? {description} : null}\n {children}\n
\n {showBadge && (\n
\n \n
\n )}\n {onDelete && (\n {\n e.stopPropagation();\n onDelete();\n }}\n className={styles.deleteButton}\n aria-label=\"Delete button on panel type card\"\n tooltip=\"Delete\"\n />\n )}\n \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.radius.default};\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 itemDisabled: css`\n cursor: default;\n\n &,\n &:hover {\n background: ${theme.colors.action.disabledBackground};\n }\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.6;\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 cursor: pointer;\n margin-left: auto;\n `,\n };\n};\n\ninterface PanelPluginBadgeProps {\n plugin: PanelPluginMeta;\n}\n\nconst PanelPluginBadge = ({ plugin }: PanelPluginBadgeProps) => {\n if (isUnsignedPluginSignature(plugin.signature)) {\n return ;\n }\n\n return ;\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 getWidgetPluginMeta(): PanelPluginMeta[] {\n return getAllPanelPluginMeta().filter((panel) => !!panel.skipDataQuery);\n}\n\nexport function getVizPluginMeta(): PanelPluginMeta[] {\n return getAllPanelPluginMeta().filter((panel) => !panel.skipDataQuery);\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 from 'react';\n\nimport { PluginState } from '@grafana/data';\nimport { Badge, BadgeProps } from '@grafana/ui';\n\ninterface Props {\n state?: PluginState;\n className?: string;\n}\n\nexport const PluginStateInfo = (props: Props) => {\n const display = getFeatureStateInfo(props.state);\n\n if (!display) {\n return null;\n }\n\n return (\n \n );\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","propsOnChange","maxMenuHeight","isWidget","getPluginMetaData","plugins","options","p","a","b","value","setValue","onChange","changedPlugins","styles","getStyles","selectOptions","i","theme","defaultSortOptionsGetter","SortPicker","placeholder","filter","getSortOptions","isClearable","vals","v","isDesc","opt","initialDeleteLibraryPanelModalState","searchCompleted","deleteLibraryPanelModalReducer","state","action","d","getConnectedDashboards","libraryPanel","dispatch","dashboards","api","DeleteLibraryPanelModal","onDismiss","onConfirm","dashboardTitles","loadingState","asyncDispatch","connected","done","Modal","LoadingIndicator","HasConnectedDashboards","Confirm","Button","suffix","message","title","LibraryPanelCard","onClick","onDelete","showSecondaryActions","showDeletionModal","setShowDeletionModal","onDeletePanel","panelPlugin","config","PanelTypeCard","FolderLink","Link","Icon","FolderFilter","loading","setLoading","getOptions","searchString","getFoldersAsOptions","debouncedLoadOptions","onSelectOptionChange","folders","changedFolderIds","f","params","LibraryPanelsSearchVariant","LibraryPanelsSearch","variant","currentPanelId","currentFolderUID","perPage","showPanelFilter","showFolderFilter","showSort","searchQuery","setSearchQuery","debouncedSearchQuery","setDebouncedSearchQuery","useDebounce","sortDirection","setSortDirection","folderFilter","setFolderFilter","panelFilter","setPanelFilter","sortOrFiltersVisible","verticalGroupSpacing","FilterInput","SearchControls","LibraryPanelsView","tightLayout","onSortChange","onFolderFilterChange","onPanelFilterChange","getRowStyles","panelFilterChanged","folderFilterChanged","searchRowContainer","searchRowContainerTight","filterContainer","filterContainerTight","className","onClickCard","currentPanel","propsPerPage","getPanelViewStyles","libraryPanels","page","numberOfPages","uid","onPageChange","item","searchForLibraryPanels","args","findPluginMeta","pluginMeta","filterLibraryPanels","pluginMetaList","matchingPluginMeta","subscription","dataObservable","libraryPanelsResult","filteredLibraryPanels","totalCount","err","deleteLibraryPanel","e","asyncDispatcher","initialLibraryPanelsViewState","initSearch","changePage","libraryPanelsViewReducer","getModalStyles","isCurrent","plugin","disabled","showBadge","description","children","isDisabled","cssClass","PanelPluginBadge","getAllPanelPluginMeta","allPanels","key","getWidgetPluginMeta","panel","getVizPluginMeta","filterPluginList","pluginsList","current","query","first","match","isGraphQuery","idx","PluginStateInfo","props","display","getFeatureStateInfo"],"sourceRoot":""}