tabulous 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (292) hide show
  1. data/.gitignore +5 -0
  2. data/CHANGELOG.rdoc +2 -0
  3. data/Gemfile +4 -0
  4. data/MIT-LICENSE +21 -0
  5. data/README.rdoc +85 -0
  6. data/Rakefile +54 -0
  7. data/lib/generators/tabs/USAGE +1 -0
  8. data/lib/generators/tabs/tabs_generator.rb +13 -0
  9. data/lib/generators/tabs/templates/tabulous.rb +170 -0
  10. data/lib/tabulous.rb +11 -0
  11. data/lib/tabulous/css_scaffolding.rb +111 -0
  12. data/lib/tabulous/errors.rb +16 -0
  13. data/lib/tabulous/formatter.rb +278 -0
  14. data/lib/tabulous/helpers.rb +13 -0
  15. data/lib/tabulous/options.rb +37 -0
  16. data/lib/tabulous/railtie.rb +23 -0
  17. data/lib/tabulous/tab.rb +79 -0
  18. data/lib/tabulous/tabulous.rb +162 -0
  19. data/lib/tabulous/version.rb +3 -0
  20. data/lib/tasks/tabulous.rake +11 -0
  21. data/tabulous.gemspec +30 -0
  22. data/test/applications/main/.gitignore +3 -0
  23. data/test/applications/main/Gemfile +7 -0
  24. data/test/applications/main/Rakefile +7 -0
  25. data/test/applications/main/app/controllers/application_controller.rb +3 -0
  26. data/test/applications/main/app/controllers/galaxies_controller.rb +83 -0
  27. data/test/applications/main/app/controllers/home_controller.rb +4 -0
  28. data/test/applications/main/app/controllers/planets_controller.rb +83 -0
  29. data/test/applications/main/app/controllers/stars_controller.rb +83 -0
  30. data/test/applications/main/app/controllers/subtabs_controller.rb +8 -0
  31. data/test/applications/main/app/helpers/application_helper.rb +2 -0
  32. data/test/applications/main/app/helpers/galaxies_helper.rb +2 -0
  33. data/test/applications/main/app/helpers/planets_helper.rb +2 -0
  34. data/test/applications/main/app/helpers/stars_helper.rb +2 -0
  35. data/test/applications/main/app/models/galaxy.rb +2 -0
  36. data/test/applications/main/app/models/planet.rb +2 -0
  37. data/test/applications/main/app/models/star.rb +2 -0
  38. data/test/applications/main/app/views/galaxies/_form.html.erb +21 -0
  39. data/test/applications/main/app/views/galaxies/edit.html.erb +6 -0
  40. data/test/applications/main/app/views/galaxies/index.html.erb +23 -0
  41. data/test/applications/main/app/views/galaxies/new.html.erb +5 -0
  42. data/test/applications/main/app/views/galaxies/show.html.erb +10 -0
  43. data/test/applications/main/app/views/home/index.html.erb +3 -0
  44. data/test/applications/main/app/views/layouts/application.html.erb +16 -0
  45. data/test/applications/main/app/views/planets/_form.html.erb +21 -0
  46. data/test/applications/main/app/views/planets/edit.html.erb +6 -0
  47. data/test/applications/main/app/views/planets/index.html.erb +23 -0
  48. data/test/applications/main/app/views/planets/new.html.erb +5 -0
  49. data/test/applications/main/app/views/planets/show.html.erb +10 -0
  50. data/test/applications/main/app/views/stars/_form.html.erb +21 -0
  51. data/test/applications/main/app/views/stars/edit.html.erb +6 -0
  52. data/test/applications/main/app/views/stars/index.html.erb +23 -0
  53. data/test/applications/main/app/views/stars/new.html.erb +5 -0
  54. data/test/applications/main/app/views/stars/show.html.erb +10 -0
  55. data/test/applications/main/app/views/subtabs/one.html.erb +1 -0
  56. data/test/applications/main/app/views/subtabs/three.html.erb +1 -0
  57. data/test/applications/main/app/views/subtabs/two.html.erb +1 -0
  58. data/test/applications/main/config.ru +4 -0
  59. data/test/applications/main/config/application.rb +42 -0
  60. data/test/applications/main/config/boot.rb +13 -0
  61. data/test/applications/main/config/database.yml +22 -0
  62. data/test/applications/main/config/environment.rb +5 -0
  63. data/test/applications/main/config/environments/development.rb +26 -0
  64. data/test/applications/main/config/environments/production.rb +49 -0
  65. data/test/applications/main/config/environments/test.rb +35 -0
  66. data/test/applications/main/config/initializers/backtrace_silencers.rb +7 -0
  67. data/test/applications/main/config/initializers/inflections.rb +10 -0
  68. data/test/applications/main/config/initializers/mime_types.rb +5 -0
  69. data/test/applications/main/config/initializers/secret_token.rb +7 -0
  70. data/test/applications/main/config/initializers/session_store.rb +8 -0
  71. data/test/applications/main/config/initializers/tabulous.rb +156 -0
  72. data/test/applications/main/config/locales/en.yml +5 -0
  73. data/test/applications/main/config/routes.rb +69 -0
  74. data/test/applications/main/db/development.sqlite3 +0 -0
  75. data/test/applications/main/db/migrate/20110223232547_create_galaxies.rb +13 -0
  76. data/test/applications/main/db/migrate/20110223232552_create_stars.rb +13 -0
  77. data/test/applications/main/db/migrate/20110223232557_create_planets.rb +13 -0
  78. data/test/applications/main/db/production.sqlite3 +0 -0
  79. data/test/applications/main/db/schema.rb +33 -0
  80. data/test/applications/main/db/test.sqlite3 +0 -0
  81. data/test/applications/main/public/404.html +26 -0
  82. data/test/applications/main/public/422.html +26 -0
  83. data/test/applications/main/public/500.html +26 -0
  84. data/test/applications/main/public/favicon.ico +0 -0
  85. data/test/applications/main/public/javascripts/application.js +2 -0
  86. data/test/applications/main/public/javascripts/controls.js +965 -0
  87. data/test/applications/main/public/javascripts/dragdrop.js +974 -0
  88. data/test/applications/main/public/javascripts/effects.js +1123 -0
  89. data/test/applications/main/public/javascripts/prototype.js +6001 -0
  90. data/test/applications/main/public/javascripts/rails.js +175 -0
  91. data/test/applications/main/public/stylesheets/.gitkeep +0 -0
  92. data/test/applications/main/script/rails +6 -0
  93. data/test/applications/main/test/integration/actions_test.rb +79 -0
  94. data/test/applications/main/test/integration/active_tab_clickable_test.rb +86 -0
  95. data/test/applications/main/test/integration/always_render_subtabs_test.rb +84 -0
  96. data/test/applications/main/test/integration/css_no_scaffolding_test.rb +57 -0
  97. data/test/applications/main/test/integration/css_scaffolding_test.rb +67 -0
  98. data/test/applications/main/test/integration/display_text_test.rb +73 -0
  99. data/test/applications/main/test/integration/enabled_test.rb +80 -0
  100. data/test/applications/main/test/integration/html5_test.rb +64 -0
  101. data/test/applications/main/test/integration/main_tabs_test.rb +10 -0
  102. data/test/applications/main/test/integration/path_test.rb +81 -0
  103. data/test/applications/main/test/integration/visible_test.rb +80 -0
  104. data/test/applications/main/test/integration_test_helper.rb +6 -0
  105. data/test/applications/main/test/test_helper.rb +8 -0
  106. data/test/applications/main/test/unit/tabs_generator_test.rb +14 -0
  107. data/test/applications/simple_tabs/.gitignore +3 -0
  108. data/test/applications/simple_tabs/Gemfile +7 -0
  109. data/test/applications/simple_tabs/Rakefile +7 -0
  110. data/test/applications/simple_tabs/app/controllers/application_controller.rb +3 -0
  111. data/test/applications/simple_tabs/app/controllers/galaxies_controller.rb +83 -0
  112. data/test/applications/simple_tabs/app/controllers/home_controller.rb +4 -0
  113. data/test/applications/simple_tabs/app/controllers/planets_controller.rb +83 -0
  114. data/test/applications/simple_tabs/app/controllers/stars_controller.rb +83 -0
  115. data/test/applications/simple_tabs/app/helpers/application_helper.rb +2 -0
  116. data/test/applications/simple_tabs/app/helpers/galaxies_helper.rb +2 -0
  117. data/test/applications/simple_tabs/app/helpers/planets_helper.rb +2 -0
  118. data/test/applications/simple_tabs/app/helpers/stars_helper.rb +2 -0
  119. data/test/applications/simple_tabs/app/models/galaxy.rb +2 -0
  120. data/test/applications/simple_tabs/app/models/planet.rb +2 -0
  121. data/test/applications/simple_tabs/app/models/star.rb +2 -0
  122. data/test/applications/simple_tabs/app/views/galaxies/_form.html.erb +21 -0
  123. data/test/applications/simple_tabs/app/views/galaxies/edit.html.erb +6 -0
  124. data/test/applications/simple_tabs/app/views/galaxies/index.html.erb +23 -0
  125. data/test/applications/simple_tabs/app/views/galaxies/new.html.erb +5 -0
  126. data/test/applications/simple_tabs/app/views/galaxies/show.html.erb +10 -0
  127. data/test/applications/simple_tabs/app/views/home/index.html.erb +4 -0
  128. data/test/applications/simple_tabs/app/views/layouts/application.html.erb +16 -0
  129. data/test/applications/simple_tabs/app/views/planets/_form.html.erb +21 -0
  130. data/test/applications/simple_tabs/app/views/planets/edit.html.erb +6 -0
  131. data/test/applications/simple_tabs/app/views/planets/index.html.erb +23 -0
  132. data/test/applications/simple_tabs/app/views/planets/new.html.erb +5 -0
  133. data/test/applications/simple_tabs/app/views/planets/show.html.erb +10 -0
  134. data/test/applications/simple_tabs/app/views/stars/_form.html.erb +21 -0
  135. data/test/applications/simple_tabs/app/views/stars/edit.html.erb +6 -0
  136. data/test/applications/simple_tabs/app/views/stars/index.html.erb +23 -0
  137. data/test/applications/simple_tabs/app/views/stars/new.html.erb +5 -0
  138. data/test/applications/simple_tabs/app/views/stars/show.html.erb +10 -0
  139. data/test/applications/simple_tabs/config.ru +4 -0
  140. data/test/applications/simple_tabs/config/application.rb +42 -0
  141. data/test/applications/simple_tabs/config/boot.rb +13 -0
  142. data/test/applications/simple_tabs/config/database.yml +22 -0
  143. data/test/applications/simple_tabs/config/environment.rb +5 -0
  144. data/test/applications/simple_tabs/config/environments/development.rb +26 -0
  145. data/test/applications/simple_tabs/config/environments/production.rb +49 -0
  146. data/test/applications/simple_tabs/config/environments/test.rb +35 -0
  147. data/test/applications/simple_tabs/config/initializers/backtrace_silencers.rb +7 -0
  148. data/test/applications/simple_tabs/config/initializers/inflections.rb +10 -0
  149. data/test/applications/simple_tabs/config/initializers/mime_types.rb +5 -0
  150. data/test/applications/simple_tabs/config/initializers/secret_token.rb +7 -0
  151. data/test/applications/simple_tabs/config/initializers/session_store.rb +8 -0
  152. data/test/applications/simple_tabs/config/initializers/tabulous.rb +149 -0
  153. data/test/applications/simple_tabs/config/locales/en.yml +5 -0
  154. data/test/applications/simple_tabs/config/routes.rb +65 -0
  155. data/test/applications/simple_tabs/db/development.sqlite3 +0 -0
  156. data/test/applications/simple_tabs/db/migrate/20110220170240_create_galaxies.rb +13 -0
  157. data/test/applications/simple_tabs/db/migrate/20110220170245_create_stars.rb +13 -0
  158. data/test/applications/simple_tabs/db/migrate/20110220170250_create_planets.rb +13 -0
  159. data/test/applications/simple_tabs/db/production.sqlite3 +0 -0
  160. data/test/applications/simple_tabs/db/schema.rb +33 -0
  161. data/test/applications/simple_tabs/db/test.sqlite3 +0 -0
  162. data/test/applications/simple_tabs/public/404.html +26 -0
  163. data/test/applications/simple_tabs/public/422.html +26 -0
  164. data/test/applications/simple_tabs/public/500.html +26 -0
  165. data/test/applications/simple_tabs/public/favicon.ico +0 -0
  166. data/test/applications/simple_tabs/public/javascripts/application.js +2 -0
  167. data/test/applications/simple_tabs/public/javascripts/controls.js +965 -0
  168. data/test/applications/simple_tabs/public/javascripts/dragdrop.js +974 -0
  169. data/test/applications/simple_tabs/public/javascripts/effects.js +1123 -0
  170. data/test/applications/simple_tabs/public/javascripts/prototype.js +6001 -0
  171. data/test/applications/simple_tabs/public/javascripts/rails.js +175 -0
  172. data/test/applications/simple_tabs/public/stylesheets/.gitkeep +0 -0
  173. data/test/applications/simple_tabs/script/rails +6 -0
  174. data/test/applications/simple_tabs/test/integration/simple_tabs_test.rb +34 -0
  175. data/test/applications/simple_tabs/test/integration_test_helper.rb +6 -0
  176. data/test/applications/simple_tabs/test/test_helper.rb +8 -0
  177. data/test/applications/subtabs/.gitignore +3 -0
  178. data/test/applications/subtabs/Gemfile +7 -0
  179. data/test/applications/subtabs/Rakefile +7 -0
  180. data/test/applications/subtabs/app/controllers/application_controller.rb +3 -0
  181. data/test/applications/subtabs/app/controllers/exoplanets_controller.rb +83 -0
  182. data/test/applications/subtabs/app/controllers/galaxies/elliptical_galaxies_controller.rb +85 -0
  183. data/test/applications/subtabs/app/controllers/galaxies/lenticular_galaxies_controller.rb +85 -0
  184. data/test/applications/subtabs/app/controllers/galaxies/spiral_galaxies_controller.rb +85 -0
  185. data/test/applications/subtabs/app/controllers/home_controller.rb +4 -0
  186. data/test/applications/subtabs/app/controllers/misc_controller.rb +15 -0
  187. data/test/applications/subtabs/app/controllers/rogue_planets_controller.rb +83 -0
  188. data/test/applications/subtabs/app/controllers/stars_controller.rb +83 -0
  189. data/test/applications/subtabs/app/helpers/application_helper.rb +2 -0
  190. data/test/applications/subtabs/app/helpers/elliptical_galaxies_helper.rb +2 -0
  191. data/test/applications/subtabs/app/helpers/exoplanets_helper.rb +2 -0
  192. data/test/applications/subtabs/app/helpers/lenticular_galaxies_helper.rb +2 -0
  193. data/test/applications/subtabs/app/helpers/rogue_planets_helper.rb +2 -0
  194. data/test/applications/subtabs/app/helpers/spiral_galaxies_helper.rb +2 -0
  195. data/test/applications/subtabs/app/helpers/stars_helper.rb +2 -0
  196. data/test/applications/subtabs/app/models/elliptical_galaxy.rb +2 -0
  197. data/test/applications/subtabs/app/models/exoplanet.rb +2 -0
  198. data/test/applications/subtabs/app/models/lenticular_galaxy.rb +2 -0
  199. data/test/applications/subtabs/app/models/rogue_planet.rb +2 -0
  200. data/test/applications/subtabs/app/models/spiral_galaxy.rb +2 -0
  201. data/test/applications/subtabs/app/models/star.rb +2 -0
  202. data/test/applications/subtabs/app/views/exoplanets/_form.html.erb +21 -0
  203. data/test/applications/subtabs/app/views/exoplanets/edit.html.erb +6 -0
  204. data/test/applications/subtabs/app/views/exoplanets/index.html.erb +23 -0
  205. data/test/applications/subtabs/app/views/exoplanets/new.html.erb +5 -0
  206. data/test/applications/subtabs/app/views/exoplanets/show.html.erb +10 -0
  207. data/test/applications/subtabs/app/views/galaxies/elliptical_galaxies/_form.html.erb +21 -0
  208. data/test/applications/subtabs/app/views/galaxies/elliptical_galaxies/edit.html.erb +6 -0
  209. data/test/applications/subtabs/app/views/galaxies/elliptical_galaxies/index.html.erb +23 -0
  210. data/test/applications/subtabs/app/views/galaxies/elliptical_galaxies/new.html.erb +5 -0
  211. data/test/applications/subtabs/app/views/galaxies/elliptical_galaxies/show.html.erb +10 -0
  212. data/test/applications/subtabs/app/views/galaxies/lenticular_galaxies/_form.html.erb +21 -0
  213. data/test/applications/subtabs/app/views/galaxies/lenticular_galaxies/edit.html.erb +6 -0
  214. data/test/applications/subtabs/app/views/galaxies/lenticular_galaxies/index.html.erb +23 -0
  215. data/test/applications/subtabs/app/views/galaxies/lenticular_galaxies/new.html.erb +5 -0
  216. data/test/applications/subtabs/app/views/galaxies/lenticular_galaxies/show.html.erb +10 -0
  217. data/test/applications/subtabs/app/views/galaxies/spiral_galaxies/_form.html.erb +21 -0
  218. data/test/applications/subtabs/app/views/galaxies/spiral_galaxies/edit.html.erb +6 -0
  219. data/test/applications/subtabs/app/views/galaxies/spiral_galaxies/index.html.erb +23 -0
  220. data/test/applications/subtabs/app/views/galaxies/spiral_galaxies/new.html.erb +5 -0
  221. data/test/applications/subtabs/app/views/galaxies/spiral_galaxies/show.html.erb +10 -0
  222. data/test/applications/subtabs/app/views/home/index.html.erb +14 -0
  223. data/test/applications/subtabs/app/views/layouts/application.html.erb +21 -0
  224. data/test/applications/subtabs/app/views/misc/always_enabled.html.erb +4 -0
  225. data/test/applications/subtabs/app/views/misc/always_visible.html.erb +4 -0
  226. data/test/applications/subtabs/app/views/rogue_planets/_form.html.erb +21 -0
  227. data/test/applications/subtabs/app/views/rogue_planets/edit.html.erb +6 -0
  228. data/test/applications/subtabs/app/views/rogue_planets/index.html.erb +23 -0
  229. data/test/applications/subtabs/app/views/rogue_planets/new.html.erb +5 -0
  230. data/test/applications/subtabs/app/views/rogue_planets/show.html.erb +10 -0
  231. data/test/applications/subtabs/app/views/stars/_form.html.erb +21 -0
  232. data/test/applications/subtabs/app/views/stars/edit.html.erb +6 -0
  233. data/test/applications/subtabs/app/views/stars/index.html.erb +23 -0
  234. data/test/applications/subtabs/app/views/stars/new.html.erb +5 -0
  235. data/test/applications/subtabs/app/views/stars/show.html.erb +10 -0
  236. data/test/applications/subtabs/config.ru +4 -0
  237. data/test/applications/subtabs/config/application.rb +42 -0
  238. data/test/applications/subtabs/config/boot.rb +13 -0
  239. data/test/applications/subtabs/config/database.yml +22 -0
  240. data/test/applications/subtabs/config/environment.rb +5 -0
  241. data/test/applications/subtabs/config/environments/development.rb +26 -0
  242. data/test/applications/subtabs/config/environments/production.rb +49 -0
  243. data/test/applications/subtabs/config/environments/test.rb +35 -0
  244. data/test/applications/subtabs/config/initializers/backtrace_silencers.rb +7 -0
  245. data/test/applications/subtabs/config/initializers/inflections.rb +10 -0
  246. data/test/applications/subtabs/config/initializers/mime_types.rb +5 -0
  247. data/test/applications/subtabs/config/initializers/secret_token.rb +7 -0
  248. data/test/applications/subtabs/config/initializers/session_store.rb +8 -0
  249. data/test/applications/subtabs/config/initializers/tabulous.rb +167 -0
  250. data/test/applications/subtabs/config/locales/en.yml +5 -0
  251. data/test/applications/subtabs/config/routes.rb +74 -0
  252. data/test/applications/subtabs/db/development.sqlite3 +0 -0
  253. data/test/applications/subtabs/db/migrate/20110223220628_create_galaxies.rb +13 -0
  254. data/test/applications/subtabs/db/migrate/20110223220634_create_stars.rb +13 -0
  255. data/test/applications/subtabs/db/migrate/20110223220640_create_planets.rb +13 -0
  256. data/test/applications/subtabs/db/migrate/20110226190125_create_rogue_planets.rb +13 -0
  257. data/test/applications/subtabs/db/migrate/20110226190131_create_exoplanets.rb +13 -0
  258. data/test/applications/subtabs/db/migrate/20110226190532_create_spiral_galaxies.rb +13 -0
  259. data/test/applications/subtabs/db/migrate/20110226190537_create_lenticular_galaxies.rb +13 -0
  260. data/test/applications/subtabs/db/migrate/20110226190543_create_elliptical_galaxies.rb +13 -0
  261. data/test/applications/subtabs/db/production.sqlite3 +0 -0
  262. data/test/applications/subtabs/db/schema.rb +63 -0
  263. data/test/applications/subtabs/db/test.sqlite3 +0 -0
  264. data/test/applications/subtabs/public/404.html +26 -0
  265. data/test/applications/subtabs/public/422.html +26 -0
  266. data/test/applications/subtabs/public/500.html +26 -0
  267. data/test/applications/subtabs/public/favicon.ico +0 -0
  268. data/test/applications/subtabs/public/javascripts/application.js +2 -0
  269. data/test/applications/subtabs/public/javascripts/controls.js +965 -0
  270. data/test/applications/subtabs/public/javascripts/dragdrop.js +974 -0
  271. data/test/applications/subtabs/public/javascripts/effects.js +1123 -0
  272. data/test/applications/subtabs/public/javascripts/prototype.js +6001 -0
  273. data/test/applications/subtabs/public/javascripts/rails.js +175 -0
  274. data/test/applications/subtabs/public/stylesheets/.gitkeep +0 -0
  275. data/test/applications/subtabs/public/stylesheets/application.css +49 -0
  276. data/test/applications/subtabs/public/stylesheets/reset.css +48 -0
  277. data/test/applications/subtabs/script/rails +6 -0
  278. data/test/applications/subtabs/test/integration/subtabs_test.rb +67 -0
  279. data/test/applications/subtabs/test/integration_test_helper.rb +6 -0
  280. data/test/applications/subtabs/test/test_helper.rb +8 -0
  281. data/test/test_application_gemfile.rb +14 -0
  282. data/test/test_application_integration_test_helper.rb +89 -0
  283. data/test/test_application_test_helper.rb +11 -0
  284. data/test/test_initializers/empty +0 -0
  285. data/test/test_initializers/expected +55 -0
  286. data/test/test_initializers/random_horizontal_whitespace +55 -0
  287. data/test/test_initializers/random_vertical_whitespace +102 -0
  288. data/test/test_initializers/text +144 -0
  289. data/test/test_initializers/trailing_comments +55 -0
  290. data/test/unit_test_helper.rb +13 -0
  291. data/test/units/tabulous_formatter_test.rb +69 -0
  292. metadata +466 -0
