module BootstrapFormHelper # Extend Bootstrap form builder class BootstrapForm::FormBuilder include BootstrapFormHelper # Returns Bootstrap date-time picker of the "datetime" type tailored for accessing a specified datetime attribute (identified by +name+) on an object # assigned to the template (identified by +object+). Additional options on the input tag can be passed as a # hash with +options+. The supported options are shown in the following examples. # # ==== Examples # Specify custom label (otherwise, a humanized version of +name+ is used) # # => datetime_picker(:post, :published, label: "Published date") # # Specify custom CSS style on the element # # => datetime_picker(:post, :published, style: "background-color: #000; margin-top: 20px;") # # Show a "clear" button on the bottom of the date picker. # # => datetime_picker(:post, :published, clear: true) # # Show a "today" button on the bottom of the date picker. # # => datetime_picker(:post, :published, today: true) def datetime_picker(name, options = {}) id = "#{@object_name}_#{name.to_s}" input_name = "#{@object_name}[#{name.to_s}]" value = options[:value] ? options[:value].strftime("#{I18n.backend.date_format} %H:%M") : '' js_locale = I18n.locale.to_s js_format = options[:time] ? datetime_picker_format_full : datetime_picker_format_date_only label = options[:label] || name.to_s.humanize style = options[:style] ? "style='#{options[:style]}'" : '' res = "
" \ "
" res << "
" if options[:clear] res << "" if options[:clear] res << "" \ "
" end res << '
' res.html_safe end # Returns Bootstrap button group for choosing a specified enum attribute (identified by +name+) on an object # assigned to the template (identified by +object+). Additional options on the input tag can be passed as a # hash with +options+. The supported options are shown in the following examples. # # ==== Examples # Specify custom label (otherwise, a humanized version of +name+ is used) # # => enum_btn_group(:car, :type, label: "Car type") # # Specify custom button names for enum values (a hash) # # => enum_btn_groups(:car, :type, btn_names: { diesel: "Diesel car", electric: "Electric car" }) # # Specify custom CSS style on the element # # => enum_btn_group(:car, :type, style: "background-color: #000; margin-top: 20px;") # # Specify custom CSS classes on the element # # => enum_btn_group(:car, :type, class: "class1 class2") def enum_btn_group(name, options = {}) id = "#{@object_name}_#{name.to_s}" input_name = "#{@object_name}[#{name.to_s}]" enum_vals = @object.class.send(name.to_s.pluralize) btn_names = Hash[enum_vals.keys.collect { |k| [k, k] }] if options[:btn_names] then btn_names = options[:btn_names] end btn_names = HashWithIndifferentAccess.new(btn_names) label = name.to_s.humanize if options[:label] then label = options[:label] end style_str = "" if options[:style] then style_str = " style='#{options[:style]}'" end class_str = "" if options[:class] then class_str = " #{options[:class]}" end res = "" res << "
" res << "" res << "
" res << "
" enum_vals.keys.each do |val| active = @object.send("#{val}?") active_str = active ? " active" : "" checked_str = active ? " checked='checked'" : "" res << "" end res << "
" res << "
" res.html_safe end # Returns color picker as a dropdown (" colors.each do |color| res << "" end res << "" res << "" res.html_safe end # Returns color picker as a button group of color buttons, tailored for accessing a specified color # attribute (identified by +name+) on an object assigned to the template (identified by +object+). # List of colors must be provided (identified by +colors+). Colors must be a list of hashed hex values # (e.g. '#ff0000'). Additional options on the input tag can be passed as a hash with +options+. # The supported options are shown in the following examples. # # ==== Examples # Specify custom label (otherwise, a humanized version of +name+ is used) # # => color_picker_btn_group(:tag, :color, colors: ["#ff0000", "#00ff00"], label: "Choose color") # # Specify size (available options: :large, :normal, :small, :extra_small) # # => color_picker_btn_group(:tag, :color, colors: ["#ff0000", "#00ff00"], size: :small) # # Set the picker as vertical # # => color_picker_btn_group(:tag, :color, colors: ["#ff0000", "#00ff00"], vertical: true) # # Specify custom CSS style on the element # # => color_picker_btn_group(:tag, :color, colors: ["#ff0000", "#00ff00"], style: "background-color: #000; margin-top: 20px;") # # Specify custom CSS class on the element # # => color_picker_btn_group(:tag, :color, colors: ["#ff0000", "#00ff00"], class: "custom") def color_picker_btn_group(name, colors, options = {}) id = "#{@object_name}_#{name.to_s}" input_name = "#{@object_name}[#{name.to_s}]" icon_str = '' icon_str_hidden = '' label = name.to_s.humanize if options[:label] then label = options[:label] end group_str = "btn-group" if options[:vertical] and options[:vertical] == true then group_str << "-vertical" end if options[:size] then if options[:size] == :large group_str << " btn-group-lg" elsif options[:size] == :small group_str << " btn-group-sm" elsif options[:size] == :extra_small group_str << " btn-group-xs" end end style_str = "" if options[:style] then style_str = "style='#{options[:style]}'" end class_str = "" if options[:class] then class_str = "#{options[:class]}" end res = "" res << "
" res << "" res << "
" colors.each_with_index do |color, i| active = i == 0 ? " active" : "" checked = i == 0 ? " checked='checked'" : "" contents = i == 0 ? icon_str : icon_str_hidden res << "" end res << "
" res << "" res << "
" res.html_safe end # Returns smart