@sanity/cross-dataset-duplicator 0.3.2 → 0.3.3
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 +7 -2
- package/lib/actions/DuplicateToAction.js.map +1 -1
- package/lib/actions/index.js.map +1 -1
- package/lib/components/CrossDatasetDuplicator.js +1 -1
- package/lib/components/CrossDatasetDuplicator.js.map +1 -1
- package/lib/components/DuplicatorQuery.js +24 -10
- package/lib/components/DuplicatorQuery.js.map +1 -1
- package/lib/components/DuplicatorTool.js +30 -16
- package/lib/components/DuplicatorTool.js.map +1 -1
- package/lib/components/Feedback.js.map +1 -1
- package/lib/components/ResetSecret.js.map +1 -1
- package/lib/components/SelectButtons.js.map +1 -1
- package/lib/components/StatusBadge.js +10 -5
- package/lib/components/StatusBadge.js.map +1 -1
- package/lib/helpers/clientConfig.js.map +1 -1
- package/lib/helpers/constants.js.map +1 -1
- package/lib/helpers/getDocumentsInArray.js +5 -4
- package/lib/helpers/getDocumentsInArray.js.map +1 -1
- package/lib/helpers/index.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/tool/index.js.map +1 -1
- package/lib/types/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/CrossDatasetDuplicator.tsx +1 -1
- package/src/components/DuplicatorQuery.tsx +25 -14
- package/src/components/DuplicatorTool.tsx +40 -11
- package/src/components/StatusBadge.tsx +8 -1
- package/src/helpers/getDocumentsInArray.ts +4 -2
package/README.md
CHANGED
|
@@ -66,11 +66,16 @@ Options:
|
|
|
66
66
|
|
|
67
67
|
### 3. Authentication Key
|
|
68
68
|
|
|
69
|
-
To Duplicate the original files of Assets, an
|
|
69
|
+
To Duplicate the original files of Assets, an API Token with Viewer permissions is required. You will be prompted for this the first time you attempt to use either the Tool or Document Action on any Dataset.
|
|
70
70
|
|
|
71
71
|
This plugin uses [Sanity Secrets](https://github.com/sanity-io/sanity-studio-secrets/) to store the token in the Dataset itself.
|
|
72
72
|
|
|
73
|
-
You can
|
|
73
|
+
You can [create API tokens in manage](https://sanity.io/manage)
|
|
74
|
+
|
|
75
|
+
### 4. CORS origins
|
|
76
|
+
|
|
77
|
+
If you want to duplicate data across different projects, you need to enable CORS for the different hosts. This allows different projects to connect to each other through the project API. CORS origins configuration can be found in your project page, under the API tab.
|
|
78
|
+
|
|
74
79
|
|
|
75
80
|
## Importing the Document Action
|
|
76
81
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"DuplicateToAction.js","names":["DuplicateToAction","draft","published","onComplete","dialogOpen","setDialogOpen","disabled","title","label","dialog","type","content","onClose","onHandle","icon","LaunchIcon"],"sources":["../../src/actions/DuplicateToAction.tsx"],"sourcesContent":["import React, {useState} from 'react'\nimport {LaunchIcon} from '@sanity/icons'\n\nimport CrossDatasetDuplicator from '../components/CrossDatasetDuplicator'\n\nexport default function DuplicateToAction({draft, published, onComplete}) {\n const [dialogOpen, setDialogOpen] = useState(false)\n\n return {\n disabled: draft,\n title: draft ? `Document must be Published to begin` : null,\n label: 'Duplicate to...',\n dialog: dialogOpen && published && {\n type: 'modal',\n title: 'Cross Dataset Duplicator',\n content: <CrossDatasetDuplicator docs={[published]} mode=\"action\" />,\n onClose: () => onComplete(),\n },\n onHandle: () => setDialogOpen(true),\n icon: LaunchIcon,\n }\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEe,SAASA,iBAAT,OAA2D;EAAA,IAA/BC,KAA+B,QAA/BA,KAA+B;EAAA,IAAxBC,SAAwB,QAAxBA,SAAwB;EAAA,IAAbC,UAAa,QAAbA,UAAa;;EACxE,gBAAoC,qBAAS,KAAT,CAApC;EAAA;EAAA,IAAOC,UAAP;EAAA,IAAmBC,aAAnB;;EAEA,OAAO;IACLC,QAAQ,EAAEL,KADL;IAELM,KAAK,EAAEN,KAAK,2CAA2C,IAFlD;IAGLO,KAAK,EAAE,iBAHF;IAILC,MAAM,EAAEL,UAAU,IAAIF,SAAd,IAA2B;MACjCQ,IAAI,EAAE,OAD2B;MAEjCH,KAAK,EAAE,0BAF0B;MAGjCI,OAAO,eAAE,6BAAC,+BAAD;QAAwB,IAAI,EAAE,CAACT,SAAD,CAA9B;QAA2C,IAAI,EAAC;MAAhD,EAHwB;MAIjCU,OAAO,EAAE,MAAMT,UAAU;IAJQ,CAJ9B;IAULU,QAAQ,EAAE,MAAMR,aAAa,CAAC,IAAD,CAVxB;IAWLS,IAAI,EAAEC;EAXD,CAAP;AAaD"}
|
package/lib/actions/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":["resolveDocumentActions","props","duplicatorTypes","config","types","defaultActions","includes","type","reduce","acc","cur","DuplicateAction","DuplicateToAction"],"sources":["../../src/actions/index.ts"],"sourcesContent":["import defaultResolve, {DuplicateAction} from 'part:@sanity/base/document-actions'\nimport config from 'config:@sanity/cross-dataset-duplicator'\n\nimport DuplicateToAction from './DuplicateToAction'\n\nexport default function resolveDocumentActions(props) { \n const duplicatorTypes = config?.types ?? []\n const defaultActions = defaultResolve(props)\n\n // Insert 'Duplicate to...' after 'Duplicate' only on config'd types\n if (duplicatorTypes.includes(props?.type)) {\n return defaultActions.reduce((acc, cur) => {\n if (cur === DuplicateAction) {\n return [...acc, cur, DuplicateToAction]\n }\n\n return [...acc, cur]\n }, [])\n }\n\n return defaultActions\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;AAEe,SAASA,sBAAT,CAAgCC,KAAhC,EAAuC;EAAA;;EACpD,IAAMC,eAAe,oBAAGC,+BAAH,aAAGA,+BAAH,uBAAGA,gCAAQC,KAAX,yDAAoB,EAAzC;EACA,IAAMC,cAAc,GAAG,8BAAeJ,KAAf,CAAvB,CAFoD,CAIpD;;EACA,IAAIC,eAAe,CAACI,QAAhB,CAAyBL,KAAzB,aAAyBA,KAAzB,uBAAyBA,KAAK,CAAEM,IAAhC,CAAJ,EAA2C;IACzC,OAAOF,cAAc,CAACG,MAAf,CAAsB,CAACC,GAAD,EAAMC,GAAN,KAAc;MACzC,IAAIA,GAAG,KAAKC,gCAAZ,EAA6B;QAC3B,OAAO,CAAC,GAAGF,GAAJ,EAASC,GAAT,EAAcE,0BAAd,CAAP;MACD;;MAED,OAAO,CAAC,GAAGH,GAAJ,EAASC,GAAT,CAAP;IACD,CANM,EAMJ,EANI,CAAP;EAOD;;EAED,OAAOL,cAAP;AACD"}
|
|
@@ -42,7 +42,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
42
42
|
// Check for auth secret (required for asset uploads)
|
|
43
43
|
var secretConfigKeys = [{
|
|
44
44
|
key: 'bearerToken',
|
|
45
|
-
title: 'An
|
|
45
|
+
title: 'An API token with Viewer permissions is required to duplicate the original files of assets, and will be used for all Duplications. Create one at sanity.io/manage',
|
|
46
46
|
description: ''
|
|
47
47
|
}];
|
|
48
48
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"CrossDatasetDuplicator.js","names":["secretConfigKeys","key","title","description","CrossDatasetDuplicator","props","mode","docs","secretsData","SECRET_NAMESPACE","loading","secrets","showSecretsPrompt","setShowSecretsPrompt","bearerToken","length"],"sources":["../../src/components/CrossDatasetDuplicator.tsx"],"sourcesContent":["import React, {useEffect, useState} from 'react'\nimport {useSecrets, SettingsView} from 'sanity-secrets'\nimport {ThemeProvider, Flex, Box, Spinner} from '@sanity/ui'\n\nimport DuplicatorQuery from './DuplicatorQuery'\nimport DuplicatorTool from './DuplicatorTool'\nimport ResetSecret from './ResetSecret'\nimport Feedback from './Feedback'\nimport {SanityDocument} from '../types'\nimport {SECRET_NAMESPACE} from '../helpers/constants'\n\n// Check for auth secret (required for asset uploads)\nconst secretConfigKeys = [\n {\n key: 'bearerToken',\n title:\n 'An API token with Viewer permissions is required to duplicate the original files of assets, and will be used for all Duplications. Create one at sanity.io/manage',\n description: '',\n },\n]\n\ntype CrossDatasetDuplicatorProps = {\n mode: 'tool' | 'action'\n docs: SanityDocument[]\n}\n\ntype Secrets = {\n bearerToken?: string\n}\n\nexport default function CrossDatasetDuplicator(props: CrossDatasetDuplicatorProps) {\n const {mode = `tool`, docs = []} = props\n\n const secretsData = useSecrets(SECRET_NAMESPACE)\n const {loading, secrets}: {loading: boolean; secrets: Secrets} = secretsData\n const [showSecretsPrompt, setShowSecretsPrompt] = useState(false)\n\n useEffect(() => {\n if (secrets) {\n setShowSecretsPrompt(!secrets?.bearerToken)\n }\n }, [secrets])\n\n if (!secretsData) {\n return (\n <Feedback>\n Could not query for Secrets. You may have insufficient permissions on your account.\n </Feedback>\n )\n }\n\n if (loading) {\n return (\n <ThemeProvider>\n <Flex justify=\"center\" align=\"center\">\n <Box padding={5}>\n <Spinner />\n </Box>\n </Flex>\n </ThemeProvider>\n )\n }\n\n if ((!loading && showSecretsPrompt) || !secrets?.bearerToken) {\n return (\n <ThemeProvider>\n <SettingsView\n title=\"Token Required\"\n namespace={SECRET_NAMESPACE}\n keys={secretConfigKeys}\n // eslint-disable-next-line react/jsx-no-bind\n onClose={() => setShowSecretsPrompt(false)}\n />\n </ThemeProvider>\n )\n }\n\n if (mode === 'tool') {\n return (\n <ThemeProvider>\n <DuplicatorQuery token={secrets?.bearerToken} />\n <ResetSecret />\n </ThemeProvider>\n )\n }\n\n if (!docs?.length) {\n return (\n <ThemeProvider>\n <Feedback>No docs passed into Duplicator Tool</Feedback>\n </ThemeProvider>\n )\n }\n\n return (\n <ThemeProvider>\n <DuplicatorTool docs={docs} token={secrets?.bearerToken} />\n </ThemeProvider>\n )\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEA;AACA,IAAMA,gBAAgB,GAAG,CACvB;EACEC,GAAG,EAAE,aADP;EAEEC,KAAK,EACH,mKAHJ;EAIEC,WAAW,EAAE;AAJf,CADuB,CAAzB;;AAkBe,SAASC,sBAAT,CAAgCC,KAAhC,EAAoE;EACjF,kBAAmCA,KAAnC,CAAOC,IAAP;EAAA,IAAOA,IAAP;EAAA,kBAAmCD,KAAnC,CAAsBE,IAAtB;EAAA,IAAsBA,IAAtB,4BAA6B,EAA7B;EAEA,IAAMC,WAAW,GAAG,+BAAWC,2BAAX,CAApB;EACA,IAAOC,OAAP,GAAiEF,WAAjE,CAAOE,OAAP;EAAA,IAAgBC,OAAhB,GAAiEH,WAAjE,CAAgBG,OAAhB;;EACA,gBAAkD,qBAAS,KAAT,CAAlD;EAAA;EAAA,IAAOC,iBAAP;EAAA,IAA0BC,oBAA1B;;EAEA,sBAAU,MAAM;IACd,IAAIF,OAAJ,EAAa;MACXE,oBAAoB,CAAC,EAACF,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAD,CAApB;IACD;EACF,CAJD,EAIG,CAACH,OAAD,CAJH;;EAMA,IAAI,CAACH,WAAL,EAAkB;IAChB,oBACE,6BAAC,iBAAD,8FADF;EAKD;;EAED,IAAIE,OAAJ,EAAa;IACX,oBACE,6BAAC,iBAAD,qBACE,6BAAC,QAAD;MAAM,OAAO,EAAC,QAAd;MAAuB,KAAK,EAAC;IAA7B,gBACE,6BAAC,OAAD;MAAK,OAAO,EAAE;IAAd,gBACE,6BAAC,WAAD,OADF,CADF,CADF,CADF;EASD;;EAED,IAAK,CAACA,OAAD,IAAYE,iBAAb,IAAmC,EAACD,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAvC,EAA8D;IAC5D,oBACE,6BAAC,iBAAD,qBACE,6BAAC,2BAAD;MACE,KAAK,EAAC,gBADR;MAEE,SAAS,EAAEL,2BAFb;MAGE,IAAI,EAAET,gBAHR,CAIE;MAJF;MAKE,OAAO,EAAE,MAAMa,oBAAoB,CAAC,KAAD;IALrC,EADF,CADF;EAWD;;EAED,IAAIP,IAAI,KAAK,MAAb,EAAqB;IACnB,oBACE,6BAAC,iBAAD,qBACE,6BAAC,wBAAD;MAAiB,KAAK,EAAEK,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;IAAjC,EADF,eAEE,6BAAC,oBAAD,OAFF,CADF;EAMD;;EAED,IAAI,EAACP,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEQ,MAAP,CAAJ,EAAmB;IACjB,oBACE,6BAAC,iBAAD,qBACE,6BAAC,iBAAD,8CADF,CADF;EAKD;;EAED,oBACE,6BAAC,iBAAD,qBACE,6BAAC,uBAAD;IAAgB,IAAI,EAAER,IAAtB;IAA4B,KAAK,EAAEI,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;EAA5C,EADF,CADF;AAKD"}
|
|
@@ -37,7 +37,11 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
37
37
|
|
|
38
38
|
var originClient = _client.default.withConfig(_clientConfig.clientConfig);
|
|
39
39
|
|
|
40
|
+
var schemaTypes = _schema.default.getTypeNames();
|
|
41
|
+
|
|
40
42
|
function DuplicatorQuery(props) {
|
|
43
|
+
var _initialData$docs2, _initialData$docs3;
|
|
44
|
+
|
|
41
45
|
var token = props.token;
|
|
42
46
|
|
|
43
47
|
var _useState = (0, _react.useState)(""),
|
|
@@ -45,23 +49,32 @@ function DuplicatorQuery(props) {
|
|
|
45
49
|
value = _useState2[0],
|
|
46
50
|
setValue = _useState2[1];
|
|
47
51
|
|
|
48
|
-
var _useState3 = (0, _react.useState)(
|
|
52
|
+
var _useState3 = (0, _react.useState)({
|
|
53
|
+
docs: [],
|
|
54
|
+
draftIds: []
|
|
55
|
+
}),
|
|
49
56
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
initialData = _useState4[0],
|
|
58
|
+
setInitialData = _useState4[1];
|
|
52
59
|
|
|
53
60
|
function handleSubmit(e) {
|
|
54
61
|
if (e) e.preventDefault();
|
|
55
62
|
originClient.fetch(value).then(res => {
|
|
56
63
|
// Ensure queried docs are registered to the schema
|
|
57
|
-
var
|
|
58
|
-
|
|
64
|
+
var registeredAndPublishedDocs = res.length ? res.filter(doc => schemaTypes.includes(doc._type)).filter(doc => !doc._id.startsWith("drafts.")) : [];
|
|
65
|
+
var initialDraftIds = res.length ? res.filter(doc => doc._id.startsWith("drafts.")).map(doc => doc._id) : [];
|
|
66
|
+
setInitialData({
|
|
67
|
+
docs: registeredAndPublishedDocs,
|
|
68
|
+
draftIds: initialDraftIds
|
|
69
|
+
});
|
|
59
70
|
}).catch(err => console.error(err));
|
|
60
71
|
} // Auto-load initial textinput value
|
|
61
72
|
|
|
62
73
|
|
|
63
74
|
(0, _react.useEffect)(() => {
|
|
64
|
-
|
|
75
|
+
var _initialData$docs;
|
|
76
|
+
|
|
77
|
+
if (!((_initialData$docs = initialData.docs) !== null && _initialData$docs !== void 0 && _initialData$docs.length) && value) {
|
|
65
78
|
handleSubmit();
|
|
66
79
|
}
|
|
67
80
|
}, []);
|
|
@@ -79,7 +92,7 @@ function DuplicatorQuery(props) {
|
|
|
79
92
|
radius: 3
|
|
80
93
|
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
|
|
81
94
|
space: 4
|
|
82
|
-
}, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Label, null, "Initial Documents Query")), /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Text, null, "Start with a valid GROQ query to load initial documents. The query will need to return an Array of Objects.")), /*#__PURE__*/_react.default.createElement("form", {
|
|
95
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Label, null, "Initial Documents Query")), /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Text, null, "Start with a valid GROQ query to load initial documents. The query will need to return an Array of Objects. Drafts will be removed from the results.")), /*#__PURE__*/_react.default.createElement("form", {
|
|
83
96
|
onSubmit: handleSubmit
|
|
84
97
|
}, /*#__PURE__*/_react.default.createElement(_ui.Flex, null, /*#__PURE__*/_react.default.createElement(_ui.Box, {
|
|
85
98
|
flex: 1,
|
|
@@ -101,12 +114,13 @@ function DuplicatorQuery(props) {
|
|
|
101
114
|
onClick: handleSubmit,
|
|
102
115
|
text: "Query",
|
|
103
116
|
disabled: !value
|
|
104
|
-
})))))), !(docs !== null &&
|
|
117
|
+
})))))), !((_initialData$docs2 = initialData.docs) !== null && _initialData$docs2 !== void 0 && _initialData$docs2.length) || initialData.docs.length < 1 && /*#__PURE__*/_react.default.createElement(_ui.Container, {
|
|
105
118
|
width: 1
|
|
106
119
|
}, /*#__PURE__*/_react.default.createElement(_ui.Card, {
|
|
107
120
|
padding: 5
|
|
108
|
-
}, value ? "No Documents registered to the Schema match this query" : "Start with a valid GROQ query")), (docs === null ||
|
|
109
|
-
docs: docs,
|
|
121
|
+
}, value ? "No Documents registered to the Schema match this query" : "Start with a valid GROQ query")), ((_initialData$docs3 = initialData.docs) === null || _initialData$docs3 === void 0 ? void 0 : _initialData$docs3.length) > 0 && /*#__PURE__*/_react.default.createElement(_DuplicatorTool.default, {
|
|
122
|
+
docs: initialData.docs,
|
|
123
|
+
draftIds: initialData.draftIds,
|
|
110
124
|
token: token
|
|
111
125
|
})));
|
|
112
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"DuplicatorQuery.js","names":["originClient","sanityClient","withConfig","clientConfig","schemaTypes","schema","getTypeNames","DuplicatorQuery","props","token","value","setValue","docs","draftIds","initialData","setInitialData","handleSubmit","e","preventDefault","fetch","then","res","registeredAndPublishedDocs","length","filter","doc","includes","_type","_id","startsWith","initialDraftIds","map","catch","err","console","error","fontFamily","event","currentTarget"],"sources":["../../src/components/DuplicatorQuery.tsx"],"sourcesContent":["import React, {useEffect, useState} from 'react'\nimport sanityClient from 'part:@sanity/base/client'\nimport schema from 'part:@sanity/base/schema'\nimport {Button, Stack, Box, Label, Text, Card, Flex, Grid, Container, TextInput} from '@sanity/ui'\n\nimport DuplicatorTool from './DuplicatorTool'\nimport {clientConfig} from '../helpers/clientConfig'\n\nconst originClient = sanityClient.withConfig(clientConfig)\n\ntype DuplicatorQueryProps = {\n token: string\n}\n\nconst schemaTypes = schema.getTypeNames()\n\nexport default function DuplicatorQuery(props: DuplicatorQueryProps) {\n const {token} = props\n\n const [value, setValue] = useState(``)\n const [initialData, setInitialData] = useState({docs: [], draftIds: []});\n\n function handleSubmit(e?: any) {\n if (e) e.preventDefault()\n\n originClient\n .fetch(value)\n .then((res) => {\n // Ensure queried docs are registered to the schema\n const registeredAndPublishedDocs = res.length\n ? res\n .filter((doc) => schemaTypes.includes(doc._type))\n .filter((doc) => !doc._id.startsWith(`drafts.`))\n : []\n const initialDraftIds = res.length ? res.filter(doc => doc._id.startsWith(`drafts.`)).map(doc => doc._id) : []\n\n setInitialData({docs: registeredAndPublishedDocs, draftIds: initialDraftIds})\n })\n .catch((err) => console.error(err))\n }\n\n // Auto-load initial textinput value\n useEffect(() => {\n if (!initialData.docs?.length && value) {\n handleSubmit()\n }\n }, [])\n\n return (\n <Container width={[1, 1, 1, 3]} padding={[0, 0, 0, 5]}>\n <Grid columns={[1, 1, 1, 2]} gap={[1, 1, 1, 4]}>\n <Box padding={[2, 2, 2, 0]}>\n <Card padding={4} scheme=\"dark\" radius={3}>\n <Stack space={4}>\n <Box>\n <Label>Initial Documents Query</Label>\n </Box>\n <Box>\n <Text>\n Start with a valid GROQ query to load initial documents. The query will need to\n return an Array of Objects. Drafts will be removed from the results.\n </Text>\n </Box>\n <form onSubmit={handleSubmit}>\n <Flex>\n <Box flex={1} paddingRight={2}>\n <TextInput\n style={{fontFamily: 'monospace'}}\n fontSize={2}\n // eslint-disable-next-line react/jsx-no-bind\n onChange={(event) => setValue(event.currentTarget.value)}\n padding={4}\n placeholder={`*[_type == \"article\"]`}\n value={value ?? ``}\n />\n </Box>\n <Button\n padding={2}\n paddingX={4}\n tone=\"primary\"\n onClick={handleSubmit}\n text=\"Query\"\n disabled={!value}\n />\n </Flex>\n </form>\n </Stack>\n </Card>\n </Box>\n {!initialData.docs?.length ||\n (initialData.docs.length < 1 && (\n <Container width={1}>\n <Card padding={5}>\n {value\n ? `No Documents registered to the Schema match this query`\n : `Start with a valid GROQ query`}\n </Card>\n </Container>\n ))}\n {initialData.docs?.length > 0 && <DuplicatorTool docs={initialData.docs} draftIds={initialData.draftIds} token={token} />}\n </Grid>\n </Container>\n )\n}\n"],"mappings":"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"}
|
|
@@ -71,6 +71,7 @@ function DuplicatorTool(props) {
|
|
|
71
71
|
var _config$__experimenta, _destination$title, _spacesOptions$find, _message$tone;
|
|
72
72
|
|
|
73
73
|
var docs = props.docs,
|
|
74
|
+
draftIds = props.draftIds,
|
|
74
75
|
token = props.token; // Prepare origin (this Studio) client
|
|
75
76
|
// In function-scope so it is up to date on every render
|
|
76
77
|
|
|
@@ -95,7 +96,8 @@ function DuplicatorTool(props) {
|
|
|
95
96
|
var _useState5 = (0, _react.useState)(docs.length ? docs.map(item => ({
|
|
96
97
|
doc: item,
|
|
97
98
|
include: true,
|
|
98
|
-
status: null
|
|
99
|
+
status: null,
|
|
100
|
+
hasDraft: draftIds.includes("drafts.".concat(item._id))
|
|
99
101
|
})) : []),
|
|
100
102
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
101
103
|
payload = _useState6[0],
|
|
@@ -224,14 +226,21 @@ function DuplicatorTool(props) {
|
|
|
224
226
|
_handleReferences = _asyncToGenerator(function* () {
|
|
225
227
|
setIsGathering(true);
|
|
226
228
|
var docIds = docs.map(doc => doc._id);
|
|
227
|
-
var payloadDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds, originClient, null);
|
|
229
|
+
var payloadDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds, originClient, null);
|
|
230
|
+
var draftDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds.map(id => "drafts.".concat(id)), originClient, null, "{_id}");
|
|
231
|
+
var draftDocsIds = new Set(draftDocs.map(_ref4 => {
|
|
232
|
+
var _id = _ref4._id;
|
|
233
|
+
return _id;
|
|
234
|
+
})); // Shape it up
|
|
228
235
|
|
|
229
236
|
var payloadShaped = payloadDocs.map(doc => ({
|
|
230
237
|
doc,
|
|
231
238
|
// Include this in the transaction?
|
|
232
239
|
include: true,
|
|
233
240
|
// Does it exist at the destination?
|
|
234
|
-
status: ''
|
|
241
|
+
status: '',
|
|
242
|
+
// Does it have any drafts?
|
|
243
|
+
hasDraft: draftDocsIds.has("drafts.".concat(doc._id))
|
|
235
244
|
}));
|
|
236
245
|
setPayload(payloadShaped);
|
|
237
246
|
updatePayloadStatuses(payloadShaped);
|
|
@@ -247,9 +256,9 @@ function DuplicatorTool(props) {
|
|
|
247
256
|
function _handleDuplicate() {
|
|
248
257
|
_handleDuplicate = _asyncToGenerator(function* () {
|
|
249
258
|
setIsDuplicating(true);
|
|
250
|
-
var assetsCount = payload.filter(
|
|
251
|
-
var doc =
|
|
252
|
-
include =
|
|
259
|
+
var assetsCount = payload.filter(_ref5 => {
|
|
260
|
+
var doc = _ref5.doc,
|
|
261
|
+
include = _ref5.include;
|
|
253
262
|
return include && (0, _helpers.typeIsAsset)(doc._type);
|
|
254
263
|
}).length;
|
|
255
264
|
var currentProgress = 0;
|
|
@@ -281,11 +290,11 @@ function DuplicatorTool(props) {
|
|
|
281
290
|
var downloadUrl = uploadType === 'image' ? "".concat(doc.url, "?dlRaw=true") : doc.url;
|
|
282
291
|
var downloadConfig = uploadType === 'image' ? {
|
|
283
292
|
headers: {
|
|
284
|
-
Authorization:
|
|
293
|
+
Authorization: "Bearer ".concat(token)
|
|
285
294
|
}
|
|
286
295
|
} : {};
|
|
287
296
|
yield fetch(downloadUrl, downloadConfig).then( /*#__PURE__*/function () {
|
|
288
|
-
var
|
|
297
|
+
var _ref6 = _asyncToGenerator(function* (res) {
|
|
289
298
|
var assetData = yield res.blob();
|
|
290
299
|
var options = {
|
|
291
300
|
filename: doc.originalFilename
|
|
@@ -303,7 +312,7 @@ function DuplicatorTool(props) {
|
|
|
303
312
|
});
|
|
304
313
|
|
|
305
314
|
return function (_x2) {
|
|
306
|
-
return
|
|
315
|
+
return _ref6.apply(this, arguments);
|
|
307
316
|
};
|
|
308
317
|
}());
|
|
309
318
|
currentProgress += 1;
|
|
@@ -504,7 +513,8 @@ function DuplicatorTool(props) {
|
|
|
504
513
|
}, payload.map((_ref2, index) => {
|
|
505
514
|
var doc = _ref2.doc,
|
|
506
515
|
include = _ref2.include,
|
|
507
|
-
status = _ref2.status
|
|
516
|
+
status = _ref2.status,
|
|
517
|
+
hasDraft = _ref2.hasDraft;
|
|
508
518
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
|
|
509
519
|
key: doc._id
|
|
510
520
|
}, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
|
|
@@ -513,24 +523,28 @@ function DuplicatorTool(props) {
|
|
|
513
523
|
checked: include,
|
|
514
524
|
onChange: () => handleCheckbox(doc._id)
|
|
515
525
|
}), /*#__PURE__*/_react.default.createElement(_ui.Box, {
|
|
516
|
-
|
|
517
|
-
flex: 1
|
|
518
|
-
},
|
|
526
|
+
flex: 1,
|
|
519
527
|
paddingX: 3
|
|
520
528
|
}, /*#__PURE__*/_react.default.createElement(_preview.default, {
|
|
521
529
|
value: doc,
|
|
522
530
|
type: _schema.default.get(doc._type)
|
|
523
|
-
})), /*#__PURE__*/_react.default.createElement(
|
|
531
|
+
})), /*#__PURE__*/_react.default.createElement(_ui.Flex, {
|
|
532
|
+
items: "center",
|
|
533
|
+
gap: 2
|
|
534
|
+
}, hasDraft ? /*#__PURE__*/_react.default.createElement(_StatusBadge.default, {
|
|
535
|
+
status: "UNPUBLISHED",
|
|
536
|
+
isAsset: false
|
|
537
|
+
}) : null, /*#__PURE__*/_react.default.createElement(_StatusBadge.default, {
|
|
524
538
|
status: status,
|
|
525
539
|
isAsset: (0, _helpers.typeIsAsset)(doc._type)
|
|
526
|
-
})), (doc === null || doc === void 0 ? void 0 : doc.extension) === 'svg' && index === firstSvgIndex && /*#__PURE__*/_react.default.createElement(_ui.Card, {
|
|
540
|
+
}))), (doc === null || doc === void 0 ? void 0 : doc.extension) === 'svg' && index === firstSvgIndex && /*#__PURE__*/_react.default.createElement(_ui.Card, {
|
|
527
541
|
padding: 3,
|
|
528
542
|
radius: 2,
|
|
529
543
|
shadow: 1,
|
|
530
544
|
tone: "caution"
|
|
531
545
|
}, /*#__PURE__*/_react.default.createElement(_ui.Text, {
|
|
532
546
|
size: 1
|
|
533
|
-
}, "Due to how SVGs are sanitized after first uploaded, duplicated SVG assets may have new",
|
|
547
|
+
}, "Due to how SVGs are sanitized after first uploaded, duplicated SVG assets may have new ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), "'s at the destination. The newly generated", ' ', /*#__PURE__*/_react.default.createElement("code", null, "_id"), " will be the same in each duplication, but it will never be the same ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), " as the first time this Asset was uploaded. References to the asset will be updated to use the new ", /*#__PURE__*/_react.default.createElement("code", null, "_id"), ".")));
|
|
534
548
|
})), /*#__PURE__*/_react.default.createElement(_ui.Stack, {
|
|
535
549
|
space: 2,
|
|
536
550
|
padding: 4,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/DuplicatorTool.tsx"],"names":["DuplicatorTool","props","docs","token","originClient","sanityClient","withConfig","clientConfig","spacesOptions","config","__experimental_spaces","length","map","space","disabled","api","dataset","projectId","find","destination","setDestination","message","setMessage","item","doc","include","status","payload","setPayload","hasReferences","setHasReferences","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","expr","initialRefs","initialPayload","forEach","push","docCount","refsCount","tone","text","updatePayloadStatuses","newPayload","payloadActual","name","payloadIds","_id","destinationClient","destinationData","fetch","updatedPayload","existingDoc","_updatedAt","Date","handleCheckbox","handleReferences","docIds","payloadDocs","payloadShaped","handleDuplicate","assetsCount","filter","_type","currentProgress","transactionDocs","svgMaps","fetchDoc","uploadType","split","pop","replace","downloadUrl","url","downloadConfig","headers","Authorization","then","res","assetData","blob","options","filename","originalFilename","assetDoc","assets","upload","extension","old","new","result","Promise","resolve","reject","payloadIncludedDocs","err","console","error","Error","transactionDocsMapped","references","ref","newRefValue","asset","value","refPath","path","join","transaction","createOrReplace","commit","catch","details","description","handleChange","e","currentTarget","payloadCount","firstSvgIndex","findIndex","selectedDocumentsCount","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","Set","Boolean","size","headingText","buttonText","React","useMemo","stickyStyles","flex","width","transform","transformOrigin","transition","boxSizing","index","schema","get","SearchIcon","LaunchIcon"],"mappings":"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","sourcesContent":["/* eslint-disable react/jsx-no-bind */\nimport React, {useState, useEffect} from 'react'\nimport mapLimit from 'async/mapLimit'\nimport asyncify from 'async/asyncify'\nimport {extract, extractWithPath} from '@sanity/mutator'\nimport {dset} from 'dset'\nimport {Card, Container, Text, Box, Button, Label, Stack, Select, Flex, Checkbox} from '@sanity/ui'\nimport {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'\nimport sanityClient from 'part:@sanity/base/client'\nimport Preview from 'part:@sanity/base/preview'\nimport schema from 'part:@sanity/base/schema'\nimport config from 'config:sanity'\n\nimport {typeIsAsset, stickyStyles, createInitialMessage} from '../helpers'\nimport {getDocumentsInArray} from '../helpers/getDocumentsInArray'\nimport SelectButtons from './SelectButtons'\nimport StatusBadge from './StatusBadge'\nimport Feedback from './Feedback'\nimport {SanityDocument} from '../types'\nimport {clientConfig} from '../helpers/clientConfig'\n\ntype DuplicatorToolProps = {\n docs: SanityDocument[]\n token: string\n}\n\nexport default function DuplicatorTool(props: DuplicatorToolProps) {\n const {docs, token} = props\n\n // Prepare origin (this Studio) client\n // In function-scope so it is up to date on every render\n const originClient = sanityClient.withConfig(clientConfig)\n\n // Create list of dataset options\n // and set initial value of dropdown\n const spacesOptions = config?.__experimental_spaces?.length\n ? config.__experimental_spaces.map((space) => ({\n ...space,\n disabled: space.api.dataset === originClient.config().dataset && space.api.projectId === originClient.config().projectId,\n }))\n : []\n\n const [destination, setDestination] = useState(\n spacesOptions.length ? spacesOptions.find((space) => !space.disabled) : {}\n )\n const [message, setMessage] = useState({})\n const [payload, setPayload] = useState(\n docs.length\n ? docs.map((item) => ({\n doc: item,\n include: true,\n status: null,\n }))\n : []\n )\n const [hasReferences, setHasReferences] = useState(false)\n const [isDuplicating, setIsDuplicating] = useState(false)\n const [isGathering, setIsGathering] = useState(false)\n const [progress, setProgress] = useState([0, 0])\n\n // Check for References and update message\n useEffect(() => {\n const expr = `.._ref`\n const initialRefs = []\n const initialPayload = []\n\n docs.forEach((doc) => {\n initialRefs.push(...extract(expr, doc))\n initialPayload.push({include: true, doc})\n })\n\n setPayload(initialPayload)\n\n const docCount = docs.length\n const refsCount = initialRefs.length\n\n if (initialRefs.length) {\n setHasReferences(true)\n\n setMessage({\n tone: `caution`,\n text: createInitialMessage(docCount, refsCount),\n })\n }\n }, [docs])\n\n // Re-check payload on destination when value changes\n // (On initial render + select change)\n useEffect(() => {\n updatePayloadStatuses()\n }, [destination, docs])\n\n // Check if payload documents exist at destination\n async function updatePayloadStatuses(newPayload = []) {\n const payloadActual = newPayload.length ? newPayload : payload\n\n if (!payloadActual.length || !destination?.name) {\n return\n }\n\n const payloadIds = payloadActual.map(({doc}) => doc._id)\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n const destinationData = await destinationClient.fetch(\n `*[_id in $payloadIds]{ _id, _updatedAt }`,\n {payloadIds}\n )\n\n const updatedPayload = payloadActual.map((item) => {\n const existingDoc = destinationData.find((doc) => doc._id === item.doc._id)\n\n if (existingDoc?._updatedAt && item?.doc?._updatedAt) {\n if (existingDoc._updatedAt === item.doc._updatedAt) {\n // Exact same document exists at destination\n // We don't compare by _rev because that is updated in a transaction\n item.status = `EXISTS`\n } else if (existingDoc._updatedAt && item.doc._updatedAt) {\n item.status =\n new Date(existingDoc._updatedAt) > new Date(item.doc._updatedAt)\n ? // Document at destination is newer\n `OVERWRITE`\n : // Document at destination is older\n `UPDATE`\n }\n } else {\n item.status = 'CREATE'\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n function handleCheckbox(_id) {\n const updatedPayload = payload.map((item) => {\n if (item.doc._id === _id) {\n item.include = !item.include\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n // Find and recursively follow references beginning with this document\n async function handleReferences() {\n setIsGathering(true)\n const docIds = docs.map((doc) => doc._id)\n\n const payloadDocs = await getDocumentsInArray(docIds, originClient, null)\n\n // Shape it up\n const payloadShaped = payloadDocs.map((doc) => ({\n doc,\n // Include this in the transaction?\n include: true,\n // Does it exist at the destination?\n status: '',\n }))\n\n setPayload(payloadShaped)\n updatePayloadStatuses(payloadShaped)\n setIsGathering(false)\n }\n\n // Duplicate payload to destination dataset\n async function handleDuplicate() {\n setIsDuplicating(true)\n\n const assetsCount = payload.filter(({doc, include}) => include && typeIsAsset(doc._type)).length\n let currentProgress = 0\n setProgress([currentProgress, assetsCount])\n\n setMessage({text: 'Duplicating...'})\n\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n\n const transactionDocs = []\n const svgMaps = []\n\n // Upload assets and then add to transaction\n async function fetchDoc(doc) {\n if (typeIsAsset(doc._type)) {\n // Download and upload asset\n // Get the *original* image with this dlRaw param to create the same determenistic _id\n const uploadType = doc._type.split('.').pop().replace('Asset', '')\n const downloadUrl = uploadType === 'image' ? `${doc.url}?dlRaw=true` : doc.url\n const downloadConfig =\n uploadType === 'image' ? {headers: {Authorization: token ? `Bearer ${token}` : ``}} : {}\n\n await fetch(downloadUrl, downloadConfig).then(async (res) => {\n const assetData = await res.blob()\n\n const options = {filename: doc.originalFilename}\n const assetDoc = await destinationClient.assets.upload(uploadType, assetData, options)\n\n // SVG _id's need remapping before transaction\n if (doc?.extension === 'svg') {\n svgMaps.push({old: doc._id, new: assetDoc._id})\n }\n\n transactionDocs.push(assetDoc)\n })\n\n currentProgress += 1\n setMessage({\n text: `Duplicating ${currentProgress}/${assetsCount} ${\n assetsCount === 1 ? `Assets` : `Assets`\n }`,\n })\n\n return setProgress([currentProgress, assetsCount])\n }\n\n return transactionDocs.push(doc)\n }\n\n // Promises are limited to three at once\n const result = new Promise((resolve, reject) => {\n const payloadIncludedDocs = payload.filter((item) => item.include).map((item) => item.doc)\n\n mapLimit(payloadIncludedDocs, 3, asyncify(fetchDoc), (err) => {\n if (err) {\n setIsDuplicating(false)\n setMessage({tone: 'critical', text: `Duplication Failed`})\n console.error(err)\n reject(new Error('Duplication Failed'))\n }\n\n resolve()\n })\n })\n\n await result\n\n // Remap SVG references to new _id's\n const transactionDocsMapped = transactionDocs.map((doc) => {\n const expr = `.._ref`\n const references = extractWithPath(expr, doc)\n\n if (!references.length) {\n return doc\n }\n\n // For every found _ref, search for an SVG asset _id and update\n references.forEach((ref) => {\n const newRefValue = svgMaps.find((asset) => asset.old === ref.value)?.new\n\n if (newRefValue) {\n const refPath = ref.path.join('.')\n\n dset(doc, refPath, newRefValue)\n }\n })\n\n return doc\n })\n\n // Create transaction\n const transaction = destinationClient.transaction()\n\n transactionDocsMapped.forEach((doc) => {\n transaction.createOrReplace(doc)\n })\n\n await transaction\n .commit()\n .then((res) => {\n setMessage({tone: 'positive', text: 'Duplication complete!'})\n\n updatePayloadStatuses()\n })\n .catch((err) => {\n setMessage({tone: 'critical', text: err.details.description})\n })\n\n setIsDuplicating(false)\n setProgress(0)\n }\n\n function handleChange(e) {\n setDestination(spacesOptions.find((space) => space.name === e.currentTarget.value))\n }\n\n if (!spacesOptions.length) {\n return (\n <Feedback tone=\"critical\">\n <code>__experimental_spaces</code> not found in <code>sanity.json</code>\n </Feedback>\n )\n }\n\n const payloadCount = payload.length\n const firstSvgIndex = payload.findIndex(({doc}) => doc.extension === 'svg')\n const selectedDocumentsCount = payload.filter(\n (item) => item.include && !typeIsAsset(item.doc._type)\n ).length\n const selectedAssetsCount = payload.filter(\n (item) => item.include && typeIsAsset(item.doc._type)\n ).length\n const selectedTotal = selectedDocumentsCount + selectedAssetsCount\n const destinationTitle = destination?.title ?? destination?.name\n const hasMultipleProjectIds =\n new Set(spacesOptions.map((space) => space?.api?.projectId).filter(Boolean)).size > 1\n\n const headingText = [selectedTotal, `/`, payloadCount, `Documents and Assets selected`].join(` `)\n\n const buttonText = React.useMemo(() => {\n let text = [`Duplicate`]\n\n if (selectedDocumentsCount > 1) {\n text.push(selectedDocumentsCount, selectedDocumentsCount === 1 ? `Document` : `Documents`)\n }\n\n if (selectedAssetsCount > 1) {\n text.push(`and`, selectedAssetsCount, selectedAssetsCount === 1 ? `Asset` : `Assets`)\n }\n\n if (originClient.config().projectId !== destination.api.projectId) {\n text.push(`between Projects`)\n }\n\n text.push(`to`, destinationTitle)\n\n return text.join(` `)\n }, [selectedDocumentsCount, selectedAssetsCount, destinationTitle])\n\n return (\n <Container width={1}>\n <Card>\n <Stack>\n <>\n <Card borderBottom padding={4} style={stickyStyles}>\n <Stack space={4}>\n <Flex space={3}>\n <Stack style={{flex: 1}} space={3}>\n <Label>Duplicate from</Label>\n <Select readOnly value={spacesOptions.find((space) => space.disabled)?.name}>\n {spacesOptions\n .filter((space) => space.disabled)\n .map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.api.projectId})` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n <Box padding={4} paddingTop={5} paddingBottom={0}>\n <Text size={3}>\n <ArrowRightIcon />\n </Text>\n </Box>\n <Stack style={{flex: 1}} space={3}>\n <Label>To Destination</Label>\n <Select onChange={handleChange}>\n {spacesOptions.map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.api.projectId})` : ``}\n {space.disabled ? ` (Current)` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n </Flex>\n\n {isDuplicating && (\n <Card border radius={2}>\n <Card\n style={{\n width: '100%',\n transform: `scaleX(${progress[0] / progress[1]})`,\n transformOrigin: 'left',\n transition: 'transform .2s ease',\n boxSizing: 'border-box',\n }}\n padding={1}\n tone=\"positive\"\n />\n </Card>\n )}\n {payload.length > 0 && (\n <>\n <Label>{headingText}</Label>\n <SelectButtons payload={payload} setPayload={setPayload} />\n </>\n )}\n </Stack>\n </Card>\n {message?.text && (\n <Box paddingX={4} paddingTop={4}>\n <Card padding={3} radius={2} shadow={1} tone={message?.tone ?? 'transparent'}>\n <Text size={1}>{message.text}</Text>\n </Card>\n </Box>\n )}\n {payload.length > 0 && (\n <Stack padding={4} space={3}>\n {payload.map(({doc, include, status}, index) => (\n <React.Fragment key={doc._id}>\n <Flex align=\"center\">\n <Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />\n <Box style={{flex: 1}} paddingX={3}>\n <Preview value={doc} type={schema.get(doc._type)} />\n </Box>\n <StatusBadge status={status} isAsset={typeIsAsset(doc._type)} />\n </Flex>\n {doc?.extension === 'svg' && index === firstSvgIndex && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Text size={1}>\n Due to how SVGs are sanitized after first uploaded, duplicated SVG assets may have new{' '}\n <code>_id</code>'s at the destination. The newly generated <code>_id</code>{' '}\n will be the same in each duplication, but it will never be the same{' '}\n <code>_id</code> as the first time this Asset was uploaded. References to the asset will be updated to use the new <code>_id</code>.\n </Text>\n </Card>\n )}\n </React.Fragment>\n ))}\n </Stack>\n )}\n <Stack space={2} padding={4} paddingTop={0}>\n {hasReferences && (\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n mode=\"ghost\"\n icon={SearchIcon}\n onClick={handleReferences}\n text=\"Gather References\"\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n )}\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n icon={LaunchIcon}\n onClick={handleDuplicate}\n text={buttonText}\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n </Stack>\n </>\n </Stack>\n </Card>\n </Container>\n )\n}\n"],"file":"DuplicatorTool.js"}
|
|
1
|
+
{"version":3,"file":"DuplicatorTool.js","names":["DuplicatorTool","props","docs","draftIds","token","originClient","sanityClient","withConfig","clientConfig","spacesOptions","config","__experimental_spaces","length","map","space","disabled","api","dataset","projectId","find","destination","setDestination","message","setMessage","item","doc","include","status","hasDraft","includes","_id","payload","setPayload","hasReferences","setHasReferences","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","expr","initialRefs","initialPayload","forEach","push","docCount","refsCount","tone","text","updatePayloadStatuses","newPayload","payloadActual","name","payloadIds","destinationClient","destinationData","fetch","updatedPayload","existingDoc","_updatedAt","Date","handleCheckbox","handleReferences","docIds","payloadDocs","draftDocs","id","draftDocsIds","Set","payloadShaped","has","handleDuplicate","assetsCount","filter","_type","currentProgress","transactionDocs","svgMaps","fetchDoc","uploadType","split","pop","replace","downloadUrl","url","downloadConfig","headers","Authorization","then","res","assetData","blob","options","filename","originalFilename","assetDoc","assets","upload","extension","old","new","result","Promise","resolve","reject","payloadIncludedDocs","err","console","error","Error","transactionDocsMapped","references","ref","newRefValue","asset","value","refPath","path","join","transaction","createOrReplace","commit","catch","details","description","handleChange","e","currentTarget","payloadCount","firstSvgIndex","findIndex","selectedDocumentsCount","selectedAssetsCount","selectedTotal","destinationTitle","title","hasMultipleProjectIds","Boolean","size","headingText","buttonText","React","useMemo","stickyStyles","flex","width","transform","transformOrigin","transition","boxSizing","index","schema","get","SearchIcon","LaunchIcon"],"sources":["../../src/components/DuplicatorTool.tsx"],"sourcesContent":["/* eslint-disable react/jsx-no-bind */\nimport React, {useState, useEffect} from 'react'\nimport mapLimit from 'async/mapLimit'\nimport asyncify from 'async/asyncify'\nimport {extract, extractWithPath} from '@sanity/mutator'\nimport {dset} from 'dset'\nimport {\n Card,\n Container,\n Text,\n Box,\n Button,\n Label,\n Stack,\n Select,\n Flex,\n Checkbox,\n Badge,\n} from '@sanity/ui'\nimport {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'\nimport sanityClient from 'part:@sanity/base/client'\nimport Preview from 'part:@sanity/base/preview'\nimport schema from 'part:@sanity/base/schema'\nimport config from 'config:sanity'\n\nimport {typeIsAsset, stickyStyles, createInitialMessage} from '../helpers'\nimport {getDocumentsInArray} from '../helpers/getDocumentsInArray'\nimport SelectButtons from './SelectButtons'\nimport StatusBadge from './StatusBadge'\nimport Feedback from './Feedback'\nimport {SanityDocument} from '../types'\nimport {clientConfig} from '../helpers/clientConfig'\n\ntype DuplicatorToolProps = {\n docs: SanityDocument[]\n draftIds: string[]\n token: string\n}\n\nexport default function DuplicatorTool(props: DuplicatorToolProps) {\n const {docs, draftIds, token} = props\n\n // Prepare origin (this Studio) client\n // In function-scope so it is up to date on every render\n const originClient = sanityClient.withConfig(clientConfig)\n\n // Create list of dataset options\n // and set initial value of dropdown\n const spacesOptions = config?.__experimental_spaces?.length\n ? config.__experimental_spaces.map((space) => ({\n ...space,\n disabled:\n space.api.dataset === originClient.config().dataset &&\n space.api.projectId === originClient.config().projectId,\n }))\n : []\n\n const [destination, setDestination] = useState(\n spacesOptions.length ? spacesOptions.find((space) => !space.disabled) : {}\n )\n const [message, setMessage] = useState({})\n const [payload, setPayload] = useState(\n docs.length\n ? docs.map((item) => ({\n doc: item,\n include: true,\n status: null,\n hasDraft: draftIds.includes(`drafts.${item._id}`),\n }))\n : []\n )\n const [hasReferences, setHasReferences] = useState(false)\n const [isDuplicating, setIsDuplicating] = useState(false)\n const [isGathering, setIsGathering] = useState(false)\n const [progress, setProgress] = useState([0, 0])\n\n // Check for References and update message\n useEffect(() => {\n const expr = `.._ref`\n const initialRefs = []\n const initialPayload = []\n\n docs.forEach((doc) => {\n initialRefs.push(...extract(expr, doc))\n initialPayload.push({include: true, doc})\n })\n\n setPayload(initialPayload)\n\n const docCount = docs.length\n const refsCount = initialRefs.length\n\n if (initialRefs.length) {\n setHasReferences(true)\n\n setMessage({\n tone: `caution`,\n text: createInitialMessage(docCount, refsCount),\n })\n }\n }, [docs])\n\n // Re-check payload on destination when value changes\n // (On initial render + select change)\n useEffect(() => {\n updatePayloadStatuses()\n }, [destination, docs])\n\n // Check if payload documents exist at destination\n async function updatePayloadStatuses(newPayload = []) {\n const payloadActual = newPayload.length ? newPayload : payload\n\n if (!payloadActual.length || !destination?.name) {\n return\n }\n\n const payloadIds = payloadActual.map(({doc}) => doc._id)\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n const destinationData = await destinationClient.fetch(\n `*[_id in $payloadIds]{ _id, _updatedAt }`,\n {payloadIds}\n )\n\n const updatedPayload = payloadActual.map((item) => {\n const existingDoc = destinationData.find((doc) => doc._id === item.doc._id)\n\n if (existingDoc?._updatedAt && item?.doc?._updatedAt) {\n if (existingDoc._updatedAt === item.doc._updatedAt) {\n // Exact same document exists at destination\n // We don't compare by _rev because that is updated in a transaction\n item.status = `EXISTS`\n } else if (existingDoc._updatedAt && item.doc._updatedAt) {\n item.status =\n new Date(existingDoc._updatedAt) > new Date(item.doc._updatedAt)\n ? // Document at destination is newer\n `OVERWRITE`\n : // Document at destination is older\n `UPDATE`\n }\n } else {\n item.status = 'CREATE'\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n function handleCheckbox(_id) {\n const updatedPayload = payload.map((item) => {\n if (item.doc._id === _id) {\n item.include = !item.include\n }\n\n return item\n })\n\n setPayload(updatedPayload)\n }\n\n // Find and recursively follow references beginning with this document\n async function handleReferences() {\n setIsGathering(true)\n const docIds = docs.map((doc) => doc._id)\n\n const payloadDocs = await getDocumentsInArray(docIds, originClient, null)\n const draftDocs = await getDocumentsInArray(\n docIds.map((id) => `drafts.${id}`),\n originClient,\n null,\n `{_id}`\n )\n const draftDocsIds = new Set(draftDocs.map(({_id}) => _id))\n\n // Shape it up\n const payloadShaped = payloadDocs.map((doc) => ({\n doc,\n // Include this in the transaction?\n include: true,\n // Does it exist at the destination?\n status: '',\n // Does it have any drafts?\n hasDraft: draftDocsIds.has(`drafts.${doc._id}`),\n }))\n\n setPayload(payloadShaped)\n updatePayloadStatuses(payloadShaped)\n setIsGathering(false)\n }\n\n // Duplicate payload to destination dataset\n async function handleDuplicate() {\n setIsDuplicating(true)\n\n const assetsCount = payload.filter(({doc, include}) => include && typeIsAsset(doc._type)).length\n let currentProgress = 0\n setProgress([currentProgress, assetsCount])\n\n setMessage({text: 'Duplicating...'})\n\n const destinationClient = sanityClient.withConfig({\n ...clientConfig,\n dataset: destination.api.dataset,\n projectId: destination.api.projectId,\n })\n\n const transactionDocs = []\n const svgMaps = []\n\n // Upload assets and then add to transaction\n async function fetchDoc(doc) {\n if (typeIsAsset(doc._type)) {\n // Download and upload asset\n // Get the *original* image with this dlRaw param to create the same determenistic _id\n const uploadType = doc._type.split('.').pop().replace('Asset', '')\n const downloadUrl = uploadType === 'image' ? `${doc.url}?dlRaw=true` : doc.url\n const downloadConfig =\n uploadType === 'image' ? {headers: {Authorization: `Bearer ${token}`}} : {}\n\n await fetch(downloadUrl, downloadConfig).then(async (res) => {\n const assetData = await res.blob()\n\n const options = {filename: doc.originalFilename}\n const assetDoc = await destinationClient.assets.upload(uploadType, assetData, options)\n\n // SVG _id's need remapping before transaction\n if (doc?.extension === 'svg') {\n svgMaps.push({old: doc._id, new: assetDoc._id})\n }\n\n transactionDocs.push(assetDoc)\n })\n\n currentProgress += 1\n setMessage({\n text: `Duplicating ${currentProgress}/${assetsCount} ${\n assetsCount === 1 ? `Assets` : `Assets`\n }`,\n })\n\n return setProgress([currentProgress, assetsCount])\n }\n\n return transactionDocs.push(doc)\n }\n\n // Promises are limited to three at once\n const result = new Promise((resolve, reject) => {\n const payloadIncludedDocs = payload.filter((item) => item.include).map((item) => item.doc)\n\n mapLimit(payloadIncludedDocs, 3, asyncify(fetchDoc), (err) => {\n if (err) {\n setIsDuplicating(false)\n setMessage({tone: 'critical', text: `Duplication Failed`})\n console.error(err)\n reject(new Error('Duplication Failed'))\n }\n\n resolve()\n })\n })\n\n await result\n\n // Remap SVG references to new _id's\n const transactionDocsMapped = transactionDocs.map((doc) => {\n const expr = `.._ref`\n const references = extractWithPath(expr, doc)\n\n if (!references.length) {\n return doc\n }\n\n // For every found _ref, search for an SVG asset _id and update\n references.forEach((ref) => {\n const newRefValue = svgMaps.find((asset) => asset.old === ref.value)?.new\n\n if (newRefValue) {\n const refPath = ref.path.join('.')\n\n dset(doc, refPath, newRefValue)\n }\n })\n\n return doc\n })\n\n // Create transaction\n const transaction = destinationClient.transaction()\n\n transactionDocsMapped.forEach((doc) => {\n transaction.createOrReplace(doc)\n })\n\n await transaction\n .commit()\n .then((res) => {\n setMessage({tone: 'positive', text: 'Duplication complete!'})\n\n updatePayloadStatuses()\n })\n .catch((err) => {\n setMessage({tone: 'critical', text: err.details.description})\n })\n\n setIsDuplicating(false)\n setProgress(0)\n }\n\n function handleChange(e) {\n setDestination(spacesOptions.find((space) => space.name === e.currentTarget.value))\n }\n\n if (!spacesOptions.length) {\n return (\n <Feedback tone=\"critical\">\n <code>__experimental_spaces</code> not found in <code>sanity.json</code>\n </Feedback>\n )\n }\n\n const payloadCount = payload.length\n const firstSvgIndex = payload.findIndex(({doc}) => doc.extension === 'svg')\n const selectedDocumentsCount = payload.filter(\n (item) => item.include && !typeIsAsset(item.doc._type)\n ).length\n const selectedAssetsCount = payload.filter(\n (item) => item.include && typeIsAsset(item.doc._type)\n ).length\n const selectedTotal = selectedDocumentsCount + selectedAssetsCount\n const destinationTitle = destination?.title ?? destination?.name\n const hasMultipleProjectIds =\n new Set(spacesOptions.map((space) => space?.api?.projectId).filter(Boolean)).size > 1\n\n const headingText = [selectedTotal, `/`, payloadCount, `Documents and Assets selected`].join(` `)\n\n const buttonText = React.useMemo(() => {\n let text = [`Duplicate`]\n\n if (selectedDocumentsCount > 1) {\n text.push(selectedDocumentsCount, selectedDocumentsCount === 1 ? `Document` : `Documents`)\n }\n\n if (selectedAssetsCount > 1) {\n text.push(`and`, selectedAssetsCount, selectedAssetsCount === 1 ? `Asset` : `Assets`)\n }\n\n if (originClient.config().projectId !== destination.api.projectId) {\n text.push(`between Projects`)\n }\n\n text.push(`to`, destinationTitle)\n\n return text.join(` `)\n }, [selectedDocumentsCount, selectedAssetsCount, destinationTitle])\n\n return (\n <Container width={1}>\n <Card>\n <Stack>\n <>\n <Card borderBottom padding={4} style={stickyStyles}>\n <Stack space={4}>\n <Flex space={3}>\n <Stack style={{flex: 1}} space={3}>\n <Label>Duplicate from</Label>\n <Select readOnly value={spacesOptions.find((space) => space.disabled)?.name}>\n {spacesOptions\n .filter((space) => space.disabled)\n .map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.api.projectId})` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n <Box padding={4} paddingTop={5} paddingBottom={0}>\n <Text size={3}>\n <ArrowRightIcon />\n </Text>\n </Box>\n <Stack style={{flex: 1}} space={3}>\n <Label>To Destination</Label>\n <Select onChange={handleChange}>\n {spacesOptions.map((space) => (\n <option key={space.name} value={space.name} disabled={space.disabled}>\n {space.title ?? space.name}\n {hasMultipleProjectIds ? ` (${space.api.projectId})` : ``}\n {space.disabled ? ` (Current)` : ``}\n </option>\n ))}\n </Select>\n </Stack>\n </Flex>\n\n {isDuplicating && (\n <Card border radius={2}>\n <Card\n style={{\n width: '100%',\n transform: `scaleX(${progress[0] / progress[1]})`,\n transformOrigin: 'left',\n transition: 'transform .2s ease',\n boxSizing: 'border-box',\n }}\n padding={1}\n tone=\"positive\"\n />\n </Card>\n )}\n {payload.length > 0 && (\n <>\n <Label>{headingText}</Label>\n <SelectButtons payload={payload} setPayload={setPayload} />\n </>\n )}\n </Stack>\n </Card>\n {message?.text && (\n <Box paddingX={4} paddingTop={4}>\n <Card padding={3} radius={2} shadow={1} tone={message?.tone ?? 'transparent'}>\n <Text size={1}>{message.text}</Text>\n </Card>\n </Box>\n )}\n {payload.length > 0 && (\n <Stack padding={4} space={3}>\n {payload.map(({doc, include, status, hasDraft}, index) => (\n <React.Fragment key={doc._id}>\n <Flex align=\"center\">\n <Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />\n <Box flex={1} paddingX={3}>\n <Preview value={doc} type={schema.get(doc._type)} />\n </Box>\n <Flex items=\"center\" gap={2}>\n {hasDraft ? <StatusBadge status=\"UNPUBLISHED\" isAsset={false} /> : null}\n <StatusBadge status={status} isAsset={typeIsAsset(doc._type)} />\n </Flex>\n </Flex>\n {doc?.extension === 'svg' && index === firstSvgIndex && (\n <Card padding={3} radius={2} shadow={1} tone=\"caution\">\n <Text size={1}>\n Due to how SVGs are sanitized after first uploaded, duplicated SVG assets\n may have new <code>_id</code>'s at the destination. The newly generated{' '}\n <code>_id</code> will be the same in each duplication, but it will never\n be the same <code>_id</code> as the first time this Asset was uploaded.\n References to the asset will be updated to use the new <code>_id</code>.\n </Text>\n </Card>\n )}\n </React.Fragment>\n ))}\n </Stack>\n )}\n <Stack space={2} padding={4} paddingTop={0}>\n {hasReferences && (\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n mode=\"ghost\"\n icon={SearchIcon}\n onClick={handleReferences}\n text=\"Gather References\"\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n )}\n <Button\n fontSize={2}\n padding={4}\n tone=\"positive\"\n icon={LaunchIcon}\n onClick={handleDuplicate}\n text={buttonText}\n disabled={isDuplicating || !selectedTotal || isGathering}\n />\n </Stack>\n </>\n </Stack>\n </Card>\n </Container>\n )\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"Feedback.js","names":["Feedback","props","children","tone"],"sources":["../../src/components/Feedback.tsx"],"sourcesContent":["import React from 'react'\nimport {Card, Text} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\n\ntype FeedbackProps = {\n children?: React.ReactNode\n tone?: BadgeTone\n}\n\nexport default function Feedback(props: FeedbackProps) {\n const {children, tone = `caution`} = props\n\n return (\n <Card padding={3} radius={2} shadow={1} tone={tone}>\n <Text size={1}>{children}</Text>\n </Card>\n )\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;;;AAQe,SAASA,QAAT,CAAkBC,KAAlB,EAAwC;EACrD,IAAOC,QAAP,GAAqCD,KAArC,CAAOC,QAAP;EAAA,kBAAqCD,KAArC,CAAiBE,IAAjB;EAAA,IAAiBA,IAAjB;EAEA,oBACE,6BAAC,QAAD;IAAM,OAAO,EAAE,CAAf;IAAkB,MAAM,EAAE,CAA1B;IAA6B,MAAM,EAAE,CAArC;IAAwC,IAAI,EAAEA;EAA9C,gBACE,6BAAC,QAAD;IAAM,IAAI,EAAE;EAAZ,GAAgBD,QAAhB,CADF,CADF;AAKD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"ResetSecret.js","names":["client","sanityClient","withConfig","clientConfig","handleClick","delete","query","SECRET_NAMESPACE","ResetSecret"],"sources":["../../src/components/ResetSecret.tsx"],"sourcesContent":["import React from 'react'\nimport {Button, Flex} from '@sanity/ui'\nimport sanityClient from 'part:@sanity/base/client'\n\nimport { clientConfig } from '../helpers/clientConfig'\nimport { SECRET_NAMESPACE } from '../helpers/constants'\n\nconst client = sanityClient.withConfig(clientConfig)\n\nfunction handleClick() {\n client.delete({query: `*[_id == \"secrets.${SECRET_NAMESPACE}\"]`})\n}\n\nexport default function ResetSecret() {\n return (\n <Flex align=\"center\" justify=\"flex-end\" paddingX={[2, 2, 2, 5]} paddingY={5}>\n <Button\n text=\"Reset Secret\"\n onClick={() => handleClick()}\n mode=\"ghost\"\n tone=\"critical\"\n fontSize={1}\n padding={2}\n />\n </Flex>\n )\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;;;AAEA,IAAMA,MAAM,GAAGC,gBAAaC,UAAb,CAAwBC,0BAAxB,CAAf;;AAEA,SAASC,WAAT,GAAuB;EACrBJ,MAAM,CAACK,MAAP,CAAc;IAACC,KAAK,+BAAuBC,2BAAvB;EAAN,CAAd;AACD;;AAEc,SAASC,WAAT,GAAuB;EACpC,oBACE,6BAAC,QAAD;IAAM,KAAK,EAAC,QAAZ;IAAqB,OAAO,EAAC,UAA7B;IAAwC,QAAQ,EAAE,CAAC,CAAD,EAAI,CAAJ,EAAO,CAAP,EAAU,CAAV,CAAlD;IAAgE,QAAQ,EAAE;EAA1E,gBACE,6BAAC,UAAD;IACE,IAAI,EAAC,cADP;IAEE,OAAO,EAAE,MAAMJ,WAAW,EAF5B;IAGE,IAAI,EAAC,OAHP;IAIE,IAAI,EAAC,UAJP;IAKE,QAAQ,EAAE,CALZ;IAME,OAAO,EAAE;EANX,EADF,CADF;AAYD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"SelectButtons.js","names":["buttons","SelectButtons","props","payload","setPayload","disabledActions","setDisabledActions","length","every","item","include","handleSelectButton","action","newPayload","map","Boolean","status","doc","_type","actionIndex","includes","toUpperCase"],"sources":["../../src/components/SelectButtons.tsx"],"sourcesContent":["import React, {useState, useEffect} from 'react'\nimport {Button, Card, Flex} from '@sanity/ui'\nimport {typeIsAsset} from '../helpers'\nimport {PayloadItem} from '../types'\n\nconst buttons = [`All`, `None`, null, `New`, `Existing`, `Older`, null, `Documents`, `Assets`]\n\ntype SelectButtonsProps = {\n payload: PayloadItem[]\n setPayload: Function\n}\n\nexport default function SelectButtons(props: SelectButtonsProps) {\n const {payload, setPayload} = props\n const [disabledActions, setDisabledActions] = useState([])\n\n // Set intiial disabled button\n useEffect(() => {\n if (!disabledActions?.length && payload.every((item) => item.include)) {\n setDisabledActions([`ALL`])\n }\n }, [])\n\n function handleSelectButton(action = ``) {\n if (!action || !payload.length) return\n\n const newPayload = [...payload]\n\n switch (action) {\n case 'ALL':\n newPayload.map((item) => (item.include = true))\n break\n case 'NONE':\n newPayload.map((item) => (item.include = false))\n break\n case 'NEW':\n newPayload.map((item) => (item.include = Boolean(item.status === 'CREATE')))\n break\n case 'EXISTING':\n newPayload.map((item) => (item.include = Boolean(item.status === 'EXISTS')))\n break\n case 'OLDER':\n newPayload.map((item) => (item.include = Boolean(item.status === 'OVERWRITE')))\n break\n case 'ASSETS':\n newPayload.map((item) => (item.include = typeIsAsset(item.doc._type)))\n break\n case 'DOCUMENTS':\n newPayload.map((item) => (item.include = !typeIsAsset(item.doc._type)))\n break\n default:\n break\n }\n\n setDisabledActions([action])\n setPayload(newPayload)\n }\n\n return (\n <Card padding={1} radius={3} shadow={1}>\n <Flex gap={2}>\n {buttons.map((action, actionIndex) =>\n action ? (\n <Button\n key={action}\n fontSize={1}\n mode=\"bleed\"\n padding={2}\n text={action}\n disabled={disabledActions.includes(action.toUpperCase())}\n onClick={() => handleSelectButton(action.toUpperCase())}\n />\n ) : (\n <Card key={`divider-${actionIndex}`} borderLeft />\n )\n )}\n </Flex>\n </Card>\n )\n}\n"],"mappings":"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"}
|
|
@@ -15,13 +15,15 @@ var documentTones = {
|
|
|
15
15
|
EXISTS: "primary",
|
|
16
16
|
OVERWRITE: "critical",
|
|
17
17
|
UPDATE: "caution",
|
|
18
|
-
CREATE: "positive"
|
|
18
|
+
CREATE: "positive",
|
|
19
|
+
UNPUBLISHED: "caution"
|
|
19
20
|
};
|
|
20
21
|
var assetTones = {
|
|
21
22
|
EXISTS: "critical",
|
|
22
23
|
OVERWRITE: "critical",
|
|
23
24
|
UPDATE: "critical",
|
|
24
|
-
CREATE: "positive"
|
|
25
|
+
CREATE: "positive",
|
|
26
|
+
UNPUBLISHED: "default"
|
|
25
27
|
};
|
|
26
28
|
var documentMessages = {
|
|
27
29
|
// Only happens once document is copied the first time, and _updatedAt is the same
|
|
@@ -33,19 +35,22 @@ var documentMessages = {
|
|
|
33
35
|
// Document at destination is older
|
|
34
36
|
UPDATE: "An older version of this document exists at the Destination, and it will be overwritten with this version.",
|
|
35
37
|
// Document at destination doesn't exist
|
|
36
|
-
CREATE: "This document will be created at the destination."
|
|
38
|
+
CREATE: "This document will be created at the destination.",
|
|
39
|
+
UNPUBLISHED: "A Draft version of this Document exists in this Dataset, but only the Published version will be duplicated to the destination."
|
|
37
40
|
};
|
|
38
41
|
var assetMessages = {
|
|
39
42
|
EXISTS: "This Asset already exists at the Destination",
|
|
40
43
|
OVERWRITE: "This Asset already exists at the Destination",
|
|
41
44
|
UPDATE: "This Asset already exists at the Destination",
|
|
42
|
-
CREATE: "This Asset does not yet exist at the Destination"
|
|
45
|
+
CREATE: "This Asset does not yet exist at the Destination",
|
|
46
|
+
UNPUBLISHED: ""
|
|
43
47
|
};
|
|
44
48
|
var assetStatus = {
|
|
45
49
|
EXISTS: "RE-UPLOAD",
|
|
46
50
|
OVERWRITE: "RE-UPLOAD",
|
|
47
51
|
UPDATE: "RE-UPLOAD",
|
|
48
|
-
CREATE: "UPLOAD"
|
|
52
|
+
CREATE: "UPLOAD",
|
|
53
|
+
UNPUBLISHED: ""
|
|
49
54
|
};
|
|
50
55
|
|
|
51
56
|
function StatusBadge(props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","names":["documentTones","EXISTS","OVERWRITE","UPDATE","CREATE","UNPUBLISHED","assetTones","documentMessages","assetMessages","assetStatus","StatusBadge","props","status","isAsset","badgeTone","badgeText","badgeStatus","maxWidth"],"sources":["../../src/components/StatusBadge.tsx"],"sourcesContent":["import React from 'react'\nimport {Box, Text, Badge, Tooltip} from '@sanity/ui'\nimport type {BadgeTone} from '@sanity/ui'\n\ntype StatusTones = {\n EXISTS: BadgeTone\n OVERWRITE: BadgeTone\n UPDATE: BadgeTone\n CREATE: BadgeTone\n UNPUBLISHED: BadgeTone\n}\n\nconst documentTones: StatusTones = {\n EXISTS: `primary`,\n OVERWRITE: `critical`,\n UPDATE: `caution`,\n CREATE: `positive`,\n UNPUBLISHED: `caution`,\n}\n\nconst assetTones: StatusTones = {\n EXISTS: `critical`,\n OVERWRITE: `critical`,\n UPDATE: `critical`,\n CREATE: `positive`,\n UNPUBLISHED: `default`\n}\n\ntype messageTypes = {\n EXISTS: string\n OVERWRITE: string\n UPDATE: string\n CREATE: string\n UNPUBLISHED: string\n}\n\nconst documentMessages: messageTypes = {\n // Only happens once document is copied the first time, and _updatedAt is the same\n EXISTS: `This document already exists at the Destination with the same ID with the same Updated time.`,\n // Is true immediately after transaction as _updatedAt is updated by API after mutation\n // Is also true if the document at the destination has been manually modified\n // Presently, the plugin doesn't actually compare the two documents\n OVERWRITE: `A newer version of this document exists at the Destination, and it will be overwritten with this version.`,\n // Document at destination is older\n UPDATE: `An older version of this document exists at the Destination, and it will be overwritten with this version.`,\n // Document at destination doesn't exist\n CREATE: `This document will be created at the destination.`,\n UNPUBLISHED: `A Draft version of this Document exists in this Dataset, but only the Published version will be duplicated to the destination.`\n}\n\nconst assetMessages: messageTypes = {\n EXISTS: `This Asset already exists at the Destination`,\n OVERWRITE: `This Asset already exists at the Destination`,\n UPDATE: `This Asset already exists at the Destination`,\n CREATE: `This Asset does not yet exist at the Destination`,\n UNPUBLISHED: ``,\n}\n\nconst assetStatus: messageTypes = {\n EXISTS: `RE-UPLOAD`,\n OVERWRITE: `RE-UPLOAD`,\n UPDATE: `RE-UPLOAD`,\n CREATE: `UPLOAD`,\n UNPUBLISHED: ``,\n}\n\ntype StatusBadgeProps = {\n status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE' | 'UNPUBLISHED' | undefined\n isAsset: boolean\n}\n\nexport default function StatusBadge(props: StatusBadgeProps) {\n const {status, isAsset} = props\n\n const badgeTone = isAsset ? assetTones[status] : documentTones[status]\n \n if (!badgeTone) {\n return (\n <Badge muted padding={2} fontSize={1} mode=\"outline\">\n Checking...\n </Badge>\n )\n }\n \n const badgeText = isAsset ? assetMessages[status] : documentMessages[status]\n const badgeStatus = isAsset ? assetStatus[status] : status\n\n return (\n <Tooltip\n content={\n <Box padding={3} style={{maxWidth: 200}}>\n <Text size={1}>{badgeText}</Text>\n </Box>\n }\n fallbackPlacements={['right', 'left']}\n placement=\"top\"\n portal\n >\n <Badge muted padding={2} fontSize={1} tone={badgeTone} mode=\"outline\">\n {badgeStatus}\n </Badge>\n </Tooltip>\n )\n}\n"],"mappings":";;;;;;;AAAA;;AACA;;;;AAWA,IAAMA,aAA0B,GAAG;EACjCC,MAAM,WAD2B;EAEjCC,SAAS,YAFwB;EAGjCC,MAAM,WAH2B;EAIjCC,MAAM,YAJ2B;EAKjCC,WAAW;AALsB,CAAnC;AAQA,IAAMC,UAAuB,GAAG;EAC9BL,MAAM,YADwB;EAE9BC,SAAS,YAFqB;EAG9BC,MAAM,YAHwB;EAI9BC,MAAM,YAJwB;EAK9BC,WAAW;AALmB,CAAhC;AAgBA,IAAME,gBAA8B,GAAG;EACrC;EACAN,MAAM,gGAF+B;EAGrC;EACA;EACA;EACAC,SAAS,6GAN4B;EAOrC;EACAC,MAAM,8GAR+B;EASrC;EACAC,MAAM,qDAV+B;EAWrCC,WAAW;AAX0B,CAAvC;AAcA,IAAMG,aAA2B,GAAG;EAClCP,MAAM,gDAD4B;EAElCC,SAAS,gDAFyB;EAGlCC,MAAM,gDAH4B;EAIlCC,MAAM,oDAJ4B;EAKlCC,WAAW;AALuB,CAApC;AAQA,IAAMI,WAAyB,GAAG;EAChCR,MAAM,aAD0B;EAEhCC,SAAS,aAFuB;EAGhCC,MAAM,aAH0B;EAIhCC,MAAM,UAJ0B;EAKhCC,WAAW;AALqB,CAAlC;;AAae,SAASK,WAAT,CAAqBC,KAArB,EAA8C;EAC3D,IAAOC,MAAP,GAA0BD,KAA1B,CAAOC,MAAP;EAAA,IAAeC,OAAf,GAA0BF,KAA1B,CAAeE,OAAf;EAEA,IAAMC,SAAS,GAAGD,OAAO,GAAGP,UAAU,CAACM,MAAD,CAAb,GAAwBZ,aAAa,CAACY,MAAD,CAA9D;;EAEA,IAAI,CAACE,SAAL,EAAgB;IACd,oBACE,6BAAC,SAAD;MAAO,KAAK,MAAZ;MAAa,OAAO,EAAE,CAAtB;MAAyB,QAAQ,EAAE,CAAnC;MAAsC,IAAI,EAAC;IAA3C,iBADF;EAKD;;EAED,IAAMC,SAAS,GAAGF,OAAO,GAAGL,aAAa,CAACI,MAAD,CAAhB,GAA2BL,gBAAgB,CAACK,MAAD,CAApE;EACA,IAAMI,WAAW,GAAGH,OAAO,GAAGJ,WAAW,CAACG,MAAD,CAAd,GAAyBA,MAApD;EAEA,oBACE,6BAAC,WAAD;IACE,OAAO,eACL,6BAAC,OAAD;MAAK,OAAO,EAAE,CAAd;MAAiB,KAAK,EAAE;QAACK,QAAQ,EAAE;MAAX;IAAxB,gBACE,6BAAC,QAAD;MAAM,IAAI,EAAE;IAAZ,GAAgBF,SAAhB,CADF,CAFJ;IAME,kBAAkB,EAAE,CAAC,OAAD,EAAU,MAAV,CANtB;IAOE,SAAS,EAAC,KAPZ;IAQE,MAAM;EARR,gBAUE,6BAAC,SAAD;IAAO,KAAK,MAAZ;IAAa,OAAO,EAAE,CAAtB;IAAyB,QAAQ,EAAE,CAAnC;IAAsC,IAAI,EAAED,SAA5C;IAAuD,IAAI,EAAC;EAA5D,GACGE,WADH,CAVF,CADF;AAgBD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"clientConfig.js","names":["clientConfig","apiVersion"],"sources":["../../src/helpers/clientConfig.ts"],"sourcesContent":["export const clientConfig = {apiVersion: `2021-05-19`}"],"mappings":";;;;;;AAAO,IAAMA,YAAY,GAAG;EAACC,UAAU;AAAX,CAArB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"constants.js","names":["SECRET_NAMESPACE"],"sources":["../../src/helpers/constants.ts"],"sourcesContent":["export const SECRET_NAMESPACE = `CrossDatasetDuplicator`"],"mappings":";;;;;;AAAO,IAAMA,gBAAgB,2BAAtB"}
|
|
@@ -13,15 +13,16 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
|
|
|
13
13
|
|
|
14
14
|
// Recursively fetch Documents from an array of _id's and their references
|
|
15
15
|
// Heavy use of Set is to avoid recursively querying for id's already in the payload
|
|
16
|
-
function getDocumentsInArray(_x, _x2, _x3) {
|
|
16
|
+
function getDocumentsInArray(_x, _x2, _x3, _x4) {
|
|
17
17
|
return _getDocumentsInArray.apply(this, arguments);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
function _getDocumentsInArray() {
|
|
21
|
-
_getDocumentsInArray = _asyncToGenerator(function* (fetchIds, client, currentIds) {
|
|
21
|
+
_getDocumentsInArray = _asyncToGenerator(function* (fetchIds, client, currentIds, projection) {
|
|
22
22
|
var collection = []; // Find initial docs
|
|
23
23
|
|
|
24
|
-
var
|
|
24
|
+
var query = "*[_id in $fetchIds]".concat(projection !== null && projection !== void 0 ? projection : "");
|
|
25
|
+
var data = yield client.fetch(query, {
|
|
25
26
|
fetchIds: fetchIds !== null && fetchIds !== void 0 ? fetchIds : []
|
|
26
27
|
});
|
|
27
28
|
|
|
@@ -58,7 +59,7 @@ function _getDocumentsInArray() {
|
|
|
58
59
|
}
|
|
59
60
|
});
|
|
60
61
|
|
|
61
|
-
return function (
|
|
62
|
+
return function (_x5) {
|
|
62
63
|
return _ref.apply(this, arguments);
|
|
63
64
|
};
|
|
64
65
|
}()));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"getDocumentsInArray.js","names":["getDocumentsInArray","fetchIds","client","currentIds","projection","collection","query","data","fetch","length","localCurrentIds","Set","newDataIds","map","dataDoc","_id","filter","id","size","has","Boolean","push","add","Promise","all","doc","expr","references","newReferenceIds","refId","referenceDocs","Array","from","uniqueCollection","reduce","acc","cur","some"],"sources":["../../src/helpers/getDocumentsInArray.ts"],"sourcesContent":["import {extract} from '@sanity/mutator'\nimport {SanityDocument} from '../types'\n\n// Recursively fetch Documents from an array of _id's and their references\n// Heavy use of Set is to avoid recursively querying for id's already in the payload\nexport async function getDocumentsInArray(\n fetchIds: string[],\n client: any,\n currentIds?: Set<string>,\n projection?: string,\n) {\n const collection = []\n\n // Find initial docs\n const query = `*[_id in $fetchIds]${projection ?? ``}`\n const data: SanityDocument[] = await client.fetch(query, {\n fetchIds: fetchIds ?? [],\n })\n\n if (!data?.length) {\n return []\n }\n\n const localCurrentIds = currentIds ?? new Set()\n \n // Find new ids in the returned data\n // Unless we started with an empty set, get the _ids from the data\n const newDataIds: Set<string> = new Set(\n data\n .map((dataDoc) => dataDoc._id)\n .filter((id) => (currentIds?.size ? !localCurrentIds.has(id) : Boolean(id)))\n )\n\n if (newDataIds.size) {\n collection.push(...data)\n localCurrentIds.add(...newDataIds)\n\n // Check new data for more references\n await Promise.all(\n data.map(async (doc) => {\n const expr = `.._ref`\n const references = extract(expr, doc)\n\n if (references.length) {\n // Find references not already in the Collection\n const newReferenceIds = new Set(references.filter((refId) => !localCurrentIds.has(refId)))\n\n if (newReferenceIds.size) {\n // Recusive query for new documents\n const referenceDocs = await getDocumentsInArray(\n Array.from(newReferenceIds),\n client,\n localCurrentIds\n )\n\n if (referenceDocs?.length) {\n collection.push(...referenceDocs)\n }\n }\n }\n })\n )\n }\n\n // Create a unique array of objects from collection\n // Set() wasn't working for unique id's ¯\\_(ツ)_/¯\n const uniqueCollection = collection.filter(Boolean).reduce((acc, cur) => {\n if (acc.some((doc) => doc._id === cur._id)) {\n return acc\n }\n\n return [...acc, cur]\n }, []) \n\n return uniqueCollection\n}\n"],"mappings":";;;;;;;AAAA;;;;;;AAGA;AACA;SACsBA,mB;;;;;2CAAf,WACLC,QADK,EAELC,MAFK,EAGLC,UAHK,EAILC,UAJK,EAKL;IACA,IAAMC,UAAU,GAAG,EAAnB,CADA,CAGA;;IACA,IAAMC,KAAK,gCAAyBF,UAAzB,aAAyBA,UAAzB,cAAyBA,UAAzB,MAAX;IACA,IAAMG,IAAsB,SAASL,MAAM,CAACM,KAAP,CAAaF,KAAb,EAAoB;MACvDL,QAAQ,EAAEA,QAAF,aAAEA,QAAF,cAAEA,QAAF,GAAc;IADiC,CAApB,CAArC;;IAIA,IAAI,EAACM,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEE,MAAP,CAAJ,EAAmB;MACjB,OAAO,EAAP;IACD;;IAED,IAAMC,eAAe,GAAGP,UAAH,aAAGA,UAAH,cAAGA,UAAH,GAAiB,IAAIQ,GAAJ,EAAtC,CAbA,CAeA;IACA;;IACA,IAAMC,UAAuB,GAAG,IAAID,GAAJ,CAC9BJ,IAAI,CACDM,GADH,CACQC,OAAD,IAAaA,OAAO,CAACC,GAD5B,EAEGC,MAFH,CAEWC,EAAD,IAASd,UAAU,SAAV,IAAAA,UAAU,WAAV,IAAAA,UAAU,CAAEe,IAAZ,GAAmB,CAACR,eAAe,CAACS,GAAhB,CAAoBF,EAApB,CAApB,GAA8CG,OAAO,CAACH,EAAD,CAFxE,CAD8B,CAAhC;;IAMA,IAAIL,UAAU,CAACM,IAAf,EAAqB;MACnBb,UAAU,CAACgB,IAAX,CAAgB,GAAGd,IAAnB;MACAG,eAAe,CAACY,GAAhB,CAAoB,GAAGV,UAAvB,EAFmB,CAInB;;MACA,MAAMW,OAAO,CAACC,GAAR,CACJjB,IAAI,CAACM,GAAL;QAAA,6BAAS,WAAOY,GAAP,EAAe;UACtB,IAAMC,IAAI,WAAV;UACA,IAAMC,UAAU,GAAG,sBAAQD,IAAR,EAAcD,GAAd,CAAnB;;UAEA,IAAIE,UAAU,CAAClB,MAAf,EAAuB;YACrB;YACA,IAAMmB,eAAe,GAAG,IAAIjB,GAAJ,CAAQgB,UAAU,CAACX,MAAX,CAAmBa,KAAD,IAAW,CAACnB,eAAe,CAACS,GAAhB,CAAoBU,KAApB,CAA9B,CAAR,CAAxB;;YAEA,IAAID,eAAe,CAACV,IAApB,EAA0B;cACxB;cACA,IAAMY,aAAa,SAAS9B,mBAAmB,CAC7C+B,KAAK,CAACC,IAAN,CAAWJ,eAAX,CAD6C,EAE7C1B,MAF6C,EAG7CQ,eAH6C,CAA/C;;cAMA,IAAIoB,aAAJ,aAAIA,aAAJ,eAAIA,aAAa,CAAErB,MAAnB,EAA2B;gBACzBJ,UAAU,CAACgB,IAAX,CAAgB,GAAGS,aAAnB;cACD;YACF;UACF;QACF,CArBD;;QAAA;UAAA;QAAA;MAAA,IADI,CAAN;IAwBD,CApDD,CAsDA;IACA;;;IACA,IAAMG,gBAAgB,GAAG5B,UAAU,CAACW,MAAX,CAAkBI,OAAlB,EAA2Bc,MAA3B,CAAkC,CAACC,GAAD,EAAMC,GAAN,KAAc;MACvE,IAAID,GAAG,CAACE,IAAJ,CAAUZ,GAAD,IAASA,GAAG,CAACV,GAAJ,KAAYqB,GAAG,CAACrB,GAAlC,CAAJ,EAA4C;QAC1C,OAAOoB,GAAP;MACD;;MAED,OAAO,CAAC,GAAGA,GAAJ,EAASC,GAAT,CAAP;IACD,CANwB,EAMtB,EANsB,CAAzB;IAQA,OAAOH,gBAAP;EACD,C"}
|
package/lib/helpers/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":["typeIsAsset","type","includes","createInitialMessage","docCount","refsCount","message","join","stickyStyles","position","top","zIndex","backgroundColor"],"sources":["../../src/helpers/index.ts"],"sourcesContent":["export function typeIsAsset(type = ``) {\n if (!type) return false\n\n return ['sanity.imageAsset', 'sanity.fileAsset'].includes(type)\n}\n\nexport function createInitialMessage(docCount = 0, refsCount = 0) {\n const message = [\n docCount === 1 ? `This Document contains` : `These ${docCount} Documents contain`,\n refsCount === 1 ? `1 Reference.` : `${refsCount} References.`,\n refsCount === 1 ? `That Document` : `Those Documents`,\n `may have References too. If referenced Documents do not exist at the target Destination, this transaction will fail.`\n ]\n\n return message.join(` `)\n}\n\nexport const stickyStyles = {\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: `rgba(255,255,255,0.95)`,\n}"],"mappings":";;;;;;;;;AAAO,SAASA,WAAT,GAAgC;EAAA,IAAXC,IAAW;EACrC,IAAI,CAACA,IAAL,EAAW,OAAO,KAAP;EAEX,OAAO,CAAC,mBAAD,EAAsB,kBAAtB,EAA0CC,QAA1C,CAAmDD,IAAnD,CAAP;AACD;;AAEM,SAASE,oBAAT,GAA2D;EAAA,IAA7BC,QAA6B,uEAAlB,CAAkB;EAAA,IAAfC,SAAe,uEAAH,CAAG;EAChE,IAAMC,OAAO,GAAG,CACdF,QAAQ,KAAK,CAAb,8CAAqDA,QAArD,uBADc,EAEdC,SAAS,KAAK,CAAd,8BAAsCA,SAAtC,iBAFc,EAGdA,SAAS,KAAK,CAAd,sCAHc,yHAAhB;EAOA,OAAOC,OAAO,CAACC,IAAR,KAAP;AACD;;AAEM,IAAMC,YAAY,GAAG;EAC1BC,QAAQ,EAAE,QADgB;EAE1BC,GAAG,EAAE,CAFqB;EAG1BC,MAAM,EAAE,GAHkB;EAI1BC,eAAe;AAJW,CAArB"}
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/index.js"],"sourcesContent":["import DuplicateToAction from \"./actions/DuplicateToAction\";\nimport CrossDatasetDuplicator from \"./components/CrossDatasetDuplicator\";\n\nexport {\n DuplicateToAction,\n CrossDatasetDuplicator\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;;AACA"}
|
package/lib/tool/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":["config","tool","title","name","icon","LaunchIcon","component","CrossDatasetDuplicator"],"sources":["../../src/tool/index.ts"],"sourcesContent":["import {LaunchIcon} from '@sanity/icons'\nimport config from 'config:@sanity/cross-dataset-duplicator'\n\nimport CrossDatasetDuplicator from '../components/CrossDatasetDuplicator'\n\nexport default config?.tool\n ? {\n title: 'Duplicator',\n name: 'duplicator',\n icon: LaunchIcon,\n component: CrossDatasetDuplicator,\n }\n : null\n"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;eAEeA,0HAAQC,IAAR,GACX;EACEC,KAAK,EAAE,YADT;EAEEC,IAAI,EAAE,YAFR;EAGEC,IAAI,EAAEC,iBAHR;EAIEC,SAAS,EAAEC;AAJb,CADW,GAOX,I"}
|
package/lib/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/types/index.ts"],"sourcesContent":["export type SanityDocument = {\n _id: string\n _type: string\n}\n\nexport type PayloadItem = {\n include: boolean\n status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE'\n doc: SanityDocument\n}\n"],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanity/cross-dataset-duplicator",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "Empower content editors to migrate Documents and Assets between Sanity Projects and Datasets from inside Sanity Studio",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -14,7 +14,7 @@ const secretConfigKeys = [
|
|
|
14
14
|
{
|
|
15
15
|
key: 'bearerToken',
|
|
16
16
|
title:
|
|
17
|
-
'An
|
|
17
|
+
'An API token with Viewer permissions is required to duplicate the original files of assets, and will be used for all Duplications. Create one at sanity.io/manage',
|
|
18
18
|
description: '',
|
|
19
19
|
},
|
|
20
20
|
]
|
|
@@ -4,7 +4,7 @@ import schema from 'part:@sanity/base/schema'
|
|
|
4
4
|
import {Button, Stack, Box, Label, Text, Card, Flex, Grid, Container, TextInput} from '@sanity/ui'
|
|
5
5
|
|
|
6
6
|
import DuplicatorTool from './DuplicatorTool'
|
|
7
|
-
import {
|
|
7
|
+
import {clientConfig} from '../helpers/clientConfig'
|
|
8
8
|
|
|
9
9
|
const originClient = sanityClient.withConfig(clientConfig)
|
|
10
10
|
|
|
@@ -12,11 +12,13 @@ type DuplicatorQueryProps = {
|
|
|
12
12
|
token: string
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
const schemaTypes = schema.getTypeNames()
|
|
16
|
+
|
|
15
17
|
export default function DuplicatorQuery(props: DuplicatorQueryProps) {
|
|
16
18
|
const {token} = props
|
|
17
19
|
|
|
18
20
|
const [value, setValue] = useState(``)
|
|
19
|
-
const [
|
|
21
|
+
const [initialData, setInitialData] = useState({docs: [], draftIds: []});
|
|
20
22
|
|
|
21
23
|
function handleSubmit(e?: any) {
|
|
22
24
|
if (e) e.preventDefault()
|
|
@@ -25,16 +27,21 @@ export default function DuplicatorQuery(props: DuplicatorQueryProps) {
|
|
|
25
27
|
.fetch(value)
|
|
26
28
|
.then((res) => {
|
|
27
29
|
// Ensure queried docs are registered to the schema
|
|
28
|
-
const
|
|
30
|
+
const registeredAndPublishedDocs = res.length
|
|
31
|
+
? res
|
|
32
|
+
.filter((doc) => schemaTypes.includes(doc._type))
|
|
33
|
+
.filter((doc) => !doc._id.startsWith(`drafts.`))
|
|
34
|
+
: []
|
|
35
|
+
const initialDraftIds = res.length ? res.filter(doc => doc._id.startsWith(`drafts.`)).map(doc => doc._id) : []
|
|
29
36
|
|
|
30
|
-
|
|
37
|
+
setInitialData({docs: registeredAndPublishedDocs, draftIds: initialDraftIds})
|
|
31
38
|
})
|
|
32
39
|
.catch((err) => console.error(err))
|
|
33
40
|
}
|
|
34
41
|
|
|
35
42
|
// Auto-load initial textinput value
|
|
36
43
|
useEffect(() => {
|
|
37
|
-
if (!docs?.length && value) {
|
|
44
|
+
if (!initialData.docs?.length && value) {
|
|
38
45
|
handleSubmit()
|
|
39
46
|
}
|
|
40
47
|
}, [])
|
|
@@ -50,7 +57,8 @@ export default function DuplicatorQuery(props: DuplicatorQueryProps) {
|
|
|
50
57
|
</Box>
|
|
51
58
|
<Box>
|
|
52
59
|
<Text>
|
|
53
|
-
Start with a valid GROQ query to load initial documents. The query will need to
|
|
60
|
+
Start with a valid GROQ query to load initial documents. The query will need to
|
|
61
|
+
return an Array of Objects. Drafts will be removed from the results.
|
|
54
62
|
</Text>
|
|
55
63
|
</Box>
|
|
56
64
|
<form onSubmit={handleSubmit}>
|
|
@@ -79,14 +87,17 @@ export default function DuplicatorQuery(props: DuplicatorQueryProps) {
|
|
|
79
87
|
</Stack>
|
|
80
88
|
</Card>
|
|
81
89
|
</Box>
|
|
82
|
-
{!docs?.length ||
|
|
83
|
-
<
|
|
84
|
-
<
|
|
85
|
-
{
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
{!initialData.docs?.length ||
|
|
91
|
+
(initialData.docs.length < 1 && (
|
|
92
|
+
<Container width={1}>
|
|
93
|
+
<Card padding={5}>
|
|
94
|
+
{value
|
|
95
|
+
? `No Documents registered to the Schema match this query`
|
|
96
|
+
: `Start with a valid GROQ query`}
|
|
97
|
+
</Card>
|
|
98
|
+
</Container>
|
|
99
|
+
))}
|
|
100
|
+
{initialData.docs?.length > 0 && <DuplicatorTool docs={initialData.docs} draftIds={initialData.draftIds} token={token} />}
|
|
90
101
|
</Grid>
|
|
91
102
|
</Container>
|
|
92
103
|
)
|
|
@@ -4,7 +4,19 @@ import mapLimit from 'async/mapLimit'
|
|
|
4
4
|
import asyncify from 'async/asyncify'
|
|
5
5
|
import {extract, extractWithPath} from '@sanity/mutator'
|
|
6
6
|
import {dset} from 'dset'
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
Card,
|
|
9
|
+
Container,
|
|
10
|
+
Text,
|
|
11
|
+
Box,
|
|
12
|
+
Button,
|
|
13
|
+
Label,
|
|
14
|
+
Stack,
|
|
15
|
+
Select,
|
|
16
|
+
Flex,
|
|
17
|
+
Checkbox,
|
|
18
|
+
Badge,
|
|
19
|
+
} from '@sanity/ui'
|
|
8
20
|
import {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'
|
|
9
21
|
import sanityClient from 'part:@sanity/base/client'
|
|
10
22
|
import Preview from 'part:@sanity/base/preview'
|
|
@@ -21,11 +33,12 @@ import {clientConfig} from '../helpers/clientConfig'
|
|
|
21
33
|
|
|
22
34
|
type DuplicatorToolProps = {
|
|
23
35
|
docs: SanityDocument[]
|
|
36
|
+
draftIds: string[]
|
|
24
37
|
token: string
|
|
25
38
|
}
|
|
26
39
|
|
|
27
40
|
export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
28
|
-
const {docs, token} = props
|
|
41
|
+
const {docs, draftIds, token} = props
|
|
29
42
|
|
|
30
43
|
// Prepare origin (this Studio) client
|
|
31
44
|
// In function-scope so it is up to date on every render
|
|
@@ -36,7 +49,9 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
36
49
|
const spacesOptions = config?.__experimental_spaces?.length
|
|
37
50
|
? config.__experimental_spaces.map((space) => ({
|
|
38
51
|
...space,
|
|
39
|
-
disabled:
|
|
52
|
+
disabled:
|
|
53
|
+
space.api.dataset === originClient.config().dataset &&
|
|
54
|
+
space.api.projectId === originClient.config().projectId,
|
|
40
55
|
}))
|
|
41
56
|
: []
|
|
42
57
|
|
|
@@ -50,6 +65,7 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
50
65
|
doc: item,
|
|
51
66
|
include: true,
|
|
52
67
|
status: null,
|
|
68
|
+
hasDraft: draftIds.includes(`drafts.${item._id}`),
|
|
53
69
|
}))
|
|
54
70
|
: []
|
|
55
71
|
)
|
|
@@ -153,6 +169,13 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
153
169
|
const docIds = docs.map((doc) => doc._id)
|
|
154
170
|
|
|
155
171
|
const payloadDocs = await getDocumentsInArray(docIds, originClient, null)
|
|
172
|
+
const draftDocs = await getDocumentsInArray(
|
|
173
|
+
docIds.map((id) => `drafts.${id}`),
|
|
174
|
+
originClient,
|
|
175
|
+
null,
|
|
176
|
+
`{_id}`
|
|
177
|
+
)
|
|
178
|
+
const draftDocsIds = new Set(draftDocs.map(({_id}) => _id))
|
|
156
179
|
|
|
157
180
|
// Shape it up
|
|
158
181
|
const payloadShaped = payloadDocs.map((doc) => ({
|
|
@@ -161,6 +184,8 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
161
184
|
include: true,
|
|
162
185
|
// Does it exist at the destination?
|
|
163
186
|
status: '',
|
|
187
|
+
// Does it have any drafts?
|
|
188
|
+
hasDraft: draftDocsIds.has(`drafts.${doc._id}`),
|
|
164
189
|
}))
|
|
165
190
|
|
|
166
191
|
setPayload(payloadShaped)
|
|
@@ -195,7 +220,7 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
195
220
|
const uploadType = doc._type.split('.').pop().replace('Asset', '')
|
|
196
221
|
const downloadUrl = uploadType === 'image' ? `${doc.url}?dlRaw=true` : doc.url
|
|
197
222
|
const downloadConfig =
|
|
198
|
-
uploadType === 'image' ? {headers: {Authorization:
|
|
223
|
+
uploadType === 'image' ? {headers: {Authorization: `Bearer ${token}`}} : {}
|
|
199
224
|
|
|
200
225
|
await fetch(downloadUrl, downloadConfig).then(async (res) => {
|
|
201
226
|
const assetData = await res.blob()
|
|
@@ -406,22 +431,26 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
|
|
|
406
431
|
)}
|
|
407
432
|
{payload.length > 0 && (
|
|
408
433
|
<Stack padding={4} space={3}>
|
|
409
|
-
{payload.map(({doc, include, status}, index) => (
|
|
434
|
+
{payload.map(({doc, include, status, hasDraft}, index) => (
|
|
410
435
|
<React.Fragment key={doc._id}>
|
|
411
436
|
<Flex align="center">
|
|
412
437
|
<Checkbox checked={include} onChange={() => handleCheckbox(doc._id)} />
|
|
413
|
-
<Box
|
|
438
|
+
<Box flex={1} paddingX={3}>
|
|
414
439
|
<Preview value={doc} type={schema.get(doc._type)} />
|
|
415
440
|
</Box>
|
|
416
|
-
<
|
|
441
|
+
<Flex items="center" gap={2}>
|
|
442
|
+
{hasDraft ? <StatusBadge status="UNPUBLISHED" isAsset={false} /> : null}
|
|
443
|
+
<StatusBadge status={status} isAsset={typeIsAsset(doc._type)} />
|
|
444
|
+
</Flex>
|
|
417
445
|
</Flex>
|
|
418
446
|
{doc?.extension === 'svg' && index === firstSvgIndex && (
|
|
419
447
|
<Card padding={3} radius={2} shadow={1} tone="caution">
|
|
420
448
|
<Text size={1}>
|
|
421
|
-
Due to how SVGs are sanitized after first uploaded, duplicated SVG assets
|
|
422
|
-
<code>_id</code>'s at the destination. The newly generated
|
|
423
|
-
will be the same in each duplication, but it will never
|
|
424
|
-
<code>_id</code> as the first time this Asset was uploaded.
|
|
449
|
+
Due to how SVGs are sanitized after first uploaded, duplicated SVG assets
|
|
450
|
+
may have new <code>_id</code>'s at the destination. The newly generated{' '}
|
|
451
|
+
<code>_id</code> will be the same in each duplication, but it will never
|
|
452
|
+
be the same <code>_id</code> as the first time this Asset was uploaded.
|
|
453
|
+
References to the asset will be updated to use the new <code>_id</code>.
|
|
425
454
|
</Text>
|
|
426
455
|
</Card>
|
|
427
456
|
)}
|
|
@@ -7,6 +7,7 @@ type StatusTones = {
|
|
|
7
7
|
OVERWRITE: BadgeTone
|
|
8
8
|
UPDATE: BadgeTone
|
|
9
9
|
CREATE: BadgeTone
|
|
10
|
+
UNPUBLISHED: BadgeTone
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
const documentTones: StatusTones = {
|
|
@@ -14,6 +15,7 @@ const documentTones: StatusTones = {
|
|
|
14
15
|
OVERWRITE: `critical`,
|
|
15
16
|
UPDATE: `caution`,
|
|
16
17
|
CREATE: `positive`,
|
|
18
|
+
UNPUBLISHED: `caution`,
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
const assetTones: StatusTones = {
|
|
@@ -21,6 +23,7 @@ const assetTones: StatusTones = {
|
|
|
21
23
|
OVERWRITE: `critical`,
|
|
22
24
|
UPDATE: `critical`,
|
|
23
25
|
CREATE: `positive`,
|
|
26
|
+
UNPUBLISHED: `default`
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
type messageTypes = {
|
|
@@ -28,6 +31,7 @@ type messageTypes = {
|
|
|
28
31
|
OVERWRITE: string
|
|
29
32
|
UPDATE: string
|
|
30
33
|
CREATE: string
|
|
34
|
+
UNPUBLISHED: string
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
const documentMessages: messageTypes = {
|
|
@@ -41,6 +45,7 @@ const documentMessages: messageTypes = {
|
|
|
41
45
|
UPDATE: `An older version of this document exists at the Destination, and it will be overwritten with this version.`,
|
|
42
46
|
// Document at destination doesn't exist
|
|
43
47
|
CREATE: `This document will be created at the destination.`,
|
|
48
|
+
UNPUBLISHED: `A Draft version of this Document exists in this Dataset, but only the Published version will be duplicated to the destination.`
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
const assetMessages: messageTypes = {
|
|
@@ -48,6 +53,7 @@ const assetMessages: messageTypes = {
|
|
|
48
53
|
OVERWRITE: `This Asset already exists at the Destination`,
|
|
49
54
|
UPDATE: `This Asset already exists at the Destination`,
|
|
50
55
|
CREATE: `This Asset does not yet exist at the Destination`,
|
|
56
|
+
UNPUBLISHED: ``,
|
|
51
57
|
}
|
|
52
58
|
|
|
53
59
|
const assetStatus: messageTypes = {
|
|
@@ -55,10 +61,11 @@ const assetStatus: messageTypes = {
|
|
|
55
61
|
OVERWRITE: `RE-UPLOAD`,
|
|
56
62
|
UPDATE: `RE-UPLOAD`,
|
|
57
63
|
CREATE: `UPLOAD`,
|
|
64
|
+
UNPUBLISHED: ``,
|
|
58
65
|
}
|
|
59
66
|
|
|
60
67
|
type StatusBadgeProps = {
|
|
61
|
-
status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE' | undefined
|
|
68
|
+
status: 'EXISTS' | 'OVERWRITE' | 'UPDATE' | 'CREATE' | 'UNPUBLISHED' | undefined
|
|
62
69
|
isAsset: boolean
|
|
63
70
|
}
|
|
64
71
|
|
|
@@ -6,12 +6,14 @@ import {SanityDocument} from '../types'
|
|
|
6
6
|
export async function getDocumentsInArray(
|
|
7
7
|
fetchIds: string[],
|
|
8
8
|
client: any,
|
|
9
|
-
currentIds?: Set<string
|
|
9
|
+
currentIds?: Set<string>,
|
|
10
|
+
projection?: string,
|
|
10
11
|
) {
|
|
11
12
|
const collection = []
|
|
12
13
|
|
|
13
14
|
// Find initial docs
|
|
14
|
-
const
|
|
15
|
+
const query = `*[_id in $fetchIds]${projection ?? ``}`
|
|
16
|
+
const data: SanityDocument[] = await client.fetch(query, {
|
|
15
17
|
fetchIds: fetchIds ?? [],
|
|
16
18
|
})
|
|
17
19
|
|