You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by tv...@apache.org on 2013/03/22 23:54:31 UTC

[04/21] git commit: [#4299] ticket:281 Added simple combobox widget

[#4299] ticket:281 Added simple combobox widget


Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/70af6ba4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/70af6ba4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/70af6ba4

Branch: refs/heads/master
Commit: 70af6ba4096326d7618f7957f5c6cb33ae2904bf
Parents: 6fb7292
Author: Igor Bondarenko <je...@gmail.com>
Authored: Thu Feb 28 16:02:12 2013 +0000
Committer: Tim Van Steenburgh <tv...@gmail.com>
Committed: Fri Mar 22 21:55:15 2013 +0000

----------------------------------------------------------------------
 Allura/allura/lib/widgets/form_fields.py           |   16 ++
 .../lib/widgets/resources/js/project_user_combo.js |  109 +++++++++++++++
 .../templates/widgets/project_user_combo.html      |    5 +
 .../forgetracker/templates/tracker/ticket.html     |    1 +
 ForgeTracker/forgetracker/tracker_main.py          |    1 +
 5 files changed, 132 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/70af6ba4/Allura/allura/lib/widgets/form_fields.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/form_fields.py b/Allura/allura/lib/widgets/form_fields.py
index 24330c7..32ae7f6 100644
--- a/Allura/allura/lib/widgets/form_fields.py
+++ b/Allura/allura/lib/widgets/form_fields.py
@@ -93,6 +93,22 @@ class ProjectUserSelect(ew.InputField):
             minLength: 2
           });''' % c.project.url())
 
+
+class ProjectUserCombo(ew.SingleSelectField):
+    template = 'jinja:allura:templates/widgets/project_user_combo.html'
+
+    def options(self):
+        users = []
+        for i in range(10):
+            users.append(ew.Option(py_value=i, label='User %s' % i))
+        return users
+
+    def resources(self):
+        for r in super(ProjectUserCombo, self).resources():
+            yield r
+        yield ew.JSLink('js/project_user_combo.js')
+
+
 class NeighborhoodProjectSelect(ew.InputField):
     template='jinja:allura:templates/widgets/neighborhood_project_select.html'
     defaults=dict(

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/70af6ba4/Allura/allura/lib/widgets/resources/js/project_user_combo.js
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/resources/js/project_user_combo.js b/Allura/allura/lib/widgets/resources/js/project_user_combo.js
new file mode 100644
index 0000000..46b84c6
--- /dev/null
+++ b/Allura/allura/lib/widgets/resources/js/project_user_combo.js
@@ -0,0 +1,109 @@
+(function($) {
+  $.widget('ui.combobox', {
+    _create: function() {
+      var input,
+          that = this,
+          wasOpen = false,
+          select = this.element.hide(),
+          selected = select.children(':selected'),
+          value = selected.val() ? selected.text() : "",
+          wrapper = this.wrapper = $('<span>')
+            .addClass('ui-combobox')
+            .insertAfter(select);
+
+      function removeIfInvalid(element) {
+        var value = $(element).val(),
+            matcher = new RegExp('^' + $.ui.autocomplete.escapeRegex(value) + '$'),
+            valid = false;
+        select.children('option').each(function() {
+          if ($(this).text().match(matcher)) {
+            this.selected = valid = true;
+            return false;
+          }
+        });
+
+        if (!valid) {
+          $(element).val('');
+          select.val('');
+          input.data('autocomplete').term = '';
+        }
+      }
+
+      input = $('<input>')
+              .appendTo(wrapper)
+              .val(value)
+              .attr('title', '')
+              .addClass('ui-state-default ui-combobox-input')
+              .autocomplete({
+                delay: 0,
+                minLength: 0,
+                source: function (request, response) {
+                  var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), 'i');
+                  response(select.children('option').map(function() {
+                    var text = $(this).text();
+                    if (this.value && (!request.term || matcher.test(text))) {
+                      return {
+                        label: text.replace(
+                                 new RegExp(
+                                   '(?![^&;]+;)(?!<[^<>]*)(' +
+                                   $.ui.autocomplete.escapeRegex(request.term) +
+                                   ')(?![^<>]*>)(?![^&;]+;)', 'gi'
+                                 ), '<strong>$1</strong>'),
+                        value: text,
+                        option: this
+                      };
+                    }
+                  }));
+                },
+                select: function(event, ui) {
+                  ui.item.option.selected = true;
+                  that._trigger('selected', event, {item: ui.item.option});
+                },
+                change: function(event, ui) {
+                  if (!ui.item) {
+                    removeIfInvalid(this);
+                  }
+                }
+              }).addClass('ui-widget ui-widget-content ui-corner-left');
+
+      input.data('autocomplete')._renderItem = function(ul, item) {
+        return $('<li>')
+          .data('item.autocomplete', item)
+          .append('<a>' + item.label + '</a>')
+          .appendTo(ul);
+      };
+
+      $('<a>')
+        .attr('tabIndex', -1)
+        .attr('title', 'Show all users')
+        .appendTo(wrapper)
+        .button({
+          icons: {
+            primary: 'ui-icon-triangle-1-s'
+          },
+          text: false
+        })
+        .removeClass('ui-corner-all')
+        .addClass('ui-corner-right ui-combobox-toggle')
+        .mousedown(function() {
+          wasOpen = input.autocomplete('widget').is(':visible');
+        })
+        .click(function() {
+          input.focus();
+          if (wasOpen) {
+            return;
+          }
+          input.autocomplete('search', '');
+        });
+    },
+
+    _destroy: function() {
+      this.wrapper.remove();
+      this.element.show();
+    }
+  });
+})(jQuery);
+
+$(function() {
+  $('select.project-user-combobox').combobox();
+});

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/70af6ba4/Allura/allura/templates/widgets/project_user_combo.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/project_user_combo.html b/Allura/allura/templates/widgets/project_user_combo.html
new file mode 100644
index 0000000..cf5af39
--- /dev/null
+++ b/Allura/allura/templates/widgets/project_user_combo.html
@@ -0,0 +1,5 @@
+<select id="{{id}}" name="{{name}}" class="project-user-combobox{{className and ' %s' % className or ''}}">
+{% for o in options %}
+  <option{% if o.selected %} selected{% endif %} value="{{o.html_value}}">{{o.label|e}}</option>
+{% endfor %}
+</select>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/70af6ba4/ForgeTracker/forgetracker/templates/tracker/ticket.html
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/templates/tracker/ticket.html b/ForgeTracker/forgetracker/templates/tracker/ticket.html
index 1d229fe..892a45d 100644
--- a/ForgeTracker/forgetracker/templates/tracker/ticket.html
+++ b/ForgeTracker/forgetracker/templates/tracker/ticket.html
@@ -34,6 +34,7 @@
 {% block edit_box %}
 <div class="editbox">
   <div class="form_holder" style="display: none">
+    {{c.user_combo.display()}}
     {{c.ticket_form.display(action='%supdate_ticket_from_widget' % ticket.url(),
       value=ticket, ticket=ticket, show_comment=True)}}
   </div>

http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/70af6ba4/ForgeTracker/forgetracker/tracker_main.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index cc477d6..cb6db70 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -1138,6 +1138,7 @@ class TicketController(BaseController):
             c.subscribe_form = W.ticket_subscribe_form
             c.ticket_custom_field = W.ticket_custom_field
             c.vote_form = W.vote_form
+            c.user_combo = ffw.ProjectUserCombo()
             tool_subscribed = M.Mailbox.subscribed()
             if tool_subscribed:
                 subscribed = False