mir_extensions 0.2.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +18 -2
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/app/controllers/foos_controller.rb +83 -0
- data/app/helpers/application_helper.rb +1 -0
- data/app/models/foo.rb +2 -0
- data/app/views/foos/_form.html.erb +20 -0
- data/app/views/foos/edit.html.erb +6 -0
- data/app/views/foos/index.html.erb +27 -0
- data/app/views/foos/new.html.erb +5 -0
- data/app/views/foos/show.html.erb +20 -0
- data/config.ru +1 -1
- data/config/application.rb +5 -1
- data/config/environment.rb +1 -1
- data/config/environments/development.rb +1 -1
- data/config/environments/test.rb +1 -1
- data/config/initializers/secret_token.rb +1 -1
- data/config/initializers/session_store.rb +1 -1
- data/config/routes.rb +5 -2
- data/db/migrate/20100801224509_create_foos.rb +16 -0
- data/db/mir_ext_development.sqlite3 +0 -0
- data/db/mir_ext_test.sqlite3 +0 -0
- data/db/schema.rb +11 -1
- data/lib/core_ext/core_ext.rb +1 -2
- data/lib/mir_extensions.rb +386 -2
- data/lib/mir_form_builder.rb +166 -0
- data/mir_extensions.gemspec +29 -7
- data/public/stylesheets/scaffold.css +56 -0
- data/spec/controllers/foos_controller_spec.rb +125 -0
- data/spec/routing/foos_routing_spec.rb +35 -0
- data/spec/support/integration_example_group.rb +35 -0
- data/spec/views/foos/edit.html.erb_spec.rb +61 -0
- data/spec/views/foos/index.html.erb_spec.rb +25 -0
- data/spec/views/foos/new.html.erb_spec.rb +22 -0
- data/spec/views/foos/show.html.erb_spec.rb +18 -0
- metadata +29 -7
- data/lib/core_ext/helper_extensions.rb +0 -383
- data/log/development.log +0 -151
- data/log/test.log +0 -27
- data/public/index.html +0 -262
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'action_dispatch'
|
2
|
+
require 'capybara/rails'
|
3
|
+
require 'capybara/dsl'
|
4
|
+
|
5
|
+
module RSpec::Rails
|
6
|
+
module IntegrationExampleGroup
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
include ActionDispatch::Integration::Runner
|
10
|
+
include RSpec::Rails::TestUnitAssertionAdapter
|
11
|
+
include ActionDispatch::Assertions
|
12
|
+
include Capybara
|
13
|
+
include RSpec::Matchers
|
14
|
+
|
15
|
+
module InstanceMethods
|
16
|
+
def app
|
17
|
+
::Rails.application
|
18
|
+
end
|
19
|
+
|
20
|
+
def last_response
|
21
|
+
page
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
included do
|
26
|
+
before do
|
27
|
+
@router = ::Rails.application.routes
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
RSpec.configure do |c|
|
32
|
+
c.include self, :example_group => { :file_path => /\bspec\/integration\// }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "foos/edit.html.erb" do
|
4
|
+
before(:each) do
|
5
|
+
@foo = assign(:foo, stub_model(Foo,
|
6
|
+
:new_record? => false,
|
7
|
+
:name => "MyString",
|
8
|
+
:active => false,
|
9
|
+
:style => "MyString"
|
10
|
+
))
|
11
|
+
end
|
12
|
+
|
13
|
+
it "renders the edit foo form" do
|
14
|
+
render
|
15
|
+
|
16
|
+
rendered.should have_selector("form", :action => foo_path(@foo), :method => "post") do |form|
|
17
|
+
form.should have_selector("input#foo_name", :name => "foo[name]")
|
18
|
+
form.should have_selector("input#foo_active", :name => "foo[active]")
|
19
|
+
form.should have_selector("select#foo_style", :name => "foo[style]")
|
20
|
+
form.should have_xpath("//select[@id='foo_style']/option", :value => 'Select...')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'renders a text field with a default label' do
|
25
|
+
render
|
26
|
+
rendered.should have_selector("form", :action => foo_path(@foo), :method => "post") do |form|
|
27
|
+
form.should have_xpath("//label[@for='foo_name']", :content => 'Name')
|
28
|
+
form.should have_selector("input#foo_name", :name => "foo[name]")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'renders a field with a custom label' do
|
33
|
+
render
|
34
|
+
rendered.should have_selector("form", :action => foo_path(@foo), :method => "post") do |form|
|
35
|
+
form.should have_xpath("//label[@for='foo_active']", :content => 'Status')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'renders an inline label for a checkbox' do
|
40
|
+
render
|
41
|
+
rendered.should have_selector("form", :action => foo_path(@foo), :method => "post") do |form|
|
42
|
+
form.should have_xpath("//label[@for='foo_active']", :content => 'Active', :class => 'inline')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'renders a select control with a default option' do
|
47
|
+
render
|
48
|
+
rendered.should have_selector("form", :action => foo_path(@foo), :method => "post") do |form|
|
49
|
+
form.should have_xpath("//select[@id='foo_style']/option", :value => 'Select...')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'renders a date select' do
|
54
|
+
render
|
55
|
+
rendered.should have_selector("form", :action => foo_path(@foo), :method => "post") do |form|
|
56
|
+
form.should have_xpath("//select/option", :content => 'January')
|
57
|
+
form.should have_xpath("//select/option", :content => '1')
|
58
|
+
form.should have_xpath("//select/option", :content => '2010')
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "foos/index.html.erb" do
|
4
|
+
before(:each) do
|
5
|
+
assign(:foos, [
|
6
|
+
stub_model(Foo,
|
7
|
+
:name => "Name",
|
8
|
+
:active => false,
|
9
|
+
:style => "Style"
|
10
|
+
),
|
11
|
+
stub_model(Foo,
|
12
|
+
:name => "Name",
|
13
|
+
:active => false,
|
14
|
+
:style => "Style"
|
15
|
+
)
|
16
|
+
])
|
17
|
+
end
|
18
|
+
|
19
|
+
it "renders a list of foos" do
|
20
|
+
render
|
21
|
+
rendered.should have_selector("tr>td", :content => "Name".to_s, :count => 2)
|
22
|
+
rendered.should have_selector("tr>td", :content => false.to_s, :count => 2)
|
23
|
+
rendered.should have_selector("tr>td", :content => "Style".to_s, :count => 2)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "foos/new.html.erb" do
|
4
|
+
before(:each) do
|
5
|
+
assign(:foo, stub_model(Foo,
|
6
|
+
:new_record? => true,
|
7
|
+
:name => "MyString",
|
8
|
+
:active => false,
|
9
|
+
:style => "MyString"
|
10
|
+
))
|
11
|
+
end
|
12
|
+
|
13
|
+
it "renders new foo form" do
|
14
|
+
render
|
15
|
+
|
16
|
+
rendered.should have_selector("form", :action => foos_path, :method => "post") do |form|
|
17
|
+
form.should have_selector("input#foo_name", :name => "foo[name]")
|
18
|
+
form.should have_selector("input#foo_active", :name => "foo[active]")
|
19
|
+
form.should have_selector("select#foo_style", :name => "foo[style]")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "foos/show.html.erb" do
|
4
|
+
before(:each) do
|
5
|
+
@foo = assign(:foo, stub_model(Foo,
|
6
|
+
:name => "Name",
|
7
|
+
:active => false,
|
8
|
+
:style => "Style"
|
9
|
+
))
|
10
|
+
end
|
11
|
+
|
12
|
+
it "renders attributes in <p>" do
|
13
|
+
render
|
14
|
+
rendered.should contain("Name".to_s)
|
15
|
+
rendered.should contain(false.to_s)
|
16
|
+
rendered.should contain("Style".to_s)
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -4,10 +4,10 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 1.0.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Corey Ehmke
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-08-
|
19
|
+
date: 2010-08-02 00:00:00 -05:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -72,9 +72,16 @@ files:
|
|
72
72
|
- Rakefile
|
73
73
|
- VERSION
|
74
74
|
- app/controllers/application_controller.rb
|
75
|
+
- app/controllers/foos_controller.rb
|
75
76
|
- app/helpers/application_helper.rb
|
77
|
+
- app/models/foo.rb
|
76
78
|
- app/models/primary.rb
|
77
79
|
- app/models/secondary.rb
|
80
|
+
- app/views/foos/_form.html.erb
|
81
|
+
- app/views/foos/edit.html.erb
|
82
|
+
- app/views/foos/index.html.erb
|
83
|
+
- app/views/foos/new.html.erb
|
84
|
+
- app/views/foos/show.html.erb
|
78
85
|
- app/views/layouts/application.html.erb
|
79
86
|
- autotest/discover.rb
|
80
87
|
- config.ru
|
@@ -93,6 +100,7 @@ files:
|
|
93
100
|
- config/locales/en.yml
|
94
101
|
- config/routes.rb
|
95
102
|
- db/development.sqlite3
|
103
|
+
- db/migrate/20100801224509_create_foos.rb
|
96
104
|
- db/mir_ext_development.sqlite3
|
97
105
|
- db/mir_ext_test.sqlite3
|
98
106
|
- db/schema.rb
|
@@ -101,20 +109,17 @@ files:
|
|
101
109
|
- doc/README_FOR_APP
|
102
110
|
- lib/core_ext/controller_extensions.rb
|
103
111
|
- lib/core_ext/core_ext.rb
|
104
|
-
- lib/core_ext/helper_extensions.rb
|
105
112
|
- lib/mir_extensions.rb
|
113
|
+
- lib/mir_form_builder.rb
|
106
114
|
- lib/tasks/.gitkeep
|
107
|
-
- log/development.log
|
108
115
|
- log/production.log
|
109
116
|
- log/server.log
|
110
|
-
- log/test.log
|
111
117
|
- mir_extensions.gemspec
|
112
118
|
- public/404.html
|
113
119
|
- public/422.html
|
114
120
|
- public/500.html
|
115
121
|
- public/favicon.ico
|
116
122
|
- public/images/rails.png
|
117
|
-
- public/index.html
|
118
123
|
- public/javascripts/application.js
|
119
124
|
- public/javascripts/controls.js
|
120
125
|
- public/javascripts/dragdrop.js
|
@@ -123,11 +128,20 @@ files:
|
|
123
128
|
- public/javascripts/rails.js
|
124
129
|
- public/robots.txt
|
125
130
|
- public/stylesheets/.gitkeep
|
131
|
+
- public/stylesheets/scaffold.css
|
126
132
|
- script/rails
|
127
133
|
- spec/controllers/application_controller_spec.rb
|
134
|
+
- spec/controllers/foos_controller_spec.rb
|
128
135
|
- spec/helpers/application_helper_spec.rb
|
129
136
|
- spec/mir_extensions_spec.rb
|
137
|
+
- spec/routing/foos_routing_spec.rb
|
130
138
|
- spec/spec_helper.rb
|
139
|
+
- spec/support/integration_example_group.rb
|
140
|
+
- spec/views/foos/edit.html.erb_spec.rb
|
141
|
+
- spec/views/foos/index.html.erb_spec.rb
|
142
|
+
- spec/views/foos/new.html.erb_spec.rb
|
143
|
+
- spec/views/foos/show.html.erb_spec.rb
|
144
|
+
- test/integration/foo_test.rb
|
131
145
|
- vendor/plugins/.gitkeep
|
132
146
|
has_rdoc: true
|
133
147
|
homepage: http://github.com/Bantik/mir_extensions
|
@@ -165,6 +179,14 @@ specification_version: 3
|
|
165
179
|
summary: Standard extensions and utility methods for SEO Logic's Rails 3 apps.
|
166
180
|
test_files:
|
167
181
|
- spec/controllers/application_controller_spec.rb
|
182
|
+
- spec/controllers/foos_controller_spec.rb
|
168
183
|
- spec/helpers/application_helper_spec.rb
|
169
184
|
- spec/mir_extensions_spec.rb
|
185
|
+
- spec/routing/foos_routing_spec.rb
|
170
186
|
- spec/spec_helper.rb
|
187
|
+
- spec/support/integration_example_group.rb
|
188
|
+
- spec/views/foos/edit.html.erb_spec.rb
|
189
|
+
- spec/views/foos/index.html.erb_spec.rb
|
190
|
+
- spec/views/foos/new.html.erb_spec.rb
|
191
|
+
- spec/views/foos/show.html.erb_spec.rb
|
192
|
+
- test/integration/foo_test.rb
|
@@ -1,383 +0,0 @@
|
|
1
|
-
module ActionController
|
2
|
-
module Helpers
|
3
|
-
|
4
|
-
def action?( expression )
|
5
|
-
!! ( expression.class == Regexp ? controller.action_name =~ expression : controller.action_name == expression )
|
6
|
-
end
|
7
|
-
|
8
|
-
# Formats an array with HTML line breaks, or the specified delimiter.
|
9
|
-
def array_to_lines(array, delimiter = '<br />')
|
10
|
-
array.blank? ? nil : array * delimiter
|
11
|
-
end
|
12
|
-
|
13
|
-
def checkmark
|
14
|
-
%{<div class="checkmark"></div>}
|
15
|
-
end
|
16
|
-
|
17
|
-
def controller?( expression )
|
18
|
-
!! ( expression.class == Regexp ? controller.controller_name =~ expression : controller.controller_name == expression )
|
19
|
-
end
|
20
|
-
|
21
|
-
# Display CRUD icons or links, according to setting in use_crud_icons method.
|
22
|
-
#
|
23
|
-
# In application_helper.rb:
|
24
|
-
#
|
25
|
-
# def use_crud_icons
|
26
|
-
# true
|
27
|
-
# end
|
28
|
-
#
|
29
|
-
# Then use in index views like this:
|
30
|
-
#
|
31
|
-
# <td class="crud_links"><%= crud_links(my_model, 'my_model', [:show, :edit, :delete]) -%></td>
|
32
|
-
#
|
33
|
-
def crud_links(model, instance_name, actions, args={})
|
34
|
-
_html = ""
|
35
|
-
_options = args.keys.empty? ? '' : ", #{args.map{|k,v| ":#{k} => #{v}"}}"
|
36
|
-
|
37
|
-
if use_crud_icons
|
38
|
-
if actions.include?(:show)
|
39
|
-
_html << eval("link_to image_tag('/images/icons/view.png', :class => 'crud_icon'), model, :title => 'View'#{_options}")
|
40
|
-
end
|
41
|
-
if actions.include?(:edit)
|
42
|
-
_html << eval("link_to image_tag('/images/icons/edit.png', :class => 'crud_icon'), edit_#{instance_name}_path(model), :title => 'Edit'#{_options}")
|
43
|
-
end
|
44
|
-
if actions.include?(:delete)
|
45
|
-
_html << eval("link_to image_tag('/images/icons/delete.png', :class => 'crud_icon'), model, :confirm => 'Are you sure? This action cannot be undone.', :method => :delete, :title => 'Delete'#{_options}")
|
46
|
-
end
|
47
|
-
else
|
48
|
-
if actions.include?(:show)
|
49
|
-
_html << eval("link_to 'View', model, :title => 'View', :class => 'crud_link'#{_options}")
|
50
|
-
end
|
51
|
-
if actions.include?(:edit)
|
52
|
-
_html << eval("link_to 'Edit', edit_#{instance_name}_path(model), :title => 'Edit', :class => 'crud_link'#{_options}")
|
53
|
-
end
|
54
|
-
if actions.include?(:delete)
|
55
|
-
_html << eval("link_to 'Delete', model, :confirm => 'Are you sure? This action cannot be undone.', :method => :delete, :title => 'Delete', :class => 'crud_link'#{_options}")
|
56
|
-
end
|
57
|
-
end
|
58
|
-
_html
|
59
|
-
end
|
60
|
-
|
61
|
-
# Display CRUD icons or links, according to setting in use_crud_icons method.
|
62
|
-
# This method works with nested resources.
|
63
|
-
# Use in index views like this:
|
64
|
-
#
|
65
|
-
# <td class="crud_links"><%= crud_links_for_nested_resource(@my_model, my_nested_model, 'my_model', 'my_nested_model', [:show, :edit, :delete]) -%></td>
|
66
|
-
#
|
67
|
-
def crud_links_for_nested_resource(model, nested_model, model_instance_name, nested_model_instance_name, actions, args={})
|
68
|
-
_html = ""
|
69
|
-
if use_crud_icons
|
70
|
-
if actions.include?(:show)
|
71
|
-
_html << eval("link_to image_tag('/images/icons/view.png', :class => 'crud_icon'), #{model_instance_name}_#{nested_model_instance_name}_path(model, nested_model), :title => 'View'")
|
72
|
-
end
|
73
|
-
|
74
|
-
if actions.include?(:edit)
|
75
|
-
_html << eval("link_to image_tag('/images/icons/edit.png', :class => 'crud_icon'), edit_#{model_instance_name}_#{nested_model_instance_name}_path(model, nested_model), :title => 'Edit'")
|
76
|
-
end
|
77
|
-
|
78
|
-
if actions.include?(:delete)
|
79
|
-
_html << eval("link_to image_tag('/images/icons/delete.png', :class => 'crud_icon'), #{model_instance_name}_#{nested_model_instance_name}_path(model, nested_model), :method => :delete, :confirm => 'Are you sure? This action cannot be undone.', :title => 'Delete'")
|
80
|
-
end
|
81
|
-
end
|
82
|
-
_html
|
83
|
-
end
|
84
|
-
|
85
|
-
# DRY way to return a legend tag that renders correctly in all browsers. This variation allows
|
86
|
-
# for more "stuff" inside the legend tag, e.g. expand/collapse controls, without having to worry
|
87
|
-
# about escape sequences.
|
88
|
-
#
|
89
|
-
# Sample usage:
|
90
|
-
#
|
91
|
-
# <%- legend_block do -%>
|
92
|
-
# <span id="hide_or_show_backlinks" class="show_link" style="background-color: #999999;
|
93
|
-
# border: 1px solid #999999;" onclick="javascript:hide_or_show('backlinks');"></span>Backlinks (<%=
|
94
|
-
# @google_results.size -%>)
|
95
|
-
# <%- end -%>
|
96
|
-
#
|
97
|
-
def legend_block(&block)
|
98
|
-
concat content_tag(:div, capture(&block), :class => "faux_legend")
|
99
|
-
end
|
100
|
-
|
101
|
-
# DRY way to return a legend tag that renders correctly in all browsers
|
102
|
-
def legend_tag(text, args={})
|
103
|
-
_html = %{<div id="#{args[:id]}" class="faux_legend">#{text}</div>\r}
|
104
|
-
_html.gsub!(/ id=""/,'')
|
105
|
-
_html.gsub!(/ class=""/,'')
|
106
|
-
_html
|
107
|
-
end
|
108
|
-
|
109
|
-
def meta_description(content=nil)
|
110
|
-
content_for(:meta_description) { content } unless content.blank?
|
111
|
-
end
|
112
|
-
|
113
|
-
def meta_keywords(content=nil)
|
114
|
-
content_for(:meta_keywords) { content } unless content.blank?
|
115
|
-
end
|
116
|
-
|
117
|
-
def models_for_select( models, label = 'name' )
|
118
|
-
models.map{ |m| [m[label], m.id] }.sort_by{ |e| e[0] }
|
119
|
-
end
|
120
|
-
|
121
|
-
def options_for_array( a, selected = nil, prompt = select_prompt )
|
122
|
-
"<option value=''>#{prompt}</option>" + a.map{ |_e| _flag = _e[0].to_s == selected ? 'selected="1"' : ''; _e.is_a?(Array) ? "<option value=\"#{_e[0]}\" #{_flag}>#{_e[1]}</option>" : "<option>#{_e}</option>" }.to_s
|
123
|
-
end
|
124
|
-
|
125
|
-
# Create a link that is opaque to search engine spiders.
|
126
|
-
def obfuscated_link_to(path, image, label, args={})
|
127
|
-
_html = %{<form action="#{path}" method="get" class="obfuscated_link">}
|
128
|
-
_html << %{ <fieldset><input alt="#{label}" src="#{image}" type="image" /></fieldset>}
|
129
|
-
args.each{ |k,v| _html << %{ <div><input id="#{k.to_s}" name="#{k}" type="hidden" value="#{v}" /></div>} }
|
130
|
-
_html << %{</form>}
|
131
|
-
_html
|
132
|
-
end
|
133
|
-
|
134
|
-
# Wraps the given HTML in Rails' default style to highlight validation errors, if any.
|
135
|
-
def required_field_helper( model, element, html )
|
136
|
-
if model && ! model.errors.empty? && element.is_required
|
137
|
-
return content_tag( :div, html, :class => 'fieldWithErrors' )
|
138
|
-
else
|
139
|
-
return html
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
def select_prompt
|
144
|
-
"Select..."
|
145
|
-
end
|
146
|
-
|
147
|
-
def select_prompt_option
|
148
|
-
"<option value=''>#{select_prompt}</option>"
|
149
|
-
end
|
150
|
-
|
151
|
-
# Use on index pages to create dropdown list of filtering criteria.
|
152
|
-
# Populate the filter list using a constant in the model corresponding to named scopes.
|
153
|
-
#
|
154
|
-
# Usage:
|
155
|
-
#
|
156
|
-
# - item.rb:
|
157
|
-
#
|
158
|
-
# named_scope :active, :conditions => { :is_active => true }
|
159
|
-
# named_scope :inactive, :conditions => { :is_active => false }
|
160
|
-
#
|
161
|
-
# FILTERS = [
|
162
|
-
# {:scope => "all", :label => "All"},
|
163
|
-
# {:scope => "active", :label => "Active Only"},
|
164
|
-
# {:scope => "inactive", :label => "Inactive Only"}
|
165
|
-
# ]
|
166
|
-
#
|
167
|
-
# - items/index.html.erb:
|
168
|
-
#
|
169
|
-
# <%= select_tag_for_filter("items", @filters, params) -%>
|
170
|
-
#
|
171
|
-
# - items_controller.rb:
|
172
|
-
#
|
173
|
-
# def index
|
174
|
-
# @filters = Item::FILTERS
|
175
|
-
# if params[:show] && params[:show] != "all" && @filters.collect{|f| f[:scope]}.include?(params[:show])
|
176
|
-
# @items = eval("@items.#{params[:show]}.order_by(params[:by], params[:dir])")
|
177
|
-
# else
|
178
|
-
# @items = @items.order_by(params[:by], params[:dir])
|
179
|
-
# end
|
180
|
-
# ...
|
181
|
-
# end
|
182
|
-
#
|
183
|
-
def select_tag_for_filter(model, nvpairs, params)
|
184
|
-
return unless model && nvpairs && ! nvpairs.empty?
|
185
|
-
options = { :query => params[:query] }
|
186
|
-
_url = url_for(eval("#{model}_url(options)"))
|
187
|
-
_html = %{<label for="show">Show:</label><br />}
|
188
|
-
_html << %{<select name="show" id="show" onchange="window.location='#{_url}' + '?show=' + this.value">}
|
189
|
-
nvpairs.each do |pair|
|
190
|
-
_html << %{<option value="#{pair[:scope]}"}
|
191
|
-
if params[:show] == pair[:scope] || ((params[:show].nil? || params[:show].empty?) && pair[:scope] == "all")
|
192
|
-
_html << %{ selected="selected"}
|
193
|
-
end
|
194
|
-
_html << %{>#{pair[:label]}}
|
195
|
-
_html << %{</option>}
|
196
|
-
end
|
197
|
-
_html << %{</select>}
|
198
|
-
end
|
199
|
-
|
200
|
-
# Returns a link_to tag with sorting parameters that can be used with ActiveRecord.order_by.
|
201
|
-
#
|
202
|
-
# To use standard resources, specify the resources as a plural symbol:
|
203
|
-
# sort_link(:users, 'email', params)
|
204
|
-
#
|
205
|
-
# To use resources aliased with :as (in routes.rb), specify the aliased route as a string.
|
206
|
-
# sort_link('users_admin', 'email', params)
|
207
|
-
#
|
208
|
-
# You can override the link's label by adding a labels hash to your params in the controller:
|
209
|
-
# params[:labels] = {'user_id' => 'User'}
|
210
|
-
def sort_link(model, field, params, html_options={})
|
211
|
-
if (field.to_sym == params[:by] || field == params[:by]) && params[:dir] == "ASC"
|
212
|
-
classname = "arrow-asc"
|
213
|
-
dir = "DESC"
|
214
|
-
elsif (field.to_sym == params[:by] || field == params[:by])
|
215
|
-
classname = "arrow-desc"
|
216
|
-
dir = "ASC"
|
217
|
-
else
|
218
|
-
dir = "ASC"
|
219
|
-
end
|
220
|
-
|
221
|
-
options = {
|
222
|
-
:anchor => html_options[:anchor] || nil,
|
223
|
-
:by => field,
|
224
|
-
:dir => dir,
|
225
|
-
:query => params[:query],
|
226
|
-
:show => params[:show]
|
227
|
-
}
|
228
|
-
|
229
|
-
options[:show] = params[:show] unless params[:show].blank? || params[:show] == 'all'
|
230
|
-
|
231
|
-
html_options = {
|
232
|
-
:class => "#{classname} #{html_options[:class]}",
|
233
|
-
:style => "color: white; font-weight: #{params[:by] == field ? "bold" : "normal"}; #{html_options[:style]}",
|
234
|
-
:title => "Sort by this field"
|
235
|
-
}
|
236
|
-
|
237
|
-
field_name = params[:labels] && params[:labels][field] ? params[:labels][field] : field.titleize
|
238
|
-
|
239
|
-
_link = model.is_a?(Symbol) ? eval("#{model}_url(options)") : "/#{model}?#{options.to_params}"
|
240
|
-
link_to(field_name, _link, html_options)
|
241
|
-
end
|
242
|
-
|
243
|
-
# Tabbed interface helpers =======================================================================
|
244
|
-
|
245
|
-
# Returns formatted tabs with appropriate JS for activation. Use in conjunction with tab_body.
|
246
|
-
#
|
247
|
-
# Usage:
|
248
|
-
#
|
249
|
-
# <%- tabset do -%>
|
250
|
-
# <%= tab_tag :id => 'ppc_ads', :label => 'PPC Ads', :state => 'active' %>
|
251
|
-
# <%= tab_tag :id => 'budget' %>
|
252
|
-
# <%= tab_tag :id => 'geotargeting' %>
|
253
|
-
# <%- end -%>
|
254
|
-
#
|
255
|
-
def tabset(&proc)
|
256
|
-
concat %{
|
257
|
-
<div class="jump_links">
|
258
|
-
<ul>
|
259
|
-
}
|
260
|
-
yield
|
261
|
-
concat %{
|
262
|
-
</ul>
|
263
|
-
</div>
|
264
|
-
<br style="clear: both;" /><br />
|
265
|
-
<input type="hidden" id="show_tab" />
|
266
|
-
<script type="text/javascript">
|
267
|
-
function hide_all_tabs() { $$('.tab_block').invoke('hide'); }
|
268
|
-
function activate_tab(tab) {
|
269
|
-
$$('.tab_control').each(function(elem){ elem.className = 'tab_control'});
|
270
|
-
$('show_' + tab).className = 'tab_control active';
|
271
|
-
hide_all_tabs();
|
272
|
-
$(tab).toggle();
|
273
|
-
$('show_tab').value = tab
|
274
|
-
}
|
275
|
-
function sticky_tab() { if (location.hash) { activate_tab(location.hash.gsub('#','')); } }
|
276
|
-
Event.observe(window, 'load', function() { sticky_tab(); });
|
277
|
-
</script>
|
278
|
-
}
|
279
|
-
end
|
280
|
-
|
281
|
-
# Returns a tab body corresponding to tabs in a tabset. Make sure that the id of the tab_body
|
282
|
-
# matches the id provided to the tab_tag in the tabset block.
|
283
|
-
#
|
284
|
-
# Usage:
|
285
|
-
#
|
286
|
-
# <%- tab_body :id => 'ppc_ads', :label => 'PPC Ad Details' do -%>
|
287
|
-
# PPC ads form here.
|
288
|
-
# <%- end -%>
|
289
|
-
#
|
290
|
-
# <%- tab_body :id => 'budget' do -%>
|
291
|
-
# Budget form here.
|
292
|
-
# <%- end -%>
|
293
|
-
#
|
294
|
-
# <%- tab_body :id => 'geotargeting' do -%>
|
295
|
-
# Geotargeting form here.
|
296
|
-
# <%- end -%>
|
297
|
-
#
|
298
|
-
def tab_body(args, &proc)
|
299
|
-
concat %{<div id="#{args[:id]}" class="tab_block form_container" style="display: #{args[:display] || 'none'};">}
|
300
|
-
concat %{#{legend_tag args[:label] || args[:id].titleize }}
|
301
|
-
concat %{<a name="#{args[:id]}"></a><br />}
|
302
|
-
yield
|
303
|
-
concat %{</div>}
|
304
|
-
end
|
305
|
-
|
306
|
-
# Returns the necessary HTML for a particular tab. Use inside a tabset block.
|
307
|
-
# Override the default tab label by specifying a :label parameter.
|
308
|
-
# Indicate that the tab should be active by setting its :state to 'active'.
|
309
|
-
# (NOTE: You must define a corresponding CSS style for active tabs.)
|
310
|
-
#
|
311
|
-
# Usage:
|
312
|
-
#
|
313
|
-
# <%= tab_tag :id => 'ppc_ads', :label => 'PPC Ads', :state => 'active' %>
|
314
|
-
#
|
315
|
-
def tab_tag(args, *css_class)
|
316
|
-
%{<li id="show_#{args[:id]}" class="tab_control #{args[:state]}" onclick="window.location='##{args[:id]}'; activate_tab('#{args[:id]}');">#{args[:label] || args[:id].to_s.titleize}</li>}
|
317
|
-
end
|
318
|
-
|
319
|
-
# ================================================================================================
|
320
|
-
|
321
|
-
def tag_for_collapsible_row(obj, params)
|
322
|
-
_html = ""
|
323
|
-
if obj && obj.respond_to?(:parent) && obj.parent
|
324
|
-
_html << %{<tr class="#{obj.class.name.downcase}_#{obj.parent.id} #{params[:class]}" style="display: none; #{params[:style]}">}
|
325
|
-
else
|
326
|
-
_html << %{<tr class="#{params[:class]}" style="#{params[:style]}">}
|
327
|
-
end
|
328
|
-
_html
|
329
|
-
end
|
330
|
-
|
331
|
-
def tag_for_collapsible_row_control(obj)
|
332
|
-
_base_id = "#{obj.class.name.downcase}_#{obj.id}"
|
333
|
-
_html = %{<div id="hide_or_show_#{_base_id}" class="show_link" style="background-color: #999999; border: 1px solid #999999;" onclick="javascript:hide_or_show('#{_base_id}');"></div>}
|
334
|
-
end
|
335
|
-
|
336
|
-
# Create a set of tags for displaying a field label with inline help.
|
337
|
-
# Field label text is appended with a ? icon, which responds to a click
|
338
|
-
# by showing or hiding the provided help text.
|
339
|
-
#
|
340
|
-
# Sample usage:
|
341
|
-
#
|
342
|
-
# <%= tag_for_label_with_inline_help 'Relative Frequency', 'rel_frequency', 'Relative frequency of search traffic for this keyword across multiple search engines, as measured by WordTracker.' %>
|
343
|
-
#
|
344
|
-
# Yields:
|
345
|
-
#
|
346
|
-
# <label for="rel_frequency">Relative Frequency: <%= image_tag "/images/help_icon.png", :onclick => "$('rel_frequency_help').toggle();", :class => 'inline_icon' %></label><br />
|
347
|
-
# <div class="inline_help" id="rel_frequency_help" style="display: none;">
|
348
|
-
# <p>Relative frequency of search traffic for this keyword across multiple search engines, as measured by WordTracker.</p>
|
349
|
-
# </div>
|
350
|
-
def tag_for_label_with_inline_help( label_text, field_id, help_text )
|
351
|
-
_html = ""
|
352
|
-
_html << %{<label for="#{field_id}">#{label_text}}
|
353
|
-
_html << %{<img src="/images/icons/help_icon.png" onclick="$('#{field_id}_help').toggle();" class='inline_icon' />}
|
354
|
-
_html << %{</label><br />}
|
355
|
-
_html << %{<div class="inline_help" id="#{field_id}_help" style="display: none;">}
|
356
|
-
_html << %{<p>#{help_text}</p>}
|
357
|
-
_html << %{</div>}
|
358
|
-
_html
|
359
|
-
end
|
360
|
-
|
361
|
-
# Create a set of tags for displaying a field label followed by instructions.
|
362
|
-
# The instructions are displayed on a new line following the field label.
|
363
|
-
#
|
364
|
-
# Usage:
|
365
|
-
#
|
366
|
-
# <%= tag_for_label_with_instructions 'Status', 'is_active', 'Only active widgets will be visible to the public.' %>
|
367
|
-
#
|
368
|
-
# Yields:
|
369
|
-
#
|
370
|
-
# <label for="is_active">
|
371
|
-
# Status<br />
|
372
|
-
# <span class="instructions">Only active widgets will be visible to the public.</span>
|
373
|
-
# <label><br />
|
374
|
-
def tag_for_label_with_instructions( label_text, field_id, instructions )
|
375
|
-
_html = ""
|
376
|
-
_html << %{<label for="#{field_id}">#{label_text}}
|
377
|
-
_html << %{<span class="instructions">#{instructions}</span>}
|
378
|
-
_html << %{</label><br />}
|
379
|
-
_html
|
380
|
-
end
|
381
|
-
|
382
|
-
end
|
383
|
-
end
|