common_view_helpers 0.3.0 → 0.3.1
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/VERSION +1 -1
- data/init.rb +1 -3
- data/lib/common_view_helpers/common_view_helpers.rb +127 -0
- data/lib/common_view_helpers.rb +2 -126
- data/rails/init.rb +1 -3
- metadata +4 -9
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.1
|
data/init.rb
CHANGED
@@ -0,0 +1,127 @@
|
|
1
|
+
module CommonViewHelpers
|
2
|
+
module ViewHelpers
|
3
|
+
|
4
|
+
# Use words if within the last week, otherwise use date (show year if not this year)
|
5
|
+
def time_ago_in_words_or_date(date,options={})
|
6
|
+
return unless date
|
7
|
+
if (Time.now-date)/60/60/24 < 7
|
8
|
+
time_ago_in_words(date) + " ago"
|
9
|
+
elsif date.year == Time.now.year
|
10
|
+
options[:short_format] ? date.strftime(options[:short_format]) : date.strftime("%b %e").gsub(" ", " ")
|
11
|
+
else
|
12
|
+
options[:long_format] ? date.strftime(options[:long_format]) : date.strftime("%b %e, %Y").gsub(" ", " ")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Output an easily styleable key-value pair
|
17
|
+
def info_pair(label, value)
|
18
|
+
value = content_tag(:span, "None", :class => "blank") if value.blank?
|
19
|
+
label = content_tag(:span, "#{label}:", :class => "label")
|
20
|
+
content_tag(:span, [label, value].join(" "), :class => "info_pair")
|
21
|
+
end
|
22
|
+
|
23
|
+
# Give this helper an array, and get back a string of <li> elements.
|
24
|
+
# The first item gets a class of first and the last, well.. last.
|
25
|
+
# This makes it easier to apply CSS styles to lists, be they ordered or unordered.
|
26
|
+
# http://zeke.tumblr.com/post/98025647/a-nice-little-view-helper-for-generating-list-items
|
27
|
+
def convert_to_list_items(items, *args)
|
28
|
+
default_options = {:stripe => true}
|
29
|
+
options = default_options.merge(args.extract_options!)
|
30
|
+
out = []
|
31
|
+
items.each_with_index do |item, index|
|
32
|
+
css = []
|
33
|
+
css << "first" if items.first == item
|
34
|
+
css << "last" if items.last == item
|
35
|
+
css << "even" if options[:stripe] && index%2 == 1
|
36
|
+
css << "odd" if options[:stripe] && index%2 == 0 # (First item is odd (1))
|
37
|
+
out << content_tag(:li, item, :class => css.join(" "))
|
38
|
+
end
|
39
|
+
out.join("\n")
|
40
|
+
end
|
41
|
+
|
42
|
+
# Build an HTML table
|
43
|
+
# For collection, pass an array of arrays
|
44
|
+
# For headers, pass an array of label strings for the top of the table
|
45
|
+
# All other options will be passed along to the table content_tag
|
46
|
+
def generate_table(collection, headers=nil, options={})
|
47
|
+
return if collection.blank?
|
48
|
+
thead = content_tag(:thead) do
|
49
|
+
content_tag(:tr) do
|
50
|
+
headers.map {|header| content_tag(:th, header)}
|
51
|
+
end
|
52
|
+
end unless headers.nil?
|
53
|
+
tbody = content_tag(:tbody) do
|
54
|
+
collection.map do |values|
|
55
|
+
content_tag(:tr) do
|
56
|
+
values.map {|value| content_tag(:td, value)}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
content_tag(:table, [thead, tbody].compact.join("\n"), options)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Pass in an ActiveRecord object, get back edit and delete links inside a TD tag
|
64
|
+
def options_td(record_or_name_or_array, hide_destroy = false)
|
65
|
+
items = []
|
66
|
+
items << link_to('Edit', edit_polymorphic_path(record_or_name_or_array))
|
67
|
+
items << link_to('Delete', polymorphic_path(record_or_name_or_array), :confirm => 'Are you sure?', :method => :delete, :class => "destructive") unless hide_destroy
|
68
|
+
list = content_tag(:ul, convert_to_list_items(items))
|
69
|
+
content_tag(:td, list, :class => "options")
|
70
|
+
end
|
71
|
+
|
72
|
+
# This works just like link_to, but with one difference..
|
73
|
+
# If the link is to the current page, a class of 'active' is added
|
74
|
+
def link(name, options={}, html_options={})
|
75
|
+
link_to_unless_current(name, options, html_options) do
|
76
|
+
html_options[:class] = (html_options[:class] || "").split(" ").push("active").join(" ")
|
77
|
+
link_to(name, options, html_options)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Absolute path to an image
|
82
|
+
def image_url(source)
|
83
|
+
base_url + image_path(source)
|
84
|
+
end
|
85
|
+
|
86
|
+
# e.g. http://localhost:3000, or https://productionserver.com
|
87
|
+
def base_url
|
88
|
+
"#{request.protocol}#{request.host_with_port}"
|
89
|
+
end
|
90
|
+
|
91
|
+
# Generate a list of column name-value pairs for an AR object
|
92
|
+
def list_model_columns(obj)
|
93
|
+
items = obj.class.columns.map{ |col| info_pair(col.name, obj[col.name]) }
|
94
|
+
content_tag(:ul, convert_to_list_items(items), :class => "model_columns")
|
95
|
+
end
|
96
|
+
|
97
|
+
# Outputs a JS friendly (escaped) string
|
98
|
+
def js_string(string)
|
99
|
+
js_escape_map = {
|
100
|
+
'\\' => '\\\\',
|
101
|
+
'</' => '<\/',
|
102
|
+
"\r\n" => '\n',
|
103
|
+
"\n" => '\n',
|
104
|
+
"\r" => '\n',
|
105
|
+
'"' => '\\"',
|
106
|
+
"'" => "\\'" }
|
107
|
+
|
108
|
+
string.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { js_escape_map[$1] }
|
109
|
+
end
|
110
|
+
|
111
|
+
# Generates a URL and automatically adds http:// if not already there
|
112
|
+
# Useful alongside link() or when linking to user submitted addresses
|
113
|
+
def urlify(addr)
|
114
|
+
(addr.blank? || addr.starts_with?('http')) ? addr : "http://#{addr}"
|
115
|
+
end
|
116
|
+
|
117
|
+
# Breaks up a BigNum, FixNum or Float with commas
|
118
|
+
# e.g., 532566 => 532,566 and 79593255.66 => 79,593,255.66
|
119
|
+
def commify(num)
|
120
|
+
num.to_s =~ /([^\.]*)(\..*)?/
|
121
|
+
int, dec = $1.reverse, $2 ? $2 : ""
|
122
|
+
while int.gsub!(/(,|\.|^)(\d{3})(\d)/, '\1\2,\3'); end
|
123
|
+
int.reverse + dec
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
data/lib/common_view_helpers.rb
CHANGED
@@ -1,127 +1,3 @@
|
|
1
|
-
|
2
|
-
module ViewHelpers
|
1
|
+
require 'common_view_helpers/common_view_helpers'
|
3
2
|
|
4
|
-
|
5
|
-
def time_ago_in_words_or_date(date,options={})
|
6
|
-
return unless date
|
7
|
-
if (Time.now-date)/60/60/24 < 7
|
8
|
-
time_ago_in_words(date) + " ago"
|
9
|
-
elsif date.year == Time.now.year
|
10
|
-
options[:short_format] ? date.strftime(options[:short_format]) : date.strftime("%b %e").gsub(" ", " ")
|
11
|
-
else
|
12
|
-
options[:long_format] ? date.strftime(options[:long_format]) : date.strftime("%b %e, %Y").gsub(" ", " ")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Output an easily styleable key-value pair
|
17
|
-
def info_pair(label, value)
|
18
|
-
value = content_tag(:span, "None", :class => "blank") if value.blank?
|
19
|
-
label = content_tag(:span, "#{label}:", :class => "label")
|
20
|
-
content_tag(:span, [label, value].join(" "), :class => "info_pair")
|
21
|
-
end
|
22
|
-
|
23
|
-
# Give this helper an array, and get back a string of <li> elements.
|
24
|
-
# The first item gets a class of first and the last, well.. last.
|
25
|
-
# This makes it easier to apply CSS styles to lists, be they ordered or unordered.
|
26
|
-
# http://zeke.tumblr.com/post/98025647/a-nice-little-view-helper-for-generating-list-items
|
27
|
-
def convert_to_list_items(items, *args)
|
28
|
-
default_options = {:stripe => true}
|
29
|
-
options = default_options.merge(args.extract_options!)
|
30
|
-
out = []
|
31
|
-
items.each_with_index do |item, index|
|
32
|
-
css = []
|
33
|
-
css << "first" if items.first == item
|
34
|
-
css << "last" if items.last == item
|
35
|
-
css << "even" if options[:stripe] && index%2 == 1
|
36
|
-
css << "odd" if options[:stripe] && index%2 == 0 # (First item is odd (1))
|
37
|
-
out << content_tag(:li, item, :class => css.join(" "))
|
38
|
-
end
|
39
|
-
out.join("\n")
|
40
|
-
end
|
41
|
-
|
42
|
-
# Build an HTML table
|
43
|
-
# For collection, pass an array of arrays
|
44
|
-
# For headers, pass an array of label strings for the top of the table
|
45
|
-
# All other options will be passed along to the table content_tag
|
46
|
-
def generate_table(collection, headers=nil, options={})
|
47
|
-
return if collection.blank?
|
48
|
-
thead = content_tag(:thead) do
|
49
|
-
content_tag(:tr) do
|
50
|
-
headers.map {|header| content_tag(:th, header)}
|
51
|
-
end
|
52
|
-
end unless headers.nil?
|
53
|
-
tbody = content_tag(:tbody) do
|
54
|
-
collection.map do |values|
|
55
|
-
content_tag(:tr) do
|
56
|
-
values.map {|value| content_tag(:td, value)}
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
content_tag(:table, [thead, tbody].compact.join("\n"), options)
|
61
|
-
end
|
62
|
-
|
63
|
-
# Pass in an ActiveRecord object, get back edit and delete links inside a TD tag
|
64
|
-
def options_td(record_or_name_or_array, hide_destroy = false)
|
65
|
-
items = []
|
66
|
-
items << link_to('Edit', edit_polymorphic_path(record_or_name_or_array))
|
67
|
-
items << link_to('Delete', polymorphic_path(record_or_name_or_array), :confirm => 'Are you sure?', :method => :delete, :class => "destructive") unless hide_destroy
|
68
|
-
list = content_tag(:ul, convert_to_list_items(items))
|
69
|
-
content_tag(:td, list, :class => "options")
|
70
|
-
end
|
71
|
-
|
72
|
-
# This works just like link_to, but with one difference..
|
73
|
-
# If the link is to the current page, a class of 'active' is added
|
74
|
-
def link(name, options={}, html_options={})
|
75
|
-
link_to_unless_current(name, options, html_options) do
|
76
|
-
html_options[:class] = (html_options[:class] || "").split(" ").push("active").join(" ")
|
77
|
-
link_to(name, options, html_options)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# Absolute path to an image
|
82
|
-
def image_url(source)
|
83
|
-
base_url + image_path(source)
|
84
|
-
end
|
85
|
-
|
86
|
-
# e.g. http://localhost:3000, or https://productionserver.com
|
87
|
-
def base_url
|
88
|
-
"#{request.protocol}#{request.host_with_port}"
|
89
|
-
end
|
90
|
-
|
91
|
-
# Generate a list of column name-value pairs for an AR object
|
92
|
-
def list_model_columns(obj)
|
93
|
-
items = obj.class.columns.map{ |col| info_pair(col.name, obj[col.name]) }
|
94
|
-
content_tag(:ul, convert_to_list_items(items), :class => "model_columns")
|
95
|
-
end
|
96
|
-
|
97
|
-
# Outputs a JS friendly (escaped) string
|
98
|
-
def js_string(string)
|
99
|
-
js_escape_map = {
|
100
|
-
'\\' => '\\\\',
|
101
|
-
'</' => '<\/',
|
102
|
-
"\r\n" => '\n',
|
103
|
-
"\n" => '\n',
|
104
|
-
"\r" => '\n',
|
105
|
-
'"' => '\\"',
|
106
|
-
"'" => "\\'" }
|
107
|
-
|
108
|
-
string.gsub(/(\\|<\/|\r\n|[\n\r"'])/) { js_escape_map[$1] }
|
109
|
-
end
|
110
|
-
|
111
|
-
# Generates a URL and automatically adds http:// if not already there
|
112
|
-
# Useful alongside link() or when linking to user submitted addresses
|
113
|
-
def urlify(addr)
|
114
|
-
(addr.blank? || addr.starts_with?('http')) ? addr : "http://#{addr}"
|
115
|
-
end
|
116
|
-
|
117
|
-
# Breaks up a BigNum, FixNum or Float with commas
|
118
|
-
# e.g., 532566 => 532,566 and 79593255.66 => 79,593,255.66
|
119
|
-
def commify(num)
|
120
|
-
num.to_s =~ /([^\.]*)(\..*)?/
|
121
|
-
int, dec = $1.reverse, $2 ? $2 : ""
|
122
|
-
while int.gsub!(/(,|\.|^)(\d{3})(\d)/, '\1\2,\3'); end
|
123
|
-
int.reverse + dec
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
127
|
-
end
|
3
|
+
ActionView::Base.send(:include, CommonViewHelpers::ViewHelpers)
|
data/rails/init.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: common_view_helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 19
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
8
|
+
- 1
|
9
|
+
version: 0.3.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Zeke Sikelianos
|
@@ -16,7 +15,7 @@ autorequire:
|
|
16
15
|
bindir: bin
|
17
16
|
cert_chain: []
|
18
17
|
|
19
|
-
date: 2010-
|
18
|
+
date: 2010-09-11 00:00:00 -04:00
|
20
19
|
default_executable:
|
21
20
|
dependencies:
|
22
21
|
- !ruby/object:Gem::Dependency
|
@@ -27,7 +26,6 @@ dependencies:
|
|
27
26
|
requirements:
|
28
27
|
- - ">="
|
29
28
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 15
|
31
29
|
segments:
|
32
30
|
- 2
|
33
31
|
- 0
|
@@ -43,7 +41,6 @@ dependencies:
|
|
43
41
|
requirements:
|
44
42
|
- - ">="
|
45
43
|
- !ruby/object:Gem::Version
|
46
|
-
hash: 13
|
47
44
|
segments:
|
48
45
|
- 1
|
49
46
|
- 2
|
@@ -59,7 +56,6 @@ dependencies:
|
|
59
56
|
requirements:
|
60
57
|
- - ">="
|
61
58
|
- !ruby/object:Gem::Version
|
62
|
-
hash: 59
|
63
59
|
segments:
|
64
60
|
- 4
|
65
61
|
- 1
|
@@ -82,6 +78,7 @@ files:
|
|
82
78
|
- VERSION
|
83
79
|
- init.rb
|
84
80
|
- lib/common_view_helpers.rb
|
81
|
+
- lib/common_view_helpers/common_view_helpers.rb
|
85
82
|
- rails/init.rb
|
86
83
|
- spec/common_view_helpers_spec.rb
|
87
84
|
- spec/spec_helper.rb
|
@@ -99,7 +96,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
96
|
requirements:
|
100
97
|
- - ">="
|
101
98
|
- !ruby/object:Gem::Version
|
102
|
-
hash: 3
|
103
99
|
segments:
|
104
100
|
- 0
|
105
101
|
version: "0"
|
@@ -108,7 +104,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
104
|
requirements:
|
109
105
|
- - ">="
|
110
106
|
- !ruby/object:Gem::Version
|
111
|
-
hash: 3
|
112
107
|
segments:
|
113
108
|
- 0
|
114
109
|
version: "0"
|