RubyApp 0.0.6

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.
Files changed (218) hide show
  1. data/.gitignore +13 -0
  2. data/.rvmrc +1 -0
  3. data/Gemfile +4 -0
  4. data/README.md +0 -0
  5. data/bin/console.rb +8 -0
  6. data/bin/ruby_app +168 -0
  7. data/features/breadcrumbs.feature +11 -0
  8. data/features/content.feature +16 -0
  9. data/features/default.feature +5 -0
  10. data/features/dialog.feature +56 -0
  11. data/features/exception.feature +53 -0
  12. data/features/input.feature +13 -0
  13. data/features/list.feature +12 -0
  14. data/features/month.feature +14 -0
  15. data/features/step_definitions/default_macros.rb +16 -0
  16. data/features/step_definitions/default_steps.rb +36 -0
  17. data/features/support/env.rb +12 -0
  18. data/lib/ruby_app.rb +1 -0
  19. data/lib/ruby_app/application.rb +72 -0
  20. data/lib/ruby_app/config.ru +27 -0
  21. data/lib/ruby_app/config.yml +15 -0
  22. data/lib/ruby_app/configuration.rb +44 -0
  23. data/lib/ruby_app/element.rb +120 -0
  24. data/lib/ruby_app/elements/base/base_dialog.css.haml +9 -0
  25. data/lib/ruby_app/elements/base/base_dialog.html.haml +4 -0
  26. data/lib/ruby_app/elements/base/base_dialog.rb +64 -0
  27. data/lib/ruby_app/elements/base/base_page.css.haml +13 -0
  28. data/lib/ruby_app/elements/base/base_page.html.haml +20 -0
  29. data/lib/ruby_app/elements/base/base_page.js.haml +97 -0
  30. data/lib/ruby_app/elements/base/base_page.rb +80 -0
  31. data/lib/ruby_app/elements/button.html.haml +4 -0
  32. data/lib/ruby_app/elements/button.rb +19 -0
  33. data/lib/ruby_app/elements/calendars/base/base_month.css.haml +10 -0
  34. data/lib/ruby_app/elements/calendars/base/base_month.html.haml +42 -0
  35. data/lib/ruby_app/elements/calendars/base/base_month.js.haml +18 -0
  36. data/lib/ruby_app/elements/calendars/base/base_month.rb +101 -0
  37. data/lib/ruby_app/elements/calendars/month.rb +27 -0
  38. data/lib/ruby_app/elements/click.js.haml +10 -0
  39. data/lib/ruby_app/elements/click.rb +44 -0
  40. data/lib/ruby_app/elements/dialog.rb +23 -0
  41. data/lib/ruby_app/elements/dialogs/base/base_busy_dialog.css.haml +9 -0
  42. data/lib/ruby_app/elements/dialogs/base/base_busy_dialog.html.haml +7 -0
  43. data/lib/ruby_app/elements/dialogs/base/base_busy_dialog.rb +27 -0
  44. data/lib/ruby_app/elements/dialogs/base/base_close_dialog.css.haml +11 -0
  45. data/lib/ruby_app/elements/dialogs/base/base_close_dialog.html.haml +6 -0
  46. data/lib/ruby_app/elements/dialogs/base/base_close_dialog.js.haml +2 -0
  47. data/lib/ruby_app/elements/dialogs/base/base_close_dialog.rb +33 -0
  48. data/lib/ruby_app/elements/dialogs/base/base_yes_no_dialog.css.haml +15 -0
  49. data/lib/ruby_app/elements/dialogs/base/base_yes_no_dialog.html.haml +8 -0
  50. data/lib/ruby_app/elements/dialogs/base/base_yes_no_dialog.js.haml +2 -0
  51. data/lib/ruby_app/elements/dialogs/base/base_yes_no_dialog.rb +40 -0
  52. data/lib/ruby_app/elements/dialogs/blank_dialog.html.haml +9 -0
  53. data/lib/ruby_app/elements/dialogs/blank_dialog.rb +22 -0
  54. data/lib/ruby_app/elements/dialogs/busy_dialog.rb +22 -0
  55. data/lib/ruby_app/elements/dialogs/calendars/month_dialog.css.haml +19 -0
  56. data/lib/ruby_app/elements/dialogs/calendars/month_dialog.html.haml +18 -0
  57. data/lib/ruby_app/elements/dialogs/calendars/month_dialog.js.haml +3 -0
  58. data/lib/ruby_app/elements/dialogs/calendars/month_dialog.rb +52 -0
  59. data/lib/ruby_app/elements/dialogs/close_dialog.rb +22 -0
  60. data/lib/ruby_app/elements/dialogs/confirmation_dialog.html.haml +8 -0
  61. data/lib/ruby_app/elements/dialogs/confirmation_dialog.rb +26 -0
  62. data/lib/ruby_app/elements/dialogs/exception_dialog.html.haml +8 -0
  63. data/lib/ruby_app/elements/dialogs/exception_dialog.rb +23 -0
  64. data/lib/ruby_app/elements/dialogs/message_dialog.html.haml +8 -0
  65. data/lib/ruby_app/elements/dialogs/message_dialog.rb +26 -0
  66. data/lib/ruby_app/elements/dialogs/yes_no_dialog.rb +22 -0
  67. data/lib/ruby_app/elements/exception_element.html.haml +7 -0
  68. data/lib/ruby_app/elements/exception_element.rb +19 -0
  69. data/lib/ruby_app/elements/input.html.haml +3 -0
  70. data/lib/ruby_app/elements/input.js.haml +9 -0
  71. data/lib/ruby_app/elements/input.rb +54 -0
  72. data/lib/ruby_app/elements/inputs/duration_input.rb +46 -0
  73. data/lib/ruby_app/elements/link.html.haml +4 -0
  74. data/lib/ruby_app/elements/link.rb +19 -0
  75. data/lib/ruby_app/elements/list.html.haml +9 -0
  76. data/lib/ruby_app/elements/list.js.haml +10 -0
  77. data/lib/ruby_app/elements/list.rb +55 -0
  78. data/lib/ruby_app/elements/lists/select.html.haml +14 -0
  79. data/lib/ruby_app/elements/lists/select.js.haml +10 -0
  80. data/lib/ruby_app/elements/lists/select.rb +47 -0
  81. data/lib/ruby_app/elements/markdown.html.haml +5 -0
  82. data/lib/ruby_app/elements/markdown.js.haml +10 -0
  83. data/lib/ruby_app/elements/markdown.rb +51 -0
  84. data/lib/ruby_app/elements/navigation/back_button.html.haml +2 -0
  85. data/lib/ruby_app/elements/navigation/back_button.rb +29 -0
  86. data/lib/ruby_app/elements/navigation/base/base_breadcrumbs.html.haml +17 -0
  87. data/lib/ruby_app/elements/navigation/base/base_breadcrumbs.js.haml +10 -0
  88. data/lib/ruby_app/elements/navigation/base/base_breadcrumbs.rb +58 -0
  89. data/lib/ruby_app/elements/navigation/breadcrumbs.rb +22 -0
  90. data/lib/ruby_app/elements/navigation/page_link.html.haml +9 -0
  91. data/lib/ruby_app/elements/navigation/page_link.js.haml +10 -0
  92. data/lib/ruby_app/elements/navigation/page_link.rb +56 -0
  93. data/lib/ruby_app/elements/navigation/page_menu.html.haml +12 -0
  94. data/lib/ruby_app/elements/navigation/page_menu.js.haml +10 -0
  95. data/lib/ruby_app/elements/navigation/page_menu.rb +57 -0
  96. data/lib/ruby_app/elements/page.rb +21 -0
  97. data/lib/ruby_app/elements/pages/authentication/open_id/authentication_page.css.haml +2 -0
  98. data/lib/ruby_app/elements/pages/authentication/open_id/authentication_page.js.haml +2 -0
  99. data/lib/ruby_app/elements/pages/authentication/open_id/authentication_page.rb +77 -0
  100. data/lib/ruby_app/elements/pages/authentication/open_id/ax_authentication_page.rb +52 -0
  101. data/lib/ruby_app/elements/pages/authentication/open_id/google_authentication_page.rb +30 -0
  102. data/lib/ruby_app/elements/pages/authentication/open_id/my_open_id_authentication_page.rb +30 -0
  103. data/lib/ruby_app/elements/pages/authentication/open_id/sreg_authentication_page.rb +52 -0
  104. data/lib/ruby_app/elements/pages/authentication/open_id/yahoo_authentication_page.rb +30 -0
  105. data/lib/ruby_app/elements/pages/base/base_blank_page.css.haml +18 -0
  106. data/lib/ruby_app/elements/pages/base/base_blank_page.html.haml +11 -0
  107. data/lib/ruby_app/elements/pages/base/base_blank_page.js.haml +3 -0
  108. data/lib/ruby_app/elements/pages/base/base_blank_page.rb +36 -0
  109. data/lib/ruby_app/elements/pages/blank_page.rb +22 -0
  110. data/lib/ruby_app/elements/pages/default_page.css.haml +2 -0
  111. data/lib/ruby_app/elements/pages/default_page.html.haml +5 -0
  112. data/lib/ruby_app/elements/pages/default_page.js.haml +2 -0
  113. data/lib/ruby_app/elements/pages/default_page.rb +34 -0
  114. data/lib/ruby_app/elements/pages/exception_page.html.haml +8 -0
  115. data/lib/ruby_app/elements/pages/exception_page.rb +23 -0
  116. data/lib/ruby_app/elements/pages/quit_page.html.haml +5 -0
  117. data/lib/ruby_app/elements/pages/quit_page.rb +24 -0
  118. data/lib/ruby_app/elements/pages/settings_page.css.haml +2 -0
  119. data/lib/ruby_app/elements/pages/settings_page.html.haml +5 -0
  120. data/lib/ruby_app/elements/pages/settings_page.js.haml +2 -0
  121. data/lib/ruby_app/elements/pages/settings_page.rb +37 -0
  122. data/lib/ruby_app/elements/pages/test_pages/default_test_page.css.haml +4 -0
  123. data/lib/ruby_app/elements/pages/test_pages/default_test_page.html.haml +5 -0
  124. data/lib/ruby_app/elements/pages/test_pages/default_test_page.js.haml +4 -0
  125. data/lib/ruby_app/elements/pages/test_pages/default_test_page.rb +55 -0
  126. data/lib/ruby_app/elements/pages/test_pages/dialog_test_page.css.haml +7 -0
  127. data/lib/ruby_app/elements/pages/test_pages/dialog_test_page.html.haml +5 -0
  128. data/lib/ruby_app/elements/pages/test_pages/dialog_test_page.js.haml +7 -0
  129. data/lib/ruby_app/elements/pages/test_pages/dialog_test_page.rb +66 -0
  130. data/lib/ruby_app/elements/pages/test_pages/input_test_page.css.haml +4 -0
  131. data/lib/ruby_app/elements/pages/test_pages/input_test_page.html.haml +9 -0
  132. data/lib/ruby_app/elements/pages/test_pages/input_test_page.js.haml +4 -0
  133. data/lib/ruby_app/elements/pages/test_pages/input_test_page.rb +44 -0
  134. data/lib/ruby_app/elements/pages/test_pages/list_test_page.css.haml +4 -0
  135. data/lib/ruby_app/elements/pages/test_pages/list_test_page.html.haml +6 -0
  136. data/lib/ruby_app/elements/pages/test_pages/list_test_page.js.haml +4 -0
  137. data/lib/ruby_app/elements/pages/test_pages/list_test_page.rb +51 -0
  138. data/lib/ruby_app/language.rb +44 -0
  139. data/lib/ruby_app/log.rb +33 -0
  140. data/lib/ruby_app/mixins/configuration.rb +31 -0
  141. data/lib/ruby_app/mixins/delegate.rb +15 -0
  142. data/lib/ruby_app/mixins/hash.rb +19 -0
  143. data/lib/ruby_app/mixins/render.rb +76 -0
  144. data/lib/ruby_app/mixins/route.rb +39 -0
  145. data/lib/ruby_app/mixins/template.rb +38 -0
  146. data/lib/ruby_app/mixins/translate.rb +35 -0
  147. data/lib/ruby_app/rack/application.rb +24 -0
  148. data/lib/ruby_app/rack/route.rb +128 -0
  149. data/lib/ruby_app/request.rb +54 -0
  150. data/lib/ruby_app/resources/elements/dialogs/base/base_busy_dialog.gif +0 -0
  151. data/lib/ruby_app/resources/favicon.ico +0 -0
  152. data/lib/ruby_app/resources/themes/mobile/base/base_page/icon.png +0 -0
  153. data/lib/ruby_app/resources/themes/mobile/base/base_page/icon.psd +0 -0
  154. data/lib/ruby_app/resources/themes/mobile/base/base_page/manifest +0 -0
  155. data/lib/ruby_app/resources/themes/mobile/base/base_page/start.png +0 -0
  156. data/lib/ruby_app/resources/themes/mobile/base/base_page/start.psd +0 -0
  157. data/lib/ruby_app/resources/themes/mobile/lists/select.png +0 -0
  158. data/lib/ruby_app/resources/themes/mobile/lists/select.psd +0 -0
  159. data/lib/ruby_app/session.rb +101 -0
  160. data/lib/ruby_app/templates/application/Gemfile +3 -0
  161. data/lib/ruby_app/templates/application/config.ru +42 -0
  162. data/lib/ruby_app/templates/application/config.yml +1 -0
  163. data/lib/ruby_app/templates/application/console.rb +16 -0
  164. data/lib/ruby_app/templates/application/lib/_APPLICATION_DOWNCODE_/application.rb +16 -0
  165. data/lib/ruby_app/templates/application/lib/_APPLICATION_DOWNCODE_/elements/pages/default_page.css.haml +9 -0
  166. data/lib/ruby_app/templates/application/lib/_APPLICATION_DOWNCODE_/elements/pages/default_page.html.haml +7 -0
  167. data/lib/ruby_app/templates/application/lib/_APPLICATION_DOWNCODE_/elements/pages/default_page.rb +26 -0
  168. data/lib/ruby_app/templates/application/lib/_APPLICATION_DOWNCODE_/session.rb +17 -0
  169. data/lib/ruby_app/templates/application/lib/_APPLICATION_DOWNCODE_/version.rb +4 -0
  170. data/lib/ruby_app/templates/application/spec/spec_helper.rb +1 -0
  171. data/lib/ruby_app/templates/application/spec/support/shared.rb +18 -0
  172. data/lib/ruby_app/templates/application/translations/en.yml +5 -0
  173. data/lib/ruby_app/templates/page/_PAGE_DOWNCODE_.css.haml +3 -0
  174. data/lib/ruby_app/templates/page/_PAGE_DOWNCODE_.html.haml +4 -0
  175. data/lib/ruby_app/templates/page/_PAGE_DOWNCODE_.js.haml +3 -0
  176. data/lib/ruby_app/templates/page/_PAGE_DOWNCODE_.rb +14 -0
  177. data/lib/ruby_app/themes/mobile.rb +37 -0
  178. data/lib/ruby_app/themes/mobile/base/base_page.html.haml +30 -0
  179. data/lib/ruby_app/themes/mobile/calendars/month.css.haml +21 -0
  180. data/lib/ruby_app/themes/mobile/colors.sass +24 -0
  181. data/lib/ruby_app/themes/mobile/dialog.css.haml +17 -0
  182. data/lib/ruby_app/themes/mobile/dialogs/blank_dialog.css.haml +12 -0
  183. data/lib/ruby_app/themes/mobile/dialogs/busy_dialog.css.haml +9 -0
  184. data/lib/ruby_app/themes/mobile/dialogs/close_dialog.css.haml +12 -0
  185. data/lib/ruby_app/themes/mobile/dialogs/yes_no_dialog.css.haml +14 -0
  186. data/lib/ruby_app/themes/mobile/list.css.haml +25 -0
  187. data/lib/ruby_app/themes/mobile/lists/select.css.haml +27 -0
  188. data/lib/ruby_app/themes/mobile/markdown.css.haml +11 -0
  189. data/lib/ruby_app/themes/mobile/navigation/base/base_breadcrumbs.html.haml +7 -0
  190. data/lib/ruby_app/themes/mobile/page.css.haml +18 -0
  191. data/lib/ruby_app/themes/mobile/pages/base/base_blank_page.css.haml +18 -0
  192. data/lib/ruby_app/themes/mobile/pages/base/base_blank_page.html.haml +13 -0
  193. data/lib/ruby_app/themes/mobile/pages/blank_page.css.haml +19 -0
  194. data/lib/ruby_app/translations/en.yml +125 -0
  195. data/lib/ruby_app/version.rb +4 -0
  196. data/rakefile +62 -0
  197. data/ruby_app.gemspec +40 -0
  198. data/spec/element_spec.rb +22 -0
  199. data/spec/elements/navigation/breadcrumbs_spec.rb +69 -0
  200. data/spec/elements/page_spec.rb +31 -0
  201. data/spec/mixins/render_spec.rb +182 -0
  202. data/spec/mixins/route_spec.rb +60 -0
  203. data/spec/mixins/template_spec.rb +78 -0
  204. data/spec/mixins/test_a.css.haml +3 -0
  205. data/spec/mixins/test_a.html.haml +3 -0
  206. data/spec/mixins/test_a.js.haml +3 -0
  207. data/spec/mixins/test_b.css.haml +4 -0
  208. data/spec/mixins/test_b.html.haml +3 -0
  209. data/spec/mixins/test_b.js.haml +4 -0
  210. data/spec/mixins/test_c.css.haml +4 -0
  211. data/spec/mixins/test_c.html.haml +2 -0
  212. data/spec/mixins/test_c.js.haml +4 -0
  213. data/spec/mixins/test_e.html.haml +2 -0
  214. data/spec/mixins/test_f.html.haml +2 -0
  215. data/spec/mixins/test_g.css.haml +4 -0
  216. data/spec/spec_helper.rb +1 -0
  217. data/spec/support/shared.rb +15 -0
  218. metadata +654 -0
