@sanity/hierarchical-document-list 0.1.0-next.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -26
- package/lib/TreeDeskStructure.d.ts +2 -1
- package/lib/TreeDeskStructure.js +82 -33
- package/lib/TreeInputComponent.d.ts +1 -1
- package/lib/TreeInputComponent.js +50 -8
- package/lib/components/DeskWarning.d.ts +1 -1
- package/lib/components/DeskWarning.js +43 -9
- package/lib/components/DocumentInNode.d.ts +1 -1
- package/lib/components/DocumentInNode.js +64 -28
- package/lib/components/DocumentPreviewStatus.d.ts +1 -1
- package/lib/components/DocumentPreviewStatus.js +36 -13
- package/lib/components/NodeActions.d.ts +1 -1
- package/lib/components/NodeActions.js +55 -18
- package/lib/components/NodeContentRenderer.js +75 -49
- package/lib/components/PlaceholderDropzone.d.ts +1 -1
- package/lib/components/PlaceholderDropzone.js +22 -9
- package/lib/components/TreeEditor.d.ts +1 -1
- package/lib/components/TreeEditor.js +48 -30
- package/lib/components/TreeEditorErrorBoundary.d.ts +2 -16
- package/lib/components/TreeEditorErrorBoundary.js +50 -31
- package/lib/components/TreeNodeRenderer.js +53 -16
- package/lib/components/TreeNodeRendererScaffold.d.ts +1 -1
- package/lib/components/TreeNodeRendererScaffold.js +19 -139
- package/lib/createDeskHierarchy.js +58 -27
- package/lib/createHierarchicalSchemas.d.ts +78 -0
- package/lib/createHierarchicalSchemas.js +138 -0
- package/lib/{utils → hooks}/useAllItems.d.ts +0 -0
- package/lib/hooks/useAllItems.js +119 -0
- package/lib/{utils → hooks}/useLocalTree.d.ts +0 -0
- package/lib/hooks/useLocalTree.js +59 -0
- package/lib/{utils → hooks}/useTreeOperations.d.ts +1 -1
- package/lib/hooks/useTreeOperations.js +39 -0
- package/lib/{utils → hooks}/useTreeOperationsProvider.d.ts +1 -1
- package/lib/hooks/useTreeOperationsProvider.js +85 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +12 -3
- package/lib/schemas/hierarchy.tree.d.ts +5 -15
- package/lib/schemas/hierarchy.tree.js +10 -21
- package/lib/utils/flatDataToTree.js +21 -9
- package/lib/utils/getAdjescentNodes.js +10 -6
- package/lib/utils/getCommonTreeProps.js +28 -10
- package/lib/utils/getTreeHeight.js +9 -5
- package/lib/utils/gradientPatchAdapter.js +26 -18
- package/lib/utils/idUtils.js +9 -2
- package/lib/utils/injectNodeTypeInPatches.d.ts +12 -0
- package/lib/utils/injectNodeTypeInPatches.js +58 -0
- package/lib/utils/moveItemInArray.js +18 -5
- package/lib/utils/throwError.d.ts +7 -0
- package/lib/utils/throwError.js +12 -0
- package/lib/utils/treeData.js +87 -46
- package/lib/utils/treePatches.js +96 -47
- package/package.json +1 -2
- package/tsconfig.json +4 -4
- package/lib/createHierarchicalField.d.ts +0 -8
- package/lib/createHierarchicalField.js +0 -36
- package/lib/utils/useAllItems.js +0 -92
- package/lib/utils/useLocalTree.js +0 -27
- package/lib/utils/useTreeOperations.js +0 -16
- package/lib/utils/useTreeOperationsProvider.js +0 -52
|
@@ -1,16 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.TimeAgo = void 0;
|
|
15
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
|
+
var components_1 = require("@sanity/base/components");
|
|
17
|
+
var hooks_1 = require("@sanity/base/hooks");
|
|
18
|
+
var icons_1 = require("@sanity/icons");
|
|
19
|
+
var ui_1 = require("@sanity/ui");
|
|
20
|
+
function TimeAgo(_a) {
|
|
21
|
+
var time = _a.time;
|
|
22
|
+
var timeAgo = (0, hooks_1.useTimeAgo)(time);
|
|
23
|
+
return ((0, jsx_runtime_1.jsxs)("span", __assign({ title: timeAgo }, { children: [timeAgo, timeAgo.toLowerCase().trim().startsWith('just now') ? '' : ' ago'] }), void 0));
|
|
9
24
|
}
|
|
10
|
-
|
|
11
|
-
|
|
25
|
+
exports.TimeAgo = TimeAgo;
|
|
26
|
+
var PublishedStatus = function (_a) {
|
|
27
|
+
var document = _a.document;
|
|
28
|
+
return ((0, jsx_runtime_1.jsx)(ui_1.Tooltip, __assign({ portal: true, content: (0, jsx_runtime_1.jsx)(ui_1.Box, __assign({ padding: 2 }, { children: (0, jsx_runtime_1.jsx)(ui_1.Text, __assign({ size: 1 }, { children: document ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Published ", document._updatedAt && (0, jsx_runtime_1.jsx)(TimeAgo, { time: document._updatedAt }, void 0)] }, void 0)) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "Not published" }, void 0)) }), void 0) }), void 0) }, { children: (0, jsx_runtime_1.jsx)(components_1.TextWithTone, __assign({ tone: "positive", dimmed: !document, muted: !document, size: 1 }, { children: (0, jsx_runtime_1.jsx)(icons_1.PublishIcon, {}, void 0) }), void 0) }), void 0));
|
|
29
|
+
};
|
|
30
|
+
var DraftStatus = function (_a) {
|
|
31
|
+
var document = _a.document;
|
|
32
|
+
return ((0, jsx_runtime_1.jsx)(ui_1.Tooltip, __assign({ portal: true, content: (0, jsx_runtime_1.jsx)(ui_1.Box, __assign({ padding: 2 }, { children: (0, jsx_runtime_1.jsx)(ui_1.Text, __assign({ size: 1 }, { children: document ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Edited ", (document === null || document === void 0 ? void 0 : document._updatedAt) && (0, jsx_runtime_1.jsx)(TimeAgo, { time: document === null || document === void 0 ? void 0 : document._updatedAt }, void 0)] }, void 0)) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: "No unpublished edits" }, void 0)) }), void 0) }), void 0) }, { children: (0, jsx_runtime_1.jsx)(components_1.TextWithTone, __assign({ tone: "caution", dimmed: !document, muted: !document, size: 1 }, { children: (0, jsx_runtime_1.jsx)(icons_1.EditIcon, {}, void 0) }), void 0) }), void 0));
|
|
33
|
+
};
|
|
12
34
|
// Adapted from @sanity\desk-tool\src\components\paneItem\helpers.tsx
|
|
13
|
-
|
|
14
|
-
|
|
35
|
+
var DocumentPreviewStatus = function (_a) {
|
|
36
|
+
var draft = _a.draft, published = _a.published;
|
|
37
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Inline, __assign({ space: 4 }, { children: [(0, jsx_runtime_1.jsx)(PublishedStatus, { document: published }, void 0), (0, jsx_runtime_1.jsx)(DraftStatus, { document: draft }, void 0)] }), void 0));
|
|
15
38
|
};
|
|
16
|
-
|
|
39
|
+
exports.default = DocumentPreviewStatus;
|
|
@@ -1,24 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
33
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
37
|
+
var components_1 = require("@sanity/base/components");
|
|
38
|
+
var icons_1 = require("@sanity/icons");
|
|
39
|
+
var ui_1 = require("@sanity/ui");
|
|
40
|
+
var React = __importStar(require("react"));
|
|
41
|
+
var useTreeOperations_1 = __importDefault(require("../hooks/useTreeOperations"));
|
|
7
42
|
/**
|
|
8
43
|
* Applicable only to nodes inside the main tree.
|
|
9
44
|
* Unadded items have their actions defined in TreeEditor.
|
|
10
45
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
46
|
+
var NodeActions = function (_a) {
|
|
47
|
+
var nodeProps = _a.nodeProps;
|
|
48
|
+
var operations = (0, useTreeOperations_1.default)();
|
|
49
|
+
var node = nodeProps.node;
|
|
50
|
+
var _b = (node === null || node === void 0 ? void 0 : node.value) || {}, reference = _b.reference, docType = _b.docType;
|
|
15
51
|
// Adapted from @sanity\form-builder\src\inputs\ReferenceInput\ArrayItemReferenceInput.tsx
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
52
|
+
var OpenLink = React.useMemo(function () {
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
54
|
+
return React.forwardRef(function OpenLinkInner(restProps, _ref) {
|
|
55
|
+
return ((0, jsx_runtime_1.jsx)(components_1.IntentLink, __assign({}, restProps, { intent: "edit", params: { id: reference === null || reference === void 0 ? void 0 : reference._ref, type: docType }, target: "_blank", rel: "noopener noreferrer", ref: _ref }), void 0));
|
|
56
|
+
});
|
|
57
|
+
}, [reference === null || reference === void 0 ? void 0 : reference._ref, docType]);
|
|
58
|
+
var isValid = !!node.publishedId;
|
|
59
|
+
return ((0, jsx_runtime_1.jsx)(ui_1.MenuButton, { button: (0, jsx_runtime_1.jsx)(ui_1.Button, { padding: 2, mode: "bleed", icon: icons_1.EllipsisVerticalIcon }, void 0), id: "hiearchical-doc-list--".concat(node._key, "-menuButton"), menu: (0, jsx_runtime_1.jsxs)(ui_1.Menu, { children: [(0, jsx_runtime_1.jsx)(ui_1.MenuItem, { text: "Remove from list", tone: "critical", icon: icons_1.RemoveCircleIcon, onClick: function () { return operations.removeItem(nodeProps); } }, void 0), (0, jsx_runtime_1.jsx)(ui_1.MenuItem, { text: "Duplicate item", icon: icons_1.CopyIcon, disabled: !isValid, onClick: function () { return operations.duplicateItem(nodeProps); } }, void 0), (0, jsx_runtime_1.jsx)(ui_1.MenuDivider, {}, void 0), (0, jsx_runtime_1.jsx)(ui_1.MenuItem, { text: "Open in new tab", icon: icons_1.LaunchIcon, disabled: !isValid, as: OpenLink, "data-as": "a" }, void 0)] }, void 0), placement: "right", popover: { portal: true, tone: 'default' } }, void 0));
|
|
23
60
|
};
|
|
24
|
-
|
|
61
|
+
exports.default = NodeActions;
|
|
@@ -1,55 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
3
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
4
|
+
return cooked;
|
|
5
|
+
};
|
|
6
|
+
var __assign = (this && this.__assign) || function () {
|
|
7
|
+
__assign = Object.assign || function(t) {
|
|
8
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
9
|
+
s = arguments[i];
|
|
10
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
11
|
+
t[p] = s[p];
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
};
|
|
15
|
+
return __assign.apply(this, arguments);
|
|
16
|
+
};
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
41
|
+
var color_1 = require("@sanity/color");
|
|
42
|
+
var icons_1 = require("@sanity/icons");
|
|
43
|
+
var ui_1 = require("@sanity/ui");
|
|
44
|
+
var React = __importStar(require("react"));
|
|
45
|
+
var react_sortable_tree_1 = require("react-sortable-tree");
|
|
46
|
+
var styled_components_1 = __importDefault(require("styled-components"));
|
|
47
|
+
var Root = styled_components_1.default.div(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n // Adapted from react-sortable-tree/style.css\n &[data-landing='true'] > *,\n &[data-cancel='true'] > * {\n opacity: 0 !important;\n }\n &[data-landing='true']::before,\n &[data-cancel='true']::before {\n background-color: ", ";\n border: 2px dashed ", ";\n border-radius: 3px;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n }\n\n &[data-cancel='true']::before {\n background-color: ", ";\n }\n"], ["\n // Adapted from react-sortable-tree/style.css\n &[data-landing='true'] > *,\n &[data-cancel='true'] > * {\n opacity: 0 !important;\n }\n &[data-landing='true']::before,\n &[data-cancel='true']::before {\n background-color: ", ";\n border: 2px dashed ", ";\n border-radius: 3px;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n }\n\n &[data-cancel='true']::before {\n background-color: ", ";\n }\n"
|
|
48
|
+
/**
|
|
49
|
+
* Customization of react-sortable-tree's default node.
|
|
50
|
+
* Created in order to use Sanity UI for styles.
|
|
51
|
+
* Reference: https://github.com/frontend-collective/react-sortable-tree/blob/master/src/node-renderer-default.js
|
|
52
|
+
*/
|
|
53
|
+
])), color_1.cyan[50].hex, color_1.gray[400].hex, color_1.red[50].hex);
|
|
32
54
|
/**
|
|
33
55
|
* Customization of react-sortable-tree's default node.
|
|
34
56
|
* Created in order to use Sanity UI for styles.
|
|
35
57
|
* Reference: https://github.com/frontend-collective/react-sortable-tree/blob/master/src/node-renderer-default.js
|
|
36
58
|
*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
59
|
+
var NodeContentRenderer = function (props) {
|
|
60
|
+
var node = props.node, path = props.path, treeIndex = props.treeIndex, _a = props.canDrag, canDrag = _a === void 0 ? false : _a;
|
|
61
|
+
var nodeTitle = node.title;
|
|
62
|
+
var Handle = React.useMemo(function () {
|
|
41
63
|
if (!canDrag) {
|
|
42
64
|
return null;
|
|
43
65
|
}
|
|
44
66
|
if (typeof node.children === 'function' && node.expanded) {
|
|
45
67
|
// Show a loading symbol on the handle when the children are expanded
|
|
46
68
|
// and yet still defined by a function (a callback to fetch the children)
|
|
47
|
-
return
|
|
69
|
+
return (0, jsx_runtime_1.jsx)(ui_1.Spinner, {}, void 0);
|
|
48
70
|
}
|
|
49
|
-
|
|
71
|
+
var BtnElement = ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(ui_1.Button, __assign({ mode: "bleed", paddingX: 0, paddingY: 1, style: {
|
|
50
72
|
cursor: node.publishedId ? 'grab' : 'default',
|
|
51
73
|
fontSize: '1.5625rem'
|
|
52
|
-
}, "data-ui": "DragHandleButton", "data-drag-handle": canDrag, disabled: !node.publishedId, children:
|
|
74
|
+
}, "data-ui": "DragHandleButton", "data-drag-handle": canDrag, disabled: !node.publishedId }, { children: (0, jsx_runtime_1.jsx)(icons_1.DragHandleIcon, { style: { marginBottom: '-0.1em' } }, void 0) }), void 0) }, void 0));
|
|
53
75
|
// Don't allow editors to drag invalid documents
|
|
54
76
|
if (!node.publishedId) {
|
|
55
77
|
return BtnElement;
|
|
@@ -59,21 +81,25 @@ const NodeContentRenderer = (props) => {
|
|
|
59
81
|
dropEffect: 'copy'
|
|
60
82
|
});
|
|
61
83
|
}, [canDrag, node, typeof node.children === 'function']);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return (
|
|
84
|
+
var isDraggedDescendant = props.draggedNode && (0, react_sortable_tree_1.isDescendant)(props.draggedNode, node);
|
|
85
|
+
var isLandingPadActive = !props.didDrop && props.isDragging;
|
|
86
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.Box, __assign({ style: { position: 'relative' } }, { children: [props.toggleChildrenVisibility &&
|
|
65
87
|
node.children &&
|
|
66
|
-
(node.children.length > 0 || typeof node.children === 'function') && (
|
|
88
|
+
(node.children.length > 0 || typeof node.children === 'function') && ((0, jsx_runtime_1.jsx)("div", __assign({ style: {
|
|
67
89
|
position: 'absolute',
|
|
68
90
|
left: '-2px',
|
|
69
91
|
top: '40%',
|
|
70
92
|
transform: 'translate(-100%, -50%)'
|
|
71
|
-
}, children:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
93
|
+
} }, { children: (0, jsx_runtime_1.jsx)(ui_1.Button, { "aria-label": node.expanded ? 'Collapse' : 'Expand', icon: node.expanded ? ((0, jsx_runtime_1.jsx)(icons_1.ChevronDownIcon, { color: color_1.gray[200].hex }, void 0)) : ((0, jsx_runtime_1.jsx)(icons_1.ChevronRightIcon, { color: color_1.gray[200].hex }, void 0)), mode: "bleed", fontSize: 2, padding: 1, type: "button", onClick: function () {
|
|
94
|
+
var _a;
|
|
95
|
+
return (_a = props.toggleChildrenVisibility) === null || _a === void 0 ? void 0 : _a.call(props, {
|
|
96
|
+
node: node,
|
|
97
|
+
path: path,
|
|
98
|
+
treeIndex: treeIndex
|
|
99
|
+
});
|
|
100
|
+
} }, void 0) }), void 0)), props.connectDragPreview((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(Root, __assign({ "data-landing": isLandingPadActive, "data-cancel": isLandingPadActive && !props.canDrop, style: {
|
|
76
101
|
opacity: isDraggedDescendant ? 0.5 : 1
|
|
77
|
-
}, children:
|
|
102
|
+
} }, { children: (0, jsx_runtime_1.jsxs)(ui_1.Flex, __assign({ align: "center" }, { children: [Handle, typeof nodeTitle === 'function' ? nodeTitle(props) : nodeTitle] }), void 0) }), void 0) }, void 0))] }), void 0));
|
|
78
103
|
};
|
|
79
|
-
|
|
104
|
+
exports.default = NodeContentRenderer;
|
|
105
|
+
var templateObject_1;
|
|
@@ -1,17 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
15
|
+
var ui_1 = require("@sanity/ui");
|
|
16
|
+
var PlaceholderDropzone = function (props) {
|
|
17
|
+
var isValid = props.isOver && props.canDrop;
|
|
18
|
+
var isInvalid = props.isOver && !props.canDrop;
|
|
19
|
+
var tone = 'transparent';
|
|
7
20
|
if (isValid) {
|
|
8
21
|
tone = 'positive';
|
|
9
22
|
}
|
|
10
23
|
if (isInvalid) {
|
|
11
24
|
tone = 'caution';
|
|
12
25
|
}
|
|
13
|
-
return (
|
|
26
|
+
return ((0, jsx_runtime_1.jsx)(ui_1.Box, __assign({ padding: 3 }, { children: (0, jsx_runtime_1.jsx)(ui_1.Card, __assign({ padding: 5, radius: 2, border: true, tone: tone, style: {
|
|
14
27
|
borderStyle: props.isOver ? undefined : 'dashed'
|
|
15
|
-
}, children:
|
|
28
|
+
} }, { children: (0, jsx_runtime_1.jsxs)(ui_1.Stack, __assign({ space: 2, style: { textAlign: 'center' } }, { children: [(0, jsx_runtime_1.jsxs)(ui_1.Text, __assign({ size: 2, as: "h2", muted: true }, { children: [!props.isOver && props.title, isValid && 'Drop here', isInvalid && 'Invalid location or element'] }), void 0), props.subtitle && (0, jsx_runtime_1.jsx)(ui_1.Text, __assign({ size: 1 }, { children: props.subtitle }), void 0), props.children] }), void 0) }), void 0) }), void 0));
|
|
16
29
|
};
|
|
17
|
-
|
|
30
|
+
exports.default = PlaceholderDropzone;
|
|
@@ -1,41 +1,59 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
18
|
+
var icons_1 = require("@sanity/icons");
|
|
19
|
+
var ui_1 = require("@sanity/ui");
|
|
20
|
+
var react_sortable_tree_1 = __importDefault(require("react-sortable-tree"));
|
|
21
|
+
var getCommonTreeProps_1 = __importDefault(require("../utils/getCommonTreeProps"));
|
|
22
|
+
var getTreeHeight_1 = __importDefault(require("../utils/getTreeHeight"));
|
|
23
|
+
var treeData_1 = require("../utils/treeData");
|
|
24
|
+
var useAllItems_1 = __importDefault(require("../hooks/useAllItems"));
|
|
25
|
+
var useLocalTree_1 = __importDefault(require("../hooks/useLocalTree"));
|
|
26
|
+
var useTreeOperations_1 = require("../hooks/useTreeOperations");
|
|
27
|
+
var useTreeOperationsProvider_1 = __importDefault(require("../hooks/useTreeOperationsProvider"));
|
|
28
|
+
var DocumentInNode_1 = __importDefault(require("./DocumentInNode"));
|
|
29
|
+
var TreeEditorErrorBoundary_1 = __importDefault(require("./TreeEditorErrorBoundary"));
|
|
14
30
|
/**
|
|
15
31
|
* The loaded tree users interact with
|
|
16
32
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
33
|
+
var TreeEditor = function (props) {
|
|
34
|
+
var _a = (0, useAllItems_1.default)(props.options), allItemsStatus = _a.status, allItems = _a.allItems;
|
|
35
|
+
var unaddedItems = (0, treeData_1.getUnaddedItems)({ tree: props.tree, allItems: allItems });
|
|
36
|
+
var _b = (0, useLocalTree_1.default)({
|
|
21
37
|
tree: props.tree,
|
|
22
|
-
allItems
|
|
23
|
-
});
|
|
24
|
-
|
|
38
|
+
allItems: allItems
|
|
39
|
+
}), localTree = _b.localTree, handleVisibilityToggle = _b.handleVisibilityToggle;
|
|
40
|
+
var operations = (0, useTreeOperationsProvider_1.default)({
|
|
25
41
|
patchPrefix: props.patchPrefix,
|
|
26
42
|
onChange: props.onChange,
|
|
27
|
-
localTree
|
|
43
|
+
localTree: localTree
|
|
28
44
|
});
|
|
29
|
-
return (
|
|
45
|
+
return ((0, jsx_runtime_1.jsx)(TreeEditorErrorBoundary_1.default, { children: (0, jsx_runtime_1.jsx)(useTreeOperations_1.TreeOperationsContext.Provider, __assign({ value: __assign(__assign({}, operations), { allItemsStatus: allItemsStatus }) }, { children: (0, jsx_runtime_1.jsxs)(ui_1.Stack, __assign({ space: 4, paddingTop: 4 }, { children: [(0, jsx_runtime_1.jsx)(ui_1.Card, __assign({ style: { minHeight: (0, getTreeHeight_1.default)(localTree) },
|
|
30
46
|
// Only include borderBottom if there's something to show in unadded items
|
|
31
|
-
borderBottom: allItemsStatus !== 'success' || unaddedItems
|
|
47
|
+
borderBottom: allItemsStatus !== 'success' || (unaddedItems === null || unaddedItems === void 0 ? void 0 : unaddedItems.length) > 0 }, { children: (0, jsx_runtime_1.jsx)(react_sortable_tree_1.default, __assign({ maxDepth: props.options.maxDepth, onChange: function () {
|
|
32
48
|
// Do nothing. onMoveNode will do all the work
|
|
33
|
-
}, onVisibilityToggle: handleVisibilityToggle, onMoveNode:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
49
|
+
}, onVisibilityToggle: handleVisibilityToggle, onMoveNode: function (data) {
|
|
50
|
+
return operations.handleMovedNode(data);
|
|
51
|
+
}, treeData: localTree }, (0, getCommonTreeProps_1.default)({
|
|
52
|
+
placeholder: {
|
|
53
|
+
title: 'Add items from the list below'
|
|
54
|
+
}
|
|
55
|
+
})), void 0) }), void 0), allItemsStatus === 'success' && (unaddedItems === null || unaddedItems === void 0 ? void 0 : unaddedItems.length) > 0 && ((0, jsx_runtime_1.jsxs)(ui_1.Stack, __assign({ space: 1, paddingX: 2, paddingTop: 3 }, { children: [(0, jsx_runtime_1.jsxs)(ui_1.Stack, __assign({ space: 2, paddingX: 2, paddingBottom: 3 }, { children: [(0, jsx_runtime_1.jsx)(ui_1.Text, __assign({ size: 2, as: "h2", weight: "semibold" }, { children: "Add more items" }), void 0), (0, jsx_runtime_1.jsx)(ui_1.Text, __assign({ size: 1, muted: true }, { children: "Only published documents are shown." }), void 0)] }), void 0), unaddedItems.map(function (item) { return ((0, jsx_runtime_1.jsx)(DocumentInNode_1.default, { item: item, action: (0, jsx_runtime_1.jsx)(ui_1.Tooltip, __assign({ portal: true, placement: "left", content: (0, jsx_runtime_1.jsx)(ui_1.Box, __assign({ padding: 2 }, { children: (0, jsx_runtime_1.jsx)(ui_1.Text, __assign({ size: 1 }, { children: "Add to list" }), void 0) }), void 0) }, { children: (0, jsx_runtime_1.jsx)(ui_1.Button, { onClick: function () {
|
|
38
56
|
operations.addItem(item);
|
|
39
|
-
}, mode: "bleed", icon: AddCircleIcon, style: { cursor: 'pointer' } }, void 0) }, void 0) }, item.publishedId || item.draftId)))] }, void 0)), allItemsStatus === 'loading' && (
|
|
57
|
+
}, mode: "bleed", icon: icons_1.AddCircleIcon, style: { cursor: 'pointer' } }, void 0) }), void 0) }, item.publishedId || item.draftId)); })] }), void 0)), allItemsStatus === 'loading' && ((0, jsx_runtime_1.jsx)(ui_1.Flex, __assign({ padding: 4, align: 'center', justify: 'center' }, { children: (0, jsx_runtime_1.jsx)(ui_1.Spinner, { size: 3, muted: true }, void 0) }), void 0)), allItemsStatus === 'error' && ((0, jsx_runtime_1.jsx)(ui_1.Flex, __assign({ padding: 4, align: 'center', justify: 'center' }, { children: (0, jsx_runtime_1.jsx)(ui_1.Text, __assign({ size: 2, weight: "semibold" }, { children: "Something went wrong when loading documents" }), void 0) }), void 0))] }), void 0) }), void 0) }, void 0));
|
|
40
58
|
};
|
|
41
|
-
|
|
59
|
+
exports.default = TreeEditor;
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
title: string;
|
|
4
|
-
description?: string;
|
|
5
|
-
}
|
|
6
|
-
declare class TreeEditorErrorBoundary extends React.Component<any, {
|
|
7
|
-
error?: ErrorInfo;
|
|
8
|
-
}> {
|
|
9
|
-
constructor(props: any);
|
|
10
|
-
static getDerivedStateFromError(error: unknown): {
|
|
11
|
-
error: undefined;
|
|
12
|
-
} | {
|
|
13
|
-
error: ErrorInfo;
|
|
14
|
-
};
|
|
15
|
-
render(): JSX.Element;
|
|
16
|
-
}
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
declare const TreeEditorErrorBoundary: React.FC;
|
|
17
3
|
export default TreeEditorErrorBoundary;
|
|
@@ -1,13 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
26
|
+
if (mod && mod.__esModule) return mod;
|
|
27
|
+
var result = {};
|
|
28
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
29
|
+
__setModuleDefault(result, mod);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
34
|
+
var ui_1 = require("@sanity/ui");
|
|
35
|
+
var React = __importStar(require("react"));
|
|
36
|
+
var DISPLAY_ERROR = false;
|
|
37
|
+
var ErrorToast = function (_a) {
|
|
38
|
+
var error = _a.error;
|
|
39
|
+
var push = (0, ui_1.useToast)().push;
|
|
40
|
+
React.useEffect(function () {
|
|
41
|
+
if ((error === null || error === void 0 ? void 0 : error.error) && DISPLAY_ERROR) {
|
|
8
42
|
push({
|
|
9
|
-
title: error.
|
|
10
|
-
description: error.
|
|
43
|
+
title: error.error.name,
|
|
44
|
+
description: error.error.message,
|
|
11
45
|
closable: true,
|
|
12
46
|
status: 'error',
|
|
13
47
|
id: 'hierarchical-error'
|
|
@@ -16,25 +50,10 @@ const ErrorToast = ({ error }) => {
|
|
|
16
50
|
}, [error]);
|
|
17
51
|
return null;
|
|
18
52
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return {
|
|
27
|
-
error: undefined
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
return {
|
|
31
|
-
error: {
|
|
32
|
-
title: 'Something went wrong'
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
render() {
|
|
37
|
-
return (_jsxs(React.Fragment, { children: [_jsx(ErrorToast, { error: this.state.error }, void 0), this.props.children] }, void 0));
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export default TreeEditorErrorBoundary;
|
|
53
|
+
var TreeEditorErrorBoundary = function (props) {
|
|
54
|
+
var _a = React.useState(undefined), exception = _a[0], setException = _a[1];
|
|
55
|
+
return ((0, jsx_runtime_1.jsxs)(ui_1.ErrorBoundary, __assign({ onCatch: function (newException) {
|
|
56
|
+
setException(newException);
|
|
57
|
+
} }, { children: [(0, jsx_runtime_1.jsx)(ErrorToast, { error: exception }, void 0), props.children] }), void 0));
|
|
58
|
+
};
|
|
59
|
+
exports.default = TreeEditorErrorBoundary;
|