ucb_rails 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,12 +54,8 @@ class UcbRails::Admin::UsersController < UcbRails::Admin::BaseController
54
54
  end
55
55
 
56
56
  def typeahead_search
57
- tokens = params.fetch(:query).to_s.strip.split(/\s+/)
58
- wheres = tokens.map { |e| 'first_last_name like ?' }.join(' and ')
59
- values = tokens.map { |e| "%#{e}%" }
60
- where = ["#{wheres}", *values]
61
- results = UcbRails::User.where(*where).limit(10)
62
- render json: results.map { |r| {uid: r.uid, first_last_name: r.first_last_name} }
57
+ uta = UcbRails::UserTypeahead.new
58
+ render json: uta.results(params.fetch(:query))
63
59
  end
64
60
 
65
61
  private
@@ -18,4 +18,7 @@ module UcbRails::LdapPersonSearchHelper
18
18
  @ldap_person_search_existing_uids ||= (@lps_existing_uids || []).map(&:to_s)
19
19
  end
20
20
 
21
+ def lps_matches
22
+ @lps_entries.size.zero? ? '' : "Matches: #{@lps_entries.size}"
23
+ end
21
24
  end
@@ -1,50 +1,19 @@
1
+ # Helper class that produces a person search widget than includes typeahead and
2
+ # CalNet lookup functionality.
1
3
  module UcbRails::LpsTypeaheadHelper
2
-
4
+
5
+ # @option options [Symbol] :name (:person_search) the name of the <input> field
6
+ # @option options [String] :label ('User') the text of the field label
7
+ # @option options [Boolean] :required (false) is the field required
8
+ # @option options [String] :value (params[:name]) the value of the field
9
+ # @option options [String] :placeholder ('Type name to search') the html +placeholder+ attribute
10
+ # @option options [String] :hint ('Click icon to search CalNet') hint text
11
+ # @option options [String] :result_link_text ('Select') the text of the link button in search results
12
+ # @option options [String] :result_link_class ('lps-typeahead-item') class to be added the the results link
13
+ # @option options [String] :uid_dom_id ('uid') the dom-id of the (hidden) uid <input>
14
+ # @option options [String] :search_url ('/ucb_rails/admin/users/typeahead_search') the search url for typeahead
3
15
  def lps_typeahead_search_field(options={})
4
- name = options.delete(:name) || 'person_search'
5
- required = options.delete(:required)
6
- label = options.delete(:label) || 'User'
7
- value = options.delete(:value) || params[name]
8
- placeholder = options.delete(:placeholder) || 'Type name to search'
9
- hint = options.delete(:hint) || 'Click icon to search CalNet'
10
-
11
- result_link_text = options.delete(:result_link_text) || 'Select'
12
- result_link_class = options.delete(:result_link_class) || 'lps-typeahead-item'
13
-
14
- uid_dom_id = options.delete(:uid_dom_id) || 'uid'
15
- search_url = options.delete(:search_url) || typeahead_search_ucb_rails_admin_users_path
16
-
17
- content_tag(:div, class: 'control-group lps-typeahead') do
18
- label_tag(name, class: label_classes(required)) do
19
- required_marker(required) +
20
- label
21
-
22
- end +
23
- content_tag(:div, class: 'controls') do
24
- content_tag(:div, class: 'input-append') do
25
- text_field_tag(name, value, placeholder: placeholder, class: 'typeahead-lps-search', data: { uid_dom_id: uid_dom_id, url: search_url }) +
26
- content_tag(:span, class: 'add-on') do
27
- icon('search', class: 'ldap-person-search', data: {search_field_name: name, result_link_text: result_link_text, result_link_class: result_link_class})
28
- end
29
- end +
30
- content_tag(:p, hint, class: 'help-block')
31
- end
32
- end
16
+ UcbRails::Renderer::LpsTypeaheadSearchField.new(self, options).html
33
17
  end
34
18
 
35
- private
36
-
37
- def label_classes(required)
38
- Array['control-label'].tap do |klasses|
39
- klasses << 'required' if required
40
- end
41
- end
42
-
43
- def required_marker(required)
44
- if required
45
- content_tag(:abbr, '*', title: 'required') + ' '
46
- else
47
- ''
48
- end
49
- end
50
19
  end
