zena 1.1.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (392) hide show
  1. data/History.txt +23 -1
  2. data/MIT-LICENSE +2 -2
  3. data/README.rdoc +2 -15
  4. data/app/controllers/acls_controller.rb +1 -1
  5. data/app/controllers/documents_controller.rb +12 -3
  6. data/app/controllers/nodes_controller.rb +1 -3
  7. data/app/controllers/sites_controller.rb +7 -0
  8. data/app/controllers/versions_controller.rb +1 -1
  9. data/app/controllers/virtual_classes_controller.rb +7 -8
  10. data/app/models/acl.rb +3 -2
  11. data/app/models/relation_proxy.rb +2 -1
  12. data/app/models/role.rb +16 -0
  13. data/app/models/site.rb +48 -0
  14. data/app/models/text_document.rb +2 -1
  15. data/app/models/user.rb +2 -1
  16. data/app/models/zip.rb +2 -1
  17. data/app/views/acls/index.rhtml +11 -1
  18. data/app/views/documents/show.rhtml +1 -1
  19. data/app/views/relations/_add.erb +2 -2
  20. data/app/views/relations/_form.erb +5 -2
  21. data/app/views/relations/_li.erb +4 -1
  22. data/app/views/relations/index.erb +3 -3
  23. data/app/views/sites/_form.erb +1 -1
  24. data/app/views/sites/_job.erb +4 -0
  25. data/app/views/sites/index.erb +1 -1
  26. data/app/views/sites/jobs.erb +10 -0
  27. data/app/views/templates/document_create_tabs/_file.rhtml +3 -0
  28. data/app/views/zafu/default/Node-+search.zafu +2 -2
  29. data/bricks/acls/zena/init.rb +2 -1
  30. data/bricks/acls/zena/test/integration/acl_integration_test.rb +5 -5
  31. data/bricks/acls/zena/test/sites/erebus/acls.yml +2 -2
  32. data/bricks/acls/zena/test/unit/acl_test.rb +2 -2
  33. data/bricks/grid/lib/bricks/grid.rb +110 -0
  34. data/bricks/grid/zena/init.rb +4 -0
  35. data/bricks/math/lib/bricks/math.rb +1 -0
  36. data/bricks/pdf/lib/bricks/pdf.rb +10 -1
  37. data/bricks/sphinx/zena/tasks.rb +8 -40
  38. data/bricks/spreadsheet/README +31 -0
  39. data/bricks/spreadsheet/lib/bricks/spreadsheet.rb +293 -0
  40. data/bricks/spreadsheet/zena/init.rb +3 -0
  41. data/bricks/spreadsheet/zena/test/sites/zena/links.yml +11 -0
  42. data/bricks/spreadsheet/zena/test/unit/xlsx_test.rb +5 -0
  43. data/bricks/spreadsheet/zena/test/zafu/README +27 -0
  44. data/bricks/spreadsheet/zena/test/zafu/spreadsheet.yml +19 -0
  45. data/bricks/worker/lib/bricks/worker.rb +11 -5
  46. data/bricks/worker/zena/init.rb +8 -0
  47. data/bricks/worker/zena/migrate/20120501091514_add_site_id_to_jobs.rb +9 -0
  48. data/bricks/zena/zena/migrate/01_base.rb +0 -7
  49. data/bricks/zena/zena/migrate/20111214112233_add_comment_to_relations.rb +9 -0
  50. data/config/bricks.yml +15 -1
  51. data/config/environments/production.rb +2 -2
  52. data/config/gems.yml +6 -1
  53. data/doc/zafu_changes.yml +1 -1
  54. data/lib/tasks/zena.rake +6 -2
  55. data/lib/zena/app.rb +1 -1
  56. data/lib/zena/code/default_syntax.rb +5 -1
  57. data/lib/zena/db_helper/mysql.rb +5 -1
  58. data/lib/zena/deploy/app_init.rhtml +11 -7
  59. data/lib/zena/deploy/awstats.conf.rhtml +1 -1
  60. data/lib/zena/deploy/start_stop.rhtml +5 -5
  61. data/lib/zena/deploy/vhost.rhtml +16 -2
  62. data/lib/zena/deploy.rb +5 -3
  63. data/lib/zena/info.rb +1 -1
  64. data/lib/zena/parser/zazen_rules.rb +7 -7
  65. data/lib/zena/remote/node.rb +7 -0
  66. data/lib/zena/routes.rb +4 -5
  67. data/lib/zena/test_controller.rb +18 -1
  68. data/lib/zena/use/action.rb +13 -4
  69. data/lib/zena/use/ajax.rb +10 -4
  70. data/lib/zena/use/authlogic.rb +1 -1
  71. data/lib/zena/use/calendar.rb +4 -0
  72. data/lib/zena/use/conditional.rb +3 -0
  73. data/lib/zena/use/dates.rb +44 -4
  74. data/lib/zena/use/display.rb +45 -15
  75. data/lib/zena/use/forms.rb +59 -30
  76. data/lib/zena/use/query_builder.rb +12 -12
  77. data/lib/zena/use/recursion.rb +1 -1
  78. data/lib/zena/use/rendering.rb +18 -17
  79. data/lib/zena/use/urls.rb +2 -1
  80. data/lib/zena/use/zafu_safe_definitions.rb +0 -9
  81. data/lib/zena/use/zafu_templates.rb +2 -2
  82. data/lib/zena/use/zazen.rb +1 -3
  83. data/lib/zena/use.rb +13 -2
  84. data/lib/zena.rb +8 -2
  85. data/public/images/bullet_back.png +0 -0
  86. data/public/javascripts/grid.js +535 -0
  87. data/public/javascripts/tablekit.js +0 -0
  88. data/public/javascripts/window.js +0 -0
  89. data/public/javascripts/zena.js +17 -7
  90. data/public/stylesheets/admin.css +5 -1
  91. data/public/stylesheets/grid.css +19 -0
  92. data/test/fixtures/files/TestNode.zafu +123 -311
  93. data/test/fixtures/files/translations_fr.yml +6 -1
  94. data/test/functional/acls_controller_test.rb +2 -2
  95. data/test/functional/nodes_controller_test.rb +17 -11
  96. data/test/functional/virtual_classes_controller_test.rb +1 -1
  97. data/test/integration/query_node/basic.yml +9 -0
  98. data/test/integration/query_node/dates.yml +1 -1
  99. data/test/integration/zafu_compiler/ajax.yml +9 -9
  100. data/test/integration/zafu_compiler/basic.yml +0 -24
  101. data/test/integration/zafu_compiler/dates.yml +24 -7
  102. data/test/integration/zafu_compiler/display.yml +45 -2
  103. data/test/integration/zafu_compiler/errors.yml +0 -6
  104. data/test/integration/zafu_compiler/forms.yml +41 -3
  105. data/test/integration/zafu_compiler/query.yml +29 -3
  106. data/test/integration/zafu_compiler/roles.yml +0 -4
  107. data/test/integration/zafu_compiler/safe_definitions.yml +1 -1
  108. data/test/integration/zafu_compiler_test.rb +11 -3
  109. data/test/selenium/Add/add3.rsel +8 -8
  110. data/test/selenium/Drop/drop1.rsel +12 -12
  111. data/test/selenium/Drop/drop2.rsel +14 -14
  112. data/test/selenium/Drop/drop3.rsel +21 -21
  113. data/test/selenium/Drop/drop4.rsel +1 -1
  114. data/test/selenium/Edit/edit2.rsel +9 -9
  115. data/test/selenium/Edit/edit4.rsel +55 -0
  116. data/test/selenium/Edit/edit5.rsel +41 -0
  117. data/test/selenium/Edit/edit6.rsel +53 -0
  118. data/test/selenium/Filter/0setup.rsel +12 -0
  119. data/test/selenium/Filter/filter1.rsel +9 -0
  120. data/test/selenium/Filter/filter2.rsel +9 -0
  121. data/test/selenium/Form/form1.rsel +1 -1
  122. data/test/selenium/Form/form2.rsel +1 -1
  123. data/test/selenium/Form/form3.rsel +15 -0
  124. data/test/selenium/Grid/0setup.rsel +13 -0
  125. data/test/selenium/Grid/grid1.rsel +11 -0
  126. data/test/selenium/Swap/0setup.rsel +12 -0
  127. data/test/selenium/Swap/swap1.rsel +13 -0
  128. data/test/selenium/Swap/swap2.rsel +11 -0
  129. data/test/selenium/Toggle/toggle1.rsel +6 -6
  130. data/test/sites/zena/versions.yml +1 -1
  131. data/test/unit/relation_proxy_test.rb +36 -0
  132. data/test/unit/site_test.rb +10 -2
  133. data/test/unit/zena/use/rendering_test.rb +7 -6
  134. data/test/unit/zena/use/zazen_test.rb +1 -2
  135. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run 2.tmCommand +24 -0
  136. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Context.tmCommand +58 -0
  137. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run Focused Should.tmCommand +88 -0
  138. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/Run.tmCommand +27 -0
  139. data/vendor/TextMate/Ruby Shoulda.tmbundle/Commands/YAML to Shoulda.tmCommand +23 -0
  140. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Context.tmPreferences +19 -0
  141. data/vendor/TextMate/Ruby Shoulda.tmbundle/Preferences/Symbol List: Should.tmPreferences +19 -0
  142. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory attributes for.tmSnippet +16 -0
  143. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory build.tmSnippet +16 -0
  144. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory.tmSnippet +16 -0
  145. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define with class.tmSnippet +18 -0
  146. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_define.tmSnippet +18 -0
  147. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_next.tmSnippet +16 -0
  148. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/Factory_sequence.tmSnippet +18 -0
  149. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_bad_value.tmSnippet +16 -0
  150. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_contains.tmSnippet +16 -0
  151. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_does_not_contain.tmSnippet +16 -0
  152. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_good_value.tmSnippet +16 -0
  153. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_same_elements.tmSnippet +16 -0
  154. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_save.tmSnippet +16 -0
  155. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_sent_email.tmSnippet +18 -0
  156. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/assert_valid.tmSnippet +16 -0
  157. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/association.tmSnippet +17 -0
  158. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/attribute.tmSnippet +17 -0
  159. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/before_should block.tmSnippet +18 -0
  160. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block get.tmSnippet +22 -0
  161. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block post.tmSnippet +23 -0
  162. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/context block with setup.tmSnippet +25 -0
  163. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/setup.tmSnippet +18 -0
  164. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block with before proc.tmSnippet +18 -0
  165. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should block.tmSnippet +18 -0
  166. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_allow_values_for.tmSnippet +16 -0
  167. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_assign_to.tmSnippet +16 -0
  168. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful denied.tmSnippet +20 -0
  169. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_be_restful.tmSnippet +20 -0
  170. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_belong_to.tmSnippet +16 -0
  171. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change by.tmSnippet +16 -0
  172. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_change from to.tmSnippet +16 -0
  173. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_at_least.tmSnippet +16 -0
  174. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_in_range.tmSnippet +16 -0
  175. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_length_is.tmSnippet +16 -0
  176. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_ensure_value_in_range.tmSnippet +16 -0
  177. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_eventually.tmSnippet +18 -0
  178. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_filter_params.tmSnippet +16 -0
  179. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_and_belong_to_many.tmSnippet +16 -0
  180. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_class_methods.tmSnippet +16 -0
  181. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_column.tmSnippet +16 -0
  182. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_db_columns.tmSnippet +16 -0
  183. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_index.tmSnippet +16 -0
  184. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_indices.tmSnippet +16 -0
  185. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_instance_methods.tmSnippet +16 -0
  186. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_many.tmSnippet +16 -0
  187. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_named_scope.tmSnippet +16 -0
  188. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_one.tmSnippet +16 -0
  189. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_have_readonly_attributes.tmSnippet +16 -0
  190. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_mass_assignment_of.tmSnippet +16 -0
  191. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_allow_values_for.tmSnippet +16 -0
  192. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_assign_to.tmSnippet +16 -0
  193. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_change.tmSnippet +16 -0
  194. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_not_set_the_flash.tmSnippet +16 -0
  195. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_redirect_to.tmSnippet +16 -0
  196. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_a_form.tmSnippet +16 -0
  197. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_template.tmSnippet +16 -0
  198. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_with_layout.tmSnippet +16 -0
  199. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_render_without_layout.tmSnippet +16 -0
  200. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with.tmSnippet +16 -0
  201. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_respond_with_content_type.tmSnippet +16 -0
  202. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_return_from_session.tmSnippet +16 -0
  203. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_route.tmSnippet +16 -0
  204. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_set_the_flash_to.tmSnippet +16 -0
  205. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_acceptance_of.tmSnippet +16 -0
  206. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_numericality_of.tmSnippet +16 -0
  207. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_presence_of.tmSnippet +16 -0
  208. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of with scope.tmSnippet +16 -0
  209. data/vendor/TextMate/Ruby Shoulda.tmbundle/Snippets/should_validate_uniqueness_of.tmSnippet +16 -0
  210. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
  211. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/run_script.rb +104 -0
  212. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
  213. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/test.rb +17 -0
  214. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/RubyMate/todo.txt +13 -0
  215. data/vendor/TextMate/Ruby Shoulda.tmbundle/Support/bin/yaml_to_shoulda.rb +25 -0
  216. data/vendor/TextMate/Ruby Shoulda.tmbundle/Syntaxes/Ruby on Rails (Shoulda).tmLanguage +166 -0
  217. data/vendor/TextMate/Ruby Shoulda.tmbundle/info.plist +304 -0
  218. data/vendor/TextMate/Zena.tmbundle/Commands/Run all yaml tests.tmCommand +37 -0
  219. data/vendor/TextMate/Zena.tmbundle/Commands/Run focused yaml test.tmCommand +52 -0
  220. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/catch_exception.rb +39 -0
  221. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/run_script.rb +118 -0
  222. data/vendor/TextMate/Zena.tmbundle/Support/RubyMate/stdin_dialog.rb +14 -0
  223. data/vendor/TextMate/Zena.tmbundle/info.plist +17 -0
  224. data/vendor/plugins/selenium-on-rails/CHANGELOG +125 -0
  225. data/vendor/plugins/selenium-on-rails/LICENSE-2.0.txt +202 -0
  226. data/vendor/plugins/selenium-on-rails/README.md +202 -0
  227. data/vendor/plugins/selenium-on-rails/Rakefile +38 -0
  228. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumController.html +265 -0
  229. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumHelper.html +148 -0
  230. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/FixtureLoader.html +231 -0
  231. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/PartialsSupport.html +195 -0
  232. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Paths.html +295 -0
  233. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/RSelenese.html +219 -0
  234. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Renderer.html +156 -0
  235. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/Selenese.html +179 -0
  236. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/SuiteRenderer.html +223 -0
  237. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilder.html +441 -0
  238. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderAccessors.html +3098 -0
  239. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderActions.html +2080 -0
  240. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserAccessors.html +116 -0
  241. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails/TestBuilderUserActions.html +116 -0
  242. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRails.html +126 -0
  243. data/vendor/plugins/selenium-on-rails/doc/classes/SeleniumOnRailsConfig.html +150 -0
  244. data/vendor/plugins/selenium-on-rails/doc/files/CHANGELOG.html +422 -0
  245. data/vendor/plugins/selenium-on-rails/doc/files/README.html +321 -0
  246. data/vendor/plugins/selenium-on-rails/doc/files/lib/controllers/selenium_controller_rb.html +108 -0
  247. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_helper_rb.html +101 -0
  248. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/acceptance_test_runner_rb.html +222 -0
  249. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/fixture_loader_rb.html +109 -0
  250. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/partials_support_rb.html +111 -0
  251. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/paths_rb.html +101 -0
  252. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/renderer_rb.html +101 -0
  253. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/rselenese_rb.html +118 -0
  254. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/selenese_rb.html +101 -0
  255. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/suite_renderer_rb.html +101 -0
  256. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_accessors_rb.html +114 -0
  257. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_actions_rb.html +113 -0
  258. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails/test_builder_rb.html +120 -0
  259. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_config_rb.html +108 -0
  260. data/vendor/plugins/selenium-on-rails/doc/files/lib/selenium_on_rails_rb.html +115 -0
  261. data/vendor/plugins/selenium-on-rails/doc/fr_class_index.html +42 -0
  262. data/vendor/plugins/selenium-on-rails/doc/fr_file_index.html +43 -0
  263. data/vendor/plugins/selenium-on-rails/doc/fr_method_index.html +182 -0
  264. data/vendor/plugins/selenium-on-rails/doc/index.html +24 -0
  265. data/vendor/plugins/selenium-on-rails/doc/rdoc-style.css +208 -0
  266. data/vendor/plugins/selenium-on-rails/generators/selenium/USAGE +19 -0
  267. data/vendor/plugins/selenium-on-rails/generators/selenium/selenium_generator.rb +50 -0
  268. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rhtml.rhtml +16 -0
  269. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/rselenese.rhtml +14 -0
  270. data/vendor/plugins/selenium-on-rails/generators/selenium/templates/selenese.rhtml +11 -0
  271. data/vendor/plugins/selenium-on-rails/init.rb +15 -0
  272. data/vendor/plugins/selenium-on-rails/lib/controllers/selenium_controller.rb +122 -0
  273. data/vendor/plugins/selenium-on-rails/lib/controllers/switch_environment_controller.rb +16 -0
  274. data/vendor/plugins/selenium-on-rails/lib/selenium_helper.rb +8 -0
  275. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/acceptance_test_runner.rb +215 -0
  276. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/fixture_loader.rb +57 -0
  277. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/partials_support.rb +36 -0
  278. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/paths.rb +61 -0
  279. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/renderer.rb +20 -0
  280. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/rselenese.rb +44 -0
  281. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/selenese.rb +87 -0
  282. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/suite_renderer.rb +56 -0
  283. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder.rb +116 -0
  284. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_accessors.rb +1002 -0
  285. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_actions.rb +514 -0
  286. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_accessors.rb.example +91 -0
  287. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails/test_builder_user_actions.rb.example +24 -0
  288. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails.rb +11 -0
  289. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +30 -0
  290. data/vendor/plugins/selenium-on-rails/lib/views/layouts/layout.rhtml +18 -0
  291. data/vendor/plugins/selenium-on-rails/lib/views/record.rhtml +5 -0
  292. data/vendor/plugins/selenium-on-rails/lib/views/selenium_helper.rb +9 -0
  293. data/vendor/plugins/selenium-on-rails/lib/views/setup.rhtml +67 -0
  294. data/vendor/plugins/selenium-on-rails/lib/views/test_suite.rhtml +26 -0
  295. data/vendor/plugins/selenium-on-rails/routes.rb +24 -0
  296. data/vendor/plugins/selenium-on-rails/selenium-core/Blank.html +7 -0
  297. data/vendor/plugins/selenium-on-rails/selenium-core/InjectedRemoteRunner.html +8 -0
  298. data/vendor/plugins/selenium-on-rails/selenium-core/RemoteRunner.html +110 -0
  299. data/vendor/plugins/selenium-on-rails/selenium-core/SeleniumLog.html +109 -0
  300. data/vendor/plugins/selenium-on-rails/selenium-core/TestPrompt.html +145 -0
  301. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner-splash.html +55 -0
  302. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.hta +177 -0
  303. data/vendor/plugins/selenium-on-rails/selenium-core/TestRunner.html +177 -0
  304. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butmin.gif +0 -0
  305. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/butplus.gif +0 -0
  306. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.css +298 -0
  307. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/domviewer.html +16 -0
  308. data/vendor/plugins/selenium-on-rails/selenium-core/domviewer/selenium-domviewer.js +205 -0
  309. data/vendor/plugins/selenium-on-rails/selenium-core/icons/all.png +0 -0
  310. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue.png +0 -0
  311. data/vendor/plugins/selenium-on-rails/selenium-core/icons/continue_disabled.png +0 -0
  312. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause.png +0 -0
  313. data/vendor/plugins/selenium-on-rails/selenium-core/icons/pause_disabled.png +0 -0
  314. data/vendor/plugins/selenium-on-rails/selenium-core/icons/selected.png +0 -0
  315. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step.png +0 -0
  316. data/vendor/plugins/selenium-on-rails/selenium-core/icons/step_disabled.png +0 -0
  317. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc-core.xml +1759 -0
  318. data/vendor/plugins/selenium-on-rails/selenium-core/iedoc.xml +1800 -0
  319. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/cssQuery-p.js +6 -0
  320. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level2.js +142 -0
  321. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-level3.js +150 -0
  322. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery-standard.js +53 -0
  323. data/vendor/plugins/selenium-on-rails/selenium-core/lib/cssQuery/src/cssQuery.js +356 -0
  324. data/vendor/plugins/selenium-on-rails/selenium-core/lib/prototype.js +2006 -0
  325. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/builder.js +101 -0
  326. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/controls.js +815 -0
  327. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/dragdrop.js +915 -0
  328. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/effects.js +958 -0
  329. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/scriptaculous.js +47 -0
  330. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/slider.js +283 -0
  331. data/vendor/plugins/selenium-on-rails/selenium-core/lib/scriptaculous/unittest.js +383 -0
  332. data/vendor/plugins/selenium-on-rails/selenium-core/lib/snapsie.js +91 -0
  333. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/find_matching_child.js +69 -0
  334. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/htmlutils.js +1616 -0
  335. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/injection.html +72 -0
  336. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-api.js +3184 -0
  337. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserbot.js +2300 -0
  338. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-browserdetect.js +153 -0
  339. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-commandhandlers.js +377 -0
  340. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-executionloop.js +175 -0
  341. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-logging.js +148 -0
  342. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-remoterunner.js +695 -0
  343. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-testrunner.js +1362 -0
  344. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/selenium-version.js +5 -0
  345. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-doc.html +803 -0
  346. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-element.js +1537 -0
  347. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/ui-map-sample.js +979 -0
  348. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js +3 -0
  349. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/user-extensions.js.sample +75 -0
  350. data/vendor/plugins/selenium-on-rails/selenium-core/scripts/xmlextras.js +153 -0
  351. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-logo.png +0 -0
  352. data/vendor/plugins/selenium-on-rails/selenium-core/selenium-test.css +43 -0
  353. data/vendor/plugins/selenium-on-rails/selenium-core/selenium.css +316 -0
  354. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/dom.js +566 -0
  355. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/javascript-xpath-0.1.11.js +2816 -0
  356. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/util.js +549 -0
  357. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xmltoken.js +149 -0
  358. data/vendor/plugins/selenium-on-rails/selenium-core/xpath/xpath.js +2450 -0
  359. data/vendor/plugins/selenium-on-rails/tasks/test_acceptance.rake +8 -0
  360. data/vendor/plugins/selenium-on-rails/test/fixtures/config.yml +37 -0
  361. data/vendor/plugins/selenium-on-rails/test/fixtures/selenium.yml +27 -0
  362. data/vendor/plugins/selenium-on-rails/test/paths_test.rb +72 -0
  363. data/vendor/plugins/selenium-on-rails/test/renderer_test.rb +157 -0
  364. data/vendor/plugins/selenium-on-rails/test/rselenese_test.rb +708 -0
  365. data/vendor/plugins/selenium-on-rails/test/selenese_test.rb +242 -0
  366. data/vendor/plugins/selenium-on-rails/test/selenium_controller_test.rb +67 -0
  367. data/vendor/plugins/selenium-on-rails/test/selenium_on_rails_config_test.rb +43 -0
  368. data/vendor/plugins/selenium-on-rails/test/selenium_support_test.rb +35 -0
  369. data/vendor/plugins/selenium-on-rails/test/setup_test.rb +31 -0
  370. data/vendor/plugins/selenium-on-rails/test/suite_renderer_test.rb +109 -0
  371. data/vendor/plugins/selenium-on-rails/test/switch_environment_controller_test.rb +17 -0
  372. data/vendor/plugins/selenium-on-rails/test/test_builder_functions_authortest.rb +51 -0
  373. data/vendor/plugins/selenium-on-rails/test/test_helper.rb +101 -0
  374. data/vendor/plugins/selenium-on-rails/test_data/_partial.rsel +1 -0
  375. data/vendor/plugins/selenium-on-rails/test_data/own_layout.html +12 -0
  376. data/vendor/plugins/selenium-on-rails/test_data/partials/_html.html +6 -0
  377. data/vendor/plugins/selenium-on-rails/test_data/partials/_nesting.rsel +2 -0
  378. data/vendor/plugins/selenium-on-rails/test_data/partials/_rhtml.rhtml +6 -0
  379. data/vendor/plugins/selenium-on-rails/test_data/partials/_rsel.rsel +1 -0
  380. data/vendor/plugins/selenium-on-rails/test_data/partials/_sel.sel +5 -0
  381. data/vendor/plugins/selenium-on-rails/test_data/partials/all_partials.rsel +5 -0
  382. data/vendor/plugins/selenium-on-rails/test_data/rhtml.rhtml +7 -0
  383. data/vendor/plugins/selenium-on-rails/test_data/rselenese.rsel +8 -0
  384. data/vendor/plugins/selenium-on-rails/test_data/selenese.sel +7 -0
  385. data/vendor/plugins/selenium-on-rails/test_data/suite_one/subsuite/suite_one_subsuite_testcase.sel +1 -0
  386. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase1.sel +1 -0
  387. data/vendor/plugins/selenium-on-rails/test_data/suite_one/suite_one_testcase2.sel +1 -0
  388. data/vendor/plugins/selenium-on-rails/test_data/suite_two/suite_two_testcase.sel +1 -0
  389. data/zena.gemspec +290 -7
  390. metadata +346 -52
  391. data/app/views/nodes/_table.rhtml +0 -14
  392. data/lib/zena/use/grid.rb +0 -154
