feat: populate new entry from URL params (#3343)

This commit is contained in:
Erez Rokah
2020-03-02 11:32:22 +01:00
committed by GitHub
parent 773d83900d
commit e0b1246810
8 changed files with 364 additions and 43 deletions

View File

@ -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' }] },
],
}),
);
});
});
});

View File

@ -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;