@@ -0,0 +1,90 @@
1
+ module UcbRails
2
+ module Renderer
3
+
4
+ class LpsTypeaheadSearchField < Base
5
+
6
+ attr_accessor :name, :label, :required, :value, :placeholder, :hint, :result_link_text, :result_link_class, :uid_dom_id, :search_url
7
+
8
+ def initialize(template, options={})
9
+ super
10
+ parse_options
11
+ end
12
+
13
+ def html
14
+ content_tag(:div, class: 'control-group lps-typeahead') do
15
+ label_html +
16
+ content_tag(:div, class: 'controls') do
17
+ content_tag(:div, class: 'input-append') do
18
+ text_field_html +
19
+ span_html
20
+ end +
21
+ content_tag(:p, hint, class: 'help-block')
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def label_html
29
+ required_marker = required ? content_tag(:abbr, '*', title: 'required') + ' ' : ''
30
+ label_classes = 'control-label'
31
+ label_classes << ' required' if required
32
+
33
+ label_tag(name, class: label_classes) do
34
+ required_marker +
35
+ label
36
+ end
37
+ end
38
+
39
+ def text_field_html
40
+ text_field_tag(name, value, {
41
+ autocomplete: 'off',
42
+ class: 'typeahead-lps-search',
43
+ placeholder: placeholder,
44
+ data: {
45
+ uid_dom_id: uid_dom_id,
46
+ url: search_url
47
+ }
48
+ })
49
+ end
50
+
51
+ def span_html
52
+ span_options = {
53
+ class: 'add-on ldap-person-search',
54
+ data: {
55
+ search_field_name: name,
56
+ result_link_text: result_link_text,
57
+ result_link_class: result_link_class
58
+ }
59
+ }
60
+ content_tag(:span, span_options) do
61
+ icon('search')
62
+ end
63
+ end
64
+
65
+ def parse_options
66
+ self.name = options.delete(:name) || 'person_search'
67
+ self.label = options.delete(:label) || 'User'
68
+ self.required = options.delete(:required)
69
+ self.value = options.delete(:value) || params[name]
70
+ self.placeholder = options.delete(:placeholder) || 'Type name to search'
71
+ self.hint = options.delete(:hint) || 'Click icon to search CalNet'
72
+ self.result_link_text = options.delete(:result_link_text) || 'Select'
73
+ self.result_link_class = options.delete(:result_link_class) || 'lps-typeahead-item'
74
+ self.uid_dom_id = options.delete(:uid_dom_id) || 'uid'
75
+ self.search_url = options.delete(:search_url) || typeahead_search_ucb_rails_admin_users_path
76
+
77
+ validate_options
78
+ end
79
+
80
+ def validate_options
81
+ return if options.blank?
82
+
83
+ msg = "Unknown lps_typeahead_search_field option(s): #{options.keys.map(&:inspect).join(', ')}. "
84
+ msg << "Did you mean one of :name, :required, :label, :value, :placeholder, :hint, :result_link_text, :result_link_class, :uid_dom_id, :search_url"
85
+ raise ArgumentError, msg
86
+ end
87
+
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,81 @@
1
+ module UcbRails
2
+
3
+ # Class for getting results for ldap person search typeahead fields.
4
+ #
5
+ # By default it will search the UcbRails::User table, but this is configurable:
6
+ #
7
+ # @example
8
+ # class MyController < ApplicationController
9
+ #
10
+ # def search
11
+ # uta = UserTypeahead.new
12
+ # render :json uta.results('art')
13
+ # end
14
+ #
15
+ # end
16
+ #
17
+ class UserTypeahead
18
+ attr_accessor :klass, :search_column, :uid_column, :first_last_name_column, :limit
19
+
20
+ # Constructor
21
+ #
22
+ # @example
23
+ # UserTypeahead.new
24
+ # UserTypeahead.new(klass: Faculty, search_column: 'full_name', uid_column: 'net_id', limit: 25)
25
+ # @param options [Hash]
26
+ # @option options [Object] :klass (UcbRails::User) the (+ActiveRecord+) class to search
27
+ # @option options [Symbol] :search_column (:first_last_name) the column to search
28
+ # @option options [Symbol] :uid_column (:uid) the column holding the +uid+
29
+ # @option options [Symbol] :first_last_name (search_column) the column holding the first/last names
30
+ # @option options [FixNum] :limit (10) number of rows to return
31
+ # @return [UcbRails::UserTypeahead]
32
+ def initialize(options={})
33
+ self.klass = options.delete(:klass) || UcbRails::User
34
+ self.search_column = options.delete(:search_column) || :first_last_name
35
+ self.limit = options.delete(:limit) || 10
36
+ self.uid_column = options.delete(:uid_column) || :uid
37
+ self.first_last_name_column = options.delete(:first_last_name_column) || search_column
38
+ validate_options(options)
39
+ end
40
+
41
+ # Returns the data matching _query_.
42
+ # @example
43
+ # uta = UserTypeahead.new
44
+ # uta.results('art') #=> [{uid: '1', first_last_name: 'Art Andrews'}, ...]
45
+ # @param query [String] search term to match name fields on
46
+ # @return [Array(Hash)]
47
+ def results(query)
48
+ klass
49
+ .where(where(query))
50
+ .limit(limit)
51
+ .map { |row| row_to_hash(row) }
52
+ end
53
+
54
+ private
55
+
56
+ def where(query)
57
+ tokens = query.to_s.strip.split(/\s+/)
58
+ wheres = tokens.map { |e| "#{search_column} like ?" }.join(' and ')
59
+ values = tokens.map { |e| "%#{e}%" }
60
+
61
+ ["#{wheres}", *values]
62
+ end
63
+
64
+ def row_to_hash(row)
65
+ {
66
+ uid: row.send(uid_column),
67
+ first_last_name: row.send(first_last_name_column)
68
+ }
69
+ end
70
+
71
+ def validate_options(options)
72
+ if options.present?
73
+ msg = "Unknown UcbRails::UserTypeahead.new option(s): #{options.keys.map(&:inspect).join(', ')}. "
74
+ msg << "Did you mean one of :klass, :search_column, :uid_column, :first_last_name_column, :limit"
75
+ raise ArgumentError, msg
76
+ end
77
+
78
+ end
79
+ end
80
+
81
+ end
@@ -1,6 +1,9 @@
1
1
  = modal(id: 'lps-modal') do
