UNPKG

@sanity/desk-tool

Version:

Tool for managing all sorts of content in a structured manner

190 lines (185 loc) • 11.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConfirmDeleteDialogBody = ConfirmDeleteDialogBody; var _react = _interopRequireWildcard(require("react")); var _icons = require("@sanity/icons"); var _ui = require("@sanity/ui"); var _preview = require("@sanity/base/preview"); var _reactCopyToClipboard = require("react-copy-to-clipboard"); var _ReferencePreviewLink = require("../ReferencePreviewLink"); var _ConfirmDeleteDialogBody = require("./ConfirmDeleteDialogBody.styles"); 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 getSchemaType(typeName) { var schemaMod = require('part:@sanity/base/schema'); var schema = schemaMod.default || schemaMod; return schema.get(typeName) || null; } /** * The inner part of the `ConfirmDeleteDialog`. This is ran when both the * `crossDatasetReferences` and `internalReferences` are loaded. */ function ConfirmDeleteDialogBody(_ref) { var crossDatasetReferences = _ref.crossDatasetReferences, internalReferences = _ref.internalReferences, documentTitle = _ref.documentTitle, totalCount = _ref.totalCount, action = _ref.action, datasetNames = _ref.datasetNames, hasUnknownDatasetNames = _ref.hasUnknownDatasetNames, onReferenceLinkClick = _ref.onReferenceLinkClick; var toast = (0, _ui.useToast)(); var renderPreviewItem = (0, _react.useCallback)(item => { var type = getSchemaType(item._type); if (type) { return /*#__PURE__*/_react.default.createElement(_ReferencePreviewLink.ReferencePreviewLink, { type: type, value: item, onClick: onReferenceLinkClick }); } return ( /*#__PURE__*/ // Padding added to match the ReferencePreviewLink styling _react.default.createElement(_ui.Box, { padding: 2 }, /*#__PURE__*/_react.default.createElement(_preview.SanityDefaultPreview, { value: { title: 'Preview Unavailable', subtitle: "ID: ".concat(item._id), media: /*#__PURE__*/_react.default.createElement(_icons.UnknownIcon, null) }, layout: "default" })) ); }, [onReferenceLinkClick]); if ((internalReferences === null || internalReferences === void 0 ? void 0 : internalReferences.totalCount) === 0 && (crossDatasetReferences === null || crossDatasetReferences === void 0 ? void 0 : crossDatasetReferences.totalCount) === 0) { return /*#__PURE__*/_react.default.createElement(_ui.Text, { as: "p" }, "Are you sure you want to ", action, " ", /*#__PURE__*/_react.default.createElement("strong", null, "\u201C", documentTitle, "\u201D"), "?"); } var documentCount = crossDatasetReferences.totalCount === 1 ? '1 document' : "".concat(crossDatasetReferences.totalCount.toLocaleString(), " documents"); // We do some extra checks to handle cases where you have unavailable dataset // name(s) due to permissions, both alone and in combination with known datasets // This normalizes one or more undefined dataset names to the catch-all `unavailable` var normalizedDatasetNames = [...datasetNames, ...(hasUnknownDatasetNames ? ['unavailable'] : [])]; var datasetsCount = normalizedDatasetNames.length === 1 ? 'another dataset' : "".concat(normalizedDatasetNames.length, " datasets"); var datasetNameList = "Dataset".concat(normalizedDatasetNames.length === 1 ? '' : 's', ": ").concat(normalizedDatasetNames.join(', ')); // We only have one dataset, and it is unavailable due to permissions if (hasUnknownDatasetNames && normalizedDatasetNames.length === 1) { datasetNameList = 'Unavailable dataset'; } return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ui.Card, { padding: 3, radius: 2, tone: "caution", marginBottom: 4, flex: "none" }, /*#__PURE__*/_react.default.createElement(_ui.Flex, null, /*#__PURE__*/_react.default.createElement(_ui.Text, { "aria-hidden": "true", size: 1 }, /*#__PURE__*/_react.default.createElement(_icons.WarningOutlineIcon, null)), /*#__PURE__*/_react.default.createElement(_ui.Box, { flex: 1, marginLeft: 3 }, /*#__PURE__*/_react.default.createElement(_ui.Text, { size: 1 }, totalCount === 1 ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "1 document refers to \u201C", documentTitle, "\u201D") : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, totalCount.toLocaleString(), " documents refer to \u201C", documentTitle, "\u201D"))))), /*#__PURE__*/_react.default.createElement(_ui.Box, { flex: "none", marginBottom: 4 }, /*#__PURE__*/_react.default.createElement(_ui.Text, null, "You may not be able to ", action, " \u201C", documentTitle, "\u201D because the following documents refer to it:")), /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.ReferencesCard, null, /*#__PURE__*/_react.default.createElement(_ui.Flex, { direction: "column", height: "fill" }, internalReferences.totalCount > 0 && /*#__PURE__*/_react.default.createElement(_ui.Stack, { as: "ul", padding: 3, space: 3, overflow: "auto", "data-testid": "internal-references" }, internalReferences === null || internalReferences === void 0 ? void 0 : internalReferences.references.map(item => /*#__PURE__*/_react.default.createElement(_ui.Box, { as: "li", key: item._id }, renderPreviewItem(item))), internalReferences.totalCount > internalReferences.references.length && /*#__PURE__*/_react.default.createElement(_ui.Box, { as: "li", padding: 3 }, /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.OtherReferenceCount, internalReferences))), crossDatasetReferences.totalCount > 0 && /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.CrossDatasetReferencesDetails, { "data-testid": "cross-dataset-references", style: { // only add the border if needed borderTop: internalReferences.totalCount > 0 ? '1px solid var(--card-shadow-outline-color)' : undefined } }, /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.CrossDatasetReferencesSummary, null, /*#__PURE__*/_react.default.createElement(_ui.Flex, { padding: 4, align: "center" }, /*#__PURE__*/_react.default.createElement(_ui.Box, { marginRight: 4 }, /*#__PURE__*/_react.default.createElement(_ui.Text, { size: 3 }, /*#__PURE__*/_react.default.createElement(_icons.DocumentsIcon, null))), /*#__PURE__*/_react.default.createElement(_ui.Flex, { marginRight: 4, direction: "column" }, /*#__PURE__*/_react.default.createElement(_ui.Box, { marginBottom: 2 }, /*#__PURE__*/_react.default.createElement(_ui.Text, null, documentCount, " in ", datasetsCount)), /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Text, { title: datasetNameList, textOverflow: "ellipsis", size: 1, muted: true }, datasetNameList))), /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.ChevronWrapper, null, /*#__PURE__*/_react.default.createElement(_ui.Text, { muted: true }, /*#__PURE__*/_react.default.createElement(_icons.ChevronDownIcon, null))))), /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.TableContainer, null, /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.Table, null, /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, /*#__PURE__*/_react.default.createElement(_ui.Label, { muted: true, size: 0 }, "Project ID")), /*#__PURE__*/_react.default.createElement("th", null, /*#__PURE__*/_react.default.createElement(_ui.Label, { muted: true, size: 0 }, "Dataset")), /*#__PURE__*/_react.default.createElement("th", null, /*#__PURE__*/_react.default.createElement(_ui.Label, { muted: true, size: 0 }, "Document ID")))), /*#__PURE__*/_react.default.createElement("tbody", null, crossDatasetReferences.references.filter(reference => { return 'projectId' in reference; }).map((_ref2, index) => { var projectId = _ref2.projectId, datasetName = _ref2.datasetName, documentId = _ref2.documentId; return ( /*#__PURE__*/ // eslint-disable-next-line react/no-array-index-key _react.default.createElement("tr", { key: "".concat(documentId, "-").concat(index) }, /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(_ui.Text, { size: 1 }, projectId)), /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(_ui.Text, { size: 1 }, datasetName || 'unavailable')), /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.DocumentIdFlex, { align: "center", gap: 2, justify: "flex-end" }, /*#__PURE__*/_react.default.createElement(_ui.Text, { textOverflow: "ellipsis", size: 1 }, documentId || 'unavailable'), documentId && /*#__PURE__*/_react.default.createElement(_reactCopyToClipboard.CopyToClipboard, { text: documentId // eslint-disable-next-line react/jsx-no-bind , onCopy: () => { // TODO: this isn't visible with the dialog open toast.push({ title: 'Copied document ID to clipboard!', status: 'success' }); } }, /*#__PURE__*/_react.default.createElement(_ui.Button, { title: "Copy ID to clipboard", mode: "bleed", icon: _icons.ClipboardIcon, fontSize: 0 }))))) ); }))), /*#__PURE__*/_react.default.createElement(_ui.Box, { padding: 2 }, /*#__PURE__*/_react.default.createElement(_ConfirmDeleteDialogBody.OtherReferenceCount, crossDatasetReferences)))))), /*#__PURE__*/_react.default.createElement(_ui.Box, { flex: "none" }, /*#__PURE__*/_react.default.createElement(_ui.Text, null, "If you ", action, " this document, documents that refer to it will no longer be able to access it."))); }