king_views 1.0.0
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.
- data/MIT-LICENSE +20 -0
- data/README.rdoc +84 -0
- data/Rakefile +31 -0
- data/VERSION +1 -0
- data/init.rb +3 -0
- data/king_form/MIT-LICENSE +20 -0
- data/king_form/README.rdoc +64 -0
- data/king_form/Rakefile +23 -0
- data/king_form/init.rb +1 -0
- data/king_form/lib/king_form.rb +19 -0
- data/king_form/lib/king_form/builder/base.rb +238 -0
- data/king_form/lib/king_form/builder/definition_list.rb +119 -0
- data/king_form/lib/king_form/builder/form_fields.rb +333 -0
- data/king_form/lib/king_form/builder/form_fields_overrides.rb +146 -0
- data/king_form/lib/king_form/builder/labeled.rb +116 -0
- data/king_form/lib/king_form/helper.rb +97 -0
- data/king_form/lib/king_form/nested_form_helper.rb +61 -0
- data/king_form/lib/king_form/overrides.rb +25 -0
- data/king_form/tasks/king_forms_tasks.rake +4 -0
- data/king_form/test/king_forms_test.rb +8 -0
- data/king_form/test/test_helper.rb +3 -0
- data/king_format/MIT-LICENSE +20 -0
- data/king_format/README.rdoc +20 -0
- data/king_format/Rakefile +23 -0
- data/king_format/init.rb +1 -0
- data/king_format/lib/helpers/date_helper.rb +25 -0
- data/king_format/lib/helpers/formatting_helper.rb +108 -0
- data/king_format/lib/helpers/money_helper.rb +63 -0
- data/king_format/lib/king_format.rb +14 -0
- data/king_format/lib/model_mixins/has_date_fields.rb +42 -0
- data/king_format/lib/model_mixins/has_money_fields.rb +42 -0
- data/king_format/lib/model_mixins/has_percent_fields.rb +34 -0
- data/king_format/tasks/king_format_tasks.rake +4 -0
- data/king_format/test/king_format_test.rb +8 -0
- data/king_format/test/test_helper.rb +3 -0
- data/king_list/MIT-LICENSE +20 -0
- data/king_list/README.rdoc +21 -0
- data/king_list/Rakefile +23 -0
- data/king_list/init.rb +1 -0
- data/king_list/lib/king_list.rb +18 -0
- data/king_list/lib/king_list/app_helper.rb +30 -0
- data/king_list/lib/king_list/builder/show.rb +71 -0
- data/king_list/lib/king_list/builder/table.rb +166 -0
- data/king_list/lib/king_list/list_helper.rb +329 -0
- data/king_list/lib/king_list/overrides.rb +6 -0
- data/king_list/tasks/king_list_tasks.rake +4 -0
- data/king_list/test/king_list_test.rb +8 -0
- data/king_list/test/test_helper.rb +3 -0
- data/king_views.gemspec +85 -0
- metadata +110 -0
@@ -0,0 +1,119 @@
|
|
1
|
+
module KingForm
|
2
|
+
module Builder
|
3
|
+
# Subclass of the KingFormBuilder for forms/fields wrapped inside a Definition List dl>dt,dd.
|
4
|
+
# This class just overides the nessessary html wrapping function of the KingFormBuilder.
|
5
|
+
#
|
6
|
+
# ====Example haml
|
7
|
+
# - dl_form_for(current_object) do |f|
|
8
|
+
# = f.section _('legend.user.details') do
|
9
|
+
# = f.text :first_name
|
10
|
+
# = f.text :last_name
|
11
|
+
#
|
12
|
+
# => # <fieldset>
|
13
|
+
# <legend>User Details</legend>
|
14
|
+
# <dl>
|
15
|
+
# <dt>Firstname</dt>
|
16
|
+
# <dd><input type='text' value='Otto'/></dd>
|
17
|
+
# <dt>Lastname</dt>
|
18
|
+
# <dd><input type='text' value='Bismark'/></dd>
|
19
|
+
# </dl>
|
20
|
+
# </fieldset>
|
21
|
+
#
|
22
|
+
class DefinitionList < KingForm::Builder::Base
|
23
|
+
|
24
|
+
# Create a section(fieldset) within a form
|
25
|
+
# A section is a group of related object information with name/value pairs,
|
26
|
+
# like all dates of an object or the users name fields(last/first/title/nick).
|
27
|
+
#
|
28
|
+
# A section html consists of a fieldset > legend > dl > dt > dd
|
29
|
+
# The dt holds the title/description (DefinitionType) of the current field
|
30
|
+
# The dd holds the value.
|
31
|
+
# This wrapup is preferred over ul/li or other listing types because of
|
32
|
+
# the semantic meaning of the html
|
33
|
+
#
|
34
|
+
#===Example haml
|
35
|
+
# = f.section _('legend.user.details') do
|
36
|
+
# = f.text :first_name
|
37
|
+
# = f.text :last_name
|
38
|
+
#
|
39
|
+
# => # <fieldset>
|
40
|
+
# <legend>User Details</legend>
|
41
|
+
# <dl>
|
42
|
+
# <dt>Firstname</dt>
|
43
|
+
# <dd><input type='text' value='Otto'/></dd>
|
44
|
+
# <dt>Lastname</dt>
|
45
|
+
# <dd><input type='text' value='Bismark'/></dd>
|
46
|
+
# </dl>
|
47
|
+
# </fieldset>
|
48
|
+
#
|
49
|
+
# = f.section 'User', :class=>'settings', :dl=>{:class=>'left'}
|
50
|
+
#
|
51
|
+
# => # <fieldset class='settings'>
|
52
|
+
# <legend>User</legend>
|
53
|
+
# <dl class='left'>
|
54
|
+
def section(title = nil, options = {}, &block)
|
55
|
+
raise ArgumentError if title && !title.is_a?(String)
|
56
|
+
dl_options = options[:dl] || {}
|
57
|
+
@template.haml_tag :fieldset, options do
|
58
|
+
@template.haml_tag :legend, title unless title.blank?
|
59
|
+
@template.haml_tag :dl, dl_options do
|
60
|
+
@template.haml_concat( @template.capture_haml(&block) )
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# add titles to Input-Tag and embed/wrap in dt/dd
|
66
|
+
#
|
67
|
+
# ==== Parameter
|
68
|
+
# fieldname_or_title<Symbol, String>:: The fieldname to be used as the title in dt
|
69
|
+
# tags<String>:: a bunch of html/haml tags
|
70
|
+
# options<Hash{Symbol=>String}>: Hash with following keys
|
71
|
+
# ==== Options:
|
72
|
+
# :dt => options hash for dt
|
73
|
+
# :dd => options hash for dd
|
74
|
+
def tag_wrapper(fieldname_or_title, tags, options = {})
|
75
|
+
if @config[:bundle] # called from "bundle" => dt/dd-wrapping is made outside
|
76
|
+
@bundle_counter += 1
|
77
|
+
tags.to_s
|
78
|
+
elsif @config[:table] # called from "table" => build a table cell (td)
|
79
|
+
# Only in first row: Build column header
|
80
|
+
if @config[:row_number] == 1
|
81
|
+
@config[:column_header].push :title => build_title(fieldname_or_title),
|
82
|
+
:options => { :align => options[:align] || 'left' }
|
83
|
+
end
|
84
|
+
@template.capture_haml do #MUST return as string
|
85
|
+
@template.haml_tag(:td, tags.to_s, options)
|
86
|
+
end
|
87
|
+
else #wrap or no wrap
|
88
|
+
@no_wrap ? tags : dt_tag(fieldname_or_title, options[:dt]) + dd_tag(tags.to_s, options[:dd])
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Show multiple inputs in one line (dd tag)
|
93
|
+
# === Example haml
|
94
|
+
# - f.bundle _('Gender and Title') do
|
95
|
+
# = f.selection :gender
|
96
|
+
# = f.text :title, :medium
|
97
|
+
#
|
98
|
+
def bundle(title = nil, options = {}, &block)
|
99
|
+
@config[:bundle] = true
|
100
|
+
@bundle_counter = 0
|
101
|
+
tags = @template.capture(&block)
|
102
|
+
@config[:bundle] = false
|
103
|
+
@template.concat( @config[:table] ? tag_wrapper(title, tags) : tag_wrapper(title, tags, :dt => options, :dd => { :class => "elements_#{@bundle_counter}" }) )
|
104
|
+
end
|
105
|
+
|
106
|
+
# The definition type dt tag
|
107
|
+
def dt_tag(fieldname_or_title, options = {})
|
108
|
+
fieldname_or_title.blank? ? "" : content_tag(:dt, build_title(fieldname_or_title), options)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Build dd-tag
|
112
|
+
# Parameter "tags" may be a string or an array of strings
|
113
|
+
def dd_tag(tags, options = {})
|
114
|
+
tags.blank? ? '' : content_tag(:dd, tags.to_s, options)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,333 @@
|
|
1
|
+
module KingForm
|
2
|
+
module Builder
|
3
|
+
module FormFields
|
4
|
+
##########################################################################
|
5
|
+
# Convinience Methods for simpler template tags
|
6
|
+
##########################################################################
|
7
|
+
|
8
|
+
# Generate input tag with title for text editing
|
9
|
+
# ==== Example
|
10
|
+
# 1) text :name
|
11
|
+
# 2) text :name, :title => 'Your Name:', :value => @the_name, :size=>30, .maxlength=>35
|
12
|
+
#
|
13
|
+
# ==== Parameter
|
14
|
+
# fieldname<Symbol, String>:: The field name of the current object
|
15
|
+
# options<Hash{Symbol=>Sting}:: Options to customize the output
|
16
|
+
# ==== Options
|
17
|
+
# :title => the title for the field
|
18
|
+
# :maxlength => the maxlength for the field, defaults to the columns limit
|
19
|
+
# :size => the size for the field, defaults to 25 or the columns minimun length
|
20
|
+
# :value => the value if it differs from th the fields value
|
21
|
+
def text(fieldname, options={})
|
22
|
+
title = options.delete(:title) || build_title(fieldname)
|
23
|
+
|
24
|
+
if current_object.is_a?(ActiveRecord::Base)
|
25
|
+
if column = current_object.class.columns_hash[fieldname.to_s]
|
26
|
+
# Limit the length of input to the column capacity
|
27
|
+
options[:maxlength] ||= column.limit
|
28
|
+
# Limit the displayed width to 25 (or to the column capacity, if smaller)
|
29
|
+
options[:size] ||= [25, column.limit].min
|
30
|
+
end
|
31
|
+
tag_wrapper title, text_field(fieldname, options)
|
32
|
+
else
|
33
|
+
value = options.delete(:value) || current_value(fieldname)
|
34
|
+
tag_wrapper title, text_field_tag(fieldname, value, options)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Generate hidden field tag
|
39
|
+
# ==== Example
|
40
|
+
# Default usage:
|
41
|
+
# - dl_form_for @email do |e|
|
42
|
+
# = e.hidden :some_token
|
43
|
+
# => <input type='hidden' value='value of email.some_token' name=email[some_token]..>
|
44
|
+
# Custom fieldname passed in as string:
|
45
|
+
# e.hidden 'email[attachment_ids][]', value =>' '
|
46
|
+
# => <input type='hidden' value=' ' name='email[attachment_ids][]'..>
|
47
|
+
# ==== Parameter
|
48
|
+
# fieldname<String>:: The fieldname and the value for it (on current object)
|
49
|
+
# fieldname<Symbol>:: If there is an AR:Base Object present the fieldname and
|
50
|
+
# the options are passed to hidden_field
|
51
|
+
# options<Hash>:: default options for hidden_field and hidden_fiel_tag plus:
|
52
|
+
# :value => the value to insert
|
53
|
+
def hidden(fieldname, options={})
|
54
|
+
if current_object.is_a?(ActiveRecord::Base) && fieldname.is_a?(Symbol)
|
55
|
+
hidden_field(fieldname, options)
|
56
|
+
else # not an AR object, or a custom field
|
57
|
+
value = options.delete(:value) || current_value(fieldname)
|
58
|
+
hidden_field_tag(fieldname, value, options)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Generate password input tag with title
|
63
|
+
#
|
64
|
+
# ==== Example
|
65
|
+
# password :password
|
66
|
+
# password(:pasword, :title => 'What is your password?', :value => @the_password)
|
67
|
+
def password(fieldname, options={})
|
68
|
+
title = options.delete(:title) || build_title(fieldname)
|
69
|
+
|
70
|
+
if current_object.is_a?(ActiveRecord::Base)
|
71
|
+
tag_wrapper title, password_field(fieldname, options)
|
72
|
+
else
|
73
|
+
value = options.delete(:value) || current_value(fieldname)
|
74
|
+
tag_wrapper title, password_field_tag(fieldname, value, options)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Generate textarea input tag with title for multiple line text editing
|
79
|
+
#
|
80
|
+
# ==== Parameters
|
81
|
+
# fieldname<Symbol>:: the name of the textarea
|
82
|
+
# options<Hash>:: options which will be passed on to textarea helper
|
83
|
+
# html_options<Hash>:: options which will be passed on to the wrapping element
|
84
|
+
#
|
85
|
+
# ==== Example
|
86
|
+
# 1) memo(:notes)
|
87
|
+
# 2) memo(:comment, :title => 'Comment', :value => @the_comment)
|
88
|
+
def memo(fieldname, options={}, html_options={})
|
89
|
+
title = options.delete(:title) || build_title(fieldname)
|
90
|
+
|
91
|
+
if current_object.is_a?(ActiveRecord::Base)
|
92
|
+
tag_wrapper title, text_area(fieldname, options), html_options
|
93
|
+
else
|
94
|
+
value = options.delete(:value) || current_value(fieldname)
|
95
|
+
tag_wrapper title, text_area_tag(fieldname, value, options),html_options
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Generate date select tags (day/month/year) with title
|
100
|
+
#
|
101
|
+
# ==== Example
|
102
|
+
# date :birthday, :title => 'Geburtstag'
|
103
|
+
def date(fieldname, options={}, html_options={})
|
104
|
+
title = options.delete(:title) || build_title(fieldname)
|
105
|
+
options[:include_blank] ||= true
|
106
|
+
css_class = options[:class] || ''
|
107
|
+
tag_wrapper title, date_select(fieldname, options, html_options), :dd => { :class => css_class + ' dates' }, :dt => {:class => css_class}
|
108
|
+
end
|
109
|
+
|
110
|
+
# Generate datetime select tags (day/month/year and hour/minute) with title
|
111
|
+
#
|
112
|
+
# Usage:
|
113
|
+
# datetime :starts_at, :title => 'Beginnt um'
|
114
|
+
def datetime(fieldname, options={})
|
115
|
+
title = options.delete(:title) || build_title(fieldname)
|
116
|
+
options[:include_blank] ||= true
|
117
|
+
|
118
|
+
tag_wrapper title, datetime_select(fieldname, options), :dd => { :class => 'dates' }
|
119
|
+
end
|
120
|
+
|
121
|
+
# Generate select tag with title for text editing
|
122
|
+
#
|
123
|
+
# === Example haml
|
124
|
+
# - dl_fields_for @user do |u|
|
125
|
+
# = u.selection :gender
|
126
|
+
# = u.selection :currency, { :choices => %w(EUR USW JPY) }, { :class => 'my-css-class' }
|
127
|
+
# = u.selection :status, :title => 'Invoice status', :choices => %w(draft published)
|
128
|
+
# = u.selection 'user[custom_field]', :title => 'Invoice status', :choices => %w(draft published)
|
129
|
+
#
|
130
|
+
# - dl_fields_for 'custom_obj' do |c|
|
131
|
+
# = c.selection :project_id, :choices => @projects, :title => 'Projects'
|
132
|
+
# = c.selection 'custom_obj[pills]', :choices => @red_pills, :title => "Choose your Pill", :info=>'Help text'
|
133
|
+
#
|
134
|
+
# ==== Parameter
|
135
|
+
# fieldname<String, Symbol>:: The name of the field. Used to build the translated title, find enum values.
|
136
|
+
# When passing a string, the field is not looked up on the current AR Object,
|
137
|
+
# use it to give it some custom name, which does not exist on the object
|
138
|
+
# options<Hash{Symbol=>String}>::options to configure the select behaviour
|
139
|
+
# html_options<Hash{Symbol=>String}>::options passed to the html options of the select
|
140
|
+
#
|
141
|
+
# ==== Options (options)
|
142
|
+
# :title<String>:: Field title, used in dt or label tag
|
143
|
+
# :choices<(Array[Strings],Array[Array[String,String]],Hash)>:: The choice for the select.
|
144
|
+
# :value<String>::The value of the select which will be used as selected unless selected is given. Defaults to the current objects.fieldname => value
|
145
|
+
# :selected<String>:: The selected value is taken from value
|
146
|
+
# :include_blank<Boolean>:: true/false (default is true)
|
147
|
+
# ==== Options (html_options)
|
148
|
+
# see select and select_tag in rails
|
149
|
+
def selection(fieldname, options={}, html_options={})
|
150
|
+
title = options.delete(:title) || build_title(fieldname)
|
151
|
+
choices = options.delete(:choices) || enum_values(fieldname) || []
|
152
|
+
value = options.delete(:value) || current_value(fieldname)
|
153
|
+
options[:include_blank] = true unless options.has_key?(:include_blank)
|
154
|
+
options[:selected] ||= value.is_a?(Array) ? value : value.to_s
|
155
|
+
|
156
|
+
# Got an AR object so full automatic contruction should work
|
157
|
+
if current_object.is_a?(ActiveRecord::Base) && fieldname.is_a?(Symbol)
|
158
|
+
# try to sort by key f.ex. when transl. enum_fields
|
159
|
+
choices = choices.to_a.sort_by{|k|k} if choices.is_a?(Hash)
|
160
|
+
tag_wrapper title, select(fieldname, choices, options, html_options)
|
161
|
+
else # a custom object
|
162
|
+
# got an array of sub-arrays[[key,val]] or an array of strings(key==val)
|
163
|
+
if choices.is_a?(Array) && (choices.first.is_a?(Array) || choices.first.is_a?(String))
|
164
|
+
# select_tag does not support :include_blank, so do it the manual way
|
165
|
+
choices.insert(0, '') if options.delete(:include_blank)
|
166
|
+
option_tags = @template.options_for_select(choices, options.delete(:selected))
|
167
|
+
# convert name to string before select_tag due to auto created info+id when it recieves a symbol
|
168
|
+
# This prevents one from passing an empty :info=>'', when using a custom object with symbol syntax
|
169
|
+
fld_name = fieldname.is_a?(String) ? fieldname : "#{@object_name}[#{fieldname}]"
|
170
|
+
tag_wrapper title, select_tag(fld_name, option_tags, options.merge(html_options))
|
171
|
+
elsif choices.is_a?(Hash)
|
172
|
+
# select_tag does not support :include_blank, so do it the manual way
|
173
|
+
choices[nil] = '' if options.delete(:include_blank)
|
174
|
+
option_tags = @template.options_for_select(choices, options.delete(:selected))
|
175
|
+
tag_wrapper title, select_tag(fieldname, option_tags, options.merge(html_options))
|
176
|
+
else #Choices of AR Objects, value is the Obj id, shown value is the object.to_s
|
177
|
+
# choices = choices.sort_by{|k, v|v.to_s} # sorty by object as string
|
178
|
+
choices = choices.sort_by{|k| k.to_s} # sorty by object as string
|
179
|
+
tag_wrapper title, collection_select(fieldname, choices, :id, :to_s, options, html_options)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
# Generate select tag with options groups for a multiple collections of objects
|
185
|
+
#
|
186
|
+
# by default the :id of each object is taken as value and the :to_s method is
|
187
|
+
# used for options text.
|
188
|
+
#
|
189
|
+
# if an object_group is empty it will be omitted
|
190
|
+
#
|
191
|
+
# === Example haml
|
192
|
+
#
|
193
|
+
# f.selection_group :id, :labels => %w(defaults, own), :choices =>[@objects_1, @objects_2], :title =>'my custom title'
|
194
|
+
#
|
195
|
+
# f.selection_group :id, :title => 'Template',
|
196
|
+
# :choices => [ @pdf_templates, @pdf_default_templates],
|
197
|
+
# :labels=>[ 'User Templates', 'Default Templates']
|
198
|
+
#
|
199
|
+
#
|
200
|
+
# Available options keys:
|
201
|
+
# :title
|
202
|
+
# :choices => array of object groups, which are used for each option grouped,
|
203
|
+
# in their order of usage
|
204
|
+
# :labels => the label for each option group, in order of usage
|
205
|
+
# :selected
|
206
|
+
def selection_group(fieldname, options={})
|
207
|
+
labels = options.delete(:labels)
|
208
|
+
title = options.delete(:title) || build_title(fieldname)
|
209
|
+
choices = options.delete(:choices)
|
210
|
+
selected = options.delete(:selected)
|
211
|
+
|
212
|
+
# TODO: Uses option_groups_from_collection_for_select here!
|
213
|
+
select_options = ''
|
214
|
+
choices.each_with_index do |v,k| #build optiongroup for each given object group
|
215
|
+
unless v.empty?
|
216
|
+
select_options << "<optgroup label='#{labels[k]}'>"
|
217
|
+
select_options << @template.options_from_collection_for_select(v, :id, :to_s, selected) #still hardcoded
|
218
|
+
select_options << "</optgroup>"
|
219
|
+
end
|
220
|
+
end
|
221
|
+
tag_wrapper title, select_tag(fieldname, select_options, options)
|
222
|
+
end
|
223
|
+
|
224
|
+
def time_zone_selection(fieldname, options = {}, html_options = {})
|
225
|
+
tag_wrapper fieldname, time_zone_select("#{fieldname}", ActiveSupport::TimeZone.all, options, html_options)
|
226
|
+
end
|
227
|
+
|
228
|
+
def checkbox(fieldname, options={})
|
229
|
+
title = options.delete(:title) || build_title(fieldname)
|
230
|
+
if current_object.is_a?(ActiveRecord::Base) && fieldname.is_a?(Symbol)
|
231
|
+
tag_wrapper title, check_box(fieldname, options)
|
232
|
+
else # not an AR object, or a custom field
|
233
|
+
# value = # defaults to 1
|
234
|
+
tag_wrapper title, check_box_tag(fieldname, options.delete(:value), options.delete(:checked), options)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
def radio(fieldname, tag_value, options={})
|
239
|
+
title = options.delete(:title) || build_title(fieldname)
|
240
|
+
tag_wrapper title, radio_button(fieldname, tag_value, options)
|
241
|
+
end
|
242
|
+
|
243
|
+
#file upload field
|
244
|
+
def file(fieldname, options={})
|
245
|
+
title = options.delete(:title) || build_title(fieldname)
|
246
|
+
|
247
|
+
if current_object.is_a?(ActiveRecord::Base) && fieldname.is_a?(Symbol)
|
248
|
+
tag_wrapper title, file_field(fieldname, options)
|
249
|
+
else
|
250
|
+
value = options.delete(:value) || current_value(fieldname)
|
251
|
+
tag_wrapper title, file_field_tag(fieldname, options)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
# Create a submit button
|
256
|
+
# due to better formating the default button call is wrapped in a span.
|
257
|
+
#
|
258
|
+
# === Example (haml)
|
259
|
+
# - f.actions do
|
260
|
+
# = f.submit t('form.save')
|
261
|
+
#
|
262
|
+
# = f.submit "save", :span => {:class=>'custom class'}
|
263
|
+
#
|
264
|
+
# = f.submit 'Submit Me', :name => 'save', nowrap=>true
|
265
|
+
# = f.submit t('form.save'), :name => 'refresh', nowrap=>true
|
266
|
+
# = f.submit 'Print', :name => 'print', :class=>'print, nowrap=>true
|
267
|
+
#
|
268
|
+
# => <div class="actions">
|
269
|
+
# <span class='input big'>
|
270
|
+
# <input id="invoice_save" class="submit" type="submit" value="Save" name="save" />
|
271
|
+
# </span>
|
272
|
+
#
|
273
|
+
# <span class='custom class'>
|
274
|
+
# <input id="invoice_save" class="submit" type="submit" value="Save" name="save" />
|
275
|
+
# </span>
|
276
|
+
#
|
277
|
+
# <input id="invoice_save" class="submit" type="submit" value="Speichern" name="save" />
|
278
|
+
# <input id="invoice_refresh" class="submit" type="submit" value="Aktualisieren" name="refresh" />
|
279
|
+
# <input id="invoice_print" class="print" type="submit" value="Print" name="print" />
|
280
|
+
# </div>
|
281
|
+
#
|
282
|
+
#===Params
|
283
|
+
#Options Hash:
|
284
|
+
# :name is only needed if you have more than one button on the form
|
285
|
+
# :id is calculated based on the :name
|
286
|
+
# :class defaults to "submit"
|
287
|
+
def submit(value, options = {})
|
288
|
+
options[:id] ||= build_id(options[:name] || 'submit')
|
289
|
+
options[:class] ||= 'submit'
|
290
|
+
|
291
|
+
if !options.delete(:nowrap) #wrap submit in span so button can be formated with css
|
292
|
+
span_options = options.delete(:span) || {:class=>'input big'}
|
293
|
+
@template.capture_haml do
|
294
|
+
@template.haml_tag :span, span_options do
|
295
|
+
@template.haml_concat(super(value, options))
|
296
|
+
end
|
297
|
+
end
|
298
|
+
else #display field without span wrapping
|
299
|
+
super value, options
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
|
304
|
+
# Display a fields value as static text
|
305
|
+
#
|
306
|
+
# === Example haml
|
307
|
+
# = f.static_text :created_at
|
308
|
+
# = f.static_text :updated_at, :title => 'Last change'
|
309
|
+
# = f.static_text :title => 'Dummy text', :value => 'I´m a loonly dumb static text .. get me outa here!'
|
310
|
+
def static_text(fieldname, options = {})
|
311
|
+
if fieldname.is_a?(Hash) && options.empty? # Short call without fieldname
|
312
|
+
options = fieldname
|
313
|
+
fieldname = nil
|
314
|
+
|
315
|
+
# Value and title are needed
|
316
|
+
raise ArgumentError unless options[:title]
|
317
|
+
raise ArgumentError unless options[:value]
|
318
|
+
end
|
319
|
+
|
320
|
+
title = options.delete(:title) || build_title(fieldname)
|
321
|
+
value = options.delete(:value) || @template.formatted_value(current_object, fieldname)
|
322
|
+
|
323
|
+
if info_text = options.delete(:info) #add info tag if info test given
|
324
|
+
value << info_tag(info_text)
|
325
|
+
end
|
326
|
+
#keep existing class and add class right to wrapping element if its a money field
|
327
|
+
(options[:class] ||= '') << ' right' if fieldname && current_class.respond_to?("is_money_field") && current_class.is_money_field?(fieldname)
|
328
|
+
tag_wrapper title, value, options
|
329
|
+
end
|
330
|
+
|
331
|
+
end
|
332
|
+
end
|
333
|
+
end
|