mongoose-to-ui-grid
Version:
Mongoose plugin to map mongoose schema to ui-grid columns definition
92 lines (75 loc) • 2.53 kB
JavaScript
;
var _ = require('lodash');
var MongooseSchemaUtils = require('mongoose-schema-utils');
module.exports = function (schema) {
var utils = new MongooseSchemaUtils(schema);
var columns = [];
_.each(utils.flatSchema, function(schema, path){
if (schema.uiGrid || path === '_id'){
var obj = _.merge({field: path}, schema);
var uiGrid = schema.uiGrid;
//delete obj.uiGrid;
if (path === '_id'){
obj.visible = false;
}
if (schema.ref) {
uiGrid = Array.isArray(uiGrid) ? uiGrid : [uiGrid];
_.forEach(uiGrid, function(uig){
var p = [obj.field, uig.field].join('.');
var o = _.merge({},obj, uig, {field: p, refField: obj.field});
columns.push(o);
});
return ;
}
_.merge(obj, uiGrid);
columns.push(obj);
}
});
columns = _.sortBy(columns, 'order');
function toColumnsSchema(config){
var filteredColumns = filterColumns(columns, config);
return _.select(filteredColumns, function(col){ return col.isCollumn !== false;});
}
function getUiGridColumnsProjection(config){
var filteredColumns = filterColumns(columns, config);
return _.map(filteredColumns, function (c){ return c.refField || c.field; })
.join(' ');
}
function populateUiGridColumns (mq, config){
var filteredColumns = filterColumns(columns, config);
_.each(filteredColumns, function(schema){
if (schema.ref){
var uig = Array.isArray(schema.uiGrid) ? schema.uiGrid : [schema.uiGrid];
var fields = _.pluck(uig, 'field').join(' ');
mq.populate(schema.refField, fields);
}
});
return mq;
}
function filterColumns(columns, options){
if (!options || !options.choose){
return columns;
}
return _.select(columns, function(el) {
// always include _id field
if (el.field === '_id'){
return true;
}
// always include fields without filter
if (typeof el.enabled === 'undefined'){
return true;
}
if (el.enabled === false){
return false;
}
// filter out
return Array.isArray(el.enabled) ?
el.enabled.indexOf(options.choose) !== -1 :
el.enabled === options.choose;
});
}
schema.statics.populateUiGridColumns = populateUiGridColumns;
schema.statics.getUiGridColumnProjection = getUiGridColumnsProjection;
schema.statics.getUiGridColumnDefinition = toColumnsSchema;
schema._uiGridProjection = toColumnsSchema();
};