@sanity/cross-dataset-duplicator 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +3 -0
- package/.eslintignore +1 -0
- package/LICENSE +21 -0
- package/README.md +101 -0
- package/config.dist.json +4 -0
- package/lib/actions/DuplicateToAction.js +59 -0
- package/lib/actions/DuplicateToAction.js.map +1 -0
- package/lib/actions/index.js +38 -0
- package/lib/actions/index.js.map +1 -0
- package/lib/components/CrossDatasetDuplicator.js +107 -0
- package/lib/components/CrossDatasetDuplicator.js.map +1 -0
- package/lib/components/DuplicatorQuery.js +113 -0
- package/lib/components/DuplicatorQuery.js.map +1 -0
- package/lib/components/DuplicatorTool.js +557 -0
- package/lib/components/DuplicatorTool.js.map +1 -0
- package/lib/components/Feedback.js +27 -0
- package/lib/components/Feedback.js.map +1 -0
- package/lib/components/ResetSecret.js +43 -0
- package/lib/components/ResetSecret.js.map +1 -0
- package/lib/components/SelectButtons.js +109 -0
- package/lib/components/SelectButtons.js.map +1 -0
- package/lib/components/StatusBadge.js +87 -0
- package/lib/components/StatusBadge.js.map +1 -0
- package/lib/helpers/clientConfig.js +11 -0
- package/lib/helpers/clientConfig.js.map +1 -0
- package/lib/helpers/constants.js +9 -0
- package/lib/helpers/constants.js.map +1 -0
- package/lib/helpers/getDocumentsInArray.js +80 -0
- package/lib/helpers/getDocumentsInArray.js.map +1 -0
- package/lib/helpers/index.js +30 -0
- package/lib/helpers/index.js.map +1 -0
- package/lib/index.js +24 -0
- package/lib/index.js.map +1 -0
- package/lib/tool/index.js +24 -0
- package/lib/tool/index.js.map +1 -0
- package/lib/types/index.js +2 -0
- package/lib/types/index.js.map +1 -0
- package/package.json +71 -0
- package/sanity.json +16 -0
- package/src/actions/DuplicateToAction.tsx +22 -0
- package/src/actions/index.ts +22 -0
- package/src/components/CrossDatasetDuplicator.tsx +100 -0
- package/src/components/DuplicatorQuery.tsx +93 -0
- package/src/components/DuplicatorTool.tsx +460 -0
- package/src/components/Feedback.tsx +18 -0
- package/src/components/ResetSecret.tsx +27 -0
- package/src/components/SelectButtons.tsx +80 -0
- package/src/components/StatusBadge.tsx +97 -0
- package/src/helpers/clientConfig.ts +1 -0
- package/src/helpers/constants.ts +1 -0
- package/src/helpers/getDocumentsInArray.ts +74 -0
- package/src/helpers/index.ts +23 -0
- package/src/index.js +7 -0
- package/src/tool/index.ts +13 -0
- package/src/types/index.ts +10 -0
package/.babelrc
ADDED
package/.eslintignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
lib
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Simeon Griggs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Sanity Cross Dataset Duplicator
|
|
2
|
+
|
|
3
|
+
Studio Tool and Document Action for empowering content editors to migrate Documents and Assets between Sanity Datasets and Projects from inside the Studio.
|
|
4
|
+
|
|
5
|
+
## Important Notes
|
|
6
|
+
|
|
7
|
+
This plugin is designed as a convenience for Authors to make small, infrequent content migrations between Datasets.
|
|
8
|
+
|
|
9
|
+
- This plugin should be used in conjunction with a reliable backup strategy.
|
|
10
|
+
- Proceed with caution as this plugin can instantly write changes to Datasets.
|
|
11
|
+
- Larger migrations may take more time, especially with Assets. The plugin tries to mitigate this with rate limiting asset uploads to 3 at a time.
|
|
12
|
+
- Before starting a Duplication you can select which Documents and Assets to include. Keep in mind Migrations will likely fail if every Referenced Document or Asset is not already present at the destination Dataset.
|
|
13
|
+
|
|
14
|
+
## Tool
|
|
15
|
+
|
|
16
|
+
The **Duplicate** Tool allows you to migrate Documents that are returned from any GROQ query.
|
|
17
|
+
|
|
18
|
+