2
- = modal_header('Search For Person')
3
- = modal_body do
2
+ = modal_header do
3
+ %h3.title Search For Person
4
4
  = render partial: 'ucb_rails/lps/form'
5
+ = modal_body do
5
6
  #lps-results
6
- = modal_footer
7
+ = modal_footer do
8
+ #matches.pull-left
9
+ = modal_footer_close_button
@@ -1,21 +1,34 @@
1
- - if @lps_entries.empty?
2
- %p No records were found.
3
- - else
4
- = ucbr_table_tag(class: 'table-condensed') do
5
- %thead
6
- %tr
7
- %th{style: 'width="1%"'}
8
- %th First Name
9
- %th Last Name
10
- %th Email
11
- %th Department
12
- %tbody
13
- - @lps_entries.each do |entry|
14
- - entry_id = "ldap_uid_#{entry.uid}"
15
- %tr{id: entry_id, class: ldap_entry_class(entry)}
16
- %td= link_to_ldap_person_entry(entry)
17
- %td= entry.first_name
18
- %td= entry.last_name
19
- %td= entry.email
20
- %td= entry.departments
1
+ = ucbr_table_tag(class: 'table-condensed') do
2
+ %thead
3
+ %tr
4
+ %th{style: 'width="1%"'}
5
+ %th First Name
6
+ %th Last Name
7
+ %th Email
8
+ %th Department
9
+ %tbody
10
+ - @lps_entries.each do |entry|
11
+ - entry_id = "ldap_uid_#{entry.uid}"
12
+ %tr{id: entry_id, class: ldap_entry_class(entry)}
13
+ %td= link_to_ldap_person_entry(entry)
14
+ %td= entry.first_name
15
+ %td= entry.last_name
16
+ %td= entry.email
17
+ %td= entry.departments
21
18
 
19
+ :javascript
20
+ $('#lps-modal table').dataTable({
21
+ "bPaginate": false,
22
+ "bFilter": false,
23
+ "bInfo": false,
24
+ "oLanguage": {
25
+ "sEmptyTable": "No matches for your search."
26
+ },
27
+ "aaSorting": [ [1, "asc"], [2, "asc"] ],
28
+ "aoColumnDefs": [
29
+ { "bSortable": false, "aTargets": [ 0 ] }, // selection link
30
+ { "aDataSort": [ 1, 2 ], "aTargets": [ 1 ] }, // first name
31
+ { "aDataSort": [ 2, 1 ], "aTargets": [ 2 ] }, // last name
32
+ { "aDataSort": [ 3, 1, 2 ], "aTargets": [ 3 ] }, // department
33
+ ]
34
+ });
@@ -1,2 +1,3 @@
1
1
  - results = render :partial => 'ucb_rails/lps/results'
