@sanity/orderable-document-list 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 Sanity.io
3
+ Copyright (c) 2024 Sanity.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -80,6 +80,8 @@ export default defineConfig({
80
80
  params: {
81
81
  lang: 'en_US',
82
82
  },
83
+ createIntent: false, // do not add an option for item creation
84
+ menuItems: [], // allow an array of `S.menuItem()` to be injected to orderable document list menu
83
85
  // pass from the structure callback params above
84
86
  S,
85
87
  context,
@@ -108,6 +110,8 @@ Additionally, pass in overrides for the field, such as making it visible by pass
108
110
 
109
111
  You cannot override the `name`, `type` or `initialValue` attributes.
110
112
 
113
+ You can configure the placement of new documents by setting `newItemPosition` to `before` (defaults to `after`).
114
+
111
115
  ```js
112
116
  // sanity.config.js
113
117
  import {defineConfig} from "sanity";
@@ -134,8 +138,11 @@ export default defineConfig({
134
138
  // Minimum required configuration
135
139
  orderRankField({ type: "category" }),
136
140
 
141
+ // OR placing new documents on top
142
+ orderRankField({ type: "category", newItemPosition: "before" }),
143
+
137
144
  // OR you can override _some_ of the field settings
138
- orderRankField({ type: 'category', hidden: false }),
145
+ orderRankField({ type: "category", hidden: false }),
139
146
 
140
147
  // ...all other fields
141
148
  ],
@@ -151,8 +158,8 @@ export default defineConfig({
151
158
  On first load, your Document list will not have any Order. You can select "Reset Order" from the menu in the top right of the list.
152
159
  You can also re-run this at any time.
153
160
 
154
- The `orderRankField` will query the last Document to set an `initialValue` to come after it.
155
- New Documents always start at the end of the Ordered list.
161
+ The `orderRankField` will query the last/first Document to set an `initialValue` to come after/before it.
162
+ The placement of new documents can be configured by `newItemPosition` on the `orderRankField` in the document.
156
163
 
157
164
  ## Querying Ordered Documents
158
165
 
package/lib/index.d.ts CHANGED
@@ -2,12 +2,15 @@ import {ComponentType} from 'react'
2
2
  import type {ConfigContext} from 'sanity'
3
3
  import {FieldDefinitionBase} from 'sanity'
4
4
  import {ListItem} from 'sanity/desk'
5
+ import {MenuItem} from 'sanity/desk'
5
6
  import {SortOrdering} from 'sanity'
6
7
  import {StringDefinition} from 'sanity'
7
8
  import {StructureBuilder} from 'sanity/desk'
8
9
  import {WidenInitialValue} from 'sanity'
9
10
  import {WidenValidation} from 'sanity'
10
11
 
12
+ declare type NewItemPosition = 'after' | 'before'
13
+
11
14
  export declare function orderableDocumentListDeskItem(config: OrderableListConfig): ListItem
12
15
 
13
16
  export declare interface OrderableListConfig {
@@ -17,6 +20,8 @@ export declare interface OrderableListConfig {
17
20
  icon?: ComponentType
18
21
  params?: Record<string, unknown>
19
22
  filter?: string
23
+ menuItems?: MenuItem[]
24
+ createIntent?: boolean
20
25
  context: ConfigContext
21
26
  S: StructureBuilder
22
27
  }
@@ -33,6 +38,7 @@ export declare const orderRankOrdering: SortOrdering
33
38
 
34
39
  export declare interface RankFieldConfig {
35
40
  type: string
41
+ newItemPosition?: NewItemPosition
36
42
  }
37
43
 
38
44
  export {}
package/lib/index.esm.js CHANGED
@@ -8,18 +8,21 @@ import { useListeningQuery, Feedback } from 'sanity-plugin-utils';
8
8
  import { DragDropContext, Droppable, Draggable } from '@hello-pangea/dnd';
9
9
  import { usePaneRouter } from 'sanity/desk';
10
10
  const ORDER_FIELD_NAME = "orderRank";
11
+ const API_VERSION = "2021-09-01";
11
12
  function initialRank() {
12
- let lastRankValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
13
- const lastRank = lastRankValue ? LexoRank.parse(lastRankValue) : LexoRank.min();
14
- const nextRank = lastRank.genNext().genNext();
15
- return nextRank.toString();
13
+ let compareRankValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
14
+ let newItemPosition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "after";
15
+ const compareRank = compareRankValue ? LexoRank.parse(compareRankValue) : LexoRank.min();
16
+ const rank = newItemPosition === "before" ? compareRank.genPrev().genPrev() : compareRank.genNext().genNext();
17
+ return rank.toString();
16
18
  }
17
19
  const orderRankField = config => {
18
20
  if (!(config == null ? void 0 : config.type)) {
19
21
  throw new Error("\n type must be provided.\n Example: orderRankField({type: 'category'})\n ");
20
22
  }
21
23
  const {
22
- type
24
+ type,
25
+ newItemPosition = "after"
23
26
  } = config;
24
27
  return defineField({
25
28
  title: "Order Rank",
@@ -32,13 +35,14 @@ const orderRankField = config => {
32
35
  let {
33
36
  getClient
34
37
  } = _ref;
38
+ const direction = newItemPosition === "before" ? "asc" : "desc";
35
39
  const lastDocOrderRank = await getClient({
36
- apiVersion: "2021-09-01"
37
- }).fetch("*[_type == $type]|order(@[$order] desc)[0][$order]", {
40
+ apiVersion: API_VERSION
41
+ }).fetch("*[_type == $type]|order(@[$order] ".concat(direction, ")[0][$order]"), {
38
42
  type,
39
43
  order: ORDER_FIELD_NAME
40
44
  });
41
- return initialRank(lastDocOrderRank);
45
+ return initialRank(lastDocOrderRank, newItemPosition);
42
46
  }
43
47
  });
44
48
  };
@@ -97,7 +101,7 @@ function Document(_ref2) {
97
101
  children: /* @__PURE__ */jsxs(Flex, {
98
102
  align: "center",
99
103
  children: [/* @__PURE__ */jsx(Box, {
100
- paddingX: 3,
104
+ paddingX: 2,
101
105
  style: {
102
106
  flexShrink: 0
103
107
  },
@@ -131,7 +135,6 @@ function Document(_ref2) {
131
135
  style: {
132
136
  width: "100%"
133
137
  },
134
- padding: 2,
135
138
  children: /* @__PURE__ */jsx(Flex, {
136
139
  flex: 1,
137
140
  align: "center",
@@ -235,7 +238,7 @@ const reorderDocuments = _ref3 => {
235
238
  };
236
239
  function useSanityClient() {
237
240
  return useClient({
238
- apiVersion: "2021-09-01"
241
+ apiVersion: API_VERSION
239
242
  });
240
243
  }
241
244
  const getItemStyle = (draggableStyle, itemIsUpdating) => ({
@@ -727,6 +730,8 @@ function orderableDocumentListDeskItem(config) {
727
730
  const {
728
731
  type,
729
732
  filter,
733
+ menuItems = [],
734
+ createIntent,
730
735
  params,
731
736
  title,
732
737
  icon,
@@ -739,12 +744,20 @@ function orderableDocumentListDeskItem(config) {
739
744
  getClient
740
745
  } = context;
741
746
  const client = getClient({
742
- apiVersion: "2021-09-01"
747
+ apiVersion: API_VERSION
743
748
  });
744
749
  const listTitle = title != null ? title : "Orderable ".concat(type);
745
750
  const listId = id != null ? id : "orderable-".concat(type);
746
751
  const listIcon = icon != null ? icon : SortIcon;
747
752
  const typeTitle = (_b = (_a = schema.get(type)) == null ? void 0 : _a.title) != null ? _b : type;
753
+ if (createIntent !== false) {
754
+ menuItems.push(S.menuItem().title("Create new ".concat(typeTitle)).intent({
755
+ type: "create",
756
+ params: {
757
+ type
758
+ }
759
+ }).serialize());
760
+ }
748
761
  return S.listItem().title(listTitle).id(listId).icon(listIcon).child(Object.assign(S.documentTypeList(type).serialize(), {
749
762
  // Prevents the component from re-rendering when switching documents
750
763
  __preserveInstance: true,
@@ -758,12 +771,7 @@ function orderableDocumentListDeskItem(config) {
758
771
  params,
759
772
  client
760
773
  },
761
- menuItems: [S.menuItem().title("Create new ".concat(typeTitle)).intent({
762
- type: "create",
763
- params: {
764
- type
765
- }
766
- }).serialize(), S.menuItem().title("Reset Order").icon(GenerateIcon).action("resetOrder").serialize(), S.menuItem().title("Toggle Increments").icon(SortIcon).action("showIncrements").serialize()]
774
+ menuItems: [...menuItems, S.menuItem().title("Reset Order").icon(GenerateIcon).action("resetOrder").serialize(), S.menuItem().title("Toggle Increments").icon(SortIcon).action("showIncrements").serialize()]
767
775
  })).serialize();
768
776
  }
769
777
  export { orderRankField, orderRankOrdering, orderableDocumentListDeskItem };
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/helpers/constants.ts","../src/helpers/initialRank.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/OrderableContext.ts","../src/Document.tsx","../src/helpers/reorderDocuments.ts","../src/helpers/client.ts","../src/DraggableList.tsx","../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","import {LexoRank} from 'lexorank'\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 default function initialRank(lastRankValue = ``): string {\n const lastRank = lastRankValue ? LexoRank.parse(lastRankValue) : LexoRank.min()\n const nextRank = lastRank.genNext().genNext()\n\n return nextRank.toString()\n}\n","import {type ConfigContext, defineField} from 'sanity'\nimport {ORDER_FIELD_NAME} from '../helpers/constants'\nimport initialRank from '../helpers/initialRank'\n\nexport type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>\n\nexport interface RankFieldConfig {\n type: string\n}\n\nexport const orderRankField = (config: RankFieldConfig) => {\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} = config\n return defineField({\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...config,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async (p, {getClient}) => {\n const lastDocOrderRank = await getClient({apiVersion: '2021-09-01'}).fetch(\n `*[_type == $type]|order(@[$order] desc)[0][$order]`,\n {type, order: ORDER_FIELD_NAME}\n )\n return initialRank(lastDocOrderRank)\n },\n })\n}\n","import {SortOrdering} from 'sanity'\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 React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {useContext, useMemo, type ReactNode} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {AvatarCounter, Card, Box, Button, Flex, Text} from '@sanity/ui'\nimport {useSchema, SchemaType, PreviewCard, Preview} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport {OrderableContext} from './OrderableContext'\nimport {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 default 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 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\n const Link = useMemo(\n () =>\n function LinkComponent(linkProps: {children: ReactNode}) {\n return <ChildLink {...linkProps} childId={doc._id} />\n },\n [ChildLink, doc._id]\n )\n\n return (\n <PreviewCard\n __unstable_focusRing\n // @ts-expect-error\n as={Link}\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 >\n <Flex align=\"center\">\n <Box paddingX={3} 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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Box style={{width: `100%`}} padding={2}>\n <Flex flex={1} align=\"center\">\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\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 {LexoRank} from 'lexorank'\nimport type {PatchOperations} from 'sanity'\n\nimport {SanityDocumentWithOrder} from '../types'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocumentWithOrder[]\n selectedItems: SanityDocumentWithOrder[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocumentWithOrder[]\n selectedIds: string[]\n source: any\n destination: any\n}\n\nexport interface ReorderReturn {\n newOrder: SanityDocumentWithOrder[]\n patches: [string, PatchOperations][]\n message: any\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 = entities[prevIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[prevIndex]?.[ORDER_FIELD_NAME] as string)\n : LexoRank.min()\n\n const curRank = LexoRank.parse(entities[curIndex][ORDER_FIELD_NAME] as string)\n\n const nextIndex = curIndex + 1\n const nextRank = entities[nextIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[nextIndex]?.[ORDER_FIELD_NAME] as string)\n : 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 (let selectedIndex = 0; selectedIndex < selectedItems.length; selectedIndex += 1) {\n selectedItems[selectedIndex][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 {useClient} from 'sanity'\n\nexport function useSanityClient() {\n return useClient({apiVersion: '2021-09-01'})\n}\n","import {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from '@hello-pangea/dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport type {PatchOperations} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\nimport {SanityDocumentWithOrder} from './types'\n\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\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 default function DraggableList({\n data,\n listIsUpdating,\n setListIsUpdating,\n}: 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\n // Update local state when documents change from an outside source\n useEffect(() => {\n if (!listIsUpdating) setOrderedData(data)\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [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 = []\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]\n const lastSelectedIndex = orderedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = orderedData\n .filter((item, 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 [setSelectedIds, orderedData, 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]) => transaction.patch(docId, ops))\n\n await transaction\n .commit()\n .then((updated) => {\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 })\n .catch(() => {\n setDraggingId(``)\n setListIsUpdating(false)\n toast.push({\n title: `Reordering failed`,\n status: `error`,\n })\n })\n },\n [client, setDraggingId, clearSelected, setListIsUpdating, toast]\n )\n\n const handleDragEnd = useCallback(\n (result: DropResult | 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) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds?.length ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (!effectedIds?.length) 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) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches?.length) {\n transactPatches(patches, message)\n }\n },\n [selectedIds, setDraggingId, setSelectedIds, 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, setDraggingId]\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 = {\n draggableId: id,\n source: {index: shiftFrom},\n destination: {index: shiftTo},\n }\n\n return handleDragEnd(result as DropResult, 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 (!orderedData.length) return []\n\n const orderField = orderedData.map((item) => item[ORDER_FIELD_NAME])\n\n return orderField.filter((item, index) => orderField.indexOf(item) !== index)\n }, [orderedData])\n\n const onDragEnd = useCallback(\n (result: DropResult) => handleDragEnd(result, orderedData),\n [orderedData, 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 {orderedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n // onClick={(event) => handleDraggableClick(event, provided, snapshot)}\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 = Boolean(!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 // eslint-disable-next-line react/jsx-no-bind\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={orderedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.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 {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Container, Spinner, Stack, Text} from '@sanity/ui'\n\nimport {useListeningQuery, Feedback} from 'sanity-plugin-utils'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {SanityDocumentWithOrder} from './types'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocumentWithOrder[] | null>([])\n\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = {\n ...params,\n type,\n order: ORDER_FIELD_NAME,\n }\n\n const {\n data: queryData,\n loading,\n error,\n } = useListeningQuery<SanityDocumentWithOrder[]>(query, {\n params: queryParams,\n initialValue: [],\n })\n\n useEffect(() => {\n if (queryData) {\n const filteredDocuments = queryData.reduce<SanityDocumentWithOrder[]>((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = queryData.some((doc) => doc._id === `drafts.${cur._id}`)\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n // Check if the draft has a published version\n cur.hasPublished = queryData.some((doc) => doc._id === cur._id.replace(`drafts.`, ``))\n\n return [...acc, cur]\n }, [])\n\n setData(filteredDocuments)\n } else {\n setData([])\n }\n }, [queryData])\n\n const unorderedDataCount = useMemo(\n () => (data?.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\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 || 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 return (\n <Stack space={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 {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport {Box, type ToastParams} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n // eslint-disable-next-line react/require-default-props\n filter?: string\n // eslint-disable-next-line react/require-default-props\n params?: Record<string, unknown>\n}\n\n// 1. Validate first that the schema has been configured for ordering\n// 2. Setup context for showIncrements\nexport default function DocumentListWrapper({\n type,\n showIncrements,\n resetOrderTransaction,\n filter,\n params,\n}: DocumentListWrapperProps) {\n const toast = useToast()\n const schema = useSchema()\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={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {SanityClient} from '@sanity/client'\nimport {ORDER_FIELD_NAME} from './constants'\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(type = ``, client: SanityClient) {\n const query = `*[_type == $type]|order(@[$order] asc)._id`\n const queryParams = {type, order: ORDER_FIELD_NAME}\n const documents = await client.fetch(query, queryParams)\n\n if (!documents.length) {\n return null\n }\n\n const transaction = client.transaction()\n let aLexoRank = LexoRank.min()\n\n for (let index = 0; index < documents.length; index += 1) {\n // Generate next rank before even the first document so there's room to move!\n aLexoRank = aLexoRank.genNext().genNext()\n\n transaction.patch(documents[index], {\n set: {[ORDER_FIELD_NAME]: aLexoRank.toString()},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n","import {Component} from 'react'\n\nimport {SanityClient} from '@sanity/client'\nimport type {ToastParams} from '@sanity/ui'\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 }\n}\n\ninterface State {\n showIncrements: boolean\n resetOrderTransaction: ToastParams\n}\n\n// Must use a Class Component here so the actionHandlers can be called\nexport default class OrderableDocumentList extends Component<OrderableDocumentListProps, State> {\n constructor(props: OrderableDocumentListProps) {\n super(props)\n this.state = {\n showIncrements: false,\n resetOrderTransaction: {},\n }\n }\n\n actionHandlers = {\n showIncrements: () => {\n this.setState((state) => ({\n showIncrements: !state.showIncrements,\n }))\n },\n\n resetOrder: async () => {\n this.setState(() => ({\n resetOrderTransaction: {\n status: `info`,\n title: `Reordering started...`,\n closable: true,\n },\n }))\n\n const update = await resetOrder(this.props.options.type, this.props.options.client)\n\n const reorderWasSuccessful = update?.results?.length\n\n this.setState(() => ({\n resetOrderTransaction: {\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 }\n\n render() {\n const type = this?.props?.options?.type\n if (!type) {\n return null\n }\n return (\n <DocumentListWrapper\n filter={this?.props?.options?.filter}\n params={this?.props?.options?.params}\n type={type}\n showIncrements={this.state.showIncrements}\n resetOrderTransaction={this.state.resetOrderTransaction}\n />\n )\n }\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder, type ListItem} from 'sanity/desk'\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 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, params, title, icon, id, context, S} = config\n const {schema, getClient} = context\n const client = getClient({apiVersion: '2021-09-01'})\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\n return S.listItem()\n .title(listTitle)\n .id(listId)\n .icon(listIcon)\n .child(\n Object.assign(S.documentTypeList(type).serialize(), {\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},\n menuItems: [\n S.menuItem()\n .title(`Create new ${typeTitle}`)\n .intent({type: 'create', params: {type}})\n .serialize(),\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 .serialize()\n}\n"],"names":["ORDER_FIELD_NAME","initialRank","lastRankValue","lastRank","LexoRank","parse","min","nextRank","genNext","toString","orderRankField","config","type","Error","defineField","title","readOnly","hidden","name","initialValue","p","_ref","getClient","lastDocOrderRank","apiVersion","fetch","order","orderRankOrdering","by","field","direction","OrderableContext","React","createContext","Document","_ref2","doc","increment","entities","index","isFirst","isLast","dragBadge","_a","_b","showIncrements","useContext","schema","useSchema","router","usePaneRouter","ChildLink","groupIndex","routerPanesState","currentDoc","id","pressed","_id","replace","selected","length","Link","useMemo","LinkComponent","linkProps","childId","jsx","PreviewCard","__unstable_focusRing","as","radius","sizing","tabIndex","tone","width","flex","children","jsxs","Flex","align","Box","paddingX","style","flexShrink","Text","size","DragHandleIcon","cursor","gap","paddingRight","Button","padding","mode","onClick","disabled","icon","ChevronUpIcon","ChevronDownIcon","Preview","layout","value","schemaType","get","_type","Card","marginRight","AvatarCounter","count","lexicographicalSort","a","b","reorderDocuments","_ref3","selectedIds","source","destination","startIndex","endIndex","isMovingUp","selectedItems","filter","item","includes","message","concat","join","all","reduce","acc","cur","curIndex","_c","_d","prevIndex","prevRank","curRank","nextIndex","max","betweenRank","between","selectedIndex","patches","flatMap","docPatches","set","startsWith","hasPublished","push","allSorted","sort","newOrder","useSanityClient","useClient","getItemStyle","draggableStyle","itemIsUpdating","userSelect","transition","opacity","pointerEvents","cardTone","settings","isDuplicate","isGhosting","isDragging","isSelected","DraggableList","_ref4","data","listIsUpdating","setListIsUpdating","toast","useToast","orderedData","setOrderedData","useState","useEffect","draggingId","setDraggingId","setSelectedIds","clearSelected","useCallback","handleSelect","clickedId","nativeEvent","selectMultiple","shiftKey","isUsingWindows","navigator","appVersion","indexOf","selectAdditional","ctrlKey","metaKey","updatedIds","preventDefault","lastSelectedId","lastSelectedIndex","findIndex","firstSelected","lastSelected","betweenIds","itemIndex","map","client","transactPatches","transaction","forEach","_ref5","docId","ops","patch","commit","then","updated","results","status","description","catch","handleDragEnd","result","draggableId","effectedIds","handleDragStart","start","incrementIndex","shiftFrom","shiftTo","onWindowKeyDown","event","key","window","addEventListener","removeEventListener","duplicateOrders","orderField","onDragEnd","DragDropContext","onDragStart","Droppable","droppableId","provided","droppableProps","ref","innerRef","Draggable","innerProvided","innerSnapshot","Boolean","isUpdating","isDisabled","selectedCount","draggableProps","dragHandleProps","paddingBottom","shadow","e","placeholder","DEFAULT_PARAMS","DocumentListQuery","_ref6","params","setData","query","queryParams","queryData","loading","error","useListeningQuery","filteredDocuments","alsoHasDraft","some","unorderedDataCount","height","justify","Spinner","Feedback","Container","paddingY","muted","Stack","space","overflow","marginBottom","Fragment","DocumentListWrapper","_ref7","resetOrderTransaction","schemaIsInvalid","typeSchema","fields","Provider","resetOrder","arguments","undefined","documents","aLexoRank","update","err","OrderableDocumentList","Component","constructor","props","__publicField","setState","state","closable","options","reorderWasSuccessful","render","_e","_f","orderableDocumentListDeskItem","context","S","listTitle","listId","listIcon","SortIcon","typeTitle","listItem","child","Object","assign","documentTypeList","serialize","__preserveInstance","component","menuItems","menuItem","intent","GenerateIcon","action"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/helpers/constants.ts","../src/helpers/initialRank.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/OrderableContext.ts","../src/Document.tsx","../src/helpers/reorderDocuments.ts","../src/helpers/client.ts","../src/DraggableList.tsx","../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\nexport const API_VERSION = `2021-09-01` as const\n","import {LexoRank} from 'lexorank'\nimport {NewItemPosition} from '../types'\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 default function initialRank(\n compareRankValue = ``,\n newItemPosition: NewItemPosition = 'after'\n): string {\n const compareRank = compareRankValue ? LexoRank.parse(compareRankValue) : LexoRank.min()\n const rank =\n newItemPosition === 'before' ? compareRank.genPrev().genPrev() : compareRank.genNext().genNext()\n\n return rank.toString()\n}\n","import {type ConfigContext, defineField} from 'sanity'\nimport {API_VERSION, ORDER_FIELD_NAME} from '../helpers/constants'\nimport initialRank from '../helpers/initialRank'\nimport {NewItemPosition} from '../types'\n\nexport type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>\n\nexport interface RankFieldConfig {\n type: string\n newItemPosition?: NewItemPosition\n}\n\nexport const orderRankField = (config: RankFieldConfig) => {\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'} = config\n return defineField({\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...config,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async (p, {getClient}) => {\n const direction = newItemPosition === 'before' ? 'asc' : 'desc'\n\n const lastDocOrderRank = await getClient({apiVersion: API_VERSION}).fetch(\n `*[_type == $type]|order(@[$order] ${direction})[0][$order]`,\n {type, order: ORDER_FIELD_NAME}\n )\n return initialRank(lastDocOrderRank, newItemPosition)\n },\n })\n}\n","import {SortOrdering} from 'sanity'\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 React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {useContext, useMemo, type ReactNode} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {AvatarCounter, Card, Box, Button, Flex, Text} from '@sanity/ui'\nimport {useSchema, SchemaType, PreviewCard, Preview} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport {OrderableContext} from './OrderableContext'\nimport {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 default 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 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\n const Link = useMemo(\n () =>\n function LinkComponent(linkProps: {children: ReactNode}) {\n return <ChildLink {...linkProps} childId={doc._id} />\n },\n [ChildLink, doc._id]\n )\n\n return (\n <PreviewCard\n __unstable_focusRing\n // @ts-expect-error\n as={Link}\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 >\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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\">\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\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 {LexoRank} from 'lexorank'\nimport type {PatchOperations} from 'sanity'\n\nimport {SanityDocumentWithOrder} from '../types'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocumentWithOrder[]\n selectedItems: SanityDocumentWithOrder[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocumentWithOrder[]\n selectedIds: string[]\n source: any\n destination: any\n}\n\nexport interface ReorderReturn {\n newOrder: SanityDocumentWithOrder[]\n patches: [string, PatchOperations][]\n message: any\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 = entities[prevIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[prevIndex]?.[ORDER_FIELD_NAME] as string)\n : LexoRank.min()\n\n const curRank = LexoRank.parse(entities[curIndex][ORDER_FIELD_NAME] as string)\n\n const nextIndex = curIndex + 1\n const nextRank = entities[nextIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[nextIndex]?.[ORDER_FIELD_NAME] as string)\n : 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 (let selectedIndex = 0; selectedIndex < selectedItems.length; selectedIndex += 1) {\n selectedItems[selectedIndex][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 {useClient} from 'sanity'\nimport {API_VERSION} from './constants'\n\nexport function useSanityClient() {\n return useClient({apiVersion: API_VERSION})\n}\n","import {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from '@hello-pangea/dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport type {PatchOperations} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\nimport {SanityDocumentWithOrder} from './types'\n\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\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 default function DraggableList({\n data,\n listIsUpdating,\n setListIsUpdating,\n}: 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\n // Update local state when documents change from an outside source\n useEffect(() => {\n if (!listIsUpdating) setOrderedData(data)\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [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 = []\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]\n const lastSelectedIndex = orderedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = orderedData\n .filter((item, 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 [setSelectedIds, orderedData, 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]) => transaction.patch(docId, ops))\n\n await transaction\n .commit()\n .then((updated) => {\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 })\n .catch(() => {\n setDraggingId(``)\n setListIsUpdating(false)\n toast.push({\n title: `Reordering failed`,\n status: `error`,\n })\n })\n },\n [client, setDraggingId, clearSelected, setListIsUpdating, toast]\n )\n\n const handleDragEnd = useCallback(\n (result: DropResult | 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) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds?.length ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (!effectedIds?.length) 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) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches?.length) {\n transactPatches(patches, message)\n }\n },\n [selectedIds, setDraggingId, setSelectedIds, 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, setDraggingId]\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 = {\n draggableId: id,\n source: {index: shiftFrom},\n destination: {index: shiftTo},\n }\n\n return handleDragEnd(result as DropResult, 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 (!orderedData.length) return []\n\n const orderField = orderedData.map((item) => item[ORDER_FIELD_NAME])\n\n return orderField.filter((item, index) => orderField.indexOf(item) !== index)\n }, [orderedData])\n\n const onDragEnd = useCallback(\n (result: DropResult) => handleDragEnd(result, orderedData),\n [orderedData, 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 {orderedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n // onClick={(event) => handleDraggableClick(event, provided, snapshot)}\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 = Boolean(!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 // eslint-disable-next-line react/jsx-no-bind\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={orderedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.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 {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Container, Spinner, Stack, Text} from '@sanity/ui'\n\nimport {useListeningQuery, Feedback} from 'sanity-plugin-utils'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {SanityDocumentWithOrder} from './types'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocumentWithOrder[] | null>([])\n\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = {\n ...params,\n type,\n order: ORDER_FIELD_NAME,\n }\n\n const {\n data: queryData,\n loading,\n error,\n } = useListeningQuery<SanityDocumentWithOrder[]>(query, {\n params: queryParams,\n initialValue: [],\n })\n\n useEffect(() => {\n if (queryData) {\n const filteredDocuments = queryData.reduce<SanityDocumentWithOrder[]>((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = queryData.some((doc) => doc._id === `drafts.${cur._id}`)\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n // Check if the draft has a published version\n cur.hasPublished = queryData.some((doc) => doc._id === cur._id.replace(`drafts.`, ``))\n\n return [...acc, cur]\n }, [])\n\n setData(filteredDocuments)\n } else {\n setData([])\n }\n }, [queryData])\n\n const unorderedDataCount = useMemo(\n () => (data?.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\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 || 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 return (\n <Stack space={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 {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport {Box, type ToastParams} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n // eslint-disable-next-line react/require-default-props\n filter?: string\n // eslint-disable-next-line react/require-default-props\n params?: Record<string, unknown>\n}\n\n// 1. Validate first that the schema has been configured for ordering\n// 2. Setup context for showIncrements\nexport default function DocumentListWrapper({\n type,\n showIncrements,\n resetOrderTransaction,\n filter,\n params,\n}: DocumentListWrapperProps) {\n const toast = useToast()\n const schema = useSchema()\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={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {SanityClient} from '@sanity/client'\nimport {ORDER_FIELD_NAME} from './constants'\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(type = ``, client: SanityClient) {\n const query = `*[_type == $type]|order(@[$order] asc)._id`\n const queryParams = {type, order: ORDER_FIELD_NAME}\n const documents = await client.fetch(query, queryParams)\n\n if (!documents.length) {\n return null\n }\n\n const transaction = client.transaction()\n let aLexoRank = LexoRank.min()\n\n for (let index = 0; index < documents.length; index += 1) {\n // Generate next rank before even the first document so there's room to move!\n aLexoRank = aLexoRank.genNext().genNext()\n\n transaction.patch(documents[index], {\n set: {[ORDER_FIELD_NAME]: aLexoRank.toString()},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n","import {Component} from 'react'\n\nimport {SanityClient} from '@sanity/client'\nimport type {ToastParams} from '@sanity/ui'\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 }\n}\n\ninterface State {\n showIncrements: boolean\n resetOrderTransaction: ToastParams\n}\n\n// Must use a Class Component here so the actionHandlers can be called\nexport default class OrderableDocumentList extends Component<OrderableDocumentListProps, State> {\n constructor(props: OrderableDocumentListProps) {\n super(props)\n this.state = {\n showIncrements: false,\n resetOrderTransaction: {},\n }\n }\n\n actionHandlers = {\n showIncrements: () => {\n this.setState((state) => ({\n showIncrements: !state.showIncrements,\n }))\n },\n\n resetOrder: async () => {\n this.setState(() => ({\n resetOrderTransaction: {\n status: `info`,\n title: `Reordering started...`,\n closable: true,\n },\n }))\n\n const update = await resetOrder(this.props.options.type, this.props.options.client)\n\n const reorderWasSuccessful = update?.results?.length\n\n this.setState(() => ({\n resetOrderTransaction: {\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 }\n\n render() {\n const type = this?.props?.options?.type\n if (!type) {\n return null\n }\n return (\n <DocumentListWrapper\n filter={this?.props?.options?.filter}\n params={this?.props?.options?.params}\n type={type}\n showIncrements={this.state.showIncrements}\n resetOrderTransaction={this.state.resetOrderTransaction}\n />\n )\n }\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder, type ListItem, type MenuItem} from 'sanity/desk'\nimport OrderableDocumentList from '../OrderableDocumentList'\nimport {API_VERSION} from '../helpers/constants'\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 client = getClient({apiVersion: API_VERSION})\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\n if (createIntent !== false) {\n menuItems.push(\n S.menuItem()\n .title(`Create new ${typeTitle}`)\n .intent({type: 'create', params: {type}})\n .serialize()\n )\n }\n return S.listItem()\n .title(listTitle)\n .id(listId)\n .icon(listIcon)\n .child(\n Object.assign(S.documentTypeList(type).serialize(), {\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},\n menuItems: [\n ...menuItems,\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 .serialize()\n}\n"],"names":["ORDER_FIELD_NAME","API_VERSION","initialRank","compareRankValue","arguments","length","undefined","newItemPosition","compareRank","LexoRank","parse","min","rank","genPrev","genNext","toString","orderRankField","config","type","Error","defineField","title","readOnly","hidden","name","initialValue","p","_ref","getClient","direction","lastDocOrderRank","apiVersion","fetch","concat","order","orderRankOrdering","by","field","OrderableContext","React","createContext","Document","_ref2","doc","increment","entities","index","isFirst","isLast","dragBadge","_a","_b","showIncrements","useContext","schema","useSchema","router","usePaneRouter","ChildLink","groupIndex","routerPanesState","currentDoc","id","pressed","_id","replace","selected","Link","useMemo","LinkComponent","linkProps","childId","jsx","PreviewCard","__unstable_focusRing","as","radius","sizing","tabIndex","tone","width","flex","children","jsxs","Flex","align","Box","paddingX","style","flexShrink","Text","size","DragHandleIcon","cursor","gap","paddingRight","Button","padding","mode","onClick","disabled","icon","ChevronUpIcon","ChevronDownIcon","Preview","layout","value","schemaType","get","_type","Card","marginRight","AvatarCounter","count","lexicographicalSort","a","b","reorderDocuments","_ref3","selectedIds","source","destination","startIndex","endIndex","isMovingUp","selectedItems","filter","item","includes","message","join","all","reduce","acc","cur","curIndex","_c","_d","prevIndex","prevRank","curRank","nextIndex","nextRank","max","betweenRank","between","selectedIndex","patches","flatMap","docPatches","set","startsWith","hasPublished","push","allSorted","sort","newOrder","useSanityClient","useClient","getItemStyle","draggableStyle","itemIsUpdating","userSelect","transition","opacity","pointerEvents","cardTone","settings","isDuplicate","isGhosting","isDragging","isSelected","DraggableList","_ref4","data","listIsUpdating","setListIsUpdating","toast","useToast","orderedData","setOrderedData","useState","useEffect","draggingId","setDraggingId","setSelectedIds","clearSelected","useCallback","handleSelect","clickedId","nativeEvent","selectMultiple","shiftKey","isUsingWindows","navigator","appVersion","indexOf","selectAdditional","ctrlKey","metaKey","updatedIds","preventDefault","lastSelectedId","lastSelectedIndex","findIndex","firstSelected","lastSelected","betweenIds","itemIndex","map","client","transactPatches","transaction","forEach","_ref5","docId","ops","patch","commit","then","updated","results","status","description","catch","handleDragEnd","result","draggableId","effectedIds","handleDragStart","start","incrementIndex","shiftFrom","shiftTo","onWindowKeyDown","event","key","window","addEventListener","removeEventListener","duplicateOrders","orderField","onDragEnd","DragDropContext","onDragStart","Droppable","droppableId","provided","droppableProps","ref","innerRef","Draggable","innerProvided","innerSnapshot","Boolean","isUpdating","isDisabled","selectedCount","draggableProps","dragHandleProps","paddingBottom","shadow","e","placeholder","DEFAULT_PARAMS","DocumentListQuery","_ref6","params","setData","query","queryParams","queryData","loading","error","useListeningQuery","filteredDocuments","alsoHasDraft","some","unorderedDataCount","height","justify","Spinner","Feedback","Container","paddingY","muted","Stack","space","overflow","marginBottom","Fragment","DocumentListWrapper","_ref7","resetOrderTransaction","schemaIsInvalid","typeSchema","fields","Provider","resetOrder","documents","aLexoRank","update","err","OrderableDocumentList","Component","constructor","props","__publicField","setState","state","closable","options","reorderWasSuccessful","render","_e","_f","orderableDocumentListDeskItem","context","S","menuItems","createIntent","listTitle","listId","listIcon","SortIcon","typeTitle","menuItem","intent","serialize","listItem","child","Object","assign","documentTypeList","__preserveInstance","component","GenerateIcon","action"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -19,18 +19,21 @@ function _interopDefaultCompat(e) {
19
19
  }
20
20
  var React__default = /*#__PURE__*/_interopDefaultCompat(React);
21
21
  const ORDER_FIELD_NAME = "orderRank";
22
+ const API_VERSION = "2021-09-01";
22
23
  function initialRank() {
23
- let lastRankValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
24
- const lastRank = lastRankValue ? lexorank.LexoRank.parse(lastRankValue) : lexorank.LexoRank.min();
25
- const nextRank = lastRank.genNext().genNext();
26
- return nextRank.toString();
24
+ let compareRankValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
25
+ let newItemPosition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "after";
26
+ const compareRank = compareRankValue ? lexorank.LexoRank.parse(compareRankValue) : lexorank.LexoRank.min();
27
+ const rank = newItemPosition === "before" ? compareRank.genPrev().genPrev() : compareRank.genNext().genNext();
28
+ return rank.toString();
27
29
  }
28
30
  const orderRankField = config => {
29
31
  if (!(config == null ? void 0 : config.type)) {
30
32
  throw new Error("\n type must be provided.\n Example: orderRankField({type: 'category'})\n ");
31
33
  }
32
34
  const {
33
- type
35
+ type,
36
+ newItemPosition = "after"
34
37
  } = config;
35
38
  return sanity.defineField({
36
39
  title: "Order Rank",
@@ -43,13 +46,14 @@ const orderRankField = config => {
43
46
  let {
44
47
  getClient
45
48
  } = _ref;
49
+ const direction = newItemPosition === "before" ? "asc" : "desc";
46
50
  const lastDocOrderRank = await getClient({
47
- apiVersion: "2021-09-01"
48
- }).fetch("*[_type == $type]|order(@[$order] desc)[0][$order]", {
51
+ apiVersion: API_VERSION
52
+ }).fetch("*[_type == $type]|order(@[$order] ".concat(direction, ")[0][$order]"), {
49
53
  type,
50
54
  order: ORDER_FIELD_NAME
51
55
  });
52
- return initialRank(lastDocOrderRank);
56
+ return initialRank(lastDocOrderRank, newItemPosition);
53
57
  }
54
58
  });
55
59
  };
@@ -108,7 +112,7 @@ function Document(_ref2) {
108
112
  children: /* @__PURE__ */jsxRuntime.jsxs(ui.Flex, {
109
113
  align: "center",
110
114
  children: [/* @__PURE__ */jsxRuntime.jsx(ui.Box, {
111
- paddingX: 3,
115
+ paddingX: 2,
112
116
  style: {
113
117
  flexShrink: 0
114
118
  },
@@ -142,7 +146,6 @@ function Document(_ref2) {
142
146
  style: {
143
147
  width: "100%"
144
148
  },
145
- padding: 2,
146
149
  children: /* @__PURE__ */jsxRuntime.jsx(ui.Flex, {
147
150
  flex: 1,
148
151
  align: "center",
@@ -246,7 +249,7 @@ const reorderDocuments = _ref3 => {
246
249
  };
247
250
  function useSanityClient() {
248
251
  return sanity.useClient({
249
- apiVersion: "2021-09-01"
252
+ apiVersion: API_VERSION
250
253
  });
251
254
  }
252
255
  const getItemStyle = (draggableStyle, itemIsUpdating) => ({
@@ -738,6 +741,8 @@ function orderableDocumentListDeskItem(config) {
738
741
  const {
739
742
  type,
740
743
  filter,
744
+ menuItems = [],
745
+ createIntent,
741
746
  params,
742
747
  title,
743
748
  icon,
@@ -750,12 +755,20 @@ function orderableDocumentListDeskItem(config) {
750
755
  getClient
751
756
  } = context;
752
757
  const client = getClient({
753
- apiVersion: "2021-09-01"
758
+ apiVersion: API_VERSION
754
759
  });
755
760
  const listTitle = title != null ? title : "Orderable ".concat(type);
756
761
  const listId = id != null ? id : "orderable-".concat(type);
757
762
  const listIcon = icon != null ? icon : icons.SortIcon;
758
763
  const typeTitle = (_b = (_a = schema.get(type)) == null ? void 0 : _a.title) != null ? _b : type;
764
+ if (createIntent !== false) {
765
+ menuItems.push(S.menuItem().title("Create new ".concat(typeTitle)).intent({
766
+ type: "create",
767
+ params: {
768
+ type
769
+ }
770
+ }).serialize());
771
+ }
759
772
  return S.listItem().title(listTitle).id(listId).icon(listIcon).child(Object.assign(S.documentTypeList(type).serialize(), {
760
773
  // Prevents the component from re-rendering when switching documents
761
774
  __preserveInstance: true,
@@ -769,12 +782,7 @@ function orderableDocumentListDeskItem(config) {
769
782
  params,
770
783
  client
771
784
  },
772
- menuItems: [S.menuItem().title("Create new ".concat(typeTitle)).intent({
773
- type: "create",
774
- params: {
775
- type
776
- }
777
- }).serialize(), S.menuItem().title("Reset Order").icon(icons.GenerateIcon).action("resetOrder").serialize(), S.menuItem().title("Toggle Increments").icon(icons.SortIcon).action("showIncrements").serialize()]
785
+ menuItems: [...menuItems, S.menuItem().title("Reset Order").icon(icons.GenerateIcon).action("resetOrder").serialize(), S.menuItem().title("Toggle Increments").icon(icons.SortIcon).action("showIncrements").serialize()]
778
786
  })).serialize();
779
787
  }
780
788
  exports.orderRankField = orderRankField;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/helpers/constants.ts","../src/helpers/initialRank.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/OrderableContext.ts","../src/Document.tsx","../src/helpers/reorderDocuments.ts","../src/helpers/client.ts","../src/DraggableList.tsx","../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","import {LexoRank} from 'lexorank'\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 default function initialRank(lastRankValue = ``): string {\n const lastRank = lastRankValue ? LexoRank.parse(lastRankValue) : LexoRank.min()\n const nextRank = lastRank.genNext().genNext()\n\n return nextRank.toString()\n}\n","import {type ConfigContext, defineField} from 'sanity'\nimport {ORDER_FIELD_NAME} from '../helpers/constants'\nimport initialRank from '../helpers/initialRank'\n\nexport type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>\n\nexport interface RankFieldConfig {\n type: string\n}\n\nexport const orderRankField = (config: RankFieldConfig) => {\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} = config\n return defineField({\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...config,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async (p, {getClient}) => {\n const lastDocOrderRank = await getClient({apiVersion: '2021-09-01'}).fetch(\n `*[_type == $type]|order(@[$order] desc)[0][$order]`,\n {type, order: ORDER_FIELD_NAME}\n )\n return initialRank(lastDocOrderRank)\n },\n })\n}\n","import {SortOrdering} from 'sanity'\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 React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {useContext, useMemo, type ReactNode} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {AvatarCounter, Card, Box, Button, Flex, Text} from '@sanity/ui'\nimport {useSchema, SchemaType, PreviewCard, Preview} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport {OrderableContext} from './OrderableContext'\nimport {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 default 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 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\n const Link = useMemo(\n () =>\n function LinkComponent(linkProps: {children: ReactNode}) {\n return <ChildLink {...linkProps} childId={doc._id} />\n },\n [ChildLink, doc._id]\n )\n\n return (\n <PreviewCard\n __unstable_focusRing\n // @ts-expect-error\n as={Link}\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 >\n <Flex align=\"center\">\n <Box paddingX={3} 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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Box style={{width: `100%`}} padding={2}>\n <Flex flex={1} align=\"center\">\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\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 {LexoRank} from 'lexorank'\nimport type {PatchOperations} from 'sanity'\n\nimport {SanityDocumentWithOrder} from '../types'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocumentWithOrder[]\n selectedItems: SanityDocumentWithOrder[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocumentWithOrder[]\n selectedIds: string[]\n source: any\n destination: any\n}\n\nexport interface ReorderReturn {\n newOrder: SanityDocumentWithOrder[]\n patches: [string, PatchOperations][]\n message: any\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 = entities[prevIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[prevIndex]?.[ORDER_FIELD_NAME] as string)\n : LexoRank.min()\n\n const curRank = LexoRank.parse(entities[curIndex][ORDER_FIELD_NAME] as string)\n\n const nextIndex = curIndex + 1\n const nextRank = entities[nextIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[nextIndex]?.[ORDER_FIELD_NAME] as string)\n : 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 (let selectedIndex = 0; selectedIndex < selectedItems.length; selectedIndex += 1) {\n selectedItems[selectedIndex][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 {useClient} from 'sanity'\n\nexport function useSanityClient() {\n return useClient({apiVersion: '2021-09-01'})\n}\n","import {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from '@hello-pangea/dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport type {PatchOperations} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\nimport {SanityDocumentWithOrder} from './types'\n\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\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 default function DraggableList({\n data,\n listIsUpdating,\n setListIsUpdating,\n}: 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\n // Update local state when documents change from an outside source\n useEffect(() => {\n if (!listIsUpdating) setOrderedData(data)\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [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 = []\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]\n const lastSelectedIndex = orderedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = orderedData\n .filter((item, 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 [setSelectedIds, orderedData, 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]) => transaction.patch(docId, ops))\n\n await transaction\n .commit()\n .then((updated) => {\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 })\n .catch(() => {\n setDraggingId(``)\n setListIsUpdating(false)\n toast.push({\n title: `Reordering failed`,\n status: `error`,\n })\n })\n },\n [client, setDraggingId, clearSelected, setListIsUpdating, toast]\n )\n\n const handleDragEnd = useCallback(\n (result: DropResult | 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) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds?.length ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (!effectedIds?.length) 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) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches?.length) {\n transactPatches(patches, message)\n }\n },\n [selectedIds, setDraggingId, setSelectedIds, 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, setDraggingId]\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 = {\n draggableId: id,\n source: {index: shiftFrom},\n destination: {index: shiftTo},\n }\n\n return handleDragEnd(result as DropResult, 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 (!orderedData.length) return []\n\n const orderField = orderedData.map((item) => item[ORDER_FIELD_NAME])\n\n return orderField.filter((item, index) => orderField.indexOf(item) !== index)\n }, [orderedData])\n\n const onDragEnd = useCallback(\n (result: DropResult) => handleDragEnd(result, orderedData),\n [orderedData, 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 {orderedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n // onClick={(event) => handleDraggableClick(event, provided, snapshot)}\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 = Boolean(!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 // eslint-disable-next-line react/jsx-no-bind\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={orderedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.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 {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Container, Spinner, Stack, Text} from '@sanity/ui'\n\nimport {useListeningQuery, Feedback} from 'sanity-plugin-utils'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {SanityDocumentWithOrder} from './types'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocumentWithOrder[] | null>([])\n\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = {\n ...params,\n type,\n order: ORDER_FIELD_NAME,\n }\n\n const {\n data: queryData,\n loading,\n error,\n } = useListeningQuery<SanityDocumentWithOrder[]>(query, {\n params: queryParams,\n initialValue: [],\n })\n\n useEffect(() => {\n if (queryData) {\n const filteredDocuments = queryData.reduce<SanityDocumentWithOrder[]>((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = queryData.some((doc) => doc._id === `drafts.${cur._id}`)\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n // Check if the draft has a published version\n cur.hasPublished = queryData.some((doc) => doc._id === cur._id.replace(`drafts.`, ``))\n\n return [...acc, cur]\n }, [])\n\n setData(filteredDocuments)\n } else {\n setData([])\n }\n }, [queryData])\n\n const unorderedDataCount = useMemo(\n () => (data?.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\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 || 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 return (\n <Stack space={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 {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport {Box, type ToastParams} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n // eslint-disable-next-line react/require-default-props\n filter?: string\n // eslint-disable-next-line react/require-default-props\n params?: Record<string, unknown>\n}\n\n// 1. Validate first that the schema has been configured for ordering\n// 2. Setup context for showIncrements\nexport default function DocumentListWrapper({\n type,\n showIncrements,\n resetOrderTransaction,\n filter,\n params,\n}: DocumentListWrapperProps) {\n const toast = useToast()\n const schema = useSchema()\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={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {SanityClient} from '@sanity/client'\nimport {ORDER_FIELD_NAME} from './constants'\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(type = ``, client: SanityClient) {\n const query = `*[_type == $type]|order(@[$order] asc)._id`\n const queryParams = {type, order: ORDER_FIELD_NAME}\n const documents = await client.fetch(query, queryParams)\n\n if (!documents.length) {\n return null\n }\n\n const transaction = client.transaction()\n let aLexoRank = LexoRank.min()\n\n for (let index = 0; index < documents.length; index += 1) {\n // Generate next rank before even the first document so there's room to move!\n aLexoRank = aLexoRank.genNext().genNext()\n\n transaction.patch(documents[index], {\n set: {[ORDER_FIELD_NAME]: aLexoRank.toString()},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n","import {Component} from 'react'\n\nimport {SanityClient} from '@sanity/client'\nimport type {ToastParams} from '@sanity/ui'\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 }\n}\n\ninterface State {\n showIncrements: boolean\n resetOrderTransaction: ToastParams\n}\n\n// Must use a Class Component here so the actionHandlers can be called\nexport default class OrderableDocumentList extends Component<OrderableDocumentListProps, State> {\n constructor(props: OrderableDocumentListProps) {\n super(props)\n this.state = {\n showIncrements: false,\n resetOrderTransaction: {},\n }\n }\n\n actionHandlers = {\n showIncrements: () => {\n this.setState((state) => ({\n showIncrements: !state.showIncrements,\n }))\n },\n\n resetOrder: async () => {\n this.setState(() => ({\n resetOrderTransaction: {\n status: `info`,\n title: `Reordering started...`,\n closable: true,\n },\n }))\n\n const update = await resetOrder(this.props.options.type, this.props.options.client)\n\n const reorderWasSuccessful = update?.results?.length\n\n this.setState(() => ({\n resetOrderTransaction: {\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 }\n\n render() {\n const type = this?.props?.options?.type\n if (!type) {\n return null\n }\n return (\n <DocumentListWrapper\n filter={this?.props?.options?.filter}\n params={this?.props?.options?.params}\n type={type}\n showIncrements={this.state.showIncrements}\n resetOrderTransaction={this.state.resetOrderTransaction}\n />\n )\n }\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder, type ListItem} from 'sanity/desk'\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 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, params, title, icon, id, context, S} = config\n const {schema, getClient} = context\n const client = getClient({apiVersion: '2021-09-01'})\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\n return S.listItem()\n .title(listTitle)\n .id(listId)\n .icon(listIcon)\n .child(\n Object.assign(S.documentTypeList(type).serialize(), {\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},\n menuItems: [\n S.menuItem()\n .title(`Create new ${typeTitle}`)\n .intent({type: 'create', params: {type}})\n .serialize(),\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 .serialize()\n}\n"],"names":["ORDER_FIELD_NAME","initialRank","lastRankValue","lastRank","LexoRank","parse","min","nextRank","genNext","toString","orderRankField","config","type","Error","defineField","title","readOnly","hidden","name","initialValue","p","_ref","getClient","lastDocOrderRank","apiVersion","fetch","order","orderRankOrdering","by","field","direction","OrderableContext","React","createContext","Document","_ref2","doc","increment","entities","index","isFirst","isLast","dragBadge","_a","_b","showIncrements","useContext","schema","useSchema","router","usePaneRouter","ChildLink","groupIndex","routerPanesState","currentDoc","id","pressed","_id","replace","selected","length","Link","useMemo","LinkComponent","linkProps","childId","jsx","PreviewCard","__unstable_focusRing","as","radius","sizing","tabIndex","tone","width","flex","children","jsxs","Flex","align","Box","paddingX","style","flexShrink","Text","size","DragHandleIcon","cursor","gap","paddingRight","Button","padding","mode","onClick","disabled","icon","ChevronUpIcon","ChevronDownIcon","Preview","layout","value","schemaType","get","_type","Card","marginRight","AvatarCounter","count","lexicographicalSort","a","b","reorderDocuments","_ref3","selectedIds","source","destination","startIndex","endIndex","isMovingUp","selectedItems","filter","item","includes","message","concat","join","all","reduce","acc","cur","curIndex","_c","_d","prevIndex","prevRank","curRank","nextIndex","max","betweenRank","between","selectedIndex","patches","flatMap","docPatches","set","startsWith","hasPublished","push","allSorted","sort","newOrder","useSanityClient","useClient","getItemStyle","draggableStyle","itemIsUpdating","userSelect","transition","opacity","pointerEvents","cardTone","settings","isDuplicate","isGhosting","isDragging","isSelected","DraggableList","_ref4","data","listIsUpdating","setListIsUpdating","toast","useToast","orderedData","setOrderedData","useState","useEffect","draggingId","setDraggingId","setSelectedIds","clearSelected","useCallback","handleSelect","clickedId","nativeEvent","selectMultiple","shiftKey","isUsingWindows","navigator","appVersion","indexOf","selectAdditional","ctrlKey","metaKey","updatedIds","preventDefault","lastSelectedId","lastSelectedIndex","findIndex","firstSelected","lastSelected","betweenIds","itemIndex","map","client","transactPatches","transaction","forEach","_ref5","docId","ops","patch","commit","then","updated","results","status","description","catch","handleDragEnd","result","draggableId","effectedIds","handleDragStart","start","incrementIndex","shiftFrom","shiftTo","onWindowKeyDown","event","key","window","addEventListener","removeEventListener","duplicateOrders","orderField","onDragEnd","DragDropContext","onDragStart","Droppable","droppableId","provided","droppableProps","ref","innerRef","Draggable","innerProvided","innerSnapshot","Boolean","isUpdating","isDisabled","selectedCount","draggableProps","dragHandleProps","paddingBottom","shadow","e","placeholder","DEFAULT_PARAMS","DocumentListQuery","_ref6","params","setData","query","queryParams","queryData","loading","error","useListeningQuery","filteredDocuments","alsoHasDraft","some","unorderedDataCount","height","justify","Spinner","Feedback","Container","paddingY","muted","Stack","space","overflow","marginBottom","Fragment","DocumentListWrapper","_ref7","resetOrderTransaction","schemaIsInvalid","typeSchema","fields","Provider","resetOrder","arguments","undefined","documents","aLexoRank","update","err","OrderableDocumentList","Component","constructor","props","__publicField","setState","state","closable","options","reorderWasSuccessful","render","_e","_f","orderableDocumentListDeskItem","context","S","listTitle","listId","listIcon","SortIcon","typeTitle","listItem","child","Object","assign","documentTypeList","serialize","__preserveInstance","component","menuItems","menuItem","intent","GenerateIcon","action"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/helpers/constants.ts","../src/helpers/initialRank.ts","../src/fields/orderRankField.ts","../src/fields/orderRankOrdering.ts","../src/OrderableContext.ts","../src/Document.tsx","../src/helpers/reorderDocuments.ts","../src/helpers/client.ts","../src/DraggableList.tsx","../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\nexport const API_VERSION = `2021-09-01` as const\n","import {LexoRank} from 'lexorank'\nimport {NewItemPosition} from '../types'\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 default function initialRank(\n compareRankValue = ``,\n newItemPosition: NewItemPosition = 'after'\n): string {\n const compareRank = compareRankValue ? LexoRank.parse(compareRankValue) : LexoRank.min()\n const rank =\n newItemPosition === 'before' ? compareRank.genPrev().genPrev() : compareRank.genNext().genNext()\n\n return rank.toString()\n}\n","import {type ConfigContext, defineField} from 'sanity'\nimport {API_VERSION, ORDER_FIELD_NAME} from '../helpers/constants'\nimport initialRank from '../helpers/initialRank'\nimport {NewItemPosition} from '../types'\n\nexport type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>\n\nexport interface RankFieldConfig {\n type: string\n newItemPosition?: NewItemPosition\n}\n\nexport const orderRankField = (config: RankFieldConfig) => {\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'} = config\n return defineField({\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...config,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async (p, {getClient}) => {\n const direction = newItemPosition === 'before' ? 'asc' : 'desc'\n\n const lastDocOrderRank = await getClient({apiVersion: API_VERSION}).fetch(\n `*[_type == $type]|order(@[$order] ${direction})[0][$order]`,\n {type, order: ORDER_FIELD_NAME}\n )\n return initialRank(lastDocOrderRank, newItemPosition)\n },\n })\n}\n","import {SortOrdering} from 'sanity'\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 React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {useContext, useMemo, type ReactNode} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {AvatarCounter, Card, Box, Button, Flex, Text} from '@sanity/ui'\nimport {useSchema, SchemaType, PreviewCard, Preview} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport {OrderableContext} from './OrderableContext'\nimport {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 default 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 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\n const Link = useMemo(\n () =>\n function LinkComponent(linkProps: {children: ReactNode}) {\n return <ChildLink {...linkProps} childId={doc._id} />\n },\n [ChildLink, doc._id]\n )\n\n return (\n <PreviewCard\n __unstable_focusRing\n // @ts-expect-error\n as={Link}\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 >\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 // eslint-disable-next-line react/jsx-no-bind\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 // eslint-disable-next-line react/jsx-no-bind\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\">\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\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 {LexoRank} from 'lexorank'\nimport type {PatchOperations} from 'sanity'\n\nimport {SanityDocumentWithOrder} from '../types'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocumentWithOrder[]\n selectedItems: SanityDocumentWithOrder[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocumentWithOrder[]\n selectedIds: string[]\n source: any\n destination: any\n}\n\nexport interface ReorderReturn {\n newOrder: SanityDocumentWithOrder[]\n patches: [string, PatchOperations][]\n message: any\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 = entities[prevIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[prevIndex]?.[ORDER_FIELD_NAME] as string)\n : LexoRank.min()\n\n const curRank = LexoRank.parse(entities[curIndex][ORDER_FIELD_NAME] as string)\n\n const nextIndex = curIndex + 1\n const nextRank = entities[nextIndex]?.[ORDER_FIELD_NAME]\n ? LexoRank.parse(entities[nextIndex]?.[ORDER_FIELD_NAME] as string)\n : 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 (let selectedIndex = 0; selectedIndex < selectedItems.length; selectedIndex += 1) {\n selectedItems[selectedIndex][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 {useClient} from 'sanity'\nimport {API_VERSION} from './constants'\n\nexport function useSanityClient() {\n return useClient({apiVersion: API_VERSION})\n}\n","import {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from '@hello-pangea/dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport type {PatchOperations} from 'sanity'\nimport {usePaneRouter} from 'sanity/desk'\n\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\nimport {SanityDocumentWithOrder} from './types'\n\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\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 default function DraggableList({\n data,\n listIsUpdating,\n setListIsUpdating,\n}: 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\n // Update local state when documents change from an outside source\n useEffect(() => {\n if (!listIsUpdating) setOrderedData(data)\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [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 = []\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]\n const lastSelectedIndex = orderedData.findIndex((item) => item._id === lastSelectedId)\n\n const firstSelected = index < lastSelectedIndex ? index : lastSelectedIndex\n const lastSelected = index > lastSelectedIndex ? index : lastSelectedIndex\n\n const betweenIds = orderedData\n .filter((item, 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 [setSelectedIds, orderedData, 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]) => transaction.patch(docId, ops))\n\n await transaction\n .commit()\n .then((updated) => {\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 })\n .catch(() => {\n setDraggingId(``)\n setListIsUpdating(false)\n toast.push({\n title: `Reordering failed`,\n status: `error`,\n })\n })\n },\n [client, setDraggingId, clearSelected, setListIsUpdating, toast]\n )\n\n const handleDragEnd = useCallback(\n (result: DropResult | 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) return\n\n // A document can be dragged without being one-of-many-selected\n const effectedIds = selectedIds?.length ? selectedIds : [draggableId]\n\n // Don't do anything if we don't have ids to effect\n if (!effectedIds?.length) 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) {\n setOrderedData(newOrder)\n }\n\n // Transact new order patches\n if (patches?.length) {\n transactPatches(patches, message)\n }\n },\n [selectedIds, setDraggingId, setSelectedIds, 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, setDraggingId]\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 = {\n draggableId: id,\n source: {index: shiftFrom},\n destination: {index: shiftTo},\n }\n\n return handleDragEnd(result as DropResult, 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 (!orderedData.length) return []\n\n const orderField = orderedData.map((item) => item[ORDER_FIELD_NAME])\n\n return orderField.filter((item, index) => orderField.indexOf(item) !== index)\n }, [orderedData])\n\n const onDragEnd = useCallback(\n (result: DropResult) => handleDragEnd(result, orderedData),\n [orderedData, 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 {orderedData.map((item, index) => (\n <Draggable\n key={`${item._id}-${item[ORDER_FIELD_NAME]}`}\n draggableId={item._id}\n index={index}\n // onClick={(event) => handleDraggableClick(event, provided, snapshot)}\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 = Boolean(!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 // eslint-disable-next-line react/jsx-no-bind\n onClick={(e) => handleSelect(item._id, index, e.nativeEvent)}\n >\n <Document\n doc={item}\n entities={orderedData}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.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 {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Container, Spinner, Stack, Text} from '@sanity/ui'\n\nimport {useListeningQuery, Feedback} from 'sanity-plugin-utils'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {SanityDocumentWithOrder} from './types'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocumentWithOrder[] | null>([])\n\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = {\n ...params,\n type,\n order: ORDER_FIELD_NAME,\n }\n\n const {\n data: queryData,\n loading,\n error,\n } = useListeningQuery<SanityDocumentWithOrder[]>(query, {\n params: queryParams,\n initialValue: [],\n })\n\n useEffect(() => {\n if (queryData) {\n const filteredDocuments = queryData.reduce<SanityDocumentWithOrder[]>((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = queryData.some((doc) => doc._id === `drafts.${cur._id}`)\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n // Check if the draft has a published version\n cur.hasPublished = queryData.some((doc) => doc._id === cur._id.replace(`drafts.`, ``))\n\n return [...acc, cur]\n }, [])\n\n setData(filteredDocuments)\n } else {\n setData([])\n }\n }, [queryData])\n\n const unorderedDataCount = useMemo(\n () => (data?.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\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 || 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 return (\n <Stack space={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 {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport {Box, type ToastParams} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n // eslint-disable-next-line react/require-default-props\n filter?: string\n // eslint-disable-next-line react/require-default-props\n params?: Record<string, unknown>\n}\n\n// 1. Validate first that the schema has been configured for ordering\n// 2. Setup context for showIncrements\nexport default function DocumentListWrapper({\n type,\n showIncrements,\n resetOrderTransaction,\n filter,\n params,\n}: DocumentListWrapperProps) {\n const toast = useToast()\n const schema = useSchema()\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={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {SanityClient} from '@sanity/client'\nimport {ORDER_FIELD_NAME} from './constants'\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(type = ``, client: SanityClient) {\n const query = `*[_type == $type]|order(@[$order] asc)._id`\n const queryParams = {type, order: ORDER_FIELD_NAME}\n const documents = await client.fetch(query, queryParams)\n\n if (!documents.length) {\n return null\n }\n\n const transaction = client.transaction()\n let aLexoRank = LexoRank.min()\n\n for (let index = 0; index < documents.length; index += 1) {\n // Generate next rank before even the first document so there's room to move!\n aLexoRank = aLexoRank.genNext().genNext()\n\n transaction.patch(documents[index], {\n set: {[ORDER_FIELD_NAME]: aLexoRank.toString()},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n","import {Component} from 'react'\n\nimport {SanityClient} from '@sanity/client'\nimport type {ToastParams} from '@sanity/ui'\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 }\n}\n\ninterface State {\n showIncrements: boolean\n resetOrderTransaction: ToastParams\n}\n\n// Must use a Class Component here so the actionHandlers can be called\nexport default class OrderableDocumentList extends Component<OrderableDocumentListProps, State> {\n constructor(props: OrderableDocumentListProps) {\n super(props)\n this.state = {\n showIncrements: false,\n resetOrderTransaction: {},\n }\n }\n\n actionHandlers = {\n showIncrements: () => {\n this.setState((state) => ({\n showIncrements: !state.showIncrements,\n }))\n },\n\n resetOrder: async () => {\n this.setState(() => ({\n resetOrderTransaction: {\n status: `info`,\n title: `Reordering started...`,\n closable: true,\n },\n }))\n\n const update = await resetOrder(this.props.options.type, this.props.options.client)\n\n const reorderWasSuccessful = update?.results?.length\n\n this.setState(() => ({\n resetOrderTransaction: {\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 }\n\n render() {\n const type = this?.props?.options?.type\n if (!type) {\n return null\n }\n return (\n <DocumentListWrapper\n filter={this?.props?.options?.filter}\n params={this?.props?.options?.params}\n type={type}\n showIncrements={this.state.showIncrements}\n resetOrderTransaction={this.state.resetOrderTransaction}\n />\n )\n }\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder, type ListItem, type MenuItem} from 'sanity/desk'\nimport OrderableDocumentList from '../OrderableDocumentList'\nimport {API_VERSION} from '../helpers/constants'\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 client = getClient({apiVersion: API_VERSION})\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\n if (createIntent !== false) {\n menuItems.push(\n S.menuItem()\n .title(`Create new ${typeTitle}`)\n .intent({type: 'create', params: {type}})\n .serialize()\n )\n }\n return S.listItem()\n .title(listTitle)\n .id(listId)\n .icon(listIcon)\n .child(\n Object.assign(S.documentTypeList(type).serialize(), {\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},\n menuItems: [\n ...menuItems,\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 .serialize()\n}\n"],"names":["ORDER_FIELD_NAME","API_VERSION","initialRank","compareRankValue","arguments","length","undefined","newItemPosition","compareRank","LexoRank","parse","min","rank","genPrev","genNext","toString","orderRankField","config","type","Error","defineField","title","readOnly","hidden","name","initialValue","p","_ref","getClient","direction","lastDocOrderRank","apiVersion","fetch","concat","order","orderRankOrdering","by","field","OrderableContext","React","createContext","Document","_ref2","doc","increment","entities","index","isFirst","isLast","dragBadge","_a","_b","showIncrements","useContext","schema","useSchema","router","usePaneRouter","ChildLink","groupIndex","routerPanesState","currentDoc","id","pressed","_id","replace","selected","Link","useMemo","LinkComponent","linkProps","childId","jsx","PreviewCard","__unstable_focusRing","as","radius","sizing","tabIndex","tone","width","flex","children","jsxs","Flex","align","Box","paddingX","style","flexShrink","Text","size","DragHandleIcon","cursor","gap","paddingRight","Button","padding","mode","onClick","disabled","icon","ChevronUpIcon","ChevronDownIcon","Preview","layout","value","schemaType","get","_type","Card","marginRight","AvatarCounter","count","lexicographicalSort","a","b","reorderDocuments","_ref3","selectedIds","source","destination","startIndex","endIndex","isMovingUp","selectedItems","filter","item","includes","message","join","all","reduce","acc","cur","curIndex","_c","_d","prevIndex","prevRank","curRank","nextIndex","nextRank","max","betweenRank","between","selectedIndex","patches","flatMap","docPatches","set","startsWith","hasPublished","push","allSorted","sort","newOrder","useSanityClient","useClient","getItemStyle","draggableStyle","itemIsUpdating","userSelect","transition","opacity","pointerEvents","cardTone","settings","isDuplicate","isGhosting","isDragging","isSelected","DraggableList","_ref4","data","listIsUpdating","setListIsUpdating","toast","useToast","orderedData","setOrderedData","useState","useEffect","draggingId","setDraggingId","setSelectedIds","clearSelected","useCallback","handleSelect","clickedId","nativeEvent","selectMultiple","shiftKey","isUsingWindows","navigator","appVersion","indexOf","selectAdditional","ctrlKey","metaKey","updatedIds","preventDefault","lastSelectedId","lastSelectedIndex","findIndex","firstSelected","lastSelected","betweenIds","itemIndex","map","client","transactPatches","transaction","forEach","_ref5","docId","ops","patch","commit","then","updated","results","status","description","catch","handleDragEnd","result","draggableId","effectedIds","handleDragStart","start","incrementIndex","shiftFrom","shiftTo","onWindowKeyDown","event","key","window","addEventListener","removeEventListener","duplicateOrders","orderField","onDragEnd","DragDropContext","onDragStart","Droppable","droppableId","provided","droppableProps","ref","innerRef","Draggable","innerProvided","innerSnapshot","Boolean","isUpdating","isDisabled","selectedCount","draggableProps","dragHandleProps","paddingBottom","shadow","e","placeholder","DEFAULT_PARAMS","DocumentListQuery","_ref6","params","setData","query","queryParams","queryData","loading","error","useListeningQuery","filteredDocuments","alsoHasDraft","some","unorderedDataCount","height","justify","Spinner","Feedback","Container","paddingY","muted","Stack","space","overflow","marginBottom","Fragment","DocumentListWrapper","_ref7","resetOrderTransaction","schemaIsInvalid","typeSchema","fields","Provider","resetOrder","documents","aLexoRank","update","err","OrderableDocumentList","Component","constructor","props","__publicField","setState","state","closable","options","reorderWasSuccessful","render","_e","_f","orderableDocumentListDeskItem","context","S","menuItems","createIntent","listTitle","listId","listIcon","SortIcon","typeTitle","menuItem","intent","serialize","listItem","child","Object","assign","documentTypeList","__preserveInstance","component","GenerateIcon","action"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/orderable-document-list",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Drag-and-drop Document Ordering without leaving the Editing surface",
5
5
  "keywords": [
6
6
  "sanity",
@@ -68,7 +68,7 @@
68
68
  "@commitlint/config-conventional": "^17.6.6",
69
69
  "@sanity/pkg-utils": "^2.3.3",
70
70
  "@sanity/plugin-kit": "^3.1.7",
71
- "@sanity/semantic-release-preset": "^4.1.1",
71
+ "@sanity/semantic-release-preset": "^4.1.6",
72
72
  "@types/react": "^18.2.14",
73
73
  "@typescript-eslint/eslint-plugin": "^5.61.0",
74
74
  "@typescript-eslint/parser": "^5.61.0",
@@ -89,14 +89,16 @@
89
89
  "react-dom": "^18.2.0",
90
90
  "react-is": "^18.2.0",
91
91
  "rimraf": "^5.0.1",
92
- "sanity": "^3.14.1",
93
- "semantic-release": "^21.0.7",
94
- "styled-components": "^5.3.6",
92
+ "sanity": "^3.3.1",
93
+ "semantic-release": "^22.0.6",
95
94
  "typescript": "^5.1.6"
96
95
  },
97
96
  "peerDependencies": {
97
+ "@sanity/ui": "^1.0 || ^2.0",
98
98
  "react": "^18",
99
- "sanity": "^3"
99
+ "react-dom": "^18",
100
+ "sanity": "^3.0.0",
101
+ "styled-components": "^5.0 || ^6.0"
100
102
  },
101
103
  "engines": {
102
104
  "node": ">=14"
package/src/Document.tsx CHANGED
@@ -65,7 +65,7 @@ export default function Document({
65
65
  flex={1}
66
66
  >
67
67
  <Flex align="center">
68
- <Box paddingX={3} style={{flexShrink: 0}}>
68
+ <Box paddingX={2} style={{flexShrink: 0}}>
69
69
  <Text size={2}>
70
70
  <DragHandleIcon cursor="grab" />
71
71
  </Text>
@@ -90,7 +90,7 @@ export default function Document({
90
90
  />
91
91
  </Flex>
92
92
  )}
93
- <Box style={{width: `100%`}} padding={2}>
93
+ <Box style={{width: `100%`}}>
94
94
  <Flex flex={1} align="center">
95
95
  <Preview
96
96
  layout="default"
@@ -2,8 +2,9 @@ import {GenerateIcon, SortIcon} from '@sanity/icons'
2
2
  import type {ConfigContext} from 'sanity'
3
3
 
4
4
  import {ComponentType} from 'react'
5
- import {StructureBuilder, type ListItem} from 'sanity/desk'
5
+ import {StructureBuilder, type ListItem, type MenuItem} from 'sanity/desk'
6
6
  import OrderableDocumentList from '../OrderableDocumentList'
7
+ import {API_VERSION} from '../helpers/constants'
7
8
 
8
9
  export interface OrderableListConfig {
9
10
  type: string
@@ -12,6 +13,8 @@ export interface OrderableListConfig {
12
13
  icon?: ComponentType
13
14
  params?: Record<string, unknown>
14
15
  filter?: string
16
+ menuItems?: MenuItem[]
17
+ createIntent?: boolean
15
18
  context: ConfigContext
16
19
  S: StructureBuilder
17
20
  }
@@ -25,15 +28,23 @@ export function orderableDocumentListDeskItem(config: OrderableListConfig): List
25
28
  `)
26
29
  }
