@sanity/orderable-document-list 0.0.10 → 1.0.0-v3-studio.2

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 (61) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +135 -55
  3. package/lib/index.d.ts +31 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +827 -30
  6. package/lib/index.js.map +1 -1
  7. package/lib/index.modern.js +818 -0
  8. package/lib/index.modern.js.map +1 -0
  9. package/package.json +57 -23
  10. package/src/{Document.js → Document.tsx} +30 -27
  11. package/src/{DocumentListQuery.js → DocumentListQuery.tsx} +27 -23
  12. package/src/{DocumentListWrapper.js → DocumentListWrapper.tsx} +24 -29
  13. package/src/DraggableList.tsx +304 -0
  14. package/src/{Feedback.js → Feedback.tsx} +2 -7
  15. package/src/OrderableContext.ts +7 -0
  16. package/src/{OrderableDocumentList.js → OrderableDocumentList.tsx} +23 -12
  17. package/src/desk-structure/{orderableDocumentListDeskItem.js → orderableDocumentListDeskItem.ts} +24 -10
  18. package/src/fields/{orderRankField.js → orderRankField.ts} +12 -10
  19. package/src/fields/{orderRankOrdering.js → orderRankOrdering.ts} +0 -0
  20. package/src/helpers/client.ts +5 -0
  21. package/src/helpers/constants.ts +1 -0
  22. package/src/helpers/{initialRank.js → initialRank.ts} +2 -2
  23. package/src/helpers/{reorderDocuments.js → reorderDocuments.ts} +33 -44
  24. package/src/helpers/{resetOrder.js → resetOrder.ts} +3 -8
  25. package/src/index.ts +9 -0
  26. package/.babelrc +0 -3
  27. package/.eslintignore +0 -1
  28. package/.eslintrc.js +0 -50
  29. package/lib/Document.js +0 -101
  30. package/lib/Document.js.map +0 -1
  31. package/lib/DocumentListQuery.js +0 -163
  32. package/lib/DocumentListQuery.js.map +0 -1
  33. package/lib/DocumentListWrapper.js +0 -107
  34. package/lib/DocumentListWrapper.js.map +0 -1
  35. package/lib/DraggableList.js +0 -314
  36. package/lib/DraggableList.js.map +0 -1
  37. package/lib/Feedback.js +0 -31
  38. package/lib/Feedback.js.map +0 -1
  39. package/lib/OrderableContext.js +0 -15
  40. package/lib/OrderableContext.js.map +0 -1
  41. package/lib/OrderableDocumentList.js +0 -103
  42. package/lib/OrderableDocumentList.js.map +0 -1
  43. package/lib/desk-structure/orderableDocumentListDeskItem.js +0 -57
  44. package/lib/desk-structure/orderableDocumentListDeskItem.js.map +0 -1
  45. package/lib/fields/orderRankField.js +0 -64
  46. package/lib/fields/orderRankField.js.map +0 -1
  47. package/lib/fields/orderRankOrdering.js +0 -19
  48. package/lib/fields/orderRankOrdering.js.map +0 -1
  49. package/lib/helpers/constants.js +0 -9
  50. package/lib/helpers/constants.js.map +0 -1
  51. package/lib/helpers/initialRank.js +0 -18
  52. package/lib/helpers/initialRank.js.map +0 -1
  53. package/lib/helpers/reorderDocuments.js +0 -131
  54. package/lib/helpers/reorderDocuments.js.map +0 -1
  55. package/lib/helpers/resetOrder.js +0 -62
  56. package/lib/helpers/resetOrder.js.map +0 -1
  57. package/sanity.json +0 -7
  58. package/src/DraggableList.js +0 -276
  59. package/src/OrderableContext.js +0 -3
  60. package/src/helpers/constants.js +0 -1
  61. package/src/index.js +0 -5
