blob: e26d14bc0f9d0b799a034901ad698a0d66586c5f [file] [log] [blame]
require 'wunderbar'
require 'wunderbar/markdown'
# Define common page features for whimsy tools using bootstrap styles
class Wunderbar::HtmlMarkup
# Emit a form control based on a hash of options with a type:
def _whimsy_field_chooser(args)
_p "DEBUG #{__method__} #{args.inspect} /// #{args['type']}"
case args['type']
when 'subhead'
_whimsy_forms_subhead args
when 'text'
_whimsy_forms_input args
when 'textarea'
args['rows'] ||= '3'
_whimsy_forms_input args
when 'select'
_whimsy_forms_select args
when 'radio', 'checkbox'
_whimsy_forms_checkradio args
else
_div "#{__method__}(#{args['type']}) TODO: Error condition?"
end
end
# Utility function to add icons after form controls
def _whimsy_forms_iconlink(**args)
if args['iconlink']
_div.input_group_btn do
_a.btn.btn_default type: 'button', aria_label: "#{iconlabel}", href: "#{args['iconlink']}", target: 'whimsy_help' do
_span.glyphicon class: "#{args['icon']}", aria_label: "#{args['iconlabel']}"
end
end
elsif args['icon']
_span.input_group_addon do
_span.glyphicon class: "#{args['icon']}", aria_label: "#{args['iconlabel']}"
end
end
end
# Utility function for divs around form controls, including help
def _whimsy_control_wrapper(**args)
_div.form_group do
_label.control_label.col_sm_3 args['label'], for: "#{args['name']}"
_div.col_sm_9 do
_div.input_group do
yield
_whimsy_forms_iconlink(args)
end
if args['helptext']
_span.help_block id: "#{args['aria_describedby']}" do
_markdown "#{args['helptext']}"
end
end
end
end
end
# Display a subheader separator between sections of a form
# @param text string to display
def _whimsy_forms_subhead(text: 'Form Section')
_div.form_group do
_label.col_sm_offset_3.col_sm_9.strong.text_left text
end
end
# Display a single input control within a form; or if rows, then a textarea
# @param name required string ID of control's label/id
def _whimsy_forms_input(**args)
return unless args['name']
args['label'] ||= 'Enter string'
args['type'] ||= 'text'
args['id'] = args['name']
args['aria_describedby'] = "#{args['name']}_help" if args['helptext']
_whimsy_control_wrapper(args) do
args['class'] = 'form-control'
if args['rows']
_textarea! type: args['type'], name: args['name'], id: args['id'], value: args['value'], class: args['class'], aria_describedby: args['aria_describedby'], rows: args['rows'] do
_! args['value']
end
else
_input type: args['type'], name: args['name'], id: args['id'], value: args['value'], class: args['class'], aria_describedby: args['aria_describedby']
end
end
end
# Display an optionlist control within a form
# @param name required string ID of control's label/id
# @param options required ['value'] or {"value" => 'Label for value'} of all selectable values
# @param values required 'value' or ['value'] or {"value" => 'Label for value'} of all selected values
# @param placeholder Currently displayed text if passed (not selectable)
def _whimsy_forms_select(**args)
return unless args['name']
return unless args['values']
args['label'] ||= 'Select value(s)'
args['id'] = args['name']
args['aria_describedby'] = "#{args['name']}_help" if args['helptext']
_whimsy_control_wrapper(args) do
if args['multiple']
args['multiple'] = 'true'
end
_select.form_control type: args['type'], name: args['name'], id: args['id'], value: args['value'], aria_describedby: args['aria_describedby'], multiple: args['multiple'] do
if ''.eql?(args['placeholder'])
_option '', value: '', selected: 'selected'
else
_option "#{args['placeholder']}", value: '', selected: 'selected', disabled: 'disabled', hidden: 'hidden'
end
# Construct selectable list from values (first) then options
if args['values'].kind_of?(Array)
args['values'].each do |val|
_option val, value: val, selected: true
end
elsif args['values'].kind_of?(Hash)
args['values'].each do |val, disp|
_option disp, value: val, selected: true
end
elsif args['values'] # Fallback for simple case of single string value
_option "#{args['values']}", value: "#{args['values']}", selected: true
args['values'] = [args['values']] # Ensure supports .include? for options loop below
end
if args['options'].kind_of?(Array)
args['options'].each do |val|
_option val, value: val unless args['values'].include?(val)
end
elsif args['options'].kind_of?(Hash)
args['options'].each do |val, disp|
_option disp, value: val unless args['values'].include?(val)
end
end
end
end
end
# Display a list of radio or checkbox controls
# @param name required string ID of control's label/id
# @param type required FORM_CHECKBOX|FORM_RADIO
# @param options required ['value'...] or {"value" => 'Label for value'} of all values
# @param selected optional 'value' or ['value'...] of all selected values
def _whimsy_forms_checkradio(**args)
return unless args['name']
return unless args['type']
return unless args['options']
args['label'] ||= 'Select value(s)'
args['id'] = args['name']
args['aria_describedby'] = "#{args['name']}_help" if args['helptext']
args['selected'] = [args['selected']] if args['selected'].kind_of?(String)
_whimsy_control_wrapper(args) do
# Construct list of all :options; mark any that are in :selected
if args['options'].kind_of?(Array)
args['options'].each do |val|
checked = true if args['selected'] && args['selected'].include?(val.to_s)
_input type: args['type'], name: args['name'], id: args['id'], value: val, class: args['class'], aria_describedby: args['aria_describedby'], checked: checked do
_! val
end
end
elsif args['options'].kind_of?(Hash)
args['options'].each do |val, disp|
checked = true if args['selected'] && args['selected'].include?(val.to_s)
_input type: args['type'], name: args['name'], id: args['id'], value: val, class: args['class'], aria_describedby: args['aria_describedby'], checked: checked do
_! disp
end
end
end
end
end
# Gather POST form data into submission Hash
# @returns {field: 'string', field2: ['array', 'only for', 'multivalue'] ...}
def _whimsy_params2formdata(params)
formdata = {}
params.each do |k,v|
v && (v.length == 1) ? formdata[k] = v[0] : formdata[k] = v
end
return formdata
end
end