@sanity/orderable-document-list
2.0.262.0.27
~
Modified (6 files)
Index: package/dist/index.js
===================================================================
--- package/dist/index.js
+++ package/dist/index.js
@@ -402,24 +402,19 @@
for (let cur of flatDocuments) if (cur._id) {
if (isVersionId(cur._id)) {
let isCorrectVersion = getVersionFromId(cur._id) === perspectiveName;
perspectiveName && perspectiveName !== "drafts" && perspectiveName !== "published" && isCorrectVersion && dedupedDocuments.push(cur);
- continue;
- }
- if (perspectiveName === "published") {
- isPublishedId(cur._id) && dedupedDocuments.push(cur);
- continue;
- }
- if (!isDraftId(cur._id)) {
+ } else if (perspectiveName === "published") isPublishedId(cur._id) && dedupedDocuments.push(cur);
+ else if (isDraftId(cur._id)) {
+ if (perspectiveName && perspectiveName !== "drafts" && perspectiveName !== "published") {
+ let baseId = getPublishedId(cur._id);
+ if (flatDocuments.some((doc) => isVersionForCurrentPerspective(doc, perspectiveName, baseId))) continue;
+ }
+ cur.hasPublished = flatDocuments.some((doc) => doc._id === cur._id.replace("drafts.", "")), dedupedDocuments.push(cur);
+ } else {
let publishedId = getPublishedId(cur._id), hasMatchingVersion = perspectiveName && perspectiveName !== "drafts" && perspectiveName !== "published" ? flatDocuments.some((doc) => isVersionForCurrentPerspective(doc, perspectiveName, publishedId)) : !1, hasDraft = flatDocuments.some((doc) => doc._id === `drafts.${cur._id}`), hasDuplicatePublished = flatDocuments.some((doc) => doc !== cur && doc._id === cur._id);
!hasMatchingVersion && !hasDraft && !hasDuplicatePublished && dedupedDocuments.push(cur);
- continue;
}
- if (perspectiveName && perspectiveName !== "drafts" && perspectiveName !== "published") {
- let baseId = getPublishedId(cur._id);
- if (flatDocuments.some((doc) => isVersionForCurrentPerspective(doc, perspectiveName, baseId))) continue;
- }
- cur.hasPublished = flatDocuments.some((doc) => doc._id === cur._id.replace("drafts.", "")), dedupedDocuments.push(cur);
}
return dedupedDocuments;
}, DEFAULT_PARAMS = {};
function getDocumentQuery({ type, filter, params = DEFAULT_PARAMS, currentVersion }) { Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@sanity/orderable-document-list",
- "version": "2.0.26",
+ "version": "2.0.27",
"description": "Drag-and-drop Document Ordering without leaving the Editing surface",
"keywords": [
"sanity",
"sanity-plugin"
@@ -29,23 +29,23 @@
"dependencies": {
"@hello-pangea/dnd": "^18.0.1",
"@sanity/client": "^8.9.0",
"@sanity/icons": "^5.2.3",
- "@sanity/ui": "^4.4.0",
+ "@sanity/ui": "^4.4.4",
"lexorank": "^1.0.5",
- "sanity-plugin-utils": "^2.0.20"
+ "sanity-plugin-utils": "^2.0.21"
},
"devDependencies": {
"@sanity/tsconfig": "^2.2.1",
- "@sanity/tsdown-config": "^0.27.1",
+ "@sanity/tsdown-config": "^0.28.8",
"@types/react": "^19.3.0",
"@types/react-dom": "^19.3.0",
"oxc-transform-react": "^0.153.0",
"react": "^19.3.0",
"react-dom": "^19.3.0",
- "sanity": "^6.16.0",
+ "sanity": "^6.18.0",
"styled-components": "^6.5.3",
- "tsdown": "^0.22.14"
+ "tsdown": "^0.23.1"
},
"peerDependencies": {
"react": "^19.2",
"react-dom": "^19.2", Index: package/dist/index.d.ts.map
===================================================================
--- package/dist/index.d.ts.map
+++ package/dist/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/desk-structure/orderableDocumentListDeskItem.ts","../src/OrderableDocumentList.tsx"],"mappings":";;;;;KASY;UCHK,wBAAwB,QACvC,KAAK;EAEL;EACA,kBAAkB;;cAGP,iBAAc,QAAY,oBAAkB;cCT5C,mBAAmB;UCKf;EACf;EACA;EACA;EACA,OAAO;EACP,SAAS;EACT;EACA,YAAY;EACZ;EACA,SAAS;EACT,GAAG;;iBAGW,8BAA8B,QAAQ,sBAAsB;UCf3D;EACf;IACE;IACA,QAAQ;IACR;IACA,SAAS;IACT;;;;;;EAMF,MAAM;IACJ;MACE;MACA,kBAAkB;;;;iBAKR,wBAAuB,SAAS,OAAM,6CAA0B,IAAA"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/desk-structure/orderableDocumentListDeskItem.ts","../src/OrderableDocumentList.tsx"],"mappings":";;;;;KASY;UCHK,wBAAwB,QACvC,KAAK;EAEL;EACA,kBAAkB;;qBAGP,iBAAc,QAAY,oBAAkB;qBCT5C,mBAAmB;UCKf;EACf;EACA;EACA;EACA,OAAO;EACP,SAAS;EACT;EACA,YAAY;EACZ;EACA,SAAS;EACT,GAAG;;wBAGW,8BAA8B,QAAQ,sBAAsB;UCf3D;EACf;IACE;IACA,QAAQ;IACR;IACA,SAAS;IACT;;;;;;EAMF,MAAM;IACJ;MACE;MACA,kBAAkB;;;;wBAKR,wBAAuB,SAAS,OAAM,6CAA0B,IAAA"}
\ No newline at end of file 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":["{\n doc,\n increment,\n entities,\n index,\n isFirst,\n isLast,\n dragBadge,\n}: DocumentProps","currentDoc === doc._id || currentDoc === doc._id.replace(`drafts.`, ``)","_id","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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\n </Flex>","<Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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>","_c","{apiVersion: API_VERSION}","useClient({apiVersion: API_VERSION}).withConfig({perspective: perspectiveStack})","useClient({apiVersion: API_VERSION})","_c","{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>","_c","_temp","_temp2","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>","_c","_temp","_Fragment","{\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","_c","_Fragment","_temp","{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 />","_c","\"type\""],"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 DocumentStatusIndicator,\n DocumentStatus,\n useDocumentVersionInfo,\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 replacements are sanity 6.11+ only\n const versionsInfo = useDocumentVersionInfo(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 // oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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","currentDoc === doc._id || currentDoc === doc._id.replace(`drafts.`, ``)","_id","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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\n </Flex>","<Tooltip content={tooltip} portal placement=\"right\" boundaryElement={null}>\n <Flex align=\"center\" style={{flexShrink: 0}}>\n {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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>","_c","{apiVersion: API_VERSION}","useClient({apiVersion: API_VERSION}).withConfig({perspective: perspectiveStack})","useClient({apiVersion: API_VERSION})","_c","{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>","_c","_temp","_temp2","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>","_c","_temp","_Fragment","{\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","_c","_Fragment","_temp","{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 />","_c","\"type\""],"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 DocumentStatusIndicator,\n DocumentStatus,\n useDocumentVersionInfo,\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 replacements are sanity 6.11+ only\n const versionsInfo = useDocumentVersionInfo(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 // oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only\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 {/* oxlint-disable-next-line typescript/no-deprecated -- the replacements are sanity 6.11+ only */}\n <DocumentStatusIndicator\n draft={versionsInfo.draft}\n published={versionsInfo.published}\n versions={versionsInfo.versions}\n />\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 Index: package/README.md
===================================================================
--- package/README.md
+++ package/README.md
@@ -49,11 +49,11 @@
The config parameter requires `type`, `S` and `context`. It also accepts `title`, `icon`, `filter` and `params`.
`S` and `context` are available in desk-tool structure callback, and should be forwarded as is:
```ts
+import {orderableDocumentListDeskItem} from '@sanity/orderable-document-list'
import {defineConfig} from 'sanity'
import {structureTool, StructureBuilder} from 'sanity/structure'
-import {orderableDocumentListDeskItem} from '@sanity/orderable-document-list'
export default defineConfig({
//...
plugins: [ Index: package/dist/index.d.ts
===================================================================
--- package/dist/index.d.ts
+++ package/dist/index.d.ts
@@ -7,10 +7,10 @@
interface RankFieldConfig extends Partial<Omit<StringDefinition, 'name' | 'type' | 'initialValue'>> {
type: string;
newItemPosition?: NewItemPosition;
}
-declare const orderRankField: (config: RankFieldConfig) => FieldDefinition<'string'>;
-declare const orderRankOrdering: SortOrdering;
+export declare const orderRankField: (config: RankFieldConfig) => FieldDefinition<'string'>;
+export declare const orderRankOrdering: SortOrdering;
interface OrderableListConfig {
type: string;
id?: string;
title?: string;
@@ -21,9 +21,9 @@
createIntent?: boolean;
context: ConfigContext;
S: StructureBuilder;
}
-declare function orderableDocumentListDeskItem(config: OrderableListConfig): ListItem;
+export declare function orderableDocumentListDeskItem(config: OrderableListConfig): ListItem;
interface OrderableDocumentListProps {
options: {
type: string;
client: SanityClient;
@@ -41,7 +41,7 @@
resetOrder: () => Promise<void>;
};
}>;
}
-declare function OrderableDocumentList({ options, ref }: OrderableDocumentListProps): import("react").JSX.Element | null;
-export { OrderableDocumentList, type OrderableListConfig, type RankFieldConfig, orderRankField, orderRankOrdering, orderableDocumentListDeskItem };
+export declare function OrderableDocumentList({ options, ref }: OrderableDocumentListProps): import("react").JSX.Element | null;
+export type { OrderableListConfig, RankFieldConfig };
//# sourceMappingURL=index.d.ts.map
\ No newline at end of file