spurs 0.0.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/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
|