############################################################
# FORM VIEW HELPERS
#
# These view helpers make it easy to create input forms. You should wrap
# your form in the form_view tag and include your fields inside.
#
require_helpers 'core_views'
# Defines a form view. Note that you can make this form into a panel
# by passing :panel => true
view_helper :form_view do
property :content
property :enabled, :key => 'isEnabled'
property :valid, :key => 'isValid'
property :commiting, :key => 'isCommitting'
property :dirty, :key => 'isDirty'
property :errors
property :error_count, :key => 'errorCount'
property :autocommit
property :prompt, :key => 'commitPrompt'
view 'SC.FormView'
attribute :action, ''
attribute :method, 'post'
var :tag, 'form'
end
view_helper :error_explanation_view do
# JavaScript
view 'SC.ErrorExplanationView'
# HTML
var :tag, 'ul'
css_class_names << 'errors'
end
view_helper :checkbox_field_view do
# JavaScript
property :value
property :enabled, :key => 'isEnabled'
view 'SC.CheckboxFieldView'
# HTML
var :tag, 'input'
var :label
attribute :type, 'checkbox'
attribute :name, @item_id
# if a label is passed, then wrap the checkbox in a label tag and
# place the label text next to it.
if @label
content { %() }
else
content { "<#{@tag} #{attributes} />" }
end
end
# This renders a list of radio buttons.
#
# :values => [REQ]
# Set this to the values you want displayed in the radio buttons. You
# can pass an array here of strings or symbols, in which case these will
# be used as the values for the buttons and the names will be created
# from them. Or you can pass an array of arrays. The first items is
# the key value, the second item is the human readable value.
#
# :layout => :horizontal | :vertical
# This will write out horizontal or vertical to the CSS class names so
# you can control the layout of your radio buttons.
#
# :width =>
# This will set the width of each item in the view.
#
# BINDABLE OPTIONS
#
# :objects =>
# This can point to a hash of objects which will be used to convert the
# key values you set into JS objects.
#
# :value =>
# The current value of the radio buttons.
#
view_helper :radio_field_view do
#JavaScript
bind :objects
property :value
view 'SC.RadioFieldView'
# HTML
# Get the width styles out of the main style to put into the individual
# radio items.
css_styles.flatten!
@label_styles = css_styles.reject { |p| !(p =~ /width:/) }
css_styles.reject! { |p| @label_styles.include?(p) }
if @label_styles.size > 0
@label_styles = %( style="#{@label_styles * ' '}" )
else
@label_styles = ''
end
# get the layout mode.
var :layout, :vertical
css_class_names << 'radio' # default class
css_class_names << @layout if @layout
var :tag, 'div'
# generate the inner-html
var :values
html = @values.map do | v |
v = [v].flatten
key = v.first
label = (v.size > 1) ? v[1] : key.to_s.humanize
%()
end
@inner_html = html * "\n"
end
view_helper :text_field_view do
var :tag, 'input'
view 'SC.TextFieldView'
property :field_value
property :value, :key => :field_value
property :hint
property :validate, :key => :validator
property :label, :key => 'fieldLabel'
attribute :size
attribute :type, 'text'
attribute :label
attribute :name
content { "<#{@tag} #{attributes} />" }
end
view_helper :password_field_view, :extends => :text_field_view do
attribute :type, 'password'
end
view_helper :text_area_view do
var :form, false
var :tag, 'textarea'
var :value, @inner_html
if @form
view nil
else
view 'SC.TextareaFieldView'
property :hint
property :field_value
property :value
end
attribute :cols
attribute :rows
attribute :validate
attribute :label
attribute :name
attribute :form, :key => :name
content { "#{ot}#{@value}#{ct}" }
end
# This view renders a browser-native popup menu.
#
# :field =>
# pass a name to make this part of the enclosing form.
#
# :options =>
# This will statically generate the HTML for the options menu. The
# value of this property should be an array of items containing strings
# or symbols, which will form both the item names and values or you can
# pass an array of arrays. The first item should be the value of the
# object, then second item should be the name of the menu.
#
# Note that if you bind to the :objects property, then that binding
# will override this code.
#
# :name_key =>
# Specifies the key to use to get the name of a menu item from the
# array of objects. This is only used if the menu items are generated
# dynamically.
#
# :sort_key =>
# Optional sort key to use to order the menu. If the sort key is not
# passed, the name of the menu items will be used. This is only used
# if the menu items are generated dynamically.
#
# :value_key =>
# Optional key used to get the value for each menu item from the
# array of objects. Only used if the menu items are generated
# dynamically.
#
# :empty =>
# Optional. Pass the string name of the "Empty" menu item. This item
# will appear at the top of the menu and its value will be a null
# object. The value you pass here will be localized by default. Only
# used if the menu items are generated dynamically.
#
# :localize =>
# Optional. If true, the names of the menu items and the empty menu
# item will be passed through the localization system. Defaults to
# false.
#
# :validator =>
# Optional. Pass the name of a validator and it will be used for this
# control.
#
# BINDABLE PROPERTIES
#
# :objects =>
# bind to an array of objects used to generate the menu item. This will
# override any hard-coded options you pass through the :options param.
#
# :value =>
# bind to the current value to show in the pop-up menu.
#
# :enabled =>
# bind or pass to set the control to enabled or disabled.
#
view_helper :select_field_view do
# JavaScript
property :name_key
property :sort_key
property :value_key
property :empty, :key => 'emptyName'
property :enabled, :key => 'isEnabled'
bind :objects
view 'SC.SelectFieldView'
# HTML
var :tag, 'select'
var :options
if @options
html = @options.map do |opt|
opt = [opt].flatten
key = opt.first
name = (opt.size > 1) ? opt[1] : key.to_s.titleize
%()
end
@inner_html = html * "\n"
end
end