@sanity/hierarchical-document-list 0.1.0-next.1 → 0.1.1

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.
Files changed (47) hide show
  1. package/README.md +91 -40
  2. package/lib/TreeDeskStructure.js +56 -28
  3. package/lib/TreeInputComponent.d.ts +3 -3
  4. package/lib/TreeInputComponent.js +14 -3
  5. package/lib/components/DeskWarning.d.ts +6 -0
  6. package/lib/components/DeskWarning.js +25 -0
  7. package/lib/components/DocumentInNode.d.ts +2 -2
  8. package/lib/components/DocumentInNode.js +29 -17
  9. package/lib/components/DocumentPreviewStatus.js +26 -7
  10. package/lib/components/NodeActions.d.ts +2 -2
  11. package/lib/components/NodeActions.js +24 -10
  12. package/lib/components/NodeContentRenderer.js +42 -40
  13. package/lib/components/PlaceholderDropzone.js +19 -8
  14. package/lib/components/TreeEditor.d.ts +2 -2
  15. package/lib/components/TreeEditor.js +29 -16
  16. package/lib/components/TreeEditorErrorBoundary.d.ts +1 -15
  17. package/lib/components/TreeEditorErrorBoundary.js +26 -28
  18. package/lib/components/TreeNodeRenderer.js +25 -12
  19. package/lib/components/TreeNodeRendererScaffold.js +12 -134
  20. package/lib/createDeskHierarchy.d.ts +4 -0
  21. package/lib/createDeskHierarchy.js +34 -19
  22. package/lib/createHierarchicalField.js +40 -19
  23. package/lib/{hiearchy.tree.d.ts → schemas/hierarchy.tree.d.ts} +0 -0
  24. package/lib/schemas/hierarchy.tree.js +31 -0
  25. package/lib/utils/flatDataToTree.d.ts +3 -3
  26. package/lib/utils/flatDataToTree.js +15 -6
  27. package/lib/utils/getAdjescentNodes.js +7 -6
  28. package/lib/utils/getCommonTreeProps.js +14 -2
  29. package/lib/utils/getTreeHeight.js +3 -3
  30. package/lib/utils/gradientPatchAdapter.js +16 -15
  31. package/lib/utils/idUtils.js +4 -2
  32. package/lib/utils/moveItemInArray.js +15 -5
  33. package/lib/utils/treeData.d.ts +7 -7
  34. package/lib/utils/treeData.js +65 -36
  35. package/lib/utils/treePatches.d.ts +10 -8
  36. package/lib/utils/treePatches.js +58 -50
  37. package/lib/utils/useAllItems.js +43 -41
  38. package/lib/utils/useLocalTree.d.ts +5 -5
  39. package/lib/utils/useLocalTree.js +21 -11
  40. package/lib/utils/useTreeOperations.js +1 -1
  41. package/lib/utils/useTreeOperationsProvider.d.ts +7 -8
  42. package/lib/utils/useTreeOperationsProvider.js +25 -17
  43. package/package.json +11 -9
  44. package/sanity.json +1 -1
  45. package/screenshot-1.jpg +0 -0
  46. package/tsconfig.json +1 -1
  47. package/lib/hiearchy.tree.js +0 -28
@@ -1,3 +1,23 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
13
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
14
+ if (ar || !(i in from)) {
15
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
16
+ ar[i] = from[i];
17
+ }
18
+ }
19
+ return to.concat(ar || Array.prototype.slice.call(from));
20
+ };
1
21
  import * as Patch from '@sanity/form-builder/lib/patch/patches';
2
22
  import { randomKey } from '@sanity/util/content';
3
23
  import { getFlatDataFromTree } from 'react-sortable-tree';
@@ -5,51 +25,48 @@ import getAdjescentNodes from './getAdjescentNodes';
5
25
  import moveItemInArray from './moveItemInArray';
6
26
  import { normalizeNodeForStorage } from './treeData';
7
27
  export function getAddItemPatch(item) {
8
- const normalizedNode = normalizeNodeForStorage(item);
28
+ var normalizedNode = normalizeNodeForStorage(item);
9
29
  return [
10
30
  // Add the node to the end of the tree
11
31
  Patch.insert([normalizedNode], 'after', [-1])
12
32
  ];
13
33
  }