@@ -0,0 +1,12 @@
1
+ require 'capybara'
2
+ require 'capybara/cucumber'
3
+ require 'capybara/dsl'
4
+
5
+ Capybara.register_driver :chrome do |app|
6
+ Capybara::Selenium::Driver.new(app, :browser => :chrome)
7
+ end
8
+
9
+ Capybara.default_driver = :chrome
10
+ Capybara.app_host = 'http://localhost:8008'
11
+
12
+ World(Capybara)
@@ -0,0 +1 @@
1
+ require "ruby_app/version"
@@ -0,0 +1,72 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'fileutils'
5
+
6
+ module RubyApp
7
+ require 'ruby_app/configuration'
8
+ require 'ruby_app/language'
9
+ require 'ruby_app/log'
10
+ require 'ruby_app/mixins/configuration'
11
+ require 'ruby_app/mixins/delegate'
12
+ require 'ruby_app/request'
13
+ require 'ruby_app/session'
14
+ require 'ruby_app/version'
15
+
16
+ class Application
17
+ extend RubyApp::Mixins::Delegate
18
+ extend RubyApp::Mixins::Configuration
19
+ include RubyApp::Mixins::Configuration
20
+
21
+ attr_reader :options
22
+
23
+ def initialize(options)
24
+ @options = options
25
+ @environment = {}
26
+
27
+ RubyApp::Log.open(@options[:log_path])
28
+ RubyApp::Configuration.load(@options[:configuration_paths])
29
+
30
+ end
31
+
32
+ def execute(environment = nil)
33
+ _environment = environment || @environment
34
+ RubyApp::Request.create(_environment) do |request|
35
+ RubyApp::Language.load(RubyApp::Request.language || @options[:default_language], @options[:translations_paths]) do |language|
36
+ RubyApp::Session.create(@options[:session_class]) do |session|
37
+ Thread.current[:_rendered] = {}
38
+ begin
39
+ return yield
40
+ ensure
41
+ Thread.current[:_rendered] = nil
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ def self.get
49
+ @@_application
50
+ end
51
+
52
+ def self.create(options = {})
53
+ _options = { :application_class => RubyApp::Application,
54
+ :session_class => RubyApp::Session,
55
+ :log_path => File.join(RubyApp::ROOT, %w[log application.log]),
56
+ :configuration_paths => [],
57
+ :default_language => :en,
58
+ :translations_paths => [] }.merge(options)
59
+ _options[:configuration_paths] = [File.join(RubyApp::ROOT, %w[config.yml])] + ( _options[:configuration_paths].is_a?(Array) ? _options[:configuration_paths] : [_options[:configuration_paths]] )
60
+ _options[:translations_paths] = [File.join(RubyApp::ROOT, %w[translations])] + ( _options[:translations_paths].is_a?(Array) ? _options[:translations_paths] : [_options[:translations_paths]] )
61
+ @@_application = _options[:application_class].new(_options)
62
+ end
63
+
64
+ def self.destroy
65
+ RubyApp::Configuration.unload
66
+ RubyApp::Log.close
67
+ @@_application = nil
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,27 @@
1
+ #\ --warn --port 8008 --pid ./rack.pid
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+
5
+ require 'rack'
6
+
7
+ require 'ruby_app/rack/application'
8
+ require 'ruby_app/rack/route'
9
+ require 'ruby_app/version'
10
+
11
+ use Rack::ShowExceptions
12
+ use Rack::Session::Pool
13
+ use Rack::Reloader
14
+ use Rack::ContentLength
15
+
16
+ map '/favicon.ico' do
17
+ run Rack::File.new(File.join(RubyApp::ROOT, %w[resources favicon.ico]))
18
+ end
19
+
20
+ map '/ruby_app/resources' do
21
+ run Rack::File.new(File.join(RubyApp::ROOT, %w[resources]))
22
+ end
23
+
24
+ map '/' do
25
+ use RubyApp::Rack::Application
26
+ run RubyApp::Rack::Route.new
27
+ end
@@ -0,0 +1,15 @@
1
+ ruby_app:
2
+ elements:
3
+ pages:
4
+ authentication:
5
+ open_id:
6
+ google_authentication_page:
7
+ identifier: https://www.google.com/accounts/o8/id
8
+ attributes:
9
+ email: http://schema.openid.net/contact/email
10
+ my_open_id_authentication_page:
11
+ identifier: http://myopenid.com
12
+ yahoo_authentication_page:
13
+ identifier: https://www.yahoo.com
14
+ attributes:
15
+ email: http://axschema.org/contact/email
@@ -0,0 +1,44 @@
1
+ require 'yaml'
2
+
3
+ module RubyApp
4
+ require 'ruby_app/log'
5
+ require 'ruby_app/mixins/delegate'
6
+ require 'ruby_app/mixins/hash'
7
+
8
+ class Configuration
9
+ extend RubyApp::Mixins::Delegate
10
+
11
+ attr_reader :document
12
+
13
+ def self.get
14
+ @@_configuration
15
+ end
16
+
17
+ def self.load(configuration_paths)
18
+ @@_configuration = RubyApp::Configuration.new(configuration_paths)
19
+ end
20
+
21
+ def self.unload
22
+ @@_configuration = nil
23
+ end
24
+
25
+ private
26
+
27
+ def initialize(configuration_paths)
28
+
29
+ @document = {}
30
+
31
+ configuration_paths.each do |path|
32
+ RubyApp::Log.debug("#{self.class}##{__method__}(...) path=#{path.inspect}")
33
+ @document.merge!(YAML::load(File.open(path)))
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ class Hash
43
+ include RubyApp::Mixins::Hash
44
+ end
@@ -0,0 +1,120 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'haml'
5
+ require 'json'
6
+ require 'ruby-event'
7
+
8
+ module RubyApp
9
+ require 'ruby_app/mixins/configuration'
10
+ require 'ruby_app/mixins/render'
11
+ require 'ruby_app/mixins/template'
12
+ require 'ruby_app/mixins/translate'
13
+
14
+ class Element
15
+ extend RubyApp::Mixins::Configuration
16
+ include RubyApp::Mixins::Configuration
17
+ extend RubyApp::Mixins::Translate
18
+ include RubyApp::Mixins::Translate
19
+ extend RubyApp::Mixins::Template
20
+ include Haml::Helpers
21
+ extend Haml::Helpers
22
+ extend RubyApp::Mixins::Render
23
+ include RubyApp::Mixins::Render
24
+
25
+ class Event
26
+
27
+ attr_reader :source
28
+
29
+ def initialize(data = nil)
30
+ @source = data ? RubyApp::Element.get_element(data['source_id']) : nil
31
+ @statements = []
32
+ end
33
+
34
+ def alert(message)
35
+ execute("RubyApp.alert(#{message.to_json});")
36
+ end
37
+
38
+ def refresh
39
+ execute("RubyApp.refresh();")
40
+ end
41
+
42
+ def show(dialog)
43
+ execute("RubyApp.show('#{dialog.element_id}');")
44
+ end
45
+
46
+ def hide(dialog)
47
+ execute("RubyApp.hide('#{dialog.element_id}');")
48
+ end
49
+
50
+ def update_element(element)
51
+ execute("RubyApp.updateElement('#{element.element_id}');")
52
+ end
53
+
54
+ def update_text(selector, value)
55
+ execute("RubyApp.updateText(#{selector.to_json}, #{value.to_json});")
56
+ end
57
+
58
+ def update_value(selector, value)
59
+ execute("RubyApp.updateValue(#{selector.to_json}, #{value.to_json});")
60
+ end
61
+
62
+ def go(url)
63
+ execute("RubyApp.go('#{url}');")
64
+ end
65
+
66
+ def execute(statement)
67
+ @statements << statement
68
+ end
69
+
70
+ def self.from_hash(data)
71
+ eval(data['_class']).new(data)
72
+ end
73
+
74
+ def to_hash
75
+ {
76
+ '_class' => self.class.to_s,
77
+ 'source_id' => @source ? @source.element_id : nil,
78
+ 'statements' => @statements
79
+ }
80
+ end
81
+
82
+ end
83
+
84
+ class ExceptionEvent < RubyApp::Element::Event
85
+
86
+ def initialize(exception)
87
+ super()
88
+ self.alert(exception.message)
89
+ end
90
+
91
+ end
92
+
93
+ template_path(:all, File.dirname(__FILE__))
94
+
95
+ attr_reader :attributes
96
+
97
+ event :evented
98
+
99
+ def initialize
100
+ @attributes = {:id => element_id}
101
+ end
102
+
103
+ def element_id
104
+ "id_#{object_id}"
105
+ end
106
+
107
+ def self.get_element(element_id)
108
+ element_id =~ /(\d+)/
109
+ ObjectSpace._id2ref($1.to_i)
110
+ end
111
+
112
+ protected
113
+
114
+ def on_event(event)
115
+ evented(event)
116
+ end
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,9 @@
1
+ - self.rendered?(__FILE__) do
2
+ :sass
3
+ /* #{__FILE__}
4
+ body
5
+ > div.overlay
6
+ > div.dialog
7
+ position: absolute
8
+ width: 40%
9
+ = yield
@@ -0,0 +1,4 @@
1
+ /
2
+ #{__FILE__}
3
+ %div.dialog{attributes}
4
+ = yield :body
@@ -0,0 +1,64 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'ruby-event'
5
+
6
+ module RubyApp
7
+
8
+ module Elements
9
+
10
+ module Base
11
+ require 'ruby_app/element'
12
+
13
+ class BaseDialog < RubyApp::Element
14
+
15
+ class ShownEvent < RubyApp::Element::Event
16
+
17
+ def initialize(data)
18
+ super(data)
19
+ end
20
+
21
+ end
22
+
23
+ class HiddenEvent < RubyApp::Element::Event
24
+
25
+ def initialize(data)
26
+ super(data)
27
+ end
28
+
29
+ end
30
+
31
+ template_path(:all, File.dirname(__FILE__))
32
+
33
+ attr_reader :response
34
+
35
+ event :shown
36
+ event :hidden
37
+
38
+ def initialize
39
+ super
40
+ end
41
+
42
+ protected
43
+
44
+ def on_event(event)
45
+ on_shown(event) if event.is_a?(RubyApp::Elements::Base::BaseDialog::ShownEvent)
46
+ on_hidden(event) if event.is_a?(RubyApp::Elements::Base::BaseDialog::HiddenEvent)
47
+ super(event)
48
+ end
49
+
50
+ def on_shown(event)
51
+ shown(event)
52
+ end
53
+
54
+ def on_hidden(event)
55
+ hidden(event)
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,13 @@
1
+ - self.rendered?(__FILE__) do
2
+ :sass
3
+ /* #{__FILE__}
4
+ body
5
+ > div.overlay
6
+ display: none
7
+ height: 100%
8
+ left: 0px
9
+ position: absolute
10
+ top: 0px
11
+ width: 100%
12
+ z-index: 1
13
+ = yield
@@ -0,0 +1,20 @@
1
+ /
2
+ #{__FILE__}
3
+ !!! 5
4
+ %html{attributes}
5
+ %head
6
+ %link{:rel => 'stylesheet',
7
+ :href => "/#{RubyApp::Language.locale.code}/application.css",
8
+ :type => 'text/css',
9
+ :media => 'screen, mobile',
10
+ :title => 'main', :charset=>'utf-8'}
11
+ %script{:src => 'http://code.jquery.com/jquery-1.6.1.js',
12
+ :type => 'text/javascript'}
13
+ %script{:src => "/#{RubyApp::Language.locale.code}/application.js",
14
+ :type => 'text/javascript'}
15
+ %title
16
+ = yield(:title) || self.translate.title
17
+ %body
18
+ %div.body
19
+ = yield :body
20
+ %div.overlay
@@ -0,0 +1,97 @@
1
+ - self.rendered?(__FILE__) do
2
+ :plain
3
+ // #{__FILE__}
4
+ var RubyApp = new function() {
5
+ this.translation = {code:'#{RubyApp::Language.locale.code}', title:'#{RubyApp::Language.locale.title}'},
6
+ this.interval = #{self.interval * 1000};
7
+ this._interval = 0;
8
+ this.sendEvent = function(event) {
9
+ response = $.post(location.href, event);
10
+ response
11
+ .success( function(event) {
12
+ $.each(event.statements, function(index, statement) {
13
+ eval(statement);
14
+ } );
15
+ } )
16
+ },
17
+ this.alert = function(message) {
18
+ alert(message);
19
+ },
20
+ this.refresh = function() {
21
+ location.assign(location.pathname);
22
+ },
23
+ this.go = function(url) {
24
+ location.assign(url);
25
+ },
26
+ this.show = function(id) {
27
+ response = $.get('/#{RubyApp::Language.locale.code}/elements/' + id + '.html');
28
+ response
29
+ .success( function(dialog) {
30
+ var overlay = $('body div.overlay');
31
+ overlay.append(dialog);
32
+ overlay.show();
33
+ centerOverlay = function() {
34
+ var overlay = $('body div.overlay');
35
+ var _document = $(document);
36
+ overlay.css('width', '0px');
37
+ overlay.css('height', '0px');
38
+ overlay.css('width', _document.width() + 'px');
39
+ overlay.css('height', _document.height() + 'px');
40
+ };
41
+ centerDialog = function(id) {
42
+ var dialog = $('#'+id);
43
+ var _window = $(window);
44
+ dialog.css('top', _window.scrollTop() + (_window.height() - dialog.outerHeight(true)) / 2 + 'px');
45
+ dialog.css('left', _window.scrollLeft() + (_window.width() - dialog.outerWidth(true)) / 2 + 'px');
46
+ };
47
+ centerOverlay();
48
+ centerDialog(id);
49
+ $(window).bind('resize', function() {
50
+ centerOverlay();
51
+ centerDialog(id);
52
+ } );
53
+ $(window).bind('scroll', function() {
54
+ centerDialog(id);
55
+ } );
56
+ RubyApp.sendEvent({_class:'RubyApp::Elements::Dialog::ShownEvent', source_id:id});
57
+ } );
58
+ },
59
+ this.hide = function(id) {
60
+ $(window).unbind('scroll');
61
+ $(window).unbind('resize');
62
+ $('body div.overlay').hide();
63
+ $('#'+id).remove();
64
+ RubyApp.sendEvent({_class:'RubyApp::Elements::Dialog::HiddenEvent', source_id:id});
65
+ },
66
+ this.updateElement = function(id) {
67
+ response = $.get('/#{RubyApp::Language.locale.code}/elements/' + id + '.html');
68
+ response
69
+ .success( function(content) {
70
+ $('#'+id).replaceWith(content);
71
+ } );
72
+ },
73
+ this.updateText = function(selector, value) {
74
+ $(selector).text(value);
75
+ },
76
+ this.updateValue = function(selector, value) {
77
+ $(selector).val(value);
78
+ }
79
+ };
80
+
81
+ $(window).load(function() {
82
+ RubyApp.sendEvent({_class:'RubyApp::Elements::Page::LoadedEvent', source_id:$('html').attr('id')});
83
+ if ( RubyApp.interval > 0 ) {
84
+ RubyApp._interval = window.setInterval(function() {
85
+ RubyApp.sendEvent({_class:'RubyApp::Elements::Page::TriggeredEvent', source_id:$('html').attr('id')});
86
+ }, RubyApp.interval);
87
+ }
88
+ });
89
+
90
+ $(window).unload(function() {
91
+ if ( RubyApp.interval > 0 ) {
92
+ window.clearInterval(RubyApp._interval);
93
+ }
94
+ RubyApp.sendEvent({_class:'RubyApp::Elements::Page::ReleasedEvent', source_id:$('html').attr('id')});
95
+ });
96
+
97
+ = yield