UNPKG

@craftercms/studio-ui

Version:

Services, components, models & utils to build CrafterCMS authoring extensions.

277 lines (275 loc) 10.3 kB
/* * Copyright (C) 2007-2022 Crafter Software Corporation. All Rights Reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* * Copyright (C) 2007-2022 Crafter Software Corporation. All Rights Reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ import { FormattedMessage } from 'react-intl'; import React, { useState } from 'react'; import DialogBody from '../DialogBody/DialogBody'; import SingleItemSelector from '../SingleItemSelector'; import FormControl from '@mui/material/FormControl'; import Select from '@mui/material/Select'; import MenuItem from '@mui/material/MenuItem'; import DependenciesList from './DependenciesList'; import Menu from '@mui/material/Menu'; import DialogFooter from '../DialogFooter/DialogFooter'; import FormControlLabel from '@mui/material/FormControlLabel'; import Checkbox from '@mui/material/Checkbox'; import { assetsTypes } from './utils'; import Radio from '@mui/material/Radio'; import { dependenciesDialogStyles } from './DependenciesDialog'; import { ApiResponseErrorState } from '../ApiResponseErrorState'; import { LoadingState } from '../LoadingState'; import { EmptyState } from '../EmptyState'; import { getRootPath } from '../../utils/path'; import MoreVertIcon from '@mui/icons-material/MoreVertRounded'; import IconButton from '@mui/material/IconButton'; export function DependenciesDialogUI(props) { const { dependencies, item, rootPath, setItem, compactView, setCompactView, showTypes, setShowTypes, dependenciesShown, setDependenciesShown, isEditableItem, handleEditorDisplay, handleHistoryDisplay, contextMenu, handleContextMenuClick, handleContextMenuClose, error } = props; const { classes } = dependenciesDialogStyles(); const [openSelector, setOpenSelector] = useState(false); return React.createElement( React.Fragment, null, React.createElement( DialogBody, { className: classes.dialogBody }, React.createElement( 'div', { className: classes.selectionContent }, React.createElement(SingleItemSelector, { label: React.createElement(FormattedMessage, { id: 'words.item', defaultMessage: 'Item' }), open: openSelector, onClose: () => setOpenSelector(false), onDropdownClick: () => setOpenSelector(!openSelector), rootPath: rootPath, selectedItem: item, disabled: rootPath !== getRootPath(item.path), onItemClicked: (item) => { setOpenSelector(false); setItem(item); } }), React.createElement( FormControl, { className: classes.formControl }, React.createElement( Select, { value: dependenciesShown ?? 'depends-on', onChange: (event) => { setDependenciesShown(event.target.value); }, inputProps: { className: classes.select } }, React.createElement( MenuItem, { value: 'depends-on-me' }, React.createElement(FormattedMessage, { id: 'dependenciesDialog.dependsOnMe', defaultMessage: 'Dependencies of selected item' }) ), React.createElement( MenuItem, { value: 'depends-on' }, React.createElement(FormattedMessage, { id: 'dependenciesDialog.dependsOn', defaultMessage: 'Items that depend on selected item' }) ) ) ) ), error ? React.createElement(ApiResponseErrorState, { error: error }) : !dependencies ? React.createElement(LoadingState, { classes: { root: classes.suspense }, styles: { root: { flexGrow: 1 } } }) : dependencies?.length === 0 ? React.createElement(EmptyState, { sxs: { root: { minHeight: 300 } }, title: dependenciesShown === 'depends-on-me' ? React.createElement(FormattedMessage, { id: 'dependenciesDialog.emptyDependantsMessage', defaultMessage: '"{itemName}" has no dependencies', values: { itemName: item?.label } }) : React.createElement(FormattedMessage, { id: 'dependenciesDialog.emptyDependenciesMessage', defaultMessage: 'Nothing depends on "{itemName}"', values: { itemName: item?.label } }), classes: { root: classes.suspense } }) : React.createElement( React.Fragment, null, React.createElement(DependenciesList, { dependencies: dependencies, compactView: compactView, showTypes: showTypes, renderAction: (dependency) => isEditableItem(dependency.path) ? React.createElement( IconButton, { 'aria-haspopup': 'true', onClick: (e) => { handleContextMenuClick(e, dependency); }, className: classes.listEllipsis, size: 'large' }, React.createElement(MoreVertIcon, null) ) : null }), React.createElement( Menu, { anchorEl: contextMenu.el, keepMounted: true, open: Boolean(contextMenu.el), onClose: handleContextMenuClose }, contextMenu.dependency && isEditableItem(contextMenu.dependency.path) && React.createElement( MenuItem, { onClick: () => { handleEditorDisplay(contextMenu.dependency); handleContextMenuClose(); } }, React.createElement(FormattedMessage, { id: 'dependenciesDialog.edit', defaultMessage: 'Edit' }) ), contextMenu.dependency && React.createElement( MenuItem, { onClick: () => { setItem(contextMenu.dependency); handleContextMenuClose(); } }, React.createElement(FormattedMessage, { id: 'dependenciesDialog.dependencies', defaultMessage: 'Dependencies' }) ), React.createElement( MenuItem, { onClick: () => { handleHistoryDisplay(contextMenu.dependency); handleContextMenuClose(); } }, ' ', React.createElement(FormattedMessage, { id: 'dependenciesDialog.history', defaultMessage: 'History' }) ) ) ) ), React.createElement( DialogFooter, { classes: { root: classes.dialogFooter } }, React.createElement(FormControlLabel, { className: classes.compactViewAction, control: React.createElement(Checkbox, { checked: compactView, onChange: (event) => { setCompactView(event.target.checked); }, color: 'primary' }), label: 'Compact' }), React.createElement( FormControl, { className: classes.formControl }, React.createElement( Select, { value: showTypes, onChange: (event) => { setShowTypes(event.target.value); }, inputProps: { className: `${classes.select} ${classes.showTypesSelect}` }, MenuProps: { className: classes.showTypesMenu, transformOrigin: { vertical: 'bottom', horizontal: 'left' } } }, Object.keys(assetsTypes).map((typeId) => React.createElement( MenuItem, { value: typeId, key: typeId }, React.createElement(Radio, { checked: showTypes === typeId, color: 'primary' }), assetsTypes[typeId].label ) ) ) ) ) ); } export default DependenciesDialogUI;