feat: populate new entry from URL params (#3343)
This commit is contained in:
@ -8,6 +8,7 @@ import collections, {
|
||||
selectMediaFolders,
|
||||
getFieldsNames,
|
||||
selectField,
|
||||
updateFieldByKey,
|
||||
} from '../collections';
|
||||
import { FILES, FOLDER } from 'Constants/collectionTypes';
|
||||
|
||||
@ -381,4 +382,109 @@ describe('collections', () => {
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('updateFieldByKey', () => {
|
||||
it('should update field by key', () => {
|
||||
const collection = fromJS({
|
||||
fields: [
|
||||
{ name: 'title' },
|
||||
{ name: 'image' },
|
||||
{
|
||||
name: 'object',
|
||||
fields: [{ name: 'title' }, { name: 'gallery', fields: [{ name: 'image' }] }],
|
||||
},
|
||||
{ name: 'list', field: { name: 'image' } },
|
||||
{ name: 'body' },
|
||||
{ name: 'widgetList', types: [{ name: 'widget' }] },
|
||||
],
|
||||
});
|
||||
|
||||
const updater = field => field.set('default', 'default');
|
||||
|
||||
expect(updateFieldByKey(collection, 'non-existent', updater)).toBe(collection);
|
||||
expect(updateFieldByKey(collection, 'title', updater)).toEqual(
|
||||
fromJS({
|
||||
fields: [
|
||||
{ name: 'title', default: 'default' },
|
||||
{ name: 'image' },
|
||||
{
|
||||
name: 'object',
|
||||
fields: [{ name: 'title' }, { name: 'gallery', fields: [{ name: 'image' }] }],
|
||||
},
|
||||
{ name: 'list', field: { name: 'image' } },
|
||||
{ name: 'body' },
|
||||
{ name: 'widgetList', types: [{ name: 'widget' }] },
|
||||
],
|
||||
}),
|
||||
);
|
||||
expect(updateFieldByKey(collection, 'object.title', updater)).toEqual(
|
||||
fromJS({
|
||||
fields: [
|
||||
{ name: 'title' },
|
||||
{ name: 'image' },
|
||||
{
|
||||
name: 'object',
|
||||
fields: [
|
||||
{ name: 'title', default: 'default' },
|
||||
{ name: 'gallery', fields: [{ name: 'image' }] },
|
||||
],
|
||||
},
|
||||
{ name: 'list', field: { name: 'image' } },
|
||||
{ name: 'body' },
|
||||
{ name: 'widgetList', types: [{ name: 'widget' }] },
|
||||
],
|
||||
}),
|
||||
);
|
||||
|
||||
expect(updateFieldByKey(collection, 'object.gallery.image', updater)).toEqual(
|
||||
fromJS({
|
||||
fields: [
|
||||
{ name: 'title' },
|
||||
{ name: 'image' },
|
||||
{
|
||||
name: 'object',
|
||||
fields: [
|
||||
{ name: 'title' },
|
||||
{ name: 'gallery', fields: [{ name: 'image', default: 'default' }] },
|
||||
],
|
||||
},
|
||||
{ name: 'list', field: { name: 'image' } },
|
||||
{ name: 'body' },
|
||||
{ name: 'widgetList', types: [{ name: 'widget' }] },
|
||||
],
|
||||
}),
|
||||
);
|
||||
expect(updateFieldByKey(collection, 'list.image', updater)).toEqual(
|
||||
fromJS({
|
||||
fields: [
|
||||
{ name: 'title' },
|
||||
{ name: 'image' },
|
||||
{
|
||||
name: 'object',
|
||||
fields: [{ name: 'title' }, { name: 'gallery', fields: [{ name: 'image' }] }],
|
||||
},
|
||||
{ name: 'list', field: { name: 'image', default: 'default' } },
|
||||
{ name: 'body' },
|
||||
{ name: 'widgetList', types: [{ name: 'widget' }] },
|
||||
],
|
||||
}),
|
||||
);
|
||||
|
||||
expect(updateFieldByKey(collection, 'widgetList.widget', updater)).toEqual(
|
||||
fromJS({
|
||||
fields: [
|
||||
{ name: 'title' },
|
||||
{ name: 'image' },
|
||||
{
|
||||
name: 'object',
|
||||
fields: [{ name: 'title' }, { name: 'gallery', fields: [{ name: 'image' }] }],
|
||||
},
|
||||
{ name: 'list', field: { name: 'image' } },
|
||||
{ name: 'body' },
|
||||
{ name: 'widgetList', types: [{ name: 'widget', default: 'default' }] },
|
||||
],
|
||||
}),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -233,6 +233,53 @@ export const selectField = (collection: Collection, key: string) => {
|
||||
return field;
|
||||
};
|
||||
|
||||
export const updateFieldByKey = (
|
||||
collection: Collection,
|
||||
key: string,
|
||||
updater: (field: EntryField) => EntryField,
|
||||
) => {
|
||||
const selected = selectField(collection, key);
|
||||
if (!selected) {
|
||||
return collection;
|
||||
}
|
||||
|
||||
let updated = false;
|
||||
|
||||
const traverseFields = (fields: List<EntryField>) => {
|
||||
if (updated) {
|
||||
// we can stop once the field is found
|
||||
return fields;
|
||||
}
|
||||
|
||||
fields = fields
|
||||
.map(f => {
|
||||
const field = f as EntryField;
|
||||
if (field === selected) {
|
||||
updated = true;
|
||||
return updater(field);
|
||||
} else if (field.has('fields')) {
|
||||
return field.set('fields', traverseFields(field.get('fields')!));
|
||||
} else if (field.has('field')) {
|
||||
return field.set('field', traverseFields(List([field.get('field')!])).get(0));
|
||||
} else if (field.has('types')) {
|
||||
return field.set('types', traverseFields(field.get('types')!));
|
||||
} else {
|
||||
return field;
|
||||
}
|
||||
})
|
||||
.toList() as List<EntryField>;
|
||||
|
||||
return fields;
|
||||
};
|
||||
|
||||
collection = collection.set(
|
||||
'fields',
|
||||
traverseFields(collection.get('fields', List<EntryField>())),
|
||||
);
|
||||
|
||||
return collection;
|
||||
};
|
||||
|
||||
export const selectIdentifier = (collection: Collection) => {
|
||||
const identifier = collection.get('identifier_field');
|
||||
const identifierFields = identifier ? [identifier, ...IDENTIFIER_FIELDS] : IDENTIFIER_FIELDS;
|
||||
|
Reference in New Issue
Block a user