{"version":3,"file":"FolderLibraryPanelsPage.95dd7bf6735e202a79d2.js","mappings":"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","sources":["webpack://grafana/./public/app/features/browse-dashboards/BrowseFolderLibraryPanelsPage.tsx","webpack://grafana/./public/app/features/browse-dashboards/components/BrowseActions/DeleteModal.tsx","webpack://grafana/./public/app/features/browse-dashboards/components/BrowseActions/MoveModal.tsx","webpack://grafana/./public/app/features/browse-dashboards/components/FolderActionsButton.tsx","webpack://grafana/./public/app/features/browse-dashboards/permissions.ts","webpack://grafana/./public/app/features/library-panels/components/OpenLibraryPanelModal/OpenLibraryPanelModal.tsx"],"sourcesContent":["import React, { useMemo, useState } from 'react';\n\nimport { Page } from 'app/core/components/Page/Page';\n\nimport { GrafanaRouteComponentProps } from '../../core/navigation/types';\nimport { FolderActionsButton } from '../browse-dashboards/components/FolderActionsButton';\nimport { buildNavModel, getLibraryPanelsTabID } from '../folders/state/navModel';\nimport { LibraryPanelsSearch } from '../library-panels/components/LibraryPanelsSearch/LibraryPanelsSearch';\nimport { OpenLibraryPanelModal } from '../library-panels/components/OpenLibraryPanelModal/OpenLibraryPanelModal';\nimport { LibraryElementDTO } from '../library-panels/types';\n\nimport { useGetFolderQuery, useSaveFolderMutation } from './api/browseDashboardsAPI';\n\nexport interface OwnProps extends GrafanaRouteComponentProps<{ uid: string }> {}\n\nexport function BrowseFolderLibraryPanelsPage({ match }: OwnProps) {\n const { uid: folderUID } = match.params;\n const { data: folderDTO } = useGetFolderQuery(folderUID);\n const [selected, setSelected] = useState(undefined);\n const [saveFolder] = useSaveFolderMutation();\n\n const navModel = useMemo(() => {\n if (!folderDTO) {\n return undefined;\n }\n const model = buildNavModel(folderDTO);\n\n // Set the \"Library panels\" tab to active\n const libraryPanelsTabID = getLibraryPanelsTabID(folderDTO.uid);\n const libraryPanelsTab = model.children?.find((child) => child.id === libraryPanelsTabID);\n if (libraryPanelsTab) {\n libraryPanelsTab.active = true;\n }\n return model;\n }, [folderDTO]);\n\n const onEditTitle = folderUID\n ? async (newValue: string) => {\n if (folderDTO) {\n const result = await saveFolder({\n ...folderDTO,\n title: newValue,\n });\n if ('error' in result) {\n throw result.error;\n }\n }\n }\n : undefined;\n\n return (\n {folderDTO && }}\n >\n \n \n {selected ? setSelected(undefined)} libraryPanel={selected} /> : null}\n \n \n );\n}\n\nexport default BrowseFolderLibraryPanelsPage;\n","import React, { useState } from 'react';\n\nimport { config } from '@grafana/runtime';\nimport { Alert, ConfirmModal, Text, Space } from '@grafana/ui';\nimport { Trans, t } from 'app/core/internationalization';\n\nimport { useGetAffectedItemsQuery } from '../../api/browseDashboardsAPI';\nimport { DashboardTreeSelection } from '../../types';\n\nimport { DescendantCount } from './DescendantCount';\n\nexport interface Props {\n isOpen: boolean;\n onConfirm: () => Promise;\n onDismiss: () => void;\n selectedItems: DashboardTreeSelection;\n}\n\nexport const DeleteModal = ({ onConfirm, onDismiss, selectedItems, ...props }: Props) => {\n const { data } = useGetAffectedItemsQuery(selectedItems);\n const deleteIsInvalid = !config.featureToggles.nestedFolders && data && (data.alertRule || data.libraryPanel);\n const [isDeleting, setIsDeleting] = useState(false);\n const onDelete = async () => {\n setIsDeleting(true);\n try {\n await onConfirm();\n setIsDeleting(false);\n onDismiss();\n } catch {\n setIsDeleting(false);\n }\n };\n\n return (\n \n \n \n This action will delete the following content:\n \n \n \n \n \n }\n description={\n <>\n {deleteIsInvalid ? (\n \n \n One or more folders contain library panels or alert rules. Delete these first in order to proceed.\n \n \n ) : null}\n \n }\n confirmationText=\"Delete\"\n confirmText={\n isDeleting\n ? t('browse-dashboards.action.deleting', 'Deleting...')\n : t('browse-dashboards.action.delete-button', 'Delete')\n }\n onDismiss={onDismiss}\n onConfirm={onDelete}\n title={t('browse-dashboards.action.delete-modal-title', 'Delete')}\n {...props}\n />\n );\n};\n","import React, { useState } from 'react';\n\nimport { Alert, Button, Field, Modal, Text, Space } from '@grafana/ui';\nimport { FolderPicker } from 'app/core/components/Select/FolderPicker';\nimport { t, Trans } from 'app/core/internationalization';\n\nimport { DashboardTreeSelection } from '../../types';\n\nimport { DescendantCount } from './DescendantCount';\n\nexport interface Props {\n isOpen: boolean;\n onConfirm: (targetFolderUid: string) => Promise;\n onDismiss: () => void;\n selectedItems: DashboardTreeSelection;\n}\n\nexport const MoveModal = ({ onConfirm, onDismiss, selectedItems, ...props }: Props) => {\n const [moveTarget, setMoveTarget] = useState();\n const [isMoving, setIsMoving] = useState(false);\n const selectedFolders = Object.keys(selectedItems.folder).filter((uid) => selectedItems.folder[uid]);\n\n const onMove = async () => {\n if (moveTarget !== undefined) {\n setIsMoving(true);\n try {\n await onConfirm(moveTarget);\n setIsMoving(false);\n onDismiss();\n } catch {\n setIsMoving(false);\n }\n }\n };\n\n return (\n \n {selectedFolders.length > 0 && (\n \n )}\n\n \n This action will move the following content:\n \n\n \n\n \n\n \n \n \n\n \n \n \n \n \n );\n};\n","import React, { useState } from 'react';\n\nimport { config, locationService, reportInteraction } from '@grafana/runtime';\nimport { Button, Drawer, Dropdown, Icon, Menu, MenuItem } from '@grafana/ui';\nimport { Permissions } from 'app/core/components/AccessControl';\nimport { appEvents } from 'app/core/core';\nimport { t, Trans } from 'app/core/internationalization';\nimport { FolderDTO } from 'app/types';\nimport { ShowModalReactEvent } from 'app/types/events';\n\nimport { useDeleteFolderMutation, useMoveFolderMutation } from '../api/browseDashboardsAPI';\nimport { getFolderPermissions } from '../permissions';\n\nimport { DeleteModal } from './BrowseActions/DeleteModal';\nimport { MoveModal } from './BrowseActions/MoveModal';\n\ninterface Props {\n folder: FolderDTO;\n}\n\nexport function FolderActionsButton({ folder }: Props) {\n const [isOpen, setIsOpen] = useState(false);\n const [showPermissionsDrawer, setShowPermissionsDrawer] = useState(false);\n const [moveFolder] = useMoveFolderMutation();\n const [deleteFolder] = useDeleteFolderMutation();\n const { canEditFolders, canDeleteFolders, canViewPermissions, canSetPermissions } = getFolderPermissions(folder);\n // Can only move folders when nestedFolders is enabled\n const canMoveFolder = config.featureToggles.nestedFolders && canEditFolders;\n\n const onMove = async (destinationUID: string) => {\n await moveFolder({ folder, destinationUID });\n reportInteraction('grafana_manage_dashboards_item_moved', {\n item_counts: {\n folder: 1,\n dashboard: 0,\n },\n source: 'folder_actions',\n });\n };\n\n const onDelete = async () => {\n await deleteFolder(folder);\n reportInteraction('grafana_manage_dashboards_item_deleted', {\n item_counts: {\n folder: 1,\n dashboard: 0,\n },\n source: 'folder_actions',\n });\n const { parents } = folder;\n const parentUrl = parents && parents.length ? parents[parents.length - 1].url : '/dashboards';\n locationService.push(parentUrl);\n };\n\n const showMoveModal = () => {\n appEvents.publish(\n new ShowModalReactEvent({\n component: MoveModal,\n props: {\n selectedItems: {\n folder: { [folder.uid]: true },\n dashboard: {},\n panel: {},\n $all: false,\n },\n onConfirm: onMove,\n },\n })\n );\n };\n\n const showDeleteModal = () => {\n appEvents.publish(\n new ShowModalReactEvent({\n component: DeleteModal,\n props: {\n selectedItems: {\n folder: { [folder.uid]: true },\n dashboard: {},\n panel: {},\n $all: false,\n },\n onConfirm: onDelete,\n },\n })\n );\n };\n\n const managePermissionsLabel = t('browse-dashboards.folder-actions-button.manage-permissions', 'Manage permissions');\n const moveLabel = t('browse-dashboards.folder-actions-button.move', 'Move');\n const deleteLabel = t('browse-dashboards.folder-actions-button.delete', 'Delete');\n\n const menu = (\n \n {canViewPermissions && setShowPermissionsDrawer(true)} label={managePermissionsLabel} />}\n {canMoveFolder && }\n {canDeleteFolders && }\n \n );\n\n if (!canViewPermissions && !canMoveFolder && !canDeleteFolders) {\n return null;\n }\n\n return (\n <>\n \n \n \n {showPermissionsDrawer && (\n setShowPermissionsDrawer(false)}\n size=\"md\"\n >\n \n \n )}\n \n );\n}\n","import { config } from '@grafana/runtime';\nimport { contextSrv } from 'app/core/core';\nimport { AccessControlAction, FolderDTO } from 'app/types';\n\nfunction checkFolderPermission(action: AccessControlAction, folderDTO?: FolderDTO) {\n return folderDTO ? contextSrv.hasPermissionInMetadata(action, folderDTO) : contextSrv.hasPermission(action);\n}\n\nexport function getFolderPermissions(folderDTO?: FolderDTO) {\n // Can only create a folder if we have permissions and either we're at root or nestedFolders is enabled\n const canCreateDashboards = checkFolderPermission(AccessControlAction.DashboardsCreate, folderDTO);\n const canCreateFolders = Boolean(\n (!folderDTO || config.featureToggles.nestedFolders) && checkFolderPermission(AccessControlAction.FoldersCreate)\n );\n const canDeleteFolders = checkFolderPermission(AccessControlAction.FoldersDelete, folderDTO);\n const canEditDashboards = checkFolderPermission(AccessControlAction.DashboardsWrite, folderDTO);\n const canEditFolders = checkFolderPermission(AccessControlAction.FoldersWrite, folderDTO);\n const canSetPermissions = checkFolderPermission(AccessControlAction.FoldersPermissionsWrite, folderDTO);\n const canViewPermissions = checkFolderPermission(AccessControlAction.FoldersPermissionsRead, folderDTO);\n\n return {\n canCreateDashboards,\n canCreateFolders,\n canDeleteFolders,\n canEditDashboards,\n canEditFolders,\n canSetPermissions,\n canViewPermissions,\n };\n}\n","import { css } from '@emotion/css';\nimport debounce from 'debounce-promise';\nimport React, { MouseEvent, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue, urlUtil } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { AsyncSelect, Button, Modal, useStyles2 } from '@grafana/ui';\nimport { t, Trans } from 'app/core/internationalization';\n\nimport { DashboardSearchItem } from '../../../search/types';\nimport { getConnectedDashboards, getLibraryPanelConnectedDashboards } from '../../state/api';\nimport { LibraryElementDTO } from '../../types';\n\nexport interface OpenLibraryPanelModalProps {\n onDismiss: () => void;\n libraryPanel: LibraryElementDTO;\n}\n\nexport function OpenLibraryPanelModal({ libraryPanel, onDismiss }: OpenLibraryPanelModalProps): JSX.Element {\n const styles = useStyles2(getStyles);\n const [loading, setLoading] = useState(false);\n const [connected, setConnected] = useState(0);\n const [option, setOption] = useState | undefined>(undefined);\n useEffect(() => {\n const getConnected = async () => {\n const connectedDashboards = await getLibraryPanelConnectedDashboards(libraryPanel.uid);\n setConnected(connectedDashboards.length);\n };\n getConnected();\n }, [libraryPanel.uid]);\n const loadOptions = useCallback(\n (searchString: string) => loadOptionsAsync(libraryPanel.uid, searchString, setLoading),\n [libraryPanel.uid]\n );\n const debouncedLoadOptions = useMemo(() => debounce(loadOptions, 300, { leading: true }), [loadOptions]);\n const onViewPanel = (e: MouseEvent) => {\n e.preventDefault();\n locationService.push(urlUtil.renderUrl(`/d/${option?.value?.uid}`, {}));\n };\n\n return (\n \n
\n {connected === 0 ? (\n \n \n Panel is not linked to a dashboard. Add the panel to a dashboard and retry.\n \n \n ) : null}\n {connected > 0 ? (\n <>\n

\n \n This panel is being used in {{ count: connected }} dashboard. Please choose which dashboard to view the\n panel in:\n \n

\n \n \n ) : null}\n
\n \n \n \n \n \n );\n}\n\nasync function loadOptionsAsync(uid: string, searchString: string, setLoading: (loading: boolean) => void) {\n setLoading(true);\n const searchHits = await getConnectedDashboards(uid);\n const options = searchHits\n .filter((d) => d.title.toLowerCase().includes(searchString.toLowerCase()))\n .map((d) => ({ label: d.title, value: d }));\n setLoading(false);\n\n return options;\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css``,\n };\n}\n"],"names":["BrowseFolderLibraryPanelsPage","match","folderUID","folderDTO","selected","setSelected","saveFolder","navModel","model","libraryPanelsTabID","libraryPanelsTab","child","onEditTitle","newValue","result","DeleteModal","onConfirm","onDismiss","selectedItems","props","data","deleteIsInvalid","isDeleting","setIsDeleting","onDelete","MoveModal","moveTarget","setMoveTarget","isMoving","setIsMoving","selectedFolders","uid","onMove","FolderActionsButton","folder","isOpen","setIsOpen","showPermissionsDrawer","setShowPermissionsDrawer","moveFolder","deleteFolder","canEditFolders","canDeleteFolders","canViewPermissions","canSetPermissions","canMoveFolder","destinationUID","parents","parentUrl","showMoveModal","showDeleteModal","managePermissionsLabel","moveLabel","deleteLabel","menu","checkFolderPermission","action","getFolderPermissions","canCreateDashboards","canCreateFolders","canEditDashboards","OpenLibraryPanelModal","libraryPanel","styles","getStyles","loading","setLoading","connected","setConnected","option","setOption","connectedDashboards","loadOptions","searchString","loadOptionsAsync","debouncedLoadOptions","onViewPanel","e","options","d","theme"],"sourceRoot":""}