@@ -0,0 +1,175 @@
1
+ (function() {
2
+ // Technique from Juriy Zaytsev
3
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
4
+ function isEventSupported(eventName) {
5
+ var el = document.createElement('div');
6
+ eventName = 'on' + eventName;
7
+ var isSupported = (eventName in el);
8
+ if (!isSupported) {
9
+ el.setAttribute(eventName, 'return;');
10
+ isSupported = typeof el[eventName] == 'function';
11
+ }
12
+ el = null;
13
+ return isSupported;
14
+ }
15
+
16
+ function isForm(element) {
17
+ return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'
18
+ }
19
+
20
+ function isInput(element) {
21
+ if (Object.isElement(element)) {
22
+ var name = element.nodeName.toUpperCase()
23
+ return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'
24
+ }
25
+ else return false
26
+ }
27
+
28
+ var submitBubbles = isEventSupported('submit'),
29
+ changeBubbles = isEventSupported('change')
30
+
31
+ if (!submitBubbles || !changeBubbles) {
32
+ // augment the Event.Handler class to observe custom events when needed
33
+ Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap(
34
+ function(init, element, eventName, selector, callback) {
35
+ init(element, eventName, selector, callback)
36
+ // is the handler being attached to an element that doesn't support this event?
37
+ if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) ||
38
+ (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) {
39
+ // "submit" => "emulated:submit"
40
+ this.eventName = 'emulated:' + this.eventName
41
+ }
42
+ }
43
+ )
44
+ }
45
+
46
+ if (!submitBubbles) {
47
+ // discover forms on the page by observing focus events which always bubble
48
+ document.on('focusin', 'form', function(focusEvent, form) {
49
+ // special handler for the real "submit" event (one-time operation)
50
+ if (!form.retrieve('emulated:submit')) {
51
+ form.on('submit', function(submitEvent) {
52
+ var emulated = form.fire('emulated:submit', submitEvent, true)
53
+ // if custom event received preventDefault, cancel the real one too
54
+ if (emulated.returnValue === false) submitEvent.preventDefault()
55
+ })
56
+ form.store('emulated:submit', true)
57
+ }
58
+ })
59
+ }
60
+
61
+ if (!changeBubbles) {
62
+ // discover form inputs on the page
63
+ document.on('focusin', 'input, select, texarea', function(focusEvent, input) {
64
+ // special handler for real "change" events
65
+ if (!input.retrieve('emulated:change')) {
66
+ input.on('change', function(changeEvent) {
67
+ input.fire('emulated:change', changeEvent, true)
68
+ })
69
+ input.store('emulated:change', true)
70
+ }
71
+ })
72
+ }
73
+
74
+ function handleRemote(element) {
75
+ var method, url, params;
76
+
77
+ var event = element.fire("ajax:before");
78
+ if (event.stopped) return false;
79
+
80
+ if (element.tagName.toLowerCase() === 'form') {
81
+ method = element.readAttribute('method') || 'post';
82
+ url = element.readAttribute('action');
83
+ params = element.serialize();
84
+ } else {
85
+ method = element.readAttribute('data-method') || 'get';
86
+ url = element.readAttribute('href');
87
+ params = {};
88
+ }
89
+
90
+ new Ajax.Request(url, {
91
+ method: method,
92
+ parameters: params,
93
+ evalScripts: true,
94
+
95
+ onComplete: function(request) { element.fire("ajax:complete", request); },
96
+ onSuccess: function(request) { element.fire("ajax:success", request); },
97
+ onFailure: function(request) { element.fire("ajax:failure", request); }
98
+ });
99
+
100
+ element.fire("ajax:after");
101
+ }
102
+
103
+ function handleMethod(element) {
104
+ var method = element.readAttribute('data-method'),
105
+ url = element.readAttribute('href'),
106
+ csrf_param = $$('meta[name=csrf-param]')[0],
107
+ csrf_token = $$('meta[name=csrf-token]')[0];
108
+
109
+ var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
110
+ element.parentNode.insert(form);
111
+
112
+ if (method !== 'post') {
113
+ var field = new Element('input', { type: 'hidden', name: '_method', value: method });
114
+ form.insert(field);
115
+ }
116
+
117
+ if (csrf_param) {
118
+ var param = csrf_param.readAttribute('content'),
119
+ token = csrf_token.readAttribute('content'),
120
+ field = new Element('input', { type: 'hidden', name: param, value: token });
121
+ form.insert(field);
122
+ }
123
+
124
+ form.submit();
125
+ }
126
+
127
+
128
+ document.on("click", "*[data-confirm]", function(event, element) {
129
+ var message = element.readAttribute('data-confirm');
130
+ if (!confirm(message)) event.stop();
131
+ });
132
+
133
+ document.on("click", "a[data-remote]", function(event, element) {
134
+ if (event.stopped) return;
135
+ handleRemote(element);
136
+ event.stop();
137
+ });
138
+
139
+ document.on("click", "a[data-method]", function(event, element) {
140
+ if (event.stopped) return;
141
+ handleMethod(element);
142
+ event.stop();
143
+ });
144
+
145
+ document.on("submit", function(event) {
146
+ var element = event.findElement(),
147
+ message = element.readAttribute('data-confirm');
148
+ if (message && !confirm(message)) {
149
+ event.stop();
150
+ return false;
151
+ }
152
+
153
+ var inputs = element.select("input[type=submit][data-disable-with]");
154
+ inputs.each(function(input) {
155
+ input.disabled = true;
156
+ input.writeAttribute('data-original-value', input.value);
157
+ input.value = input.readAttribute('data-disable-with');
158
+ });
159
+
160
+ var element = event.findElement("form[data-remote]");
161
+ if (element) {
162
+ handleRemote(element);
163
+ event.stop();
164
+ }
165
+ });
166
+
167
+ document.on("ajax:after", "form", function(event, element) {
168
+ var inputs = element.select("input[type=submit][disabled=true][data-disable-with]");
169
+ inputs.each(function(input) {
170
+ input.value = input.readAttribute('data-original-value');
171
+ input.removeAttribute('data-original-value');
172
+ input.disabled = false;
173
+ });
174
+ });
175
+ })();
@@ -0,0 +1,49 @@
1
+ body {
2
+ font-family: 'Verdana', sans-serif;
3
+ font-size: 14px;
4
+ }
5
+
6
+ h1#title {
7
+ font-size: 30px;
8
+ text-align: center;
9
+ padding-top: 30px;
10
+ }
11
+
12
+ h2#subtitle {
13
+ text-align: center;
14
+ }
15
+
16
+ #main {
17
+ background-color: #cec;
18
+ }
19
+
20
+ ul {
21
+ list-style: disc;
22
+ margin: 1em 2em;
23
+ }
24
+
25
+ p, div {
26
+ margin: 1em;
27
+ }
28
+
29
+ h1 {
30
+ font-size: 24px;
31
+ font-weight: bold;
32
+ padding-bottom: 12px;
33
+ }
34
+
35
+ h2 {
36
+ font-size: 18px;
37
+ font-weight: bold;
38
+ padding-bottom: 9px;
39
+ }
40
+
41
+ h3 {
42
+ font-size: 16px;
43
+ font-weight: bold;
44
+ padding-bottom: 8px;
45
+ }
46
+
47
+ #content {
48
+ padding: 30px 50px;
49
+ }
@@ -0,0 +1,48 @@
1
+ /* http://meyerweb.com/eric/tools/css/reset/
2
+ v2.0 | 20110126
3
+ License: none (public domain)
4
+ */
5
+
6
+ html, body, div, span, applet, object, iframe,
7
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
8
+ a, abbr, acronym, address, big, cite, code,
9
+ del, dfn, em, img, ins, kbd, q, s, samp,
10
+ small, strike, strong, sub, sup, tt, var,
11
+ b, u, i, center,
12
+ dl, dt, dd, ol, ul, li,
13
+ fieldset, form, label, legend,
14
+ table, caption, tbody, tfoot, thead, tr, th, td,
15
+ article, aside, canvas, details, embed,
16
+ figure, figcaption, footer, header, hgroup,
17
+ menu, nav, output, ruby, section, summary,
18
+ time, mark, audio, video {
19
+ margin: 0;
20
+ padding: 0;
21
+ border: 0;
22
+ font-size: 100%;
23
+ font: inherit;
24
+ vertical-align: baseline;
25
+ }
26
+ /* HTML5 display-role reset for older browsers */
27
+ article, aside, details, figcaption, figure,
28
+ footer, header, hgroup, menu, nav, section {
29
+ display: block;
30
+ }
31
+ body {
32
+ line-height: 1;
33
+ }
34
+ ol, ul {
35
+ list-style: none;
36
+ }
37
+ blockquote, q {
38
+ quotes: none;
39
+ }
40
+ blockquote:before, blockquote:after,
41
+ q:before, q:after {
42
+ content: '';
43
+ content: none;
44
+ }
45
+ table {
46
+ border-collapse: collapse;
47
+ border-spacing: 0;
48
+ }
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,67 @@
1
+ require File.expand_path("../integration_test_helper", File.dirname(__FILE__))
2
+
3
+ class SubtabsTest < ActionController::IntegrationTest
4
+
5
+ test "viewing subtabs application" do
6
+ visit '/'
7
+ assert page.has_content?('Explanation')
8
+ end
9
+
10
+ test "displaying subtabs" do
11
+ visit '/'
12
+ click_link 'Galaxies'
13
+ assert page.has_content?('Elliptical Galaxies')
14
+ assert page.has_content?('Spiral Galaxies')
15
+ assert page.has_content?('Lenticular Galaxies')
16
+ end
17
+
18
+ test "selecting a subtab" do
19
+ visit '/'
20
+ click_link 'Galaxies'
21
+ assert page.has_content?('Listing elliptical_galaxies')
22
+ click_link 'Spiral Galaxies'
23
+ assert page.has_content?('Listing spiral_galaxies')
24
+ click_link 'Lenticular Galaxies'
25
+ assert page.has_content?('Listing lenticular_galaxies')
26
+ end
27
+
28
+ test "tab visibility" do
29
+ visit '/'
30
+ assert_tab_not_present 'Hidden'
31
+ click_link 'Galaxies'
32
+ assert_tab_present 'Hidden'
33
+ click_link 'Planets'
34
+ assert_tab_not_present 'Hidden'
35
+ end
36
+
37
+ test "subtab visibility" do
38
+ visit '/'
39
+ click_link 'Galaxies'
40
+ click_link 'Hidden'
41
+ assert_subtab_present 'Always Visible'
42
+ assert_subtab_not_present 'Always Hidden'
43
+ end
44
+
45
+ test "changing tab text" do
46
+ visit '/'
47
+ click_link 'Stars'
48
+ assert_tab_present 'Stars!'
49
+ assert_tab_not_present 'Stars'
50
+ end
51
+
52
+ test "disabled tabs" do
53
+ visit '/'
54
+ assert_tab_disabled 'Disabled'
55
+ click_link 'Stars'
56
+ assert_tab_enabled 'Disabled'
57
+ end
58
+
59
+ test "disabled subtabs" do
60
+ visit '/'
61
+ click_link 'Stars'
62
+ click_link 'Disabled'
63
+ assert_subtab_enabled 'Always Enabled'
64
+ assert_subtab_disabled 'Always Disabled'
65
+ end
66
+
67
+ end
@@ -0,0 +1,6 @@
1
+ require File.expand_path('test_helper', File.dirname(__FILE__))
2
+ require File.expand_path('../../../test_application_integration_test_helper', File.dirname(__FILE__))
3
+
4
+ # This file contains integration test code specific to this test application. Integration
5
+ # test code that is shared among all test applications should live in
6
+ # test/test_application_integration_test_helper.rb.
@@ -0,0 +1,8 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+ require File.expand_path('../../../test_application_test_helper', File.dirname(__FILE__))
5
+
6
+ # This file contains test code specific to this test application. Helper
7
+ # test code that is shared among all test applications should live in
8
+ # test/test_application_test_helper.rb.
@@ -0,0 +1,14 @@
1
+ # This DRYs up the Gemfiles of our test applications.
2
+
3
+ def shared_test_application_gems(bundler)
4
+ bundler.instance_eval do
5
+ gem 'rails', '>= 3.0.0'
6
+ gem 'sqlite3-ruby', :require => 'sqlite3'
7
+ gem 'tabulous', :path => "../../.."
8
+ group :test do
9
+ gem 'capybara'
10
+ gem 'launchy'
11
+ gem 'redgreen' unless RUBY_VERSION >= "1.9"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,89 @@
1
+ require 'capybara/rails'
2
+
3
+ module ActionController
4
+ class IntegrationTest
5
+
6
+ include Capybara
7
+
8
+ def assert_tab_not_present(text)
9
+ begin
10
+ message = "expected tab with text '#{text}' to not be present"
11
+ page.find(:xpath, %Q{//div[@id="tabs"]//ul/li/*[. = "#{text}"]})
12
+ assert_block(message) { false }
13
+ rescue Capybara::ElementNotFound
14
+ assert_block(message) { true }
15
+ end
16
+ end
17
+
18
+ def assert_tab_present(text)
19
+ begin
20
+ message = "expected tab with text '#{text}' to be present"
21
+ page.find(:xpath, %Q{//div[@id="tabs"]//ul/li/*[. = "#{text}"]})
22
+ assert_block(message) { true }
23
+ rescue Capybara::ElementNotFound
24
+ assert_block(message) { false }
25
+ end
26
+ end
27
+
28
+ def assert_subtab_not_present(text)
29
+ begin
30
+ message = "expected subtab with text '#{text}' to not be present"
31
+ page.find(:xpath, %Q{//div[@id="subtabs"]//ul/li/*[. = "#{text}"]})
32
+ assert_block(message) { false }
33
+ rescue Capybara::ElementNotFound
34
+ assert_block(message) { true }
35
+ end
36
+ end
37
+
38
+ def assert_subtab_present(text)
39
+ begin
40
+ message = "expected subtab with text '#{text}' to be present"
41
+ page.find(:xpath, %Q{//div[@id="subtabs"]//ul/li/*[. = "#{text}"]})
42
+ assert_block(message) { true }
43
+ rescue Capybara::ElementNotFound
44
+ assert_block(message) { false }
45
+ end
46
+ end
47
+
48
+ def assert_tab_disabled(text)
49
+ message = "expected tab with text '#{text}' to be disabled"
50
+ result = page.all('#tabs li.disabled', :text => text)
51
+ assert_block(message) { !result.empty? }
52
+ end
53
+
54
+ def assert_tab_enabled(text)
55
+ message = "expected tab with text '#{text}' to be enabled"
56
+ result = page.all('#tabs li.enabled', :text => text)
57
+ assert_block(message) { !result.empty? }
58
+ end
59
+
60
+ def assert_subtab_disabled(text)
61
+ message = "expected subtab with text '#{text}' to be disabled"
62
+ result = page.all('#subtabs li.disabled', :text => text)
63
+ assert_block(message) { !result.empty? }
64
+ end
65
+
66
+ def assert_subtab_enabled(text)
67
+ message = "expected subtab with text '#{text}' to be enabled"
68
+ result = page.all('#subtabs li.enabled', :text => text)
69
+ assert_block(message) { !result.empty? }
70
+ end
71
+
72
+ def assert_tab_active(text)
73
+ message = "expected tab with text '#{text}' to be active"
74
+ result = page.all('#tabs li.active', :text => text)
75
+ assert_block(message) { !result.empty? }
76
+ end
77
+
78
+ def assert_subtab_active(text)
79
+ message = "expected subtab with text '#{text}' to be active"
80
+ result = page.all('#subtabs li.active', :text => text)
81
+ assert_block(message) { !result.empty? }
82
+ end
83
+
84
+ def use_initializer(i)
85
+ eval i
86
+ end
87
+
88
+ end
89
+ end