[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 /** 2 * @provides javelin-behavior-differential-edit-inline-comments 3 * @requires javelin-behavior 4 * javelin-stratcom 5 * javelin-dom 6 * javelin-util 7 * javelin-vector 8 * differential-inline-comment-editor 9 */ 10 11 JX.behavior('differential-edit-inline-comments', function(config) { 12 13 var selecting = false; 14 var reticle = JX.$N('div', {className: 'differential-reticle'}); 15 JX.DOM.hide(reticle); 16 document.body.appendChild(reticle); 17 18 var origin = null; 19 var target = null; 20 var root = null; 21 var changeset = null; 22 23 var editor = null; 24 25 function updateReticle() { 26 var top = origin; 27 var bot = target; 28 if (JX.$V(top).y > JX.$V(bot).y) { 29 var tmp = top; 30 top = bot; 31 bot = tmp; 32 } 33 var code = target.nextSibling; 34 35 var pos = JX.$V(top).add(1 + JX.Vector.getDim(target).x, 0); 36 var dim = JX.Vector.getDim(code).add(-4, 0); 37 if (isOnRight(target)) { 38 dim.x += JX.Vector.getDim(code.nextSibling).x; 39 } 40 dim.y = (JX.$V(bot).y - pos.y) + JX.Vector.getDim(bot).y; 41 42 pos.setPos(reticle); 43 dim.setDim(reticle); 44 45 JX.DOM.show(reticle); 46 } 47 48 function hideReticle() { 49 JX.DOM.hide(reticle); 50 } 51 52 JX.DifferentialInlineCommentEditor.listen('done', function() { 53 selecting = false; 54 editor = false; 55 hideReticle(); 56 set_link_state(false); 57 }); 58 59 function isOnRight(node) { 60 return node.parentNode.firstChild != node; 61 } 62 63 function isNewFile(node) { 64 var data = JX.Stratcom.getData(root); 65 return isOnRight(node) || (data.left != data.right); 66 } 67 68 function getRowNumber(th_node) { 69 try { 70 return parseInt(th_node.id.match(/^C\d+[ON]L(\d+)$/)[1], 10); 71 } catch (x) { 72 return undefined; 73 } 74 } 75 76 var set_link_state = function(active) { 77 JX.DOM.alterClass(JX.$(config.stage), 'inline-editor-active', active); 78 }; 79 80 JX.Stratcom.listen( 81 'mousedown', 82 ['differential-changeset', 'tag:th'], 83 function(e) { 84 if (editor || 85 selecting || 86 e.isRightButton() || 87 getRowNumber(e.getTarget()) === undefined) { 88 return; 89 } 90 91 selecting = true; 92 root = e.getNode('differential-changeset'); 93 94 origin = target = e.getTarget(); 95 96 var data = e.getNodeData('differential-changeset'); 97 if (isOnRight(target)) { 98 changeset = data.right; 99 } else { 100 changeset = data.left; 101 } 102 103 updateReticle(); 104 105 e.kill(); 106 }); 107 108 JX.Stratcom.listen( 109 'mouseover', 110 ['differential-changeset', 'tag:th'], 111 function(e) { 112 if (!selecting || 113 editor || 114 (getRowNumber(e.getTarget()) === undefined) || 115 (isOnRight(e.getTarget()) != isOnRight(origin)) || 116 (e.getNode('differential-changeset') !== root)) { 117 return; 118 } 119 120 target = e.getTarget(); 121 122 updateReticle(); 123 }); 124 125 JX.Stratcom.listen( 126 'mouseup', 127 null, 128 function(e) { 129 if (editor || !selecting) { 130 return; 131 } 132 133 var o = getRowNumber(origin); 134 var t = getRowNumber(target); 135 136 var insert; 137 var len; 138 if (t < o) { 139 len = (o - t); 140 o = t; 141 insert = origin.parentNode; 142 } else { 143 len = (t - o); 144 insert = target.parentNode; 145 } 146 147 editor = new JX.DifferentialInlineCommentEditor(config.uri) 148 .setTemplates(config.undo_templates) 149 .setOperation('new') 150 .setChangeset(changeset) 151 .setLineNumber(o) 152 .setLength(len) 153 .setIsNew(isNewFile(target) ? 1 : 0) 154 .setOnRight(isOnRight(target) ? 1 : 0) 155 .setRow(insert.nextSibling) 156 .setTable(insert.parentNode) 157 .start(); 158 159 set_link_state(true); 160 161 e.kill(); 162 }); 163 164 JX.Stratcom.listen( 165 ['mouseover', 'mouseout'], 166 'differential-inline-comment', 167 function(e) { 168 if (e.getType() == 'mouseout') { 169 hideReticle(); 170 } else { 171 root = e.getNode('differential-changeset'); 172 if (root) { 173 174 var data = e.getNodeData('differential-inline-comment'); 175 var change = e.getNodeData('differential-changeset'); 176 177 var id_part = data.on_right ? change.right : change.left; 178 179 // NOTE: We can't just look for 'tag:td' because the event might be 180 // inside a table which is inside an inline comment. 181 var comment = e.getNode('differential-inline-comment'); 182 var td = JX.DOM.findAbove(comment, 'td'); 183 var th = td.previousSibling; 184 185 var new_part = isNewFile(th) ? 'N' : 'O'; 186 var prefix = 'C' + id_part + new_part + 'L'; 187 188 origin = JX.$(prefix + data.number); 189 target = JX.$(prefix + (parseInt(data.number, 10) + 190 parseInt(data.length, 10))); 191 192 updateReticle(); 193 } 194 } 195 }); 196 197 var action_handler = function(op, e) { 198 e.kill(); 199 200 if (editor) { 201 return; 202 } 203 204 var node = e.getNode('differential-inline-comment'); 205 handle_inline_action(node, op); 206 }; 207 208 var handle_inline_action = function(node, op) { 209 var data = JX.Stratcom.getData(node); 210 var row = node.parentNode.parentNode; 211 var other_rows = []; 212 if (JX.Stratcom.hasSigil(node, 'differential-inline-comment-preview')) { 213 // The DOM structure around the comment is different if it's part of the 214 // preview, so make sure not to pass the wrong container. 215 row = node; 216 if (op === 'delete') { 217 // Furthermore, deleting a comment in the preview does not automatically 218 // delete other occurrences of the same comment, so do that manually. 219 var nodes = JX.DOM.scry( 220 document.body, 221 'div', 222 'differential-inline-comment'); 223 for (var i = 0; i < nodes.length; ++i) { 224 if (JX.Stratcom.getData(nodes[i]).id === data.id) { 225 other_rows.push(nodes[i]); 226 } 227 } 228 } 229 } 230 231 var original = data.original; 232 if (op == 'reply') { 233 // If the user hit "reply", the original text is empty (a new reply), not 234 // the text of the comment they're replying to. 235 original = ''; 236 } 237 238 editor = new JX.DifferentialInlineCommentEditor(config.uri) 239 .setTemplates(config.undo_templates) 240 .setOperation(op) 241 .setID(data.id) 242 .setLineNumber(data.number) 243 .setLength(data.length) 244 .setOnRight(data.on_right) 245 .setOriginalText(original) 246 .setRow(row) 247 .setOtherRows(other_rows) 248 .setTable(row.parentNode) 249 .start(); 250 251 set_link_state(true); 252 }; 253 254 for (var op in {'edit' : 1, 'delete' : 1, 'reply' : 1}) { 255 JX.Stratcom.listen( 256 'click', 257 ['differential-inline-comment', 'differential-inline-' + op], 258 JX.bind(null, action_handler, op)); 259 } 260 261 JX.Stratcom.listen( 262 'differential-inline-action', 263 null, 264 function(e) { 265 var data = e.getData(); 266 handle_inline_action(data.node, data.op); 267 }); 268 269 });
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |