spurs 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/README.markdown +118 -0
- data/Rakefile +40 -0
- data/app/assets/images/spurs/icons/16x16/accept.png +0 -0
- data/app/assets/images/spurs/icons/16x16/delete.png +0 -0
- data/app/assets/images/spurs/icons/16x16/info.png +0 -0
- data/app/assets/images/spurs/icons/16x16/warning.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-icons_222222_256x240.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-icons_2e83ff_256x240.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-icons_454545_256x240.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-icons_888888_256x240.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/app/assets/images/spurs/jquery_ui_theme/images/ui-icons_f6cf3b_256x240.png +0 -0
- data/app/assets/javascripts/spurs/application.js +15 -0
- data/app/assets/javascripts/spurs/flashes.js.coffee +30 -0
- data/app/assets/javascripts/spurs/flashes.js.erb +32 -0
- data/app/assets/javascripts/spurs/sections.js.coffee +9 -0
- data/app/assets/javascripts/spurs/vars.js.coffee.erb +6 -0
- data/app/assets/javascripts/spurs/vars.js.erb +10 -0
- data/app/assets/javascripts/spurs.js +20 -0
- data/app/assets/stylesheets/spurs/application.css +13 -0
- data/app/assets/stylesheets/spurs/jquery-ui-theme.css +13 -0
- data/app/assets/stylesheets/spurs/jquery_ui_theme/jquery-ui-1.8.16.custom.css +1320 -0
- data/app/assets/stylesheets/spurs/jquery_ui_theme/jquery.ui.1.8.16.ie.css +6 -0
- data/app/assets/stylesheets/spurs/sections.css.sass +17 -0
- data/app/assets/stylesheets/spurs/vcenter.css.sass +11 -0
- data/app/assets/stylesheets/spurs.css +14 -0
- data/app/controllers/spurs/application_controller.rb +4 -0
- data/app/controllers/spurs/flashes_controller.rb +11 -0
- data/app/helpers/spurs/application_helper.rb +4 -0
- data/app/helpers/spurs/flashes_helper.rb +4 -0
- data/app/views/layouts/spurs/application.html.erb +14 -0
- data/app/views/spurs/flashes/add_message.js.erb +3 -0
- data/app/views/spurs/modals/spawn.js.erb +17 -0
- data/config/locales/en.yml +5 -0
- data/config/routes.rb +6 -0
- data/lib/spurs/engine.rb +10 -0
- data/lib/spurs/flash/builder.rb +55 -0
- data/lib/spurs/flash/controller_mods.rb +43 -0
- data/lib/spurs/flash/helper.rb +161 -0
- data/lib/spurs/flash.rb +54 -0
- data/lib/spurs/modal/builder.rb +118 -0
- data/lib/spurs/modal/controller_mods.rb +49 -0
- data/lib/spurs/modal/helper.rb +25 -0
- data/lib/spurs/modal.rb +16 -0
- data/lib/spurs/nav/builder.rb +213 -0
- data/lib/spurs/nav/helper.rb +42 -0
- data/lib/spurs/nav.rb +23 -0
- data/lib/spurs/popover/builder.rb +7 -0
- data/lib/spurs/popover/helper.rb +8 -0
- data/lib/spurs/popover.rb +5 -0
- data/lib/spurs/section/collapsible_section_builder.rb +31 -0
- data/lib/spurs/section/helper.rb +37 -0
- data/lib/spurs/section.rb +15 -0
- data/lib/spurs/version.rb +3 -0
- data/lib/spurs.rb +26 -0
- data/lib/tasks/spurs_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +15 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +56 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/functional/spurs/flashes_controller_test.rb +9 -0
- data/test/integration/navigation_test.rb +10 -0
- data/test/spurs_test.rb +7 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/helpers/spurs/flashes_helper_test.rb +6 -0
- metadata +224 -0
@@ -0,0 +1,6 @@
|
|
1
|
+
|
2
|
+
.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-left, .ui-corner-bottom{ border-radius:0px;}
|
3
|
+
.ui-state-active,.ui-tabs-selected { border-radius:0px;}
|
4
|
+
.ui-tabs-selected { border-radius:0px;}
|
5
|
+
.ui-tabs .ui-tabs-nav li{ filter:none;}
|
6
|
+
.ui-tabs .ui-tabs-nav li a { border-radius:0px; }
|
@@ -0,0 +1,17 @@
|
|
1
|
+
.spurs_collapsible_section
|
2
|
+
padding: 5px
|
3
|
+
border: 1px solid #eee
|
4
|
+
margin: 10px 0px
|
5
|
+
.section_body
|
6
|
+
display: none
|
7
|
+
padding-top: 5px
|
8
|
+
.section_header
|
9
|
+
.section_toggle
|
10
|
+
float: right
|
11
|
+
&.open
|
12
|
+
.section_header
|
13
|
+
border-bottom: 1px solid #eee
|
14
|
+
padding-bottom: 5px
|
15
|
+
.section_body
|
16
|
+
display: block
|
17
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= require ./spurs/sections
|
13
|
+
*= require ./spurs/vcenter
|
14
|
+
*/
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Spurs
|
2
|
+
class FlashesController < ApplicationController
|
3
|
+
def create
|
4
|
+
respond_to do |format|
|
5
|
+
format.js {
|
6
|
+
render :file => 'spurs/flashes/add_message', :format => :js, :locals => {:_message => params[:message],:_flavor => params[:flavor]}
|
7
|
+
}
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Spurs</title>
|
5
|
+
<%= stylesheet_link_tag "spurs/application", :media => "all" %>
|
6
|
+
<%= javascript_include_tag "spurs/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
@@ -0,0 +1,3 @@
|
|
1
|
+
var _container = spurs.flashes.highest_priority_flash_container();
|
2
|
+
<%- to_render = spurs_alert(_message,:flavor => _flavor.to_s.parameterize.to_sym, :close_button => true, :builder => Spurs::Flash::Builder).html_safe%>
|
3
|
+
_container.append("<%=escape_javascript(to_render)%>");
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%-#create the modal container %>
|
2
|
+
var modal_container = tn.createEl('div');
|
3
|
+
$('body')[0].appendChild(modal_container);
|
4
|
+
|
5
|
+
<%-#put the partial in the modal%>
|
6
|
+
<%- modal_container_content =
|
7
|
+
escape_javascript(
|
8
|
+
spurs_modal modal_file_or_partial,
|
9
|
+
modal_object,
|
10
|
+
modal_options
|
11
|
+
|
12
|
+
)
|
13
|
+
%>
|
14
|
+
modal_container.innerHTML = "<%= modal_container_content %>";
|
15
|
+
|
16
|
+
<%-#activate the modal%>
|
17
|
+
$(modal_container.children[0]).modal();
|
data/config/routes.rb
ADDED
data/lib/spurs/engine.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
module Spurs
|
2
|
+
module Flash
|
3
|
+
class Builder
|
4
|
+
include ActionView::Helpers::TextHelper
|
5
|
+
include ActionView::Helpers::TagHelper
|
6
|
+
include ActionView::Helpers::AssetTagHelper
|
7
|
+
|
8
|
+
def build_alert(message,my_options)
|
9
|
+
if message == nil
|
10
|
+
raise "No message! #{my_options.to_json}"
|
11
|
+
end
|
12
|
+
my_content = String.new
|
13
|
+
|
14
|
+
if my_options[:close_button]
|
15
|
+
my_content.concat(content_tag(:a, "×".html_safe, :class => :close, 'data-dismiss' => :alert))
|
16
|
+
end
|
17
|
+
|
18
|
+
header_content = my_options[:title]
|
19
|
+
if my_options[:title_icon]
|
20
|
+
header_content = content_tag(:img, nil, :src => "/assets/#{my_options[:title_icon]}", :style => "margin-bottom: 2px; margin-right: 5px; float: left").concat(header_content)
|
21
|
+
end
|
22
|
+
|
23
|
+
my_content.concat(alert_header_tag(header_content))
|
24
|
+
|
25
|
+
my_content.concat(content_tag(:p, message.to_s.html_safe))
|
26
|
+
|
27
|
+
|
28
|
+
alert_tag(my_content.html_safe, my_options)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
def alert_header_tag(content, args={ })
|
33
|
+
my_args = { :class => "alert-heading" }.merge args
|
34
|
+
content_tag(:h4, content, my_args)
|
35
|
+
end
|
36
|
+
|
37
|
+
def alert_tag(content, args={ })
|
38
|
+
class_string = "alert"
|
39
|
+
|
40
|
+
|
41
|
+
if args[:flavor]
|
42
|
+
flavor_str = args[:flavor]
|
43
|
+
if flavor_str == :notice
|
44
|
+
flavor_str = :success
|
45
|
+
end
|
46
|
+
class_string.concat(" alert-#{flavor_str}")
|
47
|
+
end
|
48
|
+
if args[:block] != nil && args[:block] == true
|
49
|
+
class_string.concat(" alert-block")
|
50
|
+
end
|
51
|
+
content_tag(:div, content, :class => class_string)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Spurs
|
2
|
+
module Flash
|
3
|
+
|
4
|
+
module ControllerMods
|
5
|
+
def flash_addItem(list_name, message)
|
6
|
+
pluralized_list_name = list_name.to_s.pluralize.parameterize.to_sym
|
7
|
+
if flash[pluralized_list_name].nil?
|
8
|
+
flash[pluralized_list_name] = Array.new
|
9
|
+
end
|
10
|
+
flash[pluralized_list_name].push("<p>#{message}</p>")
|
11
|
+
end
|
12
|
+
|
13
|
+
#Array of
|
14
|
+
# name
|
15
|
+
# type (:link or :js)
|
16
|
+
# action
|
17
|
+
def flash_addItemWithActions(list_name, message, actions)
|
18
|
+
if flash[list_name].nil?
|
19
|
+
flash[list_name] = Array.new
|
20
|
+
end
|
21
|
+
flash_string = "<p>#{message}</p><div class=\"alert-actions\">"
|
22
|
+
|
23
|
+
actions.each do |action|
|
24
|
+
if action[:type] == :link
|
25
|
+
flash_string = flash_string + "<a class=\"btn small\" href=\"#{action[:action]}\">#{action[:name]}</a>"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
flash_string = flash_string +"</div>"
|
30
|
+
flash[list_name].push(flash_string)
|
31
|
+
end
|
32
|
+
|
33
|
+
def flash_addModelErrors(model)
|
34
|
+
if flash[:errors].nil?
|
35
|
+
flash[:errors] = Array.new
|
36
|
+
end
|
37
|
+
model.errors.each do |k, errs|
|
38
|
+
flash[:errors].push("#{k.to_s} - #{errs.to_s}")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module Spurs
|
2
|
+
module Flash
|
3
|
+
module Helper
|
4
|
+
# the default css class of the container for flash messages
|
5
|
+
@@flashes_container_class = "spurs_flash_messages"
|
6
|
+
|
7
|
+
|
8
|
+
def self.flashes_container_class
|
9
|
+
@@flashes_container_class
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
# the prefix of the id for containers for flash messages
|
14
|
+
@@flashes_container_id_prefix = "spurs_flash_messages_"
|
15
|
+
|
16
|
+
|
17
|
+
def self.flashes_container_id_prefix
|
18
|
+
@@flashes_container_id_prefix
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
@@default_messages_options = {
|
23
|
+
:priority => 10,
|
24
|
+
:builder => Spurs::Flash::Builder
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
def self.default_messages_options
|
29
|
+
@@class.default_messages_options
|
30
|
+
end
|
31
|
+
|
32
|
+
def spurs_alert_box(options={ }, &block)
|
33
|
+
extra_class = options[:type] ? "alert-#{options[:type]}" : ""
|
34
|
+
alert_content = String.new
|
35
|
+
if options[:title]
|
36
|
+
alert_content.concat(content_tag(:h4, options[:title], :class => 'alert-heading'))
|
37
|
+
end
|
38
|
+
if block
|
39
|
+
block_content = capture(nil, &block)
|
40
|
+
alert_content.concat(block_content)
|
41
|
+
end
|
42
|
+
content_tag(:div, alert_content.html_safe, :class => "alert alert-block #{extra_class}")
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Generate HTML for flash messages
|
47
|
+
# = Examples
|
48
|
+
#
|
49
|
+
# spurs_flash_helper
|
50
|
+
#
|
51
|
+
# = Options
|
52
|
+
#
|
53
|
+
# :priority - a numeric value that determines where new (usually dynamic) flash messages are placed. Defaults to 10
|
54
|
+
def spurs_flash_helper(options={ })
|
55
|
+
|
56
|
+
my_options = @@default_messages_options.merge(options)
|
57
|
+
|
58
|
+
#Rails.logger.debug("FLASH >>#{flash.to_json}")
|
59
|
+
|
60
|
+
message_hash = Hash.new()
|
61
|
+
|
62
|
+
|
63
|
+
flash.each do |fl|
|
64
|
+
process_flash_message(fl, message_hash)
|
65
|
+
end
|
66
|
+
flash.clear
|
67
|
+
|
68
|
+
#Rails.logger.info("MESSAGE HASH >>#{message_hash.to_json}")
|
69
|
+
|
70
|
+
|
71
|
+
#process the message hash now
|
72
|
+
content = String.new
|
73
|
+
message_hash.each do |k, v_arr|
|
74
|
+
v_arr.each do |v|
|
75
|
+
if v == nil
|
76
|
+
Rails.logger.warn("Flash key with no value: #{k.to_s} in flash hash #{v_arr.to_json}")
|
77
|
+
else
|
78
|
+
content << spurs_alert(v, :flavor => k, :builder => my_options[:builder], :title => k.to_s.singularize.tableize.to_sym.to_s.titlecase)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
content_tag(:div, content.html_safe, :class => @@flashes_container_class, :id => "#{@@flashes_container_id_prefix}#{my_options[:priority]}")
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
def spurs_alert(message, options={ })
|
88
|
+
|
89
|
+
## We shouldn't really need this if code is written properly
|
90
|
+
if message.is_a?(Array)
|
91
|
+
raise "Message shouldn't be an array #{message}"
|
92
|
+
end
|
93
|
+
|
94
|
+
#merge arguments with defaults
|
95
|
+
my_options = Spurs::Flash::default_args[:default].merge(options)
|
96
|
+
|
97
|
+
# make sure the flavor is a symbol
|
98
|
+
if my_options[:flavor] then
|
99
|
+
my_options[:flavor] = my_options[:flavor].to_s.singularize.parameterize.to_sym
|
100
|
+
end
|
101
|
+
|
102
|
+
# attempt to find the flavor in the list of known stuff
|
103
|
+
if Spurs::Flash::flavors.find_index(my_options[:flavor]) == nil
|
104
|
+
# didn't find it.
|
105
|
+
Rails.logger.warn("Unknown flash flavor \"#{my_options[:flavor]}\". Using a default instead")
|
106
|
+
my_options[:flavor] = Spurs::Flash::default_args[:default][:flavor]
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
if !my_options[:title_icon]
|
111
|
+
ico = Spurs::Flash::flavor_icons[my_options[:flavor]]
|
112
|
+
if ico then
|
113
|
+
my_options[:title_icon] = ico
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
if !my_options[:title]
|
118
|
+
t = Spurs::Flash::flavor_titles[my_options[:flavor]]
|
119
|
+
if t then
|
120
|
+
my_options[:title] = t
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
if !my_options[:builder]
|
125
|
+
raise "Null builder"
|
126
|
+
end
|
127
|
+
|
128
|
+
builder = my_options[:builder].new
|
129
|
+
|
130
|
+
begin
|
131
|
+
flash_content = builder.build_alert(message, my_options)
|
132
|
+
rescue => e
|
133
|
+
raise "Problem building flash message \nMessage: #{message.to_json}\nOptions: #{my_options.to_json}\nCause: #{e.message}\n\t#{e.backtrace}"
|
134
|
+
end
|
135
|
+
|
136
|
+
return flash_content
|
137
|
+
end
|
138
|
+
|
139
|
+
|
140
|
+
private
|
141
|
+
def process_flash_message(fl, message_hash)
|
142
|
+
raw_key = fl[0].to_s.parameterize.to_sym #normalize case
|
143
|
+
is_plural = raw_key.to_s.pluralize == raw_key.to_s
|
144
|
+
|
145
|
+
key = is_plural ? raw_key.to_s.singularize.to_s.parameterize.to_s : raw_key
|
146
|
+
# create the entry in the message hash if necessary
|
147
|
+
if !message_hash[key]
|
148
|
+
message_hash[key] = Array.new
|
149
|
+
end
|
150
|
+
|
151
|
+
if !is_plural
|
152
|
+
message_hash[key].push(fl[1])
|
153
|
+
else
|
154
|
+
(0..fl[1].size-1).each do |i|
|
155
|
+
message_hash[key].push(fl[1][i])
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
data/lib/spurs/flash.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
module Spurs
|
2
|
+
module Flash
|
3
|
+
# Flavors of flash message that we know how to deal with
|
4
|
+
##
|
5
|
+
@@flavors = [:error, :notice, :info, :warning]
|
6
|
+
@@flavor_titles = {
|
7
|
+
:error => I18n.t(:error, :default => "error").titlecase,
|
8
|
+
:notice => I18n.t(:notice, :default => "notice").titlecase,
|
9
|
+
:info => I18n.t(:info, :default => "info").titlecase,
|
10
|
+
:warning => I18n.t(:warning, :default => "warning").titlecase
|
11
|
+
}
|
12
|
+
@@flavor_icons = {
|
13
|
+
:error => "spurs/icons/16x16/delete.png",
|
14
|
+
:notice => "spurs/icons/16x16/accept.png",
|
15
|
+
:info => "spurs/icons/16x16/info.png",
|
16
|
+
:warning => "spurs/icons/16x16/warning.png"
|
17
|
+
}
|
18
|
+
|
19
|
+
def self.flavor_icons
|
20
|
+
@@flavor_icons
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.flavor_titles
|
24
|
+
@@flavor_titles
|
25
|
+
end
|
26
|
+
|
27
|
+
@@default_args = {
|
28
|
+
:dynamic => {
|
29
|
+
:block => true,
|
30
|
+
:flavor => :info,
|
31
|
+
:lifetime => 5000,
|
32
|
+
:close_button => true
|
33
|
+
},
|
34
|
+
:default => {
|
35
|
+
:block => true,
|
36
|
+
:flavor => :info,
|
37
|
+
:lifetime => -1,
|
38
|
+
:close_button => true
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
def self.default_args
|
43
|
+
@@default_args
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.flavors
|
47
|
+
@@flavors
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
require "spurs/flash/builder"
|
53
|
+
require "spurs/flash/helper"
|
54
|
+
require "spurs/flash/controller_mods"
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Spurs
|
2
|
+
module Modal
|
3
|
+
class Builder
|
4
|
+
include ActionView::Helpers::TagHelper
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
def build_modal(modal_id, content, options={ })
|
9
|
+
|
10
|
+
if !options[:class] then
|
11
|
+
options[:class] = ""
|
12
|
+
end
|
13
|
+
options[:class].concat(" modal fade #{modal_id}")
|
14
|
+
|
15
|
+
c = String.new
|
16
|
+
|
17
|
+
if options[:header]
|
18
|
+
header_options = options.delete(:header)
|
19
|
+
if header_options[:title]
|
20
|
+
c.concat(build_modal_title(header_options[:title], header_options[:icon]))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
#body
|
26
|
+
c.concat(content_tag(:div, content, :class => "modal-body"))
|
27
|
+
|
28
|
+
if options[:actions]
|
29
|
+
actions_options = options.delete(:actions)
|
30
|
+
c.concat(build_modal_footer(actions_options).html_safe)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
content_tag(:div, c.html_safe, :class => options[:class], 'data-modal-id' => "#{modal_id}")
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
private
|
41
|
+
def build_modal_title(title, icon)
|
42
|
+
c = String.new
|
43
|
+
if icon != nil
|
44
|
+
c.concat(content_tag(:img, '', :src => icon, :style => "float: left; margin-right: 10px; height: 36px").html_safe)
|
45
|
+
end
|
46
|
+
c.concat(content_tag(:h1, title))
|
47
|
+
content_tag(:div, c.html_safe, :class => "modal-header")
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
def build_modal_footer(actions)
|
53
|
+
c = String.new
|
54
|
+
|
55
|
+
left_content = " "
|
56
|
+
right_content = " "
|
57
|
+
center_content = " "
|
58
|
+
|
59
|
+
actions.each do |action|
|
60
|
+
class_str = "btn"
|
61
|
+
if action[:position]
|
62
|
+
if action[:position] == :left
|
63
|
+
left_content.concat(build_action_button(action))
|
64
|
+
else
|
65
|
+
if action[:position] == :right
|
66
|
+
right_content.concat(build_action_button(action))
|
67
|
+
else
|
68
|
+
if action[:position] == :center
|
69
|
+
center_content.concat(build_action_button(action))
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
left_area = content_tag(:div, left_content.html_safe, :style => "width: 32%; text-align: left; float: left")
|
77
|
+
right_area = content_tag(:div, right_content.html_safe, :style => "width: 32%; text-align: right; float: left")
|
78
|
+
middle_area = content_tag(:div, center_content.html_safe, :style => "width: 33%; text-align: center; float:left")
|
79
|
+
|
80
|
+
c.concat(left_area).concat(middle_area).concat(right_area)
|
81
|
+
|
82
|
+
content_tag(:div, c.html_safe, :class => "modal-footer")
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
def build_action_button(action)
|
88
|
+
class_str = "btn #{action[:class] ? action[:class] : ""} btn-large"
|
89
|
+
|
90
|
+
attrs = {
|
91
|
+
:onclick => ""
|
92
|
+
}
|
93
|
+
|
94
|
+
if action[:action]
|
95
|
+
if action[:action].kind_of?(Symbol)
|
96
|
+
case action[:action]
|
97
|
+
when :close_modal then
|
98
|
+
attrs[:onclick] = "m=$(this).closest('.modal');m.modal('hide')"
|
99
|
+
when :submit_form_and_close_modal then
|
100
|
+
attrs[:onclick] = "m=$(this).closest('.modal');m.find('.modal-body form').submit();m.modal('hide')"
|
101
|
+
else
|
102
|
+
raise "Unknown button action \"#{action[:action].to_json}\""
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
if attrs[:onclick] == ""
|
108
|
+
attrs.delete(:onclick)
|
109
|
+
end
|
110
|
+
attrs[:class] = class_str
|
111
|
+
|
112
|
+
|
113
|
+
content_tag(:a, action[:name].to_s.titlecase.html_safe, attrs)
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Spurs
|
2
|
+
module Modal
|
3
|
+
module ControllerMods
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
def spawn_form_modal(title, partial, object, options={ })
|
7
|
+
opts = {
|
8
|
+
:actions => [
|
9
|
+
{ :name => :cancel, :position => :left, :action => :close_modal, :class => "btn-large" },
|
10
|
+
{ :name => :save, :position => :right, :action => :submit_form_and_close_modal, :class => "btn-primary btn-large" },
|
11
|
+
]
|
12
|
+
}.merge(options)
|
13
|
+
logger.debug("spawn_form_modal options = #{opts.to_json}")
|
14
|
+
|
15
|
+
spawn_modal(title, partial, object, opts)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
def spawn_close_modal(title, file, options={ })
|
21
|
+
opts[:content_options] = options
|
22
|
+
opts = {
|
23
|
+
:actions => [
|
24
|
+
{ :name => :cancel, :position => :left, :action => :close_modal, :class => "btn-large" }
|
25
|
+
]
|
26
|
+
}.merge(options)
|
27
|
+
logger.debug("spawn_close_modal options = #{opts.to_json}")
|
28
|
+
spawn_modal(title, file, nil, opts)
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
def spawn_modal(title, partial, object, options={ })
|
34
|
+
#options[:content_options] = options.clone
|
35
|
+
opts = {
|
36
|
+
:header => {
|
37
|
+
:title => title.titlecase,
|
38
|
+
:icon => options[:title_icon] ? options.delete(:title_icon) : nil
|
39
|
+
},
|
40
|
+
|
41
|
+
}.merge(options)
|
42
|
+
logger.debug("spawn_modal options = #{opts.to_json}")
|
43
|
+
render :file => "spurs/modals/spawn", :locals => { :modal_file_or_partial => partial,
|
44
|
+
:modal_object => object,
|
45
|
+
:modal_options => opts }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "spurs/modal/builder"
|
2
|
+
module Spurs
|
3
|
+
module Modal
|
4
|
+
module Helper
|
5
|
+
def spurs_modal(file_or_partial, object=nil, options={ })
|
6
|
+
opts = Spurs::Modal::default_options.merge(options)
|
7
|
+
builder_class = opts.delete(:builder)
|
8
|
+
builder = builder_class.new
|
9
|
+
|
10
|
+
modal_id = "modal_#{SecureRandom::hex(5)}"
|
11
|
+
|
12
|
+
options_for_content = options[:content_options] ? options.delete(:content_options) : { }
|
13
|
+
|
14
|
+
if object == nil
|
15
|
+
content = render :file => file_or_partial, :locals => options_for_content
|
16
|
+
else
|
17
|
+
content = render :object => object, :partial => file_or_partial, :locals => options_for_content
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
bm = builder.build_modal(modal_id, content, options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|