@sanity/orderable-document-list
2.0.212.0.22
~
Modified (3 files)
Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -2,15 +2,15 @@
import { DocumentStatus, DocumentVersionsStatusIndicator, Preview, PreviewCard, defineField, getPublishedId, getVersionFromId, isDraftId, isPublishedId, isVersionId, useClient, useDocumentVersionInfo, useDocumentVersions, usePerspective, useSchema } from "sanity";
import { LexoRank } from "lexorank";
import { GenerateIcon } from "@sanity/icons/Generate";
import { SortIcon } from "@sanity/icons/Sort";
-import { createContext, useCallback, useContext, useEffect, useImperativeHandle, useMemo, useState } from "react";
-import { usePaneRouter } from "sanity/structure";
import { c } from "react/compiler-runtime";
+import { createContext, useContext, useEffect, useImperativeHandle, useState } from "react";
import { AvatarCounter, Box, Button, Card, Container, Flex, Spinner, Stack, Text } from "@sanity/ui";
import { useToast } from "@sanity/ui/toast";
import { Feedback, useListeningQuery } from "sanity-plugin-utils";
import { DragDropContext, Draggable, Droppable } from "@hello-pangea/dnd";
+import { usePaneRouter } from "sanity/structure";
import { ChevronDownIcon } from "@sanity/icons/ChevronDown";
import { ChevronUpIcon } from "@sanity/icons/ChevronUp";
import { DragHandleIcon } from "@sanity/icons/DragHandle";
import { Tooltip } from "@sanity/ui/tooltip";
@@ -236,24 +236,32 @@
if (isGhosting) return "transparent";
if (isDragging || isSelected) return "primary";
if (isDuplicate) return "caution";
};
-function DraggableList({ data, listIsUpdating, setListIsUpdating }) {
- let toast = useToast(), { groupIndex, routerPanesState } = usePaneRouter(), currentDoc = routerPanesState[groupIndex + 1]?.[0]?.id || !1, [orderedData, setOrderedData] = useState(data), displayedData = listIsUpdating ? orderedData : data, [draggingId, setDraggingId] = useState(""), [selectedIds, setSelectedIds] = useState(currentDoc ? [currentDoc] : []), clearSelected = useCallback(() => setSelectedIds([]), [setSelectedIds]), handleSelect = useCallback((clickedId, index, nativeEvent) => {
- let isSelected = selectedIds.includes(clickedId), selectMultiple = nativeEvent.shiftKey, selectAdditional = navigator.appVersion.indexOf("Win") === -1 ? nativeEvent.metaKey : nativeEvent.ctrlKey, updatedIds = [];
+function DraggableList(t0) {
+ let $ = c(39), { data, listIsUpdating, setListIsUpdating } = t0, toast = useToast(), { groupIndex, routerPanesState } = usePaneRouter(), currentDoc = routerPanesState[groupIndex + 1]?.[0]?.id || !1, [orderedData, setOrderedData] = useState(data), displayedData = listIsUpdating ? orderedData : data, [draggingId, setDraggingId] = useState(""), t1;
+ $[0] === currentDoc ? t1 = $[1] : (t1 = currentDoc ? [currentDoc] : [], $[0] = currentDoc, $[1] = t1);
+ let [selectedIds, setSelectedIds] = useState(t1), t2;
+ $[2] === Symbol.for("react.memo_cache_sentinel") ? (t2 = () => setSelectedIds([]), $[2] = t2) : t2 = $[2];
+ let clearSelected = t2, t3;
+ $[3] !== displayedData || $[4] !== selectedIds ? (t3 = (clickedId, index, nativeEvent) => {
+ let isSelected = selectedIds.includes(clickedId), selectMultiple = nativeEvent.shiftKey, selectAdditional = navigator.appVersion.indexOf("Win") === -1 ? nativeEvent.metaKey : nativeEvent.ctrlKey, updatedIds;
if (!selectMultiple && !selectAdditional) return setSelectedIds([clickedId]);
if (selectMultiple && nativeEvent.preventDefault(), selectMultiple && !isSelected) {
- let lastSelectedId = selectedIds[selectedIds.length - 1] ?? clickedId, lastSelectedIndex = displayedData.findIndex((item) => item._id === lastSelectedId), firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex, lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex, betweenIds = displayedData.filter((_, itemIndex) => itemIndex > firstSelected && itemIndex < lastSelected).map((item_0) => item_0._id);
+ let lastSelectedId = selectedIds[selectedIds.length - 1] ?? clickedId, lastSelectedIndex = displayedData.findIndex((item) => item._id === lastSelectedId), firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex, lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex, betweenIds = displayedData.filter((_, itemIndex) => itemIndex > firstSelected && itemIndex < lastSelected).map(_temp$3);
updatedIds = [
...selectedIds,
...betweenIds,
clickedId
];
} else updatedIds = isSelected ? selectedIds.filter((id) => id !== clickedId) : [...selectedIds, clickedId];
return setSelectedIds(updatedIds);
- }, [displayedData, selectedIds]), client = useSanityClient(), transactPatches = useCallback(async (patches, message) => {
+ }, $[3] = displayedData, $[4] = selectedIds, $[5] = t3) : t3 = $[5];
+ let handleSelect = t3, client = useSanityClient(), t4;
+ $[6] !== client || $[7] !== setListIsUpdating || $[8] !== toast ? (t4 = async (patches, message) => {
let transaction = client.transaction();
- patches.forEach(([docId, ops]) => {
+ patches.forEach((t5) => {
+ let [docId, ops] = t5;
transaction.patch(docId, ops);
});
try {
let updated = await transaction.commit({
@@ -270,14 +278,11 @@
title: "Reordering failed",
status: "error"
});
}
- }, [
- client,
- clearSelected,
- setListIsUpdating,
- toast
- ]), handleDragEnd = useCallback((result, entities) => {
+ }, $[6] = client, $[7] = setListIsUpdating, $[8] = toast, $[9] = t4) : t4 = $[9];
+ let transactPatches = t4, t5;
+ $[10] !== selectedIds || $[11] !== setListIsUpdating || $[12] !== transactPatches ? (t5 = (result, entities) => {
setDraggingId("");
let { source, destination, draggableId } = result ?? {};
if (source?.index === destination?.index || !entities.length || !draggableId || !source || !destination) return;
let effectedIds = selectedIds.length > 0 ? selectedIds : [draggableId];
@@ -289,16 +294,16 @@
source,
destination
});
newOrder.length > 0 && setOrderedData(newOrder), patches_0.length > 0 && transactPatches(patches_0, message_0);
- }, [
- selectedIds,
- transactPatches,
- setListIsUpdating
- ]), handleDragStart = useCallback((start) => {
+ }, $[10] = selectedIds, $[11] = setListIsUpdating, $[12] = transactPatches, $[13] = t5) : t5 = $[13];
+ let handleDragEnd = t5, t6;
+ $[14] === selectedIds ? t6 = $[15] : (t6 = (start) => {
let id_0 = start.draggableId;
selectedIds.includes(id_0) || clearSelected(), setDraggingId(id_0);
- }, [selectedIds, clearSelected]), incrementIndex = useCallback((shiftFrom, shiftTo, id_1, entities_0) => handleDragEnd({
+ }, $[14] = selectedIds, $[15] = t6);
+ let handleDragStart = t6, t7;
+ $[16] === handleDragEnd ? t7 = $[17] : (t7 = (shiftFrom, shiftTo, id_1, entities_0) => handleDragEnd({
draggableId: id_1,
source: {
droppableId: "documentSortZone",
index: shiftFrom
@@ -306,70 +311,93 @@
destination: {
droppableId: "documentSortZone",
index: shiftTo
}
- }, entities_0), [handleDragEnd]), onWindowKeyDown = useCallback((event) => {
+ }, entities_0), $[16] = handleDragEnd, $[17] = t7);
+ let incrementIndex = t7, t8;
+ $[18] === Symbol.for("react.memo_cache_sentinel") ? (t8 = (event) => {
event.key === "Escape" && clearSelected();
- }, [clearSelected]);
- useEffect(() => (window.addEventListener("keydown", onWindowKeyDown), () => {
+ }, $[18] = t8) : t8 = $[18];
+ let onWindowKeyDown = t8, t10, t9;
+ $[19] === Symbol.for("react.memo_cache_sentinel") ? (t9 = () => (window.addEventListener("keydown", onWindowKeyDown), () => {
window.removeEventListener("keydown", onWindowKeyDown);
- }), [onWindowKeyDown]);
- let duplicateOrders = useMemo(() => {
- if (displayedData.length === 0) return [];
- let orderField = displayedData.map((item_1) => item_1[ORDER_FIELD_NAME]);
- return orderField.filter((item_2, index_0) => orderField.indexOf(item_2) !== index_0);
- }, [displayedData]), onDragEnd = useCallback((result_1) => handleDragEnd(result_1, displayedData), [displayedData, handleDragEnd]);
- return /* @__PURE__ */ jsx(DragDropContext, {
- onDragStart: handleDragStart,
- onDragEnd,
- children: /* @__PURE__ */ jsx(Droppable, {
- droppableId: "documentSortZone",
- children: (provided) => /* @__PURE__ */ jsxs("div", {
- ...provided.droppableProps,
- ref: provided.innerRef,
- children: [displayedData.map((item_3, index_1) => /* @__PURE__ */ jsx(Draggable, {
- draggableId: item_3._id,
- index: index_1,
- children: (innerProvided, innerSnapshot) => {
- let isSelected_0 = selectedIds.includes(item_3._id), isDragging = innerSnapshot.isDragging, isGhosting = !!(!isDragging && draggingId && isSelected_0), isUpdating = listIsUpdating && isSelected_0, isDisabled = !item_3[ORDER_FIELD_NAME], isDuplicate = duplicateOrders.includes(item_3[ORDER_FIELD_NAME]), tone = cardTone({
- isDuplicate,
- isGhosting,
- isDragging,
- isSelected: isSelected_0
- }), selectedCount = selectedIds.length, dragBadge = isDragging && selectedCount > 1 ? selectedCount : !1;
- return /* @__PURE__ */ jsx("div", {
- ref: innerProvided.innerRef,
- ...innerProvided.draggableProps,
- ...innerProvided.dragHandleProps,
- style: isDisabled ? {
- opacity: .2,
- pointerEvents: "none"
- } : getItemStyle(innerProvided.draggableProps.style, isUpdating),
- children: /* @__PURE__ */ jsx(Box, {
- paddingBottom: 1,
- children: /* @__PURE__ */ jsx(Card, {
- tone,
- shadow: isDragging ? 2 : void 0,
- radius: 2,
- onClick: (e) => handleSelect(item_3._id, index_1, e.nativeEvent),
- children: /* @__PURE__ */ jsx(Document, {
- doc: item_3,
- entities: displayedData,
- increment: incrementIndex,
- index: index_1,
- isFirst: index_1 === 0,
- isLast: index_1 === displayedData.length - 1,
- dragBadge
- })
+ }), t10 = [onWindowKeyDown], $[19] = t10, $[20] = t9) : (t10 = $[19], t9 = $[20]), useEffect(t9, t10);
+ let t11;
+ bb0: {
+ if (displayedData.length === 0) {
+ let t12;
+ $[21] === Symbol.for("react.memo_cache_sentinel") ? (t12 = [], $[21] = t12) : t12 = $[21], t11 = t12;
+ break bb0;
+ }
+ let t12;
+ if ($[22] !== displayedData) {
+ let orderField = displayedData.map(_temp2$1);
+ t12 = orderField.filter((item_2, index_0) => orderField.indexOf(item_2) !== index_0), $[22] = displayedData, $[23] = t12;
+ } else t12 = $[23];
+ t11 = t12;
+ }
+ let duplicateOrders = t11, t12;
+ $[24] !== displayedData || $[25] !== handleDragEnd ? (t12 = (result_1) => handleDragEnd(result_1, displayedData), $[24] = displayedData, $[25] = handleDragEnd, $[26] = t12) : t12 = $[26];
+ let onDragEnd = t12, t13;
+ $[27] !== displayedData || $[28] !== draggingId || $[29] !== duplicateOrders || $[30] !== handleSelect || $[31] !== incrementIndex || $[32] !== listIsUpdating || $[33] !== selectedIds ? (t13 = /* @__PURE__ */ jsx(Droppable, {
+ droppableId: "documentSortZone",
+ children: (provided) => /* @__PURE__ */ jsxs("div", {
+ ...provided.droppableProps,
+ ref: provided.innerRef,
+ children: [displayedData.map((item_3, index_1) => /* @__PURE__ */ jsx(Draggable, {
+ draggableId: item_3._id,
+ index: index_1,
+ children: (innerProvided, innerSnapshot) => {
+ let isSelected_0 = selectedIds.includes(item_3._id), isDragging = innerSnapshot.isDragging, isGhosting = !!(!isDragging && draggingId && isSelected_0), isUpdating = listIsUpdating && isSelected_0, isDisabled = !item_3[ORDER_FIELD_NAME], isDuplicate = duplicateOrders.includes(item_3[ORDER_FIELD_NAME]), tone = cardTone({
+ isDuplicate,
+ isGhosting,
+ isDragging,
+ isSelected: isSelected_0
+ }), selectedCount = selectedIds.length, dragBadge = isDragging && selectedCount > 1 ? selectedCount : !1;
+ return /* @__PURE__ */ jsx("div", {
+ ref: innerProvided.innerRef,
+ ...innerProvided.draggableProps,
+ ...innerProvided.dragHandleProps,
+ style: isDisabled ? {
+ opacity: .2,
+ pointerEvents: "none"
+ } : getItemStyle(innerProvided.draggableProps.style, isUpdating),
+ children: /* @__PURE__ */ jsx(Box, {
+ paddingBottom: 1,
+ children: /* @__PURE__ */ jsx(Card, {
+ tone,
+ shadow: isDragging ? 2 : void 0,
+ radius: 2,
+ onClick: (e) => handleSelect(item_3._id, index_1, e.nativeEvent),
+ children: /* @__PURE__ */ jsx(Document, {
+ doc: item_3,
+ entities: displayedData,
+ increment: incrementIndex,
+ index: index_1,
+ isFirst: index_1 === 0,
+ isLast: index_1 === displayedData.length - 1,
+ dragBadge
})
})
- });
- }
- }, `${item_3._id}-${item_3[ORDER_FIELD_NAME]}`)), provided.placeholder]
- })
+ })
+ });
+ }
+ }, `${item_3._id}-${item_3[ORDER_FIELD_NAME]}`)), provided.placeholder]
})
- });
+ }), $[27] = displayedData, $[28] = draggingId, $[29] = duplicateOrders, $[30] = handleSelect, $[31] = incrementIndex, $[32] = listIsUpdating, $[33] = selectedIds, $[34] = t13) : t13 = $[34];
+ let t14;
+ return $[35] !== handleDragStart || $[36] !== onDragEnd || $[37] !== t13 ? (t14 = /* @__PURE__ */ jsx(DragDropContext, {
+ onDragStart: handleDragStart,
+ onDragEnd,
+ children: t13
+ }), $[35] = handleDragStart, $[36] = onDragEnd, $[37] = t13, $[38] = t14) : t14 = $[38], t14;
}
+function _temp2$1(item_1) {
+ return item_1[ORDER_FIELD_NAME];
+}
+function _temp$3(item_0) {
+ return item_0._id;
+}
const isVersionForCurrentPerspective = (document, perspectiveName, publishedId) => document._id && isVersionId(document._id) && getVersionFromId(document._id) === perspectiveName && getPublishedId(document._id) === publishedId, getFilteredDedupedDocs = (documents, perspectiveName) => {
let flatDocuments = documents.flat(), dedupedDocuments = [];
for (let cur of flatDocuments) if (cur._id) {
if (isVersionId(cur._id)) { Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@sanity/orderable-document-list",
- "version": "2.0.21",
+ "version": "2.0.22",
"description": "Drag-and-drop Document Ordering without leaving the Editing surface",
"keywords": [
"sanity",
"sanity-plugin"
@@ -31,16 +31,16 @@
"@sanity/client": "^8.2.0",
"@sanity/icons": "^5.2.1",
"@sanity/ui": "^4.0.4",
"lexorank": "^1.0.5",
- "sanity-plugin-utils": "^2.0.16"
+ "sanity-plugin-utils": "^2.0.17"
},
"devDependencies": {
"@sanity/tsconfig": "^2.2.1",
"@sanity/tsdown-config": "^0.26.0",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4",
- "babel-plugin-react-compiler": "^1.0.0",
+ "oxc-transform-react": "^0.145.0",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"sanity": "^6.10.1",
"styled-components": "^6.5.3", Index: package/dist/index.js.map
===================================================================
--- package/dist/index.js.map
+++ package/dist/index.js.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.js","names":["ORDER_FIELD_NAME","const","API_VERSION","LexoRank","parseOrderRank","value","fallback","console","warn","parse","err","Error","message","String","LexoRank","NewItemPosition","parseOrderRank","initialRank","compareRankValue","newItemPosition","compareRank","min","rank","genPrev","genNext","toString","defineField","FieldDefinition","StringDefinition","API_VERSION","ORDER_FIELD_NAME","initialRank","NewItemPosition","RankFieldConfig","Partial","Omit","type","newItemPosition","orderRankField","config","Error","rest","title","readOnly","hidden","name","initialValue","value","getClient","direction","lastDocOrderRank","apiVersion","fetch","order","tag","SortOrdering","ORDER_FIELD_NAME","orderRankOrdering","title","name","by","field","direction","createContext","OrderableContextValue","showIncrements","OrderableContext","ChevronDownIcon","ChevronUpIcon","DragHandleIcon","AvatarCounter","Card","Box","Button","Flex","Text","Tooltip","useContext","useSchema","PreviewCard","Preview","DocumentVersionsStatusIndicator","DocumentStatus","useDocumentVersionInfo","useDocumentVersions","getPublishedId","usePaneRouter","OrderableContext","SanityDocumentWithOrder","DocumentProps","doc","entities","increment","index","nextIndex","docId","isFirst","isLast","dragBadge","Document","t0","$","_c","showIncrements","schema","router","versionsInfo","_id","t1","t2","documentId","versions","ChildLink","groupIndex","routerPanesState","currentDoc","id","t3","replace","pressed","selected","length","t4","_type","get","schemaType","t5","draft","published","tooltip","t6","Symbol","for","flexShrink","t7","t8","t9","width","t10","t11","t12","t13","t14","t15","t16","t17","SanityClient","useClient","usePerspective","API_VERSION","useSanityClient","$","_c","perspectiveStack","t0","Symbol","for","apiVersion","t1","t2","withConfig","perspective","DraggableLocation","LexoRank","PatchOperations","SanityDocumentWithOrder","ORDER_FIELD_NAME","parseOrderRank","ReorderArgs","entities","selectedIds","source","destination","ReorderReturn","newOrder","patches","message","lexicographicalSort","a","b","reorderDocuments","startIndex","index","endIndex","isMovingUp","selectedItems","filter","item","includes","_id","length","join","all","selected","reduce","acc","cur","curIndex","prevIndex","prevRank","min","curRank","nextIndex","nextRank","max","betweenRank","between","selectedItem","toString","flatMap","doc","docPatches","set","startsWith","hasPublished","push","replace","allSorted","sort","DragDropContext","Draggable","Droppable","DropResult","DraggableLocation","Box","Card","useToast","useEffect","useState","useMemo","useCallback","CSSProperties","PatchOperations","usePaneRouter","Document","useSanityClient","ORDER_FIELD_NAME","reorderDocuments","SanityDocumentWithOrder","ListSetting","isDuplicate","isGhosting","isDragging","isSelected","DragResultLike","draggableId","source","destination","DraggableListProps","data","listIsUpdating","setListIsUpdating","val","getItemStyle","draggableStyle","itemIsUpdating","userSelect","transition","opacity","pointerEvents","undefined","cardTone","settings","DraggableList","toast","router","groupIndex","routerPanesState","currentDoc","id","orderedData","setOrderedData","displayedData","draggingId","setDraggingId","selectedIds","setSelectedIds","clearSelected","handleSelect","clickedId","index","nativeEvent","MouseEvent","includes","selectMultiple","shiftKey","isUsingWindows","navigator","appVersion","indexOf","selectAdditional","ctrlKey","metaKey","updatedIds","preventDefault","lastSelectedId","length","lastSelectedIndex","findIndex","item","_id","firstSelected","lastSelected","betweenIds","filter","_","itemIndex","map","client","transactPatches","patches","message","transaction","forEach","docId","ops","patch","updated","commit","visibility","tag","push","title","results","status","description","handleDragEnd","result","entities","effectedIds","newOrder","handleDragStart","start","selected","incrementIndex","shiftFrom","shiftTo","droppableId","onWindowKeyDown","event","KeyboardEvent","key","window","addEventListener","removeEventListener","duplicateOrders","orderField","onDragEnd","provided","droppableProps","innerRef","innerProvided","innerSnapshot","Boolean","isUpdating","isDisabled","tone","selectedCount","dragBadge","draggableProps","dragHandleProps","style","e","placeholder","getPublishedId","getVersionFromId","isDraftId","isPublishedId","isVersionId","SanityDocumentWithOrder","isVersionForCurrentPerspective","document","perspectiveName","publishedId","_id","getFilteredDedupedDocs","documents","flatDocuments","flat","dedupedDocuments","cur","versionFromId","isCorrectVersion","push","hasMatchingVersion","some","doc","hasDraft","hasDuplicatePublished","baseId","hasVersion","hasPublished","replace","ORDER_FIELD_NAME","DocumentListQueryProps","type","filter","params","Record","currentVersion","DocumentListQueryResult","query","queryParams","DEFAULT_PARAMS","getDocumentQuery","perspectiveFilter","querySelect","queryOrder","queryFields","order","Box","Flex","Container","Spinner","Stack","Text","useMemo","useState","useListeningQuery","Feedback","DraggableList","ORDER_FIELD_NAME","getFilteredDedupedDocs","getDocumentQuery","DocumentListQueryProps","SanityDocumentWithOrder","DocumentListQuery","props","$","_c","listIsUpdating","setListIsUpdating","t0","query","queryParams","t1","Symbol","for","t2","params","initialValue","data","_queryData","loading","error","t3","Array","isArray","queryData","t4","currentVersion","t5","filter","_temp","unorderedDataCount","length","t6","width","height","t7","overflow","t8","t9","doc","Box","useToast","ToastParams","useEffect","useMemo","useSchema","Feedback","DocumentListQuery","ORDER_FIELD_NAME","OrderableContext","DocumentListWrapperProps","showIncrements","type","resetOrderTransaction","filter","params","Record","currentVersion","DocumentListWrapper","t0","$","_c","toast","schema","t1","orderableContextValue","t2","t3","title","status","push","t4","bb0","t5","Symbol","for","typeSchema","get","fields","some","_temp","t6","t7","t8","_temp2","schemaIsInvalid","field_0","field","name","MultipleMutationResult","SanityClient","LexoRank","ORDER_FIELD_NAME","getDocumentQuery","DocumentListQueryProps","ResetOrderParams","client","currentVersion","resetOrder","params","Promise","queryProps","query","queryParams","documents","fetch","Array","_id","_type","tag","length","aLexoRank","min","transaction","map","doc","reduce","trx","documentId","genNext","patch","set","toString","commit","visibility","SanityClient","ToastParams","useImperativeHandle","useState","Ref","DocumentListWrapper","resetOrder","OrderableDocumentListProps","options","type","client","filter","params","Record","currentVersion","ref","actionHandlers","showIncrements","Promise","OrderableDocumentList","t0","$","_c","setShowIncrements","t1","Symbol","for","resetOrderTransaction","setResetOrderTransaction","t2","t3","_temp","status","title","closable","update","reorderWasSuccessful","results","length","t4","state","GenerateIcon","SortIcon","ComponentType","ConfigContext","ListItem","MenuItem","StructureBuilder","API_VERSION","OrderableDocumentList","OrderableListConfig","type","id","title","icon","params","Record","filter","menuItems","createIntent","context","S","orderableDocumentListDeskItem","config","Error","schema","getClient","maybePerspectiveStack","Reflect","get","perspectiveStack","Array","isArray","every","item","client","apiVersion","currentVersion","listTitle","listId","listIcon","typeTitle","defaultMenuItems","push","menuItem","intent","serialize","listItem","schemaType","child","Object","assign","documentTypeList","canHandleIntent","_intentName","__preserveInstance","key","component","options","action"],"sources":["../src/helpers/constants.ts","../src/helpers/parseOrderRank.ts","../src/helpers/initialRank.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/OrderableContext.ts","../src/Document.tsx","../src/helpers/client.ts","../src/helpers/reorderDocuments.ts","../src/DraggableList.tsx","../src/helpers/getFilteredDedupedDocs.ts","../src/helpers/query.ts","../src/DocumentListQuery.tsx","../src/DocumentListWrapper.tsx","../src/helpers/resetOrder.ts","../src/OrderableDocumentList.tsx","../src/desk-structure/orderableDocumentListDeskItem.ts"],"sourcesContent":["export const ORDER_FIELD_NAME = `orderRank` as const\n\n// same version we are using in the vision plugin\nexport const API_VERSION = `v2025-06-27` as const\n","import {LexoRank} from 'lexorank'\n\n// Safely parse a LexoRank string; fall back if invalid\nexport function parseOrderRank(value: unknown, fallback: LexoRank): LexoRank {\n if (typeof value !== 'string') {\n console.warn('[orderable-document-list] Invalid orderRank value (expected string):', value)\n return fallback\n }\n\n try {\n return LexoRank.parse(value)\n } catch (err) {\n console.warn(\n '[orderable-document-list] Failed to parse orderRank value:',\n value,\n 'Error:',\n err instanceof Error ? err.message : String(err),\n )\n return fallback\n }\n}\n","import {LexoRank} from 'lexorank'\n\nimport type {NewItemPosition} from '../types'\nimport {parseOrderRank} from './parseOrderRank'\n\n// Use in initial value field by passing in the rank value of the last document\n// If not value passed, generate a sensibly low rank\nexport function initialRank(\n compareRankValue: unknown = ``,\n newItemPosition: NewItemPosition = 'after',\n) {\n const compareRank = parseOrderRank(compareRankValue, LexoRank.min())\n const rank =\n newItemPosition === 'before' ? compareRank.genPrev().genPrev() : compareRank.genNext().genNext()\n\n return rank.toString()\n}\n","import {defineField, type FieldDefinition, type StringDefinition} from 'sanity'\n\nimport {API_VERSION, ORDER_FIELD_NAME} from '../helpers/constants'\nimport {initialRank} from '../helpers/initialRank'\nimport type {NewItemPosition} from '../types'\n\nexport interface RankFieldConfig extends Partial<\n Omit<StringDefinition, 'name' | 'type' | 'initialValue'>\n> {\n type: string\n newItemPosition?: NewItemPosition\n}\n\nexport const orderRankField = (config: RankFieldConfig): FieldDefinition<'string'> => {\n if (!config?.type) {\n throw new Error(\n `\n type must be provided.\n Example: orderRankField({type: 'category'})\n `,\n )\n }\n\n const {type, newItemPosition = 'after', ...rest} = config\n return defineField({\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...rest,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async (value, {getClient}) => {\n void value\n const direction = newItemPosition === 'before' ? 'asc' : 'desc'\n\n const lastDocOrderRank = await getClient({apiVersion: API_VERSION}).fetch<string | undefined>(\n `*[_type == $type]|order(@[$order] ${direction})[0][$order]`,\n {type, order: ORDER_FIELD_NAME},\n {tag: 'orderable-document-list.last-doc-order-rank'},\n )\n return initialRank(lastDocOrderRank, newItemPosition)\n },\n })\n}\n","import type {SortOrdering} from 'sanity'\n\nimport {ORDER_FIELD_NAME} from '../helpers/constants'\n\nexport const orderRankOrdering: SortOrdering = {\n title: 'Ordered',\n name: 'ordered',\n by: [{field: ORDER_FIELD_NAME, direction: 'asc'}],\n}\n","import {createContext} from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = createContext<OrderableContextValue>({})\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {DragHandleIcon} from '@sanity/icons/DragHandle'\nimport {AvatarCounter, Card, Box, Button, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useContext} from 'react'\nimport {\n useSchema,\n PreviewCard,\n Preview,\n DocumentVersionsStatusIndicator,\n DocumentStatus,\n useDocumentVersionInfo,\n useDocumentVersions,\n getPublishedId,\n} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\n\nimport {OrderableContext} from './OrderableContext'\nimport type {SanityDocumentWithOrder} from './types'\n\nexport interface DocumentProps {\n doc: SanityDocumentWithOrder\n entities: SanityDocumentWithOrder[]\n increment: (\n index: number,\n nextIndex: number,\n docId: string,\n entities: SanityDocumentWithOrder[],\n ) => void\n index: number\n isFirst: boolean\n isLast: boolean\n dragBadge: number | false\n}\n\nexport function Document({\n doc,\n increment,\n entities,\n index,\n isFirst,\n isLast,\n dragBadge,\n}: DocumentProps) {\n const {showIncrements} = useContext(OrderableContext)\n const schema = useSchema()\n const router = usePaneRouter()\n // oxlint-disable-next-line typescript/no-deprecated -- the replacement, `useDocumentVersions`, would require reimplementing the internal (unexported) `getDocumentVersionInfoFromVersions` util for the DocumentStatus tooltip\n const versionsInfo = useDocumentVersionInfo(doc._id)\n const {versions} = useDocumentVersions({documentId: getPublishedId(doc._id)})\n\n const {ChildLink, groupIndex, routerPanesState} = router\n\n const currentDoc = routerPanesState[groupIndex + 1]?.[0]?.id || false\n const pressed = currentDoc === doc._id || currentDoc === doc._id.replace(`drafts.`, ``)\n const selected = pressed && routerPanesState.length === groupIndex + 2\n const schemaType = schema.get(doc._type)\n\n if (!schemaType) {\n return null\n }\n\n const tooltip = (\n <DocumentStatus\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\n )\n\n return (\n <PreviewCard\n __unstable_focusRing\n as={ChildLink}\n data-as=\"a\"\n data-ui=\"PaneItem\"\n radius={2}\n pressed={pressed}\n selected={selected}\n sizing=\"border\"\n tabIndex={-1}\n tone=\"inherit\"\n width=\"100%\"\n flex={1}\n childId={doc._id}\n >\n <Flex align=\"center\">\n <Box paddingX={2} style={{flexShrink: 0}}>\n <Text size={2}>\n <DragHandleIcon cursor=\"grab\" />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index - 1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Box style={{width: `100%`}}>\n <Flex flex={1} align=\"center\" justify=\"space-between\" paddingRight={3}>\n <Preview layout=\"default\" value={doc} schemaType={schemaType} />\n\n <Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n <DocumentVersionsStatusIndicator documentVersions={versions} />\n </Flex>\n </Tooltip>\n </Flex>\n </Box>\n {dragBadge && (\n <Card tone=\"default\" marginRight={4} radius={5}>\n <AvatarCounter count={dragBadge} />\n </Card>\n )}\n </Flex>\n </PreviewCard>\n )\n}\n","import {type SanityClient, useClient, usePerspective} from 'sanity'\n\nimport {API_VERSION} from './constants'\n\nexport function useSanityClient(): SanityClient {\n const {perspectiveStack} = usePerspective()\n\n return useClient({apiVersion: API_VERSION}).withConfig({perspective: perspectiveStack})\n}\n","import type {DraggableLocation} from '@hello-pangea/dnd'\nimport {LexoRank} from 'lexorank'\nimport type {PatchOperations} from 'sanity'\n\nimport type {SanityDocumentWithOrder} from '../types'\nimport {ORDER_FIELD_NAME} from './constants'\nimport {parseOrderRank} from './parseOrderRank'\n\nexport interface ReorderArgs {\n entities: SanityDocumentWithOrder[]\n selectedIds: string[]\n source: DraggableLocation\n destination: DraggableLocation\n}\n\nexport interface ReorderReturn {\n newOrder: SanityDocumentWithOrder[]\n patches: [string, PatchOperations][]\n message: string\n}\n\nfunction lexicographicalSort(a: SanityDocumentWithOrder, b: SanityDocumentWithOrder) {\n if (!a[ORDER_FIELD_NAME] || !b[ORDER_FIELD_NAME]) {\n return 0\n } else if (a[ORDER_FIELD_NAME] < b[ORDER_FIELD_NAME]) {\n return -1\n } else if (a[ORDER_FIELD_NAME] > b[ORDER_FIELD_NAME]) {\n return 1\n }\n return 0\n}\n\nexport const reorderDocuments = ({\n entities,\n selectedIds,\n source,\n destination,\n}: ReorderArgs): ReorderReturn => {\n const startIndex = source.index\n const endIndex = destination.index\n const isMovingUp = startIndex > endIndex\n const selectedItems = entities.filter((item) => selectedIds.includes(item._id))\n const message = [\n 'Moved',\n selectedItems.length === 1 ? '1 document' : `${selectedItems.length} documents`,\n isMovingUp ? 'up' : 'down',\n 'from position',\n `${startIndex + 1} to ${endIndex + 1}`,\n ].join(' ')\n\n const {all, selected} = entities.reduce<{\n all: SanityDocumentWithOrder[]\n selected: SanityDocumentWithOrder[]\n }>(\n (acc, cur, curIndex) => {\n // Selected items get spread in below, so skip them here\n if (selectedIds.includes(cur._id)) {\n return {all: acc.all, selected: acc.selected}\n }\n\n // Drop selected items in\n if (curIndex === endIndex) {\n const prevIndex = curIndex - 1\n const prevRank = parseOrderRank(entities[prevIndex]?.[ORDER_FIELD_NAME], LexoRank.min())\n const curRank = parseOrderRank(cur[ORDER_FIELD_NAME], LexoRank.min())\n const nextIndex = curIndex + 1\n const nextRank = parseOrderRank(entities[nextIndex]?.[ORDER_FIELD_NAME], LexoRank.max())\n\n let betweenRank = isMovingUp ? prevRank.between(curRank) : curRank.between(nextRank)\n\n // For each selected item, assign a new orderRank between now and next\n for (const selectedItem of selectedItems) {\n selectedItem[ORDER_FIELD_NAME] = betweenRank.toString()\n betweenRank = isMovingUp ? betweenRank.between(curRank) : betweenRank.between(nextRank)\n }\n\n return {\n // The `all` array gets sorted by order field later anyway\n // so that this probably isn't necessary ¯\\_(ツ)_/¯\n all: isMovingUp\n ? [...acc.all, ...selectedItems, cur]\n : [...acc.all, cur, ...selectedItems],\n selected: selectedItems,\n }\n }\n\n return {all: [...acc.all, cur], selected: acc.selected}\n },\n {all: [], selected: []},\n )\n\n const patches = selected.flatMap((doc) => {\n const docPatches: [string, PatchOperations][] = [\n [\n doc._id,\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ],\n ]\n\n // If it's a draft, we need to patch the published document as well\n if (doc._id.startsWith('drafts.') && doc.hasPublished) {\n docPatches.push([\n doc._id.replace('drafts.', ''),\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ])\n }\n\n return docPatches\n })\n\n // Safety-check to make sure everything is in order\n const allSorted = all.sort(lexicographicalSort)\n\n return {newOrder: allSorted, patches, message}\n}\n","import {\n DragDropContext,\n Draggable,\n Droppable,\n type DropResult,\n type DraggableLocation,\n} from '@hello-pangea/dnd'\nimport {Box, Card} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useEffect, useState, useMemo, useCallback, type CSSProperties} from 'react'\nimport type {PatchOperations} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\n\nimport {Document} from './Document'\nimport {useSanityClient} from './helpers/client'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport type {SanityDocumentWithOrder} from './types'\n\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\n}\n\ninterface DragResultLike {\n draggableId: string\n source: DraggableLocation\n destination: DraggableLocation | null\n}\n\nexport interface DraggableListProps {\n data: SanityDocumentWithOrder[]\n listIsUpdating: boolean\n setListIsUpdating: (val: boolean) => void\n}\n\nconst getItemStyle = (\n draggableStyle: CSSProperties | undefined,\n itemIsUpdating: boolean,\n): CSSProperties => ({\n userSelect: 'none',\n transition: 'opacity 500ms ease-in-out',\n opacity: itemIsUpdating ? 0.2 : 1,\n pointerEvents: itemIsUpdating ? 'none' : undefined,\n ...draggableStyle,\n})\n\nconst cardTone = (settings: ListSetting) => {\n const {isDuplicate, isGhosting, isDragging, isSelected} = settings\n\n if (isGhosting) return 'transparent'\n if (isDragging || isSelected) return 'primary'\n if (isDuplicate) return 'caution'\n\n return undefined\n}\n\nexport function DraggableList({data, listIsUpdating, setListIsUpdating}: DraggableListProps) {\n const toast = useToast()\n const router = usePaneRouter()\n const {groupIndex, routerPanesState} = router\n\n const currentDoc = routerPanesState[groupIndex + 1]?.[0]?.id || false\n\n // Maintains local state order before transaction completes\n const [orderedData, setOrderedData] = useState<SanityDocumentWithOrder[]>(data)\n const displayedData = listIsUpdating ? orderedData : data\n\n const [draggingId, setDraggingId] = useState('')\n const [selectedIds, setSelectedIds] = useState<string[]>(currentDoc ? [currentDoc] : [])\n\n const clearSelected = useCallback(() => setSelectedIds([]), [setSelectedIds])\n\n const handleSelect = useCallback(\n (clickedId: string, index: number, nativeEvent: MouseEvent) => {\n const isSelected = selectedIds.includes(clickedId)\n const selectMultiple = nativeEvent.shiftKey\n const isUsingWindows = navigator.appVersion.indexOf('Win') !== -1\n const selectAdditional = isUsingWindows ? nativeEvent.ctrlKey : nativeEvent.metaKey\n\n let updatedIds: string[] = []\n\n // No modifier keys pressed during click:\n // - update selected to just this one\n // - open document\n if (!selectMultiple && !selectAdditional) {\n return setSelectedIds([clickedId])\n }\n\n // If shift key was held, prevent default to avoid new window opening\n if (selectMultiple) {\n nativeEvent.preventDefault()\n }\n\n // Shift key was held, add id's between last selected and this one\n // ...before adding this one\n if (selectMultiple && !isSelected) {\n const lastSelectedId = selectedIds[selectedIds.length - 1] ?? clickedId\n const lastSelectedIndex = displayedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = displayedData\n .filter((_, itemIndex) => itemIndex > firstSelected && itemIndex < lastSelected)\n .map((item) => item._id)\n\n updatedIds = [...selectedIds, ...betweenIds, clickedId]\n } else if (isSelected) {\n // Toggle off a single id\n updatedIds = selectedIds.filter((id) => id !== clickedId)\n } else {\n // Toggle on a single id\n updatedIds = [...selectedIds, clickedId]\n }\n\n return setSelectedIds(updatedIds)\n },\n [displayedData, selectedIds],\n )\n\n const client = useSanityClient()\n\n const transactPatches = useCallback(\n async (patches: [string, PatchOperations][], message: string) => {\n const transaction = client.transaction()\n\n patches.forEach(([docId, ops]) => {\n transaction.patch(docId, ops)\n })\n\n try {\n const updated = await transaction.commit({\n visibility: 'sync',\n tag: 'orderable-document-list.reorder',\n })\n clearSelected()\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: `${\n updated.results.length === 1 ? '1 document' : `${updated.results.length} documents`\n } reordered`,\n status: 'success',\n description: message,\n })\n } catch {\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: 'Reordering failed',\n status: 'error',\n })\n }\n },\n [client, clearSelected, setListIsUpdating, toast],\n )\n\n const handleDragEnd = useCallback(\n (result: DragResultLike | undefined, entities: SanityDocumentWithOrder[]) => {\n setDraggingId('')\n\n const {source, destination, draggableId} = result ?? {}\n\n // Don't do anything if nothing changed\n if (source?.index === destination?.index) return\n\n // Don't do anything if we don't have the entitites\n if (!entities.length || !draggableId || !source || !destination) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds.length > 0 ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (effectedIds.length === 0) return\n\n // Update state to update styles + prevent data refetching\n setListIsUpdating(true)\n setSelectedIds(effectedIds)\n\n const {newOrder, patches, message} = reorderDocuments({\n entities,\n selectedIds: effectedIds,\n source,\n destination,\n })\n\n // Update local state\n if (newOrder.length > 0) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches.length > 0) {\n void transactPatches(patches, message)\n }\n },\n [selectedIds, transactPatches, setListIsUpdating],\n )\n\n const handleDragStart = useCallback(\n (start: {draggableId: string}) => {\n const id = start.draggableId\n const selected = selectedIds.includes(id)\n\n // if dragging an item that is not selected - unselect all items\n if (!selected) clearSelected()\n\n setDraggingId(id)\n },\n [selectedIds, clearSelected],\n )\n\n // Move one document up or down one place, by fake invoking the drag function\n const incrementIndex = useCallback(\n (shiftFrom: number, shiftTo: number, id: string, entities: SanityDocumentWithOrder[]) => {\n const result: DragResultLike = {\n draggableId: id,\n source: {droppableId: 'documentSortZone', index: shiftFrom},\n destination: {droppableId: 'documentSortZone', index: shiftTo},\n }\n\n return handleDragEnd(result, entities)\n },\n [handleDragEnd],\n )\n\n const onWindowKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n clearSelected()\n }\n },\n [clearSelected],\n )\n\n useEffect(() => {\n window.addEventListener('keydown', onWindowKeyDown)\n\n return () => {\n window.removeEventListener('keydown', onWindowKeyDown)\n }\n }, [onWindowKeyDown])\n\n // Find all items with duplicate order field\n const duplicateOrders = useMemo(() => {\n if (displayedData.length === 0) return []\n\n const orderField = displayedData.map((item) => item[ORDER_FIELD_NAME])\n\n return orderField.filter((item, index) => orderField.indexOf(item) !== index)\n }, [displayedData])\n\n const onDragEnd = useCallback(\n (result: DropResult) => handleDragEnd(result, displayedData),\n [displayedData, handleDragEnd],\n )\n\n return (\n <DragDropContext onDragStart={handleDragStart} onDragEnd={onDragEnd}>\n <Droppable droppableId=\"documentSortZone\">\n {(provided) => (\n <div {...provided.droppableProps} ref={provided.innerRef}>\n {displayedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n >\n {(innerProvided, innerSnapshot) => {\n const isSelected = selectedIds.includes(item._id)\n const isDragging = innerSnapshot.isDragging\n const isGhosting = Boolean(!isDragging && draggingId && isSelected)\n const isUpdating = listIsUpdating && isSelected\n const isDisabled = !item[ORDER_FIELD_NAME]\n const isDuplicate = duplicateOrders.includes(item[ORDER_FIELD_NAME])\n const tone = cardTone({isDuplicate, isGhosting, isDragging, isSelected})\n const selectedCount = selectedIds.length\n\n const dragBadge = isDragging && selectedCount > 1 ? selectedCount : false\n\n return (\n <div\n ref={innerProvided.innerRef}\n {...innerProvided.draggableProps}\n {...innerProvided.dragHandleProps}\n style={\n isDisabled\n ? {opacity: 0.2, pointerEvents: 'none'}\n : getItemStyle(innerProvided.draggableProps.style, isUpdating)\n }\n >\n <Box paddingBottom={1}>\n <Card\n tone={tone}\n shadow={isDragging ? 2 : undefined}\n radius={2}\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={displayedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === displayedData.length - 1}\n dragBadge={dragBadge}\n />\n </Card>\n </Box>\n </div>\n )\n }}\n </Draggable>\n ))}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n )\n}\n","import {getPublishedId, getVersionFromId, isDraftId, isPublishedId, isVersionId} from 'sanity'\n\nimport type {SanityDocumentWithOrder} from '../types'\n\nconst isVersionForCurrentPerspective = (\n document: SanityDocumentWithOrder,\n perspectiveName: string,\n publishedId: string,\n) => {\n return (\n document._id &&\n isVersionId(document._id) &&\n getVersionFromId(document._id) === perspectiveName &&\n getPublishedId(document._id) === publishedId\n )\n}\n\n// this removes dedupped docs from the list and makes sure that it keeps the right docs\n// in the list while preserving the order established by the orderRank field\nexport const getFilteredDedupedDocs = (\n documents: SanityDocumentWithOrder[],\n perspectiveName?: string,\n): SanityDocumentWithOrder[] => {\n // Flatten the documents array in case it's nested (like in test data)\n const flatDocuments = documents.flat()\n const dedupedDocuments: SanityDocumentWithOrder[] = []\n\n for (const cur of flatDocuments) {\n if (!cur._id) {\n continue\n }\n\n // Handle version-only documents\n if (isVersionId(cur._id)) {\n const versionFromId = getVersionFromId(cur._id)\n const isCorrectVersion = versionFromId === perspectiveName\n\n // Only include versions that match the current perspective\n if (\n perspectiveName &&\n perspectiveName !== 'drafts' &&\n perspectiveName !== 'published' &&\n isCorrectVersion\n ) {\n dedupedDocuments.push(cur)\n }\n continue\n }\n\n // Handle published perspective - only include published documents\n if (perspectiveName === 'published') {\n if (isPublishedId(cur._id)) {\n dedupedDocuments.push(cur)\n }\n continue\n }\n\n // in situations where the document is not a draft, we need to check if\n // the version should override a published document or a draft\n if (!isDraftId(cur._id)) {\n const publishedId = getPublishedId(cur._id)\n\n // Check if there's a version that matches the perspectiveName\n const hasMatchingVersion =\n perspectiveName && perspectiveName !== 'drafts' && perspectiveName !== 'published'\n ? flatDocuments.some((doc) =>\n isVersionForCurrentPerspective(doc, perspectiveName, publishedId),\n )\n : false\n\n // Check if there's a draft\n const hasDraft = flatDocuments.some((doc) => doc._id === `drafts.${cur._id}`)\n const hasDuplicatePublished = flatDocuments.some((doc) => doc !== cur && doc._id === cur._id)\n\n // Priority: version > draft > published\n // If there's a matching version, skip published\n if (!hasMatchingVersion && !hasDraft && !hasDuplicatePublished) {\n dedupedDocuments.push(cur)\n }\n continue\n }\n\n // For drafts, check if there's a version for this document in version perspective\n if (perspectiveName && perspectiveName !== 'drafts' && perspectiveName !== 'published') {\n const baseId = getPublishedId(cur._id)\n const hasVersion = flatDocuments.some((doc) =>\n isVersionForCurrentPerspective(doc, perspectiveName, baseId),\n )\n\n // If there's a version for this document, skip the draft\n if (hasVersion) {\n continue\n }\n }\n\n // Check if the draft has a published version\n cur.hasPublished = flatDocuments.some((doc) => doc._id === cur._id.replace(`drafts.`, ``))\n\n dedupedDocuments.push(cur)\n }\n\n return dedupedDocuments\n}\n","import {ORDER_FIELD_NAME} from './constants'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n currentVersion?: string\n}\n\nexport interface DocumentListQueryResult {\n query: string\n queryParams: Record<string, string | number | boolean | string[]>\n}\n\nconst DEFAULT_PARAMS = {}\n\nexport function getDocumentQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n currentVersion,\n}: DocumentListQueryProps): DocumentListQueryResult {\n let perspectiveFilter = null\n if (currentVersion === 'published') {\n perspectiveFilter = '!(_id in path(\"drafts.**\")) && !(_id in path(\"versions.**\"))'\n } else if (currentVersion === 'drafts') {\n // Show drafts, and published when no draft exists\n perspectiveFilter = `\n (_id in path(\"drafts.**\") || (!(_id in path(\"drafts.**\")) && !(_id in path(\"versions.**\"))))\n `\n } else {\n // Default behavior: prioritize drafts over published when both exist\n // the priority should be a version\n perspectiveFilter = `(sanity::partOfRelease($currentVersion) || (!(_id in path(\"drafts.**\")) && !(_id in path(\"versions.**\"))) || (_id in path(\"drafts.**\")))`\n }\n\n const querySelect = `*[_type == $type ${perspectiveFilter ? `&& ${perspectiveFilter}` : ''}${filter ? `&& ${filter}` : ''}]`\n const queryOrder = `|order(@[$order] asc)`\n const queryFields = `{_id, _type, ${ORDER_FIELD_NAME}}`\n\n const query = `${querySelect}${queryOrder}${queryFields}`\n const queryParams = {\n ...params,\n type,\n order: ORDER_FIELD_NAME,\n ...(currentVersion && {currentVersion}),\n }\n\n return {query, queryParams}\n}\n","import {Box, Flex, Container, Spinner, Stack, Text} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\nimport {useListeningQuery, Feedback} from 'sanity-plugin-utils'\n\nimport {DraggableList} from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {getFilteredDedupedDocs} from './helpers/getFilteredDedupedDocs'\nimport {getDocumentQuery, type DocumentListQueryProps} from './helpers/query'\nimport type {SanityDocumentWithOrder} from './types'\n\nexport function DocumentListQuery(props: DocumentListQueryProps) {\n const [listIsUpdating, setListIsUpdating] = useState(false)\n\n const {query, queryParams} = getDocumentQuery(props)\n\n const {\n data: _queryData,\n loading,\n error,\n } = useListeningQuery<SanityDocumentWithOrder[]>(query, {\n params: queryParams,\n initialValue: [],\n })\n\n const queryData = useMemo(() => (Array.isArray(_queryData) ? _queryData : []), [_queryData])\n\n const data = useMemo(\n () => getFilteredDedupedDocs(queryData, props.currentVersion),\n [props.currentVersion, queryData],\n )\n\n const unorderedDataCount = useMemo(\n () => data.filter((doc) => !doc[ORDER_FIELD_NAME]).length,\n [data],\n )\n\n if (loading) {\n return (\n <Flex style={{width: `100%`, height: `100%`}} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n }\n\n if (error) {\n return (\n <Box padding={2}>\n <Feedback tone=\"critical\" title=\"There was an error\" description=\"Please try again later\" />\n </Box>\n )\n }\n\n if (data.length === 0) {\n return (\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\">\n <Container width={1}>\n <Box paddingX={4} paddingY={5}>\n <Text align=\"center\" muted>\n No documents of this type\n </Text>\n </Box>\n </Container>\n </Flex>\n )\n }\n\n return (\n <Stack gap={1} style={{overflow: `auto`, height: `100%`}}>\n <Box padding={2}>\n {unorderedDataCount > 0 && (\n <Box marginBottom={2}>\n <Feedback\n tone=\"caution\"\n description={\n <>\n {unorderedDataCount}/{data.length} documents have no order. Select{' '}\n <strong>Reset Order</strong> from the menu above to fix.\n </>\n }\n />\n </Box>\n )}\n <DraggableList\n data={data}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />\n </Box>\n </Stack>\n )\n}\n","import {Box} from '@sanity/ui'\nimport {useToast, type ToastParams} from '@sanity/ui/toast'\nimport {useEffect, useMemo} from 'react'\nimport {useSchema} from 'sanity'\nimport {Feedback} from 'sanity-plugin-utils'\n\nimport {DocumentListQuery} from './DocumentListQuery'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {OrderableContext} from './OrderableContext'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n filter?: string\n params?: Record<string, unknown>\n currentVersion?: string\n}\n\n// 1. Validate first that the schema has been configured for ordering\n// 2. Setup context for showIncrements\nexport function DocumentListWrapper({\n type,\n showIncrements,\n resetOrderTransaction,\n filter,\n params,\n currentVersion,\n}: DocumentListWrapperProps) {\n const toast = useToast()\n const schema = useSchema()\n const orderableContextValue = useMemo(() => ({showIncrements}), [showIncrements])\n\n useEffect(() => {\n if (resetOrderTransaction?.title && resetOrderTransaction?.status) {\n toast.push(resetOrderTransaction)\n }\n }, [resetOrderTransaction, toast])\n\n const schemaIsInvalid = useMemo(() => {\n // Option not passed\n if (!type) {\n return (\n <>\n No <code>type</code> was configured\n </>\n )\n }\n\n const typeSchema = schema.get(type)\n\n // Schema not found\n if (!typeSchema) {\n return (\n <>\n Schema <code>{type}</code> not found\n </>\n )\n }\n\n // Schema lacks an order field\n if (\n !('fields' in typeSchema) ||\n !typeSchema.fields.some((field) => field?.name === ORDER_FIELD_NAME)\n ) {\n return (\n <>\n Schema <code>{type}</code> must have an <code>{ORDER_FIELD_NAME}</code> field of type{' '}\n <code>string</code>\n </>\n )\n }\n\n // Schema's order field is not a string\n if (\n 'fields' in typeSchema &&\n typeSchema.fields.some(\n (field) => field?.name === ORDER_FIELD_NAME && field?.type?.name !== 'string',\n )\n ) {\n return (\n <>\n <code>{ORDER_FIELD_NAME}</code> field on Schema <code>{type}</code> must be{' '}\n <code>string</code> type\n </>\n )\n }\n\n return ''\n }, [type, schema])\n\n if (schemaIsInvalid) {\n return (\n <Box padding={2}>\n <Feedback description={schemaIsInvalid} tone=\"caution\" />\n </Box>\n )\n }\n\n return (\n <OrderableContext.Provider value={orderableContextValue}>\n <DocumentListQuery\n type={type}\n filter={filter}\n params={params}\n currentVersion={currentVersion}\n />\n </OrderableContext.Provider>\n )\n}\n","import type {MultipleMutationResult, SanityClient} from '@sanity/client'\nimport {LexoRank} from 'lexorank'\n\nimport {ORDER_FIELD_NAME} from './constants'\nimport {getDocumentQuery, type DocumentListQueryProps} from './query'\n\nexport interface ResetOrderParams extends DocumentListQueryProps {\n client: SanityClient\n currentVersion?: string\n}\n\n// Function to wipe and re-do ordering with LexoRank\n// Will at least attempt to start with the current order\nexport async function resetOrder(params: ResetOrderParams): Promise<MultipleMutationResult | null> {\n const {client, currentVersion, ...queryProps} = params\n const {query, queryParams} = getDocumentQuery({...queryProps, currentVersion})\n\n const documents = await client.fetch<\n Array<{\n _id: string\n _type: string\n [ORDER_FIELD_NAME]: string\n }>\n >(query, queryParams, {\n tag: 'orderable-document-list.reset-order',\n })\n\n if (documents.length === 0) {\n return null\n }\n\n let aLexoRank = LexoRank.min()\n\n const transaction = documents\n .map((doc) => doc._id)\n .reduce((trx, documentId) => {\n // Generate next rank before even the first document so there's room to move!\n aLexoRank = aLexoRank.genNext().genNext()\n\n return trx.patch(documentId, {\n set: {[ORDER_FIELD_NAME]: aLexoRank.toString()},\n })\n }, client.transaction())\n\n return transaction.commit({\n visibility: 'async',\n tag: 'orderable-document-list.reset-order',\n })\n}\n","import type {SanityClient} from '@sanity/client'\nimport type {ToastParams} from '@sanity/ui/toast'\nimport {useImperativeHandle, useState, type Ref} from 'react'\n\nimport {DocumentListWrapper} from './DocumentListWrapper'\nimport {resetOrder} from './helpers/resetOrder'\n\nexport interface OrderableDocumentListProps {\n options: {\n type: string\n client: SanityClient\n filter?: string\n params?: Record<string, unknown>\n currentVersion?: string\n }\n /**\n * Structure menu actions look up `actionHandlers` on the pane component\n * instance. Expose them via `useImperativeHandle`.\n */\n ref?: Ref<{\n actionHandlers: {\n showIncrements: () => void\n resetOrder: () => Promise<void>\n }\n }>\n}\n\nexport function OrderableDocumentList({options, ref}: OrderableDocumentListProps) {\n const [showIncrements, setShowIncrements] = useState(false)\n const [resetOrderTransaction, setResetOrderTransaction] = useState<ToastParams>({})\n\n useImperativeHandle(\n ref,\n () => ({\n actionHandlers: {\n showIncrements: () => {\n setShowIncrements((state) => !state)\n },\n\n resetOrder: async () => {\n setResetOrderTransaction({\n status: `info`,\n title: `Reordering started...`,\n closable: true,\n })\n\n const update = await resetOrder(options)\n\n const reorderWasSuccessful = update?.results?.length\n\n setResetOrderTransaction({\n status: reorderWasSuccessful ? `success` : `info`,\n title: reorderWasSuccessful\n ? `Reordered ${update.results.length === 1 ? `Document` : `Documents`}`\n : `Reordering failed`,\n closable: true,\n })\n },\n },\n // The pane stores this handle in state, so only re-create it when needed\n // to avoid update loops.\n }),\n [options],\n )\n\n const {type, filter, params, currentVersion} = options\n\n if (!type) {\n return null\n }\n\n return (\n <DocumentListWrapper\n filter={filter}\n params={params}\n type={type}\n showIncrements={showIncrements}\n resetOrderTransaction={resetOrderTransaction}\n currentVersion={currentVersion}\n />\n )\n}\n","import {GenerateIcon} from '@sanity/icons/Generate'\nimport {SortIcon} from '@sanity/icons/Sort'\nimport {type ComponentType} from 'react'\nimport type {ConfigContext} from 'sanity'\nimport {type ListItem, type MenuItem, type StructureBuilder} from 'sanity/structure'\n\nimport {API_VERSION} from '../helpers/constants'\nimport {OrderableDocumentList} from '../OrderableDocumentList'\n\nexport interface OrderableListConfig {\n type: string\n id?: string\n title?: string\n icon?: ComponentType\n params?: Record<string, unknown>\n filter?: string\n menuItems?: MenuItem[]\n createIntent?: boolean\n context: ConfigContext\n S: StructureBuilder\n}\n\nexport function orderableDocumentListDeskItem(config: OrderableListConfig): ListItem {\n if (!config?.type || !config.context || !config.S) {\n throw new Error(`\n type, context and S (StructureBuilder) must be provided.\n context and S are available when configuring structure.\n Example: orderableDocumentListDeskItem({type: 'category'})\n `)\n }\n\n const {type, filter, menuItems = [], createIntent, params, title, icon, id, context, S} = config\n const {schema, getClient} = context\n const maybePerspectiveStack: unknown = Reflect.get(context, 'perspectiveStack')\n const perspectiveStack =\n Array.isArray(maybePerspectiveStack) &&\n maybePerspectiveStack.every((item): item is string => typeof item === 'string')\n ? maybePerspectiveStack\n : []\n const client = getClient({apiVersion: API_VERSION})\n // the first position in the perspective stack is the current version\n const currentVersion = perspectiveStack[0]\n\n const listTitle = title ?? `Orderable ${type}`\n const listId = id ?? `orderable-${type}`\n const listIcon = icon ?? SortIcon\n const typeTitle = schema.get(type)?.title ?? type\n const defaultMenuItems = [...menuItems]\n\n if (createIntent !== false) {\n defaultMenuItems.push(\n S.menuItem()\n .title(`Create new ${typeTitle}`)\n .intent({type: 'create', params: {type}})\n .serialize(),\n )\n }\n\n return S.listItem()\n .title(listTitle)\n .id(listId)\n .icon(listIcon)\n .schemaType(type)\n .child(\n Object.assign(\n S.documentTypeList(type)\n .canHandleIntent(\n (_intentName, params) => createIntent !== false && params?.['type'] === type,\n )\n .serialize(),\n {\n // Prevents the component from re-rendering when switching documents\n __preserveInstance: true,\n // Prevents the component from NOT re-rendering when switching listItems\n key: listId,\n\n type: 'component',\n component: OrderableDocumentList,\n options: {type, filter, params, client, currentVersion},\n menuItems: [\n ...defaultMenuItems,\n S.menuItem().title(`Reset Order`).icon(GenerateIcon).action(`resetOrder`).serialize(),\n S.menuItem()\n .title(`Toggle Increments`)\n .icon(SortIcon)\n .action(`showIncrements`)\n .serialize(),\n ],\n },\n ),\n )\n .serialize()\n}\n"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","names":["{\n doc,\n increment,\n entities,\n index,\n isFirst,\n isLast,\n dragBadge,\n}: DocumentProps","getPublishedId(doc._id)","_id","{documentId: getPublishedId(doc._id)}","currentDoc === doc._id || currentDoc === doc._id.replace(`drafts.`, ``)","schema.get(doc._type)","_type","<DocumentStatus\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />","draft","published","versions","{flexShrink: 0}","<Box paddingX={2} style={{flexShrink: 0}}>\n <Text size={2}>\n <DragHandleIcon cursor=\"grab\" />\n </Text>\n </Box>","showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index - 1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )","{width: `100%`}","<Preview layout=\"default\" value={doc} schemaType={schemaType} />","<Flex align=\"center\" style={{flexShrink: 0}}>\n <DocumentVersionsStatusIndicator documentVersions={versions} />\n </Flex>","<Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n <DocumentVersionsStatusIndicator documentVersions={versions} />\n </Flex>\n </Tooltip>","<Box style={{width: `100%`}}>\n <Flex flex={1} align=\"center\" justify=\"space-between\" paddingRight={3}>\n <Preview layout=\"default\" value={doc} schemaType={schemaType} />\n\n <Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n <DocumentVersionsStatusIndicator documentVersions={versions} />\n </Flex>\n </Tooltip>\n </Flex>\n </Box>","dragBadge && (\n <Card tone=\"default\" marginRight={4} radius={5}>\n <AvatarCounter count={dragBadge} />\n </Card>\n )","<Flex align=\"center\">\n <Box paddingX={2} style={{flexShrink: 0}}>\n <Text size={2}>\n <DragHandleIcon cursor=\"grab\" />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index - 1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Box style={{width: `100%`}}>\n <Flex flex={1} align=\"center\" justify=\"space-between\" paddingRight={3}>\n <Preview layout=\"default\" value={doc} schemaType={schemaType} />\n\n <Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n <DocumentVersionsStatusIndicator documentVersions={versions} />\n </Flex>\n </Tooltip>\n </Flex>\n </Box>\n {dragBadge && (\n <Card tone=\"default\" marginRight={4} radius={5}>\n <AvatarCounter count={dragBadge} />\n </Card>\n )}\n </Flex>","<PreviewCard\n __unstable_focusRing\n as={ChildLink}\n data-as=\"a\"\n data-ui=\"PaneItem\"\n radius={2}\n pressed={pressed}\n selected={selected}\n sizing=\"border\"\n tabIndex={-1}\n tone=\"inherit\"\n width=\"100%\"\n flex={1}\n childId={doc._id}\n >\n <Flex align=\"center\">\n <Box paddingX={2} style={{flexShrink: 0}}>\n <Text size={2}>\n <DragHandleIcon cursor=\"grab\" />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index - 1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Box style={{width: `100%`}}>\n <Flex flex={1} align=\"center\" justify=\"space-between\" paddingRight={3}>\n <Preview layout=\"default\" value={doc} schemaType={schemaType} />\n\n <Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n <DocumentVersionsStatusIndicator documentVersions={versions} />\n </Flex>\n </Tooltip>\n </Flex>\n </Box>\n {dragBadge && (\n <Card tone=\"default\" marginRight={4} radius={5}>\n <AvatarCounter count={dragBadge} />\n </Card>\n )}\n </Flex>\n </PreviewCard>","{apiVersion: API_VERSION}","useClient({apiVersion: API_VERSION}).withConfig({perspective: perspectiveStack})","useClient({apiVersion: API_VERSION})","{data, listIsUpdating, setListIsUpdating}: DraggableListProps","currentDoc ? [currentDoc] : []","() => setSelectedIds([])","useCallback(() => setSelectedIds([]), [setSelectedIds])","(clickedId: string, index: number, nativeEvent: MouseEvent) => {\n const isSelected = selectedIds.includes(clickedId)\n const selectMultiple = nativeEvent.shiftKey\n const isUsingWindows = navigator.appVersion.indexOf('Win') !== -1\n const selectAdditional = isUsingWindows ? nativeEvent.ctrlKey : nativeEvent.metaKey\n\n let updatedIds: string[] = []\n\n // No modifier keys pressed during click:\n // - update selected to just this one\n // - open document\n if (!selectMultiple && !selectAdditional) {\n return setSelectedIds([clickedId])\n }\n\n // If shift key was held, prevent default to avoid new window opening\n if (selectMultiple) {\n nativeEvent.preventDefault()\n }\n\n // Shift key was held, add id's between last selected and this one\n // ...before adding this one\n if (selectMultiple && !isSelected) {\n const lastSelectedId = selectedIds[selectedIds.length - 1] ?? clickedId\n const lastSelectedIndex = displayedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = displayedData\n .filter((_, itemIndex) => itemIndex > firstSelected && itemIndex < lastSelected)\n .map((item) => item._id)\n\n updatedIds = [...selectedIds, ...betweenIds, clickedId]\n } else if (isSelected) {\n // Toggle off a single id\n updatedIds = selectedIds.filter((id) => id !== clickedId)\n } else {\n // Toggle on a single id\n updatedIds = [...selectedIds, clickedId]\n }\n\n return setSelectedIds(updatedIds)\n }","(item) => item._id","useCallback(\n (clickedId: string, index: number, nativeEvent: MouseEvent) => {\n const isSelected = selectedIds.includes(clickedId)\n const selectMultiple = nativeEvent.shiftKey\n const isUsingWindows = navigator.appVersion.indexOf('Win') !== -1\n const selectAdditional = isUsingWindows ? nativeEvent.ctrlKey : nativeEvent.metaKey\n\n let updatedIds: string[] = []\n\n // No modifier keys pressed during click:\n // - update selected to just this one\n // - open document\n if (!selectMultiple && !selectAdditional) {\n return setSelectedIds([clickedId])\n }\n\n // If shift key was held, prevent default to avoid new window opening\n if (selectMultiple) {\n nativeEvent.preventDefault()\n }\n\n // Shift key was held, add id's between last selected and this one\n // ...before adding this one\n if (selectMultiple && !isSelected) {\n const lastSelectedId = selectedIds[selectedIds.length - 1] ?? clickedId\n const lastSelectedIndex = displayedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = displayedData\n .filter((_, itemIndex) => itemIndex > firstSelected && itemIndex < lastSelected)\n .map((item) => item._id)\n\n updatedIds = [...selectedIds, ...betweenIds, clickedId]\n } else if (isSelected) {\n // Toggle off a single id\n updatedIds = selectedIds.filter((id) => id !== clickedId)\n } else {\n // Toggle on a single id\n updatedIds = [...selectedIds, clickedId]\n }\n\n return setSelectedIds(updatedIds)\n },\n [displayedData, selectedIds],\n )","async (patches: [string, PatchOperations][], message: string) => {\n const transaction = client.transaction()\n\n patches.forEach(([docId, ops]) => {\n transaction.patch(docId, ops)\n })\n\n try {\n const updated = await transaction.commit({\n visibility: 'sync',\n tag: 'orderable-document-list.reorder',\n })\n clearSelected()\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: `${\n updated.results.length === 1 ? '1 document' : `${updated.results.length} documents`\n } reordered`,\n status: 'success',\n description: message,\n })\n } catch {\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: 'Reordering failed',\n status: 'error',\n })\n }\n }","[docId, ops]","useCallback(\n async (patches: [string, PatchOperations][], message: string) => {\n const transaction = client.transaction()\n\n patches.forEach(([docId, ops]) => {\n transaction.patch(docId, ops)\n })\n\n try {\n const updated = await transaction.commit({\n visibility: 'sync',\n tag: 'orderable-document-list.reorder',\n })\n clearSelected()\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: `${\n updated.results.length === 1 ? '1 document' : `${updated.results.length} documents`\n } reordered`,\n status: 'success',\n description: message,\n })\n } catch {\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: 'Reordering failed',\n status: 'error',\n })\n }\n },\n [client, clearSelected, setListIsUpdating, toast],\n )","(result: DragResultLike | undefined, entities: SanityDocumentWithOrder[]) => {\n setDraggingId('')\n\n const {source, destination, draggableId} = result ?? {}\n\n // Don't do anything if nothing changed\n if (source?.index === destination?.index) return\n\n // Don't do anything if we don't have the entitites\n if (!entities.length || !draggableId || !source || !destination) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds.length > 0 ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (effectedIds.length === 0) return\n\n // Update state to update styles + prevent data refetching\n setListIsUpdating(true)\n setSelectedIds(effectedIds)\n\n const {newOrder, patches, message} = reorderDocuments({\n entities,\n selectedIds: effectedIds,\n source,\n destination,\n })\n\n // Update local state\n if (newOrder.length > 0) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches.length > 0) {\n void transactPatches(patches, message)\n }\n }","selectedIds.length","patches","message","useCallback(\n (result: DragResultLike | undefined, entities: SanityDocumentWithOrder[]) => {\n setDraggingId('')\n\n const {source, destination, draggableId} = result ?? {}\n\n // Don't do anything if nothing changed\n if (source?.index === destination?.index) return\n\n // Don't do anything if we don't have the entitites\n if (!entities.length || !draggableId || !source || !destination) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds.length > 0 ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (effectedIds.length === 0) return\n\n // Update state to update styles + prevent data refetching\n setListIsUpdating(true)\n setSelectedIds(effectedIds)\n\n const {newOrder, patches, message} = reorderDocuments({\n entities,\n selectedIds: effectedIds,\n source,\n destination,\n })\n\n // Update local state\n if (newOrder.length > 0) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches.length > 0) {\n void transactPatches(patches, message)\n }\n },\n [selectedIds, transactPatches, setListIsUpdating],\n )","(start: {draggableId: string}) => {\n const id = start.draggableId\n const selected = selectedIds.includes(id)\n\n // if dragging an item that is not selected - unselect all items\n if (!selected) clearSelected()\n\n setDraggingId(id)\n }","id","useCallback(\n (start: {draggableId: string}) => {\n const id = start.draggableId\n const selected = selectedIds.includes(id)\n\n // if dragging an item that is not selected - unselect all items\n if (!selected) clearSelected()\n\n setDraggingId(id)\n },\n [selectedIds, clearSelected],\n )","(shiftFrom: number, shiftTo: number, id: string, entities: SanityDocumentWithOrder[]) => {\n const result: DragResultLike = {\n draggableId: id,\n source: {droppableId: 'documentSortZone', index: shiftFrom},\n destination: {droppableId: 'documentSortZone', index: shiftTo},\n }\n\n return handleDragEnd(result, entities)\n }","result","entities","useCallback(\n (shiftFrom: number, shiftTo: number, id: string, entities: SanityDocumentWithOrder[]) => {\n const result: DragResultLike = {\n draggableId: id,\n source: {droppableId: 'documentSortZone', index: shiftFrom},\n destination: {droppableId: 'documentSortZone', index: shiftTo},\n }\n\n return handleDragEnd(result, entities)\n },\n [handleDragEnd],\n )","(event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n clearSelected()\n }\n }","useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n clearSelected()\n }\n },\n [clearSelected],\n )","[onWindowKeyDown]","() => {\n window.addEventListener('keydown', onWindowKeyDown)\n\n return () => {\n window.removeEventListener('keydown', onWindowKeyDown)\n }\n }","useMemo(() => {\n if (displayedData.length === 0) return []\n\n const orderField = displayedData.map((item) => item[ORDER_FIELD_NAME])\n\n return orderField.filter((item, index) => orderField.indexOf(item) !== index)\n }, [displayedData])","[]","orderField.filter((item, index) => orderField.indexOf(item) !== index)","(item) => item[ORDER_FIELD_NAME]","item","index","(result: DropResult) => handleDragEnd(result, displayedData)","useCallback(\n (result: DropResult) => handleDragEnd(result, displayedData),\n [displayedData, handleDragEnd],\n )","<Droppable droppableId=\"documentSortZone\">\n {(provided) => (\n <div {...provided.droppableProps} ref={provided.innerRef}>\n {displayedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n >\n {(innerProvided, innerSnapshot) => {\n const isSelected = selectedIds.includes(item._id)\n const isDragging = innerSnapshot.isDragging\n const isGhosting = Boolean(!isDragging && draggingId && isSelected)\n const isUpdating = listIsUpdating && isSelected\n const isDisabled = !item[ORDER_FIELD_NAME]\n const isDuplicate = duplicateOrders.includes(item[ORDER_FIELD_NAME])\n const tone = cardTone({isDuplicate, isGhosting, isDragging, isSelected})\n const selectedCount = selectedIds.length\n\n const dragBadge = isDragging && selectedCount > 1 ? selectedCount : false\n\n return (\n <div\n ref={innerProvided.innerRef}\n {...innerProvided.draggableProps}\n {...innerProvided.dragHandleProps}\n style={\n isDisabled\n ? {opacity: 0.2, pointerEvents: 'none'}\n : getItemStyle(innerProvided.draggableProps.style, isUpdating)\n }\n >\n <Box paddingBottom={1}>\n <Card\n tone={tone}\n shadow={isDragging ? 2 : undefined}\n radius={2}\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={displayedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === displayedData.length - 1}\n dragBadge={dragBadge}\n />\n </Card>\n </Box>\n </div>\n )\n }}\n </Draggable>\n ))}\n {provided.placeholder}\n </div>\n )}\n </Droppable>","displayedData.length","isSelected","<DragDropContext onDragStart={handleDragStart} onDragEnd={onDragEnd}>\n <Droppable droppableId=\"documentSortZone\">\n {(provided) => (\n <div {...provided.droppableProps} ref={provided.innerRef}>\n {displayedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n >\n {(innerProvided, innerSnapshot) => {\n const isSelected = selectedIds.includes(item._id)\n const isDragging = innerSnapshot.isDragging\n const isGhosting = Boolean(!isDragging && draggingId && isSelected)\n const isUpdating = listIsUpdating && isSelected\n const isDisabled = !item[ORDER_FIELD_NAME]\n const isDuplicate = duplicateOrders.includes(item[ORDER_FIELD_NAME])\n const tone = cardTone({isDuplicate, isGhosting, isDragging, isSelected})\n const selectedCount = selectedIds.length\n\n const dragBadge = isDragging && selectedCount > 1 ? selectedCount : false\n\n return (\n <div\n ref={innerProvided.innerRef}\n {...innerProvided.draggableProps}\n {...innerProvided.dragHandleProps}\n style={\n isDisabled\n ? {opacity: 0.2, pointerEvents: 'none'}\n : getItemStyle(innerProvided.draggableProps.style, isUpdating)\n }\n >\n <Box paddingBottom={1}>\n <Card\n tone={tone}\n shadow={isDragging ? 2 : undefined}\n radius={2}\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={displayedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === displayedData.length - 1}\n dragBadge={dragBadge}\n />\n </Card>\n </Box>\n </div>\n )\n }}\n </Draggable>\n ))}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>","getDocumentQuery(props)","[]","{\n params: queryParams,\n initialValue: [],\n }","Array.isArray(_queryData) ? _queryData : []","useMemo(() => (Array.isArray(_queryData) ? _queryData : []), [_queryData])","getFilteredDedupedDocs(queryData, props.currentVersion)","currentVersion","useMemo(\n () => getFilteredDedupedDocs(queryData, props.currentVersion),\n [props.currentVersion, queryData],\n )","data.filter((doc) => !doc[ORDER_FIELD_NAME])","(doc) => !doc[ORDER_FIELD_NAME]","{width: `100%`, height: `100%`}","<Flex style={{width: `100%`, height: `100%`}} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>","<Box padding={2}>\n <Feedback tone=\"critical\" title=\"There was an error\" description=\"Please try again later\" />\n </Box>","<Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\">\n <Container width={1}>\n <Box paddingX={4} paddingY={5}>\n <Text align=\"center\" muted>\n No documents of this type\n </Text>\n </Box>\n </Container>\n </Flex>","{overflow: `auto`, height: `100%`}","unorderedDataCount > 0 && (\n <Box marginBottom={2}>\n <Feedback\n tone=\"caution\"\n description={\n <>\n {unorderedDataCount}/{data.length} documents have no order. Select{' '}\n <strong>Reset Order</strong> from the menu above to fix.\n </>\n }\n />\n </Box>\n )","length","<DraggableList\n data={data}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />","<Stack gap={1} style={{overflow: `auto`, height: `100%`}}>\n <Box padding={2}>\n {unorderedDataCount > 0 && (\n <Box marginBottom={2}>\n <Feedback\n tone=\"caution\"\n description={\n <>\n {unorderedDataCount}/{data.length} documents have no order. Select{' '}\n <strong>Reset Order</strong> from the menu above to fix.\n </>\n }\n />\n </Box>\n )}\n <DraggableList\n data={data}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />\n </Box>\n </Stack>","{\n type,\n showIncrements,\n resetOrderTransaction,\n filter,\n params,\n currentVersion,\n}: DocumentListWrapperProps","{showIncrements}","useMemo(() => ({showIncrements}), [showIncrements])","() => {\n if (resetOrderTransaction?.title && resetOrderTransaction?.status) {\n toast.push(resetOrderTransaction)\n }\n }","[resetOrderTransaction, toast]","resetOrderTransaction?.title","useMemo(() => {\n // Option not passed\n if (!type) {\n return (\n <>\n No <code>type</code> was configured\n </>\n )\n }\n\n const typeSchema = schema.get(type)\n\n // Schema not found\n if (!typeSchema) {\n return (\n <>\n Schema <code>{type}</code> not found\n </>\n )\n }\n\n // Schema lacks an order field\n if (\n !('fields' in typeSchema) ||\n !typeSchema.fields.some((field) => field?.name === ORDER_FIELD_NAME)\n ) {\n return (\n <>\n Schema <code>{type}</code> must have an <code>{ORDER_FIELD_NAME}</code> field of type{' '}\n <code>string</code>\n </>\n )\n }\n\n // Schema's order field is not a string\n if (\n 'fields' in typeSchema &&\n typeSchema.fields.some(\n (field) => field?.name === ORDER_FIELD_NAME && field?.type?.name !== 'string',\n )\n ) {\n return (\n <>\n <code>{ORDER_FIELD_NAME}</code> field on Schema <code>{type}</code> must be{' '}\n <code>string</code> type\n </>\n )\n }\n\n return ''\n }, [type, schema])","<>\n No <code>type</code> was configured\n </>","<>\n Schema <code>{type}</code> not found\n </>","(field) => field?.name === ORDER_FIELD_NAME","<code>{type}</code>","<code>{ORDER_FIELD_NAME}</code>","<code>string</code>","<>\n Schema <code>{type}</code> must have an <code>{ORDER_FIELD_NAME}</code> field of type{' '}\n <code>string</code>\n </>","(field) => field?.name === ORDER_FIELD_NAME && field?.type?.name !== 'string'","<>\n <code>{ORDER_FIELD_NAME}</code> field on Schema <code>{type}</code> must be{' '}\n <code>string</code> type\n </>","<Box padding={2}>\n <Feedback description={schemaIsInvalid} tone=\"caution\" />\n </Box>","<DocumentListQuery\n type={type}\n filter={filter}\n params={params}\n currentVersion={currentVersion}\n />","<OrderableContext.Provider value={orderableContextValue}>\n <DocumentListQuery\n type={type}\n filter={filter}\n params={params}\n currentVersion={currentVersion}\n />\n </OrderableContext.Provider>","OrderableContext.Provider","field","{options, ref}: OrderableDocumentListProps","{}","() => ({\n actionHandlers: {\n showIncrements: () => {\n setShowIncrements((state) => !state)\n },\n\n resetOrder: async () => {\n setResetOrderTransaction({\n status: `info`,\n title: `Reordering started...`,\n closable: true,\n })\n\n const update = await resetOrder(options)\n\n const reorderWasSuccessful = update?.results?.length\n\n setResetOrderTransaction({\n status: reorderWasSuccessful ? `success` : `info`,\n title: reorderWasSuccessful\n ? `Reordered ${update.results.length === 1 ? `Document` : `Documents`}`\n : `Reordering failed`,\n closable: true,\n })\n },\n },\n // The pane stores this handle in state, so only re-create it when needed\n // to avoid update loops.\n })","[options]","(state) => !state","<DocumentListWrapper\n filter={filter}\n params={params}\n type={type}\n showIncrements={showIncrements}\n resetOrderTransaction={resetOrderTransaction}\n currentVersion={currentVersion}\n />"],"sources":["../src/helpers/constants.ts","../src/helpers/parseOrderRank.ts","../src/helpers/initialRank.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/OrderableContext.ts","../src/Document.tsx","../src/helpers/client.ts","../src/helpers/reorderDocuments.ts","../src/DraggableList.tsx","../src/helpers/getFilteredDedupedDocs.ts","../src/helpers/query.ts","../src/DocumentListQuery.tsx","../src/DocumentListWrapper.tsx","../src/helpers/resetOrder.ts","../src/OrderableDocumentList.tsx","../src/desk-structure/orderableDocumentListDeskItem.ts"],"sourcesContent":["export const ORDER_FIELD_NAME = `orderRank` as const\n\n// same version we are using in the vision plugin\nexport const API_VERSION = `v2025-06-27` as const\n","import {LexoRank} from 'lexorank'\n\n// Safely parse a LexoRank string; fall back if invalid\nexport function parseOrderRank(value: unknown, fallback: LexoRank): LexoRank {\n if (typeof value !== 'string') {\n console.warn('[orderable-document-list] Invalid orderRank value (expected string):', value)\n return fallback\n }\n\n try {\n return LexoRank.parse(value)\n } catch (err) {\n console.warn(\n '[orderable-document-list] Failed to parse orderRank value:',\n value,\n 'Error:',\n err instanceof Error ? err.message : String(err),\n )\n return fallback\n }\n}\n","import {LexoRank} from 'lexorank'\n\nimport type {NewItemPosition} from '../types'\nimport {parseOrderRank} from './parseOrderRank'\n\n// Use in initial value field by passing in the rank value of the last document\n// If not value passed, generate a sensibly low rank\nexport function initialRank(\n compareRankValue: unknown = ``,\n newItemPosition: NewItemPosition = 'after',\n) {\n const compareRank = parseOrderRank(compareRankValue, LexoRank.min())\n const rank =\n newItemPosition === 'before' ? compareRank.genPrev().genPrev() : compareRank.genNext().genNext()\n\n return rank.toString()\n}\n","import {defineField, type FieldDefinition, type StringDefinition} from 'sanity'\n\nimport {API_VERSION, ORDER_FIELD_NAME} from '../helpers/constants'\nimport {initialRank} from '../helpers/initialRank'\nimport type {NewItemPosition} from '../types'\n\nexport interface RankFieldConfig extends Partial<\n Omit<StringDefinition, 'name' | 'type' | 'initialValue'>\n> {\n type: string\n newItemPosition?: NewItemPosition\n}\n\nexport const orderRankField = (config: RankFieldConfig): FieldDefinition<'string'> => {\n if (!config?.type) {\n throw new Error(\n `\n type must be provided.\n Example: orderRankField({type: 'category'})\n `,\n )\n }\n\n const {type, newItemPosition = 'after', ...rest} = config\n return defineField({\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...rest,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async (value, {getClient}) => {\n void value\n const direction = newItemPosition === 'before' ? 'asc' : 'desc'\n\n const lastDocOrderRank = await getClient({apiVersion: API_VERSION}).fetch<string | undefined>(\n `*[_type == $type]|order(@[$order] ${direction})[0][$order]`,\n {type, order: ORDER_FIELD_NAME},\n {tag: 'orderable-document-list.last-doc-order-rank'},\n )\n return initialRank(lastDocOrderRank, newItemPosition)\n },\n })\n}\n","import type {SortOrdering} from 'sanity'\n\nimport {ORDER_FIELD_NAME} from '../helpers/constants'\n\nexport const orderRankOrdering: SortOrdering = {\n title: 'Ordered',\n name: 'ordered',\n by: [{field: ORDER_FIELD_NAME, direction: 'asc'}],\n}\n","import {createContext} from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = createContext<OrderableContextValue>({})\n","import {ChevronDownIcon} from '@sanity/icons/ChevronDown'\nimport {ChevronUpIcon} from '@sanity/icons/ChevronUp'\nimport {DragHandleIcon} from '@sanity/icons/DragHandle'\nimport {AvatarCounter, Card, Box, Button, Flex, Text} from '@sanity/ui'\nimport {Tooltip} from '@sanity/ui/tooltip'\nimport {useContext} from 'react'\nimport {\n useSchema,\n PreviewCard,\n Preview,\n DocumentVersionsStatusIndicator,\n DocumentStatus,\n useDocumentVersionInfo,\n useDocumentVersions,\n getPublishedId,\n} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\n\nimport {OrderableContext} from './OrderableContext'\nimport type {SanityDocumentWithOrder} from './types'\n\nexport interface DocumentProps {\n doc: SanityDocumentWithOrder\n entities: SanityDocumentWithOrder[]\n increment: (\n index: number,\n nextIndex: number,\n docId: string,\n entities: SanityDocumentWithOrder[],\n ) => void\n index: number\n isFirst: boolean\n isLast: boolean\n dragBadge: number | false\n}\n\nexport function Document({\n doc,\n increment,\n entities,\n index,\n isFirst,\n isLast,\n dragBadge,\n}: DocumentProps) {\n const {showIncrements} = useContext(OrderableContext)\n const schema = useSchema()\n const router = usePaneRouter()\n // oxlint-disable-next-line typescript/no-deprecated -- the replacement, `useDocumentVersions`, would require reimplementing the internal (unexported) `getDocumentVersionInfoFromVersions` util for the DocumentStatus tooltip\n const versionsInfo = useDocumentVersionInfo(doc._id)\n const {versions} = useDocumentVersions({documentId: getPublishedId(doc._id)})\n\n const {ChildLink, groupIndex, routerPanesState} = router\n\n const currentDoc = routerPanesState[groupIndex + 1]?.[0]?.id || false\n const pressed = currentDoc === doc._id || currentDoc === doc._id.replace(`drafts.`, ``)\n const selected = pressed && routerPanesState.length === groupIndex + 2\n const schemaType = schema.get(doc._type)\n\n if (!schemaType) {\n return null\n }\n\n const tooltip = (\n <DocumentStatus\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\n )\n\n return (\n <PreviewCard\n __unstable_focusRing\n as={ChildLink}\n data-as=\"a\"\n data-ui=\"PaneItem\"\n radius={2}\n pressed={pressed}\n selected={selected}\n sizing=\"border\"\n tabIndex={-1}\n tone=\"inherit\"\n width=\"100%\"\n flex={1}\n childId={doc._id}\n >\n <Flex align=\"center\">\n <Box paddingX={2} style={{flexShrink: 0}}>\n <Text size={2}>\n <DragHandleIcon cursor=\"grab\" />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index - 1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Box style={{width: `100%`}}>\n <Flex flex={1} align=\"center\" justify=\"space-between\" paddingRight={3}>\n <Preview layout=\"default\" value={doc} schemaType={schemaType} />\n\n <Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n <DocumentVersionsStatusIndicator documentVersions={versions} />\n </Flex>\n </Tooltip>\n </Flex>\n </Box>\n {dragBadge && (\n <Card tone=\"default\" marginRight={4} radius={5}>\n <AvatarCounter count={dragBadge} />\n </Card>\n )}\n </Flex>\n </PreviewCard>\n )\n}\n","import {type SanityClient, useClient, usePerspective} from 'sanity'\n\nimport {API_VERSION} from './constants'\n\nexport function useSanityClient(): SanityClient {\n const {perspectiveStack} = usePerspective()\n\n return useClient({apiVersion: API_VERSION}).withConfig({perspective: perspectiveStack})\n}\n","import type {DraggableLocation} from '@hello-pangea/dnd'\nimport {LexoRank} from 'lexorank'\nimport type {PatchOperations} from 'sanity'\n\nimport type {SanityDocumentWithOrder} from '../types'\nimport {ORDER_FIELD_NAME} from './constants'\nimport {parseOrderRank} from './parseOrderRank'\n\nexport interface ReorderArgs {\n entities: SanityDocumentWithOrder[]\n selectedIds: string[]\n source: DraggableLocation\n destination: DraggableLocation\n}\n\nexport interface ReorderReturn {\n newOrder: SanityDocumentWithOrder[]\n patches: [string, PatchOperations][]\n message: string\n}\n\nfunction lexicographicalSort(a: SanityDocumentWithOrder, b: SanityDocumentWithOrder) {\n if (!a[ORDER_FIELD_NAME] || !b[ORDER_FIELD_NAME]) {\n return 0\n } else if (a[ORDER_FIELD_NAME] < b[ORDER_FIELD_NAME]) {\n return -1\n } else if (a[ORDER_FIELD_NAME] > b[ORDER_FIELD_NAME]) {\n return 1\n }\n return 0\n}\n\nexport const reorderDocuments = ({\n entities,\n selectedIds,\n source,\n destination,\n}: ReorderArgs): ReorderReturn => {\n const startIndex = source.index\n const endIndex = destination.index\n const isMovingUp = startIndex > endIndex\n const selectedItems = entities.filter((item) => selectedIds.includes(item._id))\n const message = [\n 'Moved',\n selectedItems.length === 1 ? '1 document' : `${selectedItems.length} documents`,\n isMovingUp ? 'up' : 'down',\n 'from position',\n `${startIndex + 1} to ${endIndex + 1}`,\n ].join(' ')\n\n const {all, selected} = entities.reduce<{\n all: SanityDocumentWithOrder[]\n selected: SanityDocumentWithOrder[]\n }>(\n (acc, cur, curIndex) => {\n // Selected items get spread in below, so skip them here\n if (selectedIds.includes(cur._id)) {\n return {all: acc.all, selected: acc.selected}\n }\n\n // Drop selected items in\n if (curIndex === endIndex) {\n const prevIndex = curIndex - 1\n const prevRank = parseOrderRank(entities[prevIndex]?.[ORDER_FIELD_NAME], LexoRank.min())\n const curRank = parseOrderRank(cur[ORDER_FIELD_NAME], LexoRank.min())\n const nextIndex = curIndex + 1\n const nextRank = parseOrderRank(entities[nextIndex]?.[ORDER_FIELD_NAME], LexoRank.max())\n\n let betweenRank = isMovingUp ? prevRank.between(curRank) : curRank.between(nextRank)\n\n // For each selected item, assign a new orderRank between now and next\n for (const selectedItem of selectedItems) {\n selectedItem[ORDER_FIELD_NAME] = betweenRank.toString()\n betweenRank = isMovingUp ? betweenRank.between(curRank) : betweenRank.between(nextRank)\n }\n\n return {\n // The `all` array gets sorted by order field later anyway\n // so that this probably isn't necessary ¯\\_(ツ)_/¯\n all: isMovingUp\n ? [...acc.all, ...selectedItems, cur]\n : [...acc.all, cur, ...selectedItems],\n selected: selectedItems,\n }\n }\n\n return {all: [...acc.all, cur], selected: acc.selected}\n },\n {all: [], selected: []},\n )\n\n const patches = selected.flatMap((doc) => {\n const docPatches: [string, PatchOperations][] = [\n [\n doc._id,\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ],\n ]\n\n // If it's a draft, we need to patch the published document as well\n if (doc._id.startsWith('drafts.') && doc.hasPublished) {\n docPatches.push([\n doc._id.replace('drafts.', ''),\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ])\n }\n\n return docPatches\n })\n\n // Safety-check to make sure everything is in order\n const allSorted = all.sort(lexicographicalSort)\n\n return {newOrder: allSorted, patches, message}\n}\n","import {\n DragDropContext,\n Draggable,\n Droppable,\n type DropResult,\n type DraggableLocation,\n} from '@hello-pangea/dnd'\nimport {Box, Card} from '@sanity/ui'\nimport {useToast} from '@sanity/ui/toast'\nimport {useEffect, useState, useMemo, useCallback, type CSSProperties} from 'react'\nimport type {PatchOperations} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\n\nimport {Document} from './Document'\nimport {useSanityClient} from './helpers/client'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport type {SanityDocumentWithOrder} from './types'\n\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\n}\n\ninterface DragResultLike {\n draggableId: string\n source: DraggableLocation\n destination: DraggableLocation | null\n}\n\nexport interface DraggableListProps {\n data: SanityDocumentWithOrder[]\n listIsUpdating: boolean\n setListIsUpdating: (val: boolean) => void\n}\n\nconst getItemStyle = (\n draggableStyle: CSSProperties | undefined,\n itemIsUpdating: boolean,\n): CSSProperties => ({\n userSelect: 'none',\n transition: 'opacity 500ms ease-in-out',\n opacity: itemIsUpdating ? 0.2 : 1,\n pointerEvents: itemIsUpdating ? 'none' : undefined,\n ...draggableStyle,\n})\n\nconst cardTone = (settings: ListSetting) => {\n const {isDuplicate, isGhosting, isDragging, isSelected} = settings\n\n if (isGhosting) return 'transparent'\n if (isDragging || isSelected) return 'primary'\n if (isDuplicate) return 'caution'\n\n return undefined\n}\n\nexport function DraggableList({data, listIsUpdating, setListIsUpdating}: DraggableListProps) {\n const toast = useToast()\n const router = usePaneRouter()\n const {groupIndex, routerPanesState} = router\n\n const currentDoc = routerPanesState[groupIndex + 1]?.[0]?.id || false\n\n // Maintains local state order before transaction completes\n const [orderedData, setOrderedData] = useState<SanityDocumentWithOrder[]>(data)\n const displayedData = listIsUpdating ? orderedData : data\n\n const [draggingId, setDraggingId] = useState('')\n const [selectedIds, setSelectedIds] = useState<string[]>(currentDoc ? [currentDoc] : [])\n\n const clearSelected = useCallback(() => setSelectedIds([]), [setSelectedIds])\n\n const handleSelect = useCallback(\n (clickedId: string, index: number, nativeEvent: MouseEvent) => {\n const isSelected = selectedIds.includes(clickedId)\n const selectMultiple = nativeEvent.shiftKey\n const isUsingWindows = navigator.appVersion.indexOf('Win') !== -1\n const selectAdditional = isUsingWindows ? nativeEvent.ctrlKey : nativeEvent.metaKey\n\n let updatedIds: string[] = []\n\n // No modifier keys pressed during click:\n // - update selected to just this one\n // - open document\n if (!selectMultiple && !selectAdditional) {\n return setSelectedIds([clickedId])\n }\n\n // If shift key was held, prevent default to avoid new window opening\n if (selectMultiple) {\n nativeEvent.preventDefault()\n }\n\n // Shift key was held, add id's between last selected and this one\n // ...before adding this one\n if (selectMultiple && !isSelected) {\n const lastSelectedId = selectedIds[selectedIds.length - 1] ?? clickedId\n const lastSelectedIndex = displayedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = displayedData\n .filter((_, itemIndex) => itemIndex > firstSelected && itemIndex < lastSelected)\n .map((item) => item._id)\n\n updatedIds = [...selectedIds, ...betweenIds, clickedId]\n } else if (isSelected) {\n // Toggle off a single id\n updatedIds = selectedIds.filter((id) => id !== clickedId)\n } else {\n // Toggle on a single id\n updatedIds = [...selectedIds, clickedId]\n }\n\n return setSelectedIds(updatedIds)\n },\n [displayedData, selectedIds],\n )\n\n const client = useSanityClient()\n\n const transactPatches = useCallback(\n async (patches: [string, PatchOperations][], message: string) => {\n const transaction = client.transaction()\n\n patches.forEach(([docId, ops]) => {\n transaction.patch(docId, ops)\n })\n\n try {\n const updated = await transaction.commit({\n visibility: 'sync',\n tag: 'orderable-document-list.reorder',\n })\n clearSelected()\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: `${\n updated.results.length === 1 ? '1 document' : `${updated.results.length} documents`\n } reordered`,\n status: 'success',\n description: message,\n })\n } catch {\n setDraggingId('')\n setListIsUpdating(false)\n toast.push({\n title: 'Reordering failed',\n status: 'error',\n })\n }\n },\n [client, clearSelected, setListIsUpdating, toast],\n )\n\n const handleDragEnd = useCallback(\n (result: DragResultLike | undefined, entities: SanityDocumentWithOrder[]) => {\n setDraggingId('')\n\n const {source, destination, draggableId} = result ?? {}\n\n // Don't do anything if nothing changed\n if (source?.index === destination?.index) return\n\n // Don't do anything if we don't have the entitites\n if (!entities.length || !draggableId || !source || !destination) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds.length > 0 ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (effectedIds.length === 0) return\n\n // Update state to update styles + prevent data refetching\n setListIsUpdating(true)\n setSelectedIds(effectedIds)\n\n const {newOrder, patches, message} = reorderDocuments({\n entities,\n selectedIds: effectedIds,\n source,\n destination,\n })\n\n // Update local state\n if (newOrder.length > 0) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches.length > 0) {\n void transactPatches(patches, message)\n }\n },\n [selectedIds, transactPatches, setListIsUpdating],\n )\n\n const handleDragStart = useCallback(\n (start: {draggableId: string}) => {\n const id = start.draggableId\n const selected = selectedIds.includes(id)\n\n // if dragging an item that is not selected - unselect all items\n if (!selected) clearSelected()\n\n setDraggingId(id)\n },\n [selectedIds, clearSelected],\n )\n\n // Move one document up or down one place, by fake invoking the drag function\n const incrementIndex = useCallback(\n (shiftFrom: number, shiftTo: number, id: string, entities: SanityDocumentWithOrder[]) => {\n const result: DragResultLike = {\n draggableId: id,\n source: {droppableId: 'documentSortZone', index: shiftFrom},\n destination: {droppableId: 'documentSortZone', index: shiftTo},\n }\n\n return handleDragEnd(result, entities)\n },\n [handleDragEnd],\n )\n\n const onWindowKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n clearSelected()\n }\n },\n [clearSelected],\n )\n\n useEffect(() => {\n window.addEventListener('keydown', onWindowKeyDown)\n\n return () => {\n window.removeEventListener('keydown', onWindowKeyDown)\n }\n }, [onWindowKeyDown])\n\n // Find all items with duplicate order field\n const duplicateOrders = useMemo(() => {\n if (displayedData.length === 0) return []\n\n const orderField = displayedData.map((item) => item[ORDER_FIELD_NAME])\n\n return orderField.filter((item, index) => orderField.indexOf(item) !== index)\n }, [displayedData])\n\n const onDragEnd = useCallback(\n (result: DropResult) => handleDragEnd(result, displayedData),\n [displayedData, handleDragEnd],\n )\n\n return (\n <DragDropContext onDragStart={handleDragStart} onDragEnd={onDragEnd}>\n <Droppable droppableId=\"documentSortZone\">\n {(provided) => (\n <div {...provided.droppableProps} ref={provided.innerRef}>\n {displayedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n >\n {(innerProvided, innerSnapshot) => {\n const isSelected = selectedIds.includes(item._id)\n const isDragging = innerSnapshot.isDragging\n const isGhosting = Boolean(!isDragging && draggingId && isSelected)\n const isUpdating = listIsUpdating && isSelected\n const isDisabled = !item[ORDER_FIELD_NAME]\n const isDuplicate = duplicateOrders.includes(item[ORDER_FIELD_NAME])\n const tone = cardTone({isDuplicate, isGhosting, isDragging, isSelected})\n const selectedCount = selectedIds.length\n\n const dragBadge = isDragging && selectedCount > 1 ? selectedCount : false\n\n return (\n <div\n ref={innerProvided.innerRef}\n {...innerProvided.draggableProps}\n {...innerProvided.dragHandleProps}\n style={\n isDisabled\n ? {opacity: 0.2, pointerEvents: 'none'}\n : getItemStyle(innerProvided.draggableProps.style, isUpdating)\n }\n >\n <Box paddingBottom={1}>\n <Card\n tone={tone}\n shadow={isDragging ? 2 : undefined}\n radius={2}\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={displayedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === displayedData.length - 1}\n dragBadge={dragBadge}\n />\n </Card>\n </Box>\n </div>\n )\n }}\n </Draggable>\n ))}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n )\n}\n","import {getPublishedId, getVersionFromId, isDraftId, isPublishedId, isVersionId} from 'sanity'\n\nimport type {SanityDocumentWithOrder} from '../types'\n\nconst isVersionForCurrentPerspective = (\n document: SanityDocumentWithOrder,\n perspectiveName: string,\n publishedId: string,\n) => {\n return (\n document._id &&\n isVersionId(document._id) &&\n getVersionFromId(document._id) === perspectiveName &&\n getPublishedId(document._id) === publishedId\n )\n}\n\n// this removes dedupped docs from the list and makes sure that it keeps the right docs\n// in the list while preserving the order established by the orderRank field\nexport const getFilteredDedupedDocs = (\n documents: SanityDocumentWithOrder[],\n perspectiveName?: string,\n): SanityDocumentWithOrder[] => {\n // Flatten the documents array in case it's nested (like in test data)\n const flatDocuments = documents.flat()\n const dedupedDocuments: SanityDocumentWithOrder[] = []\n\n for (const cur of flatDocuments) {\n if (!cur._id) {\n continue\n }\n\n // Handle version-only documents\n if (isVersionId(cur._id)) {\n const versionFromId = getVersionFromId(cur._id)\n const isCorrectVersion = versionFromId === perspectiveName\n\n // Only include versions that match the current perspective\n if (\n perspectiveName &&\n perspectiveName !== 'drafts' &&\n perspectiveName !== 'published' &&\n isCorrectVersion\n ) {\n dedupedDocuments.push(cur)\n }\n continue\n }\n\n // Handle published perspective - only include published documents\n if (perspectiveName === 'published') {\n if (isPublishedId(cur._id)) {\n dedupedDocuments.push(cur)\n }\n continue\n }\n\n // in situations where the document is not a draft, we need to check if\n // the version should override a published document or a draft\n if (!isDraftId(cur._id)) {\n const publishedId = getPublishedId(cur._id)\n\n // Check if there's a version that matches the perspectiveName\n const hasMatchingVersion =\n perspectiveName && perspectiveName !== 'drafts' && perspectiveName !== 'published'\n ? flatDocuments.some((doc) =>\n isVersionForCurrentPerspective(doc, perspectiveName, publishedId),\n )\n : false\n\n // Check if there's a draft\n const hasDraft = flatDocuments.some((doc) => doc._id === `drafts.${cur._id}`)\n const hasDuplicatePublished = flatDocuments.some((doc) => doc !== cur && doc._id === cur._id)\n\n // Priority: version > draft > published\n // If there's a matching version, skip published\n if (!hasMatchingVersion && !hasDraft && !hasDuplicatePublished) {\n dedupedDocuments.push(cur)\n }\n continue\n }\n\n // For drafts, check if there's a version for this document in version perspective\n if (perspectiveName && perspectiveName !== 'drafts' && perspectiveName !== 'published') {\n const baseId = getPublishedId(cur._id)\n const hasVersion = flatDocuments.some((doc) =>\n isVersionForCurrentPerspective(doc, perspectiveName, baseId),\n )\n\n // If there's a version for this document, skip the draft\n if (hasVersion) {\n continue\n }\n }\n\n // Check if the draft has a published version\n cur.hasPublished = flatDocuments.some((doc) => doc._id === cur._id.replace(`drafts.`, ``))\n\n dedupedDocuments.push(cur)\n }\n\n return dedupedDocuments\n}\n","import {ORDER_FIELD_NAME} from './constants'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n currentVersion?: string\n}\n\nexport interface DocumentListQueryResult {\n query: string\n queryParams: Record<string, string | number | boolean | string[]>\n}\n\nconst DEFAULT_PARAMS = {}\n\nexport function getDocumentQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n currentVersion,\n}: DocumentListQueryProps): DocumentListQueryResult {\n let perspectiveFilter = null\n if (currentVersion === 'published') {\n perspectiveFilter = '!(_id in path(\"drafts.**\")) && !(_id in path(\"versions.**\"))'\n } else if (currentVersion === 'drafts') {\n // Show drafts, and published when no draft exists\n perspectiveFilter = `\n (_id in path(\"drafts.**\") || (!(_id in path(\"drafts.**\")) && !(_id in path(\"versions.**\"))))\n `\n } else {\n // Default behavior: prioritize drafts over published when both exist\n // the priority should be a version\n perspectiveFilter = `(sanity::partOfRelease($currentVersion) || (!(_id in path(\"drafts.**\")) && !(_id in path(\"versions.**\"))) || (_id in path(\"drafts.**\")))`\n }\n\n const querySelect = `*[_type == $type ${perspectiveFilter ? `&& ${perspectiveFilter}` : ''}${filter ? `&& ${filter}` : ''}]`\n const queryOrder = `|order(@[$order] asc)`\n const queryFields = `{_id, _type, ${ORDER_FIELD_NAME}}`\n\n const query = `${querySelect}${queryOrder}${queryFields}`\n const queryParams = {\n ...params,\n type,\n order: ORDER_FIELD_NAME,\n ...(currentVersion && {currentVersion}),\n }\n\n return {query, queryParams}\n}\n","import {Box, Flex, Container, Spinner, Stack, Text} from '@sanity/ui'\nimport {useMemo, useState} from 'react'\nimport {useListeningQuery, Feedback} from 'sanity-plugin-utils'\n\nimport {DraggableList} from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {getFilteredDedupedDocs} from './helpers/getFilteredDedupedDocs'\nimport {getDocumentQuery, type DocumentListQueryProps} from './helpers/query'\nimport type {SanityDocumentWithOrder} from './types'\n\nexport function DocumentListQuery(props: DocumentListQueryProps) {\n const [listIsUpdating, setListIsUpdating] = useState(false)\n\n const {query, queryParams} = getDocumentQuery(props)\n\n const {\n data: _queryData,\n loading,\n error,\n } = useListeningQuery<SanityDocumentWithOrder[]>(query, {\n params: queryParams,\n initialValue: [],\n })\n\n const queryData = useMemo(() => (Array.isArray(_queryData) ? _queryData : []), [_queryData])\n\n const data = useMemo(\n () => getFilteredDedupedDocs(queryData, props.currentVersion),\n [props.currentVersion, queryData],\n )\n\n const unorderedDataCount = useMemo(\n () => data.filter((doc) => !doc[ORDER_FIELD_NAME]).length,\n [data],\n )\n\n if (loading) {\n return (\n <Flex style={{width: `100%`, height: `100%`}} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n }\n\n if (error) {\n return (\n <Box padding={2}>\n <Feedback tone=\"critical\" title=\"There was an error\" description=\"Please try again later\" />\n </Box>\n )\n }\n\n if (data.length === 0) {\n return (\n <Flex align=\"center\" direction=\"column\" height=\"fill\" justify=\"center\">\n <Container width={1}>\n <Box paddingX={4} paddingY={5}>\n <Text align=\"center\" muted>\n No documents of this type\n </Text>\n </Box>\n </Container>\n </Flex>\n )\n }\n\n return (\n <Stack gap={1} style={{overflow: `auto`, height: `100%`}}>\n <Box padding={2}>\n {unorderedDataCount > 0 && (\n <Box marginBottom={2}>\n <Feedback\n tone=\"caution\"\n description={\n <>\n {unorderedDataCount}/{data.length} documents have no order. Select{' '}\n <strong>Reset Order</strong> from the menu above to fix.\n </>\n }\n />\n </Box>\n )}\n <DraggableList\n data={data}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />\n </Box>\n </Stack>\n )\n}\n","import {Box} from '@sanity/ui'\nimport {useToast, type ToastParams} from '@sanity/ui/toast'\nimport {useEffect, useMemo} from 'react'\nimport {useSchema} from 'sanity'\nimport {Feedback} from 'sanity-plugin-utils'\n\nimport {DocumentListQuery} from './DocumentListQuery'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {OrderableContext} from './OrderableContext'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n filter?: string\n params?: Record<string, unknown>\n currentVersion?: string\n}\n\n// 1. Validate first that the schema has been configured for ordering\n// 2. Setup context for showIncrements\nexport function DocumentListWrapper({\n type,\n showIncrements,\n resetOrderTransaction,\n filter,\n params,\n currentVersion,\n}: DocumentListWrapperProps) {\n const toast = useToast()\n const schema = useSchema()\n const orderableContextValue = useMemo(() => ({showIncrements}), [showIncrements])\n\n useEffect(() => {\n if (resetOrderTransaction?.title && resetOrderTransaction?.status) {\n toast.push(resetOrderTransaction)\n }\n }, [resetOrderTransaction, toast])\n\n const schemaIsInvalid = useMemo(() => {\n // Option not passed\n if (!type) {\n return (\n <>\n No <code>type</code> was configured\n </>\n )\n }\n\n const typeSchema = schema.get(type)\n\n // Schema not found\n if (!typeSchema) {\n return (\n <>\n Schema <code>{type}</code> not found\n </>\n )\n }\n\n // Schema lacks an order field\n if (\n !('fields' in typeSchema) ||\n !typeSchema.fields.some((field) => field?.name === ORDER_FIELD_NAME)\n ) {\n return (\n <>\n Schema <code>{type}</code> must have an <code>{ORDER_FIELD_NAME}</code> field of type{' '}\n <code>string</code>\n </>\n )\n }\n\n // Schema's order field is not a string\n if (\n 'fields' in typeSchema &&\n typeSchema.fields.some(\n (field) => field?.name === ORDER_FIELD_NAME && field?.type?.name !== 'string',\n )\n ) {\n return (\n <>\n <code>{ORDER_FIELD_NAME}</code> field on Schema <code>{type}</code> must be{' '}\n <code>string</code> type\n </>\n )\n }\n\n return ''\n }, [type, schema])\n\n if (schemaIsInvalid) {\n return (\n <Box padding={2}>\n <Feedback description={schemaIsInvalid} tone=\"caution\" />\n </Box>\n )\n }\n\n return (\n <OrderableContext.Provider value={orderableContextValue}>\n <DocumentListQuery\n type={type}\n filter={filter}\n params={params}\n currentVersion={currentVersion}\n />\n </OrderableContext.Provider>\n )\n}\n","import type {MultipleMutationResult, SanityClient} from '@sanity/client'\nimport {LexoRank} from 'lexorank'\n\nimport {ORDER_FIELD_NAME} from './constants'\nimport {getDocumentQuery, type DocumentListQueryProps} from './query'\n\nexport interface ResetOrderParams extends DocumentListQueryProps {\n client: SanityClient\n currentVersion?: string\n}\n\n// Function to wipe and re-do ordering with LexoRank\n// Will at least attempt to start with the current order\nexport async function resetOrder(params: ResetOrderParams): Promise<MultipleMutationResult | null> {\n const {client, currentVersion, ...queryProps} = params\n const {query, queryParams} = getDocumentQuery({...queryProps, currentVersion})\n\n const documents = await client.fetch<\n Array<{\n _id: string\n _type: string\n [ORDER_FIELD_NAME]: string\n }>\n >(query, queryParams, {\n tag: 'orderable-document-list.reset-order',\n })\n\n if (documents.length === 0) {\n return null\n }\n\n let aLexoRank = LexoRank.min()\n\n const transaction = documents\n .map((doc) => doc._id)\n .reduce((trx, documentId) => {\n // Generate next rank before even the first document so there's room to move!\n aLexoRank = aLexoRank.genNext().genNext()\n\n return trx.patch(documentId, {\n set: {[ORDER_FIELD_NAME]: aLexoRank.toString()},\n })\n }, client.transaction())\n\n return transaction.commit({\n visibility: 'async',\n tag: 'orderable-document-list.reset-order',\n })\n}\n","import type {SanityClient} from '@sanity/client'\nimport type {ToastParams} from '@sanity/ui/toast'\nimport {useImperativeHandle, useState, type Ref} from 'react'\n\nimport {DocumentListWrapper} from './DocumentListWrapper'\nimport {resetOrder} from './helpers/resetOrder'\n\nexport interface OrderableDocumentListProps {\n options: {\n type: string\n client: SanityClient\n filter?: string\n params?: Record<string, unknown>\n currentVersion?: string\n }\n /**\n * Structure menu actions look up `actionHandlers` on the pane component\n * instance. Expose them via `useImperativeHandle`.\n */\n ref?: Ref<{\n actionHandlers: {\n showIncrements: () => void\n resetOrder: () => Promise<void>\n }\n }>\n}\n\nexport function OrderableDocumentList({options, ref}: OrderableDocumentListProps) {\n const [showIncrements, setShowIncrements] = useState(false)\n const [resetOrderTransaction, setResetOrderTransaction] = useState<ToastParams>({})\n\n useImperativeHandle(\n ref,\n () => ({\n actionHandlers: {\n showIncrements: () => {\n setShowIncrements((state) => !state)\n },\n\n resetOrder: async () => {\n setResetOrderTransaction({\n status: `info`,\n title: `Reordering started...`,\n closable: true,\n })\n\n const update = await resetOrder(options)\n\n const reorderWasSuccessful = update?.results?.length\n\n setResetOrderTransaction({\n status: reorderWasSuccessful ? `success` : `info`,\n title: reorderWasSuccessful\n ? `Reordered ${update.results.length === 1 ? `Document` : `Documents`}`\n : `Reordering failed`,\n closable: true,\n })\n },\n },\n // The pane stores this handle in state, so only re-create it when needed\n // to avoid update loops.\n }),\n [options],\n )\n\n const {type, filter, params, currentVersion} = options\n\n if (!type) {\n return null\n }\n\n return (\n <DocumentListWrapper\n filter={filter}\n params={params}\n type={type}\n showIncrements={showIncrements}\n resetOrderTransaction={resetOrderTransaction}\n currentVersion={currentVersion}\n />\n )\n}\n","import {GenerateIcon} from '@sanity/icons/Generate'\nimport {SortIcon} from '@sanity/icons/Sort'\nimport {type ComponentType} from 'react'\nimport type {ConfigContext} from 'sanity'\nimport {type ListItem, type MenuItem, type StructureBuilder} from 'sanity/structure'\n\nimport {API_VERSION} from '../helpers/constants'\nimport {OrderableDocumentList} from '../OrderableDocumentList'\n\nexport interface OrderableListConfig {\n type: string\n id?: string\n title?: string\n icon?: ComponentType\n params?: Record<string, unknown>\n filter?: string\n menuItems?: MenuItem[]\n createIntent?: boolean\n context: ConfigContext\n S: StructureBuilder\n}\n\nexport function orderableDocumentListDeskItem(config: OrderableListConfig): ListItem {\n if (!config?.type || !config.context || !config.S) {\n throw new Error(`\n type, context and S (StructureBuilder) must be provided.\n context and S are available when configuring structure.\n Example: orderableDocumentListDeskItem({type: 'category'})\n `)\n }\n\n const {type, filter, menuItems = [], createIntent, params, title, icon, id, context, S} = config\n const {schema, getClient} = context\n const maybePerspectiveStack: unknown = Reflect.get(context, 'perspectiveStack')\n const perspectiveStack =\n Array.isArray(maybePerspectiveStack) &&\n maybePerspectiveStack.every((item): item is string => typeof item === 'string')\n ? maybePerspectiveStack\n : []\n const client = getClient({apiVersion: API_VERSION})\n // the first position in the perspective stack is the current version\n const currentVersion = perspectiveStack[0]\n\n const listTitle = title ?? `Orderable ${type}`\n const listId = id ?? `orderable-${type}`\n const listIcon = icon ?? SortIcon\n const typeTitle = schema.get(type)?.title ?? type\n const defaultMenuItems = [...menuItems]\n\n if (createIntent !== false) {\n defaultMenuItems.push(\n S.menuItem()\n .title(`Create new ${typeTitle}`)\n .intent({type: 'create', params: {type}})\n .serialize(),\n )\n }\n\n return S.listItem()\n .title(listTitle)\n .id(listId)\n .icon(listIcon)\n .schemaType(type)\n .child(\n Object.assign(\n S.documentTypeList(type)\n .canHandleIntent(\n (_intentName, params) => createIntent !== false && params?.['type'] === type,\n )\n .serialize(),\n {\n // Prevents the component from re-rendering when switching documents\n __preserveInstance: true,\n // Prevents the component from NOT re-rendering when switching listItems\n key: listId,\n\n type: 'component',\n component: OrderableDocumentList,\n options: {type, filter, params, client, currentVersion},\n menuItems: [\n ...defaultMenuItems,\n S.menuItem().title(`Reset Order`).icon(GenerateIcon).action(`resetOrder`).serialize(),\n S.menuItem()\n .title(`Toggle Increments`)\n .icon(SortIcon)\n .action(`showIncrements`)\n .serialize(),\n ],\n },\n ),\n )\n .serialize()\n}\n"],"mappings":"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"}
\ No newline at end of file