@sanity/cross-dataset-duplicator 0.3.6 → 0.4.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
@@ -56,7 +56,8 @@ The plugin has some configuration options. These can be set by adding a config f
56
56
  {
57
57
  "tool": true,
58
58
  "types": ["article", "page"],
59
- "filter": "_type != 'product'"
59
+ "filter": "_type != 'product'",
60
+ "follow" []
60
61
  }
61
62
  ```
62
63
 
@@ -65,6 +66,7 @@ Options:
65
66
  - `tool` (boolean, default: true) – Set whether the Migration Tool is enabled.
66
67
  - `types` (Array[String], default: []) – Set which Schema Types the Migration Action should be enabled in.
67
68
  - `filter` (String, default: undefined) - Set a predicate for documents when gathering dependencies.
69
+ - `follow` (("inbound" | "outbound")[], default: []) – Add buttons to allow the user to begin with just the existing document or first fetch all inbound references.
68
70
 
69
71
  ### 3. Authentication Key
70
72
 
package/config.dist.json CHANGED
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "tool": true,
3
- "types": []
3
+ "types": [],
4
+ "follow": []
4
5
  }
@@ -8,7 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _sanitySecrets = require("sanity-secrets");
9
9
  var _ui = require("@sanity/ui");
10
10
  var _DuplicatorQuery = _interopRequireDefault(require("./DuplicatorQuery"));
11
- var _DuplicatorTool = _interopRequireDefault(require("./DuplicatorTool"));
11
+ var _DuplicatorTool = require("./DuplicatorTool");
12
12
  var _ResetSecret = _interopRequireDefault(require("./ResetSecret"));
13
13
  var _Feedback = _interopRequireDefault(require("./Feedback"));
14
14
  var _constants = require("../helpers/constants");
@@ -73,7 +73,7 @@ function CrossDatasetDuplicator(props) {
73
73
  if (!(docs !== null && docs !== void 0 && docs.length)) {
74
74
  return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_Feedback.default, null, "No docs passed into Duplicator Tool"));
75
75
  }
76
- return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_DuplicatorTool.default, {
76
+ return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_DuplicatorTool.DuplicatorToolWrapper, {
77
77
  docs: docs,
78
78
  token: secrets === null || secrets === void 0 ? void 0 : secrets.bearerToken
79
79
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"CrossDatasetDuplicator.js","names":["secretConfigKeys","key","title","description","CrossDatasetDuplicator","props","mode","docs","secretsData","useSecrets","SECRET_NAMESPACE","loading","secrets","useState","showSecretsPrompt","setShowSecretsPrompt","useEffect","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;AAAqD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAErD;AACA,IAAMA,gBAAgB,GAAG,CACvB;EACEC,GAAG,EAAE,aAAa;EAClBC,KAAK,EACH,mKAAmK;EACrKC,WAAW,EAAE;AACf,CAAC,CACF;AAWc,SAASC,sBAAsB,CAACC,KAAkC,EAAE;EACjF,kBAAmCA,KAAK,CAAjCC,IAAI;IAAJA,IAAI;IAAA,cAAwBD,KAAK,CAAlBE,IAAI;IAAJA,IAAI,4BAAG,EAAE;EAE/B,IAAMC,WAAW,GAAG,IAAAC,yBAAU,EAACC,2BAAgB,CAAC;EAChD,IAAOC,OAAO,GAAmDH,WAAW,CAArEG,OAAO;IAAEC,OAAO,GAA0CJ,WAAW,CAA5DI,OAAO;EACvB,gBAAkD,IAAAC,eAAQ,EAAC,KAAK,CAAC;IAAA;IAA1DC,iBAAiB;IAAEC,oBAAoB;EAE9C,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAIJ,OAAO,EAAE;MACXG,oBAAoB,CAAC,EAACH,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEK,WAAW,EAAC;IAC7C;EACF,CAAC,EAAE,CAACL,OAAO,CAAC,CAAC;EAEb,IAAI,CAACJ,WAAW,EAAE;IAChB,oBACE,6BAAC,iBAAQ,8FAEE;EAEf;EAEA,IAAIG,OAAO,EAAE;IACX,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,QAAI;MAAC,OAAO,EAAC,QAAQ;MAAC,KAAK,EAAC;IAAQ,gBACnC,6BAAC,OAAG;MAAC,OAAO,EAAE;IAAE,gBACd,6BAAC,WAAO,OAAG,CACP,CACD,CACO;EAEpB;EAEA,IAAK,CAACA,OAAO,IAAIG,iBAAiB,IAAK,EAACF,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEK,WAAW,GAAE;IAC5D,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,2BAAY;MACX,KAAK,EAAC,gBAAgB;MACtB,SAAS,EAAEP,2BAAiB;MAC5B,IAAI,EAAEV;MACN;MAAA;MACA,OAAO,EAAE,MAAMe,oBAAoB,CAAC,KAAK;IAAE,EAC3C,CACY;EAEpB;EAEA,IAAIT,IAAI,KAAK,MAAM,EAAE;IACnB,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,wBAAe;MAAC,KAAK,EAAEM,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEK;IAAY,EAAG,eAChD,6BAAC,oBAAW,OAAG,CACD;EAEpB;EAEA,IAAI,EAACV,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEW,MAAM,GAAE;IACjB,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,iBAAQ,8CAA+C,CAC1C;EAEpB;EAEA,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,uBAAc;IAAC,IAAI,EAAEX,IAAK;IAAC,KAAK,EAAEK,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEK;EAAY,EAAG,CAC7C;AAEpB"}
1
+ {"version":3,"file":"CrossDatasetDuplicator.js","names":["secretConfigKeys","key","title","description","CrossDatasetDuplicator","props","mode","docs","secretsData","useSecrets","SECRET_NAMESPACE","loading","secrets","useState","showSecretsPrompt","setShowSecretsPrompt","useEffect","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 {DuplicatorToolWrapper} 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 <DuplicatorToolWrapper docs={docs} token={secrets?.bearerToken} />\n </ThemeProvider>\n )\n}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAAqD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAErD;AACA,IAAMA,gBAAgB,GAAG,CACvB;EACEC,GAAG,EAAE,aAAa;EAClBC,KAAK,EACH,mKAAmK;EACrKC,WAAW,EAAE;AACf,CAAC,CACF;AAWc,SAASC,sBAAsB,CAACC,KAAkC,EAAE;EACjF,kBAAmCA,KAAK,CAAjCC,IAAI;IAAJA,IAAI;IAAA,cAAwBD,KAAK,CAAlBE,IAAI;IAAJA,IAAI,4BAAG,EAAE;EAE/B,IAAMC,WAAW,GAAG,IAAAC,yBAAU,EAACC,2BAAgB,CAAC;EAChD,IAAOC,OAAO,GAAmDH,WAAW,CAArEG,OAAO;IAAEC,OAAO,GAA0CJ,WAAW,CAA5DI,OAAO;EACvB,gBAAkD,IAAAC,eAAQ,EAAC,KAAK,CAAC;IAAA;IAA1DC,iBAAiB;IAAEC,oBAAoB;EAE9C,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAIJ,OAAO,EAAE;MACXG,oBAAoB,CAAC,EAACH,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEK,WAAW,EAAC;IAC7C;EACF,CAAC,EAAE,CAACL,OAAO,CAAC,CAAC;EAEb,IAAI,CAACJ,WAAW,EAAE;IAChB,oBACE,6BAAC,iBAAQ,8FAEE;EAEf;EAEA,IAAIG,OAAO,EAAE;IACX,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,QAAI;MAAC,OAAO,EAAC,QAAQ;MAAC,KAAK,EAAC;IAAQ,gBACnC,6BAAC,OAAG;MAAC,OAAO,EAAE;IAAE,gBACd,6BAAC,WAAO,OAAG,CACP,CACD,CACO;EAEpB;EAEA,IAAK,CAACA,OAAO,IAAIG,iBAAiB,IAAK,EAACF,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEK,WAAW,GAAE;IAC5D,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,2BAAY;MACX,KAAK,EAAC,gBAAgB;MACtB,SAAS,EAAEP,2BAAiB;MAC5B,IAAI,EAAEV;MACN;MAAA;MACA,OAAO,EAAE,MAAMe,oBAAoB,CAAC,KAAK;IAAE,EAC3C,CACY;EAEpB;EAEA,IAAIT,IAAI,KAAK,MAAM,EAAE;IACnB,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,wBAAe;MAAC,KAAK,EAAEM,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEK;IAAY,EAAG,eAChD,6BAAC,oBAAW,OAAG,CACD;EAEpB;EAEA,IAAI,EAACV,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEW,MAAM,GAAE;IACjB,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,iBAAQ,8CAA+C,CAC1C;EAEpB;EAEA,oBACE,6BAAC,iBAAa,qBACZ,6BAAC,qCAAqB;IAAC,IAAI,EAAEX,IAAK;IAAC,KAAK,EAAEK,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEK;EAAY,EAAG,CACpD;AAEpB"}
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.DuplicatorToolWrapper = DuplicatorToolWrapper;
6
7
  exports.default = DuplicatorTool;
7
8
  var _react = _interopRequireWildcard(require("react"));
8
9
  var _mapLimit = _interopRequireDefault(require("async/mapLimit"));
@@ -15,6 +16,7 @@ var _client = _interopRequireDefault(require("part:@sanity/base/client"));
15
16
  var _preview = _interopRequireDefault(require("part:@sanity/base/preview"));
16
17
  var _schema = _interopRequireDefault(require("part:@sanity/base/schema"));
17
18
  var _configSanity = _interopRequireDefault(require("config:sanity"));
19
+ var _crossDatasetDuplicator = _interopRequireDefault(require("config:@sanity/cross-dataset-duplicator"));
18
20
  var _helpers = require("../helpers");
19
21
  var _getDocumentsInArray = require("../helpers/getDocumentsInArray");
20
22
  var _SelectButtons = _interopRequireDefault(require("./SelectButtons"));
@@ -24,6 +26,9 @@ var _clientConfig = require("../helpers/clientConfig");
24
26
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
27
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
26
28
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
30
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
31
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
27
32
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
28
33
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
29
34
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
@@ -32,9 +37,57 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
32
37
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
33
38
  function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
34
39
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
35
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
36
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
37
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
40
+ function DuplicatorToolWrapper(props) {
41
+ var docs = props.docs,
42
+ token = props.token;
43
+ var _useState = (0, _react.useState)('outbound'),
44
+ _useState2 = _slicedToArray(_useState, 2),
45
+ mode = _useState2[0],
46
+ setMode = _useState2[1];
47
+ var _useState3 = (0, _react.useState)([]),
48
+ _useState4 = _slicedToArray(_useState3, 2),
49
+ inbound = _useState4[0],
50
+ setInbound = _useState4[1];
51
+ var _duplicatorConfig$fol = _crossDatasetDuplicator.default.follow,
52
+ follow = _duplicatorConfig$fol === void 0 ? [] : _duplicatorConfig$fol;
53
+ (0, _react.useEffect)(() => {
54
+ ;
55
+ _asyncToGenerator(function* () {
56
+ var inboundReferences = yield _client.default.fetch('*[references($id)]', {
57
+ id: docs[0]._id
58
+ });
59
+ setInbound([...props.docs, ...inboundReferences]);
60
+ })();
61
+ }, []);
62
+ console.log(docs, inbound);
63
+ return /*#__PURE__*/_react.default.createElement(_ui.Container, null, follow.includes("inbound") || follow.includes("outbound") ? /*#__PURE__*/_react.default.createElement(_ui.Card, {
64
+ paddingX: 4,
65
+ paddingBottom: 4,
66
+ marginBottom: 4,
67
+ borderBottom: true
68
+ }, /*#__PURE__*/_react.default.createElement(_ui.Grid, {
69
+ columns: 2,
70
+ gap: 4
71
+ }, follow.includes("outbound") ? /*#__PURE__*/_react.default.createElement(_ui.Button, {
72
+ mode: "ghost",
73
+ tone: "primary",
74
+ selected: mode === 'outbound',
75
+ onClick: () => setMode('outbound'),
76
+ text: "Outbound"
77
+ }) : null, follow.includes("inbound") ? /*#__PURE__*/_react.default.createElement(_ui.Button, {
78
+ mode: "ghost",
79
+ tone: "primary",
80
+ selected: mode === 'inbound',
81
+ onClick: () => setMode('inbound'),
82
+ disabled: inbound.length === 0,
83
+ text: inbound.length > 0 ? "Inbound (".concat(inbound.length, ")") : 'No inbound references'
84
+ }) : null)) : null, /*#__PURE__*/_react.default.createElement(DuplicatorTool, {
85
+ key: mode,
86
+ docs: mode === 'outbound' ? docs : inbound,
87
+ token: token,
88
+ draftIds: []
89
+ }));
90
+ }
38
91
  function DuplicatorTool(props) {
39
92
  var _config$__experimenta, _destination$title, _spacesOptions$find, _message$tone;
40
93
  var docs = props.docs,
@@ -54,39 +107,39 @@ function DuplicatorTool(props) {
54
107
  usingEnvForProjectId: !space.api.projectId && process.env.SANITY_STUDIO_API_PROJECT_ID,
55
108
  disabled: space.api.dataset === originClient.config().dataset && space.api.projectId === originClient.config().projectId
56
109
  })) : [];
57
- var _useState = (0, _react.useState)(spacesOptions.length ? spacesOptions.find(space => !space.disabled) : {}),
58
- _useState2 = _slicedToArray(_useState, 2),
59
- destination = _useState2[0],
60
- setDestination = _useState2[1];
61
- var _useState3 = (0, _react.useState)({}),
62
- _useState4 = _slicedToArray(_useState3, 2),
63
- message = _useState4[0],
64
- setMessage = _useState4[1];
65
- var _useState5 = (0, _react.useState)(docs.length ? docs.map(item => ({
110
+ var _useState5 = (0, _react.useState)(spacesOptions.length ? spacesOptions.find(space => !space.disabled) : {}),
111
+ _useState6 = _slicedToArray(_useState5, 2),
112
+ destination = _useState6[0],
113
+ setDestination = _useState6[1];
114
+ var _useState7 = (0, _react.useState)({}),
115
+ _useState8 = _slicedToArray(_useState7, 2),
116
+ message = _useState8[0],
117
+ setMessage = _useState8[1];
118
+ var _useState9 = (0, _react.useState)(docs.length ? docs.map(item => ({
66
119
  doc: item,
67
120
  include: true,
68
121
  status: null,
69
122
  hasDraft: draftIds !== null && draftIds !== void 0 && draftIds.length ? draftIds.includes("drafts.".concat(item._id)) : false
70
123
  })) : []),
71
- _useState6 = _slicedToArray(_useState5, 2),
72
- payload = _useState6[0],
73
- setPayload = _useState6[1];
74
- var _useState7 = (0, _react.useState)(false),
75
- _useState8 = _slicedToArray(_useState7, 2),
76
- hasReferences = _useState8[0],
77
- setHasReferences = _useState8[1];
78
- var _useState9 = (0, _react.useState)(false),
79
124
  _useState10 = _slicedToArray(_useState9, 2),
80
- isDuplicating = _useState10[0],
81
- setIsDuplicating = _useState10[1];
125
+ payload = _useState10[0],
126
+ setPayload = _useState10[1];
82
127
  var _useState11 = (0, _react.useState)(false),
83
128
  _useState12 = _slicedToArray(_useState11, 2),
84
- isGathering = _useState12[0],
85
- setIsGathering = _useState12[1];
86
- var _useState13 = (0, _react.useState)([0, 0]),
129
+ hasReferences = _useState12[0],
130
+ setHasReferences = _useState12[1];
131
+ var _useState13 = (0, _react.useState)(false),
87
132
  _useState14 = _slicedToArray(_useState13, 2),
88
- progress = _useState14[0],
89
- setProgress = _useState14[1];
133
+ isDuplicating = _useState14[0],
134
+ setIsDuplicating = _useState14[1];
135
+ var _useState15 = (0, _react.useState)(false),
136
+ _useState16 = _slicedToArray(_useState15, 2),
137
+ isGathering = _useState16[0],
138
+ setIsGathering = _useState16[1];
139
+ var _useState17 = (0, _react.useState)([0, 0]),
140
+ _useState18 = _slicedToArray(_useState17, 2),
141
+ progress = _useState18[0],
142
+ setProgress = _useState18[1];
90
143
 
91
144
  // Check for References and update message
92
145
  (0, _react.useEffect)(() => {
@@ -129,8 +182,8 @@ function DuplicatorTool(props) {
129
182
  if (!payloadActual.length || !(destination !== null && destination !== void 0 && destination.name)) {
130
183
  return;
131
184
  }
132
- var payloadIds = payloadActual.map(_ref3 => {
133
- var doc = _ref3.doc;
185
+ var payloadIds = payloadActual.map(_ref4 => {
186
+ var doc = _ref4.doc;
134
187
  return doc._id;
135
188
  });
136
189
  var destinationClient = _client.default.withConfig(_objectSpread(_objectSpread({}, _clientConfig.clientConfig), {}, {
@@ -182,8 +235,8 @@ function DuplicatorTool(props) {
182
235
  var docIds = docs.map(doc => doc._id);
183
236
  var payloadDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds, originClient, null);
184
237
  var draftDocs = yield (0, _getDocumentsInArray.getDocumentsInArray)(docIds.map(id => "drafts.".concat(id)), originClient, null, "{_id}");
185
- var draftDocsIds = new Set(draftDocs.map(_ref4 => {
186
- var _id = _ref4._id;
238
+ var draftDocsIds = new Set(draftDocs.map(_ref5 => {
239
+ var _id = _ref5._id;
187
240
  return _id;
188
241
  }));
189
242
 
@@ -209,9 +262,9 @@ function DuplicatorTool(props) {
209
262
  function _handleDuplicate() {
210
263
  _handleDuplicate = _asyncToGenerator(function* () {
211
264
  setIsDuplicating(true);
212
- var assetsCount = payload.filter(_ref5 => {
213
- var doc = _ref5.doc,
214
- include = _ref5.include;
265
+ var assetsCount = payload.filter(_ref6 => {
266
+ var doc = _ref6.doc,
267
+ include = _ref6.include;
215
268
  return include && (0, _helpers.typeIsAsset)(doc._type);
216
269
  }).length;
217
270
  var currentProgress = 0;
@@ -243,7 +296,7 @@ function DuplicatorTool(props) {
243
296
  }
244
297
  } : {};
245
298
  yield fetch(downloadUrl, downloadConfig).then( /*#__PURE__*/function () {
246
- var _ref6 = _asyncToGenerator(function* (res) {
299
+ var _ref7 = _asyncToGenerator(function* (res) {
247
300
  var assetData = yield res.blob();
248
301
  var options = {
249
302
  filename: doc.originalFilename
@@ -260,7 +313,7 @@ function DuplicatorTool(props) {
260
313
  transactionDocs.push(assetDoc);
261
314
  });
262
315
  return function (_x2) {
263
- return _ref6.apply(this, arguments);
316
+ return _ref7.apply(this, arguments);
264
317
  };
265
318
  }());
266
319
  currentProgress += 1;
@@ -341,8 +394,8 @@ function DuplicatorTool(props) {
341
394
  }, /*#__PURE__*/_react.default.createElement("code", null, "__experimental_spaces"), " not found in ", /*#__PURE__*/_react.default.createElement("code", null, "sanity.json"));
342
395
  }
343
396
  var payloadCount = payload.length;
344
- var firstSvgIndex = payload.findIndex(_ref => {
345
- var doc = _ref.doc;
397
+ var firstSvgIndex = payload.findIndex(_ref2 => {
398
+ var doc = _ref2.doc;
346
399
  return doc.extension === 'svg';
347
400
  });
348
401
  var selectedDocumentsCount = payload.filter(item => item.include && !(0, _helpers.typeIsAsset)(item.doc._type)).length;
@@ -442,11 +495,11 @@ function DuplicatorTool(props) {
442
495
  }, message.text))), payload.length > 0 && /*#__PURE__*/_react.default.createElement(_ui.Stack, {
443
496
  padding: 4,
444
497
  space: 3
445
- }, payload.map((_ref2, index) => {
446
- var doc = _ref2.doc,
447
- include = _ref2.include,
448
- status = _ref2.status,
449
- hasDraft = _ref2.hasDraft;
498
+ }, payload.map((_ref3, index) => {
499
+ var doc = _ref3.doc,
500
+ include = _ref3.include,
501
+ status = _ref3.status,
502
+ hasDraft = _ref3.hasDraft;
450
503
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
451
504
  key: doc._id
452
505
  }, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
@@ -1 +1 @@
1
- {"version":3,"file":"DuplicatorTool.js","names":["DuplicatorTool","props","docs","draftIds","token","originClient","sanityClient","withConfig","clientConfig","spacesOptions","config","__experimental_spaces","length","map","space","api","projectId","process","env","SANITY_STUDIO_API_PROJECT_ID","usingEnvForProjectId","disabled","dataset","useState","find","destination","setDestination","message","setMessage","item","doc","include","status","hasDraft","includes","_id","payload","setPayload","hasReferences","setHasReferences","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","useEffect","expr","initialRefs","initialPayload","forEach","push","extract","docCount","refsCount","tone","text","createInitialMessage","updatePayloadStatuses","newPayload","payloadActual","name","payloadIds","destinationClient","destinationData","fetch","updatedPayload","existingDoc","_updatedAt","Date","handleCheckbox","handleReferences","docIds","payloadDocs","getDocumentsInArray","draftDocs","id","draftDocsIds","Set","payloadShaped","has","handleDuplicate","assetsCount","filter","typeIsAsset","_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","mapLimit","asyncify","err","console","error","Error","transactionDocsMapped","references","extractWithPath","ref","newRefValue","asset","value","refPath","path","join","dset","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} 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 api: {\n ...space.api,\n projectId: space.api.projectId || process.env.SANITY_STUDIO_API_PROJECT_ID,\n },\n usingEnvForProjectId: !space.api.projectId && process.env.SANITY_STUDIO_API_PROJECT_ID,\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?.length ? draftIds.includes(`drafts.${item._id}`) : false,\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 const 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.usingEnvForProjectId ? ` (${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.usingEnvForProjectId ? ` (${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
+ {"version":3,"file":"DuplicatorTool.js","names":["DuplicatorToolWrapper","props","docs","token","useState","mode","setMode","inbound","setInbound","duplicatorConfig","follow","useEffect","inboundReferences","sanityClient","fetch","id","_id","console","log","includes","length","DuplicatorTool","draftIds","originClient","withConfig","clientConfig","spacesOptions","config","__experimental_spaces","map","space","api","projectId","process","env","SANITY_STUDIO_API_PROJECT_ID","usingEnvForProjectId","disabled","dataset","find","destination","setDestination","message","setMessage","item","doc","include","status","hasDraft","payload","setPayload","hasReferences","setHasReferences","isDuplicating","setIsDuplicating","isGathering","setIsGathering","progress","setProgress","expr","initialRefs","initialPayload","forEach","push","extract","docCount","refsCount","tone","text","createInitialMessage","updatePayloadStatuses","newPayload","payloadActual","name","payloadIds","destinationClient","destinationData","updatedPayload","existingDoc","_updatedAt","Date","handleCheckbox","handleReferences","docIds","payloadDocs","getDocumentsInArray","draftDocs","draftDocsIds","Set","payloadShaped","has","handleDuplicate","assetsCount","filter","typeIsAsset","_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","mapLimit","asyncify","err","error","Error","transactionDocsMapped","references","extractWithPath","ref","newRefValue","asset","value","refPath","path","join","dset","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 Grid,\n Card,\n Container,\n Text,\n Box,\n Button,\n Label,\n Stack,\n Select,\n Flex,\n Checkbox,\n Tab,\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'\nimport duplicatorConfig from 'config:@sanity/cross-dataset-duplicator'\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 function DuplicatorToolWrapper(props: DuplicatorToolProps) {\n const {docs, token} = props\n const [mode, setMode] = useState('outbound')\n const [inbound, setInbound] = useState([])\n const {follow = []} = duplicatorConfig\n\n useEffect(() => {\n ;(async () => {\n const inboundReferences = await sanityClient.fetch('*[references($id)]', {id: docs[0]._id})\n setInbound([...props.docs, ...inboundReferences])\n })()\n }, [])\n\n console.log(docs, inbound)\n\n return (\n <Container>\n {follow.includes(`inbound`) || follow.includes(`outbound`) ? (\n <Card paddingX={4} paddingBottom={4} marginBottom={4} borderBottom>\n <Grid columns={2} gap={4}>\n {follow.includes(`outbound`) ? (\n <Button\n mode=\"ghost\"\n tone=\"primary\"\n selected={mode === 'outbound'}\n onClick={() => setMode('outbound')}\n text={`Outbound`}\n />\n ) : null}\n {follow.includes(`inbound`) ? (\n <Button\n mode=\"ghost\"\n tone=\"primary\"\n selected={mode === 'inbound'}\n onClick={() => setMode('inbound')}\n disabled={inbound.length === 0}\n text={inbound.length > 0 ? `Inbound (${inbound.length})` : 'No inbound references'}\n />\n ) : null}\n </Grid>\n </Card>\n ) : null}\n <DuplicatorTool\n key={mode}\n docs={mode === 'outbound' ? docs : inbound}\n token={token}\n draftIds={[]}\n />\n </Container>\n )\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 api: {\n ...space.api,\n projectId: space.api.projectId || process.env.SANITY_STUDIO_API_PROJECT_ID,\n },\n usingEnvForProjectId: !space.api.projectId && process.env.SANITY_STUDIO_API_PROJECT_ID,\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?.length ? draftIds.includes(`drafts.${item._id}`) : false,\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 const 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.usingEnvForProjectId\n ? ` (${space.api.projectId})`\n : ``}\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.usingEnvForProjectId\n ? ` (${space.api.projectId})`\n : ``}\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/cross-dataset-duplicator",
3
- "version": "0.3.6",
3
+ "version": "0.4.0",
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": {
@@ -3,7 +3,7 @@ import {useSecrets, SettingsView} from 'sanity-secrets'
3
3
  import {ThemeProvider, Flex, Box, Spinner} from '@sanity/ui'
4
4
 
5
5
  import DuplicatorQuery from './DuplicatorQuery'
6
- import DuplicatorTool from './DuplicatorTool'
6
+ import {DuplicatorToolWrapper} from './DuplicatorTool'
7
7
  import ResetSecret from './ResetSecret'
8
8
  import Feedback from './Feedback'
9
9
  import {SanityDocument} from '../types'
@@ -94,7 +94,7 @@ export default function CrossDatasetDuplicator(props: CrossDatasetDuplicatorProp
94
94
 
95
95
  return (
96
96
  <ThemeProvider>
97
- <DuplicatorTool docs={docs} token={secrets?.bearerToken} />
97
+ <DuplicatorToolWrapper docs={docs} token={secrets?.bearerToken} />
98
98
  </ThemeProvider>
99
99
  )
100
100
  }
@@ -5,6 +5,7 @@ import asyncify from 'async/asyncify'
5
5
  import {extract, extractWithPath} from '@sanity/mutator'
6
6
  import {dset} from 'dset'
7
7
  import {
8
+ Grid,
8
9
  Card,
9
10
  Container,
10
11
  Text,
@@ -15,12 +16,14 @@ import {
15
16
  Select,
16
17
  Flex,
17
18
  Checkbox,
19
+ Tab,
18
20
  } from '@sanity/ui'
19
21
  import {ArrowRightIcon, SearchIcon, LaunchIcon} from '@sanity/icons'
20
22
  import sanityClient from 'part:@sanity/base/client'
21
23
  import Preview from 'part:@sanity/base/preview'
22
24
  import schema from 'part:@sanity/base/schema'
23
25
  import config from 'config:sanity'
26
+ import duplicatorConfig from 'config:@sanity/cross-dataset-duplicator'
24
27
 
25
28
  import {typeIsAsset, stickyStyles, createInitialMessage} from '../helpers'
26
29
  import {getDocumentsInArray} from '../helpers/getDocumentsInArray'
@@ -36,6 +39,58 @@ type DuplicatorToolProps = {
36
39
  token: string
37
40
  }
38
41
 
42
+ export function DuplicatorToolWrapper(props: DuplicatorToolProps) {
43
+ const {docs, token} = props
44
+ const [mode, setMode] = useState('outbound')
45
+ const [inbound, setInbound] = useState([])
46
+ const {follow = []} = duplicatorConfig
47
+
48
+ useEffect(() => {
49
+ ;(async () => {
50
+ const inboundReferences = await sanityClient.fetch('*[references($id)]', {id: docs[0]._id})
51
+ setInbound([...props.docs, ...inboundReferences])
52
+ })()
53
+ }, [])
54
+
55
+ console.log(docs, inbound)
56
+
57
+ return (
58
+ <Container>
59
+ {follow.includes(`inbound`) || follow.includes(`outbound`) ? (
60
+ <Card paddingX={4} paddingBottom={4} marginBottom={4} borderBottom>
61
+ <Grid columns={2} gap={4}>
62
+ {follow.includes(`outbound`) ? (
63
+ <Button
64
+ mode="ghost"
65
+ tone="primary"
66
+ selected={mode === 'outbound'}
67
+ onClick={() => setMode('outbound')}
68
+ text={`Outbound`}
69
+ />
70
+ ) : null}
71
+ {follow.includes(`inbound`) ? (
72
+ <Button
73
+ mode="ghost"
74
+ tone="primary"
75
+ selected={mode === 'inbound'}
76
+ onClick={() => setMode('inbound')}
77
+ disabled={inbound.length === 0}
78
+ text={inbound.length > 0 ? `Inbound (${inbound.length})` : 'No inbound references'}
79
+ />
80
+ ) : null}
81
+ </Grid>
82
+ </Card>
83
+ ) : null}
84
+ <DuplicatorTool
85
+ key={mode}
86
+ docs={mode === 'outbound' ? docs : inbound}
87
+ token={token}
88
+ draftIds={[]}
89
+ />
90
+ </Container>
91
+ )
92
+ }
93
+
39
94
  export default function DuplicatorTool(props: DuplicatorToolProps) {
40
95
  const {docs, draftIds, token} = props
41
96
 
@@ -379,7 +434,9 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
379
434
  .map((space) => (
380
435
  <option key={space.name} value={space.name} disabled={space.disabled}>
381
436
  {space.title ?? space.name}
382
- {hasMultipleProjectIds || space.usingEnvForProjectId ? ` (${space.api.projectId})` : ``}
437
+ {hasMultipleProjectIds || space.usingEnvForProjectId
438
+ ? ` (${space.api.projectId})`
439
+ : ``}
383
440
  </option>
384
441
  ))}
385
442
  </Select>
@@ -395,7 +452,9 @@ export default function DuplicatorTool(props: DuplicatorToolProps) {
395
452
  {spacesOptions.map((space) => (
396
453
  <option key={space.name} value={space.name} disabled={space.disabled}>
397
454
  {space.title ?? space.name}
398
- {hasMultipleProjectIds || space.usingEnvForProjectId ? ` (${space.api.projectId})` : ``}
455
+ {hasMultipleProjectIds || space.usingEnvForProjectId
456
+ ? ` (${space.api.projectId})`
457
+ : ``}
399
458
  {space.disabled ? ` (Current)` : ``}
400
459
  </option>
401
460
  ))}