poodle-rb 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/poodle/utilities.js +10 -0
- data/app/controllers/poodle/application_controller.rb +0 -13
- data/app/helpers/poodle/display_helper.rb +6 -5
- data/app/helpers/poodle/flash_helper.rb +34 -4
- data/app/helpers/poodle/image_helper.rb +2 -32
- data/app/helpers/poodle/meta_tags_helper.rb +35 -0
- data/app/helpers/poodle/navigation_helper.rb +0 -1
- data/app/helpers/poodle/params_parser_helper.rb +0 -1
- data/app/helpers/poodle/title_helper.rb +0 -1
- data/app/helpers/poodle/url_helper.rb +0 -1
- data/app/views/layouts/poodle/application.html.erb +4 -4
- data/app/views/layouts/poodle/public.html.erb +4 -4
- data/app/views/widgets/_more_details.html.erb +2 -1
- data/app/views/widgets/_more_details_table.html.erb +70 -0
- data/lib/poodle/action_view/form_helper.rb +224 -0
- data/lib/poodle/action_view/modal_helper.rb +7 -0
- data/lib/poodle/action_view/theme_helper.rb +350 -0
- data/lib/poodle/engine.rb +26 -0
- data/lib/poodle/railtie.rb +4 -0
- data/lib/poodle/version.rb +1 -1
- data/lib/poodle-rb.rb +5 -0
- metadata +7 -7
- data/app/helpers/poodle/notification_helper.rb +0 -20
- data/app/views/layouts/poodle/common/_field.html.erb +0 -46
- data/app/views/layouts/poodle/common/_flash_message.html.erb +0 -23
- data/app/views/layouts/poodle/common/_meta_tags.html.erb +0 -42
- data/config/initializers/api_errors.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4639f86da6f008126a69fa0ccbb2abef87c9c9e
|
4
|
+
data.tar.gz: f968ce10264e5061d67c34ddb8f65b7582308d9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1ac95425ece844e1a44acdd32abce8afcbab171a8fda9ec0ced780ea2db9c56e6aba080de27b2fda4365b5c396f93a3a876d5f4d4ffdc316412051201581d32
|
7
|
+
data.tar.gz: 7da690ff6b6aac9684c46c018cfaab55efbb1a9b923b063c910a6c60c293c309044b765446af953427266be9c91febefc7498cb9cd7bda7e2d56c9a6f3dc7991
|
@@ -48,3 +48,13 @@ function closeModal(modalId){
|
|
48
48
|
}
|
49
49
|
$('#' + modalId).modal('hide');
|
50
50
|
}
|
51
|
+
|
52
|
+
function initPopovers(){
|
53
|
+
$('[data-toggle="popover"]').popover()
|
54
|
+
}
|
55
|
+
initPopovers();
|
56
|
+
|
57
|
+
function initTooltip(){
|
58
|
+
$('[data-toggle="tooltip"]').tooltip()
|
59
|
+
}
|
60
|
+
initTooltip();
|
@@ -1,15 +1,2 @@
|
|
1
1
|
class Poodle::ApplicationController < ActionController::Base
|
2
|
-
|
3
|
-
## This filter method is used to fetch current user
|
4
|
-
before_filter :current_user
|
5
|
-
|
6
|
-
include Poodle::ParamsParserHelper
|
7
|
-
include Poodle::FlashHelper
|
8
|
-
include Poodle::UrlHelper
|
9
|
-
include Poodle::TitleHelper
|
10
|
-
include Poodle::ImageHelper
|
11
|
-
include Poodle::NavigationHelper
|
12
|
-
include Poodle::SessionsHelper
|
13
|
-
include Poodle::NotificationHelper
|
14
|
-
|
15
2
|
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
module Poodle
|
2
2
|
module DisplayHelper
|
3
|
-
|
4
|
-
|
3
|
+
# Example
|
4
|
+
# scrap_word(long_text, 120)
|
5
|
+
# scrap_word(long_text, 120, "Read More", read_more_url)
|
6
|
+
def scrap_word(text, char_count_limit, more_text = nil, more_link = nil, style='')
|
5
7
|
# remove HTML tags
|
6
8
|
text = text.to_s.gsub(/<\/?[^>]*>/, " ")
|
7
9
|
# remove additional spaces
|
@@ -28,9 +30,8 @@ module Poodle
|
|
28
30
|
return teaser
|
29
31
|
end
|
30
32
|
|
31
|
-
def display_time(
|
32
|
-
|
33
|
+
def display_time(time)
|
34
|
+
distance_of_time_in_words_to_now(time) + (time > Time.now ? " from now" : " ago")
|
33
35
|
end
|
34
|
-
|
35
36
|
end
|
36
37
|
end
|
@@ -1,14 +1,44 @@
|
|
1
1
|
module Poodle
|
2
2
|
module FlashHelper
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
# This function will set a flash message depending up on the request type (ajax - xml http or direct http)
|
4
|
+
# Example
|
5
|
+
# set_flash_message("The message has been sent successfully", :success)
|
6
|
+
# set_flash_message("Permission denied", :error)
|
7
|
+
def set_flash_message(message, type)
|
7
8
|
if request.xhr?
|
8
9
|
flash.now[type] = message
|
9
10
|
else
|
10
11
|
flash[type] = message
|
11
12
|
end
|
12
13
|
end
|
14
|
+
|
15
|
+
# Example
|
16
|
+
# message = get_flash_message()
|
17
|
+
def get_flash_message
|
18
|
+
if request.xhr?
|
19
|
+
message = flash.now[:success] || flash.now[:notice] || flash.now[:alert] || flash.now[:error]
|
20
|
+
else
|
21
|
+
message = flash[:success] || flash[:notice] || flash[:alert] || flash[:error]
|
22
|
+
end
|
23
|
+
message
|
24
|
+
end
|
25
|
+
|
26
|
+
# Example
|
27
|
+
# <div id="div_flash_message">
|
28
|
+
# <%= flash_message() -%>
|
29
|
+
# </div>
|
30
|
+
def flash_message
|
31
|
+
message = get_flash_message
|
32
|
+
cls_name = "alert-info"
|
33
|
+
cls_name = 'alert-success' if flash.now[:success] || flash[:success]
|
34
|
+
cls_name = 'alert-warning' if flash.now[:alert] || flash[:alert]
|
35
|
+
cls_name = 'alert-danger' if flash.now[:error] || flash[:error]
|
36
|
+
|
37
|
+
message = message.strip if message
|
38
|
+
|
39
|
+
content_tag(:div, class: "alert #{cls_name} fade in mb-10", "data-alert" => "alert") do
|
40
|
+
raw(link_to("×",nil, class: "close", "data-dismiss" => "alert") + content_tag(:p, message))
|
41
|
+
end unless message.blank?
|
42
|
+
end
|
13
43
|
end
|
14
44
|
end
|
@@ -1,10 +1,5 @@
|
|
1
1
|
module Poodle
|
2
2
|
module ImageHelper
|
3
|
-
|
4
|
-
DEFAULT_PLACE_HOLDER_HEIGHT = 60
|
5
|
-
DEFAULT_PLACE_HOLDER_WIDTH = 100
|
6
|
-
DEFAULT_PLACE_HOLDER_TEXT = "<No Image>"
|
7
|
-
|
8
3
|
# This method only works with carrier wave way of doing.
|
9
4
|
# eg: user.profile_picture.image.large.url
|
10
5
|
# Usage:
|
@@ -47,30 +42,6 @@ module Poodle
|
|
47
42
|
return image_tag img_url, class: hsh[:class], style: "width:#{hsh[:width]};height:#{hsh[:height]};#{hsh[:style]}"
|
48
43
|
end
|
49
44
|
|
50
|
-
def display_user_image(user, hsh)
|
51
|
-
hsh[:width] = "100%" unless hsh[:width]
|
52
|
-
hsh[:height] = "auto" unless hsh[:height]
|
53
|
-
|
54
|
-
ph = hsh.has_key?(:place_holder) ? hsh[:place_holder] : {}
|
55
|
-
ph[:width] = ph.has_key?(:width) ? ph[:width] : DEFAULT_PLACE_HOLDER_WIDTH
|
56
|
-
ph[:height] = ph.has_key?(:height) ? ph[:height] : DEFAULT_PLACE_HOLDER_HEIGHT
|
57
|
-
ph[:text] = ph.has_key?(:text) ? ph[:text] : DEFAULT_PLACE_HOLDER_TEXT
|
58
|
-
hsh[:place_holder] = ph
|
59
|
-
|
60
|
-
hsh[:style] = "" unless hsh[:style]
|
61
|
-
hsh[:class] = "" unless hsh[:class]
|
62
|
-
hsh[:size] = "thumb" unless hsh[:size]
|
63
|
-
hsh[:url_domain] = "http://localhost:3000" unless hsh[:url_domain]
|
64
|
-
|
65
|
-
if user.send("#{hsh[:size]}_url").blank?
|
66
|
-
url = "http://placehold.it/#{ph[:width]}x#{ph[:height]}&text=#{ph[:text]}"
|
67
|
-
else
|
68
|
-
url = hsh[:url_domain] + user.send("#{hsh[:size]}_url")
|
69
|
-
end
|
70
|
-
|
71
|
-
return image_tag url, class: hsh[:class], style: "width:#{hsh[:width]};height:#{hsh[:height]};#{hsh[:style]}"
|
72
|
-
end
|
73
|
-
|
74
45
|
## Returns new photo url or edit existing photo url based on
|
75
46
|
# object is associated with photo or not
|
76
47
|
# == Examples
|
@@ -78,11 +49,10 @@ module Poodle
|
|
78
49
|
# => "/admin/images/new" OR
|
79
50
|
# => "/admin/images/1/edit"
|
80
51
|
def upload_image_link(object, redirect_url, assoc_name=:photo)
|
81
|
-
|
82
52
|
photo_object = nil
|
83
53
|
photo_object = object.send(assoc_name) if object.respond_to?(assoc_name)
|
84
|
-
|
85
|
-
if photo_object.present?
|
54
|
+
|
55
|
+
if photo_object.present? && photo_object.persisted?
|
86
56
|
edit_admin_image_path(photo_object,
|
87
57
|
:redirect_url => redirect_url,
|
88
58
|
:imageable_id => object.id,
|
@@ -1,4 +1,39 @@
|
|
1
1
|
module Poodle
|
2
2
|
module MetaTagsHelper
|
3
|
+
def meta_tags
|
4
|
+
return "" unless @meta_tags
|
5
|
+
@meta_tags.reverse_merge!(
|
6
|
+
"robots" => :all,
|
7
|
+
"viewport" => "width=device-width, initial-scale=1.0",
|
8
|
+
"copyright" => "2015 K P Varma",
|
9
|
+
"content-language" => "en",
|
10
|
+
"resource-type" => "document",
|
11
|
+
"distribution" => "global",
|
12
|
+
"rating" => "general"
|
13
|
+
)
|
14
|
+
|
15
|
+
link_tags_list = []
|
16
|
+
meta_tags_list = []
|
17
|
+
|
18
|
+
{
|
19
|
+
prev: :rel_prev,
|
20
|
+
next: :rel_next,
|
21
|
+
canonical: :canonical
|
22
|
+
}.each do |k, v|
|
23
|
+
link_tags_list << content_tag(:link, "", rel: k, href: v) if @meta_tags[k]
|
24
|
+
end
|
25
|
+
|
26
|
+
{
|
27
|
+
meta_description: :meta_description,
|
28
|
+
meta_keywords: :meta_keywords,
|
29
|
+
keywords: :keywords,
|
30
|
+
robots: :robots
|
31
|
+
}.each do |k, v|
|
32
|
+
meta_tags_list << content_tag(:meta, "", name: k, content: v) if @meta_tags[k]
|
33
|
+
end
|
34
|
+
|
35
|
+
raw(link_tags_list.join(" ") + meta_tags_list.join(" "))
|
36
|
+
|
37
|
+
end
|
3
38
|
end
|
4
39
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<html lang="en" class="no-js">
|
3
3
|
<head>
|
4
4
|
<title><%= title -%></title>
|
5
|
-
<%=
|
5
|
+
<%= meta_tags %>
|
6
6
|
<link rel="icon" href="/assets/favicon.ico" type="image/png">
|
7
7
|
<%= stylesheet_link_tag "poodle/application", :media => "all" -%>
|
8
8
|
<%= csrf_meta_tags -%>
|
@@ -25,8 +25,8 @@
|
|
25
25
|
</div>
|
26
26
|
|
27
27
|
<%#* Show flash messages if controller has set any. -%>
|
28
|
-
<div id="div_flash_message"
|
29
|
-
<%=
|
28
|
+
<div id="div_flash_message">
|
29
|
+
<%= flash_message() -%>
|
30
30
|
</div>
|
31
31
|
|
32
32
|
<%#* Page Content Starts here -%>
|
@@ -47,7 +47,7 @@
|
|
47
47
|
<%= render :partial=>"/layouts/poodle/common/overlays" -%>
|
48
48
|
|
49
49
|
<%#* Loading Javascripts -%>
|
50
|
-
<%= javascript_include_tag "
|
50
|
+
<%= javascript_include_tag "application" -%>
|
51
51
|
|
52
52
|
<%= yield :javascript_footer -%>
|
53
53
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<html lang="en" class="no-js">
|
3
3
|
<head>
|
4
4
|
<title><%= title -%></title>
|
5
|
-
<%=
|
5
|
+
<%= meta_tags %>
|
6
6
|
<link rel="icon" href="/assets/favicon.ico" type="image/png">
|
7
7
|
<%= stylesheet_link_tag "poodle/application", :media => "all" -%>
|
8
8
|
<%= csrf_meta_tags -%>
|
@@ -19,8 +19,8 @@
|
|
19
19
|
</div>
|
20
20
|
|
21
21
|
<%#* Show flash messages if controller has set any. -%>
|
22
|
-
<div id="div_flash_message"
|
23
|
-
<%=
|
22
|
+
<div id="div_flash_message">
|
23
|
+
<%= flash_message() -%>
|
24
24
|
</div>
|
25
25
|
|
26
26
|
<%#* Page Content Starts here -%>
|
@@ -39,7 +39,7 @@
|
|
39
39
|
<%= render :partial=>"/layouts/poodle/common/overlays" -%>
|
40
40
|
|
41
41
|
<%#* Loading Javascripts -%>
|
42
|
-
<%= javascript_include_tag "
|
42
|
+
<%= javascript_include_tag "application" -%>
|
43
43
|
|
44
44
|
<%= yield :javascript_footer -%>
|
45
45
|
|
@@ -17,7 +17,8 @@
|
|
17
17
|
%>
|
18
18
|
<div class="panel panel-default mt-10">
|
19
19
|
<div class="panel-heading">
|
20
|
-
<h3 class="panel-title"
|
20
|
+
<h3 class="panel-title">
|
21
|
+
<%= heading %>
|
21
22
|
<span class="pull-right">
|
22
23
|
<% if minimizable %>
|
23
24
|
<a href="#" class="panel-minimize"><i class="fa fa-chevron-up"></i></a>
|
@@ -0,0 +1,70 @@
|
|
1
|
+
<%
|
2
|
+
unless(defined?(heading) && heading)
|
3
|
+
heading = "More Details"
|
4
|
+
end
|
5
|
+
unless(defined?(minimizable) && minimizable)
|
6
|
+
minimizable = false
|
7
|
+
end
|
8
|
+
unless(defined?(closable) && closable)
|
9
|
+
closable = false
|
10
|
+
end
|
11
|
+
unless(defined?(display_footer) && display_footer)
|
12
|
+
display_footer = false
|
13
|
+
end
|
14
|
+
unless(defined?(data_columns) && data_columns)
|
15
|
+
data_columns = data_model.class.column_names.map{|x| x.to_sym}
|
16
|
+
end
|
17
|
+
%>
|
18
|
+
|
19
|
+
<h4 class="text-color-gray"><%= heading %></h3>
|
20
|
+
|
21
|
+
<table class="table table-condensed table-hover table-striped mt-20">
|
22
|
+
<thead>
|
23
|
+
<tr>
|
24
|
+
<th>Sl.</th>
|
25
|
+
<th>Attribute</th>
|
26
|
+
<th>Value</th>
|
27
|
+
</tr>
|
28
|
+
</thead>
|
29
|
+
<tbody>
|
30
|
+
|
31
|
+
<% data_model.class.column_names.each_with_index do |column, index| %>
|
32
|
+
<% next unless data_columns.include?(column.to_sym) %>
|
33
|
+
<% next if (column.include?("token") || column.include?("password")) %>
|
34
|
+
<% if column.include?("_id") %>
|
35
|
+
<% assoc_object = data_model.send(column.gsub("_id", "").to_sym) %>
|
36
|
+
<tr class="text-color-gray">
|
37
|
+
<td><%= index + 1 %>.</td>
|
38
|
+
<td class="bold"><%= column.titleize %></td>
|
39
|
+
<% case assoc_object.class.name %>
|
40
|
+
<% when "Designation" %>
|
41
|
+
<td><%= assoc_object.title %></td>
|
42
|
+
<% when "Department" %>
|
43
|
+
<td><%= assoc_object.name %></td>
|
44
|
+
<% else %>
|
45
|
+
<td><%= assoc_object.class %> not recogonized</td>
|
46
|
+
<% end %>
|
47
|
+
</tr>
|
48
|
+
<% else %>
|
49
|
+
<% value = data_model.send(column) %>
|
50
|
+
<tr class="text-color-gray">
|
51
|
+
<td><%= index + 1 %>.</td>
|
52
|
+
<td class="bold"><%= column.titleize %></td>
|
53
|
+
<% case value.class.to_s %>
|
54
|
+
<% when "Time" %>
|
55
|
+
<td><%= display_time(value) %></td>
|
56
|
+
<% else %>
|
57
|
+
<td><%= value.blank? ? "<not set>" : value %></td>
|
58
|
+
<% end %>
|
59
|
+
</tr>
|
60
|
+
<% end %>
|
61
|
+
|
62
|
+
<% end %>
|
63
|
+
|
64
|
+
</tbody>
|
65
|
+
</table>
|
66
|
+
|
67
|
+
<% if display_footer %>
|
68
|
+
<%= link_to raw("<i class=\"icon-pencil icon-white mr-5\"></i> Edit"), edit_link, :class=>"btn btn-default btn-xs pull-right ml-10", :remote=>true if defined?(edit_link) && edit_link %>
|
69
|
+
<%= link_to raw("<i class=\"icon-remove \"></i> Delete"), delete_link, method: :delete, data: { confirm: 'Are you sure?' }, :class=>"btn btn-danger btn-xs pull-right", :remote=>true if defined?(delete_link) && delete_link %>
|
70
|
+
<% end %>
|
@@ -0,0 +1,224 @@
|
|
1
|
+
module Poodle
|
2
|
+
module ActionView
|
3
|
+
# This module creates Bootstrap wrappers around basic View Tags
|
4
|
+
module FormHelper
|
5
|
+
# Example 1
|
6
|
+
#
|
7
|
+
# theme_form_group("Student Name") do
|
8
|
+
# text_field_tag(:student, :name)
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# is equivalent to:
|
12
|
+
#
|
13
|
+
# <div class="form-group ">
|
14
|
+
# <label for="inp_name" class="col-md-4 control-label">Student Name
|
15
|
+
# <span class="text-color-red ml-10 mr-5 pull-right">*</span>
|
16
|
+
# </label>
|
17
|
+
# <div class="col-md-8">
|
18
|
+
# <%= text_field_tag(:student, :name) %>
|
19
|
+
# </div>
|
20
|
+
# </div>
|
21
|
+
#
|
22
|
+
# ---------------------------
|
23
|
+
#
|
24
|
+
# Example 2
|
25
|
+
#
|
26
|
+
# theme_form_group("Please select a Movie", required: false) do
|
27
|
+
# collection_select(@movie_ticket, :movie_id, movies_list, :id, name, {:prompt=>true}, {:class => 'form-control'})
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# is equivalent to:
|
31
|
+
#
|
32
|
+
# <div class="form-group ">
|
33
|
+
# <label for="inp_movie_id" class="col-md-4 control-label">
|
34
|
+
# Please select a Movie
|
35
|
+
# </label>
|
36
|
+
# <div class="col-md-8">
|
37
|
+
# <%= collection_select(@movie_ticket, :movie_id, movies_list, :id, name, {:prompt=>true}, {:class => 'form-control'}) %>
|
38
|
+
# </div>
|
39
|
+
# </div>
|
40
|
+
|
41
|
+
# Example 3
|
42
|
+
# if you want to change the label div column width which is by default set to "col-md-4"
|
43
|
+
# and field div column width which is by default set to "col-md-8" by passing label_col_class and field_col_class
|
44
|
+
#
|
45
|
+
# theme_form_group("Please select a Movie", label_col_class: "col-md-6", field_col_class: "col-md-6") do
|
46
|
+
# ....
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
|
50
|
+
# Example 4
|
51
|
+
# If you want to add error_class to form-group div tag you can pass it through options
|
52
|
+
#
|
53
|
+
# theme_form_group("Please select a Movie", error_class: "error-class") do
|
54
|
+
# ....
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
|
58
|
+
def theme_form_group(label, **options)
|
59
|
+
options.reverse_merge!(
|
60
|
+
error_class: "",
|
61
|
+
param_name: label.gsub(" ", "_").underscore,
|
62
|
+
required: true,
|
63
|
+
label_col_class: "col-md-4",
|
64
|
+
field_col_class: "col-md-8"
|
65
|
+
)
|
66
|
+
|
67
|
+
content_tag(:div, class: "form-group #{options[:error_class]}") do
|
68
|
+
content_tag(:label, class: "#{options[:label_col_class]} control-label") do
|
69
|
+
star_content = options[:required] ? "*" : raw(" ")
|
70
|
+
raw(label + content_tag(:span, star_content, class: "text-color-red ml-10 mr-5 pull-right"))
|
71
|
+
end +
|
72
|
+
content_tag(:div, class: options[:field_col_class]) do
|
73
|
+
if block_given?
|
74
|
+
yield
|
75
|
+
else
|
76
|
+
"No Block Passed"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Creates the form group with label, and text field
|
83
|
+
# Supports the following input type: "text", "email", "search", "password", "date", "time", "tel", "url", "month"
|
84
|
+
# Example
|
85
|
+
# theme_form_field(@project, :name)
|
86
|
+
#
|
87
|
+
# <div class="form-group ">
|
88
|
+
# <label class="col-md-4 control-label" for="inp_name">
|
89
|
+
# Name
|
90
|
+
# <span class="text-color-red ml-10 mr-5 pull-right">*</span>
|
91
|
+
# </label>
|
92
|
+
# <div class="col-md-8">
|
93
|
+
# <input class="text input form-control" id="inp_name" name="link_type[name]" placeholder="" type="text">
|
94
|
+
# </div>
|
95
|
+
# </div>
|
96
|
+
|
97
|
+
def theme_form_field(object, field_name, **options)
|
98
|
+
options.symbolize_keys!
|
99
|
+
options.reverse_merge!(
|
100
|
+
object_name: object.class.name.underscore,
|
101
|
+
label: field_name.to_s.gsub("_", " ").titleize,
|
102
|
+
required: true,
|
103
|
+
error_class: "has-errors",
|
104
|
+
html_options: {}
|
105
|
+
)
|
106
|
+
options.reverse_merge!(
|
107
|
+
param_name: "#{options[:object_name]}[#{field_name}]"
|
108
|
+
)
|
109
|
+
error_class = object.errors[field_name.to_s].any? ? options[:error_class] : ""
|
110
|
+
|
111
|
+
theme_form_group(options[:label], required: options[:required], error_class: error_class) do
|
112
|
+
options[:html_options].reverse_merge!(
|
113
|
+
type: "text",
|
114
|
+
id: "inp_#{options[:label].to_s.gsub(" ", "_").downcase}",
|
115
|
+
class: "text input form-control",
|
116
|
+
place_holder: ""
|
117
|
+
)
|
118
|
+
case options[:html_options][:type].to_sym
|
119
|
+
when :text, :email, :search, :password, :date, :time, :tel, :url, :month
|
120
|
+
text_field_tag(options[:param_name], object.send(field_name.to_s), **options[:html_options])
|
121
|
+
when :textarea
|
122
|
+
options[:html_options].merge!(style: "height: 80px;")
|
123
|
+
text_area_tag(options[:param_name], object.send(field_name.to_s), **options[:html_options])
|
124
|
+
when :file
|
125
|
+
file_field_tag(options[:param_name], object.send(field_name.to_s), **options[:html_options])
|
126
|
+
when :checkbox
|
127
|
+
options[:html_options][:class] = "checkbox mt-10"
|
128
|
+
check_box_tag(options[:param_name], field_name, object.send(field_name.to_s), **options[:html_options])
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
# Example
|
135
|
+
# assoc_collection = Client.select("id, name").order("name ASC").all
|
136
|
+
# options = {assoc_object: client, assoc_display_method: :name, assoc_collection: Client.select("id, name").order("name ASC").all, label: "Client", required: true}
|
137
|
+
# theme_form_assoc_group(project, :client_id, **options)
|
138
|
+
# is equivalent to:
|
139
|
+
# ---------------------------
|
140
|
+
# <% Choose Client - Drop Down %>
|
141
|
+
# <div class="form-group ">
|
142
|
+
# <label for="inp_name" class="col-md-4 control-label">
|
143
|
+
# Client
|
144
|
+
# <span class="text-color-red ml-10 mr-5 pull-right">*</span>
|
145
|
+
# </label>
|
146
|
+
# <div class="col-md-8">
|
147
|
+
# <% if editable && @client %>
|
148
|
+
# <%= @client.name %>
|
149
|
+
# <%= hidden_field_tag "project[client_id]", @client.id %>
|
150
|
+
# <% else %>
|
151
|
+
# <%= collection_select(:project, :client_id, Client.select("id, name").order("name ASC").all, :id, :name, {:prompt=>true}, {:class => 'form-control'}) %>
|
152
|
+
# <% end %>
|
153
|
+
# </div>
|
154
|
+
# </div>
|
155
|
+
def theme_form_assoc_group(object, foreign_key, **options)
|
156
|
+
options.symbolize_keys!
|
157
|
+
assoc_method_name = foreign_key.to_s.chomp("_id")
|
158
|
+
options.reverse_merge!(
|
159
|
+
assoc_object: object.respond_to?(assoc_method_name) ? object.send(assoc_method_name) : nil,
|
160
|
+
assoc_display_method: :name,
|
161
|
+
assoc_collection: [],
|
162
|
+
param_name: object.class.name.underscore,
|
163
|
+
object_name: object.class.name.underscore,
|
164
|
+
required: true,
|
165
|
+
label: foreign_key.to_s.titleize,
|
166
|
+
prompt: true,
|
167
|
+
editable: true,
|
168
|
+
error_class: "has-errors"
|
169
|
+
)
|
170
|
+
|
171
|
+
error_class = object.errors[foreign_key.to_s].any? ? options[:error_class] : ""
|
172
|
+
|
173
|
+
theme_form_group(options[:label], required: options[:required], error_class: options[:error_class]) do
|
174
|
+
if !options[:editable] && options[:assoc_object]
|
175
|
+
raw(options[:assoc_object].send(options[:assoc_display_method]) + hidden_field_tag("#{options[:param_name]}[#{foreign_key}]", options[:assoc_object].id))
|
176
|
+
else
|
177
|
+
collection_select(options[:object_name], foreign_key, options[:assoc_collection], :id, options[:assoc_display_method], {:prompt=>options[:prompt]}, {:class => 'form-control'})
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
# Example
|
184
|
+
# roles = ConfigCenter::Roles::LIST
|
185
|
+
# options_list = Array[*roles.collect {|v,i| [v,v] }].sort
|
186
|
+
# theme_form_select_group(f, @proposal, :plan, options_list, label: "Choose Plan", param_name: "proposal[:plan]", prompt: true)
|
187
|
+
# is equivalent to:
|
188
|
+
# ---------------------------
|
189
|
+
# <div class="form-group ">
|
190
|
+
# <label for="inp_name" class="col-md-4 control-label">Choose Plan
|
191
|
+
# <span class="text-color-red ml-10 mr-5 pull-right">*</span>
|
192
|
+
# </label>
|
193
|
+
# <div class="col-md-8">
|
194
|
+
# <% options_list = ConfigCenter::Roles::LIST %>
|
195
|
+
# <%= f.select("proposal[:plan]", options_for_select(options_list, :selected => f.object.name), {:prompt=>true}, {:class => 'form-control'}) %>
|
196
|
+
# </div>
|
197
|
+
# </div>
|
198
|
+
def theme_form_select_group(form, object, field_name, options_list, **options)
|
199
|
+
options.reverse_merge!(
|
200
|
+
label: "Label",
|
201
|
+
param_name: "Param",
|
202
|
+
prompt: true,
|
203
|
+
error_class: "has-errors",
|
204
|
+
required: false
|
205
|
+
)
|
206
|
+
error_class = object.errors[field_name.to_s].any? ? options[:error_class] : ""
|
207
|
+
theme_form_group(options[:label], required: options[:required], error_class: options[:error_class]) do
|
208
|
+
form.select(options[:param_name], options_for_select(options_list, :selected => form.object.name), {:prompt=>options[:prompt]}, {:class => 'form-control'})
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Creates a submit button with basic styles
|
213
|
+
# Example
|
214
|
+
# submit_tag button_text, "data-reset-text"=>button_text, "data-loading-text"=>"Saving ...", :class=>"btn btn-primary ml-10"
|
215
|
+
# is equivalent to:
|
216
|
+
# ---------------------------
|
217
|
+
# submit_tag button_text, "data-reset-text"=>button_text, "data-loading-text"=>"Saving ...", :class=>"btn btn-primary ml-10"
|
218
|
+
def theme_form_button(object, button_text="", saving_message="Saving ...")
|
219
|
+
button_text = "#{object.new_record? ? "Create" : "Update"}" if button_text.blank?
|
220
|
+
submit_tag(button_text, "data-reset-text"=>button_text, "data-loading-text"=>saving_message, :class=>"btn btn-primary ml-10")
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
@@ -0,0 +1,350 @@
|
|
1
|
+
module Poodle
|
2
|
+
module ActionView
|
3
|
+
# This module creates Bootstrap wrappers around basic View Tags
|
4
|
+
module ThemeHelper
|
5
|
+
# theme_fa_icon('plus')
|
6
|
+
# <i class='fa fa-plus mr-10'></i>
|
7
|
+
# theme_fa_icon('plus', 'lg')
|
8
|
+
# <i class='fa fa-plus fa-lg mr-10'></i>
|
9
|
+
def theme_fa_icon(icon_text, size="")
|
10
|
+
"<i class='fa fa-#{icon_text} #{size.blank? ? "" : "fa-"+size}'></i>"
|
11
|
+
end
|
12
|
+
|
13
|
+
# theme_button_text('New Project')
|
14
|
+
# <span class='btn-text'> New Project</span>
|
15
|
+
def theme_button_text(text)
|
16
|
+
"<span class='btn-text'> #{text}</span>"
|
17
|
+
end
|
18
|
+
|
19
|
+
# theme_button is used to create poodle like buttons which has built in classes and icons
|
20
|
+
# e.g:
|
21
|
+
# theme_button('New Project', 'plus', new_admin_project_path)
|
22
|
+
# The above is equivalent to
|
23
|
+
# link_to raw("<i class='fa fa-plus mr-10'></i><span class='btn-text'> New Project</span>"), new_admin_project_path, :class=>"btn btn-primary pull-right ml-5", :remote=>true
|
24
|
+
# And produces the following html
|
25
|
+
# <a class="btn btn-primary pull-right ml-5" data-remote="true" href="/admin/projects/new"><i class="fa fa-plus mr-10"></i><span class="btn-text"> New Project</span></a>
|
26
|
+
def theme_button(text, icon, url, options={})
|
27
|
+
options.reverse_merge!(
|
28
|
+
method: :get,
|
29
|
+
remote: true,
|
30
|
+
btn_type: :primary,
|
31
|
+
btn_size: :md,
|
32
|
+
classes: "pull-right ml-5 mb-5",
|
33
|
+
data: {}
|
34
|
+
)
|
35
|
+
display_content = raw(theme_fa_icon(icon)+theme_button_text(text))
|
36
|
+
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])
|
37
|
+
end
|
38
|
+
|
39
|
+
# Example
|
40
|
+
# theme_edit_button(edit_admin_project_path(@project))
|
41
|
+
# is equivalent to:
|
42
|
+
# ---------------------------
|
43
|
+
# link_to raw("<i class=\"fa fa-edit mr-5\"></i> Edit"), edit_admin_project_path(@project), :class=>"btn btn-default btn-xs pull-right ml-10", :remote=>true %>
|
44
|
+
def theme_edit_button(url, options={})
|
45
|
+
options.reverse_merge!(
|
46
|
+
text: "Edit",
|
47
|
+
icon: "edit",
|
48
|
+
method: :get,
|
49
|
+
remote: true,
|
50
|
+
btn_type: :default,
|
51
|
+
btn_size: :xs,
|
52
|
+
classes: "pull-right ml-10"
|
53
|
+
)
|
54
|
+
theme_button(options[:text], options[:icon], url, options)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Example
|
58
|
+
# theme_delete_button(admin_project_path(@project))
|
59
|
+
# is equivalent to:
|
60
|
+
# ---------------------------
|
61
|
+
# link_to raw("<i class=\"fa fa-trash \"></i> Delete"), admin_project_path(@project), method: :delete, data: { confirm: 'Are you sure?' }, :class=>"btn btn-danger btn-xs pull-right", :remote=>true
|
62
|
+
def theme_delete_button(url, options={})
|
63
|
+
options.reverse_merge!(
|
64
|
+
text: "Delete",
|
65
|
+
icon: "trash",
|
66
|
+
method: :delete,
|
67
|
+
remote: true,
|
68
|
+
btn_type: :danger,
|
69
|
+
btn_size: :xs,
|
70
|
+
classes: "pull-right ml-10",
|
71
|
+
data: { confirm: 'Are you sure?' }
|
72
|
+
)
|
73
|
+
theme_button(options[:text], options[:icon], url, options)
|
74
|
+
end
|
75
|
+
|
76
|
+
# theme_heading(heading)
|
77
|
+
# theme_heading(heading, icon='cog')
|
78
|
+
# <div class="row mb-10">
|
79
|
+
# <div class="fs-22 col-sm-12"><i class='fa fa-rub fa-lg mr-10'></i>Manage Projects</div>
|
80
|
+
# </div>
|
81
|
+
def theme_heading(heading, icon='rub')
|
82
|
+
content_tag :div, class: "row mb-10" do
|
83
|
+
content_tag :div, class: "fs-22 col-sm-12" do
|
84
|
+
raw((icon ? theme_fa_icon(icon, 'lg') : "") + " #{heading}")
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# theme_search_form is a helper to create a form to filter the results by entering a search query
|
90
|
+
def theme_search_form(cls, url, method=:get, remote=true, text="Search!")
|
91
|
+
form_for cls.new, :url => url,
|
92
|
+
:method => method, :remote=>remote,
|
93
|
+
:html=>{:class=>"pull-right", :style=>"margin-bottom:0px;"} do |f|
|
94
|
+
content_tag :div, class: "input-group" do
|
95
|
+
text_field_tag('query','', :class => 'form-control', :placeholder => 'Search ...') +
|
96
|
+
content_tag(:span, class: "input-group-btn") do
|
97
|
+
button_tag(type: 'submit', class: "btn btn-default") do
|
98
|
+
raw(theme_fa_icon('search') +
|
99
|
+
content_tag(:span, class: "btn-text") do
|
100
|
+
" " + text
|
101
|
+
end)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def theme_drop_down(collection, method_name)
|
109
|
+
content_tag(:div, class: "btn-group mt-10 mb-10", style: "width:100%;") do
|
110
|
+
button_tag(type: 'button', :class => "btn btn-default btn-block dropdown-toggle", "data-toggle" => "dropdown") do
|
111
|
+
raw("Choose a Project" + content_tag(:span, "", class: "caret"))
|
112
|
+
end +
|
113
|
+
content_tag(:ul, class: "dropdown-menu", role: "menu") do
|
114
|
+
li_array = []
|
115
|
+
collection.each do |item|
|
116
|
+
li_array << content_tag(:li) do
|
117
|
+
link_to item.send(method_name), url_for([:admin, item]), :remote => true
|
118
|
+
end
|
119
|
+
end
|
120
|
+
raw(li_array.join(" ")) +
|
121
|
+
content_tag(:li, link_to_next_page(collection, 'Next Page', :remote => true)) +
|
122
|
+
content_tag(:li, link_to_previous_page(collection, 'Previous Page', :remote => true))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def clear_tag(height)
|
128
|
+
content_tag(:div, "", class: "cl-#{height}")
|
129
|
+
end
|
130
|
+
|
131
|
+
# Example
|
132
|
+
# theme_paginate(@projects)
|
133
|
+
#
|
134
|
+
# is equivalent to:
|
135
|
+
# ---------------------------
|
136
|
+
# <div class="cl"></div>
|
137
|
+
# <% if @projects.any? %>
|
138
|
+
# <%= content_tag :div, :class=>"pull-right" do %>
|
139
|
+
# <%= paginate @projects, :remote => true %>
|
140
|
+
# <% end %>
|
141
|
+
# <% end %>
|
142
|
+
# <div class="cl"></div>
|
143
|
+
# ---------------------------
|
144
|
+
def theme_paginate(collection)
|
145
|
+
return "" if collection.empty?
|
146
|
+
clear_tag(10) +
|
147
|
+
content_tag(:div, :class=>"pull-right") do
|
148
|
+
paginate(collection, :remote => true)
|
149
|
+
end +
|
150
|
+
clear_tag(10)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Example
|
154
|
+
# theme_panel_message("No Results found")
|
155
|
+
#
|
156
|
+
# is equivalent to:
|
157
|
+
# ---------------------------
|
158
|
+
# <div class="panel panel-default text-color-grey p-80 text-align-center" style="height:200px;">
|
159
|
+
# "No Results found"
|
160
|
+
# </div>
|
161
|
+
def theme_panel_message(message)
|
162
|
+
content_tag(:div, class: "panel panel-default panel-message text-color-grey p-80 text-align-center", style: "height:200px;") do
|
163
|
+
raw(message)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# Example
|
168
|
+
# theme_panel_title("Team Members")
|
169
|
+
#
|
170
|
+
# is equivalent to:
|
171
|
+
# ---------------------------
|
172
|
+
# <h3 class="panel-title">Team Members</h3>
|
173
|
+
def theme_panel_title(title)
|
174
|
+
content_tag(:h3, title, class: "panel-title")
|
175
|
+
end
|
176
|
+
|
177
|
+
# Example
|
178
|
+
# theme_item_title(project.name, admin_project_path(project))
|
179
|
+
#
|
180
|
+
# is equivalent to:
|
181
|
+
# ---------------------------
|
182
|
+
# <%= link_to project.name, admin_project_path(project), :remote=>true, :class=>"text-color-blue fs-16" %>
|
183
|
+
def theme_item_title(title, url, classes = "text-color-blue fs-16")
|
184
|
+
link_to(title, url, :remote=>true, :class=>classes)
|
185
|
+
end
|
186
|
+
|
187
|
+
# Example
|
188
|
+
# theme_item_sub_title(project.client.name)
|
189
|
+
#
|
190
|
+
# is equivalent to:
|
191
|
+
# ---------------------------
|
192
|
+
# <div class="text-color-red fs-14"><%= project.client.name if project.client %></div>
|
193
|
+
def theme_item_sub_title(text, classes = "text-color-red fs-14")
|
194
|
+
content_tag(:div, text, class: classes)
|
195
|
+
end
|
196
|
+
|
197
|
+
# Example
|
198
|
+
# theme_item_description(project.client.name, 120)
|
199
|
+
#
|
200
|
+
# is equivalent to:
|
201
|
+
# ---------------------------
|
202
|
+
# <div class="text-color-grey fs-12"><%= project.client.description %></div>
|
203
|
+
def theme_item_description(text, limit=120, classes = "text-color-grey fs-12")
|
204
|
+
description = scrap_word(text, limit)
|
205
|
+
content_tag(:div, description, class: classes)
|
206
|
+
end
|
207
|
+
|
208
|
+
def theme_detail_box(collection)
|
209
|
+
case params[:action]
|
210
|
+
when "show"
|
211
|
+
render partial: params[:action]
|
212
|
+
when "index"
|
213
|
+
collection.empty? ? (theme_panel_message(I18n.translate("forms.no_results_found"))) : render(partial: "show")
|
214
|
+
else
|
215
|
+
theme_panel_message(I18n.translate("forms.no_results_found"))
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
#<% if request.xhr? %>
|
220
|
+
# <%= render :partial=>"layouts/poodle/common/flash_message" %>
|
221
|
+
#<% end %>
|
222
|
+
def theme_flash_message
|
223
|
+
render :partial=>"layouts/poodle/common/flash_message" if request.xhr?
|
224
|
+
end
|
225
|
+
|
226
|
+
# Example
|
227
|
+
# theme_more_widget(object, data_columns=[:id, :created_at, :updated_at], super_admin = true)
|
228
|
+
# is equivalent to:
|
229
|
+
# ---------------------------
|
230
|
+
# <% if @current_user.is_super_admin? %>
|
231
|
+
# <%= render :partial => "widgets/more_details", :locals=>{
|
232
|
+
# :data_model => @project,
|
233
|
+
# :data_columns => [:id, :created_at, :updated_at],
|
234
|
+
# :heading => "Technical Details",
|
235
|
+
# :display_footer => false} %>
|
236
|
+
# <% end %>
|
237
|
+
def theme_more_widget(object, **options)
|
238
|
+
options.reverse_merge!(
|
239
|
+
data_columns: [:id, :created_at, :updated_at],
|
240
|
+
super_admin: false,
|
241
|
+
heading: "Technical Details"
|
242
|
+
)
|
243
|
+
display = options[:super_admin] ? @current_user.is_super_admin? : true
|
244
|
+
render(:partial => "widgets/more_details",
|
245
|
+
:locals=>{:data_model => object,
|
246
|
+
:data_columns => options[:data_columns],
|
247
|
+
:heading => options[:heading],
|
248
|
+
:display_footer => false}) if display
|
249
|
+
end
|
250
|
+
|
251
|
+
# Example
|
252
|
+
# theme_image(@project, admin_project_path(@project), :url, "logo.image.url")
|
253
|
+
# is equivalent to:
|
254
|
+
# ---------------------------
|
255
|
+
# <% change_picture_url = upload_image_link(@project, admin_project_path(@project), :logo) %>
|
256
|
+
# <% img_tag = display_image(@project, "logo.image.url", width: "100%", place_holder: {width: 300, height: 180, text: "<No Image>"}) %>
|
257
|
+
# <%= link_to img_tag, change_picture_url, :remote => true %>
|
258
|
+
# <%= link_to raw("<i class=\"fa fa-photo mr-5\"></i> Change Picture"), change_picture_url, :class=>"btn btn-default btn-xs mt-10", :remote=>true %>
|
259
|
+
def theme_image(object, url, assoc_name, assoc_url, options={})
|
260
|
+
options.reverse_merge!(
|
261
|
+
width: "100%",
|
262
|
+
ph: {
|
263
|
+
width: 300,
|
264
|
+
height: 180,
|
265
|
+
text: "<No Image>"
|
266
|
+
},
|
267
|
+
remote: true,
|
268
|
+
text: "Change Image",
|
269
|
+
icon: "photo",
|
270
|
+
classes: "btn btn-default btn-xs mt-10"
|
271
|
+
)
|
272
|
+
change_picture_url = upload_image_link(object, url, assoc_name)
|
273
|
+
img_tag = display_image(object, assoc_url, width: options[:width], place_holder: options[:ph])
|
274
|
+
btn_display = raw(theme_fa_icon(options[:icon])+theme_button_text(options[:text]))
|
275
|
+
link_to(img_tag, change_picture_url, :remote => options[:remote]) +
|
276
|
+
link_to(btn_display, change_picture_url, :class=>options[:classes], :remote=>options[:remote])
|
277
|
+
end
|
278
|
+
|
279
|
+
# Example
|
280
|
+
# theme_panel_heading(@project.name)
|
281
|
+
# is equivalent to:
|
282
|
+
# ---------------------------
|
283
|
+
# <div class="fs-24 text-color-green"><%= @project.name %></div>
|
284
|
+
def theme_panel_heading(text, classes="fs-24 text-color-green")
|
285
|
+
content_tag(:div, text, class: classes)
|
286
|
+
end
|
287
|
+
|
288
|
+
# Example
|
289
|
+
# theme_panel_sub_heading(@project.name, admin_client_path(@project.client))
|
290
|
+
# is equivalent to:
|
291
|
+
# ---------------------------
|
292
|
+
# link_to(@project.client.name, admin_client_path(@project.client), class: "fs-16 text-color-red")
|
293
|
+
def theme_panel_sub_heading(text, url, classes="fs-16 text-color-red")
|
294
|
+
link_to(text, url, class: classes)
|
295
|
+
end
|
296
|
+
|
297
|
+
# Example
|
298
|
+
# theme_panel_description(@project.pretty_url, "fs-14")
|
299
|
+
# theme_panel_description(@project.description, "fs-14 mt-10")
|
300
|
+
# is equivalent to:
|
301
|
+
# ---------------------------
|
302
|
+
# <div class="fs-14"><%= @project.pretty_url %></div>
|
303
|
+
# <div class="fs-14 mt-10"><%= @project.description %></div>
|
304
|
+
def theme_panel_description(text, classes="fs-14")
|
305
|
+
content_tag(:div, text, class: classes)
|
306
|
+
end
|
307
|
+
|
308
|
+
# Example
|
309
|
+
# theme_user_image(@user, @role)
|
310
|
+
# is equivalent to:
|
311
|
+
def theme_user_image(user, **options)
|
312
|
+
|
313
|
+
url_domain = defined?(QAuthRubyClient) ? QAuthRubyClient.configuration.q_auth_url : "http://localhost:3000"
|
314
|
+
|
315
|
+
options.reverse_merge!(
|
316
|
+
role: nil,
|
317
|
+
width: 60,
|
318
|
+
height: options[:width],
|
319
|
+
popover: true,
|
320
|
+
size: "thumb",
|
321
|
+
url_domain: url_domain,
|
322
|
+
place_holder: { width: options[:width], height: options[:height], text: "<No Image>" },
|
323
|
+
html_options: {
|
324
|
+
class: "",
|
325
|
+
style: "width:100%;height:auto;cursor:pointer;"
|
326
|
+
}
|
327
|
+
)
|
328
|
+
|
329
|
+
options[:html_options].reverse_merge!(
|
330
|
+
"data-toggle" => "popover",
|
331
|
+
"data-placement" => "bottom",
|
332
|
+
title: user.name,
|
333
|
+
"data-content" => (options[:role] ? options[:role].name : "")
|
334
|
+
) if options[:popover]
|
335
|
+
|
336
|
+
if user.send("#{options[:size]}_url").blank?
|
337
|
+
url = "http://placehold.it/#{options[:place_holder][:width]}x#{options[:place_holder][:height]}&text=#{options[:place_holder][:text]}"
|
338
|
+
else
|
339
|
+
url = options[:url_domain] + user.send("#{options[:size]}_url")
|
340
|
+
end
|
341
|
+
|
342
|
+
content_tag(:div) do
|
343
|
+
content_tag(:div, class: "rounded", style: "width:#{options[:width]}px;height:#{options[:width]}px;") do
|
344
|
+
image_tag(url, options[:html_options])
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
end
|
data/lib/poodle/engine.rb
CHANGED
@@ -1,5 +1,31 @@
|
|
1
1
|
module Poodle
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
isolate_namespace Poodle
|
4
|
+
|
5
|
+
initializer "poodle.configure_rails_initialization" do |app|
|
6
|
+
ActiveSupport.on_load :action_view do
|
7
|
+
include Poodle::ActionView::FormHelper
|
8
|
+
include Poodle::ActionView::ModalHelper
|
9
|
+
include Poodle::ActionView::ThemeHelper
|
10
|
+
end
|
11
|
+
ActiveSupport.on_load :action_controller do
|
12
|
+
include Poodle::DisplayHelper
|
13
|
+
include Poodle::FlashHelper
|
14
|
+
include Poodle::ImageHelper
|
15
|
+
include Poodle::MetaTagsHelper
|
16
|
+
include Poodle::NavigationHelper
|
17
|
+
include Poodle::ParamsParserHelper
|
18
|
+
include Poodle::TitleHelper
|
19
|
+
include Poodle::UrlHelper
|
20
|
+
helper Poodle::DisplayHelper
|
21
|
+
helper Poodle::FlashHelper
|
22
|
+
helper Poodle::ImageHelper
|
23
|
+
helper Poodle::MetaTagsHelper
|
24
|
+
helper Poodle::NavigationHelper
|
25
|
+
helper Poodle::ParamsParserHelper
|
26
|
+
helper Poodle::TitleHelper
|
27
|
+
helper Poodle::UrlHelper
|
28
|
+
end
|
29
|
+
end
|
4
30
|
end
|
5
31
|
end
|
data/lib/poodle/version.rb
CHANGED
data/lib/poodle-rb.rb
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
require "poodle/engine"
|
2
2
|
require "poodle/configuration"
|
3
|
+
require 'poodle/action_view/form_helper'
|
4
|
+
require 'poodle/action_view/modal_helper'
|
5
|
+
require 'poodle/action_view/theme_helper'
|
6
|
+
|
7
|
+
require 'poodle/railtie' if defined?(Rails)
|
3
8
|
|
4
9
|
module Poodle
|
5
10
|
class << self
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: poodle-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Krishnaprasad Varma
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -105,7 +105,6 @@ files:
|
|
105
105
|
- app/helpers/poodle/image_helper.rb
|
106
106
|
- app/helpers/poodle/meta_tags_helper.rb
|
107
107
|
- app/helpers/poodle/navigation_helper.rb
|
108
|
-
- app/helpers/poodle/notification_helper.rb
|
109
108
|
- app/helpers/poodle/params_parser_helper.rb
|
110
109
|
- app/helpers/poodle/title_helper.rb
|
111
110
|
- app/helpers/poodle/url_helper.rb
|
@@ -113,17 +112,18 @@ files:
|
|
113
112
|
- app/views/layouts/poodle/application/_footer.html.erb
|
114
113
|
- app/views/layouts/poodle/application/_header.html.erb
|
115
114
|
- app/views/layouts/poodle/application/_sidebar.html.erb
|
116
|
-
- app/views/layouts/poodle/common/_field.html.erb
|
117
|
-
- app/views/layouts/poodle/common/_flash_message.html.erb
|
118
|
-
- app/views/layouts/poodle/common/_meta_tags.html.erb
|
119
115
|
- app/views/layouts/poodle/common/_overlays.html.erb
|
120
116
|
- app/views/layouts/poodle/public.html.erb
|
121
117
|
- app/views/widgets/_more_details.html.erb
|
122
|
-
-
|
118
|
+
- app/views/widgets/_more_details_table.html.erb
|
123
119
|
- config/routes.rb
|
124
120
|
- lib/poodle-rb.rb
|
121
|
+
- lib/poodle/action_view/form_helper.rb
|
122
|
+
- lib/poodle/action_view/modal_helper.rb
|
123
|
+
- lib/poodle/action_view/theme_helper.rb
|
125
124
|
- lib/poodle/configuration.rb
|
126
125
|
- lib/poodle/engine.rb
|
126
|
+
- lib/poodle/railtie.rb
|
127
127
|
- lib/poodle/version.rb
|
128
128
|
- lib/tasks/poodle_tasks.rake
|
129
129
|
- test/dummy/README.rdoc
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Poodle
|
2
|
-
module NotificationHelper
|
3
|
-
|
4
|
-
## This function will set a flash message depending up on the request type (ajax - xml http or direct http)
|
5
|
-
## example : store_flash_message("The message has been sent successfully", :success)
|
6
|
-
def store_flash_message(message, type)
|
7
|
-
if request.xhr?
|
8
|
-
flash.now[type] = message
|
9
|
-
else
|
10
|
-
flash[type] = message
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def set_notification_messages(heading, alert, not_type)
|
15
|
-
@heading = heading
|
16
|
-
@alert = alert
|
17
|
-
store_flash_message("#{@heading}: #{@alert}", not_type) if defined?(flash) && flash
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
<%
|
2
|
-
unless defined?(required)
|
3
|
-
required = false
|
4
|
-
end
|
5
|
-
unless defined?(place_holder)
|
6
|
-
place_holder = ""
|
7
|
-
end
|
8
|
-
inp_id = "inp_#{display_name.underscore.split(" ").join("_")}"
|
9
|
-
error_class = object.errors[field_name.to_s].any? ? "has-errors" : ""
|
10
|
-
%>
|
11
|
-
|
12
|
-
<div class="form-group <%= error_class %>">
|
13
|
-
|
14
|
-
<% if ["text", "email", "search", "password", "date", "time", "tel", "url", "month", "file", "image", ""].include?(input_type) %>
|
15
|
-
|
16
|
-
<label for="inp_<%= display_name.underscore.split(" ").join("_") %>" class="col-md-4 control-label">
|
17
|
-
<%= display_name %>
|
18
|
-
<span class="text-color-red ml-10 mr-5 pull-right"><%= required ? "*" : raw(" ") %></span>
|
19
|
-
</label>
|
20
|
-
<div class="col-md-8">
|
21
|
-
<input name="<%= object_name %>[<%= field_name %>]" id="inp_<%= display_name.underscore.split(" ").join("_") %>" class="text input form-control" type="<%= input_type %>" placeholder="<%= place_holder %>" value="<%= object.send(field_name.to_s) %>" />
|
22
|
-
</div>
|
23
|
-
|
24
|
-
<% elsif input_type == "checkbox" %>
|
25
|
-
|
26
|
-
<label for="inp_<%= display_name.underscore.split(" ").join("_") %>" class="col-md-4 control-label">
|
27
|
-
<%= display_name %>
|
28
|
-
<span class="text-color-red ml-10 mr-5 pull-right"><%= required ? "*" : raw(" ") %></span>
|
29
|
-
</label>
|
30
|
-
<div class="col-md-8">
|
31
|
-
<input name="<%= object_name %>[<%= field_name %>]" id="inp_<%= display_name.underscore.split(" ").join("_") %>" type="<%= input_type %>" class="checkbox input form-control" <%= object.send(field_name.to_s) ? "checked='checked'" : "" %> />
|
32
|
-
</div>
|
33
|
-
|
34
|
-
<% elsif input_type == "textarea" %>
|
35
|
-
|
36
|
-
<label for="inp_<%= display_name.underscore.split(" ").join("_") %>" class="col-md-4 control-label">
|
37
|
-
<%= display_name %>
|
38
|
-
<span class="text-color-red ml-10 mr-5 pull-right"><%= required ? "*" : raw(" ") %></span>
|
39
|
-
</label>
|
40
|
-
<div class="col-md-8">
|
41
|
-
<textarea name="<%= object_name %>[<%= field_name %>]" style="height:200px;" class="textarea input form-control" id="inp_<%= display_name.underscore.split(" ").join("_") %> placeholder="<%= place_holder %>" "><%= object.send(field_name.to_s) %></textarea>
|
42
|
-
</div>
|
43
|
-
|
44
|
-
<% end %>
|
45
|
-
|
46
|
-
</div>
|
@@ -1,23 +0,0 @@
|
|
1
|
-
<%
|
2
|
-
if request.xhr?
|
3
|
-
flash_message = flash.now[:success] || flash.now[:notice] || flash.now[:alert] || flash.now[:error]
|
4
|
-
style_classes = ""
|
5
|
-
else
|
6
|
-
style_classes = ""
|
7
|
-
flash_message = flash[:success] || flash[:notice] || flash[:alert] || flash[:error]
|
8
|
-
end
|
9
|
-
cls_name = "alert-info"
|
10
|
-
cls_name = 'alert-success' if flash.now[:success] || flash[:success]
|
11
|
-
cls_name = 'alert-warning' if flash.now[:alert] || flash[:alert]
|
12
|
-
cls_name = 'alert-danger' if flash.now[:error] || flash[:error]
|
13
|
-
|
14
|
-
flash_message = flash_message.strip if flash_message
|
15
|
-
|
16
|
-
%>
|
17
|
-
|
18
|
-
<% unless flash_message.blank? %>
|
19
|
-
<div class="<%= style_classes %> alert <%= cls_name %> fade in mb-10" data-alert="alert">
|
20
|
-
<a class="close" data-dismiss='alert' href="#">×</a>
|
21
|
-
<p><%= flash_message %></p>
|
22
|
-
</div>
|
23
|
-
<% end %>
|
@@ -1,42 +0,0 @@
|
|
1
|
-
|
2
|
-
<%# meta tags%>
|
3
|
-
<% if @meta_tags %>
|
4
|
-
<% if @meta_tags[:rel_prev] %>
|
5
|
-
<link rel="prev" href="<%%= @meta_tags[:rel_prev] %>" />
|
6
|
-
<% end %>
|
7
|
-
<% if @meta_tags[:rel_next] %>
|
8
|
-
<link rel="next" href="<%%= @meta_tags[:rel_next] %>" />
|
9
|
-
<% end %>
|
10
|
-
<% if @meta_tags[:canonical] %>
|
11
|
-
<link rel="canonical" href="<%%= @meta_tags[:canonical] %>" />
|
12
|
-
<% end %>
|
13
|
-
<% if @meta_tags[:meta_description] %>
|
14
|
-
<meta name="description" content="<%%= @meta_tags[:meta_description] %>"></meta>
|
15
|
-
<% else %>
|
16
|
-
<meta name="description" content="Twitter Like App = A learning app."></meta>
|
17
|
-
<% end %>
|
18
|
-
<% if @meta_tags[:meta_keywords] %>
|
19
|
-
<meta name="keywords" content="<%%= @meta_tags[:meta_keywords] %>"></meta>
|
20
|
-
<% else %>
|
21
|
-
<% meta_keywords = "Twitter Like App = A learning app." %>
|
22
|
-
<meta name="keywords" content="<%%= meta_keywords %>"></meta>
|
23
|
-
<% end %>
|
24
|
-
<% if @meta_tags[:robots] %>
|
25
|
-
<meta name="robots" content="<%%= @meta_tags[:robots] %>" />
|
26
|
-
<% else %>
|
27
|
-
<meta name="robots" content="all" />
|
28
|
-
<% end %>
|
29
|
-
<% end %>
|
30
|
-
|
31
|
-
<meta charset="utf-8">
|
32
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
33
|
-
<meta name="copyright" content="2014 kpvarma" />
|
34
|
-
<meta name="content-language" content="en" />
|
35
|
-
<meta name="author" content="K P Varma" />
|
36
|
-
<meta name="resource-type" content="document" />
|
37
|
-
<meta name="distribution" content="global" />
|
38
|
-
<meta name="rating" content="general" />
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
@@ -1,32 +0,0 @@
|
|
1
|
-
class ApiError < RuntimeError
|
2
|
-
|
3
|
-
attr_accessor :alert, :heading, :data, :errors, :redirect_on_failure, :redirect_on_success
|
4
|
-
|
5
|
-
def initialize(options={})
|
6
|
-
self.alert = options[:alert]
|
7
|
-
self.heading = options[:heading]
|
8
|
-
self.data = options[:data]
|
9
|
-
self.errors = options[:errors]
|
10
|
-
self.redirect_on_failure = options[:redirect_on_failure]
|
11
|
-
self.redirect_on_success = options[:redirect_on_success]
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
|
16
|
-
class InvalidLoginError < ApiError
|
17
|
-
end
|
18
|
-
|
19
|
-
class ValidationError < ApiError
|
20
|
-
end
|
21
|
-
|
22
|
-
class FailedToCreateError < ApiError
|
23
|
-
end
|
24
|
-
|
25
|
-
class FailedToUpdateError < ApiError
|
26
|
-
end
|
27
|
-
|
28
|
-
class FailedToDeleteError < ApiError
|
29
|
-
end
|
30
|
-
|
31
|
-
class AuthenticationError < ApiError
|
32
|
-
end
|