module Poodle
module ActionView
# This module creates Bootstrap wrappers around basic View Tags
module ThemeHelper
# theme_fa_icon('plus')
#
# theme_fa_icon('plus', 'lg')
#
def theme_fa_icon(icon_text, size="")
size_class = %w{lg 2x 3x 4x 5x}.include?(size.strip) ? " fa-#{size.strip}" : ""
""
end
# theme_button_text('New Project')
# New Project
def theme_button_text(text)
" #{text}"
end
# theme_button is used to create poodle like buttons which has built in classes and icons
# e.g:
# theme_button('New Project', 'plus', new_admin_project_path)
# The above is equivalent to
# link_to raw(" New Project"), new_admin_project_path, :class=>"btn btn-primary pull-right ml-5", :remote=>true
# And produces the following html
# New Project
def theme_button(text, icon, url, options={})
options.reverse_merge!(
method: :get,
remote: true,
btn_type: :primary,
btn_size: :md,
classes: "pull-right ml-5 mb-5",
data: {}
)
display_content = raw(theme_fa_icon(icon)+theme_button_text(text))
link_to(display_content, url, :class=>"btn btn-#{options[:btn_type]} btn-#{options[:btn_size]} #{options[:classes]}", :remote=>options[:remote], method: options[:method], data: options[:data])
end
# Example
# theme_edit_button(edit_admin_project_path(@project))
# is equivalent to:
# ---------------------------
# link_to raw(" Edit"), edit_admin_project_path(@project), :class=>"btn btn-default btn-xs pull-right ml-10", :remote=>true %>
def theme_edit_button(url, options={})
options.reverse_merge!(
text: "Edit",
icon: "edit",
method: :get,
remote: true,
btn_type: :default,
btn_size: :xs,
classes: "pull-right ml-10"
)
theme_button(options[:text], options[:icon], url, options)
end
# Example
# theme_delete_button(admin_project_path(@project))
# is equivalent to:
# ---------------------------
# link_to raw(" Delete"), admin_project_path(@project), method: :delete, data: { confirm: 'Are you sure?' }, :class=>"btn btn-danger btn-xs pull-right", :remote=>true
def theme_delete_button(url, options={})
options.reverse_merge!(
text: "Delete",
icon: "trash",
method: :delete,
remote: true,
btn_type: :danger,
btn_size: :xs,
classes: "pull-right ml-10",
data: { confirm: 'Are you sure?' }
)
theme_button(options[:text], options[:icon], url, options)
end
# theme_heading(heading)
# theme_heading(heading, icon='cog')
#
def theme_heading(heading, icon='')
content_tag :div, class: "row mb-10" do
content_tag :div, class: "fs-22 col-sm-12" do
raw((icon ? theme_fa_icon(icon, 'lg') : "") + " #{heading}")
end
end
end
# theme_search_form is a helper to create a form to filter the results by entering a search query
def theme_search_form(cls, url, method=:get, remote=true, text="Search!", placeholder="Search ...")
form_for cls.new, :url => url,
:method => method, :remote=>remote,
:html=>{:class=>"pull-right", :style=>"margin-bottom:0px;"} do |f|
content_tag :div, class: "input-group" do
text_field_tag('query','', :class => 'form-control', :placeholder => placeholder) +
content_tag(:span, class: "input-group-btn") do
button_tag(type: 'submit', class: "btn btn-default") do
raw(theme_fa_icon('search') +
content_tag(:span, class: "btn-text") do
" " + text
end)
end
end
end
end
end
def theme_drop_down(collection, method_name, **options)
options.reverse_merge!(
scope: :admin
)
content_tag(:div, class: "btn-group mt-10 mb-10", style: "width:100%;") do
button_tag(type: 'button', :class => "btn btn-default btn-block dropdown-toggle", "data-toggle" => "dropdown") do
raw("Choose a Project" + content_tag(:span, "", class: "caret"))
end +
content_tag(:ul, class: "dropdown-menu", role: "menu") do
li_array = []
collection.each do |item|
li_array << content_tag(:li) do
url = main_app.url_for([options[:scope], item])
link_to item.send(method_name), url, :remote => true
end
end
raw(li_array.join(" ")) +
content_tag(:li, link_to_next_page(collection, 'Next Page', :remote => true)) +
content_tag(:li, link_to_previous_page(collection, 'Previous Page', :remote => true))
end
end
end
def clear_tag(height=nil)
height_class = height ? " cl-#{height}" : ""
content_tag(:div, "", class: "clearfix#{height_class}")
end
# Example
# theme_paginate(@projects)
#
# is equivalent to:
# ---------------------------
#
# <% if @projects.any? %>
# <%= content_tag :div, :class=>"pull-right" do %>
# <%= paginate @projects, :remote => true %>
# <% end %>
# <% end %>
#
# ---------------------------
def theme_paginate(collection)
return "" if collection.empty?
clear_tag(10) +
content_tag(:div, :class=>"pull-right") do
paginate(collection, :remote => true)
end +
clear_tag(10)
end
# Example
# theme_panel_message("No Results found")
#
# is equivalent to:
# ---------------------------
#
# "No Results found"
#
def theme_panel_message(message)
content_tag(:div, class: "panel panel-default panel-message text-color-grey p-80 text-align-center", style: "height:200px;") do
raw(message)
end
end
# Example
# theme_panel_title("Team Members")
#
# is equivalent to:
# ---------------------------
# Team Members
def theme_panel_title(title, classes="")
content_tag(:h3, title, class: "panel-title #{classes}")
end
# Example
# theme_item_title(project.name, admin_project_path(project))
#
# is equivalent to:
# ---------------------------
# <%= link_to project.name, admin_project_path(project), :remote=>true, :class=>"text-color-blue fs-16" %>
def theme_item_title(title, url, classes = "text-color-blue fs-16", remote=true)
link_to(title, url, :remote=>remote, :class=>classes)
end
# Example
# theme_item_sub_title(project.client.name)
#
# is equivalent to:
# ---------------------------
# <%= project.client.name if project.client %>
def theme_item_sub_title(text, classes = "text-color-red fs-14")
content_tag(:div, text, class: classes)
end
# Example
# theme_item_description(project.client.name, 120)
#
# is equivalent to:
# ---------------------------
# <%= project.client.description %>
def theme_item_description(text, limit=120, classes = "text-color-grey fs-12")
description = scrap_word(text, limit)
content_tag(:div, description, class: classes)
end
def theme_detail_box(collection, **options)
options.reverse_merge!(
show_partial: "show",
new_partial: "form",
edit_partial: "form",
index_partial: "show",
)
case params[:action]
when "show"
render partial: options[:show_partial]
when "new"
render partial: options[:new_partial]
when "edit"
render partial: options[:edit_partial]
when "index"
collection.empty? ? (theme_panel_message(I18n.translate("forms.no_results"))) : render(partial: options[:index_partial])
else
theme_panel_message(I18n.translate("forms.no_results"))
end
end
# Example
# theme_more_widget(object, data_columns=[:id, :created_at, :updated_at], super_admin = true)
# is equivalent to:
# ---------------------------
# <% if @current_user.is_super_admin? %>
# <%= render :partial => "widgets/more_details", :locals=>{
# :data_model => @project,
# :data_columns => [:id, :created_at, :updated_at],
# :heading => "Technical Details",
# :display_footer => false} %>
# <% end %>
def theme_more_widget(object, **options)
options.reverse_merge!(
data_columns: [:id, :created_at, :updated_at],
super_admin: false,
heading: "Technical Details"
)
display = options[:super_admin] ? @current_user.is_super_admin? : true
render(:partial => "widgets/more_details",
:locals=>{:data_model => object,
:data_columns => options[:data_columns],
:heading => options[:heading],
:display_footer => false}) if display
end
# Example
# theme_panel_heading(@project.name)
# is equivalent to:
# ---------------------------
# <%= @project.name %>
def theme_panel_heading(text, classes="fs-24 text-color-green")
content_tag(:div, text, class: classes)
end
# Example
# theme_panel_sub_heading(@project.name, admin_client_path(@project.client))
# is equivalent to:
# ---------------------------
# link_to(@project.client.name, admin_client_path(@project.client), class: "fs-16 text-color-red")
def theme_panel_sub_heading(text, url, classes="fs-16 text-color-red")
link_to(text, url, class: classes)
end
# Example
# theme_panel_description(@project.pretty_url, "fs-14")
# theme_panel_description(@project.description, "fs-14 mt-10")
# is equivalent to:
# ---------------------------
# <%= @project.pretty_url %>
# <%= @project.description %>
def theme_panel_description(text, classes="fs-14")
content_tag(:div, text, class: classes)
end
end
end
end