vidl-toolbox 0.0.8 → 0.0.9

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.
@@ -145,6 +145,7 @@ module Toolbox
145
145
  :model_name => { :required => true, :type => [String] },
146
146
  :url => {:type => [String]},
147
147
  :direct_link => { :type => [TrueClass, FalseClass], :default => false},
148
+ :active => { :type => [Fixnum], :default => 1},
148
149
  :css_class => { :type => [String]}
149
150
 
150
151
  end
@@ -157,16 +158,18 @@ module Toolbox
157
158
  :label => { :type => [String] },
158
159
  :name => { :required => true, :type => [Symbol] },
159
160
  :model_name => { :required => true, :type => [String] },
160
- :type => { :type => [Symbol], :default => :textfield, :values => [:select, :collection_select, :auto_complete, :textfield, :radio, :date, :check_box]},
161
+ :type => { :type => [Symbol], :default => :textfield, :values => [:select, :collection_select, :auto_complete, :textfield, :textarea, :radio, :date, :check_box]},
161
162
  :url => { :type => [Symbol]},
162
- :size => { :type => [Fixnum]},
163
+ :size => { :type => [Fixnum, String]},
163
164
  :values => { :type => [Array]},
164
- :info => { :type => [String]}
165
+ :info => { :type => [String]},
166
+ :css_class => { :type => [String]}
165
167
  end
166
168
 
167
169
  # Holds the configuration for a non-editable field
168
170
  class FieldConfig < Config
169
171
  define_options :model_method => { :type => [Symbol, Proc]},
172
+ :render_method => { :type => [Symbol, Proc]},
170
173
  :hide_empty => { :default => false },
171
174
  :suppress_label => { :default => false },
172
175
  :suppress_link => { :default => false },
@@ -108,6 +108,7 @@ module Toolbox
108
108
  end
109
109
  val = rec
110
110
  end
111
+ val = nil if val == ''
111
112
  val
112
113
  end
113
114
 
@@ -117,6 +118,7 @@ module Toolbox
117
118
  # - html: if true, returns the value in html (escaped etc.)
118
119
  # The following options are used:
119
120
  # - :model_method => an alternative method or block of the object to get the display value
121
+ # - :render_method => an (helper/view) method or block that returns the rendered value (parameters: object, val, html)
120
122
  # - :hide_empty: returns nil if the display value is empty. Otherwise, an empty string
121
123
  # will be returned (or &nbsp; in case of html)
122
124
  # - :suppress_link: if the display value is an ActiveRecord usually a link to it will
@@ -129,21 +131,15 @@ module Toolbox
129
131
  # :local_date format
130
132
  def render_value(object, html = true)
131
133
  val = value(object)
132
- if val.is_a? Array
133
- if val.size > 0
134
- if @widget_config.join
135
- val.map { |v| value_text(v, html, object) }.join(@widget_config.join.to_s)
136
- else
137
- @view.content_tag 'ul' do
138
- val.map { |v| @view.content_tag 'li', value_text(v, html, object) }.join
139
- end
140
- end
141
- else # map empty array to nil
142
- value_text nil, html, object
134
+ unless val == nil && @widget_config.hide_empty
135
+ if @widget_config.render_method
136
+ render_own object, val, html
137
+ elsif val.is_a? Array
138
+ render_array object, val, html
139
+ else
140
+ value_text val, html, object
143
141
  end
144
- else # not an array
145
- value_text val, html, object
146
- end
142
+ end
147
143
  end
148
144
 
149
145
  protected
@@ -177,6 +173,30 @@ module Toolbox
177
173
  end
178
174
  text
179
175
  end
176
+
177
+ private
178
+
179
+ def render_own (object, val, html)
180
+ if @widget_config.render_method.is_a? Proc
181
+ @widget_config.render_method.call @view, object, val, html
182
+ else
183
+ @view.send @widget_config.render_method, object, val, html
184
+ end
185
+ end
186
+
187
+ def render_array (object, val, html)
188
+ if val.size > 0
189
+ if @widget_config.join
190
+ val.map { |v| value_text(v, html, object) }.join(@widget_config.join.to_s)
191
+ else
192
+ @view.content_tag 'ul' do
193
+ val.map { |v| @view.content_tag 'li', value_text(v, html, object) }.join
194
+ end
195
+ end
196
+ else # map empty array to nil
197
+ value_text nil, html, object
198
+ end
199
+ end
180
200
 
181
201
  end
182
202
 
@@ -185,59 +205,106 @@ module Toolbox
185
205
  def render_control(form, rec, has_error = false)
186
206
  options = {}
187
207
  options[:class] = 'error' if has_error
208
+ options[:class] = (options[:class] || '') + ' ' + @widget_config.css_class if @widget_config.css_class
188
209
  options[:id] = "dialog_#{form.tag_id @widget_config.name}" if @dialog
189
210
  options[:title] = @view.send(:h, @widget_config.info) if @widget_config.info
190
211
  case @widget_config.type
191
212
  when :select
192
- form.select @widget_config.name, @widget_config.values, {}, options
213
+ render_select form, rec, options
193
214
  when :collection_select