27
30
 
28
- const {type, filter, params, title, icon, id, context, S} = config
31
+ const {type, filter, menuItems = [], createIntent, params, title, icon, id, context, S} = config
29
32
  const {schema, getClient} = context
30
- const client = getClient({apiVersion: '2021-09-01'})
33
+ const client = getClient({apiVersion: API_VERSION})
31
34
 
32
35
  const listTitle = title ?? `Orderable ${type}`
33
36
  const listId = id ?? `orderable-${type}`
34
37
  const listIcon = icon ?? SortIcon
35
38
  const typeTitle = schema.get(type)?.title ?? type
36
39
 
40
+ if (createIntent !== false) {
41
+ menuItems.push(
42
+ S.menuItem()
43
+ .title(`Create new ${typeTitle}`)
44
+ .intent({type: 'create', params: {type}})
45
+ .serialize()
46
+ )
47
+ }
37
48
  return S.listItem()
38
49
  .title(listTitle)
39
50
  .id(listId)
@@ -49,10 +60,7 @@ export function orderableDocumentListDeskItem(config: OrderableListConfig): List
49
60
  component: OrderableDocumentList,
50
61
  options: {type, filter, params, client},
51
62
  menuItems: [
52
- S.menuItem()
53
- .title(`Create new ${typeTitle}`)
54
- .intent({type: 'create', params: {type}})
55
- .serialize(),
63
+ ...menuItems,
56
64
  S.menuItem().title(`Reset Order`).icon(GenerateIcon).action(`resetOrder`).serialize(),
57
65
  S.menuItem()
58
66
  .title(`Toggle Increments`)
@@ -1,11 +1,13 @@
1
1
  import {type ConfigContext, defineField} from 'sanity'
2
- import {ORDER_FIELD_NAME} from '../helpers/constants'
2
+ import {API_VERSION, ORDER_FIELD_NAME} from '../helpers/constants'
3
3
  import initialRank from '../helpers/initialRank'
4
+ import {NewItemPosition} from '../types'
4
5
 
5
6
  export type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>
6
7
 
7
8
  export interface RankFieldConfig {
8
9
  type: string
10
+ newItemPosition?: NewItemPosition
9
11
  }
10
12
 
11
13
  export const orderRankField = (config: RankFieldConfig) => {
@@ -18,7 +20,7 @@ export const orderRankField = (config: RankFieldConfig) => {
18
20
  )
19
21
  }
20
22
 
21
- const {type} = config
23
+ const {type, newItemPosition = 'after'} = config
22
24
  return defineField({
23
25
  title: 'Order Rank',
24
26
  readOnly: true,
@@ -27,11 +29,13 @@ export const orderRankField = (config: RankFieldConfig) => {
27
29
  name: ORDER_FIELD_NAME,
28
30
  type: 'string',
29
31
  initialValue: async (p, {getClient}) => {
30
- const lastDocOrderRank = await getClient({apiVersion: '2021-09-01'}).fetch(
31
- `*[_type == $type]|order(@[$order] desc)[0][$order]`,
32
+ const direction = newItemPosition === 'before' ? 'asc' : 'desc'
33
+
34
+ const lastDocOrderRank = await getClient({apiVersion: API_VERSION}).fetch(
35
+ `*[_type == $type]|order(@[$order] ${direction})[0][$order]`,
32
36
  {type, order: ORDER_FIELD_NAME}
33
37
  )
34
- return initialRank(lastDocOrderRank)
38
+ return initialRank(lastDocOrderRank, newItemPosition)
35
39
  },
36
40
  })
37
41
  }
@@ -1,5 +1,6 @@
1
1
  import {useClient} from 'sanity'
2
+ import {API_VERSION} from './constants'
2
3
 
3
4
  export function useSanityClient() {
4
- return useClient({apiVersion: '2021-09-01'})
5
+ return useClient({apiVersion: API_VERSION})
5
6
  }
@@ -1 +1,3 @@
1
1
  export const ORDER_FIELD_NAME = `orderRank` as const
2
+
3
+ export const API_VERSION = `2021-09-01` as const
@@ -1,10 +1,15 @@
1
1
  import {LexoRank} from 'lexorank'
2
+ import {NewItemPosition} from '../types'
2
3
 
3
4
  // Use in initial value field by passing in the rank value of the last document
4
5
  // If not value passed, generate a sensibly low rank
5
- export default function initialRank(lastRankValue = ``): string {
6
- const lastRank = lastRankValue ? LexoRank.parse(lastRankValue) : LexoRank.min()
7
- const nextRank = lastRank.genNext().genNext()
6
+ export default function initialRank(
7
+ compareRankValue = ``,
8
+ newItemPosition: NewItemPosition = 'after'
9
+ ): string {
10
+ const compareRank = compareRankValue ? LexoRank.parse(compareRankValue) : LexoRank.min()
11
+ const rank =
12
+ newItemPosition === 'before' ? compareRank.genPrev().genPrev() : compareRank.genNext().genNext()
8
13
 
9
- return nextRank.toString()
14
+ return rank.toString()
10
15
  }
package/src/types.ts CHANGED
@@ -6,3 +6,5 @@ export interface SanityDocumentWithOrder extends SanityDocument {
6
6
  [ORDER_FIELD_NAME]?: string
7
7
  hasPublished?: boolean
8
8
  }
9
+
10
+ export type NewItemPosition = 'after' | 'before'