[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 /** 2 * @provides javelin-behavior-phabricator-object-selector 3 * @requires javelin-behavior 4 * javelin-dom 5 * javelin-request 6 * javelin-util 7 */ 8 9 JX.behavior('phabricator-object-selector', function(config) { 10 var n = 0; 11 12 var phids = {}; 13 var handles = config.handles; 14 for (var k in handles) { 15 phids[k] = true; 16 } 17 var button_list = {}; 18 var query_timer = null; 19 var query_delay = 50; 20 21 var phid_input = JX.DOM.find( 22 JX.$(config.form), 23 'input', 24 'aphront-dialog-application-input'); 25 26 var last_value = JX.$(config.query).value; 27 28 function onreceive(seq, r) { 29 if (seq != n) { 30 return; 31 } 32 33 var display = []; 34 button_list = {}; 35 for (var k in r) { 36 handles[r[k].phid] = r[k]; 37 display.push(renderHandle(r[k], true)); 38 } 39 40 if (!display.length) { 41 display = renderNote('No results.'); 42 } 43 44 JX.DOM.setContent(JX.$(config.results), display); 45 } 46 47 function redrawAttached() { 48 var display = []; 49 50 for (var k in phids) { 51 display.push(renderHandle(handles[k], false)); 52 } 53 54 if (!display.length) { 55 display = renderNote('Nothing attached.'); 56 } 57 58 JX.DOM.setContent(JX.$(config.current), display); 59 phid_input.value = JX.keys(phids).join(';'); 60 } 61 62 function renderHandle(h, attach) { 63 64 var some_icon = JX.$N( 65 'span', 66 {className: 'phui-icon-view phui-font-fa ' + 67 'fa-external-link phabricator-object-selector-popicon'}, 68 ''); 69 70 var view_object_link = JX.$N( 71 'a', 72 {href: h.uri, target: '_blank'}, 73 some_icon); 74 75 var select_object_link = JX.$N( 76 'a', 77 {href: h.uri, sigil: 'object-attacher'}, 78 h.name); 79 80 var select_object_button = JX.$N( 81 'a', 82 {href: '#', sigil: 'object-attacher', className: 'button small grey'}, 83 attach ? 'Select' : 'Remove'); 84 85 var cells = [ 86 JX.$N('td', {}, view_object_link), 87 JX.$N('th', {}, select_object_link), 88 JX.$N('td', {}, select_object_button) 89 ]; 90 91 var table = JX.$N( 92 'table', 93 {className: 'phabricator-object-selector-handle'}); 94 95 table.appendChild( 96 JX.$N( 97 'tr', 98 {sigil: 'object-attach-row', 99 className: 'phabricator-object-selector-row', 100 meta: {handle: h, table:table}}, 101 cells)); 102 103 if (attach) { 104 button_list[h.phid] = select_object_button; 105 if (h.phid in phids) { 106 JX.DOM.alterClass(select_object_button, 'disabled', true); 107 select_object_button.disabled = true; 108 } 109 } 110 111 return table; 112 } 113 114 function renderNote(note) { 115 return JX.$N('div', {className : 'object-selector-nothing'}, note); 116 } 117 118 function sendQuery() { 119 query_timer = null; 120 JX.DOM.setContent(JX.$(config.results), renderNote('Loading...')); 121 new JX.Request(config.uri, JX.bind(null, onreceive, ++n)) 122 .setData({ 123 filter: JX.$(config.filter).value, 124 exclude: config.exclude, 125 query: JX.$(config.query).value 126 }) 127 .send(); 128 } 129 130 JX.DOM.listen( 131 JX.$(config.results), 132 'click', 133 'object-attacher', 134 function(e) { 135 e.kill(); 136 137 var data = e.getNodeData('object-attach-row'); 138 var phid = data.handle.phid; 139 if (phids[phid]) { 140 return; 141 } 142 143 phids[phid] = true; 144 JX.DOM.alterClass(button_list[phid], 'disabled', true); 145 button_list[phid].disabled = true; 146 147 redrawAttached(); 148 }); 149 150 JX.DOM.listen( 151 JX.$(config.current), 152 'click', 153 'object-attacher', 154 function(e) { 155 e.kill(); 156 157 var data = e.getNodeData('object-attach-row'); 158 var phid = data.handle.phid; 159 160 delete phids[phid]; 161 162 // NOTE: We may not have a button in the button list, if this result is 163 // not visible in the current search results. 164 if (button_list[phid]) { 165 JX.DOM.alterClass(button_list[phid], 'disabled', false); 166 button_list[phid].disabled = false; 167 } 168 169 redrawAttached(); 170 }); 171 172 JX.DOM.listen( 173 JX.$(config.filter), 174 'change', 175 null, 176 function(e) { 177 e.kill(); 178 sendQuery(); 179 }); 180 181 JX.DOM.listen( 182 JX.$(config.query), 183 ['change', 'keydown', 'keyup', 'keypress'], 184 null, 185 function() { 186 var cur_value = JX.$(config.query).value; 187 if (last_value == cur_value) { 188 return; 189 } 190 last_value = cur_value; 191 192 clearTimeout(query_timer); 193 query_timer = setTimeout(sendQuery, query_delay); 194 }); 195 196 sendQuery(); 197 redrawAttached(); 198 199 });
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 |