diff --git a/config/default.toml b/config/default.toml index 7b48fb7b..91ca2f30 100644 --- a/config/default.toml +++ b/config/default.toml @@ -204,6 +204,9 @@ statuscolored=false # Alternative directory containing the files geoip-country.dat and geoip-country6.dat datadirectory=false +[search] +inhiddenfields=true + [reports] # The whole reporting functionality can be disabled below if the they are not needed and the DB cannot be # properly protected. diff --git a/lib/models/subscriptions.js b/lib/models/subscriptions.js index 3a9a7f58..f0a62db6 100644 --- a/lib/models/subscriptions.js +++ b/lib/models/subscriptions.js @@ -71,7 +71,7 @@ module.exports.listTestUsers = (listId, callback) => { }); }; -module.exports.filter = (listId, request, columns, segmentId, callback) => { +module.exports.filter = (listId, request, columns, segmentId, searchFields, callback) => { listId = Number(listId) || 0; segmentId = Number(segmentId) || 0; @@ -85,10 +85,10 @@ module.exports.filter = (listId, request, columns, segmentId, callback) => { return callback(err); } - tableHelpers.filter('subscription__' + listId, ['*'], request, columns, ['email', 'first_name', 'last_name'], 'email ASC', queryData, callback); + tableHelpers.filter('subscription__' + listId, ['*'], request, columns, searchFields, 'email ASC', queryData, callback); }); } else { - tableHelpers.filter('subscription__' + listId, ['*'], request, columns, ['email', 'first_name', 'last_name'], 'email ASC', null, callback); + tableHelpers.filter('subscription__' + listId, ['*'], request, columns, searchFields, 'email ASC', null, callback); } }; diff --git a/routes/lists.js b/routes/lists.js index 4247afb3..59230211 100644 --- a/routes/lists.js +++ b/routes/lists.js @@ -190,8 +190,25 @@ router.post('/ajax/:id', (req, res) => { } let columns = ['#', 'email', 'first_name', 'last_name'].concat(fieldList.filter(field => field.visible).map(field => field.column)).concat(['status', 'created']); + let searchFields = ['email', 'first_name', 'last_name']; - subscriptions.filter(list.id, req.body, columns, req.query.segment, (err, data, total, filteredTotal) => { + if (('search' in req.body) && req.body.search.value) { + const search = req.body.search.value.toLowerCase(); + const statusTypes = ['subscribed', 'unsubscribed', 'bounced', 'complained']; + + if (statusTypes.includes(search)) { + searchFields = ['status']; + req.body.search.value = String(statusTypes.indexOf(search) + 1); + } else if (fieldList.length) { + const searcheableTypes = ['text', 'longtext', 'website'].concat(/^[0-9]+$/.test(search) ? ['number'] : []); + let additionalSearchFields = fieldList.filter(field => { + return ((searcheableTypes.indexOf(field.type) > -1) && (config.search.inhiddenfields ? true : field.visible)); + }).map(field => field.column); + searchFields = searchFields.concat(additionalSearchFields); + } + } + + subscriptions.filter(list.id, req.body, columns, req.query.segment, searchFields, (err, data, total, filteredTotal) => { if (err) { return res.json({ error: err.message || err, diff --git a/views/lists/view.hbs b/views/lists/view.hbs index f3abf642..197f41f3 100644 --- a/views/lists/view.hbs +++ b/views/lists/view.hbs @@ -205,9 +205,9 @@ {{/if}} -{{#if statusColored }} -{{/if}} \ No newline at end of file + + + {{!--
--}} \ No newline at end of file