[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/webroot/rsrc/js/core/ -> behavior-object-selector.js (source)

   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  });


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1