window_rails 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +9 -0
- data/README.rdoc +2 -2
- data/app/controllers/window_rails_controller.rb +4 -1
- data/files/javascripts/window.js +3 -1
- data/install.rb +0 -1
- data/lib/window_rails/version.rb +1 -1
- data/lib/window_rails/window_rails_generators.rb +209 -0
- data/lib/window_rails/window_rails_view.rb +10 -0
- data/lib/window_rails.rb +2 -157
- metadata +6 -4
data/CHANGELOG.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -52,11 +52,11 @@ Rails to make it easy to use from a Rails app.
|
|
52
52
|
|
53
53
|
== Documentation
|
54
54
|
|
55
|
-
|
55
|
+
{WindowRails documentation}[http://chrisroberts.github.com/window_rails]
|
56
56
|
|
57
57
|
== Bugs/Features
|
58
58
|
|
59
|
-
[
|
59
|
+
{Issues}[http://github.com/chrisroberts/window_rails/issues]
|
60
60
|
|
61
61
|
== Thanks
|
62
62
|
|
@@ -17,6 +17,9 @@ class WindowRailsController < ActionController::Base
|
|
17
17
|
end
|
18
18
|
|
19
19
|
# Opens a new window
|
20
|
+
# NOTE: It is important to note that the contents of the window will be opened
|
21
|
+
# within an IFrame. This means links within the window will not be able to
|
22
|
+
# communicate with the page around it (like closing the window)
|
20
23
|
def open_window
|
21
24
|
respond_to do |format|
|
22
25
|
format.html do
|
@@ -24,7 +27,7 @@ class WindowRailsController < ActionController::Base
|
|
24
27
|
end
|
25
28
|
format.js do
|
26
29
|
render :update do |page|
|
27
|
-
page.
|
30
|
+
page.open_window({:url => params[:window_url]}, params[:window_options])
|
28
31
|
end
|
29
32
|
end
|
30
33
|
end
|
data/files/javascripts/window.js
CHANGED
@@ -794,7 +794,9 @@ Window.prototype = {
|
|
794
794
|
this.options.showEffect(this.element);
|
795
795
|
|
796
796
|
this._checkIEOverlapping();
|
797
|
-
WindowUtilities.focusedWindow = this
|
797
|
+
WindowUtilities.focusedWindow = this;
|
798
|
+
// this.getContent().style.display = 'none';
|
799
|
+
this.getContent().style.scroll = 'auto';
|
798
800
|
this._notify("onShow");
|
799
801
|
},
|
800
802
|
|
data/install.rb
CHANGED
data/lib/window_rails/version.rb
CHANGED
@@ -0,0 +1,209 @@
|
|
1
|
+
module WindowRailsGenerators
|
2
|
+
|
3
|
+
include ActionView::Helpers::JavaScriptHelper
|
4
|
+
include ActionView::Helpers::TagHelper
|
5
|
+
|
6
|
+
# msg:: Alert message
|
7
|
+
# options:: Hash of options values for the alert window
|
8
|
+
# Opens an alert window
|
9
|
+
def open_alert_window(msg, options={})
|
10
|
+
options[:width] ||= 200
|
11
|
+
self << "Dialog.alert('#{escape_javascript(msg)}', {#{options.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(',')}});"
|
12
|
+
end
|
13
|
+
|
14
|
+
# msg:: Confirmation message
|
15
|
+
# options:: Hash of options values for the confirmation window
|
16
|
+
# Opens a confirmation window
|
17
|
+
def open_confirm_window(msg, options={})
|
18
|
+
options[:width] ||= 200
|
19
|
+
self << "Dialog.confirm('#{escape_javascript(msg)}', {#{options.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(',')}});"
|
20
|
+
end
|
21
|
+
|
22
|
+
# msg:: Information message
|
23
|
+
# options:: Hash of options values for info window
|
24
|
+
# Open an information window
|
25
|
+
def open_info_window(msg, options={})
|
26
|
+
options[:width] ||= 200
|
27
|
+
self << "Dialog.info('#{escape_javascript(msg)}', {#{options.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(',')}});"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Close an information window
|
31
|
+
def close_info_window
|
32
|
+
self << "Dialog.closeInfo();"
|
33
|
+
end
|
34
|
+
|
35
|
+
# Update the contents of an information window
|
36
|
+
def update_info_window(msg)
|
37
|
+
self << "Dialog.setInfoMessage('#{escape_javascript(msg)}');"
|
38
|
+
end
|
39
|
+
|
40
|
+
# content:: Updated content
|
41
|
+
# options:: Hash of options
|
42
|
+
# * window -> Name of the window to update (defaults to last window)
|
43
|
+
# * error -> Show error if window is not found (defaults false)
|
44
|
+
# Updates the window with the new content. If the content is a string, it will
|
45
|
+
# be placed into the window. If it is a Hash, it will be fed to render and the
|
46
|
+
# result will be placed in the window (basically an easy way to integrate partials:
|
47
|
+
# page.update_window(:partial => 'my_parital'))
|
48
|
+
def update_window(content, options={})
|
49
|
+
win = options.delete(:window)
|
50
|
+
error = options.delete(:error)
|
51
|
+
if(content.is_a?(Hash))
|
52
|
+
content = render(content)
|
53
|
+
end
|
54
|
+
self << check_for_window(win, error){ update_window_contents(content, win) }
|
55
|
+
end
|
56
|
+
|
57
|
+
def check_for_window(name, error)
|
58
|
+
if(name.blank?)
|
59
|
+
self << "if(Windows.windows.values().size() > 0){"
|
60
|
+
else
|
61
|
+
self << "if(Windows.existsByName('#{escape_javascript(name)}')){"
|
62
|
+
end
|
63
|
+
yield if block_given?
|
64
|
+
self << "}"
|
65
|
+
self << "else { alert('Unexpected error. Failed to locate window for output.'); }" if error
|
66
|
+
end
|
67
|
+
|
68
|
+
def else_block
|
69
|
+
self << "else {"
|
70
|
+
yield if block_given?
|
71
|
+
self << "}"
|
72
|
+
end
|
73
|
+
|
74
|
+
def update_window_contents(content, win)
|
75
|
+
unless(win.blank?)
|
76
|
+
self << "Windows.getWindowByName('#{escape_javascript(win)}').setHTMLContent('#{escape_javascript(content)}');"
|
77
|
+
else
|
78
|
+
self << "Windows.windows.values().last().setHTMLContent('#{escape_javascript(content)}');"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def focus_window(win)
|
83
|
+
unless(win.blank?)
|
84
|
+
self << "Windows.focus(Windows.getWindowByName('#{escape_javascript(win)}').getId());"
|
85
|
+
else
|
86
|
+
self << "Windows.focus(Windows.windows.values().last().getId());"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def create_window(content, win, options)
|
91
|
+
self << "var myWin = new Window({#{options.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(', ')}});"
|
92
|
+
self << "Windows.registerByName('#{escape_javascript(win)}', myWin);" unless win.blank?
|
93
|
+
self << "myWin.setHTMLContent('#{escape_javascript(content)}');" unless content.blank?
|
94
|
+
self << "myWin.setCloseCallback(function(win){ win.destroy(); return true; });"
|
95
|
+
end
|
96
|
+
|
97
|
+
def show_window(win, modal)
|
98
|
+
s = nil
|
99
|
+
unless(win.blank?)
|
100
|
+
s = "Windows.getWindowByName('#{escape_javascript(win)}')"
|
101
|
+
else
|
102
|
+
s = 'Windows.windows.values().last()'
|
103
|
+
end
|
104
|
+
self << "#{s}.showCenter(#{modal ? 'true' : 'false'});"
|
105
|
+
end
|
106
|
+
|
107
|
+
def apply_window_constraints(win, constraints)
|
108
|
+
opts = {:left => 0, :right => 0, :top => 0, :bottom => 0}
|
109
|
+
opts.merge!(constraints) if constraints.is_a?(Hash)
|
110
|
+
s = nil
|
111
|
+
unless(win.blank?)
|
112
|
+
s = "Windows.getWindowByName('#{escape_javascript(win)}')"
|
113
|
+
else
|
114
|
+
s = "Windows.windows.values().last()"
|
115
|
+
end
|
116
|
+
self << "#{s}.setConstraint(true, {#{opts.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(', ')}});"
|
117
|
+
end
|
118
|
+
|
119
|
+
# content:: Content for window
|
120
|
+
# options:: Hash of options
|
121
|
+
# * modal -> Window should be modal
|
122
|
+
# * window -> Name to reference window (used for easy updating and closing)
|
123
|
+
# * constraints -> Hash containing top,left,right,bottom values for padding from edges. False value will turn off constraints (window can travel out of viewport)
|
124
|
+
# * url -> URL to load into the window
|
125
|
+
# * width -> Width of the window
|
126
|
+
# * height -> Height of the window
|
127
|
+
# * className -> Theme name for the window
|
128
|
+
# * no_update -> Set to true to force creation of a new window even if window of same name already exists (defaults to false)
|
129
|
+
# Creates a new window and displays it at the center of the viewport.
|
130
|
+
def open_window(content, options={})
|
131
|
+
modal = options.delete(:modal)
|
132
|
+
win = options.delete(:window)
|
133
|
+
constraints = options.delete(:constraints)
|
134
|
+
no_update = options.delete(:no_update)
|
135
|
+
options[:className] = 'alphacube' unless options[:className]
|
136
|
+
if(content.is_a?(Hash))
|
137
|
+
if(content[:url])
|
138
|
+
options[:url] = @context.url_for(content[:url])
|
139
|
+
content = nil
|
140
|
+
else
|
141
|
+
content = render(content)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
options[:width] ||= 300
|
145
|
+
options[:height] ||= 200
|
146
|
+
output = []
|
147
|
+
if(no_update)
|
148
|
+
create_window(content, win, options)
|
149
|
+
unless(constraints == false)
|
150
|
+
apply_window_constraints(win, constraints)
|
151
|
+
end
|
152
|
+
show_window(win, modal)
|
153
|
+
else
|
154
|
+
check_for_window(win, false) do
|
155
|
+
update_window_contents(content, win)
|
156
|
+
focus_window(win)
|
157
|
+
end
|
158
|
+
else_block do
|
159
|
+
create_window(content, win, options)
|
160
|
+
unless(constraints == false)
|
161
|
+
apply_window_constraints(win, constraints)
|
162
|
+
end
|
163
|
+
show_window(win, modal)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# options:: Hash of options
|
169
|
+
# * :window -> name of window to close
|
170
|
+
# Close the window of the provided name or the last opened window
|
171
|
+
def close_window(options = {})
|
172
|
+
win = options.is_a?(Hash) ? options.delete(:window) : options.to_s
|
173
|
+
self << "var myWin = null;"
|
174
|
+
unless(win.blank?)
|
175
|
+
self << "myWin = Windows.getWindowByName('#{escape_javascript(win)}');"
|
176
|
+
else
|
177
|
+
self << "if(Windows.windows.values().last()){ myWin = Windows.windows.values().last(); }"
|
178
|
+
end
|
179
|
+
self << "if(myWin){ myWin.close(); }"
|
180
|
+
end
|
181
|
+
|
182
|
+
# Close all open windows
|
183
|
+
def close_all_windows
|
184
|
+
self << "Windows.closeAll();"
|
185
|
+
end
|
186
|
+
|
187
|
+
# args:: List of window names to refresh (All will be refreshed if :all is included)
|
188
|
+
# Refresh window contents
|
189
|
+
def refresh_window(*args)
|
190
|
+
self << "var myWin = null;"
|
191
|
+
if(args.include?(:all))
|
192
|
+
self << "Windows.windows.values().each(function(win){ win.refresh(); });"
|
193
|
+
else
|
194
|
+
args.each do |win|
|
195
|
+
self << "myWin = Windows.getWindowByName('#{escape_javascript(win.to_s)}');"
|
196
|
+
self << "if(myWin){ myWin.refresh(); }"
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def observe_dynamically_loaded_field(field_id, options={})
|
202
|
+
f = options.delete(:function)
|
203
|
+
unless(f)
|
204
|
+
f = "function(event){ new Ajax.Request('#{escape_javascript(@context.url_for(options[:url]).to_s)}', {asynchronous:true, evalScripts:true,parameters:'#{escape_javascript(options[:with].to_s)}='+$('#{escape_javascript(options[:with].to_s)}').getValue()})}"
|
205
|
+
end
|
206
|
+
self << "if($('#{escape_javascript(field_id.to_s)}')){ $('#{escape_javascript(field_id.to_s)}').observe('change', #{f}); }"
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module WindowRailsView
|
2
|
+
|
3
|
+
# name:: Name of the link
|
4
|
+
# options:: Hash of optional values. These options are simply passed
|
5
|
+
# on to the activate_window method
|
6
|
+
def link_to_window(name, options={})
|
7
|
+
link_to_remote(name, :url => {:controller => :window_rails, :action => :open_window, :window_url => url_for(options.delete(:url)), :window_options => options})
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
data/lib/window_rails.rb
CHANGED
@@ -1,160 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# name:: Name of the link
|
4
|
-
# options:: Hash of optional values. These options are simply passed
|
5
|
-
# on to the activate_window method
|
6
|
-
def link_to_window(name, options={})
|
7
|
-
link_to_remote(name, :url => {:controller => :window_rails, :action => :open_window, :window_url => url_for(options.delete(:url)), :window_options => options})
|
8
|
-
end
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
module WindowRailsGenerators
|
13
|
-
|
14
|
-
include ActionView::Helpers::JavaScriptHelper
|
15
|
-
include ActionView::Helpers::UrlHelper
|
16
|
-
include ActionView::Helpers::TagHelper
|
17
|
-
|
18
|
-
# msg:: Alert message
|
19
|
-
# options:: Hash of options values for the alert window
|
20
|
-
# Opens an alert window
|
21
|
-
def open_alert_window(msg, options={})
|
22
|
-
options[:width] ||= 200
|
23
|
-
self << "Dialog.alert('#{escape_javascript(msg)}', {#{options.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(',')}});"
|
24
|
-
end
|
25
|
-
|
26
|
-
# msg:: Confirmation message
|
27
|
-
# options:: Hash of options values for the confirmation window
|
28
|
-
# Opens a confirmation window
|
29
|
-
def open_confirm_window(msg, options={})
|
30
|
-
options[:width] ||= 200
|
31
|
-
self << "Dialog.confirm('#{escape_javascript(msg)}', {#{options.map{|k,v|"#{escape_javascript(k)}:'#{escape_javascript(v)}'"}.join(',')}});"
|
32
|
-
end
|
33
|
-
|
34
|
-
# msg:: Information message
|
35
|
-
# options:: Hash of options values for info window
|
36
|
-
# Open an information window
|
37
|
-
def open_info_window(msg, options={})
|
38
|
-
self << "Dialog.info('#{escape_javascript(msg)}', {#{options.map{|k,v|"#{escape_javascript(k)}:'#{escape_javascript(v)}'"}.join(',')}});"
|
39
|
-
end
|
40
|
-
|
41
|
-
# Close an information window
|
42
|
-
def close_info_window
|
43
|
-
self << "Dialog.closeInfo();"
|
44
|
-
end
|
45
|
-
|
46
|
-
# Update the contents of an information window
|
47
|
-
def update_info_window(msg)
|
48
|
-
self << "Dialog.setInfoMessage('#{escape_javascript(msg)}');"
|
49
|
-
end
|
50
|
-
|
51
|
-
# content:: Updated content
|
52
|
-
# options:: Hash of options
|
53
|
-
# * window -> Name of the window to update (defaults to last window)
|
54
|
-
# * error -> Show error if window is not found (defaults false)
|
55
|
-
# Updates the window with the new content. If the content is a string, it will
|
56
|
-
# be placed into the window. If it is a Hash, it will be fed to render and the
|
57
|
-
# result will be placed in the window (basically an easy way to integrate partials:
|
58
|
-
# page.update_window(:partial => 'my_parital'))
|
59
|
-
def update_window(content, options={})
|
60
|
-
win = options.delete(:window)
|
61
|
-
error = options.delete(:error)
|
62
|
-
if(content.is_a?(Hash))
|
63
|
-
content = render(content)
|
64
|
-
end
|
65
|
-
content = escape_javascript(content)
|
66
|
-
win = escape_javascript(win) if win
|
67
|
-
if(win)
|
68
|
-
self << "if(Windows.existsByName('#{win}')){"
|
69
|
-
self << " Windows.getWindowByName('#{win}').setHTMLContent('#{content}');"
|
70
|
-
self << "}"
|
71
|
-
if(error)
|
72
|
-
self << "else {"
|
73
|
-
self << " alert('Unexpected error. Failed to locate correct window for output.');"
|
74
|
-
self << "}"
|
75
|
-
end
|
76
|
-
else
|
77
|
-
self << "Windows.windows.values().last().setHTMLContent('#{content}');"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# content:: Content for window
|
82
|
-
# options:: Hash of options
|
83
|
-
# * modal -> Window should be modal
|
84
|
-
# * window -> Name to reference window (used for easy updating and closing)
|
85
|
-
# * constraints -> Hash containing top,left,right,bottom values for padding from edges. False value will turn off constraints (window can travel out of viewport)
|
86
|
-
# * url -> URL to load into the window
|
87
|
-
# * width -> Width of the window
|
88
|
-
# * height -> Height of the window
|
89
|
-
# * className -> Theme name for the window
|
90
|
-
# Creates a new window and displays it at the center of the viewport.
|
91
|
-
def open_window(content, options)
|
92
|
-
modal = options.delete(:modal)
|
93
|
-
win = options.delete(:window)
|
94
|
-
constraints = options.delete(:constraints)
|
95
|
-
if(content.is_a?(Hash))
|
96
|
-
if(content[:url])
|
97
|
-
options[:url] = url_for(content[:url])
|
98
|
-
content = nil
|
99
|
-
else
|
100
|
-
content = render(content)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
options[:width] ||= 300
|
104
|
-
options[:height] ||= 200
|
105
|
-
content = escape_javascript(content) if content
|
106
|
-
win = escape_javascript(win) if win
|
107
|
-
self << "var myWin = new Window({#{options.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(', ')}});";
|
108
|
-
unless(win.blank?)
|
109
|
-
self << "Windows.registerByName('#{win}', myWin);"
|
110
|
-
end
|
111
|
-
if(content)
|
112
|
-
self << "myWin.setHTMLContent('#{content}');"
|
113
|
-
end
|
114
|
-
unless(constraints == false)
|
115
|
-
opts = {:left => 0, :right => 0, :top => 0, :bottom => 0}
|
116
|
-
opts.merge!(constraints) if constraints.is_a?(Hash)
|
117
|
-
self << "myWin.setConstraint(true, {#{opts.map{|k,v|"#{escape_javascript(k.to_s)}:'#{escape_javascript(v.to_s)}'"}.join(', ')}});"
|
118
|
-
end
|
119
|
-
self << "myWin.setCloseCallback(function(win){ win.destroy(); return true; });"
|
120
|
-
self << "myWin.showCenter(#{modal ? 'true' : 'false'});"
|
121
|
-
end
|
122
|
-
|
123
|
-
# options:: Hash of options
|
124
|
-
# * :window -> name of window to close
|
125
|
-
# Close the window of the provided name or the last opened window
|
126
|
-
def close_window(options = {})
|
127
|
-
win = options.delete(:window)
|
128
|
-
win = escape_javascript(win) if win
|
129
|
-
self << "var myWin = null;"
|
130
|
-
if(win)
|
131
|
-
self << "myWin = Windows.getWindowByName('#{win}');"
|
132
|
-
else
|
133
|
-
self << "if(Windows.windows.values().last()){ myWin = Windows.windows.values().last(); }"
|
134
|
-
end
|
135
|
-
self << "if(myWin){ myWin.close(); }"
|
136
|
-
end
|
137
|
-
|
138
|
-
# Close all open windows
|
139
|
-
def close_all_windows
|
140
|
-
self << "Windows.closeAll();"
|
141
|
-
end
|
142
|
-
|
143
|
-
# args:: List of window names to refresh (All will be refreshed if :all is included)
|
144
|
-
# Refresh window contents
|
145
|
-
def refresh_window(*args)
|
146
|
-
self << "var myWin = null;"
|
147
|
-
if(args.include?(:all))
|
148
|
-
self << "Windows.windows.values().each(function(win){ win.refresh(); });"
|
149
|
-
else
|
150
|
-
args.each do |win|
|
151
|
-
self << "myWin = Windows.getWindowByName('#{escape_javascript(win.to_s)}');"
|
152
|
-
self << "if(myWin){ myWin.refresh(); }"
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
end
|
1
|
+
require 'window_rails/window_rails_view'
|
2
|
+
require 'window_rails/window_rails_generators'
|
158
3
|
|
159
4
|
# Load everything into rails
|
160
5
|
if(defined? Rails)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: window_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Chris Roberts
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-11-
|
18
|
+
date: 2010-11-10 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -222,6 +222,8 @@ files:
|
|
222
222
|
- files/themes/alert.css
|
223
223
|
- lib/window_rails.rb
|
224
224
|
- lib/window_rails/version.rb
|
225
|
+
- lib/window_rails/window_rails_view.rb
|
226
|
+
- lib/window_rails/window_rails_generators.rb
|
225
227
|
has_rdoc: true
|
226
228
|
homepage: http://github.com/chrisroberts/window_rails
|
227
229
|
licenses: []
|