diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index cfa9af29..564fab4f 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -25,6 +25,7 @@ //= require ./src/views/room //= require ./src/JIT //= require ./src/Metamaps +//= require ./src/Metamaps.SynapseCard //= require ./src/Metamaps.Visualize //= require ./src/Metamaps.Util //= require ./src/Metamaps.Realtime diff --git a/app/assets/javascripts/src/Metamaps.SynapseCard.js b/app/assets/javascripts/src/Metamaps.SynapseCard.js new file mode 100644 index 00000000..f71601e5 --- /dev/null +++ b/app/assets/javascripts/src/Metamaps.SynapseCard.js @@ -0,0 +1,288 @@ +/* global Metamaps, $ */ + +/* + * Metamaps.SynapseCard.js + * + * Dependencies: + * - Metamaps.Active + * - Metamaps.Control + * - Metamaps.Mapper + * - Metamaps.Visualize + */ +Metamaps.SynapseCard = { + openSynapseCard: null, + showCard: function (edge, e) { + var self = Metamaps.SynapseCard + + // reset so we don't interfere with other edges, but first, save its x and y + var myX = $('#edit_synapse').css('left') + var myY = $('#edit_synapse').css('top') + $('#edit_synapse').remove() + + // so label is missing while editing + Metamaps.Control.deselectEdge(edge) + + var index = edge.getData('displayIndex') ? edge.getData('displayIndex') : 0 + var synapse = edge.getData('synapses')[index]; // for now, just get the first synapse + + // create the wrapper around the form elements, including permissions + // classes to make best_in_place happy + var edit_div = document.createElement('div') + edit_div.innerHTML = '
' + edit_div.setAttribute('id', 'edit_synapse') + if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { + edit_div.className = 'permission canEdit' + edit_div.className += synapse.authorizePermissionChange(Metamaps.Active.Mapper) ? ' yourEdge' : '' + } else { + edit_div.className = 'permission cannotEdit' + } + $('#wrapper').append(edit_div) + + self.populateShowCard(edge, synapse) + + // drop it in the right spot, activate it + $('#edit_synapse').css('position', 'absolute') + if (e) { + $('#edit_synapse').css('left', e.clientX) + $('#edit_synapse').css('top', e.clientY) + } else { + $('#edit_synapse').css('left', myX) + $('#edit_synapse').css('top', myY) + } + // $('#edit_synapse_name').click() //required in case name is empty + // $('#edit_synapse_name input').focus() + $('#edit_synapse').show() + + self.openSynapseCard = edge + }, + + hideCard: function () { + $('#edit_synapse').remove() + Metamaps.SynapseCard.openSynapseCard = null + }, + + populateShowCard: function (edge, synapse) { + var self = Metamaps.SynapseCard + + self.add_synapse_count(edge) + self.add_desc_form(synapse) + self.add_drop_down(edge, synapse) + self.add_user_info(synapse) + self.add_perms_form(synapse) + self.add_direction_form(synapse) + }, + add_synapse_count: function (edge) { + var count = edge.getData('synapses').length + + $('#editSynUpperBar').append('
' + count + '
') + }, + add_desc_form: function (synapse) { + var data_nil = 'Click to add description.' + + // TODO make it so that this would work even in sandbox mode, + // currently with Best_in_place it won't + + // desc editing form + $('#editSynUpperBar').append('
') + $('#edit_synapse_desc').attr('class', 'best_in_place best_in_place_desc') + $('#edit_synapse_desc').attr('data-object', 'synapse') + $('#edit_synapse_desc').attr('data-attribute', 'desc') + $('#edit_synapse_desc').attr('data-type', 'textarea') + $('#edit_synapse_desc').attr('data-nil', data_nil) + $('#edit_synapse_desc').attr('data-url', '/synapses/' + synapse.id) + $('#edit_synapse_desc').html(synapse.get('desc')) + + // if edge data is blank or just whitespace, populate it with data_nil + if ($('#edit_synapse_desc').html().trim() == '') { + if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { + $('#edit_synapse_desc').html(data_nil) + } else { + $('#edit_synapse_desc').html('(no description)') + } + } + + $('#edit_synapse_desc').bind('ajax:success', function () { + var desc = $(this).html() + if (desc == data_nil) { + synapse.set('desc', '') + } else { + synapse.set('desc', desc) + } + synapse.trigger('saved') + Metamaps.Control.selectEdge(synapse.get('edge')) + Metamaps.Visualize.mGraph.plot() + }) + }, + add_drop_down: function (edge, synapse) { + var list, i, synapses, l, desc + + synapses = edge.getData('synapses') + l = synapses.length + + if (l > 1) { + // append the element that you click to show dropdown select + $('#editSynUpperBar').append('') + $('#dropdownSynapses').click(function (e) { + e.preventDefault() + e.stopPropagation() // stop it from immediately closing it again + $('#switchSynapseList').toggle() + }) + // hide the dropdown again if you click anywhere else on the synapse card + $('#edit_synapse').click(function () { + $('#switchSynapseList').hide() + }) + + // generate the list of other synapses + list = '' + // add the list of the other synapses + $('#editSynLowerBar').append(list) + + // attach click listeners to list items that + // will cause it to switch the displayed synapse + // when you click it + $('#switchSynapseList li').click(function (e) { + e.stopPropagation() + var index = parseInt($(this).attr('data-synapse-index')) + edge.setData('displayIndex', index) + Metamaps.Visualize.mGraph.plot() + Metamaps.SynapseCard.showCard(edge, false) + }) + } + }, + add_user_info: function (synapse) { + var u = '
' + u += ' ' + u += '
' + synapse.get('user_name') + '
' + $('#editSynLowerBar').append(u) + + // get mapper image + var setMapperImage = function (mapper) { + $('#edgeUser img').attr('src', mapper.get('image')) + } + Metamaps.Mapper.get(synapse.get('user_id'), setMapperImage) + }, + + add_perms_form: function (synapse) { + // permissions - if owner, also allow permission editing + $('#editSynLowerBar').append('
') + + // ability to change permission + var selectingPermission = false + var permissionLiClick = function (event) { + selectingPermission = false + var permission = $(this).attr('class') + synapse.save({ + permission: permission, + defer_to_map_id: null + }) + $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)) + $('#edit_synapse .permissionSelect').remove() + event.stopPropagation() + } + + var openPermissionSelect = function (event) { + if (!selectingPermission) { + selectingPermission = true + $(this).addClass('minimize') // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('co')) { + $(this).append('') + } else if ($(this).hasClass('pu')) { + $(this).append('') + } else if ($(this).hasClass('pr')) { + $(this).append('') + } + $('#edit_synapse .permissionSelect li').click(permissionLiClick) + event.stopPropagation() + } + } + + var hidePermissionSelect = function () { + selectingPermission = false + $('#edit_synapse.yourEdge .mapPerm').removeClass('minimize') // this line flips the pull up arrow to a drop down arrow + $('#edit_synapse .permissionSelect').remove() + } + + if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { + $('#edit_synapse.yourEdge .mapPerm').click(openPermissionSelect) + $('#edit_synapse').click(hidePermissionSelect) + } + }, // add_perms_form + + add_direction_form: function (synapse) { + // directionality checkboxes + $('#editSynLowerBar').append('
') + $('#editSynLowerBar').append('
') + + var edge = synapse.get('edge') + + // determine which node is to the left and the right + // if directly in a line, top is left + if (edge.nodeFrom.pos.x < edge.nodeTo.pos.x || + edge.nodeFrom.pos.x == edge.nodeTo.pos.x && + edge.nodeFrom.pos.y < edge.nodeTo.pos.y) { + var left = edge.nodeTo.getData('topic') + var right = edge.nodeFrom.getData('topic') + } else { + var left = edge.nodeFrom.getData('topic') + var right = edge.nodeTo.getData('topic') + } + + /* + * One node is actually on the left onscreen. Call it left, & the other right. + * If category is from-to, and that node is first, check the 'right' checkbox. + * Else check the 'left' checkbox since the arrow is incoming. + */ + + var directionCat = synapse.get('category'); // both, none, from-to + if (directionCat == 'from-to') { + var from_to = [synapse.get('node1_id'), synapse.get('node2_id')] + if (from_to[0] == left.id) { + // check left checkbox + $('#edit_synapse_left').addClass('checked') + } else { + // check right checkbox + $('#edit_synapse_right').addClass('checked') + } + } else if (directionCat == 'both') { + // check both checkboxes + $('#edit_synapse_left').addClass('checked') + $('#edit_synapse_right').addClass('checked') + } + + if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { + $('#edit_synapse_left, #edit_synapse_right').click(function () { + $(this).toggleClass('checked') + + var leftChecked = $('#edit_synapse_left').is('.checked') + var rightChecked = $('#edit_synapse_right').is('.checked') + + var dir = synapse.getDirection() + var dirCat = 'none' + if (leftChecked && rightChecked) { + dirCat = 'both' + } else if (!leftChecked && rightChecked) { + dirCat = 'from-to' + dir = [right.id, left.id] + } else if (leftChecked && !rightChecked) { + dirCat = 'from-to' + dir = [left.id, right.id] + } + + synapse.save({ + category: dirCat, + node1_id: dir[0], + node2_id: dir[1] + }) + Metamaps.Visualize.mGraph.plot() + }) + } // if + } // add_direction_form +}; // end Metamaps.SynapseCard diff --git a/app/assets/javascripts/src/Metamaps.js.erb b/app/assets/javascripts/src/Metamaps.js.erb index 6ac29af3..b009642b 100644 --- a/app/assets/javascripts/src/Metamaps.js.erb +++ b/app/assets/javascripts/src/Metamaps.js.erb @@ -1302,289 +1302,3 @@ Metamaps.TopicCard = { return nodeValues; } }; // end Metamaps.TopicCard - - -/* - * - * SYNAPSECARD - * - */ -Metamaps.SynapseCard = { - openSynapseCard: null, - showCard: function (edge, e) { - var self = Metamaps.SynapseCard; - - //reset so we don't interfere with other edges, but first, save its x and y - var myX = $('#edit_synapse').css('left'); - var myY = $('#edit_synapse').css('top'); - $('#edit_synapse').remove(); - - //so label is missing while editing - Metamaps.Control.deselectEdge(edge); - - var index = edge.getData("displayIndex") ? edge.getData("displayIndex") : 0; - var synapse = edge.getData('synapses')[index]; // for now, just get the first synapse - - //create the wrapper around the form elements, including permissions - //classes to make best_in_place happy - var edit_div = document.createElement('div'); - edit_div.innerHTML = '
'; - edit_div.setAttribute('id', 'edit_synapse'); - if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { - edit_div.className = 'permission canEdit'; - edit_div.className += synapse.authorizePermissionChange(Metamaps.Active.Mapper) ? ' yourEdge' : ''; - } else { - edit_div.className = 'permission cannotEdit'; - } - $('#wrapper').append(edit_div); - - self.populateShowCard(edge, synapse); - - //drop it in the right spot, activate it - $('#edit_synapse').css('position', 'absolute'); - if (e) { - $('#edit_synapse').css('left', e.clientX); - $('#edit_synapse').css('top', e.clientY); - } else { - $('#edit_synapse').css('left', myX); - $('#edit_synapse').css('top', myY); - } - //$('#edit_synapse_name').click(); //required in case name is empty - //$('#edit_synapse_name input').focus(); - $('#edit_synapse').show(); - - self.openSynapseCard = edge; - }, - - hideCard: function () { - $('#edit_synapse').remove(); - Metamaps.SynapseCard.openSynapseCard = null; - }, - - populateShowCard: function (edge, synapse) { - var self = Metamaps.SynapseCard; - - self.add_synapse_count(edge); - self.add_desc_form(synapse); - self.add_drop_down(edge, synapse); - self.add_user_info(synapse); - self.add_perms_form(synapse); - self.add_direction_form(synapse); - }, - add_synapse_count: function (edge) { - var count = edge.getData("synapses").length; - - $('#editSynUpperBar').append('
' + count + '
') - }, - add_desc_form: function (synapse) { - var data_nil = 'Click to add description.'; - - // TODO make it so that this would work even in sandbox mode, - // currently with Best_in_place it won't - - //desc editing form - $('#editSynUpperBar').append('
'); - $('#edit_synapse_desc').attr('class', 'best_in_place best_in_place_desc'); - $('#edit_synapse_desc').attr('data-object', 'synapse'); - $('#edit_synapse_desc').attr('data-attribute', 'desc'); - $('#edit_synapse_desc').attr('data-type', 'textarea'); - $('#edit_synapse_desc').attr('data-nil', data_nil); - $('#edit_synapse_desc').attr('data-url', '/synapses/' + synapse.id); - $('#edit_synapse_desc').html(synapse.get("desc")); - - //if edge data is blank or just whitespace, populate it with data_nil - if ($('#edit_synapse_desc').html().trim() == '') { - if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { - $('#edit_synapse_desc').html(data_nil); - } - else { - $('#edit_synapse_desc').html("(no description)"); - } - } - - $('#edit_synapse_desc').bind("ajax:success", function () { - var desc = $(this).html(); - if (desc == data_nil) { - synapse.set("desc", ''); - } else { - synapse.set("desc", desc); - } - synapse.trigger('saved'); - Metamaps.Control.selectEdge(synapse.get('edge')); - Metamaps.Visualize.mGraph.plot(); - }); - }, - add_drop_down: function (edge, synapse) { - var list, i, synapses, l, desc; - - synapses = edge.getData("synapses"); - l = synapses.length; - - if (l > 1) { - // append the element that you click to show dropdown select - $('#editSynUpperBar').append(''); - $('#dropdownSynapses').click(function(e){ - e.preventDefault(); - e.stopPropagation(); // stop it from immediately closing it again - $('#switchSynapseList').toggle(); - }); - // hide the dropdown again if you click anywhere else on the synapse card - $('#edit_synapse').click(function(){ - $('#switchSynapseList').hide(); - }); - - // generate the list of other synapses - list = '' - // add the list of the other synapses - $('#editSynLowerBar').append(list); - - // attach click listeners to list items that - // will cause it to switch the displayed synapse - // when you click it - $('#switchSynapseList li').click(function(e){ - e.stopPropagation(); - var index = parseInt($(this).attr('data-synapse-index')); - edge.setData('displayIndex', index); - Metamaps.Visualize.mGraph.plot(); - Metamaps.SynapseCard.showCard(edge, false); - }); - } - }, - add_user_info: function (synapse) { - var u = '
'; - u += ' ' - u += '
' + synapse.get("user_name") + '
'; - $('#editSynLowerBar').append(u); - - // get mapper image - var setMapperImage = function (mapper) { - $('#edgeUser img').attr('src', mapper.get('image')); - }; - Metamaps.Mapper.get(synapse.get('user_id'), setMapperImage); - }, - - add_perms_form: function (synapse) { - //permissions - if owner, also allow permission editing - $('#editSynLowerBar').append('
'); - - // ability to change permission - var selectingPermission = false; - var permissionLiClick = function (event) { - selectingPermission = false; - var permission = $(this).attr('class'); - synapse.save({ - permission: permission, - defer_to_map_id: null - }); - $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('#edit_synapse .permissionSelect').remove(); - event.stopPropagation(); - }; - - var openPermissionSelect = function (event) { - if (!selectingPermission) { - selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('co')) { - $(this).append(''); - } else if ($(this).hasClass('pu')) { - $(this).append(''); - } else if ($(this).hasClass('pr')) { - $(this).append(''); - } - $('#edit_synapse .permissionSelect li').click(permissionLiClick); - event.stopPropagation(); - } - }; - - var hidePermissionSelect = function () { - selectingPermission = false; - $('#edit_synapse.yourEdge .mapPerm').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('#edit_synapse .permissionSelect').remove(); - }; - - if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { - $('#edit_synapse.yourEdge .mapPerm').click(openPermissionSelect); - $('#edit_synapse').click(hidePermissionSelect); - } - }, //add_perms_form - - add_direction_form: function (synapse) { - //directionality checkboxes - $('#editSynLowerBar').append('
'); - $('#editSynLowerBar').append('
'); - - var edge = synapse.get('edge'); - - //determine which node is to the left and the right - //if directly in a line, top is left - if (edge.nodeFrom.pos.x < edge.nodeTo.pos.x || - edge.nodeFrom.pos.x == edge.nodeTo.pos.x && - edge.nodeFrom.pos.y < edge.nodeTo.pos.y) { - var left = edge.nodeTo.getData("topic"); - var right = edge.nodeFrom.getData("topic"); - } else { - var left = edge.nodeFrom.getData("topic"); - var right = edge.nodeTo.getData("topic"); - } - - /* - * One node is actually on the left onscreen. Call it left, & the other right. - * If category is from-to, and that node is first, check the 'right' checkbox. - * Else check the 'left' checkbox since the arrow is incoming. - */ - - var directionCat = synapse.get('category'); //both, none, from-to - if (directionCat == 'from-to') { - var from_to = [synapse.get("node1_id"), synapse.get("node2_id")]; - if (from_to[0] == left.id) { - //check left checkbox - $('#edit_synapse_left').addClass('checked'); - } else { - //check right checkbox - $('#edit_synapse_right').addClass('checked'); - } - } else if (directionCat == 'both') { - //check both checkboxes - $('#edit_synapse_left').addClass('checked'); - $('#edit_synapse_right').addClass('checked'); - } - - if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { - $('#edit_synapse_left, #edit_synapse_right').click(function () { - - $(this).toggleClass('checked'); - - var leftChecked = $('#edit_synapse_left').is('.checked'); - var rightChecked = $('#edit_synapse_right').is('.checked'); - - var dir = synapse.getDirection(); - var dirCat = 'none'; - if (leftChecked && rightChecked) { - dirCat = 'both'; - } else if (!leftChecked && rightChecked) { - dirCat = 'from-to'; - dir = [right.id, left.id]; - } else if (leftChecked && !rightChecked) { - dirCat = 'from-to'; - dir = [left.id, right.id]; - } - - synapse.save({ - category: dirCat, - node1_id: dir[0], - node2_id: dir[1] - }); - Metamaps.Visualize.mGraph.plot(); - }); - } // if - } //add_direction_form -}; // end Metamaps.SynapseCard