2
- $('#lps-results').html('#{j results}');
2
+ $('#lps-results').html('#{j results}');
3
+ $('#matches').html('#{lps_matches}');
@@ -5,12 +5,12 @@ $(function() {
5
5
  $('#first_name').val('');
6
6
  $('#last_name').val('');
7
7
  $("#lps-results").empty();
8
+ $('#matches').empty();
8
9
  }
9
10
 
10
11
  function setHiddenField(link, dataAttribute) {
11
12
  var selector = '#' + dataAttribute;
12
13
  var value = link.data(dataAttribute);
13
-
14
14
  $(selector).val(value);
15
15
  }
16
16
 
@@ -32,7 +32,6 @@ $(function() {
32
32
  // open search dialog
33
33
  $('.ldap-person-search').click(function() {
34
34
  $('#lps-modal').modal('show');
35
- $('#first_name').focus();
36
35
 
37
36
  var link = $(this);
38
37
  setHiddenFields(link);
@@ -42,11 +41,10 @@ $(function() {
42
41
  // Clear button
43
42
  $('#lps-clear').click(function() {
44
43
  clearLdapPersonSearchForm();
45
- });
44
+ });
46
45
 
47
46
  // modal shown
48
- $("#lps-modal").on('show', function() {
49
- //clearLdapPersonSearchForm();
47
+ $("#lps-modal").on('shown', function() {
50
48
  $("#first_name").focus();
51
49
  });
52
50
 
@@ -25,6 +25,11 @@ table {
25
25
  #lps-modal {
26
26
  width: 750px;
27
27
 
28
+ .title {
29
+ margin-top: 10px;
30
+ margin-bottom: 15px;
31
+ }
32
+
28
33
  form {
29
34
  input[type="text"] {
30
35
  width: 140px;
@@ -44,7 +49,7 @@ table {
44
49
  }
45
50
 
46
51
  div.control-group.lps-typeahead {
47
- i.ldap-person-search {
52
+ span.ldap-person-search {
48
53
  cursor: pointer;
49
54
  }
50
55
 
@@ -1,3 +1,3 @@
1
1
  module UcbRails
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ucb_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-15 00:00:00.000000000 Z
12
+ date: 2013-06-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -208,17 +208,17 @@ dependencies:
208
208
  requirement: !ruby/object:Gem::Requirement
209
209
  none: false
210
210
  requirements:
211
- - - ! '>='
211
+ - - ~>
212
212
  - !ruby/object:Gem::Version
213
- version: '0'
213
+ version: 0.0.2
214
214
  type: :runtime
215
215
  prerelease: false
216
216
  version_requirements: !ruby/object:Gem::Requirement
217
217
  none: false
218
218
  requirements:
219
- - - ! '>='
219
+ - - ~>
220
220
  - !ruby/object:Gem::Version
221
- version: '0'
221
+ version: 0.0.2
222
222
  - !ruby/object:Gem::Dependency
223
223
  name: bootstrap-view-helpers
224
224
  requirement: !ruby/object:Gem::Requirement
@@ -242,7 +242,7 @@ dependencies:
242
242
  requirements:
243
243
  - - ~>
244
244
  - !ruby/object:Gem::Version
245
- version: 0.0.2
245
+ version: 0.0.3
246
246
  type: :runtime
247
247
  prerelease: false
248
248
  version_requirements: !ruby/object:Gem::Requirement
@@ -250,7 +250,7 @@ dependencies:
250
250
  requirements:
251
251
  - - ~>
252
252
  - !ruby/object:Gem::Version
253
- version: 0.0.2
253
+ version: 0.0.3
254
254
  - !ruby/object:Gem::Dependency
255
255
  name: user_announcements
256
256
  requirement: !ruby/object:Gem::Requirement
@@ -546,6 +546,7 @@ files:
546
546
  - app/helpers/ucb_rails/lps_typeahead_helper.rb
547
547
  - app/helpers/ucb_rails/renderer/base.rb
548
548
  - app/helpers/ucb_rails/renderer/ldap_person_search_result_link.rb
549
+ - app/helpers/ucb_rails/renderer/lps_typeahead_search_field.rb
549
550
  - app/models/ucb_rails/ldap_person/entry.rb
550
551
  - app/models/ucb_rails/ldap_person/finder.rb
551
552
  - app/models/ucb_rails/ldap_person/test_finder.rb
@@ -557,7 +558,7 @@ files:
557
558
  - app/models/ucb_rails/user_session_manager/in_people_ou.rb
558
559
  - app/models/ucb_rails/user_session_manager/in_people_ou_add_to_users_table.rb
559
560
  - app/models/ucb_rails/user_session_manager/ldap_person_user_wrapper.rb
560
- - app/models/ucb_rails/user_table_active.rb
561
+ - app/models/ucb_rails/user_typeahead.rb
561
562
  - app/views/ucb_rails/admin/users/_form.html.haml
562
563
  - app/views/ucb_rails/admin/users/_user.html.haml
563
564
  - app/views/ucb_rails/admin/users/edit.html.haml
@@ -1,3 +0,0 @@
1
- class UcbRails::ActiveInUserTable
2
-
3
- end