sanity-plugin-documents-pane 2.2.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # sanity-plugin-documents-pane
2
2
 
3
- >This is a **Sanity Studio v3** plugin.
3
+ > This is a **Sanity Studio v3** plugin.
4
4
  > For the v2 version, please refer to the [v2-branch](https://github.com/sanity-io/sanity-plugin-documents-pane/tree/studio-v2).
5
5
 
6
6
  Displays the results of a GROQ query in a View Pane. With the ability to use field values in the current document as query parameters.
@@ -34,7 +34,7 @@ S.view
34
34
  .options({
35
35
  query: `*[references($id)]`,
36
36
  params: {id: `_id`},
37
- options: {perspective: 'previewDrafts'}
37
+ options: {perspective: 'previewDrafts'},
38
38
  })
39
39
  .title('Incoming References')
40
40
  ```
@@ -49,6 +49,7 @@ The `.options()` configuration works as follows:
49
49
  - `debug` (bool, optional, default: `false`) In case of an error or the query returning no documents, setting to `true` will display the query and params that were used.
50
50
  - `initialValueTemplates` (function, optional) A function that receives the various displayed, draft, and published versions of the document, and returns a list of initial value templates. These will be used to define buttons at the top of the list so users can create new related documents.
51
51
  - `options` (object, optional) An object of options passed to the listening query. Includes support for `apiVersion` and `perspective`.
52
+ - `duplicate` (bool, optional, default: `false`) Enables a duplicate action in the context of the document list of the document pane. Useful for retaining existing editing context when needing to create new incoming references.
52
53
 
53
54
  ## Resolving query parameters with a function and providing initial value templates
54
55
 
@@ -118,4 +119,3 @@ Run ["CI & Release" workflow](https://github.com/sanity-io/sanity-plugin-documen
118
119
  Make sure to select the main branch and check "Release new version".
119
120
 
120
121
  Semantic release will only release on configured branches, so it is safe to run release on any branch.
121
-
package/lib/index.esm.js CHANGED
@@ -1 +1 @@
1
- import{jsxs as e,Fragment as n,jsx as t}from"react/jsx-runtime";import{Stack as i,Box as r,Label as a,Code as o,Card as d,Flex as c,Button as l,Spinner as s}from"@sanity/ui";import{useListeningQuery as u,Feedback as p}from"sanity-plugin-utils";import{useCallback as m}from"react";import{fromString as h}from"@sanity/util/paths";import{useSchema as f,Preview as y,DefaultPreview as g}from"sanity";import{usePaneRouter as b}from"sanity/structure";import{ComposeIcon as T,WarningOutlineIcon as q}from"@sanity/icons";import{usePaneRouter as v}from"sanity/desk";import{uuid as _}from"@sanity/uuid";import P from"dlv";function V(d){let{query:c,params:l}=d;return e(n,{children:[e(i,{space:4,children:[t(r,{children:t(a,{children:"Query"})}),t(r,{children:t(o,{children:c})})]}),l&&e(i,{space:4,children:[t(r,{children:t(a,{children:"Params"})}),t(r,{children:t(o,{children:JSON.stringify(l)})})]})]})}function x(e){const{initialValueTemplates:n=[]}=e,{ReferenceChildLink:i}=v();return n.length?t(d,{borderBottom:!0,padding:2,children:t(c,{justify:"flex-end",gap:1,children:n.map((e=>e.template?t(i,{documentId:_(),documentType:e.schemaType,template:{id:e.template,params:e.parameters},parentRefPath:[],children:t(l,{icon:t(T,{}),text:e.title,mode:"bleed",as:"span"})},"".concat(e.schemaType,"-").concat(e.template)):null))})}):null}function R(a){const{query:o,params:T,options:v,debug:_,initialValueTemplates:P}=a,{routerPanesState:R,groupIndex:j,handleEditReference:k}=b(),D=f(),{loading:I,error:w,data:O}=u(o,{params:T,initialValue:[],options:v}),C=m(((e,n)=>{var t;const i=(null==(t=R[j+1])?void 0:t[0].params)||{},{parentRefPath:r}=i;k({id:e,type:n,parentRefPath:r?h(r):[""],template:{id:e}})}),[R,j,k]);return I?t(r,{padding:4,children:t(c,{justify:"center",align:"center",children:t(s,{muted:!0})})}):w?e(i,{padding:4,space:5,children:[t(p,{children:"There was en error performing this query"}),_&&t(V,{query:o,params:T})]}):(null==O?void 0:O.length)?e(n,{children:[t(x,{initialValueTemplates:P}),t(i,{padding:2,space:1,children:O.map((e=>{const n=D.get(e._type);return"_originalId"in e&&"string"==typeof e._originalId&&(e._id=e._originalId),n?t(l,{onClick:()=>C(e._id,e._type),padding:2,mode:"bleed",children:t(y,{value:e,schemaType:n})},e._id):t(d,{radius:2,tone:"caution","data-ui":"Alert",padding:2,children:t(g,{media:t(q,{}),title:"Unknown schema type found",subtitle:'Encountered type "'.concat(e._type,'" that is not defined in the schema.')})},e._id)}))})]}):e(n,{children:[t(x,{initialValueTemplates:P}),e(i,{padding:4,space:5,children:[t(p,{children:"No Documents found"}),_&&t(V,{query:o,params:T})]})]})}function j(e){const{params:n,document:t}=e,i="function"==typeof n?n({document:t}):function(e){const{params:n,document:t,useDraft:i}=e;if(!n)return{};const r=i?t.displayed:t.published;return r?Object.keys(n).reduce(((e,t)=>({...e,[t]:P(r,n[t])})),{}):{}}(e);if(!Object.values(i).includes(void 0))return i}function k(n){const{document:r}=n,{query:a,params:o,useDraft:d=!1,debug:c=!1,initialValueTemplates:l,options:s={}}=n.options;if(d&&"function"==typeof o)return e(i,{padding:4,space:5,children:[e(p,{children:[t("code",{children:"useDraft"})," should not be ",t("code",{children:"true"})," when supplying a function for",t("code",{children:"params"})]}),c&&t(V,{query:a})]});const u=j({document:r,params:o,useDraft:d}),m=function(e){const{resolver:n,document:t}=e||{};return n?n({document:t}):[]}({resolver:l,document:r});return u?t(R,{query:a,params:u,options:s,debug:c,initialValueTemplates:m}):e(i,{padding:4,space:5,children:[t(p,{children:"Parameters for this query could not be resolved. This may mean the document does not yet exist, or is incomplete."}),c&&t(V,{query:a})]})}export{k as default};//# sourceMappingURL=index.esm.js.map
1
+ import{jsxs as e,Fragment as t,jsx as n}from"react/jsx-runtime";import{Stack as i,Box as r,Label as a,Code as o,Card as d,Flex as l,Button as c,Tooltip as p,Text as s,Spinner as u}from"@sanity/ui";import{useListeningQuery as m,Feedback as h}from"sanity-plugin-utils";import{useState as f,useCallback as y}from"react";import{fromString as g}from"@sanity/util/paths";import{useDocumentStore as b,useDocumentOperation as v,useDocumentPairPermissions as T,useTranslation as _,useSchema as q,Preview as P,getPublishedId as x,DefaultPreview as R}from"sanity";import{usePaneRouter as V,structureLocaleNamespace as j}from"sanity/structure";import{ComposeIcon as k,CopyIcon as I,WarningOutlineIcon as D}from"@sanity/icons";import{uuid as w}from"@sanity/uuid";import{firstValueFrom as E,filter as S}from"rxjs";import C from"dlv";function O(d){let{query:l,params:c}=d;return e(t,{children:[e(i,{space:4,children:[n(r,{children:n(a,{children:"Query"})}),n(r,{children:n(o,{children:l})})]}),c&&e(i,{space:4,children:[n(r,{children:n(a,{children:"Params"})}),n(r,{children:n(o,{children:JSON.stringify(c)})})]})]})}function z(e){const{initialValueTemplates:t=[]}=e,{ReferenceChildLink:i}=V();return t.length?n(d,{borderBottom:!0,padding:2,children:n(l,{justify:"flex-end",gap:1,children:t.map((e=>e.template?n(i,{documentId:w(),documentType:e.schemaType,template:{id:e.template,params:e.parameters},parentRefPath:[],children:n(c,{icon:n(k,{}),text:e.title,mode:"bleed",as:"span"})},"".concat(e.schemaType,"-").concat(e.template)):null))})}):null}function B(e){const{id:i,type:a}=e,o=b(),{duplicate:d}=v(i,a),{routerPanesState:l,groupIndex:u,handleEditReference:m}=V(),[h,q]=f(!1),[P,x]=T({id:i,type:a,permission:"duplicate"}),{t:R}=_(j),k=y((async e=>{var t;e.stopPropagation();const n=w();q(!0);const r=E(o.pair.operationEvents(i,a).pipe(S((e=>"duplicate"===e.op&&"success"===e.type))));d.execute(n),await r,q(!1);const c=(null==(t=l[u+1])?void 0:t[0].params)||{},{parentRefPath:p}=c;m({id:n,type:a,parentRefPath:p?g(p):[""],template:{id:n}})}),[o.pair,d,u,m,i,l,a]);return x||!(null==P?void 0:P.granted)?n(t,{}):n(p,{content:n(r,{children:n(s,{muted:!0,size:1,children:R("action.duplicate.label")})}),placement:"left",portal:!0,children:n(c,{onClick:k,padding:2,fontSize:1,as:r,icon:n(I,{}),mode:"ghost",tone:"default","aria-label":R("action.duplicate.label"),style:{cursor:"pointer"},disabled:h||Boolean(d.disabled)||x})})}function N(a){const{query:o,params:p,options:s,debug:f,initialValueTemplates:b,duplicate:v}=a,{routerPanesState:T,groupIndex:_,handleEditReference:j}=V(),k=q(),{loading:I,error:w,data:E}=m(o,{params:p,initialValue:[],options:s}),S=y(((e,t)=>{var n;const i=(null==(n=T[_+1])?void 0:n[0].params)||{},{parentRefPath:r}=i;j({id:e,type:t,parentRefPath:r?g(r):[""],template:{id:e}})}),[T,_,j]);return I?n(r,{padding:4,children:n(l,{justify:"center",align:"center",children:n(u,{muted:!0})})}):w?e(i,{padding:4,space:5,children:[n(h,{children:"There was en error performing this query"}),f&&n(O,{query:o,params:p})]}):(null==E?void 0:E.length)?e(t,{children:[n(z,{initialValueTemplates:b}),n(i,{padding:2,space:1,children:E.map((e=>{const t=k.get(e._type);return"_originalId"in e&&"string"==typeof e._originalId&&(e._id=e._originalId),t?n(c,{onClick:()=>S(e._id,e._type),padding:2,mode:"bleed",children:n(P,{value:e,schemaType:t,actions:v&&n(B,{id:x(e._id),type:e._type}),layout:"block"})},e._id):n(d,{radius:2,tone:"caution","data-ui":"Alert",padding:2,children:n(R,{media:n(D,{}),title:"Unknown schema type found",subtitle:'Encountered type "'.concat(e._type,'" that is not defined in the schema.')})},e._id)}))})]}):e(t,{children:[n(z,{initialValueTemplates:b}),e(i,{padding:4,space:5,children:[n(h,{children:"No Documents found"}),f&&n(O,{query:o,params:p})]})]})}function A(e){const{params:t,document:n}=e,i="function"==typeof t?t({document:n}):function(e){const{params:t,document:n,useDraft:i}=e;if(!t)return{};const r=i?n.displayed:n.published;return r?Object.keys(t).reduce(((e,n)=>({...e,[n]:C(r,t[n])})),{}):{}}(e);if(!Object.values(i).includes(void 0))return i}function J(t){const{document:r}=t,{query:a,params:o,useDraft:d=!1,debug:l=!1,initialValueTemplates:c,options:p={},duplicate:s=!1}=t.options;if(d&&"function"==typeof o)return e(i,{padding:4,space:5,children:[e(h,{children:[n("code",{children:"useDraft"})," should not be ",n("code",{children:"true"})," when supplying a function for",n("code",{children:"params"})]}),l&&n(O,{query:a})]});const u=A({document:r,params:o,useDraft:d}),m=function(e){const{resolver:t,document:n}=e||{};return t?t({document:n}):[]}({resolver:c,document:r});return u?n(N,{query:a,params:u,options:p,debug:l,initialValueTemplates:m,duplicate:s}):e(i,{padding:4,space:5,children:[n(h,{children:"Parameters for this query could not be resolved. This may mean the document does not yet exist, or is incomplete."}),l&&n(O,{query:a})]})}export{J as default};//# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/Debug.tsx","../src/NewDocument.tsx","../src/Documents.tsx","../src/resolveParams.ts","../src/DocumentsPane.tsx","../src/resolveInitialValueTemplates.ts"],"sourcesContent":["import React from 'react'\nimport {Code, Box, Label, Stack} from '@sanity/ui'\n\nexport default function Debug({query, params}: {query: string; params?: {[key: string]: string}}) {\n return (\n <>\n <Stack space={4}>\n <Box>\n <Label>Query</Label>\n </Box>\n <Box>\n <Code>{query}</Code>\n </Box>\n </Stack>\n {params && (\n <Stack space={4}>\n <Box>\n <Label>Params</Label>\n </Box>\n <Box>\n <Code>{JSON.stringify(params)}</Code>\n </Box>\n </Stack>\n )}\n </>\n )\n}\n","import {Button, Card, Flex} from '@sanity/ui'\nimport React from 'react'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport {ComposeIcon} from '@sanity/icons'\nimport {usePaneRouter} from 'sanity/desk'\nimport {uuid} from '@sanity/uuid'\n\ninterface NewDocumentProps {\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n}\n\nexport default function NewDocument(props: NewDocumentProps) {\n const {initialValueTemplates = []} = props\n const {ReferenceChildLink} = usePaneRouter()\n\n if (!initialValueTemplates.length) return null\n\n return (\n <Card borderBottom={true} padding={2}>\n <Flex justify=\"flex-end\" gap={1}>\n {initialValueTemplates.map((template) => {\n if (!template.template) {\n return null\n }\n return (\n <ReferenceChildLink\n documentId={uuid()}\n documentType={template.schemaType}\n template={{id: template.template, params: template.parameters}}\n parentRefPath={[]}\n key={`${template.schemaType}-${template.template}`}\n >\n <Button icon={<ComposeIcon />} text={template.title} mode=\"bleed\" as=\"span\" />\n </ReferenceChildLink>\n )\n })}\n </Flex>\n </Card>\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Button, Stack, Flex, Spinner, Card} from '@sanity/ui'\nimport {fromString as pathFromString} from '@sanity/util/paths'\nimport {Preview, useSchema, DefaultPreview, SanityDocument, ListenQueryOptions} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\nimport {WarningOutlineIcon} from '@sanity/icons'\nimport {Feedback, useListeningQuery} from 'sanity-plugin-utils'\n\nimport Debug from './Debug'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport NewDocument from './NewDocument'\n\ntype DocumentsProps = {\n query: string\n params: {[key: string]: string}\n debug: boolean\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n options: ListenQueryOptions\n}\n\nexport default function Documents(props: DocumentsProps) {\n const {query, params, options, debug, initialValueTemplates} = props\n const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()\n const schema = useSchema()\n\n const {loading, error, data} = useListeningQuery<SanityDocument[]>(query, {\n params,\n initialValue: [],\n options,\n })\n\n const handleClick = useCallback(\n (id: string, type: string) => {\n const childParams = routerPanesState[groupIndex + 1]?.[0].params || {}\n const {parentRefPath} = childParams\n\n handleEditReference({\n id,\n type,\n // Uncertain that this works as intended\n parentRefPath: parentRefPath ? pathFromString(parentRefPath) : [``],\n template: {id},\n })\n },\n [routerPanesState, groupIndex, handleEditReference]\n )\n\n if (loading) {\n return (\n <Box padding={4}>\n <Flex justify=\"center\" align=\"center\">\n <Spinner muted />\n </Flex>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>There was en error performing this query</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n )\n }\n\n if (!data?.length) {\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={4} space={5}>\n <Feedback>No Documents found</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n </>\n )\n }\n\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={2} space={1}>\n {data.map((doc) => {\n const schemaType = schema.get(doc._type)\n\n // Fixes display issue with document preview when perspective is 'previewDrafts'\n if ('_originalId' in doc && typeof doc._originalId === 'string') {\n doc._id = doc._originalId\n }\n\n return schemaType ? (\n <Button\n key={doc._id}\n onClick={() => handleClick(doc._id, doc._type)}\n padding={2}\n mode=\"bleed\"\n >\n <Preview value={doc} schemaType={schemaType} />\n </Button>\n ) : (\n <Card radius={2} tone=\"caution\" data-ui=\"Alert\" padding={2} key={doc._id}>\n <DefaultPreview\n media={<WarningOutlineIcon />}\n title=\"Unknown schema type found\"\n subtitle={`Encountered type \"${doc._type}\" that is not defined in the schema.`}\n />\n </Card>\n )\n })}\n </Stack>\n </>\n )\n}\n","import {DocumentsPaneQueryParams, DocumentVersionsCollection} from './types'\nimport delve from 'dlv'\n\ninterface ResolveParamsOptions {\n params?: DocumentsPaneQueryParams\n document: DocumentVersionsCollection\n useDraft: boolean\n}\n\ntype ResolveParamsReturn = undefined | {[key: string]: string}\n\nfunction defaultResolver(options: ResolveParamsOptions): {\n [key: string]: string | undefined\n} {\n const {params, document, useDraft} = options\n\n // params is optional\n if (!params) {\n return {}\n }\n\n // legacy useDraft behaviour\n const doc = useDraft ? document.displayed : document.published\n\n if (!doc) {\n return {}\n }\n\n return Object.keys(params).reduce(\n (acc, key) => ({\n ...acc,\n [key]: delve(doc, params[key as keyof DocumentsPaneQueryParams]),\n }),\n {}\n )\n}\n\nexport default function resolveParams(options: ResolveParamsOptions): ResolveParamsReturn {\n const {params, document} = options\n\n const resolvedParams = typeof params == 'function' ? params({document}) : defaultResolver(options)\n\n // if any of the parameters are undefined, the query will error\n // so return undefined so the UI can show a more appropriate message\n if (Object.values(resolvedParams).includes(undefined)) return undefined\n\n // Typescript can't tell that we've guarded against any value being undefined,\n // so forcing the type\n return resolvedParams as {[key: string]: string}\n}\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\n\nimport Documents from './Documents'\nimport Debug from './Debug'\nimport {DocumentsPaneProps} from './types'\nimport resolveParams from './resolveParams'\nimport resolveInitialValueTemplates from './resolveInitialValueTemplates'\n\nexport default function DocumentsPane(props: DocumentsPaneProps) {\n const {document} = props\n const {\n query,\n params,\n useDraft = false,\n debug = false,\n initialValueTemplates: initialValueTemplatesResolver,\n options = {},\n } = props.options\n\n if (useDraft && typeof params === 'function') {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n <code>useDraft</code> should not be <code>true</code> when supplying a function for\n <code>params</code>\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n const paramValues = resolveParams({document, params, useDraft})\n\n const initialValueTemplates = resolveInitialValueTemplates({\n resolver: initialValueTemplatesResolver,\n document,\n })\n\n if (!paramValues) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n Parameters for this query could not be resolved. This may mean the document does not yet\n exist, or is incomplete.\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n return (\n <Documents\n query={query}\n params={paramValues}\n options={options}\n debug={debug}\n initialValueTemplates={initialValueTemplates}\n />\n )\n}\n","import {\n DocumentsPaneInitialValueTemplate,\n DocumentsPaneInitialValueTemplateResolver,\n DocumentVersionsCollection,\n} from './types'\n\ninterface ResolveInitialValueTemplatesOptions {\n resolver: DocumentsPaneInitialValueTemplateResolver | undefined\n document: DocumentVersionsCollection\n}\n\nexport default function resolveInitialValueTemplates(\n options: ResolveInitialValueTemplatesOptions\n): DocumentsPaneInitialValueTemplate[] {\n const {resolver, document} = options || {}\n\n if (!resolver) return []\n\n return resolver({document})\n}\n"],"names":["jsxs","Fragment","jsx","Stack","Box","Label","Code","Card","Flex","Button","Spinner","useListeningQuery","Feedback","useCallback","fromString","useSchema","Preview","DefaultPreview","usePaneRouter$1","ComposeIcon","WarningOutlineIcon","usePaneRouter","uuid","delve","Debug","_ref","query","params","children","space","stringify","NewDocument","props","initialValueTemplates","ReferenceChildLink","length","borderBottom","padding","justify","gap","map","template","documentId","documentType","schemaType","id","parameters","parentRefPath","icon","text","title","mode","as","concat","Documents","options","debug","routerPanesState","groupIndex","handleEditReference","schema","loading","error","data","initialValue","handleClick","type","_a","childParams","pathFromString","align","muted","doc","get","_type","_originalId","_id","onClick","value","radius","tone","media","subtitle","resolveParams","document","resolvedParams","useDraft","displayed","published","Object","keys","reduce","acc","key","defaultResolver","values","includes","DocumentsPane","initialValueTemplatesResolver","paramValues","resolver","resolveInitialValueTemplates"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/Debug.tsx","../src/NewDocument.tsx","../src/DuplicateDocument.tsx","../src/Documents.tsx","../src/resolveParams.ts","../src/DocumentsPane.tsx","../src/resolveInitialValueTemplates.ts"],"sourcesContent":["import React from 'react'\nimport {Code, Box, Label, Stack} from '@sanity/ui'\n\nexport default function Debug({query, params}: {query: string; params?: {[key: string]: string}}) {\n return (\n <>\n <Stack space={4}>\n <Box>\n <Label>Query</Label>\n </Box>\n <Box>\n <Code>{query}</Code>\n </Box>\n </Stack>\n {params && (\n <Stack space={4}>\n <Box>\n <Label>Params</Label>\n </Box>\n <Box>\n <Code>{JSON.stringify(params)}</Code>\n </Box>\n </Stack>\n )}\n </>\n )\n}\n","import {Button, Card, Flex} from '@sanity/ui'\nimport React from 'react'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport {ComposeIcon} from '@sanity/icons'\nimport {usePaneRouter} from 'sanity/structure'\nimport {uuid} from '@sanity/uuid'\n\ninterface NewDocumentProps {\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n}\n\nexport default function NewDocument(props: NewDocumentProps) {\n const {initialValueTemplates = []} = props\n const {ReferenceChildLink} = usePaneRouter()\n\n if (!initialValueTemplates.length) return null\n\n return (\n <Card borderBottom padding={2}>\n <Flex justify=\"flex-end\" gap={1}>\n {initialValueTemplates.map((template) => {\n if (!template.template) {\n return null\n }\n return (\n <ReferenceChildLink\n documentId={uuid()}\n documentType={template.schemaType}\n template={{id: template.template, params: template.parameters}}\n parentRefPath={[]}\n key={`${template.schemaType}-${template.template}`}\n >\n <Button icon={<ComposeIcon />} text={template.title} mode=\"bleed\" as=\"span\" />\n </ReferenceChildLink>\n )\n })}\n </Flex>\n </Card>\n )\n}\n","import {Box, Button, Tooltip, Text} from '@sanity/ui'\nimport React, {useState, useCallback} from 'react'\nimport {filter, firstValueFrom} from 'rxjs'\nimport {CopyIcon} from '@sanity/icons'\nimport {\n useDocumentOperation,\n useDocumentPairPermissions,\n useDocumentStore,\n useTranslation,\n} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\nimport {uuid} from '@sanity/uuid'\nimport {fromString as pathFromString} from '@sanity/util/paths'\n\nimport {structureLocaleNamespace} from 'sanity/structure'\n\ninterface NewDocumentProps {\n id: string\n type: string\n}\n\nexport default function DuplicateDocument(props: NewDocumentProps) {\n const {id, type} = props\n\n const documentStore = useDocumentStore()\n const {duplicate} = useDocumentOperation(id, type)\n const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()\n const [isDuplicating, setDuplicating] = useState(false)\n const [permissions, isPermissionsLoading] = useDocumentPairPermissions({\n id,\n type,\n permission: 'duplicate',\n })\n\n const {t} = useTranslation(structureLocaleNamespace)\n\n const handle = useCallback(\n async (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n const dupeId = uuid()\n\n setDuplicating(true)\n\n // set up the listener before executing\n const duplicateSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(id, type)\n .pipe(filter((e) => e.op === 'duplicate' && e.type === 'success'))\n )\n duplicate.execute(dupeId)\n\n // only navigate to the duplicated document when the operation is successful\n await duplicateSuccess\n setDuplicating(false)\n\n const childParams = routerPanesState[groupIndex + 1]?.[0].params || {}\n const {parentRefPath} = childParams\n\n handleEditReference({\n id: dupeId,\n type,\n parentRefPath: parentRefPath ? pathFromString(parentRefPath) : [``],\n template: {id: dupeId},\n })\n },\n [documentStore.pair, duplicate, groupIndex, handleEditReference, id, routerPanesState, type]\n )\n\n if (isPermissionsLoading || !permissions?.granted) {\n return <></>\n }\n\n return (\n <Tooltip\n content={\n <Box>\n <Text muted size={1}>\n {t('action.duplicate.label')}\n </Text>\n </Box>\n }\n placement=\"left\"\n portal\n >\n <Button\n onClick={handle}\n padding={2}\n fontSize={1}\n as={Box}\n icon={<CopyIcon />}\n mode=\"ghost\"\n tone=\"default\"\n aria-label={t('action.duplicate.label')}\n style={{cursor: 'pointer'}}\n disabled={isDuplicating || Boolean(duplicate.disabled) || isPermissionsLoading}\n />\n </Tooltip>\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Button, Stack, Flex, Spinner, Card} from '@sanity/ui'\nimport {fromString as pathFromString} from '@sanity/util/paths'\nimport {\n Preview,\n useSchema,\n DefaultPreview,\n SanityDocument,\n ListenQueryOptions,\n getPublishedId,\n} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\nimport {WarningOutlineIcon} from '@sanity/icons'\nimport {Feedback, useListeningQuery} from 'sanity-plugin-utils'\n\nimport Debug from './Debug'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport NewDocument from './NewDocument'\nimport DuplicateDocument from './DuplicateDocument'\n\ntype DocumentsProps = {\n query: string\n params: {[key: string]: string}\n debug: boolean\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n options: ListenQueryOptions\n duplicate: boolean\n}\n\nexport default function Documents(props: DocumentsProps) {\n const {query, params, options, debug, initialValueTemplates, duplicate} = props\n const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()\n const schema = useSchema()\n\n const {loading, error, data} = useListeningQuery<SanityDocument[]>(query, {\n params,\n initialValue: [],\n options,\n })\n\n const handleClick = useCallback(\n (id: string, type: string) => {\n const childParams = routerPanesState[groupIndex + 1]?.[0].params || {}\n const {parentRefPath} = childParams\n\n handleEditReference({\n id,\n type,\n // Uncertain that this works as intended\n parentRefPath: parentRefPath ? pathFromString(parentRefPath) : [``],\n template: {id},\n })\n },\n [routerPanesState, groupIndex, handleEditReference]\n )\n\n if (loading) {\n return (\n <Box padding={4}>\n <Flex justify=\"center\" align=\"center\">\n <Spinner muted />\n </Flex>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>There was en error performing this query</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n )\n }\n\n if (!data?.length) {\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={4} space={5}>\n <Feedback>No Documents found</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n </>\n )\n }\n\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={2} space={1}>\n {data.map((doc) => {\n const schemaType = schema.get(doc._type)\n\n // Fixes display issue with document preview when perspective is 'previewDrafts'\n if ('_originalId' in doc && typeof doc._originalId === 'string') {\n doc._id = doc._originalId\n }\n\n return schemaType ? (\n <Button\n key={doc._id}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => handleClick(doc._id, doc._type)}\n padding={2}\n mode=\"bleed\"\n >\n <Preview\n value={doc}\n schemaType={schemaType}\n actions={\n duplicate && <DuplicateDocument id={getPublishedId(doc._id)} type={doc._type} />\n }\n layout=\"block\"\n />\n </Button>\n ) : (\n <Card radius={2} tone=\"caution\" data-ui=\"Alert\" padding={2} key={doc._id}>\n <DefaultPreview\n media={<WarningOutlineIcon />}\n title=\"Unknown schema type found\"\n subtitle={`Encountered type \"${doc._type}\" that is not defined in the schema.`}\n />\n </Card>\n )\n })}\n </Stack>\n </>\n )\n}\n","import {DocumentsPaneQueryParams, DocumentVersionsCollection} from './types'\nimport delve from 'dlv'\n\ninterface ResolveParamsOptions {\n params?: DocumentsPaneQueryParams\n document: DocumentVersionsCollection\n useDraft: boolean\n}\n\ntype ResolveParamsReturn = undefined | {[key: string]: string}\n\nfunction defaultResolver(options: ResolveParamsOptions): {\n [key: string]: string | undefined\n} {\n const {params, document, useDraft} = options\n\n // params is optional\n if (!params) {\n return {}\n }\n\n // legacy useDraft behaviour\n const doc = useDraft ? document.displayed : document.published\n\n if (!doc) {\n return {}\n }\n\n return Object.keys(params).reduce(\n (acc, key) => ({\n ...acc,\n [key]: delve(doc, params[key as keyof DocumentsPaneQueryParams]),\n }),\n {}\n )\n}\n\nexport default function resolveParams(options: ResolveParamsOptions): ResolveParamsReturn {\n const {params, document} = options\n\n const resolvedParams = typeof params == 'function' ? params({document}) : defaultResolver(options)\n\n // if any of the parameters are undefined, the query will error\n // so return undefined so the UI can show a more appropriate message\n if (Object.values(resolvedParams).includes(undefined)) return undefined\n\n // Typescript can't tell that we've guarded against any value being undefined,\n // so forcing the type\n return resolvedParams as {[key: string]: string}\n}\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\n\nimport Documents from './Documents'\nimport Debug from './Debug'\nimport {DocumentsPaneProps} from './types'\nimport resolveParams from './resolveParams'\nimport resolveInitialValueTemplates from './resolveInitialValueTemplates'\n\nexport default function DocumentsPane(props: DocumentsPaneProps) {\n const {document} = props\n const {\n query,\n params,\n useDraft = false,\n debug = false,\n initialValueTemplates: initialValueTemplatesResolver,\n options = {},\n duplicate = false,\n } = props.options\n\n if (useDraft && typeof params === 'function') {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n <code>useDraft</code> should not be <code>true</code> when supplying a function for\n <code>params</code>\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n const paramValues = resolveParams({document, params, useDraft})\n\n const initialValueTemplates = resolveInitialValueTemplates({\n resolver: initialValueTemplatesResolver,\n document,\n })\n\n if (!paramValues) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n Parameters for this query could not be resolved. This may mean the document does not yet\n exist, or is incomplete.\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n return (\n <Documents\n query={query}\n params={paramValues}\n options={options}\n debug={debug}\n initialValueTemplates={initialValueTemplates}\n duplicate={duplicate}\n />\n )\n}\n","import {\n DocumentsPaneInitialValueTemplate,\n DocumentsPaneInitialValueTemplateResolver,\n DocumentVersionsCollection,\n} from './types'\n\ninterface ResolveInitialValueTemplatesOptions {\n resolver: DocumentsPaneInitialValueTemplateResolver | undefined\n document: DocumentVersionsCollection\n}\n\nexport default function resolveInitialValueTemplates(\n options: ResolveInitialValueTemplatesOptions\n): DocumentsPaneInitialValueTemplate[] {\n const {resolver, document} = options || {}\n\n if (!resolver) return []\n\n return resolver({document})\n}\n"],"names":["jsxs","Fragment","jsx","Stack","Box","Label","Code","Card","Flex","Button","Tooltip","Text","Spinner","useListeningQuery","Feedback","useState","useCallback","fromString","useDocumentStore","useDocumentOperation","useDocumentPairPermissions","useTranslation","useSchema","Preview","getPublishedId","DefaultPreview","usePaneRouter","structureLocaleNamespace","ComposeIcon","CopyIcon","WarningOutlineIcon","uuid","firstValueFrom","filter","delve","Debug","_ref","query","params","children","space","stringify","NewDocument","props","initialValueTemplates","ReferenceChildLink","length","borderBottom","padding","justify","gap","map","template","documentId","documentType","schemaType","id","parameters","parentRefPath","icon","text","title","mode","as","concat","DuplicateDocument","type","documentStore","duplicate","routerPanesState","groupIndex","handleEditReference","isDuplicating","setDuplicating","permissions","isPermissionsLoading","permission","t","handle","async","_a","event","stopPropagation","dupeId","duplicateSuccess","pair","operationEvents","pipe","e","op","execute","childParams","pathFromString","granted","content","muted","size","placement","portal","onClick","fontSize","tone","style","cursor","disabled","Boolean","Documents","options","debug","schema","loading","error","data","initialValue","handleClick","align","doc","get","_type","_originalId","_id","value","actions","layout","radius","media","subtitle","resolveParams","document","resolvedParams","useDraft","displayed","published","Object","keys","reduce","acc","key","defaultResolver","values","includes","DocumentsPane","initialValueTemplatesResolver","paramValues","resolver","resolveInitialValueTemplates"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("react/jsx-runtime"),n=require("@sanity/ui"),t=require("sanity-plugin-utils"),r=require("react"),i=require("@sanity/util/paths"),a=require("sanity"),s=require("sanity/structure"),d=require("@sanity/icons"),u=require("sanity/desk"),c=require("@sanity/uuid");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=o(require("dlv"));function p(t){let{query:r,params:i}=t;return e.jsxs(e.Fragment,{children:[e.jsxs(n.Stack,{space:4,children:[e.jsx(n.Box,{children:e.jsx(n.Label,{children:"Query"})}),e.jsx(n.Box,{children:e.jsx(n.Code,{children:r})})]}),i&&e.jsxs(n.Stack,{space:4,children:[e.jsx(n.Box,{children:e.jsx(n.Label,{children:"Params"})}),e.jsx(n.Box,{children:e.jsx(n.Code,{children:JSON.stringify(i)})})]})]})}function m(t){const{initialValueTemplates:r=[]}=t,{ReferenceChildLink:i}=u.usePaneRouter();return r.length?e.jsx(n.Card,{borderBottom:!0,padding:2,children:e.jsx(n.Flex,{justify:"flex-end",gap:1,children:r.map((t=>t.template?e.jsx(i,{documentId:c.uuid(),documentType:t.schemaType,template:{id:t.template,params:t.parameters},parentRefPath:[],children:e.jsx(n.Button,{icon:e.jsx(d.ComposeIcon,{}),text:t.title,mode:"bleed",as:"span"})},"".concat(t.schemaType,"-").concat(t.template)):null))})}):null}function x(u){const{query:c,params:o,options:l,debug:x,initialValueTemplates:h}=u,{routerPanesState:j,groupIndex:f,handleEditReference:y}=s.usePaneRouter(),g=a.useSchema(),{loading:q,error:b,data:k}=t.useListeningQuery(c,{params:o,initialValue:[],options:l}),v=r.useCallback(((e,n)=>{var t;const r=(null==(t=j[f+1])?void 0:t[0].params)||{},{parentRefPath:a}=r;y({id:e,type:n,parentRefPath:a?i.fromString(a):[""],template:{id:e}})}),[j,f,y]);return q?e.jsx(n.Box,{padding:4,children:e.jsx(n.Flex,{justify:"center",align:"center",children:e.jsx(n.Spinner,{muted:!0})})}):b?e.jsxs(n.Stack,{padding:4,space:5,children:[e.jsx(t.Feedback,{children:"There was en error performing this query"}),x&&e.jsx(p,{query:c,params:o})]}):(null==k?void 0:k.length)?e.jsxs(e.Fragment,{children:[e.jsx(m,{initialValueTemplates:h}),e.jsx(n.Stack,{padding:2,space:1,children:k.map((t=>{const r=g.get(t._type);return"_originalId"in t&&"string"==typeof t._originalId&&(t._id=t._originalId),r?e.jsx(n.Button,{onClick:()=>v(t._id,t._type),padding:2,mode:"bleed",children:e.jsx(a.Preview,{value:t,schemaType:r})},t._id):e.jsx(n.Card,{radius:2,tone:"caution","data-ui":"Alert",padding:2,children:e.jsx(a.DefaultPreview,{media:e.jsx(d.WarningOutlineIcon,{}),title:"Unknown schema type found",subtitle:'Encountered type "'.concat(t._type,'" that is not defined in the schema.')})},t._id)}))})]}):e.jsxs(e.Fragment,{children:[e.jsx(m,{initialValueTemplates:h}),e.jsxs(n.Stack,{padding:4,space:5,children:[e.jsx(t.Feedback,{children:"No Documents found"}),x&&e.jsx(p,{query:c,params:o})]})]})}function h(e){const{params:n,document:t}=e,r="function"==typeof n?n({document:t}):function(e){const{params:n,document:t,useDraft:r}=e;if(!n)return{};const i=r?t.displayed:t.published;return i?Object.keys(n).reduce(((e,t)=>({...e,[t]:l.default(i,n[t])})),{}):{}}(e);if(!Object.values(r).includes(void 0))return r}module.exports=function(r){const{document:i}=r,{query:a,params:s,useDraft:d=!1,debug:u=!1,initialValueTemplates:c,options:o={}}=r.options;if(d&&"function"==typeof s)return e.jsxs(n.Stack,{padding:4,space:5,children:[e.jsxs(t.Feedback,{children:[e.jsx("code",{children:"useDraft"})," should not be ",e.jsx("code",{children:"true"})," when supplying a function for",e.jsx("code",{children:"params"})]}),u&&e.jsx(p,{query:a})]});const l=h({document:i,params:s,useDraft:d}),m=function(e){const{resolver:n,document:t}=e||{};return n?n({document:t}):[]}({resolver:c,document:i});return l?e.jsx(x,{query:a,params:l,options:o,debug:u,initialValueTemplates:m}):e.jsxs(n.Stack,{padding:4,space:5,children:[e.jsx(t.Feedback,{children:"Parameters for this query could not be resolved. This may mean the document does not yet exist, or is incomplete."}),u&&e.jsx(p,{query:a})]})};//# sourceMappingURL=index.js.map
1
+ "use strict";var e=require("react/jsx-runtime"),t=require("@sanity/ui"),n=require("sanity-plugin-utils"),i=require("react"),a=require("@sanity/util/paths"),r=require("sanity"),s=require("sanity/structure"),o=require("@sanity/icons"),d=require("@sanity/uuid"),u=require("rxjs");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var l=c(require("dlv"));function p(n){let{query:i,params:a}=n;return e.jsxs(e.Fragment,{children:[e.jsxs(t.Stack,{space:4,children:[e.jsx(t.Box,{children:e.jsx(t.Label,{children:"Query"})}),e.jsx(t.Box,{children:e.jsx(t.Code,{children:i})})]}),a&&e.jsxs(t.Stack,{space:4,children:[e.jsx(t.Box,{children:e.jsx(t.Label,{children:"Params"})}),e.jsx(t.Box,{children:e.jsx(t.Code,{children:JSON.stringify(a)})})]})]})}function m(n){const{initialValueTemplates:i=[]}=n,{ReferenceChildLink:a}=s.usePaneRouter();return i.length?e.jsx(t.Card,{borderBottom:!0,padding:2,children:e.jsx(t.Flex,{justify:"flex-end",gap:1,children:i.map((n=>n.template?e.jsx(a,{documentId:d.uuid(),documentType:n.schemaType,template:{id:n.template,params:n.parameters},parentRefPath:[],children:e.jsx(t.Button,{icon:e.jsx(o.ComposeIcon,{}),text:n.title,mode:"bleed",as:"span"})},"".concat(n.schemaType,"-").concat(n.template)):null))})}):null}function x(n){const{id:c,type:l}=n,p=r.useDocumentStore(),{duplicate:m}=r.useDocumentOperation(c,l),{routerPanesState:x,groupIndex:h,handleEditReference:j}=s.usePaneRouter(),[f,y]=i.useState(!1),[g,b]=r.useDocumentPairPermissions({id:c,type:l,permission:"duplicate"}),{t:q}=r.useTranslation(s.structureLocaleNamespace),k=i.useCallback((async e=>{var t;e.stopPropagation();const n=d.uuid();y(!0);const i=u.firstValueFrom(p.pair.operationEvents(c,l).pipe(u.filter((e=>"duplicate"===e.op&&"success"===e.type))));m.execute(n),await i,y(!1);const r=(null==(t=x[h+1])?void 0:t[0].params)||{},{parentRefPath:s}=r;j({id:n,type:l,parentRefPath:s?a.fromString(s):[""],template:{id:n}})}),[p.pair,m,h,j,c,x,l]);return b||!(null==g?void 0:g.granted)?e.jsx(e.Fragment,{}):e.jsx(t.Tooltip,{content:e.jsx(t.Box,{children:e.jsx(t.Text,{muted:!0,size:1,children:q("action.duplicate.label")})}),placement:"left",portal:!0,children:e.jsx(t.Button,{onClick:k,padding:2,fontSize:1,as:t.Box,icon:e.jsx(o.CopyIcon,{}),mode:"ghost",tone:"default","aria-label":q("action.duplicate.label"),style:{cursor:"pointer"},disabled:f||Boolean(m.disabled)||b})})}function h(d){const{query:u,params:c,options:l,debug:h,initialValueTemplates:j,duplicate:f}=d,{routerPanesState:y,groupIndex:g,handleEditReference:b}=s.usePaneRouter(),q=r.useSchema(),{loading:k,error:v,data:P}=n.useListeningQuery(u,{params:c,initialValue:[],options:l}),S=i.useCallback(((e,t)=>{var n;const i=(null==(n=y[g+1])?void 0:n[0].params)||{},{parentRefPath:r}=i;b({id:e,type:t,parentRefPath:r?a.fromString(r):[""],template:{id:e}})}),[y,g,b]);return k?e.jsx(t.Box,{padding:4,children:e.jsx(t.Flex,{justify:"center",align:"center",children:e.jsx(t.Spinner,{muted:!0})})}):v?e.jsxs(t.Stack,{padding:4,space:5,children:[e.jsx(n.Feedback,{children:"There was en error performing this query"}),h&&e.jsx(p,{query:u,params:c})]}):(null==P?void 0:P.length)?e.jsxs(e.Fragment,{children:[e.jsx(m,{initialValueTemplates:j}),e.jsx(t.Stack,{padding:2,space:1,children:P.map((n=>{const i=q.get(n._type);return"_originalId"in n&&"string"==typeof n._originalId&&(n._id=n._originalId),i?e.jsx(t.Button,{onClick:()=>S(n._id,n._type),padding:2,mode:"bleed",children:e.jsx(r.Preview,{value:n,schemaType:i,actions:f&&e.jsx(x,{id:r.getPublishedId(n._id),type:n._type}),layout:"block"})},n._id):e.jsx(t.Card,{radius:2,tone:"caution","data-ui":"Alert",padding:2,children:e.jsx(r.DefaultPreview,{media:e.jsx(o.WarningOutlineIcon,{}),title:"Unknown schema type found",subtitle:'Encountered type "'.concat(n._type,'" that is not defined in the schema.')})},n._id)}))})]}):e.jsxs(e.Fragment,{children:[e.jsx(m,{initialValueTemplates:j}),e.jsxs(t.Stack,{padding:4,space:5,children:[e.jsx(n.Feedback,{children:"No Documents found"}),h&&e.jsx(p,{query:u,params:c})]})]})}function j(e){const{params:t,document:n}=e,i="function"==typeof t?t({document:n}):function(e){const{params:t,document:n,useDraft:i}=e;if(!t)return{};const a=i?n.displayed:n.published;return a?Object.keys(t).reduce(((e,n)=>({...e,[n]:l.default(a,t[n])})),{}):{}}(e);if(!Object.values(i).includes(void 0))return i}module.exports=function(i){const{document:a}=i,{query:r,params:s,useDraft:o=!1,debug:d=!1,initialValueTemplates:u,options:c={},duplicate:l=!1}=i.options;if(o&&"function"==typeof s)return e.jsxs(t.Stack,{padding:4,space:5,children:[e.jsxs(n.Feedback,{children:[e.jsx("code",{children:"useDraft"})," should not be ",e.jsx("code",{children:"true"})," when supplying a function for",e.jsx("code",{children:"params"})]}),d&&e.jsx(p,{query:r})]});const m=j({document:a,params:s,useDraft:o}),x=function(e){const{resolver:t,document:n}=e||{};return t?t({document:n}):[]}({resolver:u,document:a});return m?e.jsx(h,{query:r,params:m,options:c,debug:d,initialValueTemplates:x,duplicate:l}):e.jsxs(t.Stack,{padding:4,space:5,children:[e.jsx(n.Feedback,{children:"Parameters for this query could not be resolved. This may mean the document does not yet exist, or is incomplete."}),d&&e.jsx(p,{query:r})]})};//# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/Debug.tsx","../src/NewDocument.tsx","../src/Documents.tsx","../src/resolveParams.ts","../src/DocumentsPane.tsx","../src/resolveInitialValueTemplates.ts"],"sourcesContent":["import React from 'react'\nimport {Code, Box, Label, Stack} from '@sanity/ui'\n\nexport default function Debug({query, params}: {query: string; params?: {[key: string]: string}}) {\n return (\n <>\n <Stack space={4}>\n <Box>\n <Label>Query</Label>\n </Box>\n <Box>\n <Code>{query}</Code>\n </Box>\n </Stack>\n {params && (\n <Stack space={4}>\n <Box>\n <Label>Params</Label>\n </Box>\n <Box>\n <Code>{JSON.stringify(params)}</Code>\n </Box>\n </Stack>\n )}\n </>\n )\n}\n","import {Button, Card, Flex} from '@sanity/ui'\nimport React from 'react'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport {ComposeIcon} from '@sanity/icons'\nimport {usePaneRouter} from 'sanity/desk'\nimport {uuid} from '@sanity/uuid'\n\ninterface NewDocumentProps {\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n}\n\nexport default function NewDocument(props: NewDocumentProps) {\n const {initialValueTemplates = []} = props\n const {ReferenceChildLink} = usePaneRouter()\n\n if (!initialValueTemplates.length) return null\n\n return (\n <Card borderBottom={true} padding={2}>\n <Flex justify=\"flex-end\" gap={1}>\n {initialValueTemplates.map((template) => {\n if (!template.template) {\n return null\n }\n return (\n <ReferenceChildLink\n documentId={uuid()}\n documentType={template.schemaType}\n template={{id: template.template, params: template.parameters}}\n parentRefPath={[]}\n key={`${template.schemaType}-${template.template}`}\n >\n <Button icon={<ComposeIcon />} text={template.title} mode=\"bleed\" as=\"span\" />\n </ReferenceChildLink>\n )\n })}\n </Flex>\n </Card>\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Button, Stack, Flex, Spinner, Card} from '@sanity/ui'\nimport {fromString as pathFromString} from '@sanity/util/paths'\nimport {Preview, useSchema, DefaultPreview, SanityDocument, ListenQueryOptions} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\nimport {WarningOutlineIcon} from '@sanity/icons'\nimport {Feedback, useListeningQuery} from 'sanity-plugin-utils'\n\nimport Debug from './Debug'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport NewDocument from './NewDocument'\n\ntype DocumentsProps = {\n query: string\n params: {[key: string]: string}\n debug: boolean\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n options: ListenQueryOptions\n}\n\nexport default function Documents(props: DocumentsProps) {\n const {query, params, options, debug, initialValueTemplates} = props\n const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()\n const schema = useSchema()\n\n const {loading, error, data} = useListeningQuery<SanityDocument[]>(query, {\n params,\n initialValue: [],\n options,\n })\n\n const handleClick = useCallback(\n (id: string, type: string) => {\n const childParams = routerPanesState[groupIndex + 1]?.[0].params || {}\n const {parentRefPath} = childParams\n\n handleEditReference({\n id,\n type,\n // Uncertain that this works as intended\n parentRefPath: parentRefPath ? pathFromString(parentRefPath) : [``],\n template: {id},\n })\n },\n [routerPanesState, groupIndex, handleEditReference]\n )\n\n if (loading) {\n return (\n <Box padding={4}>\n <Flex justify=\"center\" align=\"center\">\n <Spinner muted />\n </Flex>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>There was en error performing this query</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n )\n }\n\n if (!data?.length) {\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={4} space={5}>\n <Feedback>No Documents found</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n </>\n )\n }\n\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={2} space={1}>\n {data.map((doc) => {\n const schemaType = schema.get(doc._type)\n\n // Fixes display issue with document preview when perspective is 'previewDrafts'\n if ('_originalId' in doc && typeof doc._originalId === 'string') {\n doc._id = doc._originalId\n }\n\n return schemaType ? (\n <Button\n key={doc._id}\n onClick={() => handleClick(doc._id, doc._type)}\n padding={2}\n mode=\"bleed\"\n >\n <Preview value={doc} schemaType={schemaType} />\n </Button>\n ) : (\n <Card radius={2} tone=\"caution\" data-ui=\"Alert\" padding={2} key={doc._id}>\n <DefaultPreview\n media={<WarningOutlineIcon />}\n title=\"Unknown schema type found\"\n subtitle={`Encountered type \"${doc._type}\" that is not defined in the schema.`}\n />\n </Card>\n )\n })}\n </Stack>\n </>\n )\n}\n","import {DocumentsPaneQueryParams, DocumentVersionsCollection} from './types'\nimport delve from 'dlv'\n\ninterface ResolveParamsOptions {\n params?: DocumentsPaneQueryParams\n document: DocumentVersionsCollection\n useDraft: boolean\n}\n\ntype ResolveParamsReturn = undefined | {[key: string]: string}\n\nfunction defaultResolver(options: ResolveParamsOptions): {\n [key: string]: string | undefined\n} {\n const {params, document, useDraft} = options\n\n // params is optional\n if (!params) {\n return {}\n }\n\n // legacy useDraft behaviour\n const doc = useDraft ? document.displayed : document.published\n\n if (!doc) {\n return {}\n }\n\n return Object.keys(params).reduce(\n (acc, key) => ({\n ...acc,\n [key]: delve(doc, params[key as keyof DocumentsPaneQueryParams]),\n }),\n {}\n )\n}\n\nexport default function resolveParams(options: ResolveParamsOptions): ResolveParamsReturn {\n const {params, document} = options\n\n const resolvedParams = typeof params == 'function' ? params({document}) : defaultResolver(options)\n\n // if any of the parameters are undefined, the query will error\n // so return undefined so the UI can show a more appropriate message\n if (Object.values(resolvedParams).includes(undefined)) return undefined\n\n // Typescript can't tell that we've guarded against any value being undefined,\n // so forcing the type\n return resolvedParams as {[key: string]: string}\n}\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\n\nimport Documents from './Documents'\nimport Debug from './Debug'\nimport {DocumentsPaneProps} from './types'\nimport resolveParams from './resolveParams'\nimport resolveInitialValueTemplates from './resolveInitialValueTemplates'\n\nexport default function DocumentsPane(props: DocumentsPaneProps) {\n const {document} = props\n const {\n query,\n params,\n useDraft = false,\n debug = false,\n initialValueTemplates: initialValueTemplatesResolver,\n options = {},\n } = props.options\n\n if (useDraft && typeof params === 'function') {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n <code>useDraft</code> should not be <code>true</code> when supplying a function for\n <code>params</code>\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n const paramValues = resolveParams({document, params, useDraft})\n\n const initialValueTemplates = resolveInitialValueTemplates({\n resolver: initialValueTemplatesResolver,\n document,\n })\n\n if (!paramValues) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n Parameters for this query could not be resolved. This may mean the document does not yet\n exist, or is incomplete.\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n return (\n <Documents\n query={query}\n params={paramValues}\n options={options}\n debug={debug}\n initialValueTemplates={initialValueTemplates}\n />\n )\n}\n","import {\n DocumentsPaneInitialValueTemplate,\n DocumentsPaneInitialValueTemplateResolver,\n DocumentVersionsCollection,\n} from './types'\n\ninterface ResolveInitialValueTemplatesOptions {\n resolver: DocumentsPaneInitialValueTemplateResolver | undefined\n document: DocumentVersionsCollection\n}\n\nexport default function resolveInitialValueTemplates(\n options: ResolveInitialValueTemplatesOptions\n): DocumentsPaneInitialValueTemplate[] {\n const {resolver, document} = options || {}\n\n if (!resolver) return []\n\n return resolver({document})\n}\n"],"names":["jsxRuntime","require","ui","sanityPluginUtils","react","paths","sanity","structure","icons","desk","uuid","_interopDefaultCompat","e","default","delve__default","Debug","_ref","query","params","jsxs","Fragment","children","Stack","space","jsx","Box","Label","Code","stringify","NewDocument","props","initialValueTemplates","ReferenceChildLink","usePaneRouter","length","Card","borderBottom","padding","Flex","justify","gap","map","template","documentId","documentType","schemaType","id","parameters","parentRefPath","Button","icon","ComposeIcon","text","title","mode","as","concat","Documents","options","debug","routerPanesState","groupIndex","handleEditReference","schema","useSchema","loading","error","data","useListeningQuery","initialValue","handleClick","useCallback","type","_a","childParams","pathFromString","align","Spinner","muted","Feedback","doc","get","_type","_originalId","_id","onClick","Preview","value","radius","tone","DefaultPreview","media","WarningOutlineIcon","subtitle","resolveParams","document","resolvedParams","useDraft","displayed","published","Object","keys","reduce","acc","key","delve","defaultResolver","values","includes","module","exports","initialValueTemplatesResolver","paramValues","resolver","resolveInitialValueTemplates"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/Debug.tsx","../src/NewDocument.tsx","../src/DuplicateDocument.tsx","../src/Documents.tsx","../src/resolveParams.ts","../src/DocumentsPane.tsx","../src/resolveInitialValueTemplates.ts"],"sourcesContent":["import React from 'react'\nimport {Code, Box, Label, Stack} from '@sanity/ui'\n\nexport default function Debug({query, params}: {query: string; params?: {[key: string]: string}}) {\n return (\n <>\n <Stack space={4}>\n <Box>\n <Label>Query</Label>\n </Box>\n <Box>\n <Code>{query}</Code>\n </Box>\n </Stack>\n {params && (\n <Stack space={4}>\n <Box>\n <Label>Params</Label>\n </Box>\n <Box>\n <Code>{JSON.stringify(params)}</Code>\n </Box>\n </Stack>\n )}\n </>\n )\n}\n","import {Button, Card, Flex} from '@sanity/ui'\nimport React from 'react'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport {ComposeIcon} from '@sanity/icons'\nimport {usePaneRouter} from 'sanity/structure'\nimport {uuid} from '@sanity/uuid'\n\ninterface NewDocumentProps {\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n}\n\nexport default function NewDocument(props: NewDocumentProps) {\n const {initialValueTemplates = []} = props\n const {ReferenceChildLink} = usePaneRouter()\n\n if (!initialValueTemplates.length) return null\n\n return (\n <Card borderBottom padding={2}>\n <Flex justify=\"flex-end\" gap={1}>\n {initialValueTemplates.map((template) => {\n if (!template.template) {\n return null\n }\n return (\n <ReferenceChildLink\n documentId={uuid()}\n documentType={template.schemaType}\n template={{id: template.template, params: template.parameters}}\n parentRefPath={[]}\n key={`${template.schemaType}-${template.template}`}\n >\n <Button icon={<ComposeIcon />} text={template.title} mode=\"bleed\" as=\"span\" />\n </ReferenceChildLink>\n )\n })}\n </Flex>\n </Card>\n )\n}\n","import {Box, Button, Tooltip, Text} from '@sanity/ui'\nimport React, {useState, useCallback} from 'react'\nimport {filter, firstValueFrom} from 'rxjs'\nimport {CopyIcon} from '@sanity/icons'\nimport {\n useDocumentOperation,\n useDocumentPairPermissions,\n useDocumentStore,\n useTranslation,\n} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\nimport {uuid} from '@sanity/uuid'\nimport {fromString as pathFromString} from '@sanity/util/paths'\n\nimport {structureLocaleNamespace} from 'sanity/structure'\n\ninterface NewDocumentProps {\n id: string\n type: string\n}\n\nexport default function DuplicateDocument(props: NewDocumentProps) {\n const {id, type} = props\n\n const documentStore = useDocumentStore()\n const {duplicate} = useDocumentOperation(id, type)\n const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()\n const [isDuplicating, setDuplicating] = useState(false)\n const [permissions, isPermissionsLoading] = useDocumentPairPermissions({\n id,\n type,\n permission: 'duplicate',\n })\n\n const {t} = useTranslation(structureLocaleNamespace)\n\n const handle = useCallback(\n async (event: React.MouseEvent<HTMLElement>) => {\n event.stopPropagation()\n const dupeId = uuid()\n\n setDuplicating(true)\n\n // set up the listener before executing\n const duplicateSuccess = firstValueFrom(\n documentStore.pair\n .operationEvents(id, type)\n .pipe(filter((e) => e.op === 'duplicate' && e.type === 'success'))\n )\n duplicate.execute(dupeId)\n\n // only navigate to the duplicated document when the operation is successful\n await duplicateSuccess\n setDuplicating(false)\n\n const childParams = routerPanesState[groupIndex + 1]?.[0].params || {}\n const {parentRefPath} = childParams\n\n handleEditReference({\n id: dupeId,\n type,\n parentRefPath: parentRefPath ? pathFromString(parentRefPath) : [``],\n template: {id: dupeId},\n })\n },\n [documentStore.pair, duplicate, groupIndex, handleEditReference, id, routerPanesState, type]\n )\n\n if (isPermissionsLoading || !permissions?.granted) {\n return <></>\n }\n\n return (\n <Tooltip\n content={\n <Box>\n <Text muted size={1}>\n {t('action.duplicate.label')}\n </Text>\n </Box>\n }\n placement=\"left\"\n portal\n >\n <Button\n onClick={handle}\n padding={2}\n fontSize={1}\n as={Box}\n icon={<CopyIcon />}\n mode=\"ghost\"\n tone=\"default\"\n aria-label={t('action.duplicate.label')}\n style={{cursor: 'pointer'}}\n disabled={isDuplicating || Boolean(duplicate.disabled) || isPermissionsLoading}\n />\n </Tooltip>\n )\n}\n","import React, {useCallback} from 'react'\nimport {Box, Button, Stack, Flex, Spinner, Card} from '@sanity/ui'\nimport {fromString as pathFromString} from '@sanity/util/paths'\nimport {\n Preview,\n useSchema,\n DefaultPreview,\n SanityDocument,\n ListenQueryOptions,\n getPublishedId,\n} from 'sanity'\nimport {usePaneRouter} from 'sanity/structure'\nimport {WarningOutlineIcon} from '@sanity/icons'\nimport {Feedback, useListeningQuery} from 'sanity-plugin-utils'\n\nimport Debug from './Debug'\nimport {DocumentsPaneInitialValueTemplate} from './types'\nimport NewDocument from './NewDocument'\nimport DuplicateDocument from './DuplicateDocument'\n\ntype DocumentsProps = {\n query: string\n params: {[key: string]: string}\n debug: boolean\n initialValueTemplates: DocumentsPaneInitialValueTemplate[]\n options: ListenQueryOptions\n duplicate: boolean\n}\n\nexport default function Documents(props: DocumentsProps) {\n const {query, params, options, debug, initialValueTemplates, duplicate} = props\n const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()\n const schema = useSchema()\n\n const {loading, error, data} = useListeningQuery<SanityDocument[]>(query, {\n params,\n initialValue: [],\n options,\n })\n\n const handleClick = useCallback(\n (id: string, type: string) => {\n const childParams = routerPanesState[groupIndex + 1]?.[0].params || {}\n const {parentRefPath} = childParams\n\n handleEditReference({\n id,\n type,\n // Uncertain that this works as intended\n parentRefPath: parentRefPath ? pathFromString(parentRefPath) : [``],\n template: {id},\n })\n },\n [routerPanesState, groupIndex, handleEditReference]\n )\n\n if (loading) {\n return (\n <Box padding={4}>\n <Flex justify=\"center\" align=\"center\">\n <Spinner muted />\n </Flex>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>There was en error performing this query</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n )\n }\n\n if (!data?.length) {\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={4} space={5}>\n <Feedback>No Documents found</Feedback>\n {debug && <Debug query={query} params={params} />}\n </Stack>\n </>\n )\n }\n\n return (\n <>\n <NewDocument initialValueTemplates={initialValueTemplates} />\n <Stack padding={2} space={1}>\n {data.map((doc) => {\n const schemaType = schema.get(doc._type)\n\n // Fixes display issue with document preview when perspective is 'previewDrafts'\n if ('_originalId' in doc && typeof doc._originalId === 'string') {\n doc._id = doc._originalId\n }\n\n return schemaType ? (\n <Button\n key={doc._id}\n // eslint-disable-next-line react/jsx-no-bind\n onClick={() => handleClick(doc._id, doc._type)}\n padding={2}\n mode=\"bleed\"\n >\n <Preview\n value={doc}\n schemaType={schemaType}\n actions={\n duplicate && <DuplicateDocument id={getPublishedId(doc._id)} type={doc._type} />\n }\n layout=\"block\"\n />\n </Button>\n ) : (\n <Card radius={2} tone=\"caution\" data-ui=\"Alert\" padding={2} key={doc._id}>\n <DefaultPreview\n media={<WarningOutlineIcon />}\n title=\"Unknown schema type found\"\n subtitle={`Encountered type \"${doc._type}\" that is not defined in the schema.`}\n />\n </Card>\n )\n })}\n </Stack>\n </>\n )\n}\n","import {DocumentsPaneQueryParams, DocumentVersionsCollection} from './types'\nimport delve from 'dlv'\n\ninterface ResolveParamsOptions {\n params?: DocumentsPaneQueryParams\n document: DocumentVersionsCollection\n useDraft: boolean\n}\n\ntype ResolveParamsReturn = undefined | {[key: string]: string}\n\nfunction defaultResolver(options: ResolveParamsOptions): {\n [key: string]: string | undefined\n} {\n const {params, document, useDraft} = options\n\n // params is optional\n if (!params) {\n return {}\n }\n\n // legacy useDraft behaviour\n const doc = useDraft ? document.displayed : document.published\n\n if (!doc) {\n return {}\n }\n\n return Object.keys(params).reduce(\n (acc, key) => ({\n ...acc,\n [key]: delve(doc, params[key as keyof DocumentsPaneQueryParams]),\n }),\n {}\n )\n}\n\nexport default function resolveParams(options: ResolveParamsOptions): ResolveParamsReturn {\n const {params, document} = options\n\n const resolvedParams = typeof params == 'function' ? params({document}) : defaultResolver(options)\n\n // if any of the parameters are undefined, the query will error\n // so return undefined so the UI can show a more appropriate message\n if (Object.values(resolvedParams).includes(undefined)) return undefined\n\n // Typescript can't tell that we've guarded against any value being undefined,\n // so forcing the type\n return resolvedParams as {[key: string]: string}\n}\n","import React from 'react'\nimport {Stack} from '@sanity/ui'\nimport {Feedback} from 'sanity-plugin-utils'\n\nimport Documents from './Documents'\nimport Debug from './Debug'\nimport {DocumentsPaneProps} from './types'\nimport resolveParams from './resolveParams'\nimport resolveInitialValueTemplates from './resolveInitialValueTemplates'\n\nexport default function DocumentsPane(props: DocumentsPaneProps) {\n const {document} = props\n const {\n query,\n params,\n useDraft = false,\n debug = false,\n initialValueTemplates: initialValueTemplatesResolver,\n options = {},\n duplicate = false,\n } = props.options\n\n if (useDraft && typeof params === 'function') {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n <code>useDraft</code> should not be <code>true</code> when supplying a function for\n <code>params</code>\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n const paramValues = resolveParams({document, params, useDraft})\n\n const initialValueTemplates = resolveInitialValueTemplates({\n resolver: initialValueTemplatesResolver,\n document,\n })\n\n if (!paramValues) {\n return (\n <Stack padding={4} space={5}>\n <Feedback>\n Parameters for this query could not be resolved. This may mean the document does not yet\n exist, or is incomplete.\n </Feedback>\n {debug && <Debug query={query} />}\n </Stack>\n )\n }\n\n return (\n <Documents\n query={query}\n params={paramValues}\n options={options}\n debug={debug}\n initialValueTemplates={initialValueTemplates}\n duplicate={duplicate}\n />\n )\n}\n","import {\n DocumentsPaneInitialValueTemplate,\n DocumentsPaneInitialValueTemplateResolver,\n DocumentVersionsCollection,\n} from './types'\n\ninterface ResolveInitialValueTemplatesOptions {\n resolver: DocumentsPaneInitialValueTemplateResolver | undefined\n document: DocumentVersionsCollection\n}\n\nexport default function resolveInitialValueTemplates(\n options: ResolveInitialValueTemplatesOptions\n): DocumentsPaneInitialValueTemplate[] {\n const {resolver, document} = options || {}\n\n if (!resolver) return []\n\n return resolver({document})\n}\n"],"names":["jsxRuntime","require","ui","sanityPluginUtils","react","paths","sanity","structure","icons","uuid","rxjs","_interopDefaultCompat","e","default","delve__default","Debug","_ref","query","params","jsxs","Fragment","children","Stack","space","jsx","Box","Label","Code","stringify","NewDocument","props","initialValueTemplates","ReferenceChildLink","usePaneRouter","length","Card","borderBottom","padding","Flex","justify","gap","map","template","documentId","documentType","schemaType","id","parameters","parentRefPath","Button","icon","ComposeIcon","text","title","mode","as","concat","DuplicateDocument","type","documentStore","useDocumentStore","duplicate","useDocumentOperation","routerPanesState","groupIndex","handleEditReference","isDuplicating","setDuplicating","useState","permissions","isPermissionsLoading","useDocumentPairPermissions","permission","t","useTranslation","structureLocaleNamespace","handle","useCallback","async","_a","event","stopPropagation","dupeId","duplicateSuccess","firstValueFrom","pair","operationEvents","pipe","filter","op","execute","childParams","pathFromString","granted","Tooltip","content","Text","muted","size","placement","portal","onClick","fontSize","CopyIcon","tone","style","cursor","disabled","Boolean","Documents","options","debug","schema","useSchema","loading","error","data","useListeningQuery","initialValue","handleClick","align","Spinner","Feedback","doc","get","_type","_originalId","_id","Preview","value","actions","getPublishedId","layout","radius","DefaultPreview","media","WarningOutlineIcon","subtitle","resolveParams","document","resolvedParams","useDraft","displayed","published","Object","keys","reduce","acc","key","delve","defaultResolver","values","includes","module","exports","initialValueTemplatesResolver","paramValues","resolver","resolveInitialValueTemplates"],"mappings":"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"}
@@ -25,6 +25,7 @@ declare type DocumentsPaneOptions = {
25
25
  useDraft?: boolean
26
26
  initialValueTemplates?: DocumentsPaneInitialValueTemplateResolver
27
27
  options?: ListenQueryOptions
28
+ duplicate?: boolean
28
29
  }
29
30
 
30
31
  declare type DocumentsPaneProps = React_2.ComponentProps<UserViewComponent<DocumentsPaneOptions>>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-documents-pane",
3
- "version": "2.2.1",
3
+ "version": "2.3.0",
4
4
  "description": "Displays the results of a GROQ query in a View Pane",
5
5
  "keywords": [
6
6
  "sanity",
@@ -95,7 +95,7 @@
95
95
  "@sanity/ui": "^1.0 || ^2.0",
96
96
  "react": "^18",
97
97
  "react-dom": "^18",
98
- "sanity": "^3.0.0",
98
+ "sanity": "^3.24.1",
99
99
  "styled-components": "^5.0 || ^6.0"
100
100
  },
101
101
  "engines": {
package/src/Documents.tsx CHANGED
@@ -1,7 +1,14 @@
1
1
  import React, {useCallback} from 'react'
2
2
  import {Box, Button, Stack, Flex, Spinner, Card} from '@sanity/ui'
3
3
  import {fromString as pathFromString} from '@sanity/util/paths'
4
- import {Preview, useSchema, DefaultPreview, SanityDocument, ListenQueryOptions} from 'sanity'
4
+ import {
5
+ Preview,
6
+ useSchema,
7
+ DefaultPreview,
8
+ SanityDocument,
9
+ ListenQueryOptions,
10
+ getPublishedId,
11
+ } from 'sanity'
5
12
  import {usePaneRouter} from 'sanity/structure'
6
13
  import {WarningOutlineIcon} from '@sanity/icons'
7
14
  import {Feedback, useListeningQuery} from 'sanity-plugin-utils'
@@ -9,6 +16,7 @@ import {Feedback, useListeningQuery} from 'sanity-plugin-utils'
9
16
  import Debug from './Debug'
10
17
  import {DocumentsPaneInitialValueTemplate} from './types'
11
18
  import NewDocument from './NewDocument'
19
+ import DuplicateDocument from './DuplicateDocument'
12
20
 
13
21
  type DocumentsProps = {
14
22
  query: string
@@ -16,10 +24,11 @@ type DocumentsProps = {
16
24
  debug: boolean
17
25
  initialValueTemplates: DocumentsPaneInitialValueTemplate[]
18
26
  options: ListenQueryOptions
27
+ duplicate: boolean
19
28
  }
20
29
 
21
30
  export default function Documents(props: DocumentsProps) {
22
- const {query, params, options, debug, initialValueTemplates} = props
31
+ const {query, params, options, debug, initialValueTemplates, duplicate} = props
23
32
  const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()
24
33
  const schema = useSchema()
25
34
 
@@ -91,11 +100,19 @@ export default function Documents(props: DocumentsProps) {
91
100
  return schemaType ? (
92
101
  <Button
93
102
  key={doc._id}
103
+ // eslint-disable-next-line react/jsx-no-bind
94
104
  onClick={() => handleClick(doc._id, doc._type)}
95
105
  padding={2}
96
106
  mode="bleed"
97
107
  >
98
- <Preview value={doc} schemaType={schemaType} />
108
+ <Preview
109
+ value={doc}
110
+ schemaType={schemaType}
111
+ actions={
112
+ duplicate && <DuplicateDocument id={getPublishedId(doc._id)} type={doc._type} />
113
+ }
114
+ layout="block"
115
+ />
99
116
  </Button>
100
117
  ) : (
101
118
  <Card radius={2} tone="caution" data-ui="Alert" padding={2} key={doc._id}>
@@ -17,6 +17,7 @@ export default function DocumentsPane(props: DocumentsPaneProps) {
17
17
  debug = false,
18
18
  initialValueTemplates: initialValueTemplatesResolver,
19
19
  options = {},
20
+ duplicate = false,
20
21
  } = props.options
21
22
 
22
23
  if (useDraft && typeof params === 'function') {
@@ -57,6 +58,7 @@ export default function DocumentsPane(props: DocumentsPaneProps) {
57
58
  options={options}
58
59
  debug={debug}
59
60
  initialValueTemplates={initialValueTemplates}
61
+ duplicate={duplicate}
60
62
  />
61
63
  )
62
64
  }
@@ -0,0 +1,99 @@
1
+ import {Box, Button, Tooltip, Text} from '@sanity/ui'
2
+ import React, {useState, useCallback} from 'react'
3
+ import {filter, firstValueFrom} from 'rxjs'
4
+ import {CopyIcon} from '@sanity/icons'
5
+ import {
6
+ useDocumentOperation,
7
+ useDocumentPairPermissions,
8
+ useDocumentStore,
9
+ useTranslation,
10
+ } from 'sanity'
11
+ import {usePaneRouter} from 'sanity/structure'
12
+ import {uuid} from '@sanity/uuid'
13
+ import {fromString as pathFromString} from '@sanity/util/paths'
14
+
15
+ import {structureLocaleNamespace} from 'sanity/structure'
16
+
17
+ interface NewDocumentProps {
18
+ id: string
19
+ type: string
20
+ }
21
+
22
+ export default function DuplicateDocument(props: NewDocumentProps) {
23
+ const {id, type} = props
24
+
25
+ const documentStore = useDocumentStore()
26
+ const {duplicate} = useDocumentOperation(id, type)
27
+ const {routerPanesState, groupIndex, handleEditReference} = usePaneRouter()
28
+ const [isDuplicating, setDuplicating] = useState(false)
29
+ const [permissions, isPermissionsLoading] = useDocumentPairPermissions({
30
+ id,
31
+ type,
32
+ permission: 'duplicate',
33
+ })
34
+
35
+ const {t} = useTranslation(structureLocaleNamespace)
36
+
37
+ const handle = useCallback(
38
+ async (event: React.MouseEvent<HTMLElement>) => {
39
+ event.stopPropagation()
40
+ const dupeId = uuid()
41
+
42
+ setDuplicating(true)
43
+
44
+ // set up the listener before executing
45
+ const duplicateSuccess = firstValueFrom(
46
+ documentStore.pair
47
+ .operationEvents(id, type)
48
+ .pipe(filter((e) => e.op === 'duplicate' && e.type === 'success'))
49
+ )
50
+ duplicate.execute(dupeId)
51
+
52
+ // only navigate to the duplicated document when the operation is successful
53
+ await duplicateSuccess
54
+ setDuplicating(false)
55
+
56
+ const childParams = routerPanesState[groupIndex + 1]?.[0].params || {}
57
+ const {parentRefPath} = childParams
58
+
59
+ handleEditReference({
60
+ id: dupeId,
61
+ type,
62
+ parentRefPath: parentRefPath ? pathFromString(parentRefPath) : [``],
63
+ template: {id: dupeId},
64
+ })
65
+ },
66
+ [documentStore.pair, duplicate, groupIndex, handleEditReference, id, routerPanesState, type]
67
+ )
68
+
69
+ if (isPermissionsLoading || !permissions?.granted) {
70
+ return <></>
71
+ }
72
+
73
+ return (
74
+ <Tooltip
75
+ content={
76
+ <Box>
77
+ <Text muted size={1}>
78
+ {t('action.duplicate.label')}
79
+ </Text>
80
+ </Box>
81
+ }
82
+ placement="left"
83
+ portal
84
+ >
85
+ <Button
86
+ onClick={handle}
87
+ padding={2}
88
+ fontSize={1}
89
+ as={Box}
90
+ icon={<CopyIcon />}
91
+ mode="ghost"
92
+ tone="default"
93
+ aria-label={t('action.duplicate.label')}
94
+ style={{cursor: 'pointer'}}
95
+ disabled={isDuplicating || Boolean(duplicate.disabled) || isPermissionsLoading}
96
+ />
97
+ </Tooltip>
98
+ )
99
+ }
@@ -2,7 +2,7 @@ import {Button, Card, Flex} from '@sanity/ui'
2
2
  import React from 'react'
3
3
  import {DocumentsPaneInitialValueTemplate} from './types'
4
4
  import {ComposeIcon} from '@sanity/icons'
5
- import {usePaneRouter} from 'sanity/desk'
5
+ import {usePaneRouter} from 'sanity/structure'
6
6
  import {uuid} from '@sanity/uuid'
7
7
 
8
8
  interface NewDocumentProps {
@@ -16,7 +16,7 @@ export default function NewDocument(props: NewDocumentProps) {
16
16
  if (!initialValueTemplates.length) return null
17
17
 
18
18
  return (
19
- <Card borderBottom={true} padding={2}>
19
+ <Card borderBottom padding={2}>
20
20
  <Flex justify="flex-end" gap={1}>
21
21
  {initialValueTemplates.map((template) => {
22
22
  if (!template.template) {
package/src/types.ts CHANGED
@@ -5,7 +5,9 @@ import {UserViewComponent} from 'sanity/structure'
5
5
  export type DocumentVersionsCollection = React.ComponentProps<UserViewComponent>['document']
6
6
 
7
7
  // eslint-disable-next-line prettier/prettier
8
- export type DocumentsPaneQueryParams = (params: {document: DocumentVersionsCollection}) => ({[key: string]: string}) | {[key: string]: string}
8
+ export type DocumentsPaneQueryParams = (params: {
9
+ document: DocumentVersionsCollection
10
+ }) => {[key: string]: string} | {[key: string]: string}
9
11
 
10
12
  export interface DocumentsPaneInitialValueTemplate {
11
13
  schemaType: string
@@ -15,7 +17,9 @@ export interface DocumentsPaneInitialValueTemplate {
15
17
  }
16
18
 
17
19
  // eslint-disable-next-line prettier/prettier
18
- export type DocumentsPaneInitialValueTemplateResolver = (params: {document: DocumentVersionsCollection}) => DocumentsPaneInitialValueTemplate[]
20
+ export type DocumentsPaneInitialValueTemplateResolver = (params: {
21
+ document: DocumentVersionsCollection
22
+ }) => DocumentsPaneInitialValueTemplate[]
19
23
 
20
24
  export type DocumentsPaneOptions = {
21
25
  query: string
@@ -24,6 +28,7 @@ export type DocumentsPaneOptions = {
24
28
  useDraft?: boolean
25
29
  initialValueTemplates?: DocumentsPaneInitialValueTemplateResolver
26
30
  options?: ListenQueryOptions
31
+ duplicate?: boolean
27
32
  }
28
33
 
29
34
  export type DocumentsPaneProps = React.ComponentProps<UserViewComponent<DocumentsPaneOptions>>