Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
86 lines
2.5 KiB
Plaintext
86 lines
2.5 KiB
Plaintext
import { fieldAffectsData, fieldHasSubFields } from 'payload/shared';
|
|
/**
|
|
* Validates whether clipboard data is compatible with the target schema.
|
|
* For this to be true, the copied field and the target to be pasted must
|
|
* be structurally equivalent (same schema)
|
|
*
|
|
* @returns True if the clipboard data is valid and can be pasted, false otherwise
|
|
*/
|
|
export function isClipboardDataValid({
|
|
data,
|
|
path,
|
|
...args
|
|
}) {
|
|
if (typeof data === 'undefined' || !path || !args.type) {
|
|
return false;
|
|
}
|
|
if (args.type === 'blocks') {
|
|
return isClipboardBlocksValid({
|
|
blocksFromClipboard: args.blocks,
|
|
blocksFromConfig: args.schemaBlocks
|
|
});
|
|
} else {
|
|
return isClipboardFieldsValid({
|
|
fieldsFromClipboard: args.fields,
|
|
fieldsFromConfig: args.schemaFields
|
|
});
|
|
}
|
|
}
|
|
function isClipboardFieldsValid({
|
|
fieldsFromClipboard,
|
|
fieldsFromConfig
|
|
}) {
|
|
if (!fieldsFromConfig || fieldsFromClipboard.length !== fieldsFromConfig?.length) {
|
|
return false;
|
|
}
|
|
return fieldsFromClipboard.every((clipboardField, i) => {
|
|
const configField = fieldsFromConfig[i];
|
|
if (clipboardField.type !== configField.type) {
|
|
return false;
|
|
}
|
|
const affectsData = fieldAffectsData(clipboardField) && fieldAffectsData(configField);
|
|
if (affectsData && clipboardField.name !== configField.name) {
|
|
return false;
|
|
}
|
|
const hasNestedFieldsConfig = fieldHasSubFields(configField);
|
|
const hasNestedFieldsClipboard = fieldHasSubFields(clipboardField);
|
|
if (hasNestedFieldsClipboard !== hasNestedFieldsConfig) {
|
|
return false;
|
|
}
|
|
if (hasNestedFieldsClipboard && hasNestedFieldsConfig) {
|
|
return isClipboardFieldsValid({
|
|
fieldsFromClipboard: clipboardField.fields,
|
|
fieldsFromConfig: configField.fields
|
|
});
|
|
}
|
|
return true;
|
|
});
|
|
}
|
|
function isClipboardBlocksValid({
|
|
blocksFromClipboard,
|
|
blocksFromConfig
|
|
}) {
|
|
const configBlockMap = new Map(blocksFromConfig?.map(block => [block.slug, block]));
|
|
if (!configBlockMap.size) {
|
|
return false;
|
|
}
|
|
const checkedSlugs = new Set();
|
|
for (const currBlock of blocksFromClipboard) {
|
|
const currSlug = currBlock.slug;
|
|
if (!checkedSlugs.has(currSlug)) {
|
|
const configBlock = configBlockMap.get(currSlug);
|
|
if (!configBlock) {
|
|
return false;
|
|
}
|
|
if (!isClipboardFieldsValid({
|
|
fieldsFromClipboard: currBlock.fields,
|
|
fieldsFromConfig: configBlock.fields
|
|
})) {
|
|
return false;
|
|
}
|
|
checkedSlugs.add(currSlug);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
//# sourceMappingURL=isClipboardDataValid.js.map |