#= require ./base #= require ./tag @Ultimate.Helpers.FormOptions = options_for_select: (container, selected = null) -> return container if _.isString(container) [selected, disabled] = _.map @_extract_selected_and_disabled(selected), (r) -> _.map _.outcasts.arrayWrap(r), (item) -> item.toString() container = _.pairs(container) if $.isPlainObject(container) _.map(container, (element) -> html_attributes = @_option_html_attributes(element) [text, value] = _.map @_option_text_and_value(element), (item) -> if item? then item.toString() else '' html_attributes['value'] = value html_attributes['selected'] = 'selected' if @_option_value_selected(value, selected) html_attributes['disabled'] = 'disabled' if disabled and @_option_value_selected(value, disabled) Ultimate.Helpers.Tag.content_tag_string 'option', text, html_attributes ).join("\n") options_from_collection_for_select: (collection, value_method, text_method, selected = null) -> options = _.map collection, (element) -> [@_value_for_collection(element, text_method), @_value_for_collection(element, value_method)] [selected, disabled] = @_extract_selected_and_disabled(selected) select_deselect = selected: @_extract_values_from_collection(collection, value_method, selected) disabled: @_extract_values_from_collection(collection, value_method, disabled) @options_for_select(options, select_deselect) _option_html_attributes: (element) -> result = {} if _.isArray(element) _.extend(result, e) for e in element when $.isPlainObject(e) result _option_text_and_value: (option) -> # Options are [text, value] pairs or strings used for both. if _.isArray(option) option = _.reject(option, (e) -> $.isPlainObject(e)) [_.first(option), _.last(option)] else [option, option] _option_value_selected: (value, selected) -> value in selected _extract_selected_and_disabled: (selected) -> if _.isFunction(selected) [selected, null] else selected = _.outcasts.arrayWrap(selected) options = if $.isPlainObject(_.last(selected)) then selected.pop() else {} selected_items = options['selected'] ? selected [selected_items, options['disabled']] _extract_values_from_collection: (collection, value_method, selected) -> if _.isFunction(selected) _.compact _.map collection, (element) -> _.result(element, value_method) if selected(element) else selected _value_for_collection: (item, value) -> if _.isFunction(value) then value(item) else _.result(item, value)