assoc_whisperer 1.1.1 → 1.2.1
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/assoc_whisp.js +14 -5
- data/app/helpers/action_view/helpers/assoc_whisperer_helper.rb +4 -14
- data/app/helpers/action_view/helpers/tags/assoc_whisperer_field.rb +15 -23
- data/lib/assoc_whisperer.rb +19 -2
- data/lib/assoc_whisperer/template.rb +53 -0
- data/lib/assoc_whisperer/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e3b0faee0f011a70f467c0952840bf4f9769b2d7
|
|
4
|
+
data.tar.gz: 3c79fa3dd430cd87812df970f2587c3582fedbf0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 03278adaba130fbe47971380cfb6c34c3835fd19d1aa8fd2df0a7f018f658ecfac25a976e642761ec4bd0c3a9b0cfd8cb06e09f5f2bb01bd080a7138514d915d
|
|
7
|
+
data.tar.gz: c368cf1dcb3f33d4fb6c258d810d6a197403da440f411cff62aafe43b46d02edca3424db4383ee965c5c707ee0a29e8d934653045c64573970b9bb2fd4a31883
|
|
@@ -15,7 +15,7 @@ document.AssocWhisperer = (function () {
|
|
|
15
15
|
|
|
16
16
|
// This is where Whisperer Object is created - with all hidden inner methods.
|
|
17
17
|
function createWhisperer(dom_node) {
|
|
18
|
-
var el, w, _nodes, _timer;
|
|
18
|
+
var el, w, _nodes, opts, params, _timer;
|
|
19
19
|
|
|
20
20
|
el = $(dom_node);
|
|
21
21
|
_nodes = {
|
|
@@ -24,16 +24,23 @@ document.AssocWhisperer = (function () {
|
|
|
24
24
|
value_field: el.children('.value_field'),
|
|
25
25
|
list: null
|
|
26
26
|
};
|
|
27
|
+
opts = el.data('opts');
|
|
28
|
+
if (!opts['action']) throw 'Missing action in '+JSON.stringify(opts);
|
|
29
|
+
if (!opts['url']) throw 'Missing url in '+JSON.stringify(opts);
|
|
30
|
+
if (typeof opts['params']!=='object') opts['params'] = {};
|
|
27
31
|
|
|
28
32
|
w = Object.create(proto, {
|
|
29
33
|
nodes: {value: _nodes},
|
|
30
|
-
action: {value:
|
|
31
|
-
url: {value:
|
|
34
|
+
action: {value: opts['action']},
|
|
35
|
+
url: {value: opts['url']},
|
|
36
|
+
params: {value: opts['params']},
|
|
32
37
|
focused: {value: false, writable: true},
|
|
33
38
|
filled: {value: _nodes['value_field'].val()!=='', writable: true},
|
|
34
|
-
client_side: {value:
|
|
39
|
+
client_side: {value: opts['cs']===true},
|
|
40
|
+
preload: {value: opts['pre']===true},
|
|
35
41
|
full_data: {value: null, writable: true}
|
|
36
42
|
});
|
|
43
|
+
w.params['data_action'] = w.action;
|
|
37
44
|
|
|
38
45
|
_nodes.text_field.on('keyup', function(e){
|
|
39
46
|
var input_text;
|
|
@@ -101,6 +108,7 @@ document.AssocWhisperer = (function () {
|
|
|
101
108
|
});
|
|
102
109
|
}
|
|
103
110
|
});
|
|
111
|
+
el.children('.dropdown_button').removeClass('querying'); // css class is set, hence gif gets pre-loaded
|
|
104
112
|
|
|
105
113
|
// For local full_data finds matching rows and shows them.
|
|
106
114
|
function digest(input_text) {
|
|
@@ -179,10 +187,11 @@ document.AssocWhisperer = (function () {
|
|
|
179
187
|
klass.querying = true;
|
|
180
188
|
btn = w.nodes['base'].find('.dropdown_button');
|
|
181
189
|
btn.addClass('querying');
|
|
190
|
+
w.params['input'] = input || '';
|
|
182
191
|
$.ajax(w.url, {
|
|
183
192
|
type: 'GET',
|
|
184
193
|
dataType: 'html',
|
|
185
|
-
data:
|
|
194
|
+
data: w.params,
|
|
186
195
|
error: function () { w.removeList(); },
|
|
187
196
|
success: on_success,
|
|
188
197
|
complete: function () {
|
|
@@ -32,28 +32,18 @@ module ActionView
|
|
|
32
32
|
# And the 'value_field' would be filled by +manager_id+ of +worker+ associated to +task+, 'text_field' by his +full_name+
|
|
33
33
|
#
|
|
34
34
|
def assoc_whisperer(object_name, method, data_action, options={})
|
|
35
|
+
raise "Helper '#assoc_whisperer' is for Rails >= 4.x. Use '#assoc_whisperer_tag' instead." if Rails::VERSION::STRING.to_i < 4
|
|
35
36
|
wrapper_assoc_whisperer_assets
|
|
36
37
|
|
|
37
|
-
options[:url] = AssocWhisperer.def_url unless options.has_key? :url
|
|
38
38
|
Tags::AssocWhispererField.new(object_name, method, self, data_action, options).render
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def assoc_whisperer_tag(name, data_action, options = {})
|
|
42
42
|
wrapper_assoc_whisperer_assets
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
content = %Q(<input class="value_field" id="#{sanitized_id}" name="#{name}" type="hidden")
|
|
49
|
-
content << %Q( value="#{options[:value]}">)
|
|
50
|
-
content << %Q(<input autocomplete="off" class="text_field#{' unfilled' if options[:value].blank?}")
|
|
51
|
-
content << %Q( id="#{sanitized_id}_txt" name="#{text_tag_name}" size="#{options[:size]||12}")
|
|
52
|
-
content << %Q( type="text" value="#{options[:text]}">)
|
|
53
|
-
content << %Q(<span class="dropdown_button">\u25BE</span>)
|
|
54
|
-
content_tag :span, content.html_safe, 'data-url' => (options[:url]||AssocWhisperer.def_url),
|
|
55
|
-
'data-action' => data_action, 'data-client-side' => (options[:client_side] && 'true'),
|
|
56
|
-
'class' => 'assoc_whisperer'
|
|
44
|
+
template = AssocWhisperer::Template.new data_action, options
|
|
45
|
+
content_tag :span, template.simple_tag_contents(name).html_safe, 'class' => 'assoc_whisperer',
|
|
46
|
+
'data-opts' => template.whisperer_options.to_json
|
|
57
47
|
end
|
|
58
48
|
|
|
59
49
|
private
|
|
@@ -4,21 +4,19 @@ module ActionView
|
|
|
4
4
|
class AssocWhispererField < Base # :nodoc:
|
|
5
5
|
|
|
6
6
|
def initialize(object_name, method_name, template_object, action, options={})
|
|
7
|
-
|
|
8
|
-
options[:
|
|
9
|
-
options[:text_method] = :to_s unless options.has_key? :text_method
|
|
7
|
+
options[:value_method] = AssocWhisperer.def_value_method unless options.has_key? :value_method
|
|
8
|
+
options[:text_method] = AssocWhisperer.def_text_method unless options.has_key? :text_method
|
|
10
9
|
super object_name, method_name, template_object, options
|
|
10
|
+
@template = AssocWhisperer::Template.new action, @options
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def render
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
content_tag :span, content.html_safe, 'data-url' => @options[:url], 'data-action' => @action,
|
|
21
|
-
'data-client-side' => (@options[:client_side] && 'true'), 'class' => 'assoc_whisperer'
|
|
14
|
+
contents = @template.value_field_tag value_tag_id, value_tag_name, value_tag_value
|
|
15
|
+
contents += @template.text_field_tag text_tag_id, text_tag_name, text_tag_value, !whispered_object
|
|
16
|
+
contents += @template.dropdown_button_tag
|
|
17
|
+
|
|
18
|
+
content_tag :span, contents.html_safe, 'class' => 'assoc_whisperer',
|
|
19
|
+
'data-opts' => @template.whisperer_options.to_json
|
|
22
20
|
end
|
|
23
21
|
|
|
24
22
|
private
|
|
@@ -41,7 +39,7 @@ module ActionView
|
|
|
41
39
|
end
|
|
42
40
|
|
|
43
41
|
def text_tag_value
|
|
44
|
-
text = @
|
|
42
|
+
text = @template.opts[:text_method]
|
|
45
43
|
text = if text.respond_to? :call
|
|
46
44
|
text.call whispered_object
|
|
47
45
|
else
|
|
@@ -51,13 +49,7 @@ module ActionView
|
|
|
51
49
|
end
|
|
52
50
|
|
|
53
51
|
def text_sanitized_method_name
|
|
54
|
-
|
|
55
|
-
wsmn = if @options[:name]
|
|
56
|
-
"#{@options[:name]}_txt"
|
|
57
|
-
else
|
|
58
|
-
"#{@method_name}_txt"
|
|
59
|
-
end
|
|
60
|
-
@text_sanitized_method_name = wsmn.sub(/\?$/,"")
|
|
52
|
+
@text_sanitized_method_name ||= "#{@template.opts[:name] || @method_name}_txt".sub(/\?$/,"")
|
|
61
53
|
end
|
|
62
54
|
|
|
63
55
|
def value_tag_name
|
|
@@ -69,15 +61,15 @@ module ActionView
|
|
|
69
61
|
end
|
|
70
62
|
|
|
71
63
|
def value_tag_value
|
|
72
|
-
whispered_object_attribute @
|
|
64
|
+
whispered_object_attribute @template.opts[:value_method]
|
|
73
65
|
end
|
|
74
66
|
|
|
75
67
|
def value_sanitized_method_name
|
|
76
68
|
return @value_sanitized_method_name if defined? @value_sanitized_method_name
|
|
77
|
-
wsmn = if @
|
|
78
|
-
@
|
|
69
|
+
wsmn = if @template.opts[:name]
|
|
70
|
+
@template.opts[:name].to_s
|
|
79
71
|
else
|
|
80
|
-
"#{@method_name}_#{@
|
|
72
|
+
"#{@method_name}_#{@template.opts[:value_method]}"
|
|
81
73
|
end
|
|
82
74
|
@value_sanitized_method_name = wsmn.sub(/\?$/,"")
|
|
83
75
|
end
|
data/lib/assoc_whisperer.rb
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
require
|
|
2
|
+
require 'assoc_whisperer/version'
|
|
3
|
+
require 'assoc_whisperer/template'
|
|
3
4
|
|
|
4
5
|
module AssocWhisperer
|
|
5
6
|
|
|
6
7
|
class << self
|
|
7
|
-
attr_accessor :def_url, :attach_assets_method
|
|
8
|
+
attr_accessor :def_url, :attach_assets_method, :def_value_method, :def_text_method
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
module Rails
|
|
@@ -12,7 +13,23 @@ module AssocWhisperer
|
|
|
12
13
|
end
|
|
13
14
|
end
|
|
14
15
|
|
|
16
|
+
def self.value_field_html(id, name, value)
|
|
17
|
+
%(<input type="hidden" id="#{id}" name="#{name}" value="#{value}" class="value_field">)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.text_field_html(id, name, value, unfilled=true, opts={})
|
|
21
|
+
opts = opts.keys.inject([]){|arr, k| arr << %(#{k}="#{opts[k]}"); arr }*' '
|
|
22
|
+
%(<input type="text" id="#{id}" name="#{name}" value="#{value} class="text_field#{' unfilled' if unfilled}"#{opts}>)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.dropdown_button_html
|
|
26
|
+
@dropdown_button_html ||= "<span class=\"dropdown_button\">\u25BE</span>"
|
|
27
|
+
end
|
|
28
|
+
|
|
15
29
|
end
|
|
16
30
|
|
|
17
31
|
AssocWhisperer.def_url = '/whisp'
|
|
18
32
|
AssocWhisperer.attach_assets_method = :attach_assoc_whisperer_assets
|
|
33
|
+
|
|
34
|
+
AssocWhisperer.def_value_method = :id
|
|
35
|
+
AssocWhisperer.def_text_method = :to_s
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module AssocWhisperer
|
|
4
|
+
class Template
|
|
5
|
+
attr_reader :action, :opts
|
|
6
|
+
|
|
7
|
+
def initialize(action, opts={})
|
|
8
|
+
@action = action
|
|
9
|
+
@opts = opts
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def simple_tag_contents(input_name)
|
|
13
|
+
input_name = input_name.to_s
|
|
14
|
+
sanitized_id = input_name.dup.delete(']').gsub(/[^-a-zA-Z0-9:.]/, "_")
|
|
15
|
+
text_tag_name = input_name.dup
|
|
16
|
+
text_tag_name.insert (text_tag_name[-1]==']' ? -2 : -1), '_txt'
|
|
17
|
+
|
|
18
|
+
contents = value_field_tag sanitized_id, input_name, @opts[:value]
|
|
19
|
+
contents += text_field_tag "#{sanitized_id}_txt", text_tag_name, @opts[:text], @opts[:value].blank?
|
|
20
|
+
contents + dropdown_button_tag
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def whisperer_options
|
|
24
|
+
h = {url: (@opts[:url]||AssocWhisperer.def_url), action: @action}
|
|
25
|
+
h.merge cs: true, pre: !!@opts[:preload] if @opts[:client_side]
|
|
26
|
+
h[:params] = @opts[:params] unless @opts[:params].blank?
|
|
27
|
+
h
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def value_field_tag(id, name, value)
|
|
31
|
+
%(<input type="hidden" id="#{id}" name="#{name}" value="#{value}" class="value_field">)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def text_field_tag(id, name, value, unfilled=true)
|
|
35
|
+
opts = @opts[:text_field]
|
|
36
|
+
if opts
|
|
37
|
+
opts[:size] ||= 12
|
|
38
|
+
keys_whitelist = (opts.keys & [:size, :placeholder, :maxlength, :title])
|
|
39
|
+
opts = keys_whitelist.inject [] do |arr, k|
|
|
40
|
+
arr << %(#{k}="#{opts[k]}")
|
|
41
|
+
arr
|
|
42
|
+
end
|
|
43
|
+
opts = opts * ' '
|
|
44
|
+
end
|
|
45
|
+
%(<input type="text" autocomplete="off" id="#{id}" name="#{name}" value="#{value}" class="text_field#{' unfilled' if unfilled}"#{opts}>)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def dropdown_button_tag
|
|
49
|
+
"<span class=\"dropdown_button querying\">\u25BE</span>"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: assoc_whisperer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ondřej Želazko
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-10-
|
|
11
|
+
date: 2014-10-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -60,6 +60,7 @@ files:
|
|
|
60
60
|
- app/views/assoc_whisperer/list_array.html.erb
|
|
61
61
|
- assoc_whisperer.gemspec
|
|
62
62
|
- lib/assoc_whisperer.rb
|
|
63
|
+
- lib/assoc_whisperer/template.rb
|
|
63
64
|
- lib/assoc_whisperer/version.rb
|
|
64
65
|
homepage: ''
|
|
65
66
|
licenses:
|