@botonic/plugin-contentful
Version:
Botonic Plugin Contentful is one of the **[available](https://github.com/hubtype/botonic/tree/master/packages)** plugins for Botonic. **[Contentful](http://www.contentful.com)** is a CMS (Content Management System) which manages contents of a great variet
166 lines • 7.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFieldsForContentType = exports.I18nField = exports.contentFieldByCmsName = exports.CONTENT_FIELDS = exports.ContentField = exports.ContentFieldValueType = exports.ContentFieldType = void 0;
const cms_1 = require("../cms");
const enums_1 = require("../util/enums");
var ContentFieldType;
(function (ContentFieldType) {
ContentFieldType["TEXT"] = "Text";
ContentFieldType["SHORT_TEXT"] = "Short text";
ContentFieldType["KEYWORDS"] = "Keywords";
ContentFieldType["TITLE"] = "Title";
ContentFieldType["SUBTITLE"] = "Subtitle";
ContentFieldType["BUTTONS"] = "Buttons";
ContentFieldType["ELEMENTS"] = "Elements";
ContentFieldType["IMAGE"] = "Image";
ContentFieldType["PIC"] = "pic";
ContentFieldType["URL"] = "URL";
ContentFieldType["PAYLOAD"] = "payload";
ContentFieldType["NAME"] = "Name";
ContentFieldType["BUTTONS_STYLE"] = "Buttons Style";
ContentFieldType["FOLLOW_UP"] = "FollowUp";
ContentFieldType["TARGET"] = "Target";
ContentFieldType["QUEUE"] = "Queue";
ContentFieldType["HANDOFF_QUEUE"] = "Handoff Queue";
ContentFieldType["MESSAGE"] = "Message";
ContentFieldType["FAIL_MESSAGE"] = "Fail Message";
ContentFieldType["AGENT_EMAIL"] = "Agent Email";
ContentFieldType["AGENT_ID"] = "Agent Id";
ContentFieldType["ON_FINISH"] = "On Finish";
ContentFieldType["SHADOWING"] = "Shadowing";
ContentFieldType["INPUT_TYPE"] = "Input Type";
})(ContentFieldType = exports.ContentFieldType || (exports.ContentFieldType = {}));
var ContentFieldValueType;
(function (ContentFieldValueType) {
ContentFieldValueType["STRING"] = "string";
ContentFieldValueType["STRING_ARRAY"] = "string[]";
ContentFieldValueType["REFERENCE"] = "reference";
ContentFieldValueType["REFERENCE_ARRAY"] = "reference[]";
ContentFieldValueType["ASSET"] = "asset";
ContentFieldValueType["BOOLEAN"] = "boolean";
})(ContentFieldValueType = exports.ContentFieldValueType || (exports.ContentFieldValueType = {}));
class ContentField {
constructor(fieldType, cmsName, valueType, isLocalized) {
this.fieldType = fieldType;
this.cmsName = cmsName;
this.valueType = valueType;
this.isLocalized = isLocalized;
}
parse(fieldValue) {
switch (this.valueType) {
case ContentFieldValueType.STRING:
return fieldValue;
case ContentFieldValueType.STRING_ARRAY:
return fieldValue
.split(ContentField.STRING_ARRAY_SEPARATOR)
.map(kw => kw.trim());
default:
throw new cms_1.CmsException(`${this.valueType} cannot be parsed yet`);
}
}
getValue(content) {
if (this.fieldType == ContentFieldType.SHORT_TEXT) {
return content.common.shortText;
}
else if (this.fieldType == ContentFieldType.KEYWORDS) {
return content.common.keywords;
}
return content[this.cmsName];
}
isNotEmptyAt(content) {
const val = this.getValue(content);
if (Array.isArray(val)) {
return val.length > 0;
}
return val;
}
}
exports.ContentField = ContentField;
/**
* Used for keywords.
* Maybe we should use instead a comma, since it's error prone that in Excel
* the array values are ; separated, but in contentful dashboard they must be
* separated by commas (a workaround is adding a validation on contentful dashboard
* to prevent ; on array fields)
*/
ContentField.STRING_ARRAY_SEPARATOR = ';';
exports.CONTENT_FIELDS = new Map(pairs([
new ContentField(ContentFieldType.TEXT, 'text', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.SHORT_TEXT, 'shortText', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.KEYWORDS, 'keywords', ContentFieldValueType.STRING_ARRAY, true),
new ContentField(ContentFieldType.TITLE, 'title', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.SUBTITLE, 'subtitle', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.BUTTONS, 'buttons', ContentFieldValueType.REFERENCE_ARRAY, true),
new ContentField(ContentFieldType.ELEMENTS, 'elements', ContentFieldValueType.REFERENCE_ARRAY, true),
new ContentField(ContentFieldType.IMAGE, 'image', ContentFieldValueType.ASSET, true),
new ContentField(ContentFieldType.PIC, 'pic', ContentFieldValueType.ASSET, true),
new ContentField(ContentFieldType.URL, 'url', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.PAYLOAD, 'payload', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.NAME, 'name', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.BUTTONS_STYLE, 'buttonsStyle', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.FOLLOW_UP, 'followup', ContentFieldValueType.REFERENCE, true),
new ContentField(ContentFieldType.TARGET, 'target', ContentFieldValueType.REFERENCE, true),
new ContentField(ContentFieldType.QUEUE, 'queue', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.HANDOFF_QUEUE, 'queue', ContentFieldValueType.REFERENCE, true),
new ContentField(ContentFieldType.MESSAGE, 'message', ContentFieldValueType.REFERENCE, true),
new ContentField(ContentFieldType.FAIL_MESSAGE, 'failMessage', ContentFieldValueType.REFERENCE, true),
new ContentField(ContentFieldType.AGENT_EMAIL, 'agentEmail', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.AGENT_ID, 'agentId', ContentFieldValueType.STRING, true),
new ContentField(ContentFieldType.ON_FINISH, 'onFinish', ContentFieldValueType.REFERENCE, true),
new ContentField(ContentFieldType.SHADOWING, 'shadowing', ContentFieldValueType.BOOLEAN, true),
new ContentField(ContentFieldType.INPUT_TYPE, 'type', ContentFieldValueType.STRING, true),
]));
function pairs(cfs) {
return cfs.map(cf => [cf.fieldType, cf]);
}
function contentFieldByCmsName(cmsName) {
for (const cf of exports.CONTENT_FIELDS.values()) {
if (cf.cmsName == cmsName) {
return cf;
}
}
throw new cms_1.CmsException(`No ContentField found for cmsName ${cmsName}`);
}
exports.contentFieldByCmsName = contentFieldByCmsName;
class I18nField {
constructor(name, value) {
this.name = name;
this.value = value;
}
}
exports.I18nField = I18nField;
/**
* Only contains i18nalizable fields (used by tools to detect which fields need to be imported/deleted)
* TODO add all fields
*/
const FIELDS_PER_CONTENT_TYPE = {
[cms_1.ContentType.BUTTON]: [ContentFieldType.TEXT],
[cms_1.ContentType.CAROUSEL]: [],
[cms_1.ContentType.ELEMENT]: [
ContentFieldType.TITLE,
ContentFieldType.SUBTITLE,
ContentFieldType.BUTTONS,
],
[cms_1.ContentType.STARTUP]: [ContentFieldType.TEXT, ContentFieldType.BUTTONS],
[cms_1.ContentType.TEXT]: [ContentFieldType.TEXT, ContentFieldType.BUTTONS],
[cms_1.ContentType.URL]: [ContentFieldType.URL],
[cms_1.ContentType.PAYLOAD]: [ContentFieldType.PAYLOAD],
};
/**
* Adds common fields to FIELDS_PER_CONTENT_TYPE
* IMPORTANT @see FIELDS_PER_CONTENT_TYPE
*/
function getFieldsForContentType(contentType) {
let fields = FIELDS_PER_CONTENT_TYPE[contentType];
if (!fields) {
throw new cms_1.CmsException(`Invalid content type ${contentType}`);
}
fields = [...fields];
if ((0, enums_1.isOfType)(contentType, cms_1.TopContentType)) {
fields.push(ContentFieldType.KEYWORDS);
fields.push(ContentFieldType.SHORT_TEXT);
}
return fields;
}
exports.getFieldsForContentType = getFieldsForContentType;
//# sourceMappingURL=fields.js.map