easel_helpers 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/Manifest +31 -0
- data/README.textile +3 -0
- data/Rakefile +18 -0
- data/easel_helpers.gemspec +41 -0
- data/lib/easel_helpers.rb +3 -0
- data/lib/easel_helpers/helpers.rb +81 -0
- data/lib/easel_helpers/helpers/date_helper.rb +15 -0
- data/lib/easel_helpers/helpers/form_helper.rb +68 -0
- data/lib/easel_helpers/helpers/grid_helper.rb +178 -0
- data/lib/easel_helpers/helpers/jquery_helper.rb +21 -0
- data/lib/easel_helpers/helpers/link_helper.rb +21 -0
- data/lib/easel_helpers/helpers/message_helper.rb +32 -0
- data/lib/easel_helpers/helpers/navigation_helper.rb +29 -0
- data/lib/easel_helpers/helpers/rjs_helper.rb +20 -0
- data/lib/easel_helpers/helpers/structure_helper.rb +43 -0
- data/lib/easel_helpers/helpers/table_helper.rb +61 -0
- data/lib/easel_helpers/rails_partial_caching.rb +40 -0
- data/rails/init.rb +4 -0
- data/tasks/easel_helpers_tasks.rake +4 -0
- data/test/date_helper_test.rb +59 -0
- data/test/form_helper_test.rb +135 -0
- data/test/grid_helper_test.rb +226 -0
- data/test/jquery_helper_test.rb +30 -0
- data/test/link_helper_test.rb +44 -0
- data/test/message_helper_test.rb +50 -0
- data/test/navigation_helper_test.rb +130 -0
- data/test/rjs_helper_test.rb +47 -0
- data/test/structure_helper_test.rb +54 -0
- data/test/table_helper_test.rb +112 -0
- data/test/test_helper.rb +34 -0
- metadata +152 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
module EaselHelpers
|
2
|
+
module Helpers
|
3
|
+
module JqueryHelper
|
4
|
+
|
5
|
+
def document_ready(&block)
|
6
|
+
html = content_tag :script, :type => "text/javascript" do
|
7
|
+
%(
|
8
|
+
(function($) {
|
9
|
+
$(document).ready(function() {
|
10
|
+
#{capture(&block)}
|
11
|
+
});
|
12
|
+
})(jQuery);
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
concat(html)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module EaselHelpers
|
2
|
+
module Helpers
|
3
|
+
module LinkHelper
|
4
|
+
|
5
|
+
def link_button(*args, &block)
|
6
|
+
doc = Hpricot(link_to(*args, &block))
|
7
|
+
doc.at("a").inner_html = "<span>#{doc.at("a").inner_html}</span>"
|
8
|
+
(doc/:a).add_class("btn")
|
9
|
+
doc.to_html
|
10
|
+
end
|
11
|
+
|
12
|
+
def link_to_email(email_address, *args)
|
13
|
+
options = args.extract_options!
|
14
|
+
link = args.first.is_a?(String) ? h(args.first) : email_address
|
15
|
+
return link if email_address.blank?
|
16
|
+
link_to link, "mailto:#{email_address}", options
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module EaselHelpers
|
2
|
+
module Helpers
|
3
|
+
module MessageHelper
|
4
|
+
|
5
|
+
def messages(messages, options = {})
|
6
|
+
except_keys = [options[:except]].flatten.compact
|
7
|
+
only_keys = [options[:only]].flatten.compact
|
8
|
+
|
9
|
+
if except_keys.any? && only_keys.any?
|
10
|
+
raise ArgumentError, ":only and :except options conflict; use one"
|
11
|
+
end
|
12
|
+
|
13
|
+
keys = if except_keys.any?
|
14
|
+
messages.keys - except_keys
|
15
|
+
elsif only_keys.any?
|
16
|
+
messages.keys & only_keys
|
17
|
+
else
|
18
|
+
messages.keys
|
19
|
+
end
|
20
|
+
|
21
|
+
keys.map do |key|
|
22
|
+
if messages[key].present?
|
23
|
+
content_tag :p,
|
24
|
+
messages[key],
|
25
|
+
:class => [key, "box", "single-line"].join(" ")
|
26
|
+
end
|
27
|
+
end.join
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module EaselHelpers
|
2
|
+
module Helpers
|
3
|
+
module NavigationHelper
|
4
|
+
def tab(name, path, options = {}, li_options = {})
|
5
|
+
opts = parse_tab_options(name, li_options)
|
6
|
+
|
7
|
+
active = "active" if (opts[:active] == opts[:comparison]) || opts[:compare]
|
8
|
+
css_classes = [] << opts[:li_classes] << active
|
9
|
+
css_classes = clean_css_classes(css_classes)
|
10
|
+
li_options.merge!(:class => css_classes) if css_classes.present?
|
11
|
+
|
12
|
+
content_tag :li,
|
13
|
+
link_to(name, path, options),
|
14
|
+
li_options
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse_tab_options(name, li_options = {})
|
20
|
+
returning({}) do |result|
|
21
|
+
result[:active] = li_options.delete(:active) || (name.gsub(/\s/, '').tableize || "")
|
22
|
+
result[:comparison] = li_options.delete(:active_compare) || controller.controller_name
|
23
|
+
result[:compare] = li_options.delete(:compare) || false
|
24
|
+
result[:li_classes] = li_options.delete(:class)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module EaselHelpers
|
2
|
+
module Helpers
|
3
|
+
module RjsHelper
|
4
|
+
|
5
|
+
def inline_flash(page, flash, options = {})
|
6
|
+
container_id = options[:container] || "flash-container"
|
7
|
+
current_flash = flash
|
8
|
+
|
9
|
+
flash.discard unless options[:keep_flash]
|
10
|
+
|
11
|
+
if options[:replace]
|
12
|
+
page.replace_html container_id, messages(current_flash)
|
13
|
+
else
|
14
|
+
page.insert_html :top, container_id, messages(current_flash)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module EaselHelpers
|
2
|
+
module Helpers
|
3
|
+
module StructureHelper
|
4
|
+
|
5
|
+
def blockquote(*args, &block)
|
6
|
+
options = args.extract_options!
|
7
|
+
author = options.delete(:author)
|
8
|
+
option_quote = textilize(options.delete(:quote))
|
9
|
+
|
10
|
+
bq = content_tag :blockquote,
|
11
|
+
option_quote.blank? ? capture(&block) : option_quote
|
12
|
+
|
13
|
+
html = if author
|
14
|
+
content_tag :div,
|
15
|
+
bq + content_tag(:cite, author),
|
16
|
+
:class => "quote-cited"
|
17
|
+
else
|
18
|
+
bq
|
19
|
+
end
|
20
|
+
|
21
|
+
concat(html)
|
22
|
+
end
|
23
|
+
|
24
|
+
def body(*args)
|
25
|
+
options = args.extract_options!
|
26
|
+
@_page_body_attributes ||= {}
|
27
|
+
|
28
|
+
css_classes = [] << @_page_body_attributes.delete(:class) << args
|
29
|
+
|
30
|
+
@_page_body_attributes = @_page_body_attributes.merge(options)
|
31
|
+
@_page_body_attributes[:class] = clean_css_classes(css_classes)
|
32
|
+
|
33
|
+
if block_given?
|
34
|
+
block = lambda { yield }
|
35
|
+
|
36
|
+
html = content_tag(:body, capture(&block), @_page_body_attributes)
|
37
|
+
concat(html)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module EaselHelpers
|
2
|
+
module Helpers
|
3
|
+
module TableHelper
|
4
|
+
|
5
|
+
def zebra_row(options = {}, &block)
|
6
|
+
cycle_list = options.delete(:cycle_list) || [nil, "alt"]
|
7
|
+
css_classes = [cycle(*cycle_list)] << options.delete(:class)
|
8
|
+
css_classes = clean_css_classes(css_classes)
|
9
|
+
|
10
|
+
html = content_tag :tr,
|
11
|
+
capture(&block),
|
12
|
+
options.merge(:class => css_classes)
|
13
|
+
concat(html)
|
14
|
+
end
|
15
|
+
|
16
|
+
def recordset(*args, &block)
|
17
|
+
options = args.extract_options!
|
18
|
+
options[:table] ||= {}
|
19
|
+
|
20
|
+
headers = []
|
21
|
+
(options[:headers] || []).each_with_index do |header, index|
|
22
|
+
head = [header].flatten
|
23
|
+
opts = head.extract_options!
|
24
|
+
|
25
|
+
css_classes = [] << opts.delete(:class) << case index
|
26
|
+
when 0 then "first"
|
27
|
+
when (options[:headers].size - 1) then "last"
|
28
|
+
end
|
29
|
+
|
30
|
+
headers << if head.first =~ /^\<th/
|
31
|
+
th = Hpricot(head.first)
|
32
|
+
th_classes = th.at("th")["class"].join
|
33
|
+
th_classes = clean_css_classes([th_classes, css_classes])
|
34
|
+
th.at("th")["class"] = th_classes
|
35
|
+
th.to_html
|
36
|
+
else
|
37
|
+
content_tag :th,
|
38
|
+
head.first,
|
39
|
+
opts.merge(:class => clean_css_classes(css_classes))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
table_classes = ["recordset", args] << options[:table].delete(:class)
|
44
|
+
css_classes = clean_css_classes(table_classes, {"last" => last_column})
|
45
|
+
|
46
|
+
html = clean_column(css_classes) do
|
47
|
+
table_options = options[:table]
|
48
|
+
table_options.merge!(:class => css_classes, :cellspacing => 0)
|
49
|
+
content_tag(:table,
|
50
|
+
content_tag(:thead, content_tag(:tr, headers.join)) + \
|
51
|
+
capture(&block),
|
52
|
+
table_options)
|
53
|
+
end
|
54
|
+
|
55
|
+
reset_cycle
|
56
|
+
concat(html)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module ActionView
|
2
|
+
module Partials
|
3
|
+
private
|
4
|
+
|
5
|
+
def render_partial_with_easel(*args)
|
6
|
+
path = args.first[:partial]
|
7
|
+
locals = args.last || {}
|
8
|
+
|
9
|
+
easel_cached_column_counts = session[:easel_cached_column_counts] ||= {}
|
10
|
+
|
11
|
+
if easel_cached_column_counts.keys.include?(path)
|
12
|
+
@_easel_column_count = locals[:easel_width] || easel_cached_column_counts[path]
|
13
|
+
easel_cached_column_counts[path] = @_easel_column_count
|
14
|
+
else
|
15
|
+
if @_easel_column_count.is_a?(Fixnum) && path !~ /^layout/
|
16
|
+
easel_cached_column_counts[path] = @_easel_column_count
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
render_partial_without_easel(*args)
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_method_chain :render_partial, :easel
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module EaselHelpers
|
28
|
+
module PartialCaching
|
29
|
+
def self.included(base)
|
30
|
+
base.send :include, EaselHelpers::PartialCaching::InstanceMethods
|
31
|
+
base.before_filter :clear_easel_cache
|
32
|
+
end
|
33
|
+
|
34
|
+
module InstanceMethods
|
35
|
+
def clear_easel_cache
|
36
|
+
session[:easel_cached_column_counts] = nil unless request.xhr?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DateHelperTest < ActiveSupport::TestCase
|
4
|
+
include EaselHelpers::Helpers::DateHelper
|
5
|
+
|
6
|
+
context "datetime helper" do
|
7
|
+
should "default to an empty string if date is not supplied" do
|
8
|
+
assert_equal "", datetime(nil)
|
9
|
+
end
|
10
|
+
|
11
|
+
should "default to passed default text if date is not supplied" do
|
12
|
+
assert_equal "default text", datetime(nil, "default text")
|
13
|
+
end
|
14
|
+
|
15
|
+
should "default to :long format for date" do
|
16
|
+
timestamp = Time.now
|
17
|
+
assert_equal timestamp.to_s(:long), datetime(timestamp)
|
18
|
+
end
|
19
|
+
|
20
|
+
should "use passed format if applicable" do
|
21
|
+
timestamp = Time.now
|
22
|
+
assert_equal timestamp.to_s(:short), datetime(timestamp, "", :short)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "convert passed data to a time" do
|
26
|
+
datestamp = Date.today
|
27
|
+
timestamp = datestamp.to_time
|
28
|
+
assert_equal timestamp.to_s(:long), datetime(datestamp)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "date helper" do
|
33
|
+
should "default to an empty string if date is not supplied" do
|
34
|
+
assert_equal "", date(nil)
|
35
|
+
end
|
36
|
+
|
37
|
+
should "default to passed default text if date is not supplied" do
|
38
|
+
assert_equal "default text", date(nil, "default text")
|
39
|
+
end
|
40
|
+
|
41
|
+
should "default to :long format for date" do
|
42
|
+
datestamp = Date.today
|
43
|
+
assert_equal datestamp.to_s(:long), date(datestamp)
|
44
|
+
end
|
45
|
+
|
46
|
+
should "use passed format if applicable" do
|
47
|
+
datestamp = Date.today
|
48
|
+
assert_equal datestamp.to_s(:short), date(datestamp, "", :short)
|
49
|
+
end
|
50
|
+
|
51
|
+
should "convert passed data to a time" do
|
52
|
+
timestamp = Time.now
|
53
|
+
datestamp = timestamp.to_date
|
54
|
+
|
55
|
+
assert_equal datestamp.to_s(:long), date(timestamp)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class FormHelperTest < EaselHelpers::ViewTestCase
|
4
|
+
|
5
|
+
context "submit_button" do
|
6
|
+
|
7
|
+
should "default with the correct structure" do
|
8
|
+
show_view "<%= submit_button 'Create' %>" do
|
9
|
+
assert_select "button.btn[type=submit][value=Create]" do
|
10
|
+
assert_select "span", "Create"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
should "allow adding additional classes" do
|
16
|
+
show_view "<%= submit_button 'Create', 'adtl-class', :dumb %>" do
|
17
|
+
assert_select "button.btn.adtl-class.dumb[type=submit][value=Create]" do
|
18
|
+
assert_select "span", "Create"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
should "handle additional attributes set" do
|
24
|
+
show_view "<%= submit_button 'Create', :kls, :id => 'my-id', :type => 'image' %>" do
|
25
|
+
assert_select "button.btn.kls#my-id[type=image][value=Create]" do
|
26
|
+
assert_select "span", "Create"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
should "allow overriding of value" do
|
32
|
+
show_view "<%= submit_button 'Create', :value => 'override' %>" do
|
33
|
+
assert_select "button.btn[type=submit][value=override]" do
|
34
|
+
assert_select "span", "Create"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
context "set" do
|
42
|
+
|
43
|
+
should "default with the correct structure" do
|
44
|
+
show_view "<% set do %>words<% end %>" do
|
45
|
+
assert_select "div.text", "words"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
should "allow adding/overriding classes" do
|
50
|
+
show_view "<% set :checkbox do %>words<% end %>" do
|
51
|
+
assert_select "div.checkbox", "words"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
should "handle additional attributes set" do
|
56
|
+
show_view "<% set :id => 'custom-id' do %>words<% end %>" do
|
57
|
+
assert_select "div.text#custom-id", "words"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
should "assign default class if width class is passed as the only class" do
|
62
|
+
show_view "<% set :half do %>words<% end %>" do
|
63
|
+
assert_select "div.text.col-12", "words"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
should "assign default class if last class is passed as the only class" do
|
68
|
+
show_view "<% set :half, :last do %>words<% end %>" do
|
69
|
+
assert_select "div.col-12.text.col-last", "words"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
should "assign default class if error class is passed" do
|
74
|
+
show_view "<% set :half, :last, :error do %>words<% end %>" do
|
75
|
+
assert_select "div.col-12.text.col-last.error", "words"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
should "assign default class if the class textarea is present" do
|
80
|
+
show_view "<% set :textarea do %>words<% end %>" do
|
81
|
+
assert_select "div.textarea.text", "words"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
context "fieldset" do
|
88
|
+
|
89
|
+
should "default with the correct structure" do
|
90
|
+
show_view "<% fieldset do %>words<% end %>" do
|
91
|
+
assert_select "fieldset", "words"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
should "assign the first argument as the legend if it is a string" do
|
96
|
+
show_view "<% fieldset 'User Information' do %>words<% end %>" do
|
97
|
+
assert_select "fieldset", /words/ do
|
98
|
+
assert_select "h3.legend", "User Information"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
should "allow adding fieldset classes" do
|
104
|
+
show_view "<% fieldset :hform, 'col-last' do %>words<% end %>" do
|
105
|
+
assert_select "fieldset.hform.col-last", "words"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
should "allow adding fieldset classes and a legend" do
|
110
|
+
show_view "<% fieldset 'User Information', :hform, 'col-last' do %>words<% end %>" do
|
111
|
+
assert_select "fieldset.hform.col-last", /words/ do
|
112
|
+
assert_select "h3.legend", "User Information"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
should "allow assignment of legend attributes" do
|
118
|
+
show_view "<% fieldset 'User Information', :hform, :legend => {:class => 'lgnd', :id => 'legend-id'} do %>words<% end %>" do
|
119
|
+
assert_select "fieldset.hform", /words/ do
|
120
|
+
assert_select "h3.legend.lgnd#legend-id", "User Information"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
should "allow assignment of fieldset attributes" do
|
126
|
+
show_view "<% fieldset 'User Information', :hform, :id => 'my-fieldset' do %>words<% end %>" do
|
127
|
+
assert_select "fieldset.hform#my-fieldset", /words/ do
|
128
|
+
assert_select "h3.legend", "User Information"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|