|
|
19
|
+
|
|
20
|
+
## Document Action
|
|
21
|
+
|
|
22
|
+
The **Duplicate to...** Document Action allows you to migrate an individual Document.
|
|
23
|
+
|
|
24
|
+

|
|
25
|
+
|
|
26
|
+
**Note:** If your Studio registered its own Document Actions, the plugin config will be overruled. See "Importing the Document Action" below.
|
|
27
|
+
|
|
28
|
+
## Required Setup
|
|
29
|
+
|
|
30
|
+
### 1. Spaces
|
|
31
|
+
|
|
32
|
+
You must have [Spaces configured](https://www.sanity.io/docs/spaces) to use this plugin. Spaces are still listed as an experimental feature but have been supported for some time.
|
|
33
|
+
|
|
34
|
+
All Datasets setup in Spaces will become selectable "destinations" for Migrations.
|
|
35
|
+
|
|
36
|
+
Once setup, you will see a dropdown menu next to the Search bar in the Studio with the Datasets you have configured in Spaces.
|
|
37
|
+
|
|
38
|
+
### 2. Configuration
|
|
39
|
+
|
|
40
|
+
The plugin has some configuration options. These can be set by adding a config file to your Studio
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
// ./config/@sanity/cross-dataset-duplicator.json
|
|
44
|
+
|
|
45
|
+
{
|
|
46
|
+
"tool": true,
|
|
47
|
+
"types": ["article", "page"]
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Options:
|
|
52
|
+
|
|
53
|
+
- `tool` (boolean, default: true) – Set whether the Migration Tool is enabled.
|
|
54
|
+
- `types` (Array[String], default: []) – Set which Schema Types the Migration Action should be enabled in.
|
|
55
|
+
|
|
56
|
+
### 3. Authentication Key
|
|
57
|
+
|
|
58
|
+
To Duplicate the original files of Assets, an additional Authentication Token is required. You will be prompted for this the first time you attempt to use either the Tool or Document Action on any Dataset.
|
|
59
|
+
|
|
60
|
+
This plugin uses [Sanity Secrets](https://github.com/sanity-io/sanity-studio-secrets/) to store the token in the Dataset itself.
|
|
61
|
+
|
|
62
|
+
You can reveal the token belonging to your user account with `sanity debug --secrets`.
|
|
63
|
+
|
|
64
|
+
## Importing the Document Action
|
|
65
|
+
|
|
66
|
+
In your Studio's `sanity.json` file, look for the `document-actions/resolver` part, it will look like this:
|
|
67
|
+
|
|
68
|
+
```json
|
|
69
|
+
{
|
|
70
|
+
"implements": "part:@sanity/base/document-actions/resolver",
|
|
71
|
+
"path": "./src/document-actions"
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Now update your Studio's Document Actions resolver to be something like this
|
|
76
|
+
|
|
77
|
+
```js
|
|
78
|
+
import defaultResolve from 'part:@sanity/base/document-actions'
|
|
79
|
+
import {DuplicateToAction} from 'sanity-plugin-migration'
|
|
80
|
+
import config from 'config:@sanity/cross-dataset-duplicator'
|
|
81
|
+
|
|
82
|
+
export default function resolveDocumentActions(props) {
|
|
83
|
+
const defaultActions = defaultResolve(props)
|
|
84
|
+
|
|
85
|
+
// This will look through the "types" array in your migration.json config file
|
|
86
|
+
// If the type of this document is found in that array, the Migrate Action will show
|
|
87
|
+
if (config?.types?.length && config.types.includes(props.type)) {
|
|
88
|
+
return [...defaultActions, DuplicateToAction]
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ...all your other document action code
|
|
92
|
+
|
|
93
|
+
return defaultActions
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Future feature ideas
|
|
98
|
+
|
|
99
|
+
- Save predefined GROQ queries in the Tool to make bulk repeated Migrations simpler
|
|
100
|
+
- Config options for allowed migrations (eg Dev -> Staging but not Dev -> Live)
|
|
101
|
+
- Config options for permissions/user role checks
|
package/config.dist.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = DuplicateToAction;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _icons = require("@sanity/icons");
|
|
11
|
+
|
|
12
|
+
var _CrossDatasetDuplicator = _interopRequireDefault(require("../components/CrossDatasetDuplicator"));
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
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); }
|
|
17
|
+
|
|
18
|
+
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; }
|
|
19
|
+
|
|
20
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
21
|
+
|
|
22
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
23
|
+
|
|
24
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
25
|
+
|
|
26
|
+
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; }
|
|
27
|
+
|
|
28
|
+
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; }
|
|
29
|
+
|
|
30
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
31
|
+
|
|
32
|
+
function DuplicateToAction(_ref) {
|
|
33
|
+
var draft = _ref.draft,
|
|
34
|
+
published = _ref.published,
|
|
35
|
+
onComplete = _ref.onComplete;
|
|
36
|
+
|
|
37
|
+
var _useState = (0, _react.useState)(false),
|
|
38
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
39
|
+
dialogOpen = _useState2[0],
|
|
40
|
+
setDialogOpen = _useState2[1];
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
disabled: draft,
|
|
44
|
+
title: draft ? "Document must be Published to begin" : null,
|
|
45
|
+
label: 'Duplicate to...',
|
|
46
|
+
dialog: dialogOpen && published && {
|
|
47
|
+
type: 'modal',
|
|
48
|
+
title: 'Cross Dataset Duplicator',
|
|
49
|
+
content: /*#__PURE__*/_react.default.createElement(_CrossDatasetDuplicator.default, {
|
|
50
|
+
docs: [published],
|
|
51
|
+
mode: "action"
|
|
52
|
+
}),
|
|
53
|
+
onClose: () => onComplete()
|
|
54
|
+
},
|
|
55
|
+
onHandle: () => setDialogOpen(true),
|
|
56
|
+
icon: _icons.LaunchIcon
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=DuplicateToAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/DuplicateToAction.tsx"],"names":["DuplicateToAction","draft","published","onComplete","dialogOpen","setDialogOpen","disabled","title","label","dialog","type","content","onClose","onHandle","icon","LaunchIcon"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEe,SAASA,iBAAT,OAA2D;AAAA,MAA/BC,KAA+B,QAA/BA,KAA+B;AAAA,MAAxBC,SAAwB,QAAxBA,SAAwB;AAAA,MAAbC,UAAa,QAAbA,UAAa;;AACxE,kBAAoC,qBAAS,KAAT,CAApC;AAAA;AAAA,MAAOC,UAAP;AAAA,MAAmBC,aAAnB;;AAEA,SAAO;AACLC,IAAAA,QAAQ,EAAEL,KADL;AAELM,IAAAA,KAAK,EAAEN,KAAK,2CAA2C,IAFlD;AAGLO,IAAAA,KAAK,EAAE,iBAHF;AAILC,IAAAA,MAAM,EAAEL,UAAU,IAAIF,SAAd,IAA2B;AACjCQ,MAAAA,IAAI,EAAE,OAD2B;AAEjCH,MAAAA,KAAK,EAAE,0BAF0B;AAGjCI,MAAAA,OAAO,eAAE,6BAAC,+BAAD;AAAwB,QAAA,IAAI,EAAE,CAACT,SAAD,CAA9B;AAA2C,QAAA,IAAI,EAAC;AAAhD,QAHwB;AAIjCU,MAAAA,OAAO,EAAE,MAAMT,UAAU;AAJQ,KAJ9B;AAULU,IAAAA,QAAQ,EAAE,MAAMR,aAAa,CAAC,IAAD,CAVxB;AAWLS,IAAAA,IAAI,EAAEC;AAXD,GAAP;AAaD","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"],"file":"DuplicateToAction.js"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = resolveDocumentActions;
|
|
7
|
+
|
|
8
|
+
var _documentActions = _interopRequireWildcard(require("part:@sanity/base/document-actions"));
|
|
9
|
+
|
|
10
|
+
var _crossDatasetDuplicator = _interopRequireDefault(require("config:@sanity/cross-dataset-duplicator"));
|
|
11
|
+
|
|
12
|
+
var _DuplicateToAction = _interopRequireDefault(require("./DuplicateToAction"));
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
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); }
|
|
17
|
+
|
|
18
|
+
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; }
|
|
19
|
+
|
|
20
|
+
function resolveDocumentActions(props) {
|
|
21
|
+
var _config$types;
|
|
22
|
+
|
|
23
|
+
var duplicatorTypes = (_config$types = _crossDatasetDuplicator.default === null || _crossDatasetDuplicator.default === void 0 ? void 0 : _crossDatasetDuplicator.default.types) !== null && _config$types !== void 0 ? _config$types : [];
|
|
24
|
+
var defaultActions = (0, _documentActions.default)(props); // Insert 'Duplicate to...' after 'Duplicate' only on config'd types
|
|
25
|
+
|
|
26
|
+
if (duplicatorTypes.includes(props === null || props === void 0 ? void 0 : props.type)) {
|
|
27
|
+
return defaultActions.reduce((acc, cur) => {
|
|
28
|
+
if (cur === _documentActions.DuplicateAction) {
|
|
29
|
+
return [...acc, cur, _DuplicateToAction.default];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return [...acc, cur];
|
|
33
|
+
}, []);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return defaultActions;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/index.ts"],"names":["resolveDocumentActions","props","duplicatorTypes","config","types","defaultActions","includes","type","reduce","acc","cur","DuplicateAction","DuplicateToAction"],"mappings":";;;;;;;AAAA;;AACA;;AAEA;;;;;;;;AAEe,SAASA,sBAAT,CAAgCC,KAAhC,EAAuC;AAAA;;AACpD,MAAMC,eAAe,oBAAGC,+BAAH,aAAGA,+BAAH,uBAAGA,gCAAQC,KAAX,yDAAoB,EAAzC;AACA,MAAMC,cAAc,GAAG,8BAAeJ,KAAf,CAAvB,CAFoD,CAIpD;;AACA,MAAIC,eAAe,CAACI,QAAhB,CAAyBL,KAAzB,aAAyBA,KAAzB,uBAAyBA,KAAK,CAAEM,IAAhC,CAAJ,EAA2C;AACzC,WAAOF,cAAc,CAACG,MAAf,CAAsB,CAACC,GAAD,EAAMC,GAAN,KAAc;AACzC,UAAIA,GAAG,KAAKC,gCAAZ,EAA6B;AAC3B,eAAO,CAAC,GAAGF,GAAJ,EAASC,GAAT,EAAcE,0BAAd,CAAP;AACD;;AAED,aAAO,CAAC,GAAGH,GAAJ,EAASC,GAAT,CAAP;AACD,KANM,EAMJ,EANI,CAAP;AAOD;;AAED,SAAOL,cAAP;AACD","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"],"file":"index.js"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = CrossDatasetDuplicator;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _sanitySecrets = require("sanity-secrets");
|
|
11
|
+
|
|
12
|
+
var _ui = require("@sanity/ui");
|
|
13
|
+
|
|
14
|
+
var _DuplicatorQuery = _interopRequireDefault(require("./DuplicatorQuery"));
|
|
15
|
+
|
|
16
|
+
var _DuplicatorTool = _interopRequireDefault(require("./DuplicatorTool"));
|
|
17
|
+
|
|
18
|
+
var _ResetSecret = _interopRequireDefault(require("./ResetSecret"));
|
|
19
|
+
|
|
20
|
+
var _Feedback = _interopRequireDefault(require("./Feedback"));
|
|
21
|
+
|
|
22
|
+
var _constants = require("../helpers/constants");
|
|
23
|
+
|
|
24
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
25
|
+
|
|
26
|
+
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); }
|
|
27
|
+
|
|
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
|
+
|
|
30
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
31
|
+
|
|
32
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
33
|
+
|
|
34
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
35
|
+
|
|
36
|
+
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; }
|
|
37
|
+
|
|
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; }
|
|
39
|
+
|
|
40
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
41
|
+
|
|
42
|
+
// Check for auth secret (required for asset uploads)
|
|
43
|
+
var secretConfigKeys = [{
|
|
44
|
+
key: 'bearerToken',
|
|
45
|
+
title: 'An "Auth Token" is required to duplicate the original files of assets, and will be used for all Duplications. You can retrieve yours using the Sanity CLI `sanity debug --secrets`.',
|
|
46
|
+
description: ''
|
|
47
|
+
}];
|
|
48
|
+
|
|
49
|
+
function CrossDatasetDuplicator(props) {
|
|
50
|
+
var _props$mode = props.mode,
|
|
51
|
+
mode = _props$mode === void 0 ? "tool" : _props$mode,
|
|
52
|
+
_props$docs = props.docs,
|
|
53
|
+
docs = _props$docs === void 0 ? [] : _props$docs;
|
|
54
|
+
var secretsData = (0, _sanitySecrets.useSecrets)(_constants.SECRET_NAMESPACE);
|
|
55
|
+
var loading = secretsData.loading,
|
|
56
|
+
secrets = secretsData.secrets;
|
|
57
|
+
|
|
58
|
+
var _useState = (0, _react.useState)(false),
|
|
59
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
60
|
+
showSecretsPrompt = _useState2[0],
|
|
61
|
+
setShowSecretsPrompt = _useState2[1];
|
|
62
|
+
|
|
63
|
+
(0, _react.useEffect)(() => {
|
|
64
|
+
if (secrets) {
|
|
65
|
+
setShowSecretsPrompt(!(secrets !== null && secrets !== void 0 && secrets.bearerToken));
|
|
66
|
+
}
|
|
67
|
+
}, [secrets]);
|
|
68
|
+
|
|
69
|
+
if (!secretsData) {
|
|
70
|
+
return /*#__PURE__*/_react.default.createElement(_Feedback.default, null, "Could not query for Secrets. You may have insufficient permissions on your account.");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (loading) {
|
|
74
|
+
return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_ui.Flex, {
|
|
75
|
+
justify: "center",
|
|
76
|
+
align: "center"
|
|
77
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Box, {
|
|
78
|
+
padding: 5
|
|
79
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Spinner, null))));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!loading && showSecretsPrompt || !(secrets !== null && secrets !== void 0 && secrets.bearerToken)) {
|
|
83
|
+
return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_sanitySecrets.SettingsView, {
|
|
84
|
+
title: "Token Required",
|
|
85
|
+
namespace: _constants.SECRET_NAMESPACE,
|
|
86
|
+
keys: secretConfigKeys // eslint-disable-next-line react/jsx-no-bind
|
|
87
|
+
,
|
|
88
|
+
onClose: () => setShowSecretsPrompt(false)
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (mode === 'tool') {
|
|
93
|
+
return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_DuplicatorQuery.default, {
|
|
94
|
+
token: secrets === null || secrets === void 0 ? void 0 : secrets.bearerToken
|
|
95
|
+
}), /*#__PURE__*/_react.default.createElement(_ResetSecret.default, null));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (!(docs !== null && docs !== void 0 && docs.length)) {
|
|
99
|
+
return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_Feedback.default, null, "No docs passed into Duplicator Tool"));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return /*#__PURE__*/_react.default.createElement(_ui.ThemeProvider, null, /*#__PURE__*/_react.default.createElement(_DuplicatorTool.default, {
|
|
103
|
+
docs: docs,
|
|
104
|
+
token: secrets === null || secrets === void 0 ? void 0 : secrets.bearerToken
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=CrossDatasetDuplicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/CrossDatasetDuplicator.tsx"],"names":["secretConfigKeys","key","title","description","CrossDatasetDuplicator","props","mode","docs","secretsData","SECRET_NAMESPACE","loading","secrets","showSecretsPrompt","setShowSecretsPrompt","bearerToken","length"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AACA;;AAEA;;;;;;;;;;;;;;;;;;;;AAEA;AACA,IAAMA,gBAAgB,GAAG,CACvB;AACEC,EAAAA,GAAG,EAAE,aADP;AAEEC,EAAAA,KAAK,EACH,qLAHJ;AAIEC,EAAAA,WAAW,EAAE;AAJf,CADuB,CAAzB;;AAkBe,SAASC,sBAAT,CAAgCC,KAAhC,EAAoE;AACjF,oBAAmCA,KAAnC,CAAOC,IAAP;AAAA,MAAOA,IAAP;AAAA,oBAAmCD,KAAnC,CAAsBE,IAAtB;AAAA,MAAsBA,IAAtB,4BAA6B,EAA7B;AAEA,MAAMC,WAAW,GAAG,+BAAWC,2BAAX,CAApB;AACA,MAAOC,OAAP,GAAiEF,WAAjE,CAAOE,OAAP;AAAA,MAAgBC,OAAhB,GAAiEH,WAAjE,CAAgBG,OAAhB;;AACA,kBAAkD,qBAAS,KAAT,CAAlD;AAAA;AAAA,MAAOC,iBAAP;AAAA,MAA0BC,oBAA1B;;AAEA,wBAAU,MAAM;AACd,QAAIF,OAAJ,EAAa;AACXE,MAAAA,oBAAoB,CAAC,EAACF,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAD,CAApB;AACD;AACF,GAJD,EAIG,CAACH,OAAD,CAJH;;AAMA,MAAI,CAACH,WAAL,EAAkB;AAChB,wBACE,6BAAC,iBAAD,8FADF;AAKD;;AAED,MAAIE,OAAJ,EAAa;AACX,wBACE,6BAAC,iBAAD,qBACE,6BAAC,QAAD;AAAM,MAAA,OAAO,EAAC,QAAd;AAAuB,MAAA,KAAK,EAAC;AAA7B,oBACE,6BAAC,OAAD;AAAK,MAAA,OAAO,EAAE;AAAd,oBACE,6BAAC,WAAD,OADF,CADF,CADF,CADF;AASD;;AAED,MAAK,CAACA,OAAD,IAAYE,iBAAb,IAAmC,EAACD,OAAD,aAACA,OAAD,eAACA,OAAO,CAAEG,WAAV,CAAvC,EAA8D;AAC5D,wBACE,6BAAC,iBAAD,qBACE,6BAAC,2BAAD;AACE,MAAA,KAAK,EAAC,gBADR;AAEE,MAAA,SAAS,EAAEL,2BAFb;AAGE,MAAA,IAAI,EAAET,gBAHR,CAIE;AAJF;AAKE,MAAA,OAAO,EAAE,MAAMa,oBAAoB,CAAC,KAAD;AALrC,MADF,CADF;AAWD;;AAED,MAAIP,IAAI,KAAK,MAAb,EAAqB;AACnB,wBACE,6BAAC,iBAAD,qBACE,6BAAC,wBAAD;AAAiB,MAAA,KAAK,EAAEK,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;AAAjC,MADF,eAEE,6BAAC,oBAAD,OAFF,CADF;AAMD;;AAED,MAAI,EAACP,IAAD,aAACA,IAAD,eAACA,IAAI,CAAEQ,MAAP,CAAJ,EAAmB;AACjB,wBACE,6BAAC,iBAAD,qBACE,6BAAC,iBAAD,8CADF,CADF;AAKD;;AAED,sBACE,6BAAC,iBAAD,qBACE,6BAAC,uBAAD;AAAgB,IAAA,IAAI,EAAER,IAAtB;AAA4B,IAAA,KAAK,EAAEI,OAAF,aAAEA,OAAF,uBAAEA,OAAO,CAAEG;AAA5C,IADF,CADF;AAKD","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 \"Auth Token\" is required to duplicate the original files of assets, and will be used for all Duplications. You can retrieve yours using the Sanity CLI `sanity debug --secrets`.',\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"],"file":"CrossDatasetDuplicator.js"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = DuplicatorQuery;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _client = _interopRequireDefault(require("part:@sanity/base/client"));
|
|
11
|
+
|
|
12
|
+
var _schema = _interopRequireDefault(require("part:@sanity/base/schema"));
|
|
13
|
+
|
|
14
|
+
var _ui = require("@sanity/ui");
|
|
15
|
+
|
|
16
|
+
var _DuplicatorTool = _interopRequireDefault(require("./DuplicatorTool"));
|
|
17
|
+
|
|
18
|
+
var _clientConfig = require("../helpers/clientConfig");
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
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); }
|
|
23
|
+
|
|
24
|
+
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; }
|
|
25
|
+
|
|
26
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
27
|
+
|
|
28
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
29
|
+
|
|
30
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
31
|
+
|
|
32
|
+
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
|
+
|
|
34
|
+
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; }
|
|
35
|
+
|
|
36
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
37
|
+
|
|
38
|
+
var originClient = _client.default.withConfig(_clientConfig.clientConfig);
|
|
39
|
+
|
|
40
|
+
function DuplicatorQuery(props) {
|
|
41
|
+
var token = props.token;
|
|
42
|
+
|
|
43
|
+
var _useState = (0, _react.useState)(""),
|
|
44
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
45
|
+
value = _useState2[0],
|
|
46
|
+
setValue = _useState2[1];
|
|
47
|
+
|
|
48
|
+
var _useState3 = (0, _react.useState)([]),
|
|
49
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
50
|
+
docs = _useState4[0],
|
|
51
|
+
setDocs = _useState4[1];
|
|
52
|
+
|
|
53
|
+
function handleSubmit(e) {
|
|
54
|
+
if (e) e.preventDefault();
|
|
55
|
+
originClient.fetch(value).then(res => {
|
|
56
|
+
// Ensure queried docs are registered to the schema
|
|
57
|
+
var registeredDocs = res.length ? res.filter(doc => _schema.default.get(doc._type)) : [];
|
|
58
|
+
setDocs(registeredDocs);
|
|
59
|
+
}).catch(err => console.error(err));
|
|
60
|
+
} // Auto-load initial textinput value
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
(0, _react.useEffect)(() => {
|
|
64
|
+
if (!(docs !== null && docs !== void 0 && docs.length) && value) {
|
|
65
|
+
handleSubmit();
|
|
66
|
+
}
|
|
67
|
+
}, []);
|
|
68
|
+
return /*#__PURE__*/_react.default.createElement(_ui.Container, {
|
|
69
|
+
width: [1, 1, 1, 3],
|
|
70
|
+
padding: [0, 0, 0, 5]
|
|
71
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Grid, {
|
|
72
|
+
columns: [1, 1, 1, 2],
|
|
73
|
+
gap: [1, 1, 1, 4]
|
|
74
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Box, {
|
|
75
|
+
padding: [2, 2, 2, 0]
|
|
76
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Card, {
|
|
77
|
+
padding: 4,
|
|
78
|
+
scheme: "dark",
|
|
79
|
+
radius: 3
|
|
80
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
|
|
81
|
+
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", {
|
|
83
|
+
onSubmit: handleSubmit
|
|
84
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Flex, null, /*#__PURE__*/_react.default.createElement(_ui.Box, {
|
|
85
|
+
flex: 1,
|
|
86
|
+
paddingRight: 2
|
|
87
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.TextInput, {
|
|
88
|
+
style: {
|
|
89
|
+
fontFamily: 'monospace'
|
|
90
|
+
},
|
|
91
|
+
fontSize: 2 // eslint-disable-next-line react/jsx-no-bind
|
|
92
|
+
,
|
|
93
|
+
onChange: event => setValue(event.currentTarget.value),
|
|
94
|
+
padding: 4,
|
|
95
|
+
placeholder: "*[_type == \"article\"]",
|
|
96
|
+
value: value !== null && value !== void 0 ? value : ""
|
|
97
|
+
})), /*#__PURE__*/_react.default.createElement(_ui.Button, {
|
|
98
|
+
padding: 2,
|
|
99
|
+
paddingX: 4,
|
|
100
|
+
tone: "primary",
|
|
101
|
+
onClick: handleSubmit,
|
|
102
|
+
text: "Query",
|
|
103
|
+
disabled: !value
|
|
104
|
+
})))))), !(docs !== null && docs !== void 0 && docs.length) || docs.length < 1 && /*#__PURE__*/_react.default.createElement(_ui.Container, {
|
|
105
|
+
width: 1
|
|
106
|
+
}, /*#__PURE__*/_react.default.createElement(_ui.Card, {
|
|
107
|
+
padding: 5
|
|
108
|
+
}, value ? "No Documents registered to the Schema match this query" : "Start with a valid GROQ query")), (docs === null || docs === void 0 ? void 0 : docs.length) > 0 && /*#__PURE__*/_react.default.createElement(_DuplicatorTool.default, {
|
|
109
|
+
docs: docs,
|
|
110
|
+
token: token
|
|
111
|
+
})));
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=DuplicatorQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/DuplicatorQuery.tsx"],"names":["originClient","sanityClient","withConfig","clientConfig","DuplicatorQuery","props","token","value","setValue","docs","setDocs","handleSubmit","e","preventDefault","fetch","then","res","registeredDocs","length","filter","doc","schema","get","_type","catch","err","console","error","fontFamily","event","currentTarget"],"mappings":"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","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\nexport default function DuplicatorQuery(props: DuplicatorQueryProps) {\n const {token} = props\n\n const [value, setValue] = useState(``)\n const [docs, setDocs] = useState([])\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 registeredDocs = res.length ? res.filter((doc) => schema.get(doc._type)) : []\n\n setDocs(registeredDocs)\n })\n .catch((err) => console.error(err))\n }\n\n // Auto-load initial textinput value\n useEffect(() => {\n if (!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 return an Array of Objects.\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 {!docs?.length || docs.length < 1 && (\n <Container width={1}>\n <Card padding={5}>\n {value ? `No Documents registered to the Schema match this query` : `Start with a valid GROQ query`}\n </Card>\n </Container>\n )}\n {docs?.length > 0 && <DuplicatorTool docs={docs} token={token} />}\n </Grid>\n </Container>\n )\n}\n"],"file":"DuplicatorQuery.js"}
|