@bigfishtv/cockpit
Version:
344 lines (296 loc) • 13.6 kB
JavaScript
;
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 };
});
}