@sanity/orderable-document-list 1.0.0-v3-studio.1 → 1.0.0-v3-studio.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -10
- package/lib/index.d.ts +2 -9
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +18 -40
- package/lib/index.js.map +1 -1
- package/lib/index.modern.js +18 -40
- package/lib/index.modern.js.map +1 -1
- package/package.json +11 -11
- package/src/desk-structure/orderableDocumentListDeskItem.ts +2 -4
- package/src/fields/orderRankField.ts +8 -16
- package/src/helpers/client.ts +1 -9
- package/src/desk-structure/globalClientWorkaround.ts +0 -33
package/README.md
CHANGED
|
@@ -109,9 +109,6 @@ Additionally, pass in overrides for the field, such as making it visible by pass
|
|
|
109
109
|
|
|
110
110
|
You cannot override the `name`, `type` or `initialValue` attributes.
|
|
111
111
|
|
|
112
|
-
Take note that orderRankField requires a configured sanity client, that must be passed
|
|
113
|
-
from the schema configuration context as shown in the following example:
|
|
114
|
-
|
|
115
112
|
```js
|
|
116
113
|
// sanity.config.js
|
|
117
114
|
import {createConfig} from "sanity";
|
|
@@ -124,8 +121,7 @@ export default createConfig({
|
|
|
124
121
|
deskTool({structure: (S, context) => {/* snip */}})
|
|
125
122
|
],
|
|
126
123
|
schema: {
|
|
127
|
-
|
|
128
|
-
types: (previousTypes, context) => {
|
|
124
|
+
types: (previousTypes) => {
|
|
129
125
|
return [
|
|
130
126
|
...previousTypes,
|
|
131
127
|
{
|
|
@@ -137,10 +133,10 @@ export default createConfig({
|
|
|
137
133
|
orderings: [orderRankOrdering],
|
|
138
134
|
fields: [
|
|
139
135
|
// Minimum required configuration
|
|
140
|
-
orderRankField({ type: "category"
|
|
136
|
+
orderRankField({ type: "category" }),
|
|
141
137
|
|
|
142
138
|
// OR you can override _some_ of the field settings
|
|
143
|
-
orderRankField({ type: 'category', hidden: false
|
|
139
|
+
orderRankField({ type: 'category', hidden: false }),
|
|
144
140
|
|
|
145
141
|
// ...all other fields
|
|
146
142
|
],
|
|
@@ -177,7 +173,7 @@ To get this first version out the door there are few configuration settings and
|
|
|
177
173
|
Feedback and PRs welcome :)
|
|
178
174
|
|
|
179
175
|
### Breaking change in the v3 version
|
|
180
|
-
`
|
|
176
|
+
`orderableDocumentListDeskItem` requires context from sanity config now.
|
|
181
177
|
See the examples above.
|
|
182
178
|
|
|
183
179
|
## How it works
|
|
@@ -201,7 +197,9 @@ on how to run this plugin with hotreload in the studio.d & watch
|
|
|
201
197
|
|
|
202
198
|
## Release new version
|
|
203
199
|
|
|
204
|
-
Run ["CI & Release" workflow](https://github.com/sanity-io/
|
|
205
|
-
Make sure to select the
|
|
200
|
+
Run ["CI & Release" workflow](https://github.com/sanity-io/orderable-document-list/actions).
|
|
201
|
+
Make sure to select the `v3` branch and check "Release new version".
|
|
202
|
+
|
|
203
|
+
Version will be automatically bumped based on [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) since the last release.
|
|
206
204
|
|
|
207
205
|
Semantic release will only release on configured branches, so it is safe to run release on any branch.
|
package/lib/index.d.ts
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
1
|
import { ConfigContext } from "sanity";
|
|
2
2
|
import { ComponentType } from "react";
|
|
3
3
|
import { StructureBuilder } from "sanity/desk";
|
|
4
|
-
type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>;
|
|
5
4
|
export interface RankFieldConfig {
|
|
6
5
|
type: string;
|
|
7
|
-
context: SchemaContext;
|
|
8
6
|
}
|
|
9
7
|
export const orderRankField: (config: RankFieldConfig) => {
|
|
8
|
+
type: "string";
|
|
10
9
|
name: "orderRank";
|
|
11
|
-
|
|
12
|
-
initialValue: () => Promise<string>;
|
|
13
|
-
context: SchemaContext;
|
|
14
|
-
title: string;
|
|
15
|
-
readOnly: boolean;
|
|
16
|
-
hidden: boolean;
|
|
17
|
-
};
|
|
10
|
+
} & Omit<import("sanity").Schema.StringDefinition, "preview"> & import("sanity").Schema.FieldBase & import("@sanity/types/lib/dts/src/schema/defineTypes").WidenValidation & import("@sanity/types/lib/dts/src/schema/defineTypes").WidenInitialValue;
|
|
18
11
|
export const orderRankOrdering: {
|
|
19
12
|
title: string;
|
|
20
13
|
name: string;
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":";;;
|
|
1
|
+
{"mappings":";;;AEMA;IACE,IAAI,EAAE,MAAM,CAAA;CACb;AAED,OAAO,MAAM,yBAA0B,eAAe;;;qPA0BrD,CAAA;AClCD,OAAO,MAAM;;;;;;;CAIZ,CAAA;AWCD;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,aAAa,CAAA;IACtB,CAAC,EAAE,gBAAgB,CAAA;CACpB;AAED,8CAA8C,MAAM,EAAE,mBAAmB,kCA2CxE","sources":["src/src/helpers/constants.ts","src/src/helpers/initialRank.ts","src/src/fields/orderRankField.ts","src/src/fields/orderRankOrdering.ts","src/src/OrderableContext.ts","src/src/Document.tsx","src/src/helpers/reorderDocuments.ts","src/src/helpers/client.ts","src/src/DraggableList.tsx","src/src/Feedback.tsx","src/src/DocumentListQuery.tsx","src/src/DocumentListWrapper.tsx","src/src/helpers/resetOrder.ts","src/src/OrderableDocumentList.tsx","src/src/desk-structure/orderableDocumentListDeskItem.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import {orderRankField, RankFieldConfig} from './fields/orderRankField'\nimport {orderRankOrdering} from './fields/orderRankOrdering'\nimport {\n orderableDocumentListDeskItem,\n type OrderableListConfig,\n} from './desk-structure/orderableDocumentListDeskItem'\n\nexport type {OrderableListConfig, RankFieldConfig}\nexport {orderRankField, orderRankOrdering, orderableDocumentListDeskItem}\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../"}
|
package/lib/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
var $3KLdq$sanity = require("sanity");
|
|
1
2
|
var $3KLdq$lexorank = require("lexorank");
|
|
2
3
|
var $3KLdq$sanityicons = require("@sanity/icons");
|
|
3
4
|
var $3KLdq$reactjsxruntime = require("react/jsx-runtime");
|
|
4
5
|
var $3KLdq$react = require("react");
|
|
5
6
|
var $3KLdq$sanityui = require("@sanity/ui");
|
|
6
|
-
var $3KLdq$sanity = require("sanity");
|
|
7
7
|
var $3KLdq$reactbeautifuldnd = require("react-beautiful-dnd");
|
|
8
8
|
var $3KLdq$sanitydesk = require("sanity/desk");
|
|
9
9
|
var $3KLdq$sanity_unstable = require("sanity/_unstable");
|
|
@@ -18,6 +18,7 @@ function $parcel$interopDefault(a) {
|
|
|
18
18
|
$parcel$export(module.exports, "orderRankField", () => $cc532e4527e08c0f$export$64a609a9111ff100);
|
|
19
19
|
$parcel$export(module.exports, "orderRankOrdering", () => $0a2b7163675b4332$export$db2ff2f898748a67);
|
|
20
20
|
$parcel$export(module.exports, "orderableDocumentListDeskItem", () => $9f7e9a421b4d07af$export$3b014deba4b8ca00);
|
|
21
|
+
|
|
21
22
|
const $7e21cb9e508f672b$export$64f27603cb09ba16 = `orderRank`;
|
|
22
23
|
|
|
23
24
|
|
|
@@ -29,48 +30,29 @@ function $b1e493eff806e5a4$export$2e2bcd8739ae039(lastRankValue = ``) {
|
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
|
|
32
|
-
const $21298532e6cb38a9$var$subscriptions = {};
|
|
33
|
-
function $21298532e6cb38a9$export$59b6ebc56d192aaa(context) {
|
|
34
|
-
($21298532e6cb38a9$var$subscriptions[$21298532e6cb38a9$var$clientKey(context)] ?? []).forEach((subscriber)=>subscriber(context.client));
|
|
35
|
-
}
|
|
36
|
-
function $21298532e6cb38a9$export$a2a87dc3ab91967(context, callback) {
|
|
37
|
-
const key = $21298532e6cb38a9$var$clientKey(context);
|
|
38
|
-
const existing = $21298532e6cb38a9$var$subscriptions[key] ?? [];
|
|
39
|
-
$21298532e6cb38a9$var$subscriptions[key] = [
|
|
40
|
-
...existing,
|
|
41
|
-
callback
|
|
42
|
-
];
|
|
43
|
-
}
|
|
44
|
-
function $21298532e6cb38a9$var$clientKey(context) {
|
|
45
|
-
return `${context.projectId}:${context.dataset}`;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
33
|
const $cc532e4527e08c0f$export$64a609a9111ff100 = (config)=>{
|
|
50
|
-
if (!config?.type
|
|
51
|
-
type
|
|
52
|
-
Example: orderRankField({type: 'category'
|
|
34
|
+
if (!config?.type) throw new Error(`
|
|
35
|
+
type must be provided.
|
|
36
|
+
Example: orderRankField({type: 'category'})
|
|
53
37
|
`);
|
|
54
38
|
const { type: type } = config;
|
|
55
|
-
|
|
56
|
-
(0, $21298532e6cb38a9$export$a2a87dc3ab91967)(config.context, (updatedClient)=>{
|
|
57
|
-
client = updatedClient;
|
|
58
|
-
});
|
|
59
|
-
return {
|
|
39
|
+
return (0, $3KLdq$sanity.defineField)({
|
|
60
40
|
title: "Order Rank",
|
|
61
41
|
readOnly: true,
|
|
62
42
|
hidden: true,
|
|
63
43
|
...config,
|
|
64
44
|
name: (0, $7e21cb9e508f672b$export$64f27603cb09ba16),
|
|
65
45
|
type: "string",
|
|
66
|
-
initialValue: async ()=>{
|
|
67
|
-
const lastDocOrderRank = await
|
|
46
|
+
initialValue: async ({ getClient: getClient })=>{
|
|
47
|
+
const lastDocOrderRank = await getClient({
|
|
48
|
+
apiVersion: "2021-09-01"
|
|
49
|
+
}).fetch(`*[_type == $type]|order(@[$order] desc)[0][$order]`, {
|
|
68
50
|
type: type,
|
|
69
51
|
order: (0, $7e21cb9e508f672b$export$64f27603cb09ba16)
|
|
70
52
|
});
|
|
71
53
|
return (0, $b1e493eff806e5a4$export$2e2bcd8739ae039)(lastDocOrderRank);
|
|
72
54
|
}
|
|
73
|
-
};
|
|
55
|
+
});
|
|
74
56
|
};
|
|
75
57
|
|
|
76
58
|
|
|
@@ -263,14 +245,10 @@ const $460233bd0d4c2ff3$export$1b86f2c90605ffb9 = ({ entities: entities , select
|
|
|
263
245
|
|
|
264
246
|
|
|
265
247
|
|
|
266
|
-
|
|
267
248
|
function $66c7844c36e4ff21$export$8d49af9be9632eba() {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}), [
|
|
272
|
-
baseClient
|
|
273
|
-
]);
|
|
249
|
+
return (0, $3KLdq$sanity.useClient)({
|
|
250
|
+
apiVersion: "2021-09-01"
|
|
251
|
+
});
|
|
274
252
|
}
|
|
275
253
|
|
|
276
254
|
|
|
@@ -802,7 +780,6 @@ class $7faf82429f78b250$export$2e2bcd8739ae039 extends (0, $3KLdq$react.Componen
|
|
|
802
780
|
}
|
|
803
781
|
|
|
804
782
|
|
|
805
|
-
|
|
806
783
|
function $9f7e9a421b4d07af$export$3b014deba4b8ca00(config) {
|
|
807
784
|
if (!config?.type || !config.context || !config.S) throw new Error(`
|
|
808
785
|
type, context and S (StructureBuilder) must be provided.
|
|
@@ -810,9 +787,10 @@ function $9f7e9a421b4d07af$export$3b014deba4b8ca00(config) {
|
|
|
810
787
|
Example: orderableDocumentListDeskItem({type: 'category'})
|
|
811
788
|
`);
|
|
812
789
|
const { type: type , filter: filter , params: params , title: title , icon: icon , id: id , context: context , S: S } = config;
|
|
813
|
-
const { schema: schema ,
|
|
814
|
-
|
|
815
|
-
|
|
790
|
+
const { schema: schema , getClient: getClient } = context;
|
|
791
|
+
const client = getClient({
|
|
792
|
+
apiVersion: "2021-09-01"
|
|
793
|
+
});
|
|
816
794
|
const listTitle = title ?? `Orderable ${type}`;
|
|
817
795
|
const listId = id ?? `orderable-${type}`;
|
|
818
796
|
const listIcon = icon ?? (0, $3KLdq$sanityicons.SortIcon);
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/fields/orderRankField.ts","src/helpers/constants.ts","src/helpers/initialRank.ts","src/desk-structure/globalClientWorkaround.ts","src/fields/orderRankOrdering.ts","src/desk-structure/orderableDocumentListDeskItem.ts","src/OrderableDocumentList.tsx","src/DocumentListWrapper.tsx","src/DocumentListQuery.tsx","src/DraggableList.tsx","src/Document.tsx","src/OrderableContext.ts","src/helpers/reorderDocuments.ts","src/helpers/client.ts","src/Feedback.tsx","src/helpers/resetOrder.ts"],"sourcesContent":["import {orderRankField, RankFieldConfig} from './fields/orderRankField'\nimport {orderRankOrdering} from './fields/orderRankOrdering'\nimport {\n orderableDocumentListDeskItem,\n type OrderableListConfig,\n} from './desk-structure/orderableDocumentListDeskItem'\n\nexport type {OrderableListConfig, RankFieldConfig}\nexport {orderRankField, orderRankOrdering, orderableDocumentListDeskItem}\n","import {ConfigContext} from 'sanity'\nimport type {SanityClient} from '@sanity/client'\nimport {ORDER_FIELD_NAME} from '../helpers/constants'\nimport initialRank from '../helpers/initialRank'\nimport {subscribeSanityClient} from '../desk-structure/globalClientWorkaround'\n\nexport type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>\n\nexport interface RankFieldConfig {\n type: string\n context: SchemaContext\n}\n\nexport const orderRankField = (config: RankFieldConfig) => {\n if (!config?.type || !config.context) {\n throw new Error(\n `\n type and context must be provided. context is available when configuring schema.\n Example: orderRankField({type: 'category', context})\n `\n )\n }\n\n const {type} = config\n\n let client: SanityClient | undefined\n subscribeSanityClient(config.context, (updatedClient) => {\n client = updatedClient\n })\n return {\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...config,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async () => {\n const lastDocOrderRank = await client?.fetch(\n `*[_type == $type]|order(@[$order] desc)[0][$order]`,\n {type, order: ORDER_FIELD_NAME}\n )\n return initialRank(lastDocOrderRank)\n },\n }\n}\n","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 as any).value\n}\n","import {SanityClient} from '@sanity/client'\nimport type {ConfigContext} from 'sanity'\nimport {SchemaContext} from '../fields/orderRankField'\n\ntype ClientSubscription = (client: SanityClient) => void\ntype ClientKey = `${string}:${string}`\nconst subscriptions: Record<ClientKey, ClientSubscription[]> = {}\n\n/**\n * @internal\n *\n * v3 does not expose client in the schema API, which means no client for the initial value code.\n * This is a workaround for that; we update the global client from a place we _do_ have access to the client,\n * the use the global in schema-callbacks.\n *\n * Note: The code assumes sanityClientChanged is called AFTER all subscribeSanityClient calls are done.\n */\nexport function sanityClientChanged(context: ConfigContext) {\n ;(subscriptions[clientKey(context)] ?? []).forEach((subscriber) => subscriber(context.client))\n}\n\n/**\n * @internal\n */\nexport function subscribeSanityClient(context: SchemaContext, callback: ClientSubscription) {\n const key = clientKey(context)\n const existing = subscriptions[key] ?? []\n subscriptions[key] = [...existing, callback]\n}\n\nfunction clientKey(context: SchemaContext): ClientKey {\n return `${context.projectId}:${context.dataset}`\n}\n","import {ORDER_FIELD_NAME} from '../helpers/constants'\n\nexport const orderRankOrdering = {\n title: 'Ordered',\n name: 'ordered',\n by: [{field: ORDER_FIELD_NAME, direction: 'asc'}],\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder} from 'sanity/desk'\nimport OrderableDocumentList from '../OrderableDocumentList'\nimport {sanityClientChanged} from './globalClientWorkaround'\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) {\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, client} = context\n // workaround so schemas can get access to client in callbacks\n sanityClientChanged(context)\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().title(`Show Increments`).icon(SortIcon).action(`showIncrements`).serialize(),\n ],\n })\n )\n .serialize()\n}\n","import React, {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 React, {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport type {ToastParams} from '@sanity/ui'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n filter?: string\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 <Feedback>{schemaIsInvalid}</Feedback>\n }\n\n return (\n <OrderableContext.Provider value={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import React, {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Spinner, Stack} from '@sanity/ui'\n\nimport type {SanityDocument} from 'sanity'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\nimport {useSanityClient} from './helpers/client'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\n//rxjs Subscription does not seem to comply with sanity client subscribe anymore\ntype ClientSubscription = ReturnType<\n ReturnType<ReturnType<typeof useSanityClient>['listen']>['subscribe']\n>\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [isLoading, setIsLoading] = useState(true)\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocument[]>([])\n\n const client = useSanityClient()\n\n useEffect(() => {\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = Object.assign(params, {type, order: ORDER_FIELD_NAME})\n let subscription: ClientSubscription | undefined\n\n // eslint-disable-next-line require-await\n const fetchData = async () => {\n client.fetch<SanityDocument[]>(query, queryParams).then((documents) => {\n // Remove published document from list if draft also exists\n const filteredDocuments = documents.reduce((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = documents.some((doc) => doc._id === `drafts.${cur._id}`)\n\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n return [...acc, cur]\n }, [] as SanityDocument[])\n\n setData(filteredDocuments)\n\n if (isLoading) {\n setIsLoading(false)\n }\n })\n }\n\n const prepareData = async () => {\n setIsLoading(true)\n\n await fetchData()\n\n if (!subscription) {\n subscription = client.listen(query, queryParams).subscribe(() => fetchData())\n }\n }\n\n // Get data but only if a document isn't being patched or we don't yet have data\n if (!listIsUpdating && !data.length) {\n prepareData()\n }\n\n return () => subscription?.unsubscribe()\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [type])\n\n const unorderedDataCount = useMemo(\n () => (data.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\n [data]\n )\n\n if (isLoading)\n return (\n <Flex style={{width: `100%`, height: `100%`}} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n\n return (\n <Stack space={1} style={{overflow: `scroll`, height: `100%`}}>\n {unorderedDataCount > 0 && (\n <Feedback>\n {unorderedDataCount}/{data.length} Documents have no Order. Select{' '}\n <strong>Reset Order</strong> from the Menu above to fix.\n </Feedback>\n )}\n <Box padding={1}>\n <DraggableList\n data={data}\n type={type}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />\n </Box>\n </Stack>\n )\n}\n","import React, {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from 'react-beautiful-dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport {usePaneRouter} from 'sanity/desk'\nimport type {SanityDocument, PatchOperations} from 'sanity'\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\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\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\n}\n\nexport interface DraggableListProps {\n data: SanityDocument[]\n type: string\n listIsUpdating: boolean\n setListIsUpdating: (val: boolean) => void\n}\n\nexport default function DraggableList({\n data,\n type,\n listIsUpdating,\n setListIsUpdating,\n}: DraggableListProps) {\n const toast = useToast()\n const router = usePaneRouter()\n const {navigateIntent} = router\n\n // Maintains local state order before transaction completes\n const [orderedData, setOrderedData] = useState<SanityDocument[]>(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[]>([])\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 navigateIntent('edit', {id: clickedId, type})\n return setSelectedIds([clickedId])\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, navigateIntent, orderedData, selectedIds, type]\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: SanityDocument[]) => {\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 as any)\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: SanityDocument[]) => {\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\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 tone={tone} shadow={isDragging ? 2 : undefined} radius={2}>\n <Document\n doc={item}\n entities={orderedData}\n handleSelect={handleSelect}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.length - 1}\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 React, {useContext} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {SanityPreview as Preview} from 'sanity/_unstable'\n\nimport {useSchema, SanityDocument, SchemaType} from 'sanity'\nimport {OrderableContext} from './OrderableContext'\n\nexport interface DocumentProps {\n doc: SanityDocument\n entities: SanityDocument[]\n handleSelect: (docId: string, index: number, event: MouseEvent) => void\n increment: (index: number, nextIndex: number, docId: string, entities: SanityDocument[]) => void\n index: number\n isFirst: boolean\n isLast: boolean\n}\n\nexport default function Document({\n doc,\n increment,\n entities,\n handleSelect,\n index,\n isFirst,\n isLast,\n}: DocumentProps) {\n const {showIncrements} = useContext(OrderableContext)\n const schema = useSchema()\n return (\n <Flex align=\"center\">\n <Box paddingX={3} style={{flexShrink: 0}}>\n <Text size={4}>\n <DragHandleIcon />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index + -1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Button\n style={{width: `100%`}}\n padding={2}\n mode=\"bleed\"\n onClick={(e) => handleSelect(doc._id, index, e.nativeEvent)}\n >\n <Flex flex={1} align=\"center\">\n <Box flex={1}>\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\n </Box>\n </Flex>\n </Button>\n </Flex>\n )\n}\n","import React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {LexoRank} from 'lexorank'\nimport type {PatchOperations, SanityDocument} from 'sanity'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocument[]\n selectedItems: SanityDocument[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocument[]\n selectedIds: string[]\n source: any\n destination: any\n debug?: boolean\n}\n\nfunction lexicographicalSort(a: {[ORDER_FIELD_NAME]: string}, b: {[ORDER_FIELD_NAME]: string}) {\n if (a[ORDER_FIELD_NAME] < b[ORDER_FIELD_NAME]) {\n return -1\n }\n 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 debug = false,\n}: ReorderArgs) => {\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 (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 seleced 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 as any).value as string\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: [] as SanityDocument[], selected: [] as SanityDocument[]}\n )\n\n const patches: [string, PatchOperations][] = selected.map((doc) => {\n return [\n doc._id,\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ]\n })\n\n // Safety-check to make sure everything is in order\n const allSorted = (all as unknown as {[ORDER_FIELD_NAME]: string}[]).sort(lexicographicalSort)\n\n return {newOrder: allSorted, patches, message}\n}\n","import {useClient} from 'sanity'\nimport {useMemo} from 'react'\n\nexport function useSanityClient() {\n const baseClient = useClient()\n return useMemo(\n () =>\n baseClient.withConfig({\n apiVersion: '2021-09-01',\n }),\n [baseClient]\n )\n}\n","import React, {PropsWithChildren} from 'react'\nimport {Box, Card, Text} from '@sanity/ui'\n\nexport default function Feedback({children}: PropsWithChildren<{}>) {\n return (\n <Box padding={3}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Text>{children}</Text>\n </Card>\n </Box>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {ORDER_FIELD_NAME} from './constants'\nimport {SanityClient} from '@sanity/client'\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 as any).value as string},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
|
|
1
|
+
{"mappings":";;;;;;;;;;;;;;;;;;;;ACAA;ACAO,MAAM,yCAAgB,GAAG,CAAC,SAAS,CAAC,AAAS;;;ACApD;AAIe,kDAAqB,aAAa,GAAG,CAAC,CAAC,EAAU;IAC9D,MAAM,QAAQ,GAAG,aAAa,GAAG,CAAA,GAAA,wBAAQ,CAAA,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAA,GAAA,wBAAQ,CAAA,CAAC,GAAG,EAAE;IAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE;IAE7C,OAAO,AAAC,QAAQ,CAAS,KAAK,CAAA;CAC/B;;;AFCM,MAAM,yCAAc,GAAG,CAAC,MAAuB,GAAK;IACzD,IAAI,CAAC,MAAM,EAAE,IAAI,EACf,MAAM,IAAI,KAAK,CACb,CAAC;;;MAGD,CAAC,CACF,CAAA;IAGH,MAAM,QAAC,IAAI,CAAA,EAAC,GAAG,MAAM;IACrB,OAAO,CAAA,GAAA,yBAAW,CAAA,CAAC;QACjB,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,GAAG,MAAM;QACT,IAAI,EAAE,CAAA,GAAA,yCAAgB,CAAA;QACtB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,OAAO,aAAC,SAAS,CAAA,EAAC,GAAK;YACnC,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC;gBAAC,UAAU,EAAE,YAAY;aAAC,CAAC,CAAC,KAAK,CACxE,CAAC,kDAAkD,CAAC,EACpD;sBAAC,IAAI;gBAAE,KAAK,EAAE,CAAA,GAAA,yCAAgB,CAAA;aAAC,CAChC;YACD,OAAO,CAAA,GAAA,wCAAW,CAAA,CAAC,gBAAgB,CAAC,CAAA;SACrC;KACF,CAAC,CAAA;CACH;;ADpCD;AIAA;AAEO,MAAM,yCAAiB,GAAG;IAC/B,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,EAAE,EAAE;QAAC;YAAC,KAAK,EAAE,CAAA,GAAA,yCAAgB,CAAA;YAAE,SAAS,EAAE,KAAK;SAAC;KAAC;CAClD;;;ACND;ACAA;;ACAA;;;;ACAA;;;ACAA;;;;;ACAA;;;;;;ACAA;AAMO,MAAM,yCAAgB,GAAG,CAAA,GAAA,sCAAK,CAAA,CAAC,aAAa,CAAwB,EAAE,CAAC;;;ADY/D,kDAAkB,OAC/B,GAAG,CAAA,aACH,SAAS,CAAA,YACT,QAAQ,CAAA,gBACR,YAAY,CAAA,SACZ,KAAK,CAAA,WACL,OAAO,CAAA,UACP,MAAM,CAAA,EACQ,EAAE;IAChB,MAAM,kBAAC,cAAc,CAAA,EAAC,GAAG,CAAA,GAAA,uBAAU,CAAA,CAAC,CAAA,GAAA,yCAAgB,CAAA,CAAC;IACrD,MAAM,MAAM,GAAG,CAAA,GAAA,uBAAS,CAAA,EAAE;IAC1B,qBACE,iCAAC,CAAA,GAAA,oBAAI,CAAA;QAAC,KAAK,EAAC,QAAQ;;0BAClB,gCAAC,CAAA,GAAA,mBAAG,CAAA;gBAAC,QAAQ,EAAE,CAAC;gBAAE,KAAK,EAAE;oBAAC,UAAU,EAAE,CAAC;iBAAC;0BACtC,cAAA,gCAAC,CAAA,GAAA,oBAAI,CAAA;oBAAC,IAAI,EAAE,CAAC;8BACX,cAAA,gCAAC,CAAA,GAAA,iCAAc,CAAA,KAAG;kBACb;cACH;YACL,cAAc,kBACb,iCAAC,CAAA,GAAA,oBAAI,CAAA;gBAAC,KAAK,EAAE;oBAAC,UAAU,EAAE,CAAC;iBAAC;gBAAE,KAAK,EAAC,QAAQ;gBAAC,GAAG,EAAE,CAAC;gBAAE,YAAY,EAAE,CAAC;;kCAClE,gCAAC,CAAA,GAAA,sBAAM,CAAA;wBACL,OAAO,EAAE,CAAC;wBACV,IAAI,EAAC,OAAO;wBACZ,OAAO,EAAE,IAAM,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;wBAC9D,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,CAAA,GAAA,gCAAa,CAAA;sBACnB;kCACF,gCAAC,CAAA,GAAA,sBAAM,CAAA;wBACL,OAAO,EAAE,CAAC;wBACV,IAAI,EAAC,OAAO;wBACZ,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,IAAM,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;wBAC7D,IAAI,EAAE,CAAA,GAAA,kCAAe,CAAA;sBACrB;;cACG,AACR;0BACD,gCAAC,CAAA,GAAA,sBAAM,CAAA;gBACL,KAAK,EAAE;oBAAC,KAAK,EAAE,CAAC,IAAI,CAAC;iBAAC;gBACtB,OAAO,EAAE,CAAC;gBACV,IAAI,EAAC,OAAO;gBACZ,OAAO,EAAE,CAAC,CAAC,GAAK,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC;0BAE3D,cAAA,gCAAC,CAAA,GAAA,oBAAI,CAAA;oBAAC,IAAI,EAAE,CAAC;oBAAE,KAAK,EAAC,QAAQ;8BAC3B,cAAA,gCAAC,CAAA,GAAA,mBAAG,CAAA;wBAAC,IAAI,EAAE,CAAC;kCACV,cAAA,gCAAC,CAAA,GAAA,oCAAO,CAAA;4BACN,MAAM,EAAC,SAAS;4BAChB,KAAK,EAAE,GAAG;4BACV,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;0BACjC;sBACE;kBACD;cACA;;MACJ,CACR;CACF;;;AExED;;AAqBA,SAAS,yCAAmB,CAAC,CAA+B,EAAE,CAA+B,EAAE;IAC7F,IAAI,CAAC,CAAC,GAAA,yCAAgB,CAAC,GAAG,CAAC,CAAC,GAAA,yCAAgB,CAAC,EAC3C,OAAO,EAAE,CAAA;IAEX,IAAI,CAAC,CAAC,GAAA,yCAAgB,CAAC,GAAG,CAAC,CAAC,GAAA,yCAAgB,CAAC,EAC3C,OAAO,CAAC,CAAA;IAEV,OAAO,CAAC,CAAA;CACT;AAEM,MAAM,yCAAgB,GAAG,CAAC,YAC/B,QAAQ,CAAA,eACR,WAAW,CAAA,UACX,MAAM,CAAA,eACN,WAAW,CAAA,SACX,KAAK,GAAG,KAAK,GACD,GAAK;IACjB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK;IAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK;IAClC,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ;IACxC,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,GAAK,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG;QACd,CAAC,KAAK,CAAC;QACP,aAAa,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;QAC/E,UAAU,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,CAAC,aAAa,CAAC;QACf,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;KACvC,CAAC,IAAI,CAAC,GAAG,CAAC;IAEX,MAAM,OAAC,GAAG,CAAA,YAAE,QAAQ,CAAA,EAAC,GAAG,QAAQ,CAAC,MAAM,CACrC,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAK;QACtB,wDAAwD;QACxD,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAC/B,OAAO;YAAC,GAAG,EAAE,GAAG,CAAC,GAAG;YAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ;SAAC,CAAA;QAG/C,wBAAwB;QACxB,IAAI,QAAQ,KAAK,QAAQ,EAAE;YACzB,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC;YAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAA,yCAAgB,CAAC,GACpD,CAAA,GAAA,wBAAQ,CAAA,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAA,yCAAgB,CAAC,CAAW,GACjE,CAAA,GAAA,wBAAQ,CAAA,CAAC,GAAG,EAAE;YAElB,MAAM,OAAO,GAAG,CAAA,GAAA,wBAAQ,CAAA,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAA,yCAAgB,CAAC,CAAW;YAE9E,MAAM,SAAS,GAAG,QAAQ,GAAG,CAAC;YAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAA,yCAAgB,CAAC,GACpD,CAAA,GAAA,wBAAQ,CAAA,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,GAAA,yCAAgB,CAAC,CAAW,GACjE,CAAA,GAAA,wBAAQ,CAAA,CAAC,GAAG,EAAE;YAElB,IAAI,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAEpF,sEAAsE;YACtE,IAAK,IAAI,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,CAAE;gBACpF,aAAa,CAAC,aAAa,CAAC,CAAC,GAAA,yCAAgB,CAAC,GAAG,AAAC,WAAW,CAAS,KAAK,AAAU;gBACrF,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;aACxF;YAED,OAAO;gBACL,0DAA0D;gBAC1D,kDAAkD;gBAClD,GAAG,EAAE,UAAU,GACX;uBAAI,GAAG,CAAC,GAAG;uBAAK,aAAa;oBAAE,GAAG;iBAAC,GACnC;uBAAI,GAAG,CAAC,GAAG;oBAAE,GAAG;uBAAK,aAAa;iBAAC;gBACvC,QAAQ,EAAE,aAAa;aACxB,CAAA;SACF;QAED,OAAO;YAAC,GAAG,EAAE;mBAAI,GAAG,CAAC,GAAG;gBAAE,GAAG;aAAC;YAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ;SAAC,CAAA;KACxD,EACD;QAAC,GAAG,EAAE,EAAE;QAAsB,QAAQ,EAAE,EAAE;KAAqB,CAChE;IAED,MAAM,OAAO,GAAgC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,GAAK;QACjE,OAAO;YACL,GAAG,CAAC,GAAG;YACP;gBACE,GAAG,EAAE;oBACH,CAAC,CAAA,GAAA,yCAAgB,CAAA,CAAC,EAAE,GAAG,CAAC,GAAA,yCAAgB,CAAC;iBAC1C;aACF;SACF,CAAA;KACF,CAAC;IAEF,mDAAmD;IACnD,MAAM,SAAS,GAAG,AAAC,GAAG,CAA+C,IAAI,CAAC,yCAAmB,CAAC;IAE9F,OAAO;QAAC,QAAQ,EAAE,SAAS;iBAAE,OAAO;iBAAE,OAAO;KAAC,CAAA;CAC/C;;;;AC7GD;AAEO,SAAS,yCAAe,GAAG;IAChC,OAAO,CAAA,GAAA,uBAAS,CAAA,CAAC;QAAC,UAAU,EAAE,YAAY;KAAC,CAAC,CAAA;CAC7C;;;AJMD,MAAM,kCAAY,GAAG,CACnB,cAAyC,EACzC,cAAuB,GACJ,CAAA;QACnB,UAAU,EAAE,MAAM;QAClB,UAAU,EAAE,CAAC,yBAAyB,CAAC;QACvC,OAAO,EAAE,cAAc,GAAG,GAAG,GAAG,CAAC;QACjC,aAAa,EAAE,cAAc,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS;QAClD,GAAG,cAAc;KAClB,CAAA,AAAC;AAEF,MAAM,8BAAQ,GAAG,CAAC,QAAqB,GAAK;IAC1C,MAAM,eAAC,WAAW,CAAA,cAAE,UAAU,CAAA,cAAE,UAAU,CAAA,cAAE,UAAU,CAAA,EAAC,GAAG,QAAQ;IAElE,IAAI,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IACpC,IAAI,UAAU,IAAI,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,IAAI,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAEjC,OAAO,SAAS,CAAA;CACjB;AAgBc,kDAAuB,QACpC,IAAI,CAAA,QACJ,IAAI,CAAA,kBACJ,cAAc,CAAA,qBACd,iBAAiB,CAAA,EACE,EAAE;IACrB,MAAM,KAAK,GAAG,CAAA,GAAA,wBAAQ,CAAA,EAAE;IACxB,MAAM,MAAM,GAAG,CAAA,GAAA,+BAAa,CAAA,EAAE;IAC9B,MAAM,kBAAC,cAAc,CAAA,EAAC,GAAG,MAAM;IAE/B,2DAA2D;IAC3D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,CAAA,GAAA,qBAAQ,CAAA,CAAmB,IAAI,CAAC;IAEtE,kEAAkE;IAClE,CAAA,GAAA,sBAAS,CAAA,CAAC,IAAM;QACd,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC;IACzC,0DAA0D,EAC3D,EAAE;QAAC,IAAI;KAAC,CAAC;IAEV,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,CAAA,GAAA,qBAAQ,CAAA,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,CAAA,GAAA,qBAAQ,CAAA,CAAW,EAAE,CAAC;IAE5D,MAAM,aAAa,GAAG,CAAA,GAAA,wBAAW,CAAA,CAAC,IAAM,cAAc,CAAC,EAAE,CAAC,EAAE;QAAC,cAAc;KAAC,CAAC;IAE7E,MAAM,YAAY,GAAG,CAAA,GAAA,wBAAW,CAAA,CAC9B,CAAC,SAAiB,EAAE,KAAa,EAAE,WAAuB,GAAK;QAC7D,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;QAClD,MAAM,cAAc,GAAG,WAAW,CAAC,QAAQ;QAC3C,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE;QACjE,MAAM,gBAAgB,GAAG,cAAc,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO;QAEnF,IAAI,UAAU,GAAG,EAAE;QAEnB,yCAAyC;QACzC,qCAAqC;QACrC,kBAAkB;QAClB,IAAI,CAAC,cAAc,IAAI,CAAC,gBAAgB,EAAE;YACxC,cAAc,CAAC,MAAM,EAAE;gBAAC,EAAE,EAAE,SAAS;sBAAE,IAAI;aAAC,CAAC;YAC7C,OAAO,cAAc,CAAC;gBAAC,SAAS;aAAC,CAAC,CAAA;SACnC;QAED,kEAAkE;QAClE,4BAA4B;QAC5B,IAAI,cAAc,IAAI,CAAC,UAAU,EAAE;YACjC,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1D,MAAM,iBAAiB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,GAAK,IAAI,CAAC,GAAG,KAAK,cAAc,CAAC;YAEtF,MAAM,aAAa,GAAG,KAAK,GAAG,iBAAiB,GAAG,KAAK,GAAG,iBAAiB;YAC3E,MAAM,YAAY,GAAG,KAAK,GAAG,iBAAiB,GAAG,KAAK,GAAG,iBAAiB;YAE1E,MAAM,UAAU,GAAG,WAAW,CAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,SAAS,GAAK,SAAS,GAAG,aAAa,IAAI,SAAS,GAAG,YAAY,CAAC,CAClF,GAAG,CAAC,CAAC,IAAI,GAAK,IAAI,CAAC,GAAG,CAAC;YAE1B,UAAU,GAAG;mBAAI,WAAW;mBAAK,UAAU;gBAAE,SAAS;aAAC;SACxD,MAAM,IAAI,UAAU,EACnB,yBAAyB;QACzB,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,GAAK,EAAE,KAAK,SAAS,CAAC;aAEzD,wBAAwB;QACxB,UAAU,GAAG;eAAI,WAAW;YAAE,SAAS;SAAC;QAG1C,OAAO,cAAc,CAAC,UAAU,CAAC,CAAA;KAClC,EACD;QAAC,cAAc;QAAE,cAAc;QAAE,WAAW;QAAE,WAAW;QAAE,IAAI;KAAC,CACjE;IAED,MAAM,MAAM,GAAG,CAAA,GAAA,yCAAe,CAAA,EAAE;IAEhC,MAAM,eAAe,GAAG,CAAA,GAAA,wBAAW,CAAA,CACjC,OAAO,OAAoC,EAAE,OAAe,GAAK;QAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE;QAExC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,GAAK,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEhE,MAAM,WAAW,CACd,MAAM,EAAE,CACR,IAAI,CAAC,CAAC,OAAO,GAAK;YACjB,aAAa,EAAE;YACf,aAAa,CAAC,CAAC,CAAC,CAAC;YACjB,iBAAiB,CAAC,KAAK,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,CAAC,EACN,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CACpF,UAAU,CAAC;gBACZ,MAAM,EAAE,CAAC,OAAO,CAAC;gBACjB,WAAW,EAAE,OAAO;aACrB,CAAC;SACH,CAAC,CACD,KAAK,CAAC,IAAM;YACX,aAAa,CAAC,CAAC,CAAC,CAAC;YACjB,iBAAiB,CAAC,KAAK,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,CAAC,iBAAiB,CAAC;gBAC1B,MAAM,EAAE,CAAC,KAAK,CAAC;aAChB,CAAC;SACH,CAAC;KACL,EACD;QAAC,MAAM;QAAE,aAAa;QAAE,aAAa;QAAE,iBAAiB;QAAE,KAAK;KAAC,CACjE;IAED,MAAM,aAAa,GAAG,CAAA,GAAA,wBAAW,CAAA,CAC/B,CAAC,MAA8B,EAAE,QAA0B,GAAK;QAC9D,aAAa,CAAC,CAAC,CAAC,CAAC;QAEjB,MAAM,UAAC,MAAM,CAAA,eAAE,WAAW,CAAA,eAAE,WAAW,CAAA,EAAC,GAAG,MAAM,IAAI,EAAE;QAEvD,uCAAuC;QACvC,IAAI,MAAM,EAAE,KAAK,KAAK,WAAW,EAAE,KAAK,EAAE,OAAM;QAEhD,mDAAmD;QACnD,IAAI,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,OAAM;QAE7C,+DAA+D;QAC/D,MAAM,WAAW,GAAG,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG;YAAC,WAAW;SAAC;QAErE,mDAAmD;QACnD,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAM;QAEhC,0DAA0D;QAC1D,iBAAiB,CAAC,IAAI,CAAC;QACvB,cAAc,CAAC,WAAW,CAAC;QAE3B,MAAM,YAAC,QAAQ,CAAA,WAAE,OAAO,CAAA,WAAE,OAAO,CAAA,EAAC,GAAG,CAAA,GAAA,yCAAgB,CAAA,CAAC;sBACpD,QAAQ;YACR,WAAW,EAAE,WAAW;oBACxB,MAAM;yBACN,WAAW;SACZ,CAAC;QAEF,qBAAqB;QACrB,IAAI,QAAQ,EAAE,MAAM,EAClB,cAAc,CAAC,QAAQ,CAAQ;QAGjC,6BAA6B;QAC7B,IAAI,OAAO,EAAE,MAAM,EACjB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC;KAEpC,EACD;QAAC,WAAW;QAAE,aAAa;QAAE,cAAc;QAAE,eAAe;QAAE,iBAAiB;KAAC,CACjF;IAED,MAAM,eAAe,GAAG,CAAA,GAAA,wBAAW,CAAA,CACjC,CAAC,KAA4B,GAAK;QAChC,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW;QAC5B,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEzC,gEAAgE;QAChE,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE;QAE9B,aAAa,CAAC,EAAE,CAAC;KAClB,EACD;QAAC,WAAW;QAAE,aAAa;QAAE,aAAa;KAAC,CAC5C;IAED,6EAA6E;IAC7E,MAAM,cAAc,GAAG,CAAA,GAAA,wBAAW,CAAA,CAChC,CAAC,SAAiB,EAAE,OAAe,EAAE,EAAU,EAAE,QAA0B,GAAK;QAC9E,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,EAAE;YACf,MAAM,EAAE;gBAAC,KAAK,EAAE,SAAS;aAAC;YAC1B,WAAW,EAAE;gBAAC,KAAK,EAAE,OAAO;aAAC;SAC9B;QAED,OAAO,aAAa,CAAC,MAAM,EAAgB,QAAQ,CAAC,CAAA;KACrD,EACD;QAAC,aAAa;KAAC,CAChB;IAED,MAAM,eAAe,GAAG,CAAA,GAAA,wBAAW,CAAA,CACjC,CAAC,KAAoB,GAAK;QACxB,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EACxB,aAAa,EAAE;KAElB,EACD;QAAC,aAAa;KAAC,CAChB;IAED,CAAA,GAAA,sBAAS,CAAA,CAAC,IAAM;QACd,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,eAAe,CAAC;QAEnD,OAAO,IAAM;YACX,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,eAAe,CAAC;SACvD,CAAA;KACF,EAAE;QAAC,eAAe;KAAC,CAAC;IAErB,4CAA4C;IAC5C,MAAM,eAAe,GAAG,CAAA,GAAA,oBAAO,CAAA,CAAC,IAAM;QACpC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;QAElC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,GAAK,IAAI,CAAC,GAAA,yCAAgB,CAAC,CAAC;QAEpE,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,GAAK,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAA;KAC9E,EAAE;QAAC,WAAW;KAAC,CAAC;IAEjB,MAAM,SAAS,GAAG,CAAA,GAAA,wBAAW,CAAA,CAC3B,CAAC,MAAkB,GAAK,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,EAC1D;QAAC,WAAW;QAAE,aAAa;KAAC,CAC7B;IAED,qBACE,gCAAC,CAAA,GAAA,wCAAe,CAAA;QAAC,WAAW,EAAE,eAAe;QAAE,SAAS,EAAE,SAAS;kBACjE,cAAA,gCAAC,CAAA,GAAA,kCAAS,CAAA;YAAC,WAAW,EAAC,kBAAkB;sBACtC,CAAC,QAAQ,iBACR,iCAAC,KAAG;oBAAE,GAAG,QAAQ,CAAC,cAAc;oBAAE,GAAG,EAAE,QAAQ,CAAC,QAAQ;;wBACrD,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,iBAC3B,gCAAC,CAAA,GAAA,kCAAS,CAAA;gCAER,WAAW,EAAE,IAAI,CAAC,GAAG;gCACrB,KAAK,EAAE,KAAK;0CAGX,CAAC,aAAa,EAAE,aAAa,GAAK;oCACjC,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;oCACjD,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU;oCAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,UAAU,IAAI,UAAU,IAAI,UAAU,CAAC;oCACnE,MAAM,UAAU,GAAG,cAAc,IAAI,UAAU;oCAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,GAAA,yCAAgB,CAAC,CAAC;oCACnD,MAAM,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAA,yCAAgB,CAAC,CAAC;oCACpE,MAAM,IAAI,GAAG,8BAAQ,CAAC;qDAAC,WAAW;oDAAE,UAAU;oDAAE,UAAU;oDAAE,UAAU;qCAAC,CAAC;oCAExE,qBACE,gCAAC,KAAG;wCACF,GAAG,EAAE,aAAa,CAAC,QAAQ;wCAC1B,GAAG,aAAa,CAAC,cAAc;wCAC/B,GAAG,aAAa,CAAC,eAAe;wCACjC,KAAK,EACH,UAAU,GACN;4CAAC,OAAO,EAAE,GAAG;4CAAE,aAAa,EAAE,CAAC,IAAI,CAAC;yCAAC,GACrC,kCAAY,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC;kDAGlE,cAAA,gCAAC,CAAA,GAAA,mBAAG,CAAA;4CAAC,aAAa,EAAE,CAAC;sDACnB,cAAA,gCAAC,CAAA,GAAA,oBAAI,CAAA;gDAAC,IAAI,EAAE,IAAI;gDAAE,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,SAAS;gDAAE,MAAM,EAAE,CAAC;0DAC7D,cAAA,gCAAC,CAAA,GAAA,wCAAQ,CAAA;oDACP,GAAG,EAAE,IAAI;oDACT,QAAQ,EAAE,WAAW;oDACrB,YAAY,EAAE,YAAY;oDAC1B,SAAS,EAAE,cAAc;oDACzB,KAAK,EAAE,KAAK;oDACZ,OAAO,EAAE,KAAK,KAAK,CAAC;oDACpB,MAAM,EAAE,KAAK,KAAK,WAAW,CAAC,MAAM,GAAG,CAAC;kDACxC;8CACG;0CACH;sCACF,CACP;iCACF;+BAxCI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAA,yCAAgB,CAAC,CAAC,CAAC,CAyClC,AACb,CAAC;wBACD,QAAQ,CAAC,WAAW;;kBACjB,AACP;UACS;MACI,CACnB;CACF;;;;AK/SD;;;AAGe,kDAAkB,YAAC,QAAQ,CAAA,EAAwB,EAAE;IAClE,qBACE,gCAAC,CAAA,GAAA,mBAAG,CAAA;QAAC,OAAO,EAAE,CAAC;kBACb,cAAA,gCAAC,CAAA,GAAA,oBAAI,CAAA;YAAC,OAAO,EAAE,CAAC;YAAE,MAAM,EAAE,CAAC;YAAE,MAAM,EAAE,CAAC;YAAE,IAAI,EAAC,SAAS;sBACpD,cAAA,gCAAC,CAAA,GAAA,oBAAI,CAAA;0BAAE,QAAQ;cAAQ;UAClB;MACH,CACP;CACF;;;;ANSD,MAAM,oCAAc,GAAG,EAAE;AAEV,kDAA2B,QACxC,IAAI,CAAA,UACJ,MAAM,CAAA,UACN,MAAM,GAAG,oCAAc,GACA,EAAE;IACzB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,CAAA,GAAA,qBAAQ,CAAA,CAAC,IAAI,CAAC;IAChD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,CAAA,GAAA,qBAAQ,CAAA,CAAC,KAAK,CAAC;IAC3D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAA,GAAA,qBAAQ,CAAA,CAAmB,EAAE,CAAC;IAEtD,MAAM,MAAM,GAAG,CAAA,GAAA,yCAAe,CAAA,EAAE;IAEhC,CAAA,GAAA,sBAAS,CAAA,CAAC,IAAM;QACd,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;kBACjD,EAAE,CAAA,GAAA,yCAAgB,CAAA,CAAC;KAChC,CAAC;QACF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;kBAAC,IAAI;YAAE,KAAK,EAAE,CAAA,GAAA,yCAAgB,CAAA;SAAC,CAAC;QAC1E,IAAI,YAAY,AAAgC;QAEhD,yCAAyC;QACzC,MAAM,SAAS,GAAG,UAAY;YAC5B,MAAM,CAAC,KAAK,CAAmB,KAAK,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAK;gBACrE,2DAA2D;gBAC3D,MAAM,iBAAiB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,GAAK;oBACvD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE;wBAClC,gDAAgD;wBAChD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,GAAK,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;wBAE7E,OAAO,YAAY,GAAG,GAAG,GAAG;+BAAI,GAAG;4BAAE,GAAG;yBAAC,CAAA;qBAC1C;oBAED,OAAO;2BAAI,GAAG;wBAAE,GAAG;qBAAC,CAAA;iBACrB,EAAE,EAAE,CAAqB;gBAE1B,OAAO,CAAC,iBAAiB,CAAC;gBAE1B,IAAI,SAAS,EACX,YAAY,CAAC,KAAK,CAAC;aAEtB,CAAC;SACH;QAED,MAAM,WAAW,GAAG,UAAY;YAC9B,YAAY,CAAC,IAAI,CAAC;YAElB,MAAM,SAAS,EAAE;YAEjB,IAAI,CAAC,YAAY,EACf,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,SAAS,CAAC,IAAM,SAAS,EAAE,CAAC;SAEhF;QAED,gFAAgF;QAChF,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,MAAM,EACjC,WAAW,EAAE;QAGf,OAAO,IAAM,YAAY,EAAE,WAAW,EAAE,CAAA;IACxC,0DAA0D,EAC3D,EAAE;QAAC,IAAI;KAAC,CAAC;IAEV,MAAM,kBAAkB,GAAG,CAAA,GAAA,oBAAO,CAAA,CAChC,IAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,GAAK,CAAC,GAAG,CAAC,GAAA,yCAAgB,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,AAAC,EAC7E;QAAC,IAAI;KAAC,CACP;IAED,IAAI,SAAS,EACX,qBACE,gCAAC,CAAA,GAAA,oBAAI,CAAA;QAAC,KAAK,EAAE;YAAC,KAAK,EAAE,CAAC,IAAI,CAAC;YAAE,MAAM,EAAE,CAAC,IAAI,CAAC;SAAC;QAAE,KAAK,EAAC,QAAQ;QAAC,OAAO,EAAC,QAAQ;kBAC3E,cAAA,gCAAC,CAAA,GAAA,uBAAO,CAAA,KAAG;MACN,CACR;IAEH,qBACE,iCAAC,CAAA,GAAA,qBAAK,CAAA;QAAC,KAAK,EAAE,CAAC;QAAE,KAAK,EAAE;YAAC,QAAQ,EAAE,CAAC,MAAM,CAAC;YAAE,MAAM,EAAE,CAAC,IAAI,CAAC;SAAC;;YACzD,kBAAkB,GAAG,CAAC,kBACrB,iCAAC,CAAA,GAAA,wCAAQ,CAAA;;oBACN,kBAAkB;oBAAC,GAAC;oBAAC,IAAI,CAAC,MAAM;oBAAC,kCAAgC;oBAAC,GAAG;kCACtE,gCAAC,QAAM;kCAAC,aAAW;sBAAS;oBAAA,8BAC9B;;cAAW,AACZ;0BACD,gCAAC,CAAA,GAAA,mBAAG,CAAA;gBAAC,OAAO,EAAE,CAAC;0BACb,cAAA,gCAAC,CAAA,GAAA,wCAAa,CAAA;oBACZ,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,cAAc,EAAE,cAAc;oBAC9B,iBAAiB,EAAE,iBAAiB;kBACpC;cACE;;MACA,CACT;CACF;;;;;;AD3Fc,kDAA6B,QAC1C,IAAI,CAAA,kBACJ,cAAc,CAAA,yBACd,qBAAqB,CAAA,UACrB,MAAM,CAAA,UACN,MAAM,CAAA,EACmB,EAAE;IAC3B,MAAM,KAAK,GAAG,CAAA,GAAA,wBAAQ,CAAA,EAAE;IACxB,MAAM,MAAM,GAAG,CAAA,GAAA,uBAAS,CAAA,EAAE;IAE1B,CAAA,GAAA,sBAAS,CAAA,CAAC,IAAM;QACd,IAAI,qBAAqB,EAAE,KAAK,IAAI,qBAAqB,EAAE,MAAM,EAC/D,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;KAEpC,EAAE;QAAC,qBAAqB;QAAE,KAAK;KAAC,CAAC;IAElC,MAAM,eAAe,GAAG,CAAA,GAAA,oBAAO,CAAA,CAAC,IAAM;QACpC,oBAAoB;QACpB,IAAI,CAAC,IAAI,EACP,qBACE;;gBAAE,KACG;8BAAA,gCAAC,MAAI;8BAAC,MAAI;kBAAO;gBAAA,iBACtB;;UAAG,CACJ;QAGH,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QAEnC,mBAAmB;QACnB,IAAI,CAAC,UAAU,EACb,qBACE;;gBAAE,SACO;8BAAA,gCAAC,MAAI;8BAAE,IAAI;kBAAQ;gBAAA,YAC5B;;UAAG,CACJ;QAGH,8BAA8B;QAC9B,IACE,CAAE,CAAA,QAAQ,IAAI,UAAU,CAAA,AAAC,IACzB,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,GAAK,KAAK,EAAE,IAAI,KAAK,CAAA,GAAA,yCAAgB,CAAA,CAAC,EAEpE,qBACE;;gBAAE,SACO;8BAAA,gCAAC,MAAI;8BAAE,IAAI;kBAAQ;gBAAA,gBAAc;8BAAA,gCAAC,MAAI;8BAAE,CAAA,GAAA,yCAAgB,CAAA;kBAAQ;gBAAA,gBAAc;gBAAC,GAAG;8BACzF,gCAAC,MAAI;8BAAC,QAAM;kBAAO;;UAClB,CACJ;QAGH,uCAAuC;QACvC,IACE,QAAQ,IAAI,UAAU,IACtB,UAAU,CAAC,MAAM,CAAC,IAAI,CACpB,CAAC,KAAK,GAAK,KAAK,EAAE,IAAI,KAAK,CAAA,GAAA,yCAAgB,CAAA,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,QAAQ,CAC9E,EAED,qBACE;;8BACE,gCAAC,MAAI;8BAAE,CAAA,GAAA,yCAAgB,CAAA;kBAAQ;gBAAA,mBAAiB;8BAAA,gCAAC,MAAI;8BAAE,IAAI;kBAAQ;gBAAA,UAAQ;gBAAC,GAAG;8BAC/E,gCAAC,MAAI;8BAAC,QAAM;kBAAO;gBAAA,OACrB;;UAAG,CACJ;QAGH,OAAO,EAAE,CAAA;KACV,EAAE;QAAC,IAAI;QAAE,MAAM;KAAC,CAAC;IAElB,IAAI,eAAe,EACjB,qBAAO,gCAAC,CAAA,GAAA,wCAAQ,CAAA;kBAAE,eAAe;MAAY,CAAA;IAG/C,qBACE,gCAAC,CAAA,GAAA,yCAAgB,CAAA,CAAC,QAAQ;QAAC,KAAK,EAAE;4BAAC,cAAc;SAAC;kBAChD,cAAA,gCAAC,CAAA,GAAA,wCAAiB,CAAA;YAAC,IAAI,EAAE,IAAI;YAAE,MAAM,EAAE,MAAM;YAAE,MAAM,EAAE,MAAM;UAAI;MACvC,CAC7B;CACF;;;AQlGD;;AAKO,eAAe,yCAAU,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,MAAoB,EAAE;IAChE,MAAM,KAAK,GAAG,CAAC,0CAA0C,CAAC;IAC1D,MAAM,WAAW,GAAG;cAAC,IAAI;QAAE,KAAK,EAAE,CAAA,GAAA,yCAAgB,CAAA;KAAC;IACnD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC;IAExD,IAAI,CAAC,SAAS,CAAC,MAAM,EACnB,OAAO,IAAI,CAAA;IAGb,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE;IACxC,IAAI,SAAS,GAAG,CAAA,GAAA,wBAAQ,CAAA,CAAC,GAAG,EAAE;IAE9B,IAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,CAAE;QACxD,6EAA6E;QAC7E,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE;QAEzC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAClC,GAAG,EAAE;gBAAC,CAAC,CAAA,GAAA,yCAAgB,CAAA,CAAC,EAAE,AAAC,SAAS,CAAS,KAAK;aAAW;SAC9D,CAAC;KACH;IAED,OAAO,WAAW,CACf,MAAM,EAAE,CACR,IAAI,CAAC,CAAC,MAAM,GAAK,MAAM,CAAC,CACxB,KAAK,CAAC,CAAC,GAAG,GAAK,GAAG,CAAC,CAAA;CACvB;;;ATRc,uDAAoC,CAAA,GAAA,sBAAS,CAAA;IAC1D,YAAY,KAAiC,CAAE;QAC7C,KAAK,CAAC,KAAK,CAAC;QACZ,IAAI,CAAC,KAAK,GAAG;YACX,cAAc,EAAE,KAAK;YACrB,qBAAqB,EAAE,EAAE;SAC1B;KACF;IAED,cAAc,GAAG;QACf,cAAc,EAAE,IAAM;YACpB,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,GAAM,CAAA;oBACxB,cAAc,EAAE,CAAC,KAAK,CAAC,cAAc;iBACtC,CAAA,AAAC,CAAC;SACJ;QAED,UAAU,EAAE,UAAY;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAO,CAAA;oBACnB,qBAAqB,EAAE;wBACrB,MAAM,EAAE,CAAC,IAAI,CAAC;wBACd,KAAK,EAAE,CAAC,qBAAqB,CAAC;wBAC9B,QAAQ,EAAE,IAAI;qBACf;iBACF,CAAA,AAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,CAAA,GAAA,yCAAU,CAAA,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAEnF,MAAM,oBAAoB,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM;YAEpD,IAAI,CAAC,QAAQ,CAAC,IAAO,CAAA;oBACnB,qBAAqB,EAAE;wBACrB,MAAM,EAAE,oBAAoB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;wBACjD,KAAK,EAAE,oBAAoB,GACvB,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GACrE,CAAC,iBAAiB,CAAC;wBACvB,QAAQ,EAAE,IAAI;qBACf;iBACF,CAAA,AAAC,CAAC;SACJ;KACF,CAAA;IAED,MAAM,GAAG;QACP,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI;QACvC,IAAI,CAAC,IAAI,EACP,OAAO,IAAI,CAAA;QAEb,qBACE,gCAAC,CAAA,GAAA,wCAAmB,CAAA;YAClB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;YACpC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;YACpC,IAAI,EAAE,IAAI;YACV,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACzC,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,qBAAqB;UACvD,CACH;KACF;CACF;;;AD5DM,SAAS,yCAA6B,CAAC,MAA2B,EAAE;IACzE,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,EAC/C,MAAM,IAAI,KAAK,CAAC,CAAC;;;;IAIjB,CAAC,CAAC,CAAA;IAGJ,MAAM,QAAC,IAAI,CAAA,UAAE,MAAM,CAAA,UAAE,MAAM,CAAA,SAAE,KAAK,CAAA,QAAE,IAAI,CAAA,MAAE,EAAE,CAAA,WAAE,OAAO,CAAA,KAAE,CAAC,CAAA,EAAC,GAAG,MAAM;IAClE,MAAM,UAAC,MAAM,CAAA,aAAE,SAAS,CAAA,EAAC,GAAG,OAAO;IACnC,MAAM,MAAM,GAAG,SAAS,CAAC;QAAC,UAAU,EAAE,YAAY;KAAC,CAAC;IAEpD,MAAM,SAAS,GAAG,KAAK,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAA,GAAA,2BAAQ,CAAA;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI;IAEjD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAChB,KAAK,CAAC,SAAS,CAAC,CAChB,EAAE,CAAC,MAAM,CAAC,CACV,IAAI,CAAC,QAAQ,CAAC,CACd,KAAK,CACJ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QAClD,oEAAoE;QACpE,kBAAkB,EAAE,IAAI;QACxB,wEAAwE;QACxE,GAAG,EAAE,MAAM;QAEX,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,CAAA,GAAA,wCAAqB,CAAA;QAChC,OAAO,EAAE;kBAAC,IAAI;oBAAE,MAAM;oBAAE,MAAM;oBAAE,MAAM;SAAC;QACvC,SAAS,EAAE;YACT,CAAC,CAAC,QAAQ,EAAE,CACT,KAAK,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAChC,MAAM,CAAC;gBAAC,IAAI,EAAE,QAAQ;gBAAE,MAAM,EAAE;0BAAC,IAAI;iBAAC;aAAC,CAAC,CACxC,SAAS,EAAE;YACd,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA,GAAA,+BAAY,CAAA,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAAE;YACrF,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA,GAAA,2BAAQ,CAAA,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EAAE;SAC1F;KACF,CAAC,CACH,CACA,SAAS,EAAE,CAAA;CACf;;","sources":["src/index.ts","src/fields/orderRankField.ts","src/helpers/constants.ts","src/helpers/initialRank.ts","src/fields/orderRankOrdering.ts","src/desk-structure/orderableDocumentListDeskItem.ts","src/OrderableDocumentList.tsx","src/DocumentListWrapper.tsx","src/DocumentListQuery.tsx","src/DraggableList.tsx","src/Document.tsx","src/OrderableContext.ts","src/helpers/reorderDocuments.ts","src/helpers/client.ts","src/Feedback.tsx","src/helpers/resetOrder.ts"],"sourcesContent":["import {orderRankField, RankFieldConfig} from './fields/orderRankField'\nimport {orderRankOrdering} from './fields/orderRankOrdering'\nimport {\n orderableDocumentListDeskItem,\n type OrderableListConfig,\n} from './desk-structure/orderableDocumentListDeskItem'\n\nexport type {OrderableListConfig, RankFieldConfig}\nexport {orderRankField, orderRankOrdering, orderableDocumentListDeskItem}\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 ({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","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 as any).value\n}\n","import {ORDER_FIELD_NAME} from '../helpers/constants'\n\nexport const orderRankOrdering = {\n title: 'Ordered',\n name: 'ordered',\n by: [{field: ORDER_FIELD_NAME, direction: 'asc'}],\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder} 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) {\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().title(`Show Increments`).icon(SortIcon).action(`showIncrements`).serialize(),\n ],\n })\n )\n .serialize()\n}\n","import React, {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 React, {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport type {ToastParams} from '@sanity/ui'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n filter?: string\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 <Feedback>{schemaIsInvalid}</Feedback>\n }\n\n return (\n <OrderableContext.Provider value={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import React, {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Spinner, Stack} from '@sanity/ui'\n\nimport type {SanityDocument} from 'sanity'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\nimport {useSanityClient} from './helpers/client'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\n//rxjs Subscription does not seem to comply with sanity client subscribe anymore\ntype ClientSubscription = ReturnType<\n ReturnType<ReturnType<typeof useSanityClient>['listen']>['subscribe']\n>\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [isLoading, setIsLoading] = useState(true)\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocument[]>([])\n\n const client = useSanityClient()\n\n useEffect(() => {\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = Object.assign(params, {type, order: ORDER_FIELD_NAME})\n let subscription: ClientSubscription | undefined\n\n // eslint-disable-next-line require-await\n const fetchData = async () => {\n client.fetch<SanityDocument[]>(query, queryParams).then((documents) => {\n // Remove published document from list if draft also exists\n const filteredDocuments = documents.reduce((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = documents.some((doc) => doc._id === `drafts.${cur._id}`)\n\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n return [...acc, cur]\n }, [] as SanityDocument[])\n\n setData(filteredDocuments)\n\n if (isLoading) {\n setIsLoading(false)\n }\n })\n }\n\n const prepareData = async () => {\n setIsLoading(true)\n\n await fetchData()\n\n if (!subscription) {\n subscription = client.listen(query, queryParams).subscribe(() => fetchData())\n }\n }\n\n // Get data but only if a document isn't being patched or we don't yet have data\n if (!listIsUpdating && !data.length) {\n prepareData()\n }\n\n return () => subscription?.unsubscribe()\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [type])\n\n const unorderedDataCount = useMemo(\n () => (data.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\n [data]\n )\n\n if (isLoading)\n return (\n <Flex style={{width: `100%`, height: `100%`}} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n\n return (\n <Stack space={1} style={{overflow: `scroll`, height: `100%`}}>\n {unorderedDataCount > 0 && (\n <Feedback>\n {unorderedDataCount}/{data.length} Documents have no Order. Select{' '}\n <strong>Reset Order</strong> from the Menu above to fix.\n </Feedback>\n )}\n <Box padding={1}>\n <DraggableList\n data={data}\n type={type}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />\n </Box>\n </Stack>\n )\n}\n","import React, {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from 'react-beautiful-dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport {usePaneRouter} from 'sanity/desk'\nimport type {SanityDocument, PatchOperations} from 'sanity'\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\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\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\n}\n\nexport interface DraggableListProps {\n data: SanityDocument[]\n type: string\n listIsUpdating: boolean\n setListIsUpdating: (val: boolean) => void\n}\n\nexport default function DraggableList({\n data,\n type,\n listIsUpdating,\n setListIsUpdating,\n}: DraggableListProps) {\n const toast = useToast()\n const router = usePaneRouter()\n const {navigateIntent} = router\n\n // Maintains local state order before transaction completes\n const [orderedData, setOrderedData] = useState<SanityDocument[]>(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[]>([])\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 navigateIntent('edit', {id: clickedId, type})\n return setSelectedIds([clickedId])\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, navigateIntent, orderedData, selectedIds, type]\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: SanityDocument[]) => {\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 as any)\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: SanityDocument[]) => {\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\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 tone={tone} shadow={isDragging ? 2 : undefined} radius={2}>\n <Document\n doc={item}\n entities={orderedData}\n handleSelect={handleSelect}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.length - 1}\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 React, {useContext} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {SanityPreview as Preview} from 'sanity/_unstable'\n\nimport {useSchema, SanityDocument, SchemaType} from 'sanity'\nimport {OrderableContext} from './OrderableContext'\n\nexport interface DocumentProps {\n doc: SanityDocument\n entities: SanityDocument[]\n handleSelect: (docId: string, index: number, event: MouseEvent) => void\n increment: (index: number, nextIndex: number, docId: string, entities: SanityDocument[]) => void\n index: number\n isFirst: boolean\n isLast: boolean\n}\n\nexport default function Document({\n doc,\n increment,\n entities,\n handleSelect,\n index,\n isFirst,\n isLast,\n}: DocumentProps) {\n const {showIncrements} = useContext(OrderableContext)\n const schema = useSchema()\n return (\n <Flex align=\"center\">\n <Box paddingX={3} style={{flexShrink: 0}}>\n <Text size={4}>\n <DragHandleIcon />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index + -1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Button\n style={{width: `100%`}}\n padding={2}\n mode=\"bleed\"\n onClick={(e) => handleSelect(doc._id, index, e.nativeEvent)}\n >\n <Flex flex={1} align=\"center\">\n <Box flex={1}>\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\n </Box>\n </Flex>\n </Button>\n </Flex>\n )\n}\n","import React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {LexoRank} from 'lexorank'\nimport type {PatchOperations, SanityDocument} from 'sanity'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocument[]\n selectedItems: SanityDocument[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocument[]\n selectedIds: string[]\n source: any\n destination: any\n debug?: boolean\n}\n\nfunction lexicographicalSort(a: {[ORDER_FIELD_NAME]: string}, b: {[ORDER_FIELD_NAME]: string}) {\n if (a[ORDER_FIELD_NAME] < b[ORDER_FIELD_NAME]) {\n return -1\n }\n 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 debug = false,\n}: ReorderArgs) => {\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 (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 seleced 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 as any).value as string\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: [] as SanityDocument[], selected: [] as SanityDocument[]}\n )\n\n const patches: [string, PatchOperations][] = selected.map((doc) => {\n return [\n doc._id,\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ]\n })\n\n // Safety-check to make sure everything is in order\n const allSorted = (all as unknown as {[ORDER_FIELD_NAME]: string}[]).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 React, {PropsWithChildren} from 'react'\nimport {Box, Card, Text} from '@sanity/ui'\n\nexport default function Feedback({children}: PropsWithChildren<{}>) {\n return (\n <Box padding={3}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Text>{children}</Text>\n </Card>\n </Box>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {ORDER_FIELD_NAME} from './constants'\nimport {SanityClient} from '@sanity/client'\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 as any).value as string},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"}
|
package/lib/index.modern.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import {defineField as $jPEKE$defineField, useSchema as $jPEKE$useSchema, useClient as $jPEKE$useClient} from "sanity";
|
|
1
2
|
import {LexoRank as $jPEKE$LexoRank} from "lexorank";
|
|
2
3
|
import {SortIcon as $jPEKE$SortIcon, GenerateIcon as $jPEKE$GenerateIcon, DragHandleIcon as $jPEKE$DragHandleIcon, ChevronUpIcon as $jPEKE$ChevronUpIcon, ChevronDownIcon as $jPEKE$ChevronDownIcon} from "@sanity/icons";
|
|
3
4
|
import {jsx as $jPEKE$jsx, jsxs as $jPEKE$jsxs, Fragment as $jPEKE$Fragment} from "react/jsx-runtime";
|
|
4
5
|
import $jPEKE$react, {Component as $jPEKE$Component, useEffect as $jPEKE$useEffect, useMemo as $jPEKE$useMemo, useState as $jPEKE$useState, useCallback as $jPEKE$useCallback, useContext as $jPEKE$useContext} from "react";
|
|
5
6
|
import {useToast as $jPEKE$useToast, Flex as $jPEKE$Flex, Spinner as $jPEKE$Spinner, Stack as $jPEKE$Stack, Box as $jPEKE$Box, Card as $jPEKE$Card, Text as $jPEKE$Text, Button as $jPEKE$Button} from "@sanity/ui";
|
|
6
|
-
import {useSchema as $jPEKE$useSchema, useClient as $jPEKE$useClient} from "sanity";
|
|
7
7
|
import {DragDropContext as $jPEKE$DragDropContext, Droppable as $jPEKE$Droppable, Draggable as $jPEKE$Draggable} from "react-beautiful-dnd";
|
|
8
8
|
import {usePaneRouter as $jPEKE$usePaneRouter} from "sanity/desk";
|
|
9
9
|
import {SanityPreview as $jPEKE$SanityPreview} from "sanity/_unstable";
|
|
10
10
|
|
|
11
|
+
|
|
11
12
|
const $21d4b1fe36f88c6f$export$64f27603cb09ba16 = `orderRank`;
|
|
12
13
|
|
|
13
14
|
|
|
@@ -19,48 +20,29 @@ function $27620c24e1768bdb$export$2e2bcd8739ae039(lastRankValue = ``) {
|
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
|
|
22
|
-
const $ab48bff482731fc9$var$subscriptions = {};
|
|
23
|
-
function $ab48bff482731fc9$export$59b6ebc56d192aaa(context) {
|
|
24
|
-
($ab48bff482731fc9$var$subscriptions[$ab48bff482731fc9$var$clientKey(context)] ?? []).forEach((subscriber)=>subscriber(context.client));
|
|
25
|
-
}
|
|
26
|
-
function $ab48bff482731fc9$export$a2a87dc3ab91967(context, callback) {
|
|
27
|
-
const key = $ab48bff482731fc9$var$clientKey(context);
|
|
28
|
-
const existing = $ab48bff482731fc9$var$subscriptions[key] ?? [];
|
|
29
|
-
$ab48bff482731fc9$var$subscriptions[key] = [
|
|
30
|
-
...existing,
|
|
31
|
-
callback
|
|
32
|
-
];
|
|
33
|
-
}
|
|
34
|
-
function $ab48bff482731fc9$var$clientKey(context) {
|
|
35
|
-
return `${context.projectId}:${context.dataset}`;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
23
|
const $0413292d5e32b5d9$export$64a609a9111ff100 = (config)=>{
|
|
40
|
-
if (!config?.type
|
|
41
|
-
type
|
|
42
|
-
Example: orderRankField({type: 'category'
|
|
24
|
+
if (!config?.type) throw new Error(`
|
|
25
|
+
type must be provided.
|
|
26
|
+
Example: orderRankField({type: 'category'})
|
|
43
27
|
`);
|
|
44
28
|
const { type: type } = config;
|
|
45
|
-
|
|
46
|
-
(0, $ab48bff482731fc9$export$a2a87dc3ab91967)(config.context, (updatedClient)=>{
|
|
47
|
-
client = updatedClient;
|
|
48
|
-
});
|
|
49
|
-
return {
|
|
29
|
+
return (0, $jPEKE$defineField)({
|
|
50
30
|
title: "Order Rank",
|
|
51
31
|
readOnly: true,
|
|
52
32
|
hidden: true,
|
|
53
33
|
...config,
|
|
54
34
|
name: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16),
|
|
55
35
|
type: "string",
|
|
56
|
-
initialValue: async ()=>{
|
|
57
|
-
const lastDocOrderRank = await
|
|
36
|
+
initialValue: async ({ getClient: getClient })=>{
|
|
37
|
+
const lastDocOrderRank = await getClient({
|
|
38
|
+
apiVersion: "2021-09-01"
|
|
39
|
+
}).fetch(`*[_type == $type]|order(@[$order] desc)[0][$order]`, {
|
|
58
40
|
type: type,
|
|
59
41
|
order: (0, $21d4b1fe36f88c6f$export$64f27603cb09ba16)
|
|
60
42
|
});
|
|
61
43
|
return (0, $27620c24e1768bdb$export$2e2bcd8739ae039)(lastDocOrderRank);
|
|
62
44
|
}
|
|
63
|
-
};
|
|
45
|
+
});
|
|
64
46
|
};
|
|
65
47
|
|
|
66
48
|
|
|
@@ -253,14 +235,10 @@ const $793aacd9a77a8bc3$export$1b86f2c90605ffb9 = ({ entities: entities , select
|
|
|
253
235
|
|
|
254
236
|
|
|
255
237
|
|
|
256
|
-
|
|
257
238
|
function $f49f7a30883dbc1b$export$8d49af9be9632eba() {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
}), [
|
|
262
|
-
baseClient
|
|
263
|
-
]);
|
|
239
|
+
return (0, $jPEKE$useClient)({
|
|
240
|
+
apiVersion: "2021-09-01"
|
|
241
|
+
});
|
|
264
242
|
}
|
|
265
243
|
|
|
266
244
|
|
|
@@ -792,7 +770,6 @@ class $c149fdd435bcc1b3$export$2e2bcd8739ae039 extends (0, $jPEKE$Component) {
|
|
|
792
770
|
}
|
|
793
771
|
|
|
794
772
|
|
|
795
|
-
|
|
796
773
|
function $24abac83e7f53d60$export$3b014deba4b8ca00(config) {
|
|
797
774
|
if (!config?.type || !config.context || !config.S) throw new Error(`
|
|
798
775
|
type, context and S (StructureBuilder) must be provided.
|
|
@@ -800,9 +777,10 @@ function $24abac83e7f53d60$export$3b014deba4b8ca00(config) {
|
|
|
800
777
|
Example: orderableDocumentListDeskItem({type: 'category'})
|
|
801
778
|
`);
|
|
802
779
|
const { type: type , filter: filter , params: params , title: title , icon: icon , id: id , context: context , S: S } = config;
|
|
803
|
-
const { schema: schema ,
|
|
804
|
-
|
|
805
|
-
|
|
780
|
+
const { schema: schema , getClient: getClient } = context;
|
|
781
|
+
const client = getClient({
|
|
782
|
+
apiVersion: "2021-09-01"
|
|
783
|
+
});
|
|
806
784
|
const listTitle = title ?? `Orderable ${type}`;
|
|
807
785
|
const listId = id ?? `orderable-${type}`;
|
|
808
786
|
const listIcon = icon ?? (0, $jPEKE$SortIcon);
|
package/lib/index.modern.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/fields/orderRankField.ts","src/helpers/constants.ts","src/helpers/initialRank.ts","src/desk-structure/globalClientWorkaround.ts","src/fields/orderRankOrdering.ts","src/desk-structure/orderableDocumentListDeskItem.ts","src/OrderableDocumentList.tsx","src/DocumentListWrapper.tsx","src/DocumentListQuery.tsx","src/DraggableList.tsx","src/Document.tsx","src/OrderableContext.ts","src/helpers/reorderDocuments.ts","src/helpers/client.ts","src/Feedback.tsx","src/helpers/resetOrder.ts"],"sourcesContent":["import {orderRankField, RankFieldConfig} from './fields/orderRankField'\nimport {orderRankOrdering} from './fields/orderRankOrdering'\nimport {\n orderableDocumentListDeskItem,\n type OrderableListConfig,\n} from './desk-structure/orderableDocumentListDeskItem'\n\nexport type {OrderableListConfig, RankFieldConfig}\nexport {orderRankField, orderRankOrdering, orderableDocumentListDeskItem}\n","import {ConfigContext} from 'sanity'\nimport type {SanityClient} from '@sanity/client'\nimport {ORDER_FIELD_NAME} from '../helpers/constants'\nimport initialRank from '../helpers/initialRank'\nimport {subscribeSanityClient} from '../desk-structure/globalClientWorkaround'\n\nexport type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>\n\nexport interface RankFieldConfig {\n type: string\n context: SchemaContext\n}\n\nexport const orderRankField = (config: RankFieldConfig) => {\n if (!config?.type || !config.context) {\n throw new Error(\n `\n type and context must be provided. context is available when configuring schema.\n Example: orderRankField({type: 'category', context})\n `\n )\n }\n\n const {type} = config\n\n let client: SanityClient | undefined\n subscribeSanityClient(config.context, (updatedClient) => {\n client = updatedClient\n })\n return {\n title: 'Order Rank',\n readOnly: true,\n hidden: true,\n ...config,\n name: ORDER_FIELD_NAME,\n type: 'string',\n initialValue: async () => {\n const lastDocOrderRank = await client?.fetch(\n `*[_type == $type]|order(@[$order] desc)[0][$order]`,\n {type, order: ORDER_FIELD_NAME}\n )\n return initialRank(lastDocOrderRank)\n },\n }\n}\n","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 as any).value\n}\n","import {SanityClient} from '@sanity/client'\nimport type {ConfigContext} from 'sanity'\nimport {SchemaContext} from '../fields/orderRankField'\n\ntype ClientSubscription = (client: SanityClient) => void\ntype ClientKey = `${string}:${string}`\nconst subscriptions: Record<ClientKey, ClientSubscription[]> = {}\n\n/**\n * @internal\n *\n * v3 does not expose client in the schema API, which means no client for the initial value code.\n * This is a workaround for that; we update the global client from a place we _do_ have access to the client,\n * the use the global in schema-callbacks.\n *\n * Note: The code assumes sanityClientChanged is called AFTER all subscribeSanityClient calls are done.\n */\nexport function sanityClientChanged(context: ConfigContext) {\n ;(subscriptions[clientKey(context)] ?? []).forEach((subscriber) => subscriber(context.client))\n}\n\n/**\n * @internal\n */\nexport function subscribeSanityClient(context: SchemaContext, callback: ClientSubscription) {\n const key = clientKey(context)\n const existing = subscriptions[key] ?? []\n subscriptions[key] = [...existing, callback]\n}\n\nfunction clientKey(context: SchemaContext): ClientKey {\n return `${context.projectId}:${context.dataset}`\n}\n","import {ORDER_FIELD_NAME} from '../helpers/constants'\n\nexport const orderRankOrdering = {\n title: 'Ordered',\n name: 'ordered',\n by: [{field: ORDER_FIELD_NAME, direction: 'asc'}],\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder} from 'sanity/desk'\nimport OrderableDocumentList from '../OrderableDocumentList'\nimport {sanityClientChanged} from './globalClientWorkaround'\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) {\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, client} = context\n // workaround so schemas can get access to client in callbacks\n sanityClientChanged(context)\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().title(`Show Increments`).icon(SortIcon).action(`showIncrements`).serialize(),\n ],\n })\n )\n .serialize()\n}\n","import React, {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 React, {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport type {ToastParams} from '@sanity/ui'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n filter?: string\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 <Feedback>{schemaIsInvalid}</Feedback>\n }\n\n return (\n <OrderableContext.Provider value={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import React, {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Spinner, Stack} from '@sanity/ui'\n\nimport type {SanityDocument} from 'sanity'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\nimport {useSanityClient} from './helpers/client'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\n//rxjs Subscription does not seem to comply with sanity client subscribe anymore\ntype ClientSubscription = ReturnType<\n ReturnType<ReturnType<typeof useSanityClient>['listen']>['subscribe']\n>\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [isLoading, setIsLoading] = useState(true)\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocument[]>([])\n\n const client = useSanityClient()\n\n useEffect(() => {\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = Object.assign(params, {type, order: ORDER_FIELD_NAME})\n let subscription: ClientSubscription | undefined\n\n // eslint-disable-next-line require-await\n const fetchData = async () => {\n client.fetch<SanityDocument[]>(query, queryParams).then((documents) => {\n // Remove published document from list if draft also exists\n const filteredDocuments = documents.reduce((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = documents.some((doc) => doc._id === `drafts.${cur._id}`)\n\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n return [...acc, cur]\n }, [] as SanityDocument[])\n\n setData(filteredDocuments)\n\n if (isLoading) {\n setIsLoading(false)\n }\n })\n }\n\n const prepareData = async () => {\n setIsLoading(true)\n\n await fetchData()\n\n if (!subscription) {\n subscription = client.listen(query, queryParams).subscribe(() => fetchData())\n }\n }\n\n // Get data but only if a document isn't being patched or we don't yet have data\n if (!listIsUpdating && !data.length) {\n prepareData()\n }\n\n return () => subscription?.unsubscribe()\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [type])\n\n const unorderedDataCount = useMemo(\n () => (data.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\n [data]\n )\n\n if (isLoading)\n return (\n <Flex style={{width: `100%`, height: `100%`}} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n\n return (\n <Stack space={1} style={{overflow: `scroll`, height: `100%`}}>\n {unorderedDataCount > 0 && (\n <Feedback>\n {unorderedDataCount}/{data.length} Documents have no Order. Select{' '}\n <strong>Reset Order</strong> from the Menu above to fix.\n </Feedback>\n )}\n <Box padding={1}>\n <DraggableList\n data={data}\n type={type}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />\n </Box>\n </Stack>\n )\n}\n","import React, {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from 'react-beautiful-dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport {usePaneRouter} from 'sanity/desk'\nimport type {SanityDocument, PatchOperations} from 'sanity'\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\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\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\n}\n\nexport interface DraggableListProps {\n data: SanityDocument[]\n type: string\n listIsUpdating: boolean\n setListIsUpdating: (val: boolean) => void\n}\n\nexport default function DraggableList({\n data,\n type,\n listIsUpdating,\n setListIsUpdating,\n}: DraggableListProps) {\n const toast = useToast()\n const router = usePaneRouter()\n const {navigateIntent} = router\n\n // Maintains local state order before transaction completes\n const [orderedData, setOrderedData] = useState<SanityDocument[]>(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[]>([])\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 navigateIntent('edit', {id: clickedId, type})\n return setSelectedIds([clickedId])\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, navigateIntent, orderedData, selectedIds, type]\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: SanityDocument[]) => {\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 as any)\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: SanityDocument[]) => {\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\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 tone={tone} shadow={isDragging ? 2 : undefined} radius={2}>\n <Document\n doc={item}\n entities={orderedData}\n handleSelect={handleSelect}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.length - 1}\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 React, {useContext} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {SanityPreview as Preview} from 'sanity/_unstable'\n\nimport {useSchema, SanityDocument, SchemaType} from 'sanity'\nimport {OrderableContext} from './OrderableContext'\n\nexport interface DocumentProps {\n doc: SanityDocument\n entities: SanityDocument[]\n handleSelect: (docId: string, index: number, event: MouseEvent) => void\n increment: (index: number, nextIndex: number, docId: string, entities: SanityDocument[]) => void\n index: number\n isFirst: boolean\n isLast: boolean\n}\n\nexport default function Document({\n doc,\n increment,\n entities,\n handleSelect,\n index,\n isFirst,\n isLast,\n}: DocumentProps) {\n const {showIncrements} = useContext(OrderableContext)\n const schema = useSchema()\n return (\n <Flex align=\"center\">\n <Box paddingX={3} style={{flexShrink: 0}}>\n <Text size={4}>\n <DragHandleIcon />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index + -1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Button\n style={{width: `100%`}}\n padding={2}\n mode=\"bleed\"\n onClick={(e) => handleSelect(doc._id, index, e.nativeEvent)}\n >\n <Flex flex={1} align=\"center\">\n <Box flex={1}>\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\n </Box>\n </Flex>\n </Button>\n </Flex>\n )\n}\n","import React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {LexoRank} from 'lexorank'\nimport type {PatchOperations, SanityDocument} from 'sanity'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocument[]\n selectedItems: SanityDocument[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocument[]\n selectedIds: string[]\n source: any\n destination: any\n debug?: boolean\n}\n\nfunction lexicographicalSort(a: {[ORDER_FIELD_NAME]: string}, b: {[ORDER_FIELD_NAME]: string}) {\n if (a[ORDER_FIELD_NAME] < b[ORDER_FIELD_NAME]) {\n return -1\n }\n 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 debug = false,\n}: ReorderArgs) => {\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 (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 seleced 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 as any).value as string\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: [] as SanityDocument[], selected: [] as SanityDocument[]}\n )\n\n const patches: [string, PatchOperations][] = selected.map((doc) => {\n return [\n doc._id,\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ]\n })\n\n // Safety-check to make sure everything is in order\n const allSorted = (all as unknown as {[ORDER_FIELD_NAME]: string}[]).sort(lexicographicalSort)\n\n return {newOrder: allSorted, patches, message}\n}\n","import {useClient} from 'sanity'\nimport {useMemo} from 'react'\n\nexport function useSanityClient() {\n const baseClient = useClient()\n return useMemo(\n () =>\n baseClient.withConfig({\n apiVersion: '2021-09-01',\n }),\n [baseClient]\n )\n}\n","import React, {PropsWithChildren} from 'react'\nimport {Box, Card, Text} from '@sanity/ui'\n\nexport default function Feedback({children}: PropsWithChildren<{}>) {\n return (\n <Box padding={3}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Text>{children}</Text>\n </Card>\n </Box>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {ORDER_FIELD_NAME} from './constants'\nimport {SanityClient} from '@sanity/client'\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 as any).value as string},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n"],"names":[],"version":3,"file":"index.modern.js.map","sourceRoot":"../"}
|
|
1
|
+
{"mappings":"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","sources":["src/index.ts","src/fields/orderRankField.ts","src/helpers/constants.ts","src/helpers/initialRank.ts","src/fields/orderRankOrdering.ts","src/desk-structure/orderableDocumentListDeskItem.ts","src/OrderableDocumentList.tsx","src/DocumentListWrapper.tsx","src/DocumentListQuery.tsx","src/DraggableList.tsx","src/Document.tsx","src/OrderableContext.ts","src/helpers/reorderDocuments.ts","src/helpers/client.ts","src/Feedback.tsx","src/helpers/resetOrder.ts"],"sourcesContent":["import {orderRankField, RankFieldConfig} from './fields/orderRankField'\nimport {orderRankOrdering} from './fields/orderRankOrdering'\nimport {\n orderableDocumentListDeskItem,\n type OrderableListConfig,\n} from './desk-structure/orderableDocumentListDeskItem'\n\nexport type {OrderableListConfig, RankFieldConfig}\nexport {orderRankField, orderRankOrdering, orderableDocumentListDeskItem}\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 ({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","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 as any).value\n}\n","import {ORDER_FIELD_NAME} from '../helpers/constants'\n\nexport const orderRankOrdering = {\n title: 'Ordered',\n name: 'ordered',\n by: [{field: ORDER_FIELD_NAME, direction: 'asc'}],\n}\n","import {GenerateIcon, SortIcon} from '@sanity/icons'\nimport type {ConfigContext} from 'sanity'\n\nimport {ComponentType} from 'react'\nimport {StructureBuilder} 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) {\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().title(`Show Increments`).icon(SortIcon).action(`showIncrements`).serialize(),\n ],\n })\n )\n .serialize()\n}\n","import React, {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 React, {useEffect, useMemo} from 'react'\nimport {useToast} from '@sanity/ui'\n\nimport {useSchema} from 'sanity'\nimport type {ToastParams} from '@sanity/ui'\nimport DocumentListQuery from './DocumentListQuery'\nimport {OrderableContext} from './OrderableContext'\n\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\n\nexport interface DocumentListWrapperProps {\n showIncrements: boolean\n type: string\n resetOrderTransaction: ToastParams\n filter?: string\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 <Feedback>{schemaIsInvalid}</Feedback>\n }\n\n return (\n <OrderableContext.Provider value={{showIncrements}}>\n <DocumentListQuery type={type} filter={filter} params={params} />\n </OrderableContext.Provider>\n )\n}\n","import React, {useEffect, useMemo, useState} from 'react'\nimport {Box, Flex, Spinner, Stack} from '@sanity/ui'\n\nimport type {SanityDocument} from 'sanity'\nimport DraggableList from './DraggableList'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport Feedback from './Feedback'\nimport {useSanityClient} from './helpers/client'\n\nexport interface DocumentListQueryProps {\n type: string\n filter?: string\n params?: Record<string, unknown>\n}\n\n//rxjs Subscription does not seem to comply with sanity client subscribe anymore\ntype ClientSubscription = ReturnType<\n ReturnType<ReturnType<typeof useSanityClient>['listen']>['subscribe']\n>\n\nconst DEFAULT_PARAMS = {}\n\nexport default function DocumentListQuery({\n type,\n filter,\n params = DEFAULT_PARAMS,\n}: DocumentListQueryProps) {\n const [isLoading, setIsLoading] = useState(true)\n const [listIsUpdating, setListIsUpdating] = useState(false)\n const [data, setData] = useState<SanityDocument[]>([])\n\n const client = useSanityClient()\n\n useEffect(() => {\n const query = `*[_type == $type ${filter ? `&& ${filter}` : ''}]|order(@[$order] asc){\n _id, _type, ${ORDER_FIELD_NAME}\n }`\n const queryParams = Object.assign(params, {type, order: ORDER_FIELD_NAME})\n let subscription: ClientSubscription | undefined\n\n // eslint-disable-next-line require-await\n const fetchData = async () => {\n client.fetch<SanityDocument[]>(query, queryParams).then((documents) => {\n // Remove published document from list if draft also exists\n const filteredDocuments = documents.reduce((acc, cur) => {\n if (!cur._id.startsWith(`drafts.`)) {\n // eslint-disable-next-line max-nested-callbacks\n const alsoHasDraft = documents.some((doc) => doc._id === `drafts.${cur._id}`)\n\n return alsoHasDraft ? acc : [...acc, cur]\n }\n\n return [...acc, cur]\n }, [] as SanityDocument[])\n\n setData(filteredDocuments)\n\n if (isLoading) {\n setIsLoading(false)\n }\n })\n }\n\n const prepareData = async () => {\n setIsLoading(true)\n\n await fetchData()\n\n if (!subscription) {\n subscription = client.listen(query, queryParams).subscribe(() => fetchData())\n }\n }\n\n // Get data but only if a document isn't being patched or we don't yet have data\n if (!listIsUpdating && !data.length) {\n prepareData()\n }\n\n return () => subscription?.unsubscribe()\n /* eslint-disable-next-line react-hooks/exhaustive-deps */\n }, [type])\n\n const unorderedDataCount = useMemo(\n () => (data.length ? data.filter((doc) => !doc[ORDER_FIELD_NAME]).length : 0),\n [data]\n )\n\n if (isLoading)\n return (\n <Flex style={{width: `100%`, height: `100%`}} align=\"center\" justify=\"center\">\n <Spinner />\n </Flex>\n )\n\n return (\n <Stack space={1} style={{overflow: `scroll`, height: `100%`}}>\n {unorderedDataCount > 0 && (\n <Feedback>\n {unorderedDataCount}/{data.length} Documents have no Order. Select{' '}\n <strong>Reset Order</strong> from the Menu above to fix.\n </Feedback>\n )}\n <Box padding={1}>\n <DraggableList\n data={data}\n type={type}\n listIsUpdating={listIsUpdating}\n setListIsUpdating={setListIsUpdating}\n />\n </Box>\n </Stack>\n )\n}\n","import React, {useEffect, useState, useMemo, useCallback, CSSProperties} from 'react'\nimport {DragDropContext, Draggable, Droppable, type DropResult} from 'react-beautiful-dnd'\nimport {Box, Card, useToast} from '@sanity/ui'\nimport {usePaneRouter} from 'sanity/desk'\nimport type {SanityDocument, PatchOperations} from 'sanity'\nimport Document from './Document'\nimport {reorderDocuments} from './helpers/reorderDocuments'\nimport {ORDER_FIELD_NAME} from './helpers/constants'\nimport {useSanityClient} from './helpers/client'\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\ninterface ListSetting {\n isDuplicate: boolean\n isGhosting: boolean\n isDragging: boolean\n isSelected: boolean\n}\n\nexport interface DraggableListProps {\n data: SanityDocument[]\n type: string\n listIsUpdating: boolean\n setListIsUpdating: (val: boolean) => void\n}\n\nexport default function DraggableList({\n data,\n type,\n listIsUpdating,\n setListIsUpdating,\n}: DraggableListProps) {\n const toast = useToast()\n const router = usePaneRouter()\n const {navigateIntent} = router\n\n // Maintains local state order before transaction completes\n const [orderedData, setOrderedData] = useState<SanityDocument[]>(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[]>([])\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 navigateIntent('edit', {id: clickedId, type})\n return setSelectedIds([clickedId])\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, navigateIntent, orderedData, selectedIds, type]\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: SanityDocument[]) => {\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 as any)\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: SanityDocument[]) => {\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\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 tone={tone} shadow={isDragging ? 2 : undefined} radius={2}>\n <Document\n doc={item}\n entities={orderedData}\n handleSelect={handleSelect}\n increment={incrementIndex}\n index={index}\n isFirst={index === 0}\n isLast={index === orderedData.length - 1}\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 React, {useContext} from 'react'\nimport {ChevronDownIcon, ChevronUpIcon, DragHandleIcon} from '@sanity/icons'\nimport {Box, Button, Flex, Text} from '@sanity/ui'\nimport {SanityPreview as Preview} from 'sanity/_unstable'\n\nimport {useSchema, SanityDocument, SchemaType} from 'sanity'\nimport {OrderableContext} from './OrderableContext'\n\nexport interface DocumentProps {\n doc: SanityDocument\n entities: SanityDocument[]\n handleSelect: (docId: string, index: number, event: MouseEvent) => void\n increment: (index: number, nextIndex: number, docId: string, entities: SanityDocument[]) => void\n index: number\n isFirst: boolean\n isLast: boolean\n}\n\nexport default function Document({\n doc,\n increment,\n entities,\n handleSelect,\n index,\n isFirst,\n isLast,\n}: DocumentProps) {\n const {showIncrements} = useContext(OrderableContext)\n const schema = useSchema()\n return (\n <Flex align=\"center\">\n <Box paddingX={3} style={{flexShrink: 0}}>\n <Text size={4}>\n <DragHandleIcon />\n </Text>\n </Box>\n {showIncrements && (\n <Flex style={{flexShrink: 0}} align=\"center\" gap={1} paddingRight={1}>\n <Button\n padding={2}\n mode=\"ghost\"\n onClick={() => increment(index, index + -1, doc._id, entities)}\n disabled={isFirst}\n icon={ChevronUpIcon}\n />\n <Button\n padding={2}\n mode=\"ghost\"\n disabled={isLast}\n onClick={() => increment(index, index + 1, doc._id, entities)}\n icon={ChevronDownIcon}\n />\n </Flex>\n )}\n <Button\n style={{width: `100%`}}\n padding={2}\n mode=\"bleed\"\n onClick={(e) => handleSelect(doc._id, index, e.nativeEvent)}\n >\n <Flex flex={1} align=\"center\">\n <Box flex={1}>\n <Preview\n layout=\"default\"\n value={doc}\n schemaType={schema.get(doc._type) as SchemaType}\n />\n </Box>\n </Flex>\n </Button>\n </Flex>\n )\n}\n","import React from 'react'\n\nexport interface OrderableContextValue {\n showIncrements?: boolean\n}\n\nexport const OrderableContext = React.createContext<OrderableContextValue>({})\n","import {LexoRank} from 'lexorank'\nimport type {PatchOperations, SanityDocument} from 'sanity'\nimport {ORDER_FIELD_NAME} from './constants'\n\nexport interface MaifestArgs {\n entities: SanityDocument[]\n selectedItems: SanityDocument[]\n isMovingUp: boolean\n curIndex: number\n nextIndex: number\n prevIndex: number\n}\n\nexport interface ReorderArgs {\n entities: SanityDocument[]\n selectedIds: string[]\n source: any\n destination: any\n debug?: boolean\n}\n\nfunction lexicographicalSort(a: {[ORDER_FIELD_NAME]: string}, b: {[ORDER_FIELD_NAME]: string}) {\n if (a[ORDER_FIELD_NAME] < b[ORDER_FIELD_NAME]) {\n return -1\n }\n 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 debug = false,\n}: ReorderArgs) => {\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 (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 seleced 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 as any).value as string\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: [] as SanityDocument[], selected: [] as SanityDocument[]}\n )\n\n const patches: [string, PatchOperations][] = selected.map((doc) => {\n return [\n doc._id,\n {\n set: {\n [ORDER_FIELD_NAME]: doc[ORDER_FIELD_NAME],\n },\n },\n ]\n })\n\n // Safety-check to make sure everything is in order\n const allSorted = (all as unknown as {[ORDER_FIELD_NAME]: string}[]).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 React, {PropsWithChildren} from 'react'\nimport {Box, Card, Text} from '@sanity/ui'\n\nexport default function Feedback({children}: PropsWithChildren<{}>) {\n return (\n <Box padding={3}>\n <Card padding={4} radius={2} shadow={1} tone=\"caution\">\n <Text>{children}</Text>\n </Card>\n </Box>\n )\n}\n","import {LexoRank} from 'lexorank'\nimport {ORDER_FIELD_NAME} from './constants'\nimport {SanityClient} from '@sanity/client'\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 as any).value as string},\n })\n }\n\n return transaction\n .commit()\n .then((update) => update)\n .catch((err) => err)\n}\n"],"names":[],"version":3,"file":"index.modern.js.map","sourceRoot":"../"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/orderable-document-list",
|
|
3
|
-
"version": "1.0.0-v3-studio.
|
|
3
|
+
"version": "1.0.0-v3-studio.2",
|
|
4
4
|
"description": "Drag-and-drop Document Ordering without leaving the Editing surface",
|
|
5
5
|
"source": "./src/index.ts",
|
|
6
6
|
"exports": {
|
|
@@ -46,19 +46,19 @@
|
|
|
46
46
|
"license": "MIT",
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@sanity/icons": "^1.2.1",
|
|
49
|
-
"@sanity/incompatible-plugin": "^1.0.
|
|
50
|
-
"@sanity/ui": "^0.
|
|
49
|
+
"@sanity/incompatible-plugin": "^1.0.1",
|
|
50
|
+
"@sanity/ui": "^0.38.0",
|
|
51
51
|
"lexorank": "^1.0.4",
|
|
52
52
|
"prop-types": "^15.8.1",
|
|
53
53
|
"react-beautiful-dnd": "^13.1.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@commitlint/cli": "^
|
|
57
|
-
"@commitlint/config-conventional": "^
|
|
56
|
+
"@commitlint/cli": "^17.1.2",
|
|
57
|
+
"@commitlint/config-conventional": "^17.1.0",
|
|
58
58
|
"@parcel/packager-ts": "^2.6.0",
|
|
59
59
|
"@parcel/transformer-typescript-types": "^2.6.0",
|
|
60
|
-
"@sanity/plugin-kit": "^1.0.
|
|
61
|
-
"@sanity/semantic-release-preset": "^2.0.
|
|
60
|
+
"@sanity/plugin-kit": "^1.1.0-ecosystem-preset.5",
|
|
61
|
+
"@sanity/semantic-release-preset": "^2.0.1",
|
|
62
62
|
"@types/react-beautiful-dnd": "^13.1.2",
|
|
63
63
|
"@typescript-eslint/eslint-plugin": "^5.20.0",
|
|
64
64
|
"@typescript-eslint/parser": "^5.20.0",
|
|
@@ -75,15 +75,15 @@
|
|
|
75
75
|
"eslint-plugin-prettier": "^4.0.0",
|
|
76
76
|
"eslint-plugin-react": "^7.29.4",
|
|
77
77
|
"eslint-plugin-react-hooks": "^4.4.0",
|
|
78
|
-
"husky": "^
|
|
79
|
-
"lint-staged": "^
|
|
78
|
+
"husky": "^8.0.1",
|
|
79
|
+
"lint-staged": "^13.0.3",
|
|
80
80
|
"parcel": "^2.6.0",
|
|
81
81
|
"prettier": "^2.6.2",
|
|
82
82
|
"react": "^17.0.0",
|
|
83
83
|
"react-dom": "^17.0.0",
|
|
84
84
|
"rimraf": "^3.0.2",
|
|
85
|
-
"sanity": "dev-preview",
|
|
86
|
-
"typescript": "
|
|
85
|
+
"sanity": "3.0.0-dev-preview.17",
|
|
86
|
+
"typescript": "4.7.4"
|
|
87
87
|
},
|
|
88
88
|
"peerDependencies": {
|
|
89
89
|
"react": "^17.0.2 || ^18.0.0",
|
|
@@ -4,7 +4,6 @@ import type {ConfigContext} from 'sanity'
|
|
|
4
4
|
import {ComponentType} from 'react'
|
|
5
5
|
import {StructureBuilder} from 'sanity/desk'
|
|
6
6
|
import OrderableDocumentList from '../OrderableDocumentList'
|
|
7
|
-
import {sanityClientChanged} from './globalClientWorkaround'
|
|
8
7
|
|
|
9
8
|
export interface OrderableListConfig {
|
|
10
9
|
type: string
|
|
@@ -27,9 +26,8 @@ export function orderableDocumentListDeskItem(config: OrderableListConfig) {
|
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
const {type, filter, params, title, icon, id, context, S} = config
|
|
30
|
-
const {schema,
|
|
31
|
-
|
|
32
|
-
sanityClientChanged(context)
|
|
29
|
+
const {schema, getClient} = context
|
|
30
|
+
const client = getClient({apiVersion: '2021-09-01'})
|
|
33
31
|
|
|
34
32
|
const listTitle = title ?? `Orderable ${type}`
|
|
35
33
|
const listId = id ?? `orderable-${type}`
|
|
@@ -1,45 +1,37 @@
|
|
|
1
|
-
import {ConfigContext} from 'sanity'
|
|
2
|
-
import type {SanityClient} from '@sanity/client'
|
|
1
|
+
import {type ConfigContext, defineField} from 'sanity'
|
|
3
2
|
import {ORDER_FIELD_NAME} from '../helpers/constants'
|
|
4
3
|
import initialRank from '../helpers/initialRank'
|
|
5
|
-
import {subscribeSanityClient} from '../desk-structure/globalClientWorkaround'
|
|
6
4
|
|
|
7
5
|
export type SchemaContext = Omit<ConfigContext, 'schema' | 'currentUser' | 'client'>
|
|
8
6
|
|
|
9
7
|
export interface RankFieldConfig {
|
|
10
8
|
type: string
|
|
11
|
-
context: SchemaContext
|
|
12
9
|
}
|
|
13
10
|
|
|
14
11
|
export const orderRankField = (config: RankFieldConfig) => {
|
|
15
|
-
if (!config?.type
|
|
12
|
+
if (!config?.type) {
|
|
16
13
|
throw new Error(
|
|
17
14
|
`
|
|
18
|
-
type
|
|
19
|
-
Example: orderRankField({type: 'category'
|
|
15
|
+
type must be provided.
|
|
16
|
+
Example: orderRankField({type: 'category'})
|
|
20
17
|
`
|
|
21
18
|
)
|
|
22
19
|
}
|
|
23
20
|
|
|
24
21
|
const {type} = config
|
|
25
|
-
|
|
26
|
-
let client: SanityClient | undefined
|
|
27
|
-
subscribeSanityClient(config.context, (updatedClient) => {
|
|
28
|
-
client = updatedClient
|
|
29
|
-
})
|
|
30
|
-
return {
|
|
22
|
+
return defineField({
|
|
31
23
|
title: 'Order Rank',
|
|
32
24
|
readOnly: true,
|
|
33
25
|
hidden: true,
|
|
34
26
|
...config,
|
|
35
27
|
name: ORDER_FIELD_NAME,
|
|
36
28
|
type: 'string',
|
|
37
|
-
initialValue: async () => {
|
|
38
|
-
const lastDocOrderRank = await
|
|
29
|
+
initialValue: async ({getClient}) => {
|
|
30
|
+
const lastDocOrderRank = await getClient({apiVersion: '2021-09-01'}).fetch(
|
|
39
31
|
`*[_type == $type]|order(@[$order] desc)[0][$order]`,
|
|
40
32
|
{type, order: ORDER_FIELD_NAME}
|
|
41
33
|
)
|
|
42
34
|
return initialRank(lastDocOrderRank)
|
|
43
35
|
},
|
|
44
|
-
}
|
|
36
|
+
})
|
|
45
37
|
}
|
package/src/helpers/client.ts
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import {useClient} from 'sanity'
|
|
2
|
-
import {useMemo} from 'react'
|
|
3
2
|
|
|
4
3
|
export function useSanityClient() {
|
|
5
|
-
|
|
6
|
-
return useMemo(
|
|
7
|
-
() =>
|
|
8
|
-
baseClient.withConfig({
|
|
9
|
-
apiVersion: '2021-09-01',
|
|
10
|
-
}),
|
|
11
|
-
[baseClient]
|
|
12
|
-
)
|
|
4
|
+
return useClient({apiVersion: '2021-09-01'})
|
|
13
5
|
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import {SanityClient} from '@sanity/client'
|
|
2
|
-
import type {ConfigContext} from 'sanity'
|
|
3
|
-
import {SchemaContext} from '../fields/orderRankField'
|
|
4
|
-
|
|
5
|
-
type ClientSubscription = (client: SanityClient) => void
|
|
6
|
-
type ClientKey = `${string}:${string}`
|
|
7
|
-
const subscriptions: Record<ClientKey, ClientSubscription[]> = {}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @internal
|
|
11
|
-
*
|
|
12
|
-
* v3 does not expose client in the schema API, which means no client for the initial value code.
|
|
13
|
-
* This is a workaround for that; we update the global client from a place we _do_ have access to the client,
|
|
14
|
-
* the use the global in schema-callbacks.
|
|
15
|
-
*
|
|
16
|
-
* Note: The code assumes sanityClientChanged is called AFTER all subscribeSanityClient calls are done.
|
|
17
|
-
*/
|
|
18
|
-
export function sanityClientChanged(context: ConfigContext) {
|
|
19
|
-
;(subscriptions[clientKey(context)] ?? []).forEach((subscriber) => subscriber(context.client))
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* @internal
|
|
24
|
-
*/
|
|
25
|
-
export function subscribeSanityClient(context: SchemaContext, callback: ClientSubscription) {
|
|
26
|
-
const key = clientKey(context)
|
|
27
|
-
const existing = subscriptions[key] ?? []
|
|
28
|
-
subscriptions[key] = [...existing, callback]
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function clientKey(context: SchemaContext): ClientKey {
|
|
32
|
-
return `${context.projectId}:${context.dataset}`
|
|
33
|
-
}
|