UNPKG

@bigfishtv/cockpit

Version:

344 lines (296 loc) 13.6 kB
'use strict'; exports.__esModule = true; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /** * Form Utilities * @module Utilities/formUtils */ exports.resolveFieldInputFromColumn = resolveFieldInputFromColumn; exports.getAssociationKeyedClasses = getAssociationKeyedClasses; exports.filterOutProtectedSchema = filterOutProtectedSchema; exports.filterOutProtectedEditSchema = filterOutProtectedEditSchema; exports.removeAssocationsFromSchema = removeAssocationsFromSchema; exports.filterSchemaByPanel = filterSchemaByPanel; exports.filterSchemaExcludingPanels = filterSchemaExcludingPanels; exports.filterArrayByKeyPatterns = filterArrayByKeyPatterns; exports.getSchemaWithAssociations = getSchemaWithAssociations; exports.optionsList = optionsList; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _SwitchInput = require('../components/input/SwitchInput'); var _SwitchInput2 = _interopRequireDefault(_SwitchInput); var _Checkbox = require('../components/input/Checkbox'); var _Checkbox2 = _interopRequireDefault(_Checkbox); var _Redactor = require('../components/Redactor'); var _Redactor2 = _interopRequireDefault(_Redactor); var _TextareaInput = require('../components/input/TextareaInput'); var _TextareaInput2 = _interopRequireDefault(_TextareaInput); var _NumberInput = require('../components/input/NumberInput'); var _NumberInput2 = _interopRequireDefault(_NumberInput); var _DateTimeInput = require('../components/input/DateTimeInput'); var _DateTimeInput2 = _interopRequireDefault(_DateTimeInput); var _AssetDropzoneInput = require('../components/input/AssetDropzoneInput'); var _AssetDropzoneInput2 = _interopRequireDefault(_AssetDropzoneInput); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var switchKeys = ['enabled', 'published', 'visible']; var protectedEditProperties = ['created', 'modified']; var AssetDropzoneInputMultiple = function AssetDropzoneInputMultiple(props) { return _react2.default.createElement(_AssetDropzoneInput2.default, _extends({}, props, { multiple: true, extensions: '*', type: 'file' })); }; /** * Takes schema column and returns appropriate Field input Component * @param {Array} associations - Array objects for associations * @param {Object} column - Oject for current column schema, contains keys: property, type, className * @param {String} column.property * @param {String} column.type * @param {String} column.className * @return {React.Component} - Returns React Component corresponding to column schema, otherwise returns undefined */ function resolveFieldInputFromColumn() { var associations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var column = arguments[1]; // We do this in case schema wasn't processed by getSchemaWithAssociations, e.g. if generated directly from AutoEdit var associationKeys = getAssociationKeyedClasses(associations); var association = column.property in associationKeys ? associations.filter(function (assoc) { return assoc.property == column.property; })[0] : null; if (association) { switch (association.className) { case 'Tank.Assets': if (association.type == 'belongsToMany') return AssetDropzoneInputMultiple; return _AssetDropzoneInput2.default; break; } } if (column.type == 'boolean') { return switchKeys.indexOf(column.property) >= 0 ? _SwitchInput2.default : _Checkbox2.default; } if (column.type == 'text') { return _Redactor2.default; } if (column.type == 'string' && column.length > 255) { return _TextareaInput2.default; } if (column.type == 'datetime') { return _DateTimeInput2.default; } if (column.type == 'decimal' || column.type == 'float' || column.type == 'integer') { var step = 1 / Math.pow(10, column.precision || 0); var min = column.unsigned ? 0 : undefined; return function (props) { return _react2.default.createElement(_NumberInput2.default, _extends({}, props, { step: step, min: min })); }; } return undefined; } /** * Takes associations and returns a keyed array of foreignKey: className * @param {Array} associations * @return {Object} */ function getAssociationKeyedClasses(associations) { var associationKeys = {}; for (var _iterator = associations, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref; if (_isArray) { if (_i >= _iterator.length) break; _ref = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref = _i.value; } var association = _ref; associationKeys[association.property] = association.className; }return associationKeys; } /** * Takes schema array and filters out typically uneditable things pertaining to table view e.g. _owner etc. * @param {Object[]} schema - Array of ojects for schema columns, contains keys: autoIncrement, default, property * @param {String} schema[].autoIncrement * @param {String} schema[].default * @param {String} schema[].property * @return {Object[]} - Returns filtered schema array */ function filterOutProtectedSchema(schema) { var ignoreList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; return schema.filter(function (column) { return !(column.property.charAt(0) == '_') || ~ignoreList.indexOf(column.property); }); } /** * Takes schema array and filters out typically uneditable things pertaining to edit view e.g. auto incrementing columns, columns with default set to 'CURRENT_TIMESTAMP' etc. * @param {Object[]} schema - Array of ojects for schema columns, contains keys: autoIncrement, default, property * @param {String} schema[].autoIncrement * @param {String} schema[].default * @param {String} schema[].property * @return {Object[]} - Returns filtered schema array */ function filterOutProtectedEditSchema(schema) { var protectedProperties = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : protectedEditProperties; return filterOutProtectedSchema(schema).filter(function (column) { return !(column.autoIncrement || column.default == 'CURRENT_TIMESTAMP' || ~protectedProperties.indexOf(column.property)); }); } /** * Takes associations and schema and filters out schema columns that are present in associations * @param {Object[]} associations Array of objects for associations * @param {String} associations[].className e.g. 'Model' * @param {String} associations[].foreignKey e.g. 'model_id' * @param {Object[]} schema Array of objects for schema columns * @param {String} schema[].property e.g. 'model_id' * @return {Object[]} Returns filtered schema */ function removeAssocationsFromSchema() { var associations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var schema = arguments[1]; var associationKeys = {}; var associationSchemaKeys = {}; for (var _iterator2 = associations, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref2; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref2 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref2 = _i2.value; } var association = _ref2; associationKeys[association.property] = association.className; associationSchemaKeys[association.property] = association.schema ? association.schema.map(function (item) { return item.property; }) : null; } return schema.filter(function (column) { return ( // automatically allow any field that's not linked to an association (or is a tank asset) !(column.property in associationKeys && associationKeys[column.property] != 'Tank.Assets') || // otherwise check if the field is an association, // and if the association has schema, // and that the schema has a title or name field (as this can be rendered by FixedDataTableTextCell) column.property in associationKeys || associationSchemaKeys[column.property] && (associationSchemaKeys[column.property].indexOf('title') >= 0 || associationSchemaKeys[column.property].indexOf('name') >= 0) ); }); } /** * Takes schema array and panel object and filters the schema to only contain the properties defined in panel object * @param {Object[]} schema - Array of ojects for schema columns * @param {String} schema[].property * @param {Object} panel * @param {String[]} panel.properties * @return {Array} - Returns filtered schema array */ function filterSchemaByPanel(schema, panel) { return schema.filter(function (column) { return (panel.properties || []).indexOf(column.property) >= 0; }); } /** * Takes schema array and array of panels and filters schema to exclude properties definied in panel objects * @param {Array} schema - Array of ojects for schema columns, contains keys: property * @param {String} schema[].property * @param {Object[]} panels - Array of panel objects, contains keys: title, properties * @param {String} panels[].title * @param {String[]} panels[].properties * @return {Array} - Returns filtered schema array */ function filterSchemaExcludingPanels(schema, panels) { var excludeProperties = panels.reduce(function (acc, panel) { return acc.concat(panel.properties); }, []); return schema.filter(function (column) { return excludeProperties.indexOf(column.property) < 0; }); } /** * Filters an array of objects by a key (default 'property') with an array of a regex rules * @param {Object[]} array Array to filter * @param {Array} patterns Array of regexes to match key against * @param {String} key (Optional) key to match against * @return {Object[]} Returns filtered array */ function filterArrayByKeyPatterns(array, patterns) { var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'property'; return array.filter(function (column) { for (var _iterator3 = patterns, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref3; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref3 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref3 = _i3.value; } var pattern = _ref3; if (!!column[key].match(pattern)) return false; } return true; }); } /** * Takes schema and associations arrays and combines them into one schema, takes into account belongsToMany and belongsTo associations * @param {Object[]} schema - Array of ojects for schema columns, contains keys: property, title, type * @param {String} schema[].property * @param {String} schema[].title * @param {String} schema[].type * @param {Object[]} associations - Array of association objects to merge in with schema * @param {String} associations[].type - hasOne, belongsTo, belongsToMany * @param {String} associations[].foreignKey * @param {String} associations[].property * @param {String} associations[].title * @param {String} associations[].className * @return {Object[]} - Returns new schema array */ function getSchemaWithAssociations(schema, associations) { var newSchema = [].concat(schema); associations.map(function (association) { var schemaProperties = newSchema.map(function (column) { return column.property; }); if (schemaProperties.indexOf(association.property) < 0) { if (association.type == 'belongsToMany') { newSchema.push({ property: association.property, title: association.name, className: association.className, type: 'json' }); } else if (association.type == 'belongsTo') { newSchema.map(function (column) { if (association.foreignKey == column.property) { column.property = association.property; column.title = association.name; column.className = association.className; } return column; }); } else if (association.type == 'hasOne') { newSchema.push({ property: association.property, title: association.name, className: association.className, type: 'json' }); } else if (association.type == 'hasMany') { newSchema.push({ property: association.property, title: association.name, className: association.className, type: 'json' }); } } }); return newSchema; } /** * Takes an array and maps it into a text, value object for select fields * @param {String[]} values * @return {Object[]} */ function optionsList(values) { return values.map(function (value) { return { text: value, value: value }; }); }