ui/js/coffee/widget_affiliations.coffee (172 lines of code) (raw):

tagList = {} affiliation = (json, state) -> obj = mk('div') groups = [] for group, members of json.groups groups.push(group) groups.sort((a,b) => json.groups[b].length - json.groups[a].length) h3 = mk('h3') ngroups = groups.length if '_untagged' in groups ngroups-- app(h3, txt("Found " + ngroups + " organisations/companies:")) app(obj, h3) btn = mk('input') set(btn, 'type', 'button') set(btn, 'class', 'btn btn-info') set(btn, 'value', 'Group wizard') set(btn, 'widget', state.widget.id) btn.addEventListener("click", () -> w = findWidget(this.getAttribute('widget')) w.args.eargs = { autogroup: true } w.callback = affiliationWizard w.reload() ) p = mk('p') app(p, txt("You may use the ")) app(p, btn) app(p, txt(" to quickly group people into companies etc.")) app(obj, p) p = mk('p') app(p, txt("NOTE: For certain charts (evolutions etc), only the 30 largest groups will be shown due to computational optimisations.")) app(obj, p) for group in groups groupname = group.split(/\./)[0].replace(/^([a-z])/, (a) => a.toUpperCase()) if group == '_untagged' groupname = "People with no current affiliation" h4 = mk('h4') app(h4, txt(groupname + ": " + json.groups[group].length + " members")) h4.style.fontSize = "14pt" h4.setAttribute("onclick", "var a = get('people_" + group + "'); a.style.display = (a.style.display == 'block') ? 'none' : 'block';") h4.style.display = "inline-block" h4.style.cursor = 'se-resize' app(obj, h4) app(obj, mk('br')) gdiv = mk('div') gdiv.setAttribute("id", "people_" + group) gdiv.style.border = "1px solid #999" gdiv.style.display = "none" for person in json.groups[group] pdiv = mk('div') set(pdiv, 'id', 'tag_' + group + '_' + person.id) app(pdiv, txt(person.name + " - <" + person.email + "> - ")) a = mk('a') set(a, 'href', 'javascript:void(0);') set(a, 'onclick', "this.parentNode.parentNode.removeChild(this.parentNode); js = { untag: {} }; js.untag['" + person.id + "'] = '" + group + "'; postJSON('/api/2/affiliations', js, null, null, null);") app(a, txt("Remove from group")) app(pdiv, a) app(gdiv, pdiv) app(obj,gdiv) state.widget.inject(obj, true) affiliationWizard = (json, state) -> obj = mk('div') groups = [] for group, members of json.groups groups.push(group) groups.sort((a,b) => json.groups[b].length - json.groups[a].length) h3 = mk('h3') app(h3, txt("Found " + groups.length + " possible organisations/companies:")) app(obj, h3) p = mk('p') app(p, txt("Select a group or individuals within it to tag them as belonging to that group.")) app(obj, p) for group in groups groupname = group.split(/\./)[0].replace(/^([a-z])/, (a) => a.toUpperCase()) h4 = mk('h4') app(h4, txt(groupname + ": " + json.groups[group].length + " members")) h4.style.fontSize = "14pt" h4.setAttribute("onclick", "var a = get('people_" + group + "'); a.style.display = (a.style.display == 'block') ? 'none' : 'block';") id = Math.floor(Math.random() * 987654321).toString(16) chk = document.createElement('input') chk.setAttribute("type", "checkbox") chk.setAttribute("id", group) chk.style.marginLeft = '10px' chk.style.color = "#090" chk.style.fontSize = "16pt" chk.setAttribute("class", "f") chk.addEventListener("change", () -> group = this.getAttribute('id') for person in json.groups[group] chk = get('tag_' + person.id) chk.checked = this.checked ) app(obj, chk) h4.style.display = "inline-block" h4.style.cursor = 'se-resize' app(obj, h4) app(obj, mk('br')) gdiv = mk('div') gdiv.setAttribute("id", "people_" + group) gdiv.style.border = "1px solid #999" gdiv.style.display = "none" for person in json.groups[group] chk = document.createElement('input') chk.setAttribute("type", "checkbox") chk.setAttribute("id", 'tag_' + person.id) chk.setAttribute("pid", person.id) chk.setAttribute("value", group) chk.style.marginLeft = '10px' chk.style.color = "#369" chk.style.fontSize = "10pt" label = document.createElement('label') label.setAttribute("for", 'tag_' + person.id) label.setAttribute("title", "Check this box to tag this person as affiliated with " + groupname) chk.setAttribute("title", "Check this box to tag this person as affiliated with " + groupname) label.style.paddingLeft = '5px' label.appendChild(document.createTextNode(person.name + " - <" + person.email + ">")) app(gdiv, chk) app(gdiv, label) a = mk('a') set(a, 'href', 'javascript:void(affiliate("' + person.id + '"));') app(a, txt("Set a tag")) app(gdiv, txt(" - ")) app(gdiv, a) sp = mk('span') set(sp, 'id', 'tags_' + person.id) app(gdiv, sp) app(gdiv, mk('br')) app(obj,gdiv) btn = mk('input') set(btn, 'type', 'button') set(btn, 'class', 'btn btn-info') set(btn, 'value', 'Save changes') set(btn, 'widget', state.widget.id) btn.addEventListener("click", () -> w = findWidget(this.getAttribute('widget')) tagList = {} $( "[type=checkbox]" ).each( () -> pid = $(this).attr('pid') val = $(this).attr('value') if (pid and pid.length > 0 and ($(this).attr('checked') or $(this).is(':checked'))) tagList[pid] = val ) w.args.eargs = { tag: tagList } w.callback = affiliation w.reload() ) app(obj, btn) state.widget.inject(obj, true) affiliate = (hash) -> tag = window.prompt("Please enter the tag with which you wish to associate this source, or type nothing to untag.") if tag == "" tag = null tr = get('tags_' + hash) tags = {} tags[hash] = tag if tag postJSON('affiliations', { tag: tags }, null, null) app(tr, txt("(Tagged as: " + tag + ") ")) altemail = (hash) -> tag = window.prompt("Please enter the alt email with which you wish to associate this source, or type nothing to clear alts.") if tag == "" tag = null tr = get('tags_' + hash) tags = {} tags[hash] = tag if tag postJSON('affiliations', { altemail: tags }, null, null) app(tr, txt("(Affiliated as: " + tag + ") "))