weaver 0.8.0 → 0.8.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.
@@ -0,0 +1,16 @@
1
+ module Weaver
2
+ class DynamicTableCell < Elements
3
+ attr_accessor :transform_script
4
+
5
+ def data_button(anIcon, title = {}, options = {}, &block)
6
+ options[:icon] = anIcon
7
+ options[:title] = title
8
+ options[:data] = "$(this).closest('td').data('object')"
9
+ _button(options, &block)
10
+ end
11
+
12
+ def transform(script)
13
+ @transform_script = script
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,47 @@
1
+ require 'weaver/element_types/form_elements'
2
+ module Weaver
3
+ class Form
4
+ def initialize(page, anchors, options = {}, &block)
5
+ @formName = options[:id] || page.create_anchor('form')
6
+
7
+ @form_element = FormElements.new(page, anchors, @formName, options)
8
+
9
+ @form_element.instance_eval(&block)
10
+ end
11
+
12
+ def generate_script
13
+ <<-SCRIPT
14
+ function get_#{@formName}_object()
15
+ {
16
+ var object = {}
17
+ #{@form_element.scripts.join "\n"}
18
+ return object;
19
+ }
20
+ SCRIPT
21
+ end
22
+
23
+ def generate
24
+ inner = @form_element.generate
25
+ formName = @formName
26
+ options = @form_element.options
27
+
28
+ elem = Elements.new(@page, @anchors)
29
+ elem.instance_eval do
30
+ form_opts = {
31
+ id: formName,
32
+ role: 'form'
33
+ }
34
+
35
+ form_opts[:action] = options[:action] if options[:action]
36
+ form_opts[:method] = options[:method] if options[:method]
37
+ form_opts[:class] = options[:class] if options[:class]
38
+
39
+ method_missing :form, form_opts do
40
+ text inner
41
+ end
42
+ end
43
+
44
+ elem.generate
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,297 @@
1
+ module Weaver
2
+ class FormElements < Elements
3
+ attr_accessor :options, :scripts
4
+
5
+ def initialize(page, anchors, formName, options = {})
6
+ super(page, anchors)
7
+ @formName = formName
8
+ @options = options
9
+ @scripts = []
10
+ end
11
+
12
+ def passwordfield(name, textfield_label = nil, options = {}, &block)
13
+ if textfield_label.is_a? Hash
14
+ options = textfield_label
15
+ textfield_label = nil
16
+ end
17
+
18
+ options[:type] = 'password'
19
+ textfield(name, textfield_label, options, &block)
20
+ end
21
+
22
+ def textfield(name, textfield_label = nil, options = {}, &block)
23
+ if textfield_label.is_a? Hash
24
+ options = textfield_label
25
+ textfield_label = nil
26
+ end
27
+
28
+ textfield_name = options[:id] || @page.create_anchor('textfield')
29
+ options[:type] ||= 'text'
30
+ options[:placeholder] ||= ''
31
+ options[:name] = name
32
+
33
+ input_options = {}
34
+ input_options[:type] = options[:type]
35
+ input_options[:placeholder] = options[:placeholder]
36
+ input_options[:id] = textfield_name
37
+ input_options[:name] = options[:name]
38
+ input_options[:rows] = options[:rows]
39
+ input_options[:class] = 'form-control'
40
+ input_options[:value] = options[:value]
41
+ input_options[:style] = options[:style]
42
+
43
+ input_options[:autocomplete] = options[:autocomplete] || 'on'
44
+ input_options[:autocorrect] = options[:autocorrect] || 'on'
45
+ input_options[:autocapitalize] = options[:autocapitalize] || 'off'
46
+
47
+ if options[:mask]
48
+ @page.request_css 'css/plugins/jasny/jasny-bootstrap.min.css'
49
+ @page.request_js 'js/plugins/jasny/jasny-bootstrap.min.js'
50
+
51
+ input_options[:"data-mask"] = options[:mask]
52
+ end
53
+
54
+ div class: "form-group #{options[:extra_class]}", id: "#{input_options[:id]}-group" do
55
+ label textfield_label if textfield_label
56
+
57
+ div_class = ' '
58
+ if options[:front_text] || options[:back_text]
59
+ div_class = 'input-group m-b'
60
+ end
61
+
62
+ div "class": div_class do
63
+ span (options[:front_text]).to_s, class: 'input-group-addon' if options[:front_text]
64
+ if input_options[:rows] && (input_options[:rows] > 1)
65
+ textarea input_options do
66
+ end
67
+ else
68
+ input input_options
69
+ end
70
+ span (options[:back_text]).to_s, class: 'input-group-addon' if options[:back_text]
71
+ end
72
+ end
73
+
74
+ textjs = TextfieldJavascript.new(input_options[:id])
75
+
76
+ @page.on_page_load textjs.generate(&block) if block
77
+
78
+ @scripts << <<-SCRIPT
79
+ object["#{name}"] = $('##{textfield_name}').val();
80
+ SCRIPT
81
+ end
82
+
83
+ def hiddenfield(name, value, options = {})
84
+ hiddenfield_name = options[:id] || @page.create_anchor('hiddenfield')
85
+
86
+ input_options = {}
87
+ input_options[:type] = 'hidden'
88
+ input_options[:value] = value
89
+ input_options[:id] = hiddenfield_name
90
+ input_options[:name] = name
91
+
92
+ input input_options
93
+
94
+ @scripts << <<-SCRIPT
95
+ object["#{name}"] = $('##{hiddenfield_name}').val();
96
+ SCRIPT
97
+ end
98
+
99
+ def dropdown(name, dropdown_label, choice_array, options = {})
100
+ select_name = options[:id] || @page.create_anchor('select')
101
+
102
+ options[:class] = 'form-control'
103
+ options[:name] = name
104
+ options[:id] = select_name
105
+ options[:placeholder] ||= ' '
106
+
107
+ form_options = options.clone
108
+
109
+ if options[:multiple]
110
+
111
+ if options[:multiple_style] == :chosen
112
+ @page.request_css 'css/plugins/chosen/chosen.css'
113
+ @page.request_js 'js/plugins/chosen/chosen.jquery.js'
114
+
115
+ @page.write_script_once <<-SCRIPT
116
+ var config = {
117
+ '.chosen-select' : {placeholder_text_multiple: "#{options[:placeholder]}"},
118
+ '.chosen-select-deselect' : {allow_single_deselect:true},
119
+ '.chosen-select-no-single' : {disable_search_threshold:10},
120
+ '.chosen-select-no-results': {no_results_text:'Oops, nothing found!'},
121
+ '.chosen-select-width' : {width:"95%"}
122
+ }
123
+ for (var selector in config) {
124
+ $(selector).chosen(config[selector]);
125
+ }
126
+ SCRIPT
127
+
128
+ form_options[:class] = 'chosen-select'
129
+ form_options[:style] = 'width: 100%'
130
+ end
131
+
132
+ @scripts << <<-SCRIPT
133
+ var selections = [];
134
+ $("##{select_name} option:selected").each(function(i, selected){
135
+ selections[i] = $(selected).text();
136
+ });
137
+ object["#{name}"] = selections;
138
+ SCRIPT
139
+
140
+ else
141
+ @scripts << <<-SCRIPT
142
+ object["#{name}"] = $( "##{select_name} option:selected" ).text();
143
+ SCRIPT
144
+ end
145
+
146
+ div class: 'form-group' do
147
+ label dropdown_label, class: 'control-label'
148
+
149
+ div class: 'input-group', style: 'width: 100%' do
150
+ method_missing :select, form_options do
151
+ choice_array.each do |choice|
152
+ if (options[:value]).to_s == choice.to_s
153
+ option choice, selected: true
154
+ else
155
+ option choice
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ def knob(name, options = {})
164
+ knob_name = @page.create_anchor 'knob'
165
+
166
+ @page.request_js 'js/plugins/jsKnob/jquery.knob.js'
167
+ @page.write_script_once <<-SCRIPT
168
+ $(".dial").knob();
169
+ SCRIPT
170
+
171
+ knob_options = {}
172
+
173
+ knob_options[:id] = knob_name
174
+ knob_options[:type] = 'text'
175
+ knob_options[:value] = options[:value] || '0'
176
+ knob_options[:class] = 'dial'
177
+
178
+ options.each do |key, value|
179
+ knob_options["data-#{key}".to_sym] = value
180
+ end
181
+
182
+ knob_options[:"data-fgColor"] = '#1AB394'
183
+ knob_options[:"data-width"] = '85'
184
+ knob_options[:"data-height"] = '85'
185
+
186
+ input knob_options
187
+
188
+ @scripts << <<-SCRIPT
189
+ object["#{name}"] = $('##{knob_name}').val();
190
+ SCRIPT
191
+ end
192
+
193
+ def radio(name, choice_array, options = {})
194
+ radio_name = @page.create_anchor 'radio'
195
+
196
+ choice_array = choice_array.map do |choice|
197
+ if choice.is_a? Hash
198
+ { value: choice[:value], label: choice[:label] }
199
+ else
200
+ { value: choice, label: choice }
201
+ end
202
+ end
203
+
204
+ active = choice_array[0][:value]
205
+ if options[:value] && (choice_array.index { |x| x[:value] == options[:value] } != nil)
206
+ active = options[:value]
207
+ end
208
+
209
+ div_options = {}
210
+ curobject = self
211
+ div_options[:"data-toggle"] = 'buttons' if options[:form] == :button
212
+ div div_options do
213
+ choice_array.each do |choice|
214
+ value = choice[:value]
215
+ label = choice[:label]
216
+
217
+ the_options = Hash.new(options)
218
+
219
+ the_options[:checked] = '' if active == value
220
+
221
+ if options[:form] == :button
222
+ the_options[:type] = 'radio'
223
+ the_options[:value] = value
224
+ the_options[:name] = name
225
+ the_options[:form] = :button
226
+ text curobject.boolean_element(label, the_options)
227
+ else
228
+ the_options[:type] = 'radio'
229
+ the_options[:value] = value
230
+ the_options[:name] = name
231
+ text curobject.boolean_element(label, the_options)
232
+ end
233
+ end
234
+ end
235
+
236
+ @scripts << <<-SCRIPT
237
+ object["#{name}"] = $('input[name=#{name}]:checked', '##{@formName}').val()
238
+ SCRIPT
239
+ end
240
+
241
+ def checkbox(name, checkbox_label, options = {})
242
+ checkbox_name = options[:id] || @page.create_anchor('checkbox')
243
+ options[:type] = 'checkbox'
244
+ options[:name] = name
245
+ options[:id] = checkbox_name
246
+ text boolean_element(checkbox_label, options)
247
+ @scripts << <<-SCRIPT
248
+ object["#{name}"] = $('##{checkbox_name}').is(":checked");
249
+ SCRIPT
250
+ end
251
+
252
+ def submit(anIcon, title = {}, options = {}, &block)
253
+ options[:icon] = anIcon
254
+ options[:title] = title
255
+ options[:type] = 'submit'
256
+ options[:data] = "get_#{@formName}_object()"
257
+ options[:nosubmit] = true if block
258
+ _button(options, &block)
259
+ end
260
+
261
+ def boolean_element(checkbox_label, options = {})
262
+ @page.request_css 'css/plugins/iCheck/custom.css'
263
+ @page.request_js 'js/plugins/iCheck/icheck.min.js'
264
+
265
+ @page.write_script_once <<-SCRIPT
266
+ $(document).ready(function () {
267
+ $('.i-checks').iCheck({
268
+ checkboxClass: 'icheckbox_square-green',
269
+ radioClass: 'iradio_square-green',
270
+ });
271
+ });
272
+ SCRIPT
273
+
274
+ label_options = {}
275
+ elem = Elements.new(@page, @anchors)
276
+ elem.instance_eval do
277
+ if options[:form] == :button
278
+ options.delete(:form)
279
+ label class: 'btn btn-primary btn-block btn-outline' do
280
+ input options
281
+ text checkbox_label.to_s
282
+ end
283
+ else
284
+ div class: 'i-checks' do
285
+ label label_options do
286
+ input options do
287
+ text " #{checkbox_label}"
288
+ end
289
+ end
290
+ end
291
+ end
292
+ end
293
+
294
+ elem.generate
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,28 @@
1
+ module Weaver
2
+ class JavaScriptObject
3
+ def initialize(&block)
4
+ @object = {}
5
+ instance_eval(&block) if block
6
+ end
7
+
8
+ def string(name, string)
9
+ @object[name] = { type: :string, value: string }
10
+ end
11
+
12
+ def variable(name, var_name)
13
+ @object[name] = { type: :var, value: var_name }
14
+ end
15
+
16
+ def generate
17
+ result = @object.map do |key, value|
18
+ value_expression = value[:value]
19
+
20
+ value_expression = "\"#{value[:value]}\"" if value[:type] == :string
21
+
22
+ "#{key}: #{value_expression}"
23
+ end.join ','
24
+
25
+ "{#{result}}"
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,68 @@
1
+ module Weaver
2
+ # Modal dialog feature
3
+ class ModalDialog
4
+ def initialize(page, anchors, id, &block)
5
+ @page = page
6
+ @anchors = anchors
7
+ @id = id || @page.create_anchor('modal')
8
+
9
+ @header_content = Elements.new(@page, @anchors)
10
+ @body_content = Elements.new(@page, @anchors)
11
+ @footer_content = Elements.new(@page, @anchors)
12
+
13
+ instance_eval(&block) if block
14
+ end
15
+
16
+ attr_reader :id
17
+
18
+ def header(&block)
19
+ @header_content.instance_eval(&block)
20
+ end
21
+
22
+ def body(&block)
23
+ @body_content.instance_eval(&block)
24
+ end
25
+
26
+ def footer(&block)
27
+ @footer_content.instance_eval(&block)
28
+ end
29
+
30
+ def generate
31
+ elem = Elements.new(@page, @anchors)
32
+
33
+ id = @id
34
+ header_content = @header_content
35
+ body_content = @body_content
36
+ footer_content = @footer_content
37
+
38
+ elem.instance_eval do
39
+ div class: 'modal fade', id: id, tabindex: -1, role: 'dialog' do
40
+ div class: 'modal-dialog', role: 'document' do
41
+ div class: 'modal-content' do
42
+ div class: 'modal-header' do
43
+ button '&times;', type: 'button', class: 'close', "data-dismiss": 'modal', "aria-label": 'Close'
44
+ text header_content.generate
45
+ end
46
+ div class: 'modal-body' do
47
+ text body_content.generate
48
+ end
49
+ div class: 'modal-footer' do
50
+ text footer_content.generate
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ elem.generate
58
+ end
59
+ end
60
+
61
+ # add modal dialog to elements
62
+ class Elements
63
+ def modal(id = nil, &block)
64
+ mm = ModalDialog.new(@page, @anchors, id, &block)
65
+ @inner_content << mm.generate
66
+ end
67
+ end
68
+ end