// Domain targeting app // =============================================== // Takes in data obj, an element to append to, and utility functions // // Data set: // - listIds []string // - banned []string // - targeted []string // // Example data: // { // "listIds": [1, 3, 5], // "banned": [ // "likes.com" // ], // "targeted": [ // "google.com" // ] // } // // Utility functions used: // - refreshSidePanel // var domainTargeting = (function(){ 'use strict' var domainListLimit = 15, template = getTemplate(), newLines = /\r\n|\n|\r/; return newDomainTargeting; function newDomainTargeting(d, t, fns){ return new DomainTargeting(d, t, fns); } function DomainTargeting(d, t, fns) { var hasLists = !!(fns.data.domainList && fns.data.domainList.length), events = new EventManager, e = getElementFromString(template, new TmplData(d.targeted, d.banned, fns.data.domainList, fns.getAppName('domainTargeting'))), eles = new Elements(e, { 'view' : { 'selector' : '.view' }, 'tgtd' : { 'selector' : '.targeted' }, 'bnd' : { 'selector' : '.banned' }, 'lists' : { 'selector' : '.domainLists' }, 'select' : {}, 'status': {}, "remove" : { 'target' : new ConfirmationButton(e.querySelector('.remove'), { 'text' : 'Remove app', 'noClass' : true, 'confirmText' : 'Confirm?' }, removeAction) }, }); if(hasLists) { eles.select = new MultiSelect(eles.lists.querySelector('div'), updateDomainLists, {selected: d.listIds}); } else { eles.lists.classList.add('noDisplay'); } eles.status = new ToggleInput(e.querySelector('.toggle'), updateStatus, { 'initialValue' : isSelected(d) }); eles.tgtd.value = isArray(d.targeted) ? d.targeted.join('\n') + '\n' : ''; eles.bnd.value = isArray(d.banned) ? d.banned.join('\n') + '\n' : ''; events.add(eles.tgtd, 'keyup', checkNewLine(updateTargetedDomains)); events.add(eles.bnd, 'keyup', checkNewLine(updateBannedDomains)); events.add(eles.tgtd, 'change', updateTargetedDomains); events.add(eles.bnd, 'change', updateBannedDomains); t.appendChild(e); this.exit = exit; function updateStatus(e) { if(e) { eles.view.classList.remove('noDisplay'); if(hasLists) { eles.lists.classList.remove('noDisplay'); } } else { eles.view.classList.add('noDisplay'); eles.lists.classList.add('noDisplay'); eles.tgtd.value = eles.bnd.value = ''; d.targeted = d.banned = d.listIds = undefined; } } function updateTargetedDomains(e){ if(!cleanUpDomains(e)) return; d.targeted = e.target.value.split(newLines); if(!!fns && !!fns.refreshSidePanel){ fns.refreshSidePanel(); } } function updateBannedDomains(e){ if(!cleanUpDomains(e)) return; d.banned = e.target.value.split(newLines); if(!!fns && !!fns.refreshSidePanel){ fns.refreshSidePanel(); } } function updateDomainLists(e, ms) { var o = [], v = ms.getSelected(); for(var i = 0; i < v.length; i++) { o.push(v[i].value); } d.listIds = o; } function removeAction(e){ fns.removeApp('domainTargeting'); } function exit(){ removeChild(t, e); if(!!events) events.reset(); if(!!eles) eles.exit(); housekeeping(); } function housekeeping(){ hasLists = e = eles = events = null; } function cleanUpDomains(e) { if (!e.target && !e.target.value) return ''; var val = e.target.value.split(newLines).map(function(v) { return v.replace(/^(?:\w+:\/\/)?([^/]+).*$/g, '$1'); }).filter(function(v){ return v; }), overLimit = val.length > domainListLimit; if(overLimit) { val = val.slice(0, domainListLimit); fns.setError('Too many domains added. Please create a list if you require ' + domainListLimit + ' or more domains.'); } e.target.value = val.join('\n'); return !overLimit; } } function TmplData(td, bd, dl, name){ this.targeted = !!td ? td.join("\n") : ""; this.banned = !!bd ? bd.join("\n") : ""; this.domainList = !!dl ? dl : []; this.name = name; } function getTemplate(){ var note = 'A list (one per line) of domains you only want ', lists = '
', sl = '

Saved lists:

' + lists + '
', tdta = '', td = '

Targeted Domains: *

' + tdta + '
', bdta = '', bd = '

Banned Domains: *

' + bdta + '
', limit = '

* only up to ' + domainListLimit + ' domains allowed, please create a list if you require more.

', rem = '
', togg = '
'; return '

{{ name }}:

' + togg + rem + '
' + td + bd + limit + sl + '
'; } function checkNewLine(cb){ return function(e) { if (e.keyCode === 13 && !e.shiftKey) { cb(e); e.target.value += '\n'; } }; } function isSelected(d){ return !!(d.targeted && d.targeted.length) || !!(d.banned && d.banned.length) || !!(d.listIds && d.listIds.length); } })();