UNPKG

sails-generate-forestay

Version:

Build dynamic user interfaces quickly and easily! Use the forestay generator to scaffold complete CRUD interfaces using just your SailsJS model attributes.

227 lines (213 loc) 11 kB
const path = require('path') const viewBase = path.join(__dirname, '../..', 'views', 'forestay') const defaultLayout = viewBase + '/layout.ejs' var helpers = require("./../helpers/helpers") module.exports = function(forestay, req, res) { var filter = {} var criteria = {} var ORparams = [] var modelName, hideInIndex, hideFilter, filterable forestay.hasFilters = false /* global search */ var searchable = _.get(forestay.config.forestay.index, ['searchable']) ? _.get(forestay.config.forestay.index, ['searchable']) : false; var forstaySearchGlobal = ''; if (typeof _.get(req.query, ['forstaySearchGlobal']) !== 'undefined' && _.get(req.query, ['forstaySearchGlobal']) !== '') { var forstaySearchGlobal = _.get(req.query, ['forstaySearchGlobal']) } forestay.forstaySearchGlobal = forstaySearchGlobal Object.keys(forestay.config.attributes).forEach(function(attrKey) { hideInIndex = _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideInIndex']) ? _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideInIndex']) : false; hideFilter = _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideFilter']) ? _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideFilter']) : false; filterable = _.get(forestay.config.attributes[attrKey], ['meta','forestay','filterable']) ? _.get(forestay.config.attributes[attrKey], ['meta','forestay','filterable']) : false; if(hideInIndex === false && hideFilter === false && filterable === true) { forestay.hasFilters = true if (typeof _.get(req.query, [attrKey]) !== 'undefined' && _.get(req.query, [attrKey]) !== '') { filter[attrKey] = req.query[attrKey] if (_.get(forestay.config.attributes[attrKey], ['type']) === "string") { criteria[attrKey] = { 'contains': req.query[attrKey] } } else { criteria[attrKey] = req.query[attrKey] } } } /* search global */ if (searchable == true && forstaySearchGlobal !== '') { var dataType = _.get(forestay.config.attributes[attrKey], ['type']); var searchInputIsNumber = /\d/.test(forstaySearchGlobal); if(dataType == "string") { ORparams.push({ [attrKey]: { 'contains': forstaySearchGlobal } }) } else if(searchInputIsNumber && dataType == "number") { ORparams.push({ [attrKey]: forstaySearchGlobal }) } else if(_.get(forestay.config.attributes[attrKey], ['model'])) { if(_.get(forestay.config.attributes[attrKey], ['meta','forestay','populateBy'])) { modelName = sails.models[_.get(forestay.config.attributes[attrKey], ['model']).toLowerCase()]; var populateBy = _.get(forestay.config.attributes[attrKey], ['meta','forestay','populateBy']) modelName.find({select: ['id', populateBy]}).where({[populateBy]: { 'contains': forstaySearchGlobal }}).exec(function(err, r) { var inIds = [] if (err) return res.serverError(err) for(key in r){ inIds.push(r[key].id) } ORparams.push({ [attrKey]: { in: inIds} }) }); } } } }) if (_.get(forestay.config.forestay.index, ['filterLogicalOperator']) === 'or' && Object.keys(filter).length > 0) { var f = { or: [] } var obj Object.keys(filter).forEach(function(filterKey, i) { obj = {} obj[filterKey] = filter[filterKey] f.or.push(obj) }) filter = f } if (typeof _.get(forestay.config.forestay.index, 'filterOverride') === 'object') { filter = forestay.config.forestay.index.filterOverride.where } /* filter by available options of model or collections */ Object.keys(forestay.config.attributes).forEach(function(attrKey) { if(_.get(forestay.config.attributes[attrKey], ['model'])) { modelName = sails.models[_.get(forestay.config.attributes[attrKey], ['model']).toLowerCase()]; hideInIndex = _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideInIndex']) ? _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideInIndex']) : false; hideFilter = _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideFilter']) ? _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideFilter']) : false; filterable = _.get(forestay.config.attributes[attrKey], ['meta','forestay','filterable']) ? _.get(forestay.config.attributes[attrKey], ['meta','forestay','filterable']) : false; if(hideInIndex === false && hideFilter === false && filterable === true) { forestay.hasFilters = true if(_.get(forestay.config.attributes[attrKey], ['meta','forestay','populateBy'])) { var populateBy = _.get(forestay.config.attributes[attrKey], ['meta','forestay','populateBy']) modelName.find({select: ['id', populateBy]}).exec(function(err, r) { if (err) return res.serverError(err) forestay.config.attributes[attrKey].availableValues = r }); } else { modelName.find().exec(function(err, r) { if (err) return res.serverError(err) forestay.config.attributes[attrKey].availableValues = r }); } } } else if(_.get(forestay.config.attributes[attrKey], ['collection'])) { // var modelCollectionName = _.get(forestay.config.attributes[attrKey], ['collection']).toLowerCase() // modelName = sails.models[modelCollectionName]; // modelName.find().exec(function(err, r) { // if (err) return res.serverError(err) // forestay.config.attributes[attrKey].availableValues = r // }); } }) // list all items of users that have no association (null) if (typeof _.get(req.query, ['assignedUser']) !== 'undefined' && _.get(req.query, ['assignedUser']) !== '' && _.get(req.query,['assignedUser']) == '-1') criteria.assignedUser = null; criteria = Object.assign(criteria, filter); var query_count = forestay.model.count(criteria) if (searchable == true && forstaySearchGlobal !== '' && ORparams.length > 0) { query_count = query_count.where({'or':ORparams}); } query_count.exec(function countCB(error, total_records) { var number_of_pages = Math.ceil(total_records / forestay.config.forestay.index.itemsPerPage); var pg = 1; var skip = 0; var queryString = ""; if (req.query.pg && !isNaN(req.query.pg) && req.query.pg > 0) { pg = req.query.pg; if (pg > number_of_pages) { pg = 1; } else if (pg <= number_of_pages) { var skip = 0; skip = (pg - 1) * forestay.config.forestay.index.itemsPerPage; } delete req.query.pg } if (Object.keys(req.query).length > 0) { queryString = '&' + Object.keys(req.query).map(key => key + '=' + req.query[key]).join('&'); } else { queryString = ""; } forestay.filter = filter var sort = ""; if (_.get(forestay.config.forestay.index, ['defaultSort', 'attribute'])) { var sort_method = "ASC"; if (_.get(forestay.config.forestay.index, ['defaultSort', 'method'])) { sort_method = forestay.config.forestay.index.defaultSort.method } sort = forestay.config.forestay.index.defaultSort.attribute + " " + sort_method; } /* if property sortable is true */ if (typeof _.get(req.query, ['forstaySortBy']) !== 'undefined' && _.get(req.query, ['forstaySortBy']) !== '') { sort = _.get(req.query, ['forstaySortBy']); } /* search global */ if (searchable == true && forstaySearchGlobal !== '' && ORparams.length > 0) { var query = forestay.model.find().where({'or':ORparams}).limit(forestay.config.forestay.index.itemsPerPage); } else { var query = forestay.model.find(criteria).limit(forestay.config.forestay.index.itemsPerPage); } if (skip > 0) { query.skip(skip); } if (sort != "") { query.sort(sort); } Object.keys(forestay.config.attributes).forEach(function(attrKey) { if(_.get(forestay.config.attributes[attrKey], ['model']) || _.get(forestay.config.attributes[attrKey], ['collection'])) { hideInIndex = _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideInIndex']) ? _.get(forestay.config.attributes[attrKey], ['meta','forestay','hideInIndex']) : false; if(hideInIndex === false) { if(_.get(forestay.config.attributes[attrKey], ['model'])) { query.populate(attrKey); } else if(_.get(forestay.config.attributes[attrKey], ['collection'])) { query.populate(attrKey,{limit:10}); } } } }) query.exec(function(err, records) { if (err) return res.serverError(err) var moment = require('moment') forestay.records = records helpers.replaceIndexRowHtmlRows(req, res, forestay, function(forestay) { helpers.configureIndexActions(forestay, function(forestay) { if (typeof _.get(forestay.config.forestay, ['index', 'beforeRender']) === 'function') { forestay.config.forestay.index.beforeRender(req, res, forestay, function(err, forestay) { if (err) return res.serverError(err) res.view(viewBase + '/index.ejs', { layout: _.get(forestay.localConfig, ['defaultLayout']) || defaultLayout, forestay, moment, total_records, number_of_pages, pg, queryString }) }) } else { res.view(viewBase + '/index.ejs', { layout: _.get(forestay.localConfig, ['defaultLayout']) || defaultLayout, forestay, moment, total_records, number_of_pages, pg, queryString }) } }) }) }) }) }