@@ -0,0 +1,818 @@
1
+ import {defineField as $jPEKE$defineField, useSchema as $jPEKE$useSchema, useClient as $jPEKE$useClient} from "sanity";
2
+ import {LexoRank as $jPEKE$LexoRank} from "lexorank";
3
+ import {SortIcon as $jPEKE$SortIcon, GenerateIcon as $jPEKE$GenerateIcon, DragHandleIcon as $jPEKE$DragHandleIcon, ChevronUpIcon as $jPEKE$ChevronUpIcon, ChevronDownIcon as $jPEKE$ChevronDownIcon} from "@sanity/icons";
4
+ import {jsx as $jPEKE$jsx, jsxs as $jPEKE$jsxs, Fragment as $jPEKE$Fragment} from "react/jsx-runtime";
5
+ import $jPEKE$react, {Component as $jPEKE$Component, useEffect as $jPEKE$useEffect, useMemo as $jPEKE$useMemo, useState as $jPEKE$useState, useCallback as $jPEKE$useCallback, useContext as $jPEKE$useContext} from "react";
6
+ import {useToast as $jPEKE$useToast, Flex as $jPEKE$Flex, Spinner as $jPEKE$Spinner, Stack as $jPEKE$Stack, Box as $jPEKE$Box, Card as $jPEKE$Card, Text as $jPEKE$Text, Button as $jPEKE$Button} from "@sanity/ui";
7
+ import {DragDropContext as $jPEKE$DragDropContext, Droppable as $jPEKE$Droppable, Draggable as $jPEKE$Draggable} from "react-beautiful-dnd";
8
+ import {usePaneRouter as $jPEKE$usePaneRouter} from "sanity/desk";
9
+ import {SanityPreview as $jPEKE$SanityPreview} from "sanity/_unstable";
10
+
11
+
12
+ const $21d4b1fe36f88c6f$export$64f27603cb09ba16 = `orderRank`;
13
+
14
+
15
+
16
+ function $27620c24e1768bdb$export$2e2bcd8739ae039(lastRankValue = ``) {
17
+ const lastRank = lastRankValue ? (0, $jPEKE$LexoRank).parse(lastRankValue) : (0, $jPEKE$LexoRank).min();
18
+ const nextRank = lastRank.genNext().genNext();
19
+ return nextRank.value;
20
+ }
21
+
22
+
23
+ const $0413292d5e32b5d9$export$64a609a9111ff100 = (config)=>{
24
+ if (!config?.type) throw new Error(`
25
+ type must be provided.
26
+ Example: orderRankField({type: 'category'})
27
+ `);
28
+ const { type: type } = config;
29
+ return (0, $jPEKE$defineField)({
30
+ title: "Order Rank",
31
+ readOnly: true,
32
+ hidden: true,
33
+ ...config,
34
+ name: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16),
35
+ type: "string",
36
+ initialValue: async ({ getClient: getClient })=>{
37
+ const lastDocOrderRank = await getClient({
38
+ apiVersion: "2021-09-01"
39
+ }).fetch(`*[_type == $type]|order(@[$order] desc)[0][$order]`, {
40
+ type: type,
41
+ order: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)
42
+ });
43
+ return (0, $27620c24e1768bdb$export$2e2bcd8739ae039)(lastDocOrderRank);
44
+ }
45
+ });
46
+ };
47
+
48
+
49
+
50
+ const $e83e0ebbc2cf37df$export$db2ff2f898748a67 = {
51
+ title: "Ordered",
52
+ name: "ordered",
53
+ by: [
54
+ {
55
+ field: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16),
56
+ direction: "asc"
57
+ }
58
+ ]
59
+ };
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+ const $69dfcc58d43c2b6d$export$2a2017d0ec5437fa = (0, $jPEKE$react).createContext({});
85
+
86
+
87
+ function $2e8241e9842bdebe$export$2e2bcd8739ae039({ doc: doc , increment: increment , entities: entities , handleSelect: handleSelect , index: index , isFirst: isFirst , isLast: isLast }) {
88
+ const { showIncrements: showIncrements } = (0, $jPEKE$useContext)((0, $69dfcc58d43c2b6d$export$2a2017d0ec5437fa));
89
+ const schema = (0, $jPEKE$useSchema)();
90
+ return /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $jPEKE$Flex), {
91
+ align: "center",
92
+ children: [
93
+ /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Box), {
94
+ paddingX: 3,
95
+ style: {
96
+ flexShrink: 0
97
+ },
98
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Text), {
99
+ size: 4,
100
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$DragHandleIcon), {})
101
+ })
102
+ }),
103
+ showIncrements && /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $jPEKE$Flex), {
104
+ style: {
105
+ flexShrink: 0
106
+ },
107
+ align: "center",
108
+ gap: 1,
109
+ paddingRight: 1,
110
+ children: [
111
+ /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Button), {
112
+ padding: 2,
113
+ mode: "ghost",
114
+ onClick: ()=>increment(index, index + -1, doc._id, entities),
115
+ disabled: isFirst,
116
+ icon: (0, $jPEKE$ChevronUpIcon)
117
+ }),
118
+ /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Button), {
119
+ padding: 2,
120
+ mode: "ghost",
121
+ disabled: isLast,
122
+ onClick: ()=>increment(index, index + 1, doc._id, entities),
123
+ icon: (0, $jPEKE$ChevronDownIcon)
124
+ })
125
+ ]
126
+ }),
127
+ /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Button), {
128
+ style: {
129
+ width: `100%`
130
+ },
131
+ padding: 2,
132
+ mode: "bleed",
133
+ onClick: (e)=>handleSelect(doc._id, index, e.nativeEvent),
134
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Flex), {
135
+ flex: 1,
136
+ align: "center",
137
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Box), {
138
+ flex: 1,
139
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$SanityPreview), {
140
+ layout: "default",
141
+ value: doc,
142
+ schemaType: schema.get(doc._type)
143
+ })
144
+ })
145
+ })
146
+ })
147
+ ]
148
+ });
149
+ }
150
+
151
+
152
+
153
+
154
+ function $793aacd9a77a8bc3$var$lexicographicalSort(a, b) {
155
+ if (a[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16] < b[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]) return -1;
156
+ if (a[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16] > b[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]) return 1;
157
+ return 0;
158
+ }
159
+ const $793aacd9a77a8bc3$export$1b86f2c90605ffb9 = ({ entities: entities , selectedIds: selectedIds , source: source , destination: destination , debug: debug = false })=>{
160
+ const startIndex = source.index;
161
+ const endIndex = destination.index;
162
+ const isMovingUp = startIndex > endIndex;
163
+ const selectedItems = entities.filter((item)=>selectedIds.includes(item._id));
164
+ const message = [
165
+ `Moved`,
166
+ selectedItems.length === 1 ? `1 Document` : `${selectedItems.length} Documents`,
167
+ isMovingUp ? `up` : `down`,
168
+ `from position`,
169
+ `${startIndex + 1} to ${endIndex + 1}`,
170
+ ].join(" ");
171
+ const { all: all , selected: selected } = entities.reduce((acc, cur, curIndex)=>{
172
+ // Selected items get spread in below, so skip them here
173
+ if (selectedIds.includes(cur._id)) return {
174
+ all: acc.all,
175
+ selected: acc.selected
176
+ };
177
+ // Drop seleced items in
178
+ if (curIndex === endIndex) {
179
+ const prevIndex = curIndex - 1;
180
+ const prevRank = entities[prevIndex]?.[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16] ? (0, $jPEKE$LexoRank).parse(entities[prevIndex]?.[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]) : (0, $jPEKE$LexoRank).min();
181
+ const curRank = (0, $jPEKE$LexoRank).parse(entities[curIndex][0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]);
182
+ const nextIndex = curIndex + 1;
183
+ const nextRank = entities[nextIndex]?.[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16] ? (0, $jPEKE$LexoRank).parse(entities[nextIndex]?.[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]) : (0, $jPEKE$LexoRank).max();
184
+ let betweenRank = isMovingUp ? prevRank.between(curRank) : curRank.between(nextRank);
185
+ // For each selected item, assign a new orderRank between now and next
186
+ for(let selectedIndex = 0; selectedIndex < selectedItems.length; selectedIndex += 1){
187
+ selectedItems[selectedIndex][0, $21d4b1fe36f88c6f$export$64f27603cb09ba16] = betweenRank.value;
188
+ betweenRank = isMovingUp ? betweenRank.between(curRank) : betweenRank.between(nextRank);
189
+ }
190
+ return {
191
+ // The `all` array gets sorted by order field later anyway
192
+ // so that this probably isn't necessary ¯\_(ツ)_/¯
193
+ all: isMovingUp ? [
194
+ ...acc.all,
195
+ ...selectedItems,
196
+ cur
197
+ ] : [
198
+ ...acc.all,
199
+ cur,
200
+ ...selectedItems
201
+ ],
202
+ selected: selectedItems
203
+ };
204
+ }
205
+ return {
206
+ all: [
207
+ ...acc.all,
208
+ cur
209
+ ],
210
+ selected: acc.selected
211
+ };
212
+ }, {
213
+ all: [],
214
+ selected: []
215
+ });
216
+ const patches = selected.map((doc)=>{
217
+ return [
218
+ doc._id,
219
+ {
220
+ set: {
221
+ [(0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)]: doc[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]
222
+ }
223
+ },
224
+ ];
225
+ });
226
+ // Safety-check to make sure everything is in order
227
+ const allSorted = all.sort($793aacd9a77a8bc3$var$lexicographicalSort);
228
+ return {
229
+ newOrder: allSorted,
230
+ patches: patches,
231
+ message: message
232
+ };
233
+ };
234
+
235
+
236
+
237
+
238
+ function $f49f7a30883dbc1b$export$8d49af9be9632eba() {
239
+ return (0, $jPEKE$useClient)({
240
+ apiVersion: "2021-09-01"
241
+ });
242
+ }
243
+
244
+
245
+ const $e1f104d9525f6d72$var$getItemStyle = (draggableStyle, itemIsUpdating)=>({
246
+ userSelect: "none",
247
+ transition: `opacity 500ms ease-in-out`,
248
+ opacity: itemIsUpdating ? 0.2 : 1,
249
+ pointerEvents: itemIsUpdating ? `none` : undefined,
250
+ ...draggableStyle
251
+ });
252
+ const $e1f104d9525f6d72$var$cardTone = (settings)=>{
253
+ const { isDuplicate: isDuplicate , isGhosting: isGhosting , isDragging: isDragging , isSelected: isSelected } = settings;
254
+ if (isGhosting) return `transparent`;
255
+ if (isDragging || isSelected) return `primary`;
256
+ if (isDuplicate) return `caution`;
257
+ return undefined;
258
+ };
259
+ function $e1f104d9525f6d72$export$2e2bcd8739ae039({ data: data , type: type , listIsUpdating: listIsUpdating , setListIsUpdating: setListIsUpdating }) {
260
+ const toast = (0, $jPEKE$useToast)();
261
+ const router = (0, $jPEKE$usePaneRouter)();
262
+ const { navigateIntent: navigateIntent } = router;
263
+ // Maintains local state order before transaction completes
264
+ const [orderedData, setOrderedData] = (0, $jPEKE$useState)(data);
265
+ // Update local state when documents change from an outside source
266
+ (0, $jPEKE$useEffect)(()=>{
267
+ if (!listIsUpdating) setOrderedData(data);
268
+ /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [
269
+ data
270
+ ]);
271
+ const [draggingId, setDraggingId] = (0, $jPEKE$useState)(``);
272
+ const [selectedIds, setSelectedIds] = (0, $jPEKE$useState)([]);
273
+ const clearSelected = (0, $jPEKE$useCallback)(()=>setSelectedIds([]), [
274
+ setSelectedIds
275
+ ]);
276
+ const handleSelect = (0, $jPEKE$useCallback)((clickedId, index, nativeEvent)=>{
277
+ const isSelected = selectedIds.includes(clickedId);
278
+ const selectMultiple = nativeEvent.shiftKey;
279
+ const isUsingWindows = navigator.appVersion.indexOf("Win") !== -1;
280
+ const selectAdditional = isUsingWindows ? nativeEvent.ctrlKey : nativeEvent.metaKey;
281
+ let updatedIds = [];
282
+ // No modifier keys pressed during click:
283
+ // - update selected to just this one
284
+ // - open document
285
+ if (!selectMultiple && !selectAdditional) {
286
+ navigateIntent("edit", {
287
+ id: clickedId,
288
+ type: type
289
+ });
290
+ return setSelectedIds([
291
+ clickedId
292
+ ]);
293
+ }
294
+ // Shift key was held, add id's between last selected and this one
295
+ // ...before adding this one
296
+ if (selectMultiple && !isSelected) {
297
+ const lastSelectedId = selectedIds[selectedIds.length - 1];
298
+ const lastSelectedIndex = orderedData.findIndex((item)=>item._id === lastSelectedId);
299
+ const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex;
300
+ const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex;
301
+ const betweenIds = orderedData.filter((item, itemIndex)=>itemIndex > firstSelected && itemIndex < lastSelected).map((item)=>item._id);
302
+ updatedIds = [
303
+ ...selectedIds,
304
+ ...betweenIds,
305
+ clickedId
306
+ ];
307
+ } else if (isSelected) // Toggle off a single id
308
+ updatedIds = selectedIds.filter((id)=>id !== clickedId);
309
+ else // Toggle on a single id
310
+ updatedIds = [
311
+ ...selectedIds,
312
+ clickedId
313
+ ];
314
+ return setSelectedIds(updatedIds);
315
+ }, [
316
+ setSelectedIds,
317
+ navigateIntent,
318
+ orderedData,
319
+ selectedIds,
320
+ type
321
+ ]);
322
+ const client = (0, $f49f7a30883dbc1b$export$8d49af9be9632eba)();
323
+ const transactPatches = (0, $jPEKE$useCallback)(async (patches, message)=>{
324
+ const transaction = client.transaction();
325
+ patches.forEach(([docId, ops])=>transaction.patch(docId, ops));
326
+ await transaction.commit().then((updated)=>{
327
+ clearSelected();
328
+ setDraggingId(``);
329
+ setListIsUpdating(false);
330
+ toast.push({
331
+ title: `${updated.results.length === 1 ? `1 Document` : `${updated.results.length} Documents`} Reordered`,
332
+ status: `success`,
333
+ description: message
334
+ });
335
+ }).catch(()=>{
336
+ setDraggingId(``);
337
+ setListIsUpdating(false);
338
+ toast.push({
339
+ title: `Reordering failed`,
340
+ status: `error`
341
+ });
342
+ });
343
+ }, [
344
+ client,
345
+ setDraggingId,
346
+ clearSelected,
347
+ setListIsUpdating,
348
+ toast
349
+ ]);
350
+ const handleDragEnd = (0, $jPEKE$useCallback)((result, entities)=>{
351
+ setDraggingId(``);
352
+ const { source: source , destination: destination , draggableId: draggableId } = result ?? {};
353
+ // Don't do anything if nothing changed
354
+ if (source?.index === destination?.index) return;
355
+ // Don't do anything if we don't have the entitites
356
+ if (!entities?.length || !draggableId) return;
357
+ // A document can be dragged without being one-of-many-selected
358
+ const effectedIds = selectedIds?.length ? selectedIds : [
359
+ draggableId
360
+ ];
361
+ // Don't do anything if we don't have ids to effect
362
+ if (!effectedIds?.length) return;
363
+ // Update state to update styles + prevent data refetching
364
+ setListIsUpdating(true);
365
+ setSelectedIds(effectedIds);
366
+ const { newOrder: newOrder , patches: patches , message: message } = (0, $793aacd9a77a8bc3$export$1b86f2c90605ffb9)({
367
+ entities: entities,
368
+ selectedIds: effectedIds,
369
+ source: source,
370
+ destination: destination
371
+ });
372
+ // Update local state
373
+ if (newOrder?.length) setOrderedData(newOrder);
374
+ // Transact new order patches
375
+ if (patches?.length) transactPatches(patches, message);
376
+ }, [
377
+ selectedIds,
378
+ setDraggingId,
379
+ setSelectedIds,
380
+ transactPatches,
381
+ setListIsUpdating
382
+ ]);
383
+ const handleDragStart = (0, $jPEKE$useCallback)((start)=>{
384
+ const id = start.draggableId;
385
+ const selected = selectedIds.includes(id);
386
+ // if dragging an item that is not selected - unselect all items
387
+ if (!selected) clearSelected();
388
+ setDraggingId(id);
389
+ }, [
390
+ selectedIds,
391
+ clearSelected,
392
+ setDraggingId
393
+ ]);
394
+ // Move one document up or down one place, by fake invoking the drag function
395
+ const incrementIndex = (0, $jPEKE$useCallback)((shiftFrom, shiftTo, id, entities)=>{
396
+ const result = {
397
+ draggableId: id,
398
+ source: {
399
+ index: shiftFrom
400
+ },
401
+ destination: {
402
+ index: shiftTo
403
+ }
404
+ };
405
+ return handleDragEnd(result, entities);
406
+ }, [
407
+ handleDragEnd
408
+ ]);
409
+ const onWindowKeyDown = (0, $jPEKE$useCallback)((event)=>{
410
+ if (event.key === "Escape") clearSelected();
411
+ }, [
412
+ clearSelected
413
+ ]);
414
+ (0, $jPEKE$useEffect)(()=>{
415
+ window.addEventListener("keydown", onWindowKeyDown);
416
+ return ()=>{
417
+ window.removeEventListener("keydown", onWindowKeyDown);
418
+ };
419
+ }, [
420
+ onWindowKeyDown
421
+ ]);
422
+ // Find all items with duplicate order field
423
+ const duplicateOrders = (0, $jPEKE$useMemo)(()=>{
424
+ if (!orderedData.length) return [];
425
+ const orderField = orderedData.map((item)=>item[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]);
426
+ return orderField.filter((item, index)=>orderField.indexOf(item) !== index);
427
+ }, [
428
+ orderedData
429
+ ]);
430
+ const onDragEnd = (0, $jPEKE$useCallback)((result)=>handleDragEnd(result, orderedData), [
431
+ orderedData,
432
+ handleDragEnd
433
+ ]);
434
+ return /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$DragDropContext), {
435
+ onDragStart: handleDragStart,
436
+ onDragEnd: onDragEnd,
437
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Droppable), {
438
+ droppableId: "documentSortZone",
439
+ children: (provided)=>/*#__PURE__*/ (0, $jPEKE$jsxs)("div", {
440
+ ...provided.droppableProps,
441
+ ref: provided.innerRef,
442
+ children: [
443
+ orderedData.map((item, index)=>/*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Draggable), {
444
+ draggableId: item._id,
445
+ index: index,
446
+ children: (innerProvided, innerSnapshot)=>{
447
+ const isSelected = selectedIds.includes(item._id);
448
+ const isDragging = innerSnapshot.isDragging;
449
+ const isGhosting = Boolean(!isDragging && draggingId && isSelected);
450
+ const isUpdating = listIsUpdating && isSelected;
451
+ const isDisabled = Boolean(!item[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]);
452
+ const isDuplicate = duplicateOrders.includes(item[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]);
453
+ const tone = $e1f104d9525f6d72$var$cardTone({
454
+ isDuplicate: isDuplicate,
455
+ isGhosting: isGhosting,
456
+ isDragging: isDragging,
457
+ isSelected: isSelected
458
+ });
459
+ return /*#__PURE__*/ (0, $jPEKE$jsx)("div", {
460
+ ref: innerProvided.innerRef,
461
+ ...innerProvided.draggableProps,
462
+ ...innerProvided.dragHandleProps,
463
+ style: isDisabled ? {
464
+ opacity: 0.2,
465
+ pointerEvents: `none`
466
+ } : $e1f104d9525f6d72$var$getItemStyle(innerProvided.draggableProps.style, isUpdating),
467
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Box), {
468
+ paddingBottom: 1,
469
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Card), {
470
+ tone: tone,
471
+ shadow: isDragging ? 2 : undefined,
472
+ radius: 2,
473
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $2e8241e9842bdebe$export$2e2bcd8739ae039), {
474
+ doc: item,
475
+ entities: orderedData,
476
+ handleSelect: handleSelect,
477
+ increment: incrementIndex,
478
+ index: index,
479
+ isFirst: index === 0,
480
+ isLast: index === orderedData.length - 1
481
+ })
482
+ })
483
+ })
484
+ });
485
+ }
486
+ }, `${item._id}-${item[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]}`)),
487
+ provided.placeholder
488
+ ]
489
+ })
490
+ })
491
+ });
492
+ }
493
+
494
+
495
+
496
+
497
+
498
+
499
+ function $60d135b0057fb272$export$2e2bcd8739ae039({ children: children }) {
500
+ return /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Box), {
501
+ padding: 3,
502
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Card), {
503
+ padding: 4,
504
+ radius: 2,
505
+ shadow: 1,
506
+ tone: "caution",
507
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Text), {
508
+ children: children
509
+ })
510
+ })
511
+ });
512
+ }
513
+
514
+
515
+
516
+ const $5e43324e27157fbc$var$DEFAULT_PARAMS = {};
517
+ function $5e43324e27157fbc$export$2e2bcd8739ae039({ type: type , filter: filter , params: params = $5e43324e27157fbc$var$DEFAULT_PARAMS }) {
518
+ const [isLoading, setIsLoading] = (0, $jPEKE$useState)(true);
519
+ const [listIsUpdating, setListIsUpdating] = (0, $jPEKE$useState)(false);
520
+ const [data, setData] = (0, $jPEKE$useState)([]);
521
+ const client = (0, $f49f7a30883dbc1b$export$8d49af9be9632eba)();
522
+ (0, $jPEKE$useEffect)(()=>{
523
+ const query = `*[_type == $type ${filter ? `&& ${filter}` : ""}]|order(@[$order] asc){
524
+ _id, _type, ${(0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)}
525
+ }`;
526
+ const queryParams = Object.assign(params, {
527
+ type: type,
528
+ order: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)
529
+ });
530
+ let subscription;
531
+ // eslint-disable-next-line require-await
532
+ const fetchData = async ()=>{
533
+ client.fetch(query, queryParams).then((documents)=>{
534
+ // Remove published document from list if draft also exists
535
+ const filteredDocuments = documents.reduce((acc, cur)=>{
536
+ if (!cur._id.startsWith(`drafts.`)) {
537
+ // eslint-disable-next-line max-nested-callbacks
538
+ const alsoHasDraft = documents.some((doc)=>doc._id === `drafts.${cur._id}`);
539
+ return alsoHasDraft ? acc : [
540
+ ...acc,
541
+ cur
542
+ ];
543
+ }
544
+ return [
545
+ ...acc,
546
+ cur
547
+ ];
548
+ }, []);
549
+ setData(filteredDocuments);
550
+ if (isLoading) setIsLoading(false);
551
+ });
552
+ };
553
+ const prepareData = async ()=>{
554
+ setIsLoading(true);
555
+ await fetchData();
556
+ if (!subscription) subscription = client.listen(query, queryParams).subscribe(()=>fetchData());
557
+ };
558
+ // Get data but only if a document isn't being patched or we don't yet have data
559
+ if (!listIsUpdating && !data.length) prepareData();
560
+ return ()=>subscription?.unsubscribe();
561
+ /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [
562
+ type
563
+ ]);
564
+ const unorderedDataCount = (0, $jPEKE$useMemo)(()=>data.length ? data.filter((doc)=>!doc[0, $21d4b1fe36f88c6f$export$64f27603cb09ba16]).length : 0, [
565
+ data
566
+ ]);
567
+ if (isLoading) return /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Flex), {
568
+ style: {
569
+ width: `100%`,
570
+ height: `100%`
571
+ },
572
+ align: "center",
573
+ justify: "center",
574
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Spinner), {})
575
+ });
576
+ return /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $jPEKE$Stack), {
577
+ space: 1,
578
+ style: {
579
+ overflow: `scroll`,
580
+ height: `100%`
581
+ },
582
+ children: [
583
+ unorderedDataCount > 0 && /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $60d135b0057fb272$export$2e2bcd8739ae039), {
584
+ children: [
585
+ unorderedDataCount,
586
+ "/",
587
+ data.length,
588
+ " Documents have no Order. Select",
589
+ " ",
590
+ /*#__PURE__*/ (0, $jPEKE$jsx)("strong", {
591
+ children: "Reset Order"
592
+ }),
593
+ " from the Menu above to fix."
594
+ ]
595
+ }),
596
+ /*#__PURE__*/ (0, $jPEKE$jsx)((0, $jPEKE$Box), {
597
+ padding: 1,
598
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $e1f104d9525f6d72$export$2e2bcd8739ae039), {
599
+ data: data,
600
+ type: type,
601
+ listIsUpdating: listIsUpdating,
602
+ setListIsUpdating: setListIsUpdating
603
+ })
604
+ })
605
+ ]
606
+ });
607
+ }
608
+
609
+
610
+
611
+
612
+
613
+ function $c3ce662734af156c$export$2e2bcd8739ae039({ type: type , showIncrements: showIncrements , resetOrderTransaction: resetOrderTransaction , filter: filter , params: params }) {
614
+ const toast = (0, $jPEKE$useToast)();
615
+ const schema = (0, $jPEKE$useSchema)();
616
+ (0, $jPEKE$useEffect)(()=>{
617
+ if (resetOrderTransaction?.title && resetOrderTransaction?.status) toast.push(resetOrderTransaction);
618
+ }, [
619
+ resetOrderTransaction,
620
+ toast
621
+ ]);
622
+ const schemaIsInvalid = (0, $jPEKE$useMemo)(()=>{
623
+ // Option not passed
624
+ if (!type) return /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $jPEKE$Fragment), {
625
+ children: [
626
+ "No ",
627
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
628
+ children: "type"
629
+ }),
630
+ " was configured"
631
+ ]
632
+ });
633
+ const typeSchema = schema.get(type);
634
+ // Schema not found
635
+ if (!typeSchema) return /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $jPEKE$Fragment), {
636
+ children: [
637
+ "Schema ",
638
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
639
+ children: type
640
+ }),
641
+ " not found"
642
+ ]
643
+ });
644
+ // Schema lacks an order field
645
+ if (!("fields" in typeSchema) || !typeSchema.fields.some((field)=>field?.name === (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16))) return /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $jPEKE$Fragment), {
646
+ children: [
647
+ "Schema ",
648
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
649
+ children: type
650
+ }),
651
+ " must have an ",
652
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
653
+ children: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)
654
+ }),
655
+ " field of type",
656
+ " ",
657
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
658
+ children: "string"
659
+ })
660
+ ]
661
+ });
662
+ // Schema's order field is not a string
663
+ if ("fields" in typeSchema && typeSchema.fields.some((field)=>field?.name === (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16) && field?.type?.name !== "string")) return /*#__PURE__*/ (0, $jPEKE$jsxs)((0, $jPEKE$Fragment), {
664
+ children: [
665
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
666
+ children: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)
667
+ }),
668
+ " field on Schema ",
669
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
670
+ children: type
671
+ }),
672
+ " must be",
673
+ " ",
674
+ /*#__PURE__*/ (0, $jPEKE$jsx)("code", {
675
+ children: "string"
676
+ }),
677
+ " type"
678
+ ]
679
+ });
680
+ return "";
681
+ }, [
682
+ type,
683
+ schema
684
+ ]);
685
+ if (schemaIsInvalid) return /*#__PURE__*/ (0, $jPEKE$jsx)((0, $60d135b0057fb272$export$2e2bcd8739ae039), {
686
+ children: schemaIsInvalid
687
+ });
688
+ return /*#__PURE__*/ (0, $jPEKE$jsx)((0, $69dfcc58d43c2b6d$export$2a2017d0ec5437fa).Provider, {
689
+ value: {
690
+ showIncrements: showIncrements
691
+ },
692
+ children: /*#__PURE__*/ (0, $jPEKE$jsx)((0, $5e43324e27157fbc$export$2e2bcd8739ae039), {
693
+ type: type,
694
+ filter: filter,
695
+ params: params
696
+ })
697
+ });
698
+ }
699
+
700
+
701
+
702
+
703
+ async function $813ed27cf8814dcd$export$ee841d674ca80db0(type = ``, client) {
704
+ const query = `*[_type == $type]|order(@[$order] asc)._id`;
705
+ const queryParams = {
706
+ type: type,
707
+ order: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)
708
+ };
709
+ const documents = await client.fetch(query, queryParams);
710
+ if (!documents.length) return null;
711
+ const transaction = client.transaction();
712
+ let aLexoRank = (0, $jPEKE$LexoRank).min();
713
+ for(let index = 0; index < documents.length; index += 1){
714
+ // Generate next rank before even the first document so there's room to move!
715
+ aLexoRank = aLexoRank.genNext().genNext();
716
+ transaction.patch(documents[index], {
717
+ set: {
718
+ [(0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)]: aLexoRank.value
719
+ }
720
+ });
721
+ }
722
+ return transaction.commit().then((update)=>update).catch((err)=>err);
723
+ }
724
+
725
+
726
+ class $c149fdd435bcc1b3$export$2e2bcd8739ae039 extends (0, $jPEKE$Component) {
727
+ constructor(props){
728
+ super(props);
729
+ this.state = {
730
+ showIncrements: false,
731
+ resetOrderTransaction: {}
732
+ };
733
+ }
734
+ actionHandlers = {
735
+ showIncrements: ()=>{
736
+ this.setState((state)=>({
737
+ showIncrements: !state.showIncrements
738
+ }));
739
+ },
740
+ resetOrder: async ()=>{
741
+ this.setState(()=>({
742
+ resetOrderTransaction: {
743
+ status: `info`,
744
+ title: `Reordering started...`,
745
+ closable: true
746
+ }
747
+ }));
748
+ const update = await (0, $813ed27cf8814dcd$export$ee841d674ca80db0)(this.props.options.type, this.props.options.client);
749
+ const reorderWasSuccessful = update?.results?.length;
750
+ this.setState(()=>({
751
+ resetOrderTransaction: {
752
+ status: reorderWasSuccessful ? `success` : `info`,
753
+ title: reorderWasSuccessful ? `Reordered ${update.results.length === 1 ? `Document` : `Documents`}` : `Reordering failed`,
754
+ closable: true
755
+ }
756
+ }));
757
+ }
758
+ };
759
+ render() {
760
+ const type = this?.props?.options?.type;
761
+ if (!type) return null;
762
+ return /*#__PURE__*/ (0, $jPEKE$jsx)((0, $c3ce662734af156c$export$2e2bcd8739ae039), {
763
+ filter: this?.props?.options?.filter,
764
+ params: this?.props?.options?.params,
765
+ type: type,
766
+ showIncrements: this.state.showIncrements,
767
+ resetOrderTransaction: this.state.resetOrderTransaction
768
+ });
769
+ }
770
+ }
771
+
772
+
773
+ function $24abac83e7f53d60$export$3b014deba4b8ca00(config) {
774
+ if (!config?.type || !config.context || !config.S) throw new Error(`
775
+ type, context and S (StructureBuilder) must be provided.
776
+ context and S are available when configuring structure.
777
+ Example: orderableDocumentListDeskItem({type: 'category'})
778
+ `);
779
+ const { type: type , filter: filter , params: params , title: title , icon: icon , id: id , context: context , S: S } = config;
780
+ const { schema: schema , getClient: getClient } = context;
781
+ const client = getClient({
782
+ apiVersion: "2021-09-01"
783
+ });
784
+ const listTitle = title ?? `Orderable ${type}`;
785
+ const listId = id ?? `orderable-${type}`;
786
+ const listIcon = icon ?? (0, $jPEKE$SortIcon);
787
+ const typeTitle = schema.get(type)?.title ?? type;
788
+ return S.listItem().title(listTitle).id(listId).icon(listIcon).child(Object.assign(S.documentTypeList(type).serialize(), {
789
+ // Prevents the component from re-rendering when switching documents
790
+ __preserveInstance: true,
791
+ // Prevents the component from NOT re-rendering when switching listItems
792
+ key: listId,
793
+ type: "component",
794
+ component: (0, $c149fdd435bcc1b3$export$2e2bcd8739ae039),
795
+ options: {
796
+ type: type,
797
+ filter: filter,
798
+ params: params,
799
+ client: client
800
+ },
801
+ menuItems: [
802
+ S.menuItem().title(`Create new ${typeTitle}`).intent({
803
+ type: "create",
804
+ params: {
805
+ type: type
806
+ }
807
+ }).serialize(),
808
+ S.menuItem().title(`Reset Order`).icon((0, $jPEKE$GenerateIcon)).action(`resetOrder`).serialize(),
809
+ S.menuItem().title(`Show Increments`).icon((0, $jPEKE$SortIcon)).action(`showIncrements`).serialize(),
810
+ ]
811
+ })).serialize();
812
+ }
813
+
814
+
815
+
816
+
817
+ export {$0413292d5e32b5d9$export$64a609a9111ff100 as orderRankField, $e83e0ebbc2cf37df$export$db2ff2f898748a67 as orderRankOrdering, $24abac83e7f53d60$export$3b014deba4b8ca00 as orderableDocumentListDeskItem};
818
+ //# sourceMappingURL=index.modern.js.map