forest-express
Version:
Official package for all Forest Express Lianas
106 lines (105 loc) • 5.11 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function lowerCaseFirstLetter(string) {
return string.charAt(0).toLowerCase() + string.slice(1);
}
var subElementsKey = {
Row: 'fields',
Page: 'elements'
};
var validLayoutComponents = ['Row', 'Page', 'Separator', 'HtmlBlock'];
var SmartActionFormLayoutService = /*#__PURE__*/function () {
function SmartActionFormLayoutService() {
(0, _classCallCheck2["default"])(this, SmartActionFormLayoutService);
}
(0, _createClass2["default"])(SmartActionFormLayoutService, [{
key: "extractFieldsAndLayout",
value:
// eslint-disable-next-line class-methods-use-this
function extractFieldsAndLayout(formElements) {
// same logic as in v2 agent
// https://github.com/ForestAdmin/agent-nodejs/blob/chore/demo-form-customization/packages/agent/src/utils/forest-schema/generator-actions.ts#L188
var hasLayout = false;
var fields = [];
var layout = [];
if (!(formElements !== null && formElements !== void 0 && formElements.length)) return {
fields: [],
layout: []
};
var isFirstElementPage = formElements[0].component === 'Page';
formElements.forEach(function (element) {
if (element.type === 'Layout') {
hasLayout = true;
}
if (isFirstElementPage && element.component !== 'Page' || !isFirstElementPage && element.component === 'Page') {
throw new Error('You cannot use pages and other elements at the same level');
}
layout.push(SmartActionFormLayoutService.parseLayout(element, fields));
});
if (!hasLayout) {
layout = [];
}
return {
fields: fields,
layout: layout
};
}
}], [{
key: "validateLayoutElement",
value: function validateLayoutElement(element) {
if (!validLayoutComponents.includes(element.component)) throw new Error("".concat(element.component, " is not a valid component. Valid components are ").concat(validLayoutComponents.join(' or ')));
if (element.component === 'Page') {
if (!Array.isArray(element.elements)) {
throw new Error('Page components must contain an array of fields or layout elements in property \'elements\'');
}
if (element.elements.some(function (innerElement) {
return innerElement.component === 'Page';
})) {
throw new Error('Pages cannot contain other pages');
}
}
if (element.component === 'Row') {
if (!Array.isArray(element.fields)) {
throw new Error('Row components must contain an array of fields in property \'fields\'');
}
if (element.fields.some(function (field) {
return field.type === 'Layout';
})) {
throw new Error('Row components can only contain fields');
}
}
}
}, {
key: "parseLayout",
value: function parseLayout(element, allFields) {
if (element.type === 'Layout') {
SmartActionFormLayoutService.validateLayoutElement(element);
if (['Row', 'Page'].includes(element.component)) {
var key = subElementsKey[element.component];
var subElements = element[key].map(function (field) {
return SmartActionFormLayoutService.parseLayout(field, allFields);
});
return _objectSpread(_objectSpread({}, element), {}, (0, _defineProperty2["default"])({
component: lowerCaseFirstLetter(element.component)
}, key, subElements));
}
return _objectSpread(_objectSpread({}, element), {}, {
component: lowerCaseFirstLetter(element.component)
});
}
allFields.push(element);
return {
type: 'Layout',
component: 'input',
fieldId: element.field
};
}
}]);
return SmartActionFormLayoutService;
}();
module.exports = SmartActionFormLayoutService;