@@ -0,0 +1,535 @@
1
+ Grid = {
2
+ grids: {},
3
+ grid_c: 0,
4
+ };
5
+
6
+ Grid.changed = function(cell, value) {
7
+ cell.innerHTML = value;
8
+ var row = cell.up('tr');
9
+ var table = row.up('table');
10
+ if (cell.prev_value == value) return;
11
+ if (cell.orig_value == value) {
12
+ cell.removeClassName('changed');
13
+ if (row.select('.changed').length == 0) {
14
+ row.removeClassName('changed');
15
+ }
16
+ } else {
17
+ cell.addClassName('changed');
18
+ row.addClassName('changed');
19
+ }
20
+ var pos = Grid.pos(cell);
21
+
22
+ var attr, id;
23
+ if (table.grid.attr_name) {
24
+ attr = pos;
25
+ id = Grid.pos(row) - 1;
26
+ } else {
27
+ attr = table.grid.attr[pos];
28
+ id = row.id;
29
+ }
30
+
31
+ var change = {
32
+ id: id
33
+ };
34
+ change[attr] = value;
35
+ var table = row.up('table');
36
+ table.grid.changes.push(change);
37
+ }
38
+
39
+ Grid.close_cell = function(event) {
40
+ var input = event.element();
41
+ var cell = input.up();
42
+ var table = event.findElement('table');
43
+ cell.removeClassName('input');
44
+ // simple case
45
+ Grid.changed(cell, input.value.strip());
46
+ if (table.grid.input) {
47
+ // single attribute table, serialize in input field
48
+ table.grid.input.value = Grid.serialize(table);
49
+ }
50
+ }
51
+
52
+ Grid.pos = function(elem) {
53
+ var sibl = elem.up().childElements();
54
+ for (var i = 0; i < sibl.length; i++) {
55
+ if (sibl[i] === elem) return i;
56
+ }
57
+ }
58
+
59
+ Grid.paste = function(event) {
60
+ var input = event.element();
61
+ var start_cell = input.up();
62
+ var row = start_cell.up();
63
+ var table = row.up('table');
64
+ var row_offset = Grid.pos(row);
65
+ var tbody = table.childElements()[0];
66
+ var rows = tbody.childElements();
67
+ var cell_offset = Grid.pos(start_cell);
68
+ // Redirect paste inside the paste textarea
69
+ $(document.body).insert({
70
+ bottom: "<textarea style='position:fixed; top:0; left:10100px;' id='grid_p_" + table.grid.id + "'></textarea>"
71
+ });
72
+ var paster = $("grid_p_" + table.grid.id);
73
+ paster.focus();
74
+ setTimeout(function() {
75
+ var text = paster.value;
76
+ paster.remove();
77
+
78
+ var lines = text.strip().split(/\r\n|\r|\n/);
79
+ for (var i = 0; i < lines.length; i++) {
80
+ lines[i] = lines[i].split(/\t/);
81
+ }
82
+ if (lines.length == 1 && lines[0].length == 1) {
83
+ // simple case
84
+ input.value = lines[0][0];
85
+ } else {
86
+ // copy/paste from spreadsheet
87
+ var should_create = table.grid.input && true;
88
+ for (var i = 0; i < lines.length; i++) {
89
+ // foreach line
90
+ // get row
91
+ var row = rows[row_offset + i];
92
+ if (!row) {
93
+ if (!should_create) break;
94
+ // create a new row
95
+ Grid.add_row(table, rows[row_offset + i - 1]);
96
+ rows = tbody.select('tr');
97
+ row = rows[row_offset + i];
98
+ }
99
+ var tabs = lines[i];
100
+ var cells = row.childElements(); cells.pop();
101
+ for (var j = 0; j < tabs.length; j++) {
102
+ // foreach tab
103
+ var cell = cells[cell_offset + j];
104
+ if (!cell) {
105
+ if (!should_create) break;
106
+ // create a new cell
107
+ Grid.add_col(table, cells[cell_offset + j - 1]);
108
+ cells = row.childElements(); cells.pop();
109
+ cell = cells[cell_offset + j];
110
+ }
111
+ Grid.changed(cell, tabs[j]);
112
+ }
113
+ }
114
+ }
115
+ Grid.open_cell(start_cell);
116
+ }, 100);
117
+ return true;
118
+ }
119
+
120
+ Grid.keydown = function(event) {
121
+ var input = event.element();
122
+ var key = event.keyCode;
123
+ var cell = input.up();
124
+ if (key == 39 || (key == 9 && !event.shiftKey)) {
125
+ // tab + key right
126
+ var next = cell.nextSiblings()[0];
127
+ if (!next || next.hasClassName('action')) {
128
+ // wrap around on tab
129
+ var row = cell.up('tr').nextSiblings()[0];
130
+ if (!row) {
131
+ row = cell.up('tbody').childElements()[1];
132
+ }
133
+ next = row.childElements()[0];
134
+ }
135
+ Grid.open_cell(next);
136
+ event.stop();
137
+ } else if (key == 37 || (key == 9 && event.shiftKey)) {
138
+ var prev = cell.previousSiblings()[0];
139
+ if (!prev) {
140
+ // wrap back around on shift+tab
141
+ var row = cell.up('tr').previousSiblings()[0];
142
+ if (!row || row.childElements()[0].tagName == 'TH') {
143
+ row = cell.up('tbody').childElements().last();
144
+ }
145
+ prev = row.childElements().last();
146
+ if (prev.hasClassName('action'))
147
+ prev = prev.previousSiblings()[0];
148
+ }
149
+ Grid.open_cell(prev);
150
+ event.stop();
151
+ } else if (key == 40) {
152
+ // find position
153
+ var pos = Grid.pos(cell);
154
+ // go to next row
155
+ var row = cell.up().nextSiblings().first();
156
+ // find elem
157
+ var next = row.childElements()[pos];
158
+ if (next) Grid.open_cell(next);
159
+ event.stop();
160
+ } else if (key == 38) {
161
+ // go to prev row
162
+ var row = cell.up();
163
+ if (Grid.pos(row) == 1) {
164
+ // stop
165
+ } else {
166
+ var pos = Grid.pos(cell);
167
+ // move up
168
+ row = row.previousSiblings().first();
169
+ var next = row.childElements()[pos];
170
+ Grid.open_cell(next);
171
+ }
172
+ event.stop();
173
+ }
174
+ return false;
175
+ }
176
+
177
+ Grid.open_cell = function(cell) {
178
+ if (cell.hasClassName('input')) return;
179
+ var value = cell.innerHTML;
180
+
181
+ if (!cell.orig_value) cell.orig_value = value;
182
+ cell.prev_value = value;
183
+
184
+ var w = cell.getWidth() - 5;
185
+ var h = cell.getHeight() - 5;
186
+ cell.addClassName('input');
187
+ cell.innerHTML = "<input type='text' value=''/>";
188
+ var input = cell.select('input').first();
189
+ input.value = value;
190
+ input.setStyle({
191
+ width: w + 'px',
192
+ height: h + 'px'
193
+ });
194
+ input.observe('blur', Grid.close_cell);
195
+ input.observe('keydown', Grid.keydown);
196
+ input.observe('paste', Grid.paste);
197
+ input.focus();
198
+ input.select();
199
+ }
200
+
201
+ Grid.click = function(event) {
202
+ var cell = event.findElement('td, th');
203
+ var row = event.findElement('tr');
204
+ if (row.hasClassName('action')) {
205
+ Grid.action(event, cell, row, true);
206
+ } else if (cell.hasClassName('action')) {
207
+ Grid.action(event, cell, row, false);
208
+ } else {
209
+ Grid.open_cell(cell);
210
+ }
211
+ }
212
+
213
+ Grid.add_row = function(table, row) {
214
+ // insert row below
215
+ var new_row = '<tr>';
216
+ var cells = row.childElements();
217
+ for (var i = 0; i < cells.length -1; i++) {
218
+ new_row = new_row + '<td></td>';
219
+ }
220
+ new_row = new_row + Grid.Buttons + '</tr>';
221
+ row.insert({
222
+ after: new_row
223
+ });
224
+ var new_row = row.nextSiblings()[0];
225
+ // TODO: rewrite history (+ push event in history for undo)
226
+ }
227
+
228
+ Grid.add_col = function(table, cell) {
229
+ var rows = table.childElements()[0].select('tr');
230
+ var pos = Grid.pos(cell);
231
+ for (var i = 0; i < rows.length; i++) {
232
+ var cells = rows[i].select('th');
233
+ if (i == 0) {
234
+ cells = rows[i].select('td');
235
+ cells[pos].insert({
236
+ after: Grid.ColButtons
237
+ });
238
+ } else if (cells.length > 0) {
239
+ cells[pos].insert({
240
+ after: "<th>[title]</th>"
241
+ });
242
+ } else {
243
+ cells = rows[i].select('td');
244
+ cells[pos].insert({
245
+ after: "<td></td>"
246
+ });
247
+ }
248
+ }
249
+ }
250
+
251
+ Grid.del_col = function(table, cell) {
252
+ var rows = table.childElements()[0].select('tr');
253
+ var pos = Grid.pos(cell);
254
+ for (var i = 0; i < rows.length; i++) {
255
+ var cells = rows[i].select('th');
256
+ if (i == 0) {
257
+ cells = rows[i].select('td');
258
+ cells[pos].remove();
259
+ } else if (cells.length > 0) {
260
+ cells[pos].remove();
261
+ } else {
262
+ cells = rows[i].select('td');
263
+ cells[pos].remove();
264
+ }
265
+ }
266
+ }
267
+
268
+ Grid.action = function(event, cell, row, is_col) {
269
+ var span = event.findElement('span');
270
+ var table = event.findElement('table');
271
+ if (span.hasClassName('add')) {
272
+ if (is_col) {
273
+ Grid.add_col(table, cell);
274
+ } else {
275
+ Grid.add_row(table, row);
276
+ Grid.open_cell(new_row.childElements()[0]);
277
+ }
278
+ } else if (span.hasClassName('del')) {
279
+ if (is_col) {
280
+ Grid.del_col(table, cell);
281
+ } else {
282
+ // remove current row
283
+ row.remove();
284
+ }
285
+ } else if (span.hasClassName('copy')) {
286
+ var data = Grid.serialize(table, 'tab');
287
+ var td = span.up();
288
+ td.insert({
289
+ top: "<textarea id='grid_copy_" + table.grid.id + "'></textarea>"
290
+ });
291
+ var input = $('grid_copy_'+table.grid.id);
292
+ input.value = data;
293
+ Element.observe($(input), 'blur', function(event) {
294
+ event.element().remove();
295
+ });
296
+ input.focus();
297
+ input.select();
298
+ }
299
+ table.grid.input.value = Grid.serialize(table);
300
+ }
301
+
302
+ // map grid position to attribute and reverse.
303
+ Grid.makeAttrPos = function(table) {
304
+ var heads = table.childElements()[0].select('th');
305
+ var attr = {};
306
+ var pos = {};
307
+ table.grid.attr = attr;
308
+ table.grid.pos = pos;
309
+ if (table.grid.attr_name) {
310
+ for (var i = 0; i < heads.length; i++) {
311
+ attr[i] = i;
312
+ pos[i] = i;
313
+ }
314
+ } else {
315
+ for (var i = 0; i < heads.length; i++) {
316
+ var attr_name = heads[i].getAttribute('data-a');
317
+ attr[i] = attr_name;
318
+ pos[attr_name] = i;
319
+ }
320
+ }
321
+ }
322
+
323
+ // only used with single attr table
324
+ Grid.serialize = function(table, format) {
325
+ var data = [];
326
+ var rows = table.childElements()[0].select('tr');
327
+ for (var i = 1; i < rows.length; i++) {
328
+ var row_data = [];
329
+ var cells = rows[i].childElements();
330
+ for (var j = 0; j < cells.length - 1; j++) {
331
+ var cell = cells[j];
332
+ if (cell.hasClassName('input')) {
333
+ row_data.push(cell.select('input').first().value);
334
+ } else {
335
+ row_data.push(cells[j].innerHTML);
336
+ }
337
+ }
338
+ data.push(row_data);
339
+ }
340
+ if (format == 'tab') {
341
+ var res = '';
342
+ for (var i = 0; i < data.length; i++) {
343
+ var row = data[i];
344
+ var line = '';
345
+ for (var j=0; j < row.length; j++) {
346
+ if (j>0) line = line + '\t';
347
+ line = line + row[j];
348
+ }
349
+ if (i>0) res = res + '\r\n';
350
+ res = res + line;
351
+ }
352
+ return res;
353
+ } else if (data.length == 1 && data[0].length == 1) {
354
+ return '';
355
+ } else {
356
+ return Object.toJSON([{type:'table'}, data]);
357
+ }
358
+ }
359
+
360
+ Grid.Buttons = "<td class='action'><span class='add'>&nbsp;</span> <span class='del'>&nbsp;</span></td>";
361
+ Grid.ColButtons = Grid.Buttons;
362
+
363
+ // only used with single attr table
364
+ Grid.addButtons = function(table) {
365
+ var data = [];
366
+ var tbody = table.childElements()[0];
367
+ var rows = tbody.select('tr');
368
+
369
+ var col_action = "<tr class='action'><td><span class='add'>&nbsp;</span></td>";
370
+ var cells_length = rows[0].select('th').length;
371
+ for (var i = 1; i < cells_length; i++) {
372
+ col_action = col_action + Grid.ColButtons;
373
+ }
374
+ col_action = col_action + "<td class='action'><span class='copy'>&nbsp;</span></td></tr>";
375
+
376
+ for (var i = 0; i < rows.length; i++) {
377
+ var buttons;
378
+ if (i == 0) {
379
+ buttons = "<td class='action'><span class='add'>&nbsp;</span></td>";
380
+ } else {
381
+ buttons = Grid.Buttons;
382
+ }
383
+ rows[i].insert({
384
+ bottom: buttons
385
+ });
386
+ }
387
+ tbody.insert({
388
+ top: col_action
389
+ });
390
+ return data;
391
+ }
392
+
393
+ Grid.make = function(table) {
394
+ Grid.grid_c++;
395
+ Grid.grids[Grid.grid_c] = table;
396
+ table.grid = {
397
+ changes: [],
398
+ id: Grid.grid_c,
399
+ };
400
+ // Detect type.
401
+ table.grid.attr_name = table.getAttribute('data-a');
402
+
403
+ var empty = false;
404
+ if (table.grid.attr_name && table.select('th').length == 0) {
405
+ empty = true;
406
+ var msg = table.getAttribute('data-msg') || "type to edit";
407
+ table.innerHTML = "<tr><th>" + msg + "</th></tr><tr><td></td></tr>";
408
+ }
409
+
410
+ Grid.makeAttrPos(table);
411
+
412
+ if (table.grid.attr_name) {
413
+ // If we have an attr_name, rows and columns are
414
+ // serialized as json in a single field.
415
+ Grid.addButtons(table);
416
+ table.insert({
417
+ after: "<input type='hidden' id='grid_a_" + Grid.grid_c + "' name='" + table.grid.attr_name + "'/>"
418
+ });
419
+ table.grid.input = $("grid_a_" + Grid.grid_c);
420
+ if (!empty) table.grid.input.value = Grid.serialize(table);
421
+ } else {
422
+ // Otherwise each row is a new object and each column
423
+ // corresponds to a different attribute (defined in the
424
+ // 'th' of the table).
425
+ table.insert({
426
+ after: "<p class='grid_btn'><a class='save' href='javascript:' onclick='Grid.save(" + Grid.grid_c + ")'>save</a> <a class='undo' href='javascript:' onclick='Grid.undo(" + Grid.grid_c + ")'>undo</a></p>"
427
+ });
428
+ }
429
+
430
+
431
+ table.observe('click', Grid.click);
432
+ }
433
+
434
+ Grid.save = function(grid_id) {
435
+ var table = Grid.grids[grid_id];
436
+ var data = {};
437
+ data[grid_id] = Grid.compact(table.grid.changes);
438
+ // PUT changes
439
+ // ... We would trigger Ajax call here
440
+ new Ajax.Request("/echo/json/", {
441
+ parameters: {
442
+ json:Object.toJSON(data)
443
+ },
444
+ onSuccess: function(transport) {
445
+ Grid.notify(transport.responseJSON);
446
+ },
447
+ method: 'post'
448
+ });
449
+ // MOCK by receiving sent data
450
+ //Grid.notify(data);
451
+ }
452
+
453
+ Grid.undo = function(grid_id) {
454
+ var table = Grid.grids[grid_id];
455
+ var change = table.grid.changes.pop();
456
+ // TODO: could be optimized
457
+ var state = Grid.compact(table.grid.changes)[change.id] || {};
458
+ for (attr in change) {
459
+ if (attr == 'id') continue;
460
+ var cell = $(change.id).childElements()[table.grid.pos[attr]];
461
+ var value = state[attr] || cell.orig_value;
462
+ cell.innerHTML = value;
463
+ cell.prev_value = value;
464
+ if (value == cell.orig_value) {
465
+ cell.removeClassName('changed');
466
+ var row = cell.up();
467
+ if (row.select('.changed').length == 0) row.removeClassName('changed');
468
+ } else {[cell, cell.up()].invoke('addClassName', 'changed');
469
+ }
470
+ cell.addClassName('undone');
471
+ }
472
+ new PeriodicalExecuter(function(pe) {
473
+ table.select('.undone').invoke('removeClassName', 'undone');
474
+ pe.stop();
475
+ }, 1);
476
+ }
477
+
478
+ Grid.compact = function(list) {
479
+ var res = {};
480
+ for (var i = list.length - 1; i >= 0; i--) {
481
+ var changes = list[i];
482
+ var obj = res[changes.id];
483
+ if (!obj) {
484
+ obj = {};
485
+ res[changes.id] = obj;
486
+ }
487
+
488
+ for (var key in changes) {
489
+ if (key != 'id' && !obj[key]) {
490
+ // only take latest change
491
+ obj[key] = changes[key];
492
+ }
493
+ }
494
+ }
495
+ return res;
496
+ }
497
+
498
+ Grid.notify = function(data) {
499
+ for (var i in data) {
500
+ var table = Grid.grids[parseInt(i)];
501
+ var rows = table.childElements()[0].select('tr');
502
+ var changes = data[i];
503
+ var pos = table.grid.pos;
504
+ for (var obj_id in changes) {
505
+ var row = $(obj_id);
506
+ if (!row) {
507
+ // attr table
508
+ row = rows[parseInt(obj_id)+1];
509
+ }
510
+ var cells = row.childElements();
511
+ var change = changes[obj_id];
512
+ for (var attr in change) {
513
+ if (attr == 'id') continue;
514
+ var cell;
515
+ cell = cells[table.grid.pos[attr]];
516
+ cell.removeClassName('changed');
517
+ cell.innerHTML = change[attr];
518
+ cell.orig_value = change[attr];
519
+ cell.prev_value = undefined;
520
+ cell.addClassName('saved');
521
+ }
522
+ if (row.select('.changed').length == 0) {
523
+
524
+ row.removeClassName('changed');
525
+ }
526
+ }
527
+ }
528
+ // later
529
+ new PeriodicalExecuter(function(pe) {
530
+ table.select('.saved').invoke('removeClassName', 'saved');
531
+ pe.stop();
532
+ }, 1);
533
+ // maybe this is not good
534
+ table.grid.changes = []; // clear
535
+ }
File without changes
File without changes
@@ -5,7 +5,7 @@ Zena.env = new Array();
5
5
  Zena.editor_setup = function(url) {
6
6
  window.current_sel = $('text_sel');
7
7
  window.current_tab = $('text_tab');
8
- var preview = parent ? parent : opener;
8
+ var preview = Zena.t();
9
9
 
10
10
  Event.observe(window, 'resize', function() { Zena.resizeElement('node_text'); } );
11
11
  Event.observe(window, 'resize', function() { Zena.resizeElement('node_text'); } );
@@ -98,7 +98,7 @@ Zena.editor_preview = function(url, element, value) {
98
98
 
99
99
  // preview version.
100
100
  Zena.version_preview = function(url) {
101
- var target = opener ? opener : parent;
101
+ var target = Zena.t();
102
102
 
103
103
  if (target.location.href.endsWith(url)) {
104
104
  target.location.href = url.gsub(/\/versions\/.*$/,'');
@@ -626,17 +626,27 @@ Zena.select_tab = function(name) {
626
626
  current_tab.style.display = '';
627
627
  }
628
628
 
629
- Zena.reloadAndClose = function() {
629
+ Zena.reload_and_close = function(href) {
630
630
  if (opener && !opener.is_editor) {
631
- opener.window.location.href = opener.window.location.href;
631
+ opener.window.location.href = href || opener.window.location.href;
632
632
  window.close();
633
633
  } else if (parent != window) {
634
- parent.window.location.href = parent.window.location.href;
634
+ parent.window.location.href = href || parent.window.location.href;
635
635
  } else {
636
636
  window.close();
637
637
  }
638
638
  }
639
639
 
640
+ Zena.t = function() {
641
+ if (opener && !opener.is_editor) {
642
+ return opener;
643
+ } else if (parent != window) {
644
+ return parent;
645
+ } else {
646
+ return window;
647
+ }
648
+ }
649
+
640
650
  // POPUP GALLERY
641
651
  Zena.popup_gallery = null;
642
652
 
@@ -765,8 +775,8 @@ Zena.popup_wrap = function(img, config) {
765
775
  gallery.prev = gallery.list[index - 1];
766
776
  gallery.next = gallery.list[index + 1];
767
777
 
768
- if (gallery.prev) content += "<a id='pg_prev' href='#' onclick='Zena.popup($(\""+gallery.prev.id+"\"));return false;' title='previous image'>&nbsp;</a>";
769
- if (gallery.next) content += "<a id='pg_next' href='#' onclick='Zena.popup($(\""+gallery.next.id+"\"));return false;' title='next image'>&nbsp;</a>";
778
+ if (gallery.prev) content += "<a id='pg_prev' href='javascript:void(0)' onclick='Zena.popup($(\""+gallery.prev.id+"\"));return false;' title='previous image'>&nbsp;</a>";
779
+ if (gallery.next) content += "<a id='pg_next' href='javascript:void(0)' onclick='Zena.popup($(\""+gallery.next.id+"\"));return false;' title='next image'>&nbsp;</a>";
770
780
  } else {
771
781
  content += "<div class='"+key+"'>" + config.fields[key] + "</div>";
772
782
  }
@@ -96,10 +96,14 @@ ul.actions select { width:186px; }
96
96
  /* forms */
97
97
  label { font-size:0.9em; font-weight:bold; display:block; color:#5C1515; margin:10px 0 5px; clear:left;}
98
98
 
99
+ .comment { font-style:italic; color:#777}
100
+ .comment strong {font-weight:bold; font-style:italic;}
101
+ .comment a {color:#55a}
102
+
99
103
  /* roles */
100
104
  .constant {font-weight:bold;}
101
105
  .real_class .constant {color:#999;}
102
106
  .virtual_class .constant {color: #07F;}
103
107
  .virtual_class .nav.constant {color: #003F9D;}
104
108
  .role .constant {color:#0C9616;}
105
- .role .nav.constant {color:#05540B;}
109
+ .role .nav.constant {color:#05540B;}
@@ -0,0 +1,19 @@
1
+ .grid td.action {border-width:0 0 0 1px; font-size:70%}
2
+ .grid tr.action td {border-width:0 0 1px 0; font-size:70%}
3
+ .grid tr.action td.action {border:0}
4
+ .grid td.input, .grid th.input { padding:0;}
5
+ .grid td.input input, .grid th.input input { margin:0; padding:0;font-size:inherit;}
6
+ .grid td.changed {background:#E5DDD7}
7
+ .grid .saved { background:#A3FF4F}
8
+ .grid td.undone, .grid td.changed.undone, .grid th.undone, .grid th.changed.undone { background:#F3F07F}
9
+ .grid .action span {cursor:pointer; visibility:hidden;}
10
+ .grid:hover .action span {visibility:visible;}
11
+ .grid .action .add {background:url('/images/bullet_add.png') no-repeat; padding:5px;}
12
+ .grid .action .del {background:url('/images/bullet_delete.png') no-repeat; padding:5px;}
13
+ .grid .action .copy {background:url('/images/table_go.png') no-repeat; padding:8px;}
14
+
15
+ .grid_btn a {text-decoration:none; border:1px solid #333; border-radius:4px; padding:2px 5px; color:white;}
16
+ .grid_btn {margin:1em 0}
17
+ .grid_btn a.save {background:#80B62D}
18
+ .grid_btn a.undo {background:#AAB76D}
19
+