function DomainLists(core, target, data, returnCB) { 'use strict'; var events = new EventManager(), template = new DomainListsTemplate(), element = getElementFromString(render(template.index, null)), newLines = /\r\n|\n|\r/, elements, table; this.exit = exit; updateLists(init); function init(error, d){ setElements(); initHeader(); if(returnCB) returnCB(); target.appendChild(element); } function setElements(){ elements = new Elements(element, { 'add' : { 'selector' : '.addButton' }, 'edit' : { 'selector' : '.editButton' }, 'del' : {}, 'fresh' : {}, 'actions' : {}, 'error' : {}, 'manageRow' : { 'selector' : '.manageRow' } }); } function initTable() { if (elements.fresh != null) removeFresh(); elements.actions = element.querySelector('actions'); table = NewMTable(element.querySelector('.manageTable'), data.table, tableUpdate); tableUpdate(); } function tableUpdate() { var sR = table.getSelectedRows(), l = sR.length, t = elements.actions, e = elements.edit; if (l > 0) { t.className = ''; if(l > 1) { e.classList.add('noDisplay'); } else { e.classList.remove('noDisplay'); } } else { t.className = 'disabled'; } } function initHeader(){ element.del = new ConfirmationButton(element.querySelector('.delete'), { 'color' : 'hot', 'text' : 'Delete', 'className' : 'tidySmall', 'confirmColor' : 'mist', 'confirmText' : 'Confirm?' }, delLists) events.add(elements.add, 'click', function(e) { e.preventDefault(); createOrEdit(); }); events.add(elements.edit, 'click', function(e) { e.preventDefault(); createOrEdit(table.getSelectedRows()[0].getData()); }); } function DomainList(dl) { dl = dl || {}; this.id = dl.id; this.name = dl.name; this.banned = dl.banned || []; this.targeted = dl.targeted || []; this.type = !this.banned.length ? 'Whitelist' : 'Blacklist'; this.domainsLen = this.banned.length + this.targeted.length; this.bannedString = isArray(this.banned) ? this.banned.join('\n') : null; this.targetedString = isArray(this.targeted) ? this.targeted.join('\n') : null; } function getDataObj(o){ var d = domainListsDummyData(), dl = o.domainLists || {}; for(var k in dl) { d.table.rows.push(new DomainList(dl[k])); } d.table.rows.sort(function(a, b) { return a.id < b.id ? -1 : 1; }); return d; } function createOrEdit(dl) { var dl = new DomainList(dl), typeSelect, isWhitelist = dl.type === 'Whitelist', domainsString = isWhitelist ? dl.targetedString : dl.bannedString; new AlertModal({ 'title': (!!dl.id ? 'Edit' : 'Create') + ' List', 'message': render(template.edit, dl), 'actionOne': 'Cancel', 'actionTwo': 'Save' }, function(v, e) { if(typeSelect) typeSelect.exit(); if(!v) return; if(!domainsString || !domainsString.length) return core.notifications.setError("Oops, the list can't be empty."); dl.targetedString = dl.bannedString = dl.banned = dl.targeted = null; if(isWhitelist) { dl.targetedString = domainsString; } else { dl.bannedString = domainsString; } saveList(dl); }, setupCallbacks); function setupCallbacks(ele, events) { typeSelect = new ToggleNavigation(ele.querySelector('.type'), { 'data': [{'value': 'Whitelist'}, {'value': 'Blacklist'}], 'className': 'toggle', 'initialValue': dl.type }, function(e) { isWhitelist = (e.value == 'Whitelist'); }); var domains = ele.querySelector('.domains'), name = ele.querySelector('.name'); events.add(domains, 'keyup', checkNewLine(updateDomains)); events.add(domains, 'change', updateDomains); events.add(name, 'change', function(e) { dl.name = e.target.value; }); } function updateDomains(e){ domainsString = cleanUpDomains(e); } } function saveList(dl) { if(dl.targetedString) dl.targeted = dl.targetedString.split(newLines); if(dl.bannedString) dl.banned = dl.bannedString.split(newLines); dl.targetedString = dl.bannedString = dl.type = dl.domainsLen = null; if(dl.id == null) { return apiRequest('POST', 'domainList', core.userID, dl, updateLists); } apiRequest('PUT', 'domainList', core.userID + '/' + dl.id, dl, updateLists); } function updateLists(cb_or_err) { if(!!cb_or_err && !!cb_or_err.error) { return core.notifications.setError(cb_or_err.error); } new ApiManager({ 'domainLists' : null }, core.userID, function(e, d) { if(typeof cb_or_err === 'function') cb_or_err(e,d); data = getDataObj(d); if(table) table.exit(); if(d.domainLists && Object.keys(d.domainLists).length > 0) { initTable(); } else { initFresh(); } }); } function delLists() { var rows = table.getSelectedRows(), cnt = rows.length, errors = ''; for(var i = 0; i < cnt; i++) { apiRequest('DELETE', 'domainList', core.userID + '/' + rows[i].getData().id, null, cb); } function cb(e) { if(!!e && e.error) errors += e.error + '\n'; if(--cnt === 0) { if(errors.length > 0) return core.notifications.setError(errors); updateLists(); } } } function initFresh(){ elements.fresh = getElementFromString(template.fresh); hideManage(); element.appendChild(elements.fresh); } function removeFresh(){ removeChild(element, elements.fresh); showManage(); elements.fresh = null; } function hideManage(){ elements.manageRow.classList.add('noDisplay'); } function showManage(){ elements.manageRow.classList.remove('noDisplay'); } function checkNewLine(cb){ return function(e) { if (e.keyCode === 13 && !e.shiftKey) { cb(e); e.target.value += '\n'; } }; } function cleanUpDomains(e) { if (!e.target && !e.target.value) return ''; e.target.value = e.target.value.split(newLines).map(function(v) { return v.replace(/^(?:\w+:\/\/)?([^/]+).*$/g, '$1'); }).filter(function(v){ return v; }).join('\n'); return e.target.value; } function exit(){ removeChild(target, element); if(events) events.reset(); if(table) table.exit(); if(elements) elements.exit(); housekeeping(); } function housekeeping(){ core = target = data = returnCB = events = template = element = table = data = elements = null; } }