module Cms # Defines functions for creating buttons and links using the CMS styling. # I.e. Menus, Save, Publish buttons and links. module UiElementsHelper def cancel_button(location, label="Cancel") klass = ['btn'] klass << 'btn-small' if location == :top link_to label, :back, class: klass end def button_menu(location) container_class = location == :top ? 'span6 top-buttons' : 'form-actions clearfix' container_element = location == :top ? 'span' : 'div' content_tag container_element, class: container_class do yield if block_given? end end def page_title_with_buttons(form, partial_name="buttons") render(partial: partial_name, locals: {f: form, location: :top}, layout: 'page_title') end def bottom_buttons(form, partial_name="buttons") render(partial: partial_name, locals: {f: form, location: :bottom}, layout: 'row') end # @deprecated Everything below. # Renders a Save And Publish button if: # 1. Current User has publish rights # 2. Block is publishable def save_and_publish_button(block, content_type) if current_user.able_to?(:publish_content) && block.publishable? html = %Q{} html.html_safe end end # For simple publish buttons def publish_button(type) html = %Q{'} html.html_safe end # Renders a Publish button for the menu based on whether: # 1. The current user can publish # 2. The content item can or needs to be published. def publish_menu_button(content_item) options = {class: ["btn", "btn-primary", "http_put"], id: "publish_button"} path = "#" if current_user.able_to?(:publish_content) && !content_item.new_record? && content_item.respond_to?(:live?) && !content_item.live? path = engine(@block).polymorphic_path([:publish, @block]) else options[:class] << "disabled" end link_to "Publish", path, options end def edit_content_menu_button(content_item) path = "#" unless content_item.new_record? path = edit_engine_aware_path(content_item) end link_to "Edit Content", path, class: "btn btn-primary", id: "edit_button" end def view_content_menu_button(content_item) path = "#" unless content_item.new_record? path = engine_aware_path(content_item, nil) end link_to "View Content", path, class: "btn btn-primary", id: "view_button" end # Generic bootstrap based menu button # @param [Hash] options # @option options [Boolean] :enabled # @option options [Array] :class An array of additional classes to apply def menu_button(label, path, options={}) defaults = { enabled: true, pull: 'left' } options = defaults.merge!(options) options[:class] = %w{btn btn-primary} if (options[:pull] == 'left' || options[:pull]== 'right') options[:class] << "pull-#{options.delete(:pull)}" end options[:class] << 'disabled' unless options[:enabled] options.delete(:enabled) options[:class] << 'http_put' if options[:method] == :put options[:class] << 'http_delete' if options[:method] == :delete options[:class] << 'confirm_with_title' if options[:method] == :delete options.delete(:method) copy_title(options, options) link_to(label, path, options) end def versions_menu_button(content_item) options = {class: ["btn", "btn-primary"], id: "revisions_button"} path = "#" if !content_item.new_record? && content_item.class.versioned? path = engine(content_item).polymorphic_path([:versions, content_item]) else options[:class] << "disabled" end link_to "List Versions", path, options end # Render a CMS styled 'Delete' button. This button will appear on tool bars, typically set apart visually from other buttons. # Has a 'confirm?' popup attached to it as well. # Assumes that javascript code to handle the 'confirm' has already been included in the page. # def delete_menu_button(content_item=nil, opts={class: []}) classes = ["btn", "http_delete", "confirm_with_title"] if current_user.able_to_publish?(content_item) classes << 'btn-primary' else classes << 'disabled' end link_to_path = "#" options = {:id => 'delete_button', :class => classes} options[:class].concat(opts[:class]) if opts[:class] if content_item == nil || content_item.new_record? classes << 'disabled' else options[:title] = "Are you sure you want to delete '#{content_item.name}'?" link_to_path = engine_aware_path(content_item, nil) end if opts[:title] options[:title] = opts[:title] end link_to "Delete", link_to_path, options end def select_content_type_tag(type, &block) options = {:rel => "select-#{type.param_key}"} if (defined?(content_type) && content_type == type) options[:class] = "on" end content_tag_for(:li, type, nil, options, &block) end # Used by Twitter Bootstrap dropdown menus used to divide groups of menu items. # @param [Integer] index def divider_tag(index = 1) content_tag(:li, " ", {class: "divider"}) if index != 0 end def nav_link_to(name, link, options={}) content_tag(:li, link_to(name, link, options)) end private def copy_title(from, to) to[:title] = from[:title] if (!from[:title].blank? && from[:title].class == String) end end end