⚝
One Hat Cyber Team
⚝
Your IP:
216.73.216.72
Server IP:
41.128.143.86
Server:
Linux host.raqmix.cloud 6.8.0-1025-azure #30~22.04.1-Ubuntu SMP Wed Mar 12 15:28:20 UTC 2025 x86_64
Server Software:
Apache
PHP Version:
8.3.23
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
proc
/
self
/
root
/
usr
/
share
/
grafana
/
public
/
build
/
View File Name :
PluginListPage.815b65d32380d0a800f7.js.map
{"version":3,"file":"PluginListPage.815b65d32380d0a800f7.js","mappings":"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","sources":["webpack://grafana/./public/app/features/plugins/admin/components/Badges/PluginDisabledBadge.tsx","webpack://grafana/./public/app/features/plugins/admin/components/Badges/sharedStyles.ts","webpack://grafana/./public/app/features/plugins/admin/components/Badges/PluginInstallBadge.tsx","webpack://grafana/./public/app/features/plugins/admin/components/Badges/PluginEnterpriseBadge.tsx","webpack://grafana/./public/app/features/plugins/admin/components/Badges/PluginUpdateAvailableBadge.tsx","webpack://grafana/./public/app/features/plugins/admin/components/Badges/PluginAngularBadge.tsx","webpack://grafana/./public/app/features/plugins/admin/components/Badges/PluginDeprecatedBadge.tsx","webpack://grafana/./public/app/features/plugins/admin/components/PluginListItemBadges.tsx","webpack://grafana/./public/app/features/plugins/admin/components/PluginLogo.tsx","webpack://grafana/./public/app/features/plugins/admin/components/PluginListItem.tsx","webpack://grafana/./public/app/features/plugins/admin/components/PluginList.tsx","webpack://grafana/./public/app/features/plugins/admin/components/SearchField.tsx","webpack://grafana/./public/app/features/plugins/admin/hooks/useHistory.tsx","webpack://grafana/./public/app/features/plugins/admin/pages/Browse.tsx","webpack://grafana/./public/app/features/plugins/admin/state/selectors.ts","webpack://grafana/./public/app/features/plugins/admin/state/hooks.ts"],"sourcesContent":["import React from 'react';\n\nimport { PluginErrorCode } from '@grafana/data';\nimport { Badge } from '@grafana/ui';\n\ntype Props = { error?: PluginErrorCode };\n\nexport function PluginDisabledBadge({ error }: Props): React.ReactElement {\n const tooltip = errorCodeToTooltip(error);\n return
;\n}\n\nfunction errorCodeToTooltip(error?: PluginErrorCode): string | undefined {\n switch (error) {\n case PluginErrorCode.modifiedSignature:\n return 'Plugin disabled due to modified content';\n case PluginErrorCode.invalidSignature:\n return 'Plugin disabled due to invalid plugin signature';\n case PluginErrorCode.missingSignature:\n return 'Plugin disabled due to missing plugin signature';\n case null:\n case undefined:\n return 'Plugin disabled';\n default:\n return `Plugin disabled due to unknown error${error ? `: ${error}` : ''}`;\n }\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nexport const getBadgeColor = (theme: GrafanaTheme2) => css`\n background: ${theme.colors.background.primary};\n border-color: ${theme.colors.border.strong};\n color: ${theme.colors.text.secondary};\n`;\n","import React from 'react';\n\nimport { Badge, useStyles2 } from '@grafana/ui';\n\nimport { getBadgeColor } from './sharedStyles';\n\nexport function PluginInstalledBadge(): React.ReactElement {\n const customBadgeStyles = useStyles2(getBadgeColor);\n return
;\n}\n","import React from 'react';\n\nimport { featureEnabled } from '@grafana/runtime';\nimport { Badge, Button, HorizontalGroup, PluginSignatureBadge, useStyles2 } from '@grafana/ui';\n\nimport { CatalogPlugin } from '../../types';\n\nimport { getBadgeColor } from './sharedStyles';\n\ntype Props = { plugin: CatalogPlugin };\n\nexport function PluginEnterpriseBadge({ plugin }: Props): React.ReactElement {\n const customBadgeStyles = useStyles2(getBadgeColor);\n const onClick = (ev: React.MouseEvent
) => {\n ev.preventDefault();\n window.open(\n `https://grafana.com/grafana/plugins/${plugin.id}?utm_source=grafana_catalog_learn_more`,\n '_blank',\n 'noopener,noreferrer'\n );\n };\n\n if (featureEnabled('enterprise.plugins')) {\n return
;\n }\n\n return (\n
\n
\n
\n
\n Learn more\n
\n
\n );\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { CatalogPlugin } from '../../types';\n\ntype Props = {\n plugin: CatalogPlugin;\n};\n\nexport function PluginUpdateAvailableBadge({ plugin }: Props): React.ReactElement | null {\n const styles = useStyles2(getStyles);\n return
Update available!
;\n}\n\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n hasUpdate: css`\n color: ${theme.colors.text.secondary};\n font-size: ${theme.typography.bodySmall.fontSize};\n margin-bottom: 0;\n `,\n };\n};\n","import React from 'react';\n\nimport { Badge } from '@grafana/ui';\n\nexport function PluginAngularBadge(): React.ReactElement {\n return (\n
\n );\n}\n","import React from 'react';\n\nimport { Badge } from '@grafana/ui';\n\nexport function PluginDeprecatedBadge(): React.ReactElement {\n return (\n
\n );\n}\n","import React from 'react';\n\nimport { PluginType } from '@grafana/data';\nimport { HorizontalGroup, PluginSignatureBadge } from '@grafana/ui';\n\nimport { CatalogPlugin } from '../types';\n\nimport {\n PluginEnterpriseBadge,\n PluginDisabledBadge,\n PluginInstalledBadge,\n PluginUpdateAvailableBadge,\n PluginAngularBadge,\n PluginDeprecatedBadge,\n} from './Badges';\n\ntype PluginBadgeType = {\n plugin: CatalogPlugin;\n};\n\nexport function PluginListItemBadges({ plugin }: PluginBadgeType) {\n // Currently renderer plugins are not supported by the catalog due to complications related to installation / update / uninstall.\n const hasUpdate = plugin.hasUpdate && !plugin.isCore && plugin.type !== PluginType.renderer;\n if (plugin.isEnterprise) {\n return (\n
\n
\n {plugin.isDisabled &&
}\n {hasUpdate &&
}\n {plugin.angularDetected &&
}\n
\n );\n }\n\n return (\n
\n
\n {plugin.isDisabled &&
}\n {plugin.isDeprecated &&
}\n {plugin.isInstalled &&
}\n {hasUpdate &&
}\n {plugin.angularDetected &&
}\n
\n );\n}\n","import React from 'react';\n\ntype PluginLogoProps = {\n alt: string;\n className?: string;\n src: string;\n height?: string | number;\n};\n\nexport function PluginLogo({ alt, className, src, height }: PluginLogoProps): React.ReactElement {\n return
;\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\nimport Skeleton from 'react-loading-skeleton';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Badge, Icon, Stack, useStyles2 } from '@grafana/ui';\nimport { SkeletonComponent, attachSkeleton } from '@grafana/ui/src/unstable';\n\nimport { CatalogPlugin, PluginIconName, PluginListDisplayMode } from '../types';\n\nimport { PluginListItemBadges } from './PluginListItemBadges';\nimport { PluginLogo } from './PluginLogo';\n\nexport const LOGO_SIZE = '48px';\n\ntype Props = {\n plugin: CatalogPlugin;\n pathName: string;\n displayMode?: PluginListDisplayMode;\n};\n\nfunction PluginListItemComponent({ plugin, pathName, displayMode = PluginListDisplayMode.Grid }: Props) {\n const styles = useStyles2(getStyles);\n const isList = displayMode === PluginListDisplayMode.List;\n\n return (\n
\n
\n
{plugin.name}
\n
\n
By {plugin.orgName}
\n
\n
\n
\n {plugin.type &&
}\n
\n
\n );\n}\n\nconst PluginListItemSkeleton: SkeletonComponent
> = ({\n displayMode = PluginListDisplayMode.Grid,\n rootProps,\n}) => {\n const styles = useStyles2(getStyles);\n const isList = displayMode === PluginListDisplayMode.List;\n\n return (\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n );\n};\n\nexport const PluginListItem = attachSkeleton(PluginListItemComponent, PluginListItemSkeleton);\n\n// Styles shared between the different type of list items\nexport const getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n display: 'grid',\n gridTemplateColumns: `${LOGO_SIZE} 1fr ${theme.spacing(3)}`,\n gridTemplateRows: 'auto',\n gap: theme.spacing(2),\n gridAutoFlow: 'row',\n background: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n padding: theme.spacing(3),\n transition: theme.transitions.create(['background-color', 'box-shadow', 'border-color', 'color'], {\n duration: theme.transitions.duration.short,\n }),\n\n '&:hover': {\n background: theme.colors.emphasize(theme.colors.background.secondary, 0.03),\n },\n }),\n list: css({\n rowGap: 0,\n\n '> img': {\n alignSelf: 'start',\n },\n\n '> .plugin-content': {\n minHeight: 0,\n gridArea: '2 / 2 / 4 / 3',\n\n '> p': {\n margin: theme.spacing(0, 0, 0.5, 0),\n },\n },\n\n '> .plugin-name': {\n alignSelf: 'center',\n gridArea: '1 / 2 / 2 / 3',\n },\n }),\n pluginType: css({\n gridArea: '1 / 3 / 2 / 4',\n color: theme.colors.text.secondary,\n }),\n pluginLogo: css({\n gridArea: '1 / 1 / 3 / 2',\n maxWidth: '100%',\n alignSelf: 'center',\n objectFit: 'contain',\n }),\n content: css({\n gridArea: '3 / 1 / 4 / 3',\n color: theme.colors.text.secondary,\n }),\n name: css({\n gridArea: '1 / 2 / 3 / 3',\n alignSelf: 'center',\n fontSize: theme.typography.h4.fontSize,\n color: theme.colors.text.primary,\n margin: 0,\n }),\n };\n};\n","import React from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { config } from '@grafana/runtime';\nimport { Grid } from '@grafana/ui';\n\nimport { CatalogPlugin, PluginListDisplayMode } from '../types';\n\nimport { PluginListItem } from './PluginListItem';\n\ninterface Props {\n plugins: CatalogPlugin[];\n displayMode: PluginListDisplayMode;\n isLoading?: boolean;\n}\n\nexport const PluginList = ({ plugins, displayMode, isLoading }: Props) => {\n const isList = displayMode === PluginListDisplayMode.List;\n const { pathname } = useLocation();\n const pathName = config.appSubUrl + (pathname.endsWith('/') ? pathname.slice(0, -1) : pathname);\n\n return (\n
\n {isLoading\n ? new Array(50).fill(null).map((_, index) =>
)\n : plugins.map((plugin) => (\n
\n ))}\n
\n );\n};\n","import React, { useState, useRef } from 'react';\nimport { useDebounce } from 'react-use';\n\nimport { FilterInput } from '@grafana/ui';\n\ninterface Props {\n value?: string;\n onSearch: (value: string) => void;\n}\n\n// useDebounce has a bug which causes it to fire on first render. This wrapper prevents that.\n// https://github.com/streamich/react-use/issues/759\nconst useDebounceWithoutFirstRender = (callBack: () => void, delay = 0, deps: React.DependencyList = []) => {\n const isFirstRender = useRef(true);\n const debounceDeps = [...deps, isFirstRender];\n\n return useDebounce(\n () => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n return callBack();\n },\n delay,\n debounceDeps\n );\n};\n\nexport const SearchField = ({ value, onSearch }: Props) => {\n const [query, setQuery] = useState(value);\n\n useDebounceWithoutFirstRender(() => onSearch(query ?? ''), 500, [query]);\n\n return (\n
{\n if (e.key === 'Enter' || e.keyCode === 13) {\n onSearch(e.currentTarget.value);\n }\n }}\n placeholder=\"Search Grafana plugins\"\n onChange={(value) => {\n setQuery(value);\n }}\n width={46}\n />\n );\n};\n","import { locationService } from '@grafana/runtime';\n\nexport const useHistory = () => {\n return {\n push: ({ query }: any) => {\n locationService.partial(query);\n },\n };\n};\n","import { css } from '@emotion/css';\nimport React, { ReactElement } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { SelectableValue, GrafanaTheme2, PluginType } from '@grafana/data';\nimport { locationSearchToObject } from '@grafana/runtime';\nimport { Select, RadioButtonGroup, useStyles2, Tooltip, Field } from '@grafana/ui';\nimport { Page } from 'app/core/components/Page/Page';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { getNavModel } from 'app/core/selectors/navModel';\nimport { ROUTES as CONNECTIONS_ROUTES } from 'app/features/connections/constants';\nimport { useSelector } from 'app/types';\n\nimport { HorizontalGroup } from '../components/HorizontalGroup';\nimport { PluginList } from '../components/PluginList';\nimport { SearchField } from '../components/SearchField';\nimport { Sorters } from '../helpers';\nimport { useHistory } from '../hooks/useHistory';\nimport { useGetAll, useIsRemotePluginsAvailable, useDisplayMode } from '../state/hooks';\nimport { PluginListDisplayMode } from '../types';\n\nexport default function Browse({ route }: GrafanaRouteComponentProps): ReactElement | null {\n const location = useLocation();\n const locationSearch = locationSearchToObject(location.search);\n const navModel = useSelector((state) => getNavModel(state.navIndex, 'plugins'));\n const { displayMode, setDisplayMode } = useDisplayMode();\n const styles = useStyles2(getStyles);\n const history = useHistory();\n const remotePluginsAvailable = useIsRemotePluginsAvailable();\n const keyword = locationSearch.q?.toString() || '';\n const filterBy = locationSearch.filterBy?.toString() || 'installed';\n const filterByType = (locationSearch.filterByType as PluginType | 'all') || 'all';\n const sortBy = (locationSearch.sortBy as Sorters) || Sorters.nameAsc;\n const { isLoading, error, plugins } = useGetAll(\n {\n keyword,\n type: filterByType !== 'all' ? filterByType : undefined,\n isInstalled: filterBy === 'installed' ? true : undefined,\n },\n sortBy\n );\n\n const filterByOptions = [\n { value: 'all', label: 'All' },\n { value: 'installed', label: 'Installed' },\n ];\n\n const onSortByChange = (value: SelectableValue
) => {\n history.push({ query: { sortBy: value.value } });\n };\n\n const onFilterByChange = (value: string) => {\n history.push({ query: { filterBy: value } });\n };\n\n const onFilterByTypeChange = (value: SelectableValue
) => {\n history.push({ query: { filterByType: value.value } });\n };\n\n const onSearch = (q: string) => {\n history.push({ query: { filterBy, filterByType, q } });\n };\n\n // How should we handle errors?\n if (error) {\n console.error(error.message);\n return null;\n }\n\n const subTitle = (\n
\n Extend the Grafana experience with panel plugins and apps. To find more data sources go to{' '}\n
\n Connections\n
\n .\n
\n );\n\n return (\n
\n
\n
\n
\n
\n
\n
\n {/* Filter by type */}\n
\n
\n
\n\n {/* Filter by installed / all */}\n {remotePluginsAvailable ? (\n
\n
\n
\n ) : (\n
\n
\n
\n
\n
\n
\n
\n )}\n\n {/* Sorting */}\n
\n
\n
\n\n {/* Display mode */}\n
\n
\n className={styles.displayAs}\n value={displayMode}\n onChange={setDisplayMode}\n options={[\n {\n value: PluginListDisplayMode.Grid,\n icon: 'table',\n description: 'Display plugins in a grid layout',\n },\n { value: PluginListDisplayMode.List, icon: 'list-ul', description: 'Display plugins in list' },\n ]}\n />\n
\n
\n
\n
\n
\n
\n
\n
\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n actionBar: css({\n [theme.breakpoints.up('xl')]: {\n marginLeft: 'auto',\n },\n }),\n listWrap: css({\n marginTop: theme.spacing(2),\n }),\n displayAs: css({\n svg: {\n marginRight: 0,\n },\n }),\n});\n","import { createSelector } from '@reduxjs/toolkit';\n\nimport { PluginError, PluginType, unEscapeStringFromRegex } from '@grafana/data';\n\nimport { filterByKeyword } from '../helpers';\nimport { RequestStatus, PluginCatalogStoreState } from '../types';\n\nimport { pluginsAdapter } from './reducer';\n\nexport const selectRoot = (state: PluginCatalogStoreState) => state.plugins;\n\nexport const selectItems = createSelector(selectRoot, ({ items }) => items);\n\nexport const selectDisplayMode = createSelector(selectRoot, ({ settings }) => settings.displayMode);\n\nexport const { selectAll, selectById } = pluginsAdapter.getSelectors(selectItems);\n\nexport type PluginFilters = {\n // Searches for a string in certain fields (e.g. \"name\" or \"orgName\")\n // (Note: this will be an escaped regex string as it comes from `FilterInput`)\n keyword?: string;\n\n // (Optional, only applied if set)\n type?: PluginType;\n\n // (Optional, only applied if set)\n isInstalled?: boolean;\n\n // (Optional, only applied if set)\n isEnterprise?: boolean;\n};\n\nexport const selectPlugins = (filters: PluginFilters) =>\n createSelector(selectAll, (plugins) => {\n const keyword = filters.keyword ? unEscapeStringFromRegex(filters.keyword.toLowerCase()) : '';\n const filteredPluginIds = keyword !== '' ? filterByKeyword(plugins, keyword) : null;\n\n return plugins.filter((plugin) => {\n if (keyword && filteredPluginIds == null) {\n return false;\n }\n\n if (keyword && !filteredPluginIds?.includes(plugin.id)) {\n return false;\n }\n\n if (filters.type && plugin.type !== filters.type) {\n return false;\n }\n\n if (filters.isInstalled !== undefined && plugin.isInstalled !== filters.isInstalled) {\n return false;\n }\n\n if (filters.isEnterprise !== undefined && plugin.isEnterprise !== filters.isEnterprise) {\n return false;\n }\n\n return true;\n });\n });\n\nexport const selectPluginErrors = (filterByPluginType?: PluginType) =>\n createSelector(selectAll, (plugins) => {\n const pluginErrors: PluginError[] = [];\n for (const plugin of plugins) {\n if (plugin.error && (!filterByPluginType || plugin.type === filterByPluginType)) {\n pluginErrors.push({\n pluginId: plugin.id,\n errorCode: plugin.error,\n pluginType: plugin.type,\n });\n }\n }\n return pluginErrors;\n });\n\n// The following selectors are used to get information about the outstanding or completed plugins-related network requests.\nexport const selectRequest = (actionType: string) =>\n createSelector(selectRoot, ({ requests = {} }) => requests[actionType]);\n\nexport const selectIsRequestPending = (actionType: string) =>\n createSelector(selectRequest(actionType), (request) => request?.status === RequestStatus.Pending);\n\nexport const selectRequestError = (actionType: string) =>\n createSelector(selectRequest(actionType), (request) =>\n request?.status === RequestStatus.Rejected ? request?.error : null\n );\n\nexport const selectIsRequestNotFetched = (actionType: string) =>\n createSelector(selectRequest(actionType), (request) => request === undefined);\n","import { useEffect, useMemo } from 'react';\n\nimport { PluginError, PluginType } from '@grafana/data';\nimport { useDispatch, useSelector } from 'app/types';\n\nimport { sortPlugins, Sorters } from '../helpers';\nimport { CatalogPlugin, PluginListDisplayMode } from '../types';\n\nimport { fetchAll, fetchDetails, fetchRemotePlugins, install, uninstall, fetchAllLocal, unsetInstall } from './actions';\nimport { setDisplayMode } from './reducer';\nimport {\n selectPlugins,\n selectById,\n selectIsRequestPending,\n selectRequestError,\n selectIsRequestNotFetched,\n selectDisplayMode,\n selectPluginErrors,\n type PluginFilters,\n} from './selectors';\n\nexport const useGetAll = (filters: PluginFilters, sortBy: Sorters = Sorters.nameAsc) => {\n useFetchAll();\n\n const selector = useMemo(() => selectPlugins(filters), [filters]);\n const plugins = useSelector(selector);\n // As the locally installed plugins load quicker than the remote ones, we only show a loading state until these are being loaded\n // (In case the remote ones are not loaded within a reasonable timeout, we will merge those with the locally installed plugins once they are loaded)\n const { isLoading, error } = useLocalFetchStatus();\n const sortedPlugins = sortPlugins(plugins, sortBy);\n\n return {\n isLoading,\n error,\n plugins: sortedPlugins,\n };\n};\n\nexport const useGetSingle = (id: string): CatalogPlugin | undefined => {\n useFetchAll();\n useFetchDetails(id);\n\n return useSelector((state) => selectById(state, id));\n};\n\nexport const useGetSingleLocalWithoutDetails = (id: string): CatalogPlugin | undefined => {\n useFetchAllLocal();\n return useSelector((state) => selectById(state, id));\n};\n\nexport const useGetErrors = (filterByPluginType?: PluginType): PluginError[] => {\n useFetchAll();\n\n return useSelector(selectPluginErrors(filterByPluginType));\n};\n\nexport const useInstall = () => {\n const dispatch = useDispatch();\n return (id: string, version?: string, isUpdating?: boolean) => dispatch(install({ id, version, isUpdating }));\n};\n\nexport const useUnsetInstall = () => {\n const dispatch = useDispatch();\n\n return () => dispatch(unsetInstall());\n};\n\nexport const useUninstall = () => {\n const dispatch = useDispatch();\n\n return (id: string) => dispatch(uninstall(id));\n};\n\nexport const useIsRemotePluginsAvailable = () => {\n const error = useSelector(selectRequestError(fetchRemotePlugins.typePrefix));\n return error === null;\n};\n\nexport const useLocalFetchStatus = () => {\n const isLoading = useSelector(selectIsRequestPending('plugins/fetchLocal'));\n const error = useSelector(selectRequestError('plugins/fetchLocal'));\n\n return { isLoading, error };\n};\n\nexport const useFetchStatus = () => {\n const isLoading = useSelector(selectIsRequestPending(fetchAll.typePrefix));\n const error = useSelector(selectRequestError(fetchAll.typePrefix));\n\n return { isLoading, error };\n};\n\nexport const useFetchDetailsStatus = () => {\n const isLoading = useSelector(selectIsRequestPending(fetchDetails.typePrefix));\n const error = useSelector(selectRequestError(fetchDetails.typePrefix));\n\n return { isLoading, error };\n};\n\nexport const useInstallStatus = () => {\n const isInstalling = useSelector(selectIsRequestPending(install.typePrefix));\n const error = useSelector(selectRequestError(install.typePrefix));\n\n return { isInstalling, error };\n};\n\nexport const useUninstallStatus = () => {\n const isUninstalling = useSelector(selectIsRequestPending(uninstall.typePrefix));\n const error = useSelector(selectRequestError(uninstall.typePrefix));\n\n return { isUninstalling, error };\n};\n\n// Only fetches in case they were not fetched yet\nexport const useFetchAll = () => {\n const dispatch = useDispatch();\n const isNotFetched = useSelector(selectIsRequestNotFetched(fetchAll.typePrefix));\n\n useEffect(() => {\n isNotFetched && dispatch(fetchAll());\n }, []); // eslint-disable-line\n};\n\n// Only fetches in case they were not fetched yet\nexport const useFetchAllLocal = () => {\n const dispatch = useDispatch();\n const isNotFetched = useSelector(selectIsRequestNotFetched(fetchAllLocal.typePrefix));\n\n useEffect(() => {\n isNotFetched && dispatch(fetchAllLocal());\n }, []); // eslint-disable-line\n};\n\nexport const useFetchDetails = (id: string) => {\n const dispatch = useDispatch();\n const plugin = useSelector((state) => selectById(state, id));\n const isNotFetching = !useSelector(selectIsRequestPending(fetchDetails.typePrefix));\n const shouldFetch = isNotFetching && plugin && !plugin.details;\n\n useEffect(() => {\n shouldFetch && dispatch(fetchDetails(id));\n }, [plugin]); // eslint-disable-line\n};\n\nexport const useFetchDetailsLazy = () => {\n const dispatch = useDispatch();\n\n return (id: string) => dispatch(fetchDetails(id));\n};\n\nexport const useDisplayMode = () => {\n const dispatch = useDispatch();\n const displayMode = useSelector(selectDisplayMode);\n\n return {\n displayMode,\n setDisplayMode: (v: PluginListDisplayMode) => dispatch(setDisplayMode(v)),\n };\n};\n"],"names":["PluginDisabledBadge","error","tooltip","errorCodeToTooltip","Badge","getBadgeColor","theme","PluginInstalledBadge","customBadgeStyles","PluginEnterpriseBadge","plugin","onClick","ev","PluginSignatureBadge","Button","PluginUpdateAvailableBadge","styles","getStyles","PluginAngularBadge","PluginDeprecatedBadge","PluginListItemBadges","hasUpdate","PluginLogo","alt","className","src","height","LOGO_SIZE","PluginListItemComponent","pathName","displayMode","isList","Icon","PluginListItemSkeleton","rootProps","Stack","PluginListItem","PluginList","plugins","isLoading","pathname","config","Grid","_","index","useDebounceWithoutFirstRender","callBack","delay","deps","isFirstRender","debounceDeps","useDebounce","SearchField","value","onSearch","query","setQuery","FilterInput","e","useHistory","Browse","route","location","locationSearch","navModel","state","setDisplayMode","history","remotePluginsAvailable","keyword","filterBy","filterByType","sortBy","filterByOptions","onSortByChange","onFilterByChange","onFilterByTypeChange","q","subTitle","Page","HorizontalGroup","Field","Select","RadioButtonGroup","Tooltip","selectRoot","selectItems","items","selectDisplayMode","settings","selectAll","selectPlugins","filters","filteredPluginIds","selectPluginErrors","filterByPluginType","pluginErrors","selectRequest","actionType","requests","selectIsRequestPending","request","selectRequestError","useGetAll","useFetchAll","selector","useLocalFetchStatus","sortedPlugins","useGetSingle","id","useFetchDetails","useGetSingleLocalWithoutDetails","useFetchAllLocal","useGetErrors","useInstall","dispatch","version","isUpdating","useUnsetInstall","useUninstall","useIsRemotePluginsAvailable","useFetchStatus","useFetchDetailsStatus","useInstallStatus","isInstalling","useUninstallStatus","isUninstalling","isNotFetched","shouldFetch","useFetchDetailsLazy","useDisplayMode","v"],"sourceRoot":""}