194
- form.collection_select @widget_config.name,
195
- @widget_config.values,
196
- @widget_config.model_method,
197
- @widget_config.text_method,
198
- {},
199
- options.merge({ :multiple => true })
215
+ render_collection_select form, rec, options
200
216
  when :auto_complete
201
- t = rec.class.name.underscore
202
- #id = "#{t}_#{@widget_config.name.to_s}"
203
- id = options[:id] || form.tag_id(@widget_config.name)
204
- name = @widget_config.name.to_s.foreign_key.to_sym
205
- opt = {}
206
- opt[:id] = "dialog_#{form.tag_id name}" if @dialog
207
- s = form.hidden_field name, opt
208
- s += form.text_field @widget_config.name, options.merge(:size => (@widget_config.size || 40))
209
- s += @view.content_tag("div", "", :id => "#{id}_auto_complete", :class => "auto_complete")
210
- s += @view.auto_complete_field(id,
211
- :url => @view.send(@widget_config.url),
212
- :method => :get,
213
- :param_name => :autocomplete_query,
214
- :select => 'autocomplete_name',
215
- :after_update_element => 'auto_complete_update_hidden'
216
- )
217
- s
217
+ render_autocomplete form, rec, options
218
218
  when :radio
219
- s = ''
220
- @widget_config.values.each do |val|
221
- s += form.radio_button @widget_config.name, val[1].to_s, options
222
- s += @view.content_tag('span', val[0])
223
- end
224
- s
219
+ render_radio form, rec, options
225
220
  when :check_box
226
- form.check_box @widget_config.name, options
221
+ render_checkbox form, rec, options
227
222
  when :date
228
- form.calendar_date_select @widget_config.name, options.merge(:size => (@widget_config.size || 15))
223
+ render_date form, rec, options
229
224
  when :textfield
230
- val = rec.send @widget_config.name
231
- text = val.to_s
232
- text = val.to_s(:local_date) if val.instance_of? Date
233
- text = val.to_s(:local_time) if val.instance_of? Time
234
- text = val.to_s(:local_datetime) if val.instance_of? ActiveSupport::TimeWithZone
235
- form.text_field @widget_config.name, options.merge({:size => (@widget_config.size || 40), :value => text})
236
- else
225
+ render_textfield form, rec, options
226
+ when :textarea
227
+ render_textarea form, rec, options
228
+ else
237
229
  raise "Unkown control type #{@widget_config.type}"
238
230
  end
239
231
  end
240
232
 
233
+ private
234
+
235
+ def render_select form, rec, options
236
+ form.select @widget_config.name, @widget_config.values, {}, options
237
+ end
238
+
239
+ def render_collection_select form, rec, options
240
+ form.collection_select @widget_config.name,
241
+ @widget_config.values,
242
+ @widget_config.model_method,
243
+ @widget_config.text_method,
244
+ {},
245
+ options.merge({ :multiple => true })
246
+ end
247
+
248
+ def render_autocomplete form, rec, options
249
+ t = rec.class.name.underscore
250
+ #id = "#{t}_#{@widget_config.name.to_s}"
251
+ id = options[:id] || form.tag_id(@widget_config.name)
252
+ name = @widget_config.name.to_s.foreign_key.to_sym
253
+ opt = {}
254
+ opt[:id] = "dialog_#{form.tag_id name}" if @dialog
255
+ s = form.hidden_field name, opt
256
+ s += form.text_field @widget_config.name, options.merge(:size => (@widget_config.size || 40))
257
+ s += @view.content_tag("div", "", :id => "#{id}_auto_complete", :class => "auto_complete")
258
+ s += @view.auto_complete_field(id,
259
+ :url => @view.send(@widget_config.url),
260
+ :method => :get,
261
+ :param_name => :autocomplete_query,
262
+ :select => 'autocomplete_name',
263
+ :after_update_element => 'auto_complete_update_hidden')
264
+ s
265
+ end
266
+
267
+ def render_radio form, rec, options
268
+ s = ''
269
+ @widget_config.values.each do |val|
270
+ s += form.radio_button @widget_config.name, val[1].to_s, options
271
+ s += @view.content_tag('span', val[0])
272
+ end
273
+ s
274
+ end
275
+
276
+ def render_checkbox form, rec, options
277
+ form.check_box @widget_config.name, options
278
+ end
279
+
280
+ def render_date form, rec, options
281
+ form.calendar_date_select @widget_config.name, options.merge(:size => (@widget_config.size || 15))
282
+ end
283
+
284
+ def render_textfield form, rec, options
285
+ val = rec.send @widget_config.name
286
+ text = val.to_s
287
+ text = val.to_s(:local_date) if val.instance_of? Date
288
+ text = val.to_s(:local_time) if val.instance_of? Time
289
+ text = val.to_s(:local_datetime) if val.instance_of? ActiveSupport::TimeWithZone
290
+ form.text_field @widget_config.name, options.merge({:size => (@widget_config.size || 40), :value => text})
291
+ end
292
+
293
+ def render_textarea form, rec, options
294
+ size = @widget_config.size || '40x10'
295
+ val = rec.send @widget_config.name
296
+ if val
297
+ row = 0
298
+ col = 0
299
+ val.each_line do |line|
300
+ row = row.succ
301
+ col = [col, line.length].max
302
+ end
303
+ size = "#{col}x#{row}"
304
+ end
305
+ form.text_area @widget_config.name, options.merge({:size => size})
306
+ end
307
+
241
308
  end
