[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 /** 2 * @provides javelin-behavior-differential-dropdown-menus 3 * @requires javelin-behavior 4 * javelin-dom 5 * javelin-util 6 * javelin-stratcom 7 * javelin-workflow 8 * phuix-dropdown-menu 9 * phuix-action-list-view 10 * phuix-action-view 11 * phabricator-phtize 12 * changeset-view-manager 13 */ 14 15 JX.behavior('differential-dropdown-menus', function(config) { 16 var pht = JX.phtize(config.pht); 17 18 function show_more(container) { 19 var nodes = JX.DOM.scry(container, 'tr', 'context-target'); 20 for (var ii = 0; ii < nodes.length; ii++) { 21 var show = JX.DOM.scry(nodes[ii], 'a', 'show-more'); 22 for (var jj = 0; jj < show.length; jj++) { 23 if (JX.Stratcom.getData(show[jj]).type != 'all') { 24 continue; 25 } 26 var event_data = { 27 context : nodes[ii], 28 show : show[jj] 29 }; 30 JX.Stratcom.invoke('differential-reveal-context', null, event_data); 31 } 32 } 33 } 34 35 JX.Stratcom.listen( 36 'click', 37 'differential-reveal-all', 38 function(e) { 39 var containers = JX.DOM.scry( 40 JX.$('differential-review-stage'), 41 'div', 42 'differential-changeset'); 43 for (var i=0; i < containers.length; i++) { 44 show_more(containers[i]); 45 } 46 e.kill(); 47 }); 48 49 var buildmenu = function(e) { 50 var button = e.getNode('differential-view-options'); 51 var data = JX.Stratcom.getData(button); 52 if (data.menu) { 53 return; 54 } 55 56 e.prevent(); 57 58 var changeset = JX.DOM.findAbove( 59 button, 60 'div', 61 'differential-changeset'); 62 63 var view = JX.ChangesetViewManager.getForNode(changeset); 64 var menu = new JX.PHUIXDropdownMenu(button); 65 var list = new JX.PHUIXActionListView(); 66 67 var add_link = function(icon, name, href, local) { 68 if (!href) { 69 return; 70 } 71 72 var link = new JX.PHUIXActionView() 73 .setIcon(icon) 74 .setName(name) 75 .setHref(href) 76 .setHandler(function(e) { 77 if (local) { 78 window.location.assign(href); 79 } else { 80 window.open(href); 81 } 82 menu.close(); 83 e.prevent(); 84 }); 85 86 list.addItem(link); 87 return link; 88 }; 89 90 var reveal_item = new JX.PHUIXActionView() 91 .setIcon('fa-eye'); 92 list.addItem(reveal_item); 93 94 var visible_item = new JX.PHUIXActionView() 95 .setHandler(function(e) { 96 var diff = JX.DOM.scry( 97 JX.$(data.containerID), 98 'table', 99 'differential-diff'); 100 101 JX.Stratcom.invoke('differential-toggle-file', null, {diff: diff}); 102 e.prevent(); 103 menu.close(); 104 }); 105 list.addItem(visible_item); 106 107 add_link('fa-file-text', pht('Browse in Diffusion'), data.diffusionURI); 108 add_link('fa-file-o', pht('View Standalone'), data.standaloneURI); 109 110 var up_item = new JX.PHUIXActionView() 111 .setHandler(function(e) { 112 if (view.isLoaded()) { 113 var renderer = view.getRenderer(); 114 if (renderer == '1up') { 115 renderer = '2up'; 116 } else { 117 renderer = '1up'; 118 } 119 view.setRenderer(renderer); 120 } 121 view.reload(); 122 123 e.prevent(); 124 menu.close(); 125 }); 126 list.addItem(up_item); 127 128 var encoding_item = new JX.PHUIXActionView() 129 .setIcon('fa-font') 130 .setName(pht('Change Text Encoding...')) 131 .setHandler(function(e) { 132 var params = { 133 encoding: view.getEncoding() 134 }; 135 136 new JX.Workflow('/services/encoding/', params) 137 .setHandler(function(r) { 138 view.setEncoding(r.encoding); 139 view.reload(); 140 }) 141 .start(); 142 143 e.prevent(); 144 menu.close(); 145 }); 146 list.addItem(encoding_item); 147 148 var highlight_item = new JX.PHUIXActionView() 149 .setIcon('fa-sun-o') 150 .setName(pht('Highlight As...')) 151 .setHandler(function(e) { 152 var params = { 153 highlight: view.getHighlight() 154 }; 155 156 new JX.Workflow('/services/highlight/', params) 157 .setHandler(function(r) { 158 view.setHighlight(r.highlight); 159 view.reload(); 160 }) 161 .start(); 162 163 e.prevent(); 164 menu.close(); 165 }); 166 list.addItem(highlight_item); 167 168 add_link('fa-arrow-left', pht('Show Raw File (Left)'), data.leftURI); 169 add_link('fa-arrow-right', pht('Show Raw File (Right)'), data.rightURI); 170 add_link('fa-pencil', pht('Open in Editor'), data.editor, true); 171 add_link('fa-wrench', pht('Configure Editor'), data.editorConfigure); 172 173 menu.setContent(list.getNode()); 174 175 menu.listen('open', function() { 176 // When the user opens the menu, check if there are any "Show More" 177 // links in the changeset body. If there aren't, disable the "Show 178 // Entire File" menu item since it won't change anything. 179 180 var nodes = JX.DOM.scry(JX.$(data.containerID), 'a', 'show-more'); 181 if (nodes.length) { 182 reveal_item 183 .setDisabled(false) 184 .setName(pht('Show Entire File')) 185 .setIcon('fa-file-o') 186 .setHandler(function(e) { 187 show_more(JX.$(data.containerID)); 188 e.prevent(); 189 menu.close(); 190 }); 191 } else { 192 reveal_item 193 .setDisabled(true) 194 .setIcon('fa-file') 195 .setName(pht('Entire File Shown')) 196 .setHandler(function(e) { e.prevent(); }); 197 } 198 199 encoding_item.setDisabled(!view.isLoaded()); 200 highlight_item.setDisabled(!view.isLoaded()); 201 202 if (view.isLoaded()) { 203 if (view.getRenderer() == '2up') { 204 up_item 205 .setIcon('fa-list-alt') 206 .setName(pht('View Unified')); 207 } else { 208 up_item 209 .setIcon('fa-files-o') 210 .setName(pht('View Side-by-Side')); 211 } 212 } else { 213 up_item 214 .setIcon('fa-refresh') 215 .setName(pht('Load Changes')); 216 } 217 218 visible_item 219 .setDisabled(true) 220 .setIcon('fa-expand') 221 .setName(pht("Can't Toggle Unloaded File")); 222 var diffs = JX.DOM.scry( 223 JX.$(data.containerID), 224 'table', 225 'differential-diff'); 226 227 if (diffs.length > 1) { 228 JX.$E( 229 'More than one node with sigil "differential-diff" was found in "'+ 230 data.containerID+'."'); 231 } else if (diffs.length == 1) { 232 diff = diffs[0]; 233 visible_item.setDisabled(false); 234 if (JX.Stratcom.getData(diff).hidden) { 235 visible_item 236 .setName(pht('Expand File')) 237 .setIcon('fa-expand'); 238 } else { 239 visible_item 240 .setName(pht('Collapse File')) 241 .setIcon('fa-compress'); 242 } 243 } else { 244 // Do nothing when there is no diff shown in the table. For example, 245 // the file is binary. 246 } 247 248 }); 249 250 data.menu = menu; 251 menu.open(); 252 }; 253 254 JX.Stratcom.listen('click', 'differential-view-options', buildmenu); 255 });
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 |