var Segments = function (core, target, data, returnCB) { 'use strict'; const hotonID = '2635'; var createSegmentOptions = { 'data': [ { 'title': 'Create segment' }, { 'title': 'Geofence segment', 'href': '/dashboard/segments/proximity/create', 'value': 'proximity' }, { 'title': 'Retargeting segment', 'href': '/dashboard/segments/retargeting/create', 'value': 'retargeting' }, { 'title': 'IFA segment', 'href': '/dashboard/segments/ifa/create', 'value': 'ifa' }, ], 'options': { 'dropdownClass': 'cool', 'menuItemClass': 'cool', 'carrotClass': 'cool', 'staticMenu': true } }; var events = new EventManager, template = new SegmentsTemplate, rendered = render(template.index, null), element = getElementFromString(rendered), table = null, elements = null; var apiManager = getSegmentsList(init); this.exit = exit; this.search = search; function init(error, d) { if (!error) { data = getDataObj(d); setElements(); initHeader(); dataCheck(error, d.segmentsList); if (returnCB) returnCB(); insertElement(); } else if (error[0] == getAPIErrorMessage('notLoggedIn')) window.location.href = '/login'; } function search(v) { table.search('name', v.target.value); } function initDefault() { var buttonsObj = getSimpleJSONCopy(segmentsButtonObj); elements.actions = element.querySelector('actions'); elements.duplicate = new ConfirmationButton(elements.actions.querySelector('.duplicate'), buttonsObj.duplicate, duplicateAction); elements.del = new ConfirmationButton(elements.actions.querySelector('.delete'), buttonsObj.del, delAction); events.add(elements.view, 'click', viewAction); events.add(elements.edit, 'click', editAction); showManage(); initTable(); } function initHeader() { elements.header = new Dropdown(element.querySelector('header > div.createList'), createSegmentOptions, function (e) { ga('send', 'event', 'Segments', 'Create', getTitleFromValue(createSegmentOptions.data, e)); }); const showForecast = (core.isAdmin && !core.isManager) || core.agencyID === hotonID; if (showForecast) { const btn = getElementFromString('Geofence Forecast'); btn.addEventListener('click', (e) => { e.preventDefault(); pop('Pop', 'Geofence Forecast', '/segments/proximity/forecast'); }); element.querySelector('header > div.forecast').appendChild(btn); } } function getTitleFromValue(d, v) { for (var i = 0, l = d.length; i < l; i++) { if (d[i].value == v) return d[i].title; } return null; } function initFresh() { hideManage(); elements.fresh = getElementFromString(template.fresh); data.table.rows = []; element.appendChild(elements.fresh); } function initTable() { table = NewMTable(element.querySelector('.manageTable'), data.table, tableUpdate); tableUpdate(); } function insertElement() { target.appendChild(element); } function Segment(o, i, id, type) { this.id = id || o.segmentId; this.displayOrder = i + 1; this.lastVisitedBetween = o.lastVisitedBetween; this.name = o.name || o.label; this.previouslySpentBetween = o.previouslySpentBetween; this.targetConsumers = o.targetConsumers; this.uniqueUsers = o.uniqueUsers || 'N/A'; this.domain = o.domain; this.retention = o.retention; this.type = type; } function dataCheck(error, d) { if (!error && d !== null) { initDefault(); } else if ((error && error[0].error == getAPIErrorMessage('noMatch')) || d == null) { initFresh(); } } function getDataObj(o) { var d = getSimpleJSONCopy(segmentsDummyData); d.table.rows = getSegmentsData(o); return d; } function getSegmentsData(o) { var a = [], i = 0; forEach(o.segmentsList, rtgt); forEach(o.evegmentsList, evnt); forEach(o.kochava, koch); loop((o.ifaSegments || {}).data, ifaSeg); loop(o.proximityList.data, prox); return a; function rtgt(t, d) { var data = null; if (!!t.data) { data = t.data; } else { data = t; } var seg = new Segment(data, i++, t.id, 'retargeting'); a.push(seg); } function evnt(t, d) { var data = null; if (!!t.data) { data = t.data; } else { data = t; } var seg = new Segment(data, i++, t.id, 'event'); a.push(seg); } function prox(k, v) { var seg = new Segment(v, i++, k, 'proximity'); a.push(seg); } function ifaSeg(_, v) { var seg = new Segment(v, i++, v.id, 'ifa'); a.push(seg); } function koch(v) { v.uniqueUsers = v.count; var seg = new Segment(v, i++, v.id, 'kochava'); a.push(seg); } } function getSelectedID() { return table.getSelectedRows()[0].getData().id; } function getSelectedRow() { return table.getSelectedRows()[0].getData(); } function getIDArray(rows) { var a = []; for (var i = 0, l = rows.length; i < l; i++) { a[i] = rows[i].getData().id; } return a; } function setElements() { elements = new Elements(element, { 'edit': { 'selector': '.editButton' }, 'view': { 'selector': '.viewButton' }, 'del': {}, 'duplicate': {}, 'fresh': {} }); } function hideManage() { element.querySelector('.manageRow').classList.add('noDisplay'); } function showManage() { element.querySelector('.manageRow').classList.remove('noDisplay'); } function resetConfirmation() { elements.del.resetState(); elements.duplicate.resetState(); } function viewAction(e) { if (e && e.preventDefault) e.preventDefault(); var row = getSelectedRow(), id = row.id; ga('send', 'event', 'Segments', 'View', id); switch (row.type) { // TODO: Implement the other segment types case 'proximity': pop('Pop!', 'Event Segments - Edit', '/dashboard/segments/proximity/view/' + id); break; default: console.error('segment type (' + row.type + ') not currently supported'); } } function editAction(e) { if (e && e.preventDefault) e.preventDefault(); var row = getSelectedRow(), id = row.id; ga('send', 'event', 'Segments', 'Edit', id); switch (row.type) { case 'retargeting': pop('Pop!', 'Event Segments - Edit', '/dashboard/segments/retargeting/edit/' + id); break; case 'proximity': pop('Pop!', 'Event Segments - Edit', '/dashboard/segments/proximity/edit/' + id); break; case 'event': pop('Pop!', 'Event Segments - Edit', '/dashboard/segments/event/edit/' + id); break; case 'ifa': window['__ifa_seg_name'] = row.name; pop('Pop!', 'IFA Segments - Edit', '/dashboard/segments/ifa/edit/' + id); break; } } function delAction(e) { var rows = table.getSelectedRows(), meteoraRows = [], evegRows = [], // this is gonna get out of hand.. proxRows = [], ifaRows = [], count = 0; if (e && e.preventDefault) e.preventDefault(); ga('send', 'event', 'Segments', 'Delete', getIDArray(rows).join(', ')); rows.forEach(function (r) { var row = r.getData(); switch (row.type) { case 'retargeting': meteoraRows.push(r); break; case 'proximity': proxRows.push(r); break; case 'event': evegRows.push(r); break; case 'ifa': ifaRows.push(r); break; default: console.warn('unknown: ', row); } }); if (!!meteoraRows.length) { count++; new ApiMarketingDelete(core, data, { 'Segments': 'segments' }, meteoraRows, 'segments/retargeting', cb); } if (!!evegRows.length) { count++; new ApiMarketingDelete(core, data, { 'Evegments': 'segments' }, evegRows, 'evegments', cb); } if (!!proxRows.length) { count++; new ApiMarketingDelete(core, data, { 'PSegments': 'segments' }, proxRows, 'segments/proximity/byKey', cb); } if (!!ifaRows.length) { count++; new ApiMarketingDelete(core, data, { 'IFASegments': 'segments' }, ifaRows, 'segments/ifa', cb); } function cb(e) { count--; if (count === 0) { return updateActionCB(e); } updateErrorCheck(e); } } // TODO: this is still broken for evegments, rewrite at one point function duplicateAction(e) { var rows = table.getSelectedRows(); if (e && e.preventDefault) e.preventDefault(); ga('send', 'event', 'Segments', 'Duplicate', getIDArray(rows).join(', ')); new ApiDuplicate(data, rows, 'segments', core.userID, updateActionCB); } function updateActionCB(e) { updateErrorCheck(e); getSegmentsList(updateSegmentsList); } function updateErrorCheck(e) { for (var k in e) { if (isDefined(e[k]) && isDefined(e[k].error)) { new core.notifications.setError(e[k].error); return true; } } } function getSegmentsList(cb) { const obj = { 'segmentsList': null, 'proximityList': { 'source': 'segments/proximity/byOwner' }, 'evegmentsList': null, }; if (core.isAdmin || core.brand.name === 'Sito Mobile') { obj.kochava = { source: 'segments/kochava', noID: true, }; obj.ifaSegments = { source: 'ifaSegmentsList' }; } return new ApiManager(obj, core.userID, cb); } function updateSegmentsList(e, o) { data.table.rows = getSegmentsData(o, o.segmentReporting); refreshTable(); } function tableUpdate() { resetConfirmation(); var rows = table.getSelectedRows(), l = rows.length; if (l > 0) { elements.actions.className = ''; } else { elements.actions.className = 'disabled'; } if (l === 1) { if (rows[0].getData().type === 'proximity') { elements.view.style.display = ''; } elements.edit.style.display = ''; } else { elements.view.style.display = 'none'; elements.edit.style.display = 'none'; } } function refreshTable() { if (table) table.exit(); if (data.table.rows !== null && data.table.rows.length > 0) initTable(); else { removeTable(); initFresh(); } } function removeTable() { var mt = element.querySelector('.manageTable'), t = mt ? mt.querySelector('m-table') : null; if (mt && t) removeChild(mt, t); table = null; } function exit() { if (element) target.removeChild(element); if (apiManager) apiManager.abort(); if (elements) elements.exit(); if (events) events.reset(); if (table) table.exit(); housekeeping(); } function housekeeping() { core = target = data = returnCB = events = template = rendered = element = table = adGroups = data = elements = apiManager = null; } };