feat(config): add support for setting custom identifier field (#1543)

This commit is contained in:
Matt Kane
2018-11-01 18:02:11 +00:00
committed by Shawn Erquhart
parent 288359da3b
commit 12418dd7f0
4 changed files with 24 additions and 6 deletions

View File

@ -42,7 +42,9 @@ const slugFormatter = (collection, entryData, slugConfig) => {
const identifier = entryData.get(selectIdentifier(collection));
if (!identifier) {
throw new Error('Collection must have a field name that is a valid entry identifier');
throw new Error(
'Collection must have a field name that is a valid entry identifier, or must have `identifier_field` set',
);
}
const slug = template

View File

@ -126,7 +126,7 @@ const getConfigSchema = () => ({
fields: {
contains: {
properties: {
name: { enum: IDENTIFIER_FIELDS },
name: { enum: [{ $data: '3/identifier_field' }, ...IDENTIFIER_FIELDS] },
},
},
},
@ -169,7 +169,7 @@ class ConfigError extends Error {
* the config that is passed in.
*/
export function validateConfig(config) {
const ajv = new AJV({ allErrors: true, jsonPointers: true });
const ajv = new AJV({ allErrors: true, jsonPointers: true, $data: true });
ajvErrors(ajv);
const valid = ajv.validate(getConfigSchema(), config);

View File

@ -113,9 +113,10 @@ export const selectAllowDeletion = collection =>
export const selectTemplateName = (collection, slug) =>
selectors[collection.get('type')].templateName(collection, slug);
export const selectIdentifier = collection => {
const identifier = collection.get('identifier_field');
const indentifierFields = identifier ? [identifier, ...IDENTIFIER_FIELDS] : IDENTIFIER_FIELDS;
const fieldNames = collection.get('fields').map(field => field.get('name'));
return IDENTIFIER_FIELDS.find(id => fieldNames.find(name => name.toLowerCase().trim() === id));
// There must be a field whose `name` matches one of the IDENTIFIER_FIELDS.
return indentifierFields.find(id => fieldNames.find(name => name.toLowerCase().trim() === id));
};
export const selectInferedField = (collection, fieldName) => {
const inferableField = INFERABLE_FIELDS[fieldName];