assoc_whisperer 1.1.1 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|