242
309
 
243
310
  class ActionRenderer < Renderer
@@ -266,56 +333,65 @@ module Toolbox
266
333
  model_name = @widget_config.model_name
267
334
  return nil if action == current_action
268
335
  end
269
- css_class = @widget_config.css_class || "enabled #{action}"
270
-
271
- case action
272
- when 'separator'
273
- @widget_config.name if context
274
- when 'new'
275
- # copy the _id params to save the context
276
- pars = {}
277
- pars.merge! context if context
278
- # delete self-reference
279
- pars.delete model_name + '_id'
280
- # set the object as parameter
281
- pars[rec.class.name.underscore + '_id'] = rec #if foreign_action
282
- url = @view.send("#{action}_#{model_name}_path".to_sym, pars)
283
- if context || foreign_action
284
- @view.link_to_remote label, { :url => url, :method => :get }, {:class => css_class }
285
- else
286
- @view.link_to label, url, {:class => css_class}
287
- end
288
- when 'show'
289
- @view.link_to label, @view.polymorphic_path(rec), :class => css_class
290
- when 'destroy'
291
- msg = @view.send :_, 'Are you sure?'
292
- if context
293
- url = @view.polymorphic_path(rec)
294
- @view.link_to_remote label, { :url => url, :method => :delete, :confirm => msg }, {:class => css_class }
295
- else
296
- @view.link_to label, rec, :confirm => msg, :method => :delete, :class => css_class
297
- end
298
- when 'list'
299
- @view.link_to label, @view.send("#{model_name.pluralize}_path".to_sym), :class => css_class
300
- when 'edit'
301
- url = @view.edit_polymorphic_path rec
302
- if context
303
- @view.link_to_remote label, { :url => url, :method => :get }, {:class => css_class }
304
- else
305
- @view.link_to label, url
306
- end
307
- else
308
- url = @widget_config.url || @view.formatted_polymorphic_path([rec, action]) #eval("@view.#{action}_#{model_name}_path(rec)")
309
- if context
310
- if @widget_config.direct_link
311
- @view.link_to label, url, :class => css_class
336
+ css_class = @widget_config.active == 1 ? 'enabled ' : 'disabled '
337
+ css_class += @widget_config.css_class || action
338
+
339
+ if @widget_config.active == 1
340
+ case action
341
+ when 'separator'
342
+ @widget_config.name if context
343
+ when 'new'
344
+ # copy the _id params to save the context
345
+ pars = {}
346
+ pars.merge! context if context
347
+ # delete self-reference
348
+ pars.delete model_name + '_id'
349
+ # set the object as parameter
350
+ pars[rec.class.name.underscore + '_id'] = rec #if foreign_action
351
+ url = @view.send("#{action}_#{model_name}_path".to_sym, pars)
352
+ if context || foreign_action
353
+ @view.link_to_remote label, { :url => url, :method => :get }, {:class => css_class }
354
+ else
355
+ @view.link_to label, url, {:class => css_class}
356
+ end
357
+ when 'show'
358
+ @view.link_to label, @view.polymorphic_path(rec), :class => css_class
359
+ when 'destroy'
360
+ msg = @view.send :_, 'Are you sure?'
361
+ if context
362
+ url = @view.polymorphic_path(rec)
363
+ @view.link_to_remote label, { :url => url, :method => :delete, :confirm => msg }, {:class => css_class }
312
364
  else
365
+ @view.link_to label, rec, :confirm => msg, :method => :delete, :class => css_class
366
+ end
367
+ when 'list'
368
+ @view.link_to label, @view.send("#{model_name.pluralize}_path".to_sym), :class => css_class
369
+ when 'edit'
370
+ url = @view.edit_polymorphic_path rec
371
+ if context
313
372
  @view.link_to_remote label, { :url => url, :method => :get }, {:class => css_class }
373
+ else
374
+ @view.link_to label, url
375
+ end
376
+ else
377
+ url = @widget_config.url || @view.formatted_polymorphic_path([rec, action]) #eval("@view.#{action}_#{model_name}_path(rec)")
378
+ if context
379
+ if @widget_config.direct_link
380
+ @view.link_to label, url, :class => css_class
381
+ else
382
+ @view.link_to_remote label, { :url => url, :method => :get }, {:class => css_class }
383
+ end
384
+ else
385
+ @view.link_to label, url
314
386
  end
387
+ end # case
388
+ else # if disabled
389
+ if context
390
+ @view.content_tag :a, label, :href => '#', :class => css_class
315
391
  else
316
- @view.link_to label, url
392
+ label
317
393
  end
318
- end # case
394
+ end
319
395
  end
320
396
  end
321
397
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Toolbox
3
- VERSION = '0.0.8'
3
+ VERSION = '0.0.9'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vidl-toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Nyffenegger