@sanity/desk-tool
Version:
Tool for managing all sorts of content in a structured manner
190 lines (185 loc) • 11.3 kB
JavaScript
"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.")));
}