UNPKG

@sanity/desk-tool

Version:

Tool for managing all sorts of content in a structured manner

89 lines (88 loc) 4.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValidationMenu = ValidationMenu; var _autoId = require("@reach/auto-id"); var _components = require("@sanity/base/components"); var _icons = require("@sanity/icons"); var _types = require("@sanity/types"); var _ui = require("@sanity/ui"); var _react = _interopRequireWildcard(require("react")); var _useDocumentPane2 = require("../../useDocumentPane"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var BUTTON_PROPS = { error: { tone: 'critical', icon: _icons.ErrorOutlineIcon }, warning: { tone: 'caution', icon: _icons.WarningOutlineIcon }, info: { tone: 'primary', icon: _icons.InfoOutlineIcon } }; function ValidationMenu(props) { var boundaryElement = props.boundaryElement, isOpen = props.isOpen, setOpen = props.setOpen; var _useDocumentPane = (0, _useDocumentPane2.useDocumentPane)(), documentSchema = _useDocumentPane.documentSchema, handleFocus = _useDocumentPane.handleFocus, markers = _useDocumentPane.markers; var id = (0, _autoId.useId)(); var validationMarkers = (0, _react.useMemo)(() => markers.filter(marker => marker.type === 'validation'), [markers]); var validationErrorMarkers = (0, _react.useMemo)(() => validationMarkers.filter(_types.isValidationErrorMarker), [validationMarkers]); var validationWarningMarkers = (0, _react.useMemo)(() => validationMarkers.filter(_types.isValidationWarningMarker), [validationMarkers]); var validationInfoMarkers = (0, _react.useMemo)(() => validationMarkers.filter(_types.isValidationInfoMarker), [validationMarkers]); var hasError = validationErrorMarkers.length > 0; var hasWarning = validationWarningMarkers.length > 0; var hasInfo = validationInfoMarkers.length > 0; var noValidation = !hasError && !hasWarning && !hasInfo; var buttonProps = (0, _react.useMemo)(() => { if (hasError) { return BUTTON_PROPS.error; } if (hasWarning) { return BUTTON_PROPS.warning; } if (hasInfo) { return BUTTON_PROPS.info; } return undefined; }, [hasError, hasInfo, hasWarning]); var handleClose = (0, _react.useCallback)(() => setOpen(false), [setOpen]); if (noValidation) { return null; } return /*#__PURE__*/_react.default.createElement(_ui.MenuButton, { id: id || '', button: /*#__PURE__*/_react.default.createElement(_ui.Button, _extends({}, buttonProps, { title: "Show validation issues", mode: "bleed", "data-testid": "validation-list-button" })), menu: /*#__PURE__*/_react.default.createElement(_ui.Menu, { open: isOpen }, /*#__PURE__*/_react.default.createElement(_components.ValidationList, { documentType: documentSchema, markers: validationMarkers, onClose: handleClose, onFocus: handleFocus })), popover: { portal: true, boundaryElement: boundaryElement, constrainSize: true, preventOverflow: true, width: 0, tone: 'default' }, placement: "bottom-end" }); }