14
34
  export function getDuplicateItemPatch(nodeProps) {
15
- const newItem = {
16
- ...nodeProps.node,
17
- _key: randomKey(12)
18
- };
19
- const normalizedNode = normalizeNodeForStorage(newItem);
35
+ var newItem = __assign(__assign({}, nodeProps.node), { _key: randomKey(12) });
36
+ var normalizedNode = normalizeNodeForStorage(newItem);
20
37
  return [
21
38
  // Add duplicated node before the existing one
22
39
  Patch.insert([normalizedNode], 'before', [{ _key: nodeProps.node._key }])
23
40
  ];
24
41
  }
25
- export function getRemoveItemPatch({ node }) {
26
- const keyPath = { _key: node._key };
27
- const children = getChildrenPaths(node);
28
- return [
42
+ export function getRemoveItemPatch(_a) {
43
+ var node = _a.node;
44
+ var keyPath = { _key: node._key };
45
+ var children = getChildrenPaths(node);
46
+ return __spreadArray([
29
47
  // 1. Unset the removed node
30
- Patch.unset([keyPath]),
31
- // 2. Unset its children
32
- ...children.map((path) => Patch.unset([{ _key: path }]))
33
- ];
48
+ Patch.unset([keyPath])
49
+ ], children.map(function (path) { return Patch.unset([{ _key: path }]); }), true);
34
50
  }
35
51
  export function getMovedNodePatch(data) {
36
- const { nextParentNode } = data;
37
- const keyPath = { _key: data.node._key };
52
+ var _a, _b;
53
+ var nextParentNode = data.nextParentNode;
54
+ var keyPath = { _key: data.node._key };
38
55
  // === REMOVING NODE FROM TREE ===
39
56
  // `nextPath` will be null if the item is removed from tree
40
57
  if (!Array.isArray(data.nextPath)) {
41
58
  return getRemoveItemPatch({ node: data.node });
42
59
  }
43
- const nextFlatTree = getFlatDataFromTree({
60
+ var nextFlatTree = getFlatDataFromTree({
44
61
  treeData: data.treeData,
45
- getNodeKey: (t) => t.node._key
62
+ getNodeKey: function (t) { return t.node._key; }
46
63
  });
47
- const normalizedNode = normalizeNodeForStorage(data.node);
48
- const { leadingNode, followingNode } = getAdjescentNodes({
64
+ var normalizedNode = normalizeNodeForStorage(data.node);
65
+ var _c = getAdjescentNodes({
49
66
  flatTree: nextFlatTree,
50
67
  node: data.node,
51
68
  treeIndex: data.nextTreeIndex
52
- });
69
+ }), leadingNode = _c.leadingNode, followingNode = _c.followingNode;
53
70
  return [
54
71
  // 1. Unset the moved node
55
72
  // (will be ignored by Content Lake on new nodes with _key not yet in tree)
@@ -57,13 +74,12 @@ export function getMovedNodePatch(data) {
57
74
  // 2. SIBLING-BASED PLACEMENT
58
75
  // If we were to place solely based on nextTreeIndex, concurrent changes from other editors could put the new node in an unexpected position.
59
76
  // Let's instead anchor it to the _key of the sibling coming before or after it.
60
- leadingNode?.node?._key
77
+ ((_a = leadingNode === null || leadingNode === void 0 ? void 0 : leadingNode.node) === null || _a === void 0 ? void 0 : _a._key)
61
78
  ? // After the sibling before it
62
79
  Patch.insert([normalizedNode], 'after', [{ _key: leadingNode.node._key }])
63
80
  : // Or before the sibling right after it, in case there's no leading sibling node
64
- Patch.insert([normalizedNode], 'before', [
65
- followingNode?.node?._key ? { _key: followingNode.node._key } : data.nextTreeIndex
66
- ]),
81
+ // prettier-ignore
82
+ Patch.insert([normalizedNode], 'before', [((_b = followingNode === null || followingNode === void 0 ? void 0 : followingNode.node) === null || _b === void 0 ? void 0 : _b._key) ? { _key: followingNode.node._key } : data.nextTreeIndex]),
67
83
  // 3. Patch the new node with its new `parent`
68
84
  nextParentNode
69
85
  ? // If it has a parent node, set that parent's _key
@@ -77,51 +93,43 @@ function getChildrenPaths(node) {
77
93
  return [];
78
94
  }
79
95
  return node.children
80
- .reduce((keyPaths, child) => [...keyPaths, child._key, ...getChildrenPaths(child)], [])
96
+ .reduce(function (keyPaths, child) { return __spreadArray(__spreadArray(__spreadArray([], keyPaths, true), [child._key], false), getChildrenPaths(child), true); }, [])
81
97
  .filter(Boolean);
82
98
  }
83
- export function getMoveItemPatch({ nodeProps: { node, treeIndex, parentNode }, localTree, direction = 'up' }) {
84
- const keyPath = { _key: node._key };
85
- const nextTreeIndex = treeIndex + (direction === 'up' ? -1 : 1);
86
- const flatTree = getFlatDataFromTree({
99
+ export function getMoveItemPatch(_a) {
100
+ var _b, _c;
101
+ var _d = _a.nodeProps, node = _d.node, treeIndex = _d.treeIndex, localTree = _a.localTree, _e = _a.direction, direction = _e === void 0 ? 'up' : _e;
102
+ var keyPath = { _key: node._key };
103
+ var nextTreeIndex = treeIndex + (direction === 'up' ? -1 : 1);
104
+ var flatTree = getFlatDataFromTree({
87
105
  treeData: localTree,
88
- getNodeKey: (t) => t.node._key
106
+ getNodeKey: function (t) { return t.node._key; }
89
107
  });
90
- const nextFlatTree = moveItemInArray({
108
+ var nextFlatTree = moveItemInArray({
91
109
  array: flatTree,
92
110
  fromIndex: treeIndex,
93
111
  toIndex: nextTreeIndex
94
112
  });
95
- const { leadingNode, followingNode } = getAdjescentNodes({
113
+ var _f = getAdjescentNodes({
96
114
  flatTree: nextFlatTree,
97
- node,
115
+ node: node,
98
116
  treeIndex: nextTreeIndex
99
- });
100
- const normalizedNode = normalizeNodeForStorage(node);
101
- console.log(`Move ${direction}`, {
102
- node,
103
- treeIndex,
104
- parentNode,
105
- nextFlatTree,
106
- flatTree,
107
- localTree,
108
- leadingSibling: leadingNode,
109
- followingSibling: followingNode
110
- });
117
+ }), leadingNode = _f.leadingNode, followingNode = _f.followingNode;
118
+ var normalizedNode = normalizeNodeForStorage(node);
111
119
  // When moving up, look at following node to figure out what is the next parent.
112
- const nodeToInheritParent = direction === 'up' ? followingNode : leadingNode;
113
- const nextParentNode = nodeToInheritParent?.parentNode;
120
+ var nodeToInheritParent = direction === 'up' ? followingNode : leadingNode;
121
+ var nextParentNode = nodeToInheritParent === null || nodeToInheritParent === void 0 ? void 0 : nodeToInheritParent.parentNode;
114
122
  return [
115
123
  // 1. Unset the moved node
116
124
  // (will be ignored by Content Lake on new nodes with _key not yet in tree)
117
125
  Patch.unset([keyPath]),
118
126
  // 2. SIBLING-BASED PLACEMENT
119
- leadingNode?.node?._key
127
+ ((_b = leadingNode === null || leadingNode === void 0 ? void 0 : leadingNode.node) === null || _b === void 0 ? void 0 : _b._key)
120
128
  ? // After the sibling before it
121
129
  Patch.insert([normalizedNode], 'after', [{ _key: leadingNode.node._key }])
122
130
  : // Or before the sibling right after it, in case there's no leading sibling node
123
131
  Patch.insert([normalizedNode], 'before', [
124
- followingNode?.node?._key ? { _key: followingNode.node._key } : nextTreeIndex
132
+ ((_c = followingNode === null || followingNode === void 0 ? void 0 : followingNode.node) === null || _c === void 0 ? void 0 : _c._key) ? { _key: followingNode.node._key } : nextTreeIndex
125
133
  ]),
126
134
  // 3. Patch the new node with its new `parent`
127
135
  nextParentNode
@@ -1,48 +1,54 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
1
12
  import sanityClient from 'part:@sanity/base/client';
2
13
  import React from 'react';
3
14
  import { isDraft, unprefixId } from './idUtils';
4
- const client = sanityClient.withConfig({
15
+ var client = sanityClient.withConfig({
5
16
  apiVersion: '2021-09-01'
6
17
  });
7
- function getDeskFilter({ referenceTo, referenceOptions }) {
8
- const filterParts = ['_type in $docTypes'];
9
- if (referenceOptions?.filter) {
18
+ function getDeskFilter(_a) {
19
+ var referenceTo = _a.referenceTo, referenceOptions = _a.referenceOptions;
20
+ var filterParts = ['_type in $docTypes'];
21
+ if (referenceOptions === null || referenceOptions === void 0 ? void 0 : referenceOptions.filter) {
10
22
  filterParts.push(referenceOptions.filter);
11
23
  }
12
24
  return {
13
25
  filter: filterParts.join(' && '),
14
- params: {
15
- ...(referenceOptions?.filterParams || {}),
16
- docTypes: referenceTo.map((schemaType) => schemaType)
17
- }
26
+ params: __assign(__assign({}, ((referenceOptions === null || referenceOptions === void 0 ? void 0 : referenceOptions.filterParams) || {})), { docTypes: referenceTo.map(function (schemaType) { return schemaType; }) })
18
27
  };
19
28
  }
20
29
  function updateItemInState(state, item) {
21
- const newState = { ...state };
22
- const publishedId = unprefixId(item._id);
23
- newState[publishedId] = {
24
- ...(newState[publishedId] || {}),
25
- [isDraft(item._id) ? 'draft' : 'published']: item
26
- };
30
+ var _a;
31
+ var newState = __assign({}, state);
32
+ var publishedId = unprefixId(item._id);
33
+ newState[publishedId] = __assign(__assign({}, (newState[publishedId] || {})), (_a = {}, _a[isDraft(item._id) ? 'draft' : 'published'] = item, _a));
27
34
  return newState;
28
35
  }
29
36
  function allItemsReducer(state, action) {
30
- if (action.type === 'addOrEditItem' && action.item?._id) {
37
+ var _a;
38
+ var _b, _c, _d;
39
+ if (action.type === 'addOrEditItem' && ((_b = action.item) === null || _b === void 0 ? void 0 : _b._id)) {
31
40
  return updateItemInState(state, action.item);
32
41
  }
33
42
  if (action.type === 'removeItem') {
34
- const publishedId = unprefixId(action.itemId);
35
- return {
36
- ...state,
37
- [publishedId]: isDraft(action.itemId)
38
- ? // If a draft, keep only published
39
- {
40
- published: state[publishedId]?.published
41
- }
42
- : {
43
- draft: state[publishedId]?.draft
43
+ var publishedId = unprefixId(action.itemId);
44
+ return __assign(__assign({}, state), (_a = {}, _a[publishedId] = isDraft(action.itemId)
45
+ ? // If a draft, keep only published
46
+ {
47
+ published: (_c = state[publishedId]) === null || _c === void 0 ? void 0 : _c.published
44
48
  }
45
- };
49
+ : {
50
+ draft: (_d = state[publishedId]) === null || _d === void 0 ? void 0 : _d.draft
51
+ }, _a));
46
52
  }
47
53
  if (action.type === 'setInitialData') {
48
54
  return action.items.reduce(updateItemInState, {});
@@ -50,8 +56,8 @@ function allItemsReducer(state, action) {
50
56
  return state;
51
57
  }
52
58
  export default function useAllItems(options) {
53
- const [status, setStatus] = React.useState('loading');
54
- const [allItems, dispatch] = React.useReducer(allItemsReducer, {});
59
+ var _a = React.useState('loading'), status = _a[0], setStatus = _a[1];
60
+ var _b = React.useReducer(allItemsReducer, {}), allItems = _b[0], dispatch = _b[1];
55
61
  function handleListener(event) {
56
62
  if (event.type !== 'mutation') {
57
63
  return;
@@ -64,29 +70,25 @@ export default function useAllItems(options) {
64
70
  }
65
71
  }
66
72
  function handleFirstLoad(items) {
67
- dispatch({ type: 'setInitialData', items });
73
+ dispatch({ type: 'setInitialData', items: items });
68
74
  setStatus('success');
69
75
  }
70
- React.useEffect(() => {
71
- const { filter, params } = getDeskFilter(options);
72
- const query = `*[${filter}] {
73
- _id,
74
- _type,
75
- _updatedAt,
76
- }`;
76
+ React.useEffect(function () {
77
+ var _a = getDeskFilter(options), filter = _a.filter, params = _a.params;
78
+ var query = "*[".concat(filter, "] {\n _id,\n _type,\n _updatedAt,\n }");
77
79
  client
78
80
  .fetch(query, params)
79
81
  .then(handleFirstLoad)
80
- .catch(() => {
82
+ .catch(function () {
81
83
  setStatus('error');
82
84
  });
83
- const listener = client.listen(query, params).subscribe(handleListener);
84
- return () => {
85
+ var listener = client.listen(query, params).subscribe(handleListener);
86
+ return function () {
85
87
  listener.unsubscribe();
86
88
  };
87
89
  }, []);
88
90
  return {
89
- status,
90
- allItems
91
+ status: status,
92
+ allItems: allItems
91
93
  };
92
94
  }
@@ -1,17 +1,17 @@
1
- import { OnVisibilityToggleData, TreeItem } from 'react-sortable-tree';
2
- import { AllItems, SanityTreeItem } from '../types';
1
+ import { OnVisibilityToggleData } from 'react-sortable-tree';
2
+ import { AllItems, LocalTreeItem, StoredTreeItem } from '../types';
3
3
  /**
4
4
  * Enhances tree data with information on:
5
5
  * - `expanded` - native property of react-sortable-tree to determine collapsing & expanding of a node's children
6
- * - `draftId` & `publishedId` - refer to SanityTreeItem's type annotations
6
+ * - `draftId` & `publishedId` - refer to LocalTreeItem's type annotations
7
7
  *
8
8
  * Doesn't modify the main tree or has side-effects on data.
9
9
  * Has the added benefit of being local to the user, so external changes won't affect local visibility.
10
10
  */
11
11
  export default function useLocalTree({ tree, allItems }: {
12
- tree: SanityTreeItem[];
12
+ tree: StoredTreeItem[];
13
13
  allItems: AllItems;
14
14
  }): {
15
15
  handleVisibilityToggle: (data: OnVisibilityToggleData) => void;
16
- localTree: TreeItem[];
16
+ localTree: LocalTreeItem[];
17
17
  };
@@ -1,27 +1,37 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
1
12
  import React from 'react';
2
13
  import { dataToEditorTree } from './treeData';
3
14
  /**
4
15
  * Enhances tree data with information on:
5
16
  * - `expanded` - native property of react-sortable-tree to determine collapsing & expanding of a node's children
6
- * - `draftId` & `publishedId` - refer to SanityTreeItem's type annotations
17
+ * - `draftId` & `publishedId` - refer to LocalTreeItem's type annotations
7
18
  *
8
19
  * Doesn't modify the main tree or has side-effects on data.
9
20
  * Has the added benefit of being local to the user, so external changes won't affect local visibility.
10
21
  */
11
- export default function useLocalTree({ tree, allItems }) {
12
- const [visibilityMap, setVisibilityMap] = React.useState({});
22
+ export default function useLocalTree(_a) {
23
+ var tree = _a.tree, allItems = _a.allItems;
24
+ var _b = React.useState({}), visibilityMap = _b[0], setVisibilityMap = _b[1];
13
25
  function handleVisibilityToggle(data) {
14
- setVisibilityMap({
15
- ...visibilityMap,
16
- [data.node._key]: data.expanded
17
- });
26
+ var _a;
27
+ setVisibilityMap(__assign(__assign({}, visibilityMap), (_a = {}, _a[data.node._key] = data.expanded, _a)));
18
28
  }
19
29
  return {
20
30
  localTree: dataToEditorTree({
21
- tree,
22
- allItems,
23
- visibilityMap
31
+ tree: tree,
32
+ allItems: allItems,
33
+ visibilityMap: visibilityMap
24
34
  }),
25
- handleVisibilityToggle
35
+ handleVisibilityToggle: handleVisibilityToggle
26
36
  };
27
37
  }
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  function placeholder() {
3
3
  // no-op
4
4
  }
5
- export const TreeOperationsContext = React.createContext({
5
+ export var TreeOperationsContext = React.createContext({
6
6
  addItem: placeholder,
7
7
  duplicateItem: placeholder,
8
8
  removeItem: placeholder,
@@ -1,15 +1,14 @@
1
- import { NodeRendererProps, TreeItem } from 'react-sortable-tree';
2
- import { SanityTreeItem } from '../types';
1
+ import { LocalTreeItem, NodeProps } from '../types';
3
2
  import { HandleMovedNode } from './treePatches';
4
3
  export default function useTreeOperationsProvider(props: {
5
4
  patchPrefix?: string;
6
5
  onChange: (patch: unknown) => void;
7
- localTree: TreeItem[];
6
+ localTree: LocalTreeItem[];
8
7
  }): {
9
8
  handleMovedNode: HandleMovedNode;
10
- addItem: (item: SanityTreeItem) => void;
11
- duplicateItem: (nodeProps: NodeRendererProps) => void;
12
- removeItem: (nodeProps: NodeRendererProps) => void;
13
- moveItemUp: (nodeProps: NodeRendererProps) => void;
14
- moveItemDown: (nodeProps: NodeRendererProps) => void;
9
+ addItem: (item: LocalTreeItem) => void;
10
+ duplicateItem: (nodeProps: NodeProps) => void;
11
+ removeItem: (nodeProps: NodeProps) => void;
12
+ moveItemUp: (nodeProps: NodeProps) => void;
13
+ moveItemDown: (nodeProps: NodeProps) => void;
15
14
  };
@@ -1,17 +1,25 @@
1
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
+ if (ar || !(i in from)) {
4
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
+ ar[i] = from[i];
6
+ }
7
+ }
8
+ return to.concat(ar || Array.prototype.slice.call(from));
9
+ };
1
10
  import * as Patch from '@sanity/form-builder/lib/patch/patches';
2
11
  import PatchEvent from '@sanity/form-builder/PatchEvent';
3
12
  import { getAddItemPatch, getDuplicateItemPatch, getMovedNodePatch, getMoveItemPatch, getRemoveItemPatch } from './treePatches';
4
13
  export default function useTreeOperationsProvider(props) {
5
- const { localTree } = props;
14
+ var localTree = props.localTree;
6
15
  function runPatches(patches) {
7
- const finalPatches = [
16
+ var finalPatches = __spreadArray([
8
17
  // Ensure tree array exists before any operation
9
- Patch.setIfMissing([]),
10
- ...(patches || [])
11
- ];
12
- let patchEvent = PatchEvent.from(finalPatches);
18
+ Patch.setIfMissing([])
19
+ ], (patches || []), true);
20
+ var patchEvent = PatchEvent.from(finalPatches);
13
21
  if (props.patchPrefix) {
14
- patchEvent = PatchEvent.from(finalPatches.map((patch) => Patch.prefixPath(patch, props.patchPrefix)));
22
+ patchEvent = PatchEvent.from(finalPatches.map(function (patch) { return Patch.prefixPath(patch, props.patchPrefix); }));
15
23
  }
16
24
  props.onChange(patchEvent);
17
25
  }
@@ -29,24 +37,24 @@ export default function useTreeOperationsProvider(props) {
29
37
  }
30
38
  function moveItemUp(nodeProps) {
31
39
  runPatches(getMoveItemPatch({
32
- nodeProps,
33
- localTree,
40
+ nodeProps: nodeProps,
41
+ localTree: localTree,
34
42
  direction: 'up'
35
43
  }));
36
44
  }
37
45
  function moveItemDown(nodeProps) {
38
46
  runPatches(getMoveItemPatch({
39
- nodeProps,
40
- localTree,
47
+ nodeProps: nodeProps,
48
+ localTree: localTree,
41
49
  direction: 'down'
42
50
  }));
43
51
  }
44
52
  return {
45
- handleMovedNode,
46
- addItem,
47
- removeItem,
48
- moveItemUp,
49
- moveItemDown,
50
- duplicateItem
53
+ handleMovedNode: handleMovedNode,
54
+ addItem: addItem,
55
+ removeItem: removeItem,
56
+ moveItemUp: moveItemUp,
57
+ moveItemDown: moveItemDown,
58
+ duplicateItem: duplicateItem
51
59
  };
52
60
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/hierarchical-document-list",
3
- "version": "0.1.0-next.1",
3
+ "version": "0.1.1",
4
4
  "author": "Sanity <hello@sanity.io>",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
@@ -19,6 +19,12 @@
19
19
  "lint": "eslint src"
20
20
  },
21
21
  "devDependencies": {
22
+ "@sanity/base": ">= 2.25.0",
23
+ "@sanity/color": "^2.1.6",
24
+ "@sanity/desk-tool": ">= 2.25.0",
25
+ "@sanity/form-builder": "^2.25.0",
26
+ "@sanity/icons": ">= 1.2.0",
27
+ "@sanity/ui": ">= 0.37.0",
22
28
  "@types/assert": "^1.5.6",
23
29
  "@types/react": "^17.0.38",
24
30
  "@types/react-dom": "^17.0.11",
@@ -30,25 +36,21 @@
30
36
  "eslint-config-prettier": "^8.3.0",
31
37
  "eslint-config-sanity": "^5.1.0",
32
38
  "prettier": "^2.5.1",
39
+ "react": "^17.0.2",
40
+ "react-dom": "^17.0.2",
33
41
  "styled-components": "^5.3.3",
34
42
  "typescript": "^4.5.5"
35
43
  },
36
44
  "type": "module",
37
45
  "dependencies": {
38
- "@sanity/base": ">= 2.25.0",
39
- "@sanity/color": "^2.1.6",
40
- "@sanity/desk-tool": ">= 2.25.0",
41
- "@sanity/form-builder": "^2.25.0",
42
- "@sanity/icons": ">= 1.2.0",
43
- "@sanity/ui": ">= 0.37.0",
44
46
  "assert": "^2.0.0",
45
- "react": "^17.0.2",
46
- "react-dom": "^17.0.2",
47
47
  "react-sortable-tree": "^2.8.0"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@sanity/base": ">= 2.25.0",
51
51
  "@sanity/desk-tool": ">= 2.25.0",
52
+ "react": "^17.0.2",
53
+ "react-dom": "^17.0.2",
52
54
  "styled-components": ">= 5.2.0"
53
55
  }
54
56
  }
package/sanity.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "parts": [
7
7
  {
8
8
  "implements": "part:@sanity/base/schema-type",
9
- "path": "hierarchy.tree.js"
9
+ "path": "schemas/hierarchy.tree.js"
10
10
  }
11
11
  ]
12
12
  }
package/screenshot-1.jpg CHANGED
Binary file
package/tsconfig.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "target": "ESNext",
3
+ "target": "es5",
4
4
  "useDefineForClassFields": true,
5
5
  "lib": ["DOM", "DOM.Iterable", "ESNext"],
6
6
  "allowJs": false,
@@ -1,28 +0,0 @@
1
- import createHierarchicalField from './createHierarchicalField';
2
- export default {
3
- name: 'hierarchy.tree',
4
- title: 'Hierarchical tree',
5
- type: 'document',
6
- liveEdit: true,
7
- fields: [
8
- createHierarchicalField({
9
- name: 'tree',
10
- title: 'Tree',
11
- options: {
12
- referenceTo: ['document']
13
- }
14
- })
15
- ],
16
- preview: {
17
- select: {
18
- id: '_id',
19
- tree: 'tree'
20
- },
21
- prepare({ id, tree }) {
22
- return {
23
- title: `Hierarchical documents (ID: ${id})`,
24
- subtitle: `${tree?.length || 0} document(s) in its list.`
25
- };
26
- }
